ng-miam 3.3.2 → 3.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/bundles/ng-miam.umd.js +1844 -1111
  2. package/bundles/ng-miam.umd.js.map +1 -1
  3. package/bundles/ng-miam.umd.min.js +2 -2
  4. package/bundles/ng-miam.umd.min.js.map +1 -1
  5. package/esm2015/lib/_components/abstracts/abstract-recipe-card.component.js +1 -1
  6. package/esm2015/lib/_components/icon/icon.component.js +23 -6
  7. package/esm2015/lib/_components/recipe-filters/recipe-filters.component.js +94 -40
  8. package/esm2015/lib/_components/text-input/text-input.component.js +6 -4
  9. package/esm2015/lib/_models/article.js +43 -0
  10. package/esm2015/lib/_models/basket.js +2 -2
  11. package/esm2015/lib/_models/index.js +4 -1
  12. package/esm2015/lib/_models/ingredient.js +11 -7
  13. package/esm2015/lib/_models/package.js +14 -3
  14. package/esm2015/lib/_models/recipe.js +6 -2
  15. package/esm2015/lib/_models/user.js +10 -1
  16. package/esm2015/lib/_services/analytics.service.js +3 -3
  17. package/esm2015/lib/_services/articles.service.js +21 -0
  18. package/esm2015/lib/_services/baskets.service.js +2 -2
  19. package/esm2015/lib/_services/context.service.js +19 -1
  20. package/esm2015/lib/_services/groceries-lists.service.js +2 -2
  21. package/esm2015/lib/_services/index.js +3 -1
  22. package/esm2015/lib/_services/ingredients.service.js +2 -2
  23. package/esm2015/lib/_services/interceptor.service.js +2 -3
  24. package/esm2015/lib/_services/package.service.js +32 -9
  25. package/esm2015/lib/_services/recipe-events.service.js +2 -2
  26. package/esm2015/lib/_services/recipe-likes.service.js +6 -2
  27. package/esm2015/lib/_services/recipe-share.service.js +2 -2
  28. package/esm2015/lib/_services/recipes.service.js +2 -2
  29. package/esm2015/lib/_services/suppliers.service.js +2 -2
  30. package/esm2015/lib/_services/toastr.service.js +52 -0
  31. package/esm2015/lib/_services/user.service.js +64 -21
  32. package/esm2015/lib/_types/icon.enum.js +2 -1
  33. package/esm2015/lib/_web-components/catalog-article-card/catalog-article-card.component.js +71 -0
  34. package/esm2015/lib/_web-components/catalog-category/catalog-category.component.js +134 -92
  35. package/esm2015/lib/_web-components/catalog-header/catalog-header.component.js +51 -34
  36. package/esm2015/lib/_web-components/catalog-list/catalog-list.component.js +106 -61
  37. package/esm2015/lib/_web-components/catalog-recipe-card/catalog-recipe-card.component.js +65 -52
  38. package/esm2015/lib/_web-components/favorite-page/favorite-page.component.js +8 -6
  39. package/esm2015/lib/_web-components/index.js +2 -1
  40. package/esm2015/lib/_web-components/personal-recipes/personal-recipes.component.js +7 -5
  41. package/esm2015/lib/_web-components/recipe-card/recipe-card.component.js +73 -58
  42. package/esm2015/lib/_web-components/recipe-catalog/recipe-catalog.component.js +152 -92
  43. package/esm2015/lib/_web-components/recipe-details/recipe-details.component.js +355 -278
  44. package/esm2015/lib/_web-components/suggestion-card/suggestion-card.component.js +3 -6
  45. package/esm2015/lib/_web-components/web-components.module.js +17 -9
  46. package/esm2015/lib/environments/environment.js +6 -0
  47. package/esm2015/lib/ng-miam.module.js +4 -4
  48. package/fesm2015/ng-miam.js +1755 -1140
  49. package/fesm2015/ng-miam.js.map +1 -1
  50. package/lib/_components/abstracts/abstract-recipe-card.component.d.ts +1 -1
  51. package/lib/_components/recipe-filters/recipe-filters.component.d.ts +14 -4
  52. package/lib/_components/text-input/text-input.component.d.ts +2 -1
  53. package/lib/_models/article.d.ts +23 -0
  54. package/lib/_models/basket.d.ts +1 -2
  55. package/lib/_models/index.d.ts +3 -0
  56. package/lib/_models/ingredient.d.ts +2 -0
  57. package/lib/_models/package.d.ts +10 -3
  58. package/lib/_models/recipe.d.ts +2 -0
  59. package/lib/_models/user.d.ts +16 -1
  60. package/lib/_services/articles.service.d.ts +10 -0
  61. package/lib/_services/context.service.d.ts +14 -6
  62. package/lib/_services/index.d.ts +2 -0
  63. package/lib/_services/package.service.d.ts +6 -1
  64. package/lib/_services/toastr.service.d.ts +10 -0
  65. package/lib/_services/user.service.d.ts +12 -6
  66. package/lib/_types/icon.enum.d.ts +2 -1
  67. package/lib/_web-components/catalog-article-card/catalog-article-card.component.d.ts +8 -0
  68. package/lib/_web-components/catalog-category/catalog-category.component.d.ts +12 -7
  69. package/lib/_web-components/catalog-header/catalog-header.component.d.ts +5 -2
  70. package/lib/_web-components/catalog-list/catalog-list.component.d.ts +13 -6
  71. package/lib/_web-components/catalog-recipe-card/catalog-recipe-card.component.d.ts +1 -0
  72. package/lib/_web-components/favorite-page/favorite-page.component.d.ts +0 -1
  73. package/lib/_web-components/index.d.ts +1 -0
  74. package/lib/_web-components/personal-recipes/personal-recipes.component.d.ts +0 -1
  75. package/lib/_web-components/recipe-card/recipe-card.component.d.ts +1 -0
  76. package/lib/_web-components/recipe-catalog/recipe-catalog.component.d.ts +13 -4
  77. package/lib/_web-components/recipe-details/recipe-details.component.d.ts +19 -6
  78. package/lib/_web-components/suggestion-card/suggestion-card.component.d.ts +0 -1
  79. package/lib/_web-components/web-components.module.d.ts +13 -11
  80. package/lib/environments/environment.d.ts +5 -0
  81. package/miam-style.css +1 -1
  82. package/package.json +1 -1
  83. package/esm2015/lib/environment.js +0 -18
  84. package/lib/environment.d.ts +0 -5
@@ -1,10 +1,10 @@
1
1
  import { Component, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, ChangeDetectorRef, ElementRef, ViewChildren, QueryList } from '@angular/core';
2
- import { skipWhile, take } from 'rxjs/operators';
2
+ import { skipWhile, switchMap, take, tap } from 'rxjs/operators';
3
3
  import { CatalogCategoryComponent } from '../catalog-category/catalog-category.component';
4
- import { RecipeTypeService, SponsorService, PackageService, SuppliersService, RecipesService } from '../../_services';
4
+ import { RecipeTypeService, SponsorService, PackageService, SuppliersService, RecipesService, UserService } from '../../_services';
5
5
  import { Icon } from '../../_types/icon.enum';
6
6
  import { CatalogHeaderComponent } from '../catalog-header/catalog-header.component';
7
- import { forkJoin } from 'rxjs';
7
+ import { combineLatest, forkJoin } from 'rxjs';
8
8
  import { MediaMatcher } from '@angular/cdk/layout';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "../../_services";
@@ -18,94 +18,115 @@ import * as i8 from "../../_components/icon/icon.component";
18
18
  import * as i9 from "../recipe-stepper/recipe-stepper.component";
19
19
  const _c0 = ["miamCatalogTopAnchor"];
20
20
  function RecipeCatalogComponent_div_2_div_4_Template(rf, ctx) { if (rf & 1) {
21
- const _r9 = i0.ɵɵgetCurrentView();
22
- i0.ɵɵelementStart(0, "div", 11);
23
- i0.ɵɵelementStart(1, "ng-miam-catalog-list", 12);
24
- i0.ɵɵlistener("retrievedRecipes", function RecipeCatalogComponent_div_2_div_4_Template_ng_miam_catalog_list_retrievedRecipes_1_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r8 = i0.ɵɵnextContext(2); return ctx_r8.changeHeaderImage($event); })("filterRemoved", function RecipeCatalogComponent_div_2_div_4_Template_ng_miam_catalog_list_filterRemoved_1_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r10 = i0.ɵɵnextContext(2); return ctx_r10.removeFilter($event); })("recipeActionTriggered", function RecipeCatalogComponent_div_2_div_4_Template_ng_miam_catalog_list_recipeActionTriggered_1_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r11 = i0.ɵɵnextContext(2); return ctx_r11.manageRecipeAction($event); });
21
+ const _r10 = i0.ɵɵgetCurrentView();
22
+ i0.ɵɵelementStart(0, "div", 12);
23
+ i0.ɵɵelementStart(1, "span");
24
+ i0.ɵɵtext(2, "Une petite question : Avez-vous des enfants ?");
25
+ i0.ɵɵelementEnd();
26
+ i0.ɵɵelementStart(3, "div", 13);
27
+ i0.ɵɵelementStart(4, "button", 14);
28
+ i0.ɵɵlistener("click", function RecipeCatalogComponent_div_2_div_4_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r10); const ctx_r9 = i0.ɵɵnextContext(2); return ctx_r9.setUserPreference("has_children", true); });
29
+ i0.ɵɵtext(5, "Oui");
30
+ i0.ɵɵelementEnd();
31
+ i0.ɵɵelementStart(6, "button", 14);
32
+ i0.ɵɵlistener("click", function RecipeCatalogComponent_div_2_div_4_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r10); const ctx_r11 = i0.ɵɵnextContext(2); return ctx_r11.setUserPreference("has_children", false); });
33
+ i0.ɵɵtext(7, "Non");
34
+ i0.ɵɵelementEnd();
35
+ i0.ɵɵelementEnd();
36
+ i0.ɵɵelementEnd();
37
+ } }
38
+ function RecipeCatalogComponent_div_2_div_5_Template(rf, ctx) { if (rf & 1) {
39
+ const _r13 = i0.ɵɵgetCurrentView();
40
+ i0.ɵɵelementStart(0, "div", 15);
41
+ i0.ɵɵelementStart(1, "ng-miam-catalog-list", 16);
42
+ i0.ɵɵlistener("retrievedRecipes", function RecipeCatalogComponent_div_2_div_5_Template_ng_miam_catalog_list_retrievedRecipes_1_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(2); return ctx_r12.changeHeaderImage($event); })("filterRemoved", function RecipeCatalogComponent_div_2_div_5_Template_ng_miam_catalog_list_filterRemoved_1_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r14 = i0.ɵɵnextContext(2); return ctx_r14.removeFilter($event); })("recipeActionTriggered", function RecipeCatalogComponent_div_2_div_5_Template_ng_miam_catalog_list_recipeActionTriggered_1_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r15 = i0.ɵɵnextContext(2); return ctx_r15.manageRecipeAction($event); });
25
43
  i0.ɵɵelementEnd();
26
44
  i0.ɵɵelementEnd();
27
45
  } if (rf & 2) {
28
- const ctx_r4 = i0.ɵɵnextContext(2);
46
+ const ctx_r5 = i0.ɵɵnextContext(2);
29
47
  i0.ɵɵadvance(1);
30
- i0.ɵɵproperty("filters", ctx_r4.filters)("randomMode", true);
48
+ i0.ɵɵproperty("filters", ctx_r5.filters)("randomMode", true);
31
49
  } }
32
- function RecipeCatalogComponent_div_2_ng_template_5_div_0_ng_miam_catalog_category_1_Template(rf, ctx) { if (rf & 1) {
33
- const _r16 = i0.ɵɵgetCurrentView();
34
- i0.ɵɵelementStart(0, "ng-miam-catalog-category", 16);
35
- i0.ɵɵlistener("displayList", function RecipeCatalogComponent_div_2_ng_template_5_div_0_ng_miam_catalog_category_1_Template_ng_miam_catalog_category_displayList_0_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r15 = i0.ɵɵnextContext(4); return ctx_r15.categoryTitleClicked($event); });
50
+ function RecipeCatalogComponent_div_2_ng_template_6_div_0_ng_miam_catalog_category_1_Template(rf, ctx) { if (rf & 1) {
51
+ const _r20 = i0.ɵɵgetCurrentView();
52
+ i0.ɵɵelementStart(0, "ng-miam-catalog-category", 20);
53
+ i0.ɵɵlistener("displayList", function RecipeCatalogComponent_div_2_ng_template_6_div_0_ng_miam_catalog_category_1_Template_ng_miam_catalog_category_displayList_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r19 = i0.ɵɵnextContext(4); return ctx_r19.categoryTitleClicked($event); });
36
54
  i0.ɵɵelementEnd();
37
55
  } if (rf & 2) {
38
- const category_r14 = ctx.$implicit;
39
- i0.ɵɵproperty("title", category_r14.title)("filters", category_r14.filters);
56
+ const category_r18 = ctx.$implicit;
57
+ i0.ɵɵproperty("title", category_r18.title)("filters", category_r18.filters);
40
58
  } }
