@vgip/meta-ui 1.5.6 → 1.5.7

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 (98) hide show
  1. package/esm2020/lib/fieldAbstract.mjs +6 -6
  2. package/esm2020/lib/fieldComposite/index.mjs +65 -0
  3. package/esm2020/lib/fieldList/index.mjs +68 -0
  4. package/esm2020/lib/fieldReference/index.mjs +823 -0
  5. package/esm2020/lib/fieldSelect/index.mjs +481 -0
  6. package/esm2020/lib/index.mjs +10 -18
  7. package/esm2020/lib/layout/index.mjs +151 -0
  8. package/esm2020/lib/metaField/index.mjs +139 -0
  9. package/esm2020/lib/refDialog/index.mjs +127 -0
  10. package/esm2020/lib/resource/index.mjs +480 -0
  11. package/esm2020/lib/resourceCard/index.mjs +42 -0
  12. package/esm2020/lib/services/metaReference/index.mjs +2 -3
  13. package/fesm2015/vgip-meta-ui-fieldAbstract-2d0882f1.mjs +382 -0
  14. package/fesm2015/vgip-meta-ui-fieldAbstract-2d0882f1.mjs.map +1 -0
  15. package/fesm2015/vgip-meta-ui-index-0068fb77.mjs +368 -0
  16. package/fesm2015/vgip-meta-ui-index-0068fb77.mjs.map +1 -0
  17. package/fesm2015/vgip-meta-ui-index-1911ddae.mjs +1882 -0
  18. package/fesm2015/vgip-meta-ui-index-1911ddae.mjs.map +1 -0
  19. package/fesm2015/vgip-meta-ui-index-3488da98.mjs +130 -0
  20. package/fesm2015/vgip-meta-ui-index-3488da98.mjs.map +1 -0
  21. package/fesm2015/vgip-meta-ui-index-3f6cd57a.mjs +74 -0
  22. package/fesm2015/vgip-meta-ui-index-3f6cd57a.mjs.map +1 -0
  23. package/fesm2015/vgip-meta-ui-index-5615e618.mjs +95 -0
  24. package/fesm2015/vgip-meta-ui-index-5615e618.mjs.map +1 -0
  25. package/fesm2015/vgip-meta-ui-index-65c10356.mjs +57 -0
  26. package/fesm2015/vgip-meta-ui-index-65c10356.mjs.map +1 -0
  27. package/fesm2015/vgip-meta-ui-index-6dcd556a.mjs +145 -0
  28. package/fesm2015/vgip-meta-ui-index-6dcd556a.mjs.map +1 -0
  29. package/fesm2015/vgip-meta-ui-index-8f5be5a7.mjs +24 -0
  30. package/fesm2015/vgip-meta-ui-index-8f5be5a7.mjs.map +1 -0
  31. package/fesm2015/vgip-meta-ui-index-934aeabf.mjs +68 -0
  32. package/fesm2015/vgip-meta-ui-index-934aeabf.mjs.map +1 -0
  33. package/fesm2015/vgip-meta-ui-index-9b5ee0c4.mjs +88 -0
  34. package/fesm2015/vgip-meta-ui-index-9b5ee0c4.mjs.map +1 -0
  35. package/fesm2015/vgip-meta-ui-index-b925a3a8.mjs +856 -0
  36. package/fesm2015/vgip-meta-ui-index-b925a3a8.mjs.map +1 -0
  37. package/fesm2015/vgip-meta-ui-index-dc1b440d.mjs +489 -0
  38. package/fesm2015/vgip-meta-ui-index-dc1b440d.mjs.map +1 -0
  39. package/fesm2015/vgip-meta-ui-index-f026e8e5.mjs +71 -0
  40. package/fesm2015/vgip-meta-ui-index-f026e8e5.mjs.map +1 -0
  41. package/fesm2015/vgip-meta-ui-index-fa0b1b8b.mjs +460 -0
  42. package/fesm2015/vgip-meta-ui-index-fa0b1b8b.mjs.map +1 -0
  43. package/fesm2015/vgip-meta-ui-metaModel.pipe-725f401c.mjs +28 -0
  44. package/fesm2015/vgip-meta-ui-metaModel.pipe-725f401c.mjs.map +1 -0
  45. package/fesm2015/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs +51 -0
  46. package/fesm2015/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs.map +1 -0
  47. package/fesm2015/vgip-meta-ui.mjs +40 -5083
  48. package/fesm2015/vgip-meta-ui.mjs.map +1 -1
  49. package/fesm2020/vgip-meta-ui-fieldAbstract-2d0882f1.mjs +382 -0
  50. package/fesm2020/vgip-meta-ui-fieldAbstract-2d0882f1.mjs.map +1 -0
  51. package/fesm2020/vgip-meta-ui-index-0068fb77.mjs +368 -0
  52. package/fesm2020/vgip-meta-ui-index-0068fb77.mjs.map +1 -0
  53. package/fesm2020/vgip-meta-ui-index-1a54864a.mjs +70 -0
  54. package/fesm2020/vgip-meta-ui-index-1a54864a.mjs.map +1 -0
  55. package/fesm2020/vgip-meta-ui-index-2e6b2b56.mjs +73 -0
  56. package/fesm2020/vgip-meta-ui-index-2e6b2b56.mjs.map +1 -0
  57. package/fesm2020/vgip-meta-ui-index-3488da98.mjs +130 -0
  58. package/fesm2020/vgip-meta-ui-index-3488da98.mjs.map +1 -0
  59. package/fesm2020/vgip-meta-ui-index-5615e618.mjs +95 -0
  60. package/fesm2020/vgip-meta-ui-index-5615e618.mjs.map +1 -0
  61. package/fesm2020/vgip-meta-ui-index-65c10356.mjs +57 -0
  62. package/fesm2020/vgip-meta-ui-index-65c10356.mjs.map +1 -0
  63. package/fesm2020/vgip-meta-ui-index-7f4f2d15.mjs +142 -0
  64. package/fesm2020/vgip-meta-ui-index-7f4f2d15.mjs.map +1 -0
  65. package/fesm2020/vgip-meta-ui-index-8f5be5a7.mjs +24 -0
  66. package/fesm2020/vgip-meta-ui-index-8f5be5a7.mjs.map +1 -0
  67. package/fesm2020/vgip-meta-ui-index-934aeabf.mjs +68 -0
  68. package/fesm2020/vgip-meta-ui-index-934aeabf.mjs.map +1 -0
  69. package/fesm2020/vgip-meta-ui-index-9b33fba1.mjs +856 -0
  70. package/fesm2020/vgip-meta-ui-index-9b33fba1.mjs.map +1 -0
  71. package/fesm2020/vgip-meta-ui-index-9b590fc8.mjs +488 -0
  72. package/fesm2020/vgip-meta-ui-index-9b590fc8.mjs.map +1 -0
  73. package/fesm2020/vgip-meta-ui-index-9b5ee0c4.mjs +88 -0
  74. package/fesm2020/vgip-meta-ui-index-9b5ee0c4.mjs.map +1 -0
  75. package/fesm2020/vgip-meta-ui-index-e73dc574.mjs +1879 -0
  76. package/fesm2020/vgip-meta-ui-index-e73dc574.mjs.map +1 -0
  77. package/fesm2020/vgip-meta-ui-index-fa0b1b8b.mjs +460 -0
  78. package/fesm2020/vgip-meta-ui-index-fa0b1b8b.mjs.map +1 -0
  79. package/fesm2020/vgip-meta-ui-metaModel.pipe-725f401c.mjs +28 -0
  80. package/fesm2020/vgip-meta-ui-metaModel.pipe-725f401c.mjs.map +1 -0
  81. package/fesm2020/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs +51 -0
  82. package/fesm2020/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs.map +1 -0
  83. package/fesm2020/vgip-meta-ui.mjs +39 -5083
  84. package/fesm2020/vgip-meta-ui.mjs.map +1 -1
  85. package/lib/fieldComposite/index.d.ts +12 -0
  86. package/lib/fieldList/index.d.ts +14 -0
  87. package/lib/fieldReference/index.d.ts +73 -0
  88. package/lib/fieldSelect/index.d.ts +48 -0
  89. package/lib/index.d.ts +31 -23
  90. package/lib/layout/index.d.ts +39 -0
  91. package/lib/metaField/index.d.ts +26 -0
  92. package/lib/refDialog/index.d.ts +33 -0
  93. package/lib/resource/index.d.ts +58 -0
  94. package/lib/resourceCard/index.d.ts +18 -0
  95. package/lib/services/metaReference/index.d.ts +1 -1
  96. package/package.json +1 -1
  97. package/esm2020/lib/field.mjs +0 -2325
  98. package/lib/field.d.ts +0 -292
@@ -1,2325 +0,0 @@
1
- /*
2
- * @Author: Alexander.Vangelov@vonage.com
3
- * @Date: 2019-09-19 17:35:19
4
- * @Last Modified by: Alexander.Vangelov@vonage.com
5
- * @Last Modified time: 2023-02-08 14:23:26
6
- */
7
- import { Directive, Component, Input, Output, ViewChild, EventEmitter } from '@angular/core';
8
- import { ControlContainer, NgForm } from '@angular/forms';
9
- import { Subject } from 'rxjs';
10
- import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
11
- import { metaDark, metaLight } from './common/utils/colorThemes';
12
- import { metaNormalizer } from './common/metaNormalizer';
13
- import { templateBuilder } from './common/utils/templateBuilder';
14
- import { FieldAbstract } from './fieldAbstract';
15
- import { FieldUnknown } from './fieldUnknown';
16
- import { FieldText } from './fieldText';
17
- import { FieldInput } from './fieldInput';
18
- // import { FieldSelect } from './fieldSelect';
19
- // import { FieldReference } from './fieldReference';
20
- // import { FieldComposite } from './fieldComposite';
21
- import { FieldBoolean } from './fieldBoolean';
22
- import { FieldRadio } from './fieldRadio';
23
- // import { FieldList } from './fieldList';
24
- import { FieldRichtext } from './fieldRichtext';
25
- import { FieldDatetime } from './fieldDatetime';
26
- import { resourceCardLabel } from './common/utils/resourceCardLabel';
27
- import * as i0 from "@angular/core";
28
- import * as i1 from "@angular/common";
29
- import * as i2 from "./services/metaReference";
30
- import * as i3 from "./services/metaResource";
31
- import * as i4 from "@angular/forms";
32
- import * as i5 from "./common/metaModel.pipe";
33
- import * as i6 from "./services/metaMsg";
34
- import * as i7 from "./services/metaContext";
35
- import * as i8 from "./services/metaTracker";
36
- import * as i9 from "./common/metaAutofocus.directive";
37
- //// REF DIALOG
38
- export class MetaRefDialog {
39
- constructor(el) {
40
- this.el = el;
41
- this.resources = {};
42
- this.models = {};
43
- this.services = {};
44
- this.keepOrder = (a, b) => a;
45
- this.keyEventListener = (event) => {
46
- if (event && event.key === 'Escape') {
47
- document.removeEventListener('keydown', this.keyEventListener);
48
- this.dismiss();
49
- }
50
- };
51
- }
52
- get isEditable() {
53
- return this.resources[this.currentResource].meta.layout.editable !== false;
54
- }
55
- get isPersistent() {
56
- return this.resource && (this.resource.externalId || this.resource.id);
57
- }
58
- ngOnInit() {
59
- let references = (this.reference instanceof Array) ? this.reference : [this.reference];
60
- /* eslint-disable no-underscore-dangle */
61
- if (this.resource && this.resource._vgis) {
62
- this.fullResource = this.resource;
63
- this.resource = this.resource._vgis;
64
- }
65
- /* eslint-enable no-underscore-dangle */
66
- if (this.resource) {
67
- references = references.filter((r) => {
68
- const resType = r.name || r.resourceType || '';
69
- // comparing case insensitive, because of Zendesk comment vs Comment
70
- return (resType.id || resType || '').toLowerCase() === (this.resource.resourceType || this.resource.type || '').toLowerCase();
71
- });
72
- }
73
- for (const ref of references) {
74
- if (!ref.name) {
75
- ref.name = ref.resourceType; // when the resource comes from resources API, not from metadata
76
- }
77
- if (!this.currentResource) {
78
- this.currentResource = ref.name;
79
- }
80
- if (ref.name === this.preferResourceType) {
81
- this.currentResource = this.preferResourceType;
82
- }
83
- const rs = {
84
- integrationCode: this.integrationCode,
85
- resourceType: ref.resourceType || ref.name,
86
- ref
87
- };
88
- if (this.resource) {
89
- rs.externalId = this.resource.id || this.resource.externalId;
90
- if (this.resource.eventId) {
91
- rs.eventId = this.resource.eventId;
92
- }
93
- if (this.fullResource) {
94
- rs.activity = this.fullResource;
95
- }
96
- if (this.resource.layoutId) {
97
- rs.layoutId = this.resource.layoutId;
98
- }
99
- }
100
- rs.parent = ref.parent;
101
- this.resources[ref.name] = rs;
102
- this.models[ref.name] = {};
103
- if (this.resource) {
104
- this.models[ref.name]._vgis = this.resource; // eslint-disable-line no-underscore-dangle
105
- }
106
- }
107
- this.modal = this.el.nativeElement.childNodes[0];
108
- this.modal.classList.remove('Vlt-modal--out');
109
- this.modal.classList.add('Vlt-modal_visible');
110
- document.addEventListener('keydown', this.keyEventListener);
111
- if (this.integrationCode === 'mocks') {
112
- this.integrationIcon = 'Brand-icon-vonage';
113
- }
114
- else {
115
- switch (this.integrationCode.toLowerCase()) {
116
- case 'office365':
117
- this.integrationIcon = 'Brand-icon-office-color';
118
- break;
119
- case 'sugar':
120
- this.integrationIcon = 'Brand-icon-sugarcrm-color';
121
- break;
122
- case 'msdynamics':
123
- this.integrationIcon = 'Brand-icon-dynamics-color';
124
- break;
125
- default:
126
- this.integrationIcon = `Brand-icon-${(this.integrationCode || '').toLowerCase()}-color`;
127
- }
128
- }
129
- this.applyTheme();
130
- }
131
- close() {
132
- this.modal.classList.remove('Vlt-modal_visible');
133
- this.modal.classList.add('Vlt-modal--out');
134
- }
135
- dismiss() {
136
- this.close();
137
- this.onComplete(null);
138
- }
139
- onResourceDone(result) {
140
- this.close();
141
- this.onComplete(result);
142
- }
143
- selectResource(resource) {
144
- this.currentResource = resource;
145
- }
146
- applyTheme() {
147
- const metaTheme = this.theme === 'dark' ? metaDark : metaLight;
148
- for (const key of Object.keys(metaTheme.properties)) {
149
- this.el.nativeElement.style.setProperty(key, metaTheme.properties[key]);
150
- }
151
- }
152
- }
153
- MetaRefDialog.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaRefDialog, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
154
- MetaRefDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: MetaRefDialog, selector: "ng-component", ngImport: i0, template: "<div class='Vlt-modal Vlt-modal--large'>\n <div class=\"Vlt-modal__panel\">\n <div class=\"Vlt-tabs\">\n <div class='Vlt-tabs__header--background'>\n <div class=\"Vlt-tabs__header Vlt-tabs__header--shadow\">\n <svg class=\"Vlt-icon\" [ngStyle]=\"{fill: integrationIcon === 'Brand-icon-vonage' ? 'var(--vgip-meta-input-color)' : ''}\"><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\" /></svg>\n <div *ngFor='let r of resources | keyvalue: keepOrder' (click)='selectResource(r.key)' class=\"Vlt-tabs__link\" [ngClass]=\"{ 'Vlt-tabs__link_active': currentResource === r.key}\">\n {{r.key}}\n </div>\n <div class=\"Vlt-modal__dismiss\" (click)=\"dismiss()\">\n <svg class=\"Vlt-icon\"><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\" /></svg>\n </div>\n </div>\n </div>\n <div class=\"Vlt-tabs__content\" style='min-height: 90px;'>\n <ng-container *ngFor='let r of resources | keyvalue: keepOrder'>\n <div *ngIf='currentResource === r.key' class=\"Vlt-tabs__panel Vlt-tabs__panel_active\">\n <vgip-meta-resource [resource]='r.value' [model]='models[r.key]' [metaResourceServiceDelegated]='metaResource' (done)='onResourceDone($event)' theme='inherit' [attr.data-theme]='theme'></vgip-meta-resource>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", styles: [".Vlt-modal_visible{background:var(--vgip-meta-overlay-background)}.Vlt-modal__panel{padding:0;background:var(--vgip-meta-resource-bg-color);overflow:hidden}@media only screen and (max-width: 575px){.Vlt-modal__panel{height:100%;width:100%;max-height:none;border-bottom-left-radius:0;border-bottom-right-radius:0;margin:10px 6px 0}.Vlt-modal__panel ::ng-deep .busy-mask{min-height:calc(100vh - 58px)}}.Vlt-modal__panel .Vlt-tabs__header--background{border-top-left-radius:5px;border-top-right-radius:5px}.Vlt-modal__panel .Vlt-tabs__header{background:var(--vgip-meta-resource-bar-color);padding-left:52px;padding-right:45px;border-bottom:0;flex-wrap:wrap;min-height:52px;max-height:52px;align-items:center}.Vlt-modal__panel .Vlt-tabs__header>.Vlt-icon{position:absolute;left:14px}.Vlt-modal__panel .Vlt-tabs__header h5{margin-bottom:0;font-weight:initial}.Vlt-modal__panel .Vlt-tabs__header .Vlt-tabs__link{padding-top:4px;padding-bottom:2px;color:var(--vgip-meta-input-label-color);text-transform:capitalize}.Vlt-modal__panel .Vlt-tabs__header .Vlt-tabs__link_active{color:var(--vgip-meta-input-accent-color)}.Vlt-modal__panel .Vlt-tabs__header .Vlt-tabs__link_active:after{background:var(--vgip-meta-input-accent-color)}.Vlt-modal__panel .Vlt-tabs__header .Vlt-modal__dismiss{background-image:none;width:18px;height:18px;opacity:initial}.Vlt-modal__panel .Vlt-tabs__header .Vlt-modal__dismiss svg{width:16px;height:16px;fill:var(--vgip-meta-input-label-color)}.Vlt-modal__panel .Vlt-tabs__header .Vlt-modal__dismiss:hover svg{fill:var(--vgip-meta-input-accent-color)}.Vlt-modal__panel .Vlt-tabs__header::-webkit-scrollbar{width:8px}.Vlt-modal__panel .Vlt-tabs__header::-webkit-scrollbar-thumb{background-color:var(--vgip-meta-scrollbar-color);border:2px solid transparent;border-radius:6px;background-clip:content-box}.Vlt-modal__panel .Vlt-tabs__content{margin-top:0}.Vlt-modal__panel .Vlt-tabs__content .Vlt-tabs__link{font-size:1.8rem}.Vlt-modal__panel .Vlt-callout--banner{justify-content:initial;text-align:initial;overflow-y:auto}.Vlt-modal__panel .Vlt-callout--banner.Vlt-callout--dismissed{padding:0}.Vlt-modal__panel .Vlt-callout--banner:not(.Vlt-callout--dismissed){min-height:78px}.Vlt-modal__panel .Vlt-modal__cancel{z-index:899}.Vlt-modal__panel .Vlt-modal__dismiss{right:16px;top:14px}.Vlt-modal__panel .Vlt-card__footer button{margin-top:0;margin-bottom:0}.Vlt-modal__panel .Vlt-select select:disabled{background:initial;cursor:not-allowed}.Vlt-modal__panel ::ng-deep .form-content{min-height:0;max-height:calc(95vh - 172px)}@media only screen and (max-width: 575px){.Vlt-modal__panel ::ng-deep .form-content{min-height:calc(100vh - 113px)}}.resource-menu button{margin:0 -10px}.resource-menu button:not(:hover) .Vlt-icon{color:#616266;fill:#616266}.busy-mask{position:absolute;inset:0;background:rgba(0,0,0,.32);opacity:1;z-index:898;display:none;border-bottom-left-radius:6px;border-bottom-right-radius:6px;margin:1px;cursor:progress}.busy-mask.active{display:block}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i0.forwardRef(function () { return MetaResource; }), selector: "vgip-meta-resource", inputs: ["resource", "model", "metaResourceServiceDelegated", "theme"], outputs: ["done"] }, { kind: "pipe", type: i0.forwardRef(function () { return i1.KeyValuePipe; }), name: "keyvalue" }] });
155
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaRefDialog, decorators: [{
156
- type: Component,
157
- args: [{ template: "<div class='Vlt-modal Vlt-modal--large'>\n <div class=\"Vlt-modal__panel\">\n <div class=\"Vlt-tabs\">\n <div class='Vlt-tabs__header--background'>\n <div class=\"Vlt-tabs__header Vlt-tabs__header--shadow\">\n <svg class=\"Vlt-icon\" [ngStyle]=\"{fill: integrationIcon === 'Brand-icon-vonage' ? 'var(--vgip-meta-input-color)' : ''}\"><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\" /></svg>\n <div *ngFor='let r of resources | keyvalue: keepOrder' (click)='selectResource(r.key)' class=\"Vlt-tabs__link\" [ngClass]=\"{ 'Vlt-tabs__link_active': currentResource === r.key}\">\n {{r.key}}\n </div>\n <div class=\"Vlt-modal__dismiss\" (click)=\"dismiss()\">\n <svg class=\"Vlt-icon\"><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\" /></svg>\n </div>\n </div>\n </div>\n <div class=\"Vlt-tabs__content\" style='min-height: 90px;'>\n <ng-container *ngFor='let r of resources | keyvalue: keepOrder'>\n <div *ngIf='currentResource === r.key' class=\"Vlt-tabs__panel Vlt-tabs__panel_active\">\n <vgip-meta-resource [resource]='r.value' [model]='models[r.key]' [metaResourceServiceDelegated]='metaResource' (done)='onResourceDone($event)' theme='inherit' [attr.data-theme]='theme'></vgip-meta-resource>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", styles: [".Vlt-modal_visible{background:var(--vgip-meta-overlay-background)}.Vlt-modal__panel{padding:0;background:var(--vgip-meta-resource-bg-color);overflow:hidden}@media only screen and (max-width: 575px){.Vlt-modal__panel{height:100%;width:100%;max-height:none;border-bottom-left-radius:0;border-bottom-right-radius:0;margin:10px 6px 0}.Vlt-modal__panel ::ng-deep .busy-mask{min-height:calc(100vh - 58px)}}.Vlt-modal__panel .Vlt-tabs__header--background{border-top-left-radius:5px;border-top-right-radius:5px}.Vlt-modal__panel .Vlt-tabs__header{background:var(--vgip-meta-resource-bar-color);padding-left:52px;padding-right:45px;border-bottom:0;flex-wrap:wrap;min-height:52px;max-height:52px;align-items:center}.Vlt-modal__panel .Vlt-tabs__header>.Vlt-icon{position:absolute;left:14px}.Vlt-modal__panel .Vlt-tabs__header h5{margin-bottom:0;font-weight:initial}.Vlt-modal__panel .Vlt-tabs__header .Vlt-tabs__link{padding-top:4px;padding-bottom:2px;color:var(--vgip-meta-input-label-color);text-transform:capitalize}.Vlt-modal__panel .Vlt-tabs__header .Vlt-tabs__link_active{color:var(--vgip-meta-input-accent-color)}.Vlt-modal__panel .Vlt-tabs__header .Vlt-tabs__link_active:after{background:var(--vgip-meta-input-accent-color)}.Vlt-modal__panel .Vlt-tabs__header .Vlt-modal__dismiss{background-image:none;width:18px;height:18px;opacity:initial}.Vlt-modal__panel .Vlt-tabs__header .Vlt-modal__dismiss svg{width:16px;height:16px;fill:var(--vgip-meta-input-label-color)}.Vlt-modal__panel .Vlt-tabs__header .Vlt-modal__dismiss:hover svg{fill:var(--vgip-meta-input-accent-color)}.Vlt-modal__panel .Vlt-tabs__header::-webkit-scrollbar{width:8px}.Vlt-modal__panel .Vlt-tabs__header::-webkit-scrollbar-thumb{background-color:var(--vgip-meta-scrollbar-color);border:2px solid transparent;border-radius:6px;background-clip:content-box}.Vlt-modal__panel .Vlt-tabs__content{margin-top:0}.Vlt-modal__panel .Vlt-tabs__content .Vlt-tabs__link{font-size:1.8rem}.Vlt-modal__panel .Vlt-callout--banner{justify-content:initial;text-align:initial;overflow-y:auto}.Vlt-modal__panel .Vlt-callout--banner.Vlt-callout--dismissed{padding:0}.Vlt-modal__panel .Vlt-callout--banner:not(.Vlt-callout--dismissed){min-height:78px}.Vlt-modal__panel .Vlt-modal__cancel{z-index:899}.Vlt-modal__panel .Vlt-modal__dismiss{right:16px;top:14px}.Vlt-modal__panel .Vlt-card__footer button{margin-top:0;margin-bottom:0}.Vlt-modal__panel .Vlt-select select:disabled{background:initial;cursor:not-allowed}.Vlt-modal__panel ::ng-deep .form-content{min-height:0;max-height:calc(95vh - 172px)}@media only screen and (max-width: 575px){.Vlt-modal__panel ::ng-deep .form-content{min-height:calc(100vh - 113px)}}.resource-menu button{margin:0 -10px}.resource-menu button:not(:hover) .Vlt-icon{color:#616266;fill:#616266}.busy-mask{position:absolute;inset:0;background:rgba(0,0,0,.32);opacity:1;z-index:898;display:none;border-bottom-left-radius:6px;border-bottom-right-radius:6px;margin:1px;cursor:progress}.busy-mask.active{display:block}\n"] }]
158
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });
159
- //// COMPOSITE FIELD
160
- export class FieldComposite extends FieldAbstract {
161
- get isRow() {
162
- return this.meta.subtype !== 'column';
163
- }
164
- get fields() {
165
- return (this.meta.fields || []).map((f) => {
166
- if (f.type === 'textarea') { // no textareas inside composite (use string)
167
- delete f.type;
168
- }
169
- return f;
170
- });
171
- }
172
- ngOnInit() {
173
- // super.ngOnInit()
174
- let nestedFieldsRegex;
175
- if (this.meta.name) {
176
- this.value = this.parent[this.meta.name] || {};
177
- nestedFieldsRegex = new RegExp(`^${this.meta.name}\\.(.*)`);
178
- Object.defineProperty(this.parent, this.meta.name, {
179
- set: (value) => {
180
- if (value) {
181
- for (const v of Object.keys(value)) {
182
- this.value[v] = value[v];
183
- }
184
- }
185
- },
186
- get: () => {
187
- if (JSON.stringify(this.value) !== '{}') {
188
- return this.value;
189
- }
190
- },
191
- enumerable: this.sendToServer,
192
- configurable: true
193
- });
194
- for (const f of this.meta.fields) {
195
- if (this.isRow) {
196
- if (f.type === 'text') {
197
- f.type = 'string';
198
- }
199
- }
200
- const nestedFieldMatch = f.name.match(nestedFieldsRegex);
201
- if (nestedFieldMatch) {
202
- f.name = nestedFieldMatch[1]; // for VGIS V2 backward compatibility normalize name with dotted syntax
203
- }
204
- }
205
- }
206
- else {
207
- this.value = this.parent;
208
- }
209
- }
210
- }
211
- FieldComposite.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: FieldComposite, deps: null, target: i0.ɵɵFactoryTarget.Component });
212
- FieldComposite.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: FieldComposite, selector: "ng-component", inputs: { meta: "meta" }, usesInheritance: true, ngImport: i0, template: "<div [ngClass]=\"{ 'Vlt-grid Vlt-grid--narrow': isRow }\">\n <ng-container *ngFor='let field of fields'>\n <div style='margin: 0;' [ngClass]=\"{ 'Vlt-col': isRow, 'Vlt-col--1of3': isRow && fields.length > 3 }\" *ngIf=\"!field.$invisible\">\n <vgip-meta-field *ngIf='!meta.$invisible' [ngClass]=\"{ shown: !field.$invisible}\" [index]='index' [meta]='field'\n [parent]='value' [integrationCode]='integrationCode' [resourceType]='resourceType' [preview]='preview'\n theme='inherit'></vgip-meta-field>\n </div>\n </ng-container>\n</div>", styles: ["div>vgip-meta-field{display:none}div>vgip-meta-field.shown{display:initial}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i0.forwardRef(function () { return MetaField; }), selector: "vgip-meta-field", inputs: ["meta", "parent", "integrationCode", "resourceType", "index", "preview", "theme"], outputs: ["onChange", "onLeave"] }] });
213
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: FieldComposite, decorators: [{
214
- type: Component,
215
- args: [{ template: "<div [ngClass]=\"{ 'Vlt-grid Vlt-grid--narrow': isRow }\">\n <ng-container *ngFor='let field of fields'>\n <div style='margin: 0;' [ngClass]=\"{ 'Vlt-col': isRow, 'Vlt-col--1of3': isRow && fields.length > 3 }\" *ngIf=\"!field.$invisible\">\n <vgip-meta-field *ngIf='!meta.$invisible' [ngClass]=\"{ shown: !field.$invisible}\" [index]='index' [meta]='field'\n [parent]='value' [integrationCode]='integrationCode' [resourceType]='resourceType' [preview]='preview'\n theme='inherit'></vgip-meta-field>\n </div>\n </ng-container>\n</div>", styles: ["div>vgip-meta-field{display:none}div>vgip-meta-field.shown{display:initial}\n"] }]
216
- }], propDecorators: { meta: [{
217
- type: Input
218
- }] } });
219
- //// SELECT FIELD
220
- export class FieldSelect extends FieldAbstract {
221
- constructor(componentFactoryResolver, referenceService, metaResource) {
222
- super();
223
- this.componentFactoryResolver = componentFactoryResolver;
224
- this.referenceService = referenceService;
225
- this.metaResource = metaResource;
226
- this.isCreatable = false;
227
- this.clickout = (event) => {
228
- if (event.target.className === 'Vlt-dropdown__link' && this.elementRef.nativeElement.contains(event.target)) {
229
- this.focus();
230
- }
231
- else if (event.target !== this.input &&
232
- !event.target.classList.contains('Vlt-dropdown__block') &&
233
- !this.detectSearchBlock(event.target)) {
234
- this.dismissDropdown();
235
- }
236
- else if (this.detectSearchBlock(event.target)) {
237
- event.target.focus();
238
- }
239
- else {
240
- this.focus();
241
- }
242
- };
243
- this.keydown = (event) => {
244
- switch (event.key) {
245
- case 'ArrowDown': {
246
- this.showDropdown();
247
- if (typeof (this.activeSuggestionIndex) === 'undefined') {
248
- this.activeSuggestionIndex = 0;
249
- }
250
- else {
251
- this.activeSuggestionIndex++;
252
- if (this.activeSuggestionIndex >= this.options.length) {
253
- this.activeSuggestionIndex = 0;
254
- }
255
- }
256
- this.ensureDropdownOptionIsVisible();
257
- event.preventDefault();
258
- event.stopPropagation();
259
- break;
260
- }
261
- case 'ArrowUp': {
262
- this.showDropdown();
263
- if (typeof (this.activeSuggestionIndex) === 'undefined') {
264
- this.activeSuggestionIndex = this.options.length - 1;
265
- }
266
- else {
267
- this.activeSuggestionIndex--;
268
- if (this.activeSuggestionIndex < 0) {
269
- this.activeSuggestionIndex = this.options.length - 1;
270
- }
271
- }
272
- this.ensureDropdownOptionIsVisible();
273
- event.preventDefault();
274
- event.stopPropagation();
275
- break;
276
- }
277
- case 'Enter':
278
- case 'Space':
279
- case ' ': {
280
- if (typeof (this.activeSuggestionIndex) !== 'undefined') {
281
- event.preventDefault();
282
- event.stopPropagation();
283
- this.onOptionSelect(event, this.options[this.activeSuggestionIndex]);
284
- if (!this.multiple) {
285
- delete this.activeSuggestionIndex;
286
- }
287
- }
288
- break;
289
- }
290
- case 'Escape': {
291
- event.preventDefault();
292
- event.stopPropagation();
293
- this.dismissDropdown();
294
- break;
295
- }
296
- case 'Backspace': {
297
- if (!this.dropdown.classList.contains('Vlt-dropdown--expanded')) {
298
- event.preventDefault();
299
- event.stopPropagation();
300
- this.clear();
301
- }
302
- break;
303
- }
304
- }
305
- };
306
- }
307
- get options() {
308
- return this.filteredOptions || this.asyncOptions || this.meta.options || this.meta.picklist || [];
309
- }
310
- get groupedOptions() {
311
- return this.options.reduce((r, { group }) => {
312
- if (!r.some(o => o.group === group)) {
313
- r.push({ group, groupItem: this.options.filter(v => v.group === group) });
314
- }
315
- return r;
316
- }, []);
317
- }
318
- get resourceService() {
319
- if (!this.metaResourceService) {
320
- const metaResourceConfig = {
321
- integrationCode: this.integrationCode,
322
- resourceType: this.resourceType
323
- };
324
- this.metaResourceService = this.metaResource.new(metaResourceConfig);
325
- }
326
- return this.metaResourceService;
327
- }
328
- get optionsBackup() {
329
- return this.asyncOptions || this.meta.options || this.meta.picklist || [];
330
- }
331
- static setup(instance, parent, meta) { }
332
- ngOnInit() {
333
- // console.log('parent', this.parent);
334
- this.validationAttributes = ['required'];
335
- this.multiple = (this.meta.type === 'multipicklist') || this.meta.multiple;
336
- const origValue = this.parent[this.meta.name];
337
- if (this.meta.reference) {
338
- this.isCreatable = true;
339
- }
340
- Object.defineProperty(this.parent, this.meta.name, {
341
- set: (value) => {
342
- if (this.multiple) {
343
- if (value && value instanceof Array === false) {
344
- for (const o of this.options) {
345
- if ((value.id || value) === (o.id || o.value || o.name || 0)) {
346
- this.model = [o];
347
- this.value = [this.modelToValue(o, this.meta.valueType)];
348
- break;
349
- }
350
- }
351
- }
352
- if (!value || value.length) {
353
- const values = (value instanceof Array) ? value : (value || '').split(';'); // should not handle incorrect values
354
- this.value = [];
355
- this.model = [];
356
- for (const v of values) {
357
- if (v) {
358
- for (const o of this.options) {
359
- if ((v.id || v) === (o.id || o.value || o.name || 0)) {
360
- this.model.push(o);
361
- this.value.push(this.modelToValue(o, this.meta.valueType));
362
- break;
363
- }
364
- }
365
- }
366
- }
367
- if (!this.model.length && !this.isPersistedParent) {
368
- delete this.model;
369
- delete this.value;
370
- delete this.showText;
371
- }
372
- else {
373
- this.showText = (this.model || []).map((o) => o.label || o).join(', ');
374
- }
375
- }
376
- }
377
- else {
378
- if (value) {
379
- for (const o of this.options) {
380
- if ((value.id || value) === (o.id || o.value || o.name || o)) {
381
- this.model = o;
382
- this.value = this.modelToValue(o, this.meta.valueType);
383
- this.showText = o.label || o;
384
- break;
385
- }
386
- }
387
- }
388
- else {
389
- delete this.model;
390
- delete this.value;
391
- delete this.showText;
392
- }
393
- }
394
- this.onSubjectChange(this.model);
395
- this.meta.$optional = this.isOptional;
396
- },
397
- get: () => this.value,
398
- enumerable: this.sendToServer,
399
- configurable: true
400
- });
401
- if (origValue) {
402
- this.parent[this.meta.name] = origValue;
403
- }
404
- if (this.default && !this.model) {
405
- setTimeout(() => {
406
- this.parent[this.meta.name] = this.default.id || this.default;
407
- }, 0);
408
- }
409
- if (typeof (this.meta.enabled) !== undefined) {
410
- if (typeof (this.meta.enabled) === 'object') {
411
- for (const par of Object.keys(this.meta.enabled)) {
412
- const parValue = this.parent[par];
413
- if (parValue) {
414
- // logic for specific values, this works only for true
415
- }
416
- else {
417
- this.logicalDisabled = true;
418
- this.clear();
419
- }
420
- this.filterOptions();
421
- this.parentChangeSubject.subscribe((value) => {
422
- if (value && value.hasOwnProperty(par)) {
423
- this.logicalDisabled = !value[par];
424
- if (this.logicalDisabled) {
425
- this.clear();
426
- }
427
- else {
428
- this.filterOptions();
429
- }
430
- }
431
- });
432
- }
433
- }
434
- }
435
- if (this.meta.search) {
436
- const searchParams = this.meta.search.params;
437
- if (searchParams) {
438
- for (const par of Object.keys(searchParams)) {
439
- const parValue = this.parent[searchParams[par]];
440
- if (parValue) {
441
- const params = {};
442
- params[par] = parValue;
443
- this.searchOptions(params);
444
- }
445
- this.parentChangeSubject.subscribe((value) => {
446
- if (value && value.hasOwnProperty(searchParams[par])) {
447
- this.searchOptions(value);
448
- }
449
- });
450
- }
451
- }
452
- }
453
- }
454
- onActivated(ev) {
455
- // ev.preventDefault();
456
- // ev.stopPropagation();
457
- this.input = ev.srcElement;
458
- if (!this.dropdown) {
459
- this.dropdown = ev.srcElement.parentNode.parentNode.parentNode;
460
- this.searchInput = this.dropdown.querySelector('.vgip-search_input');
461
- }
462
- this.showDropdown();
463
- }
464
- detectSearchBlock(element) {
465
- return this.elementRef.nativeElement.querySelector('.Vlt-search_wrap').contains(element);
466
- }
467
- onBlur(ev) {
468
- let internalControl = false;
469
- if (ev.relatedTarget) {
470
- if (!this.detectSearchBlock(ev.relatedTarget) && !this.elementRef.nativeElement.contains(ev.relatedTarget)) {
471
- this.dismissDropdown();
472
- }
473
- else {
474
- internalControl = true;
475
- }
476
- }
477
- if (this.keyListenerActive && !internalControl) {
478
- this.input.removeEventListener('keydown', this.keydown);
479
- if (this.searchInput) {
480
- this.searchInput.removeEventListener('keydown', this.keydown);
481
- }
482
- setTimeout(() => {
483
- if (!this.keyListenerActive) {
484
- document.removeEventListener('click', this.clickout);
485
- }
486
- }, 400);
487
- delete this.keyListenerActive;
488
- }
489
- this.onLeave.emit(ev);
490
- }
491
- onOptionSelect(ev, option) {
492
- if (ev) {
493
- ev.preventDefault();
494
- ev.stopPropagation();
495
- }
496
- this.focus();
497
- if (this.multiple) {
498
- if (!this.model) {
499
- this.model = [];
500
- }
501
- const optionIndex = this.model.indexOf(option);
502
- if (optionIndex === -1) {
503
- this.model.push(option);
504
- }
505
- else {
506
- this.model.splice(optionIndex, 1);
507
- if (!this.model.length) {
508
- delete this.model;
509
- }
510
- }
511
- this.onModelChange(this.model);
512
- if (this.model) {
513
- this.showText = (this.model || []).map((o) => o.label || o).join(', ');
514
- }
515
- else {
516
- delete this.showText;
517
- }
518
- }
519
- else {
520
- this.dismissDropdown();
521
- if (typeof option !== 'undefined') {
522
- this.model = option;
523
- this.onModelChange(option);
524
- this.showText = option.label || (option.id === '' ? '--empty--' : option);
525
- if (typeof (option) === 'object' && !option.id && option.id !== '') {
526
- delete this.showText;
527
- }
528
- }
529
- }
530
- }
531
- clear(ev) {
532
- delete this.model;
533
- this.onModelChange(this.model);
534
- delete this.showText;
535
- if (ev) {
536
- ev.preventDefault();
537
- ev.stopPropagation();
538
- return false;
539
- }
540
- }
541
- openResource(ev) {
542
- const refDialogFactory = this.componentFactoryResolver.resolveComponentFactory(MetaRefDialog);
543
- this.referenceService.openDialog(refDialogFactory, this.metaResource, this.integrationCode, this.meta.reference, null).subscribe((result) => {
544
- if (result) {
545
- const existingOptions = (this.meta.options || []).find((o) => (o.id === result.id && o.type === result.type));
546
- if (existingOptions) {
547
- existingOptions.label = result.label;
548
- }
549
- else {
550
- if (!this.meta.options) {
551
- this.meta.options = [];
552
- }
553
- this.meta.options.unshift(result);
554
- }
555
- this.onOptionSelect(ev, result);
556
- }
557
- });
558
- }
559
- showDropdown() {
560
- this.dropdown.classList.add('Vlt-dropdown--expanded');
561
- if (!this.keyListenerActive) {
562
- if (this.searchInput) {
563
- this.searchInput.focus(); // Focus directly on search input first visit
564
- this.searchInput.addEventListener('keydown', this.keydown);
565
- }
566
- this.input.addEventListener('keydown', this.keydown);
567
- setTimeout(() => {
568
- document.addEventListener('click', this.clickout);
569
- }, 200);
570
- this.keyListenerActive = true;
571
- if (this.options && this.model) {
572
- for (let suggestionIndex = 0; suggestionIndex < this.options.length; suggestionIndex++) {
573
- if (this.model === this.options[suggestionIndex]) {
574
- this.activeSuggestionIndex = suggestionIndex;
575
- }
576
- }
577
- }
578
- }
579
- this.ensureDropdownIsVisible();
580
- }
581
- dismissDropdown(event) {
582
- if (event) {
583
- this.focus();
584
- }
585
- if (this.dropdown) {
586
- this.dropdown.classList.remove('Vlt-dropdown--expanded');
587
- }
588
- if (this.searchInput) {
589
- this.clearSearchField();
590
- }
591
- delete this.activeSuggestionIndex;
592
- }
593
- onSearchChange() {
594
- const search = new RegExp(this.searchInputText, 'gi');
595
- if (this.searchInputText === '') {
596
- this.filteredOptions = [...this.optionsBackup];
597
- }
598
- this.filteredOptions = this.optionsBackup.filter(option => option.label.match(search));
599
- }
600
- clearSearchField() {
601
- this.searchInputText = '';
602
- this.onSearchChange();
603
- }
604
- ensureDropdownIsVisible() {
605
- setTimeout(() => {
606
- const holder = this.dropdown.closest('.Vlt-card__content');
607
- if (holder) {
608
- const el = this.elementRef.nativeElement.querySelector('.Vlt-dropdown__panel');
609
- const elRect = el.getBoundingClientRect();
610
- const holderRect = holder.getBoundingClientRect();
611
- if (holderRect.top + holderRect.height < elRect.top + elRect.height) {
612
- el.scrollIntoView({ block: 'end' });
613
- }
614
- }
615
- }, 400);
616
- }
617
- ensureDropdownOptionIsVisible() {
618
- if (!this.dropdownScrollContainer) {
619
- this.dropdownScrollContainer = this.dropdown.querySelector('.Vlt-dropdown__scroll');
620
- }
621
- if (this.dropdownScrollContainer && typeof (this.activeSuggestionIndex) === 'number') {
622
- const scrollTop = 44 * this.activeSuggestionIndex;
623
- const scrollBottom = 44 * (this.activeSuggestionIndex - 7);
624
- if (scrollTop < this.dropdownScrollContainer.scrollTop) {
625
- this.dropdownScrollContainer.scrollTop = scrollTop;
626
- }
627
- else if (scrollBottom > this.dropdownScrollContainer.scrollTop) {
628
- this.dropdownScrollContainer.scrollTop = scrollBottom;
629
- }
630
- }
631
- }
632
- filterOptions() {
633
- this.asyncOptions = [];
634
- if (!this.logicalDisabled) {
635
- for (const o of this.meta.options) {
636
- if (o.for) {
637
- for (const par of Object.keys(o.for)) {
638
- const parValue = this.parent[par];
639
- if (o.for[par].indexOf(parValue) !== -1) {
640
- this.asyncOptions.push(o);
641
- }
642
- }
643
- }
644
- else {
645
- this.asyncOptions.push(o);
646
- }
647
- }
648
- }
649
- }
650
- searchOptions(params) {
651
- let searchUrl = `/fields/${this.meta.name}/search`;
652
- if (this.meta.search) {
653
- if (this.meta.search.url) {
654
- searchUrl = this.meta.search.url;
655
- }
656
- const searchParams = this.meta.search.params;
657
- if (searchParams) {
658
- for (const par of Object.keys(searchParams)) {
659
- const val = this.parent[searchParams[par]];
660
- if (val) {
661
- searchUrl += `${searchUrl.indexOf('?') === -1 ? '?' : '&'}${par}=${val.id || val}`;
662
- }
663
- }
664
- }
665
- }
666
- this.searching = true;
667
- this.resourceService.getByPath(searchUrl).subscribe((options) => {
668
- this.asyncOptions = options;
669
- let validValue = false;
670
- if (this.value) {
671
- for (const o of options) {
672
- if ((o.id || o) === (this.value.id || this.value)) {
673
- validValue = true;
674
- }
675
- }
676
- if (!validValue) {
677
- this.clear();
678
- }
679
- }
680
- delete this.searching;
681
- });
682
- }
683
- }
684
- FieldSelect.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: FieldSelect, deps: [{ token: i0.ComponentFactoryResolver }, { token: i2.MetaReferenceService }, { token: i3.MetaResourceService }], target: i0.ɵɵFactoryTarget.Component });
685
- FieldSelect.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: FieldSelect, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class='vgip-meta-field-preview' *ngIf='preview && model'>\n <div class='vgip-meta-field-label'>{{meta.label || meta.name}}</div>\n <div class='vgip-meta-field-value __gu'>\n {{model.label || model.id || model}}\n </div>\n</div>\n<div *ngIf='!preview' class=\"Vlt-form__element\"\n [ngClass]=\"{ 'Vlt-form__element--big': !meta.small ,'has-value': f.value, active: keyListenerActive, 'Vlt-form__element--error': f.invalid && ((f | metaModel)._parent.submitted || (ft | metaModel ).touched), 'no-x': meta.noX }\">\n <div class=\"Vlt-composite Vlt-dropdown Vlt-input\" style='display: block;'\n [ngClass]=\"{ 'has-append-button': isCreatable && !disabled }\">\n <div class=\"Vlt-select\">\n <label class='wrapper'>\n <label class='Vlt-truncate'>{{meta.label || meta.name}}<span\n *ngIf='validations.required && options.length' class='Vlt-red'>*</span></label>\n <input class='main' [required]='validations.required && !!options.length' readonly [ngModel]='showText'\n #ft='ngModel' [ngModelOptions]=\"{standalone: true}\" type=\"text\"\n [placeholder]=\"meta.placeholder || ' '\" (click)='onActivated($event)' (focus)='onActivated($event)'\n (blur)='onBlur($event)' [ngClass]=\"{ 'standalone': meta.standalone }\"\n [disabled]='disabled' [attr.aria-label]='meta.label' />\n </label>\n <select class='model' [required]='validations.required && !!options.length' style='display: none;'\n [(ngModel)]='model' [ngModelOptions]=\"{standalone: meta.standalone}\"\n (ngModelChange)=\"onModelChange($event)\" #f='ngModel' [name]='name'></select>\n <div *ngIf='searching' class='search-progress'>\n <div class=\"container\">\n <div class=\"bar Vlt-bg-purple\"></div>\n </div>\n </div>\n <div class='Vlt-composite__append right-actions'>\n <div *ngIf='model && !meta.noX && !disabled' class=\"Vlt-composite__append--icon\"\n (click)='clear($event)'>\n <div class=\"Vlt-composite__icon\">\n <svg>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n <div class='Vlt-dropdown__panel'>\n <div class=\"Vlt-dropdown__panel__content Vlt-dropdown__panel__content--scroll-area\">\n <!-- <div class=\"Vlt-dropdown__title\" style='padding-left: 15px;'>\n Select ({{options.length}})\n <div class=\"Vlt-dropdown__close Vlt-white\" (click)='dismissDropdown($event)'>\n <svg class='Vlt-icon Vlt-icon--small'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div> -->\n <div class=\"Vlt-dropdown__block Vlt-search_wrap\">\n <div *ngIf=\"optionsBackup.length > 12\" class=\"Vlt-composite\">\n <div class=\"Vlt-composite__prepend Vlt-composite__prepend--icon\"\n style=\"top: 0; padding-top: 15px;\">\n <div class=\"Vlt-composite__icon\">\n <svg class='Vlt-grey'>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-search\"></use>\n </svg>\n </div>\n </div>\n <div class=\"Vlt-input\">\n <input type=\"text\" class=\"vgip-search_input\" [(ngModel)]=\"searchInputText\" placeholder=\"Search\" (input)=\"onSearchChange()\" (blur)='onBlur($event)' [ngModelOptions]=\"{standalone: true}\">\n </div>\n <div class=\"Vlt-composite__append--icon\"\n style=\"top: 2px;\" (click)=\"clearSearchField()\" [hidden]=\"searchInputText === ''\">\n <div class=\"Vlt-composite__icon\">\n <svg class='Vlt-icon Vlt-icon--small'>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/>\n </svg>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf='dropdown' class='Vlt-dropdown__scroll'>\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i }\"\n (click)='onOptionSelect($event, option)' *ngFor='let option of options; let i = index'\n class=\"Vlt-dropdown__link\">\n <div *ngIf='multiple' class=\"Vlt-checkbox\" style='width: 100%;'>\n <label>\n <span class=\"Vlt-checkbox__button\">\n <input type=\"checkbox\" [checked]='model && model.indexOf(option) !== -1' />\n <span class=\"Vlt-checkbox__icon\"></span>\n </span>\n {{option.label || (option.id === '' ? '--empty--' : option)}}\n </label>\n </div>\n <div *ngIf='!multiple' style='padding: 12px 20px;'>{{option.label || (option.id === '' ?\n '--empty--' : option)}}</div>\n </div>\n <!-- No Option Found -->\n <div class=\"Vlt-dropdown__link\" *ngIf=\"options.length === 0\">\n <div style='padding: 12px 20px;'>No Option Found</div>\n </div>\n </div>\n <div *ngIf='!multiple' class=\"Vlt-dropdown__block\"></div>\n <div *ngIf='multiple' class=\"Vlt-dropdown__block Vlt-dropdown__block--nowrap\"\n style='padding: 8px 16px 16px;'>\n <button (click)='clear($event)' type='button'\n class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--small Vlt-btn--outline\"\n style='margin-right: 8px;'>Clear all</button>\n <button (click)='dismissDropdown($event)' type='button'\n class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--small\">Done</button>\n </div>\n </div>\n </div>\n <!-- <span *ngIf='isCreatable'>\n <button type='button' (click)='openResource($event)' class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n </span> -->\n <div *ngIf='isCreatable && !disabled' class=\"Vlt-composite__append\">\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' (click)='openResource($event)'\n class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon add-button\" aria-label='Add new'>\n <svg>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\" />\n </svg>\n </button>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((ft | metaModel).touched && keyListenerActive))'\n class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required.&nbsp;</span>\n <span *ngIf=\"f.errors.custom\">{{f.errors.custom}}&nbsp;</span>\n </small>\n <small *ngIf='meta.hint' class=\"Vlt-form__element__hint\">{{meta.hint}}</small>\n</div>\n", styles: [".Vlt-form__element.no-x input.main{padding-right:40px}.Vlt-form__element--big:not(.has-value)>.Vlt-input>.Vlt-select>label>label{font-size:1.6rem;margin-top:-.8rem;top:50%}.Vlt-form__element--big input[readonly].main:not([disabled]){background:var(--vgip-meta-input-bg-color);border:1px solid var(--vgip-meta-input-border-color)}.Vlt-form__element--big:hover input[readonly].main,.Vlt-form__element--big:hover .Vlt-composite__append button,.Vlt-form__element--big:focus input[readonly].main,.Vlt-form__element--big:focus .Vlt-composite__append button,.Vlt-form__element--big.active input[readonly].main,.Vlt-form__element--big.active .Vlt-composite__append button{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.Vlt-form__element--error input[readonly].main,.Vlt-form__element--big.Vlt-form__element--error .Vlt-composite__append button{border-color:#f25a6b;box-shadow:none}.Vlt-form__element--big .Vlt-select:after{background-image:var(--vgip-meta-dropdown-icon);margin-right:2px}.Vlt-form__element--big .Vlt-form__element__hint{color:var(--vgip-meta-input-hint-color)}.Vlt-composite.has-append-button input[readonly].main{border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.Vlt-composite.has-append-button .Vlt-select:after{margin-right:-10px}.Vlt-composite__append{z-index:initial}.Vlt-composite__append button{height:48px;background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);padding-right:16px;padding-left:16px;border-left:0}.Vlt-composite__append button:hover{background:var(--vgip-meta-input-action-hover-bg-color)}.Vlt-composite__append button svg{margin:-2px 0 0;fill:var(--vgip-meta-input-accent-color)}.Vlt-dropdown__panel{width:100%}.Vlt-dropdown__panel .Vlt-dropdown__link{padding:0 20px 0 0}.Vlt-dropdown__panel .Vlt-dropdown__link.Vlt-dropdown__link--selected{background:rgba(44,45,48,.05)}.Vlt-dropdown__panel label{margin-top:0;padding:12px 20px;top:0;left:0;pointer-events:initial;position:initial;color:initial;font-size:inherit;transition:none;cursor:pointer}.Vlt-dropdown__panel label input{height:0}input.main{cursor:pointer;padding-right:76px}.Vlt-input.has-append-button .Vlt-composite__append.right-actions{right:42px}.Vlt-composite__append.right-actions{position:absolute;top:5px;right:53px;cursor:pointer}.Vlt-composite__append.right-actions .Vlt-composite__append--icon{width:36px;outline:none;position:initial;display:inline-block}.Vlt-composite__append.right-actions .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-composite__append.right-actions .Vlt-composite__append--icon:hover svg,.Vlt-composite__append.right-actions .Vlt-composite__append--icon:focus svg{fill:var(--vgip-meta-input-accent-color)}.Vlt-search_wrap{padding-top:10px}.Vlt-search_wrap .vgip-search_input{padding:8px 36px 8px 38px;width:100%;border:1px solid var(--vgip-meta-input-border-color)!important;border-radius:6px!important}.Vlt-search_wrap .vgip-search_input:focus,.Vlt-search_wrap .vgip-search_input:active,.Vlt-search_wrap .vgip-search_input:hover{border-color:var(--vgip-meta-input-active-border-color)!important}.Vlt-search_wrap .Vlt-composite__append--icon{cursor:pointer}.Vlt-search_wrap .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-search_wrap .Vlt-composite__append--icon:focus svg,.Vlt-search_wrap .Vlt-composite__append--icon:active svg,.Vlt-search_wrap .Vlt-composite__append--icon:hover svg{fill:var(--vgip-meta-input-accent-color)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.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: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i5.MetaModelPipe, name: "metaModel" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
686
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: FieldSelect, decorators: [{
687
- type: Component,
688
- args: [{ viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div class='vgip-meta-field-preview' *ngIf='preview && model'>\n <div class='vgip-meta-field-label'>{{meta.label || meta.name}}</div>\n <div class='vgip-meta-field-value __gu'>\n {{model.label || model.id || model}}\n </div>\n</div>\n<div *ngIf='!preview' class=\"Vlt-form__element\"\n [ngClass]=\"{ 'Vlt-form__element--big': !meta.small ,'has-value': f.value, active: keyListenerActive, 'Vlt-form__element--error': f.invalid && ((f | metaModel)._parent.submitted || (ft | metaModel ).touched), 'no-x': meta.noX }\">\n <div class=\"Vlt-composite Vlt-dropdown Vlt-input\" style='display: block;'\n [ngClass]=\"{ 'has-append-button': isCreatable && !disabled }\">\n <div class=\"Vlt-select\">\n <label class='wrapper'>\n <label class='Vlt-truncate'>{{meta.label || meta.name}}<span\n *ngIf='validations.required && options.length' class='Vlt-red'>*</span></label>\n <input class='main' [required]='validations.required && !!options.length' readonly [ngModel]='showText'\n #ft='ngModel' [ngModelOptions]=\"{standalone: true}\" type=\"text\"\n [placeholder]=\"meta.placeholder || ' '\" (click)='onActivated($event)' (focus)='onActivated($event)'\n (blur)='onBlur($event)' [ngClass]=\"{ 'standalone': meta.standalone }\"\n [disabled]='disabled' [attr.aria-label]='meta.label' />\n </label>\n <select class='model' [required]='validations.required && !!options.length' style='display: none;'\n [(ngModel)]='model' [ngModelOptions]=\"{standalone: meta.standalone}\"\n (ngModelChange)=\"onModelChange($event)\" #f='ngModel' [name]='name'></select>\n <div *ngIf='searching' class='search-progress'>\n <div class=\"container\">\n <div class=\"bar Vlt-bg-purple\"></div>\n </div>\n </div>\n <div class='Vlt-composite__append right-actions'>\n <div *ngIf='model && !meta.noX && !disabled' class=\"Vlt-composite__append--icon\"\n (click)='clear($event)'>\n <div class=\"Vlt-composite__icon\">\n <svg>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n <div class='Vlt-dropdown__panel'>\n <div class=\"Vlt-dropdown__panel__content Vlt-dropdown__panel__content--scroll-area\">\n <!-- <div class=\"Vlt-dropdown__title\" style='padding-left: 15px;'>\n Select ({{options.length}})\n <div class=\"Vlt-dropdown__close Vlt-white\" (click)='dismissDropdown($event)'>\n <svg class='Vlt-icon Vlt-icon--small'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div> -->\n <div class=\"Vlt-dropdown__block Vlt-search_wrap\">\n <div *ngIf=\"optionsBackup.length > 12\" class=\"Vlt-composite\">\n <div class=\"Vlt-composite__prepend Vlt-composite__prepend--icon\"\n style=\"top: 0; padding-top: 15px;\">\n <div class=\"Vlt-composite__icon\">\n <svg class='Vlt-grey'>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-search\"></use>\n </svg>\n </div>\n </div>\n <div class=\"Vlt-input\">\n <input type=\"text\" class=\"vgip-search_input\" [(ngModel)]=\"searchInputText\" placeholder=\"Search\" (input)=\"onSearchChange()\" (blur)='onBlur($event)' [ngModelOptions]=\"{standalone: true}\">\n </div>\n <div class=\"Vlt-composite__append--icon\"\n style=\"top: 2px;\" (click)=\"clearSearchField()\" [hidden]=\"searchInputText === ''\">\n <div class=\"Vlt-composite__icon\">\n <svg class='Vlt-icon Vlt-icon--small'>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/>\n </svg>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf='dropdown' class='Vlt-dropdown__scroll'>\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i }\"\n (click)='onOptionSelect($event, option)' *ngFor='let option of options; let i = index'\n class=\"Vlt-dropdown__link\">\n <div *ngIf='multiple' class=\"Vlt-checkbox\" style='width: 100%;'>\n <label>\n <span class=\"Vlt-checkbox__button\">\n <input type=\"checkbox\" [checked]='model && model.indexOf(option) !== -1' />\n <span class=\"Vlt-checkbox__icon\"></span>\n </span>\n {{option.label || (option.id === '' ? '--empty--' : option)}}\n </label>\n </div>\n <div *ngIf='!multiple' style='padding: 12px 20px;'>{{option.label || (option.id === '' ?\n '--empty--' : option)}}</div>\n </div>\n <!-- No Option Found -->\n <div class=\"Vlt-dropdown__link\" *ngIf=\"options.length === 0\">\n <div style='padding: 12px 20px;'>No Option Found</div>\n </div>\n </div>\n <div *ngIf='!multiple' class=\"Vlt-dropdown__block\"></div>\n <div *ngIf='multiple' class=\"Vlt-dropdown__block Vlt-dropdown__block--nowrap\"\n style='padding: 8px 16px 16px;'>\n <button (click)='clear($event)' type='button'\n class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--small Vlt-btn--outline\"\n style='margin-right: 8px;'>Clear all</button>\n <button (click)='dismissDropdown($event)' type='button'\n class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--small\">Done</button>\n </div>\n </div>\n </div>\n <!-- <span *ngIf='isCreatable'>\n <button type='button' (click)='openResource($event)' class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n </span> -->\n <div *ngIf='isCreatable && !disabled' class=\"Vlt-composite__append\">\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' (click)='openResource($event)'\n class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon add-button\" aria-label='Add new'>\n <svg>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\" />\n </svg>\n </button>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((ft | metaModel).touched && keyListenerActive))'\n class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required.&nbsp;</span>\n <span *ngIf=\"f.errors.custom\">{{f.errors.custom}}&nbsp;</span>\n </small>\n <small *ngIf='meta.hint' class=\"Vlt-form__element__hint\">{{meta.hint}}</small>\n</div>\n", styles: [".Vlt-form__element.no-x input.main{padding-right:40px}.Vlt-form__element--big:not(.has-value)>.Vlt-input>.Vlt-select>label>label{font-size:1.6rem;margin-top:-.8rem;top:50%}.Vlt-form__element--big input[readonly].main:not([disabled]){background:var(--vgip-meta-input-bg-color);border:1px solid var(--vgip-meta-input-border-color)}.Vlt-form__element--big:hover input[readonly].main,.Vlt-form__element--big:hover .Vlt-composite__append button,.Vlt-form__element--big:focus input[readonly].main,.Vlt-form__element--big:focus .Vlt-composite__append button,.Vlt-form__element--big.active input[readonly].main,.Vlt-form__element--big.active .Vlt-composite__append button{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.Vlt-form__element--error input[readonly].main,.Vlt-form__element--big.Vlt-form__element--error .Vlt-composite__append button{border-color:#f25a6b;box-shadow:none}.Vlt-form__element--big .Vlt-select:after{background-image:var(--vgip-meta-dropdown-icon);margin-right:2px}.Vlt-form__element--big .Vlt-form__element__hint{color:var(--vgip-meta-input-hint-color)}.Vlt-composite.has-append-button input[readonly].main{border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.Vlt-composite.has-append-button .Vlt-select:after{margin-right:-10px}.Vlt-composite__append{z-index:initial}.Vlt-composite__append button{height:48px;background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);padding-right:16px;padding-left:16px;border-left:0}.Vlt-composite__append button:hover{background:var(--vgip-meta-input-action-hover-bg-color)}.Vlt-composite__append button svg{margin:-2px 0 0;fill:var(--vgip-meta-input-accent-color)}.Vlt-dropdown__panel{width:100%}.Vlt-dropdown__panel .Vlt-dropdown__link{padding:0 20px 0 0}.Vlt-dropdown__panel .Vlt-dropdown__link.Vlt-dropdown__link--selected{background:rgba(44,45,48,.05)}.Vlt-dropdown__panel label{margin-top:0;padding:12px 20px;top:0;left:0;pointer-events:initial;position:initial;color:initial;font-size:inherit;transition:none;cursor:pointer}.Vlt-dropdown__panel label input{height:0}input.main{cursor:pointer;padding-right:76px}.Vlt-input.has-append-button .Vlt-composite__append.right-actions{right:42px}.Vlt-composite__append.right-actions{position:absolute;top:5px;right:53px;cursor:pointer}.Vlt-composite__append.right-actions .Vlt-composite__append--icon{width:36px;outline:none;position:initial;display:inline-block}.Vlt-composite__append.right-actions .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-composite__append.right-actions .Vlt-composite__append--icon:hover svg,.Vlt-composite__append.right-actions .Vlt-composite__append--icon:focus svg{fill:var(--vgip-meta-input-accent-color)}.Vlt-search_wrap{padding-top:10px}.Vlt-search_wrap .vgip-search_input{padding:8px 36px 8px 38px;width:100%;border:1px solid var(--vgip-meta-input-border-color)!important;border-radius:6px!important}.Vlt-search_wrap .vgip-search_input:focus,.Vlt-search_wrap .vgip-search_input:active,.Vlt-search_wrap .vgip-search_input:hover{border-color:var(--vgip-meta-input-active-border-color)!important}.Vlt-search_wrap .Vlt-composite__append--icon{cursor:pointer}.Vlt-search_wrap .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-search_wrap .Vlt-composite__append--icon:focus svg,.Vlt-search_wrap .Vlt-composite__append--icon:active svg,.Vlt-search_wrap .Vlt-composite__append--icon:hover svg{fill:var(--vgip-meta-input-accent-color)}\n"] }]
689
- }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i2.MetaReferenceService }, { type: i3.MetaResourceService }]; } });
690
- //// FIELD REFERENCE
691
- export class FieldReference extends FieldAbstract {
692
- constructor(componentFactoryResolver, referenceService, metaResource, metaMsgService, metaContext, metaTracker) {
693
- super();
694
- this.componentFactoryResolver = componentFactoryResolver;
695
- this.referenceService = referenceService;
696
- this.metaResource = metaResource;
697
- this.metaMsgService = metaMsgService;
698
- this.metaContext = metaContext;
699
- this.metaTracker = metaTracker;
700
- this.searchResourceType = {};
701
- this.searchTextChanged = new Subject();
702
- this.isCreatable = false;
703
- this.dropdownVisible = false;
704
- this.searchResourceTypeMeta = {
705
- type: 'select',
706
- name: 'resourceType',
707
- label: 'Type',
708
- options: [],
709
- standalone: true
710
- };
711
- this.filteredSuggestions = [];
712
- this.smartSuggestions = [];
713
- this.clickout = (event) => {
714
- const internalControl = this.elementRef.nativeElement.contains(event.target);
715
- if (internalControl && ['Vlt-dropdown__link', 'Vlt-dropdown__block'].indexOf(event.target.className) !== -1) {
716
- this.focus();
717
- }
718
- else if (!internalControl && event.target !== this.input && event.target.className !== 'Vlt-dropdown__title') {
719
- this.dismissDropdown();
720
- }
721
- else {
722
- if (!internalControl && internalControl.tagName !== 'INPUT') {
723
- this.focus();
724
- }
725
- }
726
- };
727
- this.keydown = (event) => {
728
- switch (event.key) {
729
- case 'ArrowDown': {
730
- this.showDropdown();
731
- if (typeof (this.activeSuggestionIndex) === 'undefined') {
732
- this.activeSuggestionIndex = 0;
733
- }
734
- else {
735
- this.activeSuggestionIndex++;
736
- if (this.activeSuggestionIndex >= (this.searchResults || this.suggestions).length) {
737
- this.activeSuggestionIndex = 0;
738
- }
739
- }
740
- this.ensureDropdownOptionIsVisible();
741
- event.preventDefault();
742
- event.stopPropagation();
743
- break;
744
- }
745
- case 'ArrowUp': {
746
- this.showDropdown();
747
- if (typeof (this.activeSuggestionIndex) === 'undefined') {
748
- this.activeSuggestionIndex = (this.searchResults || this.suggestions).length - 1;
749
- }
750
- else {
751
- this.activeSuggestionIndex--;
752
- if (this.activeSuggestionIndex < 0) {
753
- this.activeSuggestionIndex = (this.searchResults || this.suggestions).length - 1;
754
- }
755
- }
756
- this.ensureDropdownOptionIsVisible();
757
- event.preventDefault();
758
- event.stopPropagation();
759
- break;
760
- }
761
- case 'Space':
762
- case 'Enter': {
763
- if (typeof (this.activeSuggestionIndex) !== 'undefined') {
764
- event.preventDefault();
765
- event.stopPropagation();
766
- this.onSuggestionSelect(event, (this.searchResults || this.suggestions)[this.activeSuggestionIndex]);
767
- delete this.activeSuggestionIndex;
768
- }
769
- break;
770
- }
771
- case 'Escape': {
772
- event.preventDefault();
773
- event.stopPropagation();
774
- this.dismissDropdown();
775
- break;
776
- }
777
- case 'Backspace': {
778
- if (!this.multiple && this.model) { // HPBR-8229
779
- event.preventDefault();
780
- event.stopPropagation();
781
- this.removeSelection();
782
- }
783
- break;
784
- }
785
- }
786
- };
787
- }
788
- get disabled() {
789
- const superDisabled = this.logicalDisabled || this.validations.disabled || this.meta.disabled === true
790
- || (this.meta.updatable === false && this.isPersistedParent);
791
- this.searchResourceTypeMeta.disabled = superDisabled;
792
- return superDisabled;
793
- }
794
- get showTypes() {
795
- return (typeof (this.meta.showTypes) !== 'undefined') ? this.meta.showTypes : true;
796
- }
797
- get suggestions() {
798
- return this.smartSuggestions.concat(!this.searchResourceType.resourceType ?
799
- // eslint-disable-next-line max-len
800
- (this.asyncSuggestions || this.meta.suggestions || []) : (this.asyncSuggestions || this.meta.suggestions || []).filter((s) => s.type === this.searchResourceType.resourceType));
801
- }
802
- get hasAppendButton() {
803
- if (!this.multiple && this.model) {
804
- if (this.isPolymorphic) {
805
- for (const ref of this.metaReference) {
806
- if ((ref.name || ref.resourceType) === (this.model.type || this.model.resourceType)) {
807
- return ref.updatable || (ref.creatable && ref.updatable !== false);
808
- }
809
- }
810
- }
811
- else {
812
- return this.metaReference.updatable || (this.metaReference.creatable && this.metaReference.updatable !== false); // VGIS-6911
813
- }
814
- }
815
- else if (this.metaReference instanceof Array) {
816
- // setTimeout(() => {
817
- // this.searchResourceTypesScope = this.metaReference.map(rt => rt.name).join(',');
818
- // }, 0);
819
- for (const rt of this.metaReference) {
820
- if (rt.creatable) {
821
- return true;
822
- }
823
- }
824
- }
825
- else {
826
- return this.metaReference.creatable;
827
- }
828
- }
829
- get resourceService() {
830
- if (!this.metaResourceService) {
831
- const metaResourceConfig = {
832
- integrationCode: this.integrationCode,
833
- resourceType: this.resourceType
834
- };
835
- this.metaResourceService = this.metaResource.new(metaResourceConfig);
836
- }
837
- return this.metaResourceService;
838
- }
839
- get metaReference() {
840
- return this.meta.reference || {};
841
- }
842
- ngOnInit() {
843
- this.multiple = (this.meta.type === 'multireference') || this.meta.multiple;
844
- this.searchResourceTypeMeta.label = this.meta.label;
845
- if (!this.meta.valueType) {
846
- // this.meta.valueType = 'object';
847
- Object.defineProperty(this.meta, 'valueType', {
848
- value: 'object'
849
- });
850
- }
851
- if (this.metaReference instanceof Array) {
852
- this.isPolymorphic = true;
853
- this.isSearchable = true;
854
- this.searchResourceTypesScope = this.metaReference.map(rt => rt.name).join(',');
855
- for (const rt of this.metaReference) {
856
- if (rt.creatable) {
857
- this.isCreatable = true;
858
- if (typeof (rt.searchable) !== 'undefined' && !rt.searchable) {
859
- this.isSearchable = false;
860
- }
861
- }
862
- }
863
- this.metaReference.forEach((r) => {
864
- this.searchResourceTypeMeta.options.push({ id: r.name, label: r.label || r.name });
865
- });
866
- }
867
- else {
868
- this.isSearchable = typeof (this.metaReference.searchable) === 'undefined' || this.metaReference.searchable;
869
- this.searchResourceType = this.metaReference;
870
- this.searchResourceTypesScope = this.metaReference.name || this.metaReference.resourceType;
871
- this.isCreatable = this.metaReference.creatable;
872
- }
873
- this.buildPlaceholderLabel();
874
- this.searchTextChanged.pipe(debounceTime(300), distinctUntilChanged()).subscribe((value) => {
875
- this.searchText = value;
876
- this.search();
877
- });
878
- const origValue = this.parent[this.meta.name];
879
- // this.suggestions = this.meta.suggestions; // TODO filter by default type
880
- // console.log('this.suggestions', this.suggestions);
881
- Object.defineProperty(this.parent, this.meta.name, {
882
- set: (value) => {
883
- if (value === '') {
884
- value = null;
885
- }
886
- if (this.multiple) {
887
- if (value && value instanceof Array) {
888
- for (const v of value) {
889
- if (!this.model) {
890
- this.model = [];
891
- }
892
- if (typeof (v) === 'string') {
893
- this.model.push({
894
- id: v,
895
- label: v,
896
- type: this.metaReference.name
897
- });
898
- }
899
- }
900
- }
901
- else {
902
- value = null; // protect when value from server is not array
903
- }
904
- }
905
- else {
906
- if (typeof (value) === 'string') {
907
- value = {
908
- id: value,
909
- label: value,
910
- type: this.metaReference.name
911
- };
912
- }
913
- this.searchText = value ? ((!value.label || value.label === ' ') ? `N/A (${value.type}#${value.id})` : value.label || value) : '';
914
- // if (this.isPolymorphic && this.model) { //TODO show or not?
915
- // this.searchResourceType = this.metaReference.find((rt)=> {
916
- // return rt.name === this.model.type;
917
- // });
918
- // }
919
- }
920
- this.model = value;
921
- if (!this.multiple) {
922
- this.value = this.modelToValue(value, this.meta.valueType || 'object');
923
- this.buildExternalLink();
924
- }
925
- else {
926
- this.value = !this.model ? this.model : this.model.map((m) => this.modelToValue(m, this.meta.valueType || 'object'));
927
- }
928
- this.meta.$optional = this.isOptional;
929
- },
930
- get: () => this.value,
931
- enumerable: this.sendToServer,
932
- configurable: true
933
- });
934
- if (origValue) {
935
- this.parent[this.meta.name] = origValue;
936
- }
937
- if (!this.model && this.default) {
938
- if (this.multiple) {
939
- this.parent[this.meta.name] = [];
940
- if (this.default.length) {
941
- for (const dv of this.default) {
942
- if ((dv.id || dv.value) && dv.type) {
943
- const item = {
944
- id: dv.id || dv.value,
945
- label: dv.label || dv.id || dv.value,
946
- type: dv.type
947
- };
948
- if (dv.externalLink) {
949
- item.externalLink = dv.externalLink;
950
- }
951
- this.parent[this.meta.name].push(item);
952
- }
953
- }
954
- }
955
- if (!this.parent[this.meta.name].length) {
956
- this.clear();
957
- }
958
- }
959
- else {
960
- if (this.default.id && this.default.label && this.default.type) {
961
- setTimeout(() => {
962
- const item = {
963
- id: this.default.id || this.default.value,
964
- label: this.default.label || this.default.id || this.default.value,
965
- type: this.default.type,
966
- smart: true
967
- };
968
- if (this.default.externalLink) {
969
- item.externalLink = this.default.externalLink;
970
- }
971
- this.parent[this.meta.name] = item;
972
- }, 0);
973
- }
974
- else {
975
- console.warn('!!!default value is not valid format', this.meta);
976
- }
977
- }
978
- }
979
- if (typeof (this.meta.disabled) !== undefined) {
980
- if (typeof (this.meta.disabled) === 'object') {
981
- for (const p of Object.keys(this.meta.disabled)) {
982
- const props = p.split('.');
983
- if (typeof (this.parent[props[0]]) !== 'undefined') {
984
- let val = this.parent;
985
- for (const prop of props) {
986
- val = val[prop];
987
- if (!val) {
988
- break;
989
- }
990
- }
991
- if (val === this.meta.disabled[p]) {
992
- this.logicalDisabled = true;
993
- this.clear();
994
- }
995
- }
996
- this.parentChangeSubject.subscribe((value) => {
997
- if (value && value.hasOwnProperty(props[0])) {
998
- let val = this.parent;
999
- for (const prop of props) {
1000
- val = val[prop];
1001
- if (!val) {
1002
- break;
1003
- }
1004
- }
1005
- if (val === this.meta.disabled[p]) {
1006
- this.logicalDisabled = true;
1007
- this.clear();
1008
- }
1009
- else {
1010
- delete this.logicalDisabled;
1011
- }
1012
- }
1013
- });
1014
- }
1015
- }
1016
- }
1017
- if (this.meta.auto && this.meta.auto.search) {
1018
- const searchParams = this.meta.auto.search.params;
1019
- if (searchParams) {
1020
- for (const par of Object.keys(searchParams)) {
1021
- const props = searchParams[par].split('.');
1022
- const field = props[0];
1023
- const prop = props[1];
1024
- let parValue = this.parent[field];
1025
- if (parValue) {
1026
- if (prop) {
1027
- parValue = parValue[prop];
1028
- }
1029
- if (parValue) {
1030
- const params = {};
1031
- params[par] = parValue;
1032
- this.searchAutoSuggestions(params);
1033
- }
1034
- }
1035
- this.parentChangeSubject.subscribe((value) => {
1036
- if (value && value.hasOwnProperty(field)) {
1037
- if (value[field]) {
1038
- if (prop) {
1039
- value[field] = value[field][prop];
1040
- }
1041
- const params = {};
1042
- params[par] = value[field];
1043
- this.searchAutoSuggestions(params);
1044
- }
1045
- }
1046
- });
1047
- }
1048
- }
1049
- }
1050
- }
1051
- clearSearchResourceType() {
1052
- this.searchResourceType = {};
1053
- this.onSearchResourceTypeChanged();
1054
- }
1055
- onSearchResourceTypeChanged(resourceType) {
1056
- if (!resourceType || !resourceType.id) {
1057
- this.searchResourceType.resourceType = null;
1058
- this.searchResourceTypesScope = (this.metaReference || []).map(rt => rt.name).join(',');
1059
- }
1060
- else {
1061
- this.searchResourceType.resourceType = resourceType.id;
1062
- this.searchResourceTypesScope = resourceType.id;
1063
- }
1064
- this.buildPlaceholderLabel();
1065
- this.focus();
1066
- if (!this.model && !this.searchText) { // filter suggestions by type
1067
- this.filteredSuggestions = !resourceType ? (this.meta.suggestions || []) : (this.meta.suggestions || []).filter((s) => s.type === resourceType.id);
1068
- }
1069
- else { // regular search (return scoped results)
1070
- if (!this.model) {
1071
- this.search();
1072
- }
1073
- else if (this.searchResults && resourceType) {
1074
- this.searchResults = this.searchResults.filter((s) => s.type === resourceType.id);
1075
- }
1076
- }
1077
- delete this.searchError;
1078
- }
1079
- onSearchTextChanged(value) {
1080
- this.searchTextChanged.next(value);
1081
- }
1082
- search() {
1083
- this.searching = true;
1084
- // this.activeSuggestionIndex;
1085
- if (!this.searchText || this.searchText.length < 2) {
1086
- this.searching = false;
1087
- delete this.searchResults;
1088
- return;
1089
- }
1090
- const showSearchResults = (results) => {
1091
- this.searching = false;
1092
- delete this.searchError;
1093
- delete this.activeSuggestionIndex;
1094
- if (!results || !(results instanceof Array)) {
1095
- results = [];
1096
- }
1097
- if (this.meta.acceptNew && this.meta.acceptNew.type && this.meta.acceptNew.pattern) {
1098
- const regex = new RegExp(this.meta.acceptNew.pattern);
1099
- if (regex.test(this.searchText)) {
1100
- results.unshift({ id: null, label: this.searchText, type: this.meta.acceptNew.type });
1101
- }
1102
- }
1103
- this.searchResults = results.map((r) => {
1104
- return { id: r.id, label: r.label, type: r.type || r.resourceType || this.searchResourceType.name, externalLink: r.externalLink };
1105
- });
1106
- if (!/Vlt-dropdown--expanded/.test(this.dropdown.className)) {
1107
- this.showDropdown();
1108
- }
1109
- };
1110
- if (this.meta.search) {
1111
- const searchParams = this.meta.search.params || {};
1112
- let searchUrl = `/fields/${this.meta.name}/search`;
1113
- if (this.meta.search.url) {
1114
- searchUrl = this.meta.search.url.replace(/\${\s*([\w\.]+)\s*}/g, (match, key) => {
1115
- if (searchParams.hasOwnProperty(key)) {
1116
- const props = searchParams[key].split('.');
1117
- const field = props[0];
1118
- const prop = props[1];
1119
- delete searchParams[key]; // if it is URL param, remove it as query param
1120
- let parValue = this.parent[field];
1121
- if (parValue) {
1122
- if (prop) {
1123
- parValue = parValue[prop];
1124
- }
1125
- if (parValue) {
1126
- return parValue;
1127
- }
1128
- }
1129
- }
1130
- return 'undefined';
1131
- });
1132
- }
1133
- for (const p of Object.keys(searchParams)) {
1134
- searchUrl += `${searchUrl.indexOf('?') === -1 ? '?' : '&'}${encodeURIComponent(p)}=${encodeURIComponent(searchParams[p])}`;
1135
- }
1136
- searchUrl += `${searchUrl.indexOf('?') === -1 ? '?' : '&'}q=${encodeURIComponent(this.searchText)}`;
1137
- this.searching = true;
1138
- this.resourceService.getByPath(searchUrl).subscribe((results) => {
1139
- showSearchResults(results);
1140
- }, (error) => {
1141
- delete this.searching;
1142
- this.searchResults = [];
1143
- this.searchError = error.error ? error.error.message || error.error : error.message || error;
1144
- if (!/Vlt-dropdown--expanded/.test(this.dropdown.className)) {
1145
- this.showDropdown();
1146
- }
1147
- });
1148
- }
1149
- else {
1150
- if (!this.vr) {
1151
- this.vr = this.metaResource.new({
1152
- integrationCode: this.integrationCode,
1153
- resourceType: null
1154
- });
1155
- }
1156
- this.vr.searchIntegration(this.searchText, this.searchResourceType.name || this.searchResourceTypesScope).subscribe((results) => {
1157
- showSearchResults(results);
1158
- }, (error) => {
1159
- this.searching = false;
1160
- this.searchResults = [];
1161
- this.searchError = error.error ? error.error.message || error.error : error.message || error;
1162
- if (!/Vlt-dropdown--expanded/.test(this.dropdown.className)) {
1163
- this.showDropdown();
1164
- }
1165
- });
1166
- }
1167
- }
1168
- onActivated(ev) {
1169
- // ev.preventDefault();
1170
- // ev.stopPropagation();
1171
- this.input = ev.srcElement;
1172
- if (!this.dropdown) {
1173
- // this.dropdown = ev.srcElement.parentNode.parentNode;
1174
- this.dropdown = this.elementRef.nativeElement.querySelector('.dropdown-wrapper');
1175
- }
1176
- this.showDropdown();
1177
- }
1178
- onBlur(ev) {
1179
- let internalControl = false;
1180
- if (ev.relatedTarget) {
1181
- if (!this.elementRef.nativeElement.contains(ev.relatedTarget)) {
1182
- this.dismissDropdown();
1183
- }
1184
- else {
1185
- internalControl = true;
1186
- }
1187
- }
1188
- if (this.keyListenerActive && !internalControl) {
1189
- this.input.removeEventListener('keydown', this.keydown);
1190
- setTimeout(() => {
1191
- if (!this.keyListenerActive) {
1192
- document.removeEventListener('click', this.clickout);
1193
- }
1194
- }, 400);
1195
- delete this.keyListenerActive;
1196
- }
1197
- }
1198
- removeSelection() {
1199
- if (this.model && !this.suggestions.find((s) => (s.id === this.model.id && s.type === this.model.type))) {
1200
- this.smartSuggestions.push({
1201
- id: this.model.id,
1202
- label: this.model.label,
1203
- type: this.model.type,
1204
- smart: true
1205
- });
1206
- }
1207
- this.metaTracker.emit(this.buildTrackEvent('REMOVE'));
1208
- this.clear();
1209
- }
1210
- onSuggestionSelect(ev, suggestion) {
1211
- if (!suggestion) {
1212
- return;
1213
- }
1214
- ev.preventDefault();
1215
- ev.stopPropagation();
1216
- this.focus();
1217
- this.metaTracker.emit(this.buildTrackEvent('SELECT'));
1218
- if (this.multiple) {
1219
- if (!this.model) {
1220
- this.model = [];
1221
- }
1222
- let existingEntry;
1223
- for (const entry of this.model) {
1224
- if (suggestion.id && (entry.id === suggestion.id)) {
1225
- existingEntry = entry;
1226
- break;
1227
- }
1228
- else if (suggestion.label === entry.label) { // create new (google emails)
1229
- existingEntry = entry;
1230
- break;
1231
- }
1232
- }
1233
- if (!existingEntry) {
1234
- this.model.push(suggestion);
1235
- }
1236
- this.onModelChange(this.model);
1237
- delete this.searchText;
1238
- this.searchTextChanged.next();
1239
- }
1240
- else {
1241
- this.model = suggestion;
1242
- this.externalLink = suggestion.externalLink;
1243
- this.onModelChange(suggestion);
1244
- this.searchText = suggestion.label;
1245
- this.activeSuggestionIndex = (this.searchResults || this.suggestions).indexOf(suggestion);
1246
- }
1247
- this.dismissDropdown();
1248
- // if (this.isPolymorphic) {
1249
- // this.searchResourceType = this.metaReference.find((rt)=> {
1250
- // return rt.name === suggestion.type;
1251
- // });
1252
- // }
1253
- }
1254
- showDropdown() {
1255
- this.dropdownVisible = true;
1256
- this.dropdown.classList.add('Vlt-dropdown--expanded');
1257
- if (!this.keyListenerActive) {
1258
- this.input.addEventListener('keydown', this.keydown);
1259
- setTimeout(() => {
1260
- document.addEventListener('click', this.clickout);
1261
- }, 200);
1262
- this.keyListenerActive = true;
1263
- }
1264
- if (typeof (this.activeSuggestionIndex) === 'undefined') {
1265
- if (this.model && (this.searchResults || this.suggestions)) {
1266
- for (let suggestionIndex = 0; suggestionIndex < (this.searchResults || this.suggestions).length; suggestionIndex++) {
1267
- const item = (this.searchResults || this.suggestions)[suggestionIndex];
1268
- if (this.model.id === item.id && this.model.type === item.type) {
1269
- this.activeSuggestionIndex = suggestionIndex;
1270
- break;
1271
- }
1272
- }
1273
- }
1274
- }
1275
- this.ensureDropdownIsVisible();
1276
- }
1277
- dismissDropdown(event) {
1278
- this.dropdownVisible = false;
1279
- if (event) {
1280
- this.focus();
1281
- }
1282
- if (this.dropdown) {
1283
- this.dropdown.classList.remove('Vlt-dropdown--expanded');
1284
- }
1285
- }
1286
- clear() {
1287
- this.prevModel = this.model;
1288
- delete this.searchText;
1289
- delete this.searchResults;
1290
- delete this.model;
1291
- delete this.activeSuggestionIndex;
1292
- this.onModelChange(this.model);
1293
- this.onSearchTextChanged(this.searchText);
1294
- this.focus();
1295
- }
1296
- revert() {
1297
- this.model = this.prevModel;
1298
- delete this.prevModel;
1299
- this.onModelChange(this.model);
1300
- this.focus();
1301
- }
1302
- remove(ev, item) {
1303
- ev.preventDefault();
1304
- ev.stopPropagation();
1305
- const optionIndex = this.model.indexOf(item);
1306
- if (optionIndex !== -1) {
1307
- this.model.splice(optionIndex, 1);
1308
- if (!this.model.length) {
1309
- delete this.model;
1310
- delete this.value;
1311
- }
1312
- this.onModelChange(this.model);
1313
- }
1314
- }
1315
- openResource(model) {
1316
- this.keyListenerActive = true; // suppress dropdown in this case
1317
- setTimeout(() => {
1318
- this.dismissDropdown();
1319
- });
1320
- const refDialogFactory = this.componentFactoryResolver.resolveComponentFactory(MetaRefDialog);
1321
- this.metaTracker.emit(this.buildTrackEvent(model ? 'EDIT' : 'NEW'));
1322
- let theme = this.elementRef.nativeElement.dataset.theme;
1323
- if (!theme || theme === 'inherit') {
1324
- let parentComponent = this.elementRef.nativeElement.closest('vgip-meta-layout');
1325
- if (parentComponent) {
1326
- theme = parentComponent.dataset.theme;
1327
- }
1328
- if (!theme || theme === 'inherit') {
1329
- parentComponent = this.elementRef.nativeElement.closest('vgip-meta-resource');
1330
- if (parentComponent) {
1331
- theme = parentComponent.dataset.theme;
1332
- }
1333
- }
1334
- }
1335
- this.referenceService.openDialog(refDialogFactory, this.metaResource, this.integrationCode, this.metaReference, model, null, this.searchResourceType.resourceType, theme).subscribe((result) => {
1336
- if (result) {
1337
- this.parent[this.meta.name] = result;
1338
- this.onChange.emit(result);
1339
- const existingSuggestion = (this.meta.suggestions || []).find((s) => (s.id === result.id && s.type === result.type));
1340
- if (existingSuggestion) {
1341
- existingSuggestion.label = result.label;
1342
- }
1343
- else {
1344
- if (!this.meta.suggestions) {
1345
- this.meta.suggestions = [];
1346
- }
1347
- this.meta.suggestions.unshift(result);
1348
- }
1349
- this.metaTracker.emit(this.buildTrackEvent(model ? 'UPDATE' : 'CREATE', result.type || result.resourceType));
1350
- }
1351
- else {
1352
- this.metaTracker.emit(this.buildTrackEvent(model ? 'CANCEL_EDIT' : 'CANCEL_UPDATE'));
1353
- }
1354
- });
1355
- }
1356
- ensureDropdownIsVisible() {
1357
- setTimeout(() => {
1358
- const holder = this.dropdown.closest('.Vlt-card__content');
1359
- if (holder) {
1360
- const el = this.elementRef.nativeElement.querySelector('.Vlt-dropdown__panel');
1361
- const elRect = el.getBoundingClientRect();
1362
- const holderRect = holder.getBoundingClientRect();
1363
- if (holderRect.top + holderRect.height < elRect.top + elRect.height) {
1364
- el.scrollIntoView({ block: 'end' });
1365
- }
1366
- }
1367
- }, 400);
1368
- }
1369
- ensureDropdownOptionIsVisible() {
1370
- if (!this.dropdownScrollContainer) {
1371
- this.dropdownScrollContainer = this.dropdown.querySelector('.Vlt-dropdown__scroll');
1372
- }
1373
- if (this.dropdownScrollContainer && typeof (this.activeSuggestionIndex) === 'number') {
1374
- const scrollTop = 44 * this.activeSuggestionIndex;
1375
- const scrollBottom = 44 * (this.activeSuggestionIndex - 7);
1376
- if (scrollTop < this.dropdownScrollContainer.scrollTop) {
1377
- this.dropdownScrollContainer.scrollTop = scrollTop;
1378
- }
1379
- else if (scrollBottom > this.dropdownScrollContainer.scrollTop) {
1380
- this.dropdownScrollContainer.scrollTop = scrollBottom;
1381
- }
1382
- }
1383
- }
1384
- buildTrackEvent(action, value) {
1385
- const e = {
1386
- integration: this.integrationCode,
1387
- resource: this.model ? (this.model.type || this.model.resourceType) : this.searchResourceType.resourceType,
1388
- field: this.meta.name,
1389
- action
1390
- };
1391
- if (this.meta.$isContactable) {
1392
- e.isContactable = true;
1393
- }
1394
- if (typeof (value) !== 'undefined') {
1395
- e.value = value;
1396
- }
1397
- return e;
1398
- }
1399
- buildPlaceholderLabel() {
1400
- this.placeHolderLabel = this.meta.label;
1401
- if (this.multiple && !this.isPolymorphic) {
1402
- this.placeHolderLabel = '+Add ';
1403
- }
1404
- else {
1405
- this.placeHolderLabel = (this.isSearchable && (this.multiple || !this.isPolymorphic)) ? 'Search ' : '';
1406
- }
1407
- this.placeHolderLabel += this.searchResourceType.resourceType ? this.searchResourceType.resourceType : this.searchResourceTypesScope;
1408
- }
1409
- buildExternalLink() {
1410
- if (this.model) {
1411
- if (this.model.externalLink) {
1412
- this.externalLink = this.model.externalLink;
1413
- }
1414
- else if (this.metaContext.profiles[this.integrationCode.toUpperCase()]) {
1415
- delete this.externalLink;
1416
- this.metaMsgService.sendMessage(this.integrationCode.toUpperCase(), {
1417
- action: 'buildExternalLink',
1418
- integrationCode: this.integrationCode,
1419
- ref: this.model,
1420
- profile: this.metaContext.profiles[this.integrationCode.toUpperCase()]
1421
- }, (response) => {
1422
- if (!response.error) {
1423
- this.externalLink = response.externalLink;
1424
- }
1425
- else {
1426
- console.warn('No external link support for', this.integrationCode, this.model.resourceType || this.model.type);
1427
- }
1428
- });
1429
- }
1430
- }
1431
- else {
1432
- delete this.externalLink;
1433
- }
1434
- }
1435
- searchAutoSuggestions(params) {
1436
- let searchUrl = `/suggestions/${this.meta.name}/search`;
1437
- if (this.meta.auto && this.meta.auto.search) {
1438
- if (this.meta.auto.search.url) {
1439
- searchUrl = this.meta.auto.search.url.replace(/\${\s*([\w\.]+)\s*}/g, (match, key) => {
1440
- if (params.hasOwnProperty(key)) {
1441
- const val = params[key];
1442
- delete params[key];
1443
- return val;
1444
- }
1445
- return '';
1446
- });
1447
- }
1448
- for (const p of Object.keys(params)) {
1449
- searchUrl += `${searchUrl.indexOf('?') === -1 ? '?' : '&'}${encodeURIComponent(p)}=${encodeURIComponent(params[p])}`;
1450
- }
1451
- this.searching = true;
1452
- this.resourceService.getByPath(searchUrl).subscribe((result) => {
1453
- delete this.searching;
1454
- if (result) {
1455
- let suggestions;
1456
- suggestions = result;
1457
- if (this.meta.auto.search.extract) {
1458
- suggestions = result[this.meta.auto.search.extract];
1459
- }
1460
- if (suggestions instanceof Array !== true) {
1461
- suggestions = [suggestions];
1462
- }
1463
- const asyncSuggestions = [];
1464
- suggestions.forEach((s) => {
1465
- if (s && s.id && s.type) { // TOOD check the type is acceptable
1466
- asyncSuggestions.push({
1467
- id: s.id,
1468
- label: s.label || `${s.type}#${s.id}`,
1469
- type: s.type
1470
- });
1471
- }
1472
- });
1473
- if (asyncSuggestions.length) {
1474
- if (asyncSuggestions.length === 1) {
1475
- this.parent[this.meta.name] = asyncSuggestions[0];
1476
- }
1477
- else {
1478
- delete this.asyncSuggestions;
1479
- }
1480
- }
1481
- this.asyncSuggestions = asyncSuggestions;
1482
- }
1483
- }, (err) => {
1484
- delete this.searching;
1485
- });
1486
- }
1487
- }
1488
- }
1489
- FieldReference.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: FieldReference, deps: [{ token: i0.ComponentFactoryResolver }, { token: i2.MetaReferenceService }, { token: i3.MetaResourceService }, { token: i6.MetaMsgService }, { token: i7.MetaContextService }, { token: i8.MetaTrackerService }], target: i0.ɵɵFactoryTarget.Component });
1490
- FieldReference.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: FieldReference, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class='vgip-meta-field-preview' *ngIf='preview && model && (!multiple || (multiple && model.length))'>\n <div class='vgip-meta-field-label'>{{meta.label || meta.name}}</div>\n <div *ngIf='!multiple' class='vgip-meta-field-value __gu'>\n <svg class=\"Vlt-icon Vlt-icon--smaller\" style='margin-top: -3px;'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n {{model.label || model.id}} <span class='Vlt-grey'>({{model.type}})</span>\n </div>\n <div *ngIf='multiple' class='vgip-meta-field-value __gu'>\n <span *ngFor='let m of (model || [])' class='Vlt-badge Vlt-badge--app'>\n {{m.label || m.id || m}} <span class='Vlt-grey-dark' *ngIf='isPolymorphic'>({{m.type}})</span>\n </span>\n </div>\n</div>\n<div *ngIf='!preview' class=\"meta-field-reference Vlt-form__element Vlt-form__element--big\" [ngClass]=\"{ 'Vlt-form__element--error': (searchError && keyListenerActive) || (f.invalid && ((f | metaModel)._parent.submitted || (ft | metaModel ).touched)), 'multiple': multiple, 'has-value': model, active: keyListenerActive }\">\n <div *ngIf='multiple' class='items-container' [ngClass]='{ creatable: isCreatable }'>\n <div *ngIf='model' class='badges-container keep-focus' (click)='focus()' style='width: 100%;'>\n <div *ngFor='let item of model' class=\"Vlt-badge Vlt-badge--app Vlt-badge--large keep-focus\" [ngClass]=\"{ grid: (item.label || item.id || '').length > 56}\">\n <span class='Vlt-truncate'>{{item.label || item.id || item }} <span *ngIf='isPolymorphic' class='Vlt-grey-dark' style='font-weight: normal;'>({{item.type}})</span></span>\n <button class=\"Vlt-badge__dismiss keep-focus\" (click)='remove($event, item)' style='position: absolute; right: 12px; top: 8px;' aria-label='Remove'></button>\n </div>\n </div>\n </div>\n <div class=\"Vlt-composite\">\n <div class='dropdown-wrapper Vlt-dropdown' style='width: 100%; position: absolute; top: 48px;'>\n <div class=\"Vlt-dropdown__panel\">\n <div *ngIf='searchError'>\n <div class=\"Vlt-callout Vlt-callout--critical keep-focus\">\n <i></i>\n <div class=\"Vlt-callout__content\">{{searchError}}</div>\n </div>\n </div>\n <div *ngIf='!searchError && (suggestions.length || searchResults)' [ngClass]=\"{ suggestions: !searchResults}\" class=\"Vlt-dropdown__panel__content Vlt-dropdown__panel__content--scroll-area\" style='padding: 0;'>\n <div class=\"Vlt-dropdown__block\"></div>\n <div *ngIf='!searchResults' class=\"Vlt-dropdown__scroll\">\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i, smart: suggestion.smart }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of suggestions; let i = index' class=\"Vlt-dropdown__link has-type\">\n <svg class='Vlt-icon Vlt-icon--small'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n <div class='__gu' [title]='suggestion.label'>{{ suggestion.label }}</div>\n <small class='Vlt-grey-dark' style='text-transform: capitalize;'>{{suggestion.type}}</small>\n </div>\n </div>\n <div *ngIf='searchResults' class=\"Vlt-dropdown__scroll\">\n <div *ngIf='!searchResults.length' class='Vlt-dropdown__block'> No records matching '<b style='pointer-events: none;'>{{searchText}}</b>' were found.</div>\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of searchResults; let i = index' class=\"Vlt-dropdown__link has-type\">\n <svg class='Vlt-icon Vlt-icon--small'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n <div class='__gu' [title]='suggestion.label'>{{ suggestion.label }}</div>\n <small class='Vlt-grey-dark' style='text-transform: capitalize;'>{{suggestion.type}}</small>\n </div>\n </div>\n <!-- <div *ngIf='searchResults' class=\"Vlt-dropdown__block\" style='text-align: right; padding-top: 0;'>\n <small>\n {{ searchResults ? searchResults.length+' results' : 'Suggestions' }} <span style='font-style: italic; font-weight: normal;' *ngIf='searchResults'>~{{ model ? 'last search' : searchText}}</span>\n </small>\n </div> -->\n <div class=\"Vlt-dropdown__block\"></div>\n </div>\n </div>\n </div>\n <div class=\"Vlt-composite__prepend\" *ngIf='isPolymorphic && showTypes && (multiple || !model || (dropdownVisible && ((suggestions || searchResults || []).length || searchResourceType.resourceType)))'>\n <div class=\"search-scope\" [ngClass]=\"{ 'has-value': searchResourceType.resourceType }\">\n <vgip-meta-field class='shown' [meta]='searchResourceTypeMeta' [parent]='searchResourceType' (onChange)='onSearchResourceTypeChanged($event)' (onLeave)='onBlur($event)' [integrationCode]='integrationCode' theme='inherit'></vgip-meta-field>\n <svg class='Vlt-icon Vlt-grey Vlt-icon--smaller visible-mobile mobile-icon' style='position: absolute; top: 15px; left: 14px; pointer-events: none;'>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-menu\"/>\n </svg>\n <label class='mobile-label hidden-mobile hidden-desktop'>Search</label>\n </div>\n </div>\n <div *ngIf='!(isPolymorphic && showTypes && (multiple || !model || dropdownVisible))'><!-- required by css --></div>\n <div class=\"Vlt-composite__wrapper Vlt-input\" style='overflow: hidden;' [ngClass]=\"{ 'has-append-button': hasAppendButton && !disabled }\">\n <label class='wrapper'>\n <div class=\"Vlt-composite__prepend Vlt-composite__prepend--icon\" style='top: 0; padding-top: 15px;'>\n <div class=\"Vlt-composite__icon\">\n <svg *ngIf='isSearchable && (!model || multiple)' class='Vlt-grey'><use attr.xlink:href=\"volta/volta-icons.svg#Vlt-icon-{{ multiple ? 'stack' : 'search'}}\"/></svg>\n <svg *ngIf='!isSearchable || (model && !multiple)' [ngStyle]=\"{fill: integrationIcon === 'Brand-icon-vonage' ? 'var(--vgip-meta-input-color)' : ''}\"><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n </div>\n <div *ngIf='suggestions.length' class=\"Vlt-badge Vlt-badge--small Vlt-badge--purple\" style='padding: 0px 4px; position: absolute; top: 26px; left: 4px; pointer-events: none; min-width: 14px;'>{{suggestions.length}}</div>\n </div>\n <input class='model' type='hidden' [required]='validations.required' [(ngModel)]='model' #f='ngModel' [name]='name' />\n <input class='main' [readonly]='!isSearchable || (model && !multiple)' [ngModel]='searchText' #ft='ngModel' (ngModelChange)='onSearchTextChanged($event)' [ngModelOptions]=\"{standalone: true}\" type=\"text\" placeholder=\"{{ placeHolderLabel || ' ' }}\" [ngClass]='{ ext: externalLink }' (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)' [disabled]='disabled' [title]=\"model ? model.label : ''\"/>\n <label class='Vlt-truncate hidden-mobile' style='padding-left: 25px; padding-right: 42px;'>{{ (multiple && isPolymorphic) ? '+Add ' : ((model || !isPolymorphic) ? meta.label : ( meta.searchLabel || 'Search')) }}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span style='color: var(--vgip-meta-input-color); text-transform: capitalize;' *ngIf='model'>({{model.type || model.resourceType || model.length}})</span></label>\n <label class='Vlt-truncate hidden-desktop' style='padding-left: 25px; padding-right: 42px;'>{{meta.label || meta.name}}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span style='color: var(--vgip-meta-input-color); text-transform: capitalize;' *ngIf='model'>({{model.type || model.resourceType || model.length}})</span></label>\n </label>\n <div *ngIf='searching' class='search-progress'>\n <div class=\"container\">\n <div class=\"bar Vlt-bg-purple\"></div>\n </div>\n </div>\n <div class='Vlt-composite__append right-actions'>\n <!-- <div *ngIf='prevModel && !model' class=\"Vlt-composite__append--icon\" (click)='revert()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-reply\"/></svg>\n </div>\n </div> -->\n <div *ngIf='model && !multiple' class=\"Vlt-composite__append--icon\" (click)='removeSelection()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div>\n <a [href]='externalLink || model.externalLink' target='_blank' rel='noopener' *ngIf='externalLink && (model && !multiple)' class=\"Vlt-composite__append--icon\" aria-label='Open external'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-open\"/></svg>\n </div>\n </a>\n </div>\n </div>\n <!-- <span *ngIf='hasCreatables'>\n <button type='button' *ngIf='!model || multiple' (click)='openResource()' class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n <button type='button' *ngIf='model && !multiple' (click)='openResource(model)' class=\"Vlt-btn Vlt-btn--primary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg>\n </button>\n </span> -->\n <div *ngIf='hasAppendButton && !disabled' class=\"Vlt-composite__append\">\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' *ngIf='!model || multiple' (click)='openResource()' class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon\" aria-label='Add new'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' *ngIf='model && !multiple' (click)='openResource(model)' class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon\" aria-label='Edit'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg>\n </button>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((ft | metaModel).touched && keyListenerActive))' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required</span>\n <span *ngIf=\"f.errors.pattern\">Should match '{{validations.pattern}}' pattern</span>\n <span *ngIf=\"f.errors.custom\">{{f.errors.custom}}&nbsp;</span>\n </small>\n <small *ngIf='meta.helpText || meta.hint' class=\"Vlt-form__element__hint\">{{meta.helpText || meta.hint}}</small>\n</div>\n", styles: [".Vlt-form__element--big .Vlt-input input:placeholder-shown:not(:focus)~label.Vlt-truncate{font-size:1.6rem;margin-top:-.8rem;top:50%}.Vlt-form__element--big ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-right:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.Vlt-form__element--big:hover .items-container,.Vlt-form__element--big:hover .main,.Vlt-form__element--big:hover .Vlt-composite__append button,.Vlt-form__element--big:hover ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone,.Vlt-form__element--big.active .items-container,.Vlt-form__element--big.active .main,.Vlt-form__element--big.active .Vlt-composite__append button,.Vlt-form__element--big.active ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.Vlt-form__element--error .items-container,.Vlt-form__element--big.Vlt-form__element--error .main,.Vlt-form__element--big.Vlt-form__element--error .Vlt-composite__append button,.Vlt-form__element--big.Vlt-form__element--error ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:#f25a6b}.Vlt-form__element--big.multiple .Vlt-composite.Vlt-dropdown{margin-top:3px}.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .Vlt-composite__append button,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .Vlt-composite__append button,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.multiple .items-container{background-color:var(--vgip-meta-input-bg-color);border:1px solid var(--vgip-meta-input-border-color);border-bottom:0;border-top-left-radius:6px;border-top-right-radius:6px}.Vlt-form__element--big.multiple .items-container .badges-container{overflow:auto;padding:6px 4px 3px 6px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge{margin-bottom:3px;margin-left:0;margin-right:3px;overflow:hidden;max-width:100%;position:relative;padding-right:30px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge.grid{display:grid}.Vlt-form__element--big.multiple:not(.has-value) .items-container{border:0}.Vlt-form__element--big.multiple.has-value .main,.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button,.Vlt-form__element--big.multiple.has-value ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-top-left-radius:0;border-top-right-radius:0;height:48px}.Vlt-form__element--big.multiple.has-value .main:not(.Vlt-btn--icon),.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button:not(.Vlt-btn--icon),.Vlt-form__element--big.multiple.has-value ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone:not(.Vlt-btn--icon){border-top:0}.Vlt-form__element--big.multiple.has-value .Vlt-composite__prepend ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-top-right-radius:6px}.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button{border-top-left-radius:6px;border-top:0}.Vlt-composite__prepend{z-index:initial}.Vlt-composite__prepend--icon{top:0;padding-top:15px;left:3px}.Vlt-input.has-append-button .Vlt-composite__append.right-actions{right:0}.Vlt-input.has-append-button .Vlt-composite__append.right-actions .Vlt-composite__append--icon:last-child{width:36px}.Vlt-composite__append.right-actions{position:absolute;top:5px;right:5px;cursor:pointer}.Vlt-composite__append.right-actions .Vlt-composite__append--icon{outline:none;position:initial;display:inline-block}.Vlt-composite__append.right-actions .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-composite__append.right-actions .Vlt-composite__append--icon:hover svg,.Vlt-composite__append.right-actions .Vlt-composite__append--icon:focus svg{fill:var(--vgip-meta-input-accent-color)}.Vlt-composite__append button{height:48px;padding-right:16px;background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);padding-left:16px;border-left:0}.Vlt-composite__append button:hover{background:var(--vgip-meta-input-action-hover-bg-color)}.Vlt-composite__append button svg{margin:-2px 0 0;fill:var(--vgip-meta-input-accent-color)}.Vlt-input input{padding-left:38px;text-overflow:ellipsis;padding-right:36px}.Vlt-input input.ext{padding-right:72px}.Vlt-composite__wrapper.has-append-button input.main{border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.Vlt-input input{background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);font-weight:700}.Vlt-dropdown__panel{max-width:100%;width:100%;min-width:280px}.Vlt-dropdown__panel .Vlt-dropdown__link.smart{font-weight:700;background:var(--vgip-meta-dropdown-bg-color)}.Vlt-dropdown__panel .Vlt-dropdown__link.smart.hidden{display:none}.Vlt-dropdown__panel .Vlt-dropdown__link.bold:after{background-color:#e1e2e6;content:\"\";height:1px;left:0;position:absolute;right:0;bottom:0}.Vlt-dropdown__panel .Vlt-dropdown__link--selected{background:rgba(44,45,48,.05)}.Vlt-dropdown__panel .Vlt-dropdown__link>div{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.Vlt-dropdown__panel .Vlt-dropdown__link>svg{margin-right:8px}.vgip-meta-field-preview .Vlt-badge{margin:1px 3px 1px 0;overflow:hidden;max-width:100%}:host .search-scope{width:130px}:host .search-scope ::ng-deep .Vlt-form__element.has-value .Vlt-select:after{display:none}:host .search-scope ::ng-deep .Vlt-form__element .right-actions{right:12px}:host .search-scope ::ng-deep .Vlt-form__element label.Vlt-truncate{padding-right:48px}:host .search-scope .mobile-icon{display:none}@media only screen and (max-width: 575px){:host .search-scope{width:60px}:host .search-scope:not(.has-value) .mobile-icon{display:block}:host .search-scope.has-value .mobile-label{display:block}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big .Vlt-composite__append{display:none}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big .Vlt-select:after{margin-right:-7px}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big label.Vlt-truncate{visibility:hidden}}:host .search-scope ::ng-deep vgip-meta-field .Vlt-input input.main.standalone{padding-right:initial;background:var(--vgip-meta-input-accent-bg-color);border-color:var(--vgip-meta-input-border-color)}:host .search-scope ::ng-deep vgip-meta-field .Vlt-form__element{padding:0}:host .search-scope ::ng-deep vgip-meta-field .Vlt-form__element .Vlt-dropdown__panel{width:initial}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.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: i0.forwardRef(function () { return i4.NgControlStatus; }), selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i0.forwardRef(function () { return i4.RequiredValidator; }), selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.NgModel; }), selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i0.forwardRef(function () { return MetaField; }), selector: "vgip-meta-field", inputs: ["meta", "parent", "integrationCode", "resourceType", "index", "preview", "theme"], outputs: ["onChange", "onLeave"] }, { kind: "pipe", type: i0.forwardRef(function () { return i5.MetaModelPipe; }), name: "metaModel" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
1491
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: FieldReference, decorators: [{
1492
- type: Component,
1493
- args: [{ viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div class='vgip-meta-field-preview' *ngIf='preview && model && (!multiple || (multiple && model.length))'>\n <div class='vgip-meta-field-label'>{{meta.label || meta.name}}</div>\n <div *ngIf='!multiple' class='vgip-meta-field-value __gu'>\n <svg class=\"Vlt-icon Vlt-icon--smaller\" style='margin-top: -3px;'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n {{model.label || model.id}} <span class='Vlt-grey'>({{model.type}})</span>\n </div>\n <div *ngIf='multiple' class='vgip-meta-field-value __gu'>\n <span *ngFor='let m of (model || [])' class='Vlt-badge Vlt-badge--app'>\n {{m.label || m.id || m}} <span class='Vlt-grey-dark' *ngIf='isPolymorphic'>({{m.type}})</span>\n </span>\n </div>\n</div>\n<div *ngIf='!preview' class=\"meta-field-reference Vlt-form__element Vlt-form__element--big\" [ngClass]=\"{ 'Vlt-form__element--error': (searchError && keyListenerActive) || (f.invalid && ((f | metaModel)._parent.submitted || (ft | metaModel ).touched)), 'multiple': multiple, 'has-value': model, active: keyListenerActive }\">\n <div *ngIf='multiple' class='items-container' [ngClass]='{ creatable: isCreatable }'>\n <div *ngIf='model' class='badges-container keep-focus' (click)='focus()' style='width: 100%;'>\n <div *ngFor='let item of model' class=\"Vlt-badge Vlt-badge--app Vlt-badge--large keep-focus\" [ngClass]=\"{ grid: (item.label || item.id || '').length > 56}\">\n <span class='Vlt-truncate'>{{item.label || item.id || item }} <span *ngIf='isPolymorphic' class='Vlt-grey-dark' style='font-weight: normal;'>({{item.type}})</span></span>\n <button class=\"Vlt-badge__dismiss keep-focus\" (click)='remove($event, item)' style='position: absolute; right: 12px; top: 8px;' aria-label='Remove'></button>\n </div>\n </div>\n </div>\n <div class=\"Vlt-composite\">\n <div class='dropdown-wrapper Vlt-dropdown' style='width: 100%; position: absolute; top: 48px;'>\n <div class=\"Vlt-dropdown__panel\">\n <div *ngIf='searchError'>\n <div class=\"Vlt-callout Vlt-callout--critical keep-focus\">\n <i></i>\n <div class=\"Vlt-callout__content\">{{searchError}}</div>\n </div>\n </div>\n <div *ngIf='!searchError && (suggestions.length || searchResults)' [ngClass]=\"{ suggestions: !searchResults}\" class=\"Vlt-dropdown__panel__content Vlt-dropdown__panel__content--scroll-area\" style='padding: 0;'>\n <div class=\"Vlt-dropdown__block\"></div>\n <div *ngIf='!searchResults' class=\"Vlt-dropdown__scroll\">\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i, smart: suggestion.smart }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of suggestions; let i = index' class=\"Vlt-dropdown__link has-type\">\n <svg class='Vlt-icon Vlt-icon--small'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n <div class='__gu' [title]='suggestion.label'>{{ suggestion.label }}</div>\n <small class='Vlt-grey-dark' style='text-transform: capitalize;'>{{suggestion.type}}</small>\n </div>\n </div>\n <div *ngIf='searchResults' class=\"Vlt-dropdown__scroll\">\n <div *ngIf='!searchResults.length' class='Vlt-dropdown__block'> No records matching '<b style='pointer-events: none;'>{{searchText}}</b>' were found.</div>\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of searchResults; let i = index' class=\"Vlt-dropdown__link has-type\">\n <svg class='Vlt-icon Vlt-icon--small'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n <div class='__gu' [title]='suggestion.label'>{{ suggestion.label }}</div>\n <small class='Vlt-grey-dark' style='text-transform: capitalize;'>{{suggestion.type}}</small>\n </div>\n </div>\n <!-- <div *ngIf='searchResults' class=\"Vlt-dropdown__block\" style='text-align: right; padding-top: 0;'>\n <small>\n {{ searchResults ? searchResults.length+' results' : 'Suggestions' }} <span style='font-style: italic; font-weight: normal;' *ngIf='searchResults'>~{{ model ? 'last search' : searchText}}</span>\n </small>\n </div> -->\n <div class=\"Vlt-dropdown__block\"></div>\n </div>\n </div>\n </div>\n <div class=\"Vlt-composite__prepend\" *ngIf='isPolymorphic && showTypes && (multiple || !model || (dropdownVisible && ((suggestions || searchResults || []).length || searchResourceType.resourceType)))'>\n <div class=\"search-scope\" [ngClass]=\"{ 'has-value': searchResourceType.resourceType }\">\n <vgip-meta-field class='shown' [meta]='searchResourceTypeMeta' [parent]='searchResourceType' (onChange)='onSearchResourceTypeChanged($event)' (onLeave)='onBlur($event)' [integrationCode]='integrationCode' theme='inherit'></vgip-meta-field>\n <svg class='Vlt-icon Vlt-grey Vlt-icon--smaller visible-mobile mobile-icon' style='position: absolute; top: 15px; left: 14px; pointer-events: none;'>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-menu\"/>\n </svg>\n <label class='mobile-label hidden-mobile hidden-desktop'>Search</label>\n </div>\n </div>\n <div *ngIf='!(isPolymorphic && showTypes && (multiple || !model || dropdownVisible))'><!-- required by css --></div>\n <div class=\"Vlt-composite__wrapper Vlt-input\" style='overflow: hidden;' [ngClass]=\"{ 'has-append-button': hasAppendButton && !disabled }\">\n <label class='wrapper'>\n <div class=\"Vlt-composite__prepend Vlt-composite__prepend--icon\" style='top: 0; padding-top: 15px;'>\n <div class=\"Vlt-composite__icon\">\n <svg *ngIf='isSearchable && (!model || multiple)' class='Vlt-grey'><use attr.xlink:href=\"volta/volta-icons.svg#Vlt-icon-{{ multiple ? 'stack' : 'search'}}\"/></svg>\n <svg *ngIf='!isSearchable || (model && !multiple)' [ngStyle]=\"{fill: integrationIcon === 'Brand-icon-vonage' ? 'var(--vgip-meta-input-color)' : ''}\"><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n </div>\n <div *ngIf='suggestions.length' class=\"Vlt-badge Vlt-badge--small Vlt-badge--purple\" style='padding: 0px 4px; position: absolute; top: 26px; left: 4px; pointer-events: none; min-width: 14px;'>{{suggestions.length}}</div>\n </div>\n <input class='model' type='hidden' [required]='validations.required' [(ngModel)]='model' #f='ngModel' [name]='name' />\n <input class='main' [readonly]='!isSearchable || (model && !multiple)' [ngModel]='searchText' #ft='ngModel' (ngModelChange)='onSearchTextChanged($event)' [ngModelOptions]=\"{standalone: true}\" type=\"text\" placeholder=\"{{ placeHolderLabel || ' ' }}\" [ngClass]='{ ext: externalLink }' (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)' [disabled]='disabled' [title]=\"model ? model.label : ''\"/>\n <label class='Vlt-truncate hidden-mobile' style='padding-left: 25px; padding-right: 42px;'>{{ (multiple && isPolymorphic) ? '+Add ' : ((model || !isPolymorphic) ? meta.label : ( meta.searchLabel || 'Search')) }}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span style='color: var(--vgip-meta-input-color); text-transform: capitalize;' *ngIf='model'>({{model.type || model.resourceType || model.length}})</span></label>\n <label class='Vlt-truncate hidden-desktop' style='padding-left: 25px; padding-right: 42px;'>{{meta.label || meta.name}}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span style='color: var(--vgip-meta-input-color); text-transform: capitalize;' *ngIf='model'>({{model.type || model.resourceType || model.length}})</span></label>\n </label>\n <div *ngIf='searching' class='search-progress'>\n <div class=\"container\">\n <div class=\"bar Vlt-bg-purple\"></div>\n </div>\n </div>\n <div class='Vlt-composite__append right-actions'>\n <!-- <div *ngIf='prevModel && !model' class=\"Vlt-composite__append--icon\" (click)='revert()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-reply\"/></svg>\n </div>\n </div> -->\n <div *ngIf='model && !multiple' class=\"Vlt-composite__append--icon\" (click)='removeSelection()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div>\n <a [href]='externalLink || model.externalLink' target='_blank' rel='noopener' *ngIf='externalLink && (model && !multiple)' class=\"Vlt-composite__append--icon\" aria-label='Open external'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-open\"/></svg>\n </div>\n </a>\n </div>\n </div>\n <!-- <span *ngIf='hasCreatables'>\n <button type='button' *ngIf='!model || multiple' (click)='openResource()' class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n <button type='button' *ngIf='model && !multiple' (click)='openResource(model)' class=\"Vlt-btn Vlt-btn--primary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg>\n </button>\n </span> -->\n <div *ngIf='hasAppendButton && !disabled' class=\"Vlt-composite__append\">\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' *ngIf='!model || multiple' (click)='openResource()' class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon\" aria-label='Add new'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' *ngIf='model && !multiple' (click)='openResource(model)' class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon\" aria-label='Edit'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg>\n </button>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((ft | metaModel).touched && keyListenerActive))' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required</span>\n <span *ngIf=\"f.errors.pattern\">Should match '{{validations.pattern}}' pattern</span>\n <span *ngIf=\"f.errors.custom\">{{f.errors.custom}}&nbsp;</span>\n </small>\n <small *ngIf='meta.helpText || meta.hint' class=\"Vlt-form__element__hint\">{{meta.helpText || meta.hint}}</small>\n</div>\n", styles: [".Vlt-form__element--big .Vlt-input input:placeholder-shown:not(:focus)~label.Vlt-truncate{font-size:1.6rem;margin-top:-.8rem;top:50%}.Vlt-form__element--big ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-right:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.Vlt-form__element--big:hover .items-container,.Vlt-form__element--big:hover .main,.Vlt-form__element--big:hover .Vlt-composite__append button,.Vlt-form__element--big:hover ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone,.Vlt-form__element--big.active .items-container,.Vlt-form__element--big.active .main,.Vlt-form__element--big.active .Vlt-composite__append button,.Vlt-form__element--big.active ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.Vlt-form__element--error .items-container,.Vlt-form__element--big.Vlt-form__element--error .main,.Vlt-form__element--big.Vlt-form__element--error .Vlt-composite__append button,.Vlt-form__element--big.Vlt-form__element--error ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:#f25a6b}.Vlt-form__element--big.multiple .Vlt-composite.Vlt-dropdown{margin-top:3px}.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .Vlt-composite__append button,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .Vlt-composite__append button,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.multiple .items-container{background-color:var(--vgip-meta-input-bg-color);border:1px solid var(--vgip-meta-input-border-color);border-bottom:0;border-top-left-radius:6px;border-top-right-radius:6px}.Vlt-form__element--big.multiple .items-container .badges-container{overflow:auto;padding:6px 4px 3px 6px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge{margin-bottom:3px;margin-left:0;margin-right:3px;overflow:hidden;max-width:100%;position:relative;padding-right:30px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge.grid{display:grid}.Vlt-form__element--big.multiple:not(.has-value) .items-container{border:0}.Vlt-form__element--big.multiple.has-value .main,.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button,.Vlt-form__element--big.multiple.has-value ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-top-left-radius:0;border-top-right-radius:0;height:48px}.Vlt-form__element--big.multiple.has-value .main:not(.Vlt-btn--icon),.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button:not(.Vlt-btn--icon),.Vlt-form__element--big.multiple.has-value ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone:not(.Vlt-btn--icon){border-top:0}.Vlt-form__element--big.multiple.has-value .Vlt-composite__prepend ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-top-right-radius:6px}.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button{border-top-left-radius:6px;border-top:0}.Vlt-composite__prepend{z-index:initial}.Vlt-composite__prepend--icon{top:0;padding-top:15px;left:3px}.Vlt-input.has-append-button .Vlt-composite__append.right-actions{right:0}.Vlt-input.has-append-button .Vlt-composite__append.right-actions .Vlt-composite__append--icon:last-child{width:36px}.Vlt-composite__append.right-actions{position:absolute;top:5px;right:5px;cursor:pointer}.Vlt-composite__append.right-actions .Vlt-composite__append--icon{outline:none;position:initial;display:inline-block}.Vlt-composite__append.right-actions .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-composite__append.right-actions .Vlt-composite__append--icon:hover svg,.Vlt-composite__append.right-actions .Vlt-composite__append--icon:focus svg{fill:var(--vgip-meta-input-accent-color)}.Vlt-composite__append button{height:48px;padding-right:16px;background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);padding-left:16px;border-left:0}.Vlt-composite__append button:hover{background:var(--vgip-meta-input-action-hover-bg-color)}.Vlt-composite__append button svg{margin:-2px 0 0;fill:var(--vgip-meta-input-accent-color)}.Vlt-input input{padding-left:38px;text-overflow:ellipsis;padding-right:36px}.Vlt-input input.ext{padding-right:72px}.Vlt-composite__wrapper.has-append-button input.main{border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.Vlt-input input{background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);font-weight:700}.Vlt-dropdown__panel{max-width:100%;width:100%;min-width:280px}.Vlt-dropdown__panel .Vlt-dropdown__link.smart{font-weight:700;background:var(--vgip-meta-dropdown-bg-color)}.Vlt-dropdown__panel .Vlt-dropdown__link.smart.hidden{display:none}.Vlt-dropdown__panel .Vlt-dropdown__link.bold:after{background-color:#e1e2e6;content:\"\";height:1px;left:0;position:absolute;right:0;bottom:0}.Vlt-dropdown__panel .Vlt-dropdown__link--selected{background:rgba(44,45,48,.05)}.Vlt-dropdown__panel .Vlt-dropdown__link>div{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.Vlt-dropdown__panel .Vlt-dropdown__link>svg{margin-right:8px}.vgip-meta-field-preview .Vlt-badge{margin:1px 3px 1px 0;overflow:hidden;max-width:100%}:host .search-scope{width:130px}:host .search-scope ::ng-deep .Vlt-form__element.has-value .Vlt-select:after{display:none}:host .search-scope ::ng-deep .Vlt-form__element .right-actions{right:12px}:host .search-scope ::ng-deep .Vlt-form__element label.Vlt-truncate{padding-right:48px}:host .search-scope .mobile-icon{display:none}@media only screen and (max-width: 575px){:host .search-scope{width:60px}:host .search-scope:not(.has-value) .mobile-icon{display:block}:host .search-scope.has-value .mobile-label{display:block}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big .Vlt-composite__append{display:none}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big .Vlt-select:after{margin-right:-7px}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big label.Vlt-truncate{visibility:hidden}}:host .search-scope ::ng-deep vgip-meta-field .Vlt-input input.main.standalone{padding-right:initial;background:var(--vgip-meta-input-accent-bg-color);border-color:var(--vgip-meta-input-border-color)}:host .search-scope ::ng-deep vgip-meta-field .Vlt-form__element{padding:0}:host .search-scope ::ng-deep vgip-meta-field .Vlt-form__element .Vlt-dropdown__panel{width:initial}\n"] }]
1494
- }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i2.MetaReferenceService }, { type: i3.MetaResourceService }, { type: i6.MetaMsgService }, { type: i7.MetaContextService }, { type: i8.MetaTrackerService }]; } });
1495
- //// FIELD LIST
1496
- export class FieldList extends FieldAbstract {
1497
- constructor() {
1498
- super(...arguments);
1499
- this.items = [];
1500
- }
1501
- get list() {
1502
- return this.meta.list || this.meta.reference;
1503
- }
1504
- get cloneList() {
1505
- return JSON.parse(JSON.stringify(this.list));
1506
- }
1507
- ngOnInit() {
1508
- const origValue = this.parent[this.meta.name];
1509
- Object.defineProperty(this.parent, this.meta.name, {
1510
- set: (value) => {
1511
- this.model = [];
1512
- if (value && value.length) {
1513
- for (const i of value) {
1514
- if (this.model.indexOf(i) === -1) {
1515
- this.model.push(i);
1516
- }
1517
- }
1518
- }
1519
- this.value = this.model;
1520
- this.meta.$optional = this.isOptional;
1521
- },
1522
- get: () => this.value,
1523
- enumerable: true,
1524
- configurable: true
1525
- });
1526
- if (origValue) {
1527
- this.parent[this.meta.name] = origValue;
1528
- }
1529
- if (!this.model && this.validations.min) {
1530
- for (let i = 0; i < this.validations.min; i++) {
1531
- this.add();
1532
- }
1533
- }
1534
- }
1535
- add() {
1536
- if (!this.model) {
1537
- this.model = [];
1538
- }
1539
- if (!this.validations.max || (this.validations.max > this.model.length)) {
1540
- this.model.push({});
1541
- this.value = this.model;
1542
- }
1543
- }
1544
- remove(itemIndex) {
1545
- this.model.splice(itemIndex, 1);
1546
- this.value = this.model;
1547
- }
1548
- }
1549
- FieldList.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: FieldList, deps: null, target: i0.ɵɵFactoryTarget.Component });
1550
- FieldList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: FieldList, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div *ngIf='true' class=\"Vlt-form__element\" [ngClass]=\"{ 'Vlt-form__element--error': (f | metaModel)._parent.submitted && f.invalid }\">\n <label class=\"Vlt-label\">{{meta.label || meta.name}} ({{(model || []).length}})<span *ngIf='validations.required' class='Vlt-red'>*</span></label>\n <small style='margin-bottom: 4px;' *ngIf='meta.hint' class=\"Vlt-form__element__hint\">{{meta.hint}}</small>\n <input class='model' type='hidden' [required]='validations.required' [(ngModel)]='model' #f='ngModel' [name]='name' />\n <ng-container *ngIf='model'>\n <div *ngFor='let item of model; let i = index;' style='display: flex; border-bottom: 1px solid var(--vgip-meta-separator-color);'>\n <vgip-meta-field style='flex: 1;' [index]='i' [meta]='cloneList' [parent]='item' [integrationCode]='integrationCode' [resourceType]='meta.resourceType || resourceType' theme='inherit'></vgip-meta-field>\n <vgip-meta-field *ngIf='meta.selectable' [meta]=\"{ name: meta.selectable.name, label: ' ', type: 'radio', options: [ { id: meta.selectable.value, label: meta.selectable.label } ] }\" [parent]='item' [integrationCode]='integrationCode' theme='inherit' style='margin-left: 12px; margin-top: 12px; margin-right: -12px;'></vgip-meta-field>\n <div style='padding-left: 12px; margin-top: 3px;'>\n <button type='button' (click)='remove(i)' class=\"Vlt-btn Vlt-btn--link item-remove-button\" [disabled]='model.length === (validations.min || 0)' aria-label='Remove'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-bin\"/></svg>\n </button>\n </div>\n </div>\n </ng-container>\n <button *ngIf='!validations.max || !model || model.length < validations.max' style='width: 100%;' type='button' (click)='add()' class=\"Vlt-btn Vlt-btn--small Vlt-btn--tertiary Vlt-btn--app Vlt-btn--no-focus item-add-button\" [disabled]='validations.max && model && model.length === validations.max'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>{{list.label}}\n </button>\n <small *ngIf='(f | metaModel)._parent.submitted && f.invalid' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required</span>\n <span *ngIf=\"f.errors.maxlength\">Length can not exceed {{validations.maxlength}} characters</span>\n <span *ngIf=\"f.errors.custom\">{{f.errors.custom}}&nbsp;</span>\n </small>\n <small *ngIf='meta.helpText' class=\"Vlt-form__element__hint\">{{meta.helpText}}</small>\n</div>\n", styles: [".Vlt-btn--link:not([disabled]) svg{fill:#e84545}.Vlt-btn--link:not([disabled]):hover svg{fill:#de1c1c}.item-add-button{background-color:var(--vgip-meta-input-action-hover-bg-color);color:var(--vgip-meta-input-color)}.item-add-button svg{fill:var(--vgip-meta-input-color)}.item-add-button:hover{transform:scale(1.02);box-shadow:inset 0 0 0 1px var(--vgip-meta-input-active-border-color)}.item-remove-button{border:0}.item-remove-button:disabled{cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.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: i0.forwardRef(function () { return i4.NgControlStatus; }), selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i0.forwardRef(function () { return i4.RequiredValidator; }), selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.NgModel; }), selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i0.forwardRef(function () { return MetaField; }), selector: "vgip-meta-field", inputs: ["meta", "parent", "integrationCode", "resourceType", "index", "preview", "theme"], outputs: ["onChange", "onLeave"] }, { kind: "pipe", type: i0.forwardRef(function () { return i5.MetaModelPipe; }), name: "metaModel" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
1551
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: FieldList, decorators: [{
1552
- type: Component,
1553
- args: [{ viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div *ngIf='true' class=\"Vlt-form__element\" [ngClass]=\"{ 'Vlt-form__element--error': (f | metaModel)._parent.submitted && f.invalid }\">\n <label class=\"Vlt-label\">{{meta.label || meta.name}} ({{(model || []).length}})<span *ngIf='validations.required' class='Vlt-red'>*</span></label>\n <small style='margin-bottom: 4px;' *ngIf='meta.hint' class=\"Vlt-form__element__hint\">{{meta.hint}}</small>\n <input class='model' type='hidden' [required]='validations.required' [(ngModel)]='model' #f='ngModel' [name]='name' />\n <ng-container *ngIf='model'>\n <div *ngFor='let item of model; let i = index;' style='display: flex; border-bottom: 1px solid var(--vgip-meta-separator-color);'>\n <vgip-meta-field style='flex: 1;' [index]='i' [meta]='cloneList' [parent]='item' [integrationCode]='integrationCode' [resourceType]='meta.resourceType || resourceType' theme='inherit'></vgip-meta-field>\n <vgip-meta-field *ngIf='meta.selectable' [meta]=\"{ name: meta.selectable.name, label: ' ', type: 'radio', options: [ { id: meta.selectable.value, label: meta.selectable.label } ] }\" [parent]='item' [integrationCode]='integrationCode' theme='inherit' style='margin-left: 12px; margin-top: 12px; margin-right: -12px;'></vgip-meta-field>\n <div style='padding-left: 12px; margin-top: 3px;'>\n <button type='button' (click)='remove(i)' class=\"Vlt-btn Vlt-btn--link item-remove-button\" [disabled]='model.length === (validations.min || 0)' aria-label='Remove'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-bin\"/></svg>\n </button>\n </div>\n </div>\n </ng-container>\n <button *ngIf='!validations.max || !model || model.length < validations.max' style='width: 100%;' type='button' (click)='add()' class=\"Vlt-btn Vlt-btn--small Vlt-btn--tertiary Vlt-btn--app Vlt-btn--no-focus item-add-button\" [disabled]='validations.max && model && model.length === validations.max'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>{{list.label}}\n </button>\n <small *ngIf='(f | metaModel)._parent.submitted && f.invalid' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required</span>\n <span *ngIf=\"f.errors.maxlength\">Length can not exceed {{validations.maxlength}} characters</span>\n <span *ngIf=\"f.errors.custom\">{{f.errors.custom}}&nbsp;</span>\n </small>\n <small *ngIf='meta.helpText' class=\"Vlt-form__element__hint\">{{meta.helpText}}</small>\n</div>\n", styles: [".Vlt-btn--link:not([disabled]) svg{fill:#e84545}.Vlt-btn--link:not([disabled]):hover svg{fill:#de1c1c}.item-add-button{background-color:var(--vgip-meta-input-action-hover-bg-color);color:var(--vgip-meta-input-color)}.item-add-button svg{fill:var(--vgip-meta-input-color)}.item-add-button:hover{transform:scale(1.02);box-shadow:inset 0 0 0 1px var(--vgip-meta-input-active-border-color)}.item-remove-button{border:0}.item-remove-button:disabled{cursor:not-allowed}\n"] }]
1554
- }] });
1555
- //// LAYOUT
1556
- export class MetaLayout {
1557
- constructor(componentFactoryResolver, ref, el, metaResource, referenceService) {
1558
- // console.log('MetaLayout', this.meta);
1559
- this.componentFactoryResolver = componentFactoryResolver;
1560
- this.ref = ref;
1561
- this.el = el;
1562
- this.metaResource = metaResource;
1563
- this.referenceService = referenceService;
1564
- this.optionalFields = {};
1565
- this.showAll = false;
1566
- this.fieldsVisibilityChanged = new Subject();
1567
- this.childResourceCardLabel = resourceCardLabel;
1568
- }
1569
- get isPersistedResource() {
1570
- // eslint-disable-next-line no-underscore-dangle
1571
- return this.resource && this.resource._vgis && (this.resource._vgis.externalId || this.resource._vgis.id);
1572
- }
1573
- ngOnInit() {
1574
- this.integrationCode = this.meta.integrationCode || this.integration;
1575
- this.resourceType = this.meta.resourceType || this.type;
1576
- this.parentForm = this.el.nativeElement.closest('form');
1577
- this.configureOptionalSections();
1578
- this.fieldsVisibilityChanged.pipe(debounceTime(100), distinctUntilChanged()).subscribe((value) => {
1579
- this.countOptionalFields();
1580
- });
1581
- setTimeout(() => {
1582
- this.countOptionalFields();
1583
- }, 0);
1584
- if (this.parentForm) {
1585
- this.parentForm.addEventListener('change', (e) => {
1586
- setTimeout(() => {
1587
- this.fieldsVisibilityChanged.next(JSON.stringify(this.resource));
1588
- this.countOptionalFields();
1589
- }, 0);
1590
- });
1591
- }
1592
- if (this.theme !== 'inherit') {
1593
- this.applyTheme();
1594
- }
1595
- }
1596
- ngOnChanges(changes) {
1597
- if (changes.meta) {
1598
- this.configureOptionalSections();
1599
- setTimeout(() => {
1600
- this.countOptionalFields();
1601
- }, 0);
1602
- }
1603
- else if (changes.theme) {
1604
- this.theme = changes.theme.currentValue;
1605
- this.applyTheme();
1606
- }
1607
- }
1608
- countOptionalFields() {
1609
- let count = 0;
1610
- const countSectionFields = (s) => {
1611
- for (const f of s.fields) {
1612
- if (f.fields && f.fields.length && !f.visible) {
1613
- countSectionFields(f);
1614
- }
1615
- else {
1616
- if (f.$optional && !f.$hidden) {
1617
- count++;
1618
- }
1619
- }
1620
- }
1621
- };
1622
- for (const s of this.meta.sections) {
1623
- const notOptionalAny = s.fields.find(f => !f.$optional);
1624
- s.$optional = !notOptionalAny;
1625
- if (!s.visible) {
1626
- countSectionFields(s);
1627
- }
1628
- }
1629
- this.optionalFieldsCount = count;
1630
- }
1631
- configureOptionalSections() {
1632
- if (this.meta && this.meta.sections) {
1633
- for (const s of this.meta.sections) {
1634
- Object.defineProperty(s, '$optional', {
1635
- value: true,
1636
- writable: true,
1637
- configurable: true,
1638
- enumerable: false
1639
- });
1640
- }
1641
- }
1642
- }
1643
- ngAfterContentChecked() {
1644
- this.ref.detectChanges();
1645
- }
1646
- toggleOptionalFields() {
1647
- this.showAll = !this.showAll;
1648
- this.ngAfterContentChecked();
1649
- }
1650
- openChild(childResource, childModel) {
1651
- childResource.reference.parent = this.resource._vgis; // eslint-disable-line no-underscore-dangle
1652
- if (!this.refDialogFactory) {
1653
- this.refDialogFactory = this.componentFactoryResolver.resolveComponentFactory(MetaRefDialog);
1654
- }
1655
- this.referenceService.openDialog(this.refDialogFactory, this.metaResource, this.integrationCode, childResource.reference, childModel, childModel && (childResource.reference.editable === false) // is preview mode
1656
- ).subscribe((result) => {
1657
- if (result && result.raw) {
1658
- if (!this.resource[childResource.name]) {
1659
- this.resource[childResource.name] = [];
1660
- }
1661
- if (childModel) {
1662
- Object.assign(childModel, result.raw);
1663
- }
1664
- else {
1665
- this.resource[childResource.name].push(result.raw);
1666
- }
1667
- }
1668
- });
1669
- }
1670
- applyTheme() {
1671
- const metaTheme = this.theme === 'dark' ? metaDark : metaLight;
1672
- for (const key of Object.keys(metaTheme.properties)) {
1673
- this.el.nativeElement.style.setProperty(key, metaTheme.properties[key]);
1674
- }
1675
- }
1676
- }
1677
- MetaLayout.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaLayout, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i3.MetaResourceService }, { token: i2.MetaReferenceService }], target: i0.ɵɵFactoryTarget.Component });
1678
- MetaLayout.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: MetaLayout, selector: "vgip-meta-layout", inputs: { meta: "meta", resource: "resource", integration: "integration", type: "type", preview: "preview", theme: "theme" }, usesOnChanges: true, ngImport: i0, template: "<div *ngFor='let section of meta.sections' class='Vlt-section' [ngClass]=\"{ shown: showAll || section.visible || (!meta.oneTimeOptional && !section.$optional) || (meta.oneTimeOptional && !optionalFieldsCount) }\">\n\t<h5 *ngIf='section.label' class=\"Vlt-section__title\">{{section.label}}</h5>\n\t<div style='overflow: visible;' [ngClass]=\"{ 'for-preview': preview }\">\n\t\t<small *ngIf='section.description' class=\"Vlt-form__element__hint\">{{section.description}}</small>\n\t\t<div>\n\t\t\t<ng-container *ngFor='let field of section.fields'>\n\t\t\t\t<vgip-meta-field *ngIf='!field.$hidden && (showAll || section.visible || !field.$optional)' [meta]='field' [parent]='resource' [integrationCode]='integrationCode' [resourceType]='resourceType' [preview]='preview' [ngClass]=\"{ shown: !field.$invisible && (showAll || true) }\" theme='inherit' [attr.data-theme]='theme'></vgip-meta-field>\n\t\t\t</ng-container>\n\t\t</div>\n\t</div>\n</div>\n<div *ngIf='isPersistedResource && meta.children && preview'>\n\t<div *ngFor='let child of meta.children'>\n\t\t<h5 class='Vlt-children__title'>\n\t\t\t<svg class=\"Vlt-icon\"><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-stack\" /></svg>&nbsp;\n\t\t\t{{child.label}} <span class='Vlt-grey'>({{(resource[child.name] || []).length}})</span>\n\t\t</h5>\n\t\t<div *ngFor=\"let c of resource[child.name]\" style='position: relative;'>\n\n\t\t\t<div class=\"Vlt-card Vlt-bg-white\">\n\t\t\t\t<div class=\"Vlt-card__content Vlt-btn-on-hover\">\n\t\t\t\t\t<h5>{{childResourceCardLabel(c)}}</h5>\n\t\t\t\t\t<div style='font-size: 12px; line-height: 16px;'>\n\t\t\t\t\t\tCreated: <span class='Vlt-black'>{{c._vgis.createdDate | date:'mediumDate'}}</span>\n\t\t\t\t\t\tEdited: <span class='Vlt-black'>{{c._vgis.modifiedDate | date:'medium'}}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"Vlt-badge Vlt-badge--app Vlt-badge--purple Vlt-badge--small\">{{c._vgis.resourceType}}</div>\n\t\t\t\t\t<div class=\"Vlt-btn-group Vlt-btn-group--hover\">\n\t\t\t\t\t\t<a *ngIf='c._vgis.externalLink' attr.href='{{c._vgis.externalLink}}' target='_blank' rel='noopener' rel='noopener' class=\"Vlt-btn Vlt-btn--tertiary Vlt-btn--icon\" aria-label='Open external'><svg style='margin-left: 0; margin-right: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-open\"/></svg></a>\n\t\t\t\t\t\t<button type='button' (click)='openChild(child, c)' class=\"Vlt-btn Vlt-btn--tertiary Vlt-btn--icon\"><svg style='margin-left: 0; margin-right: 0;'><use attr.xlink:href=\"volta/volta-icons.svg#Vlt-icon-{{ child.reference.editable ? 'edit' : 'eye-negative' }}\"/></svg></button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<button style='width: 100%; margin-top: 0; max-width: 100%;' type='button' (click)='openChild(child)' class=\"Vlt-btn Vlt-btn--small Vlt-btn--secondary\" [disabled]='child.creatable === false'>\n\t\t\t<svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>{{child.reference.label}}\n\t\t</button>\n\t</div>\n</div>\n<div *ngIf='!(meta.oneTimeOptional && showAll)' [ngClass]='{ centered: !meta.oneTimeOptional }'>\n\t<button *ngIf='!preview && optionalFieldsCount' type='button' (click)='toggleOptionalFields()' class=\"Vlt-btn Vlt-btn--small Vlt-btn--link more-button\" style='margin: 0; margin-bottom: 10px;'>\n\t\t<svg><use attr.xlink:href=\"volta/volta-icons.svg#Vlt-icon-chevron-{{ showAll ? 'up' : 'down' }}\"/></svg>\n\t\t{{ showAll ? 'Hide' : 'Show' }} Optional Fields ({{optionalFieldsCount}})\n\t</button>\n</div>\n", styles: ["vgip-meta-field{display:none}vgip-meta-field.shown{display:initial}.Vlt-section__title{line-height:14px;padding:16px 16px 14px 3px;margin:-9px -1px 8px;background-color:var(--vgip-meta-resource-bg-color);color:var(--vgip-meta-resource-color);position:sticky;top:-9px;z-index:3;border-bottom:1px solid var(--vgip-meta-separator-color)}.Vlt-section{margin:0;padding-bottom:8px;display:none}.Vlt-section.shown{display:block}.Vlt-btn.vlt-add-child:hover{transform:scale(1.02)}.for-preview{margin-top:-6px}.Vlt-card{margin-bottom:16px;padding:16px}.Vlt-card .Vlt-btn-group.Vlt-btn-group--hover{right:-8px}button.more-button:focus{font-weight:700}.centered{text-align:center}.Vlt-btn--link{color:var(--vgip-meta-link-color)}.Vlt-btn--link:hover{color:var(--vgip-meta-link-hover-color)}.Vlt-btn--link svg{fill:var(--vgip-meta-link-color)}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i0.forwardRef(function () { return MetaField; }), selector: "vgip-meta-field", inputs: ["meta", "parent", "integrationCode", "resourceType", "index", "preview", "theme"], outputs: ["onChange", "onLeave"] }, { kind: "pipe", type: i0.forwardRef(function () { return i1.DatePipe; }), name: "date" }] });
1679
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaLayout, decorators: [{
1680
- type: Component,
1681
- args: [{ selector: 'vgip-meta-layout', template: "<div *ngFor='let section of meta.sections' class='Vlt-section' [ngClass]=\"{ shown: showAll || section.visible || (!meta.oneTimeOptional && !section.$optional) || (meta.oneTimeOptional && !optionalFieldsCount) }\">\n\t<h5 *ngIf='section.label' class=\"Vlt-section__title\">{{section.label}}</h5>\n\t<div style='overflow: visible;' [ngClass]=\"{ 'for-preview': preview }\">\n\t\t<small *ngIf='section.description' class=\"Vlt-form__element__hint\">{{section.description}}</small>\n\t\t<div>\n\t\t\t<ng-container *ngFor='let field of section.fields'>\n\t\t\t\t<vgip-meta-field *ngIf='!field.$hidden && (showAll || section.visible || !field.$optional)' [meta]='field' [parent]='resource' [integrationCode]='integrationCode' [resourceType]='resourceType' [preview]='preview' [ngClass]=\"{ shown: !field.$invisible && (showAll || true) }\" theme='inherit' [attr.data-theme]='theme'></vgip-meta-field>\n\t\t\t</ng-container>\n\t\t</div>\n\t</div>\n</div>\n<div *ngIf='isPersistedResource && meta.children && preview'>\n\t<div *ngFor='let child of meta.children'>\n\t\t<h5 class='Vlt-children__title'>\n\t\t\t<svg class=\"Vlt-icon\"><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-stack\" /></svg>&nbsp;\n\t\t\t{{child.label}} <span class='Vlt-grey'>({{(resource[child.name] || []).length}})</span>\n\t\t</h5>\n\t\t<div *ngFor=\"let c of resource[child.name]\" style='position: relative;'>\n\n\t\t\t<div class=\"Vlt-card Vlt-bg-white\">\n\t\t\t\t<div class=\"Vlt-card__content Vlt-btn-on-hover\">\n\t\t\t\t\t<h5>{{childResourceCardLabel(c)}}</h5>\n\t\t\t\t\t<div style='font-size: 12px; line-height: 16px;'>\n\t\t\t\t\t\tCreated: <span class='Vlt-black'>{{c._vgis.createdDate | date:'mediumDate'}}</span>\n\t\t\t\t\t\tEdited: <span class='Vlt-black'>{{c._vgis.modifiedDate | date:'medium'}}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"Vlt-badge Vlt-badge--app Vlt-badge--purple Vlt-badge--small\">{{c._vgis.resourceType}}</div>\n\t\t\t\t\t<div class=\"Vlt-btn-group Vlt-btn-group--hover\">\n\t\t\t\t\t\t<a *ngIf='c._vgis.externalLink' attr.href='{{c._vgis.externalLink}}' target='_blank' rel='noopener' rel='noopener' class=\"Vlt-btn Vlt-btn--tertiary Vlt-btn--icon\" aria-label='Open external'><svg style='margin-left: 0; margin-right: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-open\"/></svg></a>\n\t\t\t\t\t\t<button type='button' (click)='openChild(child, c)' class=\"Vlt-btn Vlt-btn--tertiary Vlt-btn--icon\"><svg style='margin-left: 0; margin-right: 0;'><use attr.xlink:href=\"volta/volta-icons.svg#Vlt-icon-{{ child.reference.editable ? 'edit' : 'eye-negative' }}\"/></svg></button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<button style='width: 100%; margin-top: 0; max-width: 100%;' type='button' (click)='openChild(child)' class=\"Vlt-btn Vlt-btn--small Vlt-btn--secondary\" [disabled]='child.creatable === false'>\n\t\t\t<svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>{{child.reference.label}}\n\t\t</button>\n\t</div>\n</div>\n<div *ngIf='!(meta.oneTimeOptional && showAll)' [ngClass]='{ centered: !meta.oneTimeOptional }'>\n\t<button *ngIf='!preview && optionalFieldsCount' type='button' (click)='toggleOptionalFields()' class=\"Vlt-btn Vlt-btn--small Vlt-btn--link more-button\" style='margin: 0; margin-bottom: 10px;'>\n\t\t<svg><use attr.xlink:href=\"volta/volta-icons.svg#Vlt-icon-chevron-{{ showAll ? 'up' : 'down' }}\"/></svg>\n\t\t{{ showAll ? 'Hide' : 'Show' }} Optional Fields ({{optionalFieldsCount}})\n\t</button>\n</div>\n", styles: ["vgip-meta-field{display:none}vgip-meta-field.shown{display:initial}.Vlt-section__title{line-height:14px;padding:16px 16px 14px 3px;margin:-9px -1px 8px;background-color:var(--vgip-meta-resource-bg-color);color:var(--vgip-meta-resource-color);position:sticky;top:-9px;z-index:3;border-bottom:1px solid var(--vgip-meta-separator-color)}.Vlt-section{margin:0;padding-bottom:8px;display:none}.Vlt-section.shown{display:block}.Vlt-btn.vlt-add-child:hover{transform:scale(1.02)}.for-preview{margin-top:-6px}.Vlt-card{margin-bottom:16px;padding:16px}.Vlt-card .Vlt-btn-group.Vlt-btn-group--hover{right:-8px}button.more-button:focus{font-weight:700}.centered{text-align:center}.Vlt-btn--link{color:var(--vgip-meta-link-color)}.Vlt-btn--link:hover{color:var(--vgip-meta-link-hover-color)}.Vlt-btn--link svg{fill:var(--vgip-meta-link-color)}\n"] }]
1682
- }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i3.MetaResourceService }, { type: i2.MetaReferenceService }]; }, propDecorators: { meta: [{
1683
- type: Input
1684
- }], resource: [{
1685
- type: Input
1686
- }], integration: [{
1687
- type: Input
1688
- }], type: [{
1689
- type: Input
1690
- }], preview: [{
1691
- type: Input
1692
- }], theme: [{
1693
- type: Input
1694
- }] } });
1695
- //// RESOURCE
1696
- export class MetaResource {
1697
- constructor(componentFactoryResolver, ref, el, metaResourceService, metaContext, metaMsgService) {
1698
- this.componentFactoryResolver = componentFactoryResolver;
1699
- this.ref = ref;
1700
- this.el = el;
1701
- this.metaResourceService = metaResourceService;
1702
- this.metaContext = metaContext;
1703
- this.metaMsgService = metaMsgService;
1704
- this.done = new EventEmitter();
1705
- this.edit = true;
1706
- this.contactsSuggestionsDone = false;
1707
- this.onMenuClickout = () => {
1708
- delete this.resourceMenuVisible;
1709
- document.removeEventListener('click', this.onMenuClickout);
1710
- };
1711
- }
1712
- get niceFields() {
1713
- if (!this.resource.niceFields
1714
- && this.resource.meta
1715
- && this.resource.meta.layout
1716
- && this.resource.meta.layout.sections) {
1717
- const extractSectionFields = (s) => {
1718
- for (const f of s.fields) {
1719
- if (f.name) {
1720
- this.resource.niceFields[f.name] = f;
1721
- }
1722
- if (f.fields && f.fields.length) {
1723
- extractSectionFields(f);
1724
- }
1725
- }
1726
- };
1727
- this.resource.niceFields = {};
1728
- for (const s of this.resource.meta.layout.sections) {
1729
- extractSectionFields(s);
1730
- }
1731
- }
1732
- return this.resource.niceFields;
1733
- }
1734
- get fieldNames() {
1735
- const names = Object.keys(this.niceFields);
1736
- if (this.resource.meta.layout.children) {
1737
- for (const child of this.resource.meta.layout.children) {
1738
- names.push(child.name);
1739
- }
1740
- }
1741
- return names;
1742
- }
1743
- ngOnInit() {
1744
- this.integrationCode = (this.resource.integrationCode || '').toUpperCase();
1745
- this.resourceType = this.resource.resourceType;
1746
- this.service = (this.metaResourceServiceDelegated || this.metaResourceService).new(this.resource);
1747
- if (!this.model) {
1748
- this.model = {};
1749
- }
1750
- if (this.resource.activity && this.resource.ref.editable === false && !this.resource.externalId) {
1751
- this.resource.externalId = 'MISSING_EXTERNAL_ID';
1752
- }
1753
- this.isPersistent = this.resource && this.resource.externalId;
1754
- if (!this.resource.meta) {
1755
- this.loadMetadata(this.resource.layoutId);
1756
- }
1757
- else {
1758
- // if (this.isPersistent && (!this.isEditable || this.resources[ref.name].meta.layout.children)) {
1759
- // this.edit = false;
1760
- // }
1761
- this.meta = this.resource.meta;
1762
- this.currentLayoutId = this.meta.layout.id;
1763
- this.getDetails();
1764
- this.getFieldsMap();
1765
- }
1766
- if (this.theme !== 'inherit') {
1767
- this.applyTheme();
1768
- }
1769
- }
1770
- ngOnChanges(changes) {
1771
- if (changes.theme) {
1772
- this.theme = changes.theme.currentValue;
1773
- if (this.theme !== 'inherit') {
1774
- this.applyTheme();
1775
- }
1776
- }
1777
- }
1778
- editMode() {
1779
- this.edit = true;
1780
- }
1781
- loadMetadata(layoutId, refresh = false) {
1782
- const layoutStoreKey = `vgis.layout_${this.metaContext.vgipUserId}_${this.integrationCode}_${this.resource.resourceType}`;
1783
- if (!layoutId) {
1784
- layoutId = localStorage.getItem(layoutStoreKey);
1785
- }
1786
- this.busy = true;
1787
- setTimeout(() => {
1788
- this.metaLoading = true;
1789
- }, 0);
1790
- delete this.resource.niceFields;
1791
- this.service.getMetadata(layoutId, refresh).subscribe({
1792
- next: (meta) => {
1793
- this.currentLayoutId = meta.layout.id;
1794
- if (layoutId !== meta.layout.id && !this.isPersistent) {
1795
- localStorage.removeItem(layoutStoreKey);
1796
- }
1797
- this.meta = metaNormalizer(meta, this.integrationCode, this.resource.resourceType);
1798
- this.isEditable = this.meta.layout && this.meta.layout.editable !== false;
1799
- this.resource.meta = this.meta;
1800
- if (this.isPersistent && (!this.isEditable || this.meta.layout.children)) {
1801
- this.edit = false;
1802
- }
1803
- delete this.busy;
1804
- this.getDetails();
1805
- this.getFieldsMap();
1806
- },
1807
- error: (metaError) => {
1808
- delete this.busy;
1809
- this.generalError = `Error loading resource metadata (${metaError.statusText})`;
1810
- },
1811
- complete: () => {
1812
- delete this.metaLoading;
1813
- this.forceUiUpdate();
1814
- }
1815
- });
1816
- }
1817
- changeLayout() {
1818
- localStorage.setItem(`vgis.layout_${this.metaContext.vgipUserId}_${this.integrationCode}_${this.resource.resourceType}`, this.currentLayoutId);
1819
- this.loadMetadata(this.currentLayoutId);
1820
- }
1821
- getDetails() {
1822
- if (this.resource && (this.resource.externalId || this.resource.id)) {
1823
- if (this.resource.parent && this.resource.activity // skip fetch
1824
- && this.meta.layout.editable === false && !this.meta.layout.children) {
1825
- for (const p in this.resource.activity) {
1826
- if (this.resource.activity[p] && this.fieldNames.indexOf(p) !== -1) {
1827
- this.model[p] = this.resource.activity[p];
1828
- }
1829
- }
1830
- }
1831
- else {
1832
- this.busy = true;
1833
- this.service.getDetails((this.resource.externalId || this.resource.id), {
1834
- eventId: this.resource.eventId !== 'NO_EVENT' ? this.resource.eventId : null, layoutId: this.resource.layoutId
1835
- }).subscribe({
1836
- next: (resource) => {
1837
- /* eslint-disable no-underscore-dangle */
1838
- if (resource._vgis) {
1839
- if (resource._vgis.eventId) {
1840
- this.metaContext.vgipEventId = resource._vgis.eventId;
1841
- }
1842
- if (resource.layoutId && resource._vgis.layoutId !== this.currentLayoutId) {
1843
- this.loadMetadata(resource._vgis.layoutId);
1844
- }
1845
- }
1846
- /* eslint-enable no-underscore-dangle */
1847
- for (const p in resource) {
1848
- if (typeof (resource[p] !== 'undefined') && (this.fieldNames.indexOf(p) !== -1 || p === '_vgis')) {
1849
- this.model[p] = resource[p];
1850
- }
1851
- }
1852
- delete this.busy;
1853
- },
1854
- error: (resourceError) => {
1855
- this.generalError = resourceError.error ? resourceError.error.message || resourceError.message : resourceError.message;
1856
- delete this.busy;
1857
- },
1858
- complete: () => {
1859
- this.forceUiUpdate();
1860
- }
1861
- });
1862
- }
1863
- }
1864
- else {
1865
- if (this.resource.ref && this.resource.ref.activity) { // reuse failed autoactivities data
1866
- for (const p in this.resource.ref.activity) {
1867
- if (this.resource.ref.activity && this.fieldNames.indexOf(p) !== -1) {
1868
- this.model[p] = this.resource.ref.activity[p]; // VGIS-7215 (copy only valid fields)
1869
- }
1870
- }
1871
- }
1872
- this.performAutoFill();
1873
- }
1874
- }
1875
- performAutoFill() {
1876
- this.metaMsgService.sendMessage(this.integrationCode, {
1877
- action: 'autoFill',
1878
- integration: this.integrationCode,
1879
- resourceType: this.resourceType,
1880
- resource: JSON.parse(JSON.stringify(this.model)),
1881
- fields: this.niceFields,
1882
- event: this.metaContext.context,
1883
- profile: this.metaContext.profiles[this.integrationCode]
1884
- }, (response) => {
1885
- if (!response.error) {
1886
- for (const afp in response.autoFill) {
1887
- if (!this.model[afp]) {
1888
- this.model[afp] = response.autoFill[afp];
1889
- }
1890
- }
1891
- }
1892
- });
1893
- }
1894
- getFieldsMap() {
1895
- if (this.meta.fieldsMap) {
1896
- this.fieldsMap = this.meta.fieldsMap;
1897
- this.markContactables();
1898
- this.buildContactsSuggestions();
1899
- if (!this.resource.externalId) {
1900
- this.buildSubjectTemplate();
1901
- this.execTransformer();
1902
- }
1903
- }
1904
- else {
1905
- this.metaMsgService.sendMessage(this.integrationCode, { action: 'fieldsMap', integration: this.integrationCode, resourceType: this.resourceType }, (response) => {
1906
- if (!response.error) {
1907
- this.fieldsMap = response.fieldsMap;
1908
- this.markContactables();
1909
- this.buildContactsSuggestions();
1910
- if (!this.resource.externalId) {
1911
- this.buildSubjectTemplate();
1912
- this.execTransformer();
1913
- }
1914
- }
1915
- else {
1916
- console.log('No fields map', this.integrationCode, this.resourceType, response.error);
1917
- }
1918
- });
1919
- }
1920
- }
1921
- openResourceMenu() {
1922
- this.resourceMenuVisible = true;
1923
- setTimeout(() => {
1924
- document.addEventListener('click', this.onMenuClickout);
1925
- }, 10);
1926
- }
1927
- close(result) {
1928
- this.done.emit(result);
1929
- }
1930
- showParsedError(resourceForm, parsedError) {
1931
- this.formErrors = parsedError.message || 'There is a problem with one or more fields';
1932
- if (parsedError.errors && parsedError.errors.length) {
1933
- this.formErrors += ` (${parsedError.errors.map(e => e.message).join(', ')})`;
1934
- for (const pe of parsedError.errors) {
1935
- if (resourceForm.controls[pe.field]) {
1936
- resourceForm.controls[pe.field].setErrors({ invalid: true, custom: pe.message });
1937
- }
1938
- }
1939
- setTimeout(() => {
1940
- const firstInvalid = this.el.nativeElement.querySelector('.Vlt-form__element--error .main:not(.standalone)');
1941
- if (firstInvalid) {
1942
- firstInvalid.focus();
1943
- }
1944
- });
1945
- }
1946
- }
1947
- submit(resourceForm) {
1948
- delete this.formErrors;
1949
- resourceForm.form.submitted = true;
1950
- if (resourceForm.valid) {
1951
- this.busy = true;
1952
- if (this.metaContext.vgipEventId) {
1953
- /* eslint-disable no-underscore-dangle */
1954
- if (!this.model._vgis) {
1955
- this.model._vgis = {
1956
- connector: this.integrationCode,
1957
- resourceType: this.resourceType
1958
- };
1959
- }
1960
- this.model._vgis.layoutId = this.currentLayoutId;
1961
- // eslint-disable-next-line max-len
1962
- // this.model._vgis.timeZoneOffsetInMinutes = 0; // we are not providing timezone anymore (as V3), instead the 'time' and 'date' objects are converted so the UTC time/date is correct
1963
- this.model._vgis.eventId = this.metaContext.vgipEventId;
1964
- /* eslint-enable no-underscore-dangle */
1965
- }
1966
- this.service.save(this.model).subscribe((result) => {
1967
- this.close(result);
1968
- delete this.busy;
1969
- }, (errorResult) => {
1970
- if ((errorResult.status === 422 && errorResult.error && !errorResult.error.errors && errorResult.error.integrationError)
1971
- || (errorResult.error && errorResult.error.errors && errorResult.error.errors.length && !errorResult.error.errors[0].field)
1972
- // backend implemented error parsing but broken VGIS-7366
1973
- ) {
1974
- this.formErrors = 'There is a problem with one or more fields';
1975
- try {
1976
- this.metaMsgService.sendMessage(this.integrationCode, {
1977
- action: 'parseErrorMessage',
1978
- integrationCode: this.integrationCode,
1979
- resourceType: errorResult.error.resourceType,
1980
- rawError: errorResult.error.integrationError,
1981
- profile: this.metaContext.profiles[this.integrationCode.toUpperCase()]
1982
- }, (response) => {
1983
- if (response.parsedError) {
1984
- this.showParsedError(resourceForm, response.parsedError);
1985
- }
1986
- else {
1987
- // eslint-disable-next-line no-underscore-dangle
1988
- console.error('No error parser for', this.integrationCode, errorResult.error.integrationError);
1989
- this.formErrors = errorResult.error;
1990
- }
1991
- });
1992
- }
1993
- catch (err) {
1994
- console.log('....', err);
1995
- }
1996
- ;
1997
- }
1998
- else if (errorResult.status === 422) {
1999
- this.showParsedError(resourceForm, errorResult.error);
2000
- }
2001
- else {
2002
- this.formErrors = errorResult.error;
2003
- }
2004
- delete this.busy;
2005
- });
2006
- }
2007
- else {
2008
- this.formErrors = Object.keys(resourceForm.controls)
2009
- .filter((c) => resourceForm.controls[c].invalid)
2010
- .map((f) => (this.niceFields[f] ? (this.niceFields[f].label || f) : f)).join(', ');
2011
- setTimeout(() => {
2012
- const selector = `form[name="${this.resourceType}"] .Vlt-form__element--error .main:not(.standalone)`;
2013
- const firstInvalid = this.el.nativeElement.querySelector(selector);
2014
- if (firstInvalid) {
2015
- firstInvalid.focus();
2016
- }
2017
- });
2018
- }
2019
- }
2020
- clearFormErrors() {
2021
- delete this.formErrors;
2022
- }
2023
- suggestFieldProperty(key, value) {
2024
- if (key && value) {
2025
- const fieldNames = this.fieldNames;
2026
- if (this.model) {
2027
- const nestMatch = key.match(/(\S+)\[\d\]\.(\S+)/);
2028
- if (nestMatch && fieldNames.indexOf(nestMatch[1]) !== -1) {
2029
- this.model[nestMatch[1]] = [];
2030
- const nestKeys = {};
2031
- nestKeys[nestMatch[2]] = value;
2032
- this.model[nestMatch[1]].push(nestKeys);
2033
- }
2034
- else if (fieldNames.indexOf(key) !== -1) {
2035
- this.model[key] = value;
2036
- }
2037
- }
2038
- }
2039
- }
2040
- execTransformer() {
2041
- if (this.metaContext && this.fieldsMap) {
2042
- setTimeout(() => {
2043
- this.suggestFieldProperty(this.fieldsMap.phoneNumber, this.metaContext.phoneNumber);
2044
- if (this.fieldsMap.firstName || this.fieldsMap.lastName) {
2045
- const names = (this.metaContext.displayName || '').split(' ');
2046
- this.suggestFieldProperty(this.fieldsMap.firstName, names[0]);
2047
- this.suggestFieldProperty(this.fieldsMap.lastName, names[1]);
2048
- }
2049
- else if (this.fieldsMap.displayName) {
2050
- this.suggestFieldProperty(this.fieldsMap.displayName, this.metaContext.displayName);
2051
- }
2052
- }, 100);
2053
- }
2054
- }
2055
- markContactables() {
2056
- if (this.fieldsMap.contactables && this.fieldsMap.contactables.length) {
2057
- for (const c of this.fieldsMap.contactables) {
2058
- const field = this.niceFields[c];
2059
- if (field) {
2060
- Object.defineProperty(field, '$isContactable', {
2061
- value: true,
2062
- configurable: true,
2063
- enumerable: false
2064
- });
2065
- }
2066
- }
2067
- }
2068
- }
2069
- buildSubjectTemplate() {
2070
- if (!this.model[this.fieldsMap.subject] && this.fieldsMap.subject && this.niceFields[this.fieldsMap.subject]) {
2071
- let subjectTemplate;
2072
- if (this.niceFields[this.fieldsMap.subject].default) {
2073
- subjectTemplate = this.niceFields[this.fieldsMap.subject].default.id || this.niceFields[this.fieldsMap.subject].default;
2074
- }
2075
- else if (this.metaContext.profiles[this.integrationCode]) {
2076
- const profile = this.metaContext.profiles[this.integrationCode] || {};
2077
- subjectTemplate = profile.defaultSubject ?
2078
- profile.defaultSubject[((this.metaContext.context || 'CALL').type || '').toUpperCase()] : profile.activityDefaultSubjectTemplate;
2079
- }
2080
- if (subjectTemplate) {
2081
- this.model[this.fieldsMap.subject] = templateBuilder(this.metaContext, subjectTemplate);
2082
- }
2083
- }
2084
- }
2085
- buildContactsSuggestions() {
2086
- // let hasDefaultContact = false;
2087
- if (this.metaContext.contactables[this.integrationCode] && this.meta.layout && this.meta.layout.sections) {
2088
- for (const s of this.meta.layout.sections) {
2089
- for (const f of (s.fields || [])) {
2090
- if (f.type === 'reference') {
2091
- const refTypes = (f.reference.length ? f.reference : [f.reference]).map(r => r.name);
2092
- for (const c of this.metaContext.contactables[this.integrationCode]) {
2093
- if (refTypes.indexOf(c.resourceType || c.type) !== -1) {
2094
- if (!f.suggestions) {
2095
- f.suggestions = [];
2096
- }
2097
- else {
2098
- f.suggestions = f.suggestions.filter(sg => !sg.auto);
2099
- }
2100
- let tLabel = c.displayName || c.name;
2101
- if (c.phoneNumbers) {
2102
- tLabel += (' ✆' + c.phoneNumbers.map(p => p.phoneNumber).join(','));
2103
- }
2104
- f.suggestions.push({
2105
- id: c.externalId || c.identifier || c.id,
2106
- label: tLabel,
2107
- type: c.resourceType || c.type,
2108
- auto: true
2109
- });
2110
- }
2111
- }
2112
- if ((this.fieldsMap.contactables || []).indexOf(f.name) !== -1) { // evaluate usability?
2113
- f.alwaysVisible = true;
2114
- }
2115
- // if (
2116
- // !hasDefaultContact && this.metaContext.defaultContactables[this.integrationCode]
2117
- // && refTypes.indexOf(this.metaContext.defaultContactables[this.integrationCode].type) !== -1
2118
- // ) {
2119
- // this.resource[f.name] = this.metaContext.defaultContactables[this.integrationCode];
2120
- // hasDefaultContact = true;
2121
- // } else if (!hasDefaultContact && this.fieldsMap.contactables && f.suggestions && f.suggestions.length === 1) {
2122
- // if (this.fieldsMap.contactables.indexOf(f.name) !== -1 && !f.default) {
2123
- // f.default = f.suggestions[0];
2124
- // hasDefaultContact = true;
2125
- // }
2126
- // }
2127
- }
2128
- }
2129
- }
2130
- this.contactsSuggestionsDone = true;
2131
- }
2132
- }
2133
- applyTheme() {
2134
- const metaTheme = this.theme === 'dark' ? metaDark : metaLight;
2135
- console.log('resource apply theme', this.theme);
2136
- for (const key of Object.keys(metaTheme.properties)) {
2137
- this.el.nativeElement.style.setProperty(key, metaTheme.properties[key]);
2138
- }
2139
- }
2140
- forceUiUpdate() {
2141
- // this.ref.detectChanges();
2142
- const e = document.createEvent('Events');
2143
- e.initEvent('click', true, false);
2144
- this.el.nativeElement.dispatchEvent(e);
2145
- }
2146
- }
2147
- MetaResource.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaResource, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i3.MetaResourceService }, { token: i7.MetaContextService }, { token: i6.MetaMsgService }], target: i0.ɵɵFactoryTarget.Component });
2148
- MetaResource.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: MetaResource, selector: "vgip-meta-resource", inputs: { resource: "resource", model: "model", metaResourceServiceDelegated: "metaResourceServiceDelegated", theme: "theme" }, outputs: { done: "done" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf='generalError' class=\"Vlt-callout Vlt-callout--critical\" style='overflow: auto; margin: 20px;'>\n\t<i></i>\n\t<div class=\"Vlt-callout__content\">\n\t\t<p>{{generalError}}</p>\n\t</div>\n</div>\n<div *ngIf='!meta' class=\"Vlt-progress\">\n\t<div class=\"Vlt-progress__bar\" [ngClass]=\"{ loading: metaLoading }\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuetext=\"Loading Metadata\" aria-valuemax=\"100\"></div>\n</div>\n<form [vgipMetaFormAutofocus]='!resource || !resource.externalId' *ngIf='meta && !generalError' #resourceForm=\"ngForm\" [name]='resource.resourceType' (ngSubmit)='submit(resourceForm)' novalidate>\n\t<div class='form-content' style='overflow: hidden;'>\n\t\t<div [ngClass]=\"{ 'Vlt-callout--dismissed': !formErrors }\" class=\"Vlt-callout Vlt-callout--banner Vlt-callout--critical\">\n\t\t\t<i></i>\n\t\t\t<div class=\"Vlt-callout__content\" style=\"margin-top: auto;\">\n\t\t\t\t<p>There is a problem with one or more fields</p>\n\t\t\t\t<small style='font-weight: 600; font-size: 1.0em;' *ngIf='formErrors'>{{ formErrors.message || formErrors }}</small>\n\t\t\t</div>\n\t\t\t<button type='button' class=\"Vlt-callout__dismiss\" (click)='clearFormErrors()' aria-label=\"Dismiss\"></button>\n\t\t</div>\n\t\t<div class=\"Vlt-card__content\" style='min-height: 40px;'>\n\t\t\t<vgip-meta-layout *ngIf='edit' [meta]='meta.layout' [resource]='model' [preview]='false' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t\t<vgip-meta-layout *ngIf='!edit' [meta]='meta.layout' [resource]='model' [preview]='true' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t</div>\n\t</div>\n\t<div class=\"Vlt-card__footer\">\n\t\t<button class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--outline\" type='button' aria-label='Cancel' (click)='close()'>\n\t\t\t{{ edit ? 'Cancel' : 'Close' }}\n\t\t</button>\n\t\t<button *ngIf='edit' class=\"Vlt-btn Vlt-btn--app\" [ngClass]=\"{ 'Vlt-btn--primary': isPersistent, 'Vlt-btn--secondary': !isPersistent }\" type='submit'>\n\t\t\t{{ (resource && resource.externalId) ? 'Update' : 'Create' }}\n\t\t</button>\n\t\t<button (click)='editMode()' *ngIf='!edit && isEditable' [disabled]='!isEditable' class=\"Vlt-btn Vlt-btn--app Vlt-btn--primary\" type='button' aria-label='Edit'>\n\t\t\tEdit\n\t\t</button>\n\t\t<div style='margin-right: 8px; flex: 1;'>\n\t\t\t<div *ngIf='meta.availableLayouts && meta.availableLayouts.length' class=\"Vlt-form__element Vlt-form__element--big\" style='padding: 0; margin: -8px -18px -8px 0;'>\n\t\t\t\t<div class=\"Vlt-select\">\n\t\t\t\t\t<label style='all: inherit;'>\n\t\t\t\t\t\t<select style='border: 0; margin-top: 3px; background: transparent;' (change)='changeLayout()' [(ngModel)]='currentLayoutId' [ngModelOptions]='{ standalone: true }' [disabled]='isPersistent'>\n\t\t\t\t\t\t\t<option selected disabled>Select layout</option>\n\t\t\t\t\t\t\t<option *ngFor='let layout of meta.availableLayouts' [ngValue]='layout.id'>{{layout.name}}</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<label>Layout</label>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"Vlt-dropdown resource-menu\" [ngClass]=\"{ 'Vlt-dropdown--expanded': resourceMenuVisible }\" style='margin-left: 2px;'>\n\t\t\t<div class=\"Vlt-dropdown__panel\" style='bottom: 40px; right: -4px; top: initial;'>\n\t\t\t\t<div class=\"Vlt-dropdown__panel__content\">\n\t\t\t\t\t<a class=\"Vlt-dropdown__link\" (click)='loadMetadata(currentLayoutId, true)'>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--smaller'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-refresh\"/></svg>&nbsp;&nbsp;Refresh metadata\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"Vlt-dropdown__trigger\">\n\t\t\t\t<button type='button' (click)='openResourceMenu()' class=\"Vlt-btn Vlt-btn--link\" aria-label='Resource menu'>\n\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--small' style='margin: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-more-v-negative\"/></svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</form>\n<div class='busy-mask' [ngClass]=\"{ active: busy }\">\n\t<div style='height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center;'>\n\t\t<div class=\"Vlt-spinner\"></div>\n\t</div>\n</div>", styles: [":host{flex:1;display:flex;flex-direction:column;min-height:0;color:var(--vgip-meta-resource-color)}.Vlt-callout--banner{justify-content:initial;text-align:initial;overflow-y:auto}.Vlt-callout--banner.Vlt-callout--dismissed{padding:0}.Vlt-callout--banner:not(.Vlt-callout--dismissed){min-height:78px}.Vlt-spinner:before,.Vlt-spinner:after{border:6px solid #616266;border-color:#616266 transparent transparent}.Vlt-card__content{padding:8px 8px 8px 16px;display:flex;flex-direction:column;min-height:0;flex:1;overflow-y:scroll;overflow-x:hidden;background-color:var(--vgip-meta-resource-bg-color)}@media (hover: none){.Vlt-card__content{padding-right:16px}}.Vlt-card__content::-webkit-scrollbar{width:8px}.Vlt-card__content::-webkit-scrollbar-thumb{background-color:var(--vgip-meta-scrollbar-color);border:2px solid transparent;border-radius:6px;background-clip:content-box}.Vlt-card__footer{background:var(--vgip-meta-resource-bar-color);border-top:1px solid var(--vgip-meta-separator-color);display:flex;flex-direction:row;margin:16px -24px -24px;padding:8px 8px 8px 16px;box-shadow:0 0 4px #00000040;z-index:1}.Vlt-card__footer .Vlt-select select{color:var(--vgip-meta-input-color)}.Vlt-card__footer .Vlt-select select:disabled{background:initial;cursor:not-allowed}.Vlt-card__footer .Vlt-select:after{background-image:var(--vgip-meta-dropdown-icon)}.Vlt-card__footer .resource-menu .Vlt-icon:not(:hover){fill:var(--vgip-meta-input-label-color)}.Vlt-card__footer button.Vlt-btn--secondary{border:none;box-shadow:inset 0 0 0 1px var(--vgip-meta-button-border-color)}.Vlt-card__footer button.Vlt-btn--secondary:not([type=submit]){color:var(--vgip-meta-input-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover{box-shadow:inset 0 0 0 1px var(--vgip-meta-input-accent-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover[type=submit]{background-color:var(--vgip-meta-submit-hover-bg-color)}.Vlt-progress{margin:0;position:sticky}.Vlt-progress .Vlt-progress__bar{width:0;transition:width 5s}.Vlt-progress .Vlt-progress__bar.loading{width:100%}form{border-radius:6px;padding:24px;display:flex;flex-direction:column;min-height:0;flex:1}form .form-content{margin:-24px -24px -16px;padding-bottom:0;flex:1;display:flex;flex-direction:column}.busy-mask{position:absolute;inset:0;background:rgba(0,0,0,.32);opacity:1;z-index:898;display:none;border-bottom-left-radius:6px;border-bottom-right-radius:6px;margin:1px;cursor:progress}.busy-mask.active{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: MetaLayout, selector: "vgip-meta-layout", inputs: ["meta", "resource", "integration", "type", "preview", "theme"] }, { kind: "directive", type: i9.MetaAutofocusDirective, selector: "[vgipMetaFormAutofocus]", inputs: ["vgipMetaFormAutofocus"] }] });
2149
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaResource, decorators: [{
2150
- type: Component,
2151
- args: [{ selector: 'vgip-meta-resource', template: "<div *ngIf='generalError' class=\"Vlt-callout Vlt-callout--critical\" style='overflow: auto; margin: 20px;'>\n\t<i></i>\n\t<div class=\"Vlt-callout__content\">\n\t\t<p>{{generalError}}</p>\n\t</div>\n</div>\n<div *ngIf='!meta' class=\"Vlt-progress\">\n\t<div class=\"Vlt-progress__bar\" [ngClass]=\"{ loading: metaLoading }\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuetext=\"Loading Metadata\" aria-valuemax=\"100\"></div>\n</div>\n<form [vgipMetaFormAutofocus]='!resource || !resource.externalId' *ngIf='meta && !generalError' #resourceForm=\"ngForm\" [name]='resource.resourceType' (ngSubmit)='submit(resourceForm)' novalidate>\n\t<div class='form-content' style='overflow: hidden;'>\n\t\t<div [ngClass]=\"{ 'Vlt-callout--dismissed': !formErrors }\" class=\"Vlt-callout Vlt-callout--banner Vlt-callout--critical\">\n\t\t\t<i></i>\n\t\t\t<div class=\"Vlt-callout__content\" style=\"margin-top: auto;\">\n\t\t\t\t<p>There is a problem with one or more fields</p>\n\t\t\t\t<small style='font-weight: 600; font-size: 1.0em;' *ngIf='formErrors'>{{ formErrors.message || formErrors }}</small>\n\t\t\t</div>\n\t\t\t<button type='button' class=\"Vlt-callout__dismiss\" (click)='clearFormErrors()' aria-label=\"Dismiss\"></button>\n\t\t</div>\n\t\t<div class=\"Vlt-card__content\" style='min-height: 40px;'>\n\t\t\t<vgip-meta-layout *ngIf='edit' [meta]='meta.layout' [resource]='model' [preview]='false' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t\t<vgip-meta-layout *ngIf='!edit' [meta]='meta.layout' [resource]='model' [preview]='true' [integration]='meta.integration' [type]='resource.resourceType' theme='inherit'></vgip-meta-layout>\n\t\t</div>\n\t</div>\n\t<div class=\"Vlt-card__footer\">\n\t\t<button class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--outline\" type='button' aria-label='Cancel' (click)='close()'>\n\t\t\t{{ edit ? 'Cancel' : 'Close' }}\n\t\t</button>\n\t\t<button *ngIf='edit' class=\"Vlt-btn Vlt-btn--app\" [ngClass]=\"{ 'Vlt-btn--primary': isPersistent, 'Vlt-btn--secondary': !isPersistent }\" type='submit'>\n\t\t\t{{ (resource && resource.externalId) ? 'Update' : 'Create' }}\n\t\t</button>\n\t\t<button (click)='editMode()' *ngIf='!edit && isEditable' [disabled]='!isEditable' class=\"Vlt-btn Vlt-btn--app Vlt-btn--primary\" type='button' aria-label='Edit'>\n\t\t\tEdit\n\t\t</button>\n\t\t<div style='margin-right: 8px; flex: 1;'>\n\t\t\t<div *ngIf='meta.availableLayouts && meta.availableLayouts.length' class=\"Vlt-form__element Vlt-form__element--big\" style='padding: 0; margin: -8px -18px -8px 0;'>\n\t\t\t\t<div class=\"Vlt-select\">\n\t\t\t\t\t<label style='all: inherit;'>\n\t\t\t\t\t\t<select style='border: 0; margin-top: 3px; background: transparent;' (change)='changeLayout()' [(ngModel)]='currentLayoutId' [ngModelOptions]='{ standalone: true }' [disabled]='isPersistent'>\n\t\t\t\t\t\t\t<option selected disabled>Select layout</option>\n\t\t\t\t\t\t\t<option *ngFor='let layout of meta.availableLayouts' [ngValue]='layout.id'>{{layout.name}}</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<label>Layout</label>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"Vlt-dropdown resource-menu\" [ngClass]=\"{ 'Vlt-dropdown--expanded': resourceMenuVisible }\" style='margin-left: 2px;'>\n\t\t\t<div class=\"Vlt-dropdown__panel\" style='bottom: 40px; right: -4px; top: initial;'>\n\t\t\t\t<div class=\"Vlt-dropdown__panel__content\">\n\t\t\t\t\t<a class=\"Vlt-dropdown__link\" (click)='loadMetadata(currentLayoutId, true)'>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--smaller'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-refresh\"/></svg>&nbsp;&nbsp;Refresh metadata\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"Vlt-dropdown__trigger\">\n\t\t\t\t<button type='button' (click)='openResourceMenu()' class=\"Vlt-btn Vlt-btn--link\" aria-label='Resource menu'>\n\t\t\t\t\t<svg class='Vlt-icon Vlt-icon--small' style='margin: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-more-v-negative\"/></svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</form>\n<div class='busy-mask' [ngClass]=\"{ active: busy }\">\n\t<div style='height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center;'>\n\t\t<div class=\"Vlt-spinner\"></div>\n\t</div>\n</div>", styles: [":host{flex:1;display:flex;flex-direction:column;min-height:0;color:var(--vgip-meta-resource-color)}.Vlt-callout--banner{justify-content:initial;text-align:initial;overflow-y:auto}.Vlt-callout--banner.Vlt-callout--dismissed{padding:0}.Vlt-callout--banner:not(.Vlt-callout--dismissed){min-height:78px}.Vlt-spinner:before,.Vlt-spinner:after{border:6px solid #616266;border-color:#616266 transparent transparent}.Vlt-card__content{padding:8px 8px 8px 16px;display:flex;flex-direction:column;min-height:0;flex:1;overflow-y:scroll;overflow-x:hidden;background-color:var(--vgip-meta-resource-bg-color)}@media (hover: none){.Vlt-card__content{padding-right:16px}}.Vlt-card__content::-webkit-scrollbar{width:8px}.Vlt-card__content::-webkit-scrollbar-thumb{background-color:var(--vgip-meta-scrollbar-color);border:2px solid transparent;border-radius:6px;background-clip:content-box}.Vlt-card__footer{background:var(--vgip-meta-resource-bar-color);border-top:1px solid var(--vgip-meta-separator-color);display:flex;flex-direction:row;margin:16px -24px -24px;padding:8px 8px 8px 16px;box-shadow:0 0 4px #00000040;z-index:1}.Vlt-card__footer .Vlt-select select{color:var(--vgip-meta-input-color)}.Vlt-card__footer .Vlt-select select:disabled{background:initial;cursor:not-allowed}.Vlt-card__footer .Vlt-select:after{background-image:var(--vgip-meta-dropdown-icon)}.Vlt-card__footer .resource-menu .Vlt-icon:not(:hover){fill:var(--vgip-meta-input-label-color)}.Vlt-card__footer button.Vlt-btn--secondary{border:none;box-shadow:inset 0 0 0 1px var(--vgip-meta-button-border-color)}.Vlt-card__footer button.Vlt-btn--secondary:not([type=submit]){color:var(--vgip-meta-input-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover{box-shadow:inset 0 0 0 1px var(--vgip-meta-input-accent-color)}.Vlt-card__footer button.Vlt-btn--secondary:hover[type=submit]{background-color:var(--vgip-meta-submit-hover-bg-color)}.Vlt-progress{margin:0;position:sticky}.Vlt-progress .Vlt-progress__bar{width:0;transition:width 5s}.Vlt-progress .Vlt-progress__bar.loading{width:100%}form{border-radius:6px;padding:24px;display:flex;flex-direction:column;min-height:0;flex:1}form .form-content{margin:-24px -24px -16px;padding-bottom:0;flex:1;display:flex;flex-direction:column}.busy-mask{position:absolute;inset:0;background:rgba(0,0,0,.32);opacity:1;z-index:898;display:none;border-bottom-left-radius:6px;border-bottom-right-radius:6px;margin:1px;cursor:progress}.busy-mask.active{display:block}\n"] }]
2152
- }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i3.MetaResourceService }, { type: i7.MetaContextService }, { type: i6.MetaMsgService }]; }, propDecorators: { resource: [{
2153
- type: Input
2154
- }], model: [{
2155
- type: Input
2156
- }], metaResourceServiceDelegated: [{
2157
- type: Input
2158
- }], theme: [{
2159
- type: Input
2160
- }], done: [{
2161
- type: Output
2162
- }] } });
2163
- //// RESOURCE CARD
2164
- export class MetaResourceCard {
2165
- constructor(componentFactoryResolver, metaResource, referenceService) {
2166
- this.componentFactoryResolver = componentFactoryResolver;
2167
- this.metaResource = metaResource;
2168
- this.referenceService = referenceService;
2169
- }
2170
- ngOnInit() {
2171
- this.integrationCode = (this.resource.integration || this.resource.integrationCode || '').toLowerCase();
2172
- }
2173
- open(reference, model) {
2174
- if (!this.refDialogFactory) {
2175
- this.refDialogFactory = this.componentFactoryResolver.resolveComponentFactory(MetaRefDialog);
2176
- }
2177
- this.referenceService.openDialog(this.refDialogFactory, this.metaResource, this.integrationCode, reference, model, model && (reference.editable === false) // is preview mode
2178
- ).subscribe((result) => {
2179
- console.log('dialog result', result);
2180
- // if (result && result.raw) {
2181
- // if (!this.parent[reference.type]) {
2182
- // this.parent[reference.type] = [];
2183
- // }
2184
- // this.parent[reference.type].push(result.raw);
2185
- // }
2186
- });
2187
- }
2188
- }
2189
- MetaResourceCard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaResourceCard, deps: [{ token: i0.ComponentFactoryResolver }, { token: i3.MetaResourceService }, { token: i2.MetaReferenceService }], target: i0.ɵɵFactoryTarget.Component });
2190
- MetaResourceCard.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: MetaResourceCard, selector: "vgip-meta-resource-card", inputs: { resource: "resource", model: "model" }, ngImport: i0, template: "<div class=\"Vlt-card Vlt-bg-white\">\n\t<div class=\"Vlt-card__content Vlt-btn-on-hover\">\n\t\t<h5>{{model.Subject || model.subject || model.summary || model.title || model.CaseNumber || model.comment || model.body || model.name || model.topic || '...' }}</h5>\n\t\t<div style='font-size: 12px; line-height: 16px;'>\n\t\t\tCreated: <span class='Vlt-black'>{{model._vgis.createdDate | date:'mediumDate'}}</span>\n\t\t\tEdited: <span class='Vlt-black'>{{model._vgis.modifiedDate | date:'medium'}}</span>\n\t\t</div>\n\t\t<div class=\"Vlt-badge Vlt-badge--app Vlt-badge--purple Vlt-badge--small\">{{model._vgis.resourceType}}</div>\n\t\t<div class=\"Vlt-btn-group Vlt-btn-group--hover\">\n\t\t\t<a *ngIf='model._vgis.externalLink' attr.href='{{model._vgis.externalLink}}' target='_blank' rel='noopener' class=\"Vlt-btn Vlt-btn--tertiary Vlt-btn--icon\" aria-label='Open external'><svg style='margin-left: 0; margin-right: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-open\"/></svg></a>\n\t\t\t<button type='button' (click)='open(resource, model)' class=\"Vlt-btn Vlt-btn--tertiary Vlt-btn--icon\" aria-label='Edit'><svg style='margin-left: 0; margin-right: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg></button>\n\t\t</div>\n\t</div>\n</div>\n", styles: [".Vlt-card{margin-bottom:8px;padding:16px}.Vlt-card .Vlt-btn-group.Vlt-btn-group--hover{right:-8px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
2191
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaResourceCard, decorators: [{
2192
- type: Component,
2193
- args: [{ selector: 'vgip-meta-resource-card', template: "<div class=\"Vlt-card Vlt-bg-white\">\n\t<div class=\"Vlt-card__content Vlt-btn-on-hover\">\n\t\t<h5>{{model.Subject || model.subject || model.summary || model.title || model.CaseNumber || model.comment || model.body || model.name || model.topic || '...' }}</h5>\n\t\t<div style='font-size: 12px; line-height: 16px;'>\n\t\t\tCreated: <span class='Vlt-black'>{{model._vgis.createdDate | date:'mediumDate'}}</span>\n\t\t\tEdited: <span class='Vlt-black'>{{model._vgis.modifiedDate | date:'medium'}}</span>\n\t\t</div>\n\t\t<div class=\"Vlt-badge Vlt-badge--app Vlt-badge--purple Vlt-badge--small\">{{model._vgis.resourceType}}</div>\n\t\t<div class=\"Vlt-btn-group Vlt-btn-group--hover\">\n\t\t\t<a *ngIf='model._vgis.externalLink' attr.href='{{model._vgis.externalLink}}' target='_blank' rel='noopener' class=\"Vlt-btn Vlt-btn--tertiary Vlt-btn--icon\" aria-label='Open external'><svg style='margin-left: 0; margin-right: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-open\"/></svg></a>\n\t\t\t<button type='button' (click)='open(resource, model)' class=\"Vlt-btn Vlt-btn--tertiary Vlt-btn--icon\" aria-label='Edit'><svg style='margin-left: 0; margin-right: 0;'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg></button>\n\t\t</div>\n\t</div>\n</div>\n", styles: [".Vlt-card{margin-bottom:8px;padding:16px}.Vlt-card .Vlt-btn-group.Vlt-btn-group--hover{right:-8px}\n"] }]
2194
- }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i3.MetaResourceService }, { type: i2.MetaReferenceService }]; }, propDecorators: { resource: [{
2195
- type: Input
2196
- }], model: [{
2197
- type: Input
2198
- }] } });
2199
- const FMAP = (fType) => {
2200
- switch (fType) {
2201
- case '':
2202
- case null:
2203
- case undefined:
2204
- case 'number':
2205
- // case 'datetime':
2206
- // case 'time':
2207
- // case 'date':
2208
- case 'string': { // eslint-disable-line no-fallthrough
2209
- return FieldInput;
2210
- }
2211
- case 'textarea':
2212
- case 'text': {
2213
- return FieldText;
2214
- }
2215
- case 'select':
2216
- case 'options': {
2217
- return FieldSelect;
2218
- }
2219
- case 'reference': {
2220
- return FieldReference;
2221
- }
2222
- case 'composite': {
2223
- return FieldComposite;
2224
- }
2225
- case 'boolean': {
2226
- return FieldBoolean;
2227
- }
2228
- case 'radio': {
2229
- return FieldRadio;
2230
- }
2231
- case 'list': {
2232
- return FieldList;
2233
- }
2234
- case 'richtext': {
2235
- return FieldRichtext;
2236
- }
2237
- case 'datetime':
2238
- case 'time':
2239
- case 'date': {
2240
- return FieldDatetime;
2241
- }
2242
- default: {
2243
- return FieldUnknown;
2244
- }
2245
- }
2246
- };
2247
- export class MetaFieldContentDirective {
2248
- constructor(viewContainerRef) {
2249
- this.viewContainerRef = viewContainerRef;
2250
- }
2251
- }
2252
- MetaFieldContentDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaFieldContentDirective, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
2253
- MetaFieldContentDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.0", type: MetaFieldContentDirective, selector: "[metaFieldContent]", ngImport: i0 });
2254
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaFieldContentDirective, decorators: [{
2255
- type: Directive,
2256
- args: [{
2257
- selector: '[metaFieldContent]'
2258
- }]
2259
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }]; } });
2260
- export class MetaField extends FieldAbstract {
2261
- constructor(componentFactoryResolver, el) {
2262
- super();
2263
- this.componentFactoryResolver = componentFactoryResolver;
2264
- this.el = el;
2265
- // eslint-disable-next-line
2266
- this.onChange = new EventEmitter();
2267
- // eslint-disable-next-line
2268
- this.onLeave = new EventEmitter();
2269
- }
2270
- ngOnInit() {
2271
- const component = FMAP(this.meta.type);
2272
- const componentFactory = this.componentFactoryResolver.resolveComponentFactory(component);
2273
- this.fieldContent.viewContainerRef.clear();
2274
- const componentRef = this.fieldContent.viewContainerRef.createComponent(componentFactory);
2275
- const field = componentRef.instance;
2276
- if (component.setup) {
2277
- // console.log('setup', {a: this.el.nativeElement.parentNode.parentNode})
2278
- component.setup(field, this.parent, this.meta);
2279
- }
2280
- field.meta = this.meta;
2281
- field.parent = this.parent;
2282
- field.integrationCode = (this.integrationCode || '').toLowerCase();
2283
- field.resourceType = (this.resourceType || '');
2284
- field.index = this.index;
2285
- field.elementRef = this.el;
2286
- field.onChange = this.onChange;
2287
- field.onLeave = this.onLeave;
2288
- field.preview = this.preview;
2289
- field.theme = this.theme;
2290
- Object.defineProperty(field.meta, 'unset', {
2291
- value: false,
2292
- writable: true,
2293
- configurable: true,
2294
- enumerable: false
2295
- });
2296
- }
2297
- }
2298
- MetaField.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaField, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
2299
- MetaField.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: MetaField, selector: "vgip-meta-field", inputs: { meta: "meta", parent: "parent", integrationCode: "integrationCode", resourceType: "resourceType", index: "index", preview: "preview", theme: "theme" }, outputs: { onChange: "onChange", onLeave: "onLeave" }, viewQueries: [{ propertyName: "fieldContent", first: true, predicate: MetaFieldContentDirective, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: '<ng-template metaFieldContent>Loading</ng-template>', isInline: true, styles: [":host ::ng-deep label.wrapper{padding:0;pointer-events:initial;position:initial;top:initial;transition:none}@media only screen and (max-width: 575px){:host ::ng-deep .hidden-mobile{display:none}}@media only screen and (min-width: 576px){:host ::ng-deep .hidden-desktop{display:none}}:host ::ng-deep .Vlt-form__element>.Vlt-label,:host ::ng-deep .Vlt-form__element>label>.Vlt-label{margin-top:-6px}:host ::ng-deep .Vlt-form__element .Vlt-form__element__hint{color:var(--vgip-meta-input-hint-color)}:host ::ng-deep .Vlt-form__element .Vlt-input input,:host ::ng-deep .Vlt-form__element .Vlt-select select,:host ::ng-deep .Vlt-form__element .Vlt-textarea textarea{color:var(--vgip-meta-input-color)}@media (hover: none){:host ::ng-deep .Vlt-form__element .Vlt-input input,:host ::ng-deep .Vlt-form__element .Vlt-select select,:host ::ng-deep .Vlt-form__element .Vlt-textarea textarea{font-size:16px}}:host ::ng-deep .Vlt-form__element .Vlt-input input::placeholder,:host ::ng-deep .Vlt-form__element .Vlt-select select::placeholder,:host ::ng-deep .Vlt-form__element .Vlt-textarea textarea::placeholder{color:var(--vgip-meta-input-placeholder-color)}:host ::ng-deep .Vlt-form__element label{color:var(--vgip-meta-input-label-color)}:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-form-error-style,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input.ng-untouched:invalid,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-select select.ng-untouched:invalid,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea.ng-untouched:invalid,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-custom-select__input:invalid,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-radio__icon,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-checkbox__icon,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-radio__icon,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-checkbox__icon{background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color)}:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-form-error-style:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input.ng-untouched:invalid:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-select select.ng-untouched:invalid:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea.ng-untouched:invalid:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-custom-select__input:invalid:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-radio__icon:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-checkbox__icon:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-radio__icon:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-checkbox__icon:disabled{background:var(--vgip-meta-input-disabled-bg-color);border-color:var(--vgip-meta-input-disabled-border-color)}:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-form-error-style:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-form-error-style:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-form-error-style .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input.ng-untouched:invalid:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input.ng-untouched:invalid:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input.ng-untouched:invalid .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-select select.ng-untouched:invalid:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-select select.ng-untouched:invalid:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-select select.ng-untouched:invalid .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea.ng-untouched:invalid:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea.ng-untouched:invalid:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea.ng-untouched:invalid .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-custom-select__input:invalid:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-custom-select__input:invalid:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-custom-select__input:invalid .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-radio__icon:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-radio__icon:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-radio__icon .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-checkbox__icon:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-checkbox__icon:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-checkbox__icon .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-radio__icon:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-radio__icon:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-radio__icon .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-checkbox__icon:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-checkbox__icon:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-checkbox__icon .active{border-color:var(--vgip-meta-input-active-border-color)}:host ::ng-deep .Vlt-form__element.Vlt-form__element--error .Vlt-input input:focus,:host ::ng-deep .Vlt-form__element.Vlt-form__element--error .Vlt-select select:focus,:host ::ng-deep .Vlt-form__element.Vlt-form__element--error .Vlt-textarea textarea:focus,:host ::ng-deep .Vlt-form__element.Vlt-form__element--error .Vlt-custom-select__input:focus{border-color:#f25a6b}:host ::ng-deep .Vlt-dropdown__link{padding:12px}:host ::ng-deep .Vlt-dropdown__link svg{margin-left:0}:host ::ng-deep .Vlt-dropdown__link small{line-height:inherit}:host ::ng-deep .Vlt-dropdown__link.Vlt-dropdown__link--selected:after{width:20px;top:14px;background:var(--vgip-meta-dropdown-check-icon) no-repeat right center;background-size:contain}:host ::ng-deep .Vlt-dropdown__block{padding:2px 16px}:host ::ng-deep .meta-field-reference .Vlt-dropdown__link.has-type.Vlt-dropdown__link--selected:after{position:initial}:host ::ng-deep .Vlt-dropdown__panel__content{background:var(--vgip-meta-dropdown-bg-color);box-shadow:var(--vgip-meta-dropdown-shadow)}:host ::ng-deep .Vlt-dropdown__panel__content .Vlt-dropdown__link,:host ::ng-deep .Vlt-dropdown__panel__content .Vlt-dropdown__block{color:var(--vgip-meta-input-color)}:host ::ng-deep .Vlt-dropdown__panel__content .Vlt-dropdown__scroll::-webkit-scrollbar{width:8px}:host ::ng-deep .Vlt-dropdown__panel__content .Vlt-dropdown__scroll::-webkit-scrollbar-thumb{background-color:var(--vgip-meta-scrollbar-color);border:2px solid transparent;border-radius:6px;background-clip:content-box}:host ::ng-deep .Vlt-dropdown__panel__content.suggestions{background:var(--vgip-meta-suggestions-bg-color)}:host ::ng-deep .Vlt-dropdown__panel{z-index:999}:host ::ng-deep .Vlt-dropdown__panel__content--scroll-area{padding:0}:host ::ng-deep .Vlt-composite__append--icon{bottom:0;height:initial}:host ::ng-deep .search-progress{display:block;position:relative;width:100%;height:3px;margin-top:-3px;padding-top:0!important;margin-bottom:0!important}:host ::ng-deep .search-progress .container{display:block;position:relative;overflow:hidden;width:100%;height:3px;transform:translate(0) scale(1)}:host ::ng-deep .search-progress .container .bar{position:absolute;left:0;top:0;bottom:0;width:100%;height:3px;border-radius:50%;transition:all .3s linear;animation:query .9s infinite cubic-bezier(.3,.6,.6,1)}@keyframes query{0%{opacity:1;transform:translate(35%) scaleX(.3)}to{opacity:0;transform:translate(-50%) scaleX(0)}}::ng-deep vgip-meta-field.shown vgip-meta-field{display:initial}::ng-deep vgip-meta-field .vgip-meta-field-preview{display:flex;flex-direction:row;padding-bottom:5px;padding-top:5px;margin-left:10px;border-bottom:1px solid #e7ebee}::ng-deep vgip-meta-field .vgip-meta-field-preview .vgip-meta-field-label{flex:1 1 100%;max-width:20%;max-height:100%;box-sizing:border-box;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-right:2px}::ng-deep vgip-meta-field .vgip-meta-field-preview .vgip-meta-field-value{min-width:0;width:0;box-sizing:border-box;flex:1;font-weight:700}\n"], dependencies: [{ kind: "directive", type: MetaFieldContentDirective, selector: "[metaFieldContent]" }] });
2300
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaField, decorators: [{
2301
- type: Component,
2302
- args: [{ selector: 'vgip-meta-field', template: '<ng-template metaFieldContent>Loading</ng-template>', styles: [":host ::ng-deep label.wrapper{padding:0;pointer-events:initial;position:initial;top:initial;transition:none}@media only screen and (max-width: 575px){:host ::ng-deep .hidden-mobile{display:none}}@media only screen and (min-width: 576px){:host ::ng-deep .hidden-desktop{display:none}}:host ::ng-deep .Vlt-form__element>.Vlt-label,:host ::ng-deep .Vlt-form__element>label>.Vlt-label{margin-top:-6px}:host ::ng-deep .Vlt-form__element .Vlt-form__element__hint{color:var(--vgip-meta-input-hint-color)}:host ::ng-deep .Vlt-form__element .Vlt-input input,:host ::ng-deep .Vlt-form__element .Vlt-select select,:host ::ng-deep .Vlt-form__element .Vlt-textarea textarea{color:var(--vgip-meta-input-color)}@media (hover: none){:host ::ng-deep .Vlt-form__element .Vlt-input input,:host ::ng-deep .Vlt-form__element .Vlt-select select,:host ::ng-deep .Vlt-form__element .Vlt-textarea textarea{font-size:16px}}:host ::ng-deep .Vlt-form__element .Vlt-input input::placeholder,:host ::ng-deep .Vlt-form__element .Vlt-select select::placeholder,:host ::ng-deep .Vlt-form__element .Vlt-textarea textarea::placeholder{color:var(--vgip-meta-input-placeholder-color)}:host ::ng-deep .Vlt-form__element label{color:var(--vgip-meta-input-label-color)}:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-form-error-style,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input.ng-untouched:invalid,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-select select.ng-untouched:invalid,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea.ng-untouched:invalid,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-custom-select__input:invalid,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-radio__icon,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-checkbox__icon,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-radio__icon,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-checkbox__icon{background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color)}:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-form-error-style:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input.ng-untouched:invalid:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-select select.ng-untouched:invalid:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea.ng-untouched:invalid:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-custom-select__input:invalid:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-radio__icon:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-checkbox__icon:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-radio__icon:disabled,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-checkbox__icon:disabled{background:var(--vgip-meta-input-disabled-bg-color);border-color:var(--vgip-meta-input-disabled-border-color)}:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-form-error-style:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-form-error-style:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-form-error-style .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input.ng-untouched:invalid:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input.ng-untouched:invalid:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-input input.ng-untouched:invalid .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-select select.ng-untouched:invalid:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-select select.ng-untouched:invalid:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-select select.ng-untouched:invalid .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea.ng-untouched:invalid:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea.ng-untouched:invalid:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-textarea textarea.ng-untouched:invalid .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-custom-select__input:invalid:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-custom-select__input:invalid:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-custom-select__input:invalid .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-radio__icon:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-radio__icon:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-radio__icon .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-checkbox__icon:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-checkbox__icon:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-radio input.ng-untouched:invalid+.Vlt-checkbox__icon .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-radio__icon:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-radio__icon:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-radio__icon .active,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-checkbox__icon:hover,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-checkbox__icon:focus,:host ::ng-deep .Vlt-form__element:not(.Vlt-form__element--error) .Vlt-checkbox input.ng-untouched:invalid+.Vlt-checkbox__icon .active{border-color:var(--vgip-meta-input-active-border-color)}:host ::ng-deep .Vlt-form__element.Vlt-form__element--error .Vlt-input input:focus,:host ::ng-deep .Vlt-form__element.Vlt-form__element--error .Vlt-select select:focus,:host ::ng-deep .Vlt-form__element.Vlt-form__element--error .Vlt-textarea textarea:focus,:host ::ng-deep .Vlt-form__element.Vlt-form__element--error .Vlt-custom-select__input:focus{border-color:#f25a6b}:host ::ng-deep .Vlt-dropdown__link{padding:12px}:host ::ng-deep .Vlt-dropdown__link svg{margin-left:0}:host ::ng-deep .Vlt-dropdown__link small{line-height:inherit}:host ::ng-deep .Vlt-dropdown__link.Vlt-dropdown__link--selected:after{width:20px;top:14px;background:var(--vgip-meta-dropdown-check-icon) no-repeat right center;background-size:contain}:host ::ng-deep .Vlt-dropdown__block{padding:2px 16px}:host ::ng-deep .meta-field-reference .Vlt-dropdown__link.has-type.Vlt-dropdown__link--selected:after{position:initial}:host ::ng-deep .Vlt-dropdown__panel__content{background:var(--vgip-meta-dropdown-bg-color);box-shadow:var(--vgip-meta-dropdown-shadow)}:host ::ng-deep .Vlt-dropdown__panel__content .Vlt-dropdown__link,:host ::ng-deep .Vlt-dropdown__panel__content .Vlt-dropdown__block{color:var(--vgip-meta-input-color)}:host ::ng-deep .Vlt-dropdown__panel__content .Vlt-dropdown__scroll::-webkit-scrollbar{width:8px}:host ::ng-deep .Vlt-dropdown__panel__content .Vlt-dropdown__scroll::-webkit-scrollbar-thumb{background-color:var(--vgip-meta-scrollbar-color);border:2px solid transparent;border-radius:6px;background-clip:content-box}:host ::ng-deep .Vlt-dropdown__panel__content.suggestions{background:var(--vgip-meta-suggestions-bg-color)}:host ::ng-deep .Vlt-dropdown__panel{z-index:999}:host ::ng-deep .Vlt-dropdown__panel__content--scroll-area{padding:0}:host ::ng-deep .Vlt-composite__append--icon{bottom:0;height:initial}:host ::ng-deep .search-progress{display:block;position:relative;width:100%;height:3px;margin-top:-3px;padding-top:0!important;margin-bottom:0!important}:host ::ng-deep .search-progress .container{display:block;position:relative;overflow:hidden;width:100%;height:3px;transform:translate(0) scale(1)}:host ::ng-deep .search-progress .container .bar{position:absolute;left:0;top:0;bottom:0;width:100%;height:3px;border-radius:50%;transition:all .3s linear;animation:query .9s infinite cubic-bezier(.3,.6,.6,1)}@keyframes query{0%{opacity:1;transform:translate(35%) scaleX(.3)}to{opacity:0;transform:translate(-50%) scaleX(0)}}::ng-deep vgip-meta-field.shown vgip-meta-field{display:initial}::ng-deep vgip-meta-field .vgip-meta-field-preview{display:flex;flex-direction:row;padding-bottom:5px;padding-top:5px;margin-left:10px;border-bottom:1px solid #e7ebee}::ng-deep vgip-meta-field .vgip-meta-field-preview .vgip-meta-field-label{flex:1 1 100%;max-width:20%;max-height:100%;box-sizing:border-box;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-right:2px}::ng-deep vgip-meta-field .vgip-meta-field-preview .vgip-meta-field-value{min-width:0;width:0;box-sizing:border-box;flex:1;font-weight:700}\n"] }]
2303
- }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i0.ElementRef }]; }, propDecorators: { meta: [{
2304
- type: Input
2305
- }], parent: [{
2306
- type: Input
2307
- }], integrationCode: [{
2308
- type: Input
2309
- }], resourceType: [{
2310
- type: Input
2311
- }], index: [{
2312
- type: Input
2313
- }], preview: [{
2314
- type: Input
2315
- }], theme: [{
2316
- type: Input
2317
- }], onChange: [{
2318
- type: Output
2319
- }], onLeave: [{
2320
- type: Output
2321
- }], fieldContent: [{
2322
- type: ViewChild,
2323
- args: [MetaFieldContentDirective, { static: true }]
2324
- }] } });
2325
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvZmllbGQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvcmVmRGlhbG9nL3ZpZXcuaHRtbCIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21ldGEtdWkvc3JjL2xpYi9maWVsZENvbXBvc2l0ZS92aWV3Lmh0bWwiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvZmllbGRTZWxlY3Qvdmlldy5odG1sIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWV0YS11aS9zcmMvbGliL2ZpZWxkUmVmZXJlbmNlL3ZpZXcuaHRtbCIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21ldGEtdWkvc3JjL2xpYi9maWVsZExpc3Qvdmlldy5odG1sIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWV0YS11aS9zcmMvbGliL2xheW91dC92aWV3Lmh0bWwiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvcmVzb3VyY2Uvdmlldy5odG1sIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWV0YS11aS9zcmMvbGliL3Jlc291cmNlQ2FyZC92aWV3Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQ0wsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUNuQyxTQUFTLEVBQWdDLFlBQVksRUFFdEQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUXBFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FB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R0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0IsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQ3pDLEtBQUssRUFBRSxLQUFLO1lBQ1osUUFBUSxFQUFFLElBQUk7WUFDZCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDLENBQUM7SUFDTCxDQUFDOztzR0E5Q1UsU0FBUzswRkFBVCxTQUFTLDhUQWFULHlCQUF5QixxRkFoQjFCLHFEQUFxRCwwaFZBTnBELHlCQUF5QjsyRkFTekIsU0FBUztrQkFMckIsU0FBUzsrQkFDRSxpQkFBaUIsWUFDakIscURBQXFEO3dJQUl0RCxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUVHLE9BQU87c0JBQWhCLE1BQU07Z0JBRWlELFlBQVk7c0JBQW5FLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIEBBdXRob3I6IEFsZXhhbmRlci5WYW5nZWxvdkB2b25hZ2UuY29tXG4gKiBARGF0ZTogMjAxOS0wOS0xOSAxNzozNToxOVxuICogQExhc3QgTW9kaWZpZWQgYnk6IEFsZXhhbmRlci5WYW5nZWxvdkB2b25hZ2UuY29tXG4gKiBATGFzdCBNb2RpZmllZCB0aW1lOiAyMDIzLTAyLTA4IDE0OjIzOjI2XG4gKi9cblxuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLCBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEFmdGVyQ29udGVudENoZWNrZWQsXG4gIE9uQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8vIGltcG9ydCB7IE1ldGFSZWZEaWFsb2cgfSBmcm9tICcuL3JlZkRpYWxvZyc7XG5pbXBvcnQgeyBNZXRhUmVmZXJlbmNlU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvbWV0YVJlZmVyZW5jZSc7XG5pbXBvcnQgeyBNZXRhUmVzb3VyY2VTZXJ2aWNlLCBJTWV0YVJlc291cmNlQ29uZmlnIH0gZnJvbSAnLi9zZXJ2aWNlcy9tZXRhUmVzb3VyY2UnO1xuaW1wb3J0IHsgTWV0YU1zZ1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL21ldGFNc2cnO1xuaW1wb3J0IHsgTWV0YUNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9tZXRhQ29udGV4dCc7XG5pbXBvcnQgeyBNZXRhVHJhY2tlclNlcnZpY2UsIElNZXRhVHJhY2tlckV2ZW50IH0gZnJvbSAnLi9zZXJ2aWNlcy9tZXRhVHJhY2tlcic7XG5pbXBvcnQgeyBtZXRhRGFyaywgbWV0YUxpZ2h0IH0gZnJvbSAnLi9jb21tb24vdXRpbHMvY29sb3JUaGVtZXMnO1xuaW1wb3J0IHsgbWV0YU5vcm1hbGl6ZXIgfSBmcm9tICcuL2NvbW1vbi9tZXRhTm9ybWFsaXplcic7XG5pbXBvcnQgeyB0ZW1wbGF0ZUJ1aWxkZXIgfSBmcm9tICcuL2NvbW1vbi91dGlscy90ZW1wbGF0ZUJ1aWxkZXInO1xuXG5pbXBvcnQgeyBGaWVsZEFic3RyYWN0IH0gZnJvbSAnLi9maWVsZEFic3RyYWN0JztcbmltcG9ydCB7IEZpZWxkVW5rbm93biB9IGZyb20gJy4vZmllbGRVbmtub3duJztcbmltcG9ydCB7IEZpZWxkVGV4dCB9IGZyb20gJy4vZmllbGRUZXh0JztcbmltcG9ydCB7IEZpZWxkSW5wdXQgfSBmcm9tICcuL2ZpZWxkSW5wdXQnO1xuLy8gaW1wb3J0IHsgRmllbGRTZWxlY3QgfSBmcm9tICcuL2ZpZWxkU2VsZWN0Jztcbi8vIGltcG9ydCB7IEZpZWxkUmVmZXJlbmNlIH0gZnJvbSAnLi9maWVsZFJlZmVyZW5jZSc7XG4vLyBpbXBvcnQgeyBGaWVsZENvbXBvc2l0ZSB9IGZyb20gJy4vZmllbGRDb21wb3NpdGUnO1xuaW1wb3J0IHsgRmllbGRCb29sZWFuIH0gZnJvbSAnLi9maWVsZEJvb2xlYW4nO1xuaW1wb3J0IHsgRmllbGRSYWRpbyB9IGZyb20gJy4vZmllbGRSYWRpbyc7XG4vLyBpbXBvcnQgeyBGaWVsZExpc3QgfSBmcm9tICcuL2ZpZWxkTGlzdCc7XG5pbXBvcnQgeyBGaWVsZFJpY2h0ZXh0IH0gZnJvbSAnLi9maWVsZFJpY2h0ZXh0JztcbmltcG9ydCB7IEZpZWxkRGF0ZXRpbWUgfSBmcm9tICcuL2ZpZWxkRGF0ZXRpbWUnO1xuaW1wb3J0IHsgcmVzb3VyY2VDYXJkTGFiZWwgfSBmcm9tICcuL2NvbW1vbi91dGlscy9yZXNvdXJjZUNhcmRMYWJlbCc7XG5cblxuLy8vLyBSRUYgRElBTE9HXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL3JlZkRpYWxvZy92aWV3Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZWZEaWFsb2cvc3R5bGUuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE1ldGFSZWZEaWFsb2cgaW1wbGVtZW50cyBPbkluaXQge1xuICBtb2RhbDogSFRNTEVsZW1lbnQ7XG4gIG9uQ29tcGxldGU6IChyZXN1bHQ/KSA9PiB1bmRlZmluZWQ7XG4gIGZ1bGxSZXNvdXJjZTogYW55O1xuICByZXNvdXJjZXM6IGFueSA9IHt9O1xuICBtb2RlbHM6IGFueSA9IHt9O1xuICByZWZlcmVuY2U6IGFueTtcbiAgY3VycmVudFJlc291cmNlOiBzdHJpbmc7XG4gIHNlcnZpY2VzOiBhbnkgPSB7fTtcbiAgaW50ZWdyYXRpb25Db2RlOiBzdHJpbmc7XG4gIHJlc291cmNlOiBhbnk7XG4gIG1ldGFSZXNvdXJjZTogTWV0YVJlc291cmNlU2VydmljZTtcbiAgaW50ZWdyYXRpb25JY29uOiBzdHJpbmc7XG4gIHByZWZlclJlc291cmNlVHlwZTogc3RyaW5nO1xuICB0aGVtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcbiAgKSB7IH1cblxuICBnZXQgaXNFZGl0YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXNbdGhpcy5jdXJyZW50UmVzb3VyY2VdLm1ldGEubGF5b3V0LmVkaXRhYmxlICE9PSBmYWxzZTtcbiAgfVxuXG4gIGdldCBpc1BlcnNpc3RlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UgJiYgKHRoaXMucmVzb3VyY2UuZXh0ZXJuYWxJZCB8fCB0aGlzLnJlc291cmNlLmlkKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGxldCByZWZlcmVuY2VzID0gKHRoaXMucmVmZXJlbmNlIGluc3RhbmNlb2YgQXJyYXkpID8gdGhpcy5yZWZlcmVuY2UgOiBbdGhpcy5yZWZlcmVuY2VdO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG4gICAgaWYgKHRoaXMucmVzb3VyY2UgJiYgdGhpcy5yZXNvdXJjZS5fdmdpcykge1xuICAgICAgdGhpcy5mdWxsUmVzb3VyY2UgPSB0aGlzLnJlc291cmNlO1xuICAgICAgdGhpcy5yZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UuX3ZnaXM7XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbiAgICBpZiAodGhpcy5yZXNvdXJjZSkge1xuICAgICAgcmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc1R5cGUgPSByLm5hbWUgfHwgci5yZXNvdXJjZVR5cGUgfHwgJyc7XG4gICAgICAgIC8vIGNvbXBhcmluZyBjYXNlIGluc2Vuc2l0aXZlLCBiZWNhdXNlIG9mIFplbmRlc2sgY29tbWVudCB2cyBDb21tZW50XG4gICAgICAgIHJldHVybiAocmVzVHlwZS5pZCB8fCByZXNUeXBlIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAodGhpcy5yZXNvdXJjZS5yZXNvdXJjZVR5cGUgfHwgdGhpcy5yZXNvdXJjZS50eXBlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWYgb2YgcmVmZXJlbmNlcykge1xuICAgICAgaWYgKCFyZWYubmFtZSkge1xuICAgICAgICByZWYubmFtZSA9IHJlZi5yZXNvdXJjZVR5cGU7IC8vIHdoZW4gdGhlIHJlc291cmNlIGNvbWVzIGZyb20gcmVzb3VyY2VzIEFQSSwgbm90IGZyb20gbWV0YWRhdGFcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jdXJyZW50UmVzb3VyY2UpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UmVzb3VyY2UgPSByZWYubmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWYubmFtZSA9PT0gdGhpcy5wcmVmZXJSZXNvdXJjZVR5cGUpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UmVzb3VyY2UgPSB0aGlzLnByZWZlclJlc291cmNlVHlwZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJzOiBhbnkgPSB7XG4gICAgICAgIGludGVncmF0aW9uQ29kZTogdGhpcy5pbnRlZ3JhdGlvbkNvZGUsXG4gICAgICAgIHJlc291cmNlVHlwZTogcmVmLnJlc291cmNlVHlwZSB8fCByZWYubmFtZSxcbiAgICAgICAgcmVmXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMucmVzb3VyY2UpIHtcbiAgICAgICAgcnMuZXh0ZXJuYWxJZCA9IHRoaXMucmVzb3VyY2UuaWQgfHwgdGhpcy5yZXNvdXJjZS5leHRlcm5hbElkO1xuICAgICAgICBpZiAodGhpcy5yZXNvdXJjZS5ldmVudElkKSB7XG4gICAgICAgICAgcnMuZXZlbnRJZCA9IHRoaXMucmVzb3VyY2UuZXZlbnRJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mdWxsUmVzb3VyY2UpIHtcbiAgICAgICAgICBycy5hY3Rpdml0eSA9IHRoaXMuZnVsbFJlc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlc291cmNlLmxheW91dElkKSB7XG4gICAgICAgICAgcnMubGF5b3V0SWQgPSB0aGlzLnJlc291cmNlLmxheW91dElkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBycy5wYXJlbnQgPSByZWYucGFyZW50O1xuICAgICAgdGhpcy5yZXNvdXJjZXNbcmVmLm5hbWVdID0gcnM7XG4gICAgICB0aGlzLm1vZGVsc1tyZWYubmFtZV0gPSB7fTtcbiAgICAgIGlmICh0aGlzLnJlc291cmNlKSB7XG4gICAgICAgIHRoaXMubW9kZWxzW3JlZi5uYW1lXS5fdmdpcyA9IHRoaXMucmVzb3VyY2U7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm1vZGFsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNoaWxkTm9kZXNbMF07XG4gICAgdGhpcy5tb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdWbHQtbW9kYWwtLW91dCcpO1xuICAgIHRoaXMubW9kYWwuY2xhc3NMaXN0LmFkZCgnVmx0LW1vZGFsX3Zpc2libGUnKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlFdmVudExpc3RlbmVyKTtcblxuICAgIGlmICh0aGlzLmludGVncmF0aW9uQ29kZSA9PT0gJ21vY2tzJykge1xuICAgICAgdGhpcy5pbnRlZ3JhdGlvbkljb24gPSAnQnJhbmQtaWNvbi12b25hZ2UnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuaW50ZWdyYXRpb25Db2RlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnb2ZmaWNlMzY1JzpcbiAgICAgICAgICB0aGlzLmludGVncmF0aW9uSWNvbiA9ICdCcmFuZC1pY29uLW9mZmljZS1jb2xvcic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3N1Z2FyJzpcbiAgICAgICAgICB0aGlzLmludGVncmF0aW9uSWNvbiA9ICdCcmFuZC1pY29uLXN1Z2FyY3JtLWNvbG9yJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbXNkeW5hbWljcyc6XG4gICAgICAgICAgdGhpcy5pbnRlZ3JhdGlvbkljb24gPSAnQnJhbmQtaWNvbi1keW5hbWljcy1jb2xvcic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5pbnRlZ3JhdGlvbkljb24gPSBgQnJhbmQtaWNvbi0keyh0aGlzLmludGVncmF0aW9uQ29kZSB8fCAnJykudG9Mb3dlckNhc2UoKX0tY29sb3JgO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXBwbHlUaGVtZSgpO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5tb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdWbHQtbW9kYWxfdmlzaWJsZScpO1xuICAgIHRoaXMubW9kYWwuY2xhc3NMaXN0LmFkZCgnVmx0LW1vZGFsLS1vdXQnKTtcbiAgfVxuXG4gIGRpc21pc3MoKSB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICAgIHRoaXMub25Db21wbGV0ZShudWxsKTtcbiAgfVxuXG4gIG9uUmVzb3VyY2VEb25lKHJlc3VsdCkge1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgICB0aGlzLm9uQ29tcGxldGUocmVzdWx0KTtcbiAgfVxuXG4gIHNlbGVjdFJlc291cmNlKHJlc291cmNlKSB7XG4gICAgdGhpcy5jdXJyZW50UmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgfVxuXG4gIGtlZXBPcmRlciA9IChhLCBiKSA9PiBhO1xuXG4gIHByaXZhdGUga2V5RXZlbnRMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgIGlmIChldmVudCAmJiBldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlFdmVudExpc3RlbmVyKTtcbiAgICAgIHRoaXMuZGlzbWlzcygpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGFwcGx5VGhlbWUoKSB7XG4gICAgY29uc3QgbWV0YVRoZW1lID0gdGhpcy50aGVtZSA9PT0gJ2RhcmsnID8gbWV0YURhcmsgOiBtZXRhTGlnaHQ7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobWV0YVRoZW1lLnByb3BlcnRpZXMpKSB7XG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCBtZXRhVGhlbWUucHJvcGVydGllc1trZXldKTtcbiAgICB9XG4gIH1cbn1cblxuLy8vLyBDT01QT1NJVEUgRklFTERcbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vZmllbGRDb21wb3NpdGUvdmlldy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmllbGRDb21wb3NpdGUvc3R5bGUuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGaWVsZENvbXBvc2l0ZSBleHRlbmRzIEZpZWxkQWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBtZXRhOiBhbnk7XG4gIHZhbHVlOiBhbnk7XG5cbiAgZ2V0IGlzUm93KCkge1xuICAgIHJldHVybiB0aGlzLm1ldGEuc3VidHlwZSAhPT0gJ2NvbHVtbic7XG4gIH1cblxuICBnZXQgZmllbGRzKCkge1xuICAgIHJldHVybiAodGhpcy5tZXRhLmZpZWxkcyB8fCBbXSkubWFwKChmKSA9PiB7XG4gICAgICBpZiAoZi50eXBlID09PSAndGV4dGFyZWEnKSB7IC8vIG5vIHRleHRhcmVhcyBpbnNpZGUgY29tcG9zaXRlICh1c2Ugc3RyaW5nKVxuICAgICAgICBkZWxldGUgZi50eXBlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGY7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBzdXBlci5uZ09uSW5pdCgpXG4gICAgbGV0IG5lc3RlZEZpZWxkc1JlZ2V4OiBSZWdFeHA7XG4gICAgaWYgKHRoaXMubWV0YS5uYW1lKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdIHx8IHt9O1xuICAgICAgbmVzdGVkRmllbGRzUmVnZXggPSBuZXcgUmVnRXhwKGBeJHt0aGlzLm1ldGEubmFtZX1cXFxcLiguKilgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnBhcmVudCwgdGhpcy5tZXRhLm5hbWUsIHtcbiAgICAgICAgc2V0OiAodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZVt2XSA9IHZhbHVlW3ZdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMudmFsdWUpICE9PSAne30nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRoaXMuc2VuZFRvU2VydmVyLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBmIG9mIHRoaXMubWV0YS5maWVsZHMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSb3cpIHtcbiAgICAgICAgICBpZiAoZi50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIGYudHlwZSA9ICdzdHJpbmcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXN0ZWRGaWVsZE1hdGNoID0gZi5uYW1lLm1hdGNoKG5lc3RlZEZpZWxkc1JlZ2V4KTtcbiAgICAgICAgaWYgKG5lc3RlZEZpZWxkTWF0Y2gpIHtcbiAgICAgICAgICBmLm5hbWUgPSBuZXN0ZWRGaWVsZE1hdGNoWzFdOyAvLyBmb3IgVkdJUyBWMiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG5vcm1hbGl6ZSBuYW1lIHdpdGggZG90dGVkIHN5bnRheFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnBhcmVudDtcbiAgICB9XG4gIH1cblxufVxuXG4vLy8vIFNFTEVDVCBGSUVMRFxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9maWVsZFNlbGVjdC92aWV3Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWVsZFNlbGVjdC9zdHlsZS5zY3NzJ10sXG4gIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfV1cbn0pXG5leHBvcnQgY2xhc3MgRmllbGRTZWxlY3QgZXh0ZW5kcyBGaWVsZEFic3RyYWN0IGltcGxlbWVudHMgT25Jbml0IHtcbiAgbXVsdGlwbGU6IGJvb2xlYW47XG4gIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50O1xuICBkcm9wZG93bjogSFRNTEVsZW1lbnQ7XG4gIGRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgc2hvd1RleHQ6IHN0cmluZztcbiAgYWN0aXZlU3VnZ2VzdGlvbkluZGV4OiBudW1iZXI7XG4gIHZhbHVlOiBhbnk7XG4gIGlzQ3JlYXRhYmxlID0gZmFsc2U7XG4gIGFzeW5jT3B0aW9uczogQXJyYXk8YW55PjtcbiAgc2VhcmNoaW5nOiBib29sZWFuO1xuICBmaWx0ZXJlZE9wdGlvbnM6IEFycmF5PGFueT47XG4gIHNlYXJjaElucHV0VGV4dDogJyc7XG4gIHNlYXJjaElucHV0OiBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSByZWZlcmVuY2VTZXJ2aWNlOiBNZXRhUmVmZXJlbmNlU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFSZXNvdXJjZTogTWV0YVJlc291cmNlU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zIHx8IHRoaXMuYXN5bmNPcHRpb25zIHx8IHRoaXMubWV0YS5vcHRpb25zIHx8IHRoaXMubWV0YS5waWNrbGlzdCB8fCBbXTtcbiAgfVxuXG4gIGdldCBncm91cGVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlZHVjZSgociwgeyBncm91cCB9KSA9PiB7XG4gICAgICBpZiAoIXIuc29tZShvID0+IG8uZ3JvdXAgPT09IGdyb3VwKSkge1xuICAgICAgICByLnB1c2goeyBncm91cCwgZ3JvdXBJdGVtOiB0aGlzLm9wdGlvbnMuZmlsdGVyKHYgPT4gdi5ncm91cCA9PT0gZ3JvdXApIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfSwgW10pO1xuICB9XG5cbiAgZ2V0IHJlc291cmNlU2VydmljZSgpIHtcbiAgICBpZiAoIXRoaXMubWV0YVJlc291cmNlU2VydmljZSkge1xuICAgICAgY29uc3QgbWV0YVJlc291cmNlQ29uZmlnOiBJTWV0YVJlc291cmNlQ29uZmlnID0ge1xuICAgICAgICBpbnRlZ3JhdGlvbkNvZGU6IHRoaXMuaW50ZWdyYXRpb25Db2RlLFxuICAgICAgICByZXNvdXJjZVR5cGU6IHRoaXMucmVzb3VyY2VUeXBlXG4gICAgICB9O1xuICAgICAgdGhpcy5tZXRhUmVzb3VyY2VTZXJ2aWNlID0gdGhpcy5tZXRhUmVzb3VyY2UubmV3KG1ldGFSZXNvdXJjZUNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1ldGFSZXNvdXJjZVNlcnZpY2U7XG4gIH1cblxuICBnZXQgb3B0aW9uc0JhY2t1cCgpIHtcbiAgICByZXR1cm4gdGhpcy5hc3luY09wdGlvbnMgfHwgdGhpcy5tZXRhLm9wdGlvbnMgfHwgdGhpcy5tZXRhLnBpY2tsaXN0IHx8IFtdO1xuICB9XG5cbiAgc3RhdGljIHNldHVwKGluc3RhbmNlLCBwYXJlbnQsIG1ldGEpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdwYXJlbnQnLCB0aGlzLnBhcmVudCk7XG4gICAgdGhpcy52YWxpZGF0aW9uQXR0cmlidXRlcyA9IFsncmVxdWlyZWQnXTtcbiAgICB0aGlzLm11bHRpcGxlID0gKHRoaXMubWV0YS50eXBlID09PSAnbXVsdGlwaWNrbGlzdCcpIHx8IHRoaXMubWV0YS5tdWx0aXBsZTtcbiAgICBjb25zdCBvcmlnVmFsdWUgPSB0aGlzLnBhcmVudFt0aGlzLm1ldGEubmFtZV07XG4gICAgaWYgKHRoaXMubWV0YS5yZWZlcmVuY2UpIHtcbiAgICAgIHRoaXMuaXNDcmVhdGFibGUgPSB0cnVlO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5wYXJlbnQsIHRoaXMubWV0YS5uYW1lLCB7XG4gICAgICBzZXQ6ICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBvIG9mIHRoaXMub3B0aW9ucykge1xuICAgICAgICAgICAgICBpZiAoKHZhbHVlLmlkIHx8IHZhbHVlKSA9PT0gKG8uaWQgfHwgby52YWx1ZSB8fCBvLm5hbWUgfHwgMCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gW29dO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbdGhpcy5tb2RlbFRvVmFsdWUobywgdGhpcy5tZXRhLnZhbHVlVHlwZSldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkgPyB2YWx1ZSA6ICh2YWx1ZSB8fCAnJykuc3BsaXQoJzsnKTsgLy8gc2hvdWxkIG5vdCBoYW5kbGUgaW5jb3JyZWN0IHZhbHVlc1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhbHVlcykge1xuICAgICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbyBvZiB0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgodi5pZCB8fCB2KSA9PT0gKG8uaWQgfHwgby52YWx1ZSB8fCBvLm5hbWUgfHwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5wdXNoKG8pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnB1c2godGhpcy5tb2RlbFRvVmFsdWUobywgdGhpcy5tZXRhLnZhbHVlVHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5tb2RlbC5sZW5ndGggJiYgIXRoaXMuaXNQZXJzaXN0ZWRQYXJlbnQpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubW9kZWw7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zaG93VGV4dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2hvd1RleHQgPSAodGhpcy5tb2RlbCB8fCBbXSkubWFwKChvKSA9PiBvLmxhYmVsIHx8IG8pLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBvIG9mIHRoaXMub3B0aW9ucykge1xuICAgICAgICAgICAgICBpZiAoKHZhbHVlLmlkIHx8IHZhbHVlKSA9PT0gKG8uaWQgfHwgby52YWx1ZSB8fCBvLm5hbWUgfHwgbykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gbztcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tb2RlbFRvVmFsdWUobywgdGhpcy5tZXRhLnZhbHVlVHlwZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93VGV4dCA9IG8ubGFiZWwgfHwgbztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5tb2RlbDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2hvd1RleHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25TdWJqZWN0Q2hhbmdlKHRoaXMubW9kZWwpO1xuICAgICAgICB0aGlzLm1ldGEuJG9wdGlvbmFsID0gdGhpcy5pc09wdGlvbmFsO1xuICAgICAgfSxcbiAgICAgIGdldDogKCkgPT4gdGhpcy52YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRoaXMuc2VuZFRvU2VydmVyLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAob3JpZ1ZhbHVlKSB7XG4gICAgICB0aGlzLnBhcmVudFt0aGlzLm1ldGEubmFtZV0gPSBvcmlnVmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVmYXVsdCAmJiAhdGhpcy5tb2RlbCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IHRoaXMuZGVmYXVsdC5pZCB8fCB0aGlzLmRlZmF1bHQ7XG4gICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mICh0aGlzLm1ldGEuZW5hYmxlZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiAodGhpcy5tZXRhLmVuYWJsZWQpID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IHBhciBvZiBPYmplY3Qua2V5cyh0aGlzLm1ldGEuZW5hYmxlZCkpIHtcbiAgICAgICAgICBjb25zdCBwYXJWYWx1ZSA9IHRoaXMucGFyZW50W3Bhcl07XG4gICAgICAgICAgaWYgKHBhclZhbHVlKSB7XG4gICAgICAgICAgICAvLyBsb2dpYyBmb3Igc3BlY2lmaWMgdmFsdWVzLCB0aGlzIHdvcmtzIG9ubHkgZm9yIHRydWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dpY2FsRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZpbHRlck9wdGlvbnMoKTtcbiAgICAgICAgICB0aGlzLnBhcmVudENoYW5nZVN1YmplY3Quc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmhhc093blByb3BlcnR5KHBhcikpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2dpY2FsRGlzYWJsZWQgPSAhdmFsdWVbcGFyXTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMubG9naWNhbERpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXRhLnNlYXJjaCkge1xuICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdGhpcy5tZXRhLnNlYXJjaC5wYXJhbXM7XG4gICAgICBpZiAoc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFyIG9mIE9iamVjdC5rZXlzKHNlYXJjaFBhcmFtcykpIHtcbiAgICAgICAgICBjb25zdCBwYXJWYWx1ZSA9IHRoaXMucGFyZW50W3NlYXJjaFBhcmFtc1twYXJdXTtcbiAgICAgICAgICBpZiAocGFyVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgcGFyYW1zW3Bhcl0gPSBwYXJWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoT3B0aW9ucyhwYXJhbXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnBhcmVudENoYW5nZVN1YmplY3Quc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmhhc093blByb3BlcnR5KHNlYXJjaFBhcmFtc1twYXJdKSkge1xuICAgICAgICAgICAgICB0aGlzLnNlYXJjaE9wdGlvbnModmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25BY3RpdmF0ZWQoZXYpIHtcbiAgICAvLyBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIC8vIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaW5wdXQgPSBldi5zcmNFbGVtZW50O1xuICAgIGlmICghdGhpcy5kcm9wZG93bikge1xuICAgICAgdGhpcy5kcm9wZG93biA9IGV2LnNyY0VsZW1lbnQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICB0aGlzLnNlYXJjaElucHV0ID0gdGhpcy5kcm9wZG93bi5xdWVyeVNlbGVjdG9yKCcudmdpcC1zZWFyY2hfaW5wdXQnKTtcbiAgICB9XG4gICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgfVxuXG4gIGRldGVjdFNlYXJjaEJsb2NrKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLlZsdC1zZWFyY2hfd3JhcCcpLmNvbnRhaW5zKGVsZW1lbnQpO1xuICB9XG5cbiAgb25CbHVyKGV2KSB7XG4gICAgbGV0IGludGVybmFsQ29udHJvbCA9IGZhbHNlO1xuICAgIGlmIChldi5yZWxhdGVkVGFyZ2V0KSB7XG5cbiAgICAgIGlmICghdGhpcy5kZXRlY3RTZWFyY2hCbG9jayhldi5yZWxhdGVkVGFyZ2V0KSAmJiAhdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXYucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVybmFsQ29udHJvbCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmtleUxpc3RlbmVyQWN0aXZlICYmICFpbnRlcm5hbENvbnRyb2wpIHtcbiAgICAgIHRoaXMuaW5wdXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bik7XG4gICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dCkge1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd24pO1xuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5rZXlMaXN0ZW5lckFjdGl2ZSkge1xuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja291dCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDQwMCk7XG4gICAgICBkZWxldGUgdGhpcy5rZXlMaXN0ZW5lckFjdGl2ZTtcbiAgICB9XG4gICAgdGhpcy5vbkxlYXZlLmVtaXQoZXYpO1xuICB9XG5cbiAgb25PcHRpb25TZWxlY3QoZXYsIG9wdGlvbikge1xuICAgIGlmIChldikge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmZvY3VzKCk7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIGlmICghdGhpcy5tb2RlbCkge1xuICAgICAgICB0aGlzLm1vZGVsID0gW107XG4gICAgICB9XG4gICAgICBjb25zdCBvcHRpb25JbmRleCA9IHRoaXMubW9kZWwuaW5kZXhPZihvcHRpb24pO1xuICAgICAgaWYgKG9wdGlvbkluZGV4ID09PSAtMSkge1xuICAgICAgICB0aGlzLm1vZGVsLnB1c2gob3B0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubW9kZWwuc3BsaWNlKG9wdGlvbkluZGV4LCAxKTtcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLmxlbmd0aCkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLm1vZGVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5tb2RlbCk7XG4gICAgICBpZiAodGhpcy5tb2RlbCkge1xuICAgICAgICB0aGlzLnNob3dUZXh0ID0gKHRoaXMubW9kZWwgfHwgW10pLm1hcCgobykgPT4gby5sYWJlbCB8fCBvKS5qb2luKCcsICcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2hvd1RleHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzbWlzc0Ryb3Bkb3duKCk7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IG9wdGlvbjtcbiAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKG9wdGlvbik7XG4gICAgICAgIHRoaXMuc2hvd1RleHQgPSBvcHRpb24ubGFiZWwgfHwgKG9wdGlvbi5pZCA9PT0gJycgPyAnLS1lbXB0eS0tJyA6IG9wdGlvbik7XG4gICAgICAgIGlmICh0eXBlb2YgKG9wdGlvbikgPT09ICdvYmplY3QnICYmICFvcHRpb24uaWQgJiYgb3B0aW9uLmlkICE9PSAnJykge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLnNob3dUZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoZXY/KSB7XG4gICAgZGVsZXRlIHRoaXMubW9kZWw7XG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMubW9kZWwpO1xuICAgIGRlbGV0ZSB0aGlzLnNob3dUZXh0O1xuICAgIGlmIChldikge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5SZXNvdXJjZShldikge1xuICAgIGNvbnN0IHJlZkRpYWxvZ0ZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShNZXRhUmVmRGlhbG9nKTtcbiAgICB0aGlzLnJlZmVyZW5jZVNlcnZpY2Uub3BlbkRpYWxvZyhcbiAgICAgIHJlZkRpYWxvZ0ZhY3RvcnksIHRoaXMubWV0YVJlc291cmNlLCB0aGlzLmludGVncmF0aW9uQ29kZSwgdGhpcy5tZXRhLnJlZmVyZW5jZSwgbnVsbFxuICAgICkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ09wdGlvbnMgPSAodGhpcy5tZXRhLm9wdGlvbnMgfHwgW10pLmZpbmQoKG8pID0+IChvLmlkID09PSByZXN1bHQuaWQgJiYgby50eXBlID09PSByZXN1bHQudHlwZSkpO1xuICAgICAgICBpZiAoZXhpc3RpbmdPcHRpb25zKSB7XG4gICAgICAgICAgZXhpc3RpbmdPcHRpb25zLmxhYmVsID0gcmVzdWx0LmxhYmVsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghdGhpcy5tZXRhLm9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMubWV0YS5vcHRpb25zID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubWV0YS5vcHRpb25zLnVuc2hpZnQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uT3B0aW9uU2VsZWN0KGV2LCByZXN1bHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2hvd0Ryb3Bkb3duKCkge1xuICAgIHRoaXMuZHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnVmx0LWRyb3Bkb3duLS1leHBhbmRlZCcpO1xuICAgIGlmICghdGhpcy5rZXlMaXN0ZW5lckFjdGl2ZSkge1xuICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5mb2N1cygpOyAvLyBGb2N1cyBkaXJlY3RseSBvbiBzZWFyY2ggaW5wdXQgZmlyc3QgdmlzaXRcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrb3V0KTtcbiAgICAgIH0sIDIwMCk7XG4gICAgICB0aGlzLmtleUxpc3RlbmVyQWN0aXZlID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5tb2RlbCkge1xuICAgICAgICBmb3IgKGxldCBzdWdnZXN0aW9uSW5kZXggPSAwOyBzdWdnZXN0aW9uSW5kZXggPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBzdWdnZXN0aW9uSW5kZXgrKykge1xuICAgICAgICAgIGlmICh0aGlzLm1vZGVsID09PSB0aGlzLm9wdGlvbnNbc3VnZ2VzdGlvbkluZGV4XSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSBzdWdnZXN0aW9uSW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZW5zdXJlRHJvcGRvd25Jc1Zpc2libGUoKTtcbiAgfVxuXG4gIGRpc21pc3NEcm9wZG93bihldmVudD8pIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuZHJvcGRvd24uY2xhc3NMaXN0LnJlbW92ZSgnVmx0LWRyb3Bkb3duLS1leHBhbmRlZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWFyY2hJbnB1dCkge1xuICAgICAgdGhpcy5jbGVhclNlYXJjaEZpZWxkKCk7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleDtcbiAgfVxuXG4gIG9uU2VhcmNoQ2hhbmdlKCkge1xuICAgIGNvbnN0IHNlYXJjaCA9IG5ldyBSZWdFeHAodGhpcy5zZWFyY2hJbnB1dFRleHQsICdnaScpO1xuICAgIGlmICh0aGlzLnNlYXJjaElucHV0VGV4dCA9PT0gJycpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gWy4uLnRoaXMub3B0aW9uc0JhY2t1cF07XG4gICAgfVxuICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5vcHRpb25zQmFja3VwLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLmxhYmVsLm1hdGNoKHNlYXJjaCkpO1xuICB9XG5cbiAgY2xlYXJTZWFyY2hGaWVsZCgpIHtcbiAgICB0aGlzLnNlYXJjaElucHV0VGV4dCA9ICcnO1xuICAgIHRoaXMub25TZWFyY2hDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlRHJvcGRvd25Jc1Zpc2libGUoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBob2xkZXIgPSB0aGlzLmRyb3Bkb3duLmNsb3Nlc3QoJy5WbHQtY2FyZF9fY29udGVudCcpO1xuICAgICAgaWYgKGhvbGRlcikge1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5WbHQtZHJvcGRvd25fX3BhbmVsJyk7XG4gICAgICAgIGNvbnN0IGVsUmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBob2xkZXJSZWN0ID0gaG9sZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoaG9sZGVyUmVjdC50b3AgKyBob2xkZXJSZWN0LmhlaWdodCA8IGVsUmVjdC50b3AgKyBlbFJlY3QuaGVpZ2h0KSB7XG4gICAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCA0MDApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVEcm9wZG93bk9wdGlvbklzVmlzaWJsZSgpIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25TY3JvbGxDb250YWluZXIpIHtcbiAgICAgIHRoaXMuZHJvcGRvd25TY3JvbGxDb250YWluZXIgPSB0aGlzLmRyb3Bkb3duLnF1ZXJ5U2VsZWN0b3IoJy5WbHQtZHJvcGRvd25fX3Njcm9sbCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kcm9wZG93blNjcm9sbENvbnRhaW5lciAmJiB0eXBlb2YgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4KSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IDQ0ICogdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXg7XG4gICAgICBjb25zdCBzY3JvbGxCb3R0b20gPSA0NCAqICh0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCAtIDcpO1xuICAgICAgaWYgKHNjcm9sbFRvcCA8IHRoaXMuZHJvcGRvd25TY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25TY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgfSBlbHNlIGlmIChzY3JvbGxCb3R0b20gPiB0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IHNjcm9sbEJvdHRvbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbHRlck9wdGlvbnMoKSB7XG4gICAgdGhpcy5hc3luY09wdGlvbnMgPSBbXTtcbiAgICBpZiAoIXRoaXMubG9naWNhbERpc2FibGVkKSB7XG4gICAgICBmb3IgKGNvbnN0IG8gb2YgdGhpcy5tZXRhLm9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG8uZm9yKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwYXIgb2YgT2JqZWN0LmtleXMoby5mb3IpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJWYWx1ZSA9IHRoaXMucGFyZW50W3Bhcl07XG4gICAgICAgICAgICBpZiAoby5mb3JbcGFyXS5pbmRleE9mKHBhclZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgdGhpcy5hc3luY09wdGlvbnMucHVzaChvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hc3luY09wdGlvbnMucHVzaChvKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xpY2tvdXQgPSAoZXZlbnQpID0+IHtcbiAgICBpZiAoXG4gICAgICBldmVudC50YXJnZXQuY2xhc3NOYW1lID09PSAnVmx0LWRyb3Bkb3duX19saW5rJyAmJiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpXG4gICAgKSB7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGV2ZW50LnRhcmdldCAhPT0gdGhpcy5pbnB1dCAmJlxuICAgICAgIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ1ZsdC1kcm9wZG93bl9fYmxvY2snKSAmJlxuICAgICAgIXRoaXMuZGV0ZWN0U2VhcmNoQmxvY2soZXZlbnQudGFyZ2V0KVxuICAgICkge1xuICAgICAgdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGV0ZWN0U2VhcmNoQmxvY2soZXZlbnQudGFyZ2V0KSkge1xuICAgICAgZXZlbnQudGFyZ2V0LmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBrZXlkb3duID0gKGV2ZW50KSA9PiB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6IHtcbiAgICAgICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXgpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCsrO1xuICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA+PSB0aGlzLm9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5zdXJlRHJvcGRvd25PcHRpb25Jc1Zpc2libGUoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXgpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID0gdGhpcy5vcHRpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXgtLTtcbiAgICAgICAgICBpZiAodGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9IHRoaXMub3B0aW9ucy5sZW5ndGggLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuc3VyZURyb3Bkb3duT3B0aW9uSXNWaXNpYmxlKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJ1NwYWNlJzpcbiAgICAgIGNhc2UgJyAnOiB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4KSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMub25PcHRpb25TZWxlY3QoZXZlbnQsIHRoaXMub3B0aW9uc1t0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleF0pO1xuICAgICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VzY2FwZSc6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuZGlzbWlzc0Ryb3Bkb3duKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQmFja3NwYWNlJzoge1xuICAgICAgICBpZiAoIXRoaXMuZHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKCdWbHQtZHJvcGRvd24tLWV4cGFuZGVkJykpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBzZWFyY2hPcHRpb25zKHBhcmFtcz8pIHtcbiAgICBsZXQgc2VhcmNoVXJsID0gYC9maWVsZHMvJHt0aGlzLm1ldGEubmFtZX0vc2VhcmNoYDtcbiAgICBpZiAodGhpcy5tZXRhLnNlYXJjaCkge1xuICAgICAgaWYgKHRoaXMubWV0YS5zZWFyY2gudXJsKSB7XG4gICAgICAgIHNlYXJjaFVybCA9IHRoaXMubWV0YS5zZWFyY2gudXJsO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdGhpcy5tZXRhLnNlYXJjaC5wYXJhbXM7XG4gICAgICBpZiAoc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFyIG9mIE9iamVjdC5rZXlzKHNlYXJjaFBhcmFtcykpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnBhcmVudFtzZWFyY2hQYXJhbXNbcGFyXV07XG4gICAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgICAgc2VhcmNoVXJsICs9IGAke3NlYXJjaFVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnfSR7cGFyfT0ke3ZhbC5pZCB8fCB2YWx9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWFyY2hpbmcgPSB0cnVlO1xuICAgIHRoaXMucmVzb3VyY2VTZXJ2aWNlLmdldEJ5UGF0aChzZWFyY2hVcmwpLnN1YnNjcmliZSgob3B0aW9ucykgPT4ge1xuICAgICAgdGhpcy5hc3luY09wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgbGV0IHZhbGlkVmFsdWUgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgIGZvciAoY29uc3QgbyBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKChvLmlkIHx8IG8pID09PSAodGhpcy52YWx1ZS5pZCB8fCB0aGlzLnZhbHVlKSkge1xuICAgICAgICAgICAgdmFsaWRWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsaWRWYWx1ZSkge1xuICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVsZXRlIHRoaXMuc2VhcmNoaW5nO1xuICAgIH0pO1xuICB9XG5cbn1cblxuLy8vLyBGSUVMRCBSRUZFUkVOQ0VcbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vZmllbGRSZWZlcmVuY2Uvdmlldy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmllbGRSZWZlcmVuY2Uvc3R5bGUuc2NzcyddLFxuICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1dXG59KVxuZXhwb3J0IGNsYXNzIEZpZWxkUmVmZXJlbmNlIGV4dGVuZHMgRmllbGRBYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGlucHV0OiBhbnk7XG4gIGRyb3Bkb3duOiBIVE1MRWxlbWVudDtcbiAgZHJvcGRvd25TY3JvbGxDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBzZWFyY2hpbmc6IGJvb2xlYW47XG4gIHNlYXJjaFJlc291cmNlVHlwZTogYW55ID0ge307XG4gIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgc2VhcmNoUmVzdWx0czogQXJyYXk8YW55PjtcbiAgc2VhcmNoRXJyb3I6IGFueTtcbiAgYWN0aXZlU3VnZ2VzdGlvbkluZGV4OiBudW1iZXI7XG4gIHNlYXJjaFJlc291cmNlVHlwZXNTY29wZTogc3RyaW5nO1xuICBzZWFyY2hUZXh0Q2hhbmdlZDogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBpc0NyZWF0YWJsZSA9IGZhbHNlO1xuICB2YWx1ZTogYW55O1xuICBpc1BvbHltb3JwaGljOiBib29sZWFuO1xuICBpc1NlYXJjaGFibGU6IGJvb2xlYW47XG4gIG11bHRpcGxlOiBib29sZWFuO1xuICB2cjogTWV0YVJlc291cmNlU2VydmljZTtcbiAgZXh0ZXJuYWxMaW5rOiBzdHJpbmc7XG4gIGRyb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICBzZWFyY2hSZXNvdXJjZVR5cGVNZXRhOiBhbnkgPSB7XG4gICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgbmFtZTogJ3Jlc291cmNlVHlwZScsXG4gICAgbGFiZWw6ICdUeXBlJyxcbiAgICBvcHRpb25zOiBbXSwgLy8geyBsYWJlbDogJy0tIEFsbCB0eXBlcyAtLScgfV0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxuICB9O1xuICBmaWx0ZXJlZFN1Z2dlc3Rpb25zOiBBcnJheTxhbnk+ID0gW107XG4gIHBsYWNlSG9sZGVyTGFiZWw6IHN0cmluZztcbiAgYXN5bmNTdWdnZXN0aW9uczogQXJyYXk8YW55PjtcbiAgc21hcnRTdWdnZXN0aW9uczogQXJyYXk8YW55PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSByZWZlcmVuY2VTZXJ2aWNlOiBNZXRhUmVmZXJlbmNlU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFSZXNvdXJjZTogTWV0YVJlc291cmNlU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFNc2dTZXJ2aWNlOiBNZXRhTXNnU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFDb250ZXh0OiBNZXRhQ29udGV4dFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXRhVHJhY2tlcjogTWV0YVRyYWNrZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgY29uc3Qgc3VwZXJEaXNhYmxlZCA9IHRoaXMubG9naWNhbERpc2FibGVkIHx8IHRoaXMudmFsaWRhdGlvbnMuZGlzYWJsZWQgfHwgdGhpcy5tZXRhLmRpc2FibGVkID09PSB0cnVlXG4gICAgICB8fCAodGhpcy5tZXRhLnVwZGF0YWJsZSA9PT0gZmFsc2UgJiYgdGhpcy5pc1BlcnNpc3RlZFBhcmVudCk7XG4gICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVNZXRhLmRpc2FibGVkID0gc3VwZXJEaXNhYmxlZDtcbiAgICByZXR1cm4gc3VwZXJEaXNhYmxlZDtcbiAgfVxuXG4gIGdldCBzaG93VHlwZXMoKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgKHRoaXMubWV0YS5zaG93VHlwZXMpICE9PSAndW5kZWZpbmVkJykgPyB0aGlzLm1ldGEuc2hvd1R5cGVzIDogdHJ1ZTtcbiAgfVxuXG4gIGdldCBzdWdnZXN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5zbWFydFN1Z2dlc3Rpb25zLmNvbmNhdChcbiAgICAgICF0aGlzLnNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUgP1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAodGhpcy5hc3luY1N1Z2dlc3Rpb25zIHx8IHRoaXMubWV0YS5zdWdnZXN0aW9ucyB8fCBbXSkgOiAodGhpcy5hc3luY1N1Z2dlc3Rpb25zIHx8IHRoaXMubWV0YS5zdWdnZXN0aW9ucyB8fCBbXSkuZmlsdGVyKChzKSA9PiBzLnR5cGUgPT09IHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlLnJlc291cmNlVHlwZSlcbiAgICApO1xuICB9XG5cbiAgZ2V0IGhhc0FwcGVuZEJ1dHRvbigpIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy5tb2RlbCkge1xuICAgICAgaWYgKHRoaXMuaXNQb2x5bW9ycGhpYykge1xuICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiB0aGlzLm1ldGFSZWZlcmVuY2UpIHtcbiAgICAgICAgICBpZiAoKHJlZi5uYW1lIHx8IHJlZi5yZXNvdXJjZVR5cGUpID09PSAodGhpcy5tb2RlbC50eXBlIHx8IHRoaXMubW9kZWwucmVzb3VyY2VUeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZi51cGRhdGFibGUgfHwgKHJlZi5jcmVhdGFibGUgJiYgcmVmLnVwZGF0YWJsZSAhPT0gZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YVJlZmVyZW5jZS51cGRhdGFibGUgfHwgKHRoaXMubWV0YVJlZmVyZW5jZS5jcmVhdGFibGUgJiYgdGhpcy5tZXRhUmVmZXJlbmNlLnVwZGF0YWJsZSAhPT0gZmFsc2UpOyAvLyBWR0lTLTY5MTFcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMubWV0YVJlZmVyZW5jZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlc1Njb3BlID0gdGhpcy5tZXRhUmVmZXJlbmNlLm1hcChydCA9PiBydC5uYW1lKS5qb2luKCcsJyk7XG4gICAgICAvLyB9LCAwKTtcbiAgICAgIGZvciAoY29uc3QgcnQgb2YgdGhpcy5tZXRhUmVmZXJlbmNlKSB7XG4gICAgICAgIGlmIChydC5jcmVhdGFibGUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhUmVmZXJlbmNlLmNyZWF0YWJsZTtcbiAgICB9XG4gIH1cblxuICBnZXQgcmVzb3VyY2VTZXJ2aWNlKCkge1xuICAgIGlmICghdGhpcy5tZXRhUmVzb3VyY2VTZXJ2aWNlKSB7XG4gICAgICBjb25zdCBtZXRhUmVzb3VyY2VDb25maWc6IElNZXRhUmVzb3VyY2VDb25maWcgPSB7XG4gICAgICAgIGludGVncmF0aW9uQ29kZTogdGhpcy5pbnRlZ3JhdGlvbkNvZGUsXG4gICAgICAgIHJlc291cmNlVHlwZTogdGhpcy5yZXNvdXJjZVR5cGVcbiAgICAgIH07XG4gICAgICB0aGlzLm1ldGFSZXNvdXJjZVNlcnZpY2UgPSB0aGlzLm1ldGFSZXNvdXJjZS5uZXcobWV0YVJlc291cmNlQ29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWV0YVJlc291cmNlU2VydmljZTtcbiAgfVxuXG4gIGdldCBtZXRhUmVmZXJlbmNlKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGEucmVmZXJlbmNlIHx8IHt9O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5tdWx0aXBsZSA9ICh0aGlzLm1ldGEudHlwZSA9PT0gJ211bHRpcmVmZXJlbmNlJykgfHwgdGhpcy5tZXRhLm11bHRpcGxlO1xuICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlTWV0YS5sYWJlbCA9IHRoaXMubWV0YS5sYWJlbDtcbiAgICBpZiAoIXRoaXMubWV0YS52YWx1ZVR5cGUpIHtcbiAgICAgIC8vIHRoaXMubWV0YS52YWx1ZVR5cGUgPSAnb2JqZWN0JztcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLm1ldGEsICd2YWx1ZVR5cGUnLCB7XG4gICAgICAgIHZhbHVlOiAnb2JqZWN0J1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1ldGFSZWZlcmVuY2UgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgdGhpcy5pc1BvbHltb3JwaGljID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNTZWFyY2hhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlc1Njb3BlID0gdGhpcy5tZXRhUmVmZXJlbmNlLm1hcChydCA9PiBydC5uYW1lKS5qb2luKCcsJyk7XG4gICAgICBmb3IgKGNvbnN0IHJ0IG9mIHRoaXMubWV0YVJlZmVyZW5jZSkge1xuICAgICAgICBpZiAocnQuY3JlYXRhYmxlKSB7XG4gICAgICAgICAgdGhpcy5pc0NyZWF0YWJsZSA9IHRydWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiAocnQuc2VhcmNoYWJsZSkgIT09ICd1bmRlZmluZWQnICYmICFydC5zZWFyY2hhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmlzU2VhcmNoYWJsZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5tZXRhUmVmZXJlbmNlLmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVNZXRhLm9wdGlvbnMucHVzaCh7IGlkOiByLm5hbWUsIGxhYmVsOiByLmxhYmVsIHx8IHIubmFtZSB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzU2VhcmNoYWJsZSA9IHR5cGVvZiAodGhpcy5tZXRhUmVmZXJlbmNlLnNlYXJjaGFibGUpID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLm1ldGFSZWZlcmVuY2Uuc2VhcmNoYWJsZTtcbiAgICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlID0gdGhpcy5tZXRhUmVmZXJlbmNlO1xuICAgICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVzU2NvcGUgPSB0aGlzLm1ldGFSZWZlcmVuY2UubmFtZSB8fCB0aGlzLm1ldGFSZWZlcmVuY2UucmVzb3VyY2VUeXBlO1xuICAgICAgdGhpcy5pc0NyZWF0YWJsZSA9IHRoaXMubWV0YVJlZmVyZW5jZS5jcmVhdGFibGU7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRQbGFjZWhvbGRlckxhYmVsKCk7XG4gICAgdGhpcy5zZWFyY2hUZXh0Q2hhbmdlZC5waXBlKGRlYm91bmNlVGltZSgzMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHZhbHVlO1xuICAgICAgdGhpcy5zZWFyY2goKTtcbiAgICB9KTtcbiAgICBjb25zdCBvcmlnVmFsdWUgPSB0aGlzLnBhcmVudFt0aGlzLm1ldGEubmFtZV07XG5cbiAgICAvLyB0aGlzLnN1Z2dlc3Rpb25zID0gdGhpcy5tZXRhLnN1Z2dlc3Rpb25zOyAvLyBUT0RPIGZpbHRlciBieSBkZWZhdWx0IHR5cGVcbiAgICAvLyBjb25zb2xlLmxvZygndGhpcy5zdWdnZXN0aW9ucycsIHRoaXMuc3VnZ2VzdGlvbnMpO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMucGFyZW50LCB0aGlzLm1ldGEubmFtZSwge1xuICAgICAgc2V0OiAodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgKHYpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucHVzaCh7XG4gICAgICAgICAgICAgICAgICBpZDogdixcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LFxuICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5tZXRhUmVmZXJlbmNlLm5hbWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG51bGw7IC8vIHByb3RlY3Qgd2hlbiB2YWx1ZSBmcm9tIHNlcnZlciBpcyBub3QgYXJyYXlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSB7XG4gICAgICAgICAgICAgIGlkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlLCAvLyBjb3VsZCBiZSBmb3VuZCB3aXRoIGV4dHJhIGNhbGxcbiAgICAgICAgICAgICAgdHlwZTogdGhpcy5tZXRhUmVmZXJlbmNlLm5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHZhbHVlID8gKCghdmFsdWUubGFiZWwgfHwgdmFsdWUubGFiZWwgPT09ICcgJykgPyBgTi9BICgke3ZhbHVlLnR5cGV9IyR7dmFsdWUuaWR9KWAgOiB2YWx1ZS5sYWJlbCB8fCB2YWx1ZSkgOiAnJztcbiAgICAgICAgICAvLyBpZiAodGhpcy5pc1BvbHltb3JwaGljICYmIHRoaXMubW9kZWwpIHsgLy9UT0RPIHNob3cgb3Igbm90P1xuICAgICAgICAgIC8vICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUgPSB0aGlzLm1ldGFSZWZlcmVuY2UuZmluZCgocnQpPT4ge1xuICAgICAgICAgIC8vICAgICByZXR1cm4gcnQubmFtZSA9PT0gdGhpcy5tb2RlbC50eXBlO1xuICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgLy8gfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWwgPSB2YWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubW9kZWxUb1ZhbHVlKHZhbHVlLCB0aGlzLm1ldGEudmFsdWVUeXBlIHx8ICdvYmplY3QnKTtcbiAgICAgICAgICB0aGlzLmJ1aWxkRXh0ZXJuYWxMaW5rKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9ICF0aGlzLm1vZGVsID8gdGhpcy5tb2RlbCA6IHRoaXMubW9kZWwubWFwKChtKSA9PiB0aGlzLm1vZGVsVG9WYWx1ZShtLCB0aGlzLm1ldGEudmFsdWVUeXBlIHx8ICdvYmplY3QnKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXRhLiRvcHRpb25hbCA9IHRoaXMuaXNPcHRpb25hbDtcbiAgICAgIH0sXG4gICAgICBnZXQ6ICgpID0+IHRoaXMudmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0aGlzLnNlbmRUb1NlcnZlcixcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChvcmlnVmFsdWUpIHtcbiAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IG9yaWdWYWx1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm1vZGVsICYmIHRoaXMuZGVmYXVsdCkge1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdID0gW107XG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBkdiBvZiB0aGlzLmRlZmF1bHQpIHtcbiAgICAgICAgICAgIGlmICgoZHYuaWQgfHwgZHYudmFsdWUpICYmIGR2LnR5cGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbTogYW55ID0ge1xuICAgICAgICAgICAgICAgIGlkOiBkdi5pZCB8fCBkdi52YWx1ZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogZHYubGFiZWwgfHwgZHYuaWQgfHwgZHYudmFsdWUsXG4gICAgICAgICAgICAgICAgdHlwZTogZHYudHlwZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBpZiAoZHYuZXh0ZXJuYWxMaW5rKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5leHRlcm5hbExpbmsgPSBkdi5leHRlcm5hbExpbms7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdC5pZCAmJiB0aGlzLmRlZmF1bHQubGFiZWwgJiYgdGhpcy5kZWZhdWx0LnR5cGUpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW06IGFueSA9IHtcbiAgICAgICAgICAgICAgaWQ6IHRoaXMuZGVmYXVsdC5pZCB8fCB0aGlzLmRlZmF1bHQudmFsdWUsXG4gICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmRlZmF1bHQubGFiZWwgfHwgdGhpcy5kZWZhdWx0LmlkIHx8IHRoaXMuZGVmYXVsdC52YWx1ZSxcbiAgICAgICAgICAgICAgdHlwZTogdGhpcy5kZWZhdWx0LnR5cGUsXG4gICAgICAgICAgICAgIHNtYXJ0OiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdC5leHRlcm5hbExpbmspIHtcbiAgICAgICAgICAgICAgaXRlbS5leHRlcm5hbExpbmsgPSB0aGlzLmRlZmF1bHQuZXh0ZXJuYWxMaW5rO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdID0gaXRlbTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJyEhIWRlZmF1bHQgdmFsdWUgaXMgbm90IHZhbGlkIGZvcm1hdCcsIHRoaXMubWV0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mICh0aGlzLm1ldGEuZGlzYWJsZWQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgKHRoaXMubWV0YS5kaXNhYmxlZCkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBPYmplY3Qua2V5cyh0aGlzLm1ldGEuZGlzYWJsZWQpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcHMgPSBwLnNwbGl0KCcuJyk7XG4gICAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5wYXJlbnRbcHJvcHNbMF1dKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgICAgICAgICB2YWwgPSB2YWxbcHJvcF07XG4gICAgICAgICAgICAgIGlmICghdmFsKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWwgPT09IHRoaXMubWV0YS5kaXNhYmxlZFtwXSkge1xuICAgICAgICAgICAgICB0aGlzLmxvZ2ljYWxEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wYXJlbnRDaGFuZ2VTdWJqZWN0LnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5oYXNPd25Qcm9wZXJ0eShwcm9wc1swXSkpIHtcbiAgICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSB2YWxbcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodmFsID09PSB0aGlzLm1ldGEuZGlzYWJsZWRbcF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2ljYWxEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxvZ2ljYWxEaXNhYmxlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWV0YS5hdXRvICYmIHRoaXMubWV0YS5hdXRvLnNlYXJjaCkge1xuICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdGhpcy5tZXRhLmF1dG8uc2VhcmNoLnBhcmFtcztcbiAgICAgIGlmIChzZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXIgb2YgT2JqZWN0LmtleXMoc2VhcmNoUGFyYW1zKSkge1xuICAgICAgICAgIGNvbnN0IHByb3BzID0gc2VhcmNoUGFyYW1zW3Bhcl0uc3BsaXQoJy4nKTtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IHByb3BzWzBdO1xuICAgICAgICAgIGNvbnN0IHByb3AgPSBwcm9wc1sxXTtcbiAgICAgICAgICBsZXQgcGFyVmFsdWUgPSB0aGlzLnBhcmVudFtmaWVsZF07XG4gICAgICAgICAgaWYgKHBhclZhbHVlKSB7XG4gICAgICAgICAgICBpZiAocHJvcCkge1xuICAgICAgICAgICAgICBwYXJWYWx1ZSA9IHBhclZhbHVlW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhclZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgICBwYXJhbXNbcGFyXSA9IHBhclZhbHVlO1xuICAgICAgICAgICAgICB0aGlzLnNlYXJjaEF1dG9TdWdnZXN0aW9ucyhwYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnBhcmVudENoYW5nZVN1YmplY3Quc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmhhc093blByb3BlcnR5KGZpZWxkKSkge1xuICAgICAgICAgICAgICBpZiAodmFsdWVbZmllbGRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlW2ZpZWxkXSA9IHZhbHVlW2ZpZWxkXVtwcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgICAgICAgICAgICAgcGFyYW1zW3Bhcl0gPSB2YWx1ZVtmaWVsZF07XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hBdXRvU3VnZ2VzdGlvbnMocGFyYW1zKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xlYXJTZWFyY2hSZXNvdXJjZVR5cGUoKSB7XG4gICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUgPSB7fTtcbiAgICB0aGlzLm9uU2VhcmNoUmVzb3VyY2VUeXBlQ2hhbmdlZCgpO1xuICB9XG5cbiAgb25TZWFyY2hSZXNvdXJjZVR5cGVDaGFuZ2VkKHJlc291cmNlVHlwZT8pIHtcbiAgICBpZiAoIXJlc291cmNlVHlwZSB8fCAhcmVzb3VyY2VUeXBlLmlkKSB7XG4gICAgICB0aGlzLnNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUgPSBudWxsO1xuICAgICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVzU2NvcGUgPSAodGhpcy5tZXRhUmVmZXJlbmNlIHx8IFtdKS5tYXAocnQgPT4gcnQubmFtZSkuam9pbignLCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGUuaWQ7XG4gICAgICB0aGlzLnNlYXJjaFJlc291cmNlVHlwZXNTY29wZSA9IHJlc291cmNlVHlwZS5pZDtcbiAgICB9XG4gICAgdGhpcy5idWlsZFBsYWNlaG9sZGVyTGFiZWwoKTtcbiAgICB0aGlzLmZvY3VzKCk7XG4gICAgaWYgKCF0aGlzLm1vZGVsICYmICF0aGlzLnNlYXJjaFRleHQpIHsgLy8gZmlsdGVyIHN1Z2dlc3Rpb25zIGJ5IHR5cGVcbiAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucyA9ICFyZXNvdXJjZVR5cGUgPyAodGhpcy5tZXRhLnN1Z2dlc3Rpb25zIHx8IFtdKSA6ICh0aGlzLm1ldGEuc3VnZ2VzdGlvbnMgfHwgW10pLmZpbHRlcihcbiAgICAgICAgKHMpID0+IHMudHlwZSA9PT0gcmVzb3VyY2VUeXBlLmlkXG4gICAgICApO1xuICAgIH0gZWxzZSB7IC8vIHJlZ3VsYXIgc2VhcmNoIChyZXR1cm4gc2NvcGVkIHJlc3VsdHMpXG4gICAgICBpZiAoIXRoaXMubW9kZWwpIHtcbiAgICAgICAgdGhpcy5zZWFyY2goKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hSZXN1bHRzICYmIHJlc291cmNlVHlwZSkge1xuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHMgPSB0aGlzLnNlYXJjaFJlc3VsdHMuZmlsdGVyKChzKSA9PiBzLnR5cGUgPT09IHJlc291cmNlVHlwZS5pZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLnNlYXJjaEVycm9yO1xuICB9XG5cbiAgb25TZWFyY2hUZXh0Q2hhbmdlZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWFyY2hUZXh0Q2hhbmdlZC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIHNlYXJjaCgpIHtcbiAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XG4gICAgLy8gdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXg7XG4gICAgaWYgKCF0aGlzLnNlYXJjaFRleHQgfHwgdGhpcy5zZWFyY2hUZXh0Lmxlbmd0aCA8IDIpIHtcbiAgICAgIHRoaXMuc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgICBkZWxldGUgdGhpcy5zZWFyY2hSZXN1bHRzO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG93U2VhcmNoUmVzdWx0cyA9IChyZXN1bHRzKSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaGluZyA9IGZhbHNlO1xuICAgICAgZGVsZXRlIHRoaXMuc2VhcmNoRXJyb3I7XG4gICAgICBkZWxldGUgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXg7XG4gICAgICBpZiAoIXJlc3VsdHMgfHwgIShyZXN1bHRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1ldGEuYWNjZXB0TmV3ICYmIHRoaXMubWV0YS5hY2NlcHROZXcudHlwZSAmJiB0aGlzLm1ldGEuYWNjZXB0TmV3LnBhdHRlcm4pIHtcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHRoaXMubWV0YS5hY2NlcHROZXcucGF0dGVybik7XG4gICAgICAgIGlmIChyZWdleC50ZXN0KHRoaXMuc2VhcmNoVGV4dCkpIHtcbiAgICAgICAgICByZXN1bHRzLnVuc2hpZnQoeyBpZDogbnVsbCwgbGFiZWw6IHRoaXMuc2VhcmNoVGV4dCwgdHlwZTogdGhpcy5tZXRhLmFjY2VwdE5ldy50eXBlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaFJlc3VsdHMgPSByZXN1bHRzLm1hcCgocikgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGFycm93LWJvZHktc3R5bGVcbiAgICAgICAgcmV0dXJuIHsgaWQ6IHIuaWQsIGxhYmVsOiByLmxhYmVsLCB0eXBlOiByLnR5cGUgfHwgci5yZXNvdXJjZVR5cGUgfHwgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUubmFtZSwgZXh0ZXJuYWxMaW5rOiByLmV4dGVybmFsTGluayB9O1xuICAgICAgfSk7XG4gICAgICBpZiAoIS9WbHQtZHJvcGRvd24tLWV4cGFuZGVkLy50ZXN0KHRoaXMuZHJvcGRvd24uY2xhc3NOYW1lKSkge1xuICAgICAgICB0aGlzLnNob3dEcm9wZG93bigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5tZXRhLnNlYXJjaCkge1xuICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdGhpcy5tZXRhLnNlYXJjaC5wYXJhbXMgfHwge307XG4gICAgICBsZXQgc2VhcmNoVXJsID0gYC9maWVsZHMvJHt0aGlzLm1ldGEubmFtZX0vc2VhcmNoYDtcbiAgICAgIGlmICh0aGlzLm1ldGEuc2VhcmNoLnVybCkge1xuICAgICAgICBzZWFyY2hVcmwgPSB0aGlzLm1ldGEuc2VhcmNoLnVybC5yZXBsYWNlKC9cXCR7XFxzKihbXFx3XFwuXSspXFxzKn0vZywgKG1hdGNoLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoc2VhcmNoUGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gc2VhcmNoUGFyYW1zW2tleV0uc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gcHJvcHNbMF07XG4gICAgICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbMV07XG4gICAgICAgICAgICBkZWxldGUgc2VhcmNoUGFyYW1zW2tleV07IC8vIGlmIGl0IGlzIFVSTCBwYXJhbSwgcmVtb3ZlIGl0IGFzIHF1ZXJ5IHBhcmFtXG4gICAgICAgICAgICBsZXQgcGFyVmFsdWUgPSB0aGlzLnBhcmVudFtmaWVsZF07XG4gICAgICAgICAgICBpZiAocGFyVmFsdWUpIHtcbiAgICAgICAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICAgICAgICBwYXJWYWx1ZSA9IHBhclZhbHVlW3Byb3BdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChwYXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBwIG9mIE9iamVjdC5rZXlzKHNlYXJjaFBhcmFtcykpIHtcbiAgICAgICAgc2VhcmNoVXJsICs9IGAke3NlYXJjaFVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnfSR7ZW5jb2RlVVJJQ29tcG9uZW50KHApfT0ke2VuY29kZVVSSUNvbXBvbmVudChzZWFyY2hQYXJhbXNbcF0pfWA7XG4gICAgICB9XG4gICAgICBzZWFyY2hVcmwgKz0gYCR7c2VhcmNoVXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJid9cT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLnNlYXJjaFRleHQpfWA7XG4gICAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XG4gICAgICB0aGlzLnJlc291cmNlU2VydmljZS5nZXRCeVBhdGgoc2VhcmNoVXJsKS5zdWJzY3JpYmUoKHJlc3VsdHMpID0+IHtcbiAgICAgICAgc2hvd1NlYXJjaFJlc3VsdHMocmVzdWx0cyk7XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2VhcmNoaW5nO1xuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHMgPSBbXTtcbiAgICAgICAgdGhpcy5zZWFyY2hFcnJvciA9IGVycm9yLmVycm9yID8gZXJyb3IuZXJyb3IubWVzc2FnZSB8fCBlcnJvci5lcnJvciA6IGVycm9yLm1lc3NhZ2UgfHwgZXJyb3I7XG4gICAgICAgIGlmICghL1ZsdC1kcm9wZG93bi0tZXhwYW5kZWQvLnRlc3QodGhpcy5kcm9wZG93bi5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy52cikge1xuICAgICAgICB0aGlzLnZyID0gdGhpcy5tZXRhUmVzb3VyY2UubmV3KHtcbiAgICAgICAgICBpbnRlZ3JhdGlvbkNvZGU6IHRoaXMuaW50ZWdyYXRpb25Db2RlLFxuICAgICAgICAgIHJlc291cmNlVHlwZTogbnVsbFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMudnIuc2VhcmNoSW50ZWdyYXRpb24oXG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUubmFtZSB8fCB0aGlzLnNlYXJjaFJlc291cmNlVHlwZXNTY29wZVxuICAgICAgKS5zdWJzY3JpYmUoKHJlc3VsdHM6IEFycmF5PGFueT4pID0+IHtcbiAgICAgICAgc2hvd1NlYXJjaFJlc3VsdHMocmVzdWx0cyk7XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuc2VhcmNoRXJyb3IgPSBlcnJvci5lcnJvciA/IGVycm9yLmVycm9yLm1lc3NhZ2UgfHwgZXJyb3IuZXJyb3IgOiBlcnJvci5tZXNzYWdlIHx8IGVycm9yO1xuICAgICAgICBpZiAoIS9WbHQtZHJvcGRvd24tLWV4cGFuZGVkLy50ZXN0KHRoaXMuZHJvcGRvd24uY2xhc3NOYW1lKSkge1xuICAgICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQWN0aXZhdGVkKGV2KSB7XG4gICAgLy8gZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlucHV0ID0gZXYuc3JjRWxlbWVudDtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd24pIHtcbiAgICAgIC8vIHRoaXMuZHJvcGRvd24gPSBldi5zcmNFbGVtZW50LnBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgIHRoaXMuZHJvcGRvd24gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZHJvcGRvd24td3JhcHBlcicpO1xuICAgIH1cbiAgICB0aGlzLnNob3dEcm9wZG93bigpO1xuICB9XG5cbiAgb25CbHVyKGV2KSB7XG4gICAgbGV0IGludGVybmFsQ29udHJvbCA9IGZhbHNlO1xuICAgIGlmIChldi5yZWxhdGVkVGFyZ2V0KSB7XG4gICAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2LnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgIHRoaXMuZGlzbWlzc0Ryb3Bkb3duKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlcm5hbENvbnRyb2wgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5rZXlMaXN0ZW5lckFjdGl2ZSAmJiAhaW50ZXJuYWxDb250cm9sKSB7XG4gICAgICB0aGlzLmlucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd24pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5rZXlMaXN0ZW5lckFjdGl2ZSkge1xuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja291dCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDQwMCk7XG4gICAgICBkZWxldGUgdGhpcy5rZXlMaXN0ZW5lckFjdGl2ZTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVTZWxlY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMubW9kZWwgJiYgIXRoaXMuc3VnZ2VzdGlvbnMuZmluZCgocykgPT4gKHMuaWQgPT09IHRoaXMubW9kZWwuaWQgJiYgcy50eXBlID09PSB0aGlzLm1vZGVsLnR5cGUpKSkge1xuICAgICAgdGhpcy5zbWFydFN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogdGhpcy5tb2RlbC5pZCxcbiAgICAgICAgbGFiZWw6IHRoaXMubW9kZWwubGFiZWwsXG4gICAgICAgIHR5cGU6IHRoaXMubW9kZWwudHlwZSxcbiAgICAgICAgc21hcnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLm1ldGFUcmFja2VyLmVtaXQodGhpcy5idWlsZFRyYWNrRXZlbnQoJ1JFTU9WRScpKTtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICBvblN1Z2dlc3Rpb25TZWxlY3QoZXYsIHN1Z2dlc3Rpb24pIHtcbiAgICBpZiAoIXN1Z2dlc3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmZvY3VzKCk7XG4gICAgdGhpcy5tZXRhVHJhY2tlci5lbWl0KHRoaXMuYnVpbGRUcmFja0V2ZW50KCdTRUxFQ1QnKSk7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIGlmICghdGhpcy5tb2RlbCkge1xuICAgICAgICB0aGlzLm1vZGVsID0gW107XG4gICAgICB9XG4gICAgICBsZXQgZXhpc3RpbmdFbnRyeTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5tb2RlbCkge1xuICAgICAgICBpZiAoc3VnZ2VzdGlvbi5pZCAmJiAoZW50cnkuaWQgPT09IHN1Z2dlc3Rpb24uaWQpKSB7XG4gICAgICAgICAgZXhpc3RpbmdFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKHN1Z2dlc3Rpb24ubGFiZWwgPT09IGVudHJ5LmxhYmVsKSB7IC8vIGNyZWF0ZSBuZXcgKGdvb2dsZSBlbWFpbHMpXG4gICAgICAgICAgZXhpc3RpbmdFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV4aXN0aW5nRW50cnkpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5wdXNoKHN1Z2dlc3Rpb24pO1xuICAgICAgfVxuICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMubW9kZWwpO1xuICAgICAgZGVsZXRlIHRoaXMuc2VhcmNoVGV4dDtcbiAgICAgIHRoaXMuc2VhcmNoVGV4dENoYW5nZWQubmV4dCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGVsID0gc3VnZ2VzdGlvbjtcbiAgICAgIHRoaXMuZXh0ZXJuYWxMaW5rID0gc3VnZ2VzdGlvbi5leHRlcm5hbExpbms7XG4gICAgICB0aGlzLm9uTW9kZWxDaGFuZ2Uoc3VnZ2VzdGlvbik7XG4gICAgICB0aGlzLnNlYXJjaFRleHQgPSBzdWdnZXN0aW9uLmxhYmVsO1xuICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSAodGhpcy5zZWFyY2hSZXN1bHRzIHx8IHRoaXMuc3VnZ2VzdGlvbnMpLmluZGV4T2Yoc3VnZ2VzdGlvbik7XG4gICAgfVxuICAgIHRoaXMuZGlzbWlzc0Ryb3Bkb3duKCk7XG4gICAgLy8gaWYgKHRoaXMuaXNQb2x5bW9ycGhpYykge1xuICAgIC8vICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUgPSB0aGlzLm1ldGFSZWZlcmVuY2UuZmluZCgocnQpPT4ge1xuICAgIC8vICAgICByZXR1cm4gcnQubmFtZSA9PT0gc3VnZ2VzdGlvbi50eXBlO1xuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuICB9XG5cbiAgc2hvd0Ryb3Bkb3duKCkge1xuICAgIHRoaXMuZHJvcGRvd25WaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ1ZsdC1kcm9wZG93bi0tZXhwYW5kZWQnKTtcbiAgICBpZiAoIXRoaXMua2V5TGlzdGVuZXJBY3RpdmUpIHtcbiAgICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrb3V0KTtcbiAgICAgIH0sIDIwMCk7XG4gICAgICB0aGlzLmtleUxpc3RlbmVyQWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiAodGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXgpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHRoaXMubW9kZWwgJiYgKHRoaXMuc2VhcmNoUmVzdWx0cyB8fCB0aGlzLnN1Z2dlc3Rpb25zKSkge1xuICAgICAgICBmb3IgKGxldCBzdWdnZXN0aW9uSW5kZXggPSAwOyBzdWdnZXN0aW9uSW5kZXggPCAodGhpcy5zZWFyY2hSZXN1bHRzIHx8IHRoaXMuc3VnZ2VzdGlvbnMpLmxlbmd0aDsgc3VnZ2VzdGlvbkluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gKHRoaXMuc2VhcmNoUmVzdWx0cyB8fCB0aGlzLnN1Z2dlc3Rpb25zKVtzdWdnZXN0aW9uSW5kZXhdO1xuICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmlkID09PSBpdGVtLmlkICYmIHRoaXMubW9kZWwudHlwZSA9PT0gaXRlbS50eXBlKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9IHN1Z2dlc3Rpb25JbmRleDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVuc3VyZURyb3Bkb3duSXNWaXNpYmxlKCk7XG4gIH1cblxuICBkaXNtaXNzRHJvcGRvd24oZXZlbnQ/KSB7XG4gICAgdGhpcy5kcm9wZG93blZpc2libGUgPSBmYWxzZTtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuZHJvcGRvd24uY2xhc3NMaXN0LnJlbW92ZSgnVmx0LWRyb3Bkb3duLS1leHBhbmRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMucHJldk1vZGVsID0gdGhpcy5tb2RlbDtcbiAgICBkZWxldGUgdGhpcy5zZWFyY2hUZXh0O1xuICAgIGRlbGV0ZSB0aGlzLnNlYXJjaFJlc3VsdHM7XG4gICAgZGVsZXRlIHRoaXMubW9kZWw7XG4gICAgZGVsZXRlIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4O1xuICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLm1vZGVsKTtcbiAgICB0aGlzLm9uU2VhcmNoVGV4dENoYW5nZWQodGhpcy5zZWFyY2hUZXh0KTtcbiAgICB0aGlzLmZvY3VzKCk7XG4gIH1cblxuICByZXZlcnQoKSB7XG4gICAgdGhpcy5tb2RlbCA9IHRoaXMucHJldk1vZGVsO1xuICAgIGRlbGV0ZSB0aGlzLnByZXZNb2RlbDtcbiAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5tb2RlbCk7XG4gICAgdGhpcy5mb2N1cygpO1xuICB9XG5cbiAgcmVtb3ZlKGV2LCBpdGVtKSB7XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBvcHRpb25JbmRleCA9IHRoaXMubW9kZWwuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAob3B0aW9uSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLm1vZGVsLnNwbGljZShvcHRpb25JbmRleCwgMSk7XG4gICAgICBpZiAoIXRoaXMubW9kZWwubGVuZ3RoKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm1vZGVsO1xuICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLm1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBvcGVuUmVzb3VyY2UobW9kZWw/KSB7XG4gICAgdGhpcy5rZXlMaXN0ZW5lckFjdGl2ZSA9IHRydWU7IC8vIHN1cHByZXNzIGRyb3Bkb3duIGluIHRoaXMgY2FzZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICB9KTtcbiAgICBjb25zdCByZWZEaWFsb2dGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTWV0YVJlZkRpYWxvZyk7XG4gICAgdGhpcy5tZXRhVHJhY2tlci5lbWl0KHRoaXMuYnVpbGRUcmFja0V2ZW50KG1vZGVsID8gJ0VESVQnIDogJ05FVycpKTtcbiAgICBsZXQgdGhlbWUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5kYXRhc2V0LnRoZW1lO1xuICAgIGlmICghdGhlbWUgfHwgdGhlbWUgPT09ICdpbmhlcml0Jykge1xuICAgICAgbGV0IHBhcmVudENvbXBvbmVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsb3Nlc3QoJ3ZnaXAtbWV0YS1sYXlvdXQnKTtcbiAgICAgIGlmIChwYXJlbnRDb21wb25lbnQpIHtcbiAgICAgICAgdGhlbWUgPSBwYXJlbnRDb21wb25lbnQuZGF0YXNldC50aGVtZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhlbWUgfHwgdGhlbWUgPT09ICdpbmhlcml0Jykge1xuICAgICAgICBwYXJlbnRDb21wb25lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbG9zZXN0KCd2Z2lwLW1ldGEtcmVzb3VyY2UnKTtcbiAgICAgICAgaWYgKHBhcmVudENvbXBvbmVudCkge1xuICAgICAgICAgIHRoZW1lID0gcGFyZW50Q29tcG9uZW50LmRhdGFzZXQudGhlbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWZlcmVuY2VTZXJ2aWNlLm9wZW5EaWFsb2coXG4gICAgICByZWZEaWFsb2dGYWN0b3J5LCB0aGlzLm1ldGFSZXNvdXJjZSwgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsIHRoaXMubWV0YVJlZmVyZW5jZSwgbW9kZWwsIG51bGwsIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlLnJlc291cmNlVHlwZSxcbiAgICAgIHRoZW1lXG4gICAgKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IHJlc3VsdDtcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU3VnZ2VzdGlvbiA9ICh0aGlzLm1ldGEuc3VnZ2VzdGlvbnMgfHwgW10pLmZpbmQoKHMpID0+IChzLmlkID09PSByZXN1bHQuaWQgJiYgcy50eXBlID09PSByZXN1bHQudHlwZSkpO1xuICAgICAgICBpZiAoZXhpc3RpbmdTdWdnZXN0aW9uKSB7XG4gICAgICAgICAgZXhpc3RpbmdTdWdnZXN0aW9uLmxhYmVsID0gcmVzdWx0LmxhYmVsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghdGhpcy5tZXRhLnN1Z2dlc3Rpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm1ldGEuc3VnZ2VzdGlvbnMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tZXRhLnN1Z2dlc3Rpb25zLnVuc2hpZnQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1ldGFUcmFja2VyLmVtaXQodGhpcy5idWlsZFRyYWNrRXZlbnQobW9kZWwgPyAnVVBEQVRFJyA6ICdDUkVBVEUnLCByZXN1bHQudHlwZSB8fCByZXN1bHQucmVzb3VyY2VUeXBlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1ldGFUcmFja2VyLmVtaXQodGhpcy5idWlsZFRyYWNrRXZlbnQobW9kZWwgPyAnQ0FOQ0VMX0VESVQnIDogJ0NBTkNFTF9VUERBVEUnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZURyb3Bkb3duSXNWaXNpYmxlKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgaG9sZGVyID0gdGhpcy5kcm9wZG93bi5jbG9zZXN0KCcuVmx0LWNhcmRfX2NvbnRlbnQnKTtcbiAgICAgIGlmIChob2xkZXIpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuVmx0LWRyb3Bkb3duX19wYW5lbCcpO1xuICAgICAgICBjb25zdCBlbFJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgaG9sZGVyUmVjdCA9IGhvbGRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKGhvbGRlclJlY3QudG9wICsgaG9sZGVyUmVjdC5oZWlnaHQgPCBlbFJlY3QudG9wICsgZWxSZWN0LmhlaWdodCkge1xuICAgICAgICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgNDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlRHJvcGRvd25PcHRpb25Jc1Zpc2libGUoKSB7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyID0gdGhpcy5kcm9wZG93bi5xdWVyeVNlbGVjdG9yKCcuVmx0LWRyb3Bkb3duX19zY3JvbGwnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHJvcGRvd25TY3JvbGxDb250YWluZXIgJiYgdHlwZW9mICh0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCkgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBzY3JvbGxUb3AgPSA0NCAqIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4O1xuICAgICAgY29uc3Qgc2Nyb2xsQm90dG9tID0gNDQgKiAodGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggLSA3KTtcbiAgICAgIGlmIChzY3JvbGxUb3AgPCB0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsQm90dG9tID4gdGhpcy5kcm9wZG93blNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3ApIHtcbiAgICAgICAgdGhpcy5kcm9wZG93blNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgPSBzY3JvbGxCb3R0b207XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGlja291dCA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IGludGVybmFsQ29udHJvbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKGludGVybmFsQ29udHJvbCAmJiBbJ1ZsdC1kcm9wZG93bl9fbGluaycsICdWbHQtZHJvcGRvd25fX2Jsb2NrJ10uaW5kZXhPZihldmVudC50YXJnZXQuY2xhc3NOYW1lKSAhPT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9IGVsc2UgaWYgKCFpbnRlcm5hbENvbnRyb2wgJiYgZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmlucHV0ICYmIGV2ZW50LnRhcmdldC5jbGFzc05hbWUgIT09ICdWbHQtZHJvcGRvd25fX3RpdGxlJykge1xuICAgICAgdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpbnRlcm5hbENvbnRyb2wgJiYgaW50ZXJuYWxDb250cm9sLnRhZ05hbWUgIT09ICdJTlBVVCcpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGJ1aWxkVHJhY2tFdmVudChhY3Rpb246IHN0cmluZywgdmFsdWU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBlOiBJTWV0YVRyYWNrZXJFdmVudCA9IHtcbiAgICAgIGludGVncmF0aW9uOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgIHJlc291cmNlOiB0aGlzLm1vZGVsID8gKHRoaXMubW9kZWwudHlwZSB8fCB0aGlzLm1vZGVsLnJlc291cmNlVHlwZSkgOiB0aGlzLnNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUsXG4gICAgICBmaWVsZDogdGhpcy5tZXRhLm5hbWUsXG4gICAgICBhY3Rpb25cbiAgICB9O1xuICAgIGlmICh0aGlzLm1ldGEuJGlzQ29udGFjdGFibGUpIHtcbiAgICAgIGUuaXNDb250YWN0YWJsZSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHZhbHVlKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUGxhY2Vob2xkZXJMYWJlbCgpIHtcbiAgICB0aGlzLnBsYWNlSG9sZGVyTGFiZWwgPSB0aGlzLm1ldGEubGFiZWw7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgIXRoaXMuaXNQb2x5bW9ycGhpYykge1xuICAgICAgdGhpcy5wbGFjZUhvbGRlckxhYmVsID0gJytBZGQgJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGFjZUhvbGRlckxhYmVsID0gKHRoaXMuaXNTZWFyY2hhYmxlICYmICh0aGlzLm11bHRpcGxlIHx8ICF0aGlzLmlzUG9seW1vcnBoaWMpKSA/ICdTZWFyY2ggJyA6ICcnO1xuICAgIH1cbiAgICB0aGlzLnBsYWNlSG9sZGVyTGFiZWwgKz0gdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUucmVzb3VyY2VUeXBlID8gdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUucmVzb3VyY2VUeXBlIDogdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVzU2NvcGU7XG4gIH1cblxuICBwcml2YXRlIGtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzoge1xuICAgICAgICB0aGlzLnNob3dEcm9wZG93bigpO1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4Kys7XG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID49ICh0aGlzLnNlYXJjaFJlc3VsdHMgfHwgdGhpcy5zdWdnZXN0aW9ucykubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5zdXJlRHJvcGRvd25PcHRpb25Jc1Zpc2libGUoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXgpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID0gKHRoaXMuc2VhcmNoUmVzdWx0cyB8fCB0aGlzLnN1Z2dlc3Rpb25zKS5sZW5ndGggLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4LS07XG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSAodGhpcy5zZWFyY2hSZXN1bHRzIHx8IHRoaXMuc3VnZ2VzdGlvbnMpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5zdXJlRHJvcGRvd25PcHRpb25Jc1Zpc2libGUoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnU3BhY2UnOlxuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4KSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMub25TdWdnZXN0aW9uU2VsZWN0KGV2ZW50LCAodGhpcy5zZWFyY2hSZXN1bHRzIHx8IHRoaXMuc3VnZ2VzdGlvbnMpW3RoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4XSk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRXNjYXBlJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdCYWNrc3BhY2UnOiB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLm1vZGVsKSB7IC8vIEhQQlItODIyOVxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBidWlsZEV4dGVybmFsTGluaygpIHtcbiAgICBpZiAodGhpcy5tb2RlbCkge1xuICAgICAgaWYgKHRoaXMubW9kZWwuZXh0ZXJuYWxMaW5rKSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxMaW5rID0gdGhpcy5tb2RlbC5leHRlcm5hbExpbms7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWV0YUNvbnRleHQucHJvZmlsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGUudG9VcHBlckNhc2UoKV0pIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZXh0ZXJuYWxMaW5rO1xuICAgICAgICB0aGlzLm1ldGFNc2dTZXJ2aWNlLnNlbmRNZXNzYWdlKFxuICAgICAgICAgIHRoaXMuaW50ZWdyYXRpb25Db2RlLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnYnVpbGRFeHRlcm5hbExpbmsnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25Db2RlOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgICAgIHJlZjogdGhpcy5tb2RlbCxcbiAgICAgICAgICAgIHByb2ZpbGU6IHRoaXMubWV0YUNvbnRleHQucHJvZmlsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGUudG9VcHBlckNhc2UoKV1cbiAgICAgICAgICB9LFxuICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgICB0aGlzLmV4dGVybmFsTGluayA9IHJlc3BvbnNlLmV4dGVybmFsTGluaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gZXh0ZXJuYWwgbGluayBzdXBwb3J0IGZvcicsIHRoaXMuaW50ZWdyYXRpb25Db2RlLCB0aGlzLm1vZGVsLnJlc291cmNlVHlwZSB8fCB0aGlzLm1vZGVsLnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMuZXh0ZXJuYWxMaW5rO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VhcmNoQXV0b1N1Z2dlc3Rpb25zKHBhcmFtcz8pIHtcbiAgICBsZXQgc2VhcmNoVXJsID0gYC9zdWdnZXN0aW9ucy8ke3RoaXMubWV0YS5uYW1lfS9zZWFyY2hgO1xuICAgIGlmICh0aGlzLm1ldGEuYXV0byAmJiB0aGlzLm1ldGEuYXV0by5zZWFyY2gpIHtcbiAgICAgIGlmICh0aGlzLm1ldGEuYXV0by5zZWFyY2gudXJsKSB7XG4gICAgICAgIHNlYXJjaFVybCA9IHRoaXMubWV0YS5hdXRvLnNlYXJjaC51cmwucmVwbGFjZSgvXFwke1xccyooW1xcd1xcLl0rKVxccyp9L2csIChtYXRjaCwga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSBwYXJhbXNba2V5XTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXNba2V5XTtcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgT2JqZWN0LmtleXMocGFyYW1zKSkge1xuICAgICAgICBzZWFyY2hVcmwgKz0gYCR7c2VhcmNoVXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJid9JHtlbmNvZGVVUklDb21wb25lbnQocCl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtc1twXSl9YDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVzb3VyY2VTZXJ2aWNlLmdldEJ5UGF0aChzZWFyY2hVcmwpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlYXJjaGluZztcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGxldCBzdWdnZXN0aW9ucztcbiAgICAgICAgICBzdWdnZXN0aW9ucyA9IHJlc3VsdDtcbiAgICAgICAgICBpZiAodGhpcy5tZXRhLmF1dG8uc2VhcmNoLmV4dHJhY3QpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zID0gcmVzdWx0W3RoaXMubWV0YS5hdXRvLnNlYXJjaC5leHRyYWN0XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN1Z2dlc3Rpb25zIGluc3RhbmNlb2YgQXJyYXkgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zID0gW3N1Z2dlc3Rpb25zXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYXN5bmNTdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICAgIHN1Z2dlc3Rpb25zLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgICAgIGlmIChzICYmIHMuaWQgJiYgcy50eXBlKSB7IC8vIFRPT0QgY2hlY2sgdGhlIHR5cGUgaXMgYWNjZXB0YWJsZVxuICAgICAgICAgICAgICBhc3luY1N1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBzLmlkLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBzLmxhYmVsIHx8IGAke3MudHlwZX0jJHtzLmlkfWAsXG4gICAgICAgICAgICAgICAgdHlwZTogcy50eXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChhc3luY1N1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGFzeW5jU3VnZ2VzdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IGFzeW5jU3VnZ2VzdGlvbnNbMF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5hc3luY1N1Z2dlc3Rpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFzeW5jU3VnZ2VzdGlvbnMgPSBhc3luY1N1Z2dlc3Rpb25zO1xuICAgICAgICB9XG4gICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlYXJjaGluZztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG59XG5cbi8vLy8gRklFTEQgTElTVFxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9maWVsZExpc3Qvdmlldy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmllbGRMaXN0L3N0eWxlLnNjc3MnXSxcbiAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XVxufSlcbmV4cG9ydCBjbGFzcyBGaWVsZExpc3QgZXh0ZW5kcyBGaWVsZEFic3RyYWN0IGltcGxlbWVudHMgT25Jbml0IHtcbiAgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcbiAgdmFsdWU6IGFueTtcblxuICBnZXQgbGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhLmxpc3QgfHwgdGhpcy5tZXRhLnJlZmVyZW5jZTtcbiAgfVxuXG4gIGdldCBjbG9uZUxpc3QoKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5saXN0KSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBvcmlnVmFsdWUgPSB0aGlzLnBhcmVudFt0aGlzLm1ldGEubmFtZV07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMucGFyZW50LCB0aGlzLm1ldGEubmFtZSwge1xuICAgICAgc2V0OiAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5pbmRleE9mKGkpID09PSAtMSkge1xuICAgICAgICAgICAgICB0aGlzLm1vZGVsLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1vZGVsO1xuICAgICAgICB0aGlzLm1ldGEuJG9wdGlvbmFsID0gdGhpcy5pc09wdGlvbmFsO1xuICAgICAgfSxcbiAgICAgIGdldDogKCkgPT4gdGhpcy52YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBpZiAob3JpZ1ZhbHVlKSB7XG4gICAgICB0aGlzLnBhcmVudFt0aGlzLm1ldGEubmFtZV0gPSBvcmlnVmFsdWU7XG4gICAgfVxuICAgIGlmICghdGhpcy5tb2RlbCAmJiB0aGlzLnZhbGlkYXRpb25zLm1pbikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbGlkYXRpb25zLm1pbjsgaSsrKSB7XG4gICAgICAgIHRoaXMuYWRkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkKCkge1xuICAgIGlmICghdGhpcy5tb2RlbCkge1xuICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudmFsaWRhdGlvbnMubWF4IHx8ICh0aGlzLnZhbGlkYXRpb25zLm1heCA+IHRoaXMubW9kZWwubGVuZ3RoKSkge1xuICAgICAgdGhpcy5tb2RlbC5wdXNoKHt9KTtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1vZGVsO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZShpdGVtSW5kZXgpIHtcbiAgICB0aGlzLm1vZGVsLnNwbGljZShpdGVtSW5kZXgsIDEpO1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLm1vZGVsO1xuICB9XG59XG5cbi8vLy8gTEFZT1VUXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2Z2lwLW1ldGEtbGF5b3V0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xheW91dC92aWV3Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sYXlvdXQvc3R5bGUuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE1ldGFMYXlvdXQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudENoZWNrZWQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIG1ldGE6IGFueTtcbiAgQElucHV0KCkgcmVzb3VyY2U6IGFueTtcbiAgQElucHV0KCkgaW50ZWdyYXRpb246IGFueTtcbiAgQElucHV0KCkgdHlwZTogYW55O1xuICBASW5wdXQoKSBwcmV2aWV3OiBib29sZWFuO1xuICBASW5wdXQoKSB0aGVtZTogc3RyaW5nO1xuXG4gIG9wdGlvbmFsRmllbGRzOiBhbnkgPSB7fTtcbiAgb3B0aW9uYWxGaWVsZHNDb3VudDogbnVtYmVyO1xuICBzaG93QWxsID0gZmFsc2U7XG4gIGZpZWxkc1Zpc2liaWxpdHlDaGFuZ2VkOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHJlZkRpYWxvZ0ZhY3Rvcnk6IGFueTtcbiAgcGFyZW50Rm9ybTogSFRNTEZvcm1FbGVtZW50O1xuICBpbnRlZ3JhdGlvbkNvZGU6IHN0cmluZztcbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIGNoaWxkUmVzb3VyY2VDYXJkTGFiZWwgPSByZXNvdXJjZUNhcmRMYWJlbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgbWV0YVJlc291cmNlOiBNZXRhUmVzb3VyY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVmZXJlbmNlU2VydmljZTogTWV0YVJlZmVyZW5jZVNlcnZpY2VcbiAgKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ01ldGFMYXlvdXQnLCB0aGlzLm1ldGEpO1xuXG4gIH1cblxuICBnZXQgaXNQZXJzaXN0ZWRSZXNvdXJjZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZSAmJiB0aGlzLnJlc291cmNlLl92Z2lzICYmICh0aGlzLnJlc291cmNlLl92Z2lzLmV4dGVybmFsSWQgfHwgdGhpcy5yZXNvdXJjZS5fdmdpcy5pZCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmludGVncmF0aW9uQ29kZSA9IHRoaXMubWV0YS5pbnRlZ3JhdGlvbkNvZGUgfHwgdGhpcy5pbnRlZ3JhdGlvbjtcbiAgICB0aGlzLnJlc291cmNlVHlwZSA9IHRoaXMubWV0YS5yZXNvdXJjZVR5cGUgfHwgdGhpcy50eXBlO1xuICAgIHRoaXMucGFyZW50Rm9ybSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5jbG9zZXN0KCdmb3JtJyk7XG4gICAgdGhpcy5jb25maWd1cmVPcHRpb25hbFNlY3Rpb25zKCk7XG5cbiAgICB0aGlzLmZpZWxkc1Zpc2liaWxpdHlDaGFuZ2VkLnBpcGUoZGVib3VuY2VUaW1lKDEwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jb3VudE9wdGlvbmFsRmllbGRzKCk7XG4gICAgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvdW50T3B0aW9uYWxGaWVsZHMoKTtcbiAgICB9LCAwKTtcblxuICAgIGlmICh0aGlzLnBhcmVudEZvcm0pIHtcbiAgICAgIHRoaXMucGFyZW50Rm9ybS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpZWxkc1Zpc2liaWxpdHlDaGFuZ2VkLm5leHQoSlNPTi5zdHJpbmdpZnkodGhpcy5yZXNvdXJjZSkpO1xuICAgICAgICAgIHRoaXMuY291bnRPcHRpb25hbEZpZWxkcygpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRoZW1lICE9PSAnaW5oZXJpdCcpIHtcbiAgICAgIHRoaXMuYXBwbHlUaGVtZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSkge1xuICAgIGlmIChjaGFuZ2VzLm1ldGEpIHtcbiAgICAgIHRoaXMuY29uZmlndXJlT3B0aW9uYWxTZWN0aW9ucygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY291bnRPcHRpb25hbEZpZWxkcygpO1xuICAgICAgfSwgMCk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VzLnRoZW1lKSB7XG4gICAgICB0aGlzLnRoZW1lID0gY2hhbmdlcy50aGVtZS5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLmFwcGx5VGhlbWUoKTtcbiAgICB9XG4gIH1cblxuICBjb3VudE9wdGlvbmFsRmllbGRzKCkge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgY29uc3QgY291bnRTZWN0aW9uRmllbGRzID0gKHMpID0+IHtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBzLmZpZWxkcykge1xuICAgICAgICBpZiAoZi5maWVsZHMgJiYgZi5maWVsZHMubGVuZ3RoICYmICFmLnZpc2libGUpIHtcbiAgICAgICAgICBjb3VudFNlY3Rpb25GaWVsZHMoZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGYuJG9wdGlvbmFsICYmICFmLiRoaWRkZW4pIHtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5tZXRhLnNlY3Rpb25zKSB7XG4gICAgICBjb25zdCBub3RPcHRpb25hbEFueSA9IHMuZmllbGRzLmZpbmQoZiA9PiAhZi4kb3B0aW9uYWwpO1xuICAgICAgcy4kb3B0aW9uYWwgPSAhbm90T3B0aW9uYWxBbnk7XG4gICAgICBpZiAoIXMudmlzaWJsZSkge1xuICAgICAgICBjb3VudFNlY3Rpb25GaWVsZHMocyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub3B0aW9uYWxGaWVsZHNDb3VudCA9IGNvdW50O1xuICB9XG5cbiAgY29uZmlndXJlT3B0aW9uYWxTZWN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5tZXRhICYmIHRoaXMubWV0YS5zZWN0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBzIG9mIHRoaXMubWV0YS5zZWN0aW9ucykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgJyRvcHRpb25hbCcsIHtcbiAgICAgICAgICB2YWx1ZTogdHJ1ZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHRvZ2dsZU9wdGlvbmFsRmllbGRzKCkge1xuICAgIHRoaXMuc2hvd0FsbCA9ICF0aGlzLnNob3dBbGw7XG4gICAgdGhpcy5uZ0FmdGVyQ29udGVudENoZWNrZWQoKTtcbiAgfVxuXG4gIG9wZW5DaGlsZChjaGlsZFJlc291cmNlLCBjaGlsZE1vZGVsPykge1xuICAgIGNoaWxkUmVzb3VyY2UucmVmZXJlbmNlLnBhcmVudCA9IHRoaXMucmVzb3VyY2UuX3ZnaXM7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICBpZiAoIXRoaXMucmVmRGlhbG9nRmFjdG9yeSkge1xuICAgICAgdGhpcy5yZWZEaWFsb2dGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTWV0YVJlZkRpYWxvZyk7XG4gICAgfVxuICAgIHRoaXMucmVmZXJlbmNlU2VydmljZS5vcGVuRGlhbG9nKFxuICAgICAgdGhpcy5yZWZEaWFsb2dGYWN0b3J5LCB0aGlzLm1ldGFSZXNvdXJjZSwgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsIGNoaWxkUmVzb3VyY2UucmVmZXJlbmNlLCBjaGlsZE1vZGVsLFxuICAgICAgY2hpbGRNb2RlbCAmJiAoY2hpbGRSZXNvdXJjZS5yZWZlcmVuY2UuZWRpdGFibGUgPT09IGZhbHNlKSAvLyBpcyBwcmV2aWV3IG1vZGVcbiAgICApLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnJhdykge1xuICAgICAgICBpZiAoIXRoaXMucmVzb3VyY2VbY2hpbGRSZXNvdXJjZS5uYW1lXSkge1xuICAgICAgICAgIHRoaXMucmVzb3VyY2VbY2hpbGRSZXNvdXJjZS5uYW1lXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZE1vZGVsKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihjaGlsZE1vZGVsLCByZXN1bHQucmF3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlc291cmNlW2NoaWxkUmVzb3VyY2UubmFtZV0ucHVzaChyZXN1bHQucmF3KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRoZW1lKCkge1xuICAgIGNvbnN0IG1ldGFUaGVtZSA9IHRoaXMudGhlbWUgPT09ICdkYXJrJyA/IG1ldGFEYXJrIDogbWV0YUxpZ2h0O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1ldGFUaGVtZS5wcm9wZXJ0aWVzKSkge1xuICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KGtleSwgbWV0YVRoZW1lLnByb3BlcnRpZXNba2V5XSk7XG4gICAgfVxuICB9XG59XG5cbi8vLy8gUkVTT1VSQ0VcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZnaXAtbWV0YS1yZXNvdXJjZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXNvdXJjZS92aWV3Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXNvdXJjZS9zdHlsZS5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTWV0YVJlc291cmNlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSByZXNvdXJjZTogYW55O1xuICBASW5wdXQoKSBtb2RlbDogYW55O1xuICBASW5wdXQoKSBtZXRhUmVzb3VyY2VTZXJ2aWNlRGVsZWdhdGVkOiBNZXRhUmVzb3VyY2VTZXJ2aWNlOyAvLyBjYXJ5IGl0IGZyb20gdGhlIHBhcmVudCB0byBrZWVwIHRoZSBpbnRlcmNlcHRvcnNcbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZztcbiAgQE91dHB1dCgpIHB1YmxpYyBkb25lID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGludGVncmF0aW9uQ29kZTogc3RyaW5nO1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgbWV0YTogYW55O1xuICBzZXJ2aWNlOiBNZXRhUmVzb3VyY2VTZXJ2aWNlO1xuICBjdXJyZW50TGF5b3V0SWQ6IGFueTtcbiAgZm9ybUVycm9yczogYW55O1xuICBmaWVsZHNNYXA6IGFueTtcbiAgZWRpdCA9IHRydWU7XG4gIGJ1c3k6IGJvb2xlYW47XG4gIG1ldGFMb2FkaW5nOiBib29sZWFuO1xuICBnZW5lcmFsRXJyb3I6IHN0cmluZztcbiAgcmVzb3VyY2VNZW51VmlzaWJsZTogYm9vbGVhbjtcbiAgY29udGFjdHNTdWdnZXN0aW9uc0RvbmUgPSBmYWxzZTtcbiAgaXNFZGl0YWJsZTogYm9vbGVhbjtcbiAgaXNQZXJzaXN0ZW50OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBtZXRhUmVzb3VyY2VTZXJ2aWNlOiBNZXRhUmVzb3VyY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWV0YUNvbnRleHQ6IE1ldGFDb250ZXh0U2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFNc2dTZXJ2aWNlOiBNZXRhTXNnU2VydmljZVxuICApIHtcblxuICB9XG5cbiAgZ2V0IG5pY2VGaWVsZHMoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMucmVzb3VyY2UubmljZUZpZWxkc1xuICAgICAgJiYgdGhpcy5yZXNvdXJjZS5tZXRhXG4gICAgICAmJiB0aGlzLnJlc291cmNlLm1ldGEubGF5b3V0XG4gICAgICAmJiB0aGlzLnJlc291cmNlLm1ldGEubGF5b3V0LnNlY3Rpb25zXG4gICAgKSB7XG4gICAgICBjb25zdCBleHRyYWN0U2VjdGlvbkZpZWxkcyA9IChzKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBzLmZpZWxkcykge1xuICAgICAgICAgIGlmIChmLm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2UubmljZUZpZWxkc1tmLm5hbWVdID0gZjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGYuZmllbGRzICYmIGYuZmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZXh0cmFjdFNlY3Rpb25GaWVsZHMoZik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5yZXNvdXJjZS5uaWNlRmllbGRzID0ge307XG4gICAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5yZXNvdXJjZS5tZXRhLmxheW91dC5zZWN0aW9ucykge1xuICAgICAgICBleHRyYWN0U2VjdGlvbkZpZWxkcyhzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UubmljZUZpZWxkcztcbiAgfVxuXG4gIGdldCBmaWVsZE5hbWVzKCkge1xuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXModGhpcy5uaWNlRmllbGRzKTtcbiAgICBpZiAodGhpcy5yZXNvdXJjZS5tZXRhLmxheW91dC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLnJlc291cmNlLm1ldGEubGF5b3V0LmNoaWxkcmVuKSB7XG4gICAgICAgIG5hbWVzLnB1c2goY2hpbGQubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuYW1lcztcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW50ZWdyYXRpb25Db2RlID0gKHRoaXMucmVzb3VyY2UuaW50ZWdyYXRpb25Db2RlIHx8ICcnKS50b1VwcGVyQ2FzZSgpO1xuICAgIHRoaXMucmVzb3VyY2VUeXBlID0gdGhpcy5yZXNvdXJjZS5yZXNvdXJjZVR5cGU7XG4gICAgdGhpcy5zZXJ2aWNlID0gKHRoaXMubWV0YVJlc291cmNlU2VydmljZURlbGVnYXRlZCB8fCB0aGlzLm1ldGFSZXNvdXJjZVNlcnZpY2UpLm5ldyh0aGlzLnJlc291cmNlKTtcbiAgICBpZiAoIXRoaXMubW9kZWwpIHtcbiAgICAgIHRoaXMubW9kZWwgPSB7fTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVzb3VyY2UuYWN0aXZpdHkgJiYgdGhpcy5yZXNvdXJjZS5yZWYuZWRpdGFibGUgPT09IGZhbHNlICYmICF0aGlzLnJlc291cmNlLmV4dGVybmFsSWQpIHtcbiAgICAgIHRoaXMucmVzb3VyY2UuZXh0ZXJuYWxJZCA9ICdNSVNTSU5HX0VYVEVSTkFMX0lEJztcbiAgICB9XG4gICAgdGhpcy5pc1BlcnNpc3RlbnQgPSB0aGlzLnJlc291cmNlICYmIHRoaXMucmVzb3VyY2UuZXh0ZXJuYWxJZDtcbiAgICBpZiAoIXRoaXMucmVzb3VyY2UubWV0YSkge1xuICAgICAgdGhpcy5sb2FkTWV0YWRhdGEodGhpcy5yZXNvdXJjZS5sYXlvdXRJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vICAgaWYgKHRoaXMuaXNQZXJzaXN0ZW50ICYmICghdGhpcy5pc0VkaXRhYmxlIHx8IHRoaXMucmVzb3VyY2VzW3JlZi5uYW1lXS5tZXRhLmxheW91dC5jaGlsZHJlbikpIHtcbiAgICAgIC8vICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcbiAgICAgIC8vICAgfVxuICAgICAgdGhpcy5tZXRhID0gdGhpcy5yZXNvdXJjZS5tZXRhO1xuICAgICAgdGhpcy5jdXJyZW50TGF5b3V0SWQgPSB0aGlzLm1ldGEubGF5b3V0LmlkO1xuICAgICAgdGhpcy5nZXREZXRhaWxzKCk7XG4gICAgICB0aGlzLmdldEZpZWxkc01hcCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50aGVtZSAhPT0gJ2luaGVyaXQnKSB7XG4gICAgICB0aGlzLmFwcGx5VGhlbWUoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpIHtcbiAgICBpZiAoY2hhbmdlcy50aGVtZSkge1xuICAgICAgdGhpcy50aGVtZSA9IGNoYW5nZXMudGhlbWUuY3VycmVudFZhbHVlO1xuICAgICAgaWYgKHRoaXMudGhlbWUgIT09ICdpbmhlcml0Jykge1xuICAgICAgICB0aGlzLmFwcGx5VGhlbWUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBlZGl0TW9kZSgpIHtcbiAgICB0aGlzLmVkaXQgPSB0cnVlO1xuICB9XG5cbiAgbG9hZE1ldGFkYXRhKGxheW91dElkPywgcmVmcmVzaCA9IGZhbHNlKSB7XG4gICAgY29uc3QgbGF5b3V0U3RvcmVLZXkgPSBgdmdpcy5sYXlvdXRfJHt0aGlzLm1ldGFDb250ZXh0LnZnaXBVc2VySWR9XyR7dGhpcy5pbnRlZ3JhdGlvbkNvZGV9XyR7dGhpcy5yZXNvdXJjZS5yZXNvdXJjZVR5cGV9YDtcbiAgICBpZiAoIWxheW91dElkKSB7XG4gICAgICBsYXlvdXRJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxheW91dFN0b3JlS2V5KTtcbiAgICB9XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubWV0YUxvYWRpbmcgPSB0cnVlO1xuICAgIH0sIDApO1xuICAgIGRlbGV0ZSB0aGlzLnJlc291cmNlLm5pY2VGaWVsZHM7XG4gICAgdGhpcy5zZXJ2aWNlLmdldE1ldGFkYXRhKGxheW91dElkLCByZWZyZXNoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKG1ldGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRMYXlvdXRJZCA9IG1ldGEubGF5b3V0LmlkO1xuICAgICAgICBpZiAobGF5b3V0SWQgIT09IG1ldGEubGF5b3V0LmlkICYmICF0aGlzLmlzUGVyc2lzdGVudCkge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGxheW91dFN0b3JlS2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhTm9ybWFsaXplcihtZXRhLCB0aGlzLmludGVncmF0aW9uQ29kZSwgdGhpcy5yZXNvdXJjZS5yZXNvdXJjZVR5cGUpO1xuICAgICAgICB0aGlzLmlzRWRpdGFibGUgPSB0aGlzLm1ldGEubGF5b3V0ICYmIHRoaXMubWV0YS5sYXlvdXQuZWRpdGFibGUgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc291cmNlLm1ldGEgPSB0aGlzLm1ldGE7XG4gICAgICAgIGlmICh0aGlzLmlzUGVyc2lzdGVudCAmJiAoIXRoaXMuaXNFZGl0YWJsZSB8fCB0aGlzLm1ldGEubGF5b3V0LmNoaWxkcmVuKSkge1xuICAgICAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLmJ1c3k7XG4gICAgICAgIHRoaXMuZ2V0RGV0YWlscygpO1xuICAgICAgICB0aGlzLmdldEZpZWxkc01hcCgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAobWV0YUVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgZGVsZXRlIHRoaXMuYnVzeTtcbiAgICAgICAgdGhpcy5nZW5lcmFsRXJyb3IgPSBgRXJyb3IgbG9hZGluZyByZXNvdXJjZSBtZXRhZGF0YSAoJHttZXRhRXJyb3Iuc3RhdHVzVGV4dH0pYDtcbiAgICAgIH0sXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5tZXRhTG9hZGluZztcbiAgICAgICAgdGhpcy5mb3JjZVVpVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjaGFuZ2VMYXlvdXQoKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICBgdmdpcy5sYXlvdXRfJHt0aGlzLm1ldGFDb250ZXh0LnZnaXBVc2VySWR9XyR7dGhpcy5pbnRlZ3JhdGlvbkNvZGV9XyR7dGhpcy5yZXNvdXJjZS5yZXNvdXJjZVR5cGV9YCxcbiAgICAgIHRoaXMuY3VycmVudExheW91dElkXG4gICAgKTtcbiAgICB0aGlzLmxvYWRNZXRhZGF0YSh0aGlzLmN1cnJlbnRMYXlvdXRJZCk7XG4gIH1cblxuICBnZXREZXRhaWxzKCkge1xuICAgIGlmICh0aGlzLnJlc291cmNlICYmICh0aGlzLnJlc291cmNlLmV4dGVybmFsSWQgfHwgdGhpcy5yZXNvdXJjZS5pZCkpIHtcbiAgICAgIGlmICh0aGlzLnJlc291cmNlLnBhcmVudCAmJiB0aGlzLnJlc291cmNlLmFjdGl2aXR5IC8vIHNraXAgZmV0Y2hcbiAgICAgICAgJiYgdGhpcy5tZXRhLmxheW91dC5lZGl0YWJsZSA9PT0gZmFsc2UgJiYgIXRoaXMubWV0YS5sYXlvdXQuY2hpbGRyZW5cbiAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IHAgaW4gdGhpcy5yZXNvdXJjZS5hY3Rpdml0eSkge1xuICAgICAgICAgIGlmICh0aGlzLnJlc291cmNlLmFjdGl2aXR5W3BdICYmIHRoaXMuZmllbGROYW1lcy5pbmRleE9mKHApICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbFtwXSA9IHRoaXMucmVzb3VyY2UuYWN0aXZpdHlbcF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1c3kgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlcnZpY2UuZ2V0RGV0YWlscyhcbiAgICAgICAgICAodGhpcy5yZXNvdXJjZS5leHRlcm5hbElkIHx8IHRoaXMucmVzb3VyY2UuaWQpLCB7XG4gICAgICAgICAgZXZlbnRJZDogdGhpcy5yZXNvdXJjZS5ldmVudElkICE9PSAnTk9fRVZFTlQnID8gdGhpcy5yZXNvdXJjZS5ldmVudElkIDogbnVsbCwgbGF5b3V0SWQ6IHRoaXMucmVzb3VyY2UubGF5b3V0SWRcbiAgICAgICAgfVxuICAgICAgICApLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc291cmNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG4gICAgICAgICAgICBpZiAocmVzb3VyY2UuX3ZnaXMpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc291cmNlLl92Z2lzLmV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1ldGFDb250ZXh0LnZnaXBFdmVudElkID0gcmVzb3VyY2UuX3ZnaXMuZXZlbnRJZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzb3VyY2UubGF5b3V0SWQgJiYgcmVzb3VyY2UuX3ZnaXMubGF5b3V0SWQgIT09IHRoaXMuY3VycmVudExheW91dElkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkTWV0YWRhdGEocmVzb3VyY2UuX3ZnaXMubGF5b3V0SWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgaW4gcmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmVzb3VyY2VbcF0gIT09ICd1bmRlZmluZWQnKSAmJiAodGhpcy5maWVsZE5hbWVzLmluZGV4T2YocCkgIT09IC0xIHx8IHAgPT09ICdfdmdpcycpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbFtwXSA9IHJlc291cmNlW3BdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5idXN5O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChyZXNvdXJjZUVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYWxFcnJvciA9IHJlc291cmNlRXJyb3IuZXJyb3IgPyByZXNvdXJjZUVycm9yLmVycm9yLm1lc3NhZ2UgfHwgcmVzb3VyY2VFcnJvci5tZXNzYWdlIDogcmVzb3VyY2VFcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYnVzeTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcmNlVWlVcGRhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5yZXNvdXJjZS5yZWYgJiYgdGhpcy5yZXNvdXJjZS5yZWYuYWN0aXZpdHkpIHsgLy8gcmV1c2UgZmFpbGVkIGF1dG9hY3Rpdml0aWVzIGRhdGFcbiAgICAgICAgZm9yIChjb25zdCBwIGluIHRoaXMucmVzb3VyY2UucmVmLmFjdGl2aXR5KSB7XG4gICAgICAgICAgaWYgKHRoaXMucmVzb3VyY2UucmVmLmFjdGl2aXR5ICYmIHRoaXMuZmllbGROYW1lcy5pbmRleE9mKHApICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbFtwXSA9IHRoaXMucmVzb3VyY2UucmVmLmFjdGl2aXR5W3BdOyAvLyBWR0lTLTcyMTUgKGNvcHkgb25seSB2YWxpZCBmaWVsZHMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnBlcmZvcm1BdXRvRmlsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHBlcmZvcm1BdXRvRmlsbCgpIHtcbiAgICB0aGlzLm1ldGFNc2dTZXJ2aWNlLnNlbmRNZXNzYWdlKFxuICAgICAgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsXG4gICAgICB7XG4gICAgICAgIGFjdGlvbjogJ2F1dG9GaWxsJyxcbiAgICAgICAgaW50ZWdyYXRpb246IHRoaXMuaW50ZWdyYXRpb25Db2RlLFxuICAgICAgICByZXNvdXJjZVR5cGU6IHRoaXMucmVzb3VyY2VUeXBlLFxuICAgICAgICByZXNvdXJjZTogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm1vZGVsKSksXG4gICAgICAgIGZpZWxkczogdGhpcy5uaWNlRmllbGRzLFxuICAgICAgICBldmVudDogdGhpcy5tZXRhQ29udGV4dC5jb250ZXh0LFxuICAgICAgICBwcm9maWxlOiB0aGlzLm1ldGFDb250ZXh0LnByb2ZpbGVzW3RoaXMuaW50ZWdyYXRpb25Db2RlXVxuICAgICAgfSxcbiAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoIXJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBhZnAgaW4gcmVzcG9uc2UuYXV0b0ZpbGwpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5tb2RlbFthZnBdKSB7XG4gICAgICAgICAgICAgIHRoaXMubW9kZWxbYWZwXSA9IHJlc3BvbnNlLmF1dG9GaWxsW2FmcF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGdldEZpZWxkc01hcCgpIHtcbiAgICBpZiAodGhpcy5tZXRhLmZpZWxkc01hcCkge1xuICAgICAgdGhpcy5maWVsZHNNYXAgPSB0aGlzLm1ldGEuZmllbGRzTWFwO1xuICAgICAgdGhpcy5tYXJrQ29udGFjdGFibGVzKCk7XG4gICAgICB0aGlzLmJ1aWxkQ29udGFjdHNTdWdnZXN0aW9ucygpO1xuICAgICAgaWYgKCF0aGlzLnJlc291cmNlLmV4dGVybmFsSWQpIHtcbiAgICAgICAgdGhpcy5idWlsZFN1YmplY3RUZW1wbGF0ZSgpO1xuICAgICAgICB0aGlzLmV4ZWNUcmFuc2Zvcm1lcigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFNc2dTZXJ2aWNlLnNlbmRNZXNzYWdlKFxuICAgICAgICB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgeyBhY3Rpb246ICdmaWVsZHNNYXAnLCBpbnRlZ3JhdGlvbjogdGhpcy5pbnRlZ3JhdGlvbkNvZGUsIHJlc291cmNlVHlwZTogdGhpcy5yZXNvdXJjZVR5cGUgfSxcbiAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKCFyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maWVsZHNNYXAgPSByZXNwb25zZS5maWVsZHNNYXA7XG4gICAgICAgICAgICB0aGlzLm1hcmtDb250YWN0YWJsZXMoKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRDb250YWN0c1N1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzb3VyY2UuZXh0ZXJuYWxJZCkge1xuICAgICAgICAgICAgICB0aGlzLmJ1aWxkU3ViamVjdFRlbXBsYXRlKCk7XG4gICAgICAgICAgICAgIHRoaXMuZXhlY1RyYW5zZm9ybWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBmaWVsZHMgbWFwJywgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsIHRoaXMucmVzb3VyY2VUeXBlLCByZXNwb25zZS5lcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5SZXNvdXJjZU1lbnUoKSB7XG4gICAgdGhpcy5yZXNvdXJjZU1lbnVWaXNpYmxlID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbk1lbnVDbGlja291dCk7XG4gICAgfSwgMTApO1xuICB9XG5cbiAgY2xvc2UocmVzdWx0Pykge1xuICAgIHRoaXMuZG9uZS5lbWl0KHJlc3VsdCk7XG4gIH1cblxuICBzaG93UGFyc2VkRXJyb3IocmVzb3VyY2VGb3JtLCBwYXJzZWRFcnJvcikge1xuICAgIHRoaXMuZm9ybUVycm9ycyA9IHBhcnNlZEVycm9yLm1lc3NhZ2UgfHwgJ1RoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIG9uZSBvciBtb3JlIGZpZWxkcyc7XG4gICAgaWYgKHBhcnNlZEVycm9yLmVycm9ycyAmJiBwYXJzZWRFcnJvci5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZvcm1FcnJvcnMgKz0gYCAoJHtwYXJzZWRFcnJvci5lcnJvcnMubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpfSlgO1xuICAgICAgZm9yIChjb25zdCBwZSBvZiBwYXJzZWRFcnJvci5lcnJvcnMpIHtcbiAgICAgICAgaWYgKHJlc291cmNlRm9ybS5jb250cm9sc1twZS5maWVsZF0pIHtcbiAgICAgICAgICByZXNvdXJjZUZvcm0uY29udHJvbHNbcGUuZmllbGRdLnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUsIGN1c3RvbTogcGUubWVzc2FnZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpcnN0SW52YWxpZDogSFRNTElucHV0RWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuVmx0LWZvcm1fX2VsZW1lbnQtLWVycm9yIC5tYWluOm5vdCguc3RhbmRhbG9uZSknKTtcbiAgICAgICAgaWYgKGZpcnN0SW52YWxpZCkge1xuICAgICAgICAgIGZpcnN0SW52YWxpZC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdWJtaXQocmVzb3VyY2VGb3JtKSB7XG4gICAgZGVsZXRlIHRoaXMuZm9ybUVycm9ycztcbiAgICByZXNvdXJjZUZvcm0uZm9ybS5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgIGlmIChyZXNvdXJjZUZvcm0udmFsaWQpIHtcbiAgICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgICBpZiAodGhpcy5tZXRhQ29udGV4dC52Z2lwRXZlbnRJZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuICAgICAgICBpZiAoIXRoaXMubW9kZWwuX3ZnaXMpIHtcbiAgICAgICAgICB0aGlzLm1vZGVsLl92Z2lzID0ge1xuICAgICAgICAgICAgY29ubmVjdG9yOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgICAgIHJlc291cmNlVHlwZTogdGhpcy5yZXNvdXJjZVR5cGVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kZWwuX3ZnaXMubGF5b3V0SWQgPSB0aGlzLmN1cnJlbnRMYXlvdXRJZDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgLy8gdGhpcy5tb2RlbC5fdmdpcy50aW1lWm9uZU9mZnNldEluTWludXRlcyA9IDA7IC8vIHdlIGFyZSBub3QgcHJvdmlkaW5nIHRpbWV6b25lIGFueW1vcmUgKGFzIFYzKSwgaW5zdGVhZCB0aGUgJ3RpbWUnIGFuZCAnZGF0ZScgb2JqZWN0cyBhcmUgY29udmVydGVkIHNvIHRoZSBVVEMgdGltZS9kYXRlIGlzIGNvcnJlY3RcbiAgICAgICAgdGhpcy5tb2RlbC5fdmdpcy5ldmVudElkID0gdGhpcy5tZXRhQ29udGV4dC52Z2lwRXZlbnRJZDtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuICAgICAgfVxuICAgICAgdGhpcy5zZXJ2aWNlLnNhdmUodGhpcy5tb2RlbCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlKHJlc3VsdCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmJ1c3k7XG4gICAgICB9LCAoZXJyb3JSZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKChlcnJvclJlc3VsdC5zdGF0dXMgPT09IDQyMiAmJiBlcnJvclJlc3VsdC5lcnJvciAmJiAhZXJyb3JSZXN1bHQuZXJyb3IuZXJyb3JzICYmIGVycm9yUmVzdWx0LmVycm9yLmludGVncmF0aW9uRXJyb3IpXG4gICAgICAgICAgfHwgKGVycm9yUmVzdWx0LmVycm9yICYmIGVycm9yUmVzdWx0LmVycm9yLmVycm9ycyAmJiBlcnJvclJlc3VsdC5lcnJvci5lcnJvcnMubGVuZ3RoICYmICFlcnJvclJlc3VsdC5lcnJvci5lcnJvcnNbMF0uZmllbGQpXG4gICAgICAgICAgLy8gYmFja2VuZCBpbXBsZW1lbnRlZCBlcnJvciBwYXJzaW5nIGJ1dCBicm9rZW4gVkdJUy03MzY2XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuZm9ybUVycm9ycyA9ICdUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCBvbmUgb3IgbW9yZSBmaWVsZHMnO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLm1ldGFNc2dTZXJ2aWNlLnNlbmRNZXNzYWdlKFxuICAgICAgICAgICAgICB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3BhcnNlRXJyb3JNZXNzYWdlJyxcbiAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvbkNvZGU6IHRoaXMuaW50ZWdyYXRpb25Db2RlLFxuICAgICAgICAgICAgICAgIHJlc291cmNlVHlwZTogZXJyb3JSZXN1bHQuZXJyb3IucmVzb3VyY2VUeXBlLFxuICAgICAgICAgICAgICAgIHJhd0Vycm9yOiBlcnJvclJlc3VsdC5lcnJvci5pbnRlZ3JhdGlvbkVycm9yLFxuICAgICAgICAgICAgICAgIHByb2ZpbGU6IHRoaXMubWV0YUNvbnRleHQucHJvZmlsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGUudG9VcHBlckNhc2UoKV1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnBhcnNlZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNob3dQYXJzZWRFcnJvcihyZXNvdXJjZUZvcm0sIHJlc3BvbnNlLnBhcnNlZEVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBlcnJvciBwYXJzZXIgZm9yJywgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsIGVycm9yUmVzdWx0LmVycm9yLmludGVncmF0aW9uRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtRXJyb3JzID0gZXJyb3JSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJy4uLi4nLCBlcnIpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3JSZXN1bHQuc3RhdHVzID09PSA0MjIpIHtcbiAgICAgICAgICB0aGlzLnNob3dQYXJzZWRFcnJvcihyZXNvdXJjZUZvcm0sIGVycm9yUmVzdWx0LmVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvcm1FcnJvcnMgPSBlcnJvclJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5idXN5O1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUVycm9ycyA9IE9iamVjdC5rZXlzKHJlc291cmNlRm9ybS5jb250cm9scylcbiAgICAgICAgLmZpbHRlcigoYykgPT4gcmVzb3VyY2VGb3JtLmNvbnRyb2xzW2NdLmludmFsaWQpXG4gICAgICAgIC5tYXAoKGYpID0+ICh0aGlzLm5pY2VGaWVsZHNbZl0gPyAodGhpcy5uaWNlRmllbGRzW2ZdLmxhYmVsIHx8IGYpIDogZikpLmpvaW4oJywgJyk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgZm9ybVtuYW1lPVwiJHt0aGlzLnJlc291cmNlVHlwZX1cIl0gLlZsdC1mb3JtX19lbGVtZW50LS1lcnJvciAubWFpbjpub3QoLnN0YW5kYWxvbmUpYDtcbiAgICAgICAgY29uc3QgZmlyc3RJbnZhbGlkOiBIVE1MSW5wdXRFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICBpZiAoZmlyc3RJbnZhbGlkKSB7XG4gICAgICAgICAgZmlyc3RJbnZhbGlkLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRm9ybUVycm9ycygpIHtcbiAgICBkZWxldGUgdGhpcy5mb3JtRXJyb3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk1lbnVDbGlja291dCA9ICgpID0+IHtcbiAgICBkZWxldGUgdGhpcy5yZXNvdXJjZU1lbnVWaXNpYmxlO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbk1lbnVDbGlja291dCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBzdWdnZXN0RmllbGRQcm9wZXJ0eShrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSAmJiB2YWx1ZSkge1xuICAgICAgY29uc3QgZmllbGROYW1lcyA9IHRoaXMuZmllbGROYW1lcztcbiAgICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICAgIGNvbnN0IG5lc3RNYXRjaCA9IGtleS5tYXRjaCgvKFxcUyspXFxbXFxkXFxdXFwuKFxcUyspLyk7XG4gICAgICAgIGlmIChuZXN0TWF0Y2ggJiYgZmllbGROYW1lcy5pbmRleE9mKG5lc3RNYXRjaFsxXSkgIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbFtuZXN0TWF0Y2hbMV1dID0gW107XG4gICAgICAgICAgY29uc3QgbmVzdEtleXM6IGFueSA9IHt9O1xuICAgICAgICAgIG5lc3RLZXlzW25lc3RNYXRjaFsyXV0gPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLm1vZGVsW25lc3RNYXRjaFsxXV0ucHVzaChuZXN0S2V5cyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGROYW1lcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4ZWNUcmFuc2Zvcm1lcigpIHtcbiAgICBpZiAodGhpcy5tZXRhQ29udGV4dCAmJiB0aGlzLmZpZWxkc01hcCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3VnZ2VzdEZpZWxkUHJvcGVydHkodGhpcy5maWVsZHNNYXAucGhvbmVOdW1iZXIsIHRoaXMubWV0YUNvbnRleHQucGhvbmVOdW1iZXIpO1xuICAgICAgICBpZiAodGhpcy5maWVsZHNNYXAuZmlyc3ROYW1lIHx8IHRoaXMuZmllbGRzTWFwLmxhc3ROYW1lKSB7XG4gICAgICAgICAgY29uc3QgbmFtZXMgPSAodGhpcy5tZXRhQ29udGV4dC5kaXNwbGF5TmFtZSB8fCAnJykuc3BsaXQoJyAnKTtcbiAgICAgICAgICB0aGlzLnN1Z2dlc3RGaWVsZFByb3BlcnR5KHRoaXMuZmllbGRzTWFwLmZpcnN0TmFtZSwgbmFtZXNbMF0pO1xuICAgICAgICAgIHRoaXMuc3VnZ2VzdEZpZWxkUHJvcGVydHkodGhpcy5maWVsZHNNYXAubGFzdE5hbWUsIG5hbWVzWzFdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpZWxkc01hcC5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHRoaXMuc3VnZ2VzdEZpZWxkUHJvcGVydHkodGhpcy5maWVsZHNNYXAuZGlzcGxheU5hbWUsIHRoaXMubWV0YUNvbnRleHQuZGlzcGxheU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFya0NvbnRhY3RhYmxlcygpIHtcbiAgICBpZiAodGhpcy5maWVsZHNNYXAuY29udGFjdGFibGVzICYmIHRoaXMuZmllbGRzTWFwLmNvbnRhY3RhYmxlcy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmZpZWxkc01hcC5jb250YWN0YWJsZXMpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLm5pY2VGaWVsZHNbY107XG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWVsZCwgJyRpc0NvbnRhY3RhYmxlJywge1xuICAgICAgICAgICAgdmFsdWU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFN1YmplY3RUZW1wbGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMubW9kZWxbdGhpcy5maWVsZHNNYXAuc3ViamVjdF0gJiYgdGhpcy5maWVsZHNNYXAuc3ViamVjdCAmJiB0aGlzLm5pY2VGaWVsZHNbdGhpcy5maWVsZHNNYXAuc3ViamVjdF0pIHtcbiAgICAgIGxldCBzdWJqZWN0VGVtcGxhdGU6IHN0cmluZztcbiAgICAgIGlmICh0aGlzLm5pY2VGaWVsZHNbdGhpcy5maWVsZHNNYXAuc3ViamVjdF0uZGVmYXVsdCkge1xuICAgICAgICBzdWJqZWN0VGVtcGxhdGUgPSB0aGlzLm5pY2VGaWVsZHNbdGhpcy5maWVsZHNNYXAuc3ViamVjdF0uZGVmYXVsdC5pZCB8fCB0aGlzLm5pY2VGaWVsZHNbdGhpcy5maWVsZHNNYXAuc3ViamVjdF0uZGVmYXVsdDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tZXRhQ29udGV4dC5wcm9maWxlc1t0aGlzLmludGVncmF0aW9uQ29kZV0pIHtcbiAgICAgICAgY29uc3QgcHJvZmlsZSA9IHRoaXMubWV0YUNvbnRleHQucHJvZmlsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGVdIHx8IHt9O1xuICAgICAgICBzdWJqZWN0VGVtcGxhdGUgPSBwcm9maWxlLmRlZmF1bHRTdWJqZWN0ID9cbiAgICAgICAgICBwcm9maWxlLmRlZmF1bHRTdWJqZWN0WygodGhpcy5tZXRhQ29udGV4dC5jb250ZXh0IHx8ICdDQUxMJykudHlwZSB8fCAnJykudG9VcHBlckNhc2UoKV0gOiBwcm9maWxlLmFjdGl2aXR5RGVmYXVsdFN1YmplY3RUZW1wbGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzdWJqZWN0VGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5tb2RlbFt0aGlzLmZpZWxkc01hcC5zdWJqZWN0XSA9IHRlbXBsYXRlQnVpbGRlcih0aGlzLm1ldGFDb250ZXh0LCBzdWJqZWN0VGVtcGxhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb250YWN0c1N1Z2dlc3Rpb25zKCkge1xuICAgIC8vIGxldCBoYXNEZWZhdWx0Q29udGFjdCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm1ldGFDb250ZXh0LmNvbnRhY3RhYmxlc1t0aGlzLmludGVncmF0aW9uQ29kZV0gJiYgdGhpcy5tZXRhLmxheW91dCAmJiB0aGlzLm1ldGEubGF5b3V0LnNlY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5tZXRhLmxheW91dC5zZWN0aW9ucykge1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgKHMuZmllbGRzIHx8IFtdKSkge1xuICAgICAgICAgIGlmIChmLnR5cGUgPT09ICdyZWZlcmVuY2UnKSB7XG4gICAgICAgICAgICBjb25zdCByZWZUeXBlcyA9IChmLnJlZmVyZW5jZS5sZW5ndGggPyBmLnJlZmVyZW5jZSA6IFtmLnJlZmVyZW5jZV0pLm1hcChyID0+IHIubmFtZSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5tZXRhQ29udGV4dC5jb250YWN0YWJsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGVdKSB7XG4gICAgICAgICAgICAgIGlmIChyZWZUeXBlcy5pbmRleE9mKGMucmVzb3VyY2VUeXBlIHx8IGMudHlwZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmLnN1Z2dlc3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICBmLnN1Z2dlc3Rpb25zID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGYuc3VnZ2VzdGlvbnMgPSBmLnN1Z2dlc3Rpb25zLmZpbHRlcihzZyA9PiAhc2cuYXV0byk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB0TGFiZWwgPSBjLmRpc3BsYXlOYW1lIHx8IGMubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoYy5waG9uZU51bWJlcnMpIHtcbiAgICAgICAgICAgICAgICAgIHRMYWJlbCArPSAoJyDinIYnICsgYy5waG9uZU51bWJlcnMubWFwKHAgPT4gcC5waG9uZU51bWJlcikuam9pbignLCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZi5zdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGlkOiBjLmV4dGVybmFsSWQgfHwgYy5pZGVudGlmaWVyIHx8IGMuaWQsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogdExhYmVsLFxuICAgICAgICAgICAgICAgICAgdHlwZTogYy5yZXNvdXJjZVR5cGUgfHwgYy50eXBlLFxuICAgICAgICAgICAgICAgICAgYXV0bzogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRoaXMuZmllbGRzTWFwLmNvbnRhY3RhYmxlcyB8fCBbXSkuaW5kZXhPZihmLm5hbWUpICE9PSAtMSkgeyAvLyBldmFsdWF0ZSB1c2FiaWxpdHk/XG4gICAgICAgICAgICAgIGYuYWx3YXlzVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAoXG4gICAgICAgICAgICAvLyAgICFoYXNEZWZhdWx0Q29udGFjdCAmJiB0aGlzLm1ldGFDb250ZXh0LmRlZmF1bHRDb250YWN0YWJsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGVdXG4gICAgICAgICAgICAvLyAgICYmIHJlZlR5cGVzLmluZGV4T2YodGhpcy5tZXRhQ29udGV4dC5kZWZhdWx0Q29udGFjdGFibGVzW3RoaXMuaW50ZWdyYXRpb25Db2RlXS50eXBlKSAhPT0gLTFcbiAgICAgICAgICAgIC8vICkge1xuICAgICAgICAgICAgLy8gICB0aGlzLnJlc291cmNlW2YubmFtZV0gPSB0aGlzLm1ldGFDb250ZXh0LmRlZmF1bHRDb250YWN0YWJsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGVdO1xuICAgICAgICAgICAgLy8gICBoYXNEZWZhdWx0Q29udGFjdCA9IHRydWU7XG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKCFoYXNEZWZhdWx0Q29udGFjdCAmJiB0aGlzLmZpZWxkc01hcC5jb250YWN0YWJsZXMgJiYgZi5zdWdnZXN0aW9ucyAmJiBmLnN1Z2dlc3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gICBpZiAodGhpcy5maWVsZHNNYXAuY29udGFjdGFibGVzLmluZGV4T2YoZi5uYW1lKSAhPT0gLTEgJiYgIWYuZGVmYXVsdCkge1xuICAgICAgICAgICAgLy8gICAgIGYuZGVmYXVsdCA9IGYuc3VnZ2VzdGlvbnNbMF07XG4gICAgICAgICAgICAvLyAgICAgaGFzRGVmYXVsdENvbnRhY3QgPSB0cnVlO1xuICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRhY3RzU3VnZ2VzdGlvbnNEb25lID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VGhlbWUoKSB7XG4gICAgY29uc3QgbWV0YVRoZW1lID0gdGhpcy50aGVtZSA9PT0gJ2RhcmsnID8gbWV0YURhcmsgOiBtZXRhTGlnaHQ7XG4gICAgY29uc29sZS5sb2coJ3Jlc291cmNlIGFwcGx5IHRoZW1lJywgdGhpcy50aGVtZSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobWV0YVRoZW1lLnByb3BlcnRpZXMpKSB7XG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCBtZXRhVGhlbWUucHJvcGVydGllc1trZXldKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcmNlVWlVcGRhdGUoKSB7IC8vIGlPUyB3ZWJ2aWV3IGRvZXMgbm90IHVwZGF0ZSB0aGUgVUkgYWZ0ZXIgYXN5YyBjaGFuZ2VzLiBUZW1wIGZpeCA6KFxuICAgIC8vIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50cycpO1xuICAgIGUuaW5pdEV2ZW50KCdjbGljaycsIHRydWUsIGZhbHNlKTtcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChlKTtcbiAgfVxufVxuXG4vLy8vIFJFU09VUkNFIENBUkRcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZnaXAtbWV0YS1yZXNvdXJjZS1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc291cmNlQ2FyZC92aWV3Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXNvdXJjZUNhcmQvc3R5bGUuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE1ldGFSZXNvdXJjZUNhcmQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSByZXNvdXJjZTogYW55O1xuICBASW5wdXQoKSBtb2RlbDogYW55O1xuXG4gIGludGVncmF0aW9uQ29kZTogc3RyaW5nO1xuICByZWZEaWFsb2dGYWN0b3J5OiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIG1ldGFSZXNvdXJjZTogTWV0YVJlc291cmNlU2VydmljZSxcbiAgICBwcml2YXRlIHJlZmVyZW5jZVNlcnZpY2U6IE1ldGFSZWZlcmVuY2VTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbnRlZ3JhdGlvbkNvZGUgPSAodGhpcy5yZXNvdXJjZS5pbnRlZ3JhdGlvbiB8fCB0aGlzLnJlc291cmNlLmludGVncmF0aW9uQ29kZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIG9wZW4ocmVmZXJlbmNlLCBtb2RlbD8pIHtcbiAgICBpZiAoIXRoaXMucmVmRGlhbG9nRmFjdG9yeSkge1xuICAgICAgdGhpcy5yZWZEaWFsb2dGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTWV0YVJlZkRpYWxvZyk7XG4gICAgfVxuICAgIHRoaXMucmVmZXJlbmNlU2VydmljZS5vcGVuRGlhbG9nKFxuICAgICAgdGhpcy5yZWZEaWFsb2dGYWN0b3J5LCB0aGlzLm1ldGFSZXNvdXJjZSwgdGhpcy5pbnRlZ3JhdGlvbkNvZGUsIHJlZmVyZW5jZSwgbW9kZWwsXG4gICAgICBtb2RlbCAmJiAocmVmZXJlbmNlLmVkaXRhYmxlID09PSBmYWxzZSkgLy8gaXMgcHJldmlldyBtb2RlXG4gICAgKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnZGlhbG9nIHJlc3VsdCcsIHJlc3VsdCk7XG4gICAgICAvLyBpZiAocmVzdWx0ICYmIHJlc3VsdC5yYXcpIHtcbiAgICAgIC8vICAgaWYgKCF0aGlzLnBhcmVudFtyZWZlcmVuY2UudHlwZV0pIHtcbiAgICAgIC8vICAgICB0aGlzLnBhcmVudFtyZWZlcmVuY2UudHlwZV0gPSBbXTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gICB0aGlzLnBhcmVudFtyZWZlcmVuY2UudHlwZV0ucHVzaChyZXN1bHQucmF3KTtcbiAgICAgIC8vIH1cbiAgICB9KTtcbiAgfVxuXG59XG5cblxuY29uc3QgRk1BUCA9IChmVHlwZSkgPT4ge1xuICBzd2l0Y2ggKGZUeXBlKSB7XG4gICAgY2FzZSAnJzpcbiAgICBjYXNlIG51bGw6XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAvLyBjYXNlICdkYXRldGltZSc6XG4gICAgLy8gY2FzZSAndGltZSc6XG4gICAgLy8gY2FzZSAnZGF0ZSc6XG4gICAgY2FzZSAnc3RyaW5nJzogeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgICByZXR1cm4gRmllbGRJbnB1dDtcbiAgICB9XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgIGNhc2UgJ3RleHQnOiB7XG4gICAgICByZXR1cm4gRmllbGRUZXh0O1xuICAgIH1cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ29wdGlvbnMnOiB7XG4gICAgICByZXR1cm4gRmllbGRTZWxlY3Q7XG4gICAgfVxuICAgIGNhc2UgJ3JlZmVyZW5jZSc6IHtcbiAgICAgIHJldHVybiBGaWVsZFJlZmVyZW5jZTtcbiAgICB9XG4gICAgY2FzZSAnY29tcG9zaXRlJzoge1xuICAgICAgcmV0dXJuIEZpZWxkQ29tcG9zaXRlO1xuICAgIH1cbiAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgcmV0dXJuIEZpZWxkQm9vbGVhbjtcbiAgICB9XG4gICAgY2FzZSAncmFkaW8nOiB7XG4gICAgICByZXR1cm4gRmllbGRSYWRpbztcbiAgICB9XG4gICAgY2FzZSAnbGlzdCc6IHtcbiAgICAgIHJldHVybiBGaWVsZExpc3Q7XG4gICAgfVxuICAgIGNhc2UgJ3JpY2h0ZXh0Jzoge1xuICAgICAgcmV0dXJuIEZpZWxkUmljaHRleHQ7XG4gICAgfVxuICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICBjYXNlICd0aW1lJzpcbiAgICBjYXNlICdkYXRlJzoge1xuICAgICAgcmV0dXJuIEZpZWxkRGF0ZXRpbWU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBGaWVsZFVua25vd247XG4gICAgfVxuICB9XG59O1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbWV0YUZpZWxkQ29udGVudF0nXG59KVxuZXhwb3J0IGNsYXNzIE1ldGFGaWVsZENvbnRlbnREaXJlY3RpdmUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikgeyB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZnaXAtbWV0YS1maWVsZCcsXG4gIHRlbXBsYXRlOiAnPG5nLXRlbXBsYXRlIG1ldGFGaWVsZENvbnRlbnQ+TG9hZGluZzwvbmctdGVtcGxhdGU+JyxcbiAgc3R5bGVVcmxzOiBbJy4vZmllbGQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE1ldGFGaWVsZCBleHRlbmRzIEZpZWxkQWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBtZXRhOiBhbnk7XG4gIEBJbnB1dCgpIHBhcmVudDogYW55O1xuICBASW5wdXQoKSBpbnRlZ3JhdGlvbkNvZGU6IGFueTtcbiAgQElucHV0KCkgcmVzb3VyY2VUeXBlOiBhbnk7XG4gIEBJbnB1dCgpIGluZGV4OiBudW1iZXI7XG4gIEBJbnB1dCgpIHByZXZpZXc6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHRoZW1lOiBzdHJpbmc7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBAT3V0cHV0KCkgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBAT3V0cHV0KCkgb25MZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKE1ldGFGaWVsZENvbnRlbnREaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIGZpZWxkQ29udGVudDogTWV0YUZpZWxkQ29udGVudERpcmVjdGl2ZTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gRk1BUCh0aGlzLm1ldGEudHlwZSk7XG4gICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudCk7XG5cbiAgICB0aGlzLmZpZWxkQ29udGVudC52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5maWVsZENvbnRlbnQudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7XG4gICAgY29uc3QgZmllbGQ6IEZpZWxkQWJzdHJhY3QgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG4gICAgaWYgKGNvbXBvbmVudC5zZXR1cCkge1xuICAgICAgLy8gY29uc29sZS5sb2coJ3NldHVwJywge2E6IHRoaXMuZWwubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlLnBhcmVudE5vZGV9KVxuICAgICAgY29tcG9uZW50LnNldHVwKGZpZWxkLCB0aGlzLnBhcmVudCwgdGhpcy5tZXRhKTtcbiAgICB9XG4gICAgZmllbGQubWV0YSA9IHRoaXMubWV0YTtcbiAgICBmaWVsZC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBmaWVsZC5pbnRlZ3JhdGlvbkNvZGUgPSAodGhpcy5pbnRlZ3JhdGlvbkNvZGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgZmllbGQucmVzb3VyY2VUeXBlID0gKHRoaXMucmVzb3VyY2VUeXBlIHx8ICcnKTtcbiAgICBmaWVsZC5pbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgZmllbGQuZWxlbWVudFJlZiA9IHRoaXMuZWw7XG4gICAgZmllbGQub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlO1xuICAgIGZpZWxkLm9uTGVhdmUgPSB0aGlzLm9uTGVhdmU7XG4gICAgZmllbGQucHJldmlldyA9IHRoaXMucHJldmlldztcbiAgICBmaWVsZC50aGVtZSA9IHRoaXMudGhlbWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpZWxkLm1ldGEsICd1bnNldCcsIHtcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz0nVmx0LW1vZGFsIFZsdC1tb2RhbC0tbGFyZ2UnPlxuICA8ZGl2IGNsYXNzPVwiVmx0LW1vZGFsX19wYW5lbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJWbHQtdGFic1wiPlxuICAgICAgPGRpdiBjbGFzcz0nVmx0LXRhYnNfX2hlYWRlci0tYmFja2dyb3VuZCc+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJWbHQtdGFic19faGVhZGVyIFZsdC10YWJzX19oZWFkZXItLXNoYWRvd1wiPlxuICAgICAgICAgIDxzdmcgY2xhc3M9XCJWbHQtaWNvblwiIFtuZ1N0eWxlXT1cIntmaWxsOiBpbnRlZ3JhdGlvbkljb24gPT09ICdCcmFuZC1pY29uLXZvbmFnZScgPyAndmFyKC0tdmdpcC1tZXRhLWlucHV0LWNvbG9yKScgOiAnJ31cIj48dXNlIGF0dHIueGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWJyYW5kLWljb25zLnN2ZyN7e2ludGVncmF0aW9uSWNvbn19XCIgLz48L3N2Zz5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj0nbGV0IHIgb2YgcmVzb3VyY2VzIHwga2V5dmFsdWU6IGtlZXBPcmRlcicgKGNsaWNrKT0nc2VsZWN0UmVzb3VyY2Uoci5rZXkpJyBjbGFzcz1cIlZsdC10YWJzX19saW5rXCIgW25nQ2xhc3NdPVwieyAnVmx0LXRhYnNfX2xpbmtfYWN0aXZlJzogY3VycmVudFJlc291cmNlID09PSByLmtleX1cIj5cbiAgICAgICAgICAgIHt7ci5rZXl9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJWbHQtbW9kYWxfX2Rpc21pc3NcIiAoY2xpY2spPVwiZGlzbWlzcygpXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiVmx0LWljb25cIj48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tY3Jvc3NcIiAvPjwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIlZsdC10YWJzX19jb250ZW50XCIgc3R5bGU9J21pbi1oZWlnaHQ6IDkwcHg7Jz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9J2xldCByIG9mIHJlc291cmNlcyB8IGtleXZhbHVlOiBrZWVwT3JkZXInPlxuICAgICAgICAgIDxkaXYgKm5nSWY9J2N1cnJlbnRSZXNvdXJjZSA9PT0gci5rZXknIGNsYXNzPVwiVmx0LXRhYnNfX3BhbmVsIFZsdC10YWJzX19wYW5lbF9hY3RpdmVcIj5cbiAgICAgICAgICAgIDx2Z2lwLW1ldGEtcmVzb3VyY2UgW3Jlc291cmNlXT0nci52YWx1ZScgW21vZGVsXT0nbW9kZWxzW3Iua2V5XScgW21ldGFSZXNvdXJjZVNlcnZpY2VEZWxlZ2F0ZWRdPSdtZXRhUmVzb3VyY2UnIChkb25lKT0nb25SZXNvdXJjZURvbmUoJGV2ZW50KScgdGhlbWU9J2luaGVyaXQnIFthdHRyLmRhdGEtdGhlbWVdPSd0aGVtZSc+PC92Z2lwLW1ldGEtcmVzb3VyY2U+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iLCI8ZGl2IFtuZ0NsYXNzXT1cInsgJ1ZsdC1ncmlkIFZsdC1ncmlkLS1uYXJyb3cnOiBpc1JvdyB9XCI+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPSdsZXQgZmllbGQgb2YgZmllbGRzJz5cbiAgICA8ZGl2IHN0eWxlPSdtYXJnaW46IDA7JyBbbmdDbGFzc109XCJ7ICdWbHQtY29sJzogaXNSb3csICdWbHQtY29sLS0xb2YzJzogaXNSb3cgJiYgZmllbGRzLmxlbmd0aCA+IDMgfVwiICpuZ0lmPVwiIWZpZWxkLiRpbnZpc2libGVcIj5cbiAgICAgIDx2Z2lwLW1ldGEtZmllbGQgKm5nSWY9JyFtZXRhLiRpbnZpc2libGUnIFtuZ0NsYXNzXT1cInsgc2hvd246ICFmaWVsZC4kaW52aXNpYmxlfVwiIFtpbmRleF09J2luZGV4JyBbbWV0YV09J2ZpZWxkJ1xuICAgICAgICBbcGFyZW50XT0ndmFsdWUnIFtpbnRlZ3JhdGlvbkNvZGVdPSdpbnRlZ3JhdGlvbkNvZGUnIFtyZXNvdXJjZVR5cGVdPSdyZXNvdXJjZVR5cGUnIFtwcmV2aWV3XT0ncHJldmlldydcbiAgICAgICAgdGhlbWU9J2luaGVyaXQnPjwvdmdpcC1tZXRhLWZpZWxkPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PiIsIjxkaXYgY2xhc3M9J3ZnaXAtbWV0YS1maWVsZC1wcmV2aWV3JyAqbmdJZj0ncHJldmlldyAmJiBtb2RlbCc+XG4gIDxkaXYgY2xhc3M9J3ZnaXAtbWV0YS1maWVsZC1sYWJlbCc+e3ttZXRhLmxhYmVsIHx8IG1ldGEubmFtZX19PC9kaXY+XG4gIDxkaXYgY2xhc3M9J3ZnaXAtbWV0YS1maWVsZC12YWx1ZSBfX2d1Jz5cbiAgICB7e21vZGVsLmxhYmVsIHx8IG1vZGVsLmlkIHx8IG1vZGVsfX1cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgKm5nSWY9JyFwcmV2aWV3JyBjbGFzcz1cIlZsdC1mb3JtX19lbGVtZW50XCJcbiAgW25nQ2xhc3NdPVwieyAnVmx0LWZvcm1fX2VsZW1lbnQtLWJpZyc6ICFtZXRhLnNtYWxsICwnaGFzLXZhbHVlJzogZi52YWx1ZSwgYWN0aXZlOiBrZXlMaXN0ZW5lckFjdGl2ZSwgJ1ZsdC1mb3JtX19lbGVtZW50LS1lcnJvcic6IGYuaW52YWxpZCAmJiAoKGYgfCBtZXRhTW9kZWwpLl9wYXJlbnQuc3VibWl0dGVkIHx8IChmdCB8IG1ldGFNb2RlbCApLnRvdWNoZWQpLCAnbm8teCc6IG1ldGEubm9YIH1cIj5cbiAgPGRpdiBjbGFzcz1cIlZsdC1jb21wb3NpdGUgVmx0LWRyb3Bkb3duIFZsdC1pbnB1dFwiIHN0eWxlPSdkaXNwbGF5OiBibG9jazsnXG4gICAgW25nQ2xhc3NdPVwieyAnaGFzLWFwcGVuZC1idXR0b24nOiBpc0NyZWF0YWJsZSAmJiAhZGlzYWJsZWQgfVwiPlxuICAgIDxkaXYgY2xhc3M9XCJWbHQtc2VsZWN0XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9J3dyYXBwZXInPlxuICAgICAgICA8bGFiZWwgY2xhc3M9J1ZsdC10cnVuY2F0ZSc+e3ttZXRhLmxhYmVsIHx8IG1ldGEubmFtZX19PHNwYW5cbiAgICAgICAgICAgICpuZ0lmPSd2YWxpZGF0aW9ucy5yZXF1aXJlZCAmJiBvcHRpb25zLmxlbmd0aCcgY2xhc3M9J1ZsdC1yZWQnPio8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGNsYXNzPSdtYWluJyBbcmVxdWlyZWRdPSd2YWxpZGF0aW9ucy5yZXF1aXJlZCAmJiAhIW9wdGlvbnMubGVuZ3RoJyByZWFkb25seSBbbmdNb2RlbF09J3Nob3dUZXh0J1xuICAgICAgICAgICNmdD0nbmdNb2RlbCcgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibWV0YS5wbGFjZWhvbGRlciB8fCAnICdcIiAoY2xpY2spPSdvbkFjdGl2YXRlZCgkZXZlbnQpJyAoZm9jdXMpPSdvbkFjdGl2YXRlZCgkZXZlbnQpJ1xuICAgICAgICAgIChibHVyKT0nb25CbHVyKCRldmVudCknIFtuZ0NsYXNzXT1cInsgJ3N0YW5kYWxvbmUnOiBtZXRhLnN0YW5kYWxvbmUgfVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT0nZGlzYWJsZWQnIFthdHRyLmFyaWEtbGFiZWxdPSdtZXRhLmxhYmVsJyAvPlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxzZWxlY3QgY2xhc3M9J21vZGVsJyBbcmVxdWlyZWRdPSd2YWxpZGF0aW9ucy5yZXF1aXJlZCAmJiAhIW9wdGlvbnMubGVuZ3RoJyBzdHlsZT0nZGlzcGxheTogbm9uZTsnXG4gICAgICAgIFsobmdNb2RlbCldPSdtb2RlbCcgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiBtZXRhLnN0YW5kYWxvbmV9XCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCIgI2Y9J25nTW9kZWwnIFtuYW1lXT0nbmFtZSc+PC9zZWxlY3Q+XG4gICAgICA8ZGl2ICpuZ0lmPSdzZWFyY2hpbmcnIGNsYXNzPSdzZWFyY2gtcHJvZ3Jlc3MnPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJhciBWbHQtYmctcHVycGxlXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSdWbHQtY29tcG9zaXRlX19hcHBlbmQgcmlnaHQtYWN0aW9ucyc+XG4gICAgICAgIDxkaXYgKm5nSWY9J21vZGVsICYmICFtZXRhLm5vWCAmJiAhZGlzYWJsZWQnIGNsYXNzPVwiVmx0LWNvbXBvc2l0ZV9fYXBwZW5kLS1pY29uXCJcbiAgICAgICAgICAoY2xpY2spPSdjbGVhcigkZXZlbnQpJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWNvbXBvc2l0ZV9faWNvblwiPlxuICAgICAgICAgICAgPHN2Zz5cbiAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLWNyb3NzXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9J1ZsdC1kcm9wZG93bl9fcGFuZWwnPlxuICAgICAgPGRpdiBjbGFzcz1cIlZsdC1kcm9wZG93bl9fcGFuZWxfX2NvbnRlbnQgVmx0LWRyb3Bkb3duX19wYW5lbF9fY29udGVudC0tc2Nyb2xsLWFyZWFcIj5cbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX190aXRsZVwiIHN0eWxlPSdwYWRkaW5nLWxlZnQ6IDE1cHg7Jz5cbiAgICAgICAgICBTZWxlY3QgKHt7b3B0aW9ucy5sZW5ndGh9fSlcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX19jbG9zZSBWbHQtd2hpdGVcIiAoY2xpY2spPSdkaXNtaXNzRHJvcGRvd24oJGV2ZW50KSc+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPSdWbHQtaWNvbiBWbHQtaWNvbi0tc21hbGwnPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1jcm9zc1wiLz48L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX19ibG9jayBWbHQtc2VhcmNoX3dyYXBcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3B0aW9uc0JhY2t1cC5sZW5ndGggPiAxMlwiIGNsYXNzPVwiVmx0LWNvbXBvc2l0ZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX3ByZXBlbmQgVmx0LWNvbXBvc2l0ZV9fcHJlcGVuZC0taWNvblwiXG4gICAgICAgICAgICAgIHN0eWxlPVwidG9wOiAwOyBwYWRkaW5nLXRvcDogMTVweDtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX2ljb25cIj5cbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSdWbHQtZ3JleSc+XG4gICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tc2VhcmNoXCI+PC91c2U+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWlucHV0XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwidmdpcC1zZWFyY2hfaW5wdXRcIiBbKG5nTW9kZWwpXT1cInNlYXJjaElucHV0VGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgKGlucHV0KT1cIm9uU2VhcmNoQ2hhbmdlKClcIiAoYmx1cik9J29uQmx1cigkZXZlbnQpJyBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJWbHQtY29tcG9zaXRlX19hcHBlbmQtLWljb25cIlxuICAgICAgICAgICAgICBzdHlsZT1cInRvcDogMnB4O1wiIChjbGljayk9XCJjbGVhclNlYXJjaEZpZWxkKClcIiBbaGlkZGVuXT1cInNlYXJjaElucHV0VGV4dCA9PT0gJydcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX2ljb25cIj5cbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSdWbHQtaWNvbiBWbHQtaWNvbi0tc21hbGwnPlxuICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLWNyb3NzXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj0nZHJvcGRvd24nIGNsYXNzPSdWbHQtZHJvcGRvd25fX3Njcm9sbCc+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7ICdWbHQtZHJvcGRvd25fX2xpbmstLXNlbGVjdGVkJzogYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID09PSBpIH1cIlxuICAgICAgICAgICAgKGNsaWNrKT0nb25PcHRpb25TZWxlY3QoJGV2ZW50LCBvcHRpb24pJyAqbmdGb3I9J2xldCBvcHRpb24gb2Ygb3B0aW9uczsgbGV0IGkgPSBpbmRleCdcbiAgICAgICAgICAgIGNsYXNzPVwiVmx0LWRyb3Bkb3duX19saW5rXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPSdtdWx0aXBsZScgY2xhc3M9XCJWbHQtY2hlY2tib3hcIiBzdHlsZT0nd2lkdGg6IDEwMCU7Jz5cbiAgICAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiVmx0LWNoZWNrYm94X19idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09J21vZGVsICYmIG1vZGVsLmluZGV4T2Yob3B0aW9uKSAhPT0gLTEnIC8+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIlZsdC1jaGVja2JveF9faWNvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAge3tvcHRpb24ubGFiZWwgfHwgKG9wdGlvbi5pZCA9PT0gJycgPyAnLS1lbXB0eS0tJyA6IG9wdGlvbil9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPSchbXVsdGlwbGUnIHN0eWxlPSdwYWRkaW5nOiAxMnB4IDIwcHg7Jz57e29wdGlvbi5sYWJlbCB8fCAob3B0aW9uLmlkID09PSAnJyA/XG4gICAgICAgICAgICAgICctLWVtcHR5LS0nIDogb3B0aW9uKX19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBObyBPcHRpb24gRm91bmQgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlZsdC1kcm9wZG93bl9fbGlua1wiICpuZ0lmPVwib3B0aW9ucy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9J3BhZGRpbmc6IDEycHggMjBweDsnPk5vIE9wdGlvbiBGb3VuZDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj0nIW11bHRpcGxlJyBjbGFzcz1cIlZsdC1kcm9wZG93bl9fYmxvY2tcIj48L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj0nbXVsdGlwbGUnIGNsYXNzPVwiVmx0LWRyb3Bkb3duX19ibG9jayBWbHQtZHJvcGRvd25fX2Jsb2NrLS1ub3dyYXBcIlxuICAgICAgICAgIHN0eWxlPSdwYWRkaW5nOiA4cHggMTZweCAxNnB4Oyc+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPSdjbGVhcigkZXZlbnQpJyB0eXBlPSdidXR0b24nXG4gICAgICAgICAgICBjbGFzcz1cIlZsdC1idG4gVmx0LWJ0bi0tc2Vjb25kYXJ5IFZsdC1idG4tLWFwcCBWbHQtYnRuLS1zbWFsbCBWbHQtYnRuLS1vdXRsaW5lXCJcbiAgICAgICAgICAgIHN0eWxlPSdtYXJnaW4tcmlnaHQ6IDhweDsnPkNsZWFyIGFsbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT0nZGlzbWlzc0Ryb3Bkb3duKCRldmVudCknIHR5cGU9J2J1dHRvbidcbiAgICAgICAgICAgIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS1zZWNvbmRhcnkgVmx0LWJ0bi0tYXBwIFZsdC1idG4tLXNtYWxsXCI+RG9uZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gPHNwYW4gKm5nSWY9J2lzQ3JlYXRhYmxlJz5cbiAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJyAoY2xpY2spPSdvcGVuUmVzb3VyY2UoJGV2ZW50KScgY2xhc3M9XCJWbHQtYnRuIFZsdC1idG4tLXNlY29uZGFyeSBWbHQtYnRuLS1pY29uIFZsdC1idG4tLWxhcmdlXCIgc3R5bGU9J21hcmdpbi1sZWZ0OiAxMnB4Oyc+XG4gICAgICAgIDxzdmc+PHVzZSB4bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLXBsdXNcIi8+PC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3NwYW4+IC0tPlxuICAgIDxkaXYgKm5nSWY9J2lzQ3JlYXRhYmxlICYmICFkaXNhYmxlZCcgY2xhc3M9XCJWbHQtY29tcG9zaXRlX19hcHBlbmRcIj5cbiAgICAgIDxidXR0b24gKGZvY3VzKT0nb25BY3RpdmF0ZWQoJGV2ZW50KScgKGJsdXIpPSdvbkJsdXIoJGV2ZW50KScgdHlwZT0nYnV0dG9uJyAoY2xpY2spPSdvcGVuUmVzb3VyY2UoJGV2ZW50KSdcbiAgICAgICAgY2xhc3M9XCJWbHQtYnRuIFZsdC1idG4tLXdoaXRlIFZsdC1idG4tLWljb24gYWRkLWJ1dHRvblwiIGFyaWEtbGFiZWw9J0FkZCBuZXcnPlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1wbHVzXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxzbWFsbCAqbmdJZj0nZi5pbnZhbGlkICYmICgoZiB8IG1ldGFNb2RlbCkuX3BhcmVudC5zdWJtaXR0ZWQgfHwgKChmdCB8IG1ldGFNb2RlbCkudG91Y2hlZCAmJiBrZXlMaXN0ZW5lckFjdGl2ZSkpJ1xuICAgIGNsYXNzPVwiVmx0LWZvcm1fX2VsZW1lbnRfX2Vycm9yXCI+XG4gICAgPHNwYW4gKm5nSWY9XCJmLmVycm9ycy5yZXF1aXJlZFwiPlJlcXVpcmVkLiZuYnNwOzwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cImYuZXJyb3JzLmN1c3RvbVwiPnt7Zi5lcnJvcnMuY3VzdG9tfX0mbmJzcDs8L3NwYW4+XG4gIDwvc21hbGw+XG4gIDxzbWFsbCAqbmdJZj0nbWV0YS5oaW50JyBjbGFzcz1cIlZsdC1mb3JtX19lbGVtZW50X19oaW50XCI+e3ttZXRhLmhpbnR9fTwvc21hbGw+XG48L2Rpdj5cbiIsIjxkaXYgY2xhc3M9J3ZnaXAtbWV0YS1maWVsZC1wcmV2aWV3JyAqbmdJZj0ncHJldmlldyAmJiBtb2RlbCAmJiAoIW11bHRpcGxlIHx8IChtdWx0aXBsZSAmJiBtb2RlbC5sZW5ndGgpKSc+XG4gIDxkaXYgY2xhc3M9J3ZnaXAtbWV0YS1maWVsZC1sYWJlbCc+e3ttZXRhLmxhYmVsIHx8IG1ldGEubmFtZX19PC9kaXY+XG4gIDxkaXYgKm5nSWY9JyFtdWx0aXBsZScgY2xhc3M9J3ZnaXAtbWV0YS1maWVsZC12YWx1ZSBfX2d1Jz5cbiAgICA8c3ZnIGNsYXNzPVwiVmx0LWljb24gVmx0LWljb24tLXNtYWxsZXJcIiBzdHlsZT0nbWFyZ2luLXRvcDogLTNweDsnPjx1c2UgYXR0ci54bGluazpocmVmPVwidm9sdGEvdm9sdGEtYnJhbmQtaWNvbnMuc3ZnI3t7aW50ZWdyYXRpb25JY29ufX1cIi8+PC9zdmc+XG4gICAge3ttb2RlbC5sYWJlbCB8fCBtb2RlbC5pZH19IDxzcGFuIGNsYXNzPSdWbHQtZ3JleSc+KHt7bW9kZWwudHlwZX19KTwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9J211bHRpcGxlJyBjbGFzcz0ndmdpcC1tZXRhLWZpZWxkLXZhbHVlIF9fZ3UnPlxuICAgIDxzcGFuICpuZ0Zvcj0nbGV0IG0gb2YgKG1vZGVsIHx8IFtdKScgY2xhc3M9J1ZsdC1iYWRnZSBWbHQtYmFkZ2UtLWFwcCc+XG4gICAgICB7e20ubGFiZWwgfHwgbS5pZCB8fCBtfX0gPHNwYW4gY2xhc3M9J1ZsdC1ncmV5LWRhcmsnICpuZ0lmPSdpc1BvbHltb3JwaGljJz4oe3ttLnR5cGV9fSk8L3NwYW4+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiAqbmdJZj0nIXByZXZpZXcnIGNsYXNzPVwibWV0YS1maWVsZC1yZWZlcmVuY2UgVmx0LWZvcm1fX2VsZW1lbnQgVmx0LWZvcm1fX2VsZW1lbnQtLWJpZ1wiIFtuZ0NsYXNzXT1cInsgJ1ZsdC1mb3JtX19lbGVtZW50LS1lcnJvcic6IChzZWFyY2hFcnJvciAmJiBrZXlMaXN0ZW5lckFjdGl2ZSkgfHwgKGYuaW52YWxpZCAmJiAoKGYgfCBtZXRhTW9kZWwpLl9wYXJlbnQuc3VibWl0dGVkIHx8IChmdCB8IG1ldGFNb2RlbCApLnRvdWNoZWQpKSwgJ211bHRpcGxlJzogbXVsdGlwbGUsICdoYXMtdmFsdWUnOiBtb2RlbCwgYWN0aXZlOiBrZXlMaXN0ZW5lckFjdGl2ZSB9XCI+XG4gIDxkaXYgKm5nSWY9J211bHRpcGxlJyBjbGFzcz0naXRlbXMtY29udGFpbmVyJyBbbmdDbGFzc109J3sgY3JlYXRhYmxlOiBpc0NyZWF0YWJsZSB9Jz5cbiAgICA8ZGl2ICpuZ0lmPSdtb2RlbCcgY2xhc3M9J2JhZGdlcy1jb250YWluZXIga2VlcC1mb2N1cycgKGNsaWNrKT0nZm9jdXMoKScgc3R5bGU9J3dpZHRoOiAxMDAlOyc+XG4gICAgICA8ZGl2ICpuZ0Zvcj0nbGV0IGl0ZW0gb2YgbW9kZWwnIGNsYXNzPVwiVmx0LWJhZGdlIFZsdC1iYWRnZS0tYXBwIFZsdC1iYWRnZS0tbGFyZ2Uga2VlcC1mb2N1c1wiIFtuZ0NsYXNzXT1cInsgZ3JpZDogKGl0ZW0ubGFiZWwgfHwgaXRlbS5pZCB8fCAnJykubGVuZ3RoID4gNTZ9XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPSdWbHQtdHJ1bmNhdGUnPnt7aXRlbS5sYWJlbCB8fCBpdGVtLmlkIHx8IGl0ZW0gfX0gPHNwYW4gKm5nSWY9J2lzUG9seW1vcnBoaWMnIGNsYXNzPSdWbHQtZ3JleS1kYXJrJyBzdHlsZT0nZm9udC13ZWlnaHQ6IG5vcm1hbDsnPih7e2l0ZW0udHlwZX19KTwvc3Bhbj48L3NwYW4+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJWbHQtYmFkZ2VfX2Rpc21pc3Mga2VlcC1mb2N1c1wiIChjbGljayk9J3JlbW92ZSgkZXZlbnQsIGl0ZW0pJyBzdHlsZT0ncG9zaXRpb246IGFic29sdXRlOyByaWdodDogMTJweDsgdG9wOiA4cHg7JyBhcmlhLWxhYmVsPSdSZW1vdmUnPjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiVmx0LWNvbXBvc2l0ZVwiPlxuICAgIDxkaXYgY2xhc3M9J2Ryb3Bkb3duLXdyYXBwZXIgVmx0LWRyb3Bkb3duJyBzdHlsZT0nd2lkdGg6IDEwMCU7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA0OHB4Oyc+XG4gICAgICA8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX19wYW5lbFwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPSdzZWFyY2hFcnJvcic+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlZsdC1jYWxsb3V0IFZsdC1jYWxsb3V0LS1jcml0aWNhbCBrZWVwLWZvY3VzXCI+XG4gICAgICAgICAgICA8aT48L2k+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWNhbGxvdXRfX2NvbnRlbnRcIj57e3NlYXJjaEVycm9yfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9JyFzZWFyY2hFcnJvciAmJiAoc3VnZ2VzdGlvbnMubGVuZ3RoIHx8IHNlYXJjaFJlc3VsdHMpJyBbbmdDbGFzc109XCJ7IHN1Z2dlc3Rpb25zOiAhc2VhcmNoUmVzdWx0c31cIiBjbGFzcz1cIlZsdC1kcm9wZG93bl9fcGFuZWxfX2NvbnRlbnQgVmx0LWRyb3Bkb3duX19wYW5lbF9fY29udGVudC0tc2Nyb2xsLWFyZWFcIiBzdHlsZT0ncGFkZGluZzogMDsnPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJWbHQtZHJvcGRvd25fX2Jsb2NrXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj0nIXNlYXJjaFJlc3VsdHMnIGNsYXNzPVwiVmx0LWRyb3Bkb3duX19zY3JvbGxcIj5cbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyAnVmx0LWRyb3Bkb3duX19saW5rLS1zZWxlY3RlZCc6IGFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9PT0gaSwgc21hcnQ6IHN1Z2dlc3Rpb24uc21hcnQgfVwiIChjbGljayk9J29uU3VnZ2VzdGlvblNlbGVjdCgkZXZlbnQsIHN1Z2dlc3Rpb24pJyAqbmdGb3I9J2xldCBzdWdnZXN0aW9uIG9mIHN1Z2dlc3Rpb25zOyBsZXQgaSA9IGluZGV4JyAgY2xhc3M9XCJWbHQtZHJvcGRvd25fX2xpbmsgaGFzLXR5cGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0nVmx0LWljb24gIFZsdC1pY29uLS1zbWFsbCc+PHVzZSBhdHRyLnhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1icmFuZC1pY29ucy5zdmcje3tpbnRlZ3JhdGlvbkljb259fVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nX19ndScgW3RpdGxlXT0nc3VnZ2VzdGlvbi5sYWJlbCc+e3sgc3VnZ2VzdGlvbi5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9J1ZsdC1ncmV5LWRhcmsnIHN0eWxlPSd0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsnPnt7c3VnZ2VzdGlvbi50eXBlfX08L3NtYWxsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj0nc2VhcmNoUmVzdWx0cycgY2xhc3M9XCJWbHQtZHJvcGRvd25fX3Njcm9sbFwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj0nIXNlYXJjaFJlc3VsdHMubGVuZ3RoJyBjbGFzcz0nVmx0LWRyb3Bkb3duX19ibG9jayc+IE5vIHJlY29yZHMgbWF0Y2hpbmcgJzxiIHN0eWxlPSdwb2ludGVyLWV2ZW50czogbm9uZTsnPnt7c2VhcmNoVGV4dH19PC9iPicgd2VyZSBmb3VuZC48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyAnVmx0LWRyb3Bkb3duX19saW5rLS1zZWxlY3RlZCc6IGFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9PT0gaSB9XCIgKGNsaWNrKT0nb25TdWdnZXN0aW9uU2VsZWN0KCRldmVudCwgc3VnZ2VzdGlvbiknICpuZ0Zvcj0nbGV0IHN1Z2dlc3Rpb24gb2Ygc2VhcmNoUmVzdWx0czsgbGV0IGkgPSBpbmRleCcgIGNsYXNzPVwiVmx0LWRyb3Bkb3duX19saW5rIGhhcy10eXBlXCI+XG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9J1ZsdC1pY29uIFZsdC1pY29uLS1zbWFsbCc+PHVzZSBhdHRyLnhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1icmFuZC1pY29ucy5zdmcje3tpbnRlZ3JhdGlvbkljb259fVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nX19ndScgW3RpdGxlXT0nc3VnZ2VzdGlvbi5sYWJlbCc+e3sgc3VnZ2VzdGlvbi5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9J1ZsdC1ncmV5LWRhcmsnIHN0eWxlPSd0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsnPnt7c3VnZ2VzdGlvbi50eXBlfX08L3NtYWxsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPSdzZWFyY2hSZXN1bHRzJyBjbGFzcz1cIlZsdC1kcm9wZG93bl9fYmxvY2tcIiBzdHlsZT0ndGV4dC1hbGlnbjogcmlnaHQ7IHBhZGRpbmctdG9wOiAwOyc+XG4gICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgIHt7IHNlYXJjaFJlc3VsdHMgPyBzZWFyY2hSZXN1bHRzLmxlbmd0aCsnIHJlc3VsdHMnIDogJ1N1Z2dlc3Rpb25zJyB9fSA8c3BhbiBzdHlsZT0nZm9udC1zdHlsZTogaXRhbGljOyBmb250LXdlaWdodDogbm9ybWFsOycgKm5nSWY9J3NlYXJjaFJlc3VsdHMnPn57eyBtb2RlbCA/ICdsYXN0IHNlYXJjaCcgOiBzZWFyY2hUZXh0fX08L3NwYW4+XG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX19ibG9ja1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJWbHQtY29tcG9zaXRlX19wcmVwZW5kXCIgKm5nSWY9J2lzUG9seW1vcnBoaWMgJiYgc2hvd1R5cGVzICYmIChtdWx0aXBsZSB8fCAhbW9kZWwgfHwgKGRyb3Bkb3duVmlzaWJsZSAmJiAoKHN1Z2dlc3Rpb25zIHx8IHNlYXJjaFJlc3VsdHMgfHwgW10pLmxlbmd0aCB8fCBzZWFyY2hSZXNvdXJjZVR5cGUucmVzb3VyY2VUeXBlKSkpJz5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtc2NvcGVcIiBbbmdDbGFzc109XCJ7ICdoYXMtdmFsdWUnOiBzZWFyY2hSZXNvdXJjZVR5cGUucmVzb3VyY2VUeXBlIH1cIj5cbiAgICAgICAgPHZnaXAtbWV0YS1maWVsZCBjbGFzcz0nc2hvd24nIFttZXRhXT0nc2VhcmNoUmVzb3VyY2VUeXBlTWV0YScgW3BhcmVudF09J3NlYXJjaFJlc291cmNlVHlwZScgKG9uQ2hhbmdlKT0nb25TZWFyY2hSZXNvdXJjZVR5cGVDaGFuZ2VkKCRldmVudCknIChvbkxlYXZlKT0nb25CbHVyKCRldmVudCknIFtpbnRlZ3JhdGlvbkNvZGVdPSdpbnRlZ3JhdGlvbkNvZGUnIHRoZW1lPSdpbmhlcml0Jz48L3ZnaXAtbWV0YS1maWVsZD5cbiAgICAgICAgPHN2ZyBjbGFzcz0nVmx0LWljb24gVmx0LWdyZXkgVmx0LWljb24tLXNtYWxsZXIgdmlzaWJsZS1tb2JpbGUgbW9iaWxlLWljb24nIHN0eWxlPSdwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMTVweDsgbGVmdDogMTRweDsgcG9pbnRlci1ldmVudHM6IG5vbmU7Jz5cbiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tbWVudVwiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxsYWJlbCBjbGFzcz0nbW9iaWxlLWxhYmVsIGhpZGRlbi1tb2JpbGUgaGlkZGVuLWRlc2t0b3AnPlNlYXJjaDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPSchKGlzUG9seW1vcnBoaWMgJiYgc2hvd1R5cGVzICYmIChtdWx0aXBsZSB8fCAhbW9kZWwgfHwgZHJvcGRvd25WaXNpYmxlKSknPjwhLS0gcmVxdWlyZWQgYnkgY3NzIC0tPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJWbHQtY29tcG9zaXRlX193cmFwcGVyIFZsdC1pbnB1dFwiIHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOycgW25nQ2xhc3NdPVwieyAnaGFzLWFwcGVuZC1idXR0b24nOiBoYXNBcHBlbmRCdXR0b24gJiYgIWRpc2FibGVkIH1cIj5cbiAgICAgIDxsYWJlbCBjbGFzcz0nd3JhcHBlcic+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJWbHQtY29tcG9zaXRlX19wcmVwZW5kIFZsdC1jb21wb3NpdGVfX3ByZXBlbmQtLWljb25cIiBzdHlsZT0ndG9wOiAwOyBwYWRkaW5nLXRvcDogMTVweDsnPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJWbHQtY29tcG9zaXRlX19pY29uXCI+XG4gICAgICAgICAgICA8c3ZnICpuZ0lmPSdpc1NlYXJjaGFibGUgJiYgKCFtb2RlbCB8fCBtdWx0aXBsZSknIGNsYXNzPSdWbHQtZ3JleSc+PHVzZSBhdHRyLnhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24te3sgbXVsdGlwbGUgPyAnc3RhY2snIDogJ3NlYXJjaCd9fVwiLz48L3N2Zz5cbiAgICAgICAgICAgIDxzdmcgKm5nSWY9JyFpc1NlYXJjaGFibGUgfHwgKG1vZGVsICYmICFtdWx0aXBsZSknIFtuZ1N0eWxlXT1cIntmaWxsOiBpbnRlZ3JhdGlvbkljb24gPT09ICdCcmFuZC1pY29uLXZvbmFnZScgPyAndmFyKC0tdmdpcC1tZXRhLWlucHV0LWNvbG9yKScgOiAnJ31cIj48dXNlIGF0dHIueGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWJyYW5kLWljb25zLnN2ZyN7e2ludGVncmF0aW9uSWNvbn19XCIvPjwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9J3N1Z2dlc3Rpb25zLmxlbmd0aCcgY2xhc3M9XCJWbHQtYmFkZ2UgVmx0LWJhZGdlLS1zbWFsbCBWbHQtYmFkZ2UtLXB1cnBsZVwiIHN0eWxlPSdwYWRkaW5nOiAwcHggNHB4OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMjZweDsgbGVmdDogNHB4OyBwb2ludGVyLWV2ZW50czogbm9uZTsgbWluLXdpZHRoOiAxNHB4Oyc+e3tzdWdnZXN0aW9ucy5sZW5ndGh9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlucHV0IGNsYXNzPSdtb2RlbCcgdHlwZT0naGlkZGVuJyBbcmVxdWlyZWRdPSd2YWxpZGF0aW9ucy5yZXF1aXJlZCcgWyhuZ01vZGVsKV09J21vZGVsJyAjZj0nbmdNb2RlbCcgW25hbWVdPSduYW1lJyAvPlxuICAgICAgICA8aW5wdXQgY2xhc3M9J21haW4nIFtyZWFkb25seV09JyFpc1NlYXJjaGFibGUgfHwgKG1vZGVsICYmICFtdWx0aXBsZSknIFtuZ01vZGVsXT0nc2VhcmNoVGV4dCcgI2Z0PSduZ01vZGVsJyAobmdNb2RlbENoYW5nZSk9J29uU2VhcmNoVGV4dENoYW5nZWQoJGV2ZW50KScgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJ7eyBwbGFjZUhvbGRlckxhYmVsIHx8ICcgJyB9fVwiIFtuZ0NsYXNzXT0neyBleHQ6IGV4dGVybmFsTGluayB9JyAoY2xpY2spPSdvbkFjdGl2YXRlZCgkZXZlbnQpJyAoZm9jdXMpPSdvbkFjdGl2YXRlZCgkZXZlbnQpJyAoYmx1cik9J29uQmx1cigkZXZlbnQpJyBbZGlzYWJsZWRdPSdkaXNhYmxlZCcgW3RpdGxlXT1cIm1vZGVsID8gbW9kZWwubGFiZWwgOiAnJ1wiLz5cbiAgICAgICAgPGxhYmVsIGNsYXNzPSdWbHQtdHJ1bmNhdGUgaGlkZGVuLW1vYmlsZScgc3R5bGU9J3BhZGRpbmctbGVmdDogMjVweDsgcGFkZGluZy1yaWdodDogNDJweDsnPnt7IChtdWx0aXBsZSAmJiBpc1BvbHltb3JwaGljKSA/ICcrQWRkICcgOiAoKG1vZGVsIHx8ICFpc1BvbHltb3JwaGljKSA/IG1ldGEubGFiZWwgOiAoIG1ldGEuc2VhcmNoTGFiZWwgfHwgJ1NlYXJjaCcpKSB9fTxzcGFuICpuZ0lmPSd2YWxpZGF0aW9ucy5yZXF1aXJlZCcgY2xhc3M9J1ZsdC1yZWQnPio8L3NwYW4+Jm5ic3A7PHNwYW4gc3R5bGU9J2NvbG9yOiB2YXIoLS12Z2lwLW1ldGEtaW5wdXQtY29sb3IpOyB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsnICpuZ0lmPSdtb2RlbCc+KHt7bW9kZWwudHlwZSB8fCBtb2RlbC5yZXNvdXJjZVR5cGUgfHwgbW9kZWwubGVuZ3RofX0pPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz0nVmx0LXRydW5jYXRlIGhpZGRlbi1kZXNrdG9wJyBzdHlsZT0ncGFkZGluZy1sZWZ0OiAyNXB4OyBwYWRkaW5nLXJpZ2h0OiA0MnB4Oyc+e3ttZXRhLmxhYmVsIHx8IG1ldGEubmFtZX19PHNwYW4gKm5nSWY9J3ZhbGlkYXRpb25zLnJlcXVpcmVkJyBjbGFzcz0nVmx0LXJlZCc+Kjwvc3Bhbj4mbmJzcDs8c3BhbiBzdHlsZT0nY29sb3I6IHZhcigtLXZnaXAtbWV0YS1pbnB1dC1jb2xvcik7IHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOycgKm5nSWY9J21vZGVsJz4oe3ttb2RlbC50eXBlIHx8IG1vZGVsLnJlc291cmNlVHlwZSB8fCBtb2RlbC5sZW5ndGh9fSk8L3NwYW4+PC9sYWJlbD5cbiAgICAgIDwvbGFiZWw+XG4gICAgICA8ZGl2ICpuZ0lmPSdzZWFyY2hpbmcnIGNsYXNzPSdzZWFyY2gtcHJvZ3Jlc3MnPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJhciBWbHQtYmctcHVycGxlXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSdWbHQtY29tcG9zaXRlX19hcHBlbmQgcmlnaHQtYWN0aW9ucyc+XG4gICAgICAgIDwhLS0gPGRpdiAqbmdJZj0ncHJldk1vZGVsICYmICFtb2RlbCcgY2xhc3M9XCJWbHQtY29tcG9zaXRlX19hcHBlbmQtLWljb25cIiAoY2xpY2spPSdyZXZlcnQoKSc+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX2ljb25cIj5cbiAgICAgICAgICAgIDxzdmc+PHVzZSB4bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLXJlcGx5XCIvPjwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9J21vZGVsICYmICFtdWx0aXBsZScgY2xhc3M9XCJWbHQtY29tcG9zaXRlX19hcHBlbmQtLWljb25cIiAoY2xpY2spPSdyZW1vdmVTZWxlY3Rpb24oKSc+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX2ljb25cIj5cbiAgICAgICAgICAgIDxzdmc+PHVzZSB4bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLWNyb3NzXCIvPjwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGEgW2hyZWZdPSdleHRlcm5hbExpbmsgfHwgbW9kZWwuZXh0ZXJuYWxMaW5rJyB0YXJnZXQ9J19ibGFuaycgcmVsPSdub29wZW5lcicgKm5nSWY9J2V4dGVybmFsTGluayAmJiAobW9kZWwgJiYgIW11bHRpcGxlKScgY2xhc3M9XCJWbHQtY29tcG9zaXRlX19hcHBlbmQtLWljb25cIiBhcmlhLWxhYmVsPSdPcGVuIGV4dGVybmFsJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWNvbXBvc2l0ZV9faWNvblwiPlxuICAgICAgICAgICAgPHN2Zz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tb3BlblwiLz48L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSA8c3BhbiAqbmdJZj0naGFzQ3JlYXRhYmxlcyc+XG4gICAgICA8YnV0dG9uIHR5cGU9J2J1dHRvbicgKm5nSWY9JyFtb2RlbCB8fCBtdWx0aXBsZScgKGNsaWNrKT0nb3BlblJlc291cmNlKCknIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS1zZWNvbmRhcnkgVmx0LWJ0bi0taWNvbiBWbHQtYnRuLS1sYXJnZVwiIHN0eWxlPSdtYXJnaW4tbGVmdDogMTJweDsnPlxuICAgICAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1wbHVzXCIvPjwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9J2J1dHRvbicgKm5nSWY9J21vZGVsICYmICFtdWx0aXBsZScgKGNsaWNrKT0nb3BlblJlc291cmNlKG1vZGVsKScgY2xhc3M9XCJWbHQtYnRuIFZsdC1idG4tLXByaW1hcnkgVmx0LWJ0bi0taWNvbiBWbHQtYnRuLS1sYXJnZVwiIHN0eWxlPSdtYXJnaW4tbGVmdDogMTJweDsnPlxuICAgICAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1lZGl0XCIvPjwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9zcGFuPiAtLT5cbiAgICA8ZGl2ICpuZ0lmPSdoYXNBcHBlbmRCdXR0b24gJiYgIWRpc2FibGVkJyBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX2FwcGVuZFwiPlxuICAgICAgPGJ1dHRvbiAoZm9jdXMpPSdvbkFjdGl2YXRlZCgkZXZlbnQpJyAoYmx1cik9J29uQmx1cigkZXZlbnQpJyB0eXBlPSdidXR0b24nICpuZ0lmPSchbW9kZWwgfHwgbXVsdGlwbGUnIChjbGljayk9J29wZW5SZXNvdXJjZSgpJyBjbGFzcz1cIlZsdC1idG4gVmx0LWJ0bi0td2hpdGUgVmx0LWJ0bi0taWNvblwiIGFyaWEtbGFiZWw9J0FkZCBuZXcnPlxuICAgICAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1wbHVzXCIvPjwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIChmb2N1cyk9J29uQWN0aXZhdGVkKCRldmVudCknIChibHVyKT0nb25CbHVyKCRldmVudCknIHR5cGU9J2J1dHRvbicgKm5nSWY9J21vZGVsICYmICFtdWx0aXBsZScgKGNsaWNrKT0nb3BlblJlc291cmNlKG1vZGVsKScgY2xhc3M9XCJWbHQtYnRuIFZsdC1idG4tLXdoaXRlIFZsdC1idG4tLWljb25cIiBhcmlhLWxhYmVsPSdFZGl0Jz5cbiAgICAgICAgPHN2Zz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tZWRpdFwiLz48L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPHNtYWxsICpuZ0lmPSdmLmludmFsaWQgJiYgKChmIHwgbWV0YU1vZGVsKS5fcGFyZW50LnN1Ym1pdHRlZCB8fCAoKGZ0IHwgbWV0YU1vZGVsKS50b3VjaGVkICYmIGtleUxpc3RlbmVyQWN0aXZlKSknIGNsYXNzPVwiVmx0LWZvcm1fX2VsZW1lbnRfX2Vycm9yXCI+XG4gICAgPHNwYW4gKm5nSWY9XCJmLmVycm9ycy5yZXF1aXJlZFwiPlJlcXVpcmVkPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiZi5lcnJvcnMucGF0dGVyblwiPlNob3VsZCBtYXRjaCAne3t2YWxpZGF0aW9ucy5wYXR0ZXJufX0nIHBhdHRlcm48L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCJmLmVycm9ycy5jdXN0b21cIj57e2YuZXJyb3JzLmN1c3RvbX19Jm5ic3A7PC9zcGFuPlxuICA8L3NtYWxsPlxuICA8c21hbGwgKm5nSWY9J21ldGEuaGVscFRleHQgfHwgbWV0YS5oaW50JyBjbGFzcz1cIlZsdC1mb3JtX19lbGVtZW50X19oaW50XCI+e3ttZXRhLmhlbHBUZXh0IHx8IG1ldGEuaGludH19PC9zbWFsbD5cbjwvZGl2PlxuIiwiPGRpdiAqbmdJZj0ndHJ1ZScgY2xhc3M9XCJWbHQtZm9ybV9fZWxlbWVudFwiIFtuZ0NsYXNzXT1cInsgJ1ZsdC1mb3JtX19lbGVtZW50LS1lcnJvcic6IChmIHwgbWV0YU1vZGVsKS5fcGFyZW50LnN1Ym1pdHRlZCAmJiBmLmludmFsaWQgfVwiPlxuICA8bGFiZWwgY2xhc3M9XCJWbHQtbGFiZWxcIj57e21ldGEubGFiZWwgfHwgbWV0YS5uYW1lfX0gKHt7KG1vZGVsIHx8IFtdKS5sZW5ndGh9fSk8c3BhbiAqbmdJZj0ndmFsaWRhdGlvbnMucmVxdWlyZWQnIGNsYXNzPSdWbHQtcmVkJz4qPC9zcGFuPjwvbGFiZWw+XG4gIDxzbWFsbCBzdHlsZT0nbWFyZ2luLWJvdHRvbTogNHB4OycgKm5nSWY9J21ldGEuaGludCcgY2xhc3M9XCJWbHQtZm9ybV9fZWxlbWVudF9faGludFwiPnt7bWV0YS5oaW50fX08L3NtYWxsPlxuICA8aW5wdXQgY2xhc3M9J21vZGVsJyB0eXBlPSdoaWRkZW4nIFtyZXF1aXJlZF09J3ZhbGlkYXRpb25zLnJlcXVpcmVkJyBbKG5nTW9kZWwpXT0nbW9kZWwnICNmPSduZ01vZGVsJyBbbmFtZV09J25hbWUnIC8+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9J21vZGVsJz5cbiAgICA8ZGl2ICpuZ0Zvcj0nbGV0IGl0ZW0gb2YgbW9kZWw7IGxldCBpID0gaW5kZXg7JyBzdHlsZT0nZGlzcGxheTogZmxleDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXZnaXAtbWV0YS1zZXBhcmF0b3ItY29sb3IpOyc+XG4gICAgICA8dmdpcC1tZXRhLWZpZWxkIHN0eWxlPSdmbGV4OiAxOycgW2luZGV4XT0naScgW21ldGFdPSdjbG9uZUxpc3QnIFtwYXJlbnRdPSdpdGVtJyBbaW50ZWdyYXRpb25Db2RlXT0naW50ZWdyYXRpb25Db2RlJyBbcmVzb3VyY2VUeXBlXT0nbWV0YS5yZXNvdXJjZVR5cGUgfHwgcmVzb3VyY2VUeXBlJyB0aGVtZT0naW5oZXJpdCc+PC92Z2lwLW1ldGEtZmllbGQ+XG4gICAgICA8dmdpcC1tZXRhLWZpZWxkICpuZ0lmPSdtZXRhLnNlbGVjdGFibGUnIFttZXRhXT1cInsgbmFtZTogbWV0YS5zZWxlY3RhYmxlLm5hbWUsIGxhYmVsOiAnICcsIHR5cGU6ICdyYWRpbycsIG9wdGlvbnM6IFsgeyBpZDogbWV0YS5zZWxlY3RhYmxlLnZhbHVlLCBsYWJlbDogbWV0YS5zZWxlY3RhYmxlLmxhYmVsIH0gXSB9XCIgW3BhcmVudF09J2l0ZW0nIFtpbnRlZ3JhdGlvbkNvZGVdPSdpbnRlZ3JhdGlvbkNvZGUnIHRoZW1lPSdpbmhlcml0JyBzdHlsZT0nbWFyZ2luLWxlZnQ6IDEycHg7IG1hcmdpbi10b3A6IDEycHg7IG1hcmdpbi1yaWdodDogLTEycHg7Jz48L3ZnaXAtbWV0YS1maWVsZD5cbiAgICAgIDxkaXYgc3R5bGU9J3BhZGRpbmctbGVmdDogMTJweDsgbWFyZ2luLXRvcDogM3B4Oyc+XG4gICAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJyAoY2xpY2spPSdyZW1vdmUoaSknIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS1saW5rIGl0ZW0tcmVtb3ZlLWJ1dHRvblwiIFtkaXNhYmxlZF09J21vZGVsLmxlbmd0aCA9PT0gKHZhbGlkYXRpb25zLm1pbiB8fCAwKScgYXJpYS1sYWJlbD0nUmVtb3ZlJz5cbiAgICAgICAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1iaW5cIi8+PC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8YnV0dG9uICpuZ0lmPSchdmFsaWRhdGlvbnMubWF4IHx8ICFtb2RlbCB8fCBtb2RlbC5sZW5ndGggPCB2YWxpZGF0aW9ucy5tYXgnIHN0eWxlPSd3aWR0aDogMTAwJTsnIHR5cGU9J2J1dHRvbicgKGNsaWNrKT0nYWRkKCknIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS1zbWFsbCBWbHQtYnRuLS10ZXJ0aWFyeSBWbHQtYnRuLS1hcHAgVmx0LWJ0bi0tbm8tZm9jdXMgaXRlbS1hZGQtYnV0dG9uXCIgW2Rpc2FibGVkXT0ndmFsaWRhdGlvbnMubWF4ICYmIG1vZGVsICYmIG1vZGVsLmxlbmd0aCA9PT0gdmFsaWRhdGlvbnMubWF4Jz5cbiAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1wbHVzXCIvPjwvc3ZnPnt7bGlzdC5sYWJlbH19XG4gIDwvYnV0dG9uPlxuICA8c21hbGwgKm5nSWY9JyhmIHwgbWV0YU1vZGVsKS5fcGFyZW50LnN1Ym1pdHRlZCAmJiBmLmludmFsaWQnIGNsYXNzPVwiVmx0LWZvcm1fX2VsZW1lbnRfX2Vycm9yXCI+XG4gICAgPHNwYW4gKm5nSWY9XCJmLmVycm9ycy5yZXF1aXJlZFwiPlJlcXVpcmVkPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiZi5lcnJvcnMubWF4bGVuZ3RoXCI+TGVuZ3RoIGNhbiBub3QgZXhjZWVkIHt7dmFsaWRhdGlvbnMubWF4bGVuZ3RofX0gY2hhcmFjdGVyczwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cImYuZXJyb3JzLmN1c3RvbVwiPnt7Zi5lcnJvcnMuY3VzdG9tfX0mbmJzcDs8L3NwYW4+XG4gIDwvc21hbGw+XG4gIDxzbWFsbCAqbmdJZj0nbWV0YS5oZWxwVGV4dCcgY2xhc3M9XCJWbHQtZm9ybV9fZWxlbWVudF9faGludFwiPnt7bWV0YS5oZWxwVGV4dH19PC9zbWFsbD5cbjwvZGl2PlxuIiwiPGRpdiAqbmdGb3I9J2xldCBzZWN0aW9uIG9mIG1ldGEuc2VjdGlvbnMnIGNsYXNzPSdWbHQtc2VjdGlvbicgW25nQ2xhc3NdPVwieyBzaG93bjogc2hvd0FsbCB8fCBzZWN0aW9uLnZpc2libGUgfHwgKCFtZXRhLm9uZVRpbWVPcHRpb25hbCAmJiAhc2VjdGlvbi4kb3B0aW9uYWwpIHx8IChtZXRhLm9uZVRpbWVPcHRpb25hbCAmJiAhb3B0aW9uYWxGaWVsZHNDb3VudCkgfVwiPlxuXHQ8aDUgKm5nSWY9J3NlY3Rpb24ubGFiZWwnIGNsYXNzPVwiVmx0LXNlY3Rpb25fX3RpdGxlXCI+e3tzZWN0aW9uLmxhYmVsfX08L2g1PlxuXHQ8ZGl2IHN0eWxlPSdvdmVyZmxvdzogdmlzaWJsZTsnIFtuZ0NsYXNzXT1cInsgJ2Zvci1wcmV2aWV3JzogcHJldmlldyB9XCI+XG5cdFx0PHNtYWxsICpuZ0lmPSdzZWN0aW9uLmRlc2NyaXB0aW9uJyBjbGFzcz1cIlZsdC1mb3JtX19lbGVtZW50X19oaW50XCI+e3tzZWN0aW9uLmRlc2NyaXB0aW9ufX08L3NtYWxsPlxuXHRcdDxkaXY+XG5cdFx0XHQ8bmctY29udGFpbmVyICpuZ0Zvcj0nbGV0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzJz5cblx0XHRcdFx0PHZnaXAtbWV0YS1maWVsZCAqbmdJZj0nIWZpZWxkLiRoaWRkZW4gJiYgKHNob3dBbGwgfHwgc2VjdGlvbi52aXNpYmxlIHx8ICFmaWVsZC4kb3B0aW9uYWwpJyBbbWV0YV09J2ZpZWxkJyBbcGFyZW50XT0ncmVzb3VyY2UnIFtpbnRlZ3JhdGlvbkNvZGVdPSdpbnRlZ3JhdGlvbkNvZGUnIFtyZXNvdXJjZVR5cGVdPSdyZXNvdXJjZVR5cGUnIFtwcmV2aWV3XT0ncHJldmlldycgW25nQ2xhc3NdPVwieyBzaG93bjogIWZpZWxkLiRpbnZpc2libGUgJiYgKHNob3dBbGwgfHwgdHJ1ZSkgfVwiIHRoZW1lPSdpbmhlcml0JyBbYXR0ci5kYXRhLXRoZW1lXT0ndGhlbWUnPjwvdmdpcC1tZXRhLWZpZWxkPlxuXHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG48ZGl2ICpuZ0lmPSdpc1BlcnNpc3RlZFJlc291cmNlICYmIG1ldGEuY2hpbGRyZW4gJiYgcHJldmlldyc+XG5cdDxkaXYgKm5nRm9yPSdsZXQgY2hpbGQgb2YgbWV0YS5jaGlsZHJlbic+XG5cdFx0PGg1IGNsYXNzPSdWbHQtY2hpbGRyZW5fX3RpdGxlJz5cblx0XHRcdDxzdmcgY2xhc3M9XCJWbHQtaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1zdGFja1wiIC8+PC9zdmc+Jm5ic3A7XG5cdFx0XHR7e2NoaWxkLmxhYmVsfX0gPHNwYW4gY2xhc3M9J1ZsdC1ncmV5Jz4oe3socmVzb3VyY2VbY2hpbGQubmFtZV0gfHwgW10pLmxlbmd0aH19KTwvc3Bhbj5cblx0XHQ8L2g1PlxuXHRcdDxkaXYgKm5nRm9yPVwibGV0IGMgb2YgcmVzb3VyY2VbY2hpbGQubmFtZV1cIiBzdHlsZT0ncG9zaXRpb246IHJlbGF0aXZlOyc+XG5cblx0XHRcdDxkaXYgY2xhc3M9XCJWbHQtY2FyZCBWbHQtYmctd2hpdGVcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cIlZsdC1jYXJkX19jb250ZW50IFZsdC1idG4tb24taG92ZXJcIj5cblx0XHRcdFx0XHQ8aDU+e3tjaGlsZFJlc291cmNlQ2FyZExhYmVsKGMpfX08L2g1PlxuXHRcdFx0XHRcdDxkaXYgc3R5bGU9J2ZvbnQtc2l6ZTogMTJweDsgbGluZS1oZWlnaHQ6IDE2cHg7Jz5cblx0XHRcdFx0XHRcdENyZWF0ZWQ6IDxzcGFuIGNsYXNzPSdWbHQtYmxhY2snPnt7Yy5fdmdpcy5jcmVhdGVkRGF0ZSB8IGRhdGU6J21lZGl1bURhdGUnfX08L3NwYW4+XG5cdFx0XHRcdFx0XHRFZGl0ZWQ6IDxzcGFuIGNsYXNzPSdWbHQtYmxhY2snPnt7Yy5fdmdpcy5tb2RpZmllZERhdGUgfCBkYXRlOidtZWRpdW0nfX08L3NwYW4+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIlZsdC1iYWRnZSBWbHQtYmFkZ2UtLWFwcCBWbHQtYmFkZ2UtLXB1cnBsZSBWbHQtYmFkZ2UtLXNtYWxsXCI+e3tjLl92Z2lzLnJlc291cmNlVHlwZX19PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIlZsdC1idG4tZ3JvdXAgVmx0LWJ0bi1ncm91cC0taG92ZXJcIj5cblx0XHRcdFx0XHRcdDxhICpuZ0lmPSdjLl92Z2lzLmV4dGVybmFsTGluaycgYXR0ci5ocmVmPSd7e2MuX3ZnaXMuZXh0ZXJuYWxMaW5rfX0nIHRhcmdldD0nX2JsYW5rJyByZWw9J25vb3BlbmVyJyByZWw9J25vb3BlbmVyJyBjbGFzcz1cIlZsdC1idG4gVmx0LWJ0bi0tdGVydGlhcnkgVmx0LWJ0bi0taWNvblwiIGFyaWEtbGFiZWw9J09wZW4gZXh0ZXJuYWwnPjxzdmcgc3R5bGU9J21hcmdpbi1sZWZ0OiAwOyBtYXJnaW4tcmlnaHQ6IDA7Jz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tb3BlblwiLz48L3N2Zz48L2E+XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9J2J1dHRvbicgKGNsaWNrKT0nb3BlbkNoaWxkKGNoaWxkLCBjKScgY2xhc3M9XCJWbHQtYnRuIFZsdC1idG4tLXRlcnRpYXJ5IFZsdC1idG4tLWljb25cIj48c3ZnIHN0eWxlPSdtYXJnaW4tbGVmdDogMDsgbWFyZ2luLXJpZ2h0OiAwOyc+PHVzZSBhdHRyLnhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24te3sgY2hpbGQucmVmZXJlbmNlLmVkaXRhYmxlID8gJ2VkaXQnIDogJ2V5ZS1uZWdhdGl2ZScgfX1cIi8+PC9zdmc+PC9idXR0b24+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PGJ1dHRvbiBzdHlsZT0nd2lkdGg6IDEwMCU7IG1hcmdpbi10b3A6IDA7IG1heC13aWR0aDogMTAwJTsnIHR5cGU9J2J1dHRvbicgKGNsaWNrKT0nb3BlbkNoaWxkKGNoaWxkKScgY2xhc3M9XCJWbHQtYnRuIFZsdC1idG4tLXNtYWxsIFZsdC1idG4tLXNlY29uZGFyeVwiIFtkaXNhYmxlZF09J2NoaWxkLmNyZWF0YWJsZSA9PT0gZmFsc2UnPlxuXHRcdFx0PHN2Zz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tcGx1c1wiLz48L3N2Zz57e2NoaWxkLnJlZmVyZW5jZS5sYWJlbH19XG5cdFx0PC9idXR0b24+XG5cdDwvZGl2PlxuPC9kaXY+XG48ZGl2ICpuZ0lmPSchKG1ldGEub25lVGltZU9wdGlvbmFsICYmIHNob3dBbGwpJyBbbmdDbGFzc109J3sgY2VudGVyZWQ6ICFtZXRhLm9uZVRpbWVPcHRpb25hbCB9Jz5cblx0PGJ1dHRvbiAqbmdJZj0nIXByZXZpZXcgJiYgb3B0aW9uYWxGaWVsZHNDb3VudCcgdHlwZT0nYnV0dG9uJyAoY2xpY2spPSd0b2dnbGVPcHRpb25hbEZpZWxkcygpJyBjbGFzcz1cIlZsdC1idG4gVmx0LWJ0bi0tc21hbGwgVmx0LWJ0bi0tbGluayBtb3JlLWJ1dHRvblwiIHN0eWxlPSdtYXJnaW46IDA7IG1hcmdpbi1ib3R0b206IDEwcHg7Jz5cblx0XHQ8c3ZnPjx1c2UgYXR0ci54bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLWNoZXZyb24te3sgc2hvd0FsbCA/ICd1cCcgOiAnZG93bicgfX1cIi8+PC9zdmc+XG5cdFx0e3sgc2hvd0FsbCA/ICdIaWRlJyA6ICdTaG93JyB9fSBPcHRpb25hbCBGaWVsZHMgKHt7b3B0aW9uYWxGaWVsZHNDb3VudH19KVxuXHQ8L2J1dHRvbj5cbjwvZGl2PlxuIiwiPGRpdiAqbmdJZj0nZ2VuZXJhbEVycm9yJyBjbGFzcz1cIlZsdC1jYWxsb3V0IFZsdC1jYWxsb3V0LS1jcml0aWNhbFwiIHN0eWxlPSdvdmVyZmxvdzogYXV0bzsgbWFyZ2luOiAyMHB4Oyc+XG5cdDxpPjwvaT5cblx0PGRpdiBjbGFzcz1cIlZsdC1jYWxsb3V0X19jb250ZW50XCI+XG5cdFx0PHA+e3tnZW5lcmFsRXJyb3J9fTwvcD5cblx0PC9kaXY+XG48L2Rpdj5cbjxkaXYgKm5nSWY9JyFtZXRhJyBjbGFzcz1cIlZsdC1wcm9ncmVzc1wiPlxuXHQ8ZGl2IGNsYXNzPVwiVmx0LXByb2dyZXNzX19iYXJcIiBbbmdDbGFzc109XCJ7IGxvYWRpbmc6IG1ldGFMb2FkaW5nIH1cIiByb2xlPVwicHJvZ3Jlc3NiYXJcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWV0ZXh0PVwiTG9hZGluZyBNZXRhZGF0YVwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIj48L2Rpdj5cbjwvZGl2PlxuPGZvcm0gW3ZnaXBNZXRhRm9ybUF1dG9mb2N1c109JyFyZXNvdXJjZSB8fCAhcmVzb3VyY2UuZXh0ZXJuYWxJZCcgKm5nSWY9J21ldGEgJiYgIWdlbmVyYWxFcnJvcicgI3Jlc291cmNlRm9ybT1cIm5nRm9ybVwiIFtuYW1lXT0ncmVzb3VyY2UucmVzb3VyY2VUeXBlJyAobmdTdWJtaXQpPSdzdWJtaXQocmVzb3VyY2VGb3JtKScgbm92YWxpZGF0ZT5cblx0PGRpdiBjbGFzcz0nZm9ybS1jb250ZW50JyBzdHlsZT0nb3ZlcmZsb3c6IGhpZGRlbjsnPlxuXHRcdDxkaXYgW25nQ2xhc3NdPVwieyAnVmx0LWNhbGxvdXQtLWRpc21pc3NlZCc6ICFmb3JtRXJyb3JzIH1cIiBjbGFzcz1cIlZsdC1jYWxsb3V0IFZsdC1jYWxsb3V0LS1iYW5uZXIgVmx0LWNhbGxvdXQtLWNyaXRpY2FsXCI+XG5cdFx0XHQ8aT48L2k+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiVmx0LWNhbGxvdXRfX2NvbnRlbnRcIiBzdHlsZT1cIm1hcmdpbi10b3A6IGF1dG87XCI+XG5cdFx0XHRcdDxwPlRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIG9uZSBvciBtb3JlIGZpZWxkczwvcD5cblx0XHRcdFx0PHNtYWxsIHN0eWxlPSdmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDEuMGVtOycgKm5nSWY9J2Zvcm1FcnJvcnMnPnt7IGZvcm1FcnJvcnMubWVzc2FnZSB8fCBmb3JtRXJyb3JzIH19PC9zbWFsbD5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPVwiVmx0LWNhbGxvdXRfX2Rpc21pc3NcIiAoY2xpY2spPSdjbGVhckZvcm1FcnJvcnMoKScgYXJpYS1sYWJlbD1cIkRpc21pc3NcIj48L2J1dHRvbj5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwiVmx0LWNhcmRfX2NvbnRlbnRcIiBzdHlsZT0nbWluLWhlaWdodDogNDBweDsnPlxuXHRcdFx0PHZnaXAtbWV0YS1sYXlvdXQgKm5nSWY9J2VkaXQnIFttZXRhXT0nbWV0YS5sYXlvdXQnIFtyZXNvdXJjZV09J21vZGVsJyBbcHJldmlld109J2ZhbHNlJyBbaW50ZWdyYXRpb25dPSdtZXRhLmludGVncmF0aW9uJyBbdHlwZV09J3Jlc291cmNlLnJlc291cmNlVHlwZScgdGhlbWU9J2luaGVyaXQnPjwvdmdpcC1tZXRhLWxheW91dD5cblx0XHRcdDx2Z2lwLW1ldGEtbGF5b3V0ICpuZ0lmPSchZWRpdCcgW21ldGFdPSdtZXRhLmxheW91dCcgW3Jlc291cmNlXT0nbW9kZWwnIFtwcmV2aWV3XT0ndHJ1ZScgW2ludGVncmF0aW9uXT0nbWV0YS5pbnRlZ3JhdGlvbicgW3R5cGVdPSdyZXNvdXJjZS5yZXNvdXJjZVR5cGUnIHRoZW1lPSdpbmhlcml0Jz48L3ZnaXAtbWV0YS1sYXlvdXQ+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiVmx0LWNhcmRfX2Zvb3RlclwiPlxuXHRcdDxidXR0b24gY2xhc3M9XCJWbHQtYnRuIFZsdC1idG4tLXNlY29uZGFyeSBWbHQtYnRuLS1hcHAgVmx0LWJ0bi0tb3V0bGluZVwiIHR5cGU9J2J1dHRvbicgYXJpYS1sYWJlbD0nQ2FuY2VsJyAoY2xpY2spPSdjbG9zZSgpJz5cblx0XHRcdHt7IGVkaXQgPyAnQ2FuY2VsJyA6ICdDbG9zZScgfX1cblx0XHQ8L2J1dHRvbj5cblx0XHQ8YnV0dG9uICpuZ0lmPSdlZGl0JyBjbGFzcz1cIlZsdC1idG4gVmx0LWJ0bi0tYXBwXCIgW25nQ2xhc3NdPVwieyAnVmx0LWJ0bi0tcHJpbWFyeSc6IGlzUGVyc2lzdGVudCwgJ1ZsdC1idG4tLXNlY29uZGFyeSc6ICFpc1BlcnNpc3RlbnQgfVwiIHR5cGU9J3N1Ym1pdCc+XG5cdFx0XHR7eyAocmVzb3VyY2UgJiYgcmVzb3VyY2UuZXh0ZXJuYWxJZCkgPyAnVXBkYXRlJyA6ICdDcmVhdGUnIH19XG5cdFx0PC9idXR0b24+XG5cdFx0PGJ1dHRvbiAoY2xpY2spPSdlZGl0TW9kZSgpJyAqbmdJZj0nIWVkaXQgJiYgaXNFZGl0YWJsZScgW2Rpc2FibGVkXT0nIWlzRWRpdGFibGUnIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS1hcHAgVmx0LWJ0bi0tcHJpbWFyeVwiIHR5cGU9J2J1dHRvbicgYXJpYS1sYWJlbD0nRWRpdCc+XG5cdFx0XHRFZGl0XG5cdFx0PC9idXR0b24+XG5cdFx0PGRpdiBzdHlsZT0nbWFyZ2luLXJpZ2h0OiA4cHg7IGZsZXg6IDE7Jz5cblx0XHRcdDxkaXYgKm5nSWY9J21ldGEuYXZhaWxhYmxlTGF5b3V0cyAmJiBtZXRhLmF2YWlsYWJsZUxheW91dHMubGVuZ3RoJyBjbGFzcz1cIlZsdC1mb3JtX19lbGVtZW50IFZsdC1mb3JtX19lbGVtZW50LS1iaWdcIiBzdHlsZT0ncGFkZGluZzogMDsgbWFyZ2luOiAtOHB4IC0xOHB4IC04cHggMDsnPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiVmx0LXNlbGVjdFwiPlxuXHRcdFx0XHRcdDxsYWJlbCBzdHlsZT0nYWxsOiBpbmhlcml0Oyc+XG5cdFx0XHRcdFx0XHQ8c2VsZWN0IHN0eWxlPSdib3JkZXI6IDA7IG1hcmdpbi10b3A6IDNweDsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7JyAoY2hhbmdlKT0nY2hhbmdlTGF5b3V0KCknIFsobmdNb2RlbCldPSdjdXJyZW50TGF5b3V0SWQnIFtuZ01vZGVsT3B0aW9uc109J3sgc3RhbmRhbG9uZTogdHJ1ZSB9JyBbZGlzYWJsZWRdPSdpc1BlcnNpc3RlbnQnPlxuXHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHNlbGVjdGVkIGRpc2FibGVkPlNlbGVjdCBsYXlvdXQ8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0PG9wdGlvbiAqbmdGb3I9J2xldCBsYXlvdXQgb2YgbWV0YS5hdmFpbGFibGVMYXlvdXRzJyBbbmdWYWx1ZV09J2xheW91dC5pZCc+e3tsYXlvdXQubmFtZX19PC9vcHRpb24+XG5cdFx0XHRcdFx0XHQ8L3NlbGVjdD5cblx0XHRcdFx0XHRcdDxsYWJlbD5MYXlvdXQ8L2xhYmVsPlxuXHRcdFx0XHRcdDwvbGFiZWw+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cIlZsdC1kcm9wZG93biByZXNvdXJjZS1tZW51XCIgW25nQ2xhc3NdPVwieyAnVmx0LWRyb3Bkb3duLS1leHBhbmRlZCc6IHJlc291cmNlTWVudVZpc2libGUgfVwiIHN0eWxlPSdtYXJnaW4tbGVmdDogMnB4Oyc+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX19wYW5lbFwiIHN0eWxlPSdib3R0b206IDQwcHg7IHJpZ2h0OiAtNHB4OyB0b3A6IGluaXRpYWw7Jz5cblx0XHRcdFx0PGRpdiBjbGFzcz1cIlZsdC1kcm9wZG93bl9fcGFuZWxfX2NvbnRlbnRcIj5cblx0XHRcdFx0XHQ8YSBjbGFzcz1cIlZsdC1kcm9wZG93bl9fbGlua1wiIChjbGljayk9J2xvYWRNZXRhZGF0YShjdXJyZW50TGF5b3V0SWQsIHRydWUpJz5cblx0XHRcdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0XHRcdDxzdmcgY2xhc3M9J1ZsdC1pY29uIFZsdC1pY29uLS1zbWFsbGVyJz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tcmVmcmVzaFwiLz48L3N2Zz4mbmJzcDsmbmJzcDtSZWZyZXNoIG1ldGFkYXRhXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2E+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX190cmlnZ2VyXCI+XG5cdFx0XHRcdDxidXR0b24gdHlwZT0nYnV0dG9uJyAoY2xpY2spPSdvcGVuUmVzb3VyY2VNZW51KCknIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS1saW5rXCIgYXJpYS1sYWJlbD0nUmVzb3VyY2UgbWVudSc+XG5cdFx0XHRcdFx0PHN2ZyBjbGFzcz0nVmx0LWljb24gVmx0LWljb24tLXNtYWxsJyBzdHlsZT0nbWFyZ2luOiAwOyc+PHVzZSB4bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLW1vcmUtdi1uZWdhdGl2ZVwiLz48L3N2Zz5cblx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG48L2Zvcm0+XG48ZGl2IGNsYXNzPSdidXN5LW1hc2snIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBidXN5IH1cIj5cblx0PGRpdiBzdHlsZT0naGVpZ2h0OiAxMDAlOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsnPlxuXHRcdDxkaXYgY2xhc3M9XCJWbHQtc3Bpbm5lclwiPjwvZGl2PlxuXHQ8L2Rpdj5cbjwvZGl2PiIsIjxkaXYgY2xhc3M9XCJWbHQtY2FyZCBWbHQtYmctd2hpdGVcIj5cblx0PGRpdiBjbGFzcz1cIlZsdC1jYXJkX19jb250ZW50IFZsdC1idG4tb24taG92ZXJcIj5cblx0XHQ8aDU+e3ttb2RlbC5TdWJqZWN0IHx8IG1vZGVsLnN1YmplY3QgfHwgbW9kZWwuc3VtbWFyeSB8fCBtb2RlbC50aXRsZSB8fCBtb2RlbC5DYXNlTnVtYmVyIHx8IG1vZGVsLmNvbW1lbnQgfHwgbW9kZWwuYm9keSB8fCBtb2RlbC5uYW1lIHx8IG1vZGVsLnRvcGljIHx8ICcuLi4nIH19PC9oNT5cblx0XHQ8ZGl2IHN0eWxlPSdmb250LXNpemU6IDEycHg7IGxpbmUtaGVpZ2h0OiAxNnB4Oyc+XG5cdFx0XHRDcmVhdGVkOiA8c3BhbiBjbGFzcz0nVmx0LWJsYWNrJz57e21vZGVsLl92Z2lzLmNyZWF0ZWREYXRlIHwgZGF0ZTonbWVkaXVtRGF0ZSd9fTwvc3Bhbj5cblx0XHRcdEVkaXRlZDogPHNwYW4gY2xhc3M9J1ZsdC1ibGFjayc+e3ttb2RlbC5fdmdpcy5tb2RpZmllZERhdGUgfCBkYXRlOidtZWRpdW0nfX08L3NwYW4+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cIlZsdC1iYWRnZSBWbHQtYmFkZ2UtLWFwcCBWbHQtYmFkZ2UtLXB1cnBsZSBWbHQtYmFkZ2UtLXNtYWxsXCI+e3ttb2RlbC5fdmdpcy5yZXNvdXJjZVR5cGV9fTwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJWbHQtYnRuLWdyb3VwIFZsdC1idG4tZ3JvdXAtLWhvdmVyXCI+XG5cdFx0XHQ8YSAqbmdJZj0nbW9kZWwuX3ZnaXMuZXh0ZXJuYWxMaW5rJyBhdHRyLmhyZWY9J3t7bW9kZWwuX3ZnaXMuZXh0ZXJuYWxMaW5rfX0nIHRhcmdldD0nX2JsYW5rJyByZWw9J25vb3BlbmVyJyBjbGFzcz1cIlZsdC1idG4gVmx0LWJ0bi0tdGVydGlhcnkgVmx0LWJ0bi0taWNvblwiIGFyaWEtbGFiZWw9J09wZW4gZXh0ZXJuYWwnPjxzdmcgc3R5bGU9J21hcmdpbi1sZWZ0OiAwOyBtYXJnaW4tcmlnaHQ6IDA7Jz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tb3BlblwiLz48L3N2Zz48L2E+XG5cdFx0XHQ8YnV0dG9uIHR5cGU9J2J1dHRvbicgKGNsaWNrKT0nb3BlbihyZXNvdXJjZSwgbW9kZWwpJyBjbGFzcz1cIlZsdC1idG4gVmx0LWJ0bi0tdGVydGlhcnkgVmx0LWJ0bi0taWNvblwiIGFyaWEtbGFiZWw9J0VkaXQnPjxzdmcgc3R5bGU9J21hcmdpbi1sZWZ0OiAwOyBtYXJnaW4tcmlnaHQ6IDA7Jz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tZWRpdFwiLz48L3N2Zz48L2J1dHRvbj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG48L2Rpdj5cbiJdfQ==