@provoly/dashboard 0.15.2 → 0.15.4

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.
Files changed (144) hide show
  1. package/components/card/card.module.d.ts +1 -1
  2. package/dataset/style/_o-pry-dataset-detail.scss +4 -0
  3. package/esm2022/components/card/card.component.mjs +3 -3
  4. package/esm2022/components/card/card.module.mjs +5 -5
  5. package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +3 -3
  6. package/esm2022/dataset/style/css.component.mjs +2 -2
  7. package/esm2022/lib/core/auth/geoAuth.service.mjs +26 -0
  8. package/esm2022/lib/core/components/overlay/overlay.module.mjs +4 -5
  9. package/esm2022/lib/core/components/toggle/toggle.component.mjs +4 -5
  10. package/esm2022/lib/core/core.module.mjs +8 -2
  11. package/esm2022/lib/core/errors/http-error-interceptor.service.mjs +2 -5
  12. package/esm2022/lib/core/public-api.mjs +2 -2
  13. package/esm2022/lib/core/store/aggregation/backend-aggregation.service.mjs +21 -10
  14. package/esm2022/lib/core/store/search/search.effects.mjs +3 -3
  15. package/esm2022/lib/core/toolbox/toolbox-menu.service.mjs +10 -4
  16. package/esm2022/lib/dashboard/components/widgets/data-widget.component.mjs +7 -4
  17. package/esm2022/lib/dashboard/components/widgets/header/widget-header.component.mjs +24 -12
  18. package/esm2022/lib/dashboard/components/widgets/settings/settings.component.mjs +4 -5
  19. package/esm2022/lib/dashboard/store/dashboard.effects.mjs +4 -7
  20. package/esm2022/notification/components/notification/notification.component.mjs +3 -3
  21. package/esm2022/notification/i18n/en.translations.mjs +2 -1
  22. package/esm2022/notification/i18n/fr.translations.mjs +2 -1
  23. package/esm2022/presentation/components/add-edit-presentation/add-edit-presentation.component.mjs +5 -3
  24. package/esm2022/presentation/components/presentation.component.mjs +5 -4
  25. package/esm2022/presentation/style/css.component.mjs +2 -2
  26. package/esm2022/restitution/components/restitution/restitution.component.mjs +5 -2
  27. package/esm2022/restitution/components/restitution-catalog/restitution-catalog.component.mjs +3 -3
  28. package/esm2022/restitution/components/restitution-list-item/restitution-list-item.component.mjs +3 -3
  29. package/esm2022/restitution/style/css.component.mjs +2 -2
  30. package/esm2022/search/i18n/en.translations.mjs +9 -3
  31. package/esm2022/search/i18n/fr.translations.mjs +9 -3
  32. package/esm2022/search/search-fulltext/search-fulltext/search-fulltext.component.mjs +3 -3
  33. package/esm2022/search/search-home/search-home.component.mjs +3 -3
  34. package/esm2022/search/search-multi-class/components/multi-class-condition/multi-class-condition.component.mjs +6 -3
  35. package/esm2022/search/search-multi-class/components/search-multi-class/search-multi-class.component.mjs +3 -3
  36. package/esm2022/search/search-tools/search-tools.component.mjs +3 -3
  37. package/esm2022/toolbox/components/automate-refresh/automate-refresh.component.mjs +3 -3
  38. package/esm2022/toolbox/components/clear-view/clear-view.component.mjs +3 -3
  39. package/esm2022/toolbox/components/drag-widgets/drag-widgets.component.mjs +3 -3
  40. package/esm2022/toolbox/components/filter-settings/filter-settings.component.mjs +3 -3
  41. package/esm2022/toolbox/components/launch-tab/launch-tab.component.mjs +3 -3
  42. package/esm2022/toolbox/components/named-query/named-query.component.mjs +3 -3
  43. package/esm2022/toolbox/components/refresh-datasets/refresh-datasets.component.mjs +3 -3
  44. package/esm2022/toolbox/components/save-view/save-view.component.mjs +3 -3
  45. package/esm2022/toolbox/components/select-grid-layout/select-grid-layout.component.mjs +3 -3
  46. package/esm2022/toolbox/style/css.component.mjs +2 -2
  47. package/esm2022/tooltips/attribute/attribute-tooltip.component.mjs +22 -7
  48. package/esm2022/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.mjs +19 -9
  49. package/esm2022/widgets/widget-aggregated-chart/i18n/en.translations.mjs +2 -1
  50. package/esm2022/widgets/widget-aggregated-chart/i18n/fr.translations.mjs +2 -1
  51. package/esm2022/widgets/widget-chart/component/widget-chart.component.mjs +1 -1
  52. package/esm2022/widgets/widget-detail/component/widget-detail.component.mjs +1 -1
  53. package/esm2022/widgets/widget-graph/component/widget-graph.component.mjs +3 -3
  54. package/esm2022/widgets/widget-graph/style/css.component.mjs +2 -2
  55. package/esm2022/widgets/widget-iframe/component/widget-iframe.component.mjs +1 -1
  56. package/esm2022/widgets/widget-map/component/widget-map-layer.service.mjs +5 -1
  57. package/esm2022/widgets/widget-map/component/widget-map.component.mjs +34 -32
  58. package/esm2022/widgets/widget-map/interaction/interaction-manager.class.mjs +8 -12
  59. package/esm2022/widgets/widget-map/style/css.component.mjs +2 -2
  60. package/esm2022/widgets/widget-table/component/widget-table.component.mjs +1 -1
  61. package/esm2022/widgets/widget-tile/component/widget-tile.component.mjs +1 -1
  62. package/esm2022/widgets/widget-vega/component/widget-vega.component.mjs +1 -1
  63. package/fesm2022/provoly-dashboard-components-card.mjs +6 -6
  64. package/fesm2022/provoly-dashboard-components-card.mjs.map +1 -1
  65. package/fesm2022/provoly-dashboard-dataset.mjs +4 -4
  66. package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
  67. package/fesm2022/provoly-dashboard-notification.mjs +4 -2
  68. package/fesm2022/provoly-dashboard-notification.mjs.map +1 -1
  69. package/fesm2022/provoly-dashboard-presentation.mjs +10 -7
  70. package/fesm2022/provoly-dashboard-presentation.mjs.map +1 -1
  71. package/fesm2022/provoly-dashboard-restitution.mjs +10 -7
  72. package/fesm2022/provoly-dashboard-restitution.mjs.map +1 -1
  73. package/fesm2022/provoly-dashboard-search.mjs +29 -14
  74. package/fesm2022/provoly-dashboard-search.mjs.map +1 -1
  75. package/fesm2022/provoly-dashboard-toolbox.mjs +20 -20
  76. package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
  77. package/fesm2022/provoly-dashboard-tooltips-attribute.mjs +21 -6
  78. package/fesm2022/provoly-dashboard-tooltips-attribute.mjs.map +1 -1
  79. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs +20 -8
  80. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs.map +1 -1
  81. package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs +1 -1
  82. package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs.map +1 -1
  83. package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs +1 -1
  84. package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs.map +1 -1
  85. package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs +4 -4
  86. package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs.map +1 -1
  87. package/fesm2022/provoly-dashboard-widgets-widget-iframe.mjs +1 -1
  88. package/fesm2022/provoly-dashboard-widgets-widget-iframe.mjs.map +1 -1
  89. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +43 -40
  90. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
  91. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +1 -1
  92. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
  93. package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs +1 -1
  94. package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs.map +1 -1
  95. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs +1 -1
  96. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs.map +1 -1
  97. package/fesm2022/provoly-dashboard.mjs +114 -175
  98. package/fesm2022/provoly-dashboard.mjs.map +1 -1
  99. package/lib/core/auth/geoAuth.service.d.ts +12 -0
  100. package/lib/core/components/overlay/overlay.module.d.ts +8 -9
  101. package/lib/core/core.module.d.ts +1 -0
  102. package/lib/core/public-api.d.ts +1 -1
  103. package/lib/core/store/aggregation/backend-aggregation.service.d.ts +2 -0
  104. package/lib/core/store/search/search.effects.d.ts +3 -0
  105. package/lib/core/toolbox/toolbox-menu.service.d.ts +2 -0
  106. package/lib/dashboard/components/widgets/data-widget.component.d.ts +3 -2
  107. package/lib/dashboard/components/widgets/header/widget-header.component.d.ts +8 -5
  108. package/notification/i18n/en.translations.d.ts +1 -0
  109. package/notification/i18n/fr.translations.d.ts +1 -0
  110. package/package.json +41 -42
  111. package/presentation/components/add-edit-presentation/add-edit-presentation.component.d.ts +2 -2
  112. package/presentation/style/_o-pry-presentation.scss +17 -13
  113. package/restitution/components/restitution/restitution.component.d.ts +7 -0
  114. package/schematics/migration.json +5 -0
  115. package/schematics/ng-add/index.js +0 -1
  116. package/schematics/ng-add/index.js.map +1 -1
  117. package/schematics/ng-update/version-0-15/index.d.ts +2 -0
  118. package/schematics/ng-update/version-0-15/index.js +19 -0
  119. package/schematics/ng-update/version-0-15/index.js.map +1 -0
  120. package/schematics/ng-update/version-0-15/index.spec.d.ts +1 -0
  121. package/schematics/ng-update/version-0-15/index.spec.js +51 -0
  122. package/schematics/ng-update/version-0-15/index.spec.js.map +1 -0
  123. package/search/i18n/en.translations.d.ts +6 -0
  124. package/search/i18n/fr.translations.d.ts +6 -0
  125. package/search/search-multi-class/components/multi-class-condition/multi-class-condition.component.d.ts +1 -0
  126. package/styles/components/_a-tooltip.scss +76 -0
  127. package/styles/components/_o-dashboard.scss +1 -1
  128. package/styles/components/_o-pry-card.scss +14 -0
  129. package/styles/components/_o-widget.scss +1 -0
  130. package/styles/layout/_o-workspace.scss +0 -1
  131. package/styles/main.scss +2 -0
  132. package/styles-theme/components-theme/_a-tooltip.theme.scss +12 -0
  133. package/styles-theme/main-theme.scss +1 -0
  134. package/toolbox/style/_o-toolbox.scss +6 -0
  135. package/tooltips/attribute/attribute-tooltip.component.d.ts +2 -1
  136. package/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.d.ts +2 -0
  137. package/widgets/widget-aggregated-chart/i18n/en.translations.d.ts +1 -0
  138. package/widgets/widget-aggregated-chart/i18n/fr.translations.d.ts +1 -0
  139. package/widgets/widget-graph/style/_o-widget-graph.scss +15 -1
  140. package/widgets/widget-map/component/widget-map-layer.service.d.ts +3 -1
  141. package/widgets/widget-map/component/widget-map.component.d.ts +4 -7
  142. package/widgets/widget-map/style/_o-widget-map.scss +14 -0
  143. package/esm2022/lib/core/components/overlay/tooltip.directive.mjs +0 -121
  144. package/lib/core/components/overlay/tooltip.directive.d.ts +0 -28
@@ -176,11 +176,11 @@ export class PrySearchHomeComponent {
176
176
  this.subscription.unsubscribe();
177
177
  }
