@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
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright NetFoundry Inc.
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { Component, EventEmitter, Input, Output, Inject } from '@angular/core';
|
|
17
|
+
import { ProjectableForm } from "../projectable-form.class";
|
|
18
|
+
import { SETTINGS_SERVICE } from "../../../services/settings.service";
|
|
19
|
+
import { isEmpty, isNil, forOwn, cloneDeep, set } from 'lodash';
|
|
20
|
+
import { ZITI_DATA_SERVICE } from "../../../services/ziti-data.service";
|
|
21
|
+
import { IDENTITY_EXTENSION_SERVICE } from './identity-form.service';
|
|
22
|
+
import { MatDialogRef } from "@angular/material/dialog";
|
|
23
|
+
import * as i0 from "@angular/core";
|
|
24
|
+
import * as i1 from "./identity-form.service";
|
|
25
|
+
import * as i2 from "../../../pages/identities/identities-page.service";
|
|
26
|
+
import * as i3 from "../../messaging/growler.service";
|
|
27
|
+
import * as i4 from "@angular/common";
|
|
28
|
+
import * as i5 from "@angular/forms";
|
|
29
|
+
import * as i6 from "../form-header/form-header.component";
|
|
30
|
+
import * as i7 from "../form-field-container/form-field-container.component";
|
|
31
|
+
import * as i8 from "../../preview-list/preview-list.component";
|
|
32
|
+
import * as i9 from "../../loading-indicator/loading-indicator.component";
|
|
33
|
+
import * as i10 from "../form-field-toggle/form-field-toggle.component";
|
|
34
|
+
import * as i11 from "../../json-view/json-view.component";
|
|
35
|
+
import * as i12 from "../../tag-selector/tag-selector.component";
|
|
36
|
+
import * as i13 from "../../qr-code/qr-code.component";
|
|
37
|
+
import * as i14 from "../../custom-tags/custom-tags.component";
|
|
38
|
+
import * as i15 from "../../../safe.pipe";
|
|
39
|
+
import * as i16 from "../../../services/settings.service";
|
|
40
|
+
import * as i17 from "../../../services/ziti-data.service";
|
|
41
|
+
class IdentityFormComponent extends ProjectableForm {
|
|
42
|
+
constructor(settingsService, svc, identitiesService, zitiService, growlerService, extService) {
|
|
43
|
+
super(growlerService, extService);
|
|
44
|
+
this.settingsService = settingsService;
|
|
45
|
+
this.svc = svc;
|
|
46
|
+
this.identitiesService = identitiesService;
|
|
47
|
+
this.zitiService = zitiService;
|
|
48
|
+
this.formData = {};
|
|
49
|
+
this.identityRoleAttributes = [];
|
|
50
|
+
this.close = new EventEmitter();
|
|
51
|
+
this.entityType = 'identity';
|
|
52
|
+
this.isEditing = false;
|
|
53
|
+
this.isLoading = false;
|
|
54
|
+
this.associatedServicePolicies = [];
|
|
55
|
+
this.associatedServicePolicyNames = [];
|
|
56
|
+
this.associatedServices = [];
|
|
57
|
+
this.associatedServiceNames = [];
|
|
58
|
+
this.servicesLoading = false;
|
|
59
|
+
this.servicePoliciesLoading = false;
|
|
60
|
+
this.authPolicies = [];
|
|
61
|
+
this.showMore = false;
|
|
62
|
+
this.formView = 'simple';
|
|
63
|
+
this.enrollmentType = 'ott';
|
|
64
|
+
this.enrollmentUPDB = '';
|
|
65
|
+
this.settings = {};
|
|
66
|
+
this.testResult = '';
|
|
67
|
+
this.testResultOpen = false;
|
|
68
|
+
this.cas = [];
|
|
69
|
+
this._apiData = {};
|
|
70
|
+
this.identityRoleAttributes = [];
|
|
71
|
+
}
|
|
72
|
+
ngOnInit() {
|
|
73
|
+
this.settingsService.settingsChange.subscribe((results) => {
|
|
74
|
+
this.settings = results;
|
|
75
|
+
});
|
|
76
|
+
this.jwt = this.identitiesService.getJWT(this.formData);
|
|
77
|
+
this.enrollmentExpiration = this.identitiesService.getEnrollmentExpiration(this.formData);
|
|
78
|
+
this.initEnrollmentType();
|
|
79
|
+
this.getAssociatedServices();
|
|
80
|
+
this.getAssociatedServicePolicies();
|
|
81
|
+
this.getAuthPolicies();
|
|
82
|
+
this.getCertificateAuthorities();
|
|
83
|
+
this.initData = cloneDeep(this.formData);
|
|
84
|
+
this.loadTags();
|
|
85
|
+
this.extService.updateFormData(this.formData);
|
|
86
|
+
}
|
|
87
|
+
ngAfterViewInit() {
|
|
88
|
+
super.ngAfterViewInit();
|
|
89
|
+
this.nameFieldInput.nativeElement.focus();
|
|
90
|
+
this.resetTags();
|
|
91
|
+
}
|
|
92
|
+
ngOnChanges(changes) {
|
|
93
|
+
this.isEditing = !isEmpty(this.formData.id);
|
|
94
|
+
}
|
|
95
|
+
refreshIdentity() {
|
|
96
|
+
this.svc.refreshIdentity(this.formData.id).then(result => {
|
|
97
|
+
this.formData = result.data;
|
|
98
|
+
this.initData = cloneDeep(this.formData);
|
|
99
|
+
this.enrollmentExpiration = this.identitiesService.getEnrollmentExpiration(this.formData);
|
|
100
|
+
this.jwt = this.identitiesService.getJWT(this.formData);
|
|
101
|
+
this.extService.updateFormData(this.formData);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
initEnrollmentType() {
|
|
105
|
+
if (this.formData?.enrollment?.ott) {
|
|
106
|
+
this.enrollmentType = 'ott';
|
|
107
|
+
}
|
|
108
|
+
else if (this.formData?.enrollment?.updb) {
|
|
109
|
+
this.enrollmentType = 'updb';
|
|
110
|
+
}
|
|
111
|
+
else if (this.formData?.enrollment?.ottca) {
|
|
112
|
+
this.enrollmentType = 'CA';
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
getAssociatedServices() {
|
|
116
|
+
this.zitiService.getSubdata('identities', this.formData.id, 'services').then((result) => {
|
|
117
|
+
this.associatedServices = result.data;
|
|
118
|
+
this.associatedServiceNames = this.associatedServices.map((svc) => {
|
|
119
|
+
return svc.name;
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
getAssociatedServicePolicies() {
|
|
124
|
+
this.zitiService.getSubdata('identities', this.formData.id, 'service-policies').then((result) => {
|
|
125
|
+
this.associatedServicePolicies = result.data;
|
|
126
|
+
this.associatedServicePolicyNames = this.associatedServicePolicies.map((policy) => {
|
|
127
|
+
return policy.name;
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
getCertificateAuthorities() {
|
|
132
|
+
const paging = {
|
|
133
|
+
filter: "",
|
|
134
|
+
noSearch: true,
|
|
135
|
+
order: "asc",
|
|
136
|
+
page: 1,
|
|
137
|
+
searchOn: "name",
|
|
138
|
+
sort: "name",
|
|
139
|
+
total: 100
|
|
140
|
+
};
|
|
141
|
+
this.zitiService.get('cas', paging, []).then((result) => {
|
|
142
|
+
this.cas = [...result.data];
|
|
143
|
+
if (this.cas.length > 0) {
|
|
144
|
+
this.enrollmentCA = this.cas[0].id;
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
getAuthPolicies() {
|
|
149
|
+
const paging = {
|
|
150
|
+
filter: "",
|
|
151
|
+
noSearch: true,
|
|
152
|
+
order: "asc",
|
|
153
|
+
page: 1,
|
|
154
|
+
searchOn: "name",
|
|
155
|
+
sort: "name",
|
|
156
|
+
total: 100
|
|
157
|
+
};
|
|
158
|
+
this.zitiService.get('auth-policies', paging, []).then((result) => {
|
|
159
|
+
this.authPolicies = [...result.data];
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
get hasAuthenticator() {
|
|
163
|
+
return this.identitiesService.hasAuthenticator(this.formData);
|
|
164
|
+
}
|
|
165
|
+
get hasEnrolmentToken() {
|
|
166
|
+
return this.identitiesService.hasEnrolmentToken(this.formData);
|
|
167
|
+
}
|
|
168
|
+
get jwtExpired() {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
headerActionRequested(action) {
|
|
172
|
+
switch (action.name) {
|
|
173
|
+
case 'save':
|
|
174
|
+
this.save();
|
|
175
|
+
break;
|
|
176
|
+
case 'close':
|
|
177
|
+
this.closeModal();
|
|
178
|
+
break;
|
|
179
|
+
case 'toggle-view':
|
|
180
|
+
this.formView = action.data;
|
|
181
|
+
this.resetTags();
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
updateEnrollment() {
|
|
186
|
+
switch (this.enrollmentType) {
|
|
187
|
+
case 'ott':
|
|
188
|
+
this.formData.enrollment = { ott: true };
|
|
189
|
+
break;
|
|
190
|
+
case 'CA':
|
|
191
|
+
this.formData.enrollment = { ottca: this.enrollmentCA };
|
|
192
|
+
break;
|
|
193
|
+
case 'updb':
|
|
194
|
+
this.formData.enrollment = { updb: this.enrollmentUPDB };
|
|
195
|
+
break;
|
|
196
|
+
default:
|
|
197
|
+
this.formData.enrollment = { ott: true };
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
save(event) {
|
|
202
|
+
if (!this.validate()) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const tagVals = this.getTagValues();
|
|
206
|
+
if (!isEmpty(tagVals)) {
|
|
207
|
+
forOwn(tagVals, (value, key) => {
|
|
208
|
+
this.formData.tags[key] = value;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
this.isLoading = true;
|
|
212
|
+
this.svc.save(this.formData).then((result) => {
|
|
213
|
+
this.closeModal(true, true);
|
|
214
|
+
}).finally(() => {
|
|
215
|
+
this.isLoading = false;
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
validate() {
|
|
219
|
+
this.errors = {};
|
|
220
|
+
if (isEmpty(this.formData.name)) {
|
|
221
|
+
this.errors['name'] = true;
|
|
222
|
+
}
|
|
223
|
+
if (this.enrollmentType === 'CA' && (isEmpty(this.enrollmentCA) || isNil(this.enrollmentCA))) {
|
|
224
|
+
this.errors['enrollmentCA'] = true;
|
|
225
|
+
}
|
|
226
|
+
if (this.enrollmentType === 'updb' && (isEmpty(this.enrollmentUPDB) || isNil(this.enrollmentUPDB))) {
|
|
227
|
+
this.errors['enrollmentUPDB'] = true;
|
|
228
|
+
}
|
|
229
|
+
return isEmpty(this.errors);
|
|
230
|
+
}
|
|
231
|
+
get enrollmentTypeTitle() {
|
|
232
|
+
return this.enrollmentType === 'CA' ? 'CERTIFICATE AUTHORITY' : (this.enrollmentType === 'updb' && !this.isEditing) ? 'UPDB USERNAME' : undefined;
|
|
233
|
+
}
|
|
234
|
+
get apiCallURL() {
|
|
235
|
+
return this.settings.selectedEdgeController + '/edge/management/v1/identities' + (this.formData.id ? `/${this.formData.id}` : '');
|
|
236
|
+
}
|
|
237
|
+
get apiData() {
|
|
238
|
+
const data = {
|
|
239
|
+
name: this.formData?.name || '',
|
|
240
|
+
type: this.formData?.type?.name || this.formData?.type || '',
|
|
241
|
+
appData: this.formData?.appData || '',
|
|
242
|
+
isAdmin: this.formData?.isAdmin || '',
|
|
243
|
+
roleAttributes: this.formData.roleAttributes || '',
|
|
244
|
+
authPolicyId: this.formData.authPolicyId || '',
|
|
245
|
+
externalId: this.formData.externalId || '',
|
|
246
|
+
defaultHostingCost: this.formData.defaultHostingCost || '0',
|
|
247
|
+
defaultHostingPrecedence: this.formData.defaultHostingPrecedence || 'defaultHostingPrecedence',
|
|
248
|
+
tags: this.formData.tags || ''
|
|
249
|
+
};
|
|
250
|
+
if (!this.isEditing) {
|
|
251
|
+
data.enrollment = this.formData.enrollment || { ott: true };
|
|
252
|
+
}
|
|
253
|
+
return data;
|
|
254
|
+
}
|
|
255
|
+
set apiData(data) {
|
|
256
|
+
this._apiData = data;
|
|
257
|
+
}
|
|
258
|
+
serviceSelected(serviceName) {
|
|
259
|
+
let service = {};
|
|
260
|
+
this.associatedServices.forEach((svc) => {
|
|
261
|
+
if (svc.name === serviceName) {
|
|
262
|
+
service = svc;
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
this.svc.testService(this.formData.id, service.id).then((result) => {
|
|
266
|
+
this.testResult = result;
|
|
267
|
+
this.testResultOpen = true;
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
toggleIsAdmin() {
|
|
271
|
+
this.formData.isAdmin = !this.formData.isAdmin;
|
|
272
|
+
}
|
|
273
|
+
get identityType() {
|
|
274
|
+
return this.isEditing ? this.formData.type.name : this.formData.type;
|
|
275
|
+
}
|
|
276
|
+
set identityType(type) {
|
|
277
|
+
if (this.isEditing) {
|
|
278
|
+
set(this.formData, 'type.name', type);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
set(this.formData, 'type', type);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
closeTestResult() {
|
|
285
|
+
this.testResultOpen = false;
|
|
286
|
+
}
|
|
287
|
+
clear() {
|
|
288
|
+
}
|
|
289
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IdentityFormComponent, deps: [{ token: SETTINGS_SERVICE }, { token: i1.IdentityFormService }, { token: i2.IdentitiesPageService }, { token: ZITI_DATA_SERVICE }, { token: i3.GrowlerService }, { token: IDENTITY_EXTENSION_SERVICE }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
290
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: IdentityFormComponent, selector: "lib-identity-form", inputs: { formData: "formData", identityRoleAttributes: "identityRoleAttributes" }, outputs: { close: "close" }, providers: [
|
|
291
|
+
{
|
|
292
|
+
provide: MatDialogRef,
|
|
293
|
+
useValue: {}
|
|
294
|
+
}
|
|
295
|
+
], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Identity: ' : 'Create New Identity'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"identity-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Identity Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this identity\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select or create Identity attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Attributes are tags applied to an resource. Apply the same tag to other Identities to form a group of Identities.'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.roleAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Add attributes to group Identities'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Auth Policy'\"\n [label]=\"'OPTIONAL'\"\n [helpText]=\"'Authentication Policies restrict the authentication methods available to identities.'\"\n >\n <select\n [(ngModel)]=\"formData.authPolicyId\"\n id=\"authPolicyId\"\n class=\"form-field-dropdown\"\n >\n <option value=\"\">Select an Authentication Policy</option>\n <option\n *ngFor=\"let policy of authPolicies\"\n [value]=\"policy.id\"\n >\n {{ policy.name }}\n </option>\n </select>\n <input class=\"form-field-input\" placeholder=\"Optional External ID\" [(ngModel)]=\"formData.externalId\"/>\n </lib-form-field-container>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" (toggleOnChange)=\"showMoreChanged($event)\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Enrollment Type'\"\n [title2]=\"enrollmentTypeTitle\"\n [layout]=\"'row'\"\n class=\"form-field-advanced\"\n >\n <select\n id=\"EnrollmentType\"\n class=\"form-field-dropdown\"\n [ngClass]=\"{disabled: isEditing}\"\n [(ngModel)]=\"enrollmentType\"\n (change)=\"updateEnrollment()\"\n >\n <option value=\"ott\">One Time Token</option>\n <option value=\"CA\">Certificate Authority</option>\n <option value=\"updb\">UPDB</option>\n </select>\n <select\n id=\"CertAuthorities\"\n class=\"form-field-dropdown\"\n *ngIf=\"enrollmentType === 'CA'\"\n [ngClass]=\"{disabled: isEditing}\"\n [(ngModel)]=\"enrollmentCA\"\n [ngClass]=\"{error: errors.enrollmentCA}\"\n (change)=\"updateEnrollment()\"\n >\n <option *ngFor=\"let ca of cas\" [value]=\"ca.id\">{{ca.name}}</option>\n </select>\n <input\n *ngIf=\"enrollmentType === 'updb' && !isEditing\"\n [ngClass]=\"{disabled: isEditing, error: errors.enrollmentUPDB}\"\n [(ngModel)]=\"enrollmentUPDB\"\n (keyup)=\"updateEnrollment()\"\n class=\"form-field-input\"\n id=\"UPDBName\"\n type=\"text\"\n maxlength=\"500\"\n placeholder=\"Enter a name\"\n >\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Admin'\"\n [layout]=\"'row'\"\n class=\"form-field-advanced is-admin-container\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">IS ADMIN</div>\n <div\n (click)=\"toggleIsAdmin()\"\n [ngClass]=\"{ on: formData.isAdmin }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isAdmin\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isAdmin\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Hosting Cost'\"\n [title2]=\"'Precedence'\"\n [layout]=\"'row'\"\n class=\"form-field-advanced\"\n >\n <input class=\"form-field-input\" [(ngModel)]=\"formData.defaultHostingCost\" type=\"number\"/>\n <select\n [(ngModel)]=\"formData.defaultHostingPrecedence\"\n id=\"hostingPrecedence\"\n class=\"form-field-dropdown\"\n >\n <option value=\"default\">Default</option>\n <option value=\"required\">Required</option>\n <option value=\"failed\">Failed</option>\n </select>\n </lib-form-field-container>\n <lib-form-field-container *ngFor=\"let tagElement of tagElements\"\n [title]=\"tagElement.label\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <div [innerHTML]=\"tagElement.content | safe\"></div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n *ngIf=\"!hideTags\"\n >\n <lib-custom-tags [(tags)]=\"formData.tags\"></lib-custom-tags>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'App Data'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <lib-json-view [(data)]=\"formData.appData\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n *ngIf=\"hasEnrolmentToken || hasAuthenticator\"\n [showHeader]=\"false\"\n >\n <lib-qr-code\n [identity]=\"formData\"\n [jwt]=\"jwt\"\n [expiration]=\"enrollmentExpiration\"\n [authenticators]=\"formData.authenticators\"\n [type]=\"'identity'\"\n [canExpand]=\"true\"\n (doRefresh)=\"refreshIdentity()\"\n ></lib-qr-code>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Services'\"\n [count]=\"associatedServices.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Identity is associated with.'\"\n >\n <lib-preview-list\n (itemSelected)=\"serviceSelected($event)\"\n [clickable]=\"true\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"associatedServiceNames\"\n ></lib-preview-list>\n <div class=\"svc-test-result\" [ngClass]=\"{'test-result-open': testResultOpen}\">\n <div class=\"close icon-close\" (click)=\"closeTestResult()\"></div>\n <div class=\"result-container\" [innerHTML]=\"testResult\" ></div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Service Policies'\"\n [count]=\"associatedServicePolicies.length\"\n [helpText]=\"'Preview list of all service policies that this Identity is associated with.'\"\n >\n <lib-preview-list\n (itemSelected)=\"serviceSelected($event)\"\n [clickable]=\"false\"\n [isLoading]=\"servicePoliciesLoading\"\n [allNames]=\"associatedServicePolicyNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"''\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\" readonly/>\n <div class=\"url-copy icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>", styles: [".identity-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:15px}.disabled{opacity:.5;pointer-events:none}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:10px;padding-right:10px;border-color:var(--inputBorder);border-style:solid;border-width:2px;border-bottom-right-radius:7px;border-bottom-left-radius:7px;border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -2px 11px 0 var(--boxShadow);padding-bottom:15px;padding-top:15px}.svc-test-result .close.icon-close{top:10px;right:10px;font-size:18px;height:18px;width:18px;line-height:18px}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:2px}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:1px}::ng-deep .copy.icon-copy.url-copy{background-color:var(--navigation)}\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.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText"], outputs: ["formViewChange", "actionRequested"] }, { kind: "component", type: i7.FormFieldContainerComponent, selector: "lib-form-field-container", inputs: ["title", "title2", "layout", "helpText", "helpText2", "label", "count", "action", "actionLabel", "class", "contentStyle", "showHeader"], outputs: ["actionRequested"] }, { kind: "component", type: i8.PreviewListComponent, selector: "lib-preview-list", inputs: ["hideOption", "label", "clickable", "isLoading", "allNames", "allowRemove", "tooltip"], outputs: ["itemSelected", "itemRemoved"] }, { kind: "component", type: i9.LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }, { kind: "component", type: i10.FormFieldToggleComponent, selector: "lib-form-field-toggle", inputs: ["label", "orientation", "labelOn", "labelOff", "toggleOn"], outputs: ["toggleOnChange"] }, { kind: "component", type: i11.JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: i12.TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: i13.QrCodeComponent, selector: "lib-qr-code", inputs: ["jwt", "token", "expiration", "identity", "type", "authenticators", "qrOnly", "canExpand"], outputs: ["doRefresh"] }, { kind: "component", type: i14.CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }, { kind: "pipe", type: i15.SafePipe, name: "safe" }] }); }
|
|
296
|
+
}
|
|
297
|
+
export { IdentityFormComponent };
|
|
298
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IdentityFormComponent, decorators: [{
|
|
299
|
+
type: Component,
|
|
300
|
+
args: [{ selector: 'lib-identity-form', providers: [
|
|
301
|
+
{
|
|
302
|
+
provide: MatDialogRef,
|
|
303
|
+
useValue: {}
|
|
304
|
+
}
|
|
305
|
+
], template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Identity: ' : 'Create New Identity'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"identity-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Identity Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this identity\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select or create Identity attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Attributes are tags applied to an resource. Apply the same tag to other Identities to form a group of Identities.'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.roleAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Add attributes to group Identities'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Auth Policy'\"\n [label]=\"'OPTIONAL'\"\n [helpText]=\"'Authentication Policies restrict the authentication methods available to identities.'\"\n >\n <select\n [(ngModel)]=\"formData.authPolicyId\"\n id=\"authPolicyId\"\n class=\"form-field-dropdown\"\n >\n <option value=\"\">Select an Authentication Policy</option>\n <option\n *ngFor=\"let policy of authPolicies\"\n [value]=\"policy.id\"\n >\n {{ policy.name }}\n </option>\n </select>\n <input class=\"form-field-input\" placeholder=\"Optional External ID\" [(ngModel)]=\"formData.externalId\"/>\n </lib-form-field-container>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" (toggleOnChange)=\"showMoreChanged($event)\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Enrollment Type'\"\n [title2]=\"enrollmentTypeTitle\"\n [layout]=\"'row'\"\n class=\"form-field-advanced\"\n >\n <select\n id=\"EnrollmentType\"\n class=\"form-field-dropdown\"\n [ngClass]=\"{disabled: isEditing}\"\n [(ngModel)]=\"enrollmentType\"\n (change)=\"updateEnrollment()\"\n >\n <option value=\"ott\">One Time Token</option>\n <option value=\"CA\">Certificate Authority</option>\n <option value=\"updb\">UPDB</option>\n </select>\n <select\n id=\"CertAuthorities\"\n class=\"form-field-dropdown\"\n *ngIf=\"enrollmentType === 'CA'\"\n [ngClass]=\"{disabled: isEditing}\"\n [(ngModel)]=\"enrollmentCA\"\n [ngClass]=\"{error: errors.enrollmentCA}\"\n (change)=\"updateEnrollment()\"\n >\n <option *ngFor=\"let ca of cas\" [value]=\"ca.id\">{{ca.name}}</option>\n </select>\n <input\n *ngIf=\"enrollmentType === 'updb' && !isEditing\"\n [ngClass]=\"{disabled: isEditing, error: errors.enrollmentUPDB}\"\n [(ngModel)]=\"enrollmentUPDB\"\n (keyup)=\"updateEnrollment()\"\n class=\"form-field-input\"\n id=\"UPDBName\"\n type=\"text\"\n maxlength=\"500\"\n placeholder=\"Enter a name\"\n >\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Admin'\"\n [layout]=\"'row'\"\n class=\"form-field-advanced is-admin-container\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">IS ADMIN</div>\n <div\n (click)=\"toggleIsAdmin()\"\n [ngClass]=\"{ on: formData.isAdmin }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isAdmin\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isAdmin\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Hosting Cost'\"\n [title2]=\"'Precedence'\"\n [layout]=\"'row'\"\n class=\"form-field-advanced\"\n >\n <input class=\"form-field-input\" [(ngModel)]=\"formData.defaultHostingCost\" type=\"number\"/>\n <select\n [(ngModel)]=\"formData.defaultHostingPrecedence\"\n id=\"hostingPrecedence\"\n class=\"form-field-dropdown\"\n >\n <option value=\"default\">Default</option>\n <option value=\"required\">Required</option>\n <option value=\"failed\">Failed</option>\n </select>\n </lib-form-field-container>\n <lib-form-field-container *ngFor=\"let tagElement of tagElements\"\n [title]=\"tagElement.label\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <div [innerHTML]=\"tagElement.content | safe\"></div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n *ngIf=\"!hideTags\"\n >\n <lib-custom-tags [(tags)]=\"formData.tags\"></lib-custom-tags>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'App Data'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <lib-json-view [(data)]=\"formData.appData\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n *ngIf=\"hasEnrolmentToken || hasAuthenticator\"\n [showHeader]=\"false\"\n >\n <lib-qr-code\n [identity]=\"formData\"\n [jwt]=\"jwt\"\n [expiration]=\"enrollmentExpiration\"\n [authenticators]=\"formData.authenticators\"\n [type]=\"'identity'\"\n [canExpand]=\"true\"\n (doRefresh)=\"refreshIdentity()\"\n ></lib-qr-code>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Services'\"\n [count]=\"associatedServices.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Identity is associated with.'\"\n >\n <lib-preview-list\n (itemSelected)=\"serviceSelected($event)\"\n [clickable]=\"true\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"associatedServiceNames\"\n ></lib-preview-list>\n <div class=\"svc-test-result\" [ngClass]=\"{'test-result-open': testResultOpen}\">\n <div class=\"close icon-close\" (click)=\"closeTestResult()\"></div>\n <div class=\"result-container\" [innerHTML]=\"testResult\" ></div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Service Policies'\"\n [count]=\"associatedServicePolicies.length\"\n [helpText]=\"'Preview list of all service policies that this Identity is associated with.'\"\n >\n <lib-preview-list\n (itemSelected)=\"serviceSelected($event)\"\n [clickable]=\"false\"\n [isLoading]=\"servicePoliciesLoading\"\n [allNames]=\"associatedServicePolicyNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"''\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\" readonly/>\n <div class=\"url-copy icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>", styles: [".identity-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:15px}.disabled{opacity:.5;pointer-events:none}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:10px;padding-right:10px;border-color:var(--inputBorder);border-style:solid;border-width:2px;border-bottom-right-radius:7px;border-bottom-left-radius:7px;border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -2px 11px 0 var(--boxShadow);padding-bottom:15px;padding-top:15px}.svc-test-result .close.icon-close{top:10px;right:10px;font-size:18px;height:18px;width:18px;line-height:18px}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:2px}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:1px}::ng-deep .copy.icon-copy.url-copy{background-color:var(--navigation)}\n"] }]
|
|
306
|
+
}], ctorParameters: function () { return [{ type: i16.SettingsService, decorators: [{
|
|
307
|
+
type: Inject,
|
|
308
|
+
args: [SETTINGS_SERVICE]
|
|
309
|
+
}] }, { type: i1.IdentityFormService }, { type: i2.IdentitiesPageService }, { type: i17.ZitiDataService, decorators: [{
|
|
310
|
+
type: Inject,
|
|
311
|
+
args: [ZITI_DATA_SERVICE]
|
|
312
|
+
}] }, { type: i3.GrowlerService }, { type: undefined, decorators: [{
|
|
313
|
+
type: Inject,
|
|
314
|
+
args: [IDENTITY_EXTENSION_SERVICE]
|
|
315
|
+
}] }]; }, propDecorators: { formData: [{
|
|
316
|
+
type: Input
|
|
317
|
+
}], identityRoleAttributes: [{
|
|
318
|
+
type: Input
|
|
319
|
+
}], close: [{
|
|
320
|
+
type: Output
|
|
321
|
+
}] } });
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHktZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvZmVhdHVyZXMvcHJvamVjdGFibGUtZm9ybXMvaWRlbnRpdHkvaWRlbnRpdHktZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvZmVhdHVyZXMvcHJvamVjdGFibGUtZm9ybXMvaWRlbnRpdHkvaWRlbnRpdHktZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7RUFjRTtBQUVGLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBSU4sTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQWtCLE1BQU0sb0NBQW9DLENBQUM7QUFFckYsT0FBTyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUQsT0FBTyxFQUFDLGlCQUFpQixFQUFrQixNQUFNLHFDQUFxQyxDQUFDO0FBRXZGLE9BQU8sRUFBQywwQkFBMEIsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFLdEQsTUFXYSxxQkFBc0IsU0FBUSxlQUFlO0lBOEJ4RCxZQUNxQyxlQUFnQyxFQUMxRCxHQUF3QixFQUN4QixpQkFBd0MsRUFDWixXQUE0QixFQUMvRCxjQUE4QixFQUNNLFVBQTRCO1FBRWxFLEtBQUssQ0FBQyxjQUFjLEVBQUUs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QUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3ZDO2FBQU07WUFDTCxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLO0lBQ0wsQ0FBQzsrR0F4UlUscUJBQXFCLGtCQStCcEIsZ0JBQWdCLHFGQUdoQixpQkFBaUIsMkNBRWpCLDBCQUEwQjttR0FwQzNCLHFCQUFxQiw2SkFQckI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsWUFBWTtnQkFDckIsUUFBUSxFQUFFLEVBQUU7YUFDYjtTQUNGLHNFQ2hESCw2K1hBOE55Rjs7U0Q1SzVFLHFCQUFxQjs0RkFBckIscUJBQXFCO2tCQVhqQyxTQUFTOytCQUNFLG1CQUFtQixhQUdsQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsWUFBWTs0QkFDckIsUUFBUSxFQUFFLEVBQUU7eUJBQ2I7cUJBQ0Y7OzBCQWlDSSxNQUFNOzJCQUFDLGdCQUFnQjs7MEJBR3ZCLE1BQU07MkJBQUMsaUJBQWlCOzswQkFFeEIsTUFBTTsyQkFBQywwQkFBMEI7NENBbkM3QixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDSSxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICAgIENvcHlyaWdodCBOZXRGb3VuZHJ5IEluYy5cblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIEFmdGVyVmlld0luaXQsXG4gIEluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UHJvamVjdGFibGVGb3JtfSBmcm9tIFwiLi4vcHJvamVjdGFibGUtZm9ybS5jbGFzc1wiO1xuaW1wb3J0IHtTRVRUSU5HU19TRVJWSUNFLCBTZXR0aW5nc1NlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zZXR0aW5ncy5zZXJ2aWNlXCI7XG5cbmltcG9ydCB7aXNFbXB0eSwgaXNOaWwsIGZvck93biwgY2xvbmVEZWVwLCBzZXR9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1pJVElfREFUQV9TRVJWSUNFLCBaaXRpRGF0YVNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy96aXRpLWRhdGEuc2VydmljZVwiO1xuaW1wb3J0IHtHcm93bGVyU2VydmljZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2luZy9ncm93bGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7SURFTlRJVFlfRVhURU5TSU9OX1NFUlZJQ0UsIElkZW50aXR5Rm9ybVNlcnZpY2V9IGZyb20gJy4vaWRlbnRpdHktZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7TWF0RGlhbG9nUmVmfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XG5pbXBvcnQge0lkZW50aXRpZXNQYWdlU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3BhZ2VzL2lkZW50aXRpZXMvaWRlbnRpdGllcy1wYWdlLnNlcnZpY2VcIjtcbmltcG9ydCB7RXh0ZW5zaW9uU2VydmljZX0gZnJvbSBcIi4uLy4uL2V4dGVuZGFibGUvZXh0ZW5zaW9ucy1ub29wLnNlcnZpY2VcIjtcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItaWRlbnRpdHktZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9pZGVudGl0eS1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaWRlbnRpdHktZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBNYXREaWFsb2dSZWYsXG4gICAgICB1c2VWYWx1ZToge31cbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlGb3JtQ29tcG9uZW50IGV4dGVuZHMgUHJvamVjdGFibGVGb3JtIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBmb3JtRGF0YTogYW55ID0ge307XG4gIEBJbnB1dCgpIGlkZW50aXR5Um9sZUF0dHJpYnV0ZXM6IGFueVtdID0gW107XG4gIEBPdXRwdXQoKSBjbG9zZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBvdmVycmlkZSBlbnRpdHlUeXBlID0gJ2lkZW50aXR5JztcblxuICBpc0VkaXRpbmcgPSBmYWxzZTtcbiAgZW5yb2xsbWVudEV4cGlyYXRpb246IGFueTtcbiAgand0OiBhbnk7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICBhc3NvY2lhdGVkU2VydmljZVBvbGljaWVzOiBhbnkgPSBbXTtcbiAgYXNzb2NpYXRlZFNlcnZpY2VQb2xpY3lOYW1lczogYW55ID0gW107XG4gIGFzc29jaWF0ZWRTZXJ2aWNlczogYW55ID0gW107XG4gIGFzc29jaWF0ZWRTZXJ2aWNlTmFtZXM6IGFueSA9IFtdO1xuICBzZXJ2aWNlc0xvYWRpbmcgPSBmYWxzZTtcbiAgc2VydmljZVBvbGljaWVzTG9hZGluZyA9IGZhbHNlO1xuICBhdXRoUG9saWNpZXM6IGFueSA9IFtdO1xuXG4gIHNob3dNb3JlID0gZmFsc2U7XG4gIGZvcm1WaWV3ID0gJ3NpbXBsZSc7XG4gIGVucm9sbG1lbnRUeXBlID0gJ290dCc7XG4gIGVucm9sbG1lbnRDQTtcbiAgZW5yb2xsbWVudFVQREIgPSAnJztcbiAgc2V0dGluZ3M6IGFueSA9IHt9O1xuICB0ZXN0UmVzdWx0OiBzdHJpbmcgPSAnJztcbiAgdGVzdFJlc3VsdE9wZW4gPSBmYWxzZTtcblxuICBjYXMgPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIEBJbmplY3QoU0VUVElOR1NfU0VSVklDRSkgcHVibGljIHNldHRpbmdzU2VydmljZTogU2V0dGluZ3NTZXJ2aWNlLFxuICAgICAgcHVibGljIHN2YzogSWRlbnRpdHlGb3JtU2VydmljZSxcbiAgICAgIHB1YmxpYyBpZGVudGl0aWVzU2VydmljZTogSWRlbnRpdGllc1BhZ2VTZXJ2aWNlLFxuICAgICAgQEluamVjdChaSVRJX0RBVEFfU0VSVklDRSkgcHJpdmF0ZSB6aXRpU2VydmljZTogWml0aURhdGFTZXJ2aWNlLFxuICAgICAgZ3Jvd2xlclNlcnZpY2U6IEdyb3dsZXJTZXJ2aWNlLFxuICAgICAgQEluamVjdChJREVOVElUWV9FWFRFTlNJT05fU0VSVklDRSkgZXh0U2VydmljZTogRXh0ZW5zaW9uU2VydmljZVxuICApIHtcbiAgICBzdXBlcihncm93bGVyU2VydmljZSwgZXh0U2VydmljZSk7XG4gICAgdGhpcy5pZGVudGl0eVJvbGVBdHRyaWJ1dGVzID0gW107XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5nc0NoYW5nZS5zdWJzY3JpYmUoKHJlc3VsdHM6YW55KSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzID0gcmVzdWx0cztcbiAgICB9KTtcbiAgICB0aGlzLmp3dCA9IHRoaXMuaWRlbnRpdGllc1NlcnZpY2UuZ2V0SldUKHRoaXMuZm9ybURhdGEpO1xuICAgIHRoaXMuZW5yb2xsbWVudEV4cGlyYXRpb24gPSB0aGlzLmlkZW50aXRpZXNTZXJ2aWNlLmdldEVucm9sbG1lbnRFeHBpcmF0aW9uKHRoaXMuZm9ybURhdGEpO1xuICAgIHRoaXMuaW5pdEVucm9sbG1lbnRUeXBlKCk7XG4gICAgdGhpcy5nZXRBc3NvY2lhdGVkU2VydmljZXMoKTtcbiAgICB0aGlzLmdldEFzc29jaWF0ZWRTZXJ2aWNlUG9saWNpZXMoKTtcbiAgICB0aGlzLmdldEF1dGhQb2xpY2llcygpO1xuICAgIHRoaXMuZ2V0Q2VydGlmaWNhdGVBdXRob3JpdGllcygpO1xuICAgIHRoaXMuaW5pdERhdGEgPSBjbG9uZURlZXAodGhpcy5mb3JtRGF0YSk7XG4gICAgdGhpcy5sb2FkVGFncygpO1xuICAgIHRoaXMuZXh0U2VydmljZS51cGRhdGVGb3JtRGF0YSh0aGlzLmZvcm1EYXRhKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICB0aGlzLm5hbWVGaWVsZElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB0aGlzLnJlc2V0VGFncygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuaXNFZGl0aW5nID0gIWlzRW1wdHkodGhpcy5mb3JtRGF0YS5pZCk7XG4gIH1cblxuICByZWZyZXNoSWRlbnRpdHkoKSB7XG4gICAgdGhpcy5zdmMucmVmcmVzaElkZW50aXR5KHRoaXMuZm9ybURhdGEuaWQpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgIHRoaXMuZm9ybURhdGEgPSByZXN1bHQuZGF0YTtcbiAgICAgIHRoaXMuaW5pdERhdGEgPSBjbG9uZURlZXAodGhpcy5mb3JtRGF0YSk7XG4gICAgICB0aGlzLmVucm9sbG1lbnRFeHBpcmF0aW9uID0gdGhpcy5pZGVudGl0aWVzU2VydmljZS5nZXRFbnJvbGxtZW50RXhwaXJhdGlvbih0aGlzLmZvcm1EYXRhKTtcbiAgICAgIHRoaXMuand0ID0gdGhpcy5pZGVudGl0aWVzU2VydmljZS5nZXRKV1QodGhpcy5mb3JtRGF0YSk7XG4gICAgICB0aGlzLmV4dFNlcnZpY2UudXBkYXRlRm9ybURhdGEodGhpcy5mb3JtRGF0YSk7XG4gICAgfSlcbiAgfVxuXG4gIGluaXRFbnJvbGxtZW50VHlwZSgpIHtcbiAgICBpZiAodGhpcy5mb3JtRGF0YT8uZW5yb2xsbWVudD8ub3R0KSB7XG4gICAgICB0aGlzLmVucm9sbG1lbnRUeXBlID0gJ290dCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1EYXRhPy5lbnJvbGxtZW50Py51cGRiKSB7XG4gICAgICB0aGlzLmVucm9sbG1lbnRUeXBlID0gJ3VwZGInO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtRGF0YT8uZW5yb2xsbWVudD8ub3R0Y2EpIHtcbiAgICAgIHRoaXMuZW5yb2xsbWVudFR5cGUgPSAnQ0EnO1xuICAgIH1cbiAgfVxuXG4gIGdldEFzc29jaWF0ZWRTZXJ2aWNlcygpIHtcbiAgICB0aGlzLnppdGlTZXJ2aWNlLmdldFN1YmRhdGEoJ2lkZW50aXRpZXMnLCB0aGlzLmZvcm1EYXRhLmlkLCAnc2VydmljZXMnKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgdGhpcy5hc3NvY2lhdGVkU2VydmljZXMgPSByZXN1bHQuZGF0YTtcbiAgICAgIHRoaXMuYXNzb2NpYXRlZFNlcnZpY2VOYW1lcyA9IHRoaXMuYXNzb2NpYXRlZFNlcnZpY2VzLm1hcCgoc3ZjKSA9PiB7XG4gICAgICAgIHJldHVybiBzdmMubmFtZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0QXNzb2NpYXRlZFNlcnZpY2VQb2xpY2llcygpIHtcbiAgICB0aGlzLnppdGlTZXJ2aWNlLmdldFN1YmRhdGEoJ2lkZW50aXRpZXMnLCB0aGlzLmZvcm1EYXRhLmlkLCAnc2VydmljZS1wb2xpY2llcycpLnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICB0aGlzLmFzc29jaWF0ZWRTZXJ2aWNlUG9saWNpZXMgPSByZXN1bHQuZGF0YTtcbiAgICAgIHRoaXMuYXNzb2NpYXRlZFNlcnZpY2VQb2xpY3lOYW1lcyA9IHRoaXMuYXNzb2NpYXRlZFNlcnZpY2VQb2xpY2llcy5tYXAoKHBvbGljeSkgPT4ge1xuICAgICAgICByZXR1cm4gcG9saWN5Lm5hbWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldENlcnRpZmljYXRlQXV0aG9yaXRpZXMoKSB7XG4gICAgY29uc3QgcGFnaW5nID0ge1xuICAgICAgZmlsdGVyOiBcIlwiLFxuICAgICAgbm9TZWFyY2g6IHRydWUsXG4gICAgICBvcmRlcjogXCJhc2NcIixcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2hPbjogXCJuYW1lXCIsXG4gICAgICBzb3J0OiBcIm5hbWVcIixcbiAgICAgIHRvdGFsOiAxMDBcbiAgICB9XG4gICAgdGhpcy56aXRpU2VydmljZS5nZXQoJ2NhcycsIHBhZ2luZywgW10pLnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICB0aGlzLmNhcyA9IFsuLi5yZXN1bHQuZGF0YV07XG4gICAgICBpZiAodGhpcy5jYXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmVucm9sbG1lbnRDQSA9IHRoaXMuY2FzWzBdLmlkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0QXV0aFBvbGljaWVzKCkge1xuICAgIGNvbnN0IHBhZ2luZyA9IHtcbiAgICAgIGZpbHRlcjogXCJcIixcbiAgICAgIG5vU2VhcmNoOiB0cnVlLFxuICAgICAgb3JkZXI6IFwiYXNjXCIsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoT246IFwibmFtZVwiLFxuICAgICAgc29ydDogXCJuYW1lXCIsXG4gICAgICB0b3RhbDogMTAwXG4gICAgfVxuICAgIHRoaXMueml0aVNlcnZpY2UuZ2V0KCdhdXRoLXBvbGljaWVzJywgcGFnaW5nLCBbXSkudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYXV0aFBvbGljaWVzID0gWy4uLnJlc3VsdC5kYXRhXTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBoYXNBdXRoZW50aWNhdG9yKCkge1xuICAgIHJldHVybiB0aGlzLmlkZW50aXRpZXNTZXJ2aWNlLmhhc0F1dGhlbnRpY2F0b3IodGhpcy5mb3JtRGF0YSk7XG4gIH1cblxuICBnZXQgaGFzRW5yb2xtZW50VG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdGllc1NlcnZpY2UuaGFzRW5yb2xtZW50VG9rZW4odGhpcy5mb3JtRGF0YSk7XG4gIH1cblxuICBnZXQgand0RXhwaXJlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBoZWFkZXJBY3Rpb25SZXF1ZXN0ZWQoYWN0aW9uKSB7XG4gICAgc3dpdGNoKGFjdGlvbi5uYW1lKSB7XG4gICAgICBjYXNlICdzYXZlJzpcbiAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICB0aGlzLmNsb3NlTW9kYWwoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b2dnbGUtdmlldyc6XG4gICAgICAgIHRoaXMuZm9ybVZpZXcgPSBhY3Rpb24uZGF0YTtcbiAgICAgICAgdGhpcy5yZXNldFRhZ3MoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRW5yb2xsbWVudCgpIHtcbiAgICBzd2l0Y2ggKHRoaXMuZW5yb2xsbWVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ290dCc6XG4gICAgICAgIHRoaXMuZm9ybURhdGEuZW5yb2xsbWVudCA9IHtvdHQ6IHRydWV9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQ0EnOlxuICAgICAgICB0aGlzLmZvcm1EYXRhLmVucm9sbG1lbnQgPSB7b3R0Y2E6IHRoaXMuZW5yb2xsbWVudENBfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1cGRiJzpcbiAgICAgICAgdGhpcy5mb3JtRGF0YS5lbnJvbGxtZW50ID0ge3VwZGI6IHRoaXMuZW5yb2xsbWVudFVQREJ9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZm9ybURhdGEuZW5yb2xsbWVudCA9IHtvdHQ6IHRydWV9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHNhdmUoZXZlbnQ/KSB7XG4gICAgaWYoIXRoaXMudmFsaWRhdGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWdWYWxzID0gdGhpcy5nZXRUYWdWYWx1ZXMoKTtcbiAgICBpZiAoIWlzRW1wdHkodGFnVmFscykpIHtcbiAgICAgIGZvck93bih0YWdWYWxzLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1EYXRhLnRhZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnN2Yy5zYXZlKHRoaXMuZm9ybURhdGEpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgdGhpcy5jbG9zZU1vZGFsKHRydWUsIHRydWUpO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlKCkge1xuICAgIHRoaXMuZXJyb3JzID0ge307XG4gICAgaWYgKGlzRW1wdHkodGhpcy5mb3JtRGF0YS5uYW1lKSkge1xuICAgICAgdGhpcy5lcnJvcnNbJ25hbWUnXSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmVucm9sbG1lbnRUeXBlID09PSAnQ0EnICYmIChpc0VtcHR5KHRoaXMuZW5yb2xsbWVudENBKSB8fCBpc05pbCh0aGlzLmVucm9sbG1lbnRDQSkpKSB7XG4gICAgICB0aGlzLmVycm9yc1snZW5yb2xsbWVudENBJ10gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbnJvbGxtZW50VHlwZSA9PT0gJ3VwZGInICYmIChpc0VtcHR5KHRoaXMuZW5yb2xsbWVudFVQREIpIHx8IGlzTmlsKHRoaXMuZW5yb2xsbWVudFVQREIpKSkge1xuICAgICAgdGhpcy5lcnJvcnNbJ2Vucm9sbG1lbnRVUERCJ10gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNFbXB0eSh0aGlzLmVycm9ycyk7XG4gIH1cblxuICBnZXQgZW5yb2xsbWVudFR5cGVUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbnJvbGxtZW50VHlwZSA9PT0gJ0NBJyA/ICdDRVJUSUZJQ0FURSBBVVRIT1JJVFknIDogKHRoaXMuZW5yb2xsbWVudFR5cGUgPT09ICd1cGRiJyAmJiAhdGhpcy5pc0VkaXRpbmcpID8gJ1VQREIgVVNFUk5BTUUnIDogdW5kZWZpbmVkO1xuICB9XG4gIGdldCBhcGlDYWxsVVJMKCkge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnNlbGVjdGVkRWRnZUNvbnRyb2xsZXIgKyAnL2VkZ2UvbWFuYWdlbWVudC92MS9pZGVudGl0aWVzJyArICh0aGlzLmZvcm1EYXRhLmlkID8gYC8ke3RoaXMuZm9ybURhdGEuaWR9YCA6ICcnKTtcbiAgfVxuXG4gIGdldCBhcGlEYXRhKCkge1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHtcbiAgICAgIG5hbWU6IHRoaXMuZm9ybURhdGE/Lm5hbWUgfHwgJycsXG4gICAgICB0eXBlOiB0aGlzLmZvcm1EYXRhPy50eXBlPy5uYW1lIHx8IHRoaXMuZm9ybURhdGE/LnR5cGUgfHwgJycsXG4gICAgICBhcHBEYXRhOiB0aGlzLmZvcm1EYXRhPy5hcHBEYXRhIHx8ICcnLFxuICAgICAgaXNBZG1pbjogdGhpcy5mb3JtRGF0YT8uaXNBZG1pbiB8fCAnJyxcbiAgICAgIHJvbGVBdHRyaWJ1dGVzOiB0aGlzLmZvcm1EYXRhLnJvbGVBdHRyaWJ1dGVzIHx8ICcnLFxuICAgICAgYXV0aFBvbGljeUlkOiB0aGlzLmZvcm1EYXRhLmF1dGhQb2xpY3lJZCB8fCAnJyxcbiAgICAgIGV4dGVybmFsSWQ6IHRoaXMuZm9ybURhdGEuZXh0ZXJuYWxJZCB8fCAnJyxcbiAgICAgIGRlZmF1bHRIb3N0aW5nQ29zdDogdGhpcy5mb3JtRGF0YS5kZWZhdWx0SG9zdGluZ0Nvc3QgfHwgJzAnLFxuICAgICAgZGVmYXVsdEhvc3RpbmdQcmVjZWRlbmNlOiB0aGlzLmZvcm1EYXRhLmRlZmF1bHRIb3N0aW5nUHJlY2VkZW5jZSB8fCAnZGVmYXVsdEhvc3RpbmdQcmVjZWRlbmNlJyxcbiAgICAgIHRhZ3M6IHRoaXMuZm9ybURhdGEudGFncyB8fCAnJ1xuICAgIH07XG4gICAgaWYgKCF0aGlzLmlzRWRpdGluZykge1xuICAgICAgZGF0YS5lbnJvbGxtZW50ID0gdGhpcy5mb3JtRGF0YS5lbnJvbGxtZW50IHx8IHtvdHQ6IHRydWV9O1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIF9hcGlEYXRhID0ge307XG4gIHNldCBhcGlEYXRhKGRhdGEpIHtcbiAgICB0aGlzLl9hcGlEYXRhID0gZGF0YTtcbiAgfVxuXG4gIHNlcnZpY2VTZWxlY3RlZChzZXJ2aWNlTmFtZSkge1xuICAgIGxldCBzZXJ2aWNlOiBhbnkgPSB7fTtcbiAgICB0aGlzLmFzc29jaWF0ZWRTZXJ2aWNlcy5mb3JFYWNoKChzdmMpID0+IHtcbiAgICAgIGlmKHN2Yy5uYW1lID09PSBzZXJ2aWNlTmFtZSkge1xuICAgICAgICBzZXJ2aWNlID0gc3ZjO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc3ZjLnRlc3RTZXJ2aWNlKHRoaXMuZm9ybURhdGEuaWQsIHNlcnZpY2UuaWQpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgdGhpcy50ZXN0UmVzdWx0ID0gcmVzdWx0O1xuICAgICAgdGhpcy50ZXN0UmVzdWx0T3BlbiA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVJc0FkbWluKCkge1xuICAgIHRoaXMuZm9ybURhdGEuaXNBZG1pbiA9ICF0aGlzLmZvcm1EYXRhLmlzQWRtaW47XG4gIH1cblxuICBnZXQgaWRlbnRpdHlUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmlzRWRpdGluZyA/IHRoaXMuZm9ybURhdGEudHlwZS5uYW1lIDogdGhpcy5mb3JtRGF0YS50eXBlO1xuICB9XG5cbiAgc2V0IGlkZW50aXR5VHlwZSh0eXBlKSB7XG4gICAgaWYgKHRoaXMuaXNFZGl0aW5nKSB7XG4gICAgICBzZXQodGhpcy5mb3JtRGF0YSwgJ3R5cGUubmFtZScsIHR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXQodGhpcy5mb3JtRGF0YSwgJ3R5cGUnLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZVRlc3RSZXN1bHQoKSB7XG4gICAgdGhpcy50ZXN0UmVzdWx0T3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwcm9qZWN0YWJsZS1mb3JtLXdyYXBwZXJcIlxuICAgICAoa2V5dXAuZW50ZXIpPVwic2F2ZSgkZXZlbnQpXCJcbiAgICAgKGtleXVwLmVzY2FwZSk9XCJjbG9zZU1vZGFsKGZhbHNlKVwiXG4+XG4gICAgPGxpYi1mb3JtLWhlYWRlclxuICAgICAgICAgICAgW2RhdGFdPVwiZm9ybURhdGFcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImZvcm1EYXRhLmlkID8gJ0VkaXQgSWRlbnRpdHk6ICcgOiAnQ3JlYXRlIE5ldyBJZGVudGl0eSdcIlxuICAgICAgICAgICAgW21vcmVBY3Rpb25zXT1cIm1vcmVBY3Rpb25zXCJcbiAgICAgICAgICAgIChhY3Rpb25SZXF1ZXN0ZWQpPVwiaGVhZGVyQWN0aW9uUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAgICAgWyhmb3JtVmlldyldPVwiZm9ybVZpZXdcIlxuICAgID48L2xpYi1mb3JtLWhlYWRlcj5cbiAgICA8ZGl2IGNsYXNzPVwiaWRlbnRpdHktZm9ybS1jb250YWluZXIgcHJvamVjdGFibGUtZm9ybS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2plY3RhYmxlLWZvcm0tbWFpbi1jb2x1bW4gZm9ybS1ncm91cC1yb3dcIiAqbmdJZj1cImZvcm1WaWV3ID09PSAnc2ltcGxlJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtY29sdW1uIHRocmVlLWZpZnRoc1wiPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXIgW3RpdGxlXT1cIidJZGVudGl0eSBOYW1lJ1wiIFtsYWJlbF09XCInUkVRVUlSRUQnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTmFtZSB0aGlzIGlkZW50aXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntlcnJvcjogZXJyb3JzWyduYW1lJ119XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybURhdGEubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvZm9jdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICNuYW1lRmllbGRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInU2VsZWN0IG9yIGNyZWF0ZSBJZGVudGl0eSBhdHRyaWJ1dGVzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ09QVElPTkFMJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudFN0eWxlXT1cIid6LWluZGV4OiA5OTk5OTk5OSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIidBdHRyaWJ1dGVzIGFyZSB0YWdzIGFwcGxpZWQgdG8gYW4gcmVzb3VyY2UuIEFwcGx5IHRoZSBzYW1lIHRhZyB0byBvdGhlciBJZGVudGl0aWVzIHRvIGZvcm0gYSBncm91cCBvZiBJZGVudGl0aWVzLidcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi10YWctc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNlbGVjdGVkUm9sZUF0dHJpYnV0ZXMpXT1cImZvcm1EYXRhLnJvbGVBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlUm9sZUF0dHJpYnV0ZXNdPVwiaWRlbnRpdHlSb2xlQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidBZGQgYXR0cmlidXRlcyB0byBncm91cCBJZGVudGl0aWVzJ1wiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi10YWctc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidBdXRoIFBvbGljeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidPUFRJT05BTCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIidBdXRoZW50aWNhdGlvbiBQb2xpY2llcyByZXN0cmljdCB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kcyBhdmFpbGFibGUgdG8gaWRlbnRpdGllcy4nXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1EYXRhLmF1dGhQb2xpY3lJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhdXRoUG9saWN5SWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1maWVsZC1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYW4gQXV0aGVudGljYXRpb24gUG9saWN5PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHBvbGljeSBvZiBhdXRoUG9saWNpZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwb2xpY3kuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHBvbGljeS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tZmllbGQtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIEV4dGVybmFsIElEXCIgWyhuZ01vZGVsKV09XCJmb3JtRGF0YS5leHRlcm5hbElkXCIvPlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC10b2dnbGUgWyh0b2dnbGVPbildPVwic2hvd01vcmVcIiAodG9nZ2xlT25DaGFuZ2UpPVwic2hvd01vcmVDaGFuZ2VkKCRldmVudClcIiBzdHlsZT1cIm1hcmdpbjogMHB4IDEwcHhcIj48L2xpYi1mb3JtLWZpZWxkLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiIXNob3dNb3JlXCIgY2xhc3M9XCJmb3JtLWdyb3VwLWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0Vucm9sbG1lbnQgVHlwZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlMl09XCJlbnJvbGxtZW50VHlwZVRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYXlvdXRdPVwiJ3JvdydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWFkdmFuY2VkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiRW5yb2xsbWVudFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1maWVsZC1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie2Rpc2FibGVkOiBpc0VkaXRpbmd9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVucm9sbG1lbnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZUVucm9sbG1lbnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm90dFwiPk9uZSBUaW1lIFRva2VuPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkNBXCI+Q2VydGlmaWNhdGUgQXV0aG9yaXR5PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInVwZGJcIj5VUERCPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIkNlcnRBdXRob3JpdGllc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImVucm9sbG1lbnRUeXBlID09PSAnQ0EnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ZGlzYWJsZWQ6IGlzRWRpdGluZ31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZW5yb2xsbWVudENBXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ZXJyb3I6IGVycm9ycy5lbnJvbGxtZW50Q0F9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZUVucm9sbG1lbnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY2Egb2YgY2FzXCIgW3ZhbHVlXT1cImNhLmlkXCI+e3tjYS5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJlbnJvbGxtZW50VHlwZSA9PT0gJ3VwZGInICYmICFpc0VkaXRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogaXNFZGl0aW5nLCBlcnJvcjogZXJyb3JzLmVucm9sbG1lbnRVUERCfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlbnJvbGxtZW50VVBEQlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cInVwZGF0ZUVucm9sbG1lbnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIlVQREJOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGEgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidBZG1pbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYXlvdXRdPVwiJ3JvdydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1maWVsZC1hZHZhbmNlZCBpcy1hZG1pbi1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWNvbnRhaW5lciB0b2dnbGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctY29udGFpbmVyLWxhYmVsXCI+SVMgQURNSU48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVJc0FkbWluKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb246IGZvcm1EYXRhLmlzQWRtaW4gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cIiFmb3JtRGF0YS5pc0FkbWluXCIgY2xhc3M9XCJvbi1sYWJlbFwiPllFUzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZm9ybURhdGEuaXNBZG1pblwiIGNsYXNzPVwib2ZmLWxhYmVsXCI+Tk88L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3dpdGNoXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidIb3N0aW5nIENvc3QnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGUyXT1cIidQcmVjZWRlbmNlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xheW91dF09XCIncm93J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWFkdmFuY2VkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dFwiIFsobmdNb2RlbCldPVwiZm9ybURhdGEuZGVmYXVsdEhvc3RpbmdDb3N0XCIgdHlwZT1cIm51bWJlclwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1EYXRhLmRlZmF1bHRIb3N0aW5nUHJlY2VkZW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJob3N0aW5nUHJlY2VkZW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZGVmYXVsdFwiPkRlZmF1bHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVxdWlyZWRcIj5SZXF1aXJlZDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYWlsZWRcIj5GYWlsZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGFnRWxlbWVudCBvZiB0YWdFbGVtZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInRhZ0VsZW1lbnQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInT1BUSU9OQUwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tZmllbGQtYWR2YW5jZWRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwidGFnRWxlbWVudC5jb250ZW50IHwgc2FmZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQ3VzdG9tIFRhZ3MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ09QVElPTkFMJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWFkdmFuY2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFoaWRlVGFnc1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItY3VzdG9tLXRhZ3MgWyh0YWdzKV09XCJmb3JtRGF0YS50YWdzXCI+PC9saWItY3VzdG9tLXRhZ3M+XG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidBcHAgRGF0YSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInT1BUSU9OQUwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tZmllbGQtYWR2YW5jZWRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWpzb24tdmlldyBbKGRhdGEpXT1cImZvcm1EYXRhLmFwcERhdGFcIj48L2xpYi1qc29uLXZpZXc+XG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1jb2x1bW4gdHdvLWZpZnRoc1wiPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaGFzRW5yb2xtZW50VG9rZW4gfHwgaGFzQXV0aGVudGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0hlYWRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bGliLXFyLWNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZGVudGl0eV09XCJmb3JtRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBband0XT1cImp3dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZXhwaXJhdGlvbl09XCJlbnJvbGxtZW50RXhwaXJhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXV0aGVudGljYXRvcnNdPVwiZm9ybURhdGEuYXV0aGVudGljYXRvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiJ2lkZW50aXR5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FuRXhwYW5kXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRvUmVmcmVzaCk9XCJyZWZyZXNoSWRlbnRpdHkoKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1xci1jb2RlPlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybURhdGEuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidBc3NvY2lhdGVkIFNlcnZpY2VzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY291bnRdPVwiYXNzb2NpYXRlZFNlcnZpY2VzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ2hpZGUtb3ZlcmZsb3cnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoZWxwVGV4dF09XCInUHJldmlldyBsaXN0IG9mIGFsbCBzZXJ2aWNlcyB0aGF0IHRoaXMgSWRlbnRpdHkgaXMgYXNzb2NpYXRlZCB3aXRoLidcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1wcmV2aWV3LWxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtU2VsZWN0ZWQpPVwic2VydmljZVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsaWNrYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0xvYWRpbmddPVwic2VydmljZXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbGxOYW1lc109XCJhc3NvY2lhdGVkU2VydmljZU5hbWVzXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbGliLXByZXZpZXctbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN2Yy10ZXN0LXJlc3VsdFwiIFtuZ0NsYXNzXT1cInsndGVzdC1yZXN1bHQtb3Blbic6IHRlc3RSZXN1bHRPcGVufVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsb3NlIGljb24tY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VUZXN0UmVzdWx0KClcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHQtY29udGFpbmVyXCIgW2lubmVySFRNTF09XCJ0ZXN0UmVzdWx0XCIgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1EYXRhLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQXNzb2NpYXRlZCBTZXJ2aWNlIFBvbGljaWVzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY291bnRdPVwiYXNzb2NpYXRlZFNlcnZpY2VQb2xpY2llcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIidQcmV2aWV3IGxpc3Qgb2YgYWxsIHNlcnZpY2UgcG9saWNpZXMgdGhhdCB0aGlzIElkZW50aXR5IGlzIGFzc29jaWF0ZWQgd2l0aC4nXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItcHJldmlldy1saXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAoaXRlbVNlbGVjdGVkKT1cInNlcnZpY2VTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGlja2FibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzTG9hZGluZ109XCJzZXJ2aWNlUG9saWNpZXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbGxOYW1lc109XCJhc3NvY2lhdGVkU2VydmljZVBvbGljeU5hbWVzXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbGliLXByZXZpZXctbGlzdD5cbiAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FQSSBDYWxscydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dFwiIFt2YWx1ZV09XCJhcGlDYWxsVVJMXCIgcmVhZG9ubHkvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVybC1jb3B5IGljb24tY29weSBjb3B5XCIgKGNsaWNrKT1cImNvcHlUb0NsaXBib2FyZChhcGlDYWxsVVJMKVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1qc29uLXZpZXcgKm5nSWY9XCJmb3JtRGF0YVwiIFsoZGF0YSldPVwiYXBpRGF0YVwiIFtyZWFkT25seV09XCJ0cnVlXCIgW3Nob3dDb3B5XT1cInRydWVcIj48L2xpYi1qc29uLXZpZXc+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLWNvbHVtblwiICpuZ0lmPVwiZm9ybVZpZXcgPT09ICdyYXcnXCI+XG4gICAgICAgICAgICA8bGliLWpzb24tdmlldyAqbmdJZj1cImZvcm1EYXRhXCIgWyhkYXRhKV09XCJmb3JtRGF0YVwiPjwvbGliLWpzb24tdmlldz5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxsaWItbG9hZGluZy1pbmRpY2F0b3IgKm5nSWY9XCJpc0xvYWRpbmdcIiBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiPjwvbGliLWxvYWRpbmctaW5kaWNhdG9yPiJdfQ==
|