41
- function RecipeCatalogComponent_div_2_ng_template_5_div_0_Template(rf, ctx) { if (rf & 1) {
42
- i0.ɵɵelementStart(0, "div", 14);
43
- i0.ɵɵtemplate(1, RecipeCatalogComponent_div_2_ng_template_5_div_0_ng_miam_catalog_category_1_Template, 1, 2, "ng-miam-catalog-category", 15);
59
+ function RecipeCatalogComponent_div_2_ng_template_6_div_0_Template(rf, ctx) { if (rf & 1) {
60
+ i0.ɵɵelementStart(0, "div", 18);
61
+ i0.ɵɵtemplate(1, RecipeCatalogComponent_div_2_ng_template_6_div_0_ng_miam_catalog_category_1_Template, 1, 2, "ng-miam-catalog-category", 19);
44
62
  i0.ɵɵelementEnd();
45
63
  } if (rf & 2) {
46
- const ctx_r12 = i0.ɵɵnextContext(3);
64
+ const ctx_r16 = i0.ɵɵnextContext(3);
47
65
  i0.ɵɵadvance(1);
48
- i0.ɵɵproperty("ngForOf", ctx_r12.categories);
66
+ i0.ɵɵproperty("ngForOf", ctx_r16.categories);
49
67
  } }
50
- function RecipeCatalogComponent_div_2_ng_template_5_Template(rf, ctx) { if (rf & 1) {
51
- i0.ɵɵtemplate(0, RecipeCatalogComponent_div_2_ng_template_5_div_0_Template, 2, 1, "div", 13);
68
+ function RecipeCatalogComponent_div_2_ng_template_6_Template(rf, ctx) { if (rf & 1) {
69
+ i0.ɵɵtemplate(0, RecipeCatalogComponent_div_2_ng_template_6_div_0_Template, 2, 1, "div", 17);
52
70
  } if (rf & 2) {
53
- const ctx_r6 = i0.ɵɵnextContext(2);
54
- i0.ɵɵproperty("ngIf", ctx_r6.categories.length > 0);
71
+ const ctx_r7 = i0.ɵɵnextContext(2);
72
+ i0.ɵɵproperty("ngIf", ctx_r7.categories.length > 0);
55
73
  } }
56
- function RecipeCatalogComponent_div_2_div_7_Template(rf, ctx) { if (rf & 1) {
57
- const _r18 = i0.ɵɵgetCurrentView();
58
- i0.ɵɵelementStart(0, "div", 17);
59
- i0.ɵɵlistener("click", function RecipeCatalogComponent_div_2_div_7_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r17 = i0.ɵɵnextContext(2); return ctx_r17.returnToTop(); });
60
- i0.ɵɵelement(1, "ng-miam-icon", 18);
74
+ function RecipeCatalogComponent_div_2_div_8_Template(rf, ctx) { if (rf & 1) {
75
+ const _r22 = i0.ɵɵgetCurrentView();
76
+ i0.ɵɵelementStart(0, "div", 21);
77
+ i0.ɵɵlistener("click", function RecipeCatalogComponent_div_2_div_8_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r22); const ctx_r21 = i0.ɵɵnextContext(2); return ctx_r21.returnToTop(); });
78
+ i0.ɵɵelement(1, "ng-miam-icon", 22);
61
79
  i0.ɵɵelementEnd();
62
80
  } if (rf & 2) {
63
- const ctx_r7 = i0.ɵɵnextContext(2);
81
+ const ctx_r8 = i0.ɵɵnextContext(2);
64
82
  i0.ɵɵadvance(1);
65
- i0.ɵɵproperty("iconName", ctx_r7.icon.ChevronDown);
83
+ i0.ɵɵproperty("iconName", ctx_r8.icon.ChevronDown);
66
84
  } }
67
85
  const _c1 = function (a0) { return { "filter-collapsed": a0 }; };
68
86
  function RecipeCatalogComponent_div_2_Template(rf, ctx) { if (rf & 1) {
69
- const _r20 = i0.ɵɵgetCurrentView();
87
+ const _r24 = i0.ɵɵgetCurrentView();
70
88
  i0.ɵɵelementStart(0, "div", 4);
71
- i0.ɵɵlistener("scroll", function RecipeCatalogComponent_div_2_Template_div_scroll_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r19 = i0.ɵɵnextContext(); return ctx_r19.displayReturnTopButton(); }, false, i0.ɵɵresolveWindow);
89
+ i0.ɵɵlistener("scroll", function RecipeCatalogComponent_div_2_Template_div_scroll_0_listener() { i0.ɵɵrestoreView(_r24); const ctx_r23 = i0.ɵɵnextContext(); return ctx_r23.displayReturnTopButton(); }, false, i0.ɵɵresolveWindow);
72
90
  i0.ɵɵelementStart(1, "ng-miam-recipe-filters", 5);
73
- i0.ɵɵlistener("filterReset", function RecipeCatalogComponent_div_2_Template_ng_miam_recipe_filters_filterReset_1_listener() { i0.ɵɵrestoreView(_r20); const ctx_r21 = i0.ɵɵnextContext(); return ctx_r21.resetFilters(); })("filterChanged", function RecipeCatalogComponent_div_2_Template_ng_miam_recipe_filters_filterChanged_1_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r22 = i0.ɵɵnextContext(); return ctx_r22.updateFilters($event); })("filterCollapsed", function RecipeCatalogComponent_div_2_Template_ng_miam_recipe_filters_filterCollapsed_1_listener() { i0.ɵɵrestoreView(_r20); const ctx_r23 = i0.ɵɵnextContext(); return ctx_r23.onFilterCollapsed(); });
91
+ i0.ɵɵlistener("filterReset", function RecipeCatalogComponent_div_2_Template_ng_miam_recipe_filters_filterReset_1_listener() { i0.ɵɵrestoreView(_r24); const ctx_r25 = i0.ɵɵnextContext(); return ctx_r25.resetFilters(); })("filterChanged", function RecipeCatalogComponent_div_2_Template_ng_miam_recipe_filters_filterChanged_1_listener($event) { i0.ɵɵrestoreView(_r24); const ctx_r26 = i0.ɵɵnextContext(); return ctx_r26.updateFilters($event); })("filterCollapsed", function RecipeCatalogComponent_div_2_Template_ng_miam_recipe_filters_filterCollapsed_1_listener() { i0.ɵɵrestoreView(_r24); const ctx_r27 = i0.ɵɵnextContext(); return ctx_r27.onFilterCollapsed(); })("preferencesChanged", function RecipeCatalogComponent_div_2_Template_ng_miam_recipe_filters_preferencesChanged_1_listener() { i0.ɵɵrestoreView(_r24); const ctx_r28 = i0.ɵɵnextContext(); return ctx_r28.reloadPackages(); });
74
92
  i0.ɵɵelementEnd();
75
93
  i0.ɵɵelementStart(2, "div", 6);
76
94
  i0.ɵɵelementStart(3, "ng-miam-catalog-header", 7);
77
- i0.ɵɵlistener("returnButtonPressed", function RecipeCatalogComponent_div_2_Template_ng_miam_catalog_header_returnButtonPressed_3_listener() { i0.ɵɵrestoreView(_r20); const ctx_r24 = i0.ɵɵnextContext(); return ctx_r24.returnToHomePage(); })("searchStringChanged", function RecipeCatalogComponent_div_2_Template_ng_miam_catalog_header_searchStringChanged_3_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r25 = i0.ɵɵnextContext(); return ctx_r25.updateSearch($event); });
95
+ i0.ɵɵlistener("returnButtonPressed", function RecipeCatalogComponent_div_2_Template_ng_miam_catalog_header_returnButtonPressed_3_listener() { i0.ɵɵrestoreView(_r24); const ctx_r29 = i0.ɵɵnextContext(); return ctx_r29.returnToHomePage(); })("searchStringChanged", function RecipeCatalogComponent_div_2_Template_ng_miam_catalog_header_searchStringChanged_3_listener($event) { i0.ɵɵrestoreView(_r24); const ctx_r30 = i0.ɵɵnextContext(); return ctx_r30.updateSearch($event); });
78
96
  i0.ɵɵelementEnd();
79
- i0.ɵɵtemplate(4, RecipeCatalogComponent_div_2_div_4_Template, 2, 2, "div", 8);
80
- i0.ɵɵtemplate(5, RecipeCatalogComponent_div_2_ng_template_5_Template, 1, 1, "ng-template", null, 9, i0.ɵɵtemplateRefExtractor);
81
- i0.ɵɵtemplate(7, RecipeCatalogComponent_div_2_div_7_Template, 2, 1, "div", 10);
97
+ i0.ɵɵtemplate(4, RecipeCatalogComponent_div_2_div_4_Template, 8, 0, "div", 8);
98
+ i0.ɵɵtemplate(5, RecipeCatalogComponent_div_2_div_5_Template, 2, 2, "div", 9);
99
+ i0.ɵɵtemplate(6, RecipeCatalogComponent_div_2_ng_template_6_Template, 1, 1, "ng-template", null, 10, i0.ɵɵtemplateRefExtractor);
100
+ i0.ɵɵtemplate(8, RecipeCatalogComponent_div_2_div_8_Template, 2, 1, "div", 11);
82
101
  i0.ɵɵelementEnd();
83
102
  i0.ɵɵelementEnd();
84
103
  } if (rf & 2) {
85
- const _r5 = i0.ɵɵreference(6);
104
+ const _r6 = i0.ɵɵreference(7);
86
105
  const ctx_r1 = i0.ɵɵnextContext();
87
106
  i0.ɵɵadvance(1);
88
107
  i0.ɵɵproperty("filters", ctx_r1.filters)("mobileFixed", ctx_r1.returnTopButtonShouldBeDisplayed)("filterToRemove", ctx_r1.filterToRemove);
89
108
  i0.ɵɵadvance(1);
90
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(10, _c1, ctx_r1.isFilterCollapsed));
109
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(11, _c1, ctx_r1.isFilterCollapsed));
91
110
  i0.ɵɵadvance(1);
92
111
  i0.ɵɵproperty("displayReturnButton", !ctx_r1.displayHomePage)("forcedRecipe", ctx_r1.recipeInHeader)("title", ctx_r1.displayHomePage ? ctx_r1.homePageTitle : ctx_r1.filters.additionalFilters && ctx_r1.filters.additionalFilters.title !== "" ? ctx_r1.filters.additionalFilters.title : ctx_r1.titleInResearchMode);
93
112
  i0.ɵɵadvance(1);
94
- i0.ɵɵproperty("ngIf", !ctx_r1.displayHomePage)("ngIfElse", _r5);
113
+ i0.ɵɵproperty("ngIf", ctx_r1.showUserFeedback);
114
+ i0.ɵɵadvance(1);
115
+ i0.ɵɵproperty("ngIf", !ctx_r1.displayHomePage)("ngIfElse", _r6);
95
116
  i0.ɵɵadvance(3);
96
117
  i0.ɵɵproperty("ngIf", ctx_r1.returnTopButtonShouldBeDisplayed);
97
118
  } }
98
119
  function RecipeCatalogComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
99
- const _r27 = i0.ɵɵgetCurrentView();
100
- i0.ɵɵelementStart(0, "ng-miam-recipe-stepper", 19);
101
- i0.ɵɵlistener("recipeChange", function RecipeCatalogComponent_ng_template_3_Template_ng_miam_recipe_stepper_recipeChange_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r26 = i0.ɵɵnextContext(); return ctx_r26.leaveCreatePage(); })("canceled", function RecipeCatalogComponent_ng_template_3_Template_ng_miam_recipe_stepper_canceled_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r28 = i0.ɵɵnextContext(); return ctx_r28.leaveCreatePage(); });
120
+ const _r32 = i0.ɵɵgetCurrentView();
121
+ i0.ɵɵelementStart(0, "ng-miam-recipe-stepper", 23);
122
+ i0.ɵɵlistener("recipeChange", function RecipeCatalogComponent_ng_template_3_Template_ng_miam_recipe_stepper_recipeChange_0_listener() { i0.ɵɵrestoreView(_r32); const ctx_r31 = i0.ɵɵnextContext(); return ctx_r31.leaveCreatePage(); })("canceled", function RecipeCatalogComponent_ng_template_3_Template_ng_miam_recipe_stepper_canceled_0_listener() { i0.ɵɵrestoreView(_r32); const ctx_r33 = i0.ɵɵnextContext(); return ctx_r33.leaveCreatePage(); });
102
123
  i0.ɵɵelementEnd();
103
124
  } if (rf & 2) {
104
125
  const ctx_r3 = i0.ɵɵnextContext();
105
126
  i0.ɵɵproperty("recipe", ctx_r3.recipeToUpdate);
106
127
  } }