178
178
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PrySearchHomeComponent, deps: [{ token: i1.Store }, { token: i2.Overlay }, { token: i0.ViewContainerRef }, { token: i3.PryDialogService }], target: i0.ɵɵFactoryTarget.Component }); }
179
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: PrySearchHomeComponent, selector: "pry-search-home", inputs: { searchFulltextTpl: "searchFulltextTpl", isMoreList: "isMoreList" }, outputs: { changeListView: "changeListView", changeSearchCriteria: "changeSearchCriteria" }, viewQueries: [{ propertyName: "templateSpot", first: true, predicate: ["templateSpot"], descendants: true, read: TemplateRef }, { propertyName: "templateRefresh", first: true, predicate: ["templateRefresh"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<pry-search-css></pry-search-css>\n<div class=\"o-pry-search-home__named-query\">\n <ng-container *ngIf=\"namedQueryList$ | async as namedQuery\">\n <ng-container *ngIf=\"namedQuery.length > 0; else noNamedQuery\">\n <div class=\"o-pry-search-home__named-query__card\">\n <pry-expand-panel [open]=\"true\">\n <pry-expand-panel-title>{{ '@pry.search.home.title' | i18n }}</pry-expand-panel-title>\n\n <pry-card *ngFor=\"let nq of namedQuery.length > 1 && !isMoreList ? namedQuery.slice(0, 2) : namedQuery\">\n <pry-card-header [marker]=\"true\">\n <pry-card-icon>\n <pry-nq-color-selector [datasource]=\"nq\" [disabled]=\"true\"></pry-nq-color-selector>\n <img\n [alt]=\"nq.id | translateId : { type: 'datasource', output: 'name' } | async\"\n [height]=\"22\"\n [width]=\"22\"\n [src]=\"nq.id | translateId : { type: 'datasource', output: 'icon' } | async\"\n />\n </pry-card-icon>\n\n <pry-card-title>\n <div\n class=\"o-pry-card-title__text\"\n [pryTooltip]=\"infoTooltip\"\n aria-describedby=\"infoTooltip_searchHome\"\n >\n <div class=\"a-p o-pry-card-title__text__title\">{{ nq.name }}</div>\n <div class=\"a-p o-pry-card-title__text__description\" *ngIf=\"nq.description\">{{ nq.description }}</div>\n </div>\n\n <ng-template #infoTooltip>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltip_searchHome\">\n <span class=\"m-tooltip__text\">\n {{ nq.name }}\n </span>\n <span class=\"m-tooltip__description\" *ngIf=\"nq.description\">\n {{ nq.description }}\n </span>\n </div>\n </ng-template>\n\n <pry-icon\n class=\"o-pry-card-title__pin\"\n *ngIf=\"nq.favorite\"\n [width]=\"18\"\n [height]=\"18\"\n aria-label=\"favorite\"\n iconSvg=\"epingle\"\n ></pry-icon>\n\n <button\n [pryTooltip]=\"infoTooltipShow\"\n pryTooltipPosition=\"bottom\"\n aria-describedby=\"infoTooltipShow_searchHome\"\n class=\"a-btn a-btn--secondary -size-sm\"\n (click)=\"onSearchNamedQuery(nq.id)\"\n *ngIf=\"(layout$ | async) !== DashboardGridLayout.MANUAL\"\n >\n {{ '@pry.search.namedQuery.display' | i18n }}\n <span class=\"u-visually-hidden\">le widget associ\u00E9 \u00E0 cette recherche</span>\n </button>\n </pry-card-title>\n\n <pry-card-menu>\n <div class=\"o-pry-card-menu__nav\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onFavorite(nq.id, nq.favorite)\"\n >\n <pry-icon iconSvg=\"epingle\"></pry-icon>\n {{ (nq.favorite ? '@pry.search.namedQuery.noFavorite' : '@pry.search.namedQuery.favorite') | i18n }}\n </button>\n <pry-card-menu (click)=\"refresh(nq.id)\" class=\"refreshbt\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"synchro\"></pry-icon>\n {{ '@pry.search.namedQuery.refreshData' | i18n }}\n </button>\n </pry-card-menu>\n <pry-card-menu *ngIf=\"(layout$ | async) !== DashboardGridLayout.MANUAL\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"loadOpened = nq.id; $event.stopPropagation()\"\n cdkOverlayOrigin\n #triggerLoad=\"cdkOverlayOrigin\"\n >\n <pry-icon iconSvg=\"file_download\"></pry-icon>\n {{ '@pry.search.namedQuery.display' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerLoad\"\n [cdkConnectedOverlayOpen]=\"loadOpened === nq.id\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayPositions]=\"[connectedPosition]\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"loadOpened = undefined\"\n >\n <div class=\"o-draggable-menu -search-home\">\n <ul class=\"o-draggable-menu__list\">\n <ng-container *ngFor=\"let menu of structure\">\n <li class=\"o-draggable-menu__list__item\">\n <button class=\"a-btn\" aria-haspopup=\"true\" aria-expanded=\"false\">\n <pry-icon [iconSvg]=\"menu.icon\"></pry-icon>\n {{ menu.label | i18n }}\n </button>\n\n <ul class=\"o-draggable-menu__list__submenu\">\n <ng-container *ngFor=\"let sub of menu.sub\">\n <li class=\"o-draggable-menu__list__submenu__item\">\n <button class=\"a-btn\" (click)=\"loadWidget(nq.id, sub)\">\n <pry-icon [iconSvg]=\"sub.icon\"></pry-icon>\n {{ sub.label | i18n }}\n </button>\n </li>\n </ng-container>\n </ul>\n </li>\n </ng-container>\n </ul>\n </div>\n </ng-template>\n </pry-card-menu>\n\n <pry-card-menu class=\"o-pry-card-menu__nav__item\">\n <pry-nq-color-selector [ngStyle]=\"{ width: '100%' }\" [datasource]=\"nq\"></pry-nq-color-selector>\n </pry-card-menu>\n\n <pry-card-menu (click)=\"onSpot(nq.id, $event)\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"mode_clic\"></pry-icon>\n {{ '@pry.search.namedQuery.spot' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n </pry-card-menu>\n <pry-card-menu (click)=\"onRefresh(nq.id, $event)\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"history-line\"></pry-icon>\n {{ '@pry.search.namedQuery.refresh.title' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n </pry-card-menu>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onDelete(nq)\"\n *ngIf=\"nq.owner\"\n >\n <pry-icon iconSvg=\"delete\"></pry-icon>\n {{ '@pry.search.namedQuery.delete' | i18n }}\n </button>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onRename(nq)\"\n *ngIf=\"nq.owner\"\n >\n <pry-icon iconSvg=\"renamed\"></pry-icon>\n {{ '@pry.search.namedQuery.rename' | i18n }}\n </button>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onEdit(nq)\"\n (keydown.tab)=\"hideSpot()\"\n >\n <pry-icon iconSvg=\"edit\"></pry-icon>\n {{ '@pry.search.namedQuery.edit' | i18n }}\n </button>\n </div>\n </pry-card-menu>\n </pry-card-header>\n </pry-card>\n </pry-expand-panel>\n </div>\n <button\n class=\"a-btn -link-like\"\n aria-pressed=\"false\"\n id=\"btn_view_more\"\n *ngIf=\"namedQuery.length > 2\"\n (click)=\"onChangeListView(isMoreList)\"\n >\n {{ isMoreList ? ('@pry.search.namedQuery.seeLess' | i18n) : ('@pry.search.namedQuery.seeMore' | i18n) }}\n </button>\n </ng-container>\n\n <ng-template #noNamedQuery>\n <p class=\"search-home__container-search\">{{ '@pry.search.namedQuery.emptyNamedQuery' | i18n }}</p>\n </ng-template>\n </ng-container>\n</div>\n\n<ng-template #infoTooltipShow>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltipShow_searchHome\">\n <span class=\"m-tooltip__text\"> Afficher le widget associ\u00E9 \u00E0 cette recherche </span>\n </div>\n</ng-template>\n\n<div class=\"o-pry-search-home__search\">\n <h3 class=\"a-h3\">{{ '@pry.search.home.ssTitle' | i18n }}</h3>\n <ng-container *ngIf=\"searchFulltextTpl\">\n <ng-container [ngTemplateOutlet]=\"searchFulltextTpl\"></ng-container>\n <p class=\"a-p o-pry-search-home__search__or\">{{ '@pry.search.home.or' | i18n }}</p>\n </ng-container>\n <button class=\"a-btn a-btn--primary -width-full\" (click)=\"onSearchCriteria()\">\n <pry-icon [width]=\"20\" [height]=\"20\" iconSvg=\"search-criteria\"></pry-icon>\n {{ '@pry.search.home.searchByCriteria' | i18n }}\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n</div>\n\n<ng-template #templateSpot>\n <div (mouseleave)=\"hideSpot()\">\n {{\n ((spottingWidget$ | async)?.length ?? 0 > 0\n ? '@pry.search.namedQuery.spotTitle'\n : '@pry.search.namedQuery.noSpot'\n ) | i18n : { length: (spottingWidget$ | async)?.length }\n }}\n <div *ngFor=\"let use of spottingWidget$ | async\" class=\"spot-line\">\n <pry-icon [width]=\"20\" [height]=\"20\" [iconSvg]=\"icons[use.type]\"></pry-icon>\n {{ '@pry.search.namedQuery.type.' + use.type | i18n }} - {{ '@pry.search.namedQuery.use' | i18n : use }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #templateRefresh>\n <div>\n <button\n *ngFor=\"let option of refreshOptions\"\n class=\"refresh-line a-btn a-btn--icon-text -size-sm\"\n (click)=\"selectRefresh(option)\"\n >\n <pry-icon\n [width]=\"20\"\n [height]=\"20\"\n iconSvg=\"check\"\n *ngIf=\"(((refreshRates$ | async) ?? {})[refreshId] ?? 0) === option\"\n ></pry-icon>\n {{ '@pry.search.namedQuery.refresh.' + option | i18n }}\n </button>\n </div>\n</ng-template>\n", dependencies: [{ 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: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.PryNqColorSelectorComponent, selector: "pry-nq-color-selector", inputs: ["disabled", "datasource"], outputs: ["colorChanged"] }, { kind: "component", type: i3.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "directive", type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i2.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i3.PryTooltipDirective, selector: "[pryTooltip]", inputs: ["pryTooltip", "styleReversed", "pryTooltipContext", "pryTooltipPosition", "pryTooltipShowDelay"] }, { kind: "component", type: i5.PryExpandPanelComponent, selector: "pry-expand-panel", inputs: ["open"] }, { kind: "directive", type: i5.PryExpansionPanelTitleDirective, selector: "pry-expand-panel-title" }, { kind: "component", type: i6.PryCardComponent, selector: "pry-card", inputs: ["selected"], outputs: ["statusChange"] }, { kind: "directive", type: i6.PryCardIconDirective, selector: "pry-card-icon, [pry-card-icon], [pryCardIcon]" }, { kind: "directive", type: i6.PryCardTitleDirective, selector: "pry-card-title, [o-pry-card-title], [pryCardTitle]" }, { kind: "directive", type: i6.PryCardMenuDirective, selector: "pry-card-menu", outputs: ["closeMenu$"], exportAs: ["pryCardMenu"] }, { kind: "component", type: i6.PryCardHeaderComponent, selector: "pry-card-header", inputs: ["marker"] }, { kind: "component", type: i7.PrySearchCssComponent, selector: "pry-search-css" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i3.I18nPipe, name: "i18n" }] }); }
179
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: PrySearchHomeComponent, selector: "pry-search-home", inputs: { searchFulltextTpl: "searchFulltextTpl", isMoreList: "isMoreList" }, outputs: { changeListView: "changeListView", changeSearchCriteria: "changeSearchCriteria" }, viewQueries: [{ propertyName: "templateSpot", first: true, predicate: ["templateSpot"], descendants: true, read: TemplateRef }, { propertyName: "templateRefresh", first: true, predicate: ["templateRefresh"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<pry-search-css></pry-search-css>\n<div class=\"o-pry-search-home__named-query\">\n <ng-container *ngIf=\"namedQueryList$ | async as namedQuery\">\n <ng-container *ngIf=\"namedQuery.length > 0; else noNamedQuery\">\n <div class=\"o-pry-search-home__named-query__card\">\n <pry-expand-panel [open]=\"true\">\n <pry-expand-panel-title>{{ '@pry.search.home.title' | i18n }}</pry-expand-panel-title>\n\n <pry-card *ngFor=\"let nq of namedQuery.length > 1 && !isMoreList ? namedQuery.slice(0, 2) : namedQuery\">\n <pry-card-header [marker]=\"true\">\n <pry-card-icon>\n <pry-nq-color-selector [datasource]=\"nq\" [disabled]=\"true\"></pry-nq-color-selector>\n <img\n [alt]=\"nq.id | translateId : { type: 'datasource', output: 'name' } | async\"\n [height]=\"22\"\n [width]=\"22\"\n [src]=\"nq.id | translateId : { type: 'datasource', output: 'icon' } | async\"\n />\n </pry-card-icon>\n\n <pry-card-title>\n <div class=\"o-pry-card-title__text\" aria-describedby=\"infoTooltip_searchHome\">\n <div class=\"a-p o-pry-card-title__text__title\">{{ nq.name }}</div>\n <div class=\"a-p o-pry-card-title__text__description\" *ngIf=\"nq.description\">{{ nq.description }}</div>\n </div>\n <ng-template #infoTooltip>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltip_searchHome\">\n <span class=\"m-tooltip__text\">\n {{ nq.name }}\n </span>\n <span class=\"m-tooltip__description\" *ngIf=\"nq.description\">\n {{ nq.description }}\n </span>\n </div>\n </ng-template>\n <pry-icon\n class=\"o-pry-card-title__pin\"\n *ngIf=\"nq.favorite\"\n [width]=\"18\"\n [height]=\"18\"\n aria-label=\"favorite\"\n iconSvg=\"epingle\"\n ></pry-icon>\n\n <button\n [attr.data-tooltip]=\"'@pry.search.home.showAssociatedWidget' | i18n\"\n data-tooltip-position=\"bottom\"\n class=\"a-tooltip a-btn a-btn--secondary -size-sm\"\n (click)=\"onSearchNamedQuery(nq.id)\"\n *ngIf=\"(layout$ | async) !== DashboardGridLayout.MANUAL\"\n >\n {{ '@pry.search.namedQuery.display' | i18n }}\n <span class=\"u-visually-hidden\">{{ '@pry.search.home.associatedWidget' | i18n }}</span>\n </button>\n </pry-card-title>\n\n <pry-card-menu>\n <div class=\"o-pry-card-menu__nav\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onFavorite(nq.id, nq.favorite)\"\n >\n <pry-icon iconSvg=\"epingle\"></pry-icon>\n {{ (nq.favorite ? '@pry.search.namedQuery.noFavorite' : '@pry.search.namedQuery.favorite') | i18n }}\n </button>\n <pry-card-menu (click)=\"refresh(nq.id)\" class=\"refreshbt\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"synchro\"></pry-icon>\n {{ '@pry.search.namedQuery.refreshData' | i18n }}\n </button>\n </pry-card-menu>\n <pry-card-menu *ngIf=\"(layout$ | async) !== DashboardGridLayout.MANUAL\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"loadOpened = nq.id; $event.stopPropagation()\"\n cdkOverlayOrigin\n #triggerLoad=\"cdkOverlayOrigin\"\n >\n <pry-icon iconSvg=\"file_download\"></pry-icon>\n {{ '@pry.search.namedQuery.display' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerLoad\"\n [cdkConnectedOverlayOpen]=\"loadOpened === nq.id\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayPositions]=\"[connectedPosition]\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"loadOpened = undefined\"\n >\n <div class=\"o-draggable-menu -search-home\">\n <ul class=\"o-draggable-menu__list\">\n <ng-container *ngFor=\"let menu of structure\">\n <li class=\"o-draggable-menu__list__item\">\n <button class=\"a-btn\" aria-haspopup=\"true\" aria-expanded=\"false\">\n <pry-icon [iconSvg]=\"menu.icon\"></pry-icon>\n {{ menu.label | i18n }}\n </button>\n\n <ul class=\"o-draggable-menu__list__submenu\">\n <ng-container *ngFor=\"let sub of menu.sub\">\n <li class=\"o-draggable-menu__list__submenu__item\">\n <button class=\"a-btn\" (click)=\"loadWidget(nq.id, sub)\">\n <pry-icon [iconSvg]=\"sub.icon\"></pry-icon>\n {{ sub.label | i18n }}\n </button>\n </li>\n </ng-container>\n </ul>\n </li>\n </ng-container>\n </ul>\n </div>\n </ng-template>\n </pry-card-menu>\n\n <pry-card-menu class=\"o-pry-card-menu__nav__item\">\n <pry-nq-color-selector [ngStyle]=\"{ width: '100%' }\" [datasource]=\"nq\"></pry-nq-color-selector>\n </pry-card-menu>\n\n <pry-card-menu (click)=\"onSpot(nq.id, $event)\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"mode_clic\"></pry-icon>\n {{ '@pry.search.namedQuery.spot' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n </pry-card-menu>\n <pry-card-menu (click)=\"onRefresh(nq.id, $event)\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"history-line\"></pry-icon>\n {{ '@pry.search.namedQuery.refresh.title' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n </pry-card-menu>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onDelete(nq)\"\n *ngIf=\"nq.owner\"\n >\n <pry-icon iconSvg=\"delete\"></pry-icon>\n {{ '@pry.search.namedQuery.delete' | i18n }}\n </button>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onRename(nq)\"\n *ngIf=\"nq.owner\"\n >\n <pry-icon iconSvg=\"renamed\"></pry-icon>\n {{ '@pry.search.namedQuery.rename' | i18n }}\n </button>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onEdit(nq)\"\n (keydown.tab)=\"hideSpot()\"\n >\n <pry-icon iconSvg=\"edit\"></pry-icon>\n {{ '@pry.search.namedQuery.edit' | i18n }}\n </button>\n </div>\n </pry-card-menu>\n </pry-card-header>\n </pry-card>\n </pry-expand-panel>\n </div>\n <button\n class=\"a-btn -link-like\"\n aria-pressed=\"false\"\n id=\"btn_view_more\"\n *ngIf=\"namedQuery.length > 2\"\n (click)=\"onChangeListView(isMoreList)\"\n >\n {{ isMoreList ? ('@pry.search.namedQuery.seeLess' | i18n) : ('@pry.search.namedQuery.seeMore' | i18n) }}\n </button>\n </ng-container>\n\n <ng-template #noNamedQuery>\n <p class=\"search-home__container-search\">{{ '@pry.search.namedQuery.emptyNamedQuery' | i18n }}</p>\n </ng-template>\n </ng-container>\n</div>\n\n<div class=\"o-pry-search-home__search\">\n <h3 class=\"a-h3\">{{ '@pry.search.home.ssTitle' | i18n }}</h3>\n <ng-container *ngIf=\"searchFulltextTpl\">\n <ng-container [ngTemplateOutlet]=\"searchFulltextTpl\"></ng-container>\n <p class=\"a-p o-pry-search-home__search__or\">{{ '@pry.search.home.or' | i18n }}</p>\n </ng-container>\n <button class=\"a-btn a-btn--primary -width-full\" (click)=\"onSearchCriteria()\">\n <pry-icon [width]=\"20\" [height]=\"20\" iconSvg=\"search-criteria\"></pry-icon>\n {{ '@pry.search.home.searchByCriteria' | i18n }}\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n</div>\n\n<ng-template #templateSpot>\n <div (mouseleave)=\"hideSpot()\">\n {{\n ((spottingWidget$ | async)?.length ?? 0 > 0\n ? '@pry.search.namedQuery.spotTitle'\n : '@pry.search.namedQuery.noSpot'\n ) | i18n : { length: (spottingWidget$ | async)?.length }\n }}\n <div *ngFor=\"let use of spottingWidget$ | async\" class=\"spot-line\">\n <pry-icon [width]=\"20\" [height]=\"20\" [iconSvg]=\"icons[use.type]\"></pry-icon>\n {{ '@pry.search.namedQuery.type.' + use.type | i18n }} - {{ '@pry.search.namedQuery.use' | i18n : use }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #templateRefresh>\n <div>\n <button\n *ngFor=\"let option of refreshOptions\"\n class=\"refresh-line a-btn a-btn--icon-text -size-sm\"\n (click)=\"selectRefresh(option)\"\n >\n <pry-icon\n [width]=\"20\"\n [height]=\"20\"\n iconSvg=\"check\"\n *ngIf=\"(((refreshRates$ | async) ?? {})[refreshId] ?? 0) === option\"\n ></pry-icon>\n {{ '@pry.search.namedQuery.refresh.' + option | i18n }}\n </button>\n </div>\n</ng-template>\n", dependencies: [{ 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: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.PryNqColorSelectorComponent, selector: "pry-nq-color-selector", inputs: ["disabled", "datasource"], outputs: ["colorChanged"] }, { kind: "component", type: i3.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "directive", type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i2.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: i5.PryExpandPanelComponent, selector: "pry-expand-panel", inputs: ["open"] }, { kind: "directive", type: i5.PryExpansionPanelTitleDirective, selector: "pry-expand-panel-title" }, { kind: "component", type: i6.PryCardComponent, selector: "pry-card", inputs: ["selected"], outputs: ["statusChange"] }, { kind: "directive", type: i6.PryCardIconDirective, selector: "pry-card-icon, [pry-card-icon], [pryCardIcon]" }, { kind: "directive", type: i6.PryCardTitleDirective, selector: "pry-card-title, [o-pry-card-title], [pryCardTitle]" }, { kind: "directive", type: i6.PryCardMenuDirective, selector: "pry-card-menu", outputs: ["closeMenu$"], exportAs: ["pryCardMenu"] }, { kind: "component", type: i6.PryCardHeaderComponent, selector: "pry-card-header", inputs: ["marker"] }, { kind: "component", type: i7.PrySearchCssComponent, selector: "pry-search-css" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i3.I18nPipe, name: "i18n" }] }); }
180
180
  }
