@sumaris-net/ngx-components 18.5.14 → 18.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/doc/changelog.md +5 -0
  2. package/esm2022/public_api.mjs +10 -2
  3. package/esm2022/src/app/core/about/about.modal.mjs +5 -4
  4. package/esm2022/src/app/core/home/home.mjs +5 -5
  5. package/esm2022/src/app/core/home/home.module.mjs +7 -3
  6. package/esm2022/src/app/shared/file/url.utils.mjs +164 -0
  7. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +40 -28
  8. package/esm2022/src/app/shared/markdown/markdown.component.mjs +259 -0
  9. package/esm2022/src/app/shared/markdown/markdown.directive.mjs +34 -0
  10. package/esm2022/src/app/shared/markdown/markdown.modal.mjs +75 -0
  11. package/esm2022/src/app/shared/markdown/markdown.module.mjs +88 -0
  12. package/esm2022/src/app/shared/markdown/markdown.service.mjs +202 -0
  13. package/esm2022/src/app/shared/markdown/markdown.utils.mjs +78 -0
  14. package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +45 -0
  15. package/esm2022/src/app/shared/markdown/testing/markdown.testing.module.mjs +29 -0
  16. package/esm2022/src/app/shared/material/material.animations.mjs +31 -1
  17. package/esm2022/src/app/shared/pipes/pipes.module.mjs +5 -2
  18. package/esm2022/src/app/shared/pipes/string.pipes.mjs +17 -1
  19. package/esm2022/src/app/shared/shared.module.mjs +11 -9
  20. package/esm2022/src/app/shared/shared.testing.module.mjs +13 -5
  21. package/fesm2022/sumaris-net.ngx-components.mjs +6642 -5746
  22. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  23. package/package.json +2 -1
  24. package/public_api.d.ts +9 -1
  25. package/src/app/core/home/home.module.d.ts +2 -1
  26. package/src/app/shared/file/url.utils.d.ts +77 -0
  27. package/src/app/shared/image/gallery/image-gallery.component.d.ts +10 -1
  28. package/src/app/shared/inputs.d.ts +1 -1
  29. package/src/app/shared/markdown/markdown.component.d.ts +76 -0
  30. package/src/app/shared/markdown/markdown.directive.d.ts +13 -0
  31. package/src/app/shared/{help/help.modal.d.ts → markdown/markdown.modal.d.ts} +11 -12
  32. package/src/app/shared/markdown/markdown.module.d.ts +18 -0
  33. package/src/app/shared/markdown/markdown.service.d.ts +38 -0
  34. package/src/app/shared/markdown/markdown.utils.d.ts +25 -0
  35. package/src/app/shared/markdown/testing/markdown.test.d.ts +15 -0
  36. package/src/app/shared/markdown/testing/markdown.testing.module.d.ts +11 -0
  37. package/src/app/shared/material/material.animations.d.ts +1 -0
  38. package/src/app/shared/pipes/pipes.module.d.ts +1 -1
  39. package/src/app/shared/pipes/string.pipes.d.ts +5 -0
  40. package/src/app/shared/shared.module.d.ts +19 -19
  41. package/src/app/shared/shared.testing.module.d.ts +2 -1
  42. package/src/assets/manifest.json +1 -1
  43. package/esm2022/src/app/shared/help/help.modal.mjs +0 -86