107
128
  export class RecipeCatalogComponent {
108
- constructor(cdr, recipeTypesService, sponsorService, supplierService, packageService, recipesService, mediaMatcher) {
129
+ constructor(cdr, recipeTypesService, sponsorService, supplierService, packageService, recipesService, mediaMatcher, usersService) {
109
130
  this.cdr = cdr;
110
131
  this.recipeTypesService = recipeTypesService;
111
132
  this.sponsorService = sponsorService;
@@ -113,6 +134,7 @@ export class RecipeCatalogComponent {
113
134
  this.packageService = packageService;
114
135
  this.recipesService = recipesService;
115
136
  this.mediaMatcher = mediaMatcher;
137
+ this.usersService = usersService;
116
138
  this.homePageTitle = 'Qu\'est-ce qui vous ferait plaisir ?';
117
139
  this.titleInResearchMode = 'Résultats de recherche';
118
140
  this.displayHomePage = true;
@@ -123,35 +145,39 @@ export class RecipeCatalogComponent {
123
145
  this.creatingRecipe = false;
124
146
  this.isMobile = false;
125
147
  this.listIsEmpty = false;
148
+ this.showUserFeedback = false;
149
+ this.subscriptions = [];
126
150
  this.isMobile = mediaMatcher.matchMedia('(max-width: 1022px)').matches;
127
151
  this.isFilterCollapsed = this.isMobile;
128
152
  }
129
153
  ngOnInit() {
130
154
  this.resetFilters();
131
- forkJoin([
132
- this.recipeTypesService.getTypes().pipe(skipWhile(types => types.length === 0),
133
- // recipeTypesService.getTypes() comes from a behavior subject, it does not emit the complete() function
134
- // you absolutly need a take(1) or call complete yourself to trigger the forkjoin subscribe
135
- take(1)),
136
- this.supplierService.supplier$.asObservable().pipe(skipWhile(supp => supp === undefined || supp == null), take(1))
137
- ]).subscribe((res) => {
138
- const supplier = res[1];
139
- this.packageService.categories_for([supplier.id]).pipe(skipWhile(packages => packages.is_loading)).subscribe((packages) => {
140
- this.initCategories(packages);
141
- this.selectCategoryFromUrl();
142
- this.cdr.detectChanges();
143
- });
144
- });
155
+ this.subscriptions = [
156
+ forkJoin([
157
+ this.recipeTypesService.getTypes().pipe(skipWhile(types => types.length === 0),
158
+ // recipeTypesService.getTypes() comes from a behavior subject, it does not emit the complete() function
159
+ // you absolutly need a take(1) or call complete yourself to trigger the forkjoin subscribe
160
+ take(1)),
161
+ this.supplierService.supplier$.asObservable().pipe(skipWhile(supp => supp === undefined || supp == null), take(1))
162
+ ]).pipe(switchMap(res => {
163
+ this.supplierId = res[1].id;
164
+ return this.loadPackages();
165
+ })).subscribe(),
166
+ this.assessShowUserFeedback()
167
+ ];
145
168
  }
146
169
  ngAfterViewInit() {
147
170
  this.cdr.detectChanges();
148
171
  }
172
+ ngOnDestroy() {
173
+ this.subscriptions.forEach(s => s.unsubscribe());
174
+ }
149
175
  initCategories(packages) {
150
- this.categories.push({
151
- key: 'suggestions',
152
- title: 'Suggestions de la semaine',
153
- filters: { suggested: true }
154
- });
176
+ this.categories = [{
177
+ key: 'suggestions',
178
+ title: 'Suggestions de la semaine',
179
+ filters: { suggested: true }
180
+ }];
155
181
  packages.data.forEach(categoryPackage => {
156
182
  this.categories.push({
157
183
  key: categoryPackage.title,
@@ -159,34 +185,43 @@ export class RecipeCatalogComponent {
159
185
  filters: { packages: categoryPackage.id }
160
186
  });
161
187
  });
162
- this.categories.push({
163
- key: 'entrees',
164
- title: 'Entrées',
165
- filters: { recipe_type_id: this.recipeTypesService.getTypeByName('entrée').id }
166
- });
167
- this.categories.push({
168
- key: 'plats',
169
- title: 'Plats',
170
- filters: { recipe_type_id: this.recipeTypesService.getTypeByName('plat principal').id }
171
- });
172
- this.categories.push({
173
- key: 'desserts',
174
- title: 'Desserts',
175
- filters: { recipe_type_id: this.recipeTypesService.getTypeByName('dessert').id }
176
- });
188
+ const startersType = this.recipeTypesService.getTypeByName('entrée');
189
+ if (startersType) {
190
+ this.categories.push({
191
+ key: 'entrees',
192
+ title: 'Entrées',
193
+ filters: { recipe_type_id: startersType.id }
194
+ });
195
+ }
196
+ const mainType = this.recipeTypesService.getTypeByName('plat principal');
197
+ if (mainType) {
198
+ this.categories.push({
199
+ key: 'plats',
200
+ title: 'Plats',
201
+ filters: { recipe_type_id: mainType.id }
202
+ });
203
+ }
204
+ const dessertType = this.recipeTypesService.getTypeByName('dessert');
205
+ if (dessertType) {
206
+ this.categories.push({
207
+ key: 'desserts',
208
+ title: 'Desserts',
209
+ filters: { recipe_type_id: dessertType.id }
210
+ });
211
+ }
177
212
  }
178
213
  selectCategoryFromUrl() {
179
214
  const paramsString = window.location.search;
180
215
  const paramsArray = new URLSearchParams(paramsString);
181
- const selected_category_key = paramsArray.get('catalogCategory');
182
- if (!selected_category_key) {
216
+ const selectedCategoryKey = paramsArray.get('catalogCategory');
217
+ if (!selectedCategoryKey) {
183
218
  return;
184
219
  }
185
- const selected_category = this.categories.find((cat) => cat.key === selected_category_key);
186
- if (!selected_category) {
220
+ const selectedCategory = this.categories.find((cat) => cat.key === selectedCategoryKey);
221
+ if (!selectedCategory) {
187
222
  return;
188
223
  }
189
- this.categoryTitleClicked(selected_category);
224
+ this.categoryTitleClicked(selectedCategory);
190
225
  }
191
226
  // Used on load to build the filters attribute, and on click on the link to reset the filters
192
227
  resetFilters() {
@@ -325,9 +360,9 @@ export class RecipeCatalogComponent {
325
360
  }
326
361
  case 'DELETE': {
327
362
  if (((_a = event.recipe) === null || _a === void 0 ? void 0 : _a.id) && ((_b = event.recipe.relationships['recipe-provider']) === null || _b === void 0 ? void 0 : _b.data.id) === 'personal') {
328
- this.recipesService.delete(event.recipe.id).subscribe(() => {
363
+ this.subscriptions.push(this.recipesService.delete(event.recipe.id).subscribe(() => {
329
364
  this.reloadList();
330
- });
365
+ }));
331
366
  }
332
367
  break;
333
368
  }
@@ -337,8 +372,33 @@ export class RecipeCatalogComponent {
337
372
  this.listIsEmpty = recipes.length === 0;
338
373
  this.cdr.detectChanges();
339
374
  }
375
+ setUserPreference(pref, state) {
376
+ this.subscriptions.push(this.usersService.setPreference(pref, state).pipe(switchMap(() => this.loadPackages())).subscribe());
377
+ }
378
+ reloadPackages() {
379
+ this.subscriptions.push(this.loadPackages().subscribe());
380
+ }
381
+ loadPackages() {
382
+ return this.packageService.categories_for([this.supplierId]).pipe(skipWhile(packages => packages.is_loading), tap((packages) => {
383
+ this.initCategories(packages);
384
+ this.selectCategoryFromUrl();
385
+ this.cdr.detectChanges();
386
+ }));
387
+ }
388
+ // Show feedback block only if user is logged and the children preference is unknown
389
+ assessShowUserFeedback() {
390
+ return combineLatest([
391
+ this.usersService.isLogged$,
392
+ this.usersService.preferenceDefined('has_children')
393
+ ]).subscribe(results => {
394
+ const logged = results[0];
395
+ const preferenceDefined = results[1];
396
+ this.showUserFeedback = logged && !preferenceDefined;
397
+ this.cdr.detectChanges();
398
+ });
399
+ }
340
400
  }
341
- RecipeCatalogComponent.ɵfac = function RecipeCatalogComponent_Factory(t) { return new (t || RecipeCatalogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.RecipeTypeService), i0.ɵɵdirectiveInject(i1.SponsorService), i0.ɵɵdirectiveInject(i1.SuppliersService), i0.ɵɵdirectiveInject(i1.PackageService), i0.ɵɵdirectiveInject(i1.RecipesService), i0.ɵɵdirectiveInject(i2.MediaMatcher)); };
401
+ RecipeCatalogComponent.ɵfac = function RecipeCatalogComponent_Factory(t) { return new (t || RecipeCatalogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.RecipeTypeService), i0.ɵɵdirectiveInject(i1.SponsorService), i0.ɵɵdirectiveInject(i1.SuppliersService), i0.ɵɵdirectiveInject(i1.PackageService), i0.ɵɵdirectiveInject(i1.RecipesService), i0.ɵɵdirectiveInject(i2.MediaMatcher), i0.ɵɵdirectiveInject(i1.UserService)); };
342
402
  RecipeCatalogComponent.ɵcmp = i0.ɵɵdefineComponent({ type: RecipeCatalogComponent, selectors: [["ng-miam-recipe-catalog"]], viewQuery: function RecipeCatalogComponent_Query(rf, ctx) { if (rf & 1) {
343
403
  i0.ɵɵviewQuery(CatalogHeaderComponent, true);
344
404
  i0.ɵɵviewQuery(_c0, true);
@@ -348,15 +408,15 @@ RecipeCatalogComponent.ɵcmp = i0.ɵɵdefineComponent({ type: RecipeCatalogCompo
348
408
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.catalogHeader = _t.first);
349
409
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.topAnchor = _t.first);
350
410
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.categoriesComp = _t);
351
- } }, decls: 5, vars: 2, consts: [[1, "miam-catalog-anchor"], ["miamCatalogTopAnchor", ""], ["class", "miam-recipe-catalog", 3, "scroll", 4, "ngIf", "ngIfElse"], ["creationPage", ""], [1, "miam-recipe-catalog", 3, "scroll"], [3, "filters", "mobileFixed", "filterToRemove", "filterReset", "filterChanged", "filterCollapsed"], [1, "miam-recipe-catalog__content", 3, "ngClass"], [3, "displayReturnButton", "forcedRecipe", "title", "returnButtonPressed", "searchStringChanged"], ["class", "miam-recipe-catalog__list", 4, "ngIf", "ngIfElse"], ["categoriesComponents", ""], ["class", "miam-recipe-catalog__returnTop", 3, "click", 4, "ngIf"], [1, "miam-recipe-catalog__list"], [3, "filters", "randomMode", "retrievedRecipes", "filterRemoved", "recipeActionTriggered"], ["class", "miam-recipe-catalog__categories", 4, "ngIf"], [1, "miam-recipe-catalog__categories"], [3, "title", "filters", "displayList", 4, "ngFor", "ngForOf"], [3, "title", "filters", "displayList"], [1, "miam-recipe-catalog__returnTop", 3, "click"], ["height", "32", "width", "32", "primaryColor", "var(--m-color-white)", 3, "iconName"], [3, "recipe", "recipeChange", "canceled"]], template: function RecipeCatalogComponent_Template(rf, ctx) { if (rf & 1) {
411
+ } }, decls: 5, vars: 2, consts: [[1, "miam-catalog-anchor"], ["miamCatalogTopAnchor", ""], ["class", "miam-recipe-catalog", 3, "scroll", 4, "ngIf", "ngIfElse"], ["creationPage", ""], [1, "miam-recipe-catalog", 3, "scroll"], [3, "filters", "mobileFixed", "filterToRemove", "filterReset", "filterChanged", "filterCollapsed", "preferencesChanged"], [1, "miam-recipe-catalog__content", 3, "ngClass"], [3, "displayReturnButton", "forcedRecipe", "title", "returnButtonPressed", "searchStringChanged"], ["class", "miam-recipe-catalog__content__user-feedback", 4, "ngIf"], ["class", "miam-recipe-catalog__list", 4, "ngIf", "ngIfElse"], ["categoriesComponents", ""], ["class", "miam-recipe-catalog__returnTop", 3, "click", 4, "ngIf"], [1, "miam-recipe-catalog__content__user-feedback"], [1, "miam-recipe-catalog__content__user-feedback__actions"], [1, "m-button-grey", 3, "click"], [1, "miam-recipe-catalog__list"], [3, "filters", "randomMode", "retrievedRecipes", "filterRemoved", "recipeActionTriggered"], ["class", "miam-recipe-catalog__categories", 4, "ngIf"], [1, "miam-recipe-catalog__categories"], [3, "title", "filters", "displayList", 4, "ngFor", "ngForOf"], [3, "title", "filters", "displayList"], [1, "miam-recipe-catalog__returnTop", 3, "click"], ["height", "32", "width", "32", "primaryColor", "var(--m-color-white)", 3, "iconName"], [3, "recipe", "recipeChange", "canceled"]], template: function RecipeCatalogComponent_Template(rf, ctx) { if (rf & 1) {
352
412
  i0.ɵɵelement(0, "div", 0, 1);
353
- i0.ɵɵtemplate(2, RecipeCatalogComponent_div_2_Template, 8, 12, "div", 2);
413
+ i0.ɵɵtemplate(2, RecipeCatalogComponent_div_2_Template, 9, 13, "div", 2);
354
414
  i0.ɵɵtemplate(3, RecipeCatalogComponent_ng_template_3_Template, 1, 1, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor);
355
415
  } if (rf & 2) {
356
416
  const _r2 = i0.ɵɵreference(4);
357
417
  i0.ɵɵadvance(2);
358
418
  i0.ɵɵproperty("ngIf", !ctx.creatingRecipe)("ngIfElse", _r2);
359
- } }, directives: [i3.NgIf, i4.RecipeFiltersComponent, i3.NgClass, i5.CatalogHeaderComponent, i6.CatalogListComponent, i3.NgForOf, i7.CatalogCategoryComponent, i8.IconComponent, i9.RecipeStepperComponent], styles: [".miam-recipe-catalog{display:flex;justify-content:space-between;width:100%}.miam-recipe-catalog .miam-recipe-catalog__content{width:calc(100% - 216px)}.miam-recipe-catalog .miam-recipe-catalog__content.filter-collapsed{overflow-x:hidden;width:100%}.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__categories{display:flex;flex-direction:column;margin-top:40px;width:100%}.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__list{margin-top:40px;width:100%}.miam-recipe-catalog .miam-recipe-catalog__returnTop{-webkit-tap-highlight-color:transparent;background-color:var(--m-color-primary);border-radius:var(--m-border-radius-circle);bottom:24px;box-shadow:0 2px 10px -4px var(--m-color-grey-text-dark);cursor:pointer;padding:8px;position:fixed;right:56px;transform:rotate(-180deg);z-index:var(--m-z-index-position-absolute-high)}@media (max-width:1022px){.miam-recipe-catalog{max-width:100vw}.miam-recipe-catalog .miam-recipe-catalog__returnTop{bottom:72px;right:24px}.miam-recipe-catalog .miam-recipe-catalog__content{width:100%}.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__categories,.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__list{margin-top:16px}.miam-recipe-catalog .miam-recipe-catalog__content:not(.filter-collapsed){display:none}}"], encapsulation: 2, changeDetection: 0 });
419
+ } }, directives: [i3.NgIf, i4.RecipeFiltersComponent, i3.NgClass, i5.CatalogHeaderComponent, i6.CatalogListComponent, i3.NgForOf, i7.CatalogCategoryComponent, i8.IconComponent, i9.RecipeStepperComponent], styles: [".miam-recipe-catalog{display:flex;justify-content:space-between;width:100%}.miam-recipe-catalog .miam-recipe-catalog__content{width:calc(100% - 216px)}.miam-recipe-catalog .miam-recipe-catalog__content.filter-collapsed{overflow-x:hidden;width:100%}.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__content__user-feedback{align-items:center;background-color:var(--m-color-secondary);color:#fff;display:flex;font-size:18px;font-weight:700;justify-content:center;padding:8px}.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__content__user-feedback>span{margin-right:16px}.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__content__user-feedback .miam-recipe-catalog__content__user-feedback__actions{display:flex}.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__content__user-feedback .miam-recipe-catalog__content__user-feedback__actions>.m-button-grey{margin-left:4px;min-width:80px;padding:12px 16px}.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__categories{display:flex;flex-direction:column;margin-top:40px;width:100%}.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__list{margin-top:40px;width:100%}.miam-recipe-catalog .miam-recipe-catalog__returnTop{-webkit-tap-highlight-color:transparent;background-color:var(--m-color-primary);border-radius:var(--m-border-radius-circle);bottom:24px;box-shadow:0 2px 10px -4px var(--m-color-grey-text-dark);cursor:pointer;padding:8px;position:fixed;right:56px;transform:rotate(-180deg);z-index:var(--m-z-index-position-absolute-high)}@media (max-width:1022px){.miam-recipe-catalog{max-width:100vw}.miam-recipe-catalog .miam-recipe-catalog__returnTop{bottom:72px;right:24px}.miam-recipe-catalog .miam-recipe-catalog__content{width:100%}.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__content__user-feedback{margin-top:55px}.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__categories,.miam-recipe-catalog .miam-recipe-catalog__content .miam-recipe-catalog__list{margin-top:60px}.miam-recipe-catalog .miam-recipe-catalog__content:not(.filter-collapsed){display:none}}"], encapsulation: 2, changeDetection: 0 });
360
420
  /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(RecipeCatalogComponent, [{
361
421
  type: Component,
362
422
  args: [{
@@ -366,7 +426,7 @@ RecipeCatalogComponent.ɵcmp = i0.ɵɵdefineComponent({ type: RecipeCatalogCompo
366
426
  encapsulation: ViewEncapsulation.None,
367
427
  changeDetection: ChangeDetectionStrategy.OnPush
368
428
  }]
369
- }], function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.RecipeTypeService }, { type: i1.SponsorService }, { type: i1.SuppliersService }, { type: i1.PackageService }, { type: i1.RecipesService }, { type: i2.MediaMatcher }]; }, { catalogHeader: [{
429
+ }], function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.RecipeTypeService }, { type: i1.SponsorService }, { type: i1.SuppliersService }, { type: i1.PackageService }, { type: i1.RecipesService }, { type: i2.MediaMatcher }, { type: i1.UserService }]; }, { catalogHeader: [{
370
430
  type: ViewChild,
371
431
  args: [CatalogHeaderComponent]
372
432
  }], topAnchor: [{
@@ -376,4 +436,4 @@ RecipeCatalogComponent.ɵcmp = i0.ɵɵdefineComponent({ type: RecipeCatalogCompo
376
436
  type: ViewChildren,
377
437
  args: [CatalogCategoryComponent]
378
438
  }] }); })();
379
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBlLWNhdGFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9idWlsZHMvbWlhbS9uZy1taWFtLXNkay9wcm9qZWN0cy9uZy1taWFtL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9fd2ViLWNvbXBvbmVudHMvcmVjaXBlLWNhdGFsb2cvcmVjaXBlLWNhdGFsb2cuY29tcG9uZW50LnRzIiwibGliL193ZWItY29tcG9uZW50cy9yZWNpcGUtY2F0YWxvZy9yZWNpcGUtY2F0YWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBaUIsaUJBQWlCLEVBQVUsVUFBVSxFQUM3SCxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFMUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXBGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7Ozs7OztJQ1cvQywrQkFDRTtJQUFBLGdEQU11QjtJQUhyQix3UEFBOEMsa09BQUEsd1BBQUE7SUFHaEQsaUJBQXVCO0lBQ3pCLGlCQUFNOzs7SUFORixlQUFtQjtJQUFuQix3Q0FBbUIsb0JBQUE7Ozs7SUFVbkIsb0RBSzJCO0lBRHpCLGlTQUE0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RUFBRSxDQUFDO0lBQzNCLENBQUM7OzRGQXhRVSxzQkFBc0I7MkRBQXRCLHNCQUFzQjt1QkFDdEIsc0JBQXNCOzt1QkFHbkIsd0JBQXdCOzs7Ozs7O1FDeEJ4Qyw0QkFBNkQ7UUFDN0Qsd0VBQ0U7UUE2Q0Ysd0hBQ0U7OztRQS9DRyxlQUF5QztRQUF6QywwQ0FBeUMsaUJBQUE7O2tERG1CakMsc0JBQXNCO2NBUGxDLFNBQVM7ZUFBQztnQkFDVCxRQUFRLEVBQUUsd0JBQXdCO2dCQUNsQyxXQUFXLEVBQUUsaUNBQWlDO2dCQUM5QyxTQUFTLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQztnQkFDOUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7Z0JBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEO3FQQUVvQyxhQUFhO2tCQUEvQyxTQUFTO21CQUFDLHNCQUFzQjtZQUNFLFNBQVM7a0JBQTNDLFNBQVM7bUJBQUMsc0JBQXNCO1lBRVEsY0FBYztrQkFBdEQsWUFBWTttQkFBQyx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgVmlld0NoaWxkLCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgT25Jbml0LCBFbGVtZW50UmVmLFxuICBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc2tpcFdoaWxlLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2F0YWxvZ0NhdGVnb3J5Q29tcG9uZW50IH0gZnJvbSAnLi4vY2F0YWxvZy1jYXRlZ29yeS9jYXRhbG9nLWNhdGVnb3J5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWNpcGUgfSBmcm9tICcuLi8uLi9fbW9kZWxzJztcbmltcG9ydCB7IFJlY2lwZVR5cGVTZXJ2aWNlLCBTcG9uc29yU2VydmljZSwgUGFja2FnZVNlcnZpY2UsIFN1cHBsaWVyc1NlcnZpY2UsIFJlY2lwZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzJztcbmltcG9ydCB7IEljb24gfSBmcm9tICcuLi8uLi9fdHlwZXMvaWNvbi5lbnVtJztcbmltcG9ydCB7IENhdGFsb2dIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi9jYXRhbG9nLWhlYWRlci9jYXRhbG9nLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVjaXBlRmlsdGVyLCBSZWNpcGVGaWx0ZXJzIH0gZnJvbSAnLi4vLi4vX3R5cGVzL3JlY2lwZS1maWx0ZXJzJztcbmltcG9ydCB7IGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNZWRpYU1hdGNoZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZy1taWFtLXJlY2lwZS1jYXRhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlY2lwZS1jYXRhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVjaXBlLWNhdGFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUmVjaXBlQ2F0YWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoQ2F0YWxvZ0hlYWRlckNvbXBvbmVudCkgY2F0YWxvZ0hlYWRlcjogQ2F0YWxvZ0hlYWRlckNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnbWlhbUNhdGFsb2dUb3BBbmNob3InKSB0b3BBbmNob3I6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZHJlbihDYXRhbG9nQ2F0ZWdvcnlDb21wb25lbnQpICBjYXRlZ29yaWVzQ29tcCE6IFF1ZXJ5TGlzdDxDYXRhbG9nQ2F0ZWdvcnlDb21wb25lbnQ+O1xuXG4gIGZpbHRlcnM6IFJlY2lwZUZpbHRlcnM7XG4gIGhvbWVQYWdlVGl0bGUgPSAnUXVcXCdlc3QtY2UgcXVpIHZvdXMgZmVyYWl0IHBsYWlzaXIgPyc7XG4gIHRpdGxlSW5SZXNlYXJjaE1vZGUgPSAnUsOpc3VsdGF0cyBkZSByZWNoZXJjaGUnO1xuICBkaXNwbGF5SG9tZVBhZ2UgPSB0cnVlO1xuICBpc0ZpbHRlckNvbGxhcHNlZCA9IGZhbHNlO1xuICByZXR1cm5Ub3BCdXR0b25TaG91bGRCZURpc3BsYXllZCA9IGZhbHNlO1xuICBpY29uID0gSWNvbjtcbiAgY2F0ZWdvcmllcyA9IFtdO1xuICByZWNpcGVJbkhlYWRlcjogUmVjaXBlO1xuICBjcmVhdGluZ1JlY2lwZSA9IGZhbHNlO1xuICByZWNpcGVUb1VwZGF0ZTogUmVjaXBlO1xuICBmaWx0ZXJUb1JlbW92ZTogc3RyaW5nO1xuICBpc01vYmlsZSA9IGZhbHNlO1xuICBsaXN0SXNFbXB0eSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHB1YmxpYyByZWNpcGVUeXBlc1NlcnZpY2U6IFJlY2lwZVR5cGVTZXJ2aWNlLFxuICAgIHB1YmxpYyBzcG9uc29yU2VydmljZTogU3BvbnNvclNlcnZpY2UsXG4gICAgcHVibGljIHN1cHBsaWVyU2VydmljZTogU3VwcGxpZXJzU2VydmljZSxcbiAgICBwdWJsaWMgcGFja2FnZVNlcnZpY2U6IFBhY2thZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVjaXBlc1NlcnZpY2U6IFJlY2lwZXNTZXJ2aWNlLFxuICAgIHB1YmxpYyBtZWRpYU1hdGNoZXI6IE1lZGlhTWF0Y2hlcikge1xuICAgIHRoaXMuaXNNb2JpbGUgPSBtZWRpYU1hdGNoZXIubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogMTAyMnB4KScpLm1hdGNoZXM7XG4gICAgdGhpcy5pc0ZpbHRlckNvbGxhcHNlZCA9IHRoaXMuaXNNb2JpbGU7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnJlc2V0RmlsdGVycygpO1xuXG4gICAgZm9ya0pvaW4oW1xuICAgICAgdGhpcy5yZWNpcGVUeXBlc1NlcnZpY2UuZ2V0VHlwZXMoKS5waXBlKFxuICAgICAgICBza2lwV2hpbGUodHlwZXMgPT4gdHlwZXMubGVuZ3RoID09PSAwKSxcbiAgICAgICAgLy8gcmVjaXBlVHlwZXNTZXJ2aWNlLmdldFR5cGVzKCkgY29tZXMgZnJvbSBhIGJlaGF2aW9yIHN1YmplY3QsIGl0IGRvZXMgbm90IGVtaXQgdGhlIGNvbXBsZXRlKCkgZnVuY3Rpb25cbiAgICAgICAgLy8geW91IGFic29sdXRseSBuZWVkIGEgdGFrZSgxKSBvciBjYWxsIGNvbXBsZXRlIHlvdXJzZWxmIHRvIHRyaWdnZXIgdGhlIGZvcmtqb2luIHN1YnNjcmliZVxuICAgICAgICB0YWtlKDEpXG4gICAgICApLFxuICAgICAgdGhpcy5zdXBwbGllclNlcnZpY2Uuc3VwcGxpZXIkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICAgIHNraXBXaGlsZShzdXBwID0+IHN1cHAgPT09IHVuZGVmaW5lZCB8fCBzdXBwID09IG51bGwpLFxuICAgICAgICB0YWtlKDEpXG4gICAgICApXG4gICAgXSkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGNvbnN0IHN1cHBsaWVyID0gcmVzWzFdO1xuICAgICAgdGhpcy5wYWNrYWdlU2VydmljZS5jYXRlZ29yaWVzX2Zvcihbc3VwcGxpZXIuaWRdKS5waXBlKFxuICAgICAgICBza2lwV2hpbGUocGFja2FnZXMgPT4gcGFja2FnZXMuaXNfbG9hZGluZylcbiAgICAgICkuc3Vic2NyaWJlKChwYWNrYWdlcykgPT4ge1xuICAgICAgICB0aGlzLmluaXRDYXRlZ29yaWVzKHBhY2thZ2VzKTtcbiAgICAgICAgdGhpcy5zZWxlY3RDYXRlZ29yeUZyb21VcmwoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBpbml0Q2F0ZWdvcmllcyhwYWNrYWdlcykge1xuICAgIHRoaXMuY2F0ZWdvcmllcy5wdXNoKHtcbiAgICAgIGtleTogJ3N1Z2dlc3Rpb25zJyxcbiAgICAgIHRpdGxlOiAnU3VnZ2VzdGlvbnMgZGUgbGEgc2VtYWluZScsXG4gICAgICBmaWx0ZXJzOiB7IHN1Z2dlc3RlZDogdHJ1ZSB9XG4gICAgfSk7XG4gICAgcGFja2FnZXMuZGF0YS5mb3JFYWNoKGNhdGVnb3J5UGFja2FnZSA9PiB7XG4gICAgICB0aGlzLmNhdGVnb3JpZXMucHVzaCh7XG4gICAgICAgIGtleTogY2F0ZWdvcnlQYWNrYWdlLnRpdGxlLFxuICAgICAgICB0aXRsZTogY2F0ZWdvcnlQYWNrYWdlLnRpdGxlLFxuICAgICAgICBmaWx0ZXJzOiB7IHBhY2thZ2VzOiBjYXRlZ29yeVBhY2thZ2UuaWQgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5jYXRlZ29yaWVzLnB1c2goe1xuICAgICAga2V5OiAnZW50cmVlcycsXG4gICAgICB0aXRsZTogJ0VudHLDqWVzJyxcbiAgICAgIGZpbHRlcnM6IHsgcmVjaXBlX3R5cGVfaWQ6IHRoaXMucmVjaXBlVHlwZXNTZXJ2aWNlLmdldFR5cGVCeU5hbWUoJ2VudHLDqWUnKS5pZCB9XG4gICAgfSk7XG4gICAgdGhpcy5jYXRlZ29yaWVzLnB1c2goe1xuICAgICAga2V5OiAncGxhdHMnLFxuICAgICAgdGl0bGU6ICdQbGF0cycsXG4gICAgICBmaWx0ZXJzOiB7IHJlY2lwZV90eXBlX2lkOiB0aGlzLnJlY2lwZVR5cGVzU2VydmljZS5nZXRUeXBlQnlOYW1lKCdwbGF0IHByaW5jaXBhbCcpLmlkIH1cbiAgICB9KTtcbiAgICB0aGlzLmNhdGVnb3JpZXMucHVzaCh7XG4gICAgICBrZXk6ICdkZXNzZXJ0cycsXG4gICAgICB0aXRsZTogJ0Rlc3NlcnRzJyxcbiAgICAgIGZpbHRlcnM6IHsgcmVjaXBlX3R5cGVfaWQ6IHRoaXMucmVjaXBlVHlwZXNTZXJ2aWNlLmdldFR5cGVCeU5hbWUoJ2Rlc3NlcnQnKS5pZCB9XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RDYXRlZ29yeUZyb21VcmwoKSB7XG4gICAgY29uc3QgcGFyYW1zU3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcbiAgICBjb25zdCBwYXJhbXNBcnJheSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zU3RyaW5nKTtcbiAgICBjb25zdCBzZWxlY3RlZF9jYXRlZ29yeV9rZXkgPSBwYXJhbXNBcnJheS5nZXQoJ2NhdGFsb2dDYXRlZ29yeScpO1xuICAgIGlmICghc2VsZWN0ZWRfY2F0ZWdvcnlfa2V5KXtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWRfY2F0ZWdvcnkgPSB0aGlzLmNhdGVnb3JpZXMuZmluZCgoY2F0KSA9PiBjYXQua2V5ID09PSBzZWxlY3RlZF9jYXRlZ29yeV9rZXkpO1xuICAgIGlmICghc2VsZWN0ZWRfY2F0ZWdvcnkpe1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNhdGVnb3J5VGl0bGVDbGlja2VkKHNlbGVjdGVkX2NhdGVnb3J5KTtcbiAgfVxuXG4gIC8vIFVzZWQgb24gbG9hZCB0byBidWlsZCB0aGUgZmlsdGVycyBhdHRyaWJ1dGUsIGFuZCBvbiBjbGljayBvbiB0aGUgbGluayB0byByZXNldCB0aGUgZmlsdGVyc1xuICByZXNldEZpbHRlcnMoKSB7XG4gICAgdGhpcy5maWx0ZXJzID0ge1xuICAgICAgLy8gdHlwZTogW1xuICAgICAgLy8gICB7bmFtZTogcmVjaXBlVHlwZXNTZXJ2aWNlLmdldFR5cGUoMSkuaWQsIHZhbHVlOiBmYWxzZSwgdGV4dDogJ0VudHLDqWVzJ30sXG4gICAgICAvLyAgIHtuYW1lOiByZWNpcGVUeXBlc1NlcnZpY2UuZ2V0VHlwZSgyKS5pZCwgdmFsdWU6IGZhbHNlLCB0ZXh0OiAnUGxhdHMnfSxcbiAgICAgIC8vICAge25hbWU6IHJlY2lwZVR5cGVzU2VydmljZS5nZXRUeXBlKDMpLmlkLCB2YWx1ZTogZmFsc2UsIHRleHQ6ICdEZXNzZXJ0cyd9XG4gICAgICAvLyBdLFxuICAgICAgZGlmZmljdWx0eTogW1xuICAgICAgICB7bmFtZTogJzEnLCB2YWx1ZTogZmFsc2UsIHRleHQ6ICdGYWNpbGUnfSxcbiAgICAgICAge25hbWU6ICcyJywgdmFsdWU6IGZhbHNlLCB0ZXh0OiAnTW95ZW5uZSd9LFxuICAgICAgICB7bmFtZTogJzMnLCB2YWx1ZTogZmFsc2UsIHRleHQ6ICdEaWZmaWNpbGUnfVxuICAgICAgXSxcbiAgICAgIGNvc3Q6IFtcbiAgICAgICAge25hbWU6ICcwLTUnLCB2YWx1ZTogZmFsc2UsIHRleHQ6ICdCYXMgKOKJiCDiiaQgNeKCrCknfSxcbiAgICAgICAge25hbWU6ICc1LTEwJywgdmFsdWU6IGZhbHNlLCB0ZXh0OiAnTW95ZW4gKOKJiCA1LTEw4oKsKSAnfSxcbiAgICAgICAge25hbWU6ICcxMC0xMDAwJywgdmFsdWU6IGZhbHNlLCB0ZXh0OiAnw4lsZXbDqSAo4omIIOKJpSAxMOKCrCkgJ31cbiAgICAgICAgLy8gd2Ugc2V0IGEgbGltaXQgYXQgMTAwMOKCrCBtYXgsIGlmIGEgcmVjaXBlIGNvc3QgbW9yZSBzaG91bGQgYmUgbm9uIHNlbnNlIGFueXdheVxuICAgICAgXSxcbiAgICAgIHRpbWU6IFtcbiAgICAgICAge25hbWU6ICcxNScsIHZhbHVlOiBmYWxzZSwgdGV4dDogJzE1bSd9LFxuICAgICAgICB7bmFtZTogJzMwJywgdmFsdWU6IGZhbHNlLCB0ZXh0OiAnMzBtJ30sXG4gICAgICAgIHtuYW1lOiAnNjAnLCB2YWx1ZTogZmFsc2UsIHRleHQ6ICcxaCd9LFxuICAgICAgICB7bmFtZTogJzEyMCcsIHZhbHVlOiBmYWxzZSwgdGV4dDogJzJoJ31cbiAgICAgIF0sXG4gICAgfTtcbiAgICBpZiAodGhpcy5jYXRhbG9nSGVhZGVyKSB7IHRoaXMuY2F0YWxvZ0hlYWRlci5yZXNldFNlYXJjaFN0cmluZygpOyB9XG4gICAgdGhpcy5maWx0ZXJzLnNlYXJjaCA9ICcnO1xuICAgIHRoaXMubGlzdElzRW1wdHkgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuZGlzcGxheUhvbWVQYWdlKXsgdGhpcy5yZXR1cm5Ub0hvbWVQYWdlKCk7IH1cbiAgfVxuXG4gIHVwZGF0ZVNlYXJjaChzZWFyY2g6IHN0cmluZykge1xuICAgIGlmIChzZWFyY2ggIT09IHRoaXMuZmlsdGVycy5zZWFyY2gpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5zZWFyY2ggPSBzZWFyY2g7XG4gICAgICB0aGlzLnJlbG9hZExpc3QoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJzKGZpbHRlcnM6IFJlY2lwZUZpbHRlcnMpIHtcbiAgICB0aGlzLmZpbHRlcnMgPSB7IC4uLmZpbHRlcnMgfTsgLy8gTmVjZXNzYXJ5IHRvIHRyaWdnZXIgdGhlIG5nT25DaGFuZ2VzXG4gICAgdGhpcy5maWx0ZXJUb1JlbW92ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxpc3RJc0VtcHR5ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgIHRoaXMucmV0dXJuVG9Ub3AoKTtcbiAgICB9XG4gICAgdGhpcy5yZWxvYWRMaXN0KCk7XG4gIH1cblxuICByZWxvYWRMaXN0KCkge1xuICAgIC8vIElmIHRoZXJlIGFyZSBubyBmaWx0ZXJzIG5vciBzZWFyY2gsIHJldHVybiB0byBob21lIHBhZ2VcbiAgICBpZiAodGhpcy5hcmVGaWx0ZXJzRW1wdHkoKSkgeyB0aGlzLnJldHVyblRvSG9tZVBhZ2UoKTsgfVxuICAgIGVsc2UgeyAvLyBSZWxvYWQgdGhlIGxpc3RcbiAgICAgIHRoaXMuZmlsdGVycyA9IHsgLi4udGhpcy5maWx0ZXJzIH07IC8vIE5lY2Vzc2FyeSB0byB0cmlnZ2VyIHRoZSBuZ09uQ2hhbmdlc1xuICAgICAgdGhpcy5kaXNwbGF5SG9tZVBhZ2UgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBjYXRlZ29yeVRpdGxlQ2xpY2tlZChldmVudDoge3RpdGxlOiBzdHJpbmcsIGZpbHRlcnM6IGFueX0pIHtcbiAgICB0aGlzLnJldHVyblRvVG9wKCk7XG4gICAgdGhpcy5maWx0ZXJzLmFkZGl0aW9uYWxGaWx0ZXJzID0geyBmaWx0ZXJzOiBldmVudC5maWx0ZXJzLCB0aXRsZTogZXZlbnQudGl0bGUgfTtcbiAgICB0aGlzLnJlbG9hZExpc3QoKTtcbiAgfVxuXG4gIGFyZUZpbHRlcnNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0ZpZWxkRW1wdHkodGhpcy5maWx0ZXJzLmRpZmZpY3VsdHkpICYmIHRoaXMuaXNGaWVsZEVtcHR5KHRoaXMuZmlsdGVycy5jb3N0KSAmJiB0aGlzLmlzRmllbGRFbXB0eSh0aGlzLmZpbHRlcnMudGltZSlcbiAgICAgICYmIHRoaXMuZmlsdGVycy5zZWFyY2ggPT09ICcnICYmICF0aGlzLmZpbHRlcnMuYWRkaXRpb25hbEZpbHRlcnM/LmZpbHRlcnM7XG4gIH1cblxuICBpc0ZpZWxkRW1wdHkoZmlsdGVyOiBSZWNpcGVGaWx0ZXJbXSkge1xuICAgIGZvciAoY29uc3QgZiBvZiBmaWx0ZXIpIHtcbiAgICAgIGlmIChmLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZW1vdmVGaWx0ZXIoZmlsdGVyVGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5maWx0ZXJUb1JlbW92ZSA9IGZpbHRlclRleHQ7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcmV0dXJuVG9Ub3AoKSB7XG4gICAgaWYgKHRoaXMudG9wQW5jaG9yKSB7XG4gICAgICB0aGlzLnRvcEFuY2hvci5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KCk7XG4gICAgfVxuICB9XG5cbiAgZGlzcGxheVJldHVyblRvcEJ1dHRvbigpIHtcbiAgICB0aGlzLnJldHVyblRvcEJ1dHRvblNob3VsZEJlRGlzcGxheWVkID0gdGhpcy50b3BBbmNob3IubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gPCAtNDAwO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGNoYW5nZUhlYWRlckltYWdlKHJlY2lwZXM6IFJlY2lwZVtdKSB7XG4gICAgaWYgKHJlY2lwZXMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcnMuYWRkaXRpb25hbEZpbHRlcnM/LmZpbHRlcnMgJiYgIXRoaXMucmVjaXBlSW5IZWFkZXIpIHtcbiAgICAgIHRoaXMucmVjaXBlSW5IZWFkZXIgPSByZWNpcGVzWzBdO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVyblRvSG9tZVBhZ2UoKSB7XG4gICAgdGhpcy5kaXNwbGF5SG9tZVBhZ2UgPSB0cnVlO1xuICAgIHRoaXMucmVjaXBlSW5IZWFkZXIgPSB1bmRlZmluZWQ7IC8vIERvbid0IGZvcmNlIGEgcmVjaXBlIGluIGhlYWRlciBvbiBob21lUGFnZVxuICAgIHRoaXMucmVzZXRGaWx0ZXJzKCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25GaWx0ZXJDb2xsYXBzZWQoKSB7XG4gICAgdGhpcy5pc0ZpbHRlckNvbGxhcHNlZCA9ICF0aGlzLmlzRmlsdGVyQ29sbGFwc2VkO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAvLyB0byB0cmlnZ2VyIGFmdGVyIHRoZSBkZXRlY3RDaGFuZ2VzIGJlY2F1c2Ugd2UgbmVlZCB0byBhbHJlYWQgaGF2ZSB0aGUgZGlzcGxheSBjaGFuZ2UgdG8gdXBkYXRlIGNhcmRzXG4gICAgdGhpcy5jYXRlZ29yaWVzQ29tcC5mb3JFYWNoKCBjYXQgPT4ge1xuICAgICAgY2F0LnVwZGF0ZVdpZHRoKCk7XG4gICAgfSk7XG4gIH1cblxuICBnb1RvQ3JlYXRlUGFnZShyZWNpcGUgPSBudWxsKSB7XG4gICAgdGhpcy5jcmVhdGluZ1JlY2lwZSA9IHRydWU7XG4gICAgdGhpcy5yZWNpcGVUb1VwZGF0ZSA9IHJlY2lwZTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5yZXR1cm5Ub1RvcCgpO1xuICB9XG5cbiAgbGVhdmVDcmVhdGVQYWdlKCkge1xuICAgIHRoaXMuY3JlYXRpbmdSZWNpcGUgPSBmYWxzZTtcbiAgICB0aGlzLnJlbG9hZExpc3QoKTtcbiAgICB0aGlzLnJldHVyblRvVG9wKCk7XG4gIH1cblxuICBtYW5hZ2VSZWNpcGVBY3Rpb24oZXZlbnQ6IHthY3Rpb246IHN0cmluZywgcmVjaXBlOiBSZWNpcGV9KSB7XG4gICAgc3dpdGNoIChldmVudC5hY3Rpb24pIHtcbiAgICAgIGNhc2UgJ0NSRUFURSc6IHtcbiAgICAgICAgdGhpcy5nb1RvQ3JlYXRlUGFnZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAnRURJVCc6IHtcbiAgICAgICAgdGhpcy5nb1RvQ3JlYXRlUGFnZShldmVudC5yZWNpcGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAnREVMRVRFJzoge1xuICAgICAgICBpZiAoZXZlbnQucmVjaXBlPy5pZCAmJiBldmVudC5yZWNpcGUucmVsYXRpb25zaGlwc1sncmVjaXBlLXByb3ZpZGVyJ10/LmRhdGEuaWQgPT09ICdwZXJzb25hbCcpIHtcbiAgICAgICAgICB0aGlzLnJlY2lwZXNTZXJ2aWNlLmRlbGV0ZShldmVudC5yZWNpcGUuaWQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZExpc3QoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc0xpc3RFbXB0eShyZWNpcGVzOiBSZWNpcGVbXSkge1xuICAgIHRoaXMubGlzdElzRW1wdHkgPSByZWNpcGVzLmxlbmd0aCA9PT0gMDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbn1cbiIsIjxkaXYgI21pYW1DYXRhbG9nVG9wQW5jaG9yIGNsYXNzPVwibWlhbS1jYXRhbG9nLWFuY2hvclwiPjwvZGl2PlxuPGRpdiAqbmdJZj1cIiFjcmVhdGluZ1JlY2lwZSBlbHNlIGNyZWF0aW9uUGFnZVwiIGNsYXNzPVwibWlhbS1yZWNpcGUtY2F0YWxvZ1wiICh3aW5kb3c6c2Nyb2xsKT1cImRpc3BsYXlSZXR1cm5Ub3BCdXR0b24oKVwiPlxuICA8bmctbWlhbS1yZWNpcGUtZmlsdGVyc1xuICAgIFtmaWx0ZXJzXT1cImZpbHRlcnNcIlxuICAgIFttb2JpbGVGaXhlZF09XCJyZXR1cm5Ub3BCdXR0b25TaG91bGRCZURpc3BsYXllZFwiXG4gICAgW2ZpbHRlclRvUmVtb3ZlXT1cImZpbHRlclRvUmVtb3ZlXCJcbiAgICAoZmlsdGVyUmVzZXQpPVwicmVzZXRGaWx0ZXJzKClcIlxuICAgIChmaWx0ZXJDaGFuZ2VkKT1cInVwZGF0ZUZpbHRlcnMoJGV2ZW50KVwiXG4gICAgKGZpbHRlckNvbGxhcHNlZCk9XCJvbkZpbHRlckNvbGxhcHNlZCgpXCI+XG4gIDwvbmctbWlhbS1yZWNpcGUtZmlsdGVycz5cblxuICA8ZGl2IGNsYXNzPVwibWlhbS1yZWNpcGUtY2F0YWxvZ19fY29udGVudFwiIFtuZ0NsYXNzXT1cInsnZmlsdGVyLWNvbGxhcHNlZCc6IGlzRmlsdGVyQ29sbGFwc2VkfVwiPlxuICAgIDxuZy1taWFtLWNhdGFsb2ctaGVhZGVyIFxuICAgICAgW2Rpc3BsYXlSZXR1cm5CdXR0b25dPVwiIWRpc3BsYXlIb21lUGFnZVwiXG4gICAgICBbZm9yY2VkUmVjaXBlXT1cInJlY2lwZUluSGVhZGVyXCJcbiAgICAgIFt0aXRsZV09XCJkaXNwbGF5SG9tZVBhZ2UgPyBob21lUGFnZVRpdGxlIDogXG4gICAgICAgIChmaWx0ZXJzLmFkZGl0aW9uYWxGaWx0ZXJzICYmIGZpbHRlcnMuYWRkaXRpb25hbEZpbHRlcnMudGl0bGUgIT09ICcnID8gZmlsdGVycy5hZGRpdGlvbmFsRmlsdGVycy50aXRsZSA6IHRpdGxlSW5SZXNlYXJjaE1vZGUpXCJcbiAgICAgIChyZXR1cm5CdXR0b25QcmVzc2VkKT1cInJldHVyblRvSG9tZVBhZ2UoKVwiXG4gICAgICAoc2VhcmNoU3RyaW5nQ2hhbmdlZCk9XCJ1cGRhdGVTZWFyY2goJGV2ZW50KVwiPlxuICAgIDwvbmctbWlhbS1jYXRhbG9nLWhlYWRlcj5cblxuICAgIDxkaXYgKm5nSWY9XCIhZGlzcGxheUhvbWVQYWdlIGVsc2UgY2F0ZWdvcmllc0NvbXBvbmVudHNcIiBjbGFzcz1cIm1pYW0tcmVjaXBlLWNhdGFsb2dfX2xpc3RcIj5cbiAgICAgIDxuZy1taWFtLWNhdGFsb2ctbGlzdFxuICAgICAgICBbZmlsdGVyc109XCJmaWx0ZXJzXCJcbiAgICAgICAgW3JhbmRvbU1vZGVdPVwidHJ1ZVwiXG4gICAgICAgIChyZXRyaWV2ZWRSZWNpcGVzKT1cImNoYW5nZUhlYWRlckltYWdlKCRldmVudClcIlxuICAgICAgICAoZmlsdGVyUmVtb3ZlZCk9XCJyZW1vdmVGaWx0ZXIoJGV2ZW50KVwiXG4gICAgICAgIChyZWNpcGVBY3Rpb25UcmlnZ2VyZWQpPVwibWFuYWdlUmVjaXBlQWN0aW9uKCRldmVudClcIj5cbiAgICAgIDwvbmctbWlhbS1jYXRhbG9nLWxpc3Q+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctdGVtcGxhdGUgI2NhdGVnb3JpZXNDb21wb25lbnRzPlxuICAgICAgPGRpdiAqbmdJZj1cImNhdGVnb3JpZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwibWlhbS1yZWNpcGUtY2F0YWxvZ19fY2F0ZWdvcmllc1wiPlxuICAgICAgICA8bmctbWlhbS1jYXRhbG9nLWNhdGVnb3J5IFxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjYXRlZ29yeSBvZiBjYXRlZ29yaWVzXCIgXG4gICAgICAgICAgW3RpdGxlXT1cImNhdGVnb3J5LnRpdGxlXCJcbiAgICAgICAgICBbZmlsdGVyc109XCJjYXRlZ29yeS5maWx0ZXJzXCIgXG4gICAgICAgICAgKGRpc3BsYXlMaXN0KT1cImNhdGVnb3J5VGl0bGVDbGlja2VkKCRldmVudClcIj5cbiAgICAgICAgPC9uZy1taWFtLWNhdGFsb2ctY2F0ZWdvcnk+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPGRpdiAqbmdJZj1cInJldHVyblRvcEJ1dHRvblNob3VsZEJlRGlzcGxheWVkXCIgY2xhc3M9XCJtaWFtLXJlY2lwZS1jYXRhbG9nX19yZXR1cm5Ub3BcIiAoY2xpY2spPVwicmV0dXJuVG9Ub3AoKVwiPlxuICAgICAgPG5nLW1pYW0taWNvbiBoZWlnaHQ9JzMyJyB3aWR0aD0nMzInIHByaW1hcnlDb2xvcj1cInZhcigtLW0tY29sb3Itd2hpdGUpXCIgW2ljb25OYW1lXT1cImljb24uQ2hldnJvbkRvd25cIj48L25nLW1pYW0taWNvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjY3JlYXRpb25QYWdlPlxuICA8bmctbWlhbS1yZWNpcGUtc3RlcHBlciBbcmVjaXBlXT1cInJlY2lwZVRvVXBkYXRlXCIgKHJlY2lwZUNoYW5nZSk9XCJsZWF2ZUNyZWF0ZVBhZ2UoKVwiIChjYW5jZWxlZCk9XCJsZWF2ZUNyZWF0ZVBhZ2UoKVwiPjwvbmctbWlhbS1yZWNpcGUtc3RlcHBlcj5cbjwvbmctdGVtcGxhdGU+Il19
439
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBlLWNhdGFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9idWlsZHMvbWlhbS9uZy1taWFtLXNkay9wcm9qZWN0cy9uZy1taWFtL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9fd2ViLWNvbXBvbmVudHMvcmVjaXBlLWNhdGFsb2cvcmVjaXBlLWNhdGFsb2cuY29tcG9uZW50LnRzIiwibGliL193ZWItY29tcG9uZW50cy9yZWNpcGUtY2F0YWxvZy9yZWNpcGUtY2F0YWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBaUIsaUJBQWlCLEVBQVUsVUFBVSxFQUM3SCxZQUFZLEVBQUUsU0FBUyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBTyxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUUxRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkksT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXBGLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0lDYy9DLCtCQUNFO0lBQUEsNEJBQU07SUFBQSw2REFBNkM7SUFBQSxpQkFBTztJQUMxRCwrQkFDRTtJQUFBLGtDQUFnRjtJQUFsRCxvTUFBMkIsY0FBYyxFQUFFLElBQUksS0FBRTtJQUFDLG1CQUFHO0lBQUEsaUJBQVM7SUFDNUYsa0NBQWlGO0lBQW5ELHNNQUEyQixjQUFjLEVBQUUsS0FBSyxLQUFFO0lBQUMsbUJBQUc7SUFBQSxpQkFBUztJQUMvRixpQkFBTTtJQUNSLGlCQUFNOzs7O0lBRU4sK0JBQ0U7SUFBQSxnREFNdUI7SUFIckIsMlBBQThDLG1PQUFBLHlQQUFBO0lBR2hELGlCQUF1QjtJQUN6QixpQkFBTTs7O0lBTkYsZUFBbUI7SUFBbkIsd0NBQW1CLG9CQUFBOzs7O0lBVW5CLG9EQUsyQjtJQUR6QixpU0FBNEM7SUFDOUMsaUJBQTJCOzs7SUFIekIsMENBQXdCLGlDQUFBOzs7SUFINUIsK0JBQ0U7SUFBQSw0SUFLQTtJQUNGLGlCQUFNOzs7SUFMRixlQUFtQztJQUFuQyw0Q0FBbUM7OztJQUZ2Qyw0RkFDRTs7O0lBREcsbURBQTZCOzs7O0lBVXBDLCtCQUNFO0lBRG1GLGtNQUF1QjtJQUMxRyxtQ0FBc0g7SUFDeEgsaUJBQU07OztJQURxRSxlQUE2QjtJQUE3QixrREFBNkI7Ozs7O0lBckQ1Ryw4QkFFRTtJQUZ5RSxtT0FBMEM7SUFFbkgsaURBU3lCO0lBTHZCLDJOQUE4QiwrTkFBQSwyTkFBQSw4TkFBQTtJQUtoQyxpQkFBeUI7SUFFekIsOEJBQ0U7SUFBQSxpREFPeUI7SUFGdkIsK09BQTBDLDBPQUFBO0lBRTVDLGlCQUF5QjtJQUV6Qiw2RUFDRTtJQU9GLDZFQUNFO0lBU0YsK0hBQ0U7SUFVRiw4RUFDRTtJQUVKLGlCQUFNO0lBQ1IsaUJBQU07Ozs7SUFyREYsZUFBbUI7SUFBbkIsd0NBQW1CLHdEQUFBLHlDQUFBO0lBVXFCLGVBQW1EO0lBQW5ELCtFQUFtRDtJQUV6RixlQUF3QztJQUF4Qyw2REFBd0MsdUNBQUEsa05BQUE7SUFRZSxlQUF3QjtJQUF4Qiw4Q0FBd0I7SUFRNUUsZUFBa0Q7SUFBbEQsOENBQWtELGlCQUFBO0lBcUJsRCxlQUF3QztJQUF4Qyw4REFBd0M7Ozs7SUFNL0Msa0RBQTZJO0lBQTNGLHdPQUFrQyxtTkFBQTtJQUFnQyxpQkFBeUI7OztJQUFySCw4Q0FBeUI7O0FEdENuRCxNQUFNLE9BQU8sc0JBQXNCO0lBd0JqQyxZQUNTLEdBQXNCLEVBQ3RCLGtCQUFxQyxFQUNyQyxjQUE4QixFQUM5QixlQUFpQyxFQUNqQyxjQUE4QixFQUM3QixjQUE4QixFQUMvQixZQUEwQixFQUMxQixZQUF5QjtRQVB6QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0Qix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBQ3JDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUFDakMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzdCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUMvQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQTFCbEMsa0JBQWEsR0FBRyxzQ0FBc0MsQ0FBQztRQUN2RCx3QkFBbUIsR0FBRyx3QkFBd0IsQ0FBQztRQUMvQyxvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIscUNBQWdDLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBR3ZCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQWF6QyxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDdkUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEIsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNuQixRQUFRLENBQUM7Z0JBQ1AsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FDckMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7Z0JBQ3RDLHdHQUF3RztnQkFDeEcsMkZBQTJGO2dCQUMzRixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1I7Z0JBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUNoRCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsRUFDckQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNSO2FBQ0YsQ0FBQyxDQUFDLElBQUksQ0FDTCxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM1QixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsY0FBYyxDQUFDLFFBQVE7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDO2dCQUNqQixHQUFHLEVBQUUsYUFBYTtnQkFDbEIsS0FBSyxFQUFFLDJCQUEyQjtnQkFDbEMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTthQUM3QixDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDbkIsR0FBRyxFQUFFLGVBQWUsQ0FBQyxLQUFLO2dCQUMxQixLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUs7Z0JBQzVCLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsRUFBRSxFQUFFO2FBQzFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRSxJQUFJLFlBQVksRUFBRTtZQUNoQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDbkIsR0FBRyxFQUFFLFNBQVM7Z0JBQ2QsS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFBRSxFQUFFO2FBQzdDLENBQUMsQ0FBQztTQUNKO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pFLElBQUksUUFBUSxFQUFFO1lBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ25CLEdBQUcsRUFBRSxPQUFPO2dCQUNaLEtBQUssRUFBRSxPQUFPO2dCQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO2FBQ3pDLENBQUMsQ0FBQztTQUNKO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRSxJQUFJLFdBQVcsRUFBRTtZQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUNuQixHQUFHLEVBQUUsVUFBVTtnQkFDZixLQUFLLEVBQUUsVUFBVTtnQkFDakIsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUU7YUFDNUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxtQkFBbUIsRUFBQztZQUN2QixPQUFPO1NBQ1I7UUFDRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLG1CQUFtQixDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLGdCQUFnQixFQUFDO1lBQ3BCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCw2RkFBNkY7SUFDN0YsWUFBWTtRQUNWLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixVQUFVO1lBQ1YsNkVBQTZFO1lBQzdFLDJFQUEyRTtZQUMzRSw2RUFBNkU7WUFDN0UsS0FBSztZQUNMLFVBQVUsRUFBRTtnQkFDVixFQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDO2dCQUN6QyxFQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDO2dCQUMxQyxFQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDO2FBQzdDO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7Z0JBQ2pELEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBQztnQkFDdEQsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFDO2dCQUN6RCxnRkFBZ0Y7YUFDakY7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQztnQkFDdkMsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQztnQkFDdkMsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQztnQkFDdEMsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQzthQUN4QztTQUNGLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FBRTtRQUNuRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUM7WUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUFFO0lBQ3hELENBQUM7SUFFRCxZQUFZLENBQUMsTUFBYztRQUN6QixJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDN0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFzQjtRQUNsQyxJQUFJLENBQUMsT0FBTyxxQkFBUSxPQUFPLENBQUUsQ0FBQyxDQUFDLHVDQUF1QztRQUN0RSxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxVQUFVO1FBQ1IsMERBQTBEO1FBQzFELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FBRTthQUNuRCxFQUFFLGtCQUFrQjtZQUN2QixJQUFJLENBQUMsT0FBTyxxQkFBUSxJQUFJLENBQUMsT0FBTyxDQUFFLENBQUMsQ0FBQyx1Q0FBdUM7WUFDM0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFvQztRQUN2RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxlQUFlOztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2VBQzVILElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxRQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLDBDQUFFLE9BQU8sQ0FBQSxDQUFDO0lBQzlFLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBc0I7UUFDakMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUU7WUFDdEIsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO2dCQUNYLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQVksQ0FBQyxVQUFrQjtRQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQztRQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQy9DO0lBQ0gsQ0FBQztJQUVELHNCQUFzQjtRQUNwQixJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDM0csSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsT0FBaUI7O1FBQ2pDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLFdBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsMENBQUUsT0FBTyxDQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3pGLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUMsQ0FBQyw2Q0FBNkM7UUFDOUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLHVHQUF1RztRQUN2RyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBRSxHQUFHLENBQUMsRUFBRTtZQUNqQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQU0sR0FBRyxJQUFJO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBdUM7O1FBQ3hELFFBQVEsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNwQixLQUFLLFFBQVEsQ0FBQyxDQUFDO2dCQUNiLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsTUFBTTthQUNQO1lBRUQsS0FBSyxNQUFNLENBQUMsQ0FBQztnQkFDWCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEMsTUFBTTthQUNQO1lBRUQsS0FBSyxRQUFRLENBQUMsQ0FBQztnQkFDYixJQUFJLE9BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsRUFBRSxLQUFJLE9BQUEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsMENBQUUsSUFBSSxDQUFDLEVBQUUsTUFBSyxVQUFVLEVBQUU7b0JBQzdGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7d0JBQ3pELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDcEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztpQkFDSDtnQkFDRCxNQUFNO2FBQ1A7U0FDRjtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBaUI7UUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSztRQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDL0MsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUNyQyxDQUFDLFNBQVMsRUFBRSxDQUNkLENBQUM7SUFDSixDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQ2hDLENBQUM7SUFDSixDQUFDO0lBRU8sWUFBWTtRQUNsQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUMvRCxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQzFDLEdBQUcsQ0FBQyxDQUFDLFFBQXFDLEVBQUUsRUFBRTtZQUM1QyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxvRkFBb0Y7SUFDNUUsc0JBQXNCO1FBQzVCLE9BQU8sYUFBYSxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUztZQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQztTQUNwRCxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDckQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OzRGQXBVVSxzQkFBc0I7MkRBQXRCLHNCQUFzQjt1QkFDdEIsc0JBQXNCOzt1QkFFbkIsd0JBQXdCOzs7Ozs7O1FDeEJ4Qyw0QkFBNkQ7UUFDN0Qsd0VBRUU7UUF1REYsd0hBQ0U7OztRQTFERyxlQUF5QztRQUF6QywwQ0FBeUMsaUJBQUE7O2tERG9CakMsc0JBQXNCO2NBUGxDLFNBQVM7ZUFBQztnQkFDVCxRQUFRLEVBQUUsd0JBQXdCO2dCQUNsQyxXQUFXLEVBQUUsaUNBQWlDO2dCQUM5QyxTQUFTLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQztnQkFDOUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7Z0JBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEOytRQUVvQyxhQUFhO2tCQUEvQyxTQUFTO21CQUFDLHNCQUFzQjtZQUNFLFNBQVM7a0JBQTNDLFNBQVM7bUJBQUMsc0JBQXNCO1lBQ1EsY0FBYztrQkFBdEQsWUFBWTttQkFBQyx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgVmlld0NoaWxkLCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgT25Jbml0LCBFbGVtZW50UmVmLFxuICBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtYXAsIHNraXBXaGlsZSwgc3dpdGNoTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDYXRhbG9nQ2F0ZWdvcnlDb21wb25lbnQgfSBmcm9tICcuLi9jYXRhbG9nLWNhdGVnb3J5L2NhdGFsb2ctY2F0ZWdvcnkuY29tcG9uZW50JztcbmltcG9ydCB7IFJlY2lwZSB9IGZyb20gJy4uLy4uL19tb2RlbHMnO1xuaW1wb3J0IHsgUmVjaXBlVHlwZVNlcnZpY2UsIFNwb25zb3JTZXJ2aWNlLCBQYWNrYWdlU2VydmljZSwgU3VwcGxpZXJzU2VydmljZSwgUmVjaXBlc1NlcnZpY2UsIFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzJztcbmltcG9ydCB7IEljb24gfSBmcm9tICcuLi8uLi9fdHlwZXMvaWNvbi5lbnVtJztcbmltcG9ydCB7IENhdGFsb2dIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi9jYXRhbG9nLWhlYWRlci9jYXRhbG9nLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVjaXBlRmlsdGVyLCBSZWNpcGVGaWx0ZXJzIH0gZnJvbSAnLi4vLi4vX3R5cGVzL3JlY2lwZS1maWx0ZXJzJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lZGlhTWF0Y2hlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgRG9jdW1lbnRDb2xsZWN0aW9uIH0gZnJvbSAnbmd4LWpzb25hcGknO1xuaW1wb3J0IHsgUGFja2FnZSB9IGZyb20gJy4uLy4uL19tb2RlbHMvcGFja2FnZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLW1pYW0tcmVjaXBlLWNhdGFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVjaXBlLWNhdGFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZWNpcGUtY2F0YWxvZy5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBSZWNpcGVDYXRhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKENhdGFsb2dIZWFkZXJDb21wb25lbnQpIGNhdGFsb2dIZWFkZXI6IENhdGFsb2dIZWFkZXJDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ21pYW1DYXRhbG9nVG9wQW5jaG9yJykgdG9wQW5jaG9yOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkcmVuKENhdGFsb2dDYXRlZ29yeUNvbXBvbmVudCkgIGNhdGVnb3JpZXNDb21wITogUXVlcnlMaXN0PENhdGFsb2dDYXRlZ29yeUNvbXBvbmVudD47XG5cbiAgZmlsdGVyczogUmVjaXBlRmlsdGVycztcbiAgaG9tZVBhZ2VUaXRsZSA9ICdRdVxcJ2VzdC1jZSBxdWkgdm91cyBmZXJhaXQgcGxhaXNpciA/JztcbiAgdGl0bGVJblJlc2VhcmNoTW9kZSA9ICdSw6lzdWx0YXRzIGRlIHJlY2hlcmNoZSc7XG4gIGRpc3BsYXlIb21lUGFnZSA9IHRydWU7XG4gIGlzRmlsdGVyQ29sbGFwc2VkID0gZmFsc2U7XG4gIHJldHVyblRvcEJ1dHRvblNob3VsZEJlRGlzcGxheWVkID0gZmFsc2U7XG4gIGljb24gPSBJY29uO1xuICBjYXRlZ29yaWVzID0gW107XG4gIHJlY2lwZUluSGVhZGVyOiBSZWNpcGU7XG4gIGNyZWF0aW5nUmVjaXBlID0gZmFsc2U7XG4gIHJlY2lwZVRvVXBkYXRlOiBSZWNpcGU7XG4gIGZpbHRlclRvUmVtb3ZlOiBzdHJpbmc7XG4gIGlzTW9iaWxlID0gZmFsc2U7XG4gIGxpc3RJc0VtcHR5ID0gZmFsc2U7XG4gIHNob3dVc2VyRmVlZGJhY2sgPSBmYWxzZTtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgc3VwcGxpZXJJZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwdWJsaWMgcmVjaXBlVHlwZXNTZXJ2aWNlOiBSZWNpcGVUeXBlU2VydmljZSxcbiAgICBwdWJsaWMgc3BvbnNvclNlcnZpY2U6IFNwb25zb3JTZXJ2aWNlLFxuICAgIHB1YmxpYyBzdXBwbGllclNlcnZpY2U6IFN1cHBsaWVyc1NlcnZpY2UsXG4gICAgcHVibGljIHBhY2thZ2VTZXJ2aWNlOiBQYWNrYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHJlY2lwZXNTZXJ2aWNlOiBSZWNpcGVzU2VydmljZSxcbiAgICBwdWJsaWMgbWVkaWFNYXRjaGVyOiBNZWRpYU1hdGNoZXIsXG4gICAgcHVibGljIHVzZXJzU2VydmljZTogVXNlclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5pc01vYmlsZSA9IG1lZGlhTWF0Y2hlci5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiAxMDIycHgpJykubWF0Y2hlcztcbiAgICB0aGlzLmlzRmlsdGVyQ29sbGFwc2VkID0gdGhpcy5pc01vYmlsZTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucmVzZXRGaWx0ZXJzKCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXG4gICAgICBmb3JrSm9pbihbXG4gICAgICAgIHRoaXMucmVjaXBlVHlwZXNTZXJ2aWNlLmdldFR5cGVzKCkucGlwZShcbiAgICAgICAgICBza2lwV2hpbGUodHlwZXMgPT4gdHlwZXMubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICAvLyByZWNpcGVUeXBlc1NlcnZpY2UuZ2V0VHlwZXMoKSBjb21lcyBmcm9tIGEgYmVoYXZpb3Igc3ViamVjdCwgaXQgZG9lcyBub3QgZW1pdCB0aGUgY29tcGxldGUoKSBmdW5jdGlvblxuICAgICAgICAgIC8vIHlvdSBhYnNvbHV0bHkgbmVlZCBhIHRha2UoMSkgb3IgY2FsbCBjb21wbGV0ZSB5b3Vyc2VsZiB0byB0cmlnZ2VyIHRoZSBmb3Jram9pbiBzdWJzY3JpYmVcbiAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICksXG4gICAgICAgIHRoaXMuc3VwcGxpZXJTZXJ2aWNlLnN1cHBsaWVyJC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgICAgIHNraXBXaGlsZShzdXBwID0+IHN1cHAgPT09IHVuZGVmaW5lZCB8fCBzdXBwID09IG51bGwpLFxuICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgKVxuICAgICAgXSkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5zdXBwbGllcklkID0gcmVzWzFdLmlkO1xuICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRQYWNrYWdlcygpO1xuICAgICAgICB9KVxuICAgICAgKS5zdWJzY3JpYmUoKSxcbiAgICAgIHRoaXMuYXNzZXNzU2hvd1VzZXJGZWVkYmFjaygpXG4gICAgXTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBpbml0Q2F0ZWdvcmllcyhwYWNrYWdlcykge1xuICAgIHRoaXMuY2F0ZWdvcmllcyA9IFt7XG4gICAgICBrZXk6ICdzdWdnZXN0aW9ucycsXG4gICAgICB0aXRsZTogJ1N1Z2dlc3Rpb25zIGRlIGxhIHNlbWFpbmUnLFxuICAgICAgZmlsdGVyczogeyBzdWdnZXN0ZWQ6IHRydWUgfVxuICAgIH1dO1xuICAgIHBhY2thZ2VzLmRhdGEuZm9yRWFjaChjYXRlZ29yeVBhY2thZ2UgPT4ge1xuICAgICAgdGhpcy5jYXRlZ29yaWVzLnB1c2goe1xuICAgICAgICBrZXk6IGNhdGVnb3J5UGFja2FnZS50aXRsZSxcbiAgICAgICAgdGl0bGU6IGNhdGVnb3J5UGFja2FnZS50aXRsZSxcbiAgICAgICAgZmlsdGVyczogeyBwYWNrYWdlczogY2F0ZWdvcnlQYWNrYWdlLmlkIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RhcnRlcnNUeXBlID0gdGhpcy5yZWNpcGVUeXBlc1NlcnZpY2UuZ2V0VHlwZUJ5TmFtZSgnZW50csOpZScpO1xuICAgIGlmIChzdGFydGVyc1R5cGUpIHtcbiAgICAgIHRoaXMuY2F0ZWdvcmllcy5wdXNoKHtcbiAgICAgICAga2V5OiAnZW50cmVlcycsXG4gICAgICAgIHRpdGxlOiAnRW50csOpZXMnLFxuICAgICAgICBmaWx0ZXJzOiB7IHJlY2lwZV90eXBlX2lkOiBzdGFydGVyc1R5cGUuaWQgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWFpblR5cGUgPSB0aGlzLnJlY2lwZVR5cGVzU2VydmljZS5nZXRUeXBlQnlOYW1lKCdwbGF0IHByaW5jaXBhbCcpO1xuICAgIGlmIChtYWluVHlwZSkge1xuICAgICAgdGhpcy5jYXRlZ29yaWVzLnB1c2goe1xuICAgICAgICBrZXk6ICdwbGF0cycsXG4gICAgICAgIHRpdGxlOiAnUGxhdHMnLFxuICAgICAgICBmaWx0ZXJzOiB7IHJlY2lwZV90eXBlX2lkOiBtYWluVHlwZS5pZCB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXNzZXJ0VHlwZSA9IHRoaXMucmVjaXBlVHlwZXNTZXJ2aWNlLmdldFR5cGVCeU5hbWUoJ2Rlc3NlcnQnKTtcbiAgICBpZiAoZGVzc2VydFR5cGUpIHtcbiAgICAgIHRoaXMuY2F0ZWdvcmllcy5wdXNoKHtcbiAgICAgICAga2V5OiAnZGVzc2VydHMnLFxuICAgICAgICB0aXRsZTogJ0Rlc3NlcnRzJyxcbiAgICAgICAgZmlsdGVyczogeyByZWNpcGVfdHlwZV9pZDogZGVzc2VydFR5cGUuaWQgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0Q2F0ZWdvcnlGcm9tVXJsKCkge1xuICAgIGNvbnN0IHBhcmFtc1N0cmluZyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XG4gICAgY29uc3QgcGFyYW1zQXJyYXkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtc1N0cmluZyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRDYXRlZ29yeUtleSA9IHBhcmFtc0FycmF5LmdldCgnY2F0YWxvZ0NhdGVnb3J5Jyk7XG4gICAgaWYgKCFzZWxlY3RlZENhdGVnb3J5S2V5KXtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWRDYXRlZ29yeSA9IHRoaXMuY2F0ZWdvcmllcy5maW5kKChjYXQpID0+IGNhdC5rZXkgPT09IHNlbGVjdGVkQ2F0ZWdvcnlLZXkpO1xuICAgIGlmICghc2VsZWN0ZWRDYXRlZ29yeSl7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2F0ZWdvcnlUaXRsZUNsaWNrZWQoc2VsZWN0ZWRDYXRlZ29yeSk7XG4gIH1cblxuICAvLyBVc2VkIG9uIGxvYWQgdG8gYnVpbGQgdGhlIGZpbHRlcnMgYXR0cmlidXRlLCBhbmQgb24gY2xpY2sgb24gdGhlIGxpbmsgdG8gcmVzZXQgdGhlIGZpbHRlcnNcbiAgcmVzZXRGaWx0ZXJzKCkge1xuICAgIHRoaXMuZmlsdGVycyA9IHtcbiAgICAgIC8vIHR5cGU6IFtcbiAgICAgIC8vICAge25hbWU6IHJlY2lwZVR5cGVzU2VydmljZS5nZXRUeXBlKDEpLmlkLCB2YWx1ZTogZmFsc2UsIHRleHQ6ICdFbnRyw6llcyd9LFxuICAgICAgLy8gICB7bmFtZTogcmVjaXBlVHlwZXNTZXJ2aWNlLmdldFR5cGUoMikuaWQsIHZhbHVlOiBmYWxzZSwgdGV4dDogJ1BsYXRzJ30sXG4gICAgICAvLyAgIHtuYW1lOiByZWNpcGVUeXBlc1NlcnZpY2UuZ2V0VHlwZSgzKS5pZCwgdmFsdWU6IGZhbHNlLCB0ZXh0OiAnRGVzc2VydHMnfVxuICAgICAgLy8gXSxcbiAgICAgIGRpZmZpY3VsdHk6IFtcbiAgICAgICAge25hbWU6ICcxJywgdmFsdWU6IGZhbHNlLCB0ZXh0OiAnRmFjaWxlJ30sXG4gICAgICAgIHtuYW1lOiAnMicsIHZhbHVlOiBmYWxzZSwgdGV4dDogJ01veWVubmUnfSxcbiAgICAgICAge25hbWU6ICczJywgdmFsdWU6IGZhbHNlLCB0ZXh0OiAnRGlmZmljaWxlJ31cbiAgICAgIF0sXG4gICAgICBjb3N0OiBbXG4gICAgICAgIHtuYW1lOiAnMC01JywgdmFsdWU6IGZhbHNlLCB0ZXh0OiAnQmFzICjiiYgg4omkIDXigqwpJ30sXG4gICAgICAgIHtuYW1lOiAnNS0xMCcsIHZhbHVlOiBmYWxzZSwgdGV4dDogJ01veWVuICjiiYggNS0xMOKCrCkgJ30sXG4gICAgICAgIHtuYW1lOiAnMTAtMTAwMCcsIHZhbHVlOiBmYWxzZSwgdGV4dDogJ8OJbGV2w6kgKOKJiCDiiaUgMTDigqwpICd9XG4gICAgICAgIC8vIHdlIHNldCBhIGxpbWl0IGF0IDEwMDDigqwgbWF4LCBpZiBhIHJlY2lwZSBjb3N0IG1vcmUgc2hvdWxkIGJlIG5vbiBzZW5zZSBhbnl3YXlcbiAgICAgIF0sXG4gICAgICB0aW1lOiBbXG4gICAgICAgIHtuYW1lOiAnMTUnLCB2YWx1ZTogZmFsc2UsIHRleHQ6ICcxNW0nfSxcbiAgICAgICAge25hbWU6ICczMCcsIHZhbHVlOiBmYWxzZSwgdGV4dDogJzMwbSd9LFxuICAgICAgICB7bmFtZTogJzYwJywgdmFsdWU6IGZhbHNlLCB0ZXh0OiAnMWgnfSxcbiAgICAgICAge25hbWU6ICcxMjAnLCB2YWx1ZTogZmFsc2UsIHRleHQ6ICcyaCd9XG4gICAgICBdLFxuICAgIH07XG4gICAgaWYgKHRoaXMuY2F0YWxvZ0hlYWRlcikgeyB0aGlzLmNhdGFsb2dIZWFkZXIucmVzZXRTZWFyY2hTdHJpbmcoKTsgfVxuICAgIHRoaXMuZmlsdGVycy5zZWFyY2ggPSAnJztcbiAgICB0aGlzLmxpc3RJc0VtcHR5ID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmRpc3BsYXlIb21lUGFnZSl7IHRoaXMucmV0dXJuVG9Ib21lUGFnZSgpOyB9XG4gIH1cblxuICB1cGRhdGVTZWFyY2goc2VhcmNoOiBzdHJpbmcpIHtcbiAgICBpZiAoc2VhcmNoICE9PSB0aGlzLmZpbHRlcnMuc2VhcmNoKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuc2VhcmNoID0gc2VhcmNoO1xuICAgICAgdGhpcy5yZWxvYWRMaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRmlsdGVycyhmaWx0ZXJzOiBSZWNpcGVGaWx0ZXJzKSB7XG4gICAgdGhpcy5maWx0ZXJzID0geyAuLi5maWx0ZXJzIH07IC8vIE5lY2Vzc2FyeSB0byB0cmlnZ2VyIHRoZSBuZ09uQ2hhbmdlc1xuICAgIHRoaXMuZmlsdGVyVG9SZW1vdmUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5saXN0SXNFbXB0eSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmlzTW9iaWxlKSB7XG4gICAgICB0aGlzLnJldHVyblRvVG9wKCk7XG4gICAgfVxuICAgIHRoaXMucmVsb2FkTGlzdCgpO1xuICB9XG5cbiAgcmVsb2FkTGlzdCgpIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZmlsdGVycyBub3Igc2VhcmNoLCByZXR1cm4gdG8gaG9tZSBwYWdlXG4gICAgaWYgKHRoaXMuYXJlRmlsdGVyc0VtcHR5KCkpIHsgdGhpcy5yZXR1cm5Ub0hvbWVQYWdlKCk7IH1cbiAgICBlbHNlIHsgLy8gUmVsb2FkIHRoZSBsaXN0XG4gICAgICB0aGlzLmZpbHRlcnMgPSB7IC4uLnRoaXMuZmlsdGVycyB9OyAvLyBOZWNlc3NhcnkgdG8gdHJpZ2dlciB0aGUgbmdPbkNoYW5nZXNcbiAgICAgIHRoaXMuZGlzcGxheUhvbWVQYWdlID0gZmFsc2U7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgY2F0ZWdvcnlUaXRsZUNsaWNrZWQoZXZlbnQ6IHt0aXRsZTogc3RyaW5nLCBmaWx0ZXJzOiBhbnl9KSB7XG4gICAgdGhpcy5yZXR1cm5Ub1RvcCgpO1xuICAgIHRoaXMuZmlsdGVycy5hZGRpdGlvbmFsRmlsdGVycyA9IHsgZmlsdGVyczogZXZlbnQuZmlsdGVycywgdGl0bGU6IGV2ZW50LnRpdGxlIH07XG4gICAgdGhpcy5yZWxvYWRMaXN0KCk7XG4gIH1cblxuICBhcmVGaWx0ZXJzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNGaWVsZEVtcHR5KHRoaXMuZmlsdGVycy5kaWZmaWN1bHR5KSAmJiB0aGlzLmlzRmllbGRFbXB0eSh0aGlzLmZpbHRlcnMuY29zdCkgJiYgdGhpcy5pc0ZpZWxkRW1wdHkodGhpcy5maWx0ZXJzLnRpbWUpXG4gICAgICAmJiB0aGlzLmZpbHRlcnMuc2VhcmNoID09PSAnJyAmJiAhdGhpcy5maWx0ZXJzLmFkZGl0aW9uYWxGaWx0ZXJzPy5maWx0ZXJzO1xuICB9XG5cbiAgaXNGaWVsZEVtcHR5KGZpbHRlcjogUmVjaXBlRmlsdGVyW10pIHtcbiAgICBmb3IgKGNvbnN0IGYgb2YgZmlsdGVyKSB7XG4gICAgICBpZiAoZi52YWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmVtb3ZlRmlsdGVyKGZpbHRlclRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuZmlsdGVyVG9SZW1vdmUgPSBmaWx0ZXJUZXh0O1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHJldHVyblRvVG9wKCkge1xuICAgIGlmICh0aGlzLnRvcEFuY2hvcikge1xuICAgICAgdGhpcy50b3BBbmNob3IubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIGRpc3BsYXlSZXR1cm5Ub3BCdXR0b24oKSB7XG4gICAgdGhpcy5yZXR1cm5Ub3BCdXR0b25TaG91bGRCZURpc3BsYXllZCA9IHRoaXMudG9wQW5jaG9yLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIDwgLTQwMDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBjaGFuZ2VIZWFkZXJJbWFnZShyZWNpcGVzOiBSZWNpcGVbXSkge1xuICAgIGlmIChyZWNpcGVzLmxlbmd0aCA+IDAgJiYgdGhpcy5maWx0ZXJzLmFkZGl0aW9uYWxGaWx0ZXJzPy5maWx0ZXJzICYmICF0aGlzLnJlY2lwZUluSGVhZGVyKSB7XG4gICAgICB0aGlzLnJlY2lwZUluSGVhZGVyID0gcmVjaXBlc1swXTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm5Ub0hvbWVQYWdlKCkge1xuICAgIHRoaXMuZGlzcGxheUhvbWVQYWdlID0gdHJ1ZTtcbiAgICB0aGlzLnJlY2lwZUluSGVhZGVyID0gdW5kZWZpbmVkOyAvLyBEb24ndCBmb3JjZSBhIHJlY2lwZSBpbiBoZWFkZXIgb24gaG9tZVBhZ2VcbiAgICB0aGlzLnJlc2V0RmlsdGVycygpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG9uRmlsdGVyQ29sbGFwc2VkKCkge1xuICAgIHRoaXMuaXNGaWx0ZXJDb2xsYXBzZWQgPSAhdGhpcy5pc0ZpbHRlckNvbGxhcHNlZDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgLy8gdG8gdHJpZ2dlciBhZnRlciB0aGUgZGV0ZWN0Q2hhbmdlcyBiZWNhdXNlIHdlIG5lZWQgdG8gYWxyZWFkIGhhdmUgdGhlIGRpc3BsYXkgY2hhbmdlIHRvIHVwZGF0ZSBjYXJkc1xuICAgIHRoaXMuY2F0ZWdvcmllc0NvbXAuZm9yRWFjaCggY2F0ID0+IHtcbiAgICAgIGNhdC51cGRhdGVXaWR0aCgpO1xuICAgIH0pO1xuICB9XG5cbiAgZ29Ub0NyZWF0ZVBhZ2UocmVjaXBlID0gbnVsbCkge1xuICAgIHRoaXMuY3JlYXRpbmdSZWNpcGUgPSB0cnVlO1xuICAgIHRoaXMucmVjaXBlVG9VcGRhdGUgPSByZWNpcGU7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMucmV0dXJuVG9Ub3AoKTtcbiAgfVxuXG4gIGxlYXZlQ3JlYXRlUGFnZSgpIHtcbiAgICB0aGlzLmNyZWF0aW5nUmVjaXBlID0gZmFsc2U7XG4gICAgdGhpcy5yZWxvYWRMaXN0KCk7XG4gICAgdGhpcy5yZXR1cm5Ub1RvcCgpO1xuICB9XG5cbiAgbWFuYWdlUmVjaXBlQWN0aW9uKGV2ZW50OiB7YWN0aW9uOiBzdHJpbmcsIHJlY2lwZTogUmVjaXBlfSkge1xuICAgIHN3aXRjaCAoZXZlbnQuYWN0aW9uKSB7XG4gICAgICBjYXNlICdDUkVBVEUnOiB7XG4gICAgICAgIHRoaXMuZ29Ub0NyZWF0ZVBhZ2UoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ0VESVQnOiB7XG4gICAgICAgIHRoaXMuZ29Ub0NyZWF0ZVBhZ2UoZXZlbnQucmVjaXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ0RFTEVURSc6IHtcbiAgICAgICAgaWYgKGV2ZW50LnJlY2lwZT8uaWQgJiYgZXZlbnQucmVjaXBlLnJlbGF0aW9uc2hpcHNbJ3JlY2lwZS1wcm92aWRlciddPy5kYXRhLmlkID09PSAncGVyc29uYWwnKSB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICB0aGlzLnJlY2lwZXNTZXJ2aWNlLmRlbGV0ZShldmVudC5yZWNpcGUuaWQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucmVsb2FkTGlzdCgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzTGlzdEVtcHR5KHJlY2lwZXM6IFJlY2lwZVtdKSB7XG4gICAgdGhpcy5saXN0SXNFbXB0eSA9IHJlY2lwZXMubGVuZ3RoID09PSAwO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHNldFVzZXJQcmVmZXJlbmNlKHByZWYsIHN0YXRlKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnVzZXJzU2VydmljZS5zZXRQcmVmZXJlbmNlKHByZWYsIHN0YXRlKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5sb2FkUGFja2FnZXMoKSlcbiAgICAgICkuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgcmVsb2FkUGFja2FnZXMoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmxvYWRQYWNrYWdlcygpLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFBhY2thZ2VzKCk6IE9ic2VydmFibGU8RG9jdW1lbnRDb2xsZWN0aW9uPFBhY2thZ2U+PiB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZVNlcnZpY2UuY2F0ZWdvcmllc19mb3IoW3RoaXMuc3VwcGxpZXJJZF0pLnBpcGUoXG4gICAgICBza2lwV2hpbGUocGFja2FnZXMgPT4gcGFja2FnZXMuaXNfbG9hZGluZyksXG4gICAgICB0YXAoKHBhY2thZ2VzOiBEb2N1bWVudENvbGxlY3Rpb248UGFja2FnZT4pID0+IHtcbiAgICAgICAgdGhpcy5pbml0Q2F0ZWdvcmllcyhwYWNrYWdlcyk7XG4gICAgICAgIHRoaXMuc2VsZWN0Q2F0ZWdvcnlGcm9tVXJsKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNob3cgZmVlZGJhY2sgYmxvY2sgb25seSBpZiB1c2VyIGlzIGxvZ2dlZCBhbmQgdGhlIGNoaWxkcmVuIHByZWZlcmVuY2UgaXMgdW5rbm93blxuICBwcml2YXRlIGFzc2Vzc1Nob3dVc2VyRmVlZGJhY2soKTogU3Vic2NyaXB0aW9uIHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnVzZXJzU2VydmljZS5pc0xvZ2dlZCQsXG4gICAgICB0aGlzLnVzZXJzU2VydmljZS5wcmVmZXJlbmNlRGVmaW5lZCgnaGFzX2NoaWxkcmVuJylcbiAgICBdKS5zdWJzY3JpYmUocmVzdWx0cyA9PiB7XG4gICAgICBjb25zdCBsb2dnZWQgPSByZXN1bHRzWzBdO1xuICAgICAgY29uc3QgcHJlZmVyZW5jZURlZmluZWQgPSByZXN1bHRzWzFdO1xuICAgICAgdGhpcy5zaG93VXNlckZlZWRiYWNrID0gbG9nZ2VkICYmICFwcmVmZXJlbmNlRGVmaW5lZDtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiAjbWlhbUNhdGFsb2dUb3BBbmNob3IgY2xhc3M9XCJtaWFtLWNhdGFsb2ctYW5jaG9yXCI+PC9kaXY+XG48ZGl2ICpuZ0lmPVwiIWNyZWF0aW5nUmVjaXBlIGVsc2UgY3JlYXRpb25QYWdlXCIgY2xhc3M9XCJtaWFtLXJlY2lwZS1jYXRhbG9nXCIgKHdpbmRvdzpzY3JvbGwpPVwiZGlzcGxheVJldHVyblRvcEJ1dHRvbigpXCI+XG5cbiAgPG5nLW1pYW0tcmVjaXBlLWZpbHRlcnNcbiAgICBbZmlsdGVyc109XCJmaWx0ZXJzXCJcbiAgICBbbW9iaWxlRml4ZWRdPVwicmV0dXJuVG9wQnV0dG9uU2hvdWxkQmVEaXNwbGF5ZWRcIlxuICAgIFtmaWx0ZXJUb1JlbW92ZV09XCJmaWx0ZXJUb1JlbW92ZVwiXG4gICAgKGZpbHRlclJlc2V0KT1cInJlc2V0RmlsdGVycygpXCJcbiAgICAoZmlsdGVyQ2hhbmdlZCk9XCJ1cGRhdGVGaWx0ZXJzKCRldmVudClcIlxuICAgIChmaWx0ZXJDb2xsYXBzZWQpPVwib25GaWx0ZXJDb2xsYXBzZWQoKVwiXG4gICAgKHByZWZlcmVuY2VzQ2hhbmdlZCk9XCJyZWxvYWRQYWNrYWdlcygpXCJcbiAgPlxuICA8L25nLW1pYW0tcmVjaXBlLWZpbHRlcnM+XG5cbiAgPGRpdiBjbGFzcz1cIm1pYW0tcmVjaXBlLWNhdGFsb2dfX2NvbnRlbnRcIiBbbmdDbGFzc109XCJ7J2ZpbHRlci1jb2xsYXBzZWQnOiBpc0ZpbHRlckNvbGxhcHNlZH1cIj5cbiAgICA8bmctbWlhbS1jYXRhbG9nLWhlYWRlciBcbiAgICAgIFtkaXNwbGF5UmV0dXJuQnV0dG9uXT1cIiFkaXNwbGF5SG9tZVBhZ2VcIlxuICAgICAgW2ZvcmNlZFJlY2lwZV09XCJyZWNpcGVJbkhlYWRlclwiXG4gICAgICBbdGl0bGVdPVwiZGlzcGxheUhvbWVQYWdlID8gaG9tZVBhZ2VUaXRsZSA6IFxuICAgICAgICAoZmlsdGVycy5hZGRpdGlvbmFsRmlsdGVycyAmJiBmaWx0ZXJzLmFkZGl0aW9uYWxGaWx0ZXJzLnRpdGxlICE9PSAnJyA/IGZpbHRlcnMuYWRkaXRpb25hbEZpbHRlcnMudGl0bGUgOiB0aXRsZUluUmVzZWFyY2hNb2RlKVwiXG4gICAgICAocmV0dXJuQnV0dG9uUHJlc3NlZCk9XCJyZXR1cm5Ub0hvbWVQYWdlKClcIlxuICAgICAgKHNlYXJjaFN0cmluZ0NoYW5nZWQpPVwidXBkYXRlU2VhcmNoKCRldmVudClcIj5cbiAgICA8L25nLW1pYW0tY2F0YWxvZy1oZWFkZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWlhbS1yZWNpcGUtY2F0YWxvZ19fY29udGVudF9fdXNlci1mZWVkYmFja1wiICpuZ0lmPVwic2hvd1VzZXJGZWVkYmFja1wiPlxuICAgICAgPHNwYW4+VW5lIHBldGl0ZSBxdWVzdGlvbiA6IEF2ZXotdm91cyBkZXMgZW5mYW50cyA/PC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cIm1pYW0tcmVjaXBlLWNhdGFsb2dfX2NvbnRlbnRfX3VzZXItZmVlZGJhY2tfX2FjdGlvbnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm0tYnV0dG9uLWdyZXlcIiAoY2xpY2spPVwic2V0VXNlclByZWZlcmVuY2UoJ2hhc19jaGlsZHJlbicsIHRydWUpXCI+T3VpPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJtLWJ1dHRvbi1ncmV5XCIgKGNsaWNrKT1cInNldFVzZXJQcmVmZXJlbmNlKCdoYXNfY2hpbGRyZW4nLCBmYWxzZSlcIj5Ob248L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFkaXNwbGF5SG9tZVBhZ2UgZWxzZSBjYXRlZ29yaWVzQ29tcG9uZW50c1wiIGNsYXNzPVwibWlhbS1yZWNpcGUtY2F0YWxvZ19fbGlzdFwiPlxuICAgICAgPG5nLW1pYW0tY2F0YWxvZy1saXN0XG4gICAgICAgIFtmaWx0ZXJzXT1cImZpbHRlcnNcIlxuICAgICAgICBbcmFuZG9tTW9kZV09XCJ0cnVlXCJcbiAgICAgICAgKHJldHJpZXZlZFJlY2lwZXMpPVwiY2hhbmdlSGVhZGVySW1hZ2UoJGV2ZW50KVwiXG4gICAgICAgIChmaWx0ZXJSZW1vdmVkKT1cInJlbW92ZUZpbHRlcigkZXZlbnQpXCJcbiAgICAgICAgKHJlY2lwZUFjdGlvblRyaWdnZXJlZCk9XCJtYW5hZ2VSZWNpcGVBY3Rpb24oJGV2ZW50KVwiPlxuICAgICAgPC9uZy1taWFtLWNhdGFsb2ctbGlzdD5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjY2F0ZWdvcmllc0NvbXBvbmVudHM+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY2F0ZWdvcmllcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJtaWFtLXJlY2lwZS1jYXRhbG9nX19jYXRlZ29yaWVzXCI+XG4gICAgICAgIDxuZy1taWFtLWNhdGFsb2ctY2F0ZWdvcnkgXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGNhdGVnb3JpZXNcIiBcbiAgICAgICAgICBbdGl0bGVdPVwiY2F0ZWdvcnkudGl0bGVcIlxuICAgICAgICAgIFtmaWx0ZXJzXT1cImNhdGVnb3J5LmZpbHRlcnNcIiBcbiAgICAgICAgICAoZGlzcGxheUxpc3QpPVwiY2F0ZWdvcnlUaXRsZUNsaWNrZWQoJGV2ZW50KVwiPlxuICAgICAgICA8L25nLW1pYW0tY2F0YWxvZy1jYXRlZ29yeT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8ZGl2ICpuZ0lmPVwicmV0dXJuVG9wQnV0dG9uU2hvdWxkQmVEaXNwbGF5ZWRcIiBjbGFzcz1cIm1pYW0tcmVjaXBlLWNhdGFsb2dfX3JldHVyblRvcFwiIChjbGljayk9XCJyZXR1cm5Ub1RvcCgpXCI+XG4gICAgICA8bmctbWlhbS1pY29uIGhlaWdodD0nMzInIHdpZHRoPSczMicgcHJpbWFyeUNvbG9yPVwidmFyKC0tbS1jb2xvci13aGl0ZSlcIiBbaWNvbk5hbWVdPVwiaWNvbi5DaGV2cm9uRG93blwiPjwvbmctbWlhbS1pY29uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPG5nLXRlbXBsYXRlICNjcmVhdGlvblBhZ2U+XG4gIDxuZy1taWFtLXJlY2lwZS1zdGVwcGVyIFtyZWNpcGVdPVwicmVjaXBlVG9VcGRhdGVcIiAocmVjaXBlQ2hhbmdlKT1cImxlYXZlQ3JlYXRlUGFnZSgpXCIgKGNhbmNlbGVkKT1cImxlYXZlQ3JlYXRlUGFnZSgpXCI+PC9uZy1taWFtLXJlY2lwZS1zdGVwcGVyPlxuPC9uZy10ZW1wbGF0ZT4iXX0=