181
181
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PrySearchHomeComponent, decorators: [{
182
182
  type: Component,
183
- args: [{ selector: 'pry-search-home', template: "<pry-search-css></pry-search-css>\n<div class=\"o-pry-search-home__named-query\">\n <ng-container *ngIf=\"namedQueryList$ | async as namedQuery\">\n <ng-container *ngIf=\"namedQuery.length > 0; else noNamedQuery\">\n <div class=\"o-pry-search-home__named-query__card\">\n <pry-expand-panel [open]=\"true\">\n <pry-expand-panel-title>{{ '@pry.search.home.title' | i18n }}</pry-expand-panel-title>\n\n <pry-card *ngFor=\"let nq of namedQuery.length > 1 && !isMoreList ? namedQuery.slice(0, 2) : namedQuery\">\n <pry-card-header [marker]=\"true\">\n <pry-card-icon>\n <pry-nq-color-selector [datasource]=\"nq\" [disabled]=\"true\"></pry-nq-color-selector>\n <img\n [alt]=\"nq.id | translateId : { type: 'datasource', output: 'name' } | async\"\n [height]=\"22\"\n [width]=\"22\"\n [src]=\"nq.id | translateId : { type: 'datasource', output: 'icon' } | async\"\n />\n </pry-card-icon>\n\n <pry-card-title>\n <div\n class=\"o-pry-card-title__text\"\n [pryTooltip]=\"infoTooltip\"\n aria-describedby=\"infoTooltip_searchHome\"\n >\n <div class=\"a-p o-pry-card-title__text__title\">{{ nq.name }}</div>\n <div class=\"a-p o-pry-card-title__text__description\" *ngIf=\"nq.description\">{{ nq.description }}</div>\n </div>\n\n <ng-template #infoTooltip>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltip_searchHome\">\n <span class=\"m-tooltip__text\">\n {{ nq.name }}\n </span>\n <span class=\"m-tooltip__description\" *ngIf=\"nq.description\">\n {{ nq.description }}\n </span>\n </div>\n </ng-template>\n\n <pry-icon\n class=\"o-pry-card-title__pin\"\n *ngIf=\"nq.favorite\"\n [width]=\"18\"\n [height]=\"18\"\n aria-label=\"favorite\"\n iconSvg=\"epingle\"\n ></pry-icon>\n\n <button\n [pryTooltip]=\"infoTooltipShow\"\n pryTooltipPosition=\"bottom\"\n aria-describedby=\"infoTooltipShow_searchHome\"\n class=\"a-btn a-btn--secondary -size-sm\"\n (click)=\"onSearchNamedQuery(nq.id)\"\n *ngIf=\"(layout$ | async) !== DashboardGridLayout.MANUAL\"\n >\n {{ '@pry.search.namedQuery.display' | i18n }}\n <span class=\"u-visually-hidden\">le widget associ\u00E9 \u00E0 cette recherche</span>\n </button>\n </pry-card-title>\n\n <pry-card-menu>\n <div class=\"o-pry-card-menu__nav\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onFavorite(nq.id, nq.favorite)\"\n >\n <pry-icon iconSvg=\"epingle\"></pry-icon>\n {{ (nq.favorite ? '@pry.search.namedQuery.noFavorite' : '@pry.search.namedQuery.favorite') | i18n }}\n </button>\n <pry-card-menu (click)=\"refresh(nq.id)\" class=\"refreshbt\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"synchro\"></pry-icon>\n {{ '@pry.search.namedQuery.refreshData' | i18n }}\n </button>\n </pry-card-menu>\n <pry-card-menu *ngIf=\"(layout$ | async) !== DashboardGridLayout.MANUAL\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"loadOpened = nq.id; $event.stopPropagation()\"\n cdkOverlayOrigin\n #triggerLoad=\"cdkOverlayOrigin\"\n >\n <pry-icon iconSvg=\"file_download\"></pry-icon>\n {{ '@pry.search.namedQuery.display' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerLoad\"\n [cdkConnectedOverlayOpen]=\"loadOpened === nq.id\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayPositions]=\"[connectedPosition]\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"loadOpened = undefined\"\n >\n <div class=\"o-draggable-menu -search-home\">\n <ul class=\"o-draggable-menu__list\">\n <ng-container *ngFor=\"let menu of structure\">\n <li class=\"o-draggable-menu__list__item\">\n <button class=\"a-btn\" aria-haspopup=\"true\" aria-expanded=\"false\">\n <pry-icon [iconSvg]=\"menu.icon\"></pry-icon>\n {{ menu.label | i18n }}\n </button>\n\n <ul class=\"o-draggable-menu__list__submenu\">\n <ng-container *ngFor=\"let sub of menu.sub\">\n <li class=\"o-draggable-menu__list__submenu__item\">\n <button class=\"a-btn\" (click)=\"loadWidget(nq.id, sub)\">\n <pry-icon [iconSvg]=\"sub.icon\"></pry-icon>\n {{ sub.label | i18n }}\n </button>\n </li>\n </ng-container>\n </ul>\n </li>\n </ng-container>\n </ul>\n </div>\n </ng-template>\n </pry-card-menu>\n\n <pry-card-menu class=\"o-pry-card-menu__nav__item\">\n <pry-nq-color-selector [ngStyle]=\"{ width: '100%' }\" [datasource]=\"nq\"></pry-nq-color-selector>\n </pry-card-menu>\n\n <pry-card-menu (click)=\"onSpot(nq.id, $event)\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"mode_clic\"></pry-icon>\n {{ '@pry.search.namedQuery.spot' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n </pry-card-menu>\n <pry-card-menu (click)=\"onRefresh(nq.id, $event)\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"history-line\"></pry-icon>\n {{ '@pry.search.namedQuery.refresh.title' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n </pry-card-menu>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onDelete(nq)\"\n *ngIf=\"nq.owner\"\n >\n <pry-icon iconSvg=\"delete\"></pry-icon>\n {{ '@pry.search.namedQuery.delete' | i18n }}\n </button>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onRename(nq)\"\n *ngIf=\"nq.owner\"\n >\n <pry-icon iconSvg=\"renamed\"></pry-icon>\n {{ '@pry.search.namedQuery.rename' | i18n }}\n </button>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onEdit(nq)\"\n (keydown.tab)=\"hideSpot()\"\n >\n <pry-icon iconSvg=\"edit\"></pry-icon>\n {{ '@pry.search.namedQuery.edit' | i18n }}\n </button>\n </div>\n </pry-card-menu>\n </pry-card-header>\n </pry-card>\n </pry-expand-panel>\n </div>\n <button\n class=\"a-btn -link-like\"\n aria-pressed=\"false\"\n id=\"btn_view_more\"\n *ngIf=\"namedQuery.length > 2\"\n (click)=\"onChangeListView(isMoreList)\"\n >\n {{ isMoreList ? ('@pry.search.namedQuery.seeLess' | i18n) : ('@pry.search.namedQuery.seeMore' | i18n) }}\n </button>\n </ng-container>\n\n <ng-template #noNamedQuery>\n <p class=\"search-home__container-search\">{{ '@pry.search.namedQuery.emptyNamedQuery' | i18n }}</p>\n </ng-template>\n </ng-container>\n</div>\n\n<ng-template #infoTooltipShow>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltipShow_searchHome\">\n <span class=\"m-tooltip__text\"> Afficher le widget associ\u00E9 \u00E0 cette recherche </span>\n </div>\n</ng-template>\n\n<div class=\"o-pry-search-home__search\">\n <h3 class=\"a-h3\">{{ '@pry.search.home.ssTitle' | i18n }}</h3>\n <ng-container *ngIf=\"searchFulltextTpl\">\n <ng-container [ngTemplateOutlet]=\"searchFulltextTpl\"></ng-container>\n <p class=\"a-p o-pry-search-home__search__or\">{{ '@pry.search.home.or' | i18n }}</p>\n </ng-container>\n <button class=\"a-btn a-btn--primary -width-full\" (click)=\"onSearchCriteria()\">\n <pry-icon [width]=\"20\" [height]=\"20\" iconSvg=\"search-criteria\"></pry-icon>\n {{ '@pry.search.home.searchByCriteria' | i18n }}\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n</div>\n\n<ng-template #templateSpot>\n <div (mouseleave)=\"hideSpot()\">\n {{\n ((spottingWidget$ | async)?.length ?? 0 > 0\n ? '@pry.search.namedQuery.spotTitle'\n : '@pry.search.namedQuery.noSpot'\n ) | i18n : { length: (spottingWidget$ | async)?.length }\n }}\n <div *ngFor=\"let use of spottingWidget$ | async\" class=\"spot-line\">\n <pry-icon [width]=\"20\" [height]=\"20\" [iconSvg]=\"icons[use.type]\"></pry-icon>\n {{ '@pry.search.namedQuery.type.' + use.type | i18n }} - {{ '@pry.search.namedQuery.use' | i18n : use }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #templateRefresh>\n <div>\n <button\n *ngFor=\"let option of refreshOptions\"\n class=\"refresh-line a-btn a-btn--icon-text -size-sm\"\n (click)=\"selectRefresh(option)\"\n >\n <pry-icon\n [width]=\"20\"\n [height]=\"20\"\n iconSvg=\"check\"\n *ngIf=\"(((refreshRates$ | async) ?? {})[refreshId] ?? 0) === option\"\n ></pry-icon>\n {{ '@pry.search.namedQuery.refresh.' + option | i18n }}\n </button>\n </div>\n</ng-template>\n" }]
183
+ args: [{ selector: 'pry-search-home', template: "<pry-search-css></pry-search-css>\n<div class=\"o-pry-search-home__named-query\">\n <ng-container *ngIf=\"namedQueryList$ | async as namedQuery\">\n <ng-container *ngIf=\"namedQuery.length > 0; else noNamedQuery\">\n <div class=\"o-pry-search-home__named-query__card\">\n <pry-expand-panel [open]=\"true\">\n <pry-expand-panel-title>{{ '@pry.search.home.title' | i18n }}</pry-expand-panel-title>\n\n <pry-card *ngFor=\"let nq of namedQuery.length > 1 && !isMoreList ? namedQuery.slice(0, 2) : namedQuery\">\n <pry-card-header [marker]=\"true\">\n <pry-card-icon>\n <pry-nq-color-selector [datasource]=\"nq\" [disabled]=\"true\"></pry-nq-color-selector>\n <img\n [alt]=\"nq.id | translateId : { type: 'datasource', output: 'name' } | async\"\n [height]=\"22\"\n [width]=\"22\"\n [src]=\"nq.id | translateId : { type: 'datasource', output: 'icon' } | async\"\n />\n </pry-card-icon>\n\n <pry-card-title>\n <div class=\"o-pry-card-title__text\" aria-describedby=\"infoTooltip_searchHome\">\n <div class=\"a-p o-pry-card-title__text__title\">{{ nq.name }}</div>\n <div class=\"a-p o-pry-card-title__text__description\" *ngIf=\"nq.description\">{{ nq.description }}</div>\n </div>\n <ng-template #infoTooltip>\n <div class=\"m-tooltip\" role=\"tooltip\" id=\"infoTooltip_searchHome\">\n <span class=\"m-tooltip__text\">\n {{ nq.name }}\n </span>\n <span class=\"m-tooltip__description\" *ngIf=\"nq.description\">\n {{ nq.description }}\n </span>\n </div>\n </ng-template>\n <pry-icon\n class=\"o-pry-card-title__pin\"\n *ngIf=\"nq.favorite\"\n [width]=\"18\"\n [height]=\"18\"\n aria-label=\"favorite\"\n iconSvg=\"epingle\"\n ></pry-icon>\n\n <button\n [attr.data-tooltip]=\"'@pry.search.home.showAssociatedWidget' | i18n\"\n data-tooltip-position=\"bottom\"\n class=\"a-tooltip a-btn a-btn--secondary -size-sm\"\n (click)=\"onSearchNamedQuery(nq.id)\"\n *ngIf=\"(layout$ | async) !== DashboardGridLayout.MANUAL\"\n >\n {{ '@pry.search.namedQuery.display' | i18n }}\n <span class=\"u-visually-hidden\">{{ '@pry.search.home.associatedWidget' | i18n }}</span>\n </button>\n </pry-card-title>\n\n <pry-card-menu>\n <div class=\"o-pry-card-menu__nav\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onFavorite(nq.id, nq.favorite)\"\n >\n <pry-icon iconSvg=\"epingle\"></pry-icon>\n {{ (nq.favorite ? '@pry.search.namedQuery.noFavorite' : '@pry.search.namedQuery.favorite') | i18n }}\n </button>\n <pry-card-menu (click)=\"refresh(nq.id)\" class=\"refreshbt\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"synchro\"></pry-icon>\n {{ '@pry.search.namedQuery.refreshData' | i18n }}\n </button>\n </pry-card-menu>\n <pry-card-menu *ngIf=\"(layout$ | async) !== DashboardGridLayout.MANUAL\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"loadOpened = nq.id; $event.stopPropagation()\"\n cdkOverlayOrigin\n #triggerLoad=\"cdkOverlayOrigin\"\n >\n <pry-icon iconSvg=\"file_download\"></pry-icon>\n {{ '@pry.search.namedQuery.display' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerLoad\"\n [cdkConnectedOverlayOpen]=\"loadOpened === nq.id\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayPositions]=\"[connectedPosition]\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"loadOpened = undefined\"\n >\n <div class=\"o-draggable-menu -search-home\">\n <ul class=\"o-draggable-menu__list\">\n <ng-container *ngFor=\"let menu of structure\">\n <li class=\"o-draggable-menu__list__item\">\n <button class=\"a-btn\" aria-haspopup=\"true\" aria-expanded=\"false\">\n <pry-icon [iconSvg]=\"menu.icon\"></pry-icon>\n {{ menu.label | i18n }}\n </button>\n\n <ul class=\"o-draggable-menu__list__submenu\">\n <ng-container *ngFor=\"let sub of menu.sub\">\n <li class=\"o-draggable-menu__list__submenu__item\">\n <button class=\"a-btn\" (click)=\"loadWidget(nq.id, sub)\">\n <pry-icon [iconSvg]=\"sub.icon\"></pry-icon>\n {{ sub.label | i18n }}\n </button>\n </li>\n </ng-container>\n </ul>\n </li>\n </ng-container>\n </ul>\n </div>\n </ng-template>\n </pry-card-menu>\n\n <pry-card-menu class=\"o-pry-card-menu__nav__item\">\n <pry-nq-color-selector [ngStyle]=\"{ width: '100%' }\" [datasource]=\"nq\"></pry-nq-color-selector>\n </pry-card-menu>\n\n <pry-card-menu (click)=\"onSpot(nq.id, $event)\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"mode_clic\"></pry-icon>\n {{ '@pry.search.namedQuery.spot' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n </pry-card-menu>\n <pry-card-menu (click)=\"onRefresh(nq.id, $event)\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\">\n <pry-icon iconSvg=\"history-line\"></pry-icon>\n {{ '@pry.search.namedQuery.refresh.title' | i18n }}\n <pry-icon\n iconSvg=\"fleche_haut\"\n [ngStyle]=\"{ transform: 'rotate(90deg)', marginLeft: 'auto' }\"\n ></pry-icon>\n </button>\n </pry-card-menu>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onDelete(nq)\"\n *ngIf=\"nq.owner\"\n >\n <pry-icon iconSvg=\"delete\"></pry-icon>\n {{ '@pry.search.namedQuery.delete' | i18n }}\n </button>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onRename(nq)\"\n *ngIf=\"nq.owner\"\n >\n <pry-icon iconSvg=\"renamed\"></pry-icon>\n {{ '@pry.search.namedQuery.rename' | i18n }}\n </button>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text o-pry-card-menu__nav__item\"\n (click)=\"onEdit(nq)\"\n (keydown.tab)=\"hideSpot()\"\n >\n <pry-icon iconSvg=\"edit\"></pry-icon>\n {{ '@pry.search.namedQuery.edit' | i18n }}\n </button>\n </div>\n </pry-card-menu>\n </pry-card-header>\n </pry-card>\n </pry-expand-panel>\n </div>\n <button\n class=\"a-btn -link-like\"\n aria-pressed=\"false\"\n id=\"btn_view_more\"\n *ngIf=\"namedQuery.length > 2\"\n (click)=\"onChangeListView(isMoreList)\"\n >\n {{ isMoreList ? ('@pry.search.namedQuery.seeLess' | i18n) : ('@pry.search.namedQuery.seeMore' | i18n) }}\n </button>\n </ng-container>\n\n <ng-template #noNamedQuery>\n <p class=\"search-home__container-search\">{{ '@pry.search.namedQuery.emptyNamedQuery' | i18n }}</p>\n </ng-template>\n </ng-container>\n</div>\n\n<div class=\"o-pry-search-home__search\">\n <h3 class=\"a-h3\">{{ '@pry.search.home.ssTitle' | i18n }}</h3>\n <ng-container *ngIf=\"searchFulltextTpl\">\n <ng-container [ngTemplateOutlet]=\"searchFulltextTpl\"></ng-container>\n <p class=\"a-p o-pry-search-home__search__or\">{{ '@pry.search.home.or' | i18n }}</p>\n </ng-container>\n <button class=\"a-btn a-btn--primary -width-full\" (click)=\"onSearchCriteria()\">\n <pry-icon [width]=\"20\" [height]=\"20\" iconSvg=\"search-criteria\"></pry-icon>\n {{ '@pry.search.home.searchByCriteria' | i18n }}\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n</div>\n\n<ng-template #templateSpot>\n <div (mouseleave)=\"hideSpot()\">\n {{\n ((spottingWidget$ | async)?.length ?? 0 > 0\n ? '@pry.search.namedQuery.spotTitle'\n : '@pry.search.namedQuery.noSpot'\n ) | i18n : { length: (spottingWidget$ | async)?.length }\n }}\n <div *ngFor=\"let use of spottingWidget$ | async\" class=\"spot-line\">\n <pry-icon [width]=\"20\" [height]=\"20\" [iconSvg]=\"icons[use.type]\"></pry-icon>\n {{ '@pry.search.namedQuery.type.' + use.type | i18n }} - {{ '@pry.search.namedQuery.use' | i18n : use }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #templateRefresh>\n <div>\n <button\n *ngFor=\"let option of refreshOptions\"\n class=\"refresh-line a-btn a-btn--icon-text -size-sm\"\n (click)=\"selectRefresh(option)\"\n >\n <pry-icon\n [width]=\"20\"\n [height]=\"20\"\n iconSvg=\"check\"\n *ngIf=\"(((refreshRates$ | async) ?? {})[refreshId] ?? 0) === option\"\n ></pry-icon>\n {{ '@pry.search.namedQuery.refresh.' + option | i18n }}\n </button>\n </div>\n</ng-template>\n" }]
184
184
  }], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.Overlay }, { type: i0.ViewContainerRef }, { type: i3.PryDialogService }]; }, propDecorators: { templateSpot: [{
185
185
  type: ViewChild,
186
186
  args: ['templateSpot', { read: TemplateRef }]
@@ -196,4 +196,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImpor
196
196
  }], changeSearchCriteria: [{
197
197
  type: Output
198
198
  }] } });
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWhvbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvc2VhcmNoL3NlYXJjaC1ob21lL3NlYXJjaC1ob21lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3NlYXJjaC9zZWFyY2gtaG9tZS9zZWFyY2gtaG9tZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQThCLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixvQkFBb0IsRUFHcEIsZUFBZSxFQUNmLHlCQUF5QixFQUd6QixhQUFhLEVBRWQsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQWMsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqSCxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDOzs7Ozs7Ozs7QUFPdEYsTUFBTSxPQUFPLHNCQUFzQjtJQThDakMsWUFDVSxLQUFZLEVBQ1osT0FBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFNBQTJCO1FB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QyxRQUFRLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDOzhHQXpOVSxzQkFBc0I7a0dBQXRCLHNCQUFzQiwyVEFDRSxXQUFXLDZHQUNSLFdBQVcsNkJDM0NuRCwyd1hBK1BBOzsyRkR0TmEsc0JBQXNCO2tCQUpsQyxTQUFTOytCQUNFLGlCQUFpQjtnTEFJdUIsWUFBWTtzQkFBN0QsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUNLLGVBQWU7c0JBQW5FLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUUxQyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbm5lY3RlZFBvc2l0aW9uLCBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQ29uZmlnQWN0aW9ucyxcbiAgRGFzaGJvYXJkQWN0aW9ucyxcbiAgRGFzaGJvYXJkR3JpZExheW91dCxcbiAgRGFzaGJvYXJkU2VsZWN0b3JzLFxuICBEYXRhU291cmNlQWN0aW9ucyxcbiAgRGF0YVNvdXJjZVNlbGVjdG9ycyxcbiAgRGF0YXNvdXJjZVV0aWxzLFxuICBkZWZhdWx0TWVudVN0cnVjdHVyZSxcbiAgRnVsbFRleHRTZWFyY2hQYXlsb2FkLFxuICBOYW1lZFF1ZXJ5LFxuICBOYW1lZFF1ZXJ5VHlwZXMsXG4gIFByeURpYWxvZ0NvbmZpcm1Db21wb25lbnQsXG4gIFByeURpYWxvZ0NvbmZpcm1EYXRhLFxuICBQcnlEaWFsb2dTZXJ2aWNlLFxuICBTZWFyY2hBY3Rpb25zLFxuICBXaWRnZXRMYXlvdXRcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgY29tYmluZUxhdGVzdFdpdGgsIGZpbHRlciwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFByeVNhdmVRdWVyeUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2F2ZS1xdWVyeS9zYXZlLXF1ZXJ5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hGdWxsdGV4dENoYW5nZSB9IGZyb20gJy4uL3NlYXJjaC1mdWxsdGV4dC9zZWFyY2gtZnVsbHRleHQvc2VhcmNoLWZ1bGx0ZXh0LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS1zZWFyY2gtaG9tZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2gtaG9tZS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUHJ5U2VhcmNoSG9tZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgndGVtcGxhdGVTcG90JywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSB0ZW1wbGF0ZVNwb3QhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZVJlZnJlc2gnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIHRlbXBsYXRlUmVmcmVzaCE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KCkgc2VhcmNoRnVsbHRleHRUcGw/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBpc01vcmVMaXN0ID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGNoYW5nZUxpc3RWaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgY2hhbmdlU2VhcmNoQ3JpdGVyaWEgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgbmFtZWRRdWVyeUxpc3QkPzogT2JzZXJ2YWJsZTxOYW1lZFF1ZXJ5W10+O1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIG5hbWVkUXVlcmllc1VzZXMkITogT2JzZXJ2YWJsZTx7IFtwOiBzdHJpbmddOiB7IHdpbmRvd0luZGV4OiBudW1iZXI7IHR5cGU6IHN0cmluZzsgbGF5b3V0OiBXaWRnZXRMYXlvdXQgfVtdIH0+O1xuICBzcG90dGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICBzcG90dGluZ1dpZGdldCQhOiBPYnNlcnZhYmxlPHsgd2luZG93SW5kZXg6IG51bWJlcjsgdHlwZTogc3RyaW5nOyBsYXlvdXQ6IFdpZGdldExheW91dCB9W10+O1xuICByZWZyZXNoT3B0aW9ucyA9IFswLCAxMCwgMzAsIDYwXTtcblxuICBpY29ucyA9IHtcbiAgICBtYXA6ICdzaGFyZV9sb2NhdGlvbicsXG4gICAgdGFibGU6ICd0YWJsZV9jaGFydCcsXG4gICAgY2hhcnQ6ICdzaG93X2NoYXJ0JyxcbiAgICBncmFwaDogJ2dyYXBoJ1xuICB9IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgbG9hZE9wZW5lZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XG5cbiAgcmVhZG9ubHkgY29ubmVjdGVkUG9zaXRpb246IENvbm5lY3RlZFBvc2l0aW9uID0ge1xuICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgb3ZlcmxheVk6ICd0b3AnXG4gIH07XG4gIHN0cnVjdHVyZSA9IGRlZmF1bHRNZW51U3RydWN0dXJlLm1hcCgoaXRlbXMpID0+ICh7XG4gICAgLi4uaXRlbXMsXG4gICAgc3ViOiBpdGVtcy5zdWIuZmlsdGVyKChzKSA9PiBzLnR5cGUgIT09ICdpZnJhbWUnICYmIHMudHlwZSAhPT0gJ2RldGFpbCcpXG4gIH0pKTtcblxuICByZWZyZXNoUmF0ZXMkITogT2JzZXJ2YWJsZTx7IFtwOiBzdHJpbmddOiBudW1iZXIgfT47XG4gIHJlZnJlc2hJZDogc3RyaW5nID0gJyc7XG4gIGRlbGV0ZUVycm9yJD86IE9ic2VydmFibGU8YW55PjtcbiAgbGF5b3V0JCE6IE9ic2VydmFibGU8RGFzaGJvYXJkR3JpZExheW91dD47XG4gIERhc2hib2FyZEdyaWRMYXlvdXQgPSBEYXNoYm9hcmRHcmlkTGF5b3V0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlLFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBwcnlEaWFsb2c6IFByeURpYWxvZ1NlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubG9hZCgpKTtcbiAgICB0aGlzLm5hbWVkUXVlcnlMaXN0JCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZ2V0TmFtZWRRdWVyeVNvcnRlZCk7XG4gICAgdGhpcy5uYW1lZFF1ZXJpZXNVc2VzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5uYW1lZFF1ZXJpZXNVc2VzKTtcbiAgICB0aGlzLnNwb3R0aW5nV2lkZ2V0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMubmFtZWRRdWVyaWVzVXNlcyQsIHRoaXMuc3BvdHRpbmckXSkucGlwZShcbiAgICAgIG1hcCgoW3VzZXMsIHNwb3R0aW5nXSkgPT4gdXNlc1tzcG90dGluZ10gPz8gW10pLFxuICAgICAgbWFwKCh1c2VzKSA9PiB1c2VzLm1hcCgodXNlKSA9PiAoeyAuLi51c2UsIHdpbmRvd0luZGV4OiB1c2Uud2luZG93SW5kZXggKyAxIH0pKSlcbiAgICApO1xuICAgIHRoaXMucmVmcmVzaFJhdGVzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5yZWZyZXNoUmF0ZXMpO1xuICAgIHRoaXMubGF5b3V0JCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5ncmlkTGF5b3V0KTtcbiAgICB0aGlzLmRlbGV0ZUVycm9yJCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZXJyb3JzKS5waXBlKGRlYm91bmNlVGltZSgxMDApKTtcbiAgfVxuXG4gIG9uU2VhcmNoTmFtZWRRdWVyeShpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZVdpZGdldEluUHJlc2VudGF0aW9uKHsgaWQsIHdpZGdldFR5cGU6ICd0YWJsZScgfSkpO1xuICB9XG5cbiAgb25GYXZvcml0ZShpZDogc3RyaW5nLCBpc0Zhdm9yaXRlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFpc0Zhdm9yaXRlKSB7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhdGFTb3VyY2VBY3Rpb25zLm5hbWVkUXVlcnkuYWRkRmF2b3JpdGUoeyBpZCB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubmFtZWRRdWVyeS5kZWxldGVGYXZvcml0ZSh7IGlkIH0pKTtcbiAgICB9XG4gIH1cblxuICBvblNwb3QoaWQ6IHN0cmluZywgJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5zcG90dGluZyQubmV4dChpZCk7XG5cbiAgICBpZiAoIXRoaXMub3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3Nwb3QtcnMnXVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5hZGRpbmdPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSB9KSk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRlbXBsYXRlU3BvdCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgICBjb25zdCBzcG90RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zcG90LXJzJykgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICBpZiAoISFzcG90RWxlbWVudCkge1xuICAgICAgICBzcG90RWxlbWVudC5zdHlsZS5sZWZ0ID0gJGV2ZW50LmNsaWVudFggLSAxMCArICdweCc7XG4gICAgICAgIHNwb3RFbGVtZW50LnN0eWxlLnRvcCA9ICRldmVudC5jbGllbnRZIC0gMTAgKyAncHgnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhpZGVTcG90KCkge1xuICAgIHRoaXMub3ZlcmxheVJlZj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lIH0pKTtcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBvbkVkaXQobmFtZWRRdWVyeTogTmFtZWRRdWVyeSkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubmFtZWRRdWVyeS5lZGl0KHsgY3VycmVudEVkaXQ6IG5hbWVkUXVlcnkgfSkpO1xuICB9XG5cbiAgb25DaGFuZ2VMaXN0Vmlldyhpc01vcmVMaXN0OiBib29sZWFuKSB7XG4gICAgdGhpcy5jaGFuZ2VMaXN0Vmlldy5lbWl0KGlzTW9yZUxpc3QpO1xuICB9XG5cbiAgb25TZWFyY2hDcml0ZXJpYSgpIHtcbiAgICB0aGlzLmNoYW5nZVNlYXJjaENyaXRlcmlhLmVtaXQoKTtcbiAgfVxuXG4gIGxvYWRXaWRnZXQoaWQ6IHN0cmluZywgc3ViOiB7IGljb246IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlV2lkZ2V0SW5QcmVzZW50YXRpb24oeyBpZCwgd2lkZ2V0VHlwZTogc3ViLnR5cGUgfSkpO1xuICAgIHRoaXMubG9hZE9wZW5lZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG9uRGVsZXRlKG5xOiBOYW1lZFF1ZXJ5KSB7XG4gICAgY29uc3QgZGF0YTogUHJ5RGlhbG9nQ29uZmlybURhdGEgPSB7XG4gICAgICB0aXRsZTogJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkuZGVsZXRlJyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgeyBpZDogMCwgbGFiZWw6ICdAcHJ5LnRvb2xib3gubWFuaWZlc3QuY2xvc2UnLCBjb2xvcjogJ2dob3N0JyB9LFxuICAgICAgICB7IGlkOiAxLCBsYWJlbDogJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkuZGVsZXRlJyB9XG4gICAgICBdXG4gICAgfTtcbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLnByeURpYWxvZy5vcGVuKFByeURpYWxvZ0NvbmZpcm1Db21wb25lbnQsIHtcbiAgICAgIGRhdGFcbiAgICB9KTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBkaWFsb2cuY2xvc2VWYWx1ZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoYWN0aW9uKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogJ1ByeURpYWxvZ0NvbmZpcm1Db21wb25lbnQnIH0pKTtcbiAgICAgICAgaWYgKGFjdGlvbi5pZCA9PT0gMSkge1xuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubmFtZWRRdWVyeS5kZWxldGUoeyBpZDogbnEuaWQgPz8gJycgfSkpO1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlRXJyb3IkXG4gICAgICAgICAgICAgID8ucGlwZShcbiAgICAgICAgICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLnN0b3JlLnNlbGVjdChEYXRhU291cmNlU2VsZWN0b3JzLmlzTG9hZGluZykpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoWywgaXNMb2FkaW5nXSkgPT4gIWlzTG9hZGluZyksXG4gICAgICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKFtlcnJvcl0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhOiBQcnlEaWFsb2dDb25maXJtRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdAcHJ5Lm1hbmlmZXN0LmRlbGV0ZUVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sgaWQ6IDEsIGxhYmVsOiAnQHByeS50b29sYm94LmNsb3NlJyB9XVxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yRGlhbG9nID0gdGhpcy5wcnlEaWFsb2cub3BlbihQcnlEaWFsb2dDb25maXJtQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgICAgICAgICBlcnJvckRpYWxvZy5jbG9zZVZhbHVlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuY2xvc2VPdmVybGF5KHsgaWQ6ICdQcnlEaWFsb2dDb25maXJtQ29tcG9uZW50JyB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvblJlbmFtZShucTogTmFtZWRRdWVyeSkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubmFtZWRRdWVyeS5vcGVuUmVuYW1lKCkpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubmFtZWRRdWVyeS5lZGl0KHsgY3VycmVudEVkaXQ6IG5xIH0pKTtcbiAgICBjb25zdCBzYXZlID0gZmFsc2U7XG4gICAgY29uc3QgdHlwZSA9IERhdGFzb3VyY2VVdGlscy5nZXRUeXBlRnJvbVBheWxvYWQobnEucmVxdWVzdCk7XG4gICAgY29uc3QgZGF0YSA9XG4gICAgICB0eXBlID09PSBOYW1lZFF1ZXJ5VHlwZXMuRlVMTF9URVhUXG4gICAgICAgID8geyBzYXZlLCB0eXBlLCBwYXlsb2FkOiB0aGlzLmV4dHJhY3RQYXlsb2FkKG5xLnJlcXVlc3QgYXMgRnVsbFRleHRTZWFyY2hQYXlsb2FkKSB9XG4gICAgICAgIDogeyBzYXZlLCB0eXBlIH07XG4gICAgdGhpcy5wcnlEaWFsb2cub3BlbihQcnlTYXZlUXVlcnlDb21wb25lbnQsIHsgZGF0YSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFBheWxvYWQocGF5bG9hZDogRnVsbFRleHRTZWFyY2hQYXlsb2FkKTogU2VhcmNoRnVsbHRleHRDaGFuZ2Uge1xuICAgIGNvbnN0IHsgZnVsbFNlYXJjaCwgb0NsYXNzZXMgfSA9IHBheWxvYWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IGZ1bGxTZWFyY2gudmFsdWUsIGNsYXNzZXM6IG9DbGFzc2VzID8/IFtdIH07XG4gIH1cblxuICBvblJlZnJlc2goaWQ6IHN0cmluZywgJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5yZWZyZXNoSWQgPSBpZDtcblxuICAgIGlmICghdGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxuICAgICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydyZWZyZXNoLXJzJ11cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuYWRkaW5nT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgfSkpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmF0dGFjaChuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy50ZW1wbGF0ZVJlZnJlc2gsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKF8pID0+IHRoaXMuaGlkZVNwb3QoKSk7XG4gICAgICBjb25zdCByZWZyZXNoRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yZWZyZXNoLXJzJykgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICBjb25zdCByZWZyZXNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnJlZnJlc2hidCcpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgaWYgKCEhcmVmcmVzaEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHJlZnJlc2guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJlZnJlc2hFbGVtZW50LnN0eWxlLmxlZnQgPSByZWN0LmxlZnQgKyByZWN0LndpZHRoICsgMTAgKyAncHgnO1xuICAgICAgICByZWZyZXNoRWxlbWVudC5zdHlsZS50b3AgPSByZWN0LnRvcCArIDEzNyArICdweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0UmVmcmVzaCgkZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5zZXRSZWZyZXNoUmF0ZSh7IGlkOiB0aGlzLnJlZnJlc2hJZCA/PyAnJywgcmF0ZTogJGV2ZW50IH0pKTtcbiAgICB0aGlzLmhpZGVTcG90KCk7XG4gIH1cblxuICByZWZyZXNoKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFNlYXJjaEFjdGlvbnMuZ2V0RGF0YXNvdXJjZUl0ZW1zKHsgaWQgfSkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPHByeS1zZWFyY2gtY3NzPjwvcHJ5LXNlYXJjaC1jc3M+XG48ZGl2IGNsYXNzPVwiby1wcnktc2VhcmNoLWhvbWVfX25hbWVkLXF1ZXJ5XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJuYW1lZFF1ZXJ5TGlzdCQgfCBhc3luYyBhcyBuYW1lZFF1ZXJ5XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hbWVkUXVlcnkubGVuZ3RoID4gMDsgZWxzZSBub05hbWVkUXVlcnlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLXByeS1zZWFyY2gtaG9tZV9fbmFtZWQtcXVlcnlfX2NhcmRcIj5cbiAgICAgICAgPHByeS1leHBhbmQtcGFuZWwgW29wZW5dPVwidHJ1ZVwiPlxuICAgICAgICAgIDxwcnktZXhwYW5kLXBhbmVsLXRpdGxlPnt7ICdAcHJ5LnNlYXJjaC5ob21lLnRpdGxlJyB8IGkxOG4gfX08L3ByeS1leHBhbmQtcGFuZWwtdGl0bGU+XG5cbiAgICAgICAgICA8cHJ5LWNhcmQgKm5nRm9yPVwibGV0IG5xIG9mIG5hbWVkUXVlcnkubGVuZ3RoID4gMSAmJiAhaXNNb3JlTGlzdCA/IG5hbWVkUXVlcnkuc2xpY2UoMCwgMikgOiBuYW1lZFF1ZXJ5XCI+XG4gICAgICAgICAgICA8cHJ5LWNhcmQtaGVhZGVyIFttYXJrZXJdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8cHJ5LWNhcmQtaWNvbj5cbiAgICAgICAgICAgICAgICA8cHJ5LW5xLWNvbG9yLXNlbGVjdG9yIFtkYXRhc291cmNlXT1cIm5xXCIgW2Rpc2FibGVkXT1cInRydWVcIj48L3ByeS1ucS1jb2xvci1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBbYWx0XT1cIm5xLmlkIHwgdHJhbnNsYXRlSWQgOiB7IHR5cGU6ICdkYXRhc291cmNlJywgb3V0cHV0OiAnbmFtZScgfSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMjJcIlxuICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjIyXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwibnEuaWQgfCB0cmFuc2xhdGVJZCA6IHsgdHlwZTogJ2RhdGFzb3VyY2UnLCBvdXRwdXQ6ICdpY29uJyB9IHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvcHJ5LWNhcmQtaWNvbj5cblxuICAgICAgICAgICAgICA8cHJ5LWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvLXByeS1jYXJkLXRpdGxlX190ZXh0XCJcbiAgICAgICAgICAgICAgICAgIFtwcnlUb29sdGlwXT1cImluZm9Ub29sdGlwXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpbmZvVG9vbHRpcF9zZWFyY2hIb21lXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYS1wIG8tcHJ5LWNhcmQtdGl0bGVfX3RleHRfX3RpdGxlXCI+e3sgbnEubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImEtcCBvLXByeS1jYXJkLXRpdGxlX190ZXh0X19kZXNjcmlwdGlvblwiICpuZ0lmPVwibnEuZGVzY3JpcHRpb25cIj57eyBucS5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbmZvVG9vbHRpcD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiIGlkPVwiaW5mb1Rvb2x0aXBfc2VhcmNoSG9tZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tdG9vbHRpcF9fdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IG5xLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tdG9vbHRpcF9fZGVzY3JpcHRpb25cIiAqbmdJZj1cIm5xLmRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgbnEuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvLXByeS1jYXJkLXRpdGxlX19waW5cIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJucS5mYXZvcml0ZVwiXG4gICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMThcIlxuICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCIxOFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiZmF2b3JpdGVcIlxuICAgICAgICAgICAgICAgICAgaWNvblN2Zz1cImVwaW5nbGVcIlxuICAgICAgICAgICAgICAgID48L3ByeS1pY29uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3ByeVRvb2x0aXBdPVwiaW5mb1Rvb2x0aXBTaG93XCJcbiAgICAgICAgICAgICAgICAgIHByeVRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaW5mb1Rvb2x0aXBTaG93X3NlYXJjaEhvbWVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tc2Vjb25kYXJ5IC1zaXplLXNtXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNlYXJjaE5hbWVkUXVlcnkobnEuaWQpXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGxheW91dCQgfCBhc3luYykgIT09IERhc2hib2FyZEdyaWRMYXlvdXQuTUFOVUFMXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyAnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5kaXNwbGF5JyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj5sZSB3aWRnZXQgYXNzb2Npw6kgw6AgY2V0dGUgcmVjaGVyY2hlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L3ByeS1jYXJkLXRpdGxlPlxuXG4gICAgICAgICAgICAgIDxwcnktY2FyZC1tZW51PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLXByeS1jYXJkLW1lbnVfX25hdlwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi10ZXh0IG8tcHJ5LWNhcmQtbWVudV9fbmF2X19pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRmF2b3JpdGUobnEuaWQsIG5xLmZhdm9yaXRlKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiZXBpbmdsZVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIHt7IChucS5mYXZvcml0ZSA/ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5Lm5vRmF2b3JpdGUnIDogJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkuZmF2b3JpdGUnKSB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPHByeS1jYXJkLW1lbnUgKGNsaWNrKT1cInJlZnJlc2gobnEuaWQpXCIgY2xhc3M9XCJyZWZyZXNoYnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi10ZXh0IG8tcHJ5LWNhcmQtbWVudV9fbmF2X19pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJzeW5jaHJvXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5yZWZyZXNoRGF0YScgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9wcnktY2FyZC1tZW51PlxuICAgICAgICAgICAgICAgICAgPHByeS1jYXJkLW1lbnUgKm5nSWY9XCIobGF5b3V0JCB8IGFzeW5jKSAhPT0gRGFzaGJvYXJkR3JpZExheW91dC5NQU5VQUxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tdGV4dCBvLXByeS1jYXJkLW1lbnVfX25hdl9faXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImxvYWRPcGVuZWQgPSBucS5pZDsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgICAgICAgICAgICAgICAgICAgI3RyaWdnZXJMb2FkPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImZpbGVfZG93bmxvYWRcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LmRpc3BsYXknIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvblN2Zz1cImZsZWNoZV9oYXV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgdHJhbnNmb3JtOiAncm90YXRlKDkwZGVnKScsIG1hcmdpbkxlZnQ6ICdhdXRvJyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgICAgICAgICAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJMb2FkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwibG9hZE9wZW5lZCA9PT0gbnEuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwiW2Nvbm5lY3RlZFBvc2l0aW9uXVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3M9XCJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGJhY2tkcm9wQ2xpY2spPVwibG9hZE9wZW5lZCA9IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1kcmFnZ2FibGUtbWVudSAtc2VhcmNoLWhvbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm8tZHJhZ2dhYmxlLW1lbnVfX2xpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbWVudSBvZiBzdHJ1Y3R1cmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJvLWRyYWdnYWJsZS1tZW51X19saXN0X19pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG5cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gW2ljb25TdmddPVwibWVudS5pY29uXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWVudS5sYWJlbCB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJvLWRyYWdnYWJsZS1tZW51X19saXN0X19zdWJtZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YiBvZiBtZW51LnN1YlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm8tZHJhZ2dhYmxlLW1lbnVfX2xpc3RfX3N1Ym1lbnVfX2l0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0blwiIChjbGljayk9XCJsb2FkV2lkZ2V0KG5xLmlkLCBzdWIpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktaWNvbiBbaWNvblN2Z109XCJzdWIuaWNvblwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHN1Yi5sYWJlbCB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L3ByeS1jYXJkLW1lbnU+XG5cbiAgICAgICAgICAgICAgICAgIDxwcnktY2FyZC1tZW51IGNsYXNzPVwiby1wcnktY2FyZC1tZW51X19uYXZfX2l0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHByeS1ucS1jb2xvci1zZWxlY3RvciBbbmdTdHlsZV09XCJ7IHdpZHRoOiAnMTAwJScgfVwiIFtkYXRhc291cmNlXT1cIm5xXCI+PC9wcnktbnEtY29sb3Itc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgICA8L3ByeS1jYXJkLW1lbnU+XG5cbiAgICAgICAgICAgICAgICAgIDxwcnktY2FyZC1tZW51IChjbGljayk9XCJvblNwb3QobnEuaWQsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi10ZXh0IG8tcHJ5LWNhcmQtbWVudV9fbmF2X19pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJtb2RlX2NsaWNcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LnNwb3QnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvblN2Zz1cImZsZWNoZV9oYXV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgdHJhbnNmb3JtOiAncm90YXRlKDkwZGVnKScsIG1hcmdpbkxlZnQ6ICdhdXRvJyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L3ByeS1jYXJkLW1lbnU+XG4gICAgICAgICAgICAgICAgICA8cHJ5LWNhcmQtbWVudSAoY2xpY2spPVwib25SZWZyZXNoKG5xLmlkLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tdGV4dCBvLXByeS1jYXJkLW1lbnVfX25hdl9faXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiaGlzdG9yeS1saW5lXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5yZWZyZXNoLnRpdGxlJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25Tdmc9XCJmbGVjaGVfaGF1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHRyYW5zZm9ybTogJ3JvdGF0ZSg5MGRlZyknLCBtYXJnaW5MZWZ0OiAnYXV0bycgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9wcnktY2FyZC1tZW51PlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi10ZXh0IG8tcHJ5LWNhcmQtbWVudV9fbmF2X19pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKG5xKVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibnEub3duZXJcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImRlbGV0ZVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LmRlbGV0ZScgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tdGV4dCBvLXByeS1jYXJkLW1lbnVfX25hdl9faXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblJlbmFtZShucSlcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm5xLm93bmVyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJyZW5hbWVkXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkucmVuYW1lJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi10ZXh0IG8tcHJ5LWNhcmQtbWVudV9fbmF2X19pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdChucSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi50YWIpPVwiaGlkZVNwb3QoKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiZWRpdFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LmVkaXQnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvcHJ5LWNhcmQtbWVudT5cbiAgICAgICAgICAgIDwvcHJ5LWNhcmQtaGVhZGVyPlxuICAgICAgICAgIDwvcHJ5LWNhcmQ+XG4gICAgICAgIDwvcHJ5LWV4cGFuZC1wYW5lbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImEtYnRuIC1saW5rLWxpa2VcIlxuICAgICAgICBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiXG4gICAgICAgIGlkPVwiYnRuX3ZpZXdfbW9yZVwiXG4gICAgICAgICpuZ0lmPVwibmFtZWRRdWVyeS5sZW5ndGggPiAyXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2hhbmdlTGlzdFZpZXcoaXNNb3JlTGlzdClcIlxuICAgICAgPlxuICAgICAgICB7eyBpc01vcmVMaXN0ID8gKCdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LnNlZUxlc3MnIHwgaTE4bikgOiAoJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkuc2VlTW9yZScgfCBpMThuKSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI25vTmFtZWRRdWVyeT5cbiAgICAgIDxwIGNsYXNzPVwic2VhcmNoLWhvbWVfX2NvbnRhaW5lci1zZWFyY2hcIj57eyAnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5lbXB0eU5hbWVkUXVlcnknIHwgaTE4biB9fTwvcD5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2luZm9Ub29sdGlwU2hvdz5cbiAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCIgaWQ9XCJpbmZvVG9vbHRpcFNob3dfc2VhcmNoSG9tZVwiPlxuICAgIDxzcGFuIGNsYXNzPVwibS10b29sdGlwX190ZXh0XCI+IEFmZmljaGVyIGxlIHdpZGdldCBhc3NvY2nDqSDDoCBjZXR0ZSByZWNoZXJjaGUgPC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgY2xhc3M9XCJvLXByeS1zZWFyY2gtaG9tZV9fc2VhcmNoXCI+XG4gIDxoMyBjbGFzcz1cImEtaDNcIj57eyAnQHByeS5zZWFyY2guaG9tZS5zc1RpdGxlJyB8IGkxOG4gfX08L2gzPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VhcmNoRnVsbHRleHRUcGxcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlYXJjaEZ1bGx0ZXh0VHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgPHAgY2xhc3M9XCJhLXAgby1wcnktc2VhcmNoLWhvbWVfX3NlYXJjaF9fb3JcIj57eyAnQHByeS5zZWFyY2guaG9tZS5vcicgfCBpMThuIH19PC9wPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IC13aWR0aC1mdWxsXCIgKGNsaWNrKT1cIm9uU2VhcmNoQ3JpdGVyaWEoKVwiPlxuICAgIDxwcnktaWNvbiBbd2lkdGhdPVwiMjBcIiBbaGVpZ2h0XT1cIjIwXCIgaWNvblN2Zz1cInNlYXJjaC1jcml0ZXJpYVwiPjwvcHJ5LWljb24+XG4gICAge3sgJ0Bwcnkuc2VhcmNoLmhvbWUuc2VhcmNoQnlDcml0ZXJpYScgfCBpMThuIH19XG4gICAgPHByeS1pY29uIGljb25Tdmc9XCJhcnJvd19yaWdodFwiPjwvcHJ5LWljb24+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVTcG90PlxuICA8ZGl2IChtb3VzZWxlYXZlKT1cImhpZGVTcG90KClcIj5cbiAgICB7e1xuICAgICAgKChzcG90dGluZ1dpZGdldCQgfCBhc3luYyk/Lmxlbmd0aCA/PyAwID4gMFxuICAgICAgICA/ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LnNwb3RUaXRsZSdcbiAgICAgICAgOiAnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5ub1Nwb3QnXG4gICAgICApIHwgaTE4biA6IHsgbGVuZ3RoOiAoc3BvdHRpbmdXaWRnZXQkIHwgYXN5bmMpPy5sZW5ndGggfVxuICAgIH19XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgdXNlIG9mIHNwb3R0aW5nV2lkZ2V0JCB8IGFzeW5jXCIgY2xhc3M9XCJzcG90LWxpbmVcIj5cbiAgICAgIDxwcnktaWNvbiBbd2lkdGhdPVwiMjBcIiBbaGVpZ2h0XT1cIjIwXCIgW2ljb25TdmddPVwiaWNvbnNbdXNlLnR5cGVdXCI+PC9wcnktaWNvbj5cbiAgICAgIHt7ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LnR5cGUuJyArIHVzZS50eXBlIHwgaTE4biB9fSAtIHt7ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LnVzZScgfCBpMThuIDogdXNlIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZVJlZnJlc2g+XG4gIDxkaXY+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiByZWZyZXNoT3B0aW9uc1wiXG4gICAgICBjbGFzcz1cInJlZnJlc2gtbGluZSBhLWJ0biBhLWJ0bi0taWNvbi10ZXh0IC1zaXplLXNtXCJcbiAgICAgIChjbGljayk9XCJzZWxlY3RSZWZyZXNoKG9wdGlvbilcIlxuICAgID5cbiAgICAgIDxwcnktaWNvblxuICAgICAgICBbd2lkdGhdPVwiMjBcIlxuICAgICAgICBbaGVpZ2h0XT1cIjIwXCJcbiAgICAgICAgaWNvblN2Zz1cImNoZWNrXCJcbiAgICAgICAgKm5nSWY9XCIoKChyZWZyZXNoUmF0ZXMkIHwgYXN5bmMpID8/IHt9KVtyZWZyZXNoSWRdID8/IDApID09PSBvcHRpb25cIlxuICAgICAgPjwvcHJ5LWljb24+XG4gICAgICB7eyAnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5yZWZyZXNoLicgKyBvcHRpb24gfCBpMThuIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWhvbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvc2VhcmNoL3NlYXJjaC1ob21lL3NlYXJjaC1ob21lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3NlYXJjaC9zZWFyY2gtaG9tZS9zZWFyY2gtaG9tZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQThCLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixvQkFBb0IsRUFHcEIsZUFBZSxFQUNmLHlCQUF5QixFQUd6QixhQUFhLEVBRWQsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQWMsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqSCxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDOzs7Ozs7Ozs7QUFPdEYsTUFBTSxPQUFPLHNCQUFzQjtJQThDakMsWUFDVSxLQUFZLEVBQ1osT0FBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFNBQTJCO1FB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QyxRQUFRLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDOzhHQXpOVSxzQkFBc0I7a0dBQXRCLHNCQUFzQiwyVEFDRSxXQUFXLDZHQUNSLFdBQVcsNkJDM0NuRCxpNldBa1BBOzsyRkR6TWEsc0JBQXNCO2tCQUpsQyxTQUFTOytCQUNFLGlCQUFpQjtnTEFJdUIsWUFBWTtzQkFBN0QsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUNLLGVBQWU7c0JBQW5FLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUUxQyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbm5lY3RlZFBvc2l0aW9uLCBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQ29uZmlnQWN0aW9ucyxcbiAgRGFzaGJvYXJkQWN0aW9ucyxcbiAgRGFzaGJvYXJkR3JpZExheW91dCxcbiAgRGFzaGJvYXJkU2VsZWN0b3JzLFxuICBEYXRhU291cmNlQWN0aW9ucyxcbiAgRGF0YVNvdXJjZVNlbGVjdG9ycyxcbiAgRGF0YXNvdXJjZVV0aWxzLFxuICBkZWZhdWx0TWVudVN0cnVjdHVyZSxcbiAgRnVsbFRleHRTZWFyY2hQYXlsb2FkLFxuICBOYW1lZFF1ZXJ5LFxuICBOYW1lZFF1ZXJ5VHlwZXMsXG4gIFByeURpYWxvZ0NvbmZpcm1Db21wb25lbnQsXG4gIFByeURpYWxvZ0NvbmZpcm1EYXRhLFxuICBQcnlEaWFsb2dTZXJ2aWNlLFxuICBTZWFyY2hBY3Rpb25zLFxuICBXaWRnZXRMYXlvdXRcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgY29tYmluZUxhdGVzdFdpdGgsIGZpbHRlciwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFByeVNhdmVRdWVyeUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2F2ZS1xdWVyeS9zYXZlLXF1ZXJ5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hGdWxsdGV4dENoYW5nZSB9IGZyb20gJy4uL3NlYXJjaC1mdWxsdGV4dC9zZWFyY2gtZnVsbHRleHQvc2VhcmNoLWZ1bGx0ZXh0LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS1zZWFyY2gtaG9tZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2gtaG9tZS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUHJ5U2VhcmNoSG9tZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgndGVtcGxhdGVTcG90JywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSB0ZW1wbGF0ZVNwb3QhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZVJlZnJlc2gnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIHRlbXBsYXRlUmVmcmVzaCE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KCkgc2VhcmNoRnVsbHRleHRUcGw/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBpc01vcmVMaXN0ID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGNoYW5nZUxpc3RWaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgY2hhbmdlU2VhcmNoQ3JpdGVyaWEgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgbmFtZWRRdWVyeUxpc3QkPzogT2JzZXJ2YWJsZTxOYW1lZFF1ZXJ5W10+O1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIG5hbWVkUXVlcmllc1VzZXMkITogT2JzZXJ2YWJsZTx7IFtwOiBzdHJpbmddOiB7IHdpbmRvd0luZGV4OiBudW1iZXI7IHR5cGU6IHN0cmluZzsgbGF5b3V0OiBXaWRnZXRMYXlvdXQgfVtdIH0+O1xuICBzcG90dGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICBzcG90dGluZ1dpZGdldCQhOiBPYnNlcnZhYmxlPHsgd2luZG93SW5kZXg6IG51bWJlcjsgdHlwZTogc3RyaW5nOyBsYXlvdXQ6IFdpZGdldExheW91dCB9W10+O1xuICByZWZyZXNoT3B0aW9ucyA9IFswLCAxMCwgMzAsIDYwXTtcblxuICBpY29ucyA9IHtcbiAgICBtYXA6ICdzaGFyZV9sb2NhdGlvbicsXG4gICAgdGFibGU6ICd0YWJsZV9jaGFydCcsXG4gICAgY2hhcnQ6ICdzaG93X2NoYXJ0JyxcbiAgICBncmFwaDogJ2dyYXBoJ1xuICB9IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgbG9hZE9wZW5lZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XG5cbiAgcmVhZG9ubHkgY29ubmVjdGVkUG9zaXRpb246IENvbm5lY3RlZFBvc2l0aW9uID0ge1xuICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgb3ZlcmxheVk6ICd0b3AnXG4gIH07XG4gIHN0cnVjdHVyZSA9IGRlZmF1bHRNZW51U3RydWN0dXJlLm1hcCgoaXRlbXMpID0+ICh7XG4gICAgLi4uaXRlbXMsXG4gICAgc3ViOiBpdGVtcy5zdWIuZmlsdGVyKChzKSA9PiBzLnR5cGUgIT09ICdpZnJhbWUnICYmIHMudHlwZSAhPT0gJ2RldGFpbCcpXG4gIH0pKTtcblxuICByZWZyZXNoUmF0ZXMkITogT2JzZXJ2YWJsZTx7IFtwOiBzdHJpbmddOiBudW1iZXIgfT47XG4gIHJlZnJlc2hJZDogc3RyaW5nID0gJyc7XG4gIGRlbGV0ZUVycm9yJD86IE9ic2VydmFibGU8YW55PjtcbiAgbGF5b3V0JCE6IE9ic2VydmFibGU8RGFzaGJvYXJkR3JpZExheW91dD47XG4gIERhc2hib2FyZEdyaWRMYXlvdXQgPSBEYXNoYm9hcmRHcmlkTGF5b3V0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlLFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBwcnlEaWFsb2c6IFByeURpYWxvZ1NlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubG9hZCgpKTtcbiAgICB0aGlzLm5hbWVkUXVlcnlMaXN0JCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZ2V0TmFtZWRRdWVyeVNvcnRlZCk7XG4gICAgdGhpcy5uYW1lZFF1ZXJpZXNVc2VzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5uYW1lZFF1ZXJpZXNVc2VzKTtcbiAgICB0aGlzLnNwb3R0aW5nV2lkZ2V0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMubmFtZWRRdWVyaWVzVXNlcyQsIHRoaXMuc3BvdHRpbmckXSkucGlwZShcbiAgICAgIG1hcCgoW3VzZXMsIHNwb3R0aW5nXSkgPT4gdXNlc1tzcG90dGluZ10gPz8gW10pLFxuICAgICAgbWFwKCh1c2VzKSA9PiB1c2VzLm1hcCgodXNlKSA9PiAoeyAuLi51c2UsIHdpbmRvd0luZGV4OiB1c2Uud2luZG93SW5kZXggKyAxIH0pKSlcbiAgICApO1xuICAgIHRoaXMucmVmcmVzaFJhdGVzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5yZWZyZXNoUmF0ZXMpO1xuICAgIHRoaXMubGF5b3V0JCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5ncmlkTGF5b3V0KTtcbiAgICB0aGlzLmRlbGV0ZUVycm9yJCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZXJyb3JzKS5waXBlKGRlYm91bmNlVGltZSgxMDApKTtcbiAgfVxuXG4gIG9uU2VhcmNoTmFtZWRRdWVyeShpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZVdpZGdldEluUHJlc2VudGF0aW9uKHsgaWQsIHdpZGdldFR5cGU6ICd0YWJsZScgfSkpO1xuICB9XG5cbiAgb25GYXZvcml0ZShpZDogc3RyaW5nLCBpc0Zhdm9yaXRlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFpc0Zhdm9yaXRlKSB7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhdGFTb3VyY2VBY3Rpb25zLm5hbWVkUXVlcnkuYWRkRmF2b3JpdGUoeyBpZCB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubmFtZWRRdWVyeS5kZWxldGVGYXZvcml0ZSh7IGlkIH0pKTtcbiAgICB9XG4gIH1cblxuICBvblNwb3QoaWQ6IHN0cmluZywgJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5zcG90dGluZyQubmV4dChpZCk7XG5cbiAgICBpZiAoIXRoaXMub3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3Nwb3QtcnMnXVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5hZGRpbmdPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSB9KSk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRlbXBsYXRlU3BvdCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgICBjb25zdCBzcG90RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zcG90LXJzJykgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICBpZiAoISFzcG90RWxlbWVudCkge1xuICAgICAgICBzcG90RWxlbWVudC5zdHlsZS5sZWZ0ID0gJGV2ZW50LmNsaWVudFggLSAxMCArICdweCc7XG4gICAgICAgIHNwb3RFbGVtZW50LnN0eWxlLnRvcCA9ICRldmVudC5jbGllbnRZIC0gMTAgKyAncHgnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhpZGVTcG90KCkge1xuICAgIHRoaXMub3ZlcmxheVJlZj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lIH0pKTtcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBvbkVkaXQobmFtZWRRdWVyeTogTmFtZWRRdWVyeSkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubmFtZWRRdWVyeS5lZGl0KHsgY3VycmVudEVkaXQ6IG5hbWVkUXVlcnkgfSkpO1xuICB9XG5cbiAgb25DaGFuZ2VMaXN0Vmlldyhpc01vcmVMaXN0OiBib29sZWFuKSB7XG4gICAgdGhpcy5jaGFuZ2VMaXN0Vmlldy5lbWl0KGlzTW9yZUxpc3QpO1xuICB9XG5cbiAgb25TZWFyY2hDcml0ZXJpYSgpIHtcbiAgICB0aGlzLmNoYW5nZVNlYXJjaENyaXRlcmlhLmVtaXQoKTtcbiAgfVxuXG4gIGxvYWRXaWRnZXQoaWQ6IHN0cmluZywgc3ViOiB7IGljb246IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlV2lkZ2V0SW5QcmVzZW50YXRpb24oeyBpZCwgd2lkZ2V0VHlwZTogc3ViLnR5cGUgfSkpO1xuICAgIHRoaXMubG9hZE9wZW5lZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG9uRGVsZXRlKG5xOiBOYW1lZFF1ZXJ5KSB7XG4gICAgY29uc3QgZGF0YTogUHJ5RGlhbG9nQ29uZmlybURhdGEgPSB7XG4gICAgICB0aXRsZTogJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkuZGVsZXRlJyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgeyBpZDogMCwgbGFiZWw6ICdAcHJ5LnRvb2xib3gubWFuaWZlc3QuY2xvc2UnLCBjb2xvcjogJ2dob3N0JyB9LFxuICAgICAgICB7IGlkOiAxLCBsYWJlbDogJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkuZGVsZXRlJyB9XG4gICAgICBdXG4gICAgfTtcbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLnByeURpYWxvZy5vcGVuKFByeURpYWxvZ0NvbmZpcm1Db21wb25lbnQsIHtcbiAgICAgIGRhdGFcbiAgICB9KTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBkaWFsb2cuY2xvc2VWYWx1ZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoYWN0aW9uKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogJ1ByeURpYWxvZ0NvbmZpcm1Db21wb25lbnQnIH0pKTtcbiAgICAgICAgaWYgKGFjdGlvbi5pZCA9PT0gMSkge1xuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubmFtZWRRdWVyeS5kZWxldGUoeyBpZDogbnEuaWQgPz8gJycgfSkpO1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlRXJyb3IkXG4gICAgICAgICAgICAgID8ucGlwZShcbiAgICAgICAgICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLnN0b3JlLnNlbGVjdChEYXRhU291cmNlU2VsZWN0b3JzLmlzTG9hZGluZykpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoWywgaXNMb2FkaW5nXSkgPT4gIWlzTG9hZGluZyksXG4gICAgICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKFtlcnJvcl0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhOiBQcnlEaWFsb2dDb25maXJtRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdAcHJ5Lm1hbmlmZXN0LmRlbGV0ZUVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sgaWQ6IDEsIGxhYmVsOiAnQHByeS50b29sYm94LmNsb3NlJyB9XVxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yRGlhbG9nID0gdGhpcy5wcnlEaWFsb2cub3BlbihQcnlEaWFsb2dDb25maXJtQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgICAgICAgICBlcnJvckRpYWxvZy5jbG9zZVZhbHVlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuY2xvc2VPdmVybGF5KHsgaWQ6ICdQcnlEaWFsb2dDb25maXJtQ29tcG9uZW50JyB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvblJlbmFtZShucTogTmFtZWRRdWVyeSkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubmFtZWRRdWVyeS5vcGVuUmVuYW1lKCkpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGF0YVNvdXJjZUFjdGlvbnMubmFtZWRRdWVyeS5lZGl0KHsgY3VycmVudEVkaXQ6IG5xIH0pKTtcbiAgICBjb25zdCBzYXZlID0gZmFsc2U7XG4gICAgY29uc3QgdHlwZSA9IERhdGFzb3VyY2VVdGlscy5nZXRUeXBlRnJvbVBheWxvYWQobnEucmVxdWVzdCk7XG4gICAgY29uc3QgZGF0YSA9XG4gICAgICB0eXBlID09PSBOYW1lZFF1ZXJ5VHlwZXMuRlVMTF9URVhUXG4gICAgICAgID8geyBzYXZlLCB0eXBlLCBwYXlsb2FkOiB0aGlzLmV4dHJhY3RQYXlsb2FkKG5xLnJlcXVlc3QgYXMgRnVsbFRleHRTZWFyY2hQYXlsb2FkKSB9XG4gICAgICAgIDogeyBzYXZlLCB0eXBlIH07XG4gICAgdGhpcy5wcnlEaWFsb2cub3BlbihQcnlTYXZlUXVlcnlDb21wb25lbnQsIHsgZGF0YSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFBheWxvYWQocGF5bG9hZDogRnVsbFRleHRTZWFyY2hQYXlsb2FkKTogU2VhcmNoRnVsbHRleHRDaGFuZ2Uge1xuICAgIGNvbnN0IHsgZnVsbFNlYXJjaCwgb0NsYXNzZXMgfSA9IHBheWxvYWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IGZ1bGxTZWFyY2gudmFsdWUsIGNsYXNzZXM6IG9DbGFzc2VzID8/IFtdIH07XG4gIH1cblxuICBvblJlZnJlc2goaWQ6IHN0cmluZywgJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5yZWZyZXNoSWQgPSBpZDtcblxuICAgIGlmICghdGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxuICAgICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydyZWZyZXNoLXJzJ11cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuYWRkaW5nT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgfSkpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmF0dGFjaChuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy50ZW1wbGF0ZVJlZnJlc2gsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKF8pID0+IHRoaXMuaGlkZVNwb3QoKSk7XG4gICAgICBjb25zdCByZWZyZXNoRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yZWZyZXNoLXJzJykgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICBjb25zdCByZWZyZXNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnJlZnJlc2hidCcpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgaWYgKCEhcmVmcmVzaEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHJlZnJlc2guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJlZnJlc2hFbGVtZW50LnN0eWxlLmxlZnQgPSByZWN0LmxlZnQgKyByZWN0LndpZHRoICsgMTAgKyAncHgnO1xuICAgICAgICByZWZyZXNoRWxlbWVudC5zdHlsZS50b3AgPSByZWN0LnRvcCArIDEzNyArICdweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0UmVmcmVzaCgkZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5zZXRSZWZyZXNoUmF0ZSh7IGlkOiB0aGlzLnJlZnJlc2hJZCA/PyAnJywgcmF0ZTogJGV2ZW50IH0pKTtcbiAgICB0aGlzLmhpZGVTcG90KCk7XG4gIH1cblxuICByZWZyZXNoKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFNlYXJjaEFjdGlvbnMuZ2V0RGF0YXNvdXJjZUl0ZW1zKHsgaWQgfSkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPHByeS1zZWFyY2gtY3NzPjwvcHJ5LXNlYXJjaC1jc3M+XG48ZGl2IGNsYXNzPVwiby1wcnktc2VhcmNoLWhvbWVfX25hbWVkLXF1ZXJ5XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJuYW1lZFF1ZXJ5TGlzdCQgfCBhc3luYyBhcyBuYW1lZFF1ZXJ5XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hbWVkUXVlcnkubGVuZ3RoID4gMDsgZWxzZSBub05hbWVkUXVlcnlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLXByeS1zZWFyY2gtaG9tZV9fbmFtZWQtcXVlcnlfX2NhcmRcIj5cbiAgICAgICAgPHByeS1leHBhbmQtcGFuZWwgW29wZW5dPVwidHJ1ZVwiPlxuICAgICAgICAgIDxwcnktZXhwYW5kLXBhbmVsLXRpdGxlPnt7ICdAcHJ5LnNlYXJjaC5ob21lLnRpdGxlJyB8IGkxOG4gfX08L3ByeS1leHBhbmQtcGFuZWwtdGl0bGU+XG5cbiAgICAgICAgICA8cHJ5LWNhcmQgKm5nRm9yPVwibGV0IG5xIG9mIG5hbWVkUXVlcnkubGVuZ3RoID4gMSAmJiAhaXNNb3JlTGlzdCA/IG5hbWVkUXVlcnkuc2xpY2UoMCwgMikgOiBuYW1lZFF1ZXJ5XCI+XG4gICAgICAgICAgICA8cHJ5LWNhcmQtaGVhZGVyIFttYXJrZXJdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8cHJ5LWNhcmQtaWNvbj5cbiAgICAgICAgICAgICAgICA8cHJ5LW5xLWNvbG9yLXNlbGVjdG9yIFtkYXRhc291cmNlXT1cIm5xXCIgW2Rpc2FibGVkXT1cInRydWVcIj48L3ByeS1ucS1jb2xvci1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBbYWx0XT1cIm5xLmlkIHwgdHJhbnNsYXRlSWQgOiB7IHR5cGU6ICdkYXRhc291cmNlJywgb3V0cHV0OiAnbmFtZScgfSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMjJcIlxuICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjIyXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwibnEuaWQgfCB0cmFuc2xhdGVJZCA6IHsgdHlwZTogJ2RhdGFzb3VyY2UnLCBvdXRwdXQ6ICdpY29uJyB9IHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvcHJ5LWNhcmQtaWNvbj5cblxuICAgICAgICAgICAgICA8cHJ5LWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8tcHJ5LWNhcmQtdGl0bGVfX3RleHRcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiaW5mb1Rvb2x0aXBfc2VhcmNoSG9tZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImEtcCBvLXByeS1jYXJkLXRpdGxlX190ZXh0X190aXRsZVwiPnt7IG5xLm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhLXAgby1wcnktY2FyZC10aXRsZV9fdGV4dF9fZGVzY3JpcHRpb25cIiAqbmdJZj1cIm5xLmRlc2NyaXB0aW9uXCI+e3sgbnEuZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2luZm9Ub29sdGlwPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCIgaWQ9XCJpbmZvVG9vbHRpcF9zZWFyY2hIb21lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS10b29sdGlwX190ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgbnEubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS10b29sdGlwX19kZXNjcmlwdGlvblwiICpuZ0lmPVwibnEuZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBucS5kZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvLXByeS1jYXJkLXRpdGxlX19waW5cIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJucS5mYXZvcml0ZVwiXG4gICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMThcIlxuICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCIxOFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiZmF2b3JpdGVcIlxuICAgICAgICAgICAgICAgICAgaWNvblN2Zz1cImVwaW5nbGVcIlxuICAgICAgICAgICAgICAgID48L3ByeS1pY29uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LnNlYXJjaC5ob21lLnNob3dBc3NvY2lhdGVkV2lkZ2V0JyB8IGkxOG5cIlxuICAgICAgICAgICAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS10b29sdGlwIGEtYnRuIGEtYnRuLS1zZWNvbmRhcnkgLXNpemUtc21cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2VhcmNoTmFtZWRRdWVyeShucS5pZClcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCIobGF5b3V0JCB8IGFzeW5jKSAhPT0gRGFzaGJvYXJkR3JpZExheW91dC5NQU5VQUxcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LmRpc3BsYXknIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LnNlYXJjaC5ob21lLmFzc29jaWF0ZWRXaWRnZXQnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9wcnktY2FyZC10aXRsZT5cblxuICAgICAgICAgICAgICA8cHJ5LWNhcmQtbWVudT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1wcnktY2FyZC1tZW51X19uYXZcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tdGV4dCBvLXByeS1jYXJkLW1lbnVfX25hdl9faXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkZhdm9yaXRlKG5xLmlkLCBucS5mYXZvcml0ZSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImVwaW5nbGVcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICB7eyAobnEuZmF2b3JpdGUgPyAnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5ub0Zhdm9yaXRlJyA6ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LmZhdm9yaXRlJykgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxwcnktY2FyZC1tZW51IChjbGljayk9XCJyZWZyZXNoKG5xLmlkKVwiIGNsYXNzPVwicmVmcmVzaGJ0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tdGV4dCBvLXByeS1jYXJkLW1lbnVfX25hdl9faXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwic3luY2hyb1wiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkucmVmcmVzaERhdGEnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvcHJ5LWNhcmQtbWVudT5cbiAgICAgICAgICAgICAgICAgIDxwcnktY2FyZC1tZW51ICpuZ0lmPVwiKGxheW91dCQgfCBhc3luYykgIT09IERhc2hib2FyZEdyaWRMYXlvdXQuTUFOVUFMXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLXRleHQgby1wcnktY2FyZC1tZW51X19uYXZfX2l0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJsb2FkT3BlbmVkID0gbnEuaWQ7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICAgICAgICAgICAgICAgICAgICN0cmlnZ2VyTG9hZD1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJmaWxlX2Rvd25sb2FkXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5kaXNwbGF5JyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25Tdmc9XCJmbGVjaGVfaGF1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHRyYW5zZm9ybTogJ3JvdGF0ZSg5MGRlZyknLCBtYXJnaW5MZWZ0OiAnYXV0bycgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICAgICAgICAgICAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyTG9hZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImxvYWRPcGVuZWQgPT09IG5xLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cIltjb25uZWN0ZWRQb3NpdGlvbl1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgICAgICAgICAgICAgICAgICAgIChiYWNrZHJvcENsaWNrKT1cImxvYWRPcGVuZWQgPSB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8tZHJhZ2dhYmxlLW1lbnUgLXNlYXJjaC1ob21lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJvLWRyYWdnYWJsZS1tZW51X19saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG1lbnUgb2Ygc3RydWN0dXJlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiby1kcmFnZ2FibGUtbWVudV9fbGlzdF9faXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uIFtpY29uU3ZnXT1cIm1lbnUuaWNvblwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1lbnUubGFiZWwgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiby1kcmFnZ2FibGUtbWVudV9fbGlzdF9fc3VibWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWIgb2YgbWVudS5zdWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJvLWRyYWdnYWJsZS1tZW51X19saXN0X19zdWJtZW51X19pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG5cIiAoY2xpY2spPVwibG9hZFdpZGdldChucS5pZCwgc3ViKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gW2ljb25TdmddPVwic3ViLmljb25cIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzdWIubGFiZWwgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9wcnktY2FyZC1tZW51PlxuXG4gICAgICAgICAgICAgICAgICA8cHJ5LWNhcmQtbWVudSBjbGFzcz1cIm8tcHJ5LWNhcmQtbWVudV9fbmF2X19pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwcnktbnEtY29sb3Itc2VsZWN0b3IgW25nU3R5bGVdPVwieyB3aWR0aDogJzEwMCUnIH1cIiBbZGF0YXNvdXJjZV09XCJucVwiPjwvcHJ5LW5xLWNvbG9yLXNlbGVjdG9yPlxuICAgICAgICAgICAgICAgICAgPC9wcnktY2FyZC1tZW51PlxuXG4gICAgICAgICAgICAgICAgICA8cHJ5LWNhcmQtbWVudSAoY2xpY2spPVwib25TcG90KG5xLmlkLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tdGV4dCBvLXByeS1jYXJkLW1lbnVfX25hdl9faXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwibW9kZV9jbGljXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5zcG90JyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25Tdmc9XCJmbGVjaGVfaGF1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHRyYW5zZm9ybTogJ3JvdGF0ZSg5MGRlZyknLCBtYXJnaW5MZWZ0OiAnYXV0bycgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9wcnktY2FyZC1tZW51PlxuICAgICAgICAgICAgICAgICAgPHByeS1jYXJkLW1lbnUgKGNsaWNrKT1cIm9uUmVmcmVzaChucS5pZCwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLXRleHQgby1wcnktY2FyZC1tZW51X19uYXZfX2l0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImhpc3RvcnktbGluZVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkucmVmcmVzaC50aXRsZScgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uU3ZnPVwiZmxlY2hlX2hhdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB0cmFuc2Zvcm06ICdyb3RhdGUoOTBkZWcpJywgbWFyZ2luTGVmdDogJ2F1dG8nIH1cIlxuICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvcHJ5LWNhcmQtbWVudT5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tdGV4dCBvLXByeS1jYXJkLW1lbnVfX25hdl9faXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZShucSlcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm5xLm93bmVyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJkZWxldGVcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5kZWxldGUnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLXRleHQgby1wcnktY2FyZC1tZW51X19uYXZfX2l0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25SZW5hbWUobnEpXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJucS5vd25lclwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwicmVuYW1lZFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LnJlbmFtZScgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tdGV4dCBvLXByeS1jYXJkLW1lbnVfX25hdl9faXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXQobnEpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24udGFiKT1cImhpZGVTcG90KClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImVkaXRcIj48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5lZGl0JyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3ByeS1jYXJkLW1lbnU+XG4gICAgICAgICAgICA8L3ByeS1jYXJkLWhlYWRlcj5cbiAgICAgICAgICA8L3ByeS1jYXJkPlxuICAgICAgICA8L3ByeS1leHBhbmQtcGFuZWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJhLWJ0biAtbGluay1saWtlXCJcbiAgICAgICAgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIlxuICAgICAgICBpZD1cImJ0bl92aWV3X21vcmVcIlxuICAgICAgICAqbmdJZj1cIm5hbWVkUXVlcnkubGVuZ3RoID4gMlwiXG4gICAgICAgIChjbGljayk9XCJvbkNoYW5nZUxpc3RWaWV3KGlzTW9yZUxpc3QpXCJcbiAgICAgID5cbiAgICAgICAge3sgaXNNb3JlTGlzdCA/ICgnQHByeS5zZWFyY2gubmFtZWRRdWVyeS5zZWVMZXNzJyB8IGkxOG4pIDogKCdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LnNlZU1vcmUnIHwgaTE4bikgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNub05hbWVkUXVlcnk+XG4gICAgICA8cCBjbGFzcz1cInNlYXJjaC1ob21lX19jb250YWluZXItc2VhcmNoXCI+e3sgJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkuZW1wdHlOYW1lZFF1ZXJ5JyB8IGkxOG4gfX08L3A+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cIm8tcHJ5LXNlYXJjaC1ob21lX19zZWFyY2hcIj5cbiAgPGgzIGNsYXNzPVwiYS1oM1wiPnt7ICdAcHJ5LnNlYXJjaC5ob21lLnNzVGl0bGUnIHwgaTE4biB9fTwvaDM+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWFyY2hGdWxsdGV4dFRwbFwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VhcmNoRnVsbHRleHRUcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8cCBjbGFzcz1cImEtcCBvLXByeS1zZWFyY2gtaG9tZV9fc2VhcmNoX19vclwiPnt7ICdAcHJ5LnNlYXJjaC5ob21lLm9yJyB8IGkxOG4gfX08L3A+XG4gIDwvbmctY29udGFpbmVyPlxuICA8YnV0dG9uIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnkgLXdpZHRoLWZ1bGxcIiAoY2xpY2spPVwib25TZWFyY2hDcml0ZXJpYSgpXCI+XG4gICAgPHByeS1pY29uIFt3aWR0aF09XCIyMFwiIFtoZWlnaHRdPVwiMjBcIiBpY29uU3ZnPVwic2VhcmNoLWNyaXRlcmlhXCI+PC9wcnktaWNvbj5cbiAgICB7eyAnQHByeS5zZWFyY2guaG9tZS5zZWFyY2hCeUNyaXRlcmlhJyB8IGkxOG4gfX1cbiAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFycm93X3JpZ2h0XCI+PC9wcnktaWNvbj5cbiAgPC9idXR0b24+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZVNwb3Q+XG4gIDxkaXYgKG1vdXNlbGVhdmUpPVwiaGlkZVNwb3QoKVwiPlxuICAgIHt7XG4gICAgICAoKHNwb3R0aW5nV2lkZ2V0JCB8IGFzeW5jKT8ubGVuZ3RoID8/IDAgPiAwXG4gICAgICAgID8gJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkuc3BvdFRpdGxlJ1xuICAgICAgICA6ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5Lm5vU3BvdCdcbiAgICAgICkgfCBpMThuIDogeyBsZW5ndGg6IChzcG90dGluZ1dpZGdldCQgfCBhc3luYyk/Lmxlbmd0aCB9XG4gICAgfX1cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCB1c2Ugb2Ygc3BvdHRpbmdXaWRnZXQkIHwgYXN5bmNcIiBjbGFzcz1cInNwb3QtbGluZVwiPlxuICAgICAgPHByeS1pY29uIFt3aWR0aF09XCIyMFwiIFtoZWlnaHRdPVwiMjBcIiBbaWNvblN2Z109XCJpY29uc1t1c2UudHlwZV1cIj48L3ByeS1pY29uPlxuICAgICAge3sgJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkudHlwZS4nICsgdXNlLnR5cGUgfCBpMThuIH19IC0ge3sgJ0Bwcnkuc2VhcmNoLm5hbWVkUXVlcnkudXNlJyB8IGkxOG4gOiB1c2UgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlUmVmcmVzaD5cbiAgPGRpdj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHJlZnJlc2hPcHRpb25zXCJcbiAgICAgIGNsYXNzPVwicmVmcmVzaC1saW5lIGEtYnRuIGEtYnRuLS1pY29uLXRleHQgLXNpemUtc21cIlxuICAgICAgKGNsaWNrKT1cInNlbGVjdFJlZnJlc2gob3B0aW9uKVwiXG4gICAgPlxuICAgICAgPHByeS1pY29uXG4gICAgICAgIFt3aWR0aF09XCIyMFwiXG4gICAgICAgIFtoZWlnaHRdPVwiMjBcIlxuICAgICAgICBpY29uU3ZnPVwiY2hlY2tcIlxuICAgICAgICAqbmdJZj1cIigoKHJlZnJlc2hSYXRlcyQgfCBhc3luYykgPz8ge30pW3JlZnJlc2hJZF0gPz8gMCkgPT09IG9wdGlvblwiXG4gICAgICA+PC9wcnktaWNvbj5cbiAgICAgIHt7ICdAcHJ5LnNlYXJjaC5uYW1lZFF1ZXJ5LnJlZnJlc2guJyArIG9wdGlvbiB8IGkxOG4gfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -132,19 +132,22 @@ export class MultiClassConditionComponent {
132
132
  }));