@@ -0,0 +1,259 @@
1
+ import { booleanAttribute, ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Optional, Output, } from '@angular/core';
2
+ import { LocalSettingsService } from '../../core/services/local-settings.service';
3
+ import { TranslateService } from '@ngx-translate/core';
4
+ import { NetworkService } from '../../core/services/network.service';
5
+ import { HttpErrorResponse } from '@angular/common/http';
6
+ import { slideDownAnimation } from '../material/material.animations';
7
+ import { MarkdownService } from './markdown.service';
8
+ import { Subscription } from 'rxjs';
9
+ import { UrlUtils } from '../file/url.utils';
10
+ import { isNotEmptyArray, isNotNilOrBlank } from '../functions';
11
+ import { NavController } from '@ionic/angular';
12
+ import { MarkdownUtils } from './markdown.utils';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/router";
15
+ import * as i2 from "@angular/common";
16
+ import * as i3 from "@ionic/angular";
17
+ import * as i4 from "ngx-markdown";
18
+ import * as i5 from "../debug/debug.component";
19
+ import * as i6 from "./markdown.directive";
20
+ import * as i7 from "@ngx-translate/core";
21
+ export class AppMarkdownContent {
22
+ cd;
23
+ element;
24
+ route;
25
+ navController = inject(NavController);
26
+ settings = inject(LocalSettingsService);
27
+ translate = inject(TranslateService);
28
+ network = inject(NetworkService);
29
+ markdownService = inject(MarkdownService);
30
+ _clickSubscription;
31
+ loading = true;
32
+ error = undefined;
33
+ baseUrl;
34
+ _data;
35
+ _src;
36
+ _fallbackSrc;
37
+ _anchor;
38
+ _navHistory = [];
39
+ set data(value) {
40
+ this.setData(value);
41
+ }
42
+ get data() {
43
+ return this._data;
44
+ }
45
+ set src(value) {
46
+ this.setSrc(value);
47
+ }
48
+ get src() {
49
+ return this._src;
50
+ }
51
+ set anchor(value) {
52
+ this._anchor = value;
53
+ }
54
+ get anchor() {
55
+ return this._anchor;
56
+ }
57
+ debug;
58
+ showError = true;
59
+ animated = true;
60
+ enableNavigationHistory = true;
61
+ updateRouteLocation = false;
62
+ markdownUrlChange = new EventEmitter();
63
+ constructor(cd, element, route // Modal editor give 'null'
64
+ ) {
65
+ this.cd = cd;
66
+ this.element = element;
67
+ this.route = route;
68
+ // TODO: for DEV only
69
+ //this.debug = !environment.production;
70
+ }
71
+ ngOnDestroy() {
72
+ this._clickSubscription?.unsubscribe();
73
+ this.markdownService.resetBaseUrl();
74
+ }
75
+ goBack(event) {
76
+ console.debug('[markdown] Going back');
77
+ if (isNotEmptyArray(this._navHistory)) {
78
+ const { src, fallbackSrc, data, anchor } = this._navHistory.pop();
79
+ if (src)
80
+ this.setSrc(src, { fallbackSrc, anchor });
81
+ else
82
+ this.setData(data);
83
+ }
84
+ else {
85
+ this.navController.back();
86
+ }
87
+ }
88
+ get canGoBack() {
89
+ return isNotEmptyArray(this._navHistory);
90
+ }
91
+ setData(value, opts) {
92
+ const anchor = opts?.anchor || null;
93
+ if (this._data !== value || this._anchor !== anchor) {
94
+ if (value) {
95
+ // Save current state to navigation history
96
+ if (opts?.addToNavigationHistory) {
97
+ this._navHistory.push({
98
+ src: this._src,
99
+ fallbackSrc: this._fallbackSrc,
100
+ data: this._data,
101
+ anchor: this._anchor,
102
+ });
103
+ }
104
+ this._data = value;
105
+ this._anchor = anchor;
106
+ // Clear src
107
+ this._src = null;
108
+ this._fallbackSrc = null;
109
+ this.resetError();
110
+ this.markAsLoaded();
111
+ }
112
+ else {
113
+ this._data = null;
114
+ }
115
+ this.cd.markForCheck();
116
+ }
117
+ }
118
+ setSrc(src, opts) {
119
+ // Clean URL (remove fragment and query)
120
+ const anchor = opts?.anchor || UrlUtils.getFragment(src);
121
+ src = UrlUtils.stripFragmentAndQuery(src);
122
+ let fallbackSrc = opts?.fallbackSrc ? UrlUtils.stripFragmentAndQuery(opts.fallbackSrc) : null;
123
+ if (this._src !== src || this._fallbackSrc !== fallbackSrc || this._anchor !== anchor) {
124
+ const url = src ? src + (isNotNilOrBlank(anchor) ? `#${anchor}` : '') : null;
125
+ if (url)
126
+ console.debug(`[markdown] Loading ${url}...`);
127
+ // Give baseUrl to the service, to be able to resolve relative path - e.g. images)
128
+ if (src && UrlUtils.isExternalUrl(src)) {
129
+ this.baseUrl = UrlUtils.getParent(src);
130
+ this.markdownService.setBaseUrl(this.baseUrl);
131
+ }
132
+ if (src) {
133
+ // Save current state to navigation history
134
+ if (opts?.addToNavigationHistory) {
135
+ this._navHistory.push({
136
+ src: this._src,
137
+ fallbackSrc: this._fallbackSrc,
138
+ data: this._data,
139
+ anchor: this._anchor,
140
+ });
141
+ }
142
+ this._src = src;
143
+ this._fallbackSrc = fallbackSrc;
144
+ this._anchor = anchor;
145
+ // Clear data
146
+ this._data = null;
147
+ // Reset error
148
+ this.resetError();
149
+ this.markAsLoading();
150
+ }
151
+ else {
152
+ this._src = null;
153
+ this._fallbackSrc = null;
154
+ this._anchor = null;
155
+ this.cd.markForCheck();
156
+ }
157
+ }
158
+ }
159
+ onReady() {
160
+ const url = this._src ? this._src + (isNotNilOrBlank(this._anchor) ? `#${this._anchor}` : '') : null;
161
+ if (url) {
162
+ console.debug(`[markdown] Ready - ${url}`);
163
+ // Clear fallback (no more need)
164
+ if (this._fallbackSrc)
165
+ this._fallbackSrc = null;
166
+ // Emit change
167
+ this.markdownUrlChange.emit(url);
168
+ }
169
+ this.startListenClickEvents();
170
+ this.markAsLoaded();
171
+ // Scroll to anchor
172
+ if (isNotNilOrBlank(this._anchor)) {
173
+ this.markdownService.scrollToAnchor(this.element.nativeElement, this._anchor);
174
+ }
175
+ }
176
+ onLoadError(error) {
177
+ // Translate error
178
+ if (error instanceof HttpErrorResponse && this.network.offline) {
179
+ console.error(`[markdown] Error loading markdown URL {${this.src}} (offline: true): `, error);
180
+ this.error = 'NETWORK.INFO.OFFLINE';
181
+ }
182
+ else {
183
+ // Retry with fallback URL
184
+ if (this._fallbackSrc) {
185
+ console.debug(`[markdown] Error loading markdown URL {${this.src}} - fallback to URL ${this._fallbackSrc}`);
186
+ this.setSrc(this._fallbackSrc, { anchor: this._anchor });
187
+ return;
188
+ }
189
+ console.error(`[markdown] Error loading markdown URL {${this.src}} (offline: true): `, error);
190
+ this.error = 'ERROR.LOAD_DATA_ERROR';
191
+ }
192
+ this.markAsLoaded();
193
+ }
194
+ startListenClickEvents() {
195
+ this._clickSubscription?.unsubscribe();
196
+ this._clickSubscription = new Subscription();
197
+ // Listen for click link to Markdown URL
198
+ this._clickSubscription.add(this.markdownService.onClickMarkdownUrl.subscribe((href) => {
199
+ console.debug('[markdown] Received click event, on a markdown URL', href);
200
+ let fragment = UrlUtils.getFragment(href);
201
+ let url = UrlUtils.stripFragmentAndQuery(href);
202
+ let fallbackUrl = null;
203
+ // Resolve relative path
204
+ if (UrlUtils.isRelativeUrl(href) && this.baseUrl) {
205
+ // Get absolute url
206
+ url = MarkdownUtils.resolveRelativeUrl(this.baseUrl, href);
207
+ // Create a fallback url, in relative path was wrong
208
+ fallbackUrl = MarkdownUtils.resolveRelativeUrl(this.baseUrl, href, { absoluteByDefault: true });
209
+ fallbackUrl = url === fallbackUrl ? null : fallbackUrl;
210
+ }
211
+ // Opening the new URL
212
+ this.setSrc(url, { fallbackSrc: fallbackUrl, anchor: fragment, addToNavigationHistory: this.enableNavigationHistory });
213
+ }));
214
+ }
215
+ markAsLoaded() {
216
+ this.loading = false;
217
+ this.cd.markForCheck();
218
+ }
219
+ markAsLoading() {
220
+ this.loading = true;
221
+ this.cd.markForCheck();
222
+ }
223
+ resetError() {
224
+ this.error = null;
225
+ this.cd.markForCheck();
226
+ }
227
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownContent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.ActivatedRoute, optional: true }], target: i0.ɵɵFactoryTarget.Component });
228
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownContent, selector: "app-markdown-content", inputs: { data: "data", src: "src", anchor: "anchor", debug: ["debug", "debug", booleanAttribute], showError: ["showError", "showError", booleanAttribute], animated: ["animated", "animated", booleanAttribute], enableNavigationHistory: ["enableNavigationHistory", "enableNavigationHistory", booleanAttribute], updateRouteLocation: ["updateRouteLocation", "updateRouteLocation", booleanAttribute] }, outputs: { markdownUrlChange: "markdownUrlChange" }, ngImport: i0, template: "<app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n loading: {{ loading }}\n <br />\n error: {{ error }}\n <br />\n <br />\n baseUrl: {{ baseUrl }}\n <br />\n markdownUrl: {{ src }}\n <br />\n markdownFragment: {{ _anchor }}\n <br />\n markdownContent: {{ data }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n</app-debug>\n\n<!-- error -->\n@if (showError && error; as error) {\n <ion-item lines=\"none\" @slideDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n} @else {\n @if (data) {\n <markdown [data]=\"data\" (ready)=\"onReady()\" emoji></markdown>\n } @else if (src) {\n <markdown [src]=\"src\" (error)=\"onLoadError($event)\" (ready)=\"onReady()\" emoji></markdown>\n }\n}\n\n<!-- loading spinner -->\n@if (loading) {\n <div class=\"loading-spinner\">\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n </div>\n}\n\n<ng-template #loadingParagraph>\n <p>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 75%; margin-inline-start: 5%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n </p>\n</ng-template>\n", styles: [":host ::ng-deep markdown div.logo{display:none;visibility:hidden}:host ::ng-deep markdown blockquote{--block-margin: 16px 0;--block-padding: 4px 16px;--box-shadow: 0 2px 4px rgba(0, 0, 0, .4);display:block;position:relative;width:70%;margin:var(--block-margin);padding:var(--block-padding);font-style:italic;background:var(--ion-color-light);box-shadow:var(--box-shadow)}:host ::ng-deep markdown code{color:rgba(var(--ion-text-color-rgb),.7);background:rgba(var(--ion-text-color-rgb),.03);font-size:.9rem;letter-spacing:-.5px}.loading-spinner ion-skeleton-text{width:100%;height:1.5em}.loading-spinner p{margin-top:var(ion-padding, 16px)}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i4.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: i5.DebugComponent, selector: "app-debug", inputs: ["titlePrefix", "title", "enable", "expanded"] }, { kind: "directive", type: i6.MarkdownDirective, selector: "markdown,[markdown]" }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], animations: [slideDownAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
229
+ }
230
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownContent, decorators: [{
231
+ type: Component,
232
+ args: [{ selector: 'app-markdown-content', changeDetection: ChangeDetectionStrategy.OnPush, animations: [slideDownAnimation], template: "<app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n loading: {{ loading }}\n <br />\n error: {{ error }}\n <br />\n <br />\n baseUrl: {{ baseUrl }}\n <br />\n markdownUrl: {{ src }}\n <br />\n markdownFragment: {{ _anchor }}\n <br />\n markdownContent: {{ data }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n</app-debug>\n\n<!-- error -->\n@if (showError && error; as error) {\n <ion-item lines=\"none\" @slideDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n} @else {\n @if (data) {\n <markdown [data]=\"data\" (ready)=\"onReady()\" emoji></markdown>\n } @else if (src) {\n <markdown [src]=\"src\" (error)=\"onLoadError($event)\" (ready)=\"onReady()\" emoji></markdown>\n }\n}\n\n<!-- loading spinner -->\n@if (loading) {\n <div class=\"loading-spinner\">\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n </div>\n}\n\n<ng-template #loadingParagraph>\n <p>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 75%; margin-inline-start: 5%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n </p>\n</ng-template>\n", styles: [":host ::ng-deep markdown div.logo{display:none;visibility:hidden}:host ::ng-deep markdown blockquote{--block-margin: 16px 0;--block-padding: 4px 16px;--box-shadow: 0 2px 4px rgba(0, 0, 0, .4);display:block;position:relative;width:70%;margin:var(--block-margin);padding:var(--block-padding);font-style:italic;background:var(--ion-color-light);box-shadow:var(--box-shadow)}:host ::ng-deep markdown code{color:rgba(var(--ion-text-color-rgb),.7);background:rgba(var(--ion-text-color-rgb),.03);font-size:.9rem;letter-spacing:-.5px}.loading-spinner ion-skeleton-text{width:100%;height:1.5em}.loading-spinner p{margin-top:var(ion-padding, 16px)}\n"] }]
233
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.ActivatedRoute, decorators: [{
234
+ type: Optional
235
+ }] }], propDecorators: { data: [{
236
+ type: Input
237
+ }], src: [{
238
+ type: Input
239
+ }], anchor: [{
240
+ type: Input
241
+ }], debug: [{
242
+ type: Input,
243
+ args: [{ transform: booleanAttribute }]
244
+ }], showError: [{
245
+ type: Input,
246
+ args: [{ transform: booleanAttribute }]
247
+ }], animated: [{
248
+ type: Input,
249
+ args: [{ transform: booleanAttribute }]
250
+ }], enableNavigationHistory: [{
251
+ type: Input,
252
+ args: [{ transform: booleanAttribute }]
253
+ }], updateRouteLocation: [{
254
+ type: Input,
255
+ args: [{ transform: booleanAttribute }]
256
+ }], markdownUrlChange: [{
257
+ type: Output
258
+ }] } });
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWFya2Rvd24vbWFya2Rvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWFya2Rvd24vbWFya2Rvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7QUFnQmpELE1BQU0sT0FBTyxrQkFBa0I7SUFrRGpCO0lBQ0E7SUFDWTtJQW5EZCxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3RDLFFBQVEsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN4QyxTQUFTLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDckMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRTFDLGtCQUFrQixDQUFlO0lBQ2pDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDZixLQUFLLEdBQVcsU0FBUyxDQUFDO0lBRTFCLE9BQU8sQ0FBUztJQUVoQixLQUFLLENBQVM7SUFDZCxJQUFJLENBQVM7SUFDYixZQUFZLENBQVM7SUFDckIsT0FBTyxDQUFTO0lBRWhCLFdBQVcsR0FBNkUsRUFBRSxDQUFDO0lBRXJHLElBQWEsSUFBSSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFhLEdBQUcsQ0FBQyxLQUFhO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBYSxNQUFNLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFdUMsS0FBSyxDQUFVO0lBQ2YsU0FBUyxHQUFHLElBQUksQ0FBQztJQUNqQixRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ2hCLHVCQUF1QixHQUFHLElBQUksQ0FBQztJQUMvQixtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFFMUQsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUV6RCxZQUNZLEVBQXFCLEVBQ3JCLE9BQWdDLEVBQ3BCLEtBQXFCLENBQUMsMkJBQTJCOztRQUY3RCxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUNwQixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUUzQyxxQkFBcUI7UUFDckIsdUNBQXVDO0lBQ3pDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhO1FBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN2QyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNsRSxJQUFJLEdBQUc7Z0JBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQzs7Z0JBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFUyxPQUFPLENBQUMsS0FBYSxFQUFFLElBQTREO1FBQzNGLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDO1FBRXBDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNwRCxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLDJDQUEyQztnQkFDM0MsSUFBSSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7d0JBQ3BCLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSTt3QkFDZCxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7d0JBQzlCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSzt3QkFDaEIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO3FCQUNyQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7Z0JBRXRCLFlBQVk7Z0JBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUV6QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDcEIsQ0FBQztZQUNELElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFUyxNQUFNLENBQUMsR0FBVyxFQUFFLElBQWtGO1FBQzlHLHdDQUF3QztRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekQsR0FBRyxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLFdBQVcsR0FBRyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFOUYsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3RGLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzdFLElBQUksR0FBRztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxDQUFDO1lBRXZELGtGQUFrRjtZQUNsRixJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFFRCxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLDJDQUEyQztnQkFDM0MsSUFBSSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7d0JBQ3BCLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSTt3QkFDZCxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7d0JBQzlCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSzt3QkFDaEIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO3FCQUNyQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUV0QixhQUFhO2dCQUNiLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUVsQixjQUFjO2dCQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVTLE9BQU87UUFDZixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFckcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0MsZ0NBQWdDO1lBQ2hDLElBQUksSUFBSSxDQUFDLFlBQVk7Z0JBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFFaEQsY0FBYztZQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixtQkFBbUI7UUFDbkIsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hGLENBQUM7SUFDSCxDQUFDO0lBRVMsV0FBVyxDQUFDLEtBQXNCO1FBQzFDLGtCQUFrQjtRQUNsQixJQUFJLEtBQUssWUFBWSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9ELE9BQU8sQ0FBQyxLQUFLLENBQUMsMENBQTBDLElBQUksQ0FBQyxHQUFHLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlGLElBQUksQ0FBQyxLQUFLLEdBQUcsc0JBQXNCLENBQUM7UUFDdEMsQ0FBQzthQUFNLENBQUM7WUFDTiwwQkFBMEI7WUFDMUIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsMENBQTBDLElBQUksQ0FBQyxHQUFHLHVCQUF1QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDNUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPO1lBQ1QsQ0FBQztZQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMsMENBQTBDLElBQUksQ0FBQyxHQUFHLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlGLElBQUksQ0FBQyxLQUFLLEdBQUcsdUJBQXVCLENBQUM7UUFDdkMsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRVMsc0JBQXNCO1FBQzlCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU3Qyx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN6RCxPQUFPLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTFFLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQztZQUV2Qix3QkFBd0I7WUFDeEIsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakQsbUJBQW1CO2dCQUNuQixHQUFHLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBRTNELG9EQUFvRDtnQkFDcEQsV0FBVyxHQUFHLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2hHLFdBQVcsR0FBRyxHQUFHLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUN6RCxDQUFDO1lBRUQsc0JBQXNCO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUM7UUFDekgsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFUyxZQUFZO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVTLGFBQWE7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRVMsVUFBVTtRQUNsQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7d0dBL09VLGtCQUFrQjs0RkFBbEIsa0JBQWtCLG9IQXlDVCxnQkFBZ0IseUNBQ2hCLGdCQUFnQixzQ0FDaEIsZ0JBQWdCLG1GQUNoQixnQkFBZ0IsdUVBQ2hCLGdCQUFnQixrRkNwRnRDLCs1REF1REEsOHNGRGxCYyxDQUFDLGtCQUFrQixDQUFDOzs0RkFFckIsa0JBQWtCO2tCQVA5QixTQUFTOytCQUNFLHNCQUFzQixtQkFHZix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLENBQUMsa0JBQWtCLENBQUM7OzBCQXNEN0IsUUFBUTt5Q0FoQ0UsSUFBSTtzQkFBaEIsS0FBSztnQkFPTyxHQUFHO3NCQUFmLEtBQUs7Z0JBT08sTUFBTTtzQkFBbEIsS0FBSztnQkFPa0MsS0FBSztzQkFBNUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxTQUFTO3NCQUFoRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFFBQVE7c0JBQS9DLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsdUJBQXVCO3NCQUE5RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLG1CQUFtQjtzQkFBMUQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFNUIsaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBzbGlkZURvd25BbmltYXRpb24gfSBmcm9tICcuLi9tYXRlcmlhbC9tYXRlcmlhbC5hbmltYXRpb25zJztcbmltcG9ydCB7IE1hcmtkb3duU2VydmljZSB9IGZyb20gJy4vbWFya2Rvd24uc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFVybFV0aWxzIH0gZnJvbSAnLi4vZmlsZS91cmwudXRpbHMnO1xuaW1wb3J0IHsgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbE9yQmxhbmsgfSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgTmF2Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IE1hcmtkb3duVXRpbHMgfSBmcm9tICcuL21hcmtkb3duLnV0aWxzJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBBcHBNYXJrZG93bk9wdGlvbnMge1xuICBkYXRhPzogc3RyaW5nO1xuICBzcmM/OiBzdHJpbmc7XG4gIHNob3dFcnJvcj86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1tYXJrZG93bi1jb250ZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hcmtkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWFya2Rvd24uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGFuaW1hdGlvbnM6IFtzbGlkZURvd25BbmltYXRpb25dLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBNYXJrZG93bkNvbnRlbnQgaW1wbGVtZW50cyBBcHBNYXJrZG93bk9wdGlvbnMsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBuYXZDb250cm9sbGVyID0gaW5qZWN0KE5hdkNvbnRyb2xsZXIpO1xuICBwcm90ZWN0ZWQgc2V0dGluZ3MgPSBpbmplY3QoTG9jYWxTZXR0aW5nc1NlcnZpY2UpO1xuICBwcm90ZWN0ZWQgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICBwcm90ZWN0ZWQgbmV0d29yayA9IGluamVjdChOZXR3b3JrU2VydmljZSk7XG4gIHByb3RlY3RlZCBtYXJrZG93blNlcnZpY2UgPSBpbmplY3QoTWFya2Rvd25TZXJ2aWNlKTtcblxuICBwcm90ZWN0ZWQgX2NsaWNrU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBsb2FkaW5nID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIGVycm9yOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIGJhc2VVcmw6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgX2RhdGE6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9zcmM6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9mYWxsYmFja1NyYzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2FuY2hvcjogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBfbmF2SGlzdG9yeTogeyBzcmM/OiBzdHJpbmc7IGZhbGxiYWNrU3JjPzogc3RyaW5nOyBkYXRhPzogc3RyaW5nOyBhbmNob3I/OiBzdHJpbmcgfVtdID0gW107XG5cbiAgQElucHV0KCkgc2V0IGRhdGEodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0RGF0YSh2YWx1ZSk7XG4gIH1cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc3JjKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFNyYyh2YWx1ZSk7XG4gIH1cbiAgZ2V0IHNyYygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3JjO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGFuY2hvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYW5jaG9yID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGFuY2hvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fYW5jaG9yO1xuICB9XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRlYnVnOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0Vycm9yID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGFuaW1hdGVkID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZU5hdmlnYXRpb25IaXN0b3J5ID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHVwZGF0ZVJvdXRlTG9jYXRpb24gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgbWFya2Rvd25VcmxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCBlbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlIC8vIE1vZGFsIGVkaXRvciBnaXZlICdudWxsJ1xuICApIHtcbiAgICAvLyBUT0RPOiBmb3IgREVWIG9ubHlcbiAgICAvL3RoaXMuZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2NsaWNrU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubWFya2Rvd25TZXJ2aWNlLnJlc2V0QmFzZVVybCgpO1xuICB9XG5cbiAgZ29CYWNrKGV2ZW50PzogRXZlbnQpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbbWFya2Rvd25dIEdvaW5nIGJhY2snKTtcbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHRoaXMuX25hdkhpc3RvcnkpKSB7XG4gICAgICBjb25zdCB7IHNyYywgZmFsbGJhY2tTcmMsIGRhdGEsIGFuY2hvciB9ID0gdGhpcy5fbmF2SGlzdG9yeS5wb3AoKTtcbiAgICAgIGlmIChzcmMpIHRoaXMuc2V0U3JjKHNyYywgeyBmYWxsYmFja1NyYywgYW5jaG9yIH0pO1xuICAgICAgZWxzZSB0aGlzLnNldERhdGEoZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmF2Q29udHJvbGxlci5iYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNhbkdvQmFjaygpIHtcbiAgICByZXR1cm4gaXNOb3RFbXB0eUFycmF5KHRoaXMuX25hdkhpc3RvcnkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldERhdGEodmFsdWU6IHN0cmluZywgb3B0cz86IHsgYW5jaG9yPzogc3RyaW5nOyBhZGRUb05hdmlnYXRpb25IaXN0b3J5PzogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgYW5jaG9yID0gb3B0cz8uYW5jaG9yIHx8IG51bGw7XG5cbiAgICBpZiAodGhpcy5fZGF0YSAhPT0gdmFsdWUgfHwgdGhpcy5fYW5jaG9yICE9PSBhbmNob3IpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAvLyBTYXZlIGN1cnJlbnQgc3RhdGUgdG8gbmF2aWdhdGlvbiBoaXN0b3J5XG4gICAgICAgIGlmIChvcHRzPy5hZGRUb05hdmlnYXRpb25IaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5fbmF2SGlzdG9yeS5wdXNoKHtcbiAgICAgICAgICAgIHNyYzogdGhpcy5fc3JjLFxuICAgICAgICAgICAgZmFsbGJhY2tTcmM6IHRoaXMuX2ZhbGxiYWNrU3JjLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIGFuY2hvcjogdGhpcy5fYW5jaG9yLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9hbmNob3IgPSBhbmNob3I7XG5cbiAgICAgICAgLy8gQ2xlYXIgc3JjXG4gICAgICAgIHRoaXMuX3NyYyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2ZhbGxiYWNrU3JjID0gbnVsbDtcblxuICAgICAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0U3JjKHNyYzogc3RyaW5nLCBvcHRzPzogeyBmYWxsYmFja1NyYz86IHN0cmluZzsgYW5jaG9yPzogc3RyaW5nOyBhZGRUb05hdmlnYXRpb25IaXN0b3J5PzogYm9vbGVhbiB9KSB7XG4gICAgLy8gQ2xlYW4gVVJMIChyZW1vdmUgZnJhZ21lbnQgYW5kIHF1ZXJ5KVxuICAgIGNvbnN0IGFuY2hvciA9IG9wdHM/LmFuY2hvciB8fCBVcmxVdGlscy5nZXRGcmFnbWVudChzcmMpO1xuICAgIHNyYyA9IFVybFV0aWxzLnN0cmlwRnJhZ21lbnRBbmRRdWVyeShzcmMpO1xuICAgIGxldCBmYWxsYmFja1NyYyA9IG9wdHM/LmZhbGxiYWNrU3JjID8gVXJsVXRpbHMuc3RyaXBGcmFnbWVudEFuZFF1ZXJ5KG9wdHMuZmFsbGJhY2tTcmMpIDogbnVsbDtcblxuICAgIGlmICh0aGlzLl9zcmMgIT09IHNyYyB8fCB0aGlzLl9mYWxsYmFja1NyYyAhPT0gZmFsbGJhY2tTcmMgfHwgdGhpcy5fYW5jaG9yICE9PSBhbmNob3IpIHtcbiAgICAgIGNvbnN0IHVybCA9IHNyYyA/IHNyYyArIChpc05vdE5pbE9yQmxhbmsoYW5jaG9yKSA/IGAjJHthbmNob3J9YCA6ICcnKSA6IG51bGw7XG4gICAgICBpZiAodXJsKSBjb25zb2xlLmRlYnVnKGBbbWFya2Rvd25dIExvYWRpbmcgJHt1cmx9Li4uYCk7XG5cbiAgICAgIC8vIEdpdmUgYmFzZVVybCB0byB0aGUgc2VydmljZSwgdG8gYmUgYWJsZSB0byByZXNvbHZlIHJlbGF0aXZlIHBhdGggLSBlLmcuIGltYWdlcylcbiAgICAgIGlmIChzcmMgJiYgVXJsVXRpbHMuaXNFeHRlcm5hbFVybChzcmMpKSB7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IFVybFV0aWxzLmdldFBhcmVudChzcmMpO1xuICAgICAgICB0aGlzLm1hcmtkb3duU2VydmljZS5zZXRCYXNlVXJsKHRoaXMuYmFzZVVybCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgLy8gU2F2ZSBjdXJyZW50IHN0YXRlIHRvIG5hdmlnYXRpb24gaGlzdG9yeVxuICAgICAgICBpZiAob3B0cz8uYWRkVG9OYXZpZ2F0aW9uSGlzdG9yeSkge1xuICAgICAgICAgIHRoaXMuX25hdkhpc3RvcnkucHVzaCh7XG4gICAgICAgICAgICBzcmM6IHRoaXMuX3NyYyxcbiAgICAgICAgICAgIGZhbGxiYWNrU3JjOiB0aGlzLl9mYWxsYmFja1NyYyxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuX2RhdGEsXG4gICAgICAgICAgICBhbmNob3I6IHRoaXMuX2FuY2hvcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NyYyA9IHNyYztcbiAgICAgICAgdGhpcy5fZmFsbGJhY2tTcmMgPSBmYWxsYmFja1NyYztcbiAgICAgICAgdGhpcy5fYW5jaG9yID0gYW5jaG9yO1xuXG4gICAgICAgIC8vIENsZWFyIGRhdGFcbiAgICAgICAgdGhpcy5fZGF0YSA9IG51bGw7XG5cbiAgICAgICAgLy8gUmVzZXQgZXJyb3JcbiAgICAgICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3JjID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZmFsbGJhY2tTcmMgPSBudWxsO1xuICAgICAgICB0aGlzLl9hbmNob3IgPSBudWxsO1xuICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblJlYWR5KCkge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuX3NyYyA/IHRoaXMuX3NyYyArIChpc05vdE5pbE9yQmxhbmsodGhpcy5fYW5jaG9yKSA/IGAjJHt0aGlzLl9hbmNob3J9YCA6ICcnKSA6IG51bGw7XG5cbiAgICBpZiAodXJsKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGBbbWFya2Rvd25dIFJlYWR5IC0gJHt1cmx9YCk7XG4gICAgICAvLyBDbGVhciBmYWxsYmFjayAobm8gbW9yZSBuZWVkKVxuICAgICAgaWYgKHRoaXMuX2ZhbGxiYWNrU3JjKSB0aGlzLl9mYWxsYmFja1NyYyA9IG51bGw7XG5cbiAgICAgIC8vIEVtaXQgY2hhbmdlXG4gICAgICB0aGlzLm1hcmtkb3duVXJsQ2hhbmdlLmVtaXQodXJsKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXJ0TGlzdGVuQ2xpY2tFdmVudHMoKTtcblxuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG5cbiAgICAvLyBTY3JvbGwgdG8gYW5jaG9yXG4gICAgaWYgKGlzTm90TmlsT3JCbGFuayh0aGlzLl9hbmNob3IpKSB7XG4gICAgICB0aGlzLm1hcmtkb3duU2VydmljZS5zY3JvbGxUb0FuY2hvcih0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgdGhpcy5fYW5jaG9yKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Mb2FkRXJyb3IoZXJyb3I/OiBzdHJpbmcgfCBFcnJvcikge1xuICAgIC8vIFRyYW5zbGF0ZSBlcnJvclxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlICYmIHRoaXMubmV0d29yay5vZmZsaW5lKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbbWFya2Rvd25dIEVycm9yIGxvYWRpbmcgbWFya2Rvd24gVVJMIHske3RoaXMuc3JjfX0gKG9mZmxpbmU6IHRydWUpOiBgLCBlcnJvcik7XG4gICAgICB0aGlzLmVycm9yID0gJ05FVFdPUksuSU5GTy5PRkZMSU5FJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV0cnkgd2l0aCBmYWxsYmFjayBVUkxcbiAgICAgIGlmICh0aGlzLl9mYWxsYmFja1NyYykge1xuICAgICAgICBjb25zb2xlLmRlYnVnKGBbbWFya2Rvd25dIEVycm9yIGxvYWRpbmcgbWFya2Rvd24gVVJMIHske3RoaXMuc3JjfX0gLSBmYWxsYmFjayB0byBVUkwgJHt0aGlzLl9mYWxsYmFja1NyY31gKTtcbiAgICAgICAgdGhpcy5zZXRTcmModGhpcy5fZmFsbGJhY2tTcmMsIHsgYW5jaG9yOiB0aGlzLl9hbmNob3IgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5lcnJvcihgW21hcmtkb3duXSBFcnJvciBsb2FkaW5nIG1hcmtkb3duIFVSTCB7JHt0aGlzLnNyY319IChvZmZsaW5lOiB0cnVlKTogYCwgZXJyb3IpO1xuICAgICAgdGhpcy5lcnJvciA9ICdFUlJPUi5MT0FEX0RBVEFfRVJST1InO1xuICAgIH1cblxuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRMaXN0ZW5DbGlja0V2ZW50cygpIHtcbiAgICB0aGlzLl9jbGlja1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9jbGlja1N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIC8vIExpc3RlbiBmb3IgY2xpY2sgbGluayB0byBNYXJrZG93biBVUkxcbiAgICB0aGlzLl9jbGlja1N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLm1hcmtkb3duU2VydmljZS5vbkNsaWNrTWFya2Rvd25Vcmwuc3Vic2NyaWJlKChocmVmKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1ttYXJrZG93bl0gUmVjZWl2ZWQgY2xpY2sgZXZlbnQsIG9uIGEgbWFya2Rvd24gVVJMJywgaHJlZik7XG5cbiAgICAgICAgbGV0IGZyYWdtZW50ID0gVXJsVXRpbHMuZ2V0RnJhZ21lbnQoaHJlZik7XG4gICAgICAgIGxldCB1cmwgPSBVcmxVdGlscy5zdHJpcEZyYWdtZW50QW5kUXVlcnkoaHJlZik7XG4gICAgICAgIGxldCBmYWxsYmFja1VybCA9IG51bGw7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSByZWxhdGl2ZSBwYXRoXG4gICAgICAgIGlmIChVcmxVdGlscy5pc1JlbGF0aXZlVXJsKGhyZWYpICYmIHRoaXMuYmFzZVVybCkge1xuICAgICAgICAgIC8vIEdldCBhYnNvbHV0ZSB1cmxcbiAgICAgICAgICB1cmwgPSBNYXJrZG93blV0aWxzLnJlc29sdmVSZWxhdGl2ZVVybCh0aGlzLmJhc2VVcmwsIGhyZWYpO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgZmFsbGJhY2sgdXJsLCBpbiByZWxhdGl2ZSBwYXRoIHdhcyB3cm9uZ1xuICAgICAgICAgIGZhbGxiYWNrVXJsID0gTWFya2Rvd25VdGlscy5yZXNvbHZlUmVsYXRpdmVVcmwodGhpcy5iYXNlVXJsLCBocmVmLCB7IGFic29sdXRlQnlEZWZhdWx0OiB0cnVlIH0pO1xuICAgICAgICAgIGZhbGxiYWNrVXJsID0gdXJsID09PSBmYWxsYmFja1VybCA/IG51bGwgOiBmYWxsYmFja1VybDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wZW5pbmcgdGhlIG5ldyBVUkxcbiAgICAgICAgdGhpcy5zZXRTcmModXJsLCB7IGZhbGxiYWNrU3JjOiBmYWxsYmFja1VybCwgYW5jaG9yOiBmcmFnbWVudCwgYWRkVG9OYXZpZ2F0aW9uSGlzdG9yeTogdGhpcy5lbmFibGVOYXZpZ2F0aW9uSGlzdG9yeSB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrQXNMb2FkZWQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrQXNMb2FkaW5nKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEVycm9yKCkge1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxhcHAtZGVidWcgKm5nSWY9XCJkZWJ1Z1wiPlxuICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgIDxpb24tcm93PlxuICAgICAgPGlvbi1jb2w+XG4gICAgICAgIGxvYWRpbmc6IHt7IGxvYWRpbmcgfX1cbiAgICAgICAgPGJyIC8+XG4gICAgICAgIGVycm9yOiB7eyBlcnJvciB9fVxuICAgICAgICA8YnIgLz5cbiAgICAgICAgPGJyIC8+XG4gICAgICAgIGJhc2VVcmw6IHt7IGJhc2VVcmwgfX1cbiAgICAgICAgPGJyIC8+XG4gICAgICAgIG1hcmtkb3duVXJsOiB7eyBzcmMgfX1cbiAgICAgICAgPGJyIC8+XG4gICAgICAgIG1hcmtkb3duRnJhZ21lbnQ6IHt7IF9hbmNob3IgfX1cbiAgICAgICAgPGJyIC8+XG4gICAgICAgIG1hcmtkb3duQ29udGVudDoge3sgZGF0YSB9fVxuICAgICAgICA8YnIgLz5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gIDwvaW9uLWdyaWQ+XG48L2FwcC1kZWJ1Zz5cblxuPCEtLSBlcnJvciAtLT5cbkBpZiAoc2hvd0Vycm9yICYmIGVycm9yOyBhcyBlcnJvcikge1xuICA8aW9uLWl0ZW0gbGluZXM9XCJub25lXCIgQHNsaWRlRG93bkFuaW1hdGlvbj5cbiAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckhUTUxdPVwiZXJyb3IgfCB0cmFuc2xhdGVcIj48L2lvbi1sYWJlbD5cbiAgPC9pb24taXRlbT5cbn0gQGVsc2Uge1xuICBAaWYgKGRhdGEpIHtcbiAgICA8bWFya2Rvd24gW2RhdGFdPVwiZGF0YVwiIChyZWFkeSk9XCJvblJlYWR5KClcIiBlbW9qaT48L21hcmtkb3duPlxuICB9IEBlbHNlIGlmIChzcmMpIHtcbiAgICA8bWFya2Rvd24gW3NyY109XCJzcmNcIiAoZXJyb3IpPVwib25Mb2FkRXJyb3IoJGV2ZW50KVwiIChyZWFkeSk9XCJvblJlYWR5KClcIiBlbW9qaT48L21hcmtkb3duPlxuICB9XG59XG5cbjwhLS0gbG9hZGluZyBzcGlubmVyIC0tPlxuQGlmIChsb2FkaW5nKSB7XG4gIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1BhcmFncmFwaFwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nUGFyYWdyYXBoXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdQYXJhZ3JhcGhcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG59XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZ1BhcmFncmFwaD5cbiAgPHA+XG4gICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJhbmltYXRlZFwiIHN0eWxlPVwid2lkdGg6IDc1JTsgbWFyZ2luLWlubGluZS1zdGFydDogNSVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwiYW5pbWF0ZWRcIiBzdHlsZT1cIndpZHRoOiA4MCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwiYW5pbWF0ZWRcIiBzdHlsZT1cIndpZHRoOiA4MCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwiYW5pbWF0ZWRcIiBzdHlsZT1cIndpZHRoOiA4MCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwiYW5pbWF0ZWRcIiBzdHlsZT1cIndpZHRoOiA4MCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwiYW5pbWF0ZWRcIiBzdHlsZT1cIndpZHRoOiA4MCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICA8L3A+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -0,0 +1,34 @@
1
+ import { Directive, HostListener } from '@angular/core';
2
+ import { Subscription } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./markdown.service";
5
+ export class MarkdownDirective {
6
+ service;
7
+ element;
8
+ _subscription = new Subscription();
9
+ constructor(service, element) {
10
+ this.service = service;
11
+ this.element = element;
12
+ // DEBUG
13
+ //console.debug('[markdown] Creating markdown directive');
14
+ }
15
+ processAnchors() {
16
+ // Listening click events
17
+ this._subscription.add(this.service.listenClickEvents(this.element.nativeElement));
18
+ }
19
+ ngOnDestroy() {
20
+ this._subscription.unsubscribe();
21
+ }
22
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownDirective, deps: [{ token: i1.MarkdownService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
23
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: MarkdownDirective, selector: "markdown,[markdown]", host: { listeners: { "ready": "processAnchors()" } }, ngImport: i0 });
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownDirective, decorators: [{
26
+ type: Directive,
27
+ args: [{
28
+ selector: 'markdown,[markdown]',
29
+ }]
30
+ }], ctorParameters: () => [{ type: i1.MarkdownService }, { type: i0.ElementRef }], propDecorators: { processAnchors: [{
31
+ type: HostListener,
32
+ args: ['ready']
33
+ }] } });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWFya2Rvd24vbWFya2Rvd24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQUtwQyxNQUFNLE9BQU8saUJBQWlCO0lBSWxCO0lBQ0E7SUFKRixhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUUzQyxZQUNVLE9BQXdCLEVBQ3hCLE9BQWdDO1FBRGhDLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQ3hCLFlBQU8sR0FBUCxPQUFPLENBQXlCO1FBRXhDLFFBQVE7UUFDUiwwREFBMEQ7SUFDNUQsQ0FBQztJQUdNLGNBQWM7UUFDbkIseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDO3dHQW5CVSxpQkFBaUI7NEZBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFIN0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscUJBQXFCO2lCQUNoQzs2R0FhUSxjQUFjO3NCQURwQixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXJrZG93blNlcnZpY2UgfSBmcm9tICcuL21hcmtkb3duLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ21hcmtkb3duLFttYXJrZG93bl0nLFxufSlcbmV4cG9ydCBjbGFzcyBNYXJrZG93bkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNlcnZpY2U6IE1hcmtkb3duU2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICkge1xuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKCdbbWFya2Rvd25dIENyZWF0aW5nIG1hcmtkb3duIGRpcmVjdGl2ZScpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigncmVhZHknKVxuICBwdWJsaWMgcHJvY2Vzc0FuY2hvcnMoKSB7XG4gICAgLy8gTGlzdGVuaW5nIGNsaWNrIGV2ZW50c1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZXJ2aWNlLmxpc3RlbkNsaWNrRXZlbnRzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,75 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@ionic/angular";
4
+ import * as i2 from "../../core/services/platform.service";
5
+ import * as i3 from "../../core/services/local-settings.service";
6
+ import * as i4 from "@ngx-translate/core";
7
+ import * as i5 from "../../core/services/network.service";
8
+ import * as i6 from "../toolbar/modal-toolbar";
9
+ import * as i7 from "./markdown.component";
10
+ export class AppMarkdownModal {
11
+ injector;
12
+ viewCtrl;
13
+ platform;
14
+ settings;
15
+ translate;
16
+ network;
17
+ cd;
18
+ loading = true;
19
+ error = undefined;
20
+ debug;
21
+ title;
22
+ showError = true;
23
+ markdownContent;
24
+ markdownUrl;
25
+ static async show(modalCtrl, options) {
26
+ const modal = await modalCtrl.create({
27
+ component: AppMarkdownModal,
28
+ componentProps: options,
29
+ keyboardClose: true,
30
+ cssClass: options?.cssClass || 'modal-large',
31
+ });
32
+ await modal.present();
33
+ return modal.onWillDismiss();
34
+ }
35
+ constructor(injector, viewCtrl, platform, settings, translate, network, cd) {
36
+ this.injector = injector;
37
+ this.viewCtrl = viewCtrl;
38
+ this.platform = platform;
39
+ this.settings = settings;
40
+ this.translate = translate;
41
+ this.network = network;
42
+ this.cd = cd;
43
+ // TODO: for DEV only
44
+ //this.debug = !environment.production;
45
+ }
46
+ close(_) {
47
+ return this.viewCtrl.dismiss();
48
+ }
49
+ goBack(event, content) {
50
+ if (content?.canGoBack) {
51
+ content.goBack(event);
52
+ this.cd.markForCheck();
53
+ }
54
+ else {
55
+ this.close(event);
56
+ }
57
+ }
58
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownModal, deps: [{ token: i0.Injector }, { token: i1.ModalController }, { token: i2.PlatformService }, { token: i3.LocalSettingsService }, { token: i4.TranslateService }, { token: i5.NetworkService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
59
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppMarkdownModal, selector: "app-markdown-modal", inputs: { debug: "debug", title: "title", showError: "showError", markdownContent: "markdownContent", markdownUrl: "markdownUrl" }, ngImport: i0, template: "@if (title) {\n <app-modal-toolbar color=\"light\" [title]=\"title | translate\" (cancel)=\"close($event)\">\n @if (content.canGoBack) {\n <ion-button slot=\"start\" class=\"back-button\" (click)=\"goBack($event, content)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n }\n </app-modal-toolbar>\n}\n\n<ion-content class=\"ion-padding\">\n <app-markdown-content\n #content\n [src]=\"markdownUrl\"\n [data]=\"markdownContent\"\n [showError]=\"showError\"\n [debug]=\"debug\"\n [updateRouteLocation]=\"false\"\n ></app-markdown-content>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", dependencies: [{ kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i6.ModalToolbarComponent, selector: "app-modal-toolbar", inputs: ["modalName", "title", "color", "showSpinner", "canValidate", "validateIcon"], outputs: ["cancel", "validate"] }, { kind: "component", type: i7.AppMarkdownContent, selector: "app-markdown-content", inputs: ["data", "src", "anchor", "debug", "showError", "animated", "enableNavigationHistory", "updateRouteLocation"], outputs: ["markdownUrlChange"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
60
+ }
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppMarkdownModal, decorators: [{
62
+ type: Component,
63
+ args: [{ selector: 'app-markdown-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (title) {\n <app-modal-toolbar color=\"light\" [title]=\"title | translate\" (cancel)=\"close($event)\">\n @if (content.canGoBack) {\n <ion-button slot=\"start\" class=\"back-button\" (click)=\"goBack($event, content)\" routerDirection=\"back\">\n <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n }\n </app-modal-toolbar>\n}\n\n<ion-content class=\"ion-padding\">\n <app-markdown-content\n #content\n [src]=\"markdownUrl\"\n [data]=\"markdownContent\"\n [showError]=\"showError\"\n [debug]=\"debug\"\n [updateRouteLocation]=\"false\"\n ></app-markdown-content>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n" }]
64
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.ModalController }, { type: i2.PlatformService }, { type: i3.LocalSettingsService }, { type: i4.TranslateService }, { type: i5.NetworkService }, { type: i0.ChangeDetectorRef }], propDecorators: { debug: [{
65
+ type: Input
66
+ }], title: [{
67
+ type: Input
68
+ }], showError: [{
69
+ type: Input
70
+ }], markdownContent: [{
71
+ type: Input
72
+ }], markdownUrl: [{
73
+ type: Input
74
+ }] } });
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24ubW9kYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXJrZG93bi9tYXJrZG93bi5tb2RhbC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hcmtkb3duL21hcmtkb3duLm1vZGFsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQVksS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFxQnZHLE1BQU0sT0FBTyxnQkFBZ0I7SUF3QmY7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUE3QkYsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNmLEtBQUssR0FBVyxTQUFTLENBQUM7SUFFM0IsS0FBSyxDQUFVO0lBQ2YsS0FBSyxDQUFTO0lBQ2QsU0FBUyxHQUFHLElBQUksQ0FBQztJQUNqQixlQUFlLENBQVM7SUFDeEIsV0FBVyxDQUFTO0lBRTdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQTBCLEVBQUUsT0FBZ0M7UUFDNUUsTUFBTSxLQUFLLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQ25DLFNBQVMsRUFBRSxnQkFBZ0I7WUFDM0IsY0FBYyxFQUFFLE9BQU87WUFDdkIsYUFBYSxFQUFFLElBQUk7WUFDbkIsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYTtTQUM3QyxDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV0QixPQUFPLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsWUFDWSxRQUFrQixFQUNsQixRQUF5QixFQUN6QixRQUF5QixFQUN6QixRQUE4QixFQUM5QixTQUEyQixFQUMzQixPQUF1QixFQUN2QixFQUFxQjtRQU5yQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLGFBQVEsR0FBUixRQUFRLENBQXNCO1FBQzlCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBRS9CLHFCQUFxQjtRQUNyQix1Q0FBdUM7SUFDekMsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFTO1FBQ2IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBWSxFQUFFLE9BQTJCO1FBQzlDLElBQUksT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7d0dBL0NVLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLDhMQ3JCN0Isdy9CQStCQTs7NEZEVmEsZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLG9CQUFvQixtQkFFYix1QkFBdUIsQ0FBQyxNQUFNO3dRQU10QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdG9yLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgUGxhdGZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwTWFya2Rvd25Db250ZW50IH0gZnJvbSAnLi9tYXJrZG93bi5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcE1hcmtkb3duTW9kYWxPcHRpb25zIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIG1hcmtkb3duQ29udGVudD86IHN0cmluZztcbiAgbWFya2Rvd25Vcmw/OiBzdHJpbmc7XG4gIHNob3dFcnJvcj86IGJvb2xlYW47XG4gIGNzc0NsYXNzPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbWFya2Rvd24tbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2Rvd24ubW9kYWwuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBNYXJrZG93bk1vZGFsIGltcGxlbWVudHMgQXBwTWFya2Rvd25Nb2RhbE9wdGlvbnMge1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHRydWU7XG4gIHByb3RlY3RlZCBlcnJvcjogc3RyaW5nID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpIGRlYnVnOiBib29sZWFuO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBzaG93RXJyb3IgPSB0cnVlO1xuICBASW5wdXQoKSBtYXJrZG93bkNvbnRlbnQ6IHN0cmluZztcbiAgQElucHV0KCkgbWFya2Rvd25Vcmw6IHN0cmluZztcblxuICBzdGF0aWMgYXN5bmMgc2hvdyhtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlciwgb3B0aW9uczogQXBwTWFya2Rvd25Nb2RhbE9wdGlvbnMpIHtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IG1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBBcHBNYXJrZG93bk1vZGFsLFxuICAgICAgY29tcG9uZW50UHJvcHM6IG9wdGlvbnMsXG4gICAgICBrZXlib2FyZENsb3NlOiB0cnVlLFxuICAgICAgY3NzQ2xhc3M6IG9wdGlvbnM/LmNzc0NsYXNzIHx8ICdtb2RhbC1sYXJnZScsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBtb2RhbC5wcmVzZW50KCk7XG5cbiAgICByZXR1cm4gbW9kYWwub25XaWxsRGlzbWlzcygpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgdmlld0N0cmw6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IFBsYXRmb3JtU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgLy8gVE9ETzogZm9yIERFViBvbmx5XG4gICAgLy90aGlzLmRlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICBjbG9zZShfPzogRXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3Q3RybC5kaXNtaXNzKCk7XG4gIH1cblxuICBnb0JhY2soZXZlbnQ6IEV2ZW50LCBjb250ZW50OiBBcHBNYXJrZG93bkNvbnRlbnQpIHtcbiAgICBpZiAoY29udGVudD8uY2FuR29CYWNrKSB7XG4gICAgICBjb250ZW50LmdvQmFjayhldmVudCk7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsb3NlKGV2ZW50KTtcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAodGl0bGUpIHtcbiAgPGFwcC1tb2RhbC10b29sYmFyIGNvbG9yPVwibGlnaHRcIiBbdGl0bGVdPVwidGl0bGUgfCB0cmFuc2xhdGVcIiAoY2FuY2VsKT1cImNsb3NlKCRldmVudClcIj5cbiAgICBAaWYgKGNvbnRlbnQuY2FuR29CYWNrKSB7XG4gICAgICA8aW9uLWJ1dHRvbiBzbG90PVwic3RhcnRcIiBjbGFzcz1cImJhY2stYnV0dG9uXCIgKGNsaWNrKT1cImdvQmFjaygkZXZlbnQsIGNvbnRlbnQpXCIgcm91dGVyRGlyZWN0aW9uPVwiYmFja1wiPlxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJhcnJvdy1iYWNrXCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICB9XG4gIDwvYXBwLW1vZGFsLXRvb2xiYXI+XG59XG5cbjxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gIDxhcHAtbWFya2Rvd24tY29udGVudFxuICAgICNjb250ZW50XG4gICAgW3NyY109XCJtYXJrZG93blVybFwiXG4gICAgW2RhdGFdPVwibWFya2Rvd25Db250ZW50XCJcbiAgICBbc2hvd0Vycm9yXT1cInNob3dFcnJvclwiXG4gICAgW2RlYnVnXT1cImRlYnVnXCJcbiAgICBbdXBkYXRlUm91dGVMb2NhdGlvbl09XCJmYWxzZVwiXG4gID48L2FwcC1tYXJrZG93bi1jb250ZW50PlxuPC9pb24tY29udGVudD5cblxuPGlvbi1mb290ZXIgaGlkZGVuLXhzIGhpZGRlbi1zbSBoaWRkZW4tbW9iaWxlPlxuICA8aW9uLXRvb2xiYXI+XG4gICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPGlvbi1jb2w+PC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cInNvbGlkXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJjbG9zZSgpXCI+e3sgJ0NPTU1PTi5CVE5fQ0xPU0UnIHwgdHJhbnNsYXRlIH19PC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWZvb3Rlcj5cbiJdfQ==
@@ -0,0 +1,88 @@
1
+ // function that returns `MarkedOptions` with renderer override
2
+ import { MarkdownModule, MARKED_OPTIONS } from 'ngx-markdown';
3
+ import { NgModule, SecurityContext } from '@angular/core';
4
+ import { MarkdownService } from './markdown.service';
5
+ import { MarkdownDirective } from './markdown.directive';
6
+ import { HttpClient } from '@angular/common/http';
7
+ import { AppMarkdownModal } from './markdown.modal';
8
+ import { IonicModule } from '@ionic/angular';
9
+ import { TranslateModule } from '@ngx-translate/core';
10
+ import { SharedToolbarModule } from '../toolbar/toolbar.module';
11
+ import { CommonModule } from '@angular/common';
12
+ import { AppMarkdownContent } from './markdown.component';
13
+ import { SharedDebugModule } from '../debug/debug.module';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@ngx-translate/core";
16
+ import * as i2 from "ngx-markdown";
17
+ export class SharedMarkdownModule {
18
+ static forRoot(opts) {
19
+ console.debug('[markdown] Creating module (root)');
20
+ return {
21
+ ngModule: SharedMarkdownModule,
22
+ providers: [
23
+ MarkdownService,
24
+ MarkdownModule.forRoot({
25
+ loader: HttpClient, // Allow to load using [src]
26
+ sanitize: SecurityContext.NONE,
27
+ ...opts,
28
+ markedOptions: opts?.markedOptions || {
29
+ provide: MARKED_OPTIONS,
30
+ deps: [MarkdownService],
31
+ useFactory: (markdownService) => {
32
+ console.debug('[markdown] Creating marked options');
33
+ return {
34
+ renderer: markdownService.renderer,
35
+ gfm: true,
36
+ breaks: false,
37
+ pedantic: false,
38
+ smartLists: true,
39
+ smartypants: false,
40
+ };
41
+ },
42
+ },
43
+ }).providers,
44
+ ],
45
+ };
46
+ }
47
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SharedMarkdownModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
48
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: SharedMarkdownModule, declarations: [
49
+ // Component
50
+ AppMarkdownContent,
51
+ AppMarkdownModal,
52
+ // Directive
53
+ MarkdownDirective], imports: [CommonModule,
54
+ IonicModule, i1.TranslateModule, i2.MarkdownModule,
55
+ // App module
56
+ SharedToolbarModule,
57
+ SharedDebugModule], exports: [TranslateModule, MarkdownModule, AppMarkdownContent, MarkdownDirective] });
58
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SharedMarkdownModule, imports: [CommonModule,
59
+ IonicModule,
60
+ TranslateModule.forChild(),
61
+ MarkdownModule.forChild(),
62
+ // App module
63
+ SharedToolbarModule,
64
+ SharedDebugModule, TranslateModule, MarkdownModule] });
65
+ }
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SharedMarkdownModule, decorators: [{
67
+ type: NgModule,
68
+ args: [{
69
+ imports: [
70
+ CommonModule,
71
+ IonicModule,
72
+ TranslateModule.forChild(),
73
+ MarkdownModule.forChild(),
74
+ // App module
75
+ SharedToolbarModule,
76
+ SharedDebugModule,
77
+ ],
78
+ declarations: [
79
+ // Component
80
+ AppMarkdownContent,
81
+ AppMarkdownModal,
82
+ // Directive
83
+ MarkdownDirective,
84
+ ],
85
+ exports: [TranslateModule, MarkdownModule, AppMarkdownContent, MarkdownDirective],
86
+ }]
87
+ }] });
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWFya2Rvd24vbWFya2Rvd24ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCxPQUFPLEVBQUUsY0FBYyxFQUF3QixjQUFjLEVBQWlCLE1BQU0sY0FBYyxDQUFDO0FBQ25HLE9BQU8sRUFBdUIsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7O0FBc0IxRCxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBMkI7UUFDeEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBRW5ELE9BQU87WUFDTCxRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLFNBQVMsRUFBRTtnQkFDVCxlQUFlO2dCQUNmLGNBQWMsQ0FBQyxPQUFPLENBQUM7b0JBQ3JCLE1BQU0sRUFBRSxVQUFVLEVBQUUsNEJBQTRCO29CQUNoRCxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUk7b0JBQzlCLEdBQUcsSUFBSTtvQkFDUCxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWEsSUFBSTt3QkFDcEMsT0FBTyxFQUFFLGNBQWM7d0JBQ3ZCLElBQUksRUFBRSxDQUFDLGVBQWUsQ0FBQzt3QkFDdkIsVUFBVSxFQUFFLENBQUMsZUFBZ0MsRUFBRSxFQUFFOzRCQUMvQyxPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7NEJBQ3BELE9BQXNCO2dDQUNwQixRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVE7Z0NBQ2xDLEdBQUcsRUFBRSxJQUFJO2dDQUNULE1BQU0sRUFBRSxLQUFLO2dDQUNiLFFBQVEsRUFBRSxLQUFLO2dDQUNmLFVBQVUsRUFBRSxJQUFJO2dDQUNoQixXQUFXLEVBQUUsS0FBSzs2QkFDbkIsQ0FBQzt3QkFDSixDQUFDO3FCQUNGO2lCQUNGLENBQUMsQ0FBQyxTQUFTO2FBQ2I7U0FDRixDQUFDO0lBQ0osQ0FBQzt3R0E5QlUsb0JBQW9CO3lHQUFwQixvQkFBb0I7WUFSN0IsWUFBWTtZQUNaLGtCQUFrQjtZQUNsQixnQkFBZ0I7WUFDaEIsWUFBWTtZQUNaLGlCQUFpQixhQWRqQixZQUFZO1lBQ1osV0FBVztZQUlYLGFBQWE7WUFDYixtQkFBbUI7WUFDbkIsaUJBQWlCLGFBU1QsZUFBZSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUI7eUdBRXJFLG9CQUFvQixZQWxCN0IsWUFBWTtZQUNaLFdBQVc7WUFDWCxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQzFCLGNBQWMsQ0FBQyxRQUFRLEVBQUU7WUFFekIsYUFBYTtZQUNiLG1CQUFtQjtZQUNuQixpQkFBaUIsRUFTVCxlQUFlLEVBQUUsY0FBYzs7NEZBRTlCLG9CQUFvQjtrQkFwQmhDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxlQUFlLENBQUMsUUFBUSxFQUFFO3dCQUMxQixjQUFjLENBQUMsUUFBUSxFQUFFO3dCQUV6QixhQUFhO3dCQUNiLG1CQUFtQjt3QkFDbkIsaUJBQWlCO3FCQUNsQjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osWUFBWTt3QkFDWixrQkFBa0I7d0JBQ2xCLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixpQkFBaUI7cUJBQ2xCO29CQUNELE9BQU8sRUFBRSxDQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7aUJBQ2xGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZnVuY3Rpb24gdGhhdCByZXR1cm5zIGBNYXJrZWRPcHRpb25zYCB3aXRoIHJlbmRlcmVyIG92ZXJyaWRlXG5pbXBvcnQgeyBNYXJrZG93bk1vZHVsZSwgTWFya2Rvd25Nb2R1bGVDb25maWcsIE1BUktFRF9PUFRJT05TLCBNYXJrZWRPcHRpb25zIH0gZnJvbSAnbmd4LW1hcmtkb3duJztcbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlLCBTZWN1cml0eUNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hcmtkb3duU2VydmljZSB9IGZyb20gJy4vbWFya2Rvd24uc2VydmljZSc7XG5pbXBvcnQgeyBNYXJrZG93bkRpcmVjdGl2ZSB9IGZyb20gJy4vbWFya2Rvd24uZGlyZWN0aXZlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBBcHBNYXJrZG93bk1vZGFsIH0gZnJvbSAnLi9tYXJrZG93bi5tb2RhbCc7XG5pbXBvcnQgeyBJb25pY01vZHVsZSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU2hhcmVkVG9vbGJhck1vZHVsZSB9IGZyb20gJy4uL3Rvb2xiYXIvdG9vbGJhci5tb2R1bGUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFwcE1hcmtkb3duQ29udGVudCB9IGZyb20gJy4vbWFya2Rvd24uY29tcG9uZW50JztcbmltcG9ydCB7IFNoYXJlZERlYnVnTW9kdWxlIH0gZnJvbSAnLi4vZGVidWcvZGVidWcubW9kdWxlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBJb25pY01vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUuZm9yQ2hpbGQoKSxcbiAgICBNYXJrZG93bk1vZHVsZS5mb3JDaGlsZCgpLFxuXG4gICAgLy8gQXBwIG1vZHVsZVxuICAgIFNoYXJlZFRvb2xiYXJNb2R1bGUsXG4gICAgU2hhcmVkRGVidWdNb2R1bGUsXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIC8vIENvbXBvbmVudFxuICAgIEFwcE1hcmtkb3duQ29udGVudCxcbiAgICBBcHBNYXJrZG93bk1vZGFsLFxuICAgIC8vIERpcmVjdGl2ZVxuICAgIE1hcmtkb3duRGlyZWN0aXZlLFxuICBdLFxuICBleHBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLCBNYXJrZG93bk1vZHVsZSwgQXBwTWFya2Rvd25Db250ZW50LCBNYXJrZG93bkRpcmVjdGl2ZV0sXG59KVxuZXhwb3J0IGNsYXNzIFNoYXJlZE1hcmtkb3duTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3Qob3B0cz86IE1hcmtkb3duTW9kdWxlQ29uZmlnKTogTW9kdWxlV2l0aFByb3ZpZGVyczxTaGFyZWRNYXJrZG93bk1vZHVsZT4ge1xuICAgIGNvbnNvbGUuZGVidWcoJ1ttYXJrZG93bl0gQ3JlYXRpbmcgbW9kdWxlIChyb290KScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBTaGFyZWRNYXJrZG93bk1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBNYXJrZG93blNlcnZpY2UsXG4gICAgICAgIE1hcmtkb3duTW9kdWxlLmZvclJvb3Qoe1xuICAgICAgICAgIGxvYWRlcjogSHR0cENsaWVudCwgLy8gQWxsb3cgdG8gbG9hZCB1c2luZyBbc3JjXVxuICAgICAgICAgIHNhbml0aXplOiBTZWN1cml0eUNvbnRleHQuTk9ORSxcbiAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgIG1hcmtlZE9wdGlvbnM6IG9wdHM/Lm1hcmtlZE9wdGlvbnMgfHwge1xuICAgICAgICAgICAgcHJvdmlkZTogTUFSS0VEX09QVElPTlMsXG4gICAgICAgICAgICBkZXBzOiBbTWFya2Rvd25TZXJ2aWNlXSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IChtYXJrZG93blNlcnZpY2U6IE1hcmtkb3duU2VydmljZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbbWFya2Rvd25dIENyZWF0aW5nIG1hcmtlZCBvcHRpb25zJyk7XG4gICAgICAgICAgICAgIHJldHVybiA8TWFya2VkT3B0aW9ucz57XG4gICAgICAgICAgICAgICAgcmVuZGVyZXI6IG1hcmtkb3duU2VydmljZS5yZW5kZXJlcixcbiAgICAgICAgICAgICAgICBnZm06IHRydWUsXG4gICAgICAgICAgICAgICAgYnJlYWtzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwZWRhbnRpYzogZmFsc2UsXG4gICAgICAgICAgICAgICAgc21hcnRMaXN0czogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzbWFydHlwYW50czogZmFsc2UsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLnByb3ZpZGVycyxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIl19