@openziti/ziti-console-lib 0.3.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/README.md +24 -0
- package/assets/animations/ConstructionZiggy.json +15233 -0
- package/assets/animations/HelloZiggy.json +10008 -0
- package/assets/animations/SmartZiggy.json +9488 -0
- package/assets/components/add.html +1 -0
- package/assets/components/api.html +12 -0
- package/assets/components/customtags.html +4 -0
- package/assets/components/line.html +1 -0
- package/assets/components/noitems.html +1 -0
- package/assets/components/save.html +4 -0
- package/assets/components/search.html +8 -0
- package/assets/components/tabIdentities.html +6 -0
- package/assets/components/tabPolicies.html +7 -0
- package/assets/components/tabRouters.html +5 -0
- package/assets/components/tabServers.html +4 -0
- package/assets/components/tabServices.html +5 -0
- package/assets/components/tabSessions.html +4 -0
- package/assets/data/mail.json +0 -0
- package/assets/data/services.json +6 -0
- package/assets/data/settings.json +25 -0
- package/assets/data/site.json +31 -0
- package/assets/data/tags.json +7 -0
- package/assets/data/templates.json +1 -0
- package/assets/fonts/OpenSans-Regular.ttf +0 -0
- package/assets/fonts/OpenSans-Regular.woff +0 -0
- package/assets/fonts/OpenSans-Regular.woff2 +0 -0
- package/assets/fonts/RussoOne-Regular.ttf +0 -0
- package/assets/fonts/RussoOne-Regular.woff +0 -0
- package/assets/fonts/RussoOne-Regular.woff2 +0 -0
- package/assets/fonts/zac.eot +0 -0
- package/assets/fonts/zac.svg +55 -0
- package/assets/fonts/zac.ttf +0 -0
- package/assets/fonts/zac.woff +0 -0
- package/assets/fonts/zac.woff2 +0 -0
- package/assets/html/api-sessions.htm +153 -0
- package/assets/html/attributes.htm +260 -0
- package/assets/html/auth-policies.htm +410 -0
- package/assets/html/cas.htm +445 -0
- package/assets/html/config-types.htm +168 -0
- package/assets/html/configs.htm +238 -0
- package/assets/html/deprecated/fabric-links.htm +336 -0
- package/assets/html/deprecated/fabric-routers.htm +72 -0
- package/assets/html/deprecated/fabric-services.htm +494 -0
- package/assets/html/identities.htm +934 -0
- package/assets/html/index.htm +161 -0
- package/assets/html/jwt-signers.htm +260 -0
- package/assets/html/known.htm +115 -0
- package/assets/html/login.htm +131 -0
- package/assets/html/organization.htm +223 -0
- package/assets/html/posture-checks.htm +393 -0
- package/assets/html/profile.htm +52 -0
- package/assets/html/recipes.htm +455 -0
- package/assets/html/router-policies.htm +168 -0
- package/assets/html/routers.htm +323 -0
- package/assets/html/servers.htm +236 -0
- package/assets/html/service-policies.htm +197 -0
- package/assets/html/service-router-policies.htm +170 -0
- package/assets/html/services.htm +634 -0
- package/assets/html/sessions.htm +157 -0
- package/assets/html/settings.htm +146 -0
- package/assets/html/terminators.htm +244 -0
- package/assets/html/transit-routers.htm +173 -0
- package/assets/icons/android-icon-192x192.png +0 -0
- package/assets/icons/apple-icon-114x114.png +0 -0
- package/assets/icons/apple-icon-120x120.png +0 -0
- package/assets/icons/apple-icon-144x144.png +0 -0
- package/assets/icons/apple-icon-152x152.png +0 -0
- package/assets/icons/apple-icon-180x180.png +0 -0
- package/assets/icons/apple-icon-57x57.png +0 -0
- package/assets/icons/apple-icon-60x60.png +0 -0
- package/assets/icons/apple-icon-72x72.png +0 -0
- package/assets/icons/apple-icon-76x76.png +0 -0
- package/assets/icons/apple-icon-precomposed.png +0 -0
- package/assets/icons/favicon-16x16.png +0 -0
- package/assets/icons/favicon-32x32.png +0 -0
- package/assets/icons/favicon-96x96.png +0 -0
- package/assets/icons/favicon.ico +0 -0
- package/assets/icons/ms-icon-144x144.png +0 -0
- package/assets/images/Filter.png +0 -0
- package/assets/images/Login.jpg +0 -0
- package/assets/images/SortDown.png +0 -0
- package/assets/images/SortUp.png +0 -0
- package/assets/images/android.png +0 -0
- package/assets/images/anywhere.png +0 -0
- package/assets/images/apple.png +0 -0
- package/assets/images/bug.png +0 -0
- package/assets/images/check.png +0 -0
- package/assets/images/error.png +0 -0
- package/assets/images/info.png +0 -0
- package/assets/images/linux.png +0 -0
- package/assets/images/other.png +0 -0
- package/assets/images/scrollbar.png +0 -0
- package/assets/images/select.png +0 -0
- package/assets/images/success.png +0 -0
- package/assets/images/visualizer/ER.png +0 -0
- package/assets/images/visualizer/Routers.png +0 -0
- package/assets/images/visualizer/er_error.png +0 -0
- package/assets/images/visualizer/error_er.png +0 -0
- package/assets/images/visualizer/host-error.png +0 -0
- package/assets/images/visualizer/host.png +0 -0
- package/assets/images/visualizer/host_unregistered.png +0 -0
- package/assets/images/visualizer/link-cut.png +0 -0
- package/assets/images/visualizer/service.png +0 -0
- package/assets/images/visualizer/unregistered.png +0 -0
- package/assets/images/warning.png +0 -0
- package/assets/images/windows.png +0 -0
- package/assets/languages/en-us.json +330 -0
- package/assets/resources/avatar/man.svg +78 -0
- package/assets/resources/avatar/woman.svg +96 -0
- package/assets/resources/icon/analysis.svg +104 -0
- package/assets/resources/icon/appwans.svg +20 -0
- package/assets/resources/icon/architecture.svg +1 -0
- package/assets/resources/icon/bike.svg +94 -0
- package/assets/resources/icon/bus.svg +64 -0
- package/assets/resources/icon/cas.svg +46 -0
- package/assets/resources/icon/clusters.svg +28 -0
- package/assets/resources/icon/computer.svg +1 -0
- package/assets/resources/icon/data.svg +1 -0
- package/assets/resources/icon/delivery-truck.svg +1 -0
- package/assets/resources/icon/explosion.svg +81 -0
- package/assets/resources/icon/fabricServices.svg +31 -0
- package/assets/resources/icon/fabrics.svg +136 -0
- package/assets/resources/icon/front.svg +83 -0
- package/assets/resources/icon/gateway.svg +49 -0
- package/assets/resources/icon/gear.svg +122 -0
- package/assets/resources/icon/house.svg +72 -0
- package/assets/resources/icon/language.svg +1 -0
- package/assets/resources/icon/objective.svg +55 -0
- package/assets/resources/icon/route.svg +97 -0
- package/assets/resources/icon/routers.svg +27 -0
- package/assets/resources/icon/startup.svg +112 -0
- package/assets/resources/icon/switch.svg +101 -0
- package/assets/scripts/chart.min.js +7 -0
- package/assets/scripts/commands.js +112 -0
- package/assets/scripts/components/codemirror/codemirror.css +356 -0
- package/assets/scripts/components/codemirror/codemirror.js +9741 -0
- package/assets/scripts/components/codemirror/modes/addons/closetags.js +200 -0
- package/assets/scripts/components/codemirror/modes/addons/colorize.js +40 -0
- package/assets/scripts/components/codemirror/modes/addons/css-hint.js +66 -0
- package/assets/scripts/components/codemirror/modes/addons/formatting.js +124 -0
- package/assets/scripts/components/codemirror/modes/addons/html-hint.js +366 -0
- package/assets/scripts/components/codemirror/modes/addons/javascript-hint.js +159 -0
- package/assets/scripts/components/codemirror/modes/addons/show-hint.css +36 -0
- package/assets/scripts/components/codemirror/modes/addons/show-hint.js +482 -0
- package/assets/scripts/components/codemirror/modes/css.js +831 -0
- package/assets/scripts/components/codemirror/modes/htmlmixed.js +152 -0
- package/assets/scripts/components/codemirror/modes/javascript.js +930 -0
- package/assets/scripts/components/codemirror/modes/xml.js +413 -0
- package/assets/scripts/components/column.css +184 -0
- package/assets/scripts/components/column.js +165 -0
- package/assets/scripts/components/flows.css +0 -0
- package/assets/scripts/components/flows.js +48 -0
- package/assets/scripts/components/leaflet/images/layers-2x.png +0 -0
- package/assets/scripts/components/leaflet/images/layers.png +0 -0
- package/assets/scripts/components/leaflet/images/marker-icon-2x.png +0 -0
- package/assets/scripts/components/leaflet/images/marker-icon.png +0 -0
- package/assets/scripts/components/leaflet/images/marker-shadow.png +0 -0
- package/assets/scripts/components/leaflet/leaflet-src.esm.js +13926 -0
- package/assets/scripts/components/leaflet/leaflet-src.esm.js.map +1 -0
- package/assets/scripts/components/leaflet/leaflet-src.js +14020 -0
- package/assets/scripts/components/leaflet/leaflet-src.js.map +1 -0
- package/assets/scripts/components/leaflet/leaflet.css +640 -0
- package/assets/scripts/components/leaflet/leaflet.js +5 -0
- package/assets/scripts/components/leaflet/leaflet.js.map +1 -0
- package/assets/scripts/components/moment.js +4602 -0
- package/assets/scripts/components/multiselect.js +333 -0
- package/assets/scripts/components/network/img/network/acceptDeleteIcon.png +0 -0
- package/assets/scripts/components/network/img/network/addNodeIcon.png +0 -0
- package/assets/scripts/components/network/img/network/backIcon.png +0 -0
- package/assets/scripts/components/network/img/network/connectIcon.png +0 -0
- package/assets/scripts/components/network/img/network/cross.png +0 -0
- package/assets/scripts/components/network/img/network/cross2.png +0 -0
- package/assets/scripts/components/network/img/network/deleteIcon.png +0 -0
- package/assets/scripts/components/network/img/network/downArrow.png +0 -0
- package/assets/scripts/components/network/img/network/editIcon.png +0 -0
- package/assets/scripts/components/network/img/network/leftArrow.png +0 -0
- package/assets/scripts/components/network/img/network/minus.png +0 -0
- package/assets/scripts/components/network/img/network/plus.png +0 -0
- package/assets/scripts/components/network/img/network/rightArrow.png +0 -0
- package/assets/scripts/components/network/img/network/upArrow.png +0 -0
- package/assets/scripts/components/network/img/network/zoomExtends.png +0 -0
- package/assets/scripts/components/network/types/DOMutil.d.ts +99 -0
- package/assets/scripts/components/network/types/index-legacy-bundle.d.ts +4 -0
- package/assets/scripts/components/network/types/index-legacy-bundle.d.ts.map +1 -0
- package/assets/scripts/components/network/types/index-legacy.d.ts +24 -0
- package/assets/scripts/components/network/types/index-legacy.d.ts.map +1 -0
- package/assets/scripts/components/network/types/index-peer.d.ts +11 -0
- package/assets/scripts/components/network/types/index-peer.d.ts.map +1 -0
- package/assets/scripts/components/network/types/index-standalone.d.ts +7 -0
- package/assets/scripts/components/network/types/index-standalone.d.ts.map +1 -0
- package/assets/scripts/components/network/types/module/hammer.d.ts +2 -0
- package/assets/scripts/components/network/types/module/moment.d.ts +2 -0
- package/assets/scripts/components/network/types/network/Images.d.ts +2 -0
- package/assets/scripts/components/network/types/network/Network.d.ts +1030 -0
- package/assets/scripts/components/network/types/network/dotparser.d.ts +2 -0
- package/assets/scripts/components/network/types/network/gephiParser.d.ts +80 -0
- package/assets/scripts/components/network/types/network/gephiParser.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-dynamic.d.ts +55 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-dynamic.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-static.d.ts +37 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-static.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/cubic-bezier-edge.d.ts +32 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/cubic-bezier-edge.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/index.d.ts +10 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/index.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/straight-edge.d.ts +26 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/straight-edge.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/util/bezier-edge-base.d.ts +68 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/util/bezier-edge-base.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/util/cubic-bezier-edge-base.d.ts +38 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/util/cubic-bezier-edge-base.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/util/edge-base.d.ts +248 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/util/edge-base.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/util/end-points.d.ts +58 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/util/end-points.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/util/types.d.ts +196 -0
- package/assets/scripts/components/network/types/network/modules/components/edges/util/types.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/modules/layout-engine/index.d.ts +32 -0
- package/assets/scripts/components/network/types/network/modules/layout-engine/index.d.ts.map +1 -0
- package/assets/scripts/components/network/types/network/options.d.ts +2 -0
- package/assets/scripts/components/network/types/network/shapes.d.ts +122 -0
- package/assets/scripts/components/network/types/network/shapes.d.ts.map +1 -0
- package/assets/scripts/components/network/vis-network.css +716 -0
- package/assets/scripts/components/network/vis-network.esm.js +58974 -0
- package/assets/scripts/components/network/vis-network.esm.js.map +1 -0
- package/assets/scripts/components/network/vis-network.esm.min.js +53 -0
- package/assets/scripts/components/network/vis-network.esm.min.js.map +1 -0
- package/assets/scripts/components/network/vis-network.js +58994 -0
- package/assets/scripts/components/network/vis-network.js.map +1 -0
- package/assets/scripts/components/network/vis-network.min.css +1 -0
- package/assets/scripts/components/network/vis-network.min.js +53 -0
- package/assets/scripts/components/network/vis-network.min.js.map +1 -0
- package/assets/scripts/components/qrcode.min.js +1 -0
- package/assets/scripts/components/resources.js +26 -0
- package/assets/scripts/components/selector-new.js +300 -0
- package/assets/scripts/components/selector.js +300 -0
- package/assets/scripts/components/spectrum.js +2323 -0
- package/assets/scripts/components/timezone.js +1545 -0
- package/assets/scripts/components/uploader.js +74 -0
- package/assets/scripts/context.js +177 -0
- package/assets/scripts/dragging.js +58 -0
- package/assets/scripts/forms/forms.js +74 -0
- package/assets/scripts/forms/host.v1.htm +43 -0
- package/assets/scripts/forms/intercept.v1.htm +0 -0
- package/assets/scripts/forms/schema.js +693 -0
- package/assets/scripts/growler.js +133 -0
- package/assets/scripts/header.js +163 -0
- package/assets/scripts/jquery-3.6.3.min.js +2 -0
- package/assets/scripts/jquery.datetimepicker.js +2930 -0
- package/assets/scripts/locale.js +47 -0
- package/assets/scripts/modal.js +65 -0
- package/assets/scripts/model/data.js +558 -0
- package/assets/scripts/model/fabric.js +55 -0
- package/assets/scripts/model/fabricServices.js +45 -0
- package/assets/scripts/model/known.js +43 -0
- package/assets/scripts/model/links.js +44 -0
- package/assets/scripts/model/routers.js +51 -0
- package/assets/scripts/model/series.js +70 -0
- package/assets/scripts/model/sessions.js +61 -0
- package/assets/scripts/model/settings.js +60 -0
- package/assets/scripts/model/summary.js +49 -0
- package/assets/scripts/model/tags.js +330 -0
- package/assets/scripts/model/templates.js +42 -0
- package/assets/scripts/model/user.js +40 -0
- package/assets/scripts/restrictions.js +34 -0
- package/assets/scripts/service.js +76 -0
- package/assets/scripts/validation-tools.js +5119 -0
- package/assets/scripts/ziti.js +372 -0
- package/assets/styles/chart.min.css +1 -0
- package/assets/styles/dark.css +52 -0
- package/assets/styles/datetimepicker.css +1 -0
- package/assets/styles/forms.css +521 -0
- package/assets/styles/global.scss +890 -0
- package/assets/styles/growler.css +190 -0
- package/assets/styles/header.css +232 -0
- package/assets/styles/icons.css +160 -0
- package/assets/styles/navigation.css +183 -0
- package/assets/styles/select2.css +481 -0
- package/assets/styles/spectrum.css +507 -0
- package/assets/styles/tables.css +424 -0
- package/assets/styles/tooltip.css +134 -0
- package/assets/styles/ziti.css +3216 -0
- package/assets/svgs/Advanced.svg +89 -0
- package/assets/svgs/ArrowDown.svg +15 -0
- package/assets/svgs/ArrowDownDark.svg +15 -0
- package/assets/svgs/Confirm_Trash.svg +42 -0
- package/assets/svgs/DownloadKey.svg +50 -0
- package/assets/svgs/Filter.svg +13 -0
- package/assets/svgs/Growl_Bug.svg +47 -0
- package/assets/svgs/Growl_Error.svg +41 -0
- package/assets/svgs/Growl_Info.svg +45 -0
- package/assets/svgs/Growl_Success.svg +34 -0
- package/assets/svgs/Growl_Warning.svg +44 -0
- package/assets/svgs/MainMenuBlankUser.svg +14 -0
- package/assets/svgs/MainMenuNetworks.svg +37 -0
- package/assets/svgs/MainMenuNotifications.svg +32 -0
- package/assets/svgs/MainMenuOrg.svg +68 -0
- package/assets/svgs/MainMenuPlus.svg +13 -0
- package/assets/svgs/MainMenuSearch.svg +22 -0
- package/assets/svgs/MainMenuSupport.svg +417 -0
- package/assets/svgs/No_Clients.svg +94 -0
- package/assets/svgs/No_Plus.svg +30 -0
- package/assets/svgs/No_Routers.svg +56 -0
- package/assets/svgs/Resize.svg +33 -0
- package/assets/svgs/Simple.svg +62 -0
- package/assets/svgs/appwans.svg +20 -0
- package/assets/svgs/cas.svg +46 -0
- package/assets/svgs/cert.svg +69 -0
- package/assets/svgs/clear.svg +13 -0
- package/assets/svgs/close.svg +14 -0
- package/assets/svgs/clusters.svg +28 -0
- package/assets/svgs/copy.svg +64 -0
- package/assets/svgs/dashboard.svg +32 -0
- package/assets/svgs/dial.svg +83 -0
- package/assets/svgs/docs.svg +95 -0
- package/assets/svgs/downloads.svg +74 -0
- package/assets/svgs/fabricServices.svg +31 -0
- package/assets/svgs/fabrics.svg +134 -0
- package/assets/svgs/gateways.svg +49 -0
- package/assets/svgs/heart.svg +1 -0
- package/assets/svgs/ids.svg +20 -0
- package/assets/svgs/infoicon.svg +14 -0
- package/assets/svgs/lock.svg +12 -0
- package/assets/svgs/minus.svg +11 -0
- package/assets/svgs/nodata.svg +27 -0
- package/assets/svgs/qr.svg +56 -0
- package/assets/svgs/refresh.svg +24 -0
- package/assets/svgs/routers.svg +31 -0
- package/assets/svgs/select.svg +18 -0
- package/assets/svgs/services.svg +19 -0
- package/assets/svgs/settings.svg +1 -0
- package/assets/svgs/upload.svg +55 -0
- package/assets/templates/footer.htm +183 -0
- package/assets/templates/header.htm +298 -0
- package/assets/vectors/certificates.svg +1 -0
- package/assets/vectors/change.svg +1 -0
- package/assets/vectors/configuration.svg +2 -0
- package/assets/vectors/customize.svg +1 -0
- package/assets/vectors/dashboard.svg +1 -0
- package/assets/vectors/edgepolicies.svg +2 -0
- package/assets/vectors/globe.svg +63 -0
- package/assets/vectors/help.svg +48 -0
- package/assets/vectors/identity.svg +1 -0
- package/assets/vectors/notify.svg +1 -0
- package/assets/vectors/plus.svg +1 -0
- package/assets/vectors/posture.svg +1 -0
- package/assets/vectors/profile.svg +1 -0
- package/assets/vectors/router.svg +1 -0
- package/assets/vectors/routerpolicies.svg +1 -0
- package/assets/vectors/schema.svg +1 -0
- package/assets/vectors/server (1).svg +293 -0
- package/assets/vectors/servers.svg +103 -0
- package/assets/vectors/servicepolicy.svg +1 -0
- package/assets/vectors/services.svg +126 -0
- package/assets/vectors/settings.svg +130 -0
- package/assets/vectors/terminators.svg +1 -0
- package/assets/vectors/transitrouter.svg +1 -0
- package/esm2022/lib/app.initializer.mjs +24 -0
- package/esm2022/lib/features/card/card.component.mjs +29 -0
- package/esm2022/lib/features/card-list/card-list.component.mjs +50 -0
- package/esm2022/lib/features/config-editor/config-editor.component.mjs +239 -0
- package/esm2022/lib/features/confirm/confirm.component.mjs +59 -0
- package/esm2022/lib/features/creation-summary-dialog/creation-summary-dialog.component.mjs +92 -0
- package/esm2022/lib/features/custom-tags/custom-tags.component.mjs +77 -0
- package/esm2022/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.mjs +47 -0
- package/esm2022/lib/features/data-table/cells/table-cell-select/table-cell-select.component.mjs +46 -0
- package/esm2022/lib/features/data-table/cells/table-cell-token/table-cell-token.component.mjs +124 -0
- package/esm2022/lib/features/data-table/column-headers/table-column-default/table-column-default.component.mjs +269 -0
- package/esm2022/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.mjs +94 -0
- package/esm2022/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.mjs +38 -0
- package/esm2022/lib/features/data-table/column-headers/table-column-select/table-column-select.component.mjs +34 -0
- package/esm2022/lib/features/data-table/data-table-filter.service.mjs +66 -0
- package/esm2022/lib/features/data-table/data-table.component.mjs +848 -0
- package/esm2022/lib/features/data-table/data-table.service.mjs +99 -0
- package/esm2022/lib/features/data-table/table-filter-bar/filter-bar.component.mjs +95 -0
- package/esm2022/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.mjs +27 -0
- package/esm2022/lib/features/data-table/tooltips/os-tooltip.component.mjs +30 -0
- package/esm2022/lib/features/data-table/tooltips/sdk-tooltip.component.mjs +35 -0
- package/esm2022/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.mjs +73 -0
- package/esm2022/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.mjs +131 -0
- package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.mjs +169 -0
- package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.mjs +51 -0
- package/esm2022/lib/features/dynamic-widgets/number/number-input.component.mjs +74 -0
- package/esm2022/lib/features/dynamic-widgets/object/object.component.mjs +122 -0
- package/esm2022/lib/features/dynamic-widgets/password/password-input.component.mjs +72 -0
- package/esm2022/lib/features/dynamic-widgets/port-ranges/port-ranges.component.mjs +98 -0
- package/esm2022/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.mjs +180 -0
- package/esm2022/lib/features/dynamic-widgets/selector/selector-input.component.mjs +104 -0
- package/esm2022/lib/features/dynamic-widgets/string/string-input.component.mjs +72 -0
- package/esm2022/lib/features/dynamic-widgets/text-list/text-list-input.component.mjs +119 -0
- package/esm2022/lib/features/extendable/extendable.component.mjs +56 -0
- package/esm2022/lib/features/extendable/extensions-noop.service.mjs +50 -0
- package/esm2022/lib/features/json-view/json-view.component.mjs +197 -0
- package/esm2022/lib/features/list-page-features/list-page-form/list-page-form.component.mjs +139 -0
- package/esm2022/lib/features/list-page-features/list-page-header/list-page-header.component.mjs +48 -0
- package/esm2022/lib/features/loading-indicator/loading-indicator.component.mjs +21 -0
- package/esm2022/lib/features/messaging/growler.component.mjs +63 -0
- package/esm2022/lib/features/messaging/growler.model.mjs +24 -0
- package/esm2022/lib/features/messaging/growler.module.mjs +35 -0
- package/esm2022/lib/features/messaging/growler.service.mjs +72 -0
- package/esm2022/lib/features/messaging/logger.service.mjs +175 -0
- package/esm2022/lib/features/no-items/no-items.component.mjs +47 -0
- package/esm2022/lib/features/overrides/overrides.component.mjs +119 -0
- package/esm2022/lib/features/overrides/overrides.service.mjs +115 -0
- package/esm2022/lib/features/preview-list/preview-list.component.mjs +91 -0
- package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +223 -0
- package/esm2022/lib/features/projectable-forms/configuration/configuration.service.mjs +150 -0
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +188 -0
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.service.mjs +131 -0
- package/esm2022/lib/features/projectable-forms/form-field-container/form-field-container.component.mjs +72 -0
- package/esm2022/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.mjs +55 -0
- package/esm2022/lib/features/projectable-forms/form-header/form-header.component.mjs +96 -0
- package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +322 -0
- package/esm2022/lib/features/projectable-forms/identity/identity-form.service.mjs +144 -0
- package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +172 -0
- package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +240 -0
- package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +453 -0
- package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +680 -0
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +252 -0
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.service.mjs +214 -0
- package/esm2022/lib/features/qr-code/qr-code.component.mjs +143 -0
- package/esm2022/lib/features/reset-enrollment/reset-enrollment.component.mjs +87 -0
- package/esm2022/lib/features/reset-enrollment/reset-enrollment.service.mjs +62 -0
- package/esm2022/lib/features/side-modal/side-modal.component.mjs +46 -0
- package/esm2022/lib/features/sidebars/side-banner/side-banner.component.mjs +17 -0
- package/esm2022/lib/features/sidebars/side-navbar/side-navbar.component.mjs +55 -0
- package/esm2022/lib/features/sidebars/side-toolbar/side-toolbar.component.mjs +128 -0
- package/esm2022/lib/features/tag-selector/tag-selector.component.mjs +292 -0
- package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.component.mjs +588 -0
- package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.helper.mjs +370 -0
- package/esm2022/lib/features/wrappers/node-wrapper.service.mjs +51 -0
- package/esm2022/lib/features/wrappers/zac-wrapper-service.class.mjs +92 -0
- package/esm2022/lib/features/wrappers/zac-wrapper.component.mjs +147 -0
- package/esm2022/lib/features/wrappers/zac-wrapper.service.mjs +937 -0
- package/esm2022/lib/models/config.mjs +9 -0
- package/esm2022/lib/models/edge-router.mjs +13 -0
- package/esm2022/lib/models/identity.mjs +34 -0
- package/esm2022/lib/models/service-policy.mjs +12 -0
- package/esm2022/lib/models/service.mjs +12 -0
- package/esm2022/lib/pages/configurations/configurations-page.component.mjs +102 -0
- package/esm2022/lib/pages/configurations/configurations-page.service.mjs +246 -0
- package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +149 -0
- package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +361 -0
- package/esm2022/lib/pages/identities/identities-page.component.mjs +233 -0
- package/esm2022/lib/pages/identities/identities-page.service.mjs +498 -0
- package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +132 -0
- package/esm2022/lib/pages/service-policies/service-policies-page.service.mjs +457 -0
- package/esm2022/lib/pages/services/services-page.component.mjs +141 -0
- package/esm2022/lib/pages/services/services-page.service.mjs +215 -0
- package/esm2022/lib/safe.pipe.mjs +19 -0
- package/esm2022/lib/services/console-events.service.mjs +32 -0
- package/esm2022/lib/services/csv-download.service.mjs +92 -0
- package/esm2022/lib/services/deactivate-guard.service.mjs +18 -0
- package/esm2022/lib/services/login-service.class.mjs +28 -0
- package/esm2022/lib/services/node-data.service.mjs +292 -0
- package/esm2022/lib/services/noop-login.service.mjs +45 -0
- package/esm2022/lib/services/schema.service.mjs +808 -0
- package/esm2022/lib/services/settings-service.class.mjs +131 -0
- package/esm2022/lib/services/settings.service.mjs +193 -0
- package/esm2022/lib/services/tab-name.service.mjs +65 -0
- package/esm2022/lib/services/validation.service.mjs +124 -0
- package/esm2022/lib/services/ziti-controller-data.service.mjs +260 -0
- package/esm2022/lib/services/ziti-data.service.mjs +54 -0
- package/esm2022/lib/services/ziti-domain-controller.service.mjs +3 -0
- package/esm2022/lib/shared/list-page-component.class.mjs +145 -0
- package/esm2022/lib/shared/list-page-service.class.mjs +151 -0
- package/esm2022/lib/version.mjs +4 -0
- package/esm2022/lib/zac-routing.module.mjs +41 -0
- package/esm2022/lib/ziti-console-lib.module.mjs +364 -0
- package/esm2022/lib/ziti-console.constants.mjs +19 -0
- package/esm2022/openziti-ziti-console-lib.mjs +5 -0
- package/esm2022/public-api.mjs +71 -0
- package/fesm2022/openziti-ziti-console-lib.mjs +15813 -0
- package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/app.initializer.d.ts +3 -0
- package/lib/app.initializer.d.ts.map +1 -0
- package/lib/features/card/card.component.d.ts +11 -0
- package/lib/features/card/card.component.d.ts.map +1 -0
- package/lib/features/card-list/card-list.component.d.ts +23 -0
- package/lib/features/card-list/card-list.component.d.ts.map +1 -0
- package/lib/features/config-editor/config-editor.component.d.ts +39 -0
- package/lib/features/config-editor/config-editor.component.d.ts.map +1 -0
- package/lib/features/confirm/confirm.component.d.ts +23 -0
- package/lib/features/confirm/confirm.component.d.ts.map +1 -0
- package/lib/features/creation-summary-dialog/creation-summary-dialog.component.d.ts +31 -0
- package/lib/features/creation-summary-dialog/creation-summary-dialog.component.d.ts.map +1 -0
- package/lib/features/custom-tags/custom-tags.component.d.ts +20 -0
- package/lib/features/custom-tags/custom-tags.component.d.ts.map +1 -0
- package/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.d.ts +16 -0
- package/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.d.ts.map +1 -0
- package/lib/features/data-table/cells/table-cell-select/table-cell-select.component.d.ts +19 -0
- package/lib/features/data-table/cells/table-cell-select/table-cell-select.component.d.ts.map +1 -0
- package/lib/features/data-table/cells/table-cell-token/table-cell-token.component.d.ts +22 -0
- package/lib/features/data-table/cells/table-cell-token/table-cell-token.component.d.ts.map +1 -0
- package/lib/features/data-table/column-headers/table-column-default/table-column-default.component.d.ts +52 -0
- package/lib/features/data-table/column-headers/table-column-default/table-column-default.component.d.ts.map +1 -0
- package/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.d.ts +27 -0
- package/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.d.ts.map +1 -0
- package/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.d.ts +19 -0
- package/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.d.ts.map +1 -0
- package/lib/features/data-table/column-headers/table-column-select/table-column-select.component.d.ts +15 -0
- package/lib/features/data-table/column-headers/table-column-select/table-column-select.component.d.ts.map +1 -0
- package/lib/features/data-table/data-table-filter.service.d.ts +24 -0
- package/lib/features/data-table/data-table-filter.service.d.ts.map +1 -0
- package/lib/features/data-table/data-table.component.d.ts +154 -0
- package/lib/features/data-table/data-table.component.d.ts.map +1 -0
- package/lib/features/data-table/data-table.service.d.ts +20 -0
- package/lib/features/data-table/data-table.service.d.ts.map +1 -0
- package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts +22 -0
- package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts.map +1 -0
- package/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.d.ts +10 -0
- package/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.d.ts.map +1 -0
- package/lib/features/data-table/tooltips/os-tooltip.component.d.ts +15 -0
- package/lib/features/data-table/tooltips/os-tooltip.component.d.ts.map +1 -0
- package/lib/features/data-table/tooltips/sdk-tooltip.component.d.ts +15 -0
- package/lib/features/data-table/tooltips/sdk-tooltip.component.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.d.ts +19 -0
- package/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts +26 -0
- package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts +45 -0
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.d.ts +14 -0
- package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/number/number-input.component.d.ts +20 -0
- package/lib/features/dynamic-widgets/number/number-input.component.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/object/object.component.d.ts +26 -0
- package/lib/features/dynamic-widgets/object/object.component.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/password/password-input.component.d.ts +20 -0
- package/lib/features/dynamic-widgets/password/password-input.component.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts +21 -0
- package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts +58 -0
- package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts +23 -0
- package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/string/string-input.component.d.ts +20 -0
- package/lib/features/dynamic-widgets/string/string-input.component.d.ts.map +1 -0
- package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts +23 -0
- package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts.map +1 -0
- package/lib/features/extendable/extendable.component.d.ts +15 -0
- package/lib/features/extendable/extendable.component.d.ts.map +1 -0
- package/lib/features/extendable/extensions-noop.service.d.ts +31 -0
- package/lib/features/extendable/extensions-noop.service.d.ts.map +1 -0
- package/lib/features/json-view/json-view.component.d.ts +37 -0
- package/lib/features/json-view/json-view.component.d.ts.map +1 -0
- package/lib/features/list-page-features/list-page-form/list-page-form.component.d.ts +35 -0
- package/lib/features/list-page-features/list-page-form/list-page-form.component.d.ts.map +1 -0
- package/lib/features/list-page-features/list-page-header/list-page-header.component.d.ts +13 -0
- package/lib/features/list-page-features/list-page-header/list-page-header.component.d.ts.map +1 -0
- package/lib/features/loading-indicator/loading-indicator.component.d.ts +9 -0
- package/lib/features/loading-indicator/loading-indicator.component.d.ts.map +1 -0
- package/lib/features/messaging/growler.component.d.ts +19 -0
- package/lib/features/messaging/growler.component.d.ts.map +1 -0
- package/lib/features/messaging/growler.model.d.ts +8 -0
- package/lib/features/messaging/growler.model.d.ts.map +1 -0
- package/lib/features/messaging/growler.module.d.ts +10 -0
- package/lib/features/messaging/growler.module.d.ts.map +1 -0
- package/lib/features/messaging/growler.service.d.ts +18 -0
- package/lib/features/messaging/growler.service.d.ts.map +1 -0
- package/lib/features/messaging/logger.service.d.ts +27 -0
- package/lib/features/messaging/logger.service.d.ts.map +1 -0
- package/lib/features/no-items/no-items.component.d.ts +19 -0
- package/lib/features/no-items/no-items.component.d.ts.map +1 -0
- package/lib/features/overrides/overrides.component.d.ts +33 -0
- package/lib/features/overrides/overrides.component.d.ts.map +1 -0
- package/lib/features/overrides/overrides.service.d.ts +18 -0
- package/lib/features/overrides/overrides.service.d.ts.map +1 -0
- package/lib/features/preview-list/preview-list.component.d.ts +24 -0
- package/lib/features/preview-list/preview-list.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +52 -0
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/configuration/configuration.service.d.ts +33 -0
- package/lib/features/projectable-forms/configuration/configuration.service.d.ts.map +1 -0
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts +45 -0
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/edge-router/edge-router-form.service.d.ts +29 -0
- package/lib/features/projectable-forms/edge-router/edge-router-form.service.d.ts.map +1 -0
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts +22 -0
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.d.ts +15 -0
- package/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/form-header/form-header.component.d.ts +23 -0
- package/lib/features/projectable-forms/form-header/form-header.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts +70 -0
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/identity/identity-form.service.d.ts +20 -0
- package/lib/features/projectable-forms/identity/identity-form.service.d.ts.map +1 -0
- package/lib/features/projectable-forms/projectable-form.class.d.ts +39 -0
- package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -0
- package/lib/features/projectable-forms/service/service-form.component.d.ts +62 -0
- package/lib/features/projectable-forms/service/service-form.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/service/service-form.service.d.ts +96 -0
- package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -0
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts +140 -0
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +58 -0
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts +37 -0
- package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts.map +1 -0
- package/lib/features/qr-code/qr-code.component.d.ts +40 -0
- package/lib/features/qr-code/qr-code.component.d.ts.map +1 -0
- package/lib/features/reset-enrollment/reset-enrollment.component.d.ts +27 -0
- package/lib/features/reset-enrollment/reset-enrollment.component.d.ts.map +1 -0
- package/lib/features/reset-enrollment/reset-enrollment.service.d.ts +13 -0
- package/lib/features/reset-enrollment/reset-enrollment.service.d.ts.map +1 -0
- package/lib/features/side-modal/side-modal.component.d.ts +15 -0
- package/lib/features/side-modal/side-modal.component.d.ts.map +1 -0
- package/lib/features/sidebars/side-banner/side-banner.component.d.ts +7 -0
- package/lib/features/sidebars/side-banner/side-banner.component.d.ts.map +1 -0
- package/lib/features/sidebars/side-navbar/side-navbar.component.d.ts +16 -0
- package/lib/features/sidebars/side-navbar/side-navbar.component.d.ts.map +1 -0
- package/lib/features/sidebars/side-toolbar/side-toolbar.component.d.ts +34 -0
- package/lib/features/sidebars/side-toolbar/side-toolbar.component.d.ts.map +1 -0
- package/lib/features/tag-selector/tag-selector.component.d.ts +59 -0
- package/lib/features/tag-selector/tag-selector.component.d.ts.map +1 -0
- package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts +53 -0
- package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts.map +1 -0
- package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts +21 -0
- package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts.map +1 -0
- package/lib/features/wrappers/node-wrapper.service.d.ts +24 -0
- package/lib/features/wrappers/node-wrapper.service.d.ts.map +1 -0
- package/lib/features/wrappers/zac-wrapper-service.class.d.ts +38 -0
- package/lib/features/wrappers/zac-wrapper-service.class.d.ts.map +1 -0
- package/lib/features/wrappers/zac-wrapper.component.d.ts +31 -0
- package/lib/features/wrappers/zac-wrapper.component.d.ts.map +1 -0
- package/lib/features/wrappers/zac-wrapper.service.d.ts +56 -0
- package/lib/features/wrappers/zac-wrapper.service.d.ts.map +1 -0
- package/lib/models/config.d.ts +6 -0
- package/lib/models/config.d.ts.map +1 -0
- package/lib/models/edge-router.d.ts +10 -0
- package/lib/models/edge-router.d.ts.map +1 -0
- package/lib/models/identity.d.ts +16 -0
- package/lib/models/identity.d.ts.map +1 -0
- package/lib/models/service-policy.d.ts +9 -0
- package/lib/models/service-policy.d.ts.map +1 -0
- package/lib/models/service.d.ts +9 -0
- package/lib/models/service.d.ts.map +1 -0
- package/lib/pages/configurations/configurations-page.component.d.ts +29 -0
- package/lib/pages/configurations/configurations-page.component.d.ts.map +1 -0
- package/lib/pages/configurations/configurations-page.service.d.ts +78 -0
- package/lib/pages/configurations/configurations-page.service.d.ts.map +1 -0
- package/lib/pages/edge-routers/edge-routers-page.component.d.ts +38 -0
- package/lib/pages/edge-routers/edge-routers-page.component.d.ts.map +1 -0
- package/lib/pages/edge-routers/edge-routers-page.service.d.ts +47 -0
- package/lib/pages/edge-routers/edge-routers-page.service.d.ts.map +1 -0
- package/lib/pages/identities/identities-page.component.d.ts +44 -0
- package/lib/pages/identities/identities-page.component.d.ts.map +1 -0
- package/lib/pages/identities/identities-page.service.d.ts +54 -0
- package/lib/pages/identities/identities-page.service.d.ts.map +1 -0
- package/lib/pages/service-policies/service-policies-page.component.d.ts +36 -0
- package/lib/pages/service-policies/service-policies-page.component.d.ts.map +1 -0
- package/lib/pages/service-policies/service-policies-page.service.d.ts +63 -0
- package/lib/pages/service-policies/service-policies-page.service.d.ts.map +1 -0
- package/lib/pages/services/services-page.component.d.ts +37 -0
- package/lib/pages/services/services-page.component.d.ts.map +1 -0
- package/lib/pages/services/services-page.service.d.ts +46 -0
- package/lib/pages/services/services-page.service.d.ts.map +1 -0
- package/lib/safe.pipe.d.ts +11 -0
- package/lib/safe.pipe.d.ts.map +1 -0
- package/lib/services/console-events.service.d.ts +12 -0
- package/lib/services/console-events.service.d.ts.map +1 -0
- package/lib/services/csv-download.service.d.ts +11 -0
- package/lib/services/csv-download.service.d.ts.map +1 -0
- package/lib/services/deactivate-guard.service.d.ts +14 -0
- package/lib/services/deactivate-guard.service.d.ts.map +1 -0
- package/lib/services/login-service.class.d.ts +22 -0
- package/lib/services/login-service.class.d.ts.map +1 -0
- package/lib/services/node-data.service.d.ts +32 -0
- package/lib/services/node-data.service.d.ts.map +1 -0
- package/lib/services/noop-login.service.d.ts +23 -0
- package/lib/services/noop-login.service.d.ts.map +1 -0
- package/lib/services/schema.service.d.ts +63 -0
- package/lib/services/schema.service.d.ts.map +1 -0
- package/lib/services/settings-service.class.d.ts +35 -0
- package/lib/services/settings-service.class.d.ts.map +1 -0
- package/lib/services/settings.service.d.ts +18 -0
- package/lib/services/settings.service.d.ts.map +1 -0
- package/lib/services/tab-name.service.d.ts +20 -0
- package/lib/services/tab-name.service.d.ts.map +1 -0
- package/lib/services/validation.service.d.ts +13 -0
- package/lib/services/validation.service.d.ts.map +1 -0
- package/lib/services/ziti-controller-data.service.d.ts +32 -0
- package/lib/services/ziti-controller-data.service.d.ts.map +1 -0
- package/lib/services/ziti-data.service.d.ts +40 -0
- package/lib/services/ziti-data.service.d.ts.map +1 -0
- package/lib/services/ziti-domain-controller.service.d.ts +13 -0
- package/lib/services/ziti-domain-controller.service.d.ts.map +1 -0
- package/lib/shared/list-page-component.class.d.ts +52 -0
- package/lib/shared/list-page-component.class.d.ts.map +1 -0
- package/lib/shared/list-page-service.class.d.ts +47 -0
- package/lib/shared/list-page-service.class.d.ts.map +1 -0
- package/lib/version.d.ts +4 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/zac-routing.module.d.ts +8 -0
- package/lib/zac-routing.module.d.ts.map +1 -0
- package/lib/ziti-console-lib.module.d.ts +85 -0
- package/lib/ziti-console-lib.module.d.ts.map +1 -0
- package/lib/ziti-console.constants.d.ts +4 -0
- package/lib/ziti-console.constants.d.ts.map +1 -0
- package/openziti-ziti-console-lib.d.ts.map +1 -0
- package/package.json +48 -0
- package/public-api.d.ts +68 -0
- package/public-api.d.ts.map +1 -0
package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.component.mjs
ADDED
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
/* eslint prefer-const: 1 */
|
|
2
|
+
import { Component, Inject, ViewEncapsulation, } from '@angular/core';
|
|
3
|
+
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
4
|
+
import { SETTINGS_SERVICE, } from '../../../services/settings.service';
|
|
5
|
+
import { ZITI_DATA_SERVICE, } from '../../../services/ziti-data.service';
|
|
6
|
+
import * as d3 from 'd3';
|
|
7
|
+
import _ from 'lodash';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "./identity-service-path.helper";
|
|
10
|
+
import * as i2 from "@angular/router";
|
|
11
|
+
import * as i3 from "@angular/material/dialog";
|
|
12
|
+
import * as i4 from "@angular/common";
|
|
13
|
+
import * as i5 from "@angular/forms";
|
|
14
|
+
import * as i6 from "@angular/material/autocomplete";
|
|
15
|
+
import * as i7 from "@angular/material/core";
|
|
16
|
+
import * as i8 from "../../loading-indicator/loading-indicator.component";
|
|
17
|
+
import * as i9 from "../../../services/settings.service";
|
|
18
|
+
import * as i10 from "../../../services/ziti-data.service";
|
|
19
|
+
class IdentityServicePathComponent {
|
|
20
|
+
constructor(identityServicePathHelper, settingsService, zitiService, router, dialogRef, data) {
|
|
21
|
+
this.identityServicePathHelper = identityServicePathHelper;
|
|
22
|
+
this.settingsService = settingsService;
|
|
23
|
+
this.zitiService = zitiService;
|
|
24
|
+
this.router = router;
|
|
25
|
+
this.dialogRef = dialogRef;
|
|
26
|
+
this.data = data;
|
|
27
|
+
this.refreshRotate = false;
|
|
28
|
+
this.closeRotate = true;
|
|
29
|
+
this.filterText = 'fetching services..';
|
|
30
|
+
this.noSearchResults = false;
|
|
31
|
+
this.autocompleteOptions = [];
|
|
32
|
+
this.fullScreen = false;
|
|
33
|
+
this.endpoints = [];
|
|
34
|
+
this.selectedService = '';
|
|
35
|
+
this.doEndpointHasAppwans = false;
|
|
36
|
+
this.doEndpointHasPublicRouters = false;
|
|
37
|
+
this.doEndpointHasServicesInPrivateNw = false;
|
|
38
|
+
this.isLoading = false;
|
|
39
|
+
this.countGrp2Nds = 0;
|
|
40
|
+
this.countGrp3Nds = 0;
|
|
41
|
+
this.endpointData = data.identity;
|
|
42
|
+
}
|
|
43
|
+
ngOnInit() {
|
|
44
|
+
this.getEndpointNetworkAsCode();
|
|
45
|
+
this.autocompleteOptions = [];
|
|
46
|
+
this.isLoading = true;
|
|
47
|
+
}
|
|
48
|
+
getEndpointNetworkAsCode() {
|
|
49
|
+
const pagesize = 500;
|
|
50
|
+
const services_paging = {
|
|
51
|
+
searchOn: 'name',
|
|
52
|
+
filter: '',
|
|
53
|
+
total: pagesize,
|
|
54
|
+
page: 1,
|
|
55
|
+
sort: 'name',
|
|
56
|
+
order: 'asc',
|
|
57
|
+
};
|
|
58
|
+
this.zitiService
|
|
59
|
+
.get(`identities/${this.endpointData.id}/services`, services_paging, [])
|
|
60
|
+
.then((result) => {
|
|
61
|
+
this.services = result.data;
|
|
62
|
+
this.closeRotate = false;
|
|
63
|
+
if (!this.services || this.services.length === 0) {
|
|
64
|
+
this.services = [];
|
|
65
|
+
this.serviceOptions = [];
|
|
66
|
+
this.serviceOptions.push(noServices());
|
|
67
|
+
this.selectedService = 'Services not found for a selected identity';
|
|
68
|
+
this.isLoading = false;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
72
|
+
const promises = [];
|
|
73
|
+
for (let page = 2; page <= pages; page++) {
|
|
74
|
+
services_paging.page = page;
|
|
75
|
+
const tmp_promise = this.zitiService
|
|
76
|
+
.get(`identities/${this.endpointData.id}/services`, services_paging, [])
|
|
77
|
+
.then((pageResult) => {
|
|
78
|
+
pageResult.data.forEach((serv) => {
|
|
79
|
+
this.services.push(serv);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
promises.push(tmp_promise);
|
|
83
|
+
}
|
|
84
|
+
Promise.all(promises).then(() => {
|
|
85
|
+
this.zitiService
|
|
86
|
+
.get(`identities/${this.endpointData.id}/edge-routers`, {}, [])
|
|
87
|
+
.then((result) => {
|
|
88
|
+
this.edgerouters = [];
|
|
89
|
+
result.data.forEach((rec) => {
|
|
90
|
+
this.edgerouters.push(rec);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
this.serviceOptions = createServiceOptions(this.services);
|
|
94
|
+
this.filterText =
|
|
95
|
+
this.serviceOptions.length === 0
|
|
96
|
+
? ''
|
|
97
|
+
: this.serviceOptions[0].name;
|
|
98
|
+
this.selectedService =
|
|
99
|
+
this.serviceOptions.length === 0
|
|
100
|
+
? 'Services not found for a selected identity'
|
|
101
|
+
: this.serviceOptions[0].name;
|
|
102
|
+
this.autocompleteOptions = this.serviceOptions;
|
|
103
|
+
this.serviceChanged();
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
function createServiceOptions(_services) {
|
|
108
|
+
const options = [];
|
|
109
|
+
const serviceNames = [];
|
|
110
|
+
_services?.find((srvice) => {
|
|
111
|
+
if (!serviceNames.includes(srvice.name)) {
|
|
112
|
+
serviceNames.push(srvice.name);
|
|
113
|
+
const sd = new ServiceData();
|
|
114
|
+
sd.id = srvice.id;
|
|
115
|
+
sd.name = srvice.name;
|
|
116
|
+
options.push(sd);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return options;
|
|
120
|
+
}
|
|
121
|
+
function noServices() {
|
|
122
|
+
const sd = new ServiceData();
|
|
123
|
+
sd.id = '';
|
|
124
|
+
sd.name = 'NO SERVICES';
|
|
125
|
+
return sd;
|
|
126
|
+
}
|
|
127
|
+
} // end of getEndpointNetworkAsCode
|
|
128
|
+
filterSearchArray() {
|
|
129
|
+
this.autocompleteOptions = [];
|
|
130
|
+
this.autocompleteOptions = this.serviceOptions.filter((option) => option.name.toLowerCase().includes(this.selectedService.toLowerCase()));
|
|
131
|
+
}
|
|
132
|
+
clearSearchFilter() {
|
|
133
|
+
this.filterText = 'You can filter services by typing here';
|
|
134
|
+
this.autocompleteOptions = this.serviceOptions;
|
|
135
|
+
this.selectedService = '';
|
|
136
|
+
}
|
|
137
|
+
autocompleteSearch(event) {
|
|
138
|
+
this.serviceChanged();
|
|
139
|
+
}
|
|
140
|
+
serviceChanged() {
|
|
141
|
+
this.isLoading = true;
|
|
142
|
+
const allPromises = [];
|
|
143
|
+
let serviceOb = null;
|
|
144
|
+
let service_configs = [];
|
|
145
|
+
serviceOb = this.services && this.services.find((rec) => {
|
|
146
|
+
return (rec.name === this.selectedService);
|
|
147
|
+
});
|
|
148
|
+
if (!serviceOb) {
|
|
149
|
+
this.isLoading = false;
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const configs_url = this.getLinkForResource(serviceOb, 'configs');
|
|
153
|
+
const configPromise = this.zitiService
|
|
154
|
+
.get(configs_url, {}, [])
|
|
155
|
+
.then((configs) => {
|
|
156
|
+
service_configs = configs && configs.data ? configs.data : [];
|
|
157
|
+
});
|
|
158
|
+
const service_edge_router_policies_url = this.getLinkForResource(serviceOb, 'service-edge-router-policies');
|
|
159
|
+
const service_policies_url = this.getLinkForResource(serviceOb, 'service-policies').replace('./', ''); // dial, Bind info
|
|
160
|
+
let bindPolicies = [];
|
|
161
|
+
let bindIdnetities = [];
|
|
162
|
+
const promise2 = this.zitiService
|
|
163
|
+
.get(service_policies_url, {}, [])
|
|
164
|
+
.then((policies) => {
|
|
165
|
+
const identityPromises = [];
|
|
166
|
+
_.isArray(policies.data) && policies.data.forEach((policy) => {
|
|
167
|
+
if (policy.type === 'Bind') {
|
|
168
|
+
const bindIdentitiesUrl = this.getLinkForResource(policy, 'identities');
|
|
169
|
+
const promse = this.zitiService
|
|
170
|
+
.get(bindIdentitiesUrl.replace('./', ''), {}, [])
|
|
171
|
+
.then((res) => {
|
|
172
|
+
if (res && res.data.length > 0) {
|
|
173
|
+
res.data.forEach((rs) => {
|
|
174
|
+
this.addItemToArray(bindIdnetities, rs);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
this.addItemToArray(bindIdnetities, res.data);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
identityPromises.push(promse);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
Promise.all(identityPromises).then(() => {
|
|
185
|
+
this.startVisProcess(bindIdnetities, serviceOb, service_configs);
|
|
186
|
+
this.isLoading = false;
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
addItemToArray(bindIdnetities, ob) {
|
|
191
|
+
if (!bindIdnetities.find((item) => item.id === ob.id)) {
|
|
192
|
+
bindIdnetities.push(ob);
|
|
193
|
+
}
|
|
194
|
+
return bindIdnetities;
|
|
195
|
+
}
|
|
196
|
+
getLinkForResource(ob, resource) {
|
|
197
|
+
return ob['_links'][resource]['href'];
|
|
198
|
+
}
|
|
199
|
+
startVisProcess(bindIdnetities, selectedServiceOb, serviceConfigs) {
|
|
200
|
+
this.countGrp2Nds = 0;
|
|
201
|
+
this.countGrp3Nds = 0;
|
|
202
|
+
if (_.isEmpty(this.selectedService)) {
|
|
203
|
+
this.serviceSelectError = !_.isEmpty(this.selectedService);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
this.graphJsonObj = this.identityServicePathHelper.getEndpointGraphObj(this.endpointData, bindIdnetities, this.edgerouters, selectedServiceOb, serviceConfigs);
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
console.log('Error in creating graph', err);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
let countGrp1Nds = 0;
|
|
214
|
+
this.doEndpointHasServicesInPrivateNw = false;
|
|
215
|
+
this.doEndpointHasPublicRouters = false;
|
|
216
|
+
this.doEndpointHasAppwans = false;
|
|
217
|
+
this.graphJsonObj.nodes.forEach((nd) => {
|
|
218
|
+
if (nd.group === '3') {
|
|
219
|
+
this.countGrp3Nds++;
|
|
220
|
+
}
|
|
221
|
+
if (nd.group.includes('2')) {
|
|
222
|
+
this.countGrp2Nds++;
|
|
223
|
+
}
|
|
224
|
+
if (nd.group === '1') {
|
|
225
|
+
countGrp1Nds++;
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
if (this.countGrp3Nds > 0) {
|
|
229
|
+
this.doEndpointHasServicesInPrivateNw = true; // show private/customer network box, will be decided with this variable.
|
|
230
|
+
}
|
|
231
|
+
if (this.countGrp2Nds > 0) {
|
|
232
|
+
this.doEndpointHasPublicRouters = true; // show public network box, will be decided with this variable.
|
|
233
|
+
}
|
|
234
|
+
if (countGrp1Nds > 0) {
|
|
235
|
+
this.doEndpointHasAppwans = true; // show private network box, will be decided with this variable.
|
|
236
|
+
}
|
|
237
|
+
this.initTopoView();
|
|
238
|
+
}
|
|
239
|
+
toggleModalSize() {
|
|
240
|
+
this.fullScreen = !this.fullScreen;
|
|
241
|
+
}
|
|
242
|
+
hide() {
|
|
243
|
+
this.dialogRef.close();
|
|
244
|
+
}
|
|
245
|
+
initTopoView() {
|
|
246
|
+
const margin = { top: 10, right: 90, bottom: 30, left: 0 };
|
|
247
|
+
const width = 1100 - margin.left - margin.right;
|
|
248
|
+
const height = 1100 - margin.top - margin.bottom;
|
|
249
|
+
const colors = d3.scaleOrdinal(d3.schemeCategory10);
|
|
250
|
+
const tooltip = d3.select('#epTooltip');
|
|
251
|
+
let svg = d3.select('#IdentityTopology'), node, link;
|
|
252
|
+
const handleZoom = (e) => svg.attr('transform', e.transform);
|
|
253
|
+
const zoom = d3.zoom().on('zoom', handleZoom);
|
|
254
|
+
svg
|
|
255
|
+
.attr('width', '100%')
|
|
256
|
+
.attr('height', '100%')
|
|
257
|
+
// .call(zoom)
|
|
258
|
+
.attr('viewBox', '0 ' + -10 + ' ' + width + ' ' + height)
|
|
259
|
+
.append('g')
|
|
260
|
+
.attr('transform', 'translate(' + -300 + ',' + 225 + ')');
|
|
261
|
+
svg.selectAll('g').remove();
|
|
262
|
+
const simulation = d3
|
|
263
|
+
.forceSimulation()
|
|
264
|
+
.force('link', d3
|
|
265
|
+
.forceLink()
|
|
266
|
+
.id(function (d) {
|
|
267
|
+
return d.id;
|
|
268
|
+
})
|
|
269
|
+
.distance(100)
|
|
270
|
+
.strength(1))
|
|
271
|
+
.force('charge', d3.forceManyBody())
|
|
272
|
+
.force('center', d3.forceCenter(width / 2, height / 2));
|
|
273
|
+
const links = this.graphJsonObj.links;
|
|
274
|
+
const nodes = this.graphJsonObj.nodes;
|
|
275
|
+
link = svg
|
|
276
|
+
.selectAll('g.line.line')
|
|
277
|
+
.data(links)
|
|
278
|
+
.enter()
|
|
279
|
+
.append('g')
|
|
280
|
+
.attr('class', 'link')
|
|
281
|
+
.attr('marker-end', 'url(#arrowhead)');
|
|
282
|
+
link
|
|
283
|
+
.append('line')
|
|
284
|
+
.style('stroke-width', function (d) {
|
|
285
|
+
if (d.status === 1 || d.status === -1) {
|
|
286
|
+
return 1.5; //Math.sqrt(d.weight);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
return 1;
|
|
290
|
+
}
|
|
291
|
+
})
|
|
292
|
+
.style('stroke', function (d) {
|
|
293
|
+
if (d.status === 1) {
|
|
294
|
+
let doInUsage = false;
|
|
295
|
+
return '#00cd13';
|
|
296
|
+
}
|
|
297
|
+
else if (d.status === -1) {
|
|
298
|
+
return '#d8dce7';
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
return '#ff004e';
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
link.each(function (d, i) {
|
|
305
|
+
const _this = d3.select(this);
|
|
306
|
+
if (d.status === 1) {
|
|
307
|
+
let doInUsage = true; // false;
|
|
308
|
+
_this
|
|
309
|
+
.append('text')
|
|
310
|
+
// .text(d.netspeed)
|
|
311
|
+
.style('fill', 'rgb(255,198,22)')
|
|
312
|
+
.style('font-size', '11');
|
|
313
|
+
_this
|
|
314
|
+
.append('rect')
|
|
315
|
+
.attr('fill', function (d) {
|
|
316
|
+
return '#555';
|
|
317
|
+
})
|
|
318
|
+
.attr('width', function (d) {
|
|
319
|
+
if (doInUsage) {
|
|
320
|
+
return 3;
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
return 0.1;
|
|
324
|
+
}
|
|
325
|
+
})
|
|
326
|
+
.attr('height', function (d) {
|
|
327
|
+
if (doInUsage) {
|
|
328
|
+
return 3;
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
return 0.1;
|
|
332
|
+
}
|
|
333
|
+
})
|
|
334
|
+
.append('animate');
|
|
335
|
+
_this.select('rect').append('animate');
|
|
336
|
+
}
|
|
337
|
+
else if (d.status === 0) {
|
|
338
|
+
_this
|
|
339
|
+
.append('image')
|
|
340
|
+
.attr('xlink:href', function () {
|
|
341
|
+
return '/assets/images/visualizer/link-cut.png';
|
|
342
|
+
})
|
|
343
|
+
.attr('width', '20')
|
|
344
|
+
.attr('height', '24');
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
node = svg
|
|
348
|
+
.selectAll('.node')
|
|
349
|
+
.data(nodes)
|
|
350
|
+
.enter()
|
|
351
|
+
.append('g')
|
|
352
|
+
.attr('class', 'node');
|
|
353
|
+
node
|
|
354
|
+
.append('image')
|
|
355
|
+
.attr('xlink:href', function (d) {
|
|
356
|
+
const routerImagePath = '/assets/images/visualizer/Routers.png';
|
|
357
|
+
const nonProvisionedRouterImagePath = '/assets/images/visualizer/ER.png';
|
|
358
|
+
const errRouterImagePath = '/assets/images/visualizer/error_er.png';
|
|
359
|
+
const errEndpointImagePath = '/assets/images/visualizer/host-error.png';
|
|
360
|
+
const unregisteredEndpointImagePath = '/assets/images/visualizer/host_unregistered.png';
|
|
361
|
+
const endPointPath = '/assets/images/visualizer/host.png';
|
|
362
|
+
if (d.type.includes('Identity') && d.status === 'Un-Registered') {
|
|
363
|
+
return unregisteredEndpointImagePath;
|
|
364
|
+
}
|
|
365
|
+
else if (d.type.includes('Identity') &&
|
|
366
|
+
d.apiSession === 'Yes' &&
|
|
367
|
+
d.status === 'Registered') {
|
|
368
|
+
return endPointPath;
|
|
369
|
+
}
|
|
370
|
+
else if (d.type.includes('Identity') &&
|
|
371
|
+
(d.routerConnection === 'No' || d.apiSession === 'No')) {
|
|
372
|
+
return errEndpointImagePath;
|
|
373
|
+
}
|
|
374
|
+
else if (d.type.includes('Identity')) {
|
|
375
|
+
return endPointPath;
|
|
376
|
+
}
|
|
377
|
+
else if (d.type.includes('Router') &&
|
|
378
|
+
(d.status === 'ERROR' || d.online === 'No')) {
|
|
379
|
+
return errRouterImagePath;
|
|
380
|
+
}
|
|
381
|
+
else if (d.type.includes('Router') && d.status === 'PROVISIONED') {
|
|
382
|
+
return routerImagePath;
|
|
383
|
+
}
|
|
384
|
+
else if (d.type.includes('Router')) {
|
|
385
|
+
return nonProvisionedRouterImagePath;
|
|
386
|
+
}
|
|
387
|
+
if (d.group === '4') {
|
|
388
|
+
return '/assets/images/visualizer/service.png';
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
return '';
|
|
392
|
+
}
|
|
393
|
+
})
|
|
394
|
+
.attr('x', -25)
|
|
395
|
+
.attr('y', -25)
|
|
396
|
+
.attr('width', '40')
|
|
397
|
+
.attr('height', '40');
|
|
398
|
+
// node.append('title') .text(function (d) {return d.name;});
|
|
399
|
+
node
|
|
400
|
+
.append('text')
|
|
401
|
+
.attr('x', 10)
|
|
402
|
+
.attr('y', 12)
|
|
403
|
+
.style('font-weight', '600')
|
|
404
|
+
.text(function (d) {
|
|
405
|
+
// const name = d.type.includes('Service') ? d.alias : d.name;
|
|
406
|
+
return d.name;
|
|
407
|
+
});
|
|
408
|
+
simulation.nodes(nodes).on('tick', ticked);
|
|
409
|
+
simulation.force('link').links(links);
|
|
410
|
+
node.on('mouseover', (event, d) => {
|
|
411
|
+
const endpointUtlizationJson = {};
|
|
412
|
+
drawTooltip(event, d, endpointUtlizationJson);
|
|
413
|
+
});
|
|
414
|
+
node.on('mouseout', function () {
|
|
415
|
+
removeTooltip();
|
|
416
|
+
});
|
|
417
|
+
function ticked() {
|
|
418
|
+
node.attr('transform', function (d) {
|
|
419
|
+
return 'translate(' + d.posx + ',' + d.posy + ')';
|
|
420
|
+
});
|
|
421
|
+
link
|
|
422
|
+
.select('line')
|
|
423
|
+
.attr('x1', function (d) {
|
|
424
|
+
return d.source.posx;
|
|
425
|
+
})
|
|
426
|
+
.attr('y1', function (d) {
|
|
427
|
+
return d.source.posy;
|
|
428
|
+
})
|
|
429
|
+
.attr('x2', function (d) {
|
|
430
|
+
return d.target.posx;
|
|
431
|
+
})
|
|
432
|
+
.attr('y2', function (d) {
|
|
433
|
+
return d.target.posy;
|
|
434
|
+
});
|
|
435
|
+
link
|
|
436
|
+
.select('image')
|
|
437
|
+
.attr('x', function (d) {
|
|
438
|
+
const x1 = d.source.posx, x2 = d.target.posx, x = x1 - (x1 - x2) / 2;
|
|
439
|
+
return x - 8;
|
|
440
|
+
})
|
|
441
|
+
.attr('y', function (d) {
|
|
442
|
+
const y1 = d.source.posy, y2 = d.target.posy, y = y1 - (y1 - y2) / 2;
|
|
443
|
+
return y - 12;
|
|
444
|
+
});
|
|
445
|
+
link
|
|
446
|
+
.select('rect')
|
|
447
|
+
.attr('opacity', 1)
|
|
448
|
+
.attr('x', function (d) {
|
|
449
|
+
return d.source.posx;
|
|
450
|
+
})
|
|
451
|
+
.attr('y', function (d) {
|
|
452
|
+
return d.source.posy;
|
|
453
|
+
})
|
|
454
|
+
.selectAll('animate')
|
|
455
|
+
.each(function (d, i) {
|
|
456
|
+
if (i === 0) {
|
|
457
|
+
d3.select(this)
|
|
458
|
+
.attr('attributeName', function (d) {
|
|
459
|
+
return 'x';
|
|
460
|
+
})
|
|
461
|
+
.attr('from', function (d) {
|
|
462
|
+
const n = d.source.posx - 1;
|
|
463
|
+
return n;
|
|
464
|
+
})
|
|
465
|
+
.attr('to', function (d) {
|
|
466
|
+
return d.target.posx;
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
d3.select(this)
|
|
471
|
+
.attr('attributeName', function (d) {
|
|
472
|
+
return 'y';
|
|
473
|
+
})
|
|
474
|
+
.attr('from', function (d) {
|
|
475
|
+
return d.source.posy;
|
|
476
|
+
})
|
|
477
|
+
.attr('to', function (d) {
|
|
478
|
+
return d.target.posy;
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
d3.select(this)
|
|
482
|
+
.attr('attributeType', 'XML')
|
|
483
|
+
.attr('begin', '0.5s')
|
|
484
|
+
.attr('dur', function (d) {
|
|
485
|
+
return '1.0s';
|
|
486
|
+
})
|
|
487
|
+
.attr('repeatCount', 'indefinite');
|
|
488
|
+
});
|
|
489
|
+
} // end of ticked
|
|
490
|
+
function removeTooltip() {
|
|
491
|
+
if (tooltip) {
|
|
492
|
+
tooltip.style('display', 'none');
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
function drawTooltip(event, d, endpointUtlizationJson) {
|
|
496
|
+
document.getElementById('epTooltip').innerHTML = readKeyValues(d, endpointUtlizationJson); // readObjectValues(d);
|
|
497
|
+
tooltip.style('display', 'block');
|
|
498
|
+
tooltip.style('white-space', 'pre-wrap');
|
|
499
|
+
const x = event.pageX + 'px';
|
|
500
|
+
const y = event.pageY + 'px';
|
|
501
|
+
tooltip.style('left', x);
|
|
502
|
+
tooltip.style('top', y);
|
|
503
|
+
}
|
|
504
|
+
function readKeyValues(d, endpointUtlizationJson) {
|
|
505
|
+
let info = "<div class='tool-tip-container' style='font-size:14px;font-family:Open Sans; font-weight: 600; font-color: var(--tableText);'>";
|
|
506
|
+
const keys = Object.keys(d);
|
|
507
|
+
keys.forEach(function (k) {
|
|
508
|
+
if (k === 'status' ||
|
|
509
|
+
k === 'posy' ||
|
|
510
|
+
k === 'posx' ||
|
|
511
|
+
k === 'group' ||
|
|
512
|
+
k === 'hostedEdgeId' ||
|
|
513
|
+
k === 'value' ||
|
|
514
|
+
k === 'index' ||
|
|
515
|
+
k === 'parent' ||
|
|
516
|
+
k === 'depth' ||
|
|
517
|
+
k === 'x' ||
|
|
518
|
+
k === 'y' ||
|
|
519
|
+
k === 'id' ||
|
|
520
|
+
k === 'x0' ||
|
|
521
|
+
k === 'y0' ||
|
|
522
|
+
k === 'vy' ||
|
|
523
|
+
k === 'vx') {
|
|
524
|
+
// continue;
|
|
525
|
+
}
|
|
526
|
+
else if (k === 'children') {
|
|
527
|
+
const kVal = d[k];
|
|
528
|
+
if (kVal && kVal !== '') {
|
|
529
|
+
info = info + '<div class="prop-row"><div class="prop-name">' + k + ':</div><div class="prop-val">' + kVal.length + '</div></div>';
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
if (isAnObject(d[k])) {
|
|
534
|
+
const kVal = d[k];
|
|
535
|
+
if (kVal && kVal !== '') {
|
|
536
|
+
info = info + '<div class="prop-row"><div class="prop-name">' + k + ':</div><div class="prop-val">' + kVal.name + '</div></div>';
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
else if (d[k] instanceof Array) {
|
|
540
|
+
info =
|
|
541
|
+
info +
|
|
542
|
+
'<div class="prop-row"><div class="prop-name">' +
|
|
543
|
+
k +
|
|
544
|
+
':</div><div class="prop-val">' +
|
|
545
|
+
d[k].join('<br> ') +
|
|
546
|
+
'</div></div>';
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
const vo = d[k];
|
|
550
|
+
if (vo && vo !== '') {
|
|
551
|
+
info =
|
|
552
|
+
info +
|
|
553
|
+
'<div class="prop-row"><div class="prop-name">' +
|
|
554
|
+
k +
|
|
555
|
+
':</div><div class="prop-val">' +
|
|
556
|
+
(vo !== null || vo !== '' ? d[k] : 'N/A') +
|
|
557
|
+
'</div></div>';
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
});
|
|
562
|
+
return info + '</div>';
|
|
563
|
+
}
|
|
564
|
+
function isAnObject(o) {
|
|
565
|
+
return o instanceof Object && o.constructor === Object;
|
|
566
|
+
}
|
|
567
|
+
this.refreshRotate = false;
|
|
568
|
+
} // end of initTopoView
|
|
569
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IdentityServicePathComponent, deps: [{ token: i1.IdentityServicePathHelper }, { token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i2.Router }, { token: i3.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
570
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: IdentityServicePathComponent, selector: "app-identity-visualizer", ngImport: i0, template: "<div [ngClass]=\"{ 'full-screen': fullScreen }\" class=\"modal solid\" id=\"IdentityVisualizerDataModal\">\n <div class=\"tp-data-header\">\n <div class=\"modaltitle\">Identity Service Path</div>\n <div (click)=\"hide()\" class=\"buttonBall icon-close\" id=\"EscZEndpointClose\"></div>\n <div (click)=\"toggleModalSize()\" class=\"buttonBall resize\" id=\"ResizeModalButton\"></div>\n </div>\n\n <div class=\"identity-topology-container\">\n\n <div style=\"width: 100%; height: 80px; float: left\">\n <div class=\"ep-topology-filter-container listBox row\">\n <input\n (keyup)=\"filterSearchArray()\"\n [(ngModel)]=\"selectedService\"\n [matAutocomplete]=\"auto\"\n class=\"topology-filter-input\"\n id=\"filterText\"\n matInput\n placeholder=\"Type to search identity accessible services.\"\n />\n\n <div\n (click)=\"clearSearchFilter()\"\n *ngIf=\"filterText\"\n class=\"clear-svc-icon icon-close\"\n id=\"ClearSearchFilter\"\n ></div>\n <div [hidden]=\"!noSearchResults\" class=\"no-results-warning\">No Results Found</div>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"autocompleteSearch($event)\">\n <mat-option *ngFor=\"let option of autocompleteOptions\" [value]=\"option.name\">\n {{ option.name }}\n </mat-option>\n </mat-autocomplete>\n </div>\n </div>\n\n <div class=\"topotip\" id=\"epTooltip\"></div>\n\n <svg style='pointer-events:all' height=\"1000\" id=\"IdentityTopology\" width=\"1200\">\n </svg>\n <lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n\n <div class=\"topology-legendA\">\n <div class=\"legend-item-head\">\n <div class=\"legend-text-heading\">Component Status</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle unregistered\"></div>\n <div class=\"legend-text\">Unregistered / Offline</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_in_use\"></div>\n <div class=\"legend-text\">Registered, Online</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle errored\"></div>\n <div class=\"legend-text\">Errored</div>\n </div>\n </div>\n\n <div class=\"topology-legendB\">\n <div class=\"legend-item-head\">\n <div class=\"legend-text-heading\">Link Status</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle unregistered\"></div>\n <div class=\"legend-text\">Offline</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_in_use\"></div>\n <div class=\"legend-text\">In Usage</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_not_in_use\"></div>\n <div class=\"legend-text\">Usage Date N/A</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle linkerrored\"></div>\n <div class=\"legend-text\">Errored</div>\n </div>\n </div>\n\n </div>\n</div>\n", styles: ["#IdentityVisualizerDataModal{overflow:hidden;width:75%;height:85%;background-color:var(--background);border-radius:25px;z-index:1001;margin:auto;inset:0;position:fixed}#IdentityVisualizerDataModal .buttonBall{cursor:pointer;font-weight:600}#IdentityVisualizerDataModal .buttonBall.icon-close{position:absolute;top:20px;right:20px;font-size:23px;color:var(--icon)}#IdentityVisualizerDataModal .buttonBall:hover{filter:brightness(50%)}#IdentityVisualizerDataModal .clear-svc-icon{font-size:23px;font-weight:600;position:absolute;top:15px;right:40px;color:var(--icon);cursor:pointer}#IdentityVisualizerDataModal .clear-svc-icon:hover{filter:brightness(50%)}#IdentityVisualizerDataModal.full-screen{width:100%;height:100%;border-radius:0}#IdentityVisualizerDataModal .ep-topology-filter-container{width:37%;display:flex;flex-direction:row;position:absolute;margin:20px;padding:0}#IdentityVisualizerDataModal .buttonBall.resize{top:20px;width:23px;height:23px;right:55px;background-image:url(/assets/svgs/Resize.svg);background-size:23px 23px;position:absolute;cursor:pointer}#IdentityVisualizerDataModal .identity-topology-container{display:flex;margin-left:-5px;margin-top:10px;flex-direction:column;cursor:grab;background:#f5e9f2;background-image:linear-gradient(#ecd3e6 2px,transparent 0),linear-gradient(90deg,#ecd3e6 2px,transparent 0),linear-gradient(#ecd3e6 1px,transparent 0),linear-gradient(90deg,#ecd3e6 1px,transparent 0);background-size:40px 40px,40px 40px,10px 10px,10px 10px}#IdentityVisualizerDataModal .tp-data-header{height:40px;font-size:25px;font-weight:600;margin-left:20px;margin-top:10px;margin-bottom:5px;font-family:Russo One;color:var(--primaryColor);font-size:30px;text-transform:uppercase;font-weight:400}#IdentityVisualizerDataModal .node text{font:12px Open Sans,Arial,sans-serif}#IdentityVisualizerDataModal .modaltitle{filter:brightness(50%);padding-top:6px;padding-left:5px}#IdentityVisualizerDataModal .modalbuttons{padding-right:20px}#IdentityVisualizerDataModal .listBox.row .close{position:fixed;display:flex;flex-direction:column;font-family:icomoon!important;font-style:normal;font-weight:600;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--icon);text-align:center;font-size:35px;line-height:40px;left:35%;top:17%;width:40px;height:40px;background-image:url(/assets/svgs/close.svg);z-index:600;background-position:center center;background-size:75%;cursor:pointer;transition:.3s;justify-content:end;align-items:center}#IdentityVisualizerDataModal .tp-topo-data-header{border:0px solid black;height:1200px;font-size:12px;font-weight:400;margin-left:12px;margin-top:3px;color:var(--primaryColor)}#IdentityVisualizerDataModal .services-select{width:400px;flex-shrink:0;border-radius:27px;height:51px;margin-left:22px;margin-top:10px;background-color:#fff;border-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);color:var(--tableText);padding-left:20px}#IdentityVisualizerDataModal select{background-image:url(/assets/svgs/ArrowDown.svg);background-position:center right 15px;background-repeat:no-repeat;background-size:18px;padding-right:47px}#IdentityVisualizerDataModal .topology-filter-input{height:50px;width:95%;border-radius:25px;border-color:var(--navigation);background-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding-left:20px}#IdentityVisualizerDataModal .topotip{display:none;position:fixed;background:var(--navigation);border:0px;border-radius:12px;pointer-events:none;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .3s;padding:5px 0;font-size:17px;font-weight:700;color:var(--tableText);z-index:2000;opacity:1;max-width:450px}#IdentityVisualizerDataModal .topology-legendA{border:0px solid blue;width:200px;border-radius:12px;margin-bottom:10px;margin-right:10px;position:absolute;display:inline-block;top:75px;right:0;background:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding:0 10px 5px;margin-top:0}#IdentityVisualizerDataModal .topology-legendB{width:200px;border:0px solid blue;border-radius:12px;margin-bottom:10px;margin-right:10px;position:absolute;top:200px;right:0;background:var(--navigation);display:inline-block;box-shadow:0 20px 23px 0 var(--shadow);padding:0 10px 5px;margin-left:10px}#IdentityVisualizerDataModal .legend-item{width:100%;height:100%;display:inline-block}#IdentityVisualizerDataModal .legend-item-head{width:105%;height:100%;display:inline-block;border:0px solid blue;left:-3px}#IdentityVisualizerDataModal .legend-circle{height:12px;width:12px;border-radius:15px;display:inline-block;margin-top:7px}#IdentityVisualizerDataModal .legend-circle.unregistered{background-color:#d8dce7}#IdentityVisualizerDataModal .legend-circle.registered_not_in_use{border:1px solid #08dc5a;background-color:#fff}#IdentityVisualizerDataModal .legend-circle.registered_in_use{background-color:#08dc5a}#IdentityVisualizerDataModal .legend-circle.errored{background-color:#fb0d3d}#IdentityVisualizerDataModal .legend-circle.linkerrored{background-image:url(/assets/images/visualizer/link-cut.png);background-size:contain}#IdentityVisualizerDataModal .legend-text{display:inline-block;font-size:15px;font-weight:600;color:var(--tableText);padding-left:7px;padding-bottom:4px}#IdentityVisualizerDataModal .legend-text-heading{text-align:center;display:inline-block;font-size:14px;font-weight:600;color:var(--tableText);padding-left:10px;padding-top:2px;padding-bottom:2px;color:#8a2be2}#IdentityVisualizerDataModal .legend-text2{display:inline-block;font-size:10px;font-weight:400;color:var(--tableText);padding-left:2px;padding-bottom:4px}#IdentityVisualizerDataModal .filters-area{display:flex;flex-direction:row;align-items:center;justify-content:flex-end;margin-top:10px}#IdentityVisualizerDataModal .dateTimeField input{height:40px;vertical-align:middle;margin-right:1px}#IdentityVisualizerDataModal .p-datepicker table td{padding:0}#IdentityVisualizerDataModal .p-datepicker table td>span{padding:0}#IdentityVisualizerDataModal .p-timepicker{padding:1px}#IdentityVisualizerDataModal .p-datepicker-header,#IdentityVisualizerDataModal .p-datepicker-header-group{padding:0}#IdentityVisualizerDataModal .p-datepicker .p-timepicker button:last-child{height:15px}#IdentityVisualizerDataModal .p-datepicker .p-timepicker button{height:15px}#IdentityVisualizerDataModal .ng-tns-c15-3{font-size:15px;font-weight:700}#IdentityVisualizerDataModal .p-datepicker .p-datepicker-buttonbar{padding:0}#IdentityVisualizerDataModal .reset-button{height:50px;width:50px;margin-top:-7%;margin-left:70%;border-radius:50px;margin-right:10px;background-size:contain;--background-image: url(/assets/svgs/refresh.svg);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 20px 23px 0 var(--shadow);transition:.3s}#IdentityVisualizerDataModal .refresh-button{position:absolute;display:inline-block;height:43px;width:122px;margin-top:-85px;margin-left:65%;border-radius:10px;margin-right:10px;font-color:blue;font-weight:700}#IdentityVisualizerDataModal .reset-button:hover{filter:brightness(90%);transform:scale(.97);transition:.3s}#IdentityVisualizerDataModal .reset-button:active{transform:scale(.9);transition:.3s}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#IdentityVisualizerDataModal .rotating{animation:rotating 2s linear infinite}.tool-tip-container .prop-row{display:grid;grid-template-columns:2fr 3fr;grid-gap:10px;grid-template-areas:\"propName propVal\";height:-moz-fit-content;height:fit-content;min-height:25px;align-items:center;padding:0 10px}.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}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
571
|
+
}
|
|
572
|
+
export { IdentityServicePathComponent };
|
|
573
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IdentityServicePathComponent, decorators: [{
|
|
574
|
+
type: Component,
|
|
575
|
+
args: [{ selector: 'app-identity-visualizer', encapsulation: ViewEncapsulation.None, template: "<div [ngClass]=\"{ 'full-screen': fullScreen }\" class=\"modal solid\" id=\"IdentityVisualizerDataModal\">\n <div class=\"tp-data-header\">\n <div class=\"modaltitle\">Identity Service Path</div>\n <div (click)=\"hide()\" class=\"buttonBall icon-close\" id=\"EscZEndpointClose\"></div>\n <div (click)=\"toggleModalSize()\" class=\"buttonBall resize\" id=\"ResizeModalButton\"></div>\n </div>\n\n <div class=\"identity-topology-container\">\n\n <div style=\"width: 100%; height: 80px; float: left\">\n <div class=\"ep-topology-filter-container listBox row\">\n <input\n (keyup)=\"filterSearchArray()\"\n [(ngModel)]=\"selectedService\"\n [matAutocomplete]=\"auto\"\n class=\"topology-filter-input\"\n id=\"filterText\"\n matInput\n placeholder=\"Type to search identity accessible services.\"\n />\n\n <div\n (click)=\"clearSearchFilter()\"\n *ngIf=\"filterText\"\n class=\"clear-svc-icon icon-close\"\n id=\"ClearSearchFilter\"\n ></div>\n <div [hidden]=\"!noSearchResults\" class=\"no-results-warning\">No Results Found</div>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"autocompleteSearch($event)\">\n <mat-option *ngFor=\"let option of autocompleteOptions\" [value]=\"option.name\">\n {{ option.name }}\n </mat-option>\n </mat-autocomplete>\n </div>\n </div>\n\n <div class=\"topotip\" id=\"epTooltip\"></div>\n\n <svg style='pointer-events:all' height=\"1000\" id=\"IdentityTopology\" width=\"1200\">\n </svg>\n <lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n\n <div class=\"topology-legendA\">\n <div class=\"legend-item-head\">\n <div class=\"legend-text-heading\">Component Status</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle unregistered\"></div>\n <div class=\"legend-text\">Unregistered / Offline</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_in_use\"></div>\n <div class=\"legend-text\">Registered, Online</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle errored\"></div>\n <div class=\"legend-text\">Errored</div>\n </div>\n </div>\n\n <div class=\"topology-legendB\">\n <div class=\"legend-item-head\">\n <div class=\"legend-text-heading\">Link Status</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle unregistered\"></div>\n <div class=\"legend-text\">Offline</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_in_use\"></div>\n <div class=\"legend-text\">In Usage</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_not_in_use\"></div>\n <div class=\"legend-text\">Usage Date N/A</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle linkerrored\"></div>\n <div class=\"legend-text\">Errored</div>\n </div>\n </div>\n\n </div>\n</div>\n", styles: ["#IdentityVisualizerDataModal{overflow:hidden;width:75%;height:85%;background-color:var(--background);border-radius:25px;z-index:1001;margin:auto;inset:0;position:fixed}#IdentityVisualizerDataModal .buttonBall{cursor:pointer;font-weight:600}#IdentityVisualizerDataModal .buttonBall.icon-close{position:absolute;top:20px;right:20px;font-size:23px;color:var(--icon)}#IdentityVisualizerDataModal .buttonBall:hover{filter:brightness(50%)}#IdentityVisualizerDataModal .clear-svc-icon{font-size:23px;font-weight:600;position:absolute;top:15px;right:40px;color:var(--icon);cursor:pointer}#IdentityVisualizerDataModal .clear-svc-icon:hover{filter:brightness(50%)}#IdentityVisualizerDataModal.full-screen{width:100%;height:100%;border-radius:0}#IdentityVisualizerDataModal .ep-topology-filter-container{width:37%;display:flex;flex-direction:row;position:absolute;margin:20px;padding:0}#IdentityVisualizerDataModal .buttonBall.resize{top:20px;width:23px;height:23px;right:55px;background-image:url(/assets/svgs/Resize.svg);background-size:23px 23px;position:absolute;cursor:pointer}#IdentityVisualizerDataModal .identity-topology-container{display:flex;margin-left:-5px;margin-top:10px;flex-direction:column;cursor:grab;background:#f5e9f2;background-image:linear-gradient(#ecd3e6 2px,transparent 0),linear-gradient(90deg,#ecd3e6 2px,transparent 0),linear-gradient(#ecd3e6 1px,transparent 0),linear-gradient(90deg,#ecd3e6 1px,transparent 0);background-size:40px 40px,40px 40px,10px 10px,10px 10px}#IdentityVisualizerDataModal .tp-data-header{height:40px;font-size:25px;font-weight:600;margin-left:20px;margin-top:10px;margin-bottom:5px;font-family:Russo One;color:var(--primaryColor);font-size:30px;text-transform:uppercase;font-weight:400}#IdentityVisualizerDataModal .node text{font:12px Open Sans,Arial,sans-serif}#IdentityVisualizerDataModal .modaltitle{filter:brightness(50%);padding-top:6px;padding-left:5px}#IdentityVisualizerDataModal .modalbuttons{padding-right:20px}#IdentityVisualizerDataModal .listBox.row .close{position:fixed;display:flex;flex-direction:column;font-family:icomoon!important;font-style:normal;font-weight:600;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--icon);text-align:center;font-size:35px;line-height:40px;left:35%;top:17%;width:40px;height:40px;background-image:url(/assets/svgs/close.svg);z-index:600;background-position:center center;background-size:75%;cursor:pointer;transition:.3s;justify-content:end;align-items:center}#IdentityVisualizerDataModal .tp-topo-data-header{border:0px solid black;height:1200px;font-size:12px;font-weight:400;margin-left:12px;margin-top:3px;color:var(--primaryColor)}#IdentityVisualizerDataModal .services-select{width:400px;flex-shrink:0;border-radius:27px;height:51px;margin-left:22px;margin-top:10px;background-color:#fff;border-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);color:var(--tableText);padding-left:20px}#IdentityVisualizerDataModal select{background-image:url(/assets/svgs/ArrowDown.svg);background-position:center right 15px;background-repeat:no-repeat;background-size:18px;padding-right:47px}#IdentityVisualizerDataModal .topology-filter-input{height:50px;width:95%;border-radius:25px;border-color:var(--navigation);background-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding-left:20px}#IdentityVisualizerDataModal .topotip{display:none;position:fixed;background:var(--navigation);border:0px;border-radius:12px;pointer-events:none;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .3s;padding:5px 0;font-size:17px;font-weight:700;color:var(--tableText);z-index:2000;opacity:1;max-width:450px}#IdentityVisualizerDataModal .topology-legendA{border:0px solid blue;width:200px;border-radius:12px;margin-bottom:10px;margin-right:10px;position:absolute;display:inline-block;top:75px;right:0;background:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding:0 10px 5px;margin-top:0}#IdentityVisualizerDataModal .topology-legendB{width:200px;border:0px solid blue;border-radius:12px;margin-bottom:10px;margin-right:10px;position:absolute;top:200px;right:0;background:var(--navigation);display:inline-block;box-shadow:0 20px 23px 0 var(--shadow);padding:0 10px 5px;margin-left:10px}#IdentityVisualizerDataModal .legend-item{width:100%;height:100%;display:inline-block}#IdentityVisualizerDataModal .legend-item-head{width:105%;height:100%;display:inline-block;border:0px solid blue;left:-3px}#IdentityVisualizerDataModal .legend-circle{height:12px;width:12px;border-radius:15px;display:inline-block;margin-top:7px}#IdentityVisualizerDataModal .legend-circle.unregistered{background-color:#d8dce7}#IdentityVisualizerDataModal .legend-circle.registered_not_in_use{border:1px solid #08dc5a;background-color:#fff}#IdentityVisualizerDataModal .legend-circle.registered_in_use{background-color:#08dc5a}#IdentityVisualizerDataModal .legend-circle.errored{background-color:#fb0d3d}#IdentityVisualizerDataModal .legend-circle.linkerrored{background-image:url(/assets/images/visualizer/link-cut.png);background-size:contain}#IdentityVisualizerDataModal .legend-text{display:inline-block;font-size:15px;font-weight:600;color:var(--tableText);padding-left:7px;padding-bottom:4px}#IdentityVisualizerDataModal .legend-text-heading{text-align:center;display:inline-block;font-size:14px;font-weight:600;color:var(--tableText);padding-left:10px;padding-top:2px;padding-bottom:2px;color:#8a2be2}#IdentityVisualizerDataModal .legend-text2{display:inline-block;font-size:10px;font-weight:400;color:var(--tableText);padding-left:2px;padding-bottom:4px}#IdentityVisualizerDataModal .filters-area{display:flex;flex-direction:row;align-items:center;justify-content:flex-end;margin-top:10px}#IdentityVisualizerDataModal .dateTimeField input{height:40px;vertical-align:middle;margin-right:1px}#IdentityVisualizerDataModal .p-datepicker table td{padding:0}#IdentityVisualizerDataModal .p-datepicker table td>span{padding:0}#IdentityVisualizerDataModal .p-timepicker{padding:1px}#IdentityVisualizerDataModal .p-datepicker-header,#IdentityVisualizerDataModal .p-datepicker-header-group{padding:0}#IdentityVisualizerDataModal .p-datepicker .p-timepicker button:last-child{height:15px}#IdentityVisualizerDataModal .p-datepicker .p-timepicker button{height:15px}#IdentityVisualizerDataModal .ng-tns-c15-3{font-size:15px;font-weight:700}#IdentityVisualizerDataModal .p-datepicker .p-datepicker-buttonbar{padding:0}#IdentityVisualizerDataModal .reset-button{height:50px;width:50px;margin-top:-7%;margin-left:70%;border-radius:50px;margin-right:10px;background-size:contain;--background-image: url(/assets/svgs/refresh.svg);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 20px 23px 0 var(--shadow);transition:.3s}#IdentityVisualizerDataModal .refresh-button{position:absolute;display:inline-block;height:43px;width:122px;margin-top:-85px;margin-left:65%;border-radius:10px;margin-right:10px;font-color:blue;font-weight:700}#IdentityVisualizerDataModal .reset-button:hover{filter:brightness(90%);transform:scale(.97);transition:.3s}#IdentityVisualizerDataModal .reset-button:active{transform:scale(.9);transition:.3s}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#IdentityVisualizerDataModal .rotating{animation:rotating 2s linear infinite}.tool-tip-container .prop-row{display:grid;grid-template-columns:2fr 3fr;grid-gap:10px;grid-template-areas:\"propName propVal\";height:-moz-fit-content;height:fit-content;min-height:25px;align-items:center;padding:0 10px}.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}\n"] }]
|
|
576
|
+
}], ctorParameters: function () { return [{ type: i1.IdentityServicePathHelper }, { type: i9.SettingsService, decorators: [{
|
|
577
|
+
type: Inject,
|
|
578
|
+
args: [SETTINGS_SERVICE]
|
|
579
|
+
}] }, { type: i10.ZitiDataService, decorators: [{
|
|
580
|
+
type: Inject,
|
|
581
|
+
args: [ZITI_DATA_SERVICE]
|
|
582
|
+
}] }, { type: i2.Router }, { type: i3.MatDialogRef }, { type: undefined, decorators: [{
|
|
583
|
+
type: Inject,
|
|
584
|
+
args: [MAT_DIALOG_DATA]
|
|
585
|
+
}] }]; } });
|
|
586
|
+
class ServiceData {
|
|
587
|
+
}
|
|
588
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHktc2VydmljZS1wYXRoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy92aXN1YWxpemVyL2lkZW50aXR5LXNlcnZpY2UtcGF0aC9pZGVudGl0eS1zZXJ2aWNlLXBhdGguY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Zpc3VhbGl6ZXIvaWRlbnRpdHktc2VydmljZS1wYXRoL2lkZW50aXR5LXNlcnZpY2UtcGF0aC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUNMLFNBQVMsRUFFVCxNQUFNLEVBRU4saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFFekUsT0FBTyxFQUNMLGdCQUFnQixHQUVqQixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxpQkFBaUIsR0FFbEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUU3QyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUV6QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7OztBQU12QixNQU1hLDRCQUE0QjtJQXdCdkMsWUFDVSx5QkFBb0QsRUFDM0IsZUFBZ0MsRUFDOUIsV0FBNEIsRUFDdkQsTUFBYyxFQUNkLFNBQXFELEVBQzdCLElBQVM7UUFMakMsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUMzQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQ3ZELFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUE0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ZXNsaW50IHByZWZlci1jb25zdDogMSAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBWaWV3Q2hpbGQsXG4gIEluamVjdCxcbiAgT25Jbml0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgU0VUVElOR1NfU0VSVklDRSxcbiAgU2V0dGluZ3NTZXJ2aWNlLFxufSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFpJVElfREFUQV9TRVJWSUNFLFxuICBaaXRpRGF0YVNlcnZpY2UsXG59IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ppdGktZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IElkZW50aXR5U2VydmljZVBhdGhIZWxwZXIgfSBmcm9tICcuL2lkZW50aXR5LXNlcnZpY2UtcGF0aC5oZWxwZXInO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWlkZW50aXR5LXZpc3VhbGl6ZXInLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZVVybDogJy4vaWRlbnRpdHktc2VydmljZS1wYXRoLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaWRlbnRpdHktc2VydmljZS1wYXRoLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIElkZW50aXR5U2VydmljZVBhdGhDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgZDM7XG4gIHJlZnJlc2hSb3RhdGUgPSBmYWxzZTtcbiAgY2xvc2VSb3RhdGUgPSB0cnVlO1xuICBmaWx0ZXJUZXh0ID0gJ2ZldGNoaW5nIHNlcnZpY2VzLi4nO1xuICBub1NlYXJjaFJlc3VsdHMgPSBmYWxzZTtcbiAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xuICBmdWxsU2NyZWVuID0gZmFsc2U7XG4gIHNlcnZpY2VPcHRpb25zOiBhbnk7XG4gIGVuZHBvaW50RGF0YTtcbiAgbmV0d29ya0dyYXBoO1xuICBncmFwaEpzb25PYmo7XG4gIHNlcnZpY2VzO1xuICBlZGdlcm91dGVycztcbiAgZW5kcG9pbnRzID0gW107XG4gIHNlbGVjdGVkU2VydmljZSA9ICcnO1xuICBzZXJ2aWNlU2VsZWN0RXJyb3I7XG4gIGRvRW5kcG9pbnRIYXNBcHB3YW5zID0gZmFsc2U7XG4gIGRvRW5kcG9pbnRIYXNQdWJsaWNSb3V0ZXJzID0gZmFsc2U7XG4gIGRvRW5kcG9pbnRIYXNTZXJ2aWNlc0luUHJpdmF0ZU53ID0gZmFsc2U7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICBjb3VudEdycDJOZHMgPSAwO1xuICBjb3VudEdycDNOZHMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaWRlbnRpdHlTZXJ2aWNlUGF0aEhlbHBlcjogSWRlbnRpdHlTZXJ2aWNlUGF0aEhlbHBlcixcbiAgICBASW5qZWN0KFNFVFRJTkdTX1NFUlZJQ0UpIHB1YmxpYyBzZXR0aW5nc1NlcnZpY2U6IFNldHRpbmdzU2VydmljZSxcbiAgICBASW5qZWN0KFpJVElfREFUQV9TRVJWSUNFKSBwcml2YXRlIHppdGlTZXJ2aWNlOiBaaXRpRGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPElkZW50aXR5U2VydmljZVBhdGhDb21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55XG4gICkge1xuICAgIHRoaXMuZW5kcG9pbnREYXRhID0gZGF0YS5pZGVudGl0eTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0RW5kcG9pbnROZXR3b3JrQXNDb2RlKCk7XG4gICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gW107XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICB9XG5cbiAgZ2V0RW5kcG9pbnROZXR3b3JrQXNDb2RlKCkge1xuICAgIGNvbnN0IHBhZ2VzaXplID0gNTAwO1xuICAgIGNvbnN0IHNlcnZpY2VzX3BhZ2luZyA9IHtcbiAgICAgIHNlYXJjaE9uOiAnbmFtZScsXG4gICAgICBmaWx0ZXI6ICcnLFxuICAgICAgdG90YWw6IHBhZ2VzaXplLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHNvcnQ6ICduYW1lJyxcbiAgICAgIG9yZGVyOiAnYXNjJyxcbiAgICB9O1xuXG4gICAgdGhpcy56aXRpU2VydmljZVxuICAgICAgLmdldChgaWRlbnRpdGllcy8ke3RoaXMuZW5kcG9pbnREYXRhLmlkfS9zZXJ2aWNlc2AsIHNlcnZpY2VzX3BhZ2luZywgW10pXG4gICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIHRoaXMuc2VydmljZXMgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgdGhpcy5jbG9zZVJvdGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghdGhpcy5zZXJ2aWNlcyB8fCB0aGlzLnNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc2VydmljZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLnNlcnZpY2VPcHRpb25zID0gW107XG4gICAgICAgICAgdGhpcy5zZXJ2aWNlT3B0aW9ucy5wdXNoKG5vU2VydmljZXMoKSk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFNlcnZpY2UgPSAnU2VydmljZXMgbm90IGZvdW5kIGZvciBhIHNlbGVjdGVkIGlkZW50aXR5JztcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgIGNvbnN0IHRtcF9wcm9taXNlID0gdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAuZ2V0KFxuICAgICAgICAgICAgICAgIGBpZGVudGl0aWVzLyR7dGhpcy5lbmRwb2ludERhdGEuaWR9L3NlcnZpY2VzYCxcbiAgICAgICAgICAgICAgICBzZXJ2aWNlc19wYWdpbmcsXG4gICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAudGhlbigocGFnZVJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzLnB1c2goc2Vydik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0bXBfcHJvbWlzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAgICAgLmdldChgaWRlbnRpdGllcy8ke3RoaXMuZW5kcG9pbnREYXRhLmlkfS9lZGdlLXJvdXRlcnNgLCB7fSwgW10pXG4gICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkZ2Vyb3V0ZXJzID0gW107XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRhdGEuZm9yRWFjaCgocmVjKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmVkZ2Vyb3V0ZXJzLnB1c2gocmVjKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VPcHRpb25zID0gY3JlYXRlU2VydmljZU9wdGlvbnModGhpcy5zZXJ2aWNlcyk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlclRleHQgPVxuICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VPcHRpb25zLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICA6IHRoaXMuc2VydmljZU9wdGlvbnNbMF0ubmFtZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlID1cbiAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlT3B0aW9ucy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICA/ICdTZXJ2aWNlcyBub3QgZm91bmQgZm9yIGEgc2VsZWN0ZWQgaWRlbnRpdHknXG4gICAgICAgICAgICAgICAgOiB0aGlzLnNlcnZpY2VPcHRpb25zWzBdLm5hbWU7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLnNlcnZpY2VPcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlQ2hhbmdlZCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VPcHRpb25zKF9zZXJ2aWNlcykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IFtdO1xuICAgICAgY29uc3Qgc2VydmljZU5hbWVzID0gW107XG4gICAgICBfc2VydmljZXM/LmZpbmQoKHNydmljZSkgPT4ge1xuICAgICAgICBpZiAoIXNlcnZpY2VOYW1lcy5pbmNsdWRlcyhzcnZpY2UubmFtZSkpIHtcbiAgICAgICAgICBzZXJ2aWNlTmFtZXMucHVzaChzcnZpY2UubmFtZSk7XG4gICAgICAgICAgY29uc3Qgc2QgPSBuZXcgU2VydmljZURhdGEoKTtcbiAgICAgICAgICBzZC5pZCA9IHNydmljZS5pZDtcbiAgICAgICAgICBzZC5uYW1lID0gc3J2aWNlLm5hbWU7XG4gICAgICAgICAgb3B0aW9ucy5wdXNoKHNkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub1NlcnZpY2VzKCkge1xuICAgICAgY29uc3Qgc2QgPSBuZXcgU2VydmljZURhdGEoKTtcbiAgICAgIHNkLmlkID0gJyc7XG4gICAgICBzZC5uYW1lID0gJ05PIFNFUlZJQ0VTJztcbiAgICAgIHJldHVybiBzZDtcbiAgICB9XG4gIH0gLy8gZW5kIG9mIGdldEVuZHBvaW50TmV0d29ya0FzQ29kZVxuXG4gIGZpbHRlclNlYXJjaEFycmF5KCkge1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IHRoaXMuc2VydmljZU9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+XG4gICAgICBvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnRvTG93ZXJDYXNlKCkpXG4gICAgKTtcbiAgfVxuXG4gIGNsZWFyU2VhcmNoRmlsdGVyKCkge1xuICAgIHRoaXMuZmlsdGVyVGV4dCA9ICdZb3UgY2FuIGZpbHRlciBzZXJ2aWNlcyBieSB0eXBpbmcgaGVyZSc7XG4gICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5zZXJ2aWNlT3B0aW9ucztcbiAgICB0aGlzLnNlbGVjdGVkU2VydmljZSA9ICcnO1xuICB9XG5cbiAgYXV0b2NvbXBsZXRlU2VhcmNoKGV2ZW50KSB7XG4gICAgdGhpcy5zZXJ2aWNlQ2hhbmdlZCgpO1xuICB9XG5cbiAgc2VydmljZUNoYW5nZWQoKSB7XG4gICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgY29uc3QgYWxsUHJvbWlzZXMgPSBbXTtcbiAgICAgbGV0IHNlcnZpY2VPYiA9IG51bGw7XG4gICAgIGxldCBzZXJ2aWNlX2NvbmZpZ3MgPSBbXTtcblxuICAgICBzZXJ2aWNlT2IgPSB0aGlzLnNlcnZpY2VzICYmIHRoaXMuc2VydmljZXMuZmluZCgocmVjKSA9PiB7XG4gICAgICByZXR1cm4gIChyZWMubmFtZSA9PT0gdGhpcy5zZWxlY3RlZFNlcnZpY2UpO1xuICAgICB9KTtcblxuICAgICBpZiAoIXNlcnZpY2VPYikge1xuICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgcmV0dXJuO1xuICAgICB9XG5cbiAgICAgY29uc3QgY29uZmlnc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShzZXJ2aWNlT2IsICdjb25maWdzJyk7XG5cbiAgICAgY29uc3QgY29uZmlnUHJvbWlzZSA9IHRoaXMueml0aVNlcnZpY2VcbiAgICAgIC5nZXQoY29uZmlnc191cmwsIHt9LCBbXSlcbiAgICAgIC50aGVuKChjb25maWdzKSA9PiB7XG4gICAgICAgIHNlcnZpY2VfY29uZmlncyA9IGNvbmZpZ3MgJiYgY29uZmlncy5kYXRhID8gY29uZmlncy5kYXRhIDogW107XG4gICAgICB9KTtcbiAgICAgY29uc3Qgc2VydmljZV9lZGdlX3JvdXRlcl9wb2xpY2llc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgIHNlcnZpY2VPYixcbiAgICAgICdzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzJ1xuICAgICApO1xuICAgICBjb25zdCBzZXJ2aWNlX3BvbGljaWVzX3VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKFxuICAgICAgc2VydmljZU9iLFxuICAgICAgJ3NlcnZpY2UtcG9saWNpZXMnXG4gICAgICkucmVwbGFjZSgnLi8nLCAnJyk7IC8vIGRpYWwsIEJpbmQgaW5mb1xuXG4gICAgbGV0IGJpbmRQb2xpY2llcyA9IFtdO1xuICAgIGxldCBiaW5kSWRuZXRpdGllcyA9IFtdO1xuICAgIGNvbnN0IHByb21pc2UyID0gdGhpcy56aXRpU2VydmljZVxuICAgICAgLmdldChzZXJ2aWNlX3BvbGljaWVzX3VybCwge30sIFtdKVxuICAgICAgLnRoZW4oKHBvbGljaWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkZW50aXR5UHJvbWlzZXMgPSBbXTtcbiAgICAgICAgXy5pc0FycmF5KHBvbGljaWVzLmRhdGEpICYmIHBvbGljaWVzLmRhdGEuZm9yRWFjaCgocG9saWN5KSA9PiB7XG4gICAgICAgICAgaWYgKHBvbGljeS50eXBlID09PSAnQmluZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRJZGVudGl0aWVzVXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoXG4gICAgICAgICAgICAgIHBvbGljeSxcbiAgICAgICAgICAgICAgJ2lkZW50aXRpZXMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJvbXNlID0gdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAuZ2V0KGJpbmRJZGVudGl0aWVzVXJsLnJlcGxhY2UoJy4vJywgJycpLCB7fSwgW10pXG4gICAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlcy5kYXRhLmZvckVhY2goKHJzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbVRvQXJyYXkoYmluZElkbmV0aXRpZXMsIHJzKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1Ub0FycmF5KGJpbmRJZG5ldGl0aWVzLCByZXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlkZW50aXR5UHJvbWlzZXMucHVzaChwcm9tc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFByb21pc2UuYWxsKGlkZW50aXR5UHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhcnRWaXNQcm9jZXNzKGJpbmRJZG5ldGl0aWVzLCBzZXJ2aWNlT2IsIHNlcnZpY2VfY29uZmlncyk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFkZEl0ZW1Ub0FycmF5KGJpbmRJZG5ldGl0aWVzLCBvYikge1xuICAgIGlmICghYmluZElkbmV0aXRpZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gb2IuaWQpKSB7XG4gICAgICBiaW5kSWRuZXRpdGllcy5wdXNoKG9iKTtcbiAgICB9XG4gICAgcmV0dXJuIGJpbmRJZG5ldGl0aWVzO1xuICB9XG5cbiAgZ2V0TGlua0ZvclJlc291cmNlKG9iLCByZXNvdXJjZSkge1xuICAgIHJldHVybiBvYlsnX2xpbmtzJ11bcmVzb3VyY2VdWydocmVmJ107XG4gIH1cblxuICBzdGFydFZpc1Byb2Nlc3MoYmluZElkbmV0aXRpZXMsIHNlbGVjdGVkU2VydmljZU9iLCBzZXJ2aWNlQ29uZmlncykge1xuICAgIHRoaXMuY291bnRHcnAyTmRzID0gMDtcbiAgICB0aGlzLmNvdW50R3JwM05kcyA9IDA7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLnNlbGVjdGVkU2VydmljZSkpIHtcbiAgICAgIHRoaXMuc2VydmljZVNlbGVjdEVycm9yID0gIV8uaXNFbXB0eSh0aGlzLnNlbGVjdGVkU2VydmljZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmdyYXBoSnNvbk9iaiA9IHRoaXMuaWRlbnRpdHlTZXJ2aWNlUGF0aEhlbHBlci5nZXRFbmRwb2ludEdyYXBoT2JqKFxuICAgICAgICB0aGlzLmVuZHBvaW50RGF0YSxcbiAgICAgICAgYmluZElkbmV0aXRpZXMsXG4gICAgICAgIHRoaXMuZWRnZXJvdXRlcnMsXG4gICAgICAgIHNlbGVjdGVkU2VydmljZU9iLFxuICAgICAgICBzZXJ2aWNlQ29uZmlnc1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiBjcmVhdGluZyBncmFwaCcsIGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNvdW50R3JwMU5kcyA9IDA7XG4gICAgdGhpcy5kb0VuZHBvaW50SGFzU2VydmljZXNJblByaXZhdGVOdyA9IGZhbHNlO1xuICAgIHRoaXMuZG9FbmRwb2ludEhhc1B1YmxpY1JvdXRlcnMgPSBmYWxzZTtcbiAgICB0aGlzLmRvRW5kcG9pbnRIYXNBcHB3YW5zID0gZmFsc2U7XG4gICAgdGhpcy5ncmFwaEpzb25PYmoubm9kZXMuZm9yRWFjaCgobmQpID0+IHtcbiAgICAgIGlmIChuZC5ncm91cCA9PT0gJzMnKSB7XG4gICAgICAgIHRoaXMuY291bnRHcnAzTmRzKys7XG4gICAgICB9XG4gICAgICBpZiAobmQuZ3JvdXAuaW5jbHVkZXMoJzInKSkge1xuICAgICAgICB0aGlzLmNvdW50R3JwMk5kcysrO1xuICAgICAgfVxuICAgICAgaWYgKG5kLmdyb3VwID09PSAnMScpIHtcbiAgICAgICAgY291bnRHcnAxTmRzKys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jb3VudEdycDNOZHMgPiAwKSB7XG4gICAgICB0aGlzLmRvRW5kcG9pbnRIYXNTZXJ2aWNlc0luUHJpdmF0ZU53ID0gdHJ1ZTsgLy8gc2hvdyBwcml2YXRlL2N1c3RvbWVyIG5ldHdvcmsgYm94LCB3aWxsIGJlIGRlY2lkZWQgd2l0aCB0aGlzIHZhcmlhYmxlLlxuICAgIH1cbiAgICBpZiAodGhpcy5jb3VudEdycDJOZHMgPiAwKSB7XG4gICAgICB0aGlzLmRvRW5kcG9pbnRIYXNQdWJsaWNSb3V0ZXJzID0gdHJ1ZTsgLy8gc2hvdyBwdWJsaWMgbmV0d29yayBib3gsIHdpbGwgYmUgZGVjaWRlZCB3aXRoIHRoaXMgdmFyaWFibGUuXG4gICAgfVxuXG4gICAgaWYgKGNvdW50R3JwMU5kcyA+IDApIHtcbiAgICAgIHRoaXMuZG9FbmRwb2ludEhhc0FwcHdhbnMgPSB0cnVlOyAvLyBzaG93IHByaXZhdGUgbmV0d29yayBib3gsIHdpbGwgYmUgZGVjaWRlZCB3aXRoIHRoaXMgdmFyaWFibGUuXG4gICAgfVxuICAgIHRoaXMuaW5pdFRvcG9WaWV3KCk7XG4gIH1cblxuICB0b2dnbGVNb2RhbFNpemUoKSB7XG4gICAgdGhpcy5mdWxsU2NyZWVuID0gIXRoaXMuZnVsbFNjcmVlbjtcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgfVxuXG4gIGluaXRUb3BvVmlldygpIHtcbiAgICBjb25zdCBtYXJnaW4gPSB7IHRvcDogMTAsIHJpZ2h0OiA5MCwgYm90dG9tOiAzMCwgbGVmdDogMCB9O1xuICAgIGNvbnN0IHdpZHRoID0gMTEwMCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xuICAgIGNvbnN0IGhlaWdodCA9IDExMDAgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbTtcbiAgICBjb25zdCBjb2xvcnMgPSBkMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkxMCk7XG4gICAgY29uc3QgdG9vbHRpcCA9IGQzLnNlbGVjdCgnI2VwVG9vbHRpcCcpO1xuXG4gICAgbGV0IHN2ZyA9IGQzLnNlbGVjdCgnI0lkZW50aXR5VG9wb2xvZ3knKSxcbiAgICAgIG5vZGUsXG4gICAgICBsaW5rO1xuXG4gICAgY29uc3QgaGFuZGxlWm9vbSA9IChlKSA9PiBzdmcuYXR0cigndHJhbnNmb3JtJywgZS50cmFuc2Zvcm0pO1xuICAgIGNvbnN0IHpvb20gPSBkMy56b29tKCkub24oJ3pvb20nLCBoYW5kbGVab29tKTtcblxuICAgIHN2Z1xuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgIC8vIC5jYWxsKHpvb20pXG4gICAgICAuYXR0cigndmlld0JveCcsICcwICcgKyAtMTAgKyAnICcgKyB3aWR0aCArICcgJyArIGhlaWdodClcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIC0zMDAgKyAnLCcgKyAyMjUgKyAnKScpO1xuXG4gICAgc3ZnLnNlbGVjdEFsbCgnZycpLnJlbW92ZSgpO1xuXG4gICAgY29uc3Qgc2ltdWxhdGlvbjogYW55ID0gZDNcbiAgICAgIC5mb3JjZVNpbXVsYXRpb24oKVxuICAgICAgLmZvcmNlKFxuICAgICAgICAnbGluaycsXG4gICAgICAgIGQzXG4gICAgICAgICAgLmZvcmNlTGluaygpXG4gICAgICAgICAgLmlkKGZ1bmN0aW9uIChkOiBhbnkpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmlkO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmRpc3RhbmNlKDEwMClcbiAgICAgICAgICAuc3RyZW5ndGgoMSlcbiAgICAgIClcbiAgICAgIC5mb3JjZSgnY2hhcmdlJywgZDMuZm9yY2VNYW55Qm9keSgpKVxuICAgICAgLmZvcmNlKCdjZW50ZXInLCBkMy5mb3JjZUNlbnRlcih3aWR0aCAvIDIsIGhlaWdodCAvIDIpKTtcblxuICAgIGNvbnN0IGxpbmtzID0gdGhpcy5ncmFwaEpzb25PYmoubGlua3M7XG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLmdyYXBoSnNvbk9iai5ub2RlcztcblxuICAgIGxpbmsgPSBzdmdcbiAgICAgIC5zZWxlY3RBbGwoJ2cubGluZS5saW5lJylcbiAgICAgIC5kYXRhKGxpbmtzKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpbmsnKVxuICAgICAgLmF0dHIoJ21hcmtlci1lbmQnLCAndXJsKCNhcnJvd2hlYWQpJyk7XG5cbiAgICBsaW5rXG4gICAgICAuYXBwZW5kKCdsaW5lJylcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgaWYgKGQuc3RhdHVzID09PSAxIHx8IGQuc3RhdHVzID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiAxLjU7IC8vTWF0aC5zcXJ0KGQud2VpZ2h0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5zdHlsZSgnc3Ryb2tlJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgaWYgKGQuc3RhdHVzID09PSAxKSB7XG4gICAgICAgICAgbGV0IGRvSW5Vc2FnZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiAnIzAwY2QxMyc7XG4gICAgICAgIH0gZWxzZSBpZiAoZC5zdGF0dXMgPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuICcjZDhkY2U3JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJyNmZjAwNGUnO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGxpbmsuZWFjaChmdW5jdGlvbiAodGhpczogYW55LCBkOiBhbnksIGkpIHtcbiAgICAgIGNvbnN0IF90aGlzID0gZDMuc2VsZWN0KHRoaXMpO1xuICAgICAgaWYgKGQuc3RhdHVzID09PSAxKSB7XG4gICAgICAgIGxldCBkb0luVXNhZ2UgPSB0cnVlOyAvLyBmYWxzZTtcbiAgICAgICAgX3RoaXNcbiAgICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAvLyAudGV4dChkLm5ldHNwZWVkKVxuICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IoMjU1LDE5OCwyMiknKVxuICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzExJyk7XG4gICAgICAgIF90aGlzXG4gICAgICAgICAgLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgLmF0dHIoJ2ZpbGwnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuICcjNTU1JztcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICBpZiAoZG9JblVzYWdlKSB7XG4gICAgICAgICAgICAgIHJldHVybiAzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIDAuMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgaWYgKGRvSW5Vc2FnZSkge1xuICAgICAgICAgICAgICByZXR1cm4gMztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAwLjE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuYXBwZW5kKCdhbmltYXRlJyk7XG5cbiAgICAgICAgX3RoaXMuc2VsZWN0KCdyZWN0JykuYXBwZW5kKCdhbmltYXRlJyk7XG4gICAgICB9IGVsc2UgaWYgKGQuc3RhdHVzID09PSAwKSB7XG4gICAgICAgIF90aGlzXG4gICAgICAgICAgLmFwcGVuZCgnaW1hZ2UnKVxuICAgICAgICAgIC5hdHRyKCd4bGluazpocmVmJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICcvYXNzZXRzL2ltYWdlcy92aXN1YWxpemVyL2xpbmstY3V0LnBuZyc7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuYXR0cignd2lkdGgnLCAnMjAnKVxuICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMjQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG5vZGUgPSBzdmdcbiAgICAgIC5zZWxlY3RBbGwoJy5ub2RlJylcbiAgICAgIC5kYXRhKG5vZGVzKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ25vZGUnKTtcblxuICAgIG5vZGVcbiAgICAgIC5hcHBlbmQoJ2ltYWdlJylcbiAgICAgIC5hdHRyKCd4bGluazpocmVmJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgY29uc3Qgcm91dGVySW1hZ2VQYXRoID0gJy9hc3NldHMvaW1hZ2VzL3Zpc3VhbGl6ZXIvUm91dGVycy5wbmcnO1xuICAgICAgICBjb25zdCBub25Qcm92aXNpb25lZFJvdXRlckltYWdlUGF0aCA9XG4gICAgICAgICAgJy9hc3NldHMvaW1hZ2VzL3Zpc3VhbGl6ZXIvRVIucG5nJztcbiAgICAgICAgY29uc3QgZXJyUm91dGVySW1hZ2VQYXRoID0gJy9hc3NldHMvaW1hZ2VzL3Zpc3VhbGl6ZXIvZXJyb3JfZXIucG5nJztcbiAgICAgICAgY29uc3QgZXJyRW5kcG9pbnRJbWFnZVBhdGggPSAnL2Fzc2V0cy9pbWFnZXMvdmlzdWFsaXplci9ob3N0LWVycm9yLnBuZyc7XG4gICAgICAgIGNvbnN0IHVucmVnaXN0ZXJlZEVuZHBvaW50SW1hZ2VQYXRoID1cbiAgICAgICAgICAnL2Fzc2V0cy9pbWFnZXMvdmlzdWFsaXplci9ob3N0X3VucmVnaXN0ZXJlZC5wbmcnO1xuICAgICAgICBjb25zdCBlbmRQb2ludFBhdGggPSAnL2Fzc2V0cy9pbWFnZXMvdmlzdWFsaXplci9ob3N0LnBuZyc7XG5cbiAgICAgICAgaWYgKGQudHlwZS5pbmNsdWRlcygnSWRlbnRpdHknKSAmJiBkLnN0YXR1cyA9PT0gJ1VuLVJlZ2lzdGVyZWQnKSB7XG4gICAgICAgICAgcmV0dXJuIHVucmVnaXN0ZXJlZEVuZHBvaW50SW1hZ2VQYXRoO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGQudHlwZS5pbmNsdWRlcygnSWRlbnRpdHknKSAmJlxuICAgICAgICAgIGQuYXBpU2Vzc2lvbiA9PT0gJ1llcycgJiZcbiAgICAgICAgICBkLnN0YXR1cyA9PT0gJ1JlZ2lzdGVyZWQnXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBlbmRQb2ludFBhdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZC50eXBlLmluY2x1ZGVzKCdJZGVudGl0eScpICYmXG4gICAgICAgICAgKGQucm91dGVyQ29ubmVjdGlvbiA9PT0gJ05vJyB8fCBkLmFwaVNlc3Npb24gPT09ICdObycpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBlcnJFbmRwb2ludEltYWdlUGF0aDtcbiAgICAgICAgfSBlbHNlIGlmIChkLnR5cGUuaW5jbHVkZXMoJ0lkZW50aXR5JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5kUG9pbnRQYXRoO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGQudHlwZS5pbmNsdWRlcygnUm91dGVyJykgJiZcbiAgICAgICAgICAoZC5zdGF0dXMgPT09ICdFUlJPUicgfHwgZC5vbmxpbmUgPT09ICdObycpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBlcnJSb3V0ZXJJbWFnZVBhdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoZC50eXBlLmluY2x1ZGVzKCdSb3V0ZXInKSAmJiBkLnN0YXR1cyA9PT0gJ1BST1ZJU0lPTkVEJykge1xuICAgICAgICAgIHJldHVybiByb3V0ZXJJbWFnZVBhdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoZC50eXBlLmluY2x1ZGVzKCdSb3V0ZXInKSkge1xuICAgICAgICAgIHJldHVybiBub25Qcm92aXNpb25lZFJvdXRlckltYWdlUGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkLmdyb3VwID09PSAnNCcpIHtcbiAgICAgICAgICByZXR1cm4gJy9hc3NldHMvaW1hZ2VzL3Zpc3VhbGl6ZXIvc2VydmljZS5wbmcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5hdHRyKCd4JywgLTI1KVxuICAgICAgLmF0dHIoJ3knLCAtMjUpXG4gICAgICAuYXR0cignd2lkdGgnLCAnNDAnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICc0MCcpO1xuXG4gICAgLy8gbm9kZS5hcHBlbmQoJ3RpdGxlJykgLnRleHQoZnVuY3Rpb24gKGQpIHtyZXR1cm4gZC5uYW1lO30pO1xuXG4gICAgbm9kZVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cigneCcsIDEwKVxuICAgICAgLmF0dHIoJ3knLCAxMilcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC50ZXh0KGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIC8vIGNvbnN0IG5hbWUgPSBkLnR5cGUuaW5jbHVkZXMoJ1NlcnZpY2UnKSA/IGQuYWxpYXMgOiBkLm5hbWU7XG4gICAgICAgIHJldHVybiBkLm5hbWU7XG4gICAgICB9KTtcblxuICAgIHNpbXVsYXRpb24ubm9kZXMobm9kZXMpLm9uKCd0aWNrJywgdGlja2VkKTtcblxuICAgIHNpbXVsYXRpb24uZm9yY2UoJ2xpbmsnKS5saW5rcyhsaW5rcyk7XG4gICAgbm9kZS5vbignbW91c2VvdmVyJywgKGV2ZW50LCBkKSA9PiB7XG4gICAgICBjb25zdCBlbmRwb2ludFV0bGl6YXRpb25Kc29uID0ge307XG4gICAgICBkcmF3VG9vbHRpcChldmVudCwgZCwgZW5kcG9pbnRVdGxpemF0aW9uSnNvbik7XG4gICAgfSk7XG5cbiAgICBub2RlLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbW92ZVRvb2x0aXAoKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHRpY2tlZCgpIHtcbiAgICAgIG5vZGUuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIGQucG9zeCArICcsJyArIGQucG9zeSArICcpJztcbiAgICAgIH0pO1xuXG4gICAgICBsaW5rXG4gICAgICAgIC5zZWxlY3QoJ2xpbmUnKVxuICAgICAgICAuYXR0cigneDEnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLnNvdXJjZS5wb3N4O1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cigneTEnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLnNvdXJjZS5wb3N5O1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cigneDInLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLnRhcmdldC5wb3N4O1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cigneTInLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLnRhcmdldC5wb3N5O1xuICAgICAgICB9KTtcblxuICAgICAgbGlua1xuICAgICAgICAuc2VsZWN0KCdpbWFnZScpXG4gICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICBjb25zdCB4MSA9IGQuc291cmNlLnBvc3gsXG4gICAgICAgICAgICB4MiA9IGQudGFyZ2V0LnBvc3gsXG4gICAgICAgICAgICB4ID0geDEgLSAoeDEgLSB4MikgLyAyO1xuXG4gICAgICAgICAgcmV0dXJuIHggLSA4O1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgY29uc3QgeTEgPSBkLnNvdXJjZS5wb3N5LFxuICAgICAgICAgICAgeTIgPSBkLnRhcmdldC5wb3N5LFxuICAgICAgICAgICAgeSA9IHkxIC0gKHkxIC0geTIpIC8gMjtcblxuICAgICAgICAgIHJldHVybiB5IC0gMTI7XG4gICAgICAgIH0pO1xuXG4gICAgICBsaW5rXG4gICAgICAgIC5zZWxlY3QoJ3JlY3QnKVxuICAgICAgICAuYXR0cignb3BhY2l0eScsIDEpXG4gICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5zb3VyY2UucG9zeDtcbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLnNvdXJjZS5wb3N5O1xuICAgICAgICB9KVxuICAgICAgICAuc2VsZWN0QWxsKCdhbmltYXRlJylcbiAgICAgICAgLmVhY2goZnVuY3Rpb24gKHRoaXM6IGFueSwgZDogYW55LCBpKSB7XG4gICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKVxuICAgICAgICAgICAgICAuYXR0cignYXR0cmlidXRlTmFtZScsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd4JztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmF0dHIoJ2Zyb20nLCBmdW5jdGlvbiAoZDogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IGQuc291cmNlLnBvc3ggLSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuYXR0cigndG8nLCBmdW5jdGlvbiAoZDogYW55KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQudGFyZ2V0LnBvc3g7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkMy5zZWxlY3QodGhpcylcbiAgICAgICAgICAgICAgLmF0dHIoJ2F0dHJpYnV0ZU5hbWUnLCBmdW5jdGlvbiAoZDogYW55KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd5JztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmF0dHIoJ2Zyb20nLCBmdW5jdGlvbiAoZDogYW55KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQuc291cmNlLnBvc3k7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5hdHRyKCd0bycsIGZ1bmN0aW9uIChkOiBhbnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZC50YXJnZXQucG9zeTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZDMuc2VsZWN0KHRoaXMpXG4gICAgICAgICAgICAuYXR0cignYXR0cmlidXRlVHlwZScsICdYTUwnKVxuICAgICAgICAgICAgLmF0dHIoJ2JlZ2luJywgJzAuNXMnKVxuICAgICAgICAgICAgLmF0dHIoJ2R1cicsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgIHJldHVybiAnMS4wcyc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmF0dHIoJ3JlcGVhdENvdW50JywgJ2luZGVmaW5pdGUnKTtcbiAgICAgICAgfSk7XG4gICAgfSAvLyBlbmQgb2YgdGlja2VkXG5cbiAgICBmdW5jdGlvbiByZW1vdmVUb29sdGlwKCkge1xuICAgICAgaWYgKHRvb2x0aXApIHtcbiAgICAgICAgdG9vbHRpcC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZHJhd1Rvb2x0aXAoZXZlbnQsIGQsIGVuZHBvaW50VXRsaXphdGlvbkpzb24pIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcFRvb2x0aXAnKS5pbm5lckhUTUwgPSByZWFkS2V5VmFsdWVzKFxuICAgICAgICBkLFxuICAgICAgICBlbmRwb2ludFV0bGl6YXRpb25Kc29uXG4gICAgICApOyAvLyByZWFkT2JqZWN0VmFsdWVzKGQpO1xuICAgICAgdG9vbHRpcC5zdHlsZSgnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgdG9vbHRpcC5zdHlsZSgnd2hpdGUtc3BhY2UnLCAncHJlLXdyYXAnKTtcbiAgICAgIGNvbnN0IHggPSBldmVudC5wYWdlWCArICdweCc7XG4gICAgICBjb25zdCB5ID0gZXZlbnQucGFnZVkgKyAncHgnO1xuICAgICAgdG9vbHRpcC5zdHlsZSgnbGVmdCcsIHgpO1xuICAgICAgdG9vbHRpcC5zdHlsZSgndG9wJywgeSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVhZEtleVZhbHVlcyhkLCBlbmRwb2ludFV0bGl6YXRpb25Kc29uKSB7XG4gICAgICBsZXQgaW5mbyA9XG4gICAgICAgIFwiPGRpdiBjbGFzcz0ndG9vbC10aXAtY29udGFpbmVyJyBzdHlsZT0nZm9udC1zaXplOjE0cHg7Zm9udC1mYW1pbHk6T3BlbiBTYW5zOyBmb250LXdlaWdodDogNjAwOyBmb250LWNvbG9yOiB2YXIoLS10YWJsZVRleHQpOyc+XCI7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZCk7XG5cbiAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgayA9PT0gJ3N0YXR1cycgfHxcbiAgICAgICAgICBrID09PSAncG9zeScgfHxcbiAgICAgICAgICBrID09PSAncG9zeCcgfHxcbiAgICAgICAgICBrID09PSAnZ3JvdXAnIHx8XG4gICAgICAgICAgayA9PT0gJ2hvc3RlZEVkZ2VJZCcgfHxcbiAgICAgICAgICBrID09PSAndmFsdWUnIHx8XG4gICAgICAgICAgayA9PT0gJ2luZGV4JyB8fFxuICAgICAgICAgIGsgPT09ICdwYXJlbnQnIHx8XG4gICAgICAgICAgayA9PT0gJ2RlcHRoJyB8fFxuICAgICAgICAgIGsgPT09ICd4JyB8fFxuICAgICAgICAgIGsgPT09ICd5JyB8fFxuICAgICAgICAgIGsgPT09ICdpZCcgfHxcbiAgICAgICAgICBrID09PSAneDAnIHx8XG4gICAgICAgICAgayA9PT0gJ3kwJyB8fFxuICAgICAgICAgIGsgPT09ICd2eScgfHxcbiAgICAgICAgICBrID09PSAndngnXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGsgPT09ICdjaGlsZHJlbicpIHtcbiAgICAgICAgICBjb25zdCBrVmFsOiBhbnkgPSBkW2tdO1xuICAgICAgICAgIGlmIChrVmFsICYmIGtWYWwgIT09ICcnKSB7XG4gICAgICAgICAgICBpbmZvID0gaW5mbyArICc8ZGl2IGNsYXNzPVwicHJvcC1yb3dcIj48ZGl2IGNsYXNzPVwicHJvcC1uYW1lXCI+JyArIGsgKyAnOjwvZGl2PjxkaXYgY2xhc3M9XCJwcm9wLXZhbFwiPicgKyBrVmFsLmxlbmd0aCArICc8L2Rpdj48L2Rpdj4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNBbk9iamVjdChkW2tdKSkge1xuICAgICAgICAgICAgY29uc3Qga1ZhbDogYW55ID0gZFtrXTtcbiAgICAgICAgICAgIGlmIChrVmFsICYmIGtWYWwgIT09ICcnKSB7XG4gICAgICAgICAgICAgIGluZm8gPSBpbmZvICsgJzxkaXYgY2xhc3M9XCJwcm9wLXJvd1wiPjxkaXYgY2xhc3M9XCJwcm9wLW5hbWVcIj4nICsgayArICc6PC9kaXY+PGRpdiBjbGFzcz1cInByb3AtdmFsXCI+JyArIGtWYWwubmFtZSArICc8L2Rpdj48L2Rpdj4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZFtrXSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBpbmZvID1cbiAgICAgICAgICAgICAgaW5mbyArXG4gICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwicHJvcC1yb3dcIj48ZGl2IGNsYXNzPVwicHJvcC1uYW1lXCI+JyArXG4gICAgICAgICAgICAgIGsgK1xuICAgICAgICAgICAgICAnOjwvZGl2PjxkaXYgY2xhc3M9XCJwcm9wLXZhbFwiPicgK1xuICAgICAgICAgICAgICBkW2tdLmpvaW4oJzxicj4gJm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOycpICtcbiAgICAgICAgICAgICAgJzwvZGl2PjwvZGl2Pic7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHZvID0gZFtrXTtcbiAgICAgICAgICAgIGlmICh2byAmJiB2byAhPT0gJycpIHtcbiAgICAgICAgICAgICAgaW5mbyA9XG4gICAgICAgICAgICAgICAgaW5mbyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJwcm9wLXJvd1wiPjxkaXYgY2xhc3M9XCJwcm9wLW5hbWVcIj4nICtcbiAgICAgICAgICAgICAgICBrICtcbiAgICAgICAgICAgICAgICAnOjwvZGl2PjxkaXYgY2xhc3M9XCJwcm9wLXZhbFwiPicgK1xuICAgICAgICAgICAgICAgICh2byAhPT0gbnVsbCB8fCB2byAhPT0gJycgPyBkW2tdIDogJ04vQScpICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+PC9kaXY+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaW5mbyArICc8L2Rpdj4nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQW5PYmplY3Qobykge1xuICAgICAgcmV0dXJuIG8gaW5zdGFuY2VvZiBPYmplY3QgJiYgby5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0O1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFJvdGF0ZSA9IGZhbHNlO1xuICB9IC8vIGVuZCBvZiBpbml0VG9wb1ZpZXdcbn1cblxuY2xhc3MgU2VydmljZURhdGEge1xuICBpZDtcbiAgbmFtZTtcbn1cblxuIiwiPGRpdiBbbmdDbGFzc109XCJ7ICdmdWxsLXNjcmVlbic6IGZ1bGxTY3JlZW4gfVwiIGNsYXNzPVwibW9kYWwgc29saWRcIiBpZD1cIklkZW50aXR5VmlzdWFsaXplckRhdGFNb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0cC1kYXRhLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWx0aXRsZVwiPklkZW50aXR5IFNlcnZpY2UgUGF0aDwvZGl2PlxuICAgICAgICA8ZGl2IChjbGljayk9XCJoaWRlKClcIiBjbGFzcz1cImJ1dHRvbkJhbGwgaWNvbi1jbG9zZVwiIGlkPVwiRXNjWkVuZHBvaW50Q2xvc2VcIj48L2Rpdj5cbiAgICAgICAgPGRpdiAoY2xpY2spPVwidG9nZ2xlTW9kYWxTaXplKClcIiBjbGFzcz1cImJ1dHRvbkJhbGwgcmVzaXplXCIgaWQ9XCJSZXNpemVNb2RhbEJ1dHRvblwiPjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlkZW50aXR5LXRvcG9sb2d5LWNvbnRhaW5lclwiPlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiA4MHB4OyBmbG9hdDogbGVmdFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVwLXRvcG9sb2d5LWZpbHRlci1jb250YWluZXIgbGlzdEJveCByb3dcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlclNlYXJjaEFycmF5KClcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU2VydmljZVwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9wb2xvZ3ktZmlsdGVyLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJmaWx0ZXJUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIHRvIHNlYXJjaCBpZGVudGl0eSBhY2Nlc3NpYmxlIHNlcnZpY2VzLlwiXG4gICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VhcmNoRmlsdGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlclRleHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsZWFyLXN2Yy1pY29uIGljb24tY2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICBpZD1cIkNsZWFyU2VhcmNoRmlsdGVyXCJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBbaGlkZGVuXT1cIiFub1NlYXJjaFJlc3VsdHNcIiBjbGFzcz1cIm5vLXJlc3VsdHMtd2FybmluZ1wiPk5vIFJlc3VsdHMgRm91bmQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJhdXRvY29tcGxldGVTZWFyY2goJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGF1dG9jb21wbGV0ZU9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3BvdGlwXCIgaWQ9XCJlcFRvb2x0aXBcIj48L2Rpdj5cblxuICAgICAgICAgICAgPHN2ZyBzdHlsZT0ncG9pbnRlci1ldmVudHM6YWxsJyBoZWlnaHQ9XCIxMDAwXCIgaWQ9XCJJZGVudGl0eVRvcG9sb2d5XCIgd2lkdGg9XCIxMjAwXCI+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxsaWItbG9hZGluZy1pbmRpY2F0b3IgKm5nSWY9XCJpc0xvYWRpbmdcIiBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiPjwvbGliLWxvYWRpbmctaW5kaWNhdG9yPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b3BvbG9neS1sZWdlbmRBXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW0taGVhZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtdGV4dC1oZWFkaW5nXCI+Q29tcG9uZW50IFN0YXR1czwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWNpcmNsZSB1bnJlZ2lzdGVyZWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRleHRcIj5VbnJlZ2lzdGVyZWQgLyBPZmZsaW5lPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtY2lyY2xlIHJlZ2lzdGVyZWRfaW5fdXNlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0XCI+UmVnaXN0ZXJlZCwgT25saW5lPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtY2lyY2xlIGVycm9yZWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRleHRcIj5FcnJvcmVkPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRvcG9sb2d5LWxlZ2VuZEJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbS1oZWFkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0LWhlYWRpbmdcIj5MaW5rIFN0YXR1czwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWNpcmNsZSB1bnJlZ2lzdGVyZWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRleHRcIj5PZmZsaW5lPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtY2lyY2xlIHJlZ2lzdGVyZWRfaW5fdXNlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0XCI+SW4gVXNhZ2U8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1jaXJjbGUgcmVnaXN0ZXJlZF9ub3RfaW5fdXNlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0XCI+VXNhZ2UgRGF0ZSBOL0E8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1jaXJjbGUgbGlua2Vycm9yZWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRleHRcIj5FcnJvcmVkPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19
|