133
133
  }
134
134
  }
135
+ join(classes) {
136
+ return classes.map((clazz) => clazz.name).join(', ');
137
+ }
135
138
  get hasTwoFields() {
136
139
  return this.form.get('operator')?.value === 'INSIDE' || this.form.get('operator')?.value === 'OUTSIDE';
137
140
  }
138
141
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: MultiClassConditionComponent, deps: [{ token: i1.Store }, { token: i2.SearchMultiClassService }, { token: i3.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
139
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: MultiClassConditionComponent, selector: "pry-multi-class-condition", inputs: { id: "id" }, viewQueries: [{ propertyName: "fieldSelectionTpl", first: true, predicate: ["fieldSelectionTpl"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<ng-container *ngIf=\"condition$ | async as condition\">\n <div class=\"o-multi-class-condition\">\n <div class=\"o-multi-class-condition__content\">\n <div class=\"o-multi-class-condition__content__action\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--primary -size-sm -width-full\"\n aria-label=\"selection button\"\n (click)=\"toggleFieldSelection()\"\n >\n <ng-container *ngIf=\"field$ | async as field; else noFieldTpl\">\n {{ field.name }}\n </ng-container>\n <ng-template #noFieldTpl>{{ '@pry.search.multi.selectField' | i18n }}</ng-template>\n </button>\n\n <ng-container *ngIf=\"classesLinked$ | async as classesLinked\">\n <pry-icon\n iconSvg=\"links_line\"\n [width]=\"15\"\n [height]=\"15\"\n style=\"color: black\"\n [pryTooltip]=\"classesTooltip\"\n pryTooltipPosition=\"after\"\n ></pry-icon>\n <ng-template #classesTooltip>\n <span>\n {{ '@pry.search.multi.in' | i18n }}\n <span *ngFor=\"let clazz of classesLinked; let last = last\">\n {{ clazz.name }}\n <ng-container *ngIf=\"!last\">, </ng-container>\n </span>\n </span>\n </ng-template>\n </ng-container>\n </div>\n\n <ng-container [formGroup]=\"form\">\n <div class=\"m-form-label-field\">\n <pry-select\n [items]=\"operators$ | async\"\n placeholder=\"Op\u00E9rateur\"\n formControlName=\"operator\"\n [itemsAsOption]=\"true\"\n [labelTranslate]=\"true\"\n bindValue=\"operator\"\n bindLabel=\"translation\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <ng-container *ngIf=\"condition.isDate; else classicInput\">\n <pry-date-picker\n formControlName=\"value\"\n (click)=\"onUpdateValue(condition)\"\n [rangePicker]=\"hasTwoFields\"\n [roundSelection]=\"true\"\n [timePicker]=\"true\"\n ></pry-date-picker>\n </ng-container>\n <ng-template #classicInput>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"\n (hasTwoFields ? '@pry.search.placeholder.minValue' : '@pry.search.placeholder.search') | i18n\n \"\n formControlName=\"value\"\n (focusout)=\"onUpdateValue(condition)\"\n />\n <ng-container *ngIf=\"hasTwoFields\">\n <input\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"'@pry.search.placeholder.maxValue' | i18n\"\n formControlName=\"upperValue\"\n (focusout)=\"onUpdateValue(condition)\"\n />\n </ng-container>\n </ng-template>\n\n <label class=\"a-label a-label--help -error\" *ngIf=\"formValue?.errors?.['required'] && formValue?.touched\">\n {{ '@pry.search.multi.requiredError' | i18n }}\n </label>\n </div>\n </ng-container>\n </div>\n\n <div class=\"o-multi-class-condition__delete-content\">\n <ng-container *ngIf=\"notLastCondition$ | async; else cannotDelete\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\">\n <pry-icon\n iconSvg=\"delete\"\n [height]=\"20\"\n [width]=\"20\"\n [animation]=\"false\"\n (click)=\"onRemoveCondition(condition)\"\n ></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }}</span>\n </button>\n </ng-container>\n </div>\n <ng-template #cannotDelete>\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" disabled>\n <pry-icon [height]=\"20\" [width]=\"20\" iconSvg=\"delete\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }}</span>\n </button>\n </ng-template>\n </div>\n\n <ng-template #fieldSelectionTpl>\n <pry-multi-class-field-selection\n [conditionId]=\"condition.id\"\n (closeModal)=\"onCloseModal()\"\n (selectFieldChange)=\"onChangeField(condition, $event)\"\n ></pry-multi-class-field-selection>\n </ng-template>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.PrySelectComponent, selector: "pry-select", inputs: ["labelTranslate", "baseTranslate", "translationFn", "translationFnArgs", "clearable", "multiple", "multipleClearRight", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "items", "itemsAsOption", "bindData", "bindValue", "bindLabel", "bindIcon", "iconSize", "templateLabel", "templateOption", "autocomplete"] }, { kind: "directive", type: i5.PryTooltipDirective, selector: "[pryTooltip]", inputs: ["pryTooltip", "styleReversed", "pryTooltipContext", "pryTooltipPosition", "pryTooltipShowDelay"] }, { kind: "component", type: i5.PryDatePickerComponent, selector: "pry-date-picker", inputs: ["rangePicker", "timePicker", "maxYear", "minYear", "roundSelection"] }, { kind: "component", type: i7.MultiClassFieldSelectionComponent, selector: "pry-multi-class-field-selection", inputs: ["conditionId"], outputs: ["closeModal", "selectFieldChange"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.I18nPipe, name: "i18n" }] }); }
142
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: MultiClassConditionComponent, selector: "pry-multi-class-condition", inputs: { id: "id" }, viewQueries: [{ propertyName: "fieldSelectionTpl", first: true, predicate: ["fieldSelectionTpl"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<ng-container *ngIf=\"condition$ | async as condition\">\n <div class=\"o-multi-class-condition\">\n <div class=\"o-multi-class-condition__content\">\n <div class=\"o-multi-class-condition__content__action\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--primary -size-sm -width-full\"\n aria-label=\"selection button\"\n (click)=\"toggleFieldSelection()\"\n >\n <ng-container *ngIf=\"field$ | async as field; else noFieldTpl\">\n {{ field.name }}\n </ng-container>\n <ng-template #noFieldTpl>{{ '@pry.search.multi.selectField' | i18n }}</ng-template>\n </button>\n\n <ng-container *ngIf=\"classesLinked$ | async as classesLinked\">\n <pry-icon\n iconSvg=\"links_line\"\n [width]=\"15\"\n [height]=\"15\"\n style=\"color: black\"\n [attr.data-tooltip]=\"('@pry.search.multi.in' | i18n) + ' ' + join(classesLinked)\"\n ></pry-icon>\n </ng-container>\n </div>\n\n <ng-container [formGroup]=\"form\">\n <div class=\"m-form-label-field\">\n <pry-select\n [items]=\"operators$ | async\"\n placeholder=\"Op\u00E9rateur\"\n formControlName=\"operator\"\n [itemsAsOption]=\"true\"\n [labelTranslate]=\"true\"\n bindValue=\"operator\"\n bindLabel=\"translation\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <ng-container *ngIf=\"condition.isDate; else classicInput\">\n <pry-date-picker\n formControlName=\"value\"\n (click)=\"onUpdateValue(condition)\"\n [rangePicker]=\"hasTwoFields\"\n [roundSelection]=\"true\"\n [timePicker]=\"true\"\n ></pry-date-picker>\n </ng-container>\n <ng-template #classicInput>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"\n (hasTwoFields ? '@pry.search.placeholder.minValue' : '@pry.search.placeholder.search') | i18n\n \"\n formControlName=\"value\"\n (focusout)=\"onUpdateValue(condition)\"\n />\n <ng-container *ngIf=\"hasTwoFields\">\n <input\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"'@pry.search.placeholder.maxValue' | i18n\"\n formControlName=\"upperValue\"\n (focusout)=\"onUpdateValue(condition)\"\n />\n </ng-container>\n </ng-template>\n\n <label class=\"a-label a-label--help -error\" *ngIf=\"formValue?.errors?.['required'] && formValue?.touched\">\n {{ '@pry.search.multi.requiredError' | i18n }}\n </label>\n </div>\n </ng-container>\n </div>\n\n <div class=\"o-multi-class-condition__delete-content\">\n <ng-container *ngIf=\"notLastCondition$ | async; else cannotDelete\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\">\n <pry-icon\n iconSvg=\"delete\"\n [height]=\"20\"\n [width]=\"20\"\n [animation]=\"false\"\n (click)=\"onRemoveCondition(condition)\"\n ></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }}</span>\n </button>\n </ng-container>\n </div>\n <ng-template #cannotDelete>\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" disabled>\n <pry-icon [height]=\"20\" [width]=\"20\" iconSvg=\"delete\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }}</span>\n </button>\n </ng-template>\n </div>\n\n <ng-template #fieldSelectionTpl>\n <pry-multi-class-field-selection\n [conditionId]=\"condition.id\"\n (closeModal)=\"onCloseModal()\"\n (selectFieldChange)=\"onChangeField(condition, $event)\"\n ></pry-multi-class-field-selection>\n </ng-template>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.PrySelectComponent, selector: "pry-select", inputs: ["labelTranslate", "baseTranslate", "translationFn", "translationFnArgs", "clearable", "multiple", "multipleClearRight", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "items", "itemsAsOption", "bindData", "bindValue", "bindLabel", "bindIcon", "iconSize", "templateLabel", "templateOption", "autocomplete"] }, { kind: "component", type: i5.PryDatePickerComponent, selector: "pry-date-picker", inputs: ["rangePicker", "timePicker", "maxYear", "minYear", "roundSelection"] }, { kind: "component", type: i7.MultiClassFieldSelectionComponent, selector: "pry-multi-class-field-selection", inputs: ["conditionId"], outputs: ["closeModal", "selectFieldChange"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.I18nPipe, name: "i18n" }] }); }
140
143
  }
141
144
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: MultiClassConditionComponent, decorators: [{
142
145
  type: Component,
143
- args: [{ selector: 'pry-multi-class-condition', template: "<ng-container *ngIf=\"condition$ | async as condition\">\n <div class=\"o-multi-class-condition\">\n <div class=\"o-multi-class-condition__content\">\n <div class=\"o-multi-class-condition__content__action\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--primary -size-sm -width-full\"\n aria-label=\"selection button\"\n (click)=\"toggleFieldSelection()\"\n >\n <ng-container *ngIf=\"field$ | async as field; else noFieldTpl\">\n {{ field.name }}\n </ng-container>\n <ng-template #noFieldTpl>{{ '@pry.search.multi.selectField' | i18n }}</ng-template>\n </button>\n\n <ng-container *ngIf=\"classesLinked$ | async as classesLinked\">\n <pry-icon\n iconSvg=\"links_line\"\n [width]=\"15\"\n [height]=\"15\"\n style=\"color: black\"\n [pryTooltip]=\"classesTooltip\"\n pryTooltipPosition=\"after\"\n ></pry-icon>\n <ng-template #classesTooltip>\n <span>\n {{ '@pry.search.multi.in' | i18n }}\n <span *ngFor=\"let clazz of classesLinked; let last = last\">\n {{ clazz.name }}\n <ng-container *ngIf=\"!last\">, </ng-container>\n </span>\n </span>\n </ng-template>\n </ng-container>\n </div>\n\n <ng-container [formGroup]=\"form\">\n <div class=\"m-form-label-field\">\n <pry-select\n [items]=\"operators$ | async\"\n placeholder=\"Op\u00E9rateur\"\n formControlName=\"operator\"\n [itemsAsOption]=\"true\"\n [labelTranslate]=\"true\"\n bindValue=\"operator\"\n bindLabel=\"translation\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <ng-container *ngIf=\"condition.isDate; else classicInput\">\n <pry-date-picker\n formControlName=\"value\"\n (click)=\"onUpdateValue(condition)\"\n [rangePicker]=\"hasTwoFields\"\n [roundSelection]=\"true\"\n [timePicker]=\"true\"\n ></pry-date-picker>\n </ng-container>\n <ng-template #classicInput>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"\n (hasTwoFields ? '@pry.search.placeholder.minValue' : '@pry.search.placeholder.search') | i18n\n \"\n formControlName=\"value\"\n (focusout)=\"onUpdateValue(condition)\"\n />\n <ng-container *ngIf=\"hasTwoFields\">\n <input\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"'@pry.search.placeholder.maxValue' | i18n\"\n formControlName=\"upperValue\"\n (focusout)=\"onUpdateValue(condition)\"\n />\n </ng-container>\n </ng-template>\n\n <label class=\"a-label a-label--help -error\" *ngIf=\"formValue?.errors?.['required'] && formValue?.touched\">\n {{ '@pry.search.multi.requiredError' | i18n }}\n </label>\n </div>\n </ng-container>\n </div>\n\n <div class=\"o-multi-class-condition__delete-content\">\n <ng-container *ngIf=\"notLastCondition$ | async; else cannotDelete\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\">\n <pry-icon\n iconSvg=\"delete\"\n [height]=\"20\"\n [width]=\"20\"\n [animation]=\"false\"\n (click)=\"onRemoveCondition(condition)\"\n ></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }}</span>\n </button>\n </ng-container>\n </div>\n <ng-template #cannotDelete>\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" disabled>\n <pry-icon [height]=\"20\" [width]=\"20\" iconSvg=\"delete\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }}</span>\n </button>\n </ng-template>\n </div>\n\n <ng-template #fieldSelectionTpl>\n <pry-multi-class-field-selection\n [conditionId]=\"condition.id\"\n (closeModal)=\"onCloseModal()\"\n (selectFieldChange)=\"onChangeField(condition, $event)\"\n ></pry-multi-class-field-selection>\n </ng-template>\n</ng-container>\n" }]
146
+ args: [{ selector: 'pry-multi-class-condition', template: "<ng-container *ngIf=\"condition$ | async as condition\">\n <div class=\"o-multi-class-condition\">\n <div class=\"o-multi-class-condition__content\">\n <div class=\"o-multi-class-condition__content__action\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--primary -size-sm -width-full\"\n aria-label=\"selection button\"\n (click)=\"toggleFieldSelection()\"\n >\n <ng-container *ngIf=\"field$ | async as field; else noFieldTpl\">\n {{ field.name }}\n </ng-container>\n <ng-template #noFieldTpl>{{ '@pry.search.multi.selectField' | i18n }}</ng-template>\n </button>\n\n <ng-container *ngIf=\"classesLinked$ | async as classesLinked\">\n <pry-icon\n iconSvg=\"links_line\"\n [width]=\"15\"\n [height]=\"15\"\n style=\"color: black\"\n [attr.data-tooltip]=\"('@pry.search.multi.in' | i18n) + ' ' + join(classesLinked)\"\n ></pry-icon>\n </ng-container>\n </div>\n\n <ng-container [formGroup]=\"form\">\n <div class=\"m-form-label-field\">\n <pry-select\n [items]=\"operators$ | async\"\n placeholder=\"Op\u00E9rateur\"\n formControlName=\"operator\"\n [itemsAsOption]=\"true\"\n [labelTranslate]=\"true\"\n bindValue=\"operator\"\n bindLabel=\"translation\"\n class=\"a-pry-select\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <ng-container *ngIf=\"condition.isDate; else classicInput\">\n <pry-date-picker\n formControlName=\"value\"\n (click)=\"onUpdateValue(condition)\"\n [rangePicker]=\"hasTwoFields\"\n [roundSelection]=\"true\"\n [timePicker]=\"true\"\n ></pry-date-picker>\n </ng-container>\n <ng-template #classicInput>\n <input\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"\n (hasTwoFields ? '@pry.search.placeholder.minValue' : '@pry.search.placeholder.search') | i18n\n \"\n formControlName=\"value\"\n (focusout)=\"onUpdateValue(condition)\"\n />\n <ng-container *ngIf=\"hasTwoFields\">\n <input\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"'@pry.search.placeholder.maxValue' | i18n\"\n formControlName=\"upperValue\"\n (focusout)=\"onUpdateValue(condition)\"\n />\n </ng-container>\n </ng-template>\n\n <label class=\"a-label a-label--help -error\" *ngIf=\"formValue?.errors?.['required'] && formValue?.touched\">\n {{ '@pry.search.multi.requiredError' | i18n }}\n </label>\n </div>\n </ng-container>\n </div>\n\n <div class=\"o-multi-class-condition__delete-content\">\n <ng-container *ngIf=\"notLastCondition$ | async; else cannotDelete\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\">\n <pry-icon\n iconSvg=\"delete\"\n [height]=\"20\"\n [width]=\"20\"\n [animation]=\"false\"\n (click)=\"onRemoveCondition(condition)\"\n ></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }}</span>\n </button>\n </ng-container>\n </div>\n <ng-template #cannotDelete>\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" disabled>\n <pry-icon [height]=\"20\" [width]=\"20\" iconSvg=\"delete\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }}</span>\n </button>\n </ng-template>\n </div>\n\n <ng-template #fieldSelectionTpl>\n <pry-multi-class-field-selection\n [conditionId]=\"condition.id\"\n (closeModal)=\"onCloseModal()\"\n (selectFieldChange)=\"onChangeField(condition, $event)\"\n ></pry-multi-class-field-selection>\n </ng-template>\n</ng-container>\n" }]
144
147
  }], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.SearchMultiClassService }, { type: i3.Overlay }, { type: i0.ViewContainerRef }]; }, propDecorators: { fieldSelectionTpl: [{
145
148
  type: ViewChild,
146
149
  args: ['fieldSelectionTpl', { read: TemplateRef }]
147
150
  }], id: [{
148
151
  type: Input
149
152
  }] } });
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY2xhc3MtY29uZGl0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3NlYXJjaC9zZWFyY2gtbXVsdGktY2xhc3MvY29tcG9uZW50cy9tdWx0aS1jbGFzcy1jb25kaXRpb24vbXVsdGktY2xhc3MtY29uZGl0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3NlYXJjaC9zZWFyY2gtbXVsdGktY2xhc3MvY29tcG9uZW50cy9tdWx0aS1jbGFzcy1jb25kaXRpb24vbXVsdGktY2xhc3MtY29uZGl0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVyxhQUFhLEVBQWMsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsV0FBVyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFtQixrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRyxPQUFPLEVBRUwsY0FBYyxFQUNkLGFBQWEsRUFFYixjQUFjLEVBQ2QsU0FBUyxFQUVULGdCQUFnQixFQUVqQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7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VUFBVSxDQUFDLEVBQUUsS0FBSyxLQUFLLFNBQVMsQ0FBQztJQUN6RyxDQUFDOzhHQTlKVSw0QkFBNEI7a0dBQTVCLDRCQUE0QiwwTEFDQyxXQUFXLDZCQzFCckQsNDdJQXNIQTs7MkZEN0ZhLDRCQUE0QjtrQkFKeEMsU0FBUzsrQkFDRSwyQkFBMkI7dUxBSWtCLGlCQUFpQjtzQkFBdkUsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBU3hDLEVBQUU7c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQ2xhc3MsXG4gIENsYXNzU2VsZWN0b3JzLFxuICBDb25maWdBY3Rpb25zLFxuICBGaWVsZCxcbiAgRmllbGRTZWxlY3RvcnMsXG4gIEZpZWxkVHlwZSxcbiAgTXVsdGlDbGFzc0NvbmRpdGlvbixcbiAgT1BFUkFUT1JfT1BUSU9OUyxcbiAgT3BlcmF0b3JPcHRpb25cbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc3dpdGNoTWFwLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTZWFyY2hNdWx0aUNsYXNzQWN0aW9ucyB9IGZyb20gJy4uLy4uL3N0b3JlL3NlYXJjaC1tdWx0aS1jbGFzcy5hY3Rpb25zJztcbmltcG9ydCB7IFNlYXJjaE11bHRpQ2xhc3NTZWxlY3RvcnMgfSBmcm9tICcuLi8uLi9zdG9yZS9zZWFyY2gtbXVsdGktY2xhc3Muc2VsZWN0b3JzJztcbmltcG9ydCB7IFNlYXJjaE11bHRpQ2xhc3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2VhcmNoLW11bHRpLWNsYXNzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktbXVsdGktY2xhc3MtY29uZGl0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWNsYXNzLWNvbmRpdGlvbi5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlDbGFzc0NvbmRpdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2ZpZWxkU2VsZWN0aW9uVHBsJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBmaWVsZFNlbGVjdGlvblRwbCE6IFRlbXBsYXRlUmVmPGFueT47XG4gIGNvbmRpdGlvbiQ6IE9ic2VydmFibGU8TXVsdGlDbGFzc0NvbmRpdGlvbiB8IHVuZGVmaW5lZD4gPSBvZih1bmRlZmluZWQpO1xuICBjbGFzc2VzTGlua2VkJDogT2JzZXJ2YWJsZTxDbGFzc1tdPiA9IG9mKFtdKTtcbiAgZmllbGQkOiBPYnNlcnZhYmxlPEZpZWxkIHwgdW5kZWZpbmVkPiA9IG9mKHVuZGVmaW5lZCk7XG4gIGNsYXNzZXMkOiBPYnNlcnZhYmxlPENsYXNzW10+O1xuICBjb25kaXRpb25zJDogT2JzZXJ2YWJsZTxNdWx0aUNsYXNzQ29uZGl0aW9uW10+O1xuICBub3RMYXN0Q29uZGl0aW9uJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgb3BlcmF0b3JzJDogT2JzZXJ2YWJsZTxPcGVyYXRvck9wdGlvbltdPiA9IG9mKFtdKTtcblxuICBASW5wdXQoKSBzZXQgaWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbDtcbiAgICB0aGlzLmNvbmRpdGlvbiQgPSB0aGlzLnN0b3JlLnNlbGVjdChTZWFyY2hNdWx0aUNsYXNzU2VsZWN0b3JzLmdldENvbmRpdGlvbkJ5SWQodGhpcy5faWQpKTtcbiAgICB0aGlzLmNvbmRpdGlvbiRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGMpOiBjIGlzIE11bHRpQ2xhc3NDb25kaXRpb24gPT4gYz8uZmllbGQgIT09IHVuZGVmaW5lZCksXG4gICAgICAgIHRha2UoMSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGMpID0+IHtcbiAgICAgICAgaWYgKGMuaXNEYXRlICYmIHR5cGVvZiB0aGlzLmZvcm0uZ2V0KCd2YWx1ZScpPy52YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IG9wZXJhdG9yOiBjLm9wZXJhdG9yLCB2YWx1ZTogeyBzdGFydDogYy52YWx1ZSwgZW5kOiBjLnVwcGVyVmFsdWUgfSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgIHsgb3BlcmF0b3I6IGMub3BlcmF0b3IsIHZhbHVlOiBjLnZhbHVlLCB1cHBlclZhbHVlOiBjLnVwcGVyVmFsdWUgfSxcbiAgICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybVZhbHVlPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICAgIHRoaXMuZm9ybVZhbHVlPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIGlmIChjLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5mb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm0uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH0pO1xuICAgIHRoaXMuZmllbGQkID0gdGhpcy5jb25kaXRpb24kLnBpcGUoXG4gICAgICBmaWx0ZXIoKGMpOiBjIGlzIE11bHRpQ2xhc3NDb25kaXRpb24gPT4gYyAhPT0gdW5kZWZpbmVkKSxcbiAgICAgIHN3aXRjaE1hcCgoYykgPT4gdGhpcy5zdG9yZS5zZWxlY3QoRmllbGRTZWxlY3RvcnMuZmllbGRCeUlkKGMuZmllbGQpKSlcbiAgICApO1xuICAgIHRoaXMuY2xhc3Nlc0xpbmtlZCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmNvbmRpdGlvbnMkLCB0aGlzLmNvbmRpdGlvbiQsIHRoaXMuY2xhc3NlcyRdKS5waXBlKFxuICAgICAgbWFwKChbY29uZGl0aW9ucywgY29uZGl0aW9uLCBjbGFzc2VzXSkgPT4gdGhpcy5zZXJ2aWNlLmdldENsYXNzZXNGb3JGaWVsZChjb25kaXRpb25zLCBjb25kaXRpb24sIGNsYXNzZXMpKSxcbiAgICAgIGZpbHRlcigoY2xhenopID0+IChjbGF6ej8ubGVuZ3RoID8/IDApID4gMClcbiAgICApO1xuICAgIHRoaXMub3BlcmF0b3JzJCA9IHRoaXMuY29uZGl0aW9uJC5waXBlKFxuICAgICAgZmlsdGVyKChjKTogYyBpcyBNdWx0aUNsYXNzQ29uZGl0aW9uID0+IGMgIT09IHVuZGVmaW5lZCksXG4gICAgICBzd2l0Y2hNYXAoKGMpID0+IHRoaXMuc3RvcmUuc2VsZWN0KEZpZWxkU2VsZWN0b3JzLmZpZWxkQnlJZChjLmZpZWxkKSkpLFxuICAgICAgZmlsdGVyKChmKTogZiBpcyBGaWVsZCA9PiBmICE9PSB1bmRlZmluZWQpLFxuICAgICAgbWFwKChmKSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBmLnR5cGU7XG4gICAgICAgIGlmIChbRmllbGRUeXBlLlNUUklORywgRmllbGRUeXBlLktFWVdPUkRdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIE9QRVJBVE9SX09QVElPTlMuZmlsdGVyKChvcHQpID0+IG9wdC50eXBlID09PSAnc3RyaW5nJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoW0ZpZWxkVHlwZS5ERUNJTUFMLCBGaWVsZFR5cGUuSU5URUdFUiwgRmllbGRUeXBlLkxPTkddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIE9QRVJBVE9SX09QVElPTlMuZmlsdGVyKChvcHQpID0+IG9wdC50eXBlID09PSAnbnVtYmVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIE9QRVJBVE9SX09QVElPTlMuZmlsdGVyKChvcHQpID0+IG9wdC50eXBlID09PSAnZGF0ZScpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9pZD86IHN0cmluZztcbiAgb3BlbmVkID0gZmFsc2U7XG4gIHByaXZhdGUgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XG5cbiAgZm9ybSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcbiAgICBvcGVyYXRvcjogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBudWxsLCBkaXNhYmxlZDogdHJ1ZSB9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgIHZhbHVlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IG51bGwsIGRpc2FibGVkOiB0cnVlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgdXBwZXJWYWx1ZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBudWxsLCBkaXNhYmxlZDogdHJ1ZSB9LCBbXSlcbiAgfSk7XG5cbiAgZ2V0IGZvcm1WYWx1ZSgpOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgndmFsdWUnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTZWFyY2hNdWx0aUNsYXNzU2VydmljZSxcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmXG4gICkge1xuICAgIHRoaXMuY2xhc3NlcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChDbGFzc1NlbGVjdG9ycy5jbGFzc2VzKTtcbiAgICB0aGlzLmNvbmRpdGlvbnMkID0gdGhpcy5zdG9yZS5zZWxlY3QoU2VhcmNoTXVsdGlDbGFzc1NlbGVjdG9ycy5jb25kaXRpb25zKTtcbiAgICB0aGlzLm5vdExhc3RDb25kaXRpb24kID0gdGhpcy5jb25kaXRpb25zJC5waXBlKG1hcCgoY29uZGl0aW9ucykgPT4gKGNvbmRpdGlvbnM/Lmxlbmd0aCA/PyAwKSAhPT0gMSkpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5nZXQoJ29wZXJhdG9yJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodGhpcy5faWQpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChTZWFyY2hNdWx0aUNsYXNzQWN0aW9ucy51cGRhdGVDb25kaXRpb24oeyBjb25kaXRpb25JZDogdGhpcy5faWQsIGtleTogJ29wZXJhdG9yJywgdmFsdWUgfSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25SZW1vdmVDb25kaXRpb24oY29uZGl0aW9uOiBNdWx0aUNsYXNzQ29uZGl0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChTZWFyY2hNdWx0aUNsYXNzQWN0aW9ucy5yZW1vdmVDb25kaXRpb24oeyBjb25kaXRpb25JZDogY29uZGl0aW9uLmlkIH0pKTtcbiAgfVxuXG4gIHRvZ2dsZUZpZWxkU2VsZWN0aW9uKCkge1xuICAgIHRoaXMub3BlbmVkID0gIXRoaXMub3BlbmVkO1xuICAgIGlmICh0aGlzLm9wZW5lZCkge1xuICAgICAgdGhpcy5vcGVuV2l0aFRlbXBsYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lIH0pKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZj8uZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5XaXRoVGVtcGxhdGUoKSB7XG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCcsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLmNlbnRlckhvcml6b250YWxseSgpLmNlbnRlclZlcnRpY2FsbHkoKSxcbiAgICAgICAgbWluSGVpZ2h0OiAnMzAwcHgnLFxuICAgICAgICBtYXhIZWlnaHQ6ICc2MDBweCcsXG4gICAgICAgIHdpZHRoOiAnNTAwcHgnXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmFkZGluZ092ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lIH0pKTtcbiAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoXykgPT4gdGhpcy50b2dnbGVGaWVsZFNlbGVjdGlvbigpKTtcbiAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLmZpZWxkU2VsZWN0aW9uVHBsLCB0aGlzLnZpZXdDb250YWluZXJSZWYpKTtcbiAgfVxuXG4gIG9uQ2hhbmdlRmllbGQoY29uZGl0aW9uOiBNdWx0aUNsYXNzQ29uZGl0aW9uLCBmaWVsZDogc3RyaW5nKSB7XG4gICAgaWYgKGNvbmRpdGlvbi5maWVsZCAhPT0gZmllbGQpIHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goU2VhcmNoTXVsdGlDbGFzc0FjdGlvbnMudXBkYXRlQ29uZGl0aW9uRmllbGQoeyBjb25kaXRpb25JZDogY29uZGl0aW9uLmlkLCBmaWVsZCB9KSk7XG4gICAgfVxuICAgIHRoaXMudG9nZ2xlRmllbGRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIG9uQ2xvc2VNb2RhbCgpIHtcbiAgICB0aGlzLnRvZ2dsZUZpZWxkU2VsZWN0aW9uKCk7XG4gIH1cblxuICBvblVwZGF0ZVZhbHVlKGNvbmRpdGlvbjogTXVsdGlDbGFzc0NvbmRpdGlvbikge1xuICAgIGxldCBmb3JtVmFsdWUsIGZvcm1TZWNvbmRWYWx1ZTtcbiAgICBpZiAoY29uZGl0aW9uLmlzRGF0ZSAmJiB0eXBlb2YgdGhpcy5mb3JtLmdldCgndmFsdWUnKT8udmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBmb3JtVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KCd2YWx1ZScpPy52YWx1ZS5zdGFydDtcbiAgICAgIGZvcm1TZWNvbmRWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoJ3ZhbHVlJyk/LnZhbHVlLmVuZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybVZhbHVlID0gdGhpcy5mb3JtLmdldCgndmFsdWUnKT8udmFsdWU7XG4gICAgICBmb3JtU2Vjb25kVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KCd1cHBlclZhbHVlJyk/LnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChmb3JtVmFsdWUgIT09IGNvbmRpdGlvbi52YWx1ZSB8fCBmb3JtU2Vjb25kVmFsdWUgIT09IGNvbmRpdGlvbi51cHBlclZhbHVlKSB7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICBTZWFyY2hNdWx0aUNsYXNzQWN0aW9ucy51cGRhdGVDb25kaXRpb24oe1xuICAgICAgICAgIGNvbmRpdGlvbklkOiBjb25kaXRpb24uaWQsXG4gICAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICAgIHZhbHVlOiBmb3JtVmFsdWUsXG4gICAgICAgICAgdXBwZXJWYWx1ZTogZm9ybVNlY29uZFZhbHVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGdldCBoYXNUd29GaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ29wZXJhdG9yJyk/LnZhbHVlID09PSAnSU5TSURFJyB8fCB0aGlzLmZvcm0uZ2V0KCdvcGVyYXRvcicpPy52YWx1ZSA9PT0gJ09VVFNJREUnO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZGl0aW9uJCB8IGFzeW5jIGFzIGNvbmRpdGlvblwiPlxuICA8ZGl2IGNsYXNzPVwiby1tdWx0aS1jbGFzcy1jb25kaXRpb25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiby1tdWx0aS1jbGFzcy1jb25kaXRpb25fX2NvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW11bHRpLWNsYXNzLWNvbmRpdGlvbl9fY29udGVudF9fYWN0aW9uXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IC1zaXplLXNtIC13aWR0aC1mdWxsXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwic2VsZWN0aW9uIGJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZpZWxkU2VsZWN0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkJCB8IGFzeW5jIGFzIGZpZWxkOyBlbHNlIG5vRmllbGRUcGxcIj5cbiAgICAgICAgICAgIHt7IGZpZWxkLm5hbWUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI25vRmllbGRUcGw+e3sgJ0Bwcnkuc2VhcmNoLm11bHRpLnNlbGVjdEZpZWxkJyB8IGkxOG4gfX08L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2xhc3Nlc0xpbmtlZCQgfCBhc3luYyBhcyBjbGFzc2VzTGlua2VkXCI+XG4gICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICBpY29uU3ZnPVwibGlua3NfbGluZVwiXG4gICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICBzdHlsZT1cImNvbG9yOiBibGFja1wiXG4gICAgICAgICAgICBbcHJ5VG9vbHRpcF09XCJjbGFzc2VzVG9vbHRpcFwiXG4gICAgICAgICAgICBwcnlUb29sdGlwUG9zaXRpb249XCJhZnRlclwiXG4gICAgICAgICAgPjwvcHJ5LWljb24+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjbGFzc2VzVG9vbHRpcD5cbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICB7eyAnQHByeS5zZWFyY2gubXVsdGkuaW4nIHwgaTE4biB9fVxuICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgY2xhenogb2YgY2xhc3Nlc0xpbmtlZDsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgICAgICAge3sgY2xhenoubmFtZSB9fVxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgIFtpdGVtc109XCJvcGVyYXRvcnMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJPcMOpcmF0ZXVyXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm9wZXJhdG9yXCJcbiAgICAgICAgICAgIFtpdGVtc0FzT3B0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgW2xhYmVsVHJhbnNsYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgYmluZFZhbHVlPVwib3BlcmF0b3JcIlxuICAgICAgICAgICAgYmluZExhYmVsPVwidHJhbnNsYXRpb25cIlxuICAgICAgICAgICAgY2xhc3M9XCJhLXByeS1zZWxlY3RcIlxuICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmRpdGlvbi5pc0RhdGU7IGVsc2UgY2xhc3NpY0lucHV0XCI+XG4gICAgICAgICAgICA8cHJ5LWRhdGUtcGlja2VyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVXBkYXRlVmFsdWUoY29uZGl0aW9uKVwiXG4gICAgICAgICAgICAgIFtyYW5nZVBpY2tlcl09XCJoYXNUd29GaWVsZHNcIlxuICAgICAgICAgICAgICBbcm91bmRTZWxlY3Rpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFt0aW1lUGlja2VyXT1cInRydWVcIlxuICAgICAgICAgICAgPjwvcHJ5LWRhdGUtcGlja2VyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2xhc3NpY0lucHV0PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgKGhhc1R3b0ZpZWxkcyA/ICdAcHJ5LnNlYXJjaC5wbGFjZWhvbGRlci5taW5WYWx1ZScgOiAnQHByeS5zZWFyY2gucGxhY2Vob2xkZXIuc2VhcmNoJykgfCBpMThuXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uVXBkYXRlVmFsdWUoY29uZGl0aW9uKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1R3b0ZpZWxkc1wiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQHByeS5zZWFyY2gucGxhY2Vob2xkZXIubWF4VmFsdWUnIHwgaTE4blwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidXBwZXJWYWx1ZVwiXG4gICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uVXBkYXRlVmFsdWUoY29uZGl0aW9uKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbCBhLWxhYmVsLS1oZWxwIC1lcnJvclwiICpuZ0lmPVwiZm9ybVZhbHVlPy5lcnJvcnM/LlsncmVxdWlyZWQnXSAmJiBmb3JtVmFsdWU/LnRvdWNoZWRcIj5cbiAgICAgICAgICAgIHt7ICdAcHJ5LnNlYXJjaC5tdWx0aS5yZXF1aXJlZEVycm9yJyB8IGkxOG4gfX1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm8tbXVsdGktY2xhc3MtY29uZGl0aW9uX19kZWxldGUtY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vdExhc3RDb25kaXRpb24kIHwgYXN5bmM7IGVsc2UgY2Fubm90RGVsZXRlXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiPlxuICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgaWNvblN2Zz1cImRlbGV0ZVwiXG4gICAgICAgICAgICBbaGVpZ2h0XT1cIjIwXCJcbiAgICAgICAgICAgIFt3aWR0aF09XCIyMFwiXG4gICAgICAgICAgICBbYW5pbWF0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZUNvbmRpdGlvbihjb25kaXRpb24pXCJcbiAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkuYWN0aW9uLmRlbGV0ZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjY2Fubm90RGVsZXRlPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCIgZGlzYWJsZWQ+XG4gICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjIwXCIgW3dpZHRoXT1cIjIwXCIgaWNvblN2Zz1cImRlbGV0ZVwiPjwvcHJ5LWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS5hY3Rpb24uZGVsZXRlJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI2ZpZWxkU2VsZWN0aW9uVHBsPlxuICAgIDxwcnktbXVsdGktY2xhc3MtZmllbGQtc2VsZWN0aW9uXG4gICAgICBbY29uZGl0aW9uSWRdPVwiY29uZGl0aW9uLmlkXCJcbiAgICAgIChjbG9zZU1vZGFsKT1cIm9uQ2xvc2VNb2RhbCgpXCJcbiAgICAgIChzZWxlY3RGaWVsZENoYW5nZSk9XCJvbkNoYW5nZUZpZWxkKGNvbmRpdGlvbiwgJGV2ZW50KVwiXG4gICAgPjwvcHJ5LW11bHRpLWNsYXNzLWZpZWxkLXNlbGVjdGlvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctY29udGFpbmVyPlxuIl19
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY2xhc3MtY29uZGl0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3NlYXJjaC9zZWFyY2gtbXVsdGktY2xhc3MvY29tcG9uZW50cy9tdWx0aS1jbGFzcy1jb25kaXRpb24vbXVsdGktY2xhc3MtY29uZGl0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3NlYXJjaC9zZWFyY2gtbXVsdGktY2xhc3MvY29tcG9uZW50cy9tdWx0aS1jbGFzcy1jb25kaXRpb24vbXVsdGktY2xhc3MtY29uZGl0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVyxhQUFhLEVBQWMsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsV0FBVyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFtQixrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRyxPQUFPLEVBRUwsY0FBYyxFQUNkLGFBQWEsRUFFYixjQUFjLEVBQ2QsU0FBUyxFQUVULGdCQUFnQixFQUVqQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7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QyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxLQUFLLFNBQVMsQ0FBQztJQUN6RyxDQUFDOzhHQWxLVSw0QkFBNEI7a0dBQTVCLDRCQUE0QiwwTEFDQyxXQUFXLDZCQzFCckQsZ21JQTRHQTs7MkZEbkZhLDRCQUE0QjtrQkFKeEMsU0FBUzsrQkFDRSwyQkFBMkI7dUxBSWtCLGlCQUFpQjtzQkFBdkUsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBU3hDLEVBQUU7c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQ2xhc3MsXG4gIENsYXNzU2VsZWN0b3JzLFxuICBDb25maWdBY3Rpb25zLFxuICBGaWVsZCxcbiAgRmllbGRTZWxlY3RvcnMsXG4gIEZpZWxkVHlwZSxcbiAgTXVsdGlDbGFzc0NvbmRpdGlvbixcbiAgT1BFUkFUT1JfT1BUSU9OUyxcbiAgT3BlcmF0b3JPcHRpb25cbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc3dpdGNoTWFwLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTZWFyY2hNdWx0aUNsYXNzQWN0aW9ucyB9IGZyb20gJy4uLy4uL3N0b3JlL3NlYXJjaC1tdWx0aS1jbGFzcy5hY3Rpb25zJztcbmltcG9ydCB7IFNlYXJjaE11bHRpQ2xhc3NTZWxlY3RvcnMgfSBmcm9tICcuLi8uLi9zdG9yZS9zZWFyY2gtbXVsdGktY2xhc3Muc2VsZWN0b3JzJztcbmltcG9ydCB7IFNlYXJjaE11bHRpQ2xhc3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2VhcmNoLW11bHRpLWNsYXNzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktbXVsdGktY2xhc3MtY29uZGl0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWNsYXNzLWNvbmRpdGlvbi5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlDbGFzc0NvbmRpdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2ZpZWxkU2VsZWN0aW9uVHBsJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBmaWVsZFNlbGVjdGlvblRwbCE6IFRlbXBsYXRlUmVmPGFueT47XG4gIGNvbmRpdGlvbiQ6IE9ic2VydmFibGU8TXVsdGlDbGFzc0NvbmRpdGlvbiB8IHVuZGVmaW5lZD4gPSBvZih1bmRlZmluZWQpO1xuICBjbGFzc2VzTGlua2VkJDogT2JzZXJ2YWJsZTxDbGFzc1tdPiA9IG9mKFtdKTtcbiAgZmllbGQkOiBPYnNlcnZhYmxlPEZpZWxkIHwgdW5kZWZpbmVkPiA9IG9mKHVuZGVmaW5lZCk7XG4gIGNsYXNzZXMkOiBPYnNlcnZhYmxlPENsYXNzW10+O1xuICBjb25kaXRpb25zJDogT2JzZXJ2YWJsZTxNdWx0aUNsYXNzQ29uZGl0aW9uW10+O1xuICBub3RMYXN0Q29uZGl0aW9uJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgb3BlcmF0b3JzJDogT2JzZXJ2YWJsZTxPcGVyYXRvck9wdGlvbltdPiA9IG9mKFtdKTtcblxuICBASW5wdXQoKSBzZXQgaWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbDtcbiAgICB0aGlzLmNvbmRpdGlvbiQgPSB0aGlzLnN0b3JlLnNlbGVjdChTZWFyY2hNdWx0aUNsYXNzU2VsZWN0b3JzLmdldENvbmRpdGlvbkJ5SWQodGhpcy5faWQpKTtcbiAgICB0aGlzLmNvbmRpdGlvbiRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGMpOiBjIGlzIE11bHRpQ2xhc3NDb25kaXRpb24gPT4gYz8uZmllbGQgIT09IHVuZGVmaW5lZCksXG4gICAgICAgIHRha2UoMSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGMpID0+IHtcbiAgICAgICAgaWYgKGMuaXNEYXRlICYmIHR5cGVvZiB0aGlzLmZvcm0uZ2V0KCd2YWx1ZScpPy52YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IG9wZXJhdG9yOiBjLm9wZXJhdG9yLCB2YWx1ZTogeyBzdGFydDogYy52YWx1ZSwgZW5kOiBjLnVwcGVyVmFsdWUgfSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgIHsgb3BlcmF0b3I6IGMub3BlcmF0b3IsIHZhbHVlOiBjLnZhbHVlLCB1cHBlclZhbHVlOiBjLnVwcGVyVmFsdWUgfSxcbiAgICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybVZhbHVlPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICAgIHRoaXMuZm9ybVZhbHVlPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIGlmIChjLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5mb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm0uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH0pO1xuICAgIHRoaXMuZmllbGQkID0gdGhpcy5jb25kaXRpb24kLnBpcGUoXG4gICAgICBmaWx0ZXIoKGMpOiBjIGlzIE11bHRpQ2xhc3NDb25kaXRpb24gPT4gYyAhPT0gdW5kZWZpbmVkKSxcbiAgICAgIHN3aXRjaE1hcCgoYykgPT4gdGhpcy5zdG9yZS5zZWxlY3QoRmllbGRTZWxlY3RvcnMuZmllbGRCeUlkKGMuZmllbGQpKSlcbiAgICApO1xuICAgIHRoaXMuY2xhc3Nlc0xpbmtlZCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmNvbmRpdGlvbnMkLCB0aGlzLmNvbmRpdGlvbiQsIHRoaXMuY2xhc3NlcyRdKS5waXBlKFxuICAgICAgbWFwKChbY29uZGl0aW9ucywgY29uZGl0aW9uLCBjbGFzc2VzXSkgPT4gdGhpcy5zZXJ2aWNlLmdldENsYXNzZXNGb3JGaWVsZChjb25kaXRpb25zLCBjb25kaXRpb24sIGNsYXNzZXMpKSxcbiAgICAgIGZpbHRlcigoY2xhenopID0+IChjbGF6ej8ubGVuZ3RoID8/IDApID4gMClcbiAgICApO1xuICAgIHRoaXMub3BlcmF0b3JzJCA9IHRoaXMuY29uZGl0aW9uJC5waXBlKFxuICAgICAgZmlsdGVyKChjKTogYyBpcyBNdWx0aUNsYXNzQ29uZGl0aW9uID0+IGMgIT09IHVuZGVmaW5lZCksXG4gICAgICBzd2l0Y2hNYXAoKGMpID0+IHRoaXMuc3RvcmUuc2VsZWN0KEZpZWxkU2VsZWN0b3JzLmZpZWxkQnlJZChjLmZpZWxkKSkpLFxuICAgICAgZmlsdGVyKChmKTogZiBpcyBGaWVsZCA9PiBmICE9PSB1bmRlZmluZWQpLFxuICAgICAgbWFwKChmKSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBmLnR5cGU7XG4gICAgICAgIGlmIChbRmllbGRUeXBlLlNUUklORywgRmllbGRUeXBlLktFWVdPUkRdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIE9QRVJBVE9SX09QVElPTlMuZmlsdGVyKChvcHQpID0+IG9wdC50eXBlID09PSAnc3RyaW5nJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoW0ZpZWxkVHlwZS5ERUNJTUFMLCBGaWVsZFR5cGUuSU5URUdFUiwgRmllbGRUeXBlLkxPTkddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIE9QRVJBVE9SX09QVElPTlMuZmlsdGVyKChvcHQpID0+IG9wdC50eXBlID09PSAnbnVtYmVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIE9QRVJBVE9SX09QVElPTlMuZmlsdGVyKChvcHQpID0+IG9wdC50eXBlID09PSAnZGF0ZScpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9pZD86IHN0cmluZztcbiAgb3BlbmVkID0gZmFsc2U7XG4gIHByaXZhdGUgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XG5cbiAgZm9ybSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcbiAgICBvcGVyYXRvcjogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBudWxsLCBkaXNhYmxlZDogdHJ1ZSB9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgIHZhbHVlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IG51bGwsIGRpc2FibGVkOiB0cnVlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgdXBwZXJWYWx1ZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBudWxsLCBkaXNhYmxlZDogdHJ1ZSB9LCBbXSlcbiAgfSk7XG5cbiAgZ2V0IGZvcm1WYWx1ZSgpOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgndmFsdWUnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTZWFyY2hNdWx0aUNsYXNzU2VydmljZSxcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmXG4gICkge1xuICAgIHRoaXMuY2xhc3NlcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChDbGFzc1NlbGVjdG9ycy5jbGFzc2VzKTtcbiAgICB0aGlzLmNvbmRpdGlvbnMkID0gdGhpcy5zdG9yZS5zZWxlY3QoU2VhcmNoTXVsdGlDbGFzc1NlbGVjdG9ycy5jb25kaXRpb25zKTtcbiAgICB0aGlzLm5vdExhc3RDb25kaXRpb24kID0gdGhpcy5jb25kaXRpb25zJC5waXBlKG1hcCgoY29uZGl0aW9ucykgPT4gKGNvbmRpdGlvbnM/Lmxlbmd0aCA/PyAwKSAhPT0gMSkpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5nZXQoJ29wZXJhdG9yJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodGhpcy5faWQpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChTZWFyY2hNdWx0aUNsYXNzQWN0aW9ucy51cGRhdGVDb25kaXRpb24oeyBjb25kaXRpb25JZDogdGhpcy5faWQsIGtleTogJ29wZXJhdG9yJywgdmFsdWUgfSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25SZW1vdmVDb25kaXRpb24oY29uZGl0aW9uOiBNdWx0aUNsYXNzQ29uZGl0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChTZWFyY2hNdWx0aUNsYXNzQWN0aW9ucy5yZW1vdmVDb25kaXRpb24oeyBjb25kaXRpb25JZDogY29uZGl0aW9uLmlkIH0pKTtcbiAgfVxuXG4gIHRvZ2dsZUZpZWxkU2VsZWN0aW9uKCkge1xuICAgIHRoaXMub3BlbmVkID0gIXRoaXMub3BlbmVkO1xuICAgIGlmICh0aGlzLm9wZW5lZCkge1xuICAgICAgdGhpcy5vcGVuV2l0aFRlbXBsYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lIH0pKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZj8uZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5XaXRoVGVtcGxhdGUoKSB7XG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCcsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLmNlbnRlckhvcml6b250YWxseSgpLmNlbnRlclZlcnRpY2FsbHkoKSxcbiAgICAgICAgbWluSGVpZ2h0OiAnMzAwcHgnLFxuICAgICAgICBtYXhIZWlnaHQ6ICc2MDBweCcsXG4gICAgICAgIHdpZHRoOiAnNTAwcHgnXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmFkZGluZ092ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lIH0pKTtcbiAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoXykgPT4gdGhpcy50b2dnbGVGaWVsZFNlbGVjdGlvbigpKTtcbiAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLmZpZWxkU2VsZWN0aW9uVHBsLCB0aGlzLnZpZXdDb250YWluZXJSZWYpKTtcbiAgfVxuXG4gIG9uQ2hhbmdlRmllbGQoY29uZGl0aW9uOiBNdWx0aUNsYXNzQ29uZGl0aW9uLCBmaWVsZDogc3RyaW5nKSB7XG4gICAgaWYgKGNvbmRpdGlvbi5maWVsZCAhPT0gZmllbGQpIHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goU2VhcmNoTXVsdGlDbGFzc0FjdGlvbnMudXBkYXRlQ29uZGl0aW9uRmllbGQoeyBjb25kaXRpb25JZDogY29uZGl0aW9uLmlkLCBmaWVsZCB9KSk7XG4gICAgfVxuICAgIHRoaXMudG9nZ2xlRmllbGRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIG9uQ2xvc2VNb2RhbCgpIHtcbiAgICB0aGlzLnRvZ2dsZUZpZWxkU2VsZWN0aW9uKCk7XG4gIH1cblxuICBvblVwZGF0ZVZhbHVlKGNvbmRpdGlvbjogTXVsdGlDbGFzc0NvbmRpdGlvbikge1xuICAgIGxldCBmb3JtVmFsdWUsIGZvcm1TZWNvbmRWYWx1ZTtcbiAgICBpZiAoY29uZGl0aW9uLmlzRGF0ZSAmJiB0eXBlb2YgdGhpcy5mb3JtLmdldCgndmFsdWUnKT8udmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBmb3JtVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KCd2YWx1ZScpPy52YWx1ZS5zdGFydDtcbiAgICAgIGZvcm1TZWNvbmRWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoJ3ZhbHVlJyk/LnZhbHVlLmVuZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybVZhbHVlID0gdGhpcy5mb3JtLmdldCgndmFsdWUnKT8udmFsdWU7XG4gICAgICBmb3JtU2Vjb25kVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KCd1cHBlclZhbHVlJyk/LnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChmb3JtVmFsdWUgIT09IGNvbmRpdGlvbi52YWx1ZSB8fCBmb3JtU2Vjb25kVmFsdWUgIT09IGNvbmRpdGlvbi51cHBlclZhbHVlKSB7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICBTZWFyY2hNdWx0aUNsYXNzQWN0aW9ucy51cGRhdGVDb25kaXRpb24oe1xuICAgICAgICAgIGNvbmRpdGlvbklkOiBjb25kaXRpb24uaWQsXG4gICAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICAgIHZhbHVlOiBmb3JtVmFsdWUsXG4gICAgICAgICAgdXBwZXJWYWx1ZTogZm9ybVNlY29uZFZhbHVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGpvaW4oY2xhc3NlczogQ2xhc3NbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzZXMubWFwKChjbGF6eikgPT4gY2xhenoubmFtZSkuam9pbignLCAnKTtcbiAgfVxuXG4gIGdldCBoYXNUd29GaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ29wZXJhdG9yJyk/LnZhbHVlID09PSAnSU5TSURFJyB8fCB0aGlzLmZvcm0uZ2V0KCdvcGVyYXRvcicpPy52YWx1ZSA9PT0gJ09VVFNJREUnO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZGl0aW9uJCB8IGFzeW5jIGFzIGNvbmRpdGlvblwiPlxuICA8ZGl2IGNsYXNzPVwiby1tdWx0aS1jbGFzcy1jb25kaXRpb25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiby1tdWx0aS1jbGFzcy1jb25kaXRpb25fX2NvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW11bHRpLWNsYXNzLWNvbmRpdGlvbl9fY29udGVudF9fYWN0aW9uXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IC1zaXplLXNtIC13aWR0aC1mdWxsXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwic2VsZWN0aW9uIGJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZpZWxkU2VsZWN0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkJCB8IGFzeW5jIGFzIGZpZWxkOyBlbHNlIG5vRmllbGRUcGxcIj5cbiAgICAgICAgICAgIHt7IGZpZWxkLm5hbWUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI25vRmllbGRUcGw+e3sgJ0Bwcnkuc2VhcmNoLm11bHRpLnNlbGVjdEZpZWxkJyB8IGkxOG4gfX08L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2xhc3Nlc0xpbmtlZCQgfCBhc3luYyBhcyBjbGFzc2VzTGlua2VkXCI+XG4gICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICBpY29uU3ZnPVwibGlua3NfbGluZVwiXG4gICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICBzdHlsZT1cImNvbG9yOiBibGFja1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiKCdAcHJ5LnNlYXJjaC5tdWx0aS5pbicgfCBpMThuKSArICcgJyArIGpvaW4oY2xhc3Nlc0xpbmtlZClcIlxuICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgIFtpdGVtc109XCJvcGVyYXRvcnMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJPcMOpcmF0ZXVyXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm9wZXJhdG9yXCJcbiAgICAgICAgICAgIFtpdGVtc0FzT3B0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgW2xhYmVsVHJhbnNsYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgYmluZFZhbHVlPVwib3BlcmF0b3JcIlxuICAgICAgICAgICAgYmluZExhYmVsPVwidHJhbnNsYXRpb25cIlxuICAgICAgICAgICAgY2xhc3M9XCJhLXByeS1zZWxlY3RcIlxuICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmRpdGlvbi5pc0RhdGU7IGVsc2UgY2xhc3NpY0lucHV0XCI+XG4gICAgICAgICAgICA8cHJ5LWRhdGUtcGlja2VyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVXBkYXRlVmFsdWUoY29uZGl0aW9uKVwiXG4gICAgICAgICAgICAgIFtyYW5nZVBpY2tlcl09XCJoYXNUd29GaWVsZHNcIlxuICAgICAgICAgICAgICBbcm91bmRTZWxlY3Rpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFt0aW1lUGlja2VyXT1cInRydWVcIlxuICAgICAgICAgICAgPjwvcHJ5LWRhdGUtcGlja2VyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2xhc3NpY0lucHV0PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgKGhhc1R3b0ZpZWxkcyA/ICdAcHJ5LnNlYXJjaC5wbGFjZWhvbGRlci5taW5WYWx1ZScgOiAnQHByeS5zZWFyY2gucGxhY2Vob2xkZXIuc2VhcmNoJykgfCBpMThuXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uVXBkYXRlVmFsdWUoY29uZGl0aW9uKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1R3b0ZpZWxkc1wiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQHByeS5zZWFyY2gucGxhY2Vob2xkZXIubWF4VmFsdWUnIHwgaTE4blwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidXBwZXJWYWx1ZVwiXG4gICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uVXBkYXRlVmFsdWUoY29uZGl0aW9uKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbCBhLWxhYmVsLS1oZWxwIC1lcnJvclwiICpuZ0lmPVwiZm9ybVZhbHVlPy5lcnJvcnM/LlsncmVxdWlyZWQnXSAmJiBmb3JtVmFsdWU/LnRvdWNoZWRcIj5cbiAgICAgICAgICAgIHt7ICdAcHJ5LnNlYXJjaC5tdWx0aS5yZXF1aXJlZEVycm9yJyB8IGkxOG4gfX1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm8tbXVsdGktY2xhc3MtY29uZGl0aW9uX19kZWxldGUtY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vdExhc3RDb25kaXRpb24kIHwgYXN5bmM7IGVsc2UgY2Fubm90RGVsZXRlXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiPlxuICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgaWNvblN2Zz1cImRlbGV0ZVwiXG4gICAgICAgICAgICBbaGVpZ2h0XT1cIjIwXCJcbiAgICAgICAgICAgIFt3aWR0aF09XCIyMFwiXG4gICAgICAgICAgICBbYW5pbWF0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZUNvbmRpdGlvbihjb25kaXRpb24pXCJcbiAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkuYWN0aW9uLmRlbGV0ZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjY2Fubm90RGVsZXRlPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCIgZGlzYWJsZWQ+XG4gICAgICAgIDxwcnktaWNvbiBbaGVpZ2h0XT1cIjIwXCIgW3dpZHRoXT1cIjIwXCIgaWNvblN2Zz1cImRlbGV0ZVwiPjwvcHJ5LWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS5hY3Rpb24uZGVsZXRlJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI2ZpZWxkU2VsZWN0aW9uVHBsPlxuICAgIDxwcnktbXVsdGktY2xhc3MtZmllbGQtc2VsZWN0aW9uXG4gICAgICBbY29uZGl0aW9uSWRdPVwiY29uZGl0aW9uLmlkXCJcbiAgICAgIChjbG9zZU1vZGFsKT1cIm9uQ2xvc2VNb2RhbCgpXCJcbiAgICAgIChzZWxlY3RGaWVsZENoYW5nZSk9XCJvbkNoYW5nZUZpZWxkKGNvbmRpdGlvbiwgJGV2ZW50KVwiXG4gICAgPjwvcHJ5LW11bHRpLWNsYXNzLWZpZWxkLXNlbGVjdGlvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctY29udGFpbmVyPlxuIl19