@openziti/ziti-console-lib 1.0.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/styles/global.scss +70 -0
- package/fesm2022/openziti-ziti-console-lib.mjs +2133 -1321
- package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
- package/index.d.ts +5689 -6
- package/index.d.ts.map +1 -0
- package/package.json +10 -12
- package/esm2022/lib/ZAC_VERSION.mjs +0 -4
- package/esm2022/lib/app.initializer.mjs +0 -24
- package/esm2022/lib/default-app-config.mjs +0 -5
- package/esm2022/lib/features/card/card.component.mjs +0 -34
- package/esm2022/lib/features/card-list/card-list.component.mjs +0 -55
- package/esm2022/lib/features/config-editor/config-editor.component.mjs +0 -337
- package/esm2022/lib/features/confirm/confirm.component.mjs +0 -77
- package/esm2022/lib/features/creation-summary-dialog/creation-summary-dialog.component.mjs +0 -93
- package/esm2022/lib/features/custom-tags/custom-tags.component.mjs +0 -111
- package/esm2022/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.mjs +0 -46
- package/esm2022/lib/features/data-table/cells/table-cell-name/table-cell-name.component.mjs +0 -49
- package/esm2022/lib/features/data-table/cells/table-cell-select/table-cell-select.component.mjs +0 -58
- package/esm2022/lib/features/data-table/cells/table-cell-token/table-cell-token.component.mjs +0 -123
- package/esm2022/lib/features/data-table/column-headers/table-column-default/table-column-default.component.mjs +0 -268
- package/esm2022/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.mjs +0 -93
- package/esm2022/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.mjs +0 -37
- package/esm2022/lib/features/data-table/column-headers/table-column-select/table-column-select.component.mjs +0 -33
- package/esm2022/lib/features/data-table/data-table-filter.service.mjs +0 -138
- package/esm2022/lib/features/data-table/data-table.component.mjs +0 -918
- package/esm2022/lib/features/data-table/data-table.service.mjs +0 -98
- package/esm2022/lib/features/data-table/table-filter-bar/filter-bar.component.mjs +0 -108
- package/esm2022/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.mjs +0 -26
- package/esm2022/lib/features/data-table/tooltips/os-tooltip.component.mjs +0 -29
- package/esm2022/lib/features/data-table/tooltips/sdk-tooltip.component.mjs +0 -34
- package/esm2022/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.mjs +0 -72
- package/esm2022/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.mjs +0 -134
- package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.mjs +0 -189
- package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.mjs +0 -50
- package/esm2022/lib/features/dynamic-widgets/number/number-input.component.mjs +0 -95
- package/esm2022/lib/features/dynamic-widgets/object/object.component.mjs +0 -121
- package/esm2022/lib/features/dynamic-widgets/password/password-input.component.mjs +0 -83
- package/esm2022/lib/features/dynamic-widgets/port-ranges/port-ranges.component.mjs +0 -100
- package/esm2022/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.mjs +0 -201
- package/esm2022/lib/features/dynamic-widgets/selector/selector-input.component.mjs +0 -166
- package/esm2022/lib/features/dynamic-widgets/string/string-input.component.mjs +0 -108
- package/esm2022/lib/features/dynamic-widgets/text-list/text-list-input.component.mjs +0 -126
- package/esm2022/lib/features/extendable/extendable.component.mjs +0 -55
- package/esm2022/lib/features/extendable/extensions-noop.service.mjs +0 -52
- package/esm2022/lib/features/header-bar/header-bar.component.mjs +0 -105
- package/esm2022/lib/features/json-view/json-view.component.mjs +0 -212
- package/esm2022/lib/features/list-page-features/list-page-form/list-page-form.component.mjs +0 -138
- package/esm2022/lib/features/list-page-features/list-page-header/list-page-header.component.mjs +0 -66
- package/esm2022/lib/features/loading-indicator/loading-indicator.component.mjs +0 -29
- package/esm2022/lib/features/login/login-dialog.component.mjs +0 -121
- package/esm2022/lib/features/messaging/growler.component.mjs +0 -62
- package/esm2022/lib/features/messaging/growler.model.mjs +0 -24
- package/esm2022/lib/features/messaging/growler.module.mjs +0 -34
- package/esm2022/lib/features/messaging/growler.service.mjs +0 -71
- package/esm2022/lib/features/messaging/logger.service.mjs +0 -174
- package/esm2022/lib/features/multi-action-button/multi-action-button.component.mjs +0 -30
- package/esm2022/lib/features/no-items/no-items.component.mjs +0 -46
- package/esm2022/lib/features/overrides/overrides.component.mjs +0 -118
- package/esm2022/lib/features/overrides/overrides.service.mjs +0 -114
- package/esm2022/lib/features/preview-list/preview-list.component.mjs +0 -151
- package/esm2022/lib/features/preview-selections/preview-selections.component.mjs +0 -114
- package/esm2022/lib/features/progress-meter/progress-meter.component.mjs +0 -43
- package/esm2022/lib/features/progress-wizard/progress-wizard.component.mjs +0 -90
- package/esm2022/lib/features/projectable-forms/api-session/api-session-form.component.mjs +0 -143
- package/esm2022/lib/features/projectable-forms/api-session/api-session-form.service.mjs +0 -118
- package/esm2022/lib/features/projectable-forms/auth-policy/auth-policy-form.component.mjs +0 -337
- package/esm2022/lib/features/projectable-forms/auth-policy/auth-policy-form.service.mjs +0 -114
- package/esm2022/lib/features/projectable-forms/certificate-authority/certificate-authority-form.component.mjs +0 -399
- package/esm2022/lib/features/projectable-forms/certificate-authority/certificate-authority-form.service.mjs +0 -95
- package/esm2022/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.component.mjs +0 -217
- package/esm2022/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.service.mjs +0 -54
- package/esm2022/lib/features/projectable-forms/config-type/config-type-form.component.mjs +0 -244
- package/esm2022/lib/features/projectable-forms/config-type/config-type-form.service.mjs +0 -92
- package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +0 -275
- package/esm2022/lib/features/projectable-forms/configuration/configuration.service.mjs +0 -137
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +0 -231
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.service.mjs +0 -118
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +0 -277
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.mjs +0 -188
- package/esm2022/lib/features/projectable-forms/form-field-container/form-field-container.component.mjs +0 -101
- package/esm2022/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.mjs +0 -54
- package/esm2022/lib/features/projectable-forms/form-header/form-header.component.mjs +0 -135
- package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +0 -471
- package/esm2022/lib/features/projectable-forms/identity/identity-form.service.mjs +0 -131
- package/esm2022/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.mjs +0 -533
- package/esm2022/lib/features/projectable-forms/jwt-signer/jwt-signer-form.service.mjs +0 -79
- package/esm2022/lib/features/projectable-forms/posture-check/posture-check-form.component.mjs +0 -437
- package/esm2022/lib/features/projectable-forms/posture-check/posture-check-form.service.mjs +0 -81
- package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +0 -315
- package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +0 -330
- package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +0 -591
- package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +0 -1036
- package/esm2022/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.mjs +0 -275
- package/esm2022/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.service.mjs +0 -172
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +0 -279
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.service.mjs +0 -230
- package/esm2022/lib/features/projectable-forms/session/session-form.component.mjs +0 -213
- package/esm2022/lib/features/projectable-forms/session/session-form.service.mjs +0 -84
- package/esm2022/lib/features/projectable-forms/terminator/terminator-form.component.mjs +0 -244
- package/esm2022/lib/features/projectable-forms/terminator/terminator-form.service.mjs +0 -130
- package/esm2022/lib/features/projectable-forms/transit-router/transit-router-form.component.mjs +0 -224
- package/esm2022/lib/features/projectable-forms/transit-router/transit-router-form.service.mjs +0 -118
- package/esm2022/lib/features/qr-code/qr-code.component.mjs +0 -166
- package/esm2022/lib/features/quick-add/quick-add.component.mjs +0 -50
- package/esm2022/lib/features/reset-enrollment/reset-enrollment.component.mjs +0 -86
- package/esm2022/lib/features/reset-enrollment/reset-enrollment.service.mjs +0 -61
- package/esm2022/lib/features/side-modal/side-modal.component.mjs +0 -45
- package/esm2022/lib/features/side-navigator/side-navigator.component.mjs +0 -127
- package/esm2022/lib/features/sidebars/side-navbar/side-navbar.component.mjs +0 -54
- package/esm2022/lib/features/tag-selector/tag-selector.component.mjs +0 -291
- package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.component.mjs +0 -586
- package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.helper.mjs +0 -373
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.component.mjs +0 -1706
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.helper.mjs +0 -591
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.mjs +0 -883
- package/esm2022/lib/features/visualizer/visualizer-service.class.mjs +0 -32
- package/esm2022/lib/models/api-session.mjs +0 -7
- package/esm2022/lib/models/auth-policy.mjs +0 -31
- package/esm2022/lib/models/certificate-authority.mjs +0 -16
- package/esm2022/lib/models/config-type.mjs +0 -10
- package/esm2022/lib/models/config.mjs +0 -10
- package/esm2022/lib/models/edge-router-policy.mjs +0 -11
- package/esm2022/lib/models/edge-router.mjs +0 -13
- package/esm2022/lib/models/identity.mjs +0 -34
- package/esm2022/lib/models/jwt-signer.mjs +0 -20
- package/esm2022/lib/models/posture-check.mjs +0 -29
- package/esm2022/lib/models/service-edge-router-policy.mjs +0 -11
- package/esm2022/lib/models/service-policy.mjs +0 -13
- package/esm2022/lib/models/service.mjs +0 -12
- package/esm2022/lib/models/session.mjs +0 -7
- package/esm2022/lib/models/terminator.mjs +0 -14
- package/esm2022/lib/pages/api-sessions/api-sessions-page.component.mjs +0 -112
- package/esm2022/lib/pages/api-sessions/api-sessions-page.service.mjs +0 -235
- package/esm2022/lib/pages/attributes/attributes.component.mjs +0 -104
- package/esm2022/lib/pages/auth-policies/auth-policies-page.component.mjs +0 -120
- package/esm2022/lib/pages/auth-policies/auth-policies-page.service.mjs +0 -215
- package/esm2022/lib/pages/callback/callback.component.mjs +0 -155
- package/esm2022/lib/pages/certificate-authorities/certificate-authorities-page.component.mjs +0 -119
- package/esm2022/lib/pages/certificate-authorities/certificate-authorities-page.service.mjs +0 -240
- package/esm2022/lib/pages/config-types/config-types-page.component.mjs +0 -130
- package/esm2022/lib/pages/config-types/config-types-page.service.mjs +0 -134
- package/esm2022/lib/pages/configurations/configurations-page.component.mjs +0 -134
- package/esm2022/lib/pages/configurations/configurations-page.service.mjs +0 -251
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.component.mjs +0 -128
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.service.mjs +0 -407
- package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +0 -136
- package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +0 -354
- package/esm2022/lib/pages/geolocate/geolocate.component.mjs +0 -130
- package/esm2022/lib/pages/identities/identities-page.component.mjs +0 -221
- package/esm2022/lib/pages/identities/identities-page.service.mjs +0 -591
- package/esm2022/lib/pages/jwt-signers/jwt-signers-page.component.mjs +0 -160
- package/esm2022/lib/pages/jwt-signers/jwt-signers-page.service.mjs +0 -177
- package/esm2022/lib/pages/posture-checks/posture-checks-page.component.mjs +0 -103
- package/esm2022/lib/pages/posture-checks/posture-checks-page.service.mjs +0 -200
- package/esm2022/lib/pages/profile/profile.component.mjs +0 -58
- package/esm2022/lib/pages/service-edge-router-policies/service-edge-router-policies-page.component.mjs +0 -122
- package/esm2022/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.mjs +0 -367
- package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +0 -124
- package/esm2022/lib/pages/service-policies/service-policies-page.service.mjs +0 -446
- package/esm2022/lib/pages/services/services-page.component.mjs +0 -218
- package/esm2022/lib/pages/services/services-page.service.mjs +0 -378
- package/esm2022/lib/pages/sessions/sessions-page.component.mjs +0 -112
- package/esm2022/lib/pages/sessions/sessions-page.service.mjs +0 -228
- package/esm2022/lib/pages/settings/settings.component.mjs +0 -61
- package/esm2022/lib/pages/terminators/terminators-page.component.mjs +0 -97
- package/esm2022/lib/pages/terminators/terminators-page.service.mjs +0 -235
- package/esm2022/lib/pages/transit-routers/transit-routers-page.component.mjs +0 -129
- package/esm2022/lib/pages/transit-routers/transit-routers-page.service.mjs +0 -248
- package/esm2022/lib/safe.pipe.mjs +0 -18
- package/esm2022/lib/services/auth.service.mjs +0 -94
- package/esm2022/lib/services/console-events.service.mjs +0 -20
- package/esm2022/lib/services/csv-download.service.mjs +0 -91
- package/esm2022/lib/services/deactivate-guard.service.mjs +0 -17
- package/esm2022/lib/services/login-service.class.mjs +0 -47
- package/esm2022/lib/services/node-data.service.mjs +0 -397
- package/esm2022/lib/services/noop-login.service.mjs +0 -41
- package/esm2022/lib/services/schema.service.mjs +0 -807
- package/esm2022/lib/services/settings-service.class.mjs +0 -120
- package/esm2022/lib/services/settings.service.mjs +0 -203
- package/esm2022/lib/services/tab-name.service.mjs +0 -73
- package/esm2022/lib/services/validation.service.mjs +0 -156
- package/esm2022/lib/services/ziti-controller-data.service.mjs +0 -340
- package/esm2022/lib/services/ziti-data.service.mjs +0 -100
- package/esm2022/lib/services/ziti-domain-controller.service.mjs +0 -3
- package/esm2022/lib/shared/list-page-component.class.mjs +0 -186
- package/esm2022/lib/shared/list-page-service.class.mjs +0 -244
- package/esm2022/lib/urls.mjs +0 -34
- package/esm2022/lib/zac-routing.module.mjs +0 -34
- package/esm2022/lib/ziti-console-lib.module.mjs +0 -538
- package/esm2022/lib/ziti-console.constants.mjs +0 -20
- package/esm2022/openziti-ziti-console-lib.mjs +0 -5
- package/esm2022/public-api.mjs +0 -130
- package/lib/ZAC_VERSION.d.ts +0 -4
- package/lib/ZAC_VERSION.d.ts.map +0 -1
- package/lib/app.initializer.d.ts +0 -3
- package/lib/app.initializer.d.ts.map +0 -1
- package/lib/default-app-config.d.ts +0 -9
- package/lib/default-app-config.d.ts.map +0 -1
- package/lib/features/card/card.component.d.ts +0 -13
- package/lib/features/card/card.component.d.ts.map +0 -1
- package/lib/features/card-list/card-list.component.d.ts +0 -27
- package/lib/features/card-list/card-list.component.d.ts.map +0 -1
- package/lib/features/config-editor/config-editor.component.d.ts +0 -50
- package/lib/features/config-editor/config-editor.component.d.ts.map +0 -1
- package/lib/features/confirm/confirm.component.d.ts +0 -34
- package/lib/features/confirm/confirm.component.d.ts.map +0 -1
- package/lib/features/creation-summary-dialog/creation-summary-dialog.component.d.ts +0 -32
- package/lib/features/creation-summary-dialog/creation-summary-dialog.component.d.ts.map +0 -1
- package/lib/features/custom-tags/custom-tags.component.d.ts +0 -37
- package/lib/features/custom-tags/custom-tags.component.d.ts.map +0 -1
- package/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.d.ts +0 -16
- package/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.d.ts.map +0 -1
- package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts +0 -20
- package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts.map +0 -1
- package/lib/features/data-table/cells/table-cell-select/table-cell-select.component.d.ts +0 -15
- package/lib/features/data-table/cells/table-cell-select/table-cell-select.component.d.ts.map +0 -1
- package/lib/features/data-table/cells/table-cell-token/table-cell-token.component.d.ts +0 -22
- package/lib/features/data-table/cells/table-cell-token/table-cell-token.component.d.ts.map +0 -1
- package/lib/features/data-table/column-headers/table-column-default/table-column-default.component.d.ts +0 -52
- package/lib/features/data-table/column-headers/table-column-default/table-column-default.component.d.ts.map +0 -1
- package/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.d.ts +0 -27
- package/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.d.ts.map +0 -1
- package/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.d.ts +0 -19
- package/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.d.ts.map +0 -1
- package/lib/features/data-table/column-headers/table-column-select/table-column-select.component.d.ts +0 -15
- package/lib/features/data-table/column-headers/table-column-select/table-column-select.component.d.ts.map +0 -1
- package/lib/features/data-table/data-table-filter.service.d.ts +0 -37
- package/lib/features/data-table/data-table-filter.service.d.ts.map +0 -1
- package/lib/features/data-table/data-table.component.d.ts +0 -164
- package/lib/features/data-table/data-table.component.d.ts.map +0 -1
- package/lib/features/data-table/data-table.service.d.ts +0 -20
- package/lib/features/data-table/data-table.service.d.ts.map +0 -1
- package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts +0 -25
- package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts.map +0 -1
- package/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.d.ts +0 -10
- package/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.d.ts.map +0 -1
- package/lib/features/data-table/tooltips/os-tooltip.component.d.ts +0 -15
- package/lib/features/data-table/tooltips/os-tooltip.component.d.ts.map +0 -1
- package/lib/features/data-table/tooltips/sdk-tooltip.component.d.ts +0 -15
- package/lib/features/data-table/tooltips/sdk-tooltip.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.d.ts +0 -19
- package/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts +0 -28
- package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts +0 -50
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.d.ts +0 -14
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/number/number-input.component.d.ts +0 -23
- package/lib/features/dynamic-widgets/number/number-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/object/object.component.d.ts +0 -26
- package/lib/features/dynamic-widgets/object/object.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/password/password-input.component.d.ts +0 -24
- package/lib/features/dynamic-widgets/password/password-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts +0 -22
- package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts +0 -60
- package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts +0 -30
- package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/string/string-input.component.d.ts +0 -27
- package/lib/features/dynamic-widgets/string/string-input.component.d.ts.map +0 -1
- package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts +0 -26
- package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts.map +0 -1
- package/lib/features/extendable/extendable.component.d.ts +0 -15
- package/lib/features/extendable/extendable.component.d.ts.map +0 -1
- package/lib/features/extendable/extensions-noop.service.d.ts +0 -35
- package/lib/features/extendable/extensions-noop.service.d.ts.map +0 -1
- package/lib/features/header-bar/header-bar.component.d.ts +0 -29
- package/lib/features/header-bar/header-bar.component.d.ts.map +0 -1
- package/lib/features/json-view/json-view.component.d.ts +0 -40
- package/lib/features/json-view/json-view.component.d.ts.map +0 -1
- package/lib/features/list-page-features/list-page-form/list-page-form.component.d.ts +0 -35
- package/lib/features/list-page-features/list-page-form/list-page-form.component.d.ts.map +0 -1
- package/lib/features/list-page-features/list-page-header/list-page-header.component.d.ts +0 -14
- package/lib/features/list-page-features/list-page-header/list-page-header.component.d.ts.map +0 -1
- package/lib/features/loading-indicator/loading-indicator.component.d.ts +0 -11
- package/lib/features/loading-indicator/loading-indicator.component.d.ts.map +0 -1
- package/lib/features/login/login-dialog.component.d.ts +0 -30
- package/lib/features/login/login-dialog.component.d.ts.map +0 -1
- package/lib/features/messaging/growler.component.d.ts +0 -19
- package/lib/features/messaging/growler.component.d.ts.map +0 -1
- package/lib/features/messaging/growler.model.d.ts +0 -8
- package/lib/features/messaging/growler.model.d.ts.map +0 -1
- package/lib/features/messaging/growler.module.d.ts +0 -10
- package/lib/features/messaging/growler.module.d.ts.map +0 -1
- package/lib/features/messaging/growler.service.d.ts +0 -18
- package/lib/features/messaging/growler.service.d.ts.map +0 -1
- package/lib/features/messaging/logger.service.d.ts +0 -27
- package/lib/features/messaging/logger.service.d.ts.map +0 -1
- package/lib/features/multi-action-button/multi-action-button.component.d.ts +0 -13
- package/lib/features/multi-action-button/multi-action-button.component.d.ts.map +0 -1
- package/lib/features/no-items/no-items.component.d.ts +0 -19
- package/lib/features/no-items/no-items.component.d.ts.map +0 -1
- package/lib/features/overrides/overrides.component.d.ts +0 -33
- package/lib/features/overrides/overrides.component.d.ts.map +0 -1
- package/lib/features/overrides/overrides.service.d.ts +0 -18
- package/lib/features/overrides/overrides.service.d.ts.map +0 -1
- package/lib/features/preview-list/preview-list.component.d.ts +0 -34
- package/lib/features/preview-list/preview-list.component.d.ts.map +0 -1
- package/lib/features/preview-selections/preview-selections.component.d.ts +0 -39
- package/lib/features/preview-selections/preview-selections.component.d.ts.map +0 -1
- package/lib/features/progress-meter/progress-meter.component.d.ts +0 -19
- package/lib/features/progress-meter/progress-meter.component.d.ts.map +0 -1
- package/lib/features/progress-wizard/progress-wizard.component.d.ts +0 -31
- package/lib/features/progress-wizard/progress-wizard.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/api-session/api-session-form.component.d.ts +0 -50
- package/lib/features/projectable-forms/api-session/api-session-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/api-session/api-session-form.service.d.ts +0 -27
- package/lib/features/projectable-forms/api-session/api-session-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/auth-policy/auth-policy-form.component.d.ts +0 -74
- package/lib/features/projectable-forms/auth-policy/auth-policy-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/auth-policy/auth-policy-form.service.d.ts +0 -38
- package/lib/features/projectable-forms/auth-policy/auth-policy-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/certificate-authority/certificate-authority-form.component.d.ts +0 -80
- package/lib/features/projectable-forms/certificate-authority/certificate-authority-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/certificate-authority/certificate-authority-form.service.d.ts +0 -37
- package/lib/features/projectable-forms/certificate-authority/certificate-authority-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.component.d.ts +0 -62
- package/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.service.d.ts +0 -28
- package/lib/features/projectable-forms/certificate-authority/verify-certificate/verify-certificate.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/config-type/config-type-form.component.d.ts +0 -63
- package/lib/features/projectable-forms/config-type/config-type-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/config-type/config-type-form.service.d.ts +0 -27
- package/lib/features/projectable-forms/config-type/config-type-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +0 -62
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/configuration/configuration.service.d.ts +0 -33
- package/lib/features/projectable-forms/configuration/configuration.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts +0 -53
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/edge-router/edge-router-form.service.d.ts +0 -29
- package/lib/features/projectable-forms/edge-router/edge-router-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts +0 -54
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts +0 -40
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts +0 -29
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.d.ts +0 -15
- package/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/form-header/form-header.component.d.ts +0 -38
- package/lib/features/projectable-forms/form-header/form-header.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts +0 -93
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/identity/identity-form.service.d.ts +0 -20
- package/lib/features/projectable-forms/identity/identity-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.d.ts +0 -97
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.service.d.ts +0 -21
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/posture-check/posture-check-form.component.d.ts +0 -134
- package/lib/features/projectable-forms/posture-check/posture-check-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/posture-check/posture-check-form.service.d.ts +0 -23
- package/lib/features/projectable-forms/posture-check/posture-check-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/projectable-form.class.d.ts +0 -92
- package/lib/features/projectable-forms/projectable-form.class.d.ts.map +0 -1
- package/lib/features/projectable-forms/service/service-form.component.d.ts +0 -70
- package/lib/features/projectable-forms/service/service-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/service/service-form.service.d.ts +0 -123
- package/lib/features/projectable-forms/service/service-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts +0 -173
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.d.ts +0 -53
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.service.d.ts +0 -38
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +0 -55
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts +0 -48
- package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/session/session-form.component.d.ts +0 -63
- package/lib/features/projectable-forms/session/session-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/session/session-form.service.d.ts +0 -23
- package/lib/features/projectable-forms/session/session-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/terminator/terminator-form.component.d.ts +0 -58
- package/lib/features/projectable-forms/terminator/terminator-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/terminator/terminator-form.service.d.ts +0 -33
- package/lib/features/projectable-forms/terminator/terminator-form.service.d.ts.map +0 -1
- package/lib/features/projectable-forms/transit-router/transit-router-form.component.d.ts +0 -50
- package/lib/features/projectable-forms/transit-router/transit-router-form.component.d.ts.map +0 -1
- package/lib/features/projectable-forms/transit-router/transit-router-form.service.d.ts +0 -27
- package/lib/features/projectable-forms/transit-router/transit-router-form.service.d.ts.map +0 -1
- package/lib/features/qr-code/qr-code.component.d.ts +0 -45
- package/lib/features/qr-code/qr-code.component.d.ts.map +0 -1
- package/lib/features/quick-add/quick-add.component.d.ts +0 -15
- package/lib/features/quick-add/quick-add.component.d.ts.map +0 -1
- package/lib/features/reset-enrollment/reset-enrollment.component.d.ts +0 -27
- package/lib/features/reset-enrollment/reset-enrollment.component.d.ts.map +0 -1
- package/lib/features/reset-enrollment/reset-enrollment.service.d.ts +0 -13
- package/lib/features/reset-enrollment/reset-enrollment.service.d.ts.map +0 -1
- package/lib/features/side-modal/side-modal.component.d.ts +0 -15
- package/lib/features/side-modal/side-modal.component.d.ts.map +0 -1
- package/lib/features/side-navigator/side-navigator.component.d.ts +0 -33
- package/lib/features/side-navigator/side-navigator.component.d.ts.map +0 -1
- package/lib/features/sidebars/side-navbar/side-navbar.component.d.ts +0 -16
- package/lib/features/sidebars/side-navbar/side-navbar.component.d.ts.map +0 -1
- package/lib/features/tag-selector/tag-selector.component.d.ts +0 -59
- package/lib/features/tag-selector/tag-selector.component.d.ts.map +0 -1
- package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts +0 -54
- package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts.map +0 -1
- package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts +0 -21
- package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts.map +0 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts +0 -146
- package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts.map +0 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts +0 -172
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts.map +0 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts +0 -35
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts.map +0 -1
- package/lib/features/visualizer/visualizer-service.class.d.ts +0 -10
- package/lib/features/visualizer/visualizer-service.class.d.ts.map +0 -1
- package/lib/models/api-session.d.ts +0 -18
- package/lib/models/api-session.d.ts.map +0 -1
- package/lib/models/auth-policy.d.ts +0 -8
- package/lib/models/auth-policy.d.ts.map +0 -1
- package/lib/models/certificate-authority.d.ts +0 -14
- package/lib/models/certificate-authority.d.ts.map +0 -1
- package/lib/models/config-type.d.ts +0 -7
- package/lib/models/config-type.d.ts.map +0 -1
- package/lib/models/config.d.ts +0 -7
- package/lib/models/config.d.ts.map +0 -1
- package/lib/models/edge-router-policy.d.ts +0 -8
- package/lib/models/edge-router-policy.d.ts.map +0 -1
- package/lib/models/edge-router.d.ts +0 -10
- package/lib/models/edge-router.d.ts.map +0 -1
- package/lib/models/identity.d.ts +0 -16
- package/lib/models/identity.d.ts.map +0 -1
- package/lib/models/jwt-signer.d.ts +0 -17
- package/lib/models/jwt-signer.d.ts.map +0 -1
- package/lib/models/posture-check.d.ts +0 -17
- package/lib/models/posture-check.d.ts.map +0 -1
- package/lib/models/service-edge-router-policy.d.ts +0 -8
- package/lib/models/service-edge-router-policy.d.ts.map +0 -1
- package/lib/models/service-policy.d.ts +0 -10
- package/lib/models/service-policy.d.ts.map +0 -1
- package/lib/models/service.d.ts +0 -9
- package/lib/models/service.d.ts.map +0 -1
- package/lib/models/session.d.ts +0 -17
- package/lib/models/session.d.ts.map +0 -1
- package/lib/models/terminator.d.ts +0 -11
- package/lib/models/terminator.d.ts.map +0 -1
- package/lib/pages/api-sessions/api-sessions-page.component.d.ts +0 -30
- package/lib/pages/api-sessions/api-sessions-page.component.d.ts.map +0 -1
- package/lib/pages/api-sessions/api-sessions-page.service.d.ts +0 -31
- package/lib/pages/api-sessions/api-sessions-page.service.d.ts.map +0 -1
- package/lib/pages/attributes/attributes.component.d.ts +0 -31
- package/lib/pages/attributes/attributes.component.d.ts.map +0 -1
- package/lib/pages/auth-policies/auth-policies-page.component.d.ts +0 -29
- package/lib/pages/auth-policies/auth-policies-page.component.d.ts.map +0 -1
- package/lib/pages/auth-policies/auth-policies-page.service.d.ts +0 -34
- package/lib/pages/auth-policies/auth-policies-page.service.d.ts.map +0 -1
- package/lib/pages/callback/callback.component.d.ts +0 -22
- package/lib/pages/callback/callback.component.d.ts.map +0 -1
- package/lib/pages/certificate-authorities/certificate-authorities-page.component.d.ts +0 -30
- package/lib/pages/certificate-authorities/certificate-authorities-page.component.d.ts.map +0 -1
- package/lib/pages/certificate-authorities/certificate-authorities-page.service.d.ts +0 -35
- package/lib/pages/certificate-authorities/certificate-authorities-page.service.d.ts.map +0 -1
- package/lib/pages/config-types/config-types-page.component.d.ts +0 -31
- package/lib/pages/config-types/config-types-page.component.d.ts.map +0 -1
- package/lib/pages/config-types/config-types-page.service.d.ts +0 -29
- package/lib/pages/config-types/config-types-page.service.d.ts.map +0 -1
- package/lib/pages/configurations/configurations-page.component.d.ts +0 -30
- package/lib/pages/configurations/configurations-page.component.d.ts.map +0 -1
- package/lib/pages/configurations/configurations-page.service.d.ts +0 -80
- package/lib/pages/configurations/configurations-page.service.d.ts.map +0 -1
- package/lib/pages/edge-router-policies/edge-router-policies-page.component.d.ts +0 -33
- package/lib/pages/edge-router-policies/edge-router-policies-page.component.d.ts.map +0 -1
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts +0 -63
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts.map +0 -1
- package/lib/pages/edge-routers/edge-routers-page.component.d.ts +0 -36
- package/lib/pages/edge-routers/edge-routers-page.component.d.ts.map +0 -1
- package/lib/pages/edge-routers/edge-routers-page.service.d.ts +0 -51
- package/lib/pages/edge-routers/edge-routers-page.service.d.ts.map +0 -1
- package/lib/pages/geolocate/geolocate.component.d.ts +0 -32
- package/lib/pages/geolocate/geolocate.component.d.ts.map +0 -1
- package/lib/pages/identities/identities-page.component.d.ts +0 -40
- package/lib/pages/identities/identities-page.component.d.ts.map +0 -1
- package/lib/pages/identities/identities-page.service.d.ts +0 -64
- package/lib/pages/identities/identities-page.service.d.ts.map +0 -1
- package/lib/pages/jwt-signers/jwt-signers-page.component.d.ts +0 -34
- package/lib/pages/jwt-signers/jwt-signers-page.component.d.ts.map +0 -1
- package/lib/pages/jwt-signers/jwt-signers-page.service.d.ts +0 -31
- package/lib/pages/jwt-signers/jwt-signers-page.service.d.ts.map +0 -1
- package/lib/pages/posture-checks/posture-checks-page.component.d.ts +0 -29
- package/lib/pages/posture-checks/posture-checks-page.component.d.ts.map +0 -1
- package/lib/pages/posture-checks/posture-checks-page.service.d.ts +0 -28
- package/lib/pages/posture-checks/posture-checks-page.service.d.ts.map +0 -1
- package/lib/pages/profile/profile.component.d.ts +0 -17
- package/lib/pages/profile/profile.component.d.ts.map +0 -1
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.component.d.ts +0 -33
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.component.d.ts.map +0 -1
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.d.ts +0 -57
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.d.ts.map +0 -1
- package/lib/pages/service-policies/service-policies-page.component.d.ts +0 -34
- package/lib/pages/service-policies/service-policies-page.component.d.ts.map +0 -1
- package/lib/pages/service-policies/service-policies-page.service.d.ts +0 -63
- package/lib/pages/service-policies/service-policies-page.service.d.ts.map +0 -1
- package/lib/pages/services/services-page.component.d.ts +0 -42
- package/lib/pages/services/services-page.component.d.ts.map +0 -1
- package/lib/pages/services/services-page.service.d.ts +0 -69
- package/lib/pages/services/services-page.service.d.ts.map +0 -1
- package/lib/pages/sessions/sessions-page.component.d.ts +0 -30
- package/lib/pages/sessions/sessions-page.component.d.ts.map +0 -1
- package/lib/pages/sessions/sessions-page.service.d.ts +0 -30
- package/lib/pages/sessions/sessions-page.service.d.ts.map +0 -1
- package/lib/pages/settings/settings.component.d.ts +0 -23
- package/lib/pages/settings/settings.component.d.ts.map +0 -1
- package/lib/pages/terminators/terminators-page.component.d.ts +0 -29
- package/lib/pages/terminators/terminators-page.component.d.ts.map +0 -1
- package/lib/pages/terminators/terminators-page.service.d.ts +0 -32
- package/lib/pages/terminators/terminators-page.service.d.ts.map +0 -1
- package/lib/pages/transit-routers/transit-routers-page.component.d.ts +0 -35
- package/lib/pages/transit-routers/transit-routers-page.component.d.ts.map +0 -1
- package/lib/pages/transit-routers/transit-routers-page.service.d.ts +0 -50
- package/lib/pages/transit-routers/transit-routers-page.service.d.ts.map +0 -1
- package/lib/safe.pipe.d.ts +0 -11
- package/lib/safe.pipe.d.ts.map +0 -1
- package/lib/services/auth.service.d.ts +0 -21
- package/lib/services/auth.service.d.ts.map +0 -1
- package/lib/services/console-events.service.d.ts +0 -12
- package/lib/services/console-events.service.d.ts.map +0 -1
- package/lib/services/csv-download.service.d.ts +0 -11
- package/lib/services/csv-download.service.d.ts.map +0 -1
- package/lib/services/deactivate-guard.service.d.ts +0 -14
- package/lib/services/deactivate-guard.service.d.ts.map +0 -1
- package/lib/services/login-service.class.d.ts +0 -30
- package/lib/services/login-service.class.d.ts.map +0 -1
- package/lib/services/node-data.service.d.ts +0 -38
- package/lib/services/node-data.service.d.ts.map +0 -1
- package/lib/services/noop-login.service.d.ts +0 -22
- package/lib/services/noop-login.service.d.ts.map +0 -1
- package/lib/services/schema.service.d.ts +0 -63
- package/lib/services/schema.service.d.ts.map +0 -1
- package/lib/services/settings-service.class.d.ts +0 -36
- package/lib/services/settings-service.class.d.ts.map +0 -1
- package/lib/services/settings.service.d.ts +0 -20
- package/lib/services/settings.service.d.ts.map +0 -1
- package/lib/services/tab-name.service.d.ts +0 -20
- package/lib/services/tab-name.service.d.ts.map +0 -1
- package/lib/services/validation.service.d.ts +0 -20
- package/lib/services/validation.service.d.ts.map +0 -1
- package/lib/services/ziti-controller-data.service.d.ts +0 -36
- package/lib/services/ziti-controller-data.service.d.ts.map +0 -1
- package/lib/services/ziti-data.service.d.ts +0 -49
- package/lib/services/ziti-data.service.d.ts.map +0 -1
- package/lib/services/ziti-domain-controller.service.d.ts +0 -13
- package/lib/services/ziti-domain-controller.service.d.ts.map +0 -1
- package/lib/shared/list-page-component.class.d.ts +0 -57
- package/lib/shared/list-page-component.class.d.ts.map +0 -1
- package/lib/shared/list-page-service.class.d.ts +0 -81
- package/lib/shared/list-page-service.class.d.ts.map +0 -1
- package/lib/urls.d.ts +0 -34
- package/lib/urls.d.ts.map +0 -1
- package/lib/zac-routing.module.d.ts +0 -8
- package/lib/zac-routing.module.d.ts.map +0 -1
- package/lib/ziti-console-lib.module.d.ts +0 -121
- package/lib/ziti-console-lib.module.d.ts.map +0 -1
- package/lib/ziti-console.constants.d.ts +0 -5
- package/lib/ziti-console.constants.d.ts.map +0 -1
- package/openziti-ziti-console-lib.d.ts.map +0 -1
- package/public-api.d.ts +0 -127
- package/public-api.d.ts.map +0 -1
|
@@ -1,1706 +0,0 @@
|
|
|
1
|
-
/* eslint prefer-const: 1 */
|
|
2
|
-
import { Component, Inject, ViewEncapsulation, } from '@angular/core';
|
|
3
|
-
import { SETTINGS_SERVICE, } from '../../../services/settings.service';
|
|
4
|
-
import { ZITI_DATA_SERVICE, } from '../../../services/ziti-data.service';
|
|
5
|
-
import { VisualizerServiceClass } from '../visualizer-service.class';
|
|
6
|
-
import * as d3 from 'd3';
|
|
7
|
-
import _ from 'lodash';
|
|
8
|
-
import { cloneDeep } from "lodash";
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/common/http";
|
|
11
|
-
import * as i2 from "../../messaging/logger.service";
|
|
12
|
-
import * as i3 from "./network-visualizer.treenodeprocessor";
|
|
13
|
-
import * as i4 from "./network-visualizer.helper";
|
|
14
|
-
import * as i5 from "@angular/common";
|
|
15
|
-
import * as i6 from "@angular/forms";
|
|
16
|
-
import * as i7 from "@angular/material/autocomplete";
|
|
17
|
-
import * as i8 from "@angular/material/core";
|
|
18
|
-
import * as i9 from "../../loading-indicator/loading-indicator.component";
|
|
19
|
-
import * as i10 from "../../../services/settings.service";
|
|
20
|
-
import * as i11 from "../../../services/ziti-data.service";
|
|
21
|
-
export class NetworkVisualizerComponent extends VisualizerServiceClass {
|
|
22
|
-
constructor(settingsService, zitiService, httpClient, logger, treeNodeProcessor, topologyHelper) {
|
|
23
|
-
super();
|
|
24
|
-
this.settingsService = settingsService;
|
|
25
|
-
this.zitiService = zitiService;
|
|
26
|
-
this.httpClient = httpClient;
|
|
27
|
-
this.logger = logger;
|
|
28
|
-
this.treeNodeProcessor = treeNodeProcessor;
|
|
29
|
-
this.topologyHelper = topologyHelper;
|
|
30
|
-
// export class NetworkVisualizerComponent implements OnInit {
|
|
31
|
-
this.title = 'Network Visualizer';
|
|
32
|
-
this.uniqId = 0;
|
|
33
|
-
this.maxObjectsPerNode = 1001;
|
|
34
|
-
this.fullScreen = false;
|
|
35
|
-
this.isLoading = true;
|
|
36
|
-
this.noSearchResults = true;
|
|
37
|
-
this.services = [];
|
|
38
|
-
this.services_totalCount = 0;
|
|
39
|
-
this.all_services_fetched = false;
|
|
40
|
-
this.identities = [];
|
|
41
|
-
this.identities_totalCount = 0;
|
|
42
|
-
this.all_identities_fetched = false;
|
|
43
|
-
this.edgerouters = [];
|
|
44
|
-
this.edgerouters_totalCount = 0;
|
|
45
|
-
this.all_edgerouters_fetched = false;
|
|
46
|
-
this.service_policies = [];
|
|
47
|
-
this.service_policies_totalCount = 0;
|
|
48
|
-
this.all_service_policies_fetched = false;
|
|
49
|
-
this.edge_router_policies = [];
|
|
50
|
-
this.edge_router_policies_totalCount = 0;
|
|
51
|
-
this.all_edge_router_policies_fetched = false;
|
|
52
|
-
this.service_router_policies = [];
|
|
53
|
-
this.service_router_policies_totalCount = 0;
|
|
54
|
-
this.all_service_router_policies_fetched = false;
|
|
55
|
-
this.configs = [];
|
|
56
|
-
this.filerResponseMessage = 'search filter..';
|
|
57
|
-
this.servicePoliciesTreeNodes = [];
|
|
58
|
-
this.servicesTreeNodes = [];
|
|
59
|
-
this.identitiesTreeNodes = [];
|
|
60
|
-
this.edgeroutersTreeNodes = [];
|
|
61
|
-
this.erPoliciesTreeNodes = [];
|
|
62
|
-
this.serviceEdgeRouterPolicyTreeNodes = [];
|
|
63
|
-
this.resourceTypeError = false;
|
|
64
|
-
this.filterText = '';
|
|
65
|
-
this.searchWord = '';
|
|
66
|
-
this.resourceType = '';
|
|
67
|
-
this.openNodes = [];
|
|
68
|
-
this.contextmenuNodeType = [];
|
|
69
|
-
this.allPromises = [];
|
|
70
|
-
// super(settingsService, zitiService);
|
|
71
|
-
}
|
|
72
|
-
ngOnInit() {
|
|
73
|
-
this.getNetworkObjects();
|
|
74
|
-
}
|
|
75
|
-
getPagingObject(pagesize) {
|
|
76
|
-
return cloneDeep({
|
|
77
|
-
filter: "",
|
|
78
|
-
noSearch: true,
|
|
79
|
-
order: "asc",
|
|
80
|
-
page: 1,
|
|
81
|
-
searchOn: "name",
|
|
82
|
-
sort: "name",
|
|
83
|
-
total: pagesize
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
async getNetworkObjects() {
|
|
87
|
-
this.isLoading = true;
|
|
88
|
-
await this.readAllObjects();
|
|
89
|
-
this.processFirstNetworkGraph();
|
|
90
|
-
}
|
|
91
|
-
async fetchIdentities(pagesize) {
|
|
92
|
-
const identities_paging = this.getPagingObject(pagesize);
|
|
93
|
-
return await this.zitiService
|
|
94
|
-
.get(`identities`, identities_paging, [])
|
|
95
|
-
.then(async (result) => {
|
|
96
|
-
this.identities = result.data ? result.data : [];
|
|
97
|
-
this.identities_totalCount = result.meta && result.meta.pagination ? result.meta.pagination.totalCount : 0;
|
|
98
|
-
if (!this.identities || this.identities.length === 0) {
|
|
99
|
-
this.identities = [];
|
|
100
|
-
this.isLoading = false;
|
|
101
|
-
}
|
|
102
|
-
else if (this.identities_totalCount < this.maxObjectsPerNode) {
|
|
103
|
-
this.all_identities_fetched = true;
|
|
104
|
-
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
105
|
-
const promises = [];
|
|
106
|
-
for (let page = 2; page <= pages; page++) {
|
|
107
|
-
identities_paging.page = page;
|
|
108
|
-
const tmp_promise = await this.zitiService
|
|
109
|
-
.get(`identities`, identities_paging, []).then((pageResult) => {
|
|
110
|
-
pageResult.data.forEach((serv) => {
|
|
111
|
-
this.identities.push(serv);
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
promises.push(tmp_promise);
|
|
115
|
-
this.allPromises.push(tmp_promise);
|
|
116
|
-
}
|
|
117
|
-
Promise.all(promises).then(() => {
|
|
118
|
-
// this.identities_totalCount = this.identities.length;
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
}).catch(error => {
|
|
122
|
-
this.logger.error('Error in fetching Identities', error.message);
|
|
123
|
-
}); // identity promises
|
|
124
|
-
}
|
|
125
|
-
async fetchServices(pagesize) {
|
|
126
|
-
const services_paging = this.getPagingObject(pagesize);
|
|
127
|
-
return await this.zitiService
|
|
128
|
-
.get(`services`, services_paging, [])
|
|
129
|
-
.then(async (result) => {
|
|
130
|
-
this.services = result.data ? result.data : [];
|
|
131
|
-
this.services_totalCount = result.meta && result.meta.pagination ? result.meta.pagination.totalCount : 0;
|
|
132
|
-
if (!this.services || this.services.length === 0) {
|
|
133
|
-
this.services = [];
|
|
134
|
-
this.isLoading = false;
|
|
135
|
-
}
|
|
136
|
-
else if (this.services_totalCount < this.maxObjectsPerNode) {
|
|
137
|
-
this.all_services_fetched = true;
|
|
138
|
-
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
139
|
-
const s_promises = [];
|
|
140
|
-
for (let page = 2; page <= pages; page++) {
|
|
141
|
-
services_paging.page = page;
|
|
142
|
-
const tmp_promise = await this.zitiService
|
|
143
|
-
.get(`services`, services_paging, [])
|
|
144
|
-
.then((pageResult) => {
|
|
145
|
-
pageResult.data.forEach((serv) => {
|
|
146
|
-
this.services.push(serv);
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
s_promises.push(tmp_promise);
|
|
150
|
-
this.allPromises.push(tmp_promise);
|
|
151
|
-
}
|
|
152
|
-
Promise.all(s_promises).then(() => {
|
|
153
|
-
// this.services_totalCount = this.services.length;
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
}).catch(error => {
|
|
157
|
-
this.logger.error('Error in fetching services', error.message);
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
async fetchServicePolicies(pagesize) {
|
|
161
|
-
const servicesPolicies_paging = this.getPagingObject(pagesize);
|
|
162
|
-
return await this.zitiService
|
|
163
|
-
.get(`service-policies`, servicesPolicies_paging, [])
|
|
164
|
-
.then(async (result) => {
|
|
165
|
-
this.service_policies = result.data ? result.data : [];
|
|
166
|
-
this.service_policies_totalCount = result.meta && result.meta.pagination ? result.meta.pagination.totalCount : 0;
|
|
167
|
-
if (!this.service_policies || this.service_policies.length === 0) {
|
|
168
|
-
this.service_policies = [];
|
|
169
|
-
this.isLoading = false;
|
|
170
|
-
}
|
|
171
|
-
else if (this.service_policies_totalCount < this.maxObjectsPerNode) {
|
|
172
|
-
this.all_service_policies_fetched = true;
|
|
173
|
-
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
174
|
-
const sp_promises = [];
|
|
175
|
-
for (let page = 2; page <= pages; page++) {
|
|
176
|
-
servicesPolicies_paging.page = page;
|
|
177
|
-
const tmp_promise = await this.zitiService
|
|
178
|
-
.get(`service-policies`, servicesPolicies_paging, [])
|
|
179
|
-
.then((pageResult) => {
|
|
180
|
-
pageResult.data && pageResult.data.forEach((serv) => {
|
|
181
|
-
this.service_policies.push(serv);
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
sp_promises.push(tmp_promise);
|
|
185
|
-
this.allPromises.push(tmp_promise);
|
|
186
|
-
}
|
|
187
|
-
Promise.all(sp_promises).then(() => {
|
|
188
|
-
// this.service_policies_totalCount = this.service_policies.length;
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
}).catch(error => {
|
|
192
|
-
this.logger.error('Error in fetching service-policies', error.message);
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
async fetchEdgeRouters(pagesize) {
|
|
196
|
-
const routers_paging = this.getPagingObject(pagesize);
|
|
197
|
-
return await this.zitiService
|
|
198
|
-
.get(`edge-routers`, routers_paging, [])
|
|
199
|
-
.then(async (result) => {
|
|
200
|
-
this.edgerouters = result.data ? result.data : [];
|
|
201
|
-
this.edgerouters_totalCount = result.meta && result.meta.pagination ? result.meta.pagination.totalCount : 0;
|
|
202
|
-
if (!this.edgerouters || this.edgerouters.length === 0) {
|
|
203
|
-
this.edgerouters = [];
|
|
204
|
-
this.isLoading = false;
|
|
205
|
-
}
|
|
206
|
-
else if (this.edgerouters_totalCount < this.maxObjectsPerNode) {
|
|
207
|
-
this.all_edgerouters_fetched = true;
|
|
208
|
-
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
209
|
-
const r_promises = [];
|
|
210
|
-
for (let page = 2; page <= pages; page++) {
|
|
211
|
-
routers_paging.page = page;
|
|
212
|
-
const tmp_promise = await this.zitiService
|
|
213
|
-
.get(`edge-routers`, routers_paging, [])
|
|
214
|
-
.then((pageResult) => {
|
|
215
|
-
pageResult.data.forEach((serv) => {
|
|
216
|
-
this.edgerouters.push(serv);
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
r_promises.push(tmp_promise);
|
|
220
|
-
this.allPromises.push(tmp_promise);
|
|
221
|
-
}
|
|
222
|
-
Promise.all(r_promises).then(() => {
|
|
223
|
-
// this.edgerouters_totalCount = this.edgerouters.length;
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
}).catch(error => {
|
|
227
|
-
this.logger.error('Error in fetching edge-routers', error.message);
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
async findEdgeRouterPolicies(pagesize) {
|
|
231
|
-
this.edge_router_policies = [];
|
|
232
|
-
const erpolicies_paging = this.getPagingObject(pagesize);
|
|
233
|
-
return await this.zitiService
|
|
234
|
-
.get(`edge-router-policies`, erpolicies_paging, [])
|
|
235
|
-
.then(async (result) => {
|
|
236
|
-
this.edge_router_policies = result.data ? result.data : [];
|
|
237
|
-
this.edge_router_policies_totalCount = result.meta && result.meta.pagination ? result.meta.pagination.totalCount : 0;
|
|
238
|
-
if (!this.edge_router_policies || this.edge_router_policies.length === 0) {
|
|
239
|
-
this.isLoading = false;
|
|
240
|
-
}
|
|
241
|
-
else if (this.edge_router_policies_totalCount < this.maxObjectsPerNode) {
|
|
242
|
-
this.all_edge_router_policies_fetched = true;
|
|
243
|
-
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
244
|
-
const r_promises = [];
|
|
245
|
-
for (let page = 2; page <= pages; page++) {
|
|
246
|
-
erpolicies_paging.page = page;
|
|
247
|
-
const tmp_promise = await this.zitiService
|
|
248
|
-
.get(`edge-router-policies`, erpolicies_paging, [])
|
|
249
|
-
.then((pageResult) => {
|
|
250
|
-
pageResult.data.forEach((serv) => {
|
|
251
|
-
this.edge_router_policies.push(serv);
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
r_promises.push(tmp_promise);
|
|
255
|
-
this.allPromises.push(tmp_promise);
|
|
256
|
-
}
|
|
257
|
-
Promise.all(r_promises).then(() => {
|
|
258
|
-
// this.edge_router_policies_totalCount = this.edge_router_policies.length;
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
}).catch(error => {
|
|
262
|
-
this.logger.error('Error in fetching edge-router-policies', error);
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
async fetchServiceEdgeRouterPolicies(pagesize) {
|
|
266
|
-
this.service_router_policies = [];
|
|
267
|
-
const serp_paging = this.getPagingObject(pagesize);
|
|
268
|
-
return await this.zitiService
|
|
269
|
-
.get(`service-edge-router-policies`, serp_paging, [])
|
|
270
|
-
.then(async (result) => {
|
|
271
|
-
this.service_router_policies = result.data ? result.data : [];
|
|
272
|
-
this.service_router_policies_totalCount = result.meta && result.meta.pagination ? result.meta.pagination.totalCount : 0;
|
|
273
|
-
if (!this.service_router_policies || this.service_router_policies.length === 0) {
|
|
274
|
-
this.isLoading = false;
|
|
275
|
-
}
|
|
276
|
-
else if (this.service_router_policies_totalCount < this.maxObjectsPerNode) {
|
|
277
|
-
this.all_service_router_policies_fetched = true;
|
|
278
|
-
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
279
|
-
const r_promises = [];
|
|
280
|
-
for (let page = 2; page <= pages; page++) {
|
|
281
|
-
serp_paging.page = page;
|
|
282
|
-
const tmp_promise = await this.zitiService
|
|
283
|
-
.get(`service-edge-router-policies`, serp_paging, [])
|
|
284
|
-
.then((pageResult) => {
|
|
285
|
-
pageResult.data.forEach((serv) => {
|
|
286
|
-
this.service_router_policies.push(serv);
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
|
-
r_promises.push(tmp_promise);
|
|
290
|
-
this.allPromises.push(tmp_promise);
|
|
291
|
-
}
|
|
292
|
-
Promise.all(r_promises).then(() => {
|
|
293
|
-
// this.service_router_policies_totalCount = this.service_router_policies.length;
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
}).catch(error => {
|
|
297
|
-
this.logger.error('Error in fetching service-edge-router-policies', error);
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
async fetchConfigs(pagesize) {
|
|
301
|
-
this.configs = [];
|
|
302
|
-
const configs_paging = this.getPagingObject(pagesize);
|
|
303
|
-
return await this.zitiService
|
|
304
|
-
.get(`configs`, configs_paging, [])
|
|
305
|
-
.then(async (result) => {
|
|
306
|
-
this.configs = result.data ? result.data : [];
|
|
307
|
-
const configs_totalCount = result.meta && result.meta.pagination ? result.meta.pagination.totalCount : 0;
|
|
308
|
-
if (!this.configs || this.configs.length === 0) {
|
|
309
|
-
this.configs = [];
|
|
310
|
-
}
|
|
311
|
-
else if (configs_totalCount < this.maxObjectsPerNode) {
|
|
312
|
-
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
313
|
-
const r_promises = [];
|
|
314
|
-
for (let page = 2; page <= pages; page++) {
|
|
315
|
-
configs_paging.page = page;
|
|
316
|
-
const tmp_promise = await this.zitiService
|
|
317
|
-
.get(`configs`, configs_paging, [])
|
|
318
|
-
.then((pageResult) => {
|
|
319
|
-
pageResult.data.forEach((serv) => {
|
|
320
|
-
this.configs.push(serv);
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
r_promises.push(tmp_promise);
|
|
324
|
-
this.allPromises.push(tmp_promise);
|
|
325
|
-
}
|
|
326
|
-
Promise.all(r_promises).then(() => {
|
|
327
|
-
const configs_totalCount = this.configs.length;
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
}).catch(error => {
|
|
331
|
-
this.logger.error('Error in fetching configs', error);
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
async readAllObjects() {
|
|
335
|
-
const myPromise = await new Promise((resolve, reject) => {
|
|
336
|
-
let networkVisPromises = [];
|
|
337
|
-
const pagesize = 500;
|
|
338
|
-
const eps = this.fetchIdentities(pagesize);
|
|
339
|
-
this.allPromises.push(eps);
|
|
340
|
-
const ss = this.fetchServices(pagesize);
|
|
341
|
-
this.allPromises.push(ss);
|
|
342
|
-
const sps = this.fetchServicePolicies(pagesize);
|
|
343
|
-
this.allPromises.push(sps);
|
|
344
|
-
const ers = this.fetchEdgeRouters(pagesize);
|
|
345
|
-
this.allPromises.push(eps);
|
|
346
|
-
const erps = this.findEdgeRouterPolicies(pagesize);
|
|
347
|
-
this.allPromises.push(erps);
|
|
348
|
-
const serps = this.fetchServiceEdgeRouterPolicies(pagesize);
|
|
349
|
-
this.allPromises.push(serps);
|
|
350
|
-
const cfg = this.fetchConfigs(pagesize);
|
|
351
|
-
this.allPromises.push(cfg);
|
|
352
|
-
Promise.all(this.allPromises).then((res) => { resolve('end'); });
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
processFirstNetworkGraph() {
|
|
356
|
-
try {
|
|
357
|
-
const treeObj = this.topologyHelper.getResourceTreeObj('this.currentNetwork.name', 'this.currentNetwork.status', this.services, this.identities, this.service_policies, this.edgerouters, this.edge_router_policies, this.service_router_policies, this.services_totalCount, this.identities_totalCount, this.edgerouters_totalCount, this.service_policies_totalCount, this.edge_router_policies_totalCount, this.service_router_policies_totalCount, this.uniqId, this.logger, this.all_service_policies_fetched, this.all_services_fetched, this.all_identities_fetched, this.all_edgerouters_fetched, this.all_edge_router_policies_fetched, this.all_service_router_policies_fetched);
|
|
358
|
-
this.uniqId = treeObj.lastId;
|
|
359
|
-
this.networkGraph = d3.hierarchy(treeObj, function (d) {
|
|
360
|
-
return d.children;
|
|
361
|
-
});
|
|
362
|
-
// this.baseNetworkGraph = _.cloneDeep(this.networkGraph);
|
|
363
|
-
this.servicePoliciesTreeNodes = [];
|
|
364
|
-
this.servicesTreeNodes = [];
|
|
365
|
-
this.identitiesTreeNodes = [];
|
|
366
|
-
this.edgeroutersTreeNodes = [];
|
|
367
|
-
this.erPoliciesTreeNodes = [];
|
|
368
|
-
this.serviceEdgeRouterPolicyTreeNodes = [];
|
|
369
|
-
this.servicePoliciesTreeNodes = this.fillAutoCompleteTreeNodes(this.service_policies, this.servicePoliciesTreeNodes, 'ServicePolicy');
|
|
370
|
-
this.servicesTreeNodes = this.fillAutoCompleteTreeNodes(this.services, this.servicesTreeNodes, 'Service');
|
|
371
|
-
this.identitiesTreeNodes = this.fillAutoCompleteTreeNodes(this.identities, this.identitiesTreeNodes, 'Identity');
|
|
372
|
-
this.edgeroutersTreeNodes = this.fillAutoCompleteTreeNodes(this.edgerouters, this.edgeroutersTreeNodes, 'Router');
|
|
373
|
-
this.erPoliciesTreeNodes = this.fillAutoCompleteTreeNodes(this.edge_router_policies, this.erPoliciesTreeNodes, 'Router Policy');
|
|
374
|
-
this.serviceEdgeRouterPolicyTreeNodes = this.fillAutoCompleteTreeNodes(this.service_router_policies, this.serviceEdgeRouterPolicyTreeNodes, 'Service Router Policy');
|
|
375
|
-
this.initTopoView();
|
|
376
|
-
this.baseNetworkGraph = _.cloneDeep(this.networkGraph);
|
|
377
|
-
}
|
|
378
|
-
catch (err) {
|
|
379
|
-
this.logger.error(err.message);
|
|
380
|
-
}
|
|
381
|
-
this.isLoading = false;
|
|
382
|
-
}
|
|
383
|
-
fillAutoCompleteTreeNodes(resourcesArray, arr, typeName) {
|
|
384
|
-
resourcesArray && resourcesArray.forEach((ob) => {
|
|
385
|
-
arr.push(ob.name);
|
|
386
|
-
});
|
|
387
|
-
return arr;
|
|
388
|
-
}
|
|
389
|
-
debounce(func, timeout = 150) {
|
|
390
|
-
let timer;
|
|
391
|
-
return (...args) => {
|
|
392
|
-
this.autocompleteOptions = [];
|
|
393
|
-
clearTimeout(timer);
|
|
394
|
-
timer = setTimeout(() => { func.apply(this, args); }, timeout);
|
|
395
|
-
};
|
|
396
|
-
}
|
|
397
|
-
nwSearchChange(event) {
|
|
398
|
-
if (this.filterText.length > 1 && event.key !== 'Escape' && event.key !== 'ArrowRight' && event.key !== 'ArrowLeft' && event.key !== 'Enter') {
|
|
399
|
-
this.filerResponseMessage = 'search filter..';
|
|
400
|
-
this.debounce(this.filterSearchArray());
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
autocompleteSearch(event) {
|
|
404
|
-
const str = event ? event.option.value : '';
|
|
405
|
-
this.searchResourceConditionCheck(str);
|
|
406
|
-
}
|
|
407
|
-
resourceTypeChanged() {
|
|
408
|
-
this.filerResponseMessage = 'search filter..';
|
|
409
|
-
this.searchCache = [];
|
|
410
|
-
this.resetSearchNode();
|
|
411
|
-
this.clearSearchLinkColors();
|
|
412
|
-
if (_.isEmpty(this.resourceType)) {
|
|
413
|
-
this.autocompleteOptions = [];
|
|
414
|
-
this.clearSearchFilter();
|
|
415
|
-
this.resourceTypeError = !_.isEmpty(this.filterText);
|
|
416
|
-
return;
|
|
417
|
-
}
|
|
418
|
-
this.filterText = '';
|
|
419
|
-
this.resourceTypeError = false;
|
|
420
|
-
this.autocompleteOptions = [];
|
|
421
|
-
if (this.resourceType === 'service-policies' && this.all_service_policies_fetched) {
|
|
422
|
-
this.autocompleteOptions = this.servicePoliciesTreeNodes;
|
|
423
|
-
}
|
|
424
|
-
else if (this.resourceType === 'services' && this.all_services_fetched) {
|
|
425
|
-
this.autocompleteOptions = this.servicesTreeNodes;
|
|
426
|
-
}
|
|
427
|
-
else if (this.resourceType === 'identities' && this.all_identities_fetched) {
|
|
428
|
-
this.autocompleteOptions = this.identitiesTreeNodes;
|
|
429
|
-
}
|
|
430
|
-
else if (this.resourceType === 'edge-routers' && this.all_edgerouters_fetched) {
|
|
431
|
-
this.autocompleteOptions = this.edgeroutersTreeNodes;
|
|
432
|
-
}
|
|
433
|
-
else if (this.resourceType === 'edge-router-policies' && this.all_edge_router_policies_fetched) {
|
|
434
|
-
this.autocompleteOptions = this.erPoliciesTreeNodes;
|
|
435
|
-
}
|
|
436
|
-
else if (this.resourceType === 'service-edge-router-policies' && this.all_service_router_policies_fetched) {
|
|
437
|
-
this.autocompleteOptions = this.serviceEdgeRouterPolicyTreeNodes;
|
|
438
|
-
}
|
|
439
|
-
if (!_.isEmpty(this.filterText)) {
|
|
440
|
-
this.searchResourceConditionCheck(this.filterText);
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
searchResourceConditionCheck(searchTxt) {
|
|
444
|
-
if (this.resourceType === '' && searchTxt !== '') {
|
|
445
|
-
this.resourceTypeError = true;
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
else {
|
|
449
|
-
this.searchResourceInTree(searchTxt);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
searchResourceInTree(searchTxt) {
|
|
453
|
-
this.noSearchResults = false;
|
|
454
|
-
this.resourceTypeError = false;
|
|
455
|
-
this.resetTree(null);
|
|
456
|
-
if (searchTxt === '') {
|
|
457
|
-
this.clearSearchLinkColors();
|
|
458
|
-
}
|
|
459
|
-
else {
|
|
460
|
-
this.resetSearchNode();
|
|
461
|
-
this.clearSearchLinkColors();
|
|
462
|
-
let paths = [];
|
|
463
|
-
let targetNodes = [];
|
|
464
|
-
const nodeIds = [];
|
|
465
|
-
if (this.resourceType === 'service-policies' && !this.all_service_policies_fetched) {
|
|
466
|
-
const rawOb = this.searchCache.find((item) => item.name === searchTxt);
|
|
467
|
-
const id = this.topologyHelper.createServicePolicyNode(rawOb);
|
|
468
|
-
// id.clickProcess = "Not Yet";
|
|
469
|
-
if (!this.isNodeExists(this.nodes[1], id)) {
|
|
470
|
-
this.nodes[1].data.children.push(id);
|
|
471
|
-
}
|
|
472
|
-
this.networkGraph = d3.hierarchy(this.networkGraph.data, function (nd) {
|
|
473
|
-
return nd.children;
|
|
474
|
-
});
|
|
475
|
-
this.networkGraph.children.forEach((nd, i) => {
|
|
476
|
-
if (i !== 0) {
|
|
477
|
-
this.graphCollapse(nd);
|
|
478
|
-
}
|
|
479
|
-
});
|
|
480
|
-
this.service_policies = [];
|
|
481
|
-
this.service_policies[0] = rawOb;
|
|
482
|
-
this.updateTree(this.nodes[1]);
|
|
483
|
-
targetNodes = this.processSearchInPreorder(this.nodes[1], searchTxt, targetNodes);
|
|
484
|
-
}
|
|
485
|
-
else if (this.resourceType === 'service-policies' && this.all_service_policies_fetched) {
|
|
486
|
-
targetNodes = this.processSearchInPreorder(this.nodes[1], searchTxt, targetNodes);
|
|
487
|
-
}
|
|
488
|
-
else if (this.resourceType === 'edge-routers' && !this.all_edgerouters_fetched) {
|
|
489
|
-
const rawOb = this.searchCache.find((item) => item.name === searchTxt);
|
|
490
|
-
const id = this.topologyHelper.createEdgeRouterNode(rawOb);
|
|
491
|
-
// id.clickProcess = "Not Yet";
|
|
492
|
-
if (!this.isNodeExists(this.nodes[4], id)) {
|
|
493
|
-
this.nodes[4].data.children.push(id);
|
|
494
|
-
}
|
|
495
|
-
this.networkGraph = d3.hierarchy(this.networkGraph.data, function (nd) {
|
|
496
|
-
return nd.children;
|
|
497
|
-
});
|
|
498
|
-
this.networkGraph.children.forEach((nd, i) => {
|
|
499
|
-
if (i !== 3) {
|
|
500
|
-
this.graphCollapse(nd);
|
|
501
|
-
}
|
|
502
|
-
});
|
|
503
|
-
this.edgerouters = [];
|
|
504
|
-
this.edgerouters[0] = rawOb;
|
|
505
|
-
this.updateTree(this.nodes[4]);
|
|
506
|
-
targetNodes = this.processSearchInPreorder(this.nodes[4], searchTxt, targetNodes);
|
|
507
|
-
}
|
|
508
|
-
else if (this.resourceType === 'edge-routers' && this.all_edgerouters_fetched) {
|
|
509
|
-
targetNodes = this.processSearchInPreorder(this.nodes[4], searchTxt, targetNodes);
|
|
510
|
-
}
|
|
511
|
-
else if (this.resourceType === 'services' && !this.all_services_fetched) {
|
|
512
|
-
const rawOb = this.searchCache.find((item) => item.name === searchTxt);
|
|
513
|
-
const id = this.topologyHelper.createServiceNode(rawOb);
|
|
514
|
-
id.clickProcess = "Not Yet";
|
|
515
|
-
if (!this.isNodeExists(this.nodes[2], id)) {
|
|
516
|
-
this.nodes[2].data.children.push(id);
|
|
517
|
-
}
|
|
518
|
-
this.networkGraph = d3.hierarchy(this.networkGraph.data, function (nd) {
|
|
519
|
-
return nd.children;
|
|
520
|
-
});
|
|
521
|
-
this.services = [];
|
|
522
|
-
this.services[0] = rawOb;
|
|
523
|
-
this.updateTree(this.nodes[2]);
|
|
524
|
-
targetNodes = this.processSearchInPreorder(this.nodes[2], searchTxt, targetNodes);
|
|
525
|
-
this.networkGraph.children.forEach((nd, i) => {
|
|
526
|
-
if (i !== 1) {
|
|
527
|
-
this.graphCollapse(nd);
|
|
528
|
-
}
|
|
529
|
-
});
|
|
530
|
-
}
|
|
531
|
-
else if (this.resourceType === 'services' && this.all_services_fetched) {
|
|
532
|
-
targetNodes = this.processSearchInPreorder(this.nodes[2], searchTxt, targetNodes);
|
|
533
|
-
}
|
|
534
|
-
else if (this.resourceType === 'identities' && !this.all_identities_fetched) {
|
|
535
|
-
const rawOb = this.searchCache.find((item) => item.name === searchTxt);
|
|
536
|
-
const id = this.topologyHelper.createIdentityNode(rawOb);
|
|
537
|
-
id.clickProcess = "Not Yet";
|
|
538
|
-
if (!this.isNodeExists(this.nodes[3], id)) {
|
|
539
|
-
this.nodes[3].data.children.push(id);
|
|
540
|
-
}
|
|
541
|
-
this.networkGraph = d3.hierarchy(this.networkGraph.data, function (nd) {
|
|
542
|
-
return nd.children;
|
|
543
|
-
});
|
|
544
|
-
this.identities[0] = [];
|
|
545
|
-
this.identities[0] = rawOb;
|
|
546
|
-
this.updateTree(this.nodes[3]);
|
|
547
|
-
targetNodes = this.processSearchInPreorder(this.nodes[3], searchTxt, targetNodes);
|
|
548
|
-
this.networkGraph.children.forEach((nd, i) => {
|
|
549
|
-
if (i !== 2) {
|
|
550
|
-
this.graphCollapse(nd);
|
|
551
|
-
}
|
|
552
|
-
});
|
|
553
|
-
}
|
|
554
|
-
else if (this.resourceType === 'identities' && this.all_identities_fetched) {
|
|
555
|
-
targetNodes = this.processSearchInPreorder(this.nodes[3], searchTxt, targetNodes);
|
|
556
|
-
}
|
|
557
|
-
else if (this.resourceType === 'edge-router-policies' && !this.all_edge_router_policies_fetched) {
|
|
558
|
-
const rawOb = this.searchCache.find((item) => item.name === searchTxt);
|
|
559
|
-
const id = this.topologyHelper.createEdgeRouterPolicyNode(rawOb);
|
|
560
|
-
id.clickProcess = "Not Yet";
|
|
561
|
-
if (!this.isNodeExists(this.nodes[5], id)) {
|
|
562
|
-
this.nodes[5].data.children.push(id);
|
|
563
|
-
}
|
|
564
|
-
this.networkGraph = d3.hierarchy(this.networkGraph.data, function (nd) {
|
|
565
|
-
return nd.children;
|
|
566
|
-
});
|
|
567
|
-
this.networkGraph.children.forEach((nd, i) => {
|
|
568
|
-
if (i !== 4) {
|
|
569
|
-
this.graphCollapse(nd);
|
|
570
|
-
}
|
|
571
|
-
});
|
|
572
|
-
this.networkGraph.children.forEach(nd => this.graphCollapse(nd));
|
|
573
|
-
this.edge_router_policies = [];
|
|
574
|
-
this.edge_router_policies[0] = rawOb;
|
|
575
|
-
this.updateTree(this.nodes[5]);
|
|
576
|
-
targetNodes = this.processSearchInPreorder(this.nodes[5], searchTxt, targetNodes);
|
|
577
|
-
}
|
|
578
|
-
else if (this.resourceType === 'edge-router-policies' && this.all_edge_router_policies_fetched) {
|
|
579
|
-
targetNodes = this.processSearchInPreorder(this.nodes[5], searchTxt, targetNodes);
|
|
580
|
-
}
|
|
581
|
-
else if (this.resourceType === 'service-edge-router-policies' && !this.all_service_router_policies_fetched) {
|
|
582
|
-
const rawOb = this.searchCache.find((item) => item.name === searchTxt);
|
|
583
|
-
const id = this.topologyHelper.createServiceEdgeRouterPolicyNode(rawOb);
|
|
584
|
-
id.clickProcess = "Not Yet";
|
|
585
|
-
if (!this.isNodeExists(this.nodes[6], id)) {
|
|
586
|
-
this.nodes[6].data.children.push(id);
|
|
587
|
-
}
|
|
588
|
-
this.networkGraph = d3.hierarchy(this.networkGraph.data, function (nd) {
|
|
589
|
-
return nd.children;
|
|
590
|
-
});
|
|
591
|
-
this.networkGraph.children.forEach((nd, i) => {
|
|
592
|
-
if (i !== 5) {
|
|
593
|
-
this.graphCollapse(nd);
|
|
594
|
-
}
|
|
595
|
-
});
|
|
596
|
-
this.service_router_policies = [];
|
|
597
|
-
this.service_router_policies[0] = rawOb;
|
|
598
|
-
this.updateTree(this.nodes[6]);
|
|
599
|
-
targetNodes = this.processSearchInPreorder(this.nodes[6], searchTxt, targetNodes);
|
|
600
|
-
}
|
|
601
|
-
else if (this.resourceType === 'service-edge-router-policies' && this.all_service_router_policies_fetched) {
|
|
602
|
-
targetNodes = this.processSearchInPreorder(this.nodes[6], searchTxt, targetNodes);
|
|
603
|
-
}
|
|
604
|
-
// this.networkGraph.children.forEach(nd => this.graphCollapse(nd));
|
|
605
|
-
paths = this.explorePathsForSearchedNodes(targetNodes, paths, nodeIds);
|
|
606
|
-
if (targetNodes && targetNodes.length <= 0) {
|
|
607
|
-
this.noSearchResults = true;
|
|
608
|
-
this.clearSearchLinkColors();
|
|
609
|
-
}
|
|
610
|
-
else {
|
|
611
|
-
this.openPaths(paths, true);
|
|
612
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
613
|
-
// @ts-ignore
|
|
614
|
-
d3.selectAll('circle').filter(function (d) {
|
|
615
|
-
const dataName = _.get(d, 'data.name', '');
|
|
616
|
-
// const dataId = _.get(d, 'data.id', '');
|
|
617
|
-
const nodeName = _.get(targetNodes[0], 'data.name', '');
|
|
618
|
-
if (dataName.toLowerCase() === searchTxt.toLowerCase() && nodeName === dataName) {
|
|
619
|
-
d3.select(this).style('fill', '#a60303'); //#004447, 470000
|
|
620
|
-
}
|
|
621
|
-
});
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
isNodeExists(rootNode, id) {
|
|
626
|
-
return rootNode.data.children.find((nd) => nd.uuid === id.uuid);
|
|
627
|
-
}
|
|
628
|
-
explorePathsForSearchedNodes(targetNodes, paths, nodeIds) {
|
|
629
|
-
for (let i = 0; targetNodes && i < targetNodes.length; i++) {
|
|
630
|
-
let nd = targetNodes[i];
|
|
631
|
-
paths.push(nd);
|
|
632
|
-
while (nd.parent) {
|
|
633
|
-
const nodeId = _.get(nd.parent, 'data.id');
|
|
634
|
-
if (nodeIds.indexOf(nodeId) < 0) {
|
|
635
|
-
nodeIds.push(nodeId);
|
|
636
|
-
paths.push(nd.parent);
|
|
637
|
-
}
|
|
638
|
-
nd = nd.parent;
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
return paths;
|
|
642
|
-
}
|
|
643
|
-
processSearchInPreorder(nodeObj, searchTxt, targetNodes) {
|
|
644
|
-
const name = _.get(nodeObj, 'data.name');
|
|
645
|
-
// const nodeId = _.get(nodeObj, 'data.id');
|
|
646
|
-
const isRootNode = _.get(nodeObj, 'data.rootNode');
|
|
647
|
-
if (!name) {
|
|
648
|
-
return;
|
|
649
|
-
}
|
|
650
|
-
if (isRootNode && isRootNode === 'Yes' && name.toLowerCase() === searchTxt.toLowerCase()) {
|
|
651
|
-
targetNodes.push(nodeObj);
|
|
652
|
-
}
|
|
653
|
-
const childNodes = nodeObj.children ? nodeObj.children : nodeObj._children;
|
|
654
|
-
for (let i = 0; childNodes && i < childNodes.length; i++) {
|
|
655
|
-
this.processSearchInPreorder(childNodes[i], searchTxt, targetNodes);
|
|
656
|
-
}
|
|
657
|
-
return targetNodes;
|
|
658
|
-
}
|
|
659
|
-
clearSearchLinkColors() {
|
|
660
|
-
this.svg.selectAll('path.link').each(function (d) {
|
|
661
|
-
d3.select(this).style('stroke', 'white');
|
|
662
|
-
});
|
|
663
|
-
this.svg.selectAll('circle').style('fill', function (d) {
|
|
664
|
-
return d._children ? 'var(--tableText)' : '#fff';
|
|
665
|
-
});
|
|
666
|
-
}
|
|
667
|
-
openPaths(paths, doReset = false) {
|
|
668
|
-
const pathIds = [];
|
|
669
|
-
for (let i = paths.length - 1; i >= 0; i--) {
|
|
670
|
-
const l = paths[i];
|
|
671
|
-
if (this.openNodes.indexOf(l.data.id) < 0) {
|
|
672
|
-
this.openNodes.push(l.data.id);
|
|
673
|
-
}
|
|
674
|
-
this.expand(paths[i]);
|
|
675
|
-
if (i > 0) {
|
|
676
|
-
this.updateTree(l, doReset);
|
|
677
|
-
}
|
|
678
|
-
pathIds.push(l.data.id);
|
|
679
|
-
}
|
|
680
|
-
pathIds.push(paths[1].data.id);
|
|
681
|
-
pathIds.push(paths[0].data.id);
|
|
682
|
-
let childreng = null; // get 2nd level data nodes.
|
|
683
|
-
if (this.resourceType === 'service-policies') {
|
|
684
|
-
childreng = this.networkGraph.children[0];
|
|
685
|
-
}
|
|
686
|
-
else if (this.resourceType === 'services') {
|
|
687
|
-
childreng = this.networkGraph.children[1];
|
|
688
|
-
}
|
|
689
|
-
else if (this.resourceType === 'identities') {
|
|
690
|
-
childreng = this.networkGraph.children[2];
|
|
691
|
-
}
|
|
692
|
-
else if (this.resourceType === 'edge-routers') {
|
|
693
|
-
childreng = this.networkGraph.children[3];
|
|
694
|
-
}
|
|
695
|
-
else if (this.resourceType === 'edge-router-policies') {
|
|
696
|
-
childreng = this.networkGraph.children[4];
|
|
697
|
-
}
|
|
698
|
-
else if (this.resourceType === 'service-edge-router-policies') {
|
|
699
|
-
childreng = this.networkGraph.children[5];
|
|
700
|
-
}
|
|
701
|
-
const ndd_childs = childreng.children ? childreng.children : childreng._children; // 2nd level chailds. groups/childrens
|
|
702
|
-
for (let i = 0; i < ndd_childs.length; i++) {
|
|
703
|
-
// 2st level
|
|
704
|
-
// if (this.resourceType === 'endpoints' || this.resourceType === 'services') {
|
|
705
|
-
if (ndd_childs[i].data.type === 'Group') {
|
|
706
|
-
// process groups
|
|
707
|
-
const d1 = ndd_childs[i]; //get group
|
|
708
|
-
if (d1 && paths[1].data.id === d1.data.id) {
|
|
709
|
-
const children0 = d1.children ? d1.children : d1._children; // 3rd level childs
|
|
710
|
-
const arr = children0.filter(function (replOb) {
|
|
711
|
-
return replOb.data.id === paths[0].data.id;
|
|
712
|
-
});
|
|
713
|
-
d1.children = arr;
|
|
714
|
-
d1._children = null;
|
|
715
|
-
const arrgrp = ndd_childs.filter(function (replObj) {
|
|
716
|
-
return replObj.data.id === d1.data.id;
|
|
717
|
-
});
|
|
718
|
-
childreng.children = arrgrp;
|
|
719
|
-
this.updateTree(this.networkGraph, doReset);
|
|
720
|
-
break;
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
else {
|
|
724
|
-
if (childreng.data.id === paths[1].data.id) {
|
|
725
|
-
const arr = ndd_childs.filter(function (replOb) {
|
|
726
|
-
return replOb.data.id === paths[0].data.id;
|
|
727
|
-
});
|
|
728
|
-
childreng.children = arr;
|
|
729
|
-
childreng._children = null;
|
|
730
|
-
this.updateTree(this.networkGraph, doReset);
|
|
731
|
-
break;
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
let datanodes = null; // get 2nd level data nodes.
|
|
736
|
-
if (this.resourceType === 'service-policies') {
|
|
737
|
-
datanodes = this.networkGraph.data.children[0];
|
|
738
|
-
}
|
|
739
|
-
else if (this.resourceType === 'services') {
|
|
740
|
-
datanodes = this.networkGraph.data.children[1];
|
|
741
|
-
}
|
|
742
|
-
else if (this.resourceType === 'identities') {
|
|
743
|
-
datanodes = this.networkGraph.data.children[2];
|
|
744
|
-
}
|
|
745
|
-
else if (this.resourceType === 'edge-routers') {
|
|
746
|
-
datanodes = this.networkGraph.data.children[3];
|
|
747
|
-
}
|
|
748
|
-
else if (this.resourceType === 'edge-router-policies') {
|
|
749
|
-
datanodes = this.networkGraph.data.children[4];
|
|
750
|
-
}
|
|
751
|
-
else if (this.resourceType === 'service-edge-router-policies') {
|
|
752
|
-
datanodes = this.networkGraph.data.children[5];
|
|
753
|
-
}
|
|
754
|
-
if (datanodes.id === paths[1].data.id) {
|
|
755
|
-
const arr = datanodes.children.filter(function (replOb) {
|
|
756
|
-
return replOb.id === paths[0].data.id;
|
|
757
|
-
});
|
|
758
|
-
datanodes.children = arr;
|
|
759
|
-
this.updateTree(this.networkGraph, doReset);
|
|
760
|
-
}
|
|
761
|
-
else {
|
|
762
|
-
const groupNodes = datanodes.children;
|
|
763
|
-
for (let k = 0; k < groupNodes.length; k++) {
|
|
764
|
-
if (groupNodes[k].id === paths[1].data.id) {
|
|
765
|
-
// check searched group node
|
|
766
|
-
const arr = groupNodes[k].children.filter(function (replOb) {
|
|
767
|
-
return replOb.id === paths[0].data.id;
|
|
768
|
-
});
|
|
769
|
-
groupNodes[k].children = arr;
|
|
770
|
-
const arrgrp = groupNodes.filter(function (replObj) {
|
|
771
|
-
return replObj.id === paths[1].data.id;
|
|
772
|
-
});
|
|
773
|
-
datanodes.children = arrgrp;
|
|
774
|
-
this.updateTree(this.networkGraph, doReset);
|
|
775
|
-
break;
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
this.updateTree(this.networkGraph, doReset);
|
|
780
|
-
this.searchRootNode = paths[1];
|
|
781
|
-
this.svg.selectAll('.link').each(function (d) {
|
|
782
|
-
if (pathIds.indexOf(d.data.id) >= 0) {
|
|
783
|
-
d3.select(this).style('stroke', 'red');
|
|
784
|
-
}
|
|
785
|
-
else {
|
|
786
|
-
d3.select(this).style('stroke', 'white');
|
|
787
|
-
}
|
|
788
|
-
});
|
|
789
|
-
}
|
|
790
|
-
resetSearchNode() {
|
|
791
|
-
if (this.searchRootNode) {
|
|
792
|
-
this.networkGraph = _.cloneDeep(this.baseNetworkGraph);
|
|
793
|
-
this.updateTree(this.networkGraph, true);
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
resetTree(clearSearch) {
|
|
797
|
-
this.resetSearchNode();
|
|
798
|
-
if (clearSearch) {
|
|
799
|
-
this.clearSearchFilter();
|
|
800
|
-
this.clearSearchType();
|
|
801
|
-
}
|
|
802
|
-
for (let i = this.openNodes.length - 1; i > 0; i--) {
|
|
803
|
-
const d = this.openNodes[i];
|
|
804
|
-
if (d && d.children) {
|
|
805
|
-
d._children = d.children;
|
|
806
|
-
d.children = null;
|
|
807
|
-
this.updateTree(d);
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
for (let i = this.nodes.length - 1; i > 0; i--) {
|
|
811
|
-
const d = this.nodes[i];
|
|
812
|
-
if (d && d.children) {
|
|
813
|
-
d._children = d.children;
|
|
814
|
-
d.children = null;
|
|
815
|
-
this.updateTree(d);
|
|
816
|
-
}
|
|
817
|
-
}
|
|
818
|
-
this.clearSearchLinkColors();
|
|
819
|
-
this.openNodes = [];
|
|
820
|
-
this.sizeToFit();
|
|
821
|
-
this.resetZoom();
|
|
822
|
-
}
|
|
823
|
-
expand(d) {
|
|
824
|
-
if (d._children) {
|
|
825
|
-
d.children = d._children;
|
|
826
|
-
d._children = null;
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
|
-
collapse() {
|
|
830
|
-
for (let i = this.openNodes.length - 1; i > 0; i--) {
|
|
831
|
-
const d = this.nodes[i];
|
|
832
|
-
if (d.children) {
|
|
833
|
-
d._children = d.children;
|
|
834
|
-
d.children = null;
|
|
835
|
-
this.updateTree(d);
|
|
836
|
-
}
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
findModelName() {
|
|
840
|
-
return this.resourceType;
|
|
841
|
-
}
|
|
842
|
-
async searchObjectsUsingApi() {
|
|
843
|
-
this.isLoading = true;
|
|
844
|
-
const model_name = this.findModelName();
|
|
845
|
-
this.searchWord = _.clone(this.filterText);
|
|
846
|
-
const str = `${this.resourceType}?filter=%20name%20contains%20%22${this.searchWord}%22&limit=5&offset=0&sort=name%20%20asc`;
|
|
847
|
-
return await this.zitiService
|
|
848
|
-
.call(str)
|
|
849
|
-
.then((result) => {
|
|
850
|
-
this.isLoading = false;
|
|
851
|
-
this.autocompleteOptions = [];
|
|
852
|
-
this.searchCache = result.data;
|
|
853
|
-
result.data.forEach((res) => {
|
|
854
|
-
/* const obj: { [key: string]: string } = {
|
|
855
|
-
id: res.id,
|
|
856
|
-
name: res.name,
|
|
857
|
-
}; */
|
|
858
|
-
this.autocompleteOptions.push(res.name);
|
|
859
|
-
});
|
|
860
|
-
this.noSearchResults = true;
|
|
861
|
-
const countA = result.data?.length > 0 ? result.data.length : 0;
|
|
862
|
-
this.filerResponseMessage = "search word:'" + this.searchWord + "', result: top " + countA + " of " + result.meta.pagination.totalCount + " records";
|
|
863
|
-
}).catch((error) => {
|
|
864
|
-
this.isLoading = false;
|
|
865
|
-
this.logger.error(error.message);
|
|
866
|
-
});
|
|
867
|
-
}
|
|
868
|
-
filterSearchArray() {
|
|
869
|
-
if (_.isEmpty(this.resourceType)) {
|
|
870
|
-
this.autocompleteOptions = [];
|
|
871
|
-
this.resourceTypeError = !_.isEmpty(this.filterText);
|
|
872
|
-
return;
|
|
873
|
-
}
|
|
874
|
-
this.autocompleteOptions = [];
|
|
875
|
-
if (this.resourceType === 'service-policies' && this.all_service_policies_fetched) {
|
|
876
|
-
this.autocompleteOptions = this.servicePoliciesTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
877
|
-
}
|
|
878
|
-
else if (this.resourceType === 'service-policies' && !this.all_service_policies_fetched) {
|
|
879
|
-
this.searchObjectsUsingApi();
|
|
880
|
-
}
|
|
881
|
-
else if (this.resourceType === 'services' && this.all_services_fetched) {
|
|
882
|
-
this.autocompleteOptions = this.servicesTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
883
|
-
}
|
|
884
|
-
else if (this.resourceType === 'services' && !this.all_services_fetched) {
|
|
885
|
-
this.searchObjectsUsingApi();
|
|
886
|
-
}
|
|
887
|
-
else if (this.resourceType === 'identities' && this.all_identities_fetched) {
|
|
888
|
-
this.autocompleteOptions = this.identitiesTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
889
|
-
}
|
|
890
|
-
else if (this.resourceType === 'identities' && !this.all_identities_fetched) {
|
|
891
|
-
this.searchObjectsUsingApi();
|
|
892
|
-
}
|
|
893
|
-
else if (this.resourceType === 'edge-routers' && this.all_edgerouters_fetched) {
|
|
894
|
-
this.autocompleteOptions = this.edgeroutersTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
895
|
-
}
|
|
896
|
-
else if (this.resourceType === 'edge-routers' && !this.all_edgerouters_fetched) {
|
|
897
|
-
this.searchObjectsUsingApi();
|
|
898
|
-
}
|
|
899
|
-
else if (this.resourceType === 'edge-router-policies' && this.all_edge_router_policies_fetched) {
|
|
900
|
-
this.autocompleteOptions = this.erPoliciesTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
901
|
-
}
|
|
902
|
-
else if (this.resourceType === 'edge-router-policies' && !this.all_edge_router_policies_fetched) {
|
|
903
|
-
this.searchObjectsUsingApi();
|
|
904
|
-
}
|
|
905
|
-
else if (this.resourceType === 'service-edge-router-policies' && this.all_service_router_policies_fetched) {
|
|
906
|
-
this.autocompleteOptions = this.serviceEdgeRouterPolicyTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
907
|
-
}
|
|
908
|
-
else if (this.resourceType === 'service-edge-router-policies' && !this.all_service_router_policies_fetched) {
|
|
909
|
-
this.searchObjectsUsingApi();
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
zoomIn() {
|
|
913
|
-
}
|
|
914
|
-
zoomOut() {
|
|
915
|
-
}
|
|
916
|
-
clearSearchFilter() {
|
|
917
|
-
this.filterText = '';
|
|
918
|
-
this.resetAutoCompleteOptions();
|
|
919
|
-
this.resourceTypeError = false;
|
|
920
|
-
// this.filterSearchArray();
|
|
921
|
-
this.resetSearchNode();
|
|
922
|
-
this.collapse();
|
|
923
|
-
this.clearSearchLinkColors();
|
|
924
|
-
}
|
|
925
|
-
resetAutoCompleteOptions() {
|
|
926
|
-
this.searchCache = [];
|
|
927
|
-
this.filerResponseMessage = 'search filter..';
|
|
928
|
-
if (this.resourceType === 'service-policies' && this.all_service_policies_fetched) {
|
|
929
|
-
this.autocompleteOptions = this.servicePoliciesTreeNodes.filter((option) => this.filterText === '' || option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
930
|
-
}
|
|
931
|
-
else if (this.resourceType === 'service-policies' && !this.all_service_policies_fetched) {
|
|
932
|
-
this.autocompleteOptions = [];
|
|
933
|
-
}
|
|
934
|
-
else if (this.resourceType === 'services' && this.all_services_fetched) {
|
|
935
|
-
this.autocompleteOptions = this.servicesTreeNodes.filter((option) => this.filterText === '' || option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
936
|
-
}
|
|
937
|
-
else if (this.resourceType === 'services' && !this.all_services_fetched) {
|
|
938
|
-
this.autocompleteOptions = [];
|
|
939
|
-
}
|
|
940
|
-
else if (this.resourceType === 'identities' && this.all_identities_fetched) {
|
|
941
|
-
this.autocompleteOptions = this.identitiesTreeNodes.filter((option) => this.filterText === '' || option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
942
|
-
}
|
|
943
|
-
else if (this.resourceType === 'identities' && !this.all_identities_fetched) {
|
|
944
|
-
this.autocompleteOptions = [];
|
|
945
|
-
}
|
|
946
|
-
else if (this.resourceType === 'edge-routers' && this.all_edgerouters_fetched) {
|
|
947
|
-
this.autocompleteOptions = this.edgeroutersTreeNodes.filter((option) => this.filterText === '' || option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
948
|
-
}
|
|
949
|
-
else if (this.resourceType === 'edge-routers' && !this.all_edgerouters_fetched) {
|
|
950
|
-
this.autocompleteOptions = [];
|
|
951
|
-
}
|
|
952
|
-
else if (this.resourceType === 'edge-router-policies' && this.all_edge_router_policies_fetched) {
|
|
953
|
-
this.autocompleteOptions = this.erPoliciesTreeNodes.filter((option) => this.filterText === '' || option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
954
|
-
}
|
|
955
|
-
else if (this.resourceType === 'edge-router-policies' && !this.all_edge_router_policies_fetched) {
|
|
956
|
-
this.autocompleteOptions = [];
|
|
957
|
-
}
|
|
958
|
-
else if (this.resourceType === 'service-edge-router-policies' && this.all_service_router_policies_fetched) {
|
|
959
|
-
this.autocompleteOptions = this.serviceEdgeRouterPolicyTreeNodes.filter((option) => this.filterText === '' || option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
960
|
-
}
|
|
961
|
-
else if (this.resourceType === 'service-edge-router-policies' && !this.all_service_router_policies_fetched) {
|
|
962
|
-
this.autocompleteOptions = [];
|
|
963
|
-
}
|
|
964
|
-
}
|
|
965
|
-
clearSearchType() {
|
|
966
|
-
this.resourceType = '';
|
|
967
|
-
this.autocompleteOptions = [];
|
|
968
|
-
}
|
|
969
|
-
resetZoom() {
|
|
970
|
-
// const currentZoom = this.getZoomScale();
|
|
971
|
-
const transform = this.transform || _.cloneDeep(d3.zoomIdentity);
|
|
972
|
-
transform.k = 1;
|
|
973
|
-
this.svg.attr('transform', transform);
|
|
974
|
-
}
|
|
975
|
-
graphCollapse(d) {
|
|
976
|
-
if (d.data.rootNode === 'Yes') {
|
|
977
|
-
d.data.clickProcess = 'Not Yet';
|
|
978
|
-
d._children = null;
|
|
979
|
-
}
|
|
980
|
-
if (d.children) {
|
|
981
|
-
d._children = d.children;
|
|
982
|
-
d._children && d._children?.find(nd => this.graphCollapse);
|
|
983
|
-
d.children = null;
|
|
984
|
-
}
|
|
985
|
-
}
|
|
986
|
-
initTopoView() {
|
|
987
|
-
this.autocompleteOptions = [];
|
|
988
|
-
const margin = { top: 20, right: 190, bottom: 30, left: 0 };
|
|
989
|
-
const width = window.innerWidth - margin.right;
|
|
990
|
-
const height = window.innerHeight - margin.bottom;
|
|
991
|
-
this.treetooltip = d3.select('#tooltip');
|
|
992
|
-
this.resourceTypeError = false;
|
|
993
|
-
this.filterText = '';
|
|
994
|
-
this.resourceType = '';
|
|
995
|
-
const handleZoom = (e) => {
|
|
996
|
-
this.svg.attr('transform', e.transform);
|
|
997
|
-
};
|
|
998
|
-
this.zoom = d3.zoom().on('zoom', handleZoom);
|
|
999
|
-
this.svg = d3
|
|
1000
|
-
.select('#NetworkVisualizerSVG')
|
|
1001
|
-
.attr('width', '100%')
|
|
1002
|
-
.attr('height', '100%')
|
|
1003
|
-
.call(this.zoom)
|
|
1004
|
-
.attr('viewBox', '-20 -450 ' + (width - margin.top * 2 - margin.bottom) + ' ' + +(height * 2 - margin.bottom))
|
|
1005
|
-
.append('g')
|
|
1006
|
-
.attr('transform', 'translate(' + -20 + ',' + 200 + ')');
|
|
1007
|
-
d3.select('body').on('click', function () {
|
|
1008
|
-
d3.select('#topocontextmenu').style('display', 'none');
|
|
1009
|
-
});
|
|
1010
|
-
d3.selectAll('g > *').remove();
|
|
1011
|
-
this.treemap = d3.tree().nodeSize([85, 5]);
|
|
1012
|
-
this.networkGraph.x = 100; // height / 4;
|
|
1013
|
-
this.networkGraph.y = 100;
|
|
1014
|
-
this.networkGraph.children.forEach(collapse);
|
|
1015
|
-
// this.networkGraph.children.forEach( (nd:any) => this.graphCollapse(nd) );
|
|
1016
|
-
this.updateTree(this.networkGraph);
|
|
1017
|
-
_.delay(() => {
|
|
1018
|
-
this.transform = d3.zoomIdentity;
|
|
1019
|
-
this.transform.x = -200;
|
|
1020
|
-
this.transform.y = 205;
|
|
1021
|
-
this.transform.k = 1;
|
|
1022
|
-
this.svg.transition().duration(750).attr('transform', this.transform);
|
|
1023
|
-
}, 600);
|
|
1024
|
-
function collapse(d) {
|
|
1025
|
-
if (d.data.rootNode === 'Yes') {
|
|
1026
|
-
d.data.clickProcess = 'Not Yet';
|
|
1027
|
-
d._children = null;
|
|
1028
|
-
}
|
|
1029
|
-
if (d.children) {
|
|
1030
|
-
d._children = d.children;
|
|
1031
|
-
d._children.forEach(collapse);
|
|
1032
|
-
d.children = null;
|
|
1033
|
-
}
|
|
1034
|
-
}
|
|
1035
|
-
}
|
|
1036
|
-
updateTree(source, doReset = false) {
|
|
1037
|
-
if (doReset) {
|
|
1038
|
-
d3.selectAll('g > *').remove();
|
|
1039
|
-
}
|
|
1040
|
-
const duration = 750;
|
|
1041
|
-
try {
|
|
1042
|
-
this.treeData = this.treemap(this.networkGraph);
|
|
1043
|
-
this.nodes = this.treeData.descendants();
|
|
1044
|
-
this.links = this.treeData.descendants().slice(1);
|
|
1045
|
-
}
|
|
1046
|
-
catch (e) {
|
|
1047
|
-
this.logger.error('Error in building tree object: ' + e.message);
|
|
1048
|
-
}
|
|
1049
|
-
const svgDefs = this.svg.append('defs');
|
|
1050
|
-
const linearGradient = svgDefs.append('linearGradient').attr('id', 'NodeGradient');
|
|
1051
|
-
linearGradient.append('stop').attr('class', 'stop1').attr('offset', '0%');
|
|
1052
|
-
linearGradient.append('stop').attr('class', 'stop2').attr('offset', '50%');
|
|
1053
|
-
linearGradient.append('stop').attr('class', 'stop3').attr('offset', '100%');
|
|
1054
|
-
const linearGradient2 = svgDefs.append('linearGradient').attr('id', 'NodeHoverGradient');
|
|
1055
|
-
linearGradient2.append('stop').attr('class', 'stop1a').attr('offset', '0%');
|
|
1056
|
-
linearGradient2.append('stop').attr('class', 'stop2a').attr('offset', '50%');
|
|
1057
|
-
linearGradient2.append('stop').attr('class', 'stop3a').attr('offset', '100%');
|
|
1058
|
-
this.nodes.forEach(function (d) {
|
|
1059
|
-
d.y = d.depth * 400;
|
|
1060
|
-
});
|
|
1061
|
-
this.node = this.svg.selectAll('g.node').data(this.nodes, function (d) {
|
|
1062
|
-
return d.data.id;
|
|
1063
|
-
});
|
|
1064
|
-
this.nodeEnter = this.node
|
|
1065
|
-
.enter()
|
|
1066
|
-
.append('g')
|
|
1067
|
-
.attr('class', (d) => {
|
|
1068
|
-
let className = '';
|
|
1069
|
-
if (_.startsWith(d.data.name, 'Edge Routers') || _.includes(d.data.type, 'Edge Router')) {
|
|
1070
|
-
className = 'edge-router';
|
|
1071
|
-
}
|
|
1072
|
-
if (_.includes(d.data.name, 'Identities') || _.includes(d.data.name, 'Identity') || _.includes(d.data.name, 'Associated Identities') || _.includes(d.data.type, 'Identity') || _.includes(d.data.type, 'BrowZer Identity')) {
|
|
1073
|
-
className = 'endpoint';
|
|
1074
|
-
}
|
|
1075
|
-
if (_.startsWith(d.data.name, 'Services') || _.startsWith(d.data.type, 'Service')) {
|
|
1076
|
-
className = 'service';
|
|
1077
|
-
}
|
|
1078
|
-
if (_.startsWith(d.data.name, 'Bind-Services') || _.startsWith(d.data.name, 'Dial-Services')) {
|
|
1079
|
-
className = 'service';
|
|
1080
|
-
}
|
|
1081
|
-
if (_.startsWith(d.data.name, 'Bind-Policies') || _.startsWith(d.data.name, 'Dial-Policies') || _.startsWith(d.data.name, 'Bind Policy')) {
|
|
1082
|
-
className = 'service-policy';
|
|
1083
|
-
}
|
|
1084
|
-
if (_.includes(d.data.name, 'Service Policies') || _.includes(d.data.type, 'Service Policy')) {
|
|
1085
|
-
className = 'service-policy';
|
|
1086
|
-
}
|
|
1087
|
-
if (_.startsWith(d.data.name, 'Edge Router Policies') || _.startsWith(d.data.type, 'Edge Router Policy')) {
|
|
1088
|
-
className = 'edge-router-policy';
|
|
1089
|
-
}
|
|
1090
|
-
if (_.startsWith(d.data.name, 'Service Edge Router Policies') ||
|
|
1091
|
-
_.startsWith(d.data.type, 'Service Router Policy')) {
|
|
1092
|
-
className = 'service-edge-router-policy';
|
|
1093
|
-
}
|
|
1094
|
-
className = d._children ? 'node ' + className : 'node terminate ' + className;
|
|
1095
|
-
return className;
|
|
1096
|
-
})
|
|
1097
|
-
.attr('transform', function (d) {
|
|
1098
|
-
if (source && source.x) {
|
|
1099
|
-
return 'translate(' + source.y + ',' + source.x + ')';
|
|
1100
|
-
}
|
|
1101
|
-
else {
|
|
1102
|
-
return 'translate(' + d.y + ',' + d.x + ')';
|
|
1103
|
-
}
|
|
1104
|
-
});
|
|
1105
|
-
this.nodeEnter.on('contextmenu', (event, d) => {
|
|
1106
|
-
event.preventDefault();
|
|
1107
|
-
d3.select('#tooltip').style('display', 'none');
|
|
1108
|
-
const nw = this.currentNetwork;
|
|
1109
|
-
const rawEdgerouters = this.edgerouters;
|
|
1110
|
-
const rawEndpoints = this.identities;
|
|
1111
|
-
const rawAppwans = this.service_policies;
|
|
1112
|
-
const edgeRouterPolicies = this.edge_router_policies;
|
|
1113
|
-
if (d && d.data && d.data.contextMenu === 'Yes') {
|
|
1114
|
-
d3.select('#topocontextmenu')
|
|
1115
|
-
.style('position', 'absolute')
|
|
1116
|
-
.style('left', event.offsetX + 'px')
|
|
1117
|
-
.style('top', event.offsetY + 'px')
|
|
1118
|
-
.style('display', 'block');
|
|
1119
|
-
}
|
|
1120
|
-
else {
|
|
1121
|
-
return;
|
|
1122
|
-
}
|
|
1123
|
-
let obj = null;
|
|
1124
|
-
if (d && d.data && (d.data.type === 'Identity' || d.data.type === 'BrowZer Identity')) {
|
|
1125
|
-
if (d.data.status === "Registered") {
|
|
1126
|
-
enableLi('#liSingleUT');
|
|
1127
|
-
enableLi('#liFLSingleRouter');
|
|
1128
|
-
enableLi('#liSingleLT');
|
|
1129
|
-
}
|
|
1130
|
-
else {
|
|
1131
|
-
disableLi('#liSingleUT');
|
|
1132
|
-
disableLi('#liFLSingleRouter');
|
|
1133
|
-
disableLi('#liSingleLT');
|
|
1134
|
-
}
|
|
1135
|
-
enableLi('#liMet');
|
|
1136
|
-
enableLi('#liVC');
|
|
1137
|
-
enableLi('#liEV');
|
|
1138
|
-
disableLi('#liIns');
|
|
1139
|
-
disableLi('#liAL');
|
|
1140
|
-
disableLi('#liEPs');
|
|
1141
|
-
disableLi('#liFLAll');
|
|
1142
|
-
disableLi('#liFLSingleRouter');
|
|
1143
|
-
disableLi('#liSingleLT');
|
|
1144
|
-
disableLi('#liCL');
|
|
1145
|
-
disableLi('#liLT');
|
|
1146
|
-
this.contextmenuNodeType = 'identity';
|
|
1147
|
-
}
|
|
1148
|
-
else if (d && d.data && d.data.type === 'Edge Router') {
|
|
1149
|
-
if (d.data.status === "PROVISIONED") {
|
|
1150
|
-
enableLi('#liSingleUT');
|
|
1151
|
-
enableLi('#liFLSingleRouter');
|
|
1152
|
-
enableLi('#liSingleLT');
|
|
1153
|
-
}
|
|
1154
|
-
else {
|
|
1155
|
-
disableLi('#liSingleUT');
|
|
1156
|
-
disableLi('#liFLSingleRouter');
|
|
1157
|
-
disableLi('#liSingleLT');
|
|
1158
|
-
}
|
|
1159
|
-
enableLi('#liMet');
|
|
1160
|
-
enableLi('#liVC');
|
|
1161
|
-
disableLi('#liIns');
|
|
1162
|
-
disableLi('#liEV');
|
|
1163
|
-
enableLi('#liAL');
|
|
1164
|
-
disableLi('#liEPs');
|
|
1165
|
-
disableLi('#liFLAll');
|
|
1166
|
-
disableLi('#liCL');
|
|
1167
|
-
disableLi('#liLT');
|
|
1168
|
-
this.contextmenuNodeType = 'edge-router';
|
|
1169
|
-
}
|
|
1170
|
-
else if (d && d.data && d.data.type === 'Service') {
|
|
1171
|
-
enableLi('#liMet');
|
|
1172
|
-
enableLi('#liVC');
|
|
1173
|
-
disableLi('#liIns');
|
|
1174
|
-
disableLi('#liEV');
|
|
1175
|
-
disableLi('#liAL');
|
|
1176
|
-
enableLi('#liEPs');
|
|
1177
|
-
disableLi('#liFLAll');
|
|
1178
|
-
disableLi('#liFLSingleRouter');
|
|
1179
|
-
disableLi('#liSingleLT');
|
|
1180
|
-
disableLi('#liCL');
|
|
1181
|
-
disableLi('#liLT');
|
|
1182
|
-
enableLi('#liSingleUT');
|
|
1183
|
-
this.contextmenuNodeType = 'service';
|
|
1184
|
-
}
|
|
1185
|
-
else if (d && d.data && d.data.type === 'Service Policy') {
|
|
1186
|
-
disableLi('#liMet');
|
|
1187
|
-
enableLi('#liVC');
|
|
1188
|
-
disableLi('#liIns');
|
|
1189
|
-
disableLi('#liEV');
|
|
1190
|
-
disableLi('#liAL');
|
|
1191
|
-
disableLi('#liEPs');
|
|
1192
|
-
disableLi('#liFLAll');
|
|
1193
|
-
disableLi('#liFLSingleRouter');
|
|
1194
|
-
disableLi('#liSingleLT');
|
|
1195
|
-
disableLi('#liCL');
|
|
1196
|
-
disableLi('#liLT');
|
|
1197
|
-
disableLi('#liSingleUT');
|
|
1198
|
-
this.contextmenuNodeType = 'service-policy';
|
|
1199
|
-
}
|
|
1200
|
-
else if (d && d.data && d.data.type === 'Edge Router Policy') {
|
|
1201
|
-
disableLi('#liMet');
|
|
1202
|
-
disableLi('#liIns');
|
|
1203
|
-
enableLi('#liVC');
|
|
1204
|
-
disableLi('#liEV');
|
|
1205
|
-
disableLi('#liAL');
|
|
1206
|
-
disableLi('#liEPs');
|
|
1207
|
-
disableLi('#liFLSingleRouter');
|
|
1208
|
-
disableLi('#liSingleLT');
|
|
1209
|
-
disableLi('#liFLAll');
|
|
1210
|
-
disableLi('#liCL');
|
|
1211
|
-
disableLi('#liLT');
|
|
1212
|
-
disableLi('#liSingleUT');
|
|
1213
|
-
this.contextmenuNodeType = 'router-policy';
|
|
1214
|
-
}
|
|
1215
|
-
else if (d && d.data && d.data.type === 'Network') {
|
|
1216
|
-
enableLi('#liMet');
|
|
1217
|
-
disableLi('#liIns');
|
|
1218
|
-
enableLi('#liVC');
|
|
1219
|
-
disableLi('#liEV');
|
|
1220
|
-
enableLi('#liAL');
|
|
1221
|
-
disableLi('#liEPs');
|
|
1222
|
-
enableLi('#liFLAll');
|
|
1223
|
-
disableLi('#liFLSingleRouter');
|
|
1224
|
-
disableLi('#liSingleLT');
|
|
1225
|
-
enableLi('#liCL');
|
|
1226
|
-
enableLi('#liLT');
|
|
1227
|
-
disableLi('#liSingleUT');
|
|
1228
|
-
this.contextmenuNodeType = 'network';
|
|
1229
|
-
obj = nw;
|
|
1230
|
-
}
|
|
1231
|
-
else if (d && d.data && d.data.type === 'Service Router Policy') {
|
|
1232
|
-
disableLi('#liMet');
|
|
1233
|
-
disableLi('#liIns');
|
|
1234
|
-
enableLi('#liVC');
|
|
1235
|
-
disableLi('#liEV');
|
|
1236
|
-
disableLi('#liAL');
|
|
1237
|
-
disableLi('#liEPs');
|
|
1238
|
-
disableLi('#liFLAll');
|
|
1239
|
-
disableLi('#liFLSingleRouter');
|
|
1240
|
-
disableLi('#liSingleLT');
|
|
1241
|
-
disableLi('#liCL');
|
|
1242
|
-
disableLi('#liLT');
|
|
1243
|
-
disableLi('#liSingleUT');
|
|
1244
|
-
this.contextmenuNodeType = 'service-router-policy';
|
|
1245
|
-
}
|
|
1246
|
-
this.contextmenuNode = obj;
|
|
1247
|
-
d3.select('#tooltip').style('display', 'none');
|
|
1248
|
-
});
|
|
1249
|
-
this.circles = this.nodeEnter
|
|
1250
|
-
.append('circle')
|
|
1251
|
-
.attr('class', 'node')
|
|
1252
|
-
.attr('r', 10)
|
|
1253
|
-
.style('fill', function (d) {
|
|
1254
|
-
return d._children ? 'var(--tableText)' : '#fff';
|
|
1255
|
-
})
|
|
1256
|
-
.on('mousemove', (event, d) => {
|
|
1257
|
-
this.drawTreeTooltip(event, d);
|
|
1258
|
-
})
|
|
1259
|
-
.on('mouseout', this.removeTreeTooltip)
|
|
1260
|
-
.on('contextmenu', (event) => {
|
|
1261
|
-
event.preventDefault();
|
|
1262
|
-
})
|
|
1263
|
-
.on('click', async (event, d) => {
|
|
1264
|
-
if (d.data.rootNode && d.data.rootNode === 'Yes' && d.data.clickProcess === 'Not Yet') {
|
|
1265
|
-
d3.select(event.currentTarget).transition()
|
|
1266
|
-
.duration(400)
|
|
1267
|
-
.style("1stroke-width", "10")
|
|
1268
|
-
.transition()
|
|
1269
|
-
.duration(1600)
|
|
1270
|
-
.style("stroke-width", "6")
|
|
1271
|
-
.transition()
|
|
1272
|
-
.duration(600)
|
|
1273
|
-
.style("stroke-width", "3")
|
|
1274
|
-
.transition()
|
|
1275
|
-
.duration(1600)
|
|
1276
|
-
.style("stroke-width", "6")
|
|
1277
|
-
.transition()
|
|
1278
|
-
.duration(600)
|
|
1279
|
-
.style("stroke-width", "9")
|
|
1280
|
-
.transition()
|
|
1281
|
-
.duration(1000)
|
|
1282
|
-
.style("stroke-width", "12");
|
|
1283
|
-
}
|
|
1284
|
-
if (d && d.data && d.data.contextMenu === 'Yes') {
|
|
1285
|
-
d3.select('#topocontextmenu').style('display', 'none');
|
|
1286
|
-
}
|
|
1287
|
-
d3.select('#tooltip').style('display', 'none');
|
|
1288
|
-
if (d.children && d.children.length > 0) {
|
|
1289
|
-
const index = this.openNodes.indexOf(d.data.id, 0);
|
|
1290
|
-
if (index > -1) {
|
|
1291
|
-
this.openNodes.splice(index, 1);
|
|
1292
|
-
}
|
|
1293
|
-
d._children = d.children;
|
|
1294
|
-
d.children = null;
|
|
1295
|
-
}
|
|
1296
|
-
else {
|
|
1297
|
-
if (this.openNodes.indexOf(d.data.id) < 0) {
|
|
1298
|
-
this.openNodes.push(d.data.id);
|
|
1299
|
-
}
|
|
1300
|
-
if (d.data.clickProcess === 'Not Yet') {
|
|
1301
|
-
let transitionLoop = true;
|
|
1302
|
-
d._children = null;
|
|
1303
|
-
if (d.data &&
|
|
1304
|
-
d.data.rootNode &&
|
|
1305
|
-
d.data.rootNode === 'Yes' &&
|
|
1306
|
-
(d.data.type === 'Identity' ||
|
|
1307
|
-
d.data.type === 'BrowZer Identity') &&
|
|
1308
|
-
!d.children &&
|
|
1309
|
-
!d._children) {
|
|
1310
|
-
d.data.clickProcess = 'Completed';
|
|
1311
|
-
const arr = await this.treeNodeProcessor.processIdentitiesForNodeClick(d, this.networkGraph, this.identities, this.uniqId, this.zitiService, this.configs);
|
|
1312
|
-
this.uniqId = arr[1];
|
|
1313
|
-
this.networkGraph = arr[0];
|
|
1314
|
-
this.networkGraph.children.find((nd) => {
|
|
1315
|
-
collapseFew(nd, this.openNodes);
|
|
1316
|
-
});
|
|
1317
|
-
this.updateTree(d);
|
|
1318
|
-
}
|
|
1319
|
-
else if (d.data &&
|
|
1320
|
-
d.data.rootNode &&
|
|
1321
|
-
d.data.rootNode === 'Yes' &&
|
|
1322
|
-
d.data.type === 'Service' &&
|
|
1323
|
-
!d.children &&
|
|
1324
|
-
!d._children) {
|
|
1325
|
-
d.data.clickProcess = 'Completed';
|
|
1326
|
-
const arr = await this.treeNodeProcessor.processServicesForNodeClick(d, this.networkGraph, this.services, this.uniqId, this.zitiService);
|
|
1327
|
-
this.uniqId = arr[1];
|
|
1328
|
-
this.networkGraph = arr[0];
|
|
1329
|
-
this.networkGraph.children.find((nd) => {
|
|
1330
|
-
collapseFew(nd, this.openNodes);
|
|
1331
|
-
});
|
|
1332
|
-
this.updateTree(d);
|
|
1333
|
-
}
|
|
1334
|
-
else if (d.data &&
|
|
1335
|
-
d.data.rootNode &&
|
|
1336
|
-
d.data.rootNode === 'Yes' &&
|
|
1337
|
-
d.data.type === 'Service Policy' &&
|
|
1338
|
-
!d.children &&
|
|
1339
|
-
!d._children) {
|
|
1340
|
-
d.data.clickProcess = 'Completed';
|
|
1341
|
-
const arr = await this.treeNodeProcessor.processServicePoliciesForNodeClick(d, this.networkGraph, this.service_policies, this.uniqId, this.zitiService);
|
|
1342
|
-
this.uniqId = arr[1];
|
|
1343
|
-
this.networkGraph = arr[0];
|
|
1344
|
-
this.networkGraph.children.find((nd) => {
|
|
1345
|
-
collapseFew(nd, this.openNodes);
|
|
1346
|
-
});
|
|
1347
|
-
this.updateTree(d);
|
|
1348
|
-
}
|
|
1349
|
-
else if (d.data &&
|
|
1350
|
-
d.data.rootNode &&
|
|
1351
|
-
d.data.rootNode === 'Yes' &&
|
|
1352
|
-
d.data.type === 'Edge Router' &&
|
|
1353
|
-
!d.children &&
|
|
1354
|
-
!d._children) {
|
|
1355
|
-
d.data.clickProcess = 'Completed';
|
|
1356
|
-
const arr = await this.treeNodeProcessor.processEdgeroutersForNodeClick(d, this.networkGraph, this.edgerouters, this.uniqId, this.zitiService);
|
|
1357
|
-
this.uniqId = arr[1];
|
|
1358
|
-
this.networkGraph = arr[0];
|
|
1359
|
-
this.networkGraph.children.find((nd) => {
|
|
1360
|
-
collapseFew(nd, this.openNodes);
|
|
1361
|
-
});
|
|
1362
|
-
this.updateTree(d);
|
|
1363
|
-
}
|
|
1364
|
-
else if (d.data &&
|
|
1365
|
-
d.data.rootNode &&
|
|
1366
|
-
d.data.rootNode === 'Yes' &&
|
|
1367
|
-
d.data.type === 'Edge Router Policy' &&
|
|
1368
|
-
!d.children &&
|
|
1369
|
-
!d._children) {
|
|
1370
|
-
d.data.clickProcess = 'Completed';
|
|
1371
|
-
const arr = await this.treeNodeProcessor.processEdgeRouterPoliciesForNodeClick(d, this.networkGraph, this.edge_router_policies, this.uniqId, this.zitiService);
|
|
1372
|
-
this.uniqId = arr[1];
|
|
1373
|
-
this.networkGraph = arr[0];
|
|
1374
|
-
this.networkGraph.children.find((nd) => {
|
|
1375
|
-
collapseFew(nd, this.openNodes);
|
|
1376
|
-
});
|
|
1377
|
-
this.updateTree(d);
|
|
1378
|
-
}
|
|
1379
|
-
else if (d.data &&
|
|
1380
|
-
d.data.rootNode &&
|
|
1381
|
-
d.data.rootNode === 'Yes' &&
|
|
1382
|
-
d.data.type === 'Service Router Policy' &&
|
|
1383
|
-
!d.children &&
|
|
1384
|
-
!d._children) {
|
|
1385
|
-
d.data.clickProcess = 'Completed';
|
|
1386
|
-
const arr = await this.treeNodeProcessor.processServiceEdgeRouterPoliciesForNodeClick(d, this.networkGraph, this.service_router_policies, this.uniqId, this.zitiService);
|
|
1387
|
-
this.uniqId = arr[1];
|
|
1388
|
-
this.networkGraph = arr[0];
|
|
1389
|
-
this.networkGraph.children.find((nd) => {
|
|
1390
|
-
collapseFew(nd, this.openNodes);
|
|
1391
|
-
});
|
|
1392
|
-
this.updateTree(d);
|
|
1393
|
-
}
|
|
1394
|
-
else {
|
|
1395
|
-
d.children = d._children;
|
|
1396
|
-
}
|
|
1397
|
-
}
|
|
1398
|
-
else {
|
|
1399
|
-
d.children = d._children;
|
|
1400
|
-
}
|
|
1401
|
-
if (d._children) {
|
|
1402
|
-
d._children = null;
|
|
1403
|
-
}
|
|
1404
|
-
}
|
|
1405
|
-
if (d.children || d._children) {
|
|
1406
|
-
this.updateTree(d);
|
|
1407
|
-
}
|
|
1408
|
-
const rootNode = _.get(d, 'data.children[0].rootNode', '');
|
|
1409
|
-
const subrootNode = _.get(d, 'data.rootNode', '');
|
|
1410
|
-
if (rootNode === 'Yes' || subrootNode === 'Yes') {
|
|
1411
|
-
rootNodeisYesColorChange();
|
|
1412
|
-
}
|
|
1413
|
-
});
|
|
1414
|
-
this.nodeEnter
|
|
1415
|
-
.append('foreignObject')
|
|
1416
|
-
.attr('height', '50')
|
|
1417
|
-
.attr('width', function (d) {
|
|
1418
|
-
return d && d.data && d.data.name.length >= 20 ? '550' : '330';
|
|
1419
|
-
})
|
|
1420
|
-
.attr('x', '20')
|
|
1421
|
-
.attr('y', function (d) {
|
|
1422
|
-
return d && d.data && d.data.rootNode === 'Yes' ? '-5' : '-40';
|
|
1423
|
-
})
|
|
1424
|
-
.append('xhtml:body')
|
|
1425
|
-
.style('background', 'transparent')
|
|
1426
|
-
.html(function (d) {
|
|
1427
|
-
return `<div class="node-text-container"><span>${d.data.name}</span></div>`;
|
|
1428
|
-
});
|
|
1429
|
-
this.nodeUpdate = this.nodeEnter.merge(this.node);
|
|
1430
|
-
this.nodeUpdate
|
|
1431
|
-
.transition()
|
|
1432
|
-
.duration(duration)
|
|
1433
|
-
.attr('transform', function (d) {
|
|
1434
|
-
return 'translate(' + d.y + ',' + d.x + ')';
|
|
1435
|
-
});
|
|
1436
|
-
this.nodeUpdate.select('circle.node').attr('r', 18).attr('cursor', 'pointer');
|
|
1437
|
-
this.nodeExit = this.node
|
|
1438
|
-
.exit()
|
|
1439
|
-
.transition()
|
|
1440
|
-
.duration(duration)
|
|
1441
|
-
.attr('transform', function (d) {
|
|
1442
|
-
if (source && source.x) {
|
|
1443
|
-
return 'translate(' + source.y + ',' + source.x + ')';
|
|
1444
|
-
}
|
|
1445
|
-
else {
|
|
1446
|
-
return 'translate(' + d.y + ',' + d.x + ')';
|
|
1447
|
-
}
|
|
1448
|
-
})
|
|
1449
|
-
.remove();
|
|
1450
|
-
this.nodeExit.select('circle').attr('r', 0);
|
|
1451
|
-
this.nodeExit.select('text').style('fill-opacity', 10);
|
|
1452
|
-
this.link = this.svg.selectAll('path.link').data(this.links, function (d) {
|
|
1453
|
-
return d.data.id;
|
|
1454
|
-
});
|
|
1455
|
-
this.linkUpdate = this.link
|
|
1456
|
-
.enter()
|
|
1457
|
-
.insert('path', 'g')
|
|
1458
|
-
.attr('class', 'link')
|
|
1459
|
-
.attr('d', function (d) {
|
|
1460
|
-
let o;
|
|
1461
|
-
if (source && source.x) {
|
|
1462
|
-
o = { x: source.x, y: source.y };
|
|
1463
|
-
}
|
|
1464
|
-
else {
|
|
1465
|
-
o = { x: d.x, y: d.y };
|
|
1466
|
-
}
|
|
1467
|
-
return diagonal(o, o, '1');
|
|
1468
|
-
})
|
|
1469
|
-
.merge(this.link);
|
|
1470
|
-
this.linkUpdate
|
|
1471
|
-
.transition()
|
|
1472
|
-
.duration(duration)
|
|
1473
|
-
.attr('d', function (d) {
|
|
1474
|
-
return diagonal(d, d.parent, '2');
|
|
1475
|
-
});
|
|
1476
|
-
this.linkExit = this.link
|
|
1477
|
-
.exit()
|
|
1478
|
-
.transition()
|
|
1479
|
-
.duration(duration)
|
|
1480
|
-
.attr('d', function (d) {
|
|
1481
|
-
let o;
|
|
1482
|
-
if (source && source.x) {
|
|
1483
|
-
o = { x: source.x, y: source.y };
|
|
1484
|
-
}
|
|
1485
|
-
else {
|
|
1486
|
-
o = { x: d.x, y: d.y };
|
|
1487
|
-
}
|
|
1488
|
-
return diagonal(o, o, '3');
|
|
1489
|
-
})
|
|
1490
|
-
.remove();
|
|
1491
|
-
this.nodes.forEach(function (d) {
|
|
1492
|
-
d.x0 = d.x;
|
|
1493
|
-
d.y0 = d.y;
|
|
1494
|
-
});
|
|
1495
|
-
function disableLi(liId) {
|
|
1496
|
-
d3.select(liId).style('display', 'none');
|
|
1497
|
-
}
|
|
1498
|
-
function enableLi(liId) {
|
|
1499
|
-
d3.select(liId).style('display', 'block');
|
|
1500
|
-
}
|
|
1501
|
-
function diagonal(s, d, lg) {
|
|
1502
|
-
const path = `M ${s.y} ${s.x}
|
|
1503
|
-
C ${(s.y + d.y) / 2} ${s.x},
|
|
1504
|
-
${(s.y + d.y) / 2} ${d.x},
|
|
1505
|
-
${d.y} ${d.x}`;
|
|
1506
|
-
return path;
|
|
1507
|
-
}
|
|
1508
|
-
function rootNodeisYesColorChange() {
|
|
1509
|
-
d3.selectAll('circle').each(function (d) {
|
|
1510
|
-
const rootNode = _.get(d, 'data.rootNode', '');
|
|
1511
|
-
const clickProcess = _.get(d, 'data.clickProcess', '');
|
|
1512
|
-
if (rootNode === 'Yes' && clickProcess === 'Not Yet') {
|
|
1513
|
-
d3.select(this).style('fill', 'brown');
|
|
1514
|
-
}
|
|
1515
|
-
else if (rootNode === 'Yes' && clickProcess !== 'Not Yet') {
|
|
1516
|
-
const color = d._children ? 'var(--tableText)' : '#fff';
|
|
1517
|
-
d3.select(this).style('fill', color);
|
|
1518
|
-
}
|
|
1519
|
-
});
|
|
1520
|
-
}
|
|
1521
|
-
function collapseFew(_nd, openNodes) {
|
|
1522
|
-
if (_nd.data.id === '#all') {
|
|
1523
|
-
return;
|
|
1524
|
-
}
|
|
1525
|
-
if (_nd.data.rootNode === 'Yes' && _nd.data.clickProcess === 'Not Yet') {
|
|
1526
|
-
_nd._children = [];
|
|
1527
|
-
}
|
|
1528
|
-
if (_nd.children && openNodes.indexOf(_nd.data.id) < 0) {
|
|
1529
|
-
_nd._children = _nd.children;
|
|
1530
|
-
if (_nd._children)
|
|
1531
|
-
_nd._children.find((_nd) => {
|
|
1532
|
-
collapseFew(_nd, openNodes);
|
|
1533
|
-
});
|
|
1534
|
-
_nd.children = null;
|
|
1535
|
-
}
|
|
1536
|
-
if (_nd.children && openNodes.indexOf(_nd.data.id) >= 0) {
|
|
1537
|
-
if (_nd.children)
|
|
1538
|
-
_nd.children.find((_nd) => {
|
|
1539
|
-
collapseFew(_nd, openNodes);
|
|
1540
|
-
});
|
|
1541
|
-
}
|
|
1542
|
-
}
|
|
1543
|
-
if (source.children === null) {
|
|
1544
|
-
_.delay(this.sizeToFit.bind(this), 650);
|
|
1545
|
-
}
|
|
1546
|
-
} // end of updateTree
|
|
1547
|
-
sizeToFit() {
|
|
1548
|
-
const boundingBox = this.svg._groups[0][0].getBoundingClientRect();
|
|
1549
|
-
const bottomDelta = boundingBox.height - 100 - -boundingBox.top;
|
|
1550
|
-
const topDelta = boundingBox.height + 500 - boundingBox.bottom;
|
|
1551
|
-
const topOutOfView = topDelta < 0;
|
|
1552
|
-
const bottomOutOfView = bottomDelta < 0;
|
|
1553
|
-
if (bottomOutOfView || topOutOfView) {
|
|
1554
|
-
const trans = this.transform;
|
|
1555
|
-
trans.y = topOutOfView ? 400 : 0;
|
|
1556
|
-
this.svg.transition().duration(750).attr('transform', trans);
|
|
1557
|
-
}
|
|
1558
|
-
}
|
|
1559
|
-
setColor(d) {
|
|
1560
|
-
if (d.status === 'Error' && d.group === 3) {
|
|
1561
|
-
return 'red';
|
|
1562
|
-
}
|
|
1563
|
-
else if (d.status !== 'Error' && d.group === 3) {
|
|
1564
|
-
return 'var(--tableText)';
|
|
1565
|
-
}
|
|
1566
|
-
else {
|
|
1567
|
-
return 'var(--tableText)';
|
|
1568
|
-
}
|
|
1569
|
-
}
|
|
1570
|
-
ticked() {
|
|
1571
|
-
this.links
|
|
1572
|
-
.attr('x1', function (d) {
|
|
1573
|
-
return d.source.x;
|
|
1574
|
-
})
|
|
1575
|
-
.attr('y1', function (d) {
|
|
1576
|
-
return d.source.y;
|
|
1577
|
-
})
|
|
1578
|
-
.attr('x2', function (d) {
|
|
1579
|
-
return d.target.x;
|
|
1580
|
-
})
|
|
1581
|
-
.attr('y2', function (d) {
|
|
1582
|
-
return d.target.y;
|
|
1583
|
-
});
|
|
1584
|
-
this.nodes.attr('transform', function (d) {
|
|
1585
|
-
return 'translate(' + d.x + ',' + d.y + ')';
|
|
1586
|
-
});
|
|
1587
|
-
}
|
|
1588
|
-
isAnObject(o) {
|
|
1589
|
-
return o instanceof Object && o.constructor === Object;
|
|
1590
|
-
}
|
|
1591
|
-
readObjectValues(linkObject) {
|
|
1592
|
-
let info = '<span style="font-size:12px;font-family: sans-serif">';
|
|
1593
|
-
const keys = Object.keys(linkObject.data);
|
|
1594
|
-
keys.forEach((k) => {
|
|
1595
|
-
if (this.isAnObject(linkObject.data[k])) {
|
|
1596
|
-
const kVal = linkObject.data[k];
|
|
1597
|
-
info = info + ' ' + k + ' : ' + kVal.id + '<br>';
|
|
1598
|
-
}
|
|
1599
|
-
else {
|
|
1600
|
-
info = info + ' ' + k + ' : ' + linkObject.data[k] + '<br>';
|
|
1601
|
-
}
|
|
1602
|
-
});
|
|
1603
|
-
return info + '</span>';
|
|
1604
|
-
}
|
|
1605
|
-
nodeColor(d) {
|
|
1606
|
-
if (d.status === 'Error') {
|
|
1607
|
-
return '#FF0000';
|
|
1608
|
-
}
|
|
1609
|
-
else {
|
|
1610
|
-
return 'blue';
|
|
1611
|
-
}
|
|
1612
|
-
}
|
|
1613
|
-
dragstarted(event, d) {
|
|
1614
|
-
if (!event.active) {
|
|
1615
|
-
this.simulation.alphaTarget(0.3).restart();
|
|
1616
|
-
}
|
|
1617
|
-
d.fx = d.x;
|
|
1618
|
-
d.fy = d.y;
|
|
1619
|
-
}
|
|
1620
|
-
dragged(d) {
|
|
1621
|
-
d.fx = d.x;
|
|
1622
|
-
d.fy = d.y;
|
|
1623
|
-
}
|
|
1624
|
-
dragended(event, d) {
|
|
1625
|
-
if (!event.active) {
|
|
1626
|
-
this.simulation.alphaTarget(0);
|
|
1627
|
-
}
|
|
1628
|
-
d.fx = null;
|
|
1629
|
-
d.fy = null;
|
|
1630
|
-
}
|
|
1631
|
-
removeTreeTooltip() {
|
|
1632
|
-
this.treetooltip = d3.select('#tooltip');
|
|
1633
|
-
if (this.treetooltip) {
|
|
1634
|
-
this.treetooltip.style('display', 'none');
|
|
1635
|
-
}
|
|
1636
|
-
}
|
|
1637
|
-
drawTreeTooltip(event, s) {
|
|
1638
|
-
this.treetooltip = d3.select('#tooltip');
|
|
1639
|
-
this.treetooltip.style('display', 'block');
|
|
1640
|
-
const x = event.pageX + 'px';
|
|
1641
|
-
const y = event.pageY + 15 + 'px';
|
|
1642
|
-
this.treetooltip.style('left', x);
|
|
1643
|
-
this.treetooltip.style('top', y);
|
|
1644
|
-
document.getElementById('tooltip').innerHTML = this.readTreeKeyValues(event, s);
|
|
1645
|
-
}
|
|
1646
|
-
readTreeKeyValues(event, d) {
|
|
1647
|
-
const startIndex = d.data.name.indexOf('(');
|
|
1648
|
-
const finIndex = d.data.name.indexOf(')');
|
|
1649
|
-
const countStr = startIndex > 0 ? d.data.name.substring(startIndex + 1, finIndex) : 0;
|
|
1650
|
-
let info = `<div class='tool-tip-container'>`;
|
|
1651
|
-
const keys = Object.keys(d.data); // mp.keys();
|
|
1652
|
-
keys.forEach(function (k) {
|
|
1653
|
-
if (k === 'firstChild' ||
|
|
1654
|
-
k === 'protocol' ||
|
|
1655
|
-
k === 'contextMenu' ||
|
|
1656
|
-
k === 'uuid' ||
|
|
1657
|
-
k === 'lastId' ||
|
|
1658
|
-
k === 'clickProcess' ||
|
|
1659
|
-
k === 'rootNode' ||
|
|
1660
|
-
k === 'id' ||
|
|
1661
|
-
k === 'children' ||
|
|
1662
|
-
k === 'parent' ||
|
|
1663
|
-
k === 'depth' ||
|
|
1664
|
-
k === 'x' ||
|
|
1665
|
-
k === 'y' ||
|
|
1666
|
-
k === 'rootNode' ||
|
|
1667
|
-
k === 'x0' ||
|
|
1668
|
-
k === 'y0') {
|
|
1669
|
-
// continue;
|
|
1670
|
-
}
|
|
1671
|
-
else if (d[k] instanceof Array) {
|
|
1672
|
-
info =
|
|
1673
|
-
info +
|
|
1674
|
-
'<div class="prop-row"><div class="prop-name">' +
|
|
1675
|
-
k +
|
|
1676
|
-
':</div><div class="prop-val">' +
|
|
1677
|
-
d[k].join('<br> ') +
|
|
1678
|
-
'</div></div>';
|
|
1679
|
-
}
|
|
1680
|
-
else {
|
|
1681
|
-
const propVal = d.data[k] || '';
|
|
1682
|
-
info = info + '<div class="prop-row"><div class="prop-name">' + k + ':</div><div class="prop-val">' + propVal + '</div></div>';
|
|
1683
|
-
}
|
|
1684
|
-
});
|
|
1685
|
-
if (d.data.firstChild && d.data.firstChild === 'Yes' && countStr > this.maxObjectsPerNode - 1) {
|
|
1686
|
-
info = info + '<span class="tooltip-help-text">Note: expand node disabled. Use search filter.</span>';
|
|
1687
|
-
}
|
|
1688
|
-
else if (d.data.firstChild && d.data.firstChild === 'Yes' && countStr < this.maxObjectsPerNode) {
|
|
1689
|
-
info = info + '<span class="tooltip-help-text">Note: click to expand child nodes </span>';
|
|
1690
|
-
}
|
|
1691
|
-
return info + '</div>';
|
|
1692
|
-
}
|
|
1693
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NetworkVisualizerComponent, deps: [{ token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i1.HttpClient }, { token: i2.LoggerService }, { token: i3.TreeNodeProcessor }, { token: i4.NetworkVisualizerHelper }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1694
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NetworkVisualizerComponent, selector: "app-network-visualizer", usesInheritance: true, ngImport: i0, template: "<div class=\"ziti-page-container ziti-identities-container\">\n\n <div class=\"nf-network-topology-container\" >\n\n <div class=\"css-header\">{{title}} </div><br>\n\n <div class=\"nf-net-vis-controls-header\">\n <div class=\"nf-topology-zoom-container\">\n <!--button (click)=\"zoomOut()\" class=\"nf-topology-zoom-button minus\"></button>\n <button (click)=\"zoomIn()\" class=\"nf-topology-zoom-button plus\"></button-->\n <div (click)=\"resetTree('Yes')\" class=\"reset-button\" title=\"Reset\"></div>\n </div>\n <select\n (change)=\"resourceTypeChanged()\"\n [(ngModel)]=\"resourceType\"\n [ngClass]=\"{ 'resource-type-error': resourceTypeError }\"\n class=\"resource-type-select\"\n id=\"ResourceTypeSelect\"\n >\n <option value=\"\">Select Resource Type</option>\n <option value=\"service-policies\">Service Policies</option>\n <option value=\"services\">Services</option>\n <option value=\"identities\">Identities</option>\n <option value=\"edge-routers\">Edge Routers</option>\n <option value=\"edge-router-policies\">Edge Router Policies</option>\n <option value=\"service-edge-router-policies\">Service Edge Router Policies</option>\n </select>\n\n <div class=\"nf-net-vis-filter-container listBox row\">\n <input\n (keyup)=\"nwSearchChange($event)\"\n [(ngModel)]=\"filterText\"\n [matAutocomplete]=\"auto\"\n class=\"nf-topology-filter-input\"\n id=\"filterText\"\n matInput\n placeholder=\"Type to Filter\"\n />\n\n <div\n (click)=\"clearSearchFilter()\"\n *ngIf=\"filterText !== ''\"\n class=\"buttonBall close icon-close\"\n id=\"ClearSearchFilter\"\n ></div>\n\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"autocompleteSearch($event)\">\n <mat-option *ngFor=\"let option of autocompleteOptions\" [value]=\"option\">\n {{ option }}\n </mat-option>\n </mat-autocomplete>\n </div>\n </div>\n\n <div class=\"nf-topology-legend\">\n <div class=\"legend-item\">\n <div class=\"legend-circle servicepolicies\"></div>\n <div class=\"legend-text\">Service Policies</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle services\"></div>\n <div class=\"legend-text\">Services</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle endpoints\"></div>\n <div class=\"legend-text\">Identities</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle edgerouters\"></div>\n <div class=\"legend-text\">Edge Routers</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle erpolicies\"></div>\n <div class=\"legend-text\">Edge Router Policies</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle serviceerpolicies\"></div>\n <div class=\"legend-text\">Service Router Policies</div>\n </div>\n\n <div class=\"legend-item\">\n <div class=\"node-expand-help\"></div>\n <div class=\"legend-icon-text legend-associated-nodes\">View Associated Nodes</div>\n <div class=\"legend-icon-pointer\"></div>\n </div>\n </div>\n\n <div class=\"topotip\" id=\"tooltip\"></div>\n <svg style='pointer-events:all' id=\"NetworkVisualizerSVG\"></svg>\n <lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n </div>\n\n</div>\n", styles: [".ziti-page-container{height:100%;width:100%;left:0;display:flex;flex-direction:column;position:absolute;padding-top:.0625rem;padding-left:.1875rem;padding-right:.1875rem;top:0rem}.nf-network-topology-container{overflow:hidden;width:100%;height:100%;background-color:var(--background);z-index:1001;margin:auto;inset:0rem;padding-top:.0625rem;padding-left:.1875rem;padding-right:.1875rem;background:#ebefff;background-image:linear-gradient(#d1dcff .125rem,transparent 0),linear-gradient(90deg,#d1dcff .125rem,transparent 0),linear-gradient(#d1dcff .0625rem,transparent 0),linear-gradient(90deg,#d1dcff .0625rem,transparent 0);background-size:2.5rem 2.5rem,2.5rem 2.5rem,.625rem .625rem,.625rem .625rem}.css-header{height:3.125rem;font-size:1.5625rem;font-weight:600;margin:.5rem 0rem 0rem .625rem;font-family:Russo One;color:#0027ab;font-size:1.875rem;text-transform:uppercase;font-weight:400;background-color:transparent}.resource-type-select{width:16.875rem;flex-shrink:0;border-radius:1.6875rem;height:3.1875rem;margin-left:.3125rem;-webkit-backdrop-filter:saturate(110%) blur(.9375rem);backdrop-filter:saturate(110%) blur(.9375rem);background-color:#ffffff80!important;border-color:var(--navigation);box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);color:var(--tableText);padding-left:1.25rem}select{background-image:url(/assets/svgs/ArrowDown.svg);background-position:center right 1.125rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:2.375rem}.no-results-warning{left:27.5rem;font-size:.9375rem;color:var(--tableText);padding-left:1.25rem;padding-top:0rem;height:-moz-fit-content;height:fit-content;top:.0625rem}.resource-type-error{border-width:.1875rem;border-color:var(--red)!important}.nf-links{stroke:#fff;stroke-opacity:1.6}.nf-net-vis-controls-header{display:flex;flex-direction:row;position:absolute;z-index:99999;flex:1 0 auto;top:3.75rem}.nf-net-vis-filter-container{max-width:30.625rem;margin-top:0rem;margin-left:.625rem;flex:1 0 auto}.table-filter-container{max-width:18.75rem;margin-top:0rem;margin-left:.0625rem;flex:1 0 auto}#ClearSearchFilter{position:absolute;right:.9375rem;top:.3125rem;width:1.25rem;height:1.25rem;font-size:1.125rem;font-weight:600;color:var(--formBase);z-index:99999999}#ClearSearchFilter:hover{filter:brightness(90%)}#ClearSearchFilter:active{transform:translateY(.0625rem);filter:brightness(80%)}#popupTableTitle{width:100%;font-weight:900;display:inline-block;background-color:var(--navigation);box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);border:.125rem #d3d3d3!important;text-align:center;border:.125rem;border-color:#d3d3d3;height:1.5625rem;top:.125rem;color:#fff;padding-right:.3125rem;background:#000;cursor:move}#tra:hover{text-decoration:underline}#CloseDataTable{position:absolute;right:.3125rem;top:-2.0625rem;width:1.5625rem;height:1.5625rem;font-size:.9375rem;color:#fff;z-index:99999999}.copydatatable{width:8.4375rem;height:1.0625rem;font-size:10pt;font-family:tahoma;top:95%;right:0%;border-radius:.3125rem;background:#fff;border:0rem solid gray!important;position:absolute!important;text-transform:uppercase;cursor:pointer;z-index:999}.copydatatable:hover{text-decoration:underline}.nf-topology-filter-input{height:3.125rem;width:30.3125rem;border-radius:1.5625rem;border-color:var(--navigation);box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);padding-left:.625rem;padding-right:.9375rem}.nf-topology-select-container{max-width:25rem;margin-top:1.25rem;margin-left:1.25rem;flex:1 0 auto}.nf-topology-select-input{height:2.8125rem;border-radius:1.5625rem;border-color:var(--navigation);background-color:var(--navigation);box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);padding-left:1.25rem}input:focus,textarea:focus,select:focus{box-shadow:0 1.25rem 1.4375rem 0 var(--shadow)}@supports ((-webkit-backdrop-filter: saturate(110%) blur(.9375rem)) or (backdrop-filter: saturate(110%) blur(.9375rem))){.nf-topology-filter-input{background:var(--visualizerBackground)!important;-webkit-backdrop-filter:saturate(110%) blur(.3125rem);backdrop-filter:saturate(110%) blur(.9375rem)}}.nf-topology-zoom-container{display:flex;margin-left:.625rem;flex:1 0 auto}.nf-topology-zoom-button.minus{height:3.125rem;width:3.125rem;margin-right:.625rem;border-radius:3.4375rem;border:unset;font-size:2.5rem;font-family:icomoon!important;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--primaryColor);line-height:3.0625rem;background-color:var(--navigation);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);transition:background-color .5s;background-image:url(/assets/images/Icon_Minus.png);background-size:40%;background-color:var(--red);box-shadow:0 .375rem .625rem 0 var(--redShadow)}.nf-topology-zoom-label{padding-right:.625rem}.nf-topology-zoom-button{height:3.125rem;width:3.125rem;margin-right:.625rem;border-radius:3.4375rem;border:unset;font-size:2.5rem;font-family:icomoon!important;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--primaryColor);line-height:3.0625rem;background-color:var(--navigation);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);transition:background-color .5s}.nf-topology-zoom-button.plus:before{content:\"\\e937\"}.nf-topology-zoom-button.minus:before{content:\"\\e943\"}.nf-topology-zoom-button:hover{color:var(--white);background-color:var(--primaryColor);filter:brightness(90%);transition:background-color 1s;transition:.3s}.nf-topology-zoom-button:active{background-color:var(--icon);transform:scale(.97);transition:background-color 1s;transition:.3s}@supports ((-webkit-backdrop-filter: saturate(110%) blur(.9375rem)) or (backdrop-filter: saturate(110%) blur(.9375rem))){.nf-topology-zoom-button{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(.9375rem);backdrop-filter:saturate(110%) blur(.9375rem)}}.placeholder{display:flex;align-items:center;justify-content:center;height:50rem}.topotip{display:none;position:fixed;background:var(--navigation);border:0rem;border-radius:.75rem;pointer-events:none;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);transition:background-color .3s;font-size:.9375rem;font-weight:600;color:var(--tableText);z-index:2000;opacity:1;max-width:25rem;overflow:hidden}.nodes{cursor:pointer;box-shadow:0 1.875rem 2.6875rem 0 var(--shadow)}.nf-links{cursor:pointer}.linkWidth{color:#fff}.nf-network-topology-container .loader{margin-left:-9.375rem}.loader .bar1{background-color:var(--inputBorder)!important}.loader .bar2{background-color:var(--inputBorder)!important;animation-delay:-.7s}.loader .bar3{background-color:var(--inputBorder)!important;animation-delay:-.6s}.loader .bar4{background-color:var(--inputBorder)!important;animation-delay:-.5s}.loader .bar5{background-color:var(--inputBorder)!important;animation-delay:-.4s}.loader .bar6{background-color:var(--inputBorder)!important;animation-delay:-.3s}.changeView{display:flex;margin-top:2rem;margin-left:.625rem;flex:1 0 auto}.changeView .changeViewLabel{margin-top:.1875rem;margin-left:.3125rem}.node circle{fill:#fff;stroke:#07397d;stroke-width:.875rem;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow)}.node text{font:1.6875rem sans-serif;cursor:pointer}.node-text-container{color:var(--tableText);font-size:1.5rem;font-weight:600;margin-left:.125rem;margin-top:.25rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.link{fill:none;stroke:var(--table);stroke-width:.3125rem;color:#fff}.nf-topology-legend{width:14.375rem;border-radius:.75rem;margin-top:.625rem;margin-right:.625rem;position:absolute;top:0rem;right:0rem;background:#ffffff80!important;-webkit-backdrop-filter:saturate(110%) blur(.3125rem);backdrop-filter:saturate(110%) blur(.9375rem);border-color:var(--navigation);border-style:solid;border-width:var(--inputBorderWidth);display:inline-block;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);padding:.3125rem .3125rem .4375rem}@supports ((-webkit-backdrop-filter: saturate(110%) blur(.9375rem)) or (backdrop-filter: saturate(110%) blur(.9375rem))){.nf-topology-legend{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(.9375rem);backdrop-filter:saturate(110%) blur(.9375rem)}}.legend-item{width:100%;height:100%;display:inline-block;position:relative}.legend-itemA{width:100%;height:100%;margin-left:-.1875rem;display:inline-block}.legend-circle{height:.75rem;width:.75rem;border-radius:.9375rem;display:inline-block;margin-top:.4375rem}.legend-circle.servicepolicies{background-color:#ff0d49}.legend-circle.services{background-color:#08dc5a}.legend-circle.endpoints{background-color:#0273fb}.legend-circle.edgerouters{background-color:#ffc000}.legend-circle.erpolicies{background-color:#ff8400}.legend-circle.serviceerpolicies{background-color:#ff5900}.legend-text{display:inline-block;font-size:.9375rem;font-weight:600;color:var(--tableText);padding-left:.4375rem;padding-bottom:.25rem}.legend-icon-text{display:inline-block;font-size:.875rem;font-weight:600;color:var(--tableText);padding-left:1.375rem;padding-bottom:.25rem}.legend-icon-text.legend-associated-nodes{padding-left:1.25rem}.legend-icon-pointer{background-size:1rem 1rem;background-image:url(/assets/svgs/cursor-pointer.svg);position:absolute;z-index:999999;width:1.25rem;height:1.25rem;top:.625rem;left:.125rem}.reset-button{height:3.125rem;width:3.125rem;border-radius:3.125rem;margin-right:.625rem;background-size:contain;background-image:url(/assets/svgs/refresh.svg);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);transition:.3s}.node-expand-help{border-radius:1.25rem;border-width:.25rem;border-color:#08dc5a!important;border-style:solid;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);width:1rem;height:1rem;position:absolute;background-color:brown;margin-left:-.125rem;top:.125rem}.reset-button:hover{filter:brightness(90%);transform:scale(.97);transition:.3s}.reset-button:active{transform:scale(.9);transition:.3s}.sign_out_button{background-color:#2fa4e7;padding:1rem .625rem;color:#fff;float:left;text-decoration:none}.sign_out_button:hover{background-color:#1892d7}.sign_out_button a{color:#fff;text-decoration:none}.contextmenu_mouseout{fill:#f4f4f4;stroke:#fff;stroke-width:.0625rem}.contextmenu_mouseover{fill:#c8c8c8}.menu2{position:fixed;background:#fff;color:#000;cursor:pointer;border:.0625rem black solid}.contextmenu_text{position:fixed;padding:.125rem;background:var(--navigation);border:.0625rem;border-radius:.3125rem;pointer-events:none;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);transition:background-color .3s;padding:.3125rem;font-size:.625rem;font-weight:700;color:var(--tableText);z-index:2000;opacity:1;max-width:25rem}.contextmenu{z-index:2000;opacity:1;position:fixed;background:#fff;color:#000;font-family:sans-serif;font-size:.6875rem;box-shadow:.125rem .125rem .125rem #90908d;padding:.125rem;border-radius:.75rem;border:.0625rem solid #c6c6c6;max-width:25rem}.menuItems{display:block;color:#555;text-decoration:none;padding:.375rem .5rem .375rem 1.875rem;position:relative}.context-menu{display:none;position:absolute;z-index:10}.context-menu__items{list-style:none;margin:0;padding:0}.context-menu__item{display:block;margin-bottom:.25rem}.container{margin:0 auto;padding:0 1.5rem;max-width:60rem}.context-menu__link{display:block;padding:.25rem .75rem;color:#06a;text-decoration:none}.contextmenu_text:hover .divItemsHover{color:#fff;background-color:#06a}.context-menu--active{display:block}#topoDataTableHeader{float:left;min-width:15.625rem;width:auto;height:22.5rem;top:6.25rem;border-bottom-left-radius:.8125rem;border-bottom-right-radius:.8125rem;display:none;background:#fff;border:.125rem solid gray!important;position:absolute!important}.table-filter-input{height:1.875rem;width:100%;top:2.5rem;border-radius:.0625rem;border-color:#d3d3d3;background-color:#d3d3d3;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);padding-top:.1875rem;padding-left:.125rem;padding-right:.125rem}#topoDataTable{float:down;min-width:15.625rem;width:auto;height:18.75rem;top:3.4375rem;border-radius:.625rem;position:absolute!important;overflow:auto;background:#fff;font-family:sans-serif;font-size:1rem;color:#06a;overflow-x:scroll}table{width:auto;height:auto;max-height:18.75rem}tr{width:auto;padding:.3125rem}th{width:auto;font-family:sans-serif;font-size:1rem;color:#06a;font-weight:700;background-color:#06a}td{width:auto}th{width:auto;font-weight:700;padding:.125rem;border:.0625rem solid #ccc;text-align:center}.context-menu{border-radius:.75rem;background:var(--navigation);width:12.5rem;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);position:relative;display:none}.context-menu .menu-options{list-style:none;padding:0rem 0}.context-menu .menu-options .menu-option{font-weight:700;font-size:1rem;line-height:2.25rem;color:var(--tableText);padding:.0625rem .25rem .0625rem 1.25rem;cursor:pointer}.context-menu .menu-options .menu-option:hover{background:var(--primaryColor);color:var(--navigation)}@supports ((-webkit-backdrop-filter: saturate(110%) blur(.9375rem)) or (backdrop-filter: saturate(110%) blur(.9375rem))){.context-menu{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(.9375rem);backdrop-filter:saturate(110%) blur(.9375rem)}}.spinner{position:absolute;right:1em;top:1em;display:inline-block;width:2rem;height:2rem;border-radius:50%;background:transparent;border-top:.3125rem solid var(--placeholder);border-right:.3125rem solid var(--placeholder);border-bottom:.3125rem solid transparent;border-left:.3125rem solid transparent;animation:loading .5s infinite linear}.disabled{-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;pointer-events:none;cursor:pointer;opacity:.6}path:not(.loader path,.highcharts-root path){fill:none;stroke:var(--navigation);stroke-width:.3125rem;color:#fff}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.rotating{animation:rotating 2s linear infinite}.mat-mdc-radio-button .mdc-radio .mdc-radio__native-control:disabled:checked+.mdc-radio__background .mdc-radio__outer-circle{background-color:var(--icon);border-width:.25rem}.mat-mdc-radio-button .mdc-radio .mdc-radio__native-control:disabled:checked+.mdc-radio__background .mdc-radio__inner-circle{border-color:var(--icon)}.mdc-radio__native-control:disabled:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle{border-width:.25rem}#mat-radio-2>div>div>div.mdc-radio__background>div.mdc-radio__inner-circle .node.edge-router circle{stroke:#ffc000!important;stroke-width:.75rem}.node.endpoint circle{stroke:#0273fb!important;stroke-width:.75rem}.node.service circle{stroke:#08dc5a!important;stroke-width:.75rem}.node.service-policy circle{stroke:#ff0d49!important;stroke-width:.75rem}.node.edge-router circle{stroke:#ffc000!important;stroke-width:.75rem}.node.edge-router-policy circle{stroke:#ff8400!important;stroke-width:.75rem}.node.service-edge-router-policy circle{stroke:#ff5900!important;stroke-width:.75rem}.text-container{color:var(--tableText);font-size:1.5rem;font-weight:700;margin-left:1.25rem;margin-top:.5rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}svg>g>g.node:first-of-type.terminate{cursor:pointer}svg>g>g.node:first-of-type.terminate .text-container{cursor:pointer}svg>g>g.node:first-of-type.terminate circle{cursor:pointer}svg>g>g.node:first-of-type.terminate:hover>rect{fill:url(#NodeHoverGradient)}.node>rect{fill:url(#NodeGradient)}.node.terminate{cursor:default;stroke-width:.875rem}.node.terminate .text-container{cursor:default}.node.terminate circle{cursor:default;stroke-width:.875rem}.node.terminate:hover>rect{fill:url(#NodeGradient)}.node:hover>rect{fill:url(#NodeHoverGradient)}p-chips.error .p-chips.p-component .p-chips-multiple-container{border-color:var(--red);border-width:var(--inputBorderWidth)}.checkboxes.error .mat-checkbox-frame{border-color:var(--red)}.checkboxes.error .mat-checkbox-label{color:var(--red)}.stop1{stop-color:var(--table);stop-opacity:.9}.stop2{stop-color:var(--table);stop-opacity:.65}.stop3{stop-color:var(--table);stop-opacity:0}.stop1a{stop-color:var(--background);stop-opacity:1}.stop2a{stop-color:var(--background);stop-opacity:.7}.stop3a{stop-color:var(--background);stop-opacity:0}.tool-tip-container{font-size:.875rem;font-family:Open Sans;font-weight:600;font-color:var(--tableText)}.tool-tip-container .prop-row{display:grid;grid-template-columns:1fr 3fr;grid-gap:.625rem;grid-template-areas:\"propName propVal\";height:-moz-fit-content;height:fit-content;min-height:1.5625rem;align-items:center;padding:0 .625rem}.tool-tip-container .prop-row:nth-child(2n){background-color:var(--formBackground)}.tool-tip-container .prop-row .prop-name{grid-area:propName;font-weight:700}.tool-tip-container .prop-row .prop-val{grid-area:propVal;font-weight:400}.tool-tip-container .tooltip-help-text{font-size:.75rem;padding-left:.625rem;padding-right:.625rem;display:flex;height:1.375rem;align-items:center}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i7.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i9.LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
1695
|
-
}
|
|
1696
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NetworkVisualizerComponent, decorators: [{
|
|
1697
|
-
type: Component,
|
|
1698
|
-
args: [{ selector: 'app-network-visualizer', encapsulation: ViewEncapsulation.None, template: "<div class=\"ziti-page-container ziti-identities-container\">\n\n <div class=\"nf-network-topology-container\" >\n\n <div class=\"css-header\">{{title}} </div><br>\n\n <div class=\"nf-net-vis-controls-header\">\n <div class=\"nf-topology-zoom-container\">\n <!--button (click)=\"zoomOut()\" class=\"nf-topology-zoom-button minus\"></button>\n <button (click)=\"zoomIn()\" class=\"nf-topology-zoom-button plus\"></button-->\n <div (click)=\"resetTree('Yes')\" class=\"reset-button\" title=\"Reset\"></div>\n </div>\n <select\n (change)=\"resourceTypeChanged()\"\n [(ngModel)]=\"resourceType\"\n [ngClass]=\"{ 'resource-type-error': resourceTypeError }\"\n class=\"resource-type-select\"\n id=\"ResourceTypeSelect\"\n >\n <option value=\"\">Select Resource Type</option>\n <option value=\"service-policies\">Service Policies</option>\n <option value=\"services\">Services</option>\n <option value=\"identities\">Identities</option>\n <option value=\"edge-routers\">Edge Routers</option>\n <option value=\"edge-router-policies\">Edge Router Policies</option>\n <option value=\"service-edge-router-policies\">Service Edge Router Policies</option>\n </select>\n\n <div class=\"nf-net-vis-filter-container listBox row\">\n <input\n (keyup)=\"nwSearchChange($event)\"\n [(ngModel)]=\"filterText\"\n [matAutocomplete]=\"auto\"\n class=\"nf-topology-filter-input\"\n id=\"filterText\"\n matInput\n placeholder=\"Type to Filter\"\n />\n\n <div\n (click)=\"clearSearchFilter()\"\n *ngIf=\"filterText !== ''\"\n class=\"buttonBall close icon-close\"\n id=\"ClearSearchFilter\"\n ></div>\n\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"autocompleteSearch($event)\">\n <mat-option *ngFor=\"let option of autocompleteOptions\" [value]=\"option\">\n {{ option }}\n </mat-option>\n </mat-autocomplete>\n </div>\n </div>\n\n <div class=\"nf-topology-legend\">\n <div class=\"legend-item\">\n <div class=\"legend-circle servicepolicies\"></div>\n <div class=\"legend-text\">Service Policies</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle services\"></div>\n <div class=\"legend-text\">Services</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle endpoints\"></div>\n <div class=\"legend-text\">Identities</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle edgerouters\"></div>\n <div class=\"legend-text\">Edge Routers</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle erpolicies\"></div>\n <div class=\"legend-text\">Edge Router Policies</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle serviceerpolicies\"></div>\n <div class=\"legend-text\">Service Router Policies</div>\n </div>\n\n <div class=\"legend-item\">\n <div class=\"node-expand-help\"></div>\n <div class=\"legend-icon-text legend-associated-nodes\">View Associated Nodes</div>\n <div class=\"legend-icon-pointer\"></div>\n </div>\n </div>\n\n <div class=\"topotip\" id=\"tooltip\"></div>\n <svg style='pointer-events:all' id=\"NetworkVisualizerSVG\"></svg>\n <lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n </div>\n\n</div>\n", styles: [".ziti-page-container{height:100%;width:100%;left:0;display:flex;flex-direction:column;position:absolute;padding-top:.0625rem;padding-left:.1875rem;padding-right:.1875rem;top:0rem}.nf-network-topology-container{overflow:hidden;width:100%;height:100%;background-color:var(--background);z-index:1001;margin:auto;inset:0rem;padding-top:.0625rem;padding-left:.1875rem;padding-right:.1875rem;background:#ebefff;background-image:linear-gradient(#d1dcff .125rem,transparent 0),linear-gradient(90deg,#d1dcff .125rem,transparent 0),linear-gradient(#d1dcff .0625rem,transparent 0),linear-gradient(90deg,#d1dcff .0625rem,transparent 0);background-size:2.5rem 2.5rem,2.5rem 2.5rem,.625rem .625rem,.625rem .625rem}.css-header{height:3.125rem;font-size:1.5625rem;font-weight:600;margin:.5rem 0rem 0rem .625rem;font-family:Russo One;color:#0027ab;font-size:1.875rem;text-transform:uppercase;font-weight:400;background-color:transparent}.resource-type-select{width:16.875rem;flex-shrink:0;border-radius:1.6875rem;height:3.1875rem;margin-left:.3125rem;-webkit-backdrop-filter:saturate(110%) blur(.9375rem);backdrop-filter:saturate(110%) blur(.9375rem);background-color:#ffffff80!important;border-color:var(--navigation);box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);color:var(--tableText);padding-left:1.25rem}select{background-image:url(/assets/svgs/ArrowDown.svg);background-position:center right 1.125rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:2.375rem}.no-results-warning{left:27.5rem;font-size:.9375rem;color:var(--tableText);padding-left:1.25rem;padding-top:0rem;height:-moz-fit-content;height:fit-content;top:.0625rem}.resource-type-error{border-width:.1875rem;border-color:var(--red)!important}.nf-links{stroke:#fff;stroke-opacity:1.6}.nf-net-vis-controls-header{display:flex;flex-direction:row;position:absolute;z-index:99999;flex:1 0 auto;top:3.75rem}.nf-net-vis-filter-container{max-width:30.625rem;margin-top:0rem;margin-left:.625rem;flex:1 0 auto}.table-filter-container{max-width:18.75rem;margin-top:0rem;margin-left:.0625rem;flex:1 0 auto}#ClearSearchFilter{position:absolute;right:.9375rem;top:.3125rem;width:1.25rem;height:1.25rem;font-size:1.125rem;font-weight:600;color:var(--formBase);z-index:99999999}#ClearSearchFilter:hover{filter:brightness(90%)}#ClearSearchFilter:active{transform:translateY(.0625rem);filter:brightness(80%)}#popupTableTitle{width:100%;font-weight:900;display:inline-block;background-color:var(--navigation);box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);border:.125rem #d3d3d3!important;text-align:center;border:.125rem;border-color:#d3d3d3;height:1.5625rem;top:.125rem;color:#fff;padding-right:.3125rem;background:#000;cursor:move}#tra:hover{text-decoration:underline}#CloseDataTable{position:absolute;right:.3125rem;top:-2.0625rem;width:1.5625rem;height:1.5625rem;font-size:.9375rem;color:#fff;z-index:99999999}.copydatatable{width:8.4375rem;height:1.0625rem;font-size:10pt;font-family:tahoma;top:95%;right:0%;border-radius:.3125rem;background:#fff;border:0rem solid gray!important;position:absolute!important;text-transform:uppercase;cursor:pointer;z-index:999}.copydatatable:hover{text-decoration:underline}.nf-topology-filter-input{height:3.125rem;width:30.3125rem;border-radius:1.5625rem;border-color:var(--navigation);box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);padding-left:.625rem;padding-right:.9375rem}.nf-topology-select-container{max-width:25rem;margin-top:1.25rem;margin-left:1.25rem;flex:1 0 auto}.nf-topology-select-input{height:2.8125rem;border-radius:1.5625rem;border-color:var(--navigation);background-color:var(--navigation);box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);padding-left:1.25rem}input:focus,textarea:focus,select:focus{box-shadow:0 1.25rem 1.4375rem 0 var(--shadow)}@supports ((-webkit-backdrop-filter: saturate(110%) blur(.9375rem)) or (backdrop-filter: saturate(110%) blur(.9375rem))){.nf-topology-filter-input{background:var(--visualizerBackground)!important;-webkit-backdrop-filter:saturate(110%) blur(.3125rem);backdrop-filter:saturate(110%) blur(.9375rem)}}.nf-topology-zoom-container{display:flex;margin-left:.625rem;flex:1 0 auto}.nf-topology-zoom-button.minus{height:3.125rem;width:3.125rem;margin-right:.625rem;border-radius:3.4375rem;border:unset;font-size:2.5rem;font-family:icomoon!important;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--primaryColor);line-height:3.0625rem;background-color:var(--navigation);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);transition:background-color .5s;background-image:url(/assets/images/Icon_Minus.png);background-size:40%;background-color:var(--red);box-shadow:0 .375rem .625rem 0 var(--redShadow)}.nf-topology-zoom-label{padding-right:.625rem}.nf-topology-zoom-button{height:3.125rem;width:3.125rem;margin-right:.625rem;border-radius:3.4375rem;border:unset;font-size:2.5rem;font-family:icomoon!important;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--primaryColor);line-height:3.0625rem;background-color:var(--navigation);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);transition:background-color .5s}.nf-topology-zoom-button.plus:before{content:\"\\e937\"}.nf-topology-zoom-button.minus:before{content:\"\\e943\"}.nf-topology-zoom-button:hover{color:var(--white);background-color:var(--primaryColor);filter:brightness(90%);transition:background-color 1s;transition:.3s}.nf-topology-zoom-button:active{background-color:var(--icon);transform:scale(.97);transition:background-color 1s;transition:.3s}@supports ((-webkit-backdrop-filter: saturate(110%) blur(.9375rem)) or (backdrop-filter: saturate(110%) blur(.9375rem))){.nf-topology-zoom-button{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(.9375rem);backdrop-filter:saturate(110%) blur(.9375rem)}}.placeholder{display:flex;align-items:center;justify-content:center;height:50rem}.topotip{display:none;position:fixed;background:var(--navigation);border:0rem;border-radius:.75rem;pointer-events:none;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);transition:background-color .3s;font-size:.9375rem;font-weight:600;color:var(--tableText);z-index:2000;opacity:1;max-width:25rem;overflow:hidden}.nodes{cursor:pointer;box-shadow:0 1.875rem 2.6875rem 0 var(--shadow)}.nf-links{cursor:pointer}.linkWidth{color:#fff}.nf-network-topology-container .loader{margin-left:-9.375rem}.loader .bar1{background-color:var(--inputBorder)!important}.loader .bar2{background-color:var(--inputBorder)!important;animation-delay:-.7s}.loader .bar3{background-color:var(--inputBorder)!important;animation-delay:-.6s}.loader .bar4{background-color:var(--inputBorder)!important;animation-delay:-.5s}.loader .bar5{background-color:var(--inputBorder)!important;animation-delay:-.4s}.loader .bar6{background-color:var(--inputBorder)!important;animation-delay:-.3s}.changeView{display:flex;margin-top:2rem;margin-left:.625rem;flex:1 0 auto}.changeView .changeViewLabel{margin-top:.1875rem;margin-left:.3125rem}.node circle{fill:#fff;stroke:#07397d;stroke-width:.875rem;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow)}.node text{font:1.6875rem sans-serif;cursor:pointer}.node-text-container{color:var(--tableText);font-size:1.5rem;font-weight:600;margin-left:.125rem;margin-top:.25rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.link{fill:none;stroke:var(--table);stroke-width:.3125rem;color:#fff}.nf-topology-legend{width:14.375rem;border-radius:.75rem;margin-top:.625rem;margin-right:.625rem;position:absolute;top:0rem;right:0rem;background:#ffffff80!important;-webkit-backdrop-filter:saturate(110%) blur(.3125rem);backdrop-filter:saturate(110%) blur(.9375rem);border-color:var(--navigation);border-style:solid;border-width:var(--inputBorderWidth);display:inline-block;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);padding:.3125rem .3125rem .4375rem}@supports ((-webkit-backdrop-filter: saturate(110%) blur(.9375rem)) or (backdrop-filter: saturate(110%) blur(.9375rem))){.nf-topology-legend{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(.9375rem);backdrop-filter:saturate(110%) blur(.9375rem)}}.legend-item{width:100%;height:100%;display:inline-block;position:relative}.legend-itemA{width:100%;height:100%;margin-left:-.1875rem;display:inline-block}.legend-circle{height:.75rem;width:.75rem;border-radius:.9375rem;display:inline-block;margin-top:.4375rem}.legend-circle.servicepolicies{background-color:#ff0d49}.legend-circle.services{background-color:#08dc5a}.legend-circle.endpoints{background-color:#0273fb}.legend-circle.edgerouters{background-color:#ffc000}.legend-circle.erpolicies{background-color:#ff8400}.legend-circle.serviceerpolicies{background-color:#ff5900}.legend-text{display:inline-block;font-size:.9375rem;font-weight:600;color:var(--tableText);padding-left:.4375rem;padding-bottom:.25rem}.legend-icon-text{display:inline-block;font-size:.875rem;font-weight:600;color:var(--tableText);padding-left:1.375rem;padding-bottom:.25rem}.legend-icon-text.legend-associated-nodes{padding-left:1.25rem}.legend-icon-pointer{background-size:1rem 1rem;background-image:url(/assets/svgs/cursor-pointer.svg);position:absolute;z-index:999999;width:1.25rem;height:1.25rem;top:.625rem;left:.125rem}.reset-button{height:3.125rem;width:3.125rem;border-radius:3.125rem;margin-right:.625rem;background-size:contain;background-image:url(/assets/svgs/refresh.svg);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);transition:.3s}.node-expand-help{border-radius:1.25rem;border-width:.25rem;border-color:#08dc5a!important;border-style:solid;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);width:1rem;height:1rem;position:absolute;background-color:brown;margin-left:-.125rem;top:.125rem}.reset-button:hover{filter:brightness(90%);transform:scale(.97);transition:.3s}.reset-button:active{transform:scale(.9);transition:.3s}.sign_out_button{background-color:#2fa4e7;padding:1rem .625rem;color:#fff;float:left;text-decoration:none}.sign_out_button:hover{background-color:#1892d7}.sign_out_button a{color:#fff;text-decoration:none}.contextmenu_mouseout{fill:#f4f4f4;stroke:#fff;stroke-width:.0625rem}.contextmenu_mouseover{fill:#c8c8c8}.menu2{position:fixed;background:#fff;color:#000;cursor:pointer;border:.0625rem black solid}.contextmenu_text{position:fixed;padding:.125rem;background:var(--navigation);border:.0625rem;border-radius:.3125rem;pointer-events:none;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);transition:background-color .3s;padding:.3125rem;font-size:.625rem;font-weight:700;color:var(--tableText);z-index:2000;opacity:1;max-width:25rem}.contextmenu{z-index:2000;opacity:1;position:fixed;background:#fff;color:#000;font-family:sans-serif;font-size:.6875rem;box-shadow:.125rem .125rem .125rem #90908d;padding:.125rem;border-radius:.75rem;border:.0625rem solid #c6c6c6;max-width:25rem}.menuItems{display:block;color:#555;text-decoration:none;padding:.375rem .5rem .375rem 1.875rem;position:relative}.context-menu{display:none;position:absolute;z-index:10}.context-menu__items{list-style:none;margin:0;padding:0}.context-menu__item{display:block;margin-bottom:.25rem}.container{margin:0 auto;padding:0 1.5rem;max-width:60rem}.context-menu__link{display:block;padding:.25rem .75rem;color:#06a;text-decoration:none}.contextmenu_text:hover .divItemsHover{color:#fff;background-color:#06a}.context-menu--active{display:block}#topoDataTableHeader{float:left;min-width:15.625rem;width:auto;height:22.5rem;top:6.25rem;border-bottom-left-radius:.8125rem;border-bottom-right-radius:.8125rem;display:none;background:#fff;border:.125rem solid gray!important;position:absolute!important}.table-filter-input{height:1.875rem;width:100%;top:2.5rem;border-radius:.0625rem;border-color:#d3d3d3;background-color:#d3d3d3;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);padding-top:.1875rem;padding-left:.125rem;padding-right:.125rem}#topoDataTable{float:down;min-width:15.625rem;width:auto;height:18.75rem;top:3.4375rem;border-radius:.625rem;position:absolute!important;overflow:auto;background:#fff;font-family:sans-serif;font-size:1rem;color:#06a;overflow-x:scroll}table{width:auto;height:auto;max-height:18.75rem}tr{width:auto;padding:.3125rem}th{width:auto;font-family:sans-serif;font-size:1rem;color:#06a;font-weight:700;background-color:#06a}td{width:auto}th{width:auto;font-weight:700;padding:.125rem;border:.0625rem solid #ccc;text-align:center}.context-menu{border-radius:.75rem;background:var(--navigation);width:12.5rem;box-shadow:0 1.25rem 1.4375rem 0 var(--shadow);position:relative;display:none}.context-menu .menu-options{list-style:none;padding:0rem 0}.context-menu .menu-options .menu-option{font-weight:700;font-size:1rem;line-height:2.25rem;color:var(--tableText);padding:.0625rem .25rem .0625rem 1.25rem;cursor:pointer}.context-menu .menu-options .menu-option:hover{background:var(--primaryColor);color:var(--navigation)}@supports ((-webkit-backdrop-filter: saturate(110%) blur(.9375rem)) or (backdrop-filter: saturate(110%) blur(.9375rem))){.context-menu{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(.9375rem);backdrop-filter:saturate(110%) blur(.9375rem)}}.spinner{position:absolute;right:1em;top:1em;display:inline-block;width:2rem;height:2rem;border-radius:50%;background:transparent;border-top:.3125rem solid var(--placeholder);border-right:.3125rem solid var(--placeholder);border-bottom:.3125rem solid transparent;border-left:.3125rem solid transparent;animation:loading .5s infinite linear}.disabled{-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;pointer-events:none;cursor:pointer;opacity:.6}path:not(.loader path,.highcharts-root path){fill:none;stroke:var(--navigation);stroke-width:.3125rem;color:#fff}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.rotating{animation:rotating 2s linear infinite}.mat-mdc-radio-button .mdc-radio .mdc-radio__native-control:disabled:checked+.mdc-radio__background .mdc-radio__outer-circle{background-color:var(--icon);border-width:.25rem}.mat-mdc-radio-button .mdc-radio .mdc-radio__native-control:disabled:checked+.mdc-radio__background .mdc-radio__inner-circle{border-color:var(--icon)}.mdc-radio__native-control:disabled:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle{border-width:.25rem}#mat-radio-2>div>div>div.mdc-radio__background>div.mdc-radio__inner-circle .node.edge-router circle{stroke:#ffc000!important;stroke-width:.75rem}.node.endpoint circle{stroke:#0273fb!important;stroke-width:.75rem}.node.service circle{stroke:#08dc5a!important;stroke-width:.75rem}.node.service-policy circle{stroke:#ff0d49!important;stroke-width:.75rem}.node.edge-router circle{stroke:#ffc000!important;stroke-width:.75rem}.node.edge-router-policy circle{stroke:#ff8400!important;stroke-width:.75rem}.node.service-edge-router-policy circle{stroke:#ff5900!important;stroke-width:.75rem}.text-container{color:var(--tableText);font-size:1.5rem;font-weight:700;margin-left:1.25rem;margin-top:.5rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}svg>g>g.node:first-of-type.terminate{cursor:pointer}svg>g>g.node:first-of-type.terminate .text-container{cursor:pointer}svg>g>g.node:first-of-type.terminate circle{cursor:pointer}svg>g>g.node:first-of-type.terminate:hover>rect{fill:url(#NodeHoverGradient)}.node>rect{fill:url(#NodeGradient)}.node.terminate{cursor:default;stroke-width:.875rem}.node.terminate .text-container{cursor:default}.node.terminate circle{cursor:default;stroke-width:.875rem}.node.terminate:hover>rect{fill:url(#NodeGradient)}.node:hover>rect{fill:url(#NodeHoverGradient)}p-chips.error .p-chips.p-component .p-chips-multiple-container{border-color:var(--red);border-width:var(--inputBorderWidth)}.checkboxes.error .mat-checkbox-frame{border-color:var(--red)}.checkboxes.error .mat-checkbox-label{color:var(--red)}.stop1{stop-color:var(--table);stop-opacity:.9}.stop2{stop-color:var(--table);stop-opacity:.65}.stop3{stop-color:var(--table);stop-opacity:0}.stop1a{stop-color:var(--background);stop-opacity:1}.stop2a{stop-color:var(--background);stop-opacity:.7}.stop3a{stop-color:var(--background);stop-opacity:0}.tool-tip-container{font-size:.875rem;font-family:Open Sans;font-weight:600;font-color:var(--tableText)}.tool-tip-container .prop-row{display:grid;grid-template-columns:1fr 3fr;grid-gap:.625rem;grid-template-areas:\"propName propVal\";height:-moz-fit-content;height:fit-content;min-height:1.5625rem;align-items:center;padding:0 .625rem}.tool-tip-container .prop-row:nth-child(2n){background-color:var(--formBackground)}.tool-tip-container .prop-row .prop-name{grid-area:propName;font-weight:700}.tool-tip-container .prop-row .prop-val{grid-area:propVal;font-weight:400}.tool-tip-container .tooltip-help-text{font-size:.75rem;padding-left:.625rem;padding-right:.625rem;display:flex;height:1.375rem;align-items:center}\n"] }]
|
|
1699
|
-
}], ctorParameters: function () { return [{ type: i10.SettingsService, decorators: [{
|
|
1700
|
-
type: Inject,
|
|
1701
|
-
args: [SETTINGS_SERVICE]
|
|
1702
|
-
}] }, { type: i11.ZitiDataService, decorators: [{
|
|
1703
|
-
type: Inject,
|
|
1704
|
-
args: [ZITI_DATA_SERVICE]
|
|
1705
|
-
}] }, { type: i1.HttpClient }, { type: i2.LoggerService }, { type: i3.TreeNodeProcessor }, { type: i4.NetworkVisualizerHelper }]; } });
|
|
1706
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay12aXN1YWxpemVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy92aXN1YWxpemVyL25ldHdvcmstdmlzdWFsaXplci9uZXR3b3JrLXZpc3VhbGl6ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Zpc3VhbGl6ZXIvbmV0d29yay12aXN1YWxpemVyL25ldHdvcmstdmlzdWFsaXplci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUNMLFNBQVMsRUFFVCxNQUFNLEVBRU4saUJBQWlCLEdBRWxCLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFDTCxnQkFBZ0IsR0FFakIsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsaUJBQWlCLEdBRWxCLE1BQU0scUNBQXFDLENBQUM7QUFJN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFHLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFpQmpDLE1BQU0sT0FBTywwQkFBMkIsU0FBUSxzQkFBc0I7SUFzRXBFLFlBQ29DLGVBQWdDLEVBQzlCLFdBQTRCLEVBQ3ZELFVBQXNCLEVBQ3RCLE1BQXFCLEVBQ3RCLGlCQUFvQyxFQUNwQyxjQUF1QztRQUU5QyxLQUFLLEVBQUUsQ0FBQztRQVB5QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQ3ZELGVBQVUs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QUcsdUZBQXVGLENBQUM7U0FDMUc7YUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFDO1lBQzVGLElBQUksR0FBRyxJQUFJLEdBQUcsMkVBQTJFLENBQUM7U0FDOUY7UUFDRCxPQUFPLElBQUksR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQzsrR0EzMERRLDBCQUEwQixrQkF1RTFCLGdCQUFnQixhQUNoQixpQkFBaUI7bUdBeEVqQiwwQkFBMEIscUZDM0N2QywyeEhBNkZBOzs0RkRsRGEsMEJBQTBCO2tCQVB0QyxTQUFTOytCQUNFLHdCQUF3QixpQkFDbkIsaUJBQWlCLENBQUMsSUFBSTs7MEJBNEVqQyxNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ3ZCLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IHByZWZlci1jb25zdDogMSAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBWaWV3Q2hpbGQsXG4gIEluamVjdCxcbiAgT25Jbml0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5qZWN0YWJsZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgU0VUVElOR1NfU0VSVklDRSxcbiAgU2V0dGluZ3NTZXJ2aWNlLFxufSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFpJVElfREFUQV9TRVJWSUNFLFxuICBaaXRpRGF0YVNlcnZpY2UsXG59IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ppdGktZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7RGF0YVRhYmxlRmlsdGVyU2VydmljZSwgRmlsdGVyT2JqfSBmcm9tIFwiLi4vLi4vZGF0YS10YWJsZS9kYXRhLXRhYmxlLWZpbHRlci5zZXJ2aWNlXCI7XG5pbXBvcnQge2NhdGNoRXJyb3J9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHtmaXJzdFZhbHVlRnJvbSwgbWFwLCBPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgVmlzdWFsaXplclNlcnZpY2VDbGFzcyAgfSBmcm9tICcuLi92aXN1YWxpemVyLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge2Nsb25lRGVlcH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBIdHRwQ2xpZW50fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBUcmVlTm9kZVByb2Nlc3NvciB9IGZyb20gJy4vbmV0d29yay12aXN1YWxpemVyLnRyZWVub2RlcHJvY2Vzc29yJztcbmltcG9ydCB7IE5ldHdvcmtWaXN1YWxpemVySGVscGVyIH0gZnJvbSAnLi9uZXR3b3JrLXZpc3VhbGl6ZXIuaGVscGVyJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2luZy9sb2dnZXIuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbmV0d29yay12aXN1YWxpemVyJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGVVcmw6ICcuL25ldHdvcmstdmlzdWFsaXplci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25ldHdvcmstdmlzdWFsaXplci5jb21wb25lbnQuc2NzcyddLFxufSlcblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtWaXN1YWxpemVyQ29tcG9uZW50IGV4dGVuZHMgVmlzdWFsaXplclNlcnZpY2VDbGFzcyBpbXBsZW1lbnRzIE9uSW5pdCB7XG4vLyBleHBvcnQgY2xhc3MgTmV0d29ya1Zpc3VhbGl6ZXJDb21wb25lbnQgIGltcGxlbWVudHMgT25Jbml0IHtcbiAgdGl0bGUgPSAnTmV0d29yayBWaXN1YWxpemVyJ1xuICBwdWJsaWMgZDM7XG4gIHVuaXFJZCA9IDA7XG4gIG1heE9iamVjdHNQZXJOb2RlID0gMTAwMTtcbiAgdHJlZXRvb2x0aXA7XG4gIGZ1bGxTY3JlZW4gPSBmYWxzZTtcbiAgaXNMb2FkaW5nID0gdHJ1ZTtcbiAgbm9TZWFyY2hSZXN1bHRzID0gdHJ1ZTtcbiAgc2VydmljZXMgPSBbXTtcbiAgc2VydmljZXNfdG90YWxDb3VudCA9IDA7XG4gIGFsbF9zZXJ2aWNlc19mZXRjaGVkID0gZmFsc2U7XG4gIGlkZW50aXRpZXMgPSBbXTtcbiAgaWRlbnRpdGllc190b3RhbENvdW50ID0gMDtcbiAgYWxsX2lkZW50aXRpZXNfZmV0Y2hlZCA9IGZhbHNlO1xuICBlZGdlcm91dGVycyA9IFtdO1xuICBlZGdlcm91dGVyc190b3RhbENvdW50ID0gMDtcbiAgYWxsX2VkZ2Vyb3V0ZXJzX2ZldGNoZWQgPSBmYWxzZTtcbiAgc2VydmljZV9wb2xpY2llcyA9IFtdO1xuICBzZXJ2aWNlX3BvbGljaWVzX3RvdGFsQ291bnQgPSAwO1xuICBhbGxfc2VydmljZV9wb2xpY2llc19mZXRjaGVkID0gZmFsc2U7XG4gIGVkZ2Vfcm91dGVyX3BvbGljaWVzID0gW107XG4gIGVkZ2Vfcm91dGVyX3BvbGljaWVzX3RvdGFsQ291bnQgPSAwO1xuICBhbGxfZWRnZV9yb3V0ZXJfcG9saWNpZXNfZmV0Y2hlZCA9IGZhbHNlO1xuICBzZXJ2aWNlX3JvdXRlcl9wb2xpY2llcyA9IFtdO1xuICBzZXJ2aWNlX3JvdXRlcl9wb2xpY2llc190b3RhbENvdW50ID0gMDtcbiAgYWxsX3NlcnZpY2Vfcm91dGVyX3BvbGljaWVzX2ZldGNoZWQgPSBmYWxzZTtcbiAgY29uZmlncyA9IFtdO1xuICBmaWxlclJlc3BvbnNlTWVzc2FnZSA9ICdzZWFyY2ggZmlsdGVyLi4nO1xuICBiYXNlTmV0d29ya0dyYXBoO1xuICBuZXR3b3JrR3JhcGg7XG4gIGN1cnJlbnROZXR3b3JrO1xuICBzZWFyY2hSb290Tm9kZTtcblxuICBzZXJ2aWNlUG9saWNpZXNUcmVlTm9kZXMgPSBbXTtcbiAgc2VydmljZXNUcmVlTm9kZXMgPSBbXTtcbiAgaWRlbnRpdGllc1RyZWVOb2RlcyA9IFtdO1xuICBlZGdlcm91dGVyc1RyZWVOb2RlcyA9IFtdO1xuICBlclBvbGljaWVzVHJlZU5vZGVzID0gW107XG4gIHNlcnZpY2VFZGdlUm91dGVyUG9saWN5VHJlZU5vZGVzID0gW107XG5cbiAgYXV0b2NvbXBsZXRlT3B0aW9ucztcbiAgcmVzb3VyY2VUeXBlRXJyb3IgPSBmYWxzZTtcbiAgZmlsdGVyVGV4dCA9ICcnO1xuICBzZWFyY2hXb3JkID0gJyc7XG4gIHJlc291cmNlVHlwZSA9ICcnO1xuICB6b29tO1xuICBzdmc7XG4gIHRyZWVtYXA7XG4gIG5vZGVzO1xuICBub2RlO1xuICBsaW5rO1xuICBsaW5rcztcbiAgbGlua0V4aXQ7XG4gIGxpbmtVcGRhdGU7XG4gIG9wZW5Ob2RlcyA9IFtdO1xuICB0cmFuc2Zvcm07XG4gIG5vZGVVcGRhdGU7XG4gIG5vZGVFeGl0O1xuICBub2RlRW50ZXI7XG4gIGNvbnRleHRtZW51Tm9kZTtcbiAgY2lyY2xlcztcbiAgY29udGV4dG1lbnVOb2RlVHlwZTphbnkgPSBbXTtcbiAgc2ltdWxhdGlvbjtcbiAgdHJlZURhdGE7XG4gIGdyYXBodG9vbHRpcDtcbiAgc2VhcmNoQ2FjaGU7XG4gIGFsbFByb21pc2VzID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgIEBJbmplY3QoU0VUVElOR1NfU0VSVklDRSkgcHVibGljIHNldHRpbmdzU2VydmljZTogU2V0dGluZ3NTZXJ2aWNlLFxuICAgICBASW5qZWN0KFpJVElfREFUQV9TRVJWSUNFKSBwcml2YXRlIHppdGlTZXJ2aWNlOiBaaXRpRGF0YVNlcnZpY2UsXG4gICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCxcbiAgICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2UsXG4gICAgIHB1YmxpYyB0cmVlTm9kZVByb2Nlc3NvcjogVHJlZU5vZGVQcm9jZXNzb3IsXG4gICAgIHB1YmxpYyB0b3BvbG9neUhlbHBlcjogTmV0d29ya1Zpc3VhbGl6ZXJIZWxwZXIsXG4gICkge1xuICAgICBzdXBlcigpO1xuICAgIC8vIHN1cGVyKHNldHRpbmdzU2VydmljZSwgeml0aVNlcnZpY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgIHRoaXMuZ2V0TmV0d29ya09iamVjdHMoKTtcbiAgfVxuXG4gICAgZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKSB7XG4gICAgcmV0dXJuIGNsb25lRGVlcCh7XG4gICAgICBmaWx0ZXI6IFwiXCIsXG4gICAgICBub1NlYXJjaDogdHJ1ZSxcbiAgICAgIG9yZGVyOiBcImFzY1wiLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHNlYXJjaE9uOiBcIm5hbWVcIixcbiAgICAgIHNvcnQ6IFwibmFtZVwiLFxuICAgICAgdG90YWw6IHBhZ2VzaXplXG4gICAgfSlcbiAgICB9XG5cbiAgYXN5bmMgZ2V0TmV0d29ya09iamVjdHMoKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICBhd2FpdCB0aGlzLnJlYWRBbGxPYmplY3RzKCk7XG4gICAgIHRoaXMucHJvY2Vzc0ZpcnN0TmV0d29ya0dyYXBoKCk7XG4gIH1cblxuICAgYXN5bmMgZmV0Y2hJZGVudGl0aWVzIChwYWdlc2l6ZSkge1xuICAgICAgY29uc3QgaWRlbnRpdGllc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy56aXRpU2VydmljZVxuICAgICAgLmdldChgaWRlbnRpdGllc2AsIGlkZW50aXRpZXNfcGFnaW5nLCBbXSlcbiAgICAgIC50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgIHRoaXMuaWRlbnRpdGllcyA9IHJlc3VsdC5kYXRhPyByZXN1bHQuZGF0YTogW107XG4gICAgICAgICB0aGlzLmlkZW50aXRpZXNfdG90YWxDb3VudCA9IHJlc3VsdC5tZXRhICYmIHJlc3VsdC5tZXRhLnBhZ2luYXRpb24/IHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCA6IDA7XG4gICAgICAgICBpZiAoIXRoaXMuaWRlbnRpdGllcyB8fCB0aGlzLmlkZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmlkZW50aXRpZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaWRlbnRpdGllc190b3RhbENvdW50IDwgdGhpcy5tYXhPYmplY3RzUGVyTm9kZSApe1xuICAgICAgICAgICB0aGlzLmFsbF9pZGVudGl0aWVzX2ZldGNoZWQgPSB0cnVlO1xuICAgICAgICAgICBjb25zdCBwYWdlcyA9IE1hdGguY2VpbChyZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgLyBwYWdlc2l6ZSk7XG4gICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgICBpZGVudGl0aWVzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICBjb25zdCB0bXBfcHJvbWlzZSA9IGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAgICAgLmdldChcbiAgICAgICAgICAgICAgICBgaWRlbnRpdGllc2AsXG4gICAgICAgICAgICAgICAgIGlkZW50aXRpZXNfcGFnaW5nLFxuICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICAgICAgICkudGhlbigocGFnZVJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXRpZXMucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0bXBfcHJvbWlzZSk7XG4gICAgICAgICAgICAgdGhpcy5hbGxQcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgfVxuICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyB0aGlzLmlkZW50aXRpZXNfdG90YWxDb3VudCA9IHRoaXMuaWRlbnRpdGllcy5sZW5ndGg7XG4gICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW4gZmV0Y2hpbmcgSWRlbnRpdGllcycsIGVycm9yLm1lc3NhZ2UpO1xuICAgICB9KTsgIC8vIGlkZW50aXR5IHByb21pc2VzXG4gIH1cblxuICBhc3luYyBmZXRjaFNlcnZpY2VzKHBhZ2VzaXplKSB7XG4gICBjb25zdCBzZXJ2aWNlc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAuZ2V0KGBzZXJ2aWNlc2AsIHNlcnZpY2VzX3BhZ2luZywgW10pXG4gICAgICAgICAgLnRoZW4oIGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZXMgPSByZXN1bHQuZGF0YT8gcmVzdWx0LmRhdGE6IFtdO1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc190b3RhbENvdW50ID0gcmVzdWx0Lm1ldGEgJiYgcmVzdWx0Lm1ldGEucGFnaW5hdGlvbj8gcmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50IDogMDtcbiAgICAgICAgICAgIGlmICghdGhpcy5zZXJ2aWNlcyB8fCB0aGlzLnNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzID0gW107XG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VydmljZXNfdG90YWxDb3VudCA8IHRoaXMubWF4T2JqZWN0c1Blck5vZGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5hbGxfc2VydmljZXNfZmV0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICAgICAgY29uc3Qgc19wcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgc2VydmljZXNfcGFnaW5nLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcF9wcm9taXNlID0gYXdhaXQgdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAgICAgLmdldChcbiAgICAgICAgICAgICAgICAgICAgYHNlcnZpY2VzYCxcbiAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlcy5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNfcHJvbWlzZXMucHVzaCh0bXBfcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxQcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBQcm9taXNlLmFsbChzX3Byb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgIC8vIHRoaXMuc2VydmljZXNfdG90YWxDb3VudCA9IHRoaXMuc2VydmljZXMubGVuZ3RoO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW4gZmV0Y2hpbmcgc2VydmljZXMnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBmZXRjaFNlcnZpY2VQb2xpY2llcyhwYWdlc2l6ZSkge1xuICAgICAgIGNvbnN0IHNlcnZpY2VzUG9saWNpZXNfcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAuZ2V0KGBzZXJ2aWNlLXBvbGljaWVzYCwgc2VydmljZXNQb2xpY2llc19wYWdpbmcsIFtdKVxuICAgICAgICAgIC50aGVuKCBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VfcG9saWNpZXMgPSByZXN1bHQuZGF0YT8gcmVzdWx0LmRhdGE6IFtdO1xuICAgICAgICAgICAgIHRoaXMuc2VydmljZV9wb2xpY2llc190b3RhbENvdW50ID0gcmVzdWx0Lm1ldGEgJiYgcmVzdWx0Lm1ldGEucGFnaW5hdGlvbj8gcmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50IDogMDtcbiAgICAgICAgICAgIGlmICghdGhpcy5zZXJ2aWNlX3BvbGljaWVzIHx8IHRoaXMuc2VydmljZV9wb2xpY2llcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlX3BvbGljaWVzID0gW107XG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VydmljZV9wb2xpY2llc190b3RhbENvdW50IDwgdGhpcy5tYXhPYmplY3RzUGVyTm9kZSkge1xuICAgICAgICAgICAgICB0aGlzLmFsbF9zZXJ2aWNlX3BvbGljaWVzX2ZldGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IE1hdGguY2VpbChyZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgLyBwYWdlc2l6ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHNwX3Byb21pc2VzID0gW107XG4gICAgICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgICAgICBzZXJ2aWNlc1BvbGljaWVzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBfcHJvbWlzZSA9IGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgIC5nZXQoXG4gICAgICAgICAgICAgICAgICAgIGBzZXJ2aWNlLXBvbGljaWVzYCxcbiAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzUG9saWNpZXNfcGFnaW5nLFxuICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZVJlc3VsdC5kYXRhICYmIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlX3BvbGljaWVzLnB1c2goc2Vydik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3BfcHJvbWlzZXMucHVzaCh0bXBfcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxQcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIFByb21pc2UuYWxsKHNwX3Byb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgIC8vIHRoaXMuc2VydmljZV9wb2xpY2llc190b3RhbENvdW50ID0gdGhpcy5zZXJ2aWNlX3BvbGljaWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbiBmZXRjaGluZyBzZXJ2aWNlLXBvbGljaWVzJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hFZGdlUm91dGVycyhwYWdlc2l6ZSkge1xuICAgICAgIGNvbnN0IHJvdXRlcnNfcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgLmdldChgZWRnZS1yb3V0ZXJzYCwgcm91dGVyc19wYWdpbmcsIFtdKVxuICAgICAgICAgIC50aGVuKCBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVkZ2Vyb3V0ZXJzID0gcmVzdWx0LmRhdGE/IHJlc3VsdC5kYXRhOiBbXTtcbiAgICAgICAgICAgIHRoaXMuZWRnZXJvdXRlcnNfdG90YWxDb3VudCA9IHJlc3VsdC5tZXRhICYmIHJlc3VsdC5tZXRhLnBhZ2luYXRpb24/IHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCA6IDA7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRnZXJvdXRlcnMgfHwgdGhpcy5lZGdlcm91dGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5lZGdlcm91dGVycyA9IFtdO1xuICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVkZ2Vyb3V0ZXJzX3RvdGFsQ291bnQgPCB0aGlzLm1heE9iamVjdHNQZXJOb2RlKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWxsX2VkZ2Vyb3V0ZXJzX2ZldGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IE1hdGguY2VpbChyZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgLyBwYWdlc2l6ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gcGFnZXM7IHBhZ2UrKykge1xuICAgICAgICAgICAgICAgIHJvdXRlcnNfcGFnaW5nLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcF9wcm9taXNlID0gYXdhaXQgdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAgICAgLmdldChcbiAgICAgICAgICAgICAgICAgICAgYGVkZ2Utcm91dGVyc2AsXG4gICAgICAgICAgICAgICAgICAgICByb3V0ZXJzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGdlcm91dGVycy5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJfcHJvbWlzZXMucHVzaCh0bXBfcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxQcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBQcm9taXNlLmFsbChyX3Byb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgLy8gdGhpcy5lZGdlcm91dGVyc190b3RhbENvdW50ID0gdGhpcy5lZGdlcm91dGVycy5sZW5ndGg7XG4gICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW4gZmV0Y2hpbmcgZWRnZS1yb3V0ZXJzJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgfSk7XG4gIH1cblxuIGFzeW5jIGZpbmRFZGdlUm91dGVyUG9saWNpZXMocGFnZXNpemUpIHtcbiAgICAgIHRoaXMuZWRnZV9yb3V0ZXJfcG9saWNpZXMgPSBbXTtcbiAgICAgIGNvbnN0IGVycG9saWNpZXNfcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAuZ2V0KGBlZGdlLXJvdXRlci1wb2xpY2llc2AsIGVycG9saWNpZXNfcGFnaW5nLCBbXSlcbiAgICAgICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVkZ2Vfcm91dGVyX3BvbGljaWVzID0gcmVzdWx0LmRhdGE/IHJlc3VsdC5kYXRhOiBbXTtcbiAgICAgICAgICAgIHRoaXMuZWRnZV9yb3V0ZXJfcG9saWNpZXNfdG90YWxDb3VudCA9IHJlc3VsdC5tZXRhICYmIHJlc3VsdC5tZXRhLnBhZ2luYXRpb24/IHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCA6IDA7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRnZV9yb3V0ZXJfcG9saWNpZXMgfHwgdGhpcy5lZGdlX3JvdXRlcl9wb2xpY2llcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5lZGdlX3JvdXRlcl9wb2xpY2llc190b3RhbENvdW50IDwgdGhpcy5tYXhPYmplY3RzUGVyTm9kZSkge1xuICAgICAgICAgICAgICB0aGlzLmFsbF9lZGdlX3JvdXRlcl9wb2xpY2llc19mZXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSBNYXRoLmNlaWwocmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50IC8gcGFnZXNpemUpO1xuICAgICAgICAgICAgICBjb25zdCByX3Byb21pc2VzID0gW107XG4gICAgICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgICAgICBlcnBvbGljaWVzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBfcHJvbWlzZSA9IGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgIC5nZXQoXG4gICAgICAgICAgICAgICAgICAgIGBlZGdlLXJvdXRlci1wb2xpY2llc2AsXG4gICAgICAgICAgICAgICAgICAgICBlcnBvbGljaWVzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGdlX3JvdXRlcl9wb2xpY2llcy5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJfcHJvbWlzZXMucHVzaCh0bXBfcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxQcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIFByb21pc2UuYWxsKHJfcHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgLy8gdGhpcy5lZGdlX3JvdXRlcl9wb2xpY2llc190b3RhbENvdW50ID0gdGhpcy5lZGdlX3JvdXRlcl9wb2xpY2llcy5sZW5ndGg7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluIGZldGNoaW5nIGVkZ2Utcm91dGVyLXBvbGljaWVzJywgZXJyb3IpO1xuICAgICAgIH0pO1xuIH1cbiBhc3luYyBmZXRjaFNlcnZpY2VFZGdlUm91dGVyUG9saWNpZXMocGFnZXNpemUpIHtcbiAgICAgdGhpcy5zZXJ2aWNlX3JvdXRlcl9wb2xpY2llcyA9IFtdO1xuICAgICBjb25zdCBzZXJwX3BhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgcmV0dXJuIGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAuZ2V0KGBzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzYCwgc2VycF9wYWdpbmcsIFtdKVxuICAgICAgICAgIC50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICB0aGlzLnNlcnZpY2Vfcm91dGVyX3BvbGljaWVzID0gcmVzdWx0LmRhdGE/IHJlc3VsdC5kYXRhOiBbXTtcbiAgICAgICAgICAgICB0aGlzLnNlcnZpY2Vfcm91dGVyX3BvbGljaWVzX3RvdGFsQ291bnQgPSByZXN1bHQubWV0YSAmJiByZXN1bHQubWV0YS5wYWdpbmF0aW9uPyByZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgOiAwO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNlcnZpY2Vfcm91dGVyX3BvbGljaWVzIHx8IHRoaXMuc2VydmljZV9yb3V0ZXJfcG9saWNpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VydmljZV9yb3V0ZXJfcG9saWNpZXNfdG90YWxDb3VudCA8IHRoaXMubWF4T2JqZWN0c1Blck5vZGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5hbGxfc2VydmljZV9yb3V0ZXJfcG9saWNpZXNfZmV0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICAgICAgY29uc3Qgcl9wcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgc2VycF9wYWdpbmcucGFnZSA9IHBhZ2U7XG4gICAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2UgPSBhd2FpdCB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAuZ2V0KFxuICAgICAgICAgICAgICAgICAgICBgc2VydmljZS1lZGdlLXJvdXRlci1wb2xpY2llc2AsXG4gICAgICAgICAgICAgICAgICAgICBzZXJwX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlX3JvdXRlcl9wb2xpY2llcy5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJfcHJvbWlzZXMucHVzaCh0bXBfcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxQcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBQcm9taXNlLmFsbChyX3Byb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gdGhpcy5zZXJ2aWNlX3JvdXRlcl9wb2xpY2llc190b3RhbENvdW50ID0gdGhpcy5zZXJ2aWNlX3JvdXRlcl9wb2xpY2llcy5sZW5ndGg7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluIGZldGNoaW5nIHNlcnZpY2UtZWRnZS1yb3V0ZXItcG9saWNpZXMnLCBlcnJvcik7XG4gICAgICAgfSk7XG4gfVxuIGFzeW5jIGZldGNoQ29uZmlncyhwYWdlc2l6ZSkge1xuICAgIHRoaXMuY29uZmlncyA9IFtdO1xuICAgIGNvbnN0IGNvbmZpZ3NfcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgLmdldChgY29uZmlnc2AsIGNvbmZpZ3NfcGFnaW5nLCBbXSlcbiAgICAgICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3MgPSByZXN1bHQuZGF0YT8gcmVzdWx0LmRhdGE6IFtdO1xuICAgICAgICAgICBjb25zdCBjb25maWdzX3RvdGFsQ291bnQgPSByZXN1bHQubWV0YSAmJiByZXN1bHQubWV0YS5wYWdpbmF0aW9uPyByZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgOiAwO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ3MgfHwgdGhpcy5jb25maWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3MgPSBbXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnc190b3RhbENvdW50IDwgdGhpcy5tYXhPYmplY3RzUGVyTm9kZSkge1xuICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IE1hdGguY2VpbChyZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgLyBwYWdlc2l6ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gcGFnZXM7IHBhZ2UrKykge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3NfcGFnaW5nLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcF9wcm9taXNlID0gYXdhaXQgdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAgICAgLmdldChcbiAgICAgICAgICAgICAgICAgICAgYGNvbmZpZ3NgLFxuICAgICAgICAgICAgICAgICAgICAgY29uZmlnc19wYWdpbmcsXG4gICAgICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAudGhlbigocGFnZVJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlncy5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJfcHJvbWlzZXMucHVzaCh0bXBfcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxQcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBQcm9taXNlLmFsbChyX3Byb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ3NfdG90YWxDb3VudCA9IHRoaXMuY29uZmlncy5sZW5ndGg7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW4gZmV0Y2hpbmcgY29uZmlncycsIGVycm9yKTtcbiAgICAgICAgICB9KTtcblxuIH1cblxuIGFzeW5jIHJlYWRBbGxPYmplY3RzKCkge1xuICAgY29uc3QgbXlQcm9taXNlID0gIGF3YWl0IG5ldyBQcm9taXNlKCAgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICBsZXQgbmV0d29ya1Zpc1Byb21pc2VzID1bXTtcbiAgICAgY29uc3QgcGFnZXNpemUgPSA1MDA7XG4gICAgIGNvbnN0IGVwcyA9IHRoaXMuZmV0Y2hJZGVudGl0aWVzKHBhZ2VzaXplKTtcbiAgICAgdGhpcy5hbGxQcm9taXNlcy5wdXNoKGVwcyk7XG4gICAgIGNvbnN0IHNzID0gdGhpcy5mZXRjaFNlcnZpY2VzKHBhZ2VzaXplKTtcbiAgICAgdGhpcy5hbGxQcm9taXNlcy5wdXNoKHNzKTtcbiAgICAgY29uc3Qgc3BzID0gdGhpcy5mZXRjaFNlcnZpY2VQb2xpY2llcyhwYWdlc2l6ZSk7XG4gICAgIHRoaXMuYWxsUHJvbWlzZXMucHVzaChzcHMpO1xuICAgICBjb25zdCBlcnMgPSB0aGlzLmZldGNoRWRnZVJvdXRlcnMocGFnZXNpemUpO1xuICAgICB0aGlzLmFsbFByb21pc2VzLnB1c2goZXBzKTtcbiAgICAgY29uc3QgZXJwcyA9IHRoaXMuZmluZEVkZ2VSb3V0ZXJQb2xpY2llcyhwYWdlc2l6ZSk7XG4gICAgIHRoaXMuYWxsUHJvbWlzZXMucHVzaChlcnBzKTtcbiAgICAgY29uc3Qgc2VycHMgPSB0aGlzLmZldGNoU2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcyhwYWdlc2l6ZSk7XG4gICAgIHRoaXMuYWxsUHJvbWlzZXMucHVzaChzZXJwcyk7XG4gICAgIGNvbnN0IGNmZyA9IHRoaXMuZmV0Y2hDb25maWdzKHBhZ2VzaXplKTtcbiAgICAgdGhpcy5hbGxQcm9taXNlcy5wdXNoKGNmZyk7XG4gICAgIFByb21pc2UuYWxsKHRoaXMuYWxsUHJvbWlzZXMpLnRoZW4oKHJlcykgPT4ge3Jlc29sdmUoJ2VuZCcpOyB9KTtcbiAgIH0pO1xuIH1cblxuICBwcm9jZXNzRmlyc3ROZXR3b3JrR3JhcGgoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0cmVlT2JqID0gdGhpcy50b3BvbG9neUhlbHBlci5nZXRSZXNvdXJjZVRyZWVPYmooXG4gICAgICAgICAgICAgICAgJ3RoaXMuY3VycmVudE5ldHdvcmsubmFtZScsXG4gICAgICAgICAgICAgICAgJ3RoaXMuY3VycmVudE5ldHdvcmsuc3RhdHVzJyxcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzLFxuICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpdGllcyxcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VfcG9saWNpZXMsXG4gICAgICAgICAgICAgICAgdGhpcy5lZGdlcm91dGVycyxcbiAgICAgICAgICAgICAgICB0aGlzLmVkZ2Vfcm91dGVyX3BvbGljaWVzLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZV9yb3V0ZXJfcG9saWNpZXMsXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc190b3RhbENvdW50LCB0aGlzLmlkZW50aXRpZXNfdG90YWxDb3VudCwgdGhpcy5lZGdlcm91dGVyc190b3RhbENvdW50LFxuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZV9wb2xpY2llc190b3RhbENvdW50LCB0aGlzLmVkZ2Vfcm91dGVyX3BvbGljaWVzX3RvdGFsQ291bnQsXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlX3JvdXRlcl9wb2xpY2llc190b3RhbENvdW50LFxuICAgICAgICAgICAgICAgIHRoaXMudW5pcUlkLFxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLFxuICAgICAgICAgICAgICAgIHRoaXMuYWxsX3NlcnZpY2VfcG9saWNpZXNfZmV0Y2hlZCwgdGhpcy5hbGxfc2VydmljZXNfZmV0Y2hlZCwgdGhpcy5hbGxfaWRlbnRpdGllc19mZXRjaGVkLCB0aGlzLmFsbF9lZGdlcm91dGVyc19mZXRjaGVkLFxuICAgICAgICAgICAgICAgIHRoaXMuYWxsX2VkZ2Vfcm91dGVyX3BvbGljaWVzX2ZldGNoZWQsIHRoaXMuYWxsX3NlcnZpY2Vfcm91dGVyX3BvbGljaWVzX2ZldGNoZWRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMudW5pcUlkID0gdHJlZU9iai5sYXN0SWQ7XG4gICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCA9IGQzLmhpZXJhcmNoeSh0cmVlT2JqLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkLmNoaWxkcmVuO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyB0aGlzLmJhc2VOZXR3b3JrR3JhcGggPSBfLmNsb25lRGVlcCh0aGlzLm5ldHdvcmtHcmFwaCk7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VQb2xpY2llc1RyZWVOb2RlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc1RyZWVOb2RlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5pZGVudGl0aWVzVHJlZU5vZGVzID0gW107XG4gICAgICAgICAgICB0aGlzLmVkZ2Vyb3V0ZXJzVHJlZU5vZGVzID0gW107XG4gICAgICAgICAgICB0aGlzLmVyUG9saWNpZXNUcmVlTm9kZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZUVkZ2VSb3V0ZXJQb2xpY3lUcmVlTm9kZXMgPSBbXTtcblxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlUG9saWNpZXNUcmVlTm9kZXMgPSB0aGlzLmZpbGxBdXRvQ29tcGxldGVUcmVlTm9kZXMoXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlX3BvbGljaWVzLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZVBvbGljaWVzVHJlZU5vZGVzLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlUG9saWN5J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZXNUcmVlTm9kZXMgPSB0aGlzLmZpbGxBdXRvQ29tcGxldGVUcmVlTm9kZXMoXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlcyxcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzVHJlZU5vZGVzLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuaWRlbnRpdGllc1RyZWVOb2RlcyA9IHRoaXMuZmlsbEF1dG9Db21wbGV0ZVRyZWVOb2RlcyhcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXRpZXMsXG4gICAgICAgICAgICAgICAgdGhpcy5pZGVudGl0aWVzVHJlZU5vZGVzLFxuICAgICAgICAgICAgICAgICdJZGVudGl0eSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmVkZ2Vyb3V0ZXJzVHJlZU5vZGVzID0gdGhpcy5maWxsQXV0b0NvbXBsZXRlVHJlZU5vZGVzKFxuICAgICAgICAgICAgICAgIHRoaXMuZWRnZXJvdXRlcnMsXG4gICAgICAgICAgICAgICAgdGhpcy5lZGdlcm91dGVyc1RyZWVOb2RlcyxcbiAgICAgICAgICAgICAgICAnUm91dGVyJ1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5lclBvbGljaWVzVHJlZU5vZGVzID0gdGhpcy5maWxsQXV0b0NvbXBsZXRlVHJlZU5vZGVzKFxuICAgICAgICAgICAgICAgIHRoaXMuZWRnZV9yb3V0ZXJfcG9saWNpZXMsXG4gICAgICAgICAgICAgICAgdGhpcy5lclBvbGljaWVzVHJlZU5vZGVzLFxuICAgICAgICAgICAgICAgICdSb3V0ZXIgUG9saWN5J1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlRWRnZVJvdXRlclBvbGljeVRyZWVOb2RlcyA9IHRoaXMuZmlsbEF1dG9Db21wbGV0ZVRyZWVOb2RlcyhcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2Vfcm91dGVyX3BvbGljaWVzLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZUVkZ2VSb3V0ZXJQb2xpY3lUcmVlTm9kZXMsXG4gICAgICAgICAgICAgICAgJ1NlcnZpY2UgUm91dGVyIFBvbGljeSdcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuaW5pdFRvcG9WaWV3KCk7XG4gICAgICAgICAgICB0aGlzLmJhc2VOZXR3b3JrR3JhcGggPSBfLmNsb25lRGVlcCh0aGlzLm5ldHdvcmtHcmFwaCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjphbnkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICAgZmlsbEF1dG9Db21wbGV0ZVRyZWVOb2RlcyhyZXNvdXJjZXNBcnJheSwgYXJyLCB0eXBlTmFtZSkge1xuICAgICByZXNvdXJjZXNBcnJheSAmJiByZXNvdXJjZXNBcnJheS5mb3JFYWNoKCAob2IpID0+IHtcbiAgICAgIGFyci5wdXNoKG9iLm5hbWUpO1xuICAgICB9KTtcbiAgICByZXR1cm4gYXJyO1xuICAgfVxuXG4gIGRlYm91bmNlKGZ1bmMsIHRpbWVvdXQgPSAxNTApe1xuICAgIGxldCB0aW1lcjtcbiAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7IH0sIHRpbWVvdXQpO1xuICAgIH07XG4gIH1cblxuICBud1NlYXJjaENoYW5nZShldmVudCl7XG4gICBpZiAodGhpcy5maWx0ZXJUZXh0Lmxlbmd0aCA+IDEgJiYgZXZlbnQua2V5ICE9PSdFc2NhcGUnICYmIGV2ZW50LmtleSAhPT0gJ0Fycm93UmlnaHQnICYmIGV2ZW50LmtleSAhPT0nQXJyb3dMZWZ0JyAmJiBldmVudC5rZXkgIT09J0VudGVyJykge1xuICAgICB0aGlzLmZpbGVyUmVzcG9uc2VNZXNzYWdlID0gJ3NlYXJjaCBmaWx0ZXIuLic7XG4gICAgIHRoaXMuZGVib3VuY2UodGhpcy5maWx0ZXJTZWFyY2hBcnJheSgpKTtcbiAgIH1cbiAgfVxuXG4gICAgYXV0b2NvbXBsZXRlU2VhcmNoKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IGV2ZW50ID8gZXZlbnQub3B0aW9uLnZhbHVlIDogJyc7XG4gICAgICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VDb25kaXRpb25DaGVjayhzdHIpO1xuICAgIH1cblxuICAgIHJlc291cmNlVHlwZUNoYW5nZWQoKSB7XG4gICAgICAgIHRoaXMuZmlsZXJSZXNwb25zZU1lc3NhZ2UgPSAnc2VhcmNoIGZpbHRlci4uJztcbiAgICAgICAgdGhpcy5zZWFyY2hDYWNoZSA9IFtdO1xuICAgICAgICB0aGlzLnJlc2V0U2VhcmNoTm9kZSgpO1xuICAgICAgICB0aGlzLmNsZWFyU2VhcmNoTGlua0NvbG9ycygpO1xuICAgICAgICBpZiAoXy5pc0VtcHR5KHRoaXMucmVzb3VyY2VUeXBlKSkge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gW107XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoRmlsdGVyKCk7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlVHlwZUVycm9yID0gIV8uaXNFbXB0eSh0aGlzLmZpbHRlclRleHQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyVGV4dCA9ICcnO1xuICAgICAgICB0aGlzLnJlc291cmNlVHlwZUVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9W107XG4gICAgICAgIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2UtcG9saWNpZXMnICYmIHRoaXMuYWxsX3NlcnZpY2VfcG9saWNpZXNfZmV0Y2hlZCkge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5zZXJ2aWNlUG9saWNpZXNUcmVlTm9kZXM7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlcycgJiYgdGhpcy5hbGxfc2VydmljZXNfZmV0Y2hlZCkge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5zZXJ2aWNlc1RyZWVOb2RlcztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ2lkZW50aXRpZXMnICYmIHRoaXMuYWxsX2lkZW50aXRpZXNfZmV0Y2hlZCkge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5pZGVudGl0aWVzVHJlZU5vZGVzO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZWRnZS1yb3V0ZXJzJyAmJiB0aGlzLmFsbF9lZGdlcm91dGVyc19mZXRjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLmVkZ2Vyb3V0ZXJzVHJlZU5vZGVzO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZWRnZS1yb3V0ZXItcG9saWNpZXMnICYmIHRoaXMuYWxsX2VkZ2Vfcm91dGVyX3BvbGljaWVzX2ZldGNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IHRoaXMuZXJQb2xpY2llc1RyZWVOb2RlcztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2UtZWRnZS1yb3V0ZXItcG9saWNpZXMnICYmIHRoaXMuYWxsX3NlcnZpY2Vfcm91dGVyX3BvbGljaWVzX2ZldGNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IHRoaXMuc2VydmljZUVkZ2VSb3V0ZXJQb2xpY3lUcmVlTm9kZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmZpbHRlclRleHQpKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFJlc291cmNlQ29uZGl0aW9uQ2hlY2sodGhpcy5maWx0ZXJUZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlYXJjaFJlc291cmNlQ29uZGl0aW9uQ2hlY2soc2VhcmNoVHh0KSB7XG4gICAgICBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICcnICYmIHNlYXJjaFR4dCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgICB0aGlzLnNlYXJjaFJlc291cmNlSW5UcmVlKHNlYXJjaFR4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2VhcmNoUmVzb3VyY2VJblRyZWUoc2VhcmNoVHh0KSB7XG4gICAgICAgIHRoaXMubm9TZWFyY2hSZXN1bHRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzb3VyY2VUeXBlRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldFRyZWUobnVsbCk7XG4gICAgICAgIGlmIChzZWFyY2hUeHQgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoTGlua0NvbG9ycygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNldFNlYXJjaE5vZGUoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2hMaW5rQ29sb3JzKCk7XG5cbiAgICAgICAgICAgIGxldCBwYXRocyA9IFtdO1xuICAgICAgICAgICAgbGV0IHRhcmdldE5vZGVzID0gW107XG4gICAgICAgICAgICBjb25zdCBub2RlSWRzID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlLXBvbGljaWVzJyAmJiAhdGhpcy5hbGxfc2VydmljZV9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmF3T2IgPSB0aGlzLnNlYXJjaENhY2hlLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gc2VhcmNoVHh0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBpZDphbnkgPSB0aGlzLnRvcG9sb2d5SGVscGVyLmNyZWF0ZVNlcnZpY2VQb2xpY3lOb2RlKHJhd09iKTtcbiAgICAgICAgICAgICAgIC8vIGlkLmNsaWNrUHJvY2VzcyA9IFwiTm90IFlldFwiO1xuICAgICAgICAgICAgICAgIGlmKCF0aGlzLmlzTm9kZUV4aXN0cyh0aGlzLm5vZGVzWzFdLCBpZCkpIHtcbiAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVzWzFdLmRhdGEuY2hpbGRyZW4ucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoID0gZDMuaGllcmFyY2h5KHRoaXMubmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLmNoaWxkcmVuLmZvckVhY2goKG5kLGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmFwaENvbGxhcHNlKG5kKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZV9wb2xpY2llcyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZV9wb2xpY2llc1swXSA9IHJhd09iO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZSh0aGlzLm5vZGVzWzFdKTtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlcyA9IHRoaXMucHJvY2Vzc1NlYXJjaEluUHJlb3JkZXIodGhpcy5ub2Rlc1sxXSwgc2VhcmNoVHh0LCB0YXJnZXROb2Rlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnc2VydmljZS1wb2xpY2llcycgJiYgdGhpcy5hbGxfc2VydmljZV9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZXMgPSB0aGlzLnByb2Nlc3NTZWFyY2hJblByZW9yZGVyKHRoaXMubm9kZXNbMV0sIHNlYXJjaFR4dCwgdGFyZ2V0Tm9kZXMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ2VkZ2Utcm91dGVycycgJiYgIXRoaXMuYWxsX2VkZ2Vyb3V0ZXJzX2ZldGNoZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByYXdPYiA9IHRoaXMuc2VhcmNoQ2FjaGUuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBzZWFyY2hUeHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkOmFueSA9IHRoaXMudG9wb2xvZ3lIZWxwZXIuY3JlYXRlRWRnZVJvdXRlck5vZGUocmF3T2IpO1xuICAgICAgICAgICAgICAgLy8gaWQuY2xpY2tQcm9jZXNzID0gXCJOb3QgWWV0XCI7XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaXNOb2RlRXhpc3RzKHRoaXMubm9kZXNbNF0sIGlkKSkge1xuICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZXNbNF0uZGF0YS5jaGlsZHJlbi5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoID0gZDMuaGllcmFyY2h5KHRoaXMubmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLmNoaWxkcmVuLmZvckVhY2goKG5kLGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gMykge1xuICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmFwaENvbGxhcHNlKG5kKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSApO1xuICAgICAgICAgICAgICAgIHRoaXMuZWRnZXJvdXRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmVkZ2Vyb3V0ZXJzWzBdID0gcmF3T2I7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubm9kZXNbNF0pO1xuXG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZXMgPSB0aGlzLnByb2Nlc3NTZWFyY2hJblByZW9yZGVyKHRoaXMubm9kZXNbNF0sIHNlYXJjaFR4dCwgdGFyZ2V0Tm9kZXMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ2VkZ2Utcm91dGVycycgJiYgdGhpcy5hbGxfZWRnZXJvdXRlcnNfZmV0Y2hlZCkge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVzID0gdGhpcy5wcm9jZXNzU2VhcmNoSW5QcmVvcmRlcih0aGlzLm5vZGVzWzRdLCBzZWFyY2hUeHQsIHRhcmdldE5vZGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlcycgJiYgIXRoaXMuYWxsX3NlcnZpY2VzX2ZldGNoZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByYXdPYiA9IHRoaXMuc2VhcmNoQ2FjaGUuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBzZWFyY2hUeHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkOmFueSA9IHRoaXMudG9wb2xvZ3lIZWxwZXIuY3JlYXRlU2VydmljZU5vZGUocmF3T2IpO1xuICAgICAgICAgICAgICAgIGlkLmNsaWNrUHJvY2VzcyA9IFwiTm90IFlldFwiO1xuICAgICAgICAgICAgICAgIGlmKCF0aGlzLmlzTm9kZUV4aXN0cyh0aGlzLm5vZGVzWzJdLCBpZCkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMubm9kZXNbMl0uZGF0YS5jaGlsZHJlbi5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoID0gZDMuaGllcmFyY2h5KHRoaXMubmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzWzBdID0gcmF3T2I7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubm9kZXNbMl0pO1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVzID0gdGhpcy5wcm9jZXNzU2VhcmNoSW5QcmVvcmRlcih0aGlzLm5vZGVzWzJdLCBzZWFyY2hUeHQsIHRhcmdldE5vZGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbi5mb3JFYWNoKChuZCxpKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIGkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmFwaENvbGxhcHNlKG5kKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9ICk7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlcycgJiYgdGhpcy5hbGxfc2VydmljZXNfZmV0Y2hlZCkge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVzID0gdGhpcy5wcm9jZXNzU2VhcmNoSW5QcmVvcmRlcih0aGlzLm5vZGVzWzJdLCBzZWFyY2hUeHQsIHRhcmdldE5vZGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdpZGVudGl0aWVzJyAmJiAhdGhpcy5hbGxfaWRlbnRpdGllc19mZXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmF3T2IgPSB0aGlzLnNlYXJjaENhY2hlLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gc2VhcmNoVHh0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBpZDphbnkgPSB0aGlzLnRvcG9sb2d5SGVscGVyLmNyZWF0ZUlkZW50aXR5Tm9kZShyYXdPYik7XG4gICAgICAgICAgICAgICAgaWQuY2xpY2tQcm9jZXNzID0gXCJOb3QgWWV0XCI7XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaXNOb2RlRXhpc3RzKHRoaXMubm9kZXNbM10sIGlkKSkge1xuICAgICAgICAgICAgICAgICB0aGlzLm5vZGVzWzNdLmRhdGEuY2hpbGRyZW4ucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoID0gZDMuaGllcmFyY2h5KHRoaXMubmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pZGVudGl0aWVzWzBdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5pZGVudGl0aWVzWzBdID0gcmF3T2I7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubm9kZXNbM10pO1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVzID0gdGhpcy5wcm9jZXNzU2VhcmNoSW5QcmVvcmRlcih0aGlzLm5vZGVzWzNdLCBzZWFyY2hUeHQsIHRhcmdldE5vZGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbi5mb3JFYWNoKChuZCxpKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gMikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyYXBoQ29sbGFwc2UobmQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdpZGVudGl0aWVzJyAmJiB0aGlzLmFsbF9pZGVudGl0aWVzX2ZldGNoZWQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlcyA9IHRoaXMucHJvY2Vzc1NlYXJjaEluUHJlb3JkZXIodGhpcy5ub2Rlc1szXSwgc2VhcmNoVHh0LCB0YXJnZXROb2Rlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZWRnZS1yb3V0ZXItcG9saWNpZXMnICYmICF0aGlzLmFsbF9lZGdlX3JvdXRlcl9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgICAgICBjb25zdCByYXdPYiA9IHRoaXMuc2VhcmNoQ2FjaGUuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBzZWFyY2hUeHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkOmFueSA9IHRoaXMudG9wb2xvZ3lIZWxwZXIuY3JlYXRlRWRnZVJvdXRlclBvbGljeU5vZGUocmF3T2IpO1xuICAgICAgICAgICAgICAgIGlkLmNsaWNrUHJvY2VzcyA9IFwiTm90IFlldFwiO1xuXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaXNOb2RlRXhpc3RzKHRoaXMubm9kZXNbNV0sIGlkKSkge1xuICAgICAgICAgICAgICAgICB0aGlzLm5vZGVzWzVdLmRhdGEuY2hpbGRyZW4ucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCA9IGQzLmhpZXJhcmNoeSh0aGlzLm5ldHdvcmtHcmFwaC5kYXRhLCBmdW5jdGlvbiAobmQpIHtcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZC5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbi5mb3JFYWNoKChuZCxpKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gNCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyYXBoQ29sbGFwc2UobmQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbi5mb3JFYWNoKG5kID0+IHRoaXMuZ3JhcGhDb2xsYXBzZShuZCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZWRnZV9yb3V0ZXJfcG9saWNpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmVkZ2Vfcm91dGVyX3BvbGljaWVzWzBdID0gcmF3T2I7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubm9kZXNbNV0pO1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVzID0gdGhpcy5wcm9jZXNzU2VhcmNoSW5QcmVvcmRlcih0aGlzLm5vZGVzWzVdLCBzZWFyY2hUeHQsIHRhcmdldE5vZGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdlZGdlLXJvdXRlci1wb2xpY2llcycgJiYgdGhpcy5hbGxfZWRnZV9yb3V0ZXJfcG9saWNpZXNfZmV0Y2hlZCkge1xuICAgICAgICAgICAgICAgICB0YXJnZXROb2RlcyA9IHRoaXMucHJvY2Vzc1NlYXJjaEluUHJlb3JkZXIodGhpcy5ub2Rlc1s1XSwgc2VhcmNoVHh0LCB0YXJnZXROb2Rlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnc2VydmljZS1lZGdlLXJvdXRlci1wb2xpY2llcycgJiYgIXRoaXMuYWxsX3NlcnZpY2Vfcm91dGVyX3BvbGljaWVzX2ZldGNoZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByYXdPYiA9IHRoaXMuc2VhcmNoQ2FjaGUuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBzZWFyY2hUeHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkOmFueSA9IHRoaXMudG9wb2xvZ3lIZWxwZXIuY3JlYXRlU2VydmljZUVkZ2VSb3V0ZXJQb2xpY3lOb2RlKHJhd09iKTtcbiAgICAgICAgICAgICAgICBpZC5jbGlja1Byb2Nlc3MgPSBcIk5vdCBZZXRcIjtcbiAgICAgICAgICAgICAgICBpZighdGhpcy5pc05vZGVFeGlzdHModGhpcy5ub2Rlc1s2XSwgaWQpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm5vZGVzWzZdLmRhdGEuY2hpbGRyZW4ucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoID0gZDMuaGllcmFyY2h5KHRoaXMubmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLmNoaWxkcmVuLmZvckVhY2goKG5kLGkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChpICE9PSA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JhcGhDb2xsYXBzZShuZCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZV9yb3V0ZXJfcG9saWNpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2Vfcm91dGVyX3BvbGljaWVzWzBdID0gcmF3T2I7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubm9kZXNbNl0pO1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVzID0gdGhpcy5wcm9jZXNzU2VhcmNoSW5QcmVvcmRlcih0aGlzLm5vZGVzWzZdLCBzZWFyY2hUeHQsIHRhcmdldE5vZGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzJyAmJiB0aGlzLmFsbF9zZXJ2aWNlX3JvdXRlcl9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgIHRhcmdldE5vZGVzID0gdGhpcy5wcm9jZXNzU2VhcmNoSW5QcmVvcmRlcih0aGlzLm5vZGVzWzZdLCBzZWFyY2hUeHQsIHRhcmdldE5vZGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaXMubmV0d29ya0dyYXBoLmNoaWxkcmVuLmZvckVhY2gobmQgPT4gdGhpcy5ncmFwaENvbGxhcHNlKG5kKSk7XG4gICAgICAgICAgICBwYXRocyA9IHRoaXMuZXhwbG9yZVBhdGhzRm9yU2VhcmNoZWROb2Rlcyh0YXJnZXROb2RlcywgcGF0aHMsIG5vZGVJZHMpO1xuICAgICAgICAgICAgaWYgKHRhcmdldE5vZGVzICYmIHRhcmdldE5vZGVzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub1NlYXJjaFJlc3VsdHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2hMaW5rQ29sb3JzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlblBhdGhzKHBhdGhzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGQzLnNlbGVjdEFsbCgnY2lyY2xlJykuZmlsdGVyKGZ1bmN0aW9uIChkOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YU5hbWUgPSBfLmdldChkLCAnZGF0YS5uYW1lJywgJycpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBkYXRhSWQgPSBfLmdldChkLCAnZGF0YS5pZCcsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBfLmdldCh0YXJnZXROb2Rlc1swXSwgJ2RhdGEubmFtZScsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHNlYXJjaFR4dC50b0xvd2VyQ2FzZSgpICYmIG5vZGVOYW1lID09PSBkYXRhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCdmaWxsJywgJyNhNjAzMDMnKTsgLy8jMDA0NDQ3LCA0NzAwMDBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc05vZGVFeGlzdHMocm9vdE5vZGU6YW55LCBpZCkge1xuICAgICByZXR1cm4gcm9vdE5vZGUuZGF0YS5jaGlsZHJlbi5maW5kKCAobmQpID0+IG5kLnV1aWQgPT09aWQudXVpZCApO1xuICAgIH1cblxuICAgIGV4cGxvcmVQYXRoc0ZvclNlYXJjaGVkTm9kZXModGFyZ2V0Tm9kZXMsIHBhdGhzLCBub2RlSWRzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgdGFyZ2V0Tm9kZXMgJiYgaSA8IHRhcmdldE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICBsZXQgbmQgPSB0YXJnZXROb2Rlc1tpXTtcbiAgICAgICAgICAgcGF0aHMucHVzaChuZCk7XG4gICAgICAgICB3aGlsZSAobmQucGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBub2RlSWQgPSBfLmdldChuZC5wYXJlbnQsICdkYXRhLmlkJyk7XG4gICAgICAgICAgICBpZiAobm9kZUlkcy5pbmRleE9mKG5vZGVJZCkgPCAwKSB7XG4gICAgICAgICAgICAgICBub2RlSWRzLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgICAgIHBhdGhzLnB1c2gobmQucGFyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5kID0gbmQucGFyZW50O1xuICAgICAgICAgfVxuICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aHM7XG4gICAgfVxuXG4gICAgcHJvY2Vzc1NlYXJjaEluUHJlb3JkZXIobm9kZU9iaiwgc2VhcmNoVHh0LCB0YXJnZXROb2Rlcykge1xuICAgICAgICBjb25zdCBuYW1lID0gXy5nZXQobm9kZU9iaiwgJ2RhdGEubmFtZScpO1xuICAgICAgICAvLyBjb25zdCBub2RlSWQgPSBfLmdldChub2RlT2JqLCAnZGF0YS5pZCcpO1xuICAgICAgICBjb25zdCBpc1Jvb3ROb2RlID0gXy5nZXQobm9kZU9iaiwgJ2RhdGEucm9vdE5vZGUnKTtcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUm9vdE5vZGUgJiYgaXNSb290Tm9kZSA9PT0gJ1llcycgJiYgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBzZWFyY2hUeHQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgdGFyZ2V0Tm9kZXMucHVzaChub2RlT2JqKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gbm9kZU9iai5jaGlsZHJlbiA/IG5vZGVPYmouY2hpbGRyZW4gOiBub2RlT2JqLl9jaGlsZHJlbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGNoaWxkTm9kZXMgJiYgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1NlYXJjaEluUHJlb3JkZXIoY2hpbGROb2Rlc1tpXSwgc2VhcmNoVHh0LCB0YXJnZXROb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldE5vZGVzO1xuICAgIH1cblxuICAgIGNsZWFyU2VhcmNoTGlua0NvbG9ycygpIHtcbiAgICAgICAgdGhpcy5zdmcuc2VsZWN0QWxsKCdwYXRoLmxpbmsnKS5lYWNoKCBmdW5jdGlvbiAodGhpczogYW55LCAgZDphbnkpIHtcbiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnc3Ryb2tlJywgJ3doaXRlJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN2Zy5zZWxlY3RBbGwoJ2NpcmNsZScpLnN0eWxlKCdmaWxsJywgZnVuY3Rpb24gKGQ6YW55KSB7XG4gICAgICAgICAgICByZXR1cm4gZC5fY2hpbGRyZW4gPyAndmFyKC0tdGFibGVUZXh0KScgOiAnI2ZmZic7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9wZW5QYXRocyhwYXRocywgZG9SZXNldCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHBhdGhJZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHBhdGhzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBsID0gcGF0aHNbaV07XG4gICAgICAgICAgICBpZiAodGhpcy5vcGVuTm9kZXMuaW5kZXhPZihsLmRhdGEuaWQpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3Blbk5vZGVzLnB1c2gobC5kYXRhLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXhwYW5kKHBhdGhzW2ldKTtcbiAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShsLCBkb1Jlc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGhJZHMucHVzaChsLmRhdGEuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHBhdGhJZHMucHVzaChwYXRoc1sxXS5kYXRhLmlkKTtcbiAgICAgICAgcGF0aElkcy5wdXNoKHBhdGhzWzBdLmRhdGEuaWQpO1xuXG4gICAgICAgIGxldCBjaGlsZHJlbmcgPSBudWxsOyAvLyBnZXQgMm5kIGxldmVsIGRhdGEgbm9kZXMuXG4gICAgICAgIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2UtcG9saWNpZXMnKSB7XG4gICAgICAgICAgICBjaGlsZHJlbmcgPSB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlblswXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2VzJykge1xuICAgICAgICAgICAgY2hpbGRyZW5nID0gdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW5bMV07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdpZGVudGl0aWVzJykge1xuICAgICAgICAgICAgY2hpbGRyZW5nID0gdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW5bMl07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdlZGdlLXJvdXRlcnMnKSB7XG4gICAgICAgICAgICBjaGlsZHJlbmcgPSB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlblszXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ2VkZ2Utcm91dGVyLXBvbGljaWVzJykge1xuICAgICAgICAgICAgY2hpbGRyZW5nID0gdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW5bNF07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzJykge1xuICAgICAgICAgICAgY2hpbGRyZW5nID0gdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW5bNV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmRkX2NoaWxkcyA9IGNoaWxkcmVuZy5jaGlsZHJlbiA/IGNoaWxkcmVuZy5jaGlsZHJlbiA6IGNoaWxkcmVuZy5fY2hpbGRyZW47IC8vIDJuZCBsZXZlbCBjaGFpbGRzLiBncm91cHMvY2hpbGRyZW5zXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmRkX2NoaWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gMnN0IGxldmVsXG4gICAgICAgICAgICAvLyAgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZW5kcG9pbnRzJyB8fCB0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2VzJykge1xuICAgICAgICAgICAgaWYgKG5kZF9jaGlsZHNbaV0uZGF0YS50eXBlID09PSAnR3JvdXAnKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBncm91cHNcbiAgICAgICAgICAgICAgICBjb25zdCBkMSA9IG5kZF9jaGlsZHNbaV07IC8vZ2V0IGdyb3VwXG4gICAgICAgICAgICAgICAgaWYgKGQxICYmIHBhdGhzWzFdLmRhdGEuaWQgPT09IGQxLmRhdGEuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4wID0gZDEuY2hpbGRyZW4gPyBkMS5jaGlsZHJlbiA6IGQxLl9jaGlsZHJlbjsgLy8gM3JkIGxldmVsIGNoaWxkc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSBjaGlsZHJlbjAuZmlsdGVyKGZ1bmN0aW9uIChyZXBsT2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsT2IuZGF0YS5pZCA9PT0gcGF0aHNbMF0uZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGQxLmNoaWxkcmVuID0gYXJyO1xuICAgICAgICAgICAgICAgICAgICBkMS5fY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJncnAgPSBuZGRfY2hpbGRzLmZpbHRlcihmdW5jdGlvbiAocmVwbE9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxPYmouZGF0YS5pZCA9PT0gZDEuZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuZy5jaGlsZHJlbiA9IGFycmdycDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubmV0d29ya0dyYXBoLCBkb1Jlc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5nLmRhdGEuaWQgPT09IHBhdGhzWzFdLmRhdGEuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyID0gbmRkX2NoaWxkcy5maWx0ZXIoZnVuY3Rpb24gKHJlcGxPYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxPYi5kYXRhLmlkID09PSBwYXRoc1swXS5kYXRhLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5nLmNoaWxkcmVuID0gYXJyO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbmcuX2NoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubmV0d29ya0dyYXBoLCBkb1Jlc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBkYXRhbm9kZXMgPSBudWxsOyAvLyBnZXQgMm5kIGxldmVsIGRhdGEgbm9kZXMuXG4gICAgICAgIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2UtcG9saWNpZXMnKSB7XG4gICAgICAgICAgICBkYXRhbm9kZXMgPSB0aGlzLm5ldHdvcmtHcmFwaC5kYXRhLmNoaWxkcmVuWzBdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnc2VydmljZXMnKSB7XG4gICAgICAgICAgICBkYXRhbm9kZXMgPSB0aGlzLm5ldHdvcmtHcmFwaC5kYXRhLmNoaWxkcmVuWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnaWRlbnRpdGllcycpIHtcbiAgICAgICAgICAgIGRhdGFub2RlcyA9IHRoaXMubmV0d29ya0dyYXBoLmRhdGEuY2hpbGRyZW5bMl07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdlZGdlLXJvdXRlcnMnKSB7XG4gICAgICAgICAgICBkYXRhbm9kZXMgPSB0aGlzLm5ldHdvcmtHcmFwaC5kYXRhLmNoaWxkcmVuWzNdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZWRnZS1yb3V0ZXItcG9saWNpZXMnKSB7XG4gICAgICAgICAgICBkYXRhbm9kZXMgPSB0aGlzLm5ldHdvcmtHcmFwaC5kYXRhLmNoaWxkcmVuWzRdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnc2VydmljZS1lZGdlLXJvdXRlci1wb2xpY2llcycpIHtcbiAgICAgICAgICAgIGRhdGFub2RlcyA9IHRoaXMubmV0d29ya0dyYXBoLmRhdGEuY2hpbGRyZW5bNV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGFub2Rlcy5pZCA9PT0gcGF0aHNbMV0uZGF0YS5pZCkge1xuICAgICAgICAgICAgY29uc3QgYXJyID0gZGF0YW5vZGVzLmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAocmVwbE9iKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxPYi5pZCA9PT0gcGF0aHNbMF0uZGF0YS5pZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGF0YW5vZGVzLmNoaWxkcmVuID0gYXJyO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubmV0d29ya0dyYXBoLCBkb1Jlc2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwTm9kZXMgPSBkYXRhbm9kZXMuY2hpbGRyZW47XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGdyb3VwTm9kZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBOb2Rlc1trXS5pZCA9PT0gcGF0aHNbMV0uZGF0YS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBzZWFyY2hlZCBncm91cCBub2RlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IGdyb3VwTm9kZXNba10uY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChyZXBsT2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsT2IuaWQgPT09IHBhdGhzWzBdLmRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBncm91cE5vZGVzW2tdLmNoaWxkcmVuID0gYXJyO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJncnAgPSBncm91cE5vZGVzLmZpbHRlcihmdW5jdGlvbiAocmVwbE9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxPYmouaWQgPT09IHBhdGhzWzFdLmRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBkYXRhbm9kZXMuY2hpbGRyZW4gPSBhcnJncnA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZSh0aGlzLm5ldHdvcmtHcmFwaCwgZG9SZXNldCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlVHJlZSh0aGlzLm5ldHdvcmtHcmFwaCwgZG9SZXNldCk7XG4gICAgICAgIHRoaXMuc2VhcmNoUm9vdE5vZGUgPSBwYXRoc1sxXTtcblxuICAgICAgICB0aGlzLnN2Zy5zZWxlY3RBbGwoJy5saW5rJykuZWFjaChmdW5jdGlvbiAodGhpczphbnksIGQ6YW55KSB7XG4gICAgICAgICAgICBpZiAocGF0aElkcy5pbmRleE9mKGQuZGF0YS5pZCkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnc3Ryb2tlJywgJ3JlZCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoJ3N0cm9rZScsICd3aGl0ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldFNlYXJjaE5vZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFJvb3ROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCA9IF8uY2xvbmVEZWVwKHRoaXMuYmFzZU5ldHdvcmtHcmFwaCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRyZWUodGhpcy5uZXR3b3JrR3JhcGgsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRUcmVlKGNsZWFyU2VhcmNoKSB7XG4gICAgICAgIHRoaXMucmVzZXRTZWFyY2hOb2RlKCk7XG4gICAgICAgIGlmIChjbGVhclNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaEZpbHRlcigpO1xuICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaFR5cGUoKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5vcGVuTm9kZXMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgZCA9IHRoaXMub3Blbk5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKGQgJiYgZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuID0gZC5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBkLmNoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRyZWUoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubm9kZXMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgZCA9IHRoaXMubm9kZXNbaV07XG4gICAgICAgICAgICBpZiAoZCAmJiBkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZC5fY2hpbGRyZW4gPSBkLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGQuY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWFyY2hMaW5rQ29sb3JzKCk7XG4gICAgICAgIHRoaXMub3Blbk5vZGVzID0gW107XG4gICAgICAgIHRoaXMuc2l6ZVRvRml0KCk7XG4gICAgICAgIHRoaXMucmVzZXRab29tKCk7XG4gICAgfVxuICAgIGV4cGFuZChkKSB7XG4gICAgICAgIGlmIChkLl9jaGlsZHJlbikge1xuICAgICAgICAgICAgZC5jaGlsZHJlbiA9IGQuX2NoaWxkcmVuO1xuICAgICAgICAgICAgZC5fY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29sbGFwc2UoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZW5Ob2Rlcy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBkID0gdGhpcy5ub2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZC5fY2hpbGRyZW4gPSBkLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGQuY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgIGZpbmRNb2RlbE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlO1xuICAgfVxuICAgYXN5bmMgc2VhcmNoT2JqZWN0c1VzaW5nQXBpKCkge1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBtb2RlbF9uYW1lID0gdGhpcy5maW5kTW9kZWxOYW1lKCk7XG4gICAgICAgICAgdGhpcy5zZWFyY2hXb3JkID0gXy5jbG9uZSh0aGlzLmZpbHRlclRleHQpO1xuICAgICAgICAgIGNvbnN0IHN0ciA9IGAke3RoaXMucmVzb3VyY2VUeXBlfT9maWx0ZXI9JTIwbmFtZSUyMGNvbnRhaW5zJTIwJTIyJHt0aGlzLnNlYXJjaFdvcmR9JTIyJmxpbWl0PTUmb2Zmc2V0PTAmc29ydD1uYW1lJTIwJTIwYXNjYDtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgIC5jYWxsKHN0cilcbiAgICAgICAgICAudGhlbigocmVzdWx0OmFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hDYWNoZSA9IHJlc3VsdC5kYXRhO1xuICAgICAgICAgICByZXN1bHQuZGF0YS5mb3JFYWNoKCAocmVzKSA9PiB7XG4gICAgICAgICAgICAvKiBjb25zdCBvYmo6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAgICBpZDogcmVzLmlkLFxuICAgICAgICAgICAgICAgbmFtZTogcmVzLm5hbWUsXG4gICAgICAgICAgICAgfTsgKi9cbiAgICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMucHVzaChyZXMubmFtZSk7XG4gICAgICAgICAgIH0gKTtcbiAgICAgICAgICAgdGhpcy5ub1NlYXJjaFJlc3VsdHMgPSB0cnVlO1xuICAgICAgICAgICBjb25zdCBjb3VudEEgPSAgcmVzdWx0LmRhdGE/Lmxlbmd0aCA+IDA/IHJlc3VsdC5kYXRhLmxlbmd0aCA6IDA7XG4gICAgICAgICAgIHRoaXMuZmlsZXJSZXNwb25zZU1lc3NhZ2UgPSBcInNlYXJjaCB3b3JkOidcIisgdGhpcy5zZWFyY2hXb3JkICtcIicsICByZXN1bHQ6IHRvcCBcIisgY291bnRBICtcIiBvZiAgXCIrcmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50ICtcIiByZWNvcmRzXCI7XG4gICAgICAgICAgfSkuY2F0Y2goIChlcnJvcikgPT4ge1xuICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgfSk7XG5cbiAgIH1cblxuICAgZmlsdGVyU2VhcmNoQXJyYXkoKSB7XG4gICAgICAgIGlmIChfLmlzRW1wdHkodGhpcy5yZXNvdXJjZVR5cGUpKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlRXJyb3IgPSAhXy5pc0VtcHR5KHRoaXMuZmlsdGVyVGV4dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnc2VydmljZS1wb2xpY2llcycgJiYgdGhpcy5hbGxfc2VydmljZV9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLnNlcnZpY2VQb2xpY2llc1RyZWVOb2Rlcy5maWx0ZXIoKG9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICBvcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlLXBvbGljaWVzJyAmJiAhdGhpcy5hbGxfc2VydmljZV9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgIHRoaXMuc2VhcmNoT2JqZWN0c1VzaW5nQXBpKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlcycgICYmIHRoaXMuYWxsX3NlcnZpY2VzX2ZldGNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IHRoaXMuc2VydmljZXNUcmVlTm9kZXMuZmlsdGVyKChvcHRpb24pID0+XG4gICAgICAgICAgICAgICAgb3B0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5maWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnc2VydmljZXMnICAmJiAhdGhpcy5hbGxfc2VydmljZXNfZmV0Y2hlZCkge1xuICAgICAgICAgICB0aGlzLnNlYXJjaE9iamVjdHNVc2luZ0FwaSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnaWRlbnRpdGllcycgJiYgdGhpcy5hbGxfaWRlbnRpdGllc19mZXRjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLmlkZW50aXRpZXNUcmVlTm9kZXMuZmlsdGVyKChvcHRpb24pID0+XG4gICAgICAgICAgICAgICAgb3B0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5maWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnaWRlbnRpdGllcycgJiYgIXRoaXMuYWxsX2lkZW50aXRpZXNfZmV0Y2hlZCkge1xuICAgICAgICAgICB0aGlzLnNlYXJjaE9iamVjdHNVc2luZ0FwaSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZWRnZS1yb3V0ZXJzJyAmJiB0aGlzLmFsbF9lZGdlcm91dGVyc19mZXRjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLmVkZ2Vyb3V0ZXJzVHJlZU5vZGVzLmZpbHRlcigob3B0aW9uKSA9PlxuICAgICAgICAgICAgICAgIG9wdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyVGV4dC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ2VkZ2Utcm91dGVycycgJiYgIXRoaXMuYWxsX2VkZ2Vyb3V0ZXJzX2ZldGNoZWQpIHtcbiAgICAgICAgICAgdGhpcy5zZWFyY2hPYmplY3RzVXNpbmdBcGkoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ2VkZ2Utcm91dGVyLXBvbGljaWVzJyAmJiB0aGlzLmFsbF9lZGdlX3JvdXRlcl9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLmVyUG9saWNpZXNUcmVlTm9kZXMuZmlsdGVyKChvcHRpb24pID0+XG4gICAgICAgICAgICAgICAgb3B0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5maWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZWRnZS1yb3V0ZXItcG9saWNpZXMnICYmICF0aGlzLmFsbF9lZGdlX3JvdXRlcl9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgIHRoaXMuc2VhcmNoT2JqZWN0c1VzaW5nQXBpKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzJyAmJiB0aGlzLmFsbF9zZXJ2aWNlX3JvdXRlcl9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLnNlcnZpY2VFZGdlUm91dGVyUG9saWN5VHJlZU5vZGVzLmZpbHRlcigob3B0aW9uKSA9PlxuICAgICAgICAgICAgICAgIG9wdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyVGV4dC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2UtZWRnZS1yb3V0ZXItcG9saWNpZXMnICYmICF0aGlzLmFsbF9zZXJ2aWNlX3JvdXRlcl9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgIHRoaXMuc2VhcmNoT2JqZWN0c1VzaW5nQXBpKCk7XG4gICAgICAgIH1cbiAgIH1cbiAgIHpvb21JbigpIHtcblxuICAgfVxuICAgem9vbU91dCgpIHtcblxuICAgfVxuICAgY2xlYXJTZWFyY2hGaWx0ZXIoKSB7XG4gICAgICB0aGlzLmZpbHRlclRleHQgPSAnJztcbiAgICAgIHRoaXMucmVzZXRBdXRvQ29tcGxldGVPcHRpb25zKCk7XG4gICAgICB0aGlzLnJlc291cmNlVHlwZUVycm9yID0gZmFsc2U7XG4gICAgICAvLyB0aGlzLmZpbHRlclNlYXJjaEFycmF5KCk7XG4gICAgICB0aGlzLnJlc2V0U2VhcmNoTm9kZSgpO1xuICAgICAgdGhpcy5jb2xsYXBzZSgpO1xuICAgICAgdGhpcy5jbGVhclNlYXJjaExpbmtDb2xvcnMoKTtcbiAgIH1cblxuICAgcmVzZXRBdXRvQ29tcGxldGVPcHRpb25zKCl7XG4gICAgICB0aGlzLnNlYXJjaENhY2hlID0gW107XG4gICAgICB0aGlzLmZpbGVyUmVzcG9uc2VNZXNzYWdlID0gJ3NlYXJjaCBmaWx0ZXIuLic7XG4gICAgICAgIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2UtcG9saWNpZXMnICYmIHRoaXMuYWxsX3NlcnZpY2VfcG9saWNpZXNfZmV0Y2hlZCkge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5zZXJ2aWNlUG9saWNpZXNUcmVlTm9kZXMuZmlsdGVyKChvcHRpb24pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJUZXh0PT09JycgfHwgb3B0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5maWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnc2VydmljZS1wb2xpY2llcycgJiYgIXRoaXMuYWxsX3NlcnZpY2VfcG9saWNpZXNfZmV0Y2hlZCkge1xuICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSBbXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2VzJyAgJiYgdGhpcy5hbGxfc2VydmljZXNfZmV0Y2hlZCkge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5zZXJ2aWNlc1RyZWVOb2Rlcy5maWx0ZXIoKG9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclRleHQ9PT0nJyB8fCBvcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlcycgICYmICF0aGlzLmFsbF9zZXJ2aWNlc19mZXRjaGVkKSB7XG4gICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnaWRlbnRpdGllcycgJiYgdGhpcy5hbGxfaWRlbnRpdGllc19mZXRjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLmlkZW50aXRpZXNUcmVlTm9kZXMuZmlsdGVyKChvcHRpb24pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJUZXh0PT09JycgfHwgb3B0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5maWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnaWRlbnRpdGllcycgJiYgIXRoaXMuYWxsX2lkZW50aXRpZXNfZmV0Y2hlZCkge1xuICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSBbXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ2VkZ2Utcm91dGVycycgJiYgdGhpcy5hbGxfZWRnZXJvdXRlcnNfZmV0Y2hlZCkge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5lZGdlcm91dGVyc1RyZWVOb2Rlcy5maWx0ZXIoKG9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclRleHQ9PT0nJyB8fCBvcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdlZGdlLXJvdXRlcnMnICYmICF0aGlzLmFsbF9lZGdlcm91dGVyc19mZXRjaGVkKSB7XG4gICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZWRnZS1yb3V0ZXItcG9saWNpZXMnICYmIHRoaXMuYWxsX2VkZ2Vfcm91dGVyX3BvbGljaWVzX2ZldGNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IHRoaXMuZXJQb2xpY2llc1RyZWVOb2Rlcy5maWx0ZXIoKG9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclRleHQ9PT0nJyB8fCBvcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdlZGdlLXJvdXRlci1wb2xpY2llcycgJiYgIXRoaXMuYWxsX2VkZ2Vfcm91dGVyX3BvbGljaWVzX2ZldGNoZWQpIHtcbiAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gW107XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzJyAmJiB0aGlzLmFsbF9zZXJ2aWNlX3JvdXRlcl9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLnNlcnZpY2VFZGdlUm91dGVyUG9saWN5VHJlZU5vZGVzLmZpbHRlcigob3B0aW9uKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyVGV4dD09PScnIHx8IG9wdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyVGV4dC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2UtZWRnZS1yb3V0ZXItcG9saWNpZXMnICYmICF0aGlzLmFsbF9zZXJ2aWNlX3JvdXRlcl9wb2xpY2llc19mZXRjaGVkKSB7XG4gICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xuICAgICAgICB9XG4gICB9XG5cbiAgIGNsZWFyU2VhcmNoVHlwZSgpIHtcbiAgICAgICAgdGhpcy5yZXNvdXJjZVR5cGUgPSAnJztcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gW107XG4gICB9XG5cbiAgIHJlc2V0Wm9vbSgpIHtcbiAgICAgICAvLyBjb25zdCBjdXJyZW50Wm9vbSA9IHRoaXMuZ2V0Wm9vbVNjYWxlKCk7XG4gICAgICAgY29uc3QgdHJhbnNmb3JtOiBhbnkgPSB0aGlzLnRyYW5zZm9ybSB8fCBfLmNsb25lRGVlcChkMy56b29tSWRlbnRpdHkpO1xuICAgICAgIHRyYW5zZm9ybS5rID0gMTtcbiAgICAgICB0aGlzLnN2Zy5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2Zvcm0pO1xuICAgfVxuXG4gIGdyYXBoQ29sbGFwc2UoZCkge1xuICAgICAgIGlmIChkLmRhdGEucm9vdE5vZGUgPT09ICdZZXMnKSB7XG4gICAgICAgICAgIGQuZGF0YS5jbGlja1Byb2Nlc3MgPSAnTm90IFlldCc7XG4gICAgICAgICAgIGQuX2NoaWxkcmVuID0gbnVsbDtcbiAgICAgICB9XG4gICAgICAgaWYgKGQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgZC5fY2hpbGRyZW4gPSBkLmNoaWxkcmVuO1xuICAgICAgICAgICBkLl9jaGlsZHJlbiAmJiBkLl9jaGlsZHJlbj8uZmluZChuZCA9PiB0aGlzLmdyYXBoQ29sbGFwc2UpO1xuICAgICAgICAgICBkLmNoaWxkcmVuID0gbnVsbDtcbiAgICAgICB9XG4gIH1cblxuICBpbml0VG9wb1ZpZXcoKSB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xuICAgICAgICBjb25zdCBtYXJnaW4gPSB7IHRvcDogMjAsIHJpZ2h0OiAxOTAsIGJvdHRvbTogMzAsIGxlZnQ6IDAgfTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCAtICBtYXJnaW4ucmlnaHQ7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIG1hcmdpbi5ib3R0b207XG5cbiAgICAgICAgdGhpcy50cmVldG9vbHRpcCA9IGQzLnNlbGVjdCgnI3Rvb2x0aXAnKTtcblxuICAgICAgICB0aGlzLnJlc291cmNlVHlwZUVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsdGVyVGV4dCA9ICcnO1xuICAgICAgICB0aGlzLnJlc291cmNlVHlwZSA9ICcnO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZVpvb20gPSAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdmcuYXR0cigndHJhbnNmb3JtJywgZS50cmFuc2Zvcm0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnpvb20gPSBkMy56b29tKCkub24oJ3pvb20nLCBoYW5kbGVab29tKTtcblxuICAgICAgICB0aGlzLnN2ZyA9IGQzXG4gICAgICAgICAgICAuc2VsZWN0KCcjTmV0d29ya1Zpc3VhbGl6ZXJTVkcnKVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgICAgICAgIC5jYWxsKHRoaXMuem9vbSlcbiAgICAgICAgICAgIC5hdHRyKCd2aWV3Qm94JywgJy0yMCAtNDUwICcgKyAod2lkdGggLSBtYXJnaW4udG9wKjIgLSBtYXJnaW4uYm90dG9tKSArICcgJyArICsoaGVpZ2h0KjIgLW1hcmdpbi5ib3R0b20pKVxuICAgICAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgLTIwICsgJywnICsgMjAwICsgJyknKTtcblxuICAgICAgICBkMy5zZWxlY3QoJ2JvZHknKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkMy5zZWxlY3QoJyN0b3BvY29udGV4dG1lbnUnKS5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGQzLnNlbGVjdEFsbCgnZyA+IConKS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy50cmVlbWFwID0gZDMudHJlZSgpLm5vZGVTaXplKFs4NSwgNV0pO1xuICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC54ID0gMTAwOyAvLyBoZWlnaHQgLyA0O1xuICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC55ID0gMTAwO1xuICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbi5mb3JFYWNoKGNvbGxhcHNlKTtcbiAgICAgICAvLyB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbi5mb3JFYWNoKCAobmQ6YW55KSA9PiAgdGhpcy5ncmFwaENvbGxhcHNlKG5kKSApO1xuICAgICAgICB0aGlzLnVwZGF0ZVRyZWUodGhpcy5uZXR3b3JrR3JhcGgpO1xuXG4gICAgICAgIF8uZGVsYXkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSBkMy56b29tSWRlbnRpdHk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS54ID0gLTIwMDtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLnkgPSAyMDU7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5rID0gMTtcbiAgICAgICAgICAgIHRoaXMuc3ZnLnRyYW5zaXRpb24oKS5kdXJhdGlvbig3NTApLmF0dHIoJ3RyYW5zZm9ybScsIHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgfSwgNjAwKTtcblxuICAgICAgICBmdW5jdGlvbiBjb2xsYXBzZShkKSB7XG4gICAgICAgICAgICBpZiAoZC5kYXRhLnJvb3ROb2RlID09PSAnWWVzJykge1xuICAgICAgICAgICAgICAgIGQuZGF0YS5jbGlja1Byb2Nlc3MgPSAnTm90IFlldCc7XG4gICAgICAgICAgICAgICAgZC5fY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBkLl9jaGlsZHJlbiA9IGQuY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgZC5fY2hpbGRyZW4uZm9yRWFjaChjb2xsYXBzZSk7XG4gICAgICAgICAgICAgICAgZC5jaGlsZHJlbiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgfVxuXG4gICAgdXBkYXRlVHJlZShzb3VyY2UsIGRvUmVzZXQgPSBmYWxzZSkge1xuICAgICAgICBpZiAoZG9SZXNldCkge1xuICAgICAgICAgICAgZDMuc2VsZWN0QWxsKCdnID4gKicpLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gNzUwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy50cmVlRGF0YSA9IHRoaXMudHJlZW1hcCh0aGlzLm5ldHdvcmtHcmFwaCk7XG4gICAgICAgICAgICB0aGlzLm5vZGVzID0gdGhpcy50cmVlRGF0YS5kZXNjZW5kYW50cygpO1xuICAgICAgICAgICAgdGhpcy5saW5rcyA9IHRoaXMudHJlZURhdGEuZGVzY2VuZGFudHMoKS5zbGljZSgxKTtcbiAgICAgICAgfSBjYXRjaCAoZTphbnkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW4gYnVpbGRpbmcgdHJlZSBvYmplY3Q6ICcrIGUubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3ZnRGVmcyA9IHRoaXMuc3ZnLmFwcGVuZCgnZGVmcycpO1xuICAgICAgICBjb25zdCBsaW5lYXJHcmFkaWVudCA9IHN2Z0RlZnMuYXBwZW5kKCdsaW5lYXJHcmFkaWVudCcpLmF0dHIoJ2lkJywgJ05vZGVHcmFkaWVudCcpO1xuICAgICAgICBsaW5lYXJHcmFkaWVudC5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdjbGFzcycsICdzdG9wMScpLmF0dHIoJ29mZnNldCcsICcwJScpO1xuICAgICAgICBsaW5lYXJHcmFkaWVudC5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdjbGFzcycsICdzdG9wMicpLmF0dHIoJ29mZnNldCcsICc1MCUnKTtcbiAgICAgICAgbGluZWFyR3JhZGllbnQuYXBwZW5kKCdzdG9wJykuYXR0cignY2xhc3MnLCAnc3RvcDMnKS5hdHRyKCdvZmZzZXQnLCAnMTAwJScpO1xuXG4gICAgICAgIGNvbnN0IGxpbmVhckdyYWRpZW50MiA9IHN2Z0RlZnMuYXBwZW5kKCdsaW5lYXJHcmFkaWVudCcpLmF0dHIoJ2lkJywgJ05vZGVIb3ZlckdyYWRpZW50Jyk7XG4gICAgICAgIGxpbmVhckdyYWRpZW50Mi5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdjbGFzcycsICdzdG9wMWEnKS5hdHRyKCdvZmZzZXQnLCAnMCUnKTtcbiAgICAgICAgbGluZWFyR3JhZGllbnQyLmFwcGVuZCgnc3RvcCcpLmF0dHIoJ2NsYXNzJywgJ3N0b3AyYScpLmF0dHIoJ29mZnNldCcsICc1MCUnKTtcbiAgICAgICAgbGluZWFyR3JhZGllbnQyLmFwcGVuZCgnc3RvcCcpLmF0dHIoJ2NsYXNzJywgJ3N0b3AzYScpLmF0dHIoJ29mZnNldCcsICcxMDAlJyk7XG5cbiAgICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICBkLnkgPSBkLmRlcHRoICogNDAwO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5zdmcuc2VsZWN0QWxsKCdnLm5vZGUnKS5kYXRhKHRoaXMubm9kZXMsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICByZXR1cm4gZC5kYXRhLmlkO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm5vZGVFbnRlciA9IHRoaXMubm9kZVxuICAgICAgICAgICAgLmVudGVyKClcbiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgKGQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gJyc7XG5cbiAgICAgICAgICAgICAgICBpZiAoXy5zdGFydHNXaXRoKGQuZGF0YS5uYW1lLCAnRWRnZSBSb3V0ZXJzJykgfHwgXy5pbmNsdWRlcyhkLmRhdGEudHlwZSwgJ0VkZ2UgUm91dGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJ2VkZ2Utcm91dGVyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoZC5kYXRhLm5hbWUsICdJZGVudGl0aWVzJykgfHwgXy5pbmNsdWRlcyhkLmRhdGEubmFtZSwgJ0lkZW50aXR5JykgfHwgXy5pbmNsdWRlcyhkLmRhdGEubmFtZSwgJ0Fzc29jaWF0ZWQgSWRlbnRpdGllcycpIHx8IF8uaW5jbHVkZXMoZC5kYXRhLnR5cGUsICdJZGVudGl0eScpIHx8IF8uaW5jbHVkZXMoZC5kYXRhLnR5cGUsICdCcm93WmVyIElkZW50aXR5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJ2VuZHBvaW50JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF8uc3RhcnRzV2l0aChkLmRhdGEubmFtZSwgJ1NlcnZpY2VzJykgfHwgXy5zdGFydHNXaXRoKGQuZGF0YS50eXBlLCAnU2VydmljZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdzZXJ2aWNlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF8uc3RhcnRzV2l0aChkLmRhdGEubmFtZSwgJ0JpbmQtU2VydmljZXMnKSB8fCBfLnN0YXJ0c1dpdGgoZC5kYXRhLm5hbWUsICdEaWFsLVNlcnZpY2VzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJ3NlcnZpY2UnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXy5zdGFydHNXaXRoKGQuZGF0YS5uYW1lLCAnQmluZC1Qb2xpY2llcycpIHx8IF8uc3RhcnRzV2l0aChkLmRhdGEubmFtZSwgJ0RpYWwtUG9saWNpZXMnKSB8fCBfLnN0YXJ0c1dpdGgoZC5kYXRhLm5hbWUsICdCaW5kIFBvbGljeScpICkge1xuICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJ3NlcnZpY2UtcG9saWN5JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoZC5kYXRhLm5hbWUsICdTZXJ2aWNlIFBvbGljaWVzJykgfHwgXy5pbmNsdWRlcyhkLmRhdGEudHlwZSwgJ1NlcnZpY2UgUG9saWN5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJ3NlcnZpY2UtcG9saWN5JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF8uc3RhcnRzV2l0aChkLmRhdGEubmFtZSwgJ0VkZ2UgUm91dGVyIFBvbGljaWVzJykgfHwgXy5zdGFydHNXaXRoKGQuZGF0YS50eXBlLCAnRWRnZSBSb3V0ZXIgUG9saWN5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJ2VkZ2Utcm91dGVyLXBvbGljeSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgXy5zdGFydHNXaXRoKGQuZGF0YS5uYW1lLCAnU2VydmljZSBFZGdlIFJvdXRlciBQb2xpY2llcycpIHx8XG4gICAgICAgICAgICAgICAgICAgIF8uc3RhcnRzV2l0aChkLmRhdGEudHlwZSwgJ1NlcnZpY2UgUm91dGVyIFBvbGljeScpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljeSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gZC5fY2hpbGRyZW4gPyAnbm9kZSAnICsgY2xhc3NOYW1lIDogJ25vZGUgdGVybWluYXRlICcgKyBjbGFzc05hbWU7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgJiYgc291cmNlLngpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIHNvdXJjZS55ICsgJywnICsgc291cmNlLnggKyAnKSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIGQueSArICcsJyArIGQueCArICcpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm5vZGVFbnRlci5vbignY29udGV4dG1lbnUnLCAoZXZlbnQsIGQpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBkMy5zZWxlY3QoJyN0b29sdGlwJykuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgY29uc3QgbncgPSB0aGlzLmN1cnJlbnROZXR3b3JrO1xuICAgICAgICAgICAgY29uc3QgcmF3RWRnZXJvdXRlcnMgPSB0aGlzLmVkZ2Vyb3V0ZXJzO1xuICAgICAgICAgICAgY29uc3QgcmF3RW5kcG9pbnRzID0gdGhpcy5pZGVudGl0aWVzO1xuICAgICAgICAgICAgY29uc3QgcmF3QXBwd2FucyA9IHRoaXMuc2VydmljZV9wb2xpY2llcztcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VSb3V0ZXJQb2xpY2llcyA9IHRoaXMuZWRnZV9yb3V0ZXJfcG9saWNpZXM7XG5cbiAgICAgICAgICAgIGlmIChkICYmIGQuZGF0YSAmJiBkLmRhdGEuY29udGV4dE1lbnUgPT09ICdZZXMnKSB7XG4gICAgICAgICAgICAgICAgZDMuc2VsZWN0KCcjdG9wb2NvbnRleHRtZW51JylcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnbGVmdCcsIGV2ZW50Lm9mZnNldFggKyAncHgnKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3RvcCcsIGV2ZW50Lm9mZnNldFkgKyAncHgnKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9iaiA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZCAmJiBkLmRhdGEgJiYgKGQuZGF0YS50eXBlID09PSAnSWRlbnRpdHknIHx8IGQuZGF0YS50eXBlID09PSAnQnJvd1plciBJZGVudGl0eScgKSApIHtcbiAgICAgICAgICAgICAgIGlmKGQuZGF0YS5zdGF0dXMgPT09IFwiUmVnaXN0ZXJlZFwiKSB7XG4gICAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpU2luZ2xlVVQnKTtcbiAgICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlGTFNpbmdsZVJvdXRlcicpO1xuICAgICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaVNpbmdsZUxUJyk7XG4gICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlTaW5nbGVVVCcpO1xuICAgICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTFNpbmdsZVJvdXRlcicpO1xuICAgICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlTaW5nbGVMVCcpO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlNZXQnKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpVkMnKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpRVYnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUlucycpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpQUwnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUVQcycpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRkxBbGwnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUZMU2luZ2xlUm91dGVyJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlTaW5nbGVMVCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpQ0wnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUxUJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRtZW51Tm9kZVR5cGUgPSAnaWRlbnRpdHknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkICYmIGQuZGF0YSAmJiBkLmRhdGEudHlwZSA9PT0gJ0VkZ2UgUm91dGVyJykge1xuICAgICAgICAgICAgICBpZihkLmRhdGEuc3RhdHVzID09PSBcIlBST1ZJU0lPTkVEXCIpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpU2luZ2xlVVQnKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpRkxTaW5nbGVSb3V0ZXInKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpU2luZ2xlTFQnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaVNpbmdsZVVUJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTFNpbmdsZVJvdXRlcicpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpU2luZ2xlTFQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaU1ldCcpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlWQycpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpSW5zJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlFVicpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlBTCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRVBzJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTEFsbCcpO1xuXG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlDTCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpTFQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRtZW51Tm9kZVR5cGUgPSAnZWRnZS1yb3V0ZXInO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGQgJiYgZC5kYXRhICYmIGQuZGF0YS50eXBlID09PSAnU2VydmljZScpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpTWV0Jyk7XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaVZDJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlJbnMnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUVWJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlBTCcpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlFUHMnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUZMQWxsJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTFNpbmdsZVJvdXRlcicpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpU2luZ2xlTFQnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUNMJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlMVCcpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlTaW5nbGVVVCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dG1lbnVOb2RlVHlwZSA9ICdzZXJ2aWNlJztcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChkICYmIGQuZGF0YSAmJiBkLmRhdGEudHlwZSA9PT0gJ1NlcnZpY2UgUG9saWN5Jykge1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpTWV0Jyk7XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaVZDJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlJbnMnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUVWJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlBTCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRVBzJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTEFsbCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRkxTaW5nbGVSb3V0ZXInKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaVNpbmdsZUxUJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlDTCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpTFQnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaVNpbmdsZVVUJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRtZW51Tm9kZVR5cGUgPSAnc2VydmljZS1wb2xpY3knO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkICYmIGQuZGF0YSAmJiBkLmRhdGEudHlwZSA9PT0gJ0VkZ2UgUm91dGVyIFBvbGljeScpIHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaU1ldCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpSW5zJyk7XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaVZDJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlFVicpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpQUwnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUVQcycpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRkxTaW5nbGVSb3V0ZXInKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaVNpbmdsZUxUJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTEFsbCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpQ0wnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUxUJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlTaW5nbGVVVCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dG1lbnVOb2RlVHlwZSA9ICdyb3V0ZXItcG9saWN5JztcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChkICYmIGQuZGF0YSAmJiBkLmRhdGEudHlwZSA9PT0gJ05ldHdvcmsnKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaU1ldCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpSW5zJyk7XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaVZDJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlFVicpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlBTCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRVBzJyk7XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaUZMQWxsJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTFNpbmdsZVJvdXRlcicpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpU2luZ2xlTFQnKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpQ0wnKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpTFQnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaVNpbmdsZVVUJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0bWVudU5vZGVUeXBlID0gJ25ldHdvcmsnO1xuICAgICAgICAgICAgICAgIG9iaiA9IG53O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkICYmIGQuZGF0YSAmJiBkLmRhdGEudHlwZSA9PT0gJ1NlcnZpY2UgUm91dGVyIFBvbGljeScpIHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaU1ldCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpSW5zJyk7XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaVZDJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlFVicpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpQUwnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUVQcycpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRkxBbGwnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUZMU2luZ2xlUm91dGVyJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlTaW5nbGVMVCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpQ0wnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUxUJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlTaW5nbGVVVCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dG1lbnVOb2RlVHlwZSA9ICdzZXJ2aWNlLXJvdXRlci1wb2xpY3knO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRtZW51Tm9kZSA9IG9iajtcbiAgICAgICAgICAgIGQzLnNlbGVjdCgnI3Rvb2x0aXAnKS5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2lyY2xlcyA9IHRoaXMubm9kZUVudGVyXG4gICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ25vZGUnKVxuICAgICAgICAgICAgLmF0dHIoJ3InLCAxMClcbiAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQuX2NoaWxkcmVuID8gJ3ZhcigtLXRhYmxlVGV4dCknIDogJyNmZmYnO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50LCBkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3VHJlZVRvb2x0aXAoZXZlbnQsIGQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCB0aGlzLnJlbW92ZVRyZWVUb29sdGlwKVxuICAgICAgICAgICAgLm9uKCdjb250ZXh0bWVudScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdjbGljaycsIGFzeW5jICggZXZlbnQsIGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgaWYgKGQuZGF0YS5yb290Tm9kZSAmJiBkLmRhdGEucm9vdE5vZGUgPT09ICdZZXMnICYmIGQuZGF0YS5jbGlja1Byb2Nlc3MgPT09ICdOb3QgWWV0Jykge1xuICAgICAgICAgICAgICAgICAgICAgZDMuc2VsZWN0KGV2ZW50LmN1cnJlbnRUYXJnZXQpLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAgIC5kdXJhdGlvbig0MDApXG4gICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKFwiMXN0cm9rZS13aWR0aFwiLCBcIjEwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAgIC5kdXJhdGlvbigxNjAwKVxuICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZShcInN0cm9rZS13aWR0aFwiLCBcIjZcIilcbiAgICAgICAgICAgICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgLmR1cmF0aW9uKDYwMClcbiAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUoXCJzdHJva2Utd2lkdGhcIiwgXCIzXCIpXG4gICAgICAgICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAgIC5kdXJhdGlvbigxNjAwKVxuICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZShcInN0cm9rZS13aWR0aFwiLCBcIjZcIilcbiAgICAgICAgICAgICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgLmR1cmF0aW9uKDYwMClcbiAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUoXCJzdHJva2Utd2lkdGhcIiwgXCI5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAgIC5kdXJhdGlvbigxMDAwKVxuICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZShcInN0cm9rZS13aWR0aFwiLCBcIjEyXCIpO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkICYmIGQuZGF0YSAmJiBkLmRhdGEuY29udGV4dE1lbnUgPT09ICdZZXMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGQzLnNlbGVjdCgnI3RvcG9jb250ZXh0bWVudScpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZDMuc2VsZWN0KCcjdG9vbHRpcCcpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgICBpZiAoZC5jaGlsZHJlbiAmJiBkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm9wZW5Ob2Rlcy5pbmRleE9mKGQuZGF0YS5pZCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5Ob2Rlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuID0gZC5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgZC5jaGlsZHJlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3Blbk5vZGVzLmluZGV4T2YoZC5kYXRhLmlkKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3Blbk5vZGVzLnB1c2goZC5kYXRhLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZC5kYXRhLmNsaWNrUHJvY2VzcyA9PT0gJ05vdCBZZXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJhbnNpdGlvbkxvb3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkLl9jaGlsZHJlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlID09PSAnWWVzJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkLmRhdGEudHlwZSA9PT0gJ0lkZW50aXR5JyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS50eXBlID09PSAnQnJvd1plciBJZGVudGl0eScpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWQuY2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZC5fY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS5jbGlja1Byb2Nlc3MgPSAnQ29tcGxldGVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSAgYXdhaXQgdGhpcy50cmVlTm9kZVByb2Nlc3Nvci5wcm9jZXNzSWRlbnRpdGllc0Zvck5vZGVDbGljayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpdGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmlxSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueml0aVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmlxSWQgPSBhcnJbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGggPSBhcnJbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW4uZmluZCgobmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VGZXcobmQsIHRoaXMub3Blbk5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRyZWUoZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS5yb290Tm9kZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS5yb290Tm9kZSA9PT0gJ1llcycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEudHlwZSA9PT0gJ1NlcnZpY2UnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWQuY2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZC5fY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS5jbGlja1Byb2Nlc3MgPSAnQ29tcGxldGVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSBhd2FpdCB0aGlzLnRyZWVOb2RlUHJvY2Vzc29yLnByb2Nlc3NTZXJ2aWNlc0Zvck5vZGVDbGljayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5pcUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCA9IGFyclsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCA9IGFyclswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbi5maW5kKChuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUZldyhuZCwgdGhpcy5vcGVuTm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlID09PSAnWWVzJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS50eXBlID09PSAnU2VydmljZSBQb2xpY3knICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWQuY2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZC5fY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS5jbGlja1Byb2Nlc3MgPSAnQ29tcGxldGVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSBhd2FpdCB0aGlzLnRyZWVOb2RlUHJvY2Vzc29yLnByb2Nlc3NTZXJ2aWNlUG9saWNpZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VfcG9saWNpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5pcUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCA9IGFyclsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCA9IGFyclswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbi5maW5kKChuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUZldyhuZCwgdGhpcy5vcGVuTm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlID09PSAnWWVzJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS50eXBlID09PSAnRWRnZSBSb3V0ZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWQuY2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZC5fY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLmNsaWNrUHJvY2VzcyA9ICdDb21wbGV0ZWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IGF3YWl0IHRoaXMudHJlZU5vZGVQcm9jZXNzb3IucHJvY2Vzc0VkZ2Vyb3V0ZXJzRm9yTm9kZUNsaWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGdlcm91dGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmlxSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5pcUlkID0gYXJyWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoID0gYXJyWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLmNoaWxkcmVuLmZpbmQoKG5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlRmV3KG5kLCB0aGlzLm9wZW5Ob2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEucm9vdE5vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEucm9vdE5vZGUgPT09ICdZZXMnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnR5cGUgPT09ICdFZGdlIFJvdXRlciBQb2xpY3knICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWQuY2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZC5fY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLmNsaWNrUHJvY2VzcyA9ICdDb21wbGV0ZWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IGF3YWl0IHRoaXMudHJlZU5vZGVQcm9jZXNzb3IucHJvY2Vzc0VkZ2VSb3V0ZXJQb2xpY2llc0Zvck5vZGVDbGljayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRnZV9yb3V0ZXJfcG9saWNpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5pcUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCA9IGFyclsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCA9IGFyclswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbi5maW5kKChuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUZldyhuZCwgdGhpcy5vcGVuTm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlID09PSAnWWVzJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS50eXBlID09PSAnU2VydmljZSBSb3V0ZXIgUG9saWN5JyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkLmNoaWxkcmVuICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWQuX2NoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS5jbGlja1Byb2Nlc3MgPSAnQ29tcGxldGVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSBhd2FpdCB0aGlzLnRyZWVOb2RlUHJvY2Vzc29yLnByb2Nlc3NTZXJ2aWNlRWRnZVJvdXRlclBvbGljaWVzRm9yTm9kZUNsaWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlX3JvdXRlcl9wb2xpY2llcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmlxSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmlxSWQgPSBhcnJbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGggPSBhcnJbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW4uZmluZCgobmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VGZXcobmQsIHRoaXMub3Blbk5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRyZWUoZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuY2hpbGRyZW4gPSBkLl9jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQuY2hpbGRyZW4gPSBkLl9jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZC5fY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkLmNoaWxkcmVuIHx8IGQuX2NoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb290Tm9kZSA9IF8uZ2V0KGQsICdkYXRhLmNoaWxkcmVuWzBdLnJvb3ROb2RlJywgJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YnJvb3ROb2RlID0gXy5nZXQoZCwgJ2RhdGEucm9vdE5vZGUnLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKHJvb3ROb2RlID09PSAnWWVzJyB8fCBzdWJyb290Tm9kZSA9PT0gJ1llcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9vdE5vZGVpc1llc0NvbG9yQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ub2RlRW50ZXJcbiAgICAgICAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsICc1MCcpXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkICYmIGQuZGF0YSAmJiBkLmRhdGEubmFtZS5sZW5ndGggPj0gMjA/ICc1NTAnOiAnMzMwJztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYXR0cigneCcsICcyMCcpXG4gICAgICAgICAgICAuYXR0cigneScsICBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgICByZXR1cm4gZCAmJiBkLmRhdGEgJiYgZC5kYXRhLnJvb3ROb2RlPT09J1llcyc/ICctNSc6ICctNDAnO1xuICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYXBwZW5kKCd4aHRtbDpib2R5JylcbiAgICAgICAgICAgIC5zdHlsZSgnYmFja2dyb3VuZCcsICd0cmFuc3BhcmVudCcpXG4gICAgICAgICAgICAuaHRtbChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cIm5vZGUtdGV4dC1jb250YWluZXJcIj48c3Bhbj4ke2QuZGF0YS5uYW1lfTwvc3Bhbj48L2Rpdj5gO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ub2RlVXBkYXRlID0gdGhpcy5ub2RlRW50ZXIubWVyZ2UodGhpcy5ub2RlKTtcblxuICAgICAgICB0aGlzLm5vZGVVcGRhdGVcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAgIC5kdXJhdGlvbihkdXJhdGlvbilcbiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBkLnkgKyAnLCcgKyBkLnggKyAnKSc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm5vZGVVcGRhdGUuc2VsZWN0KCdjaXJjbGUubm9kZScpLmF0dHIoJ3InLCAxOCkuYXR0cignY3Vyc29yJywgJ3BvaW50ZXInKTtcblxuICAgICAgICB0aGlzLm5vZGVFeGl0ID0gdGhpcy5ub2RlXG4gICAgICAgICAgICAuZXhpdCgpXG4gICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24oZHVyYXRpb24pXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlICYmIHNvdXJjZS54KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBzb3VyY2UueSArICcsJyArIHNvdXJjZS54ICsgJyknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBkLnkgKyAnLCcgKyBkLnggKyAnKSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcblxuICAgICAgICB0aGlzLm5vZGVFeGl0LnNlbGVjdCgnY2lyY2xlJykuYXR0cigncicsIDApO1xuICAgICAgICB0aGlzLm5vZGVFeGl0LnNlbGVjdCgndGV4dCcpLnN0eWxlKCdmaWxsLW9wYWNpdHknLCAxMCk7XG4gICAgICAgIHRoaXMubGluayA9IHRoaXMuc3ZnLnNlbGVjdEFsbCgncGF0aC5saW5rJykuZGF0YSh0aGlzLmxpbmtzLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuZGF0YS5pZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGlua1VwZGF0ZSA9IHRoaXMubGlua1xuICAgICAgICAgICAgLmVudGVyKClcbiAgICAgICAgICAgIC5pbnNlcnQoJ3BhdGgnLCAnZycpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGluaycpXG4gICAgICAgICAgICAuYXR0cignZCcsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgbGV0IG87XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAmJiBzb3VyY2UueCkge1xuICAgICAgICAgICAgICAgICAgICBvID0geyB4OiBzb3VyY2UueCwgeTogc291cmNlLnkgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvID0geyB4OiBkLngsIHk6IGQueSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGlhZ29uYWwobywgbywgJzEnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAubWVyZ2UodGhpcy5saW5rKTtcblxuICAgICAgICB0aGlzLmxpbmtVcGRhdGVcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAgIC5kdXJhdGlvbihkdXJhdGlvbilcbiAgICAgICAgICAgIC5hdHRyKCdkJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlhZ29uYWwoZCwgZC5wYXJlbnQsICcyJyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxpbmtFeGl0ID0gdGhpcy5saW5rXG4gICAgICAgICAgICAuZXhpdCgpXG4gICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24oZHVyYXRpb24pXG4gICAgICAgICAgICAuYXR0cignZCcsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgbGV0IG87XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAmJiBzb3VyY2UueCkge1xuICAgICAgICAgICAgICAgICAgICBvID0geyB4OiBzb3VyY2UueCwgeTogc291cmNlLnkgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvID0geyB4OiBkLngsIHk6IGQueSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGlhZ29uYWwobywgbywgJzMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG5cbiAgICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChkOiBhbnkpIHtcbiAgICAgICAgICAgIGQueDAgPSBkLng7XG4gICAgICAgICAgICBkLnkwID0gZC55O1xuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBkaXNhYmxlTGkobGlJZCkge1xuICAgICAgICAgICAgZDMuc2VsZWN0KGxpSWQpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGVuYWJsZUxpKGxpSWQpIHtcbiAgICAgICAgICAgIGQzLnNlbGVjdChsaUlkKS5zdHlsZSgnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZGlhZ29uYWwocywgZCwgbGcpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBgTSAke3MueX0gJHtzLnh9XG4gICAgICAgICAgICAgQyAkeyhzLnkgKyBkLnkpIC8gMn0gJHtzLnh9LFxuICAgICAgICAgICAgICAgJHsocy55ICsgZC55KSAvIDJ9ICR7ZC54fSxcbiAgICAgICAgICAgICAgICR7ZC55fSAke2QueH1gO1xuXG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHJvb3ROb2RlaXNZZXNDb2xvckNoYW5nZSgpIHtcbiAgICAgICAgICAgIGQzLnNlbGVjdEFsbCgnY2lyY2xlJykuZWFjaChmdW5jdGlvbiAoZDogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9vdE5vZGUgPSBfLmdldChkLCAnZGF0YS5yb290Tm9kZScsICcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGlja1Byb2Nlc3MgPSBfLmdldChkLCAnZGF0YS5jbGlja1Byb2Nlc3MnLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKHJvb3ROb2RlID09PSAnWWVzJyAmJiBjbGlja1Byb2Nlc3MgPT09ICdOb3QgWWV0Jykge1xuICAgICAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoJ2ZpbGwnLCAnYnJvd24nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3ROb2RlID09PSAnWWVzJyAmJiBjbGlja1Byb2Nlc3MgIT09ICdOb3QgWWV0Jykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xvciA9IGQuX2NoaWxkcmVuID8gJ3ZhcigtLXRhYmxlVGV4dCknIDogJyNmZmYnO1xuICAgICAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoJ2ZpbGwnLCBjb2xvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjb2xsYXBzZUZldyhfbmQsIG9wZW5Ob2Rlcykge1xuICAgICAgICAgICAgaWYgKF9uZC5kYXRhLmlkID09PSAnI2FsbCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX25kLmRhdGEucm9vdE5vZGUgPT09ICdZZXMnICYmIF9uZC5kYXRhLmNsaWNrUHJvY2VzcyA9PT0gJ05vdCBZZXQnKSB7XG4gICAgICAgICAgICAgICAgX25kLl9jaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9uZC5jaGlsZHJlbiAmJiBvcGVuTm9kZXMuaW5kZXhPZihfbmQuZGF0YS5pZCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgX25kLl9jaGlsZHJlbiA9IF9uZC5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBpZiAoX25kLl9jaGlsZHJlbilcbiAgICAgICAgICAgICAgICAgICAgX25kLl9jaGlsZHJlbi5maW5kKChfbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlRmV3KF9uZCwgb3Blbk5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgX25kLmNoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKF9uZC5jaGlsZHJlbiAmJiBvcGVuTm9kZXMuaW5kZXhPZihfbmQuZGF0YS5pZCkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChfbmQuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgIF9uZC5jaGlsZHJlbi5maW5kKChfbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlRmV3KF9uZCwgb3Blbk5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291cmNlLmNoaWxkcmVuID09PSBudWxsKSB7XG4gICAgICAgICAgICBfLmRlbGF5KHRoaXMuc2l6ZVRvRml0LmJpbmQodGhpcyksIDY1MCk7XG4gICAgICAgIH1cbiAgICB9IC8vIGVuZCBvZiB1cGRhdGVUcmVlXG5cbiAgICBzaXplVG9GaXQoKSB7XG4gICAgICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gdGhpcy5zdmcuX2dyb3Vwc1swXVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgYm90dG9tRGVsdGEgPSBib3VuZGluZ0JveC5oZWlnaHQgLSAxMDAgLSAtYm91bmRpbmdCb3gudG9wO1xuICAgICAgICBjb25zdCB0b3BEZWx0YSA9IGJvdW5kaW5nQm94LmhlaWdodCArIDUwMCAtIGJvdW5kaW5nQm94LmJvdHRvbTtcbiAgICAgICAgY29uc3QgdG9wT3V0T2ZWaWV3ID0gdG9wRGVsdGEgPCAwO1xuICAgICAgICBjb25zdCBib3R0b21PdXRPZlZpZXcgPSBib3R0b21EZWx0YSA8IDA7XG5cbiAgICAgICAgaWYgKGJvdHRvbU91dE9mVmlldyB8fCB0b3BPdXRPZlZpZXcpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zID0gdGhpcy50cmFuc2Zvcm07XG4gICAgICAgICAgICB0cmFucy55ID0gdG9wT3V0T2ZWaWV3ID8gNDAwIDogMDtcbiAgICAgICAgICAgIHRoaXMuc3ZnLnRyYW5zaXRpb24oKS5kdXJhdGlvbig3NTApLmF0dHIoJ3RyYW5zZm9ybScsIHRyYW5zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldENvbG9yKGQpIHtcbiAgICAgICAgaWYgKGQuc3RhdHVzID09PSAnRXJyb3InICYmIGQuZ3JvdXAgPT09IDMpIHtcbiAgICAgICAgICAgIHJldHVybiAncmVkJztcbiAgICAgICAgfSBlbHNlIGlmIChkLnN0YXR1cyAhPT0gJ0Vycm9yJyAmJiBkLmdyb3VwID09PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3ZhcigtLXRhYmxlVGV4dCknO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICd2YXIoLS10YWJsZVRleHQpJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRpY2tlZCgpIHtcbiAgICAgICAgdGhpcy5saW5rc1xuICAgICAgICAgICAgLmF0dHIoJ3gxJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZC5zb3VyY2UueDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYXR0cigneTEnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkLnNvdXJjZS55O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hdHRyKCd4MicsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQudGFyZ2V0Lng7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmF0dHIoJ3kyJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZC50YXJnZXQueTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubm9kZXMuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBkLnggKyAnLCcgKyBkLnkgKyAnKSc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlzQW5PYmplY3Qobykge1xuICAgICAgICByZXR1cm4gbyBpbnN0YW5jZW9mIE9iamVjdCAmJiBvLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG4gICAgfVxuXG4gICAgcmVhZE9iamVjdFZhbHVlcyhsaW5rT2JqZWN0KSB7XG4gICAgICAgIGxldCBpbmZvID0gJzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6IHNhbnMtc2VyaWZcIj4nO1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobGlua09iamVjdC5kYXRhKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKCAoaykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNBbk9iamVjdChsaW5rT2JqZWN0LmRhdGFba10pKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga1ZhbDogYW55ID0gbGlua09iamVjdC5kYXRhW2tdO1xuICAgICAgICAgICAgICAgIGluZm8gPSBpbmZvICsgJyAgICcgKyBrICsgJyAgOiAgJyArIGtWYWwuaWQgKyAnPGJyPic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZm8gPSBpbmZvICsgJyAgICcgKyBrICsgJyAgOiAgJyArIGxpbmtPYmplY3QuZGF0YVtrXSArICc8YnI+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbmZvICsgJzwvc3Bhbj4nO1xuICAgIH1cblxuICAgIG5vZGVDb2xvcihkKSB7XG4gICAgICAgIGlmIChkLnN0YXR1cyA9PT0gJ0Vycm9yJykge1xuICAgICAgICAgICAgcmV0dXJuICcjRkYwMDAwJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnYmx1ZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkcmFnc3RhcnRlZChldmVudCwgZCkge1xuICAgICAgICBpZiAoIWV2ZW50LmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5zaW11bGF0aW9uLmFscGhhVGFyZ2V0KDAuMykucmVzdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIGQuZnggPSBkLng7XG4gICAgICAgIGQuZnkgPSBkLnk7XG4gICAgfVxuXG4gICAgZHJhZ2dlZChkKSB7XG4gICAgICAgIGQuZnggPSBkLng7XG4gICAgICAgIGQuZnkgPSBkLnk7XG4gICAgfVxuXG4gICAgZHJhZ2VuZGVkKGV2ZW50LCBkKSB7XG4gICAgICAgIGlmICghZXZlbnQuYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLnNpbXVsYXRpb24uYWxwaGFUYXJnZXQoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBkLmZ4ID0gbnVsbDtcbiAgICAgICAgZC5meSA9IG51bGw7XG4gICAgfVxuICAgIHJlbW92ZVRyZWVUb29sdGlwKCkge1xuICAgICAgICB0aGlzLnRyZWV0b29sdGlwID0gZDMuc2VsZWN0KCcjdG9vbHRpcCcpO1xuICAgICAgICBpZiAodGhpcy50cmVldG9vbHRpcCkge1xuICAgICAgICAgICAgdGhpcy50cmVldG9vbHRpcC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhd1RyZWVUb29sdGlwKGV2ZW50LCBzKSB7XG4gICAgICAgIHRoaXMudHJlZXRvb2x0aXAgPSBkMy5zZWxlY3QoJyN0b29sdGlwJyk7XG4gICAgICAgIHRoaXMudHJlZXRvb2x0aXAuc3R5bGUoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgY29uc3QgeCA9IGV2ZW50LnBhZ2VYICsgJ3B4JztcbiAgICAgICAgY29uc3QgeSA9IGV2ZW50LnBhZ2VZICsgMTUgKyAncHgnO1xuICAgICAgICB0aGlzLnRyZWV0b29sdGlwLnN0eWxlKCdsZWZ0JywgeCk7XG4gICAgICAgIHRoaXMudHJlZXRvb2x0aXAuc3R5bGUoJ3RvcCcsIHkpO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbHRpcCcpLmlubmVySFRNTCA9IHRoaXMucmVhZFRyZWVLZXlWYWx1ZXMoZXZlbnQsIHMpO1xuICAgIH1cbiAgICByZWFkVHJlZUtleVZhbHVlcyhldmVudCwgZCkge1xuICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGQuZGF0YS5uYW1lLmluZGV4T2YoJygnKTtcbiAgICAgIGNvbnN0IGZpbkluZGV4ID0gZC5kYXRhLm5hbWUuaW5kZXhPZignKScpO1xuICAgICAgY29uc3QgY291bnRTdHI6bnVtYmVyID0gc3RhcnRJbmRleCA+MD8gZC5kYXRhLm5hbWUuc3Vic3RyaW5nKHN0YXJ0SW5kZXggKyAxLCBmaW5JbmRleCk6IDA7XG4gICAgICAgIGxldCBpbmZvID0gYDxkaXYgY2xhc3M9J3Rvb2wtdGlwLWNvbnRhaW5lcic+YDtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGQuZGF0YSk7IC8vIG1wLmtleXMoKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgayA9PT0gJ2ZpcnN0Q2hpbGQnIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ3Byb3RvY29sJyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICdjb250ZXh0TWVudScgfHxcbiAgICAgICAgICAgICAgICBrID09PSAndXVpZCcgfHxcbiAgICAgICAgICAgICAgICBrID09PSAnbGFzdElkJyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICdjbGlja1Byb2Nlc3MnIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ3Jvb3ROb2RlJyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICdpZCcgfHxcbiAgICAgICAgICAgICAgICBrID09PSAnY2hpbGRyZW4nIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ3BhcmVudCcgfHxcbiAgICAgICAgICAgICAgICBrID09PSAnZGVwdGgnIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ3gnIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ3knIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ3Jvb3ROb2RlJyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICd4MCcgfHxcbiAgICAgICAgICAgICAgICBrID09PSAneTAnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZFtrXSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgaW5mbyA9XG4gICAgICAgICAgICAgICAgICAgIGluZm8gK1xuICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInByb3Atcm93XCI+PGRpdiBjbGFzcz1cInByb3AtbmFtZVwiPicgK1xuICAgICAgICAgICAgICAgICAgICBrICtcbiAgICAgICAgICAgICAgICAgICAgJzo8L2Rpdj48ZGl2IGNsYXNzPVwicHJvcC12YWxcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgZFtrXS5qb2luKCc8YnI+ICZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsnKSArXG4gICAgICAgICAgICAgICAgICAgICc8L2Rpdj48L2Rpdj4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wVmFsID0gZC5kYXRhW2tdIHx8ICcnO1xuICAgICAgICAgICAgICAgIGluZm8gPSBpbmZvICsgJzxkaXYgY2xhc3M9XCJwcm9wLXJvd1wiPjxkaXYgY2xhc3M9XCJwcm9wLW5hbWVcIj4nICsgayArICc6PC9kaXY+PGRpdiBjbGFzcz1cInByb3AtdmFsXCI+JyArIHByb3BWYWwgKyAnPC9kaXY+PC9kaXY+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChkLmRhdGEuZmlyc3RDaGlsZCAmJiBkLmRhdGEuZmlyc3RDaGlsZCA9PT0gJ1llcycgJiYgY291bnRTdHIgPiB0aGlzLm1heE9iamVjdHNQZXJOb2RlLTEpIHtcbiAgICAgICAgICAgICBpbmZvID0gaW5mbyArICc8c3BhbiBjbGFzcz1cInRvb2x0aXAtaGVscC10ZXh0XCI+Tm90ZTogZXhwYW5kIG5vZGUgZGlzYWJsZWQuIFVzZSBzZWFyY2ggZmlsdGVyLjwvc3Bhbj4nO1xuICAgICAgICB9IGVsc2UgaWYgKGQuZGF0YS5maXJzdENoaWxkICYmIGQuZGF0YS5maXJzdENoaWxkID09PSAnWWVzJyAmJiBjb3VudFN0ciA8IHRoaXMubWF4T2JqZWN0c1Blck5vZGUpe1xuICAgICAgICAgICAgIGluZm8gPSBpbmZvICsgJzxzcGFuIGNsYXNzPVwidG9vbHRpcC1oZWxwLXRleHRcIj5Ob3RlOiBjbGljayB0byBleHBhbmQgY2hpbGQgbm9kZXMgPC9zcGFuPic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZm8gKyAnPC9kaXY+JztcbiAgICB9XG5cbn1cblxuIiwiPGRpdiBjbGFzcz1cInppdGktcGFnZS1jb250YWluZXIgeml0aS1pZGVudGl0aWVzLWNvbnRhaW5lclwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm5mLW5ldHdvcmstdG9wb2xvZ3ktY29udGFpbmVyXCIgPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY3NzLWhlYWRlclwiPnt7dGl0bGV9fSA8L2Rpdj48YnI+XG5cbiAgICAgIDxkaXYgIGNsYXNzPVwibmYtbmV0LXZpcy1jb250cm9scy1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5mLXRvcG9sb2d5LXpvb20tY29udGFpbmVyXCI+XG4gICAgICAgICAgPCEtLWJ1dHRvbiAoY2xpY2spPVwiem9vbU91dCgpXCIgY2xhc3M9XCJuZi10b3BvbG9neS16b29tLWJ1dHRvbiBtaW51c1wiPjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInpvb21JbigpXCIgY2xhc3M9XCJuZi10b3BvbG9neS16b29tLWJ1dHRvbiBwbHVzXCI+PC9idXR0b24tLT5cbiAgICAgICAgICA8ZGl2IChjbGljayk9XCJyZXNldFRyZWUoJ1llcycpXCIgY2xhc3M9XCJyZXNldC1idXR0b25cIiB0aXRsZT1cIlJlc2V0XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAoY2hhbmdlKT1cInJlc291cmNlVHlwZUNoYW5nZWQoKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlc291cmNlVHlwZVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdyZXNvdXJjZS10eXBlLWVycm9yJzogcmVzb3VyY2VUeXBlRXJyb3IgfVwiXG4gICAgICAgICAgICBjbGFzcz1cInJlc291cmNlLXR5cGUtc2VsZWN0XCJcbiAgICAgICAgICAgIGlkPVwiUmVzb3VyY2VUeXBlU2VsZWN0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgUmVzb3VyY2UgVHlwZTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzZXJ2aWNlLXBvbGljaWVzXCI+U2VydmljZSBQb2xpY2llczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzZXJ2aWNlc1wiPlNlcnZpY2VzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImlkZW50aXRpZXNcIj5JZGVudGl0aWVzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVkZ2Utcm91dGVyc1wiPkVkZ2UgUm91dGVyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJlZGdlLXJvdXRlci1wb2xpY2llc1wiPkVkZ2UgUm91dGVyIFBvbGljaWVzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlcnZpY2UtZWRnZS1yb3V0ZXItcG9saWNpZXNcIj5TZXJ2aWNlIEVkZ2UgUm91dGVyIFBvbGljaWVzPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZi1uZXQtdmlzLWZpbHRlci1jb250YWluZXIgbGlzdEJveCByb3dcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgKGtleXVwKT1cIm53U2VhcmNoQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclRleHRcIlxuICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICAgICAgICBjbGFzcz1cIm5mLXRvcG9sb2d5LWZpbHRlci1pbnB1dFwiXG4gICAgICAgICAgICAgIGlkPVwiZmlsdGVyVGV4dFwiXG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSB0byBGaWx0ZXJcIlxuICAgICAgICAgIC8+XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclNlYXJjaEZpbHRlcigpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaWx0ZXJUZXh0ICE9PSAnJ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uQmFsbCBjbG9zZSBpY29uLWNsb3NlXCJcbiAgICAgICAgICAgICAgaWQ9XCJDbGVhclNlYXJjaEZpbHRlclwiXG4gICAgICAgICAgPjwvZGl2PlxuXG4gICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwiYXV0b2NvbXBsZXRlU2VhcmNoKCRldmVudClcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgYXV0b2NvbXBsZXRlT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAge3sgb3B0aW9uIH19XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibmYtdG9wb2xvZ3ktbGVnZW5kXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtY2lyY2xlIHNlcnZpY2Vwb2xpY2llc1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtdGV4dFwiPlNlcnZpY2UgUG9saWNpZXM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtY2lyY2xlIHNlcnZpY2VzXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0XCI+U2VydmljZXM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtY2lyY2xlIGVuZHBvaW50c1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtdGV4dFwiPklkZW50aXRpZXM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtY2lyY2xlIGVkZ2Vyb3V0ZXJzXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0XCI+RWRnZSBSb3V0ZXJzPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWNpcmNsZSBlcnBvbGljaWVzXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0XCI+RWRnZSBSb3V0ZXIgUG9saWNpZXM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtY2lyY2xlIHNlcnZpY2VlcnBvbGljaWVzXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0XCI+U2VydmljZSBSb3V0ZXIgUG9saWNpZXM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1pdGVtXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtZXhwYW5kLWhlbHBcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWljb24tdGV4dCBsZWdlbmQtYXNzb2NpYXRlZC1ub2Rlc1wiPlZpZXcgQXNzb2NpYXRlZCBOb2RlczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaWNvbi1wb2ludGVyXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b3BvdGlwXCIgaWQ9XCJ0b29sdGlwXCI+PC9kaXY+XG4gICAgICA8c3ZnIHN0eWxlPSdwb2ludGVyLWV2ZW50czphbGwnIGlkPVwiTmV0d29ya1Zpc3VhbGl6ZXJTVkdcIj48L3N2Zz5cbiAgICAgIDxsaWItbG9hZGluZy1pbmRpY2F0b3IgKm5nSWY9XCJpc0xvYWRpbmdcIiBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiPjwvbGliLWxvYWRpbmctaW5kaWNhdG9yPlxuICAgIDwvZGl2PlxuXG48L2Rpdj5cbiJdfQ==
|