@thescaffold/ngx-apps-blog 0.0.10

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 (54) hide show
  1. package/README.md +25 -0
  2. package/esm2022/lib/app.module.mjs +17 -0
  3. package/esm2022/lib/index.mjs +6 -0
  4. package/esm2022/lib/pages/article/article.component.mjs +82 -0
  5. package/esm2022/lib/pages/article/article.module.mjs +35 -0
  6. package/esm2022/lib/pages/docs/docs.component.mjs +386 -0
  7. package/esm2022/lib/pages/docs/docs.module.mjs +47 -0
  8. package/esm2022/lib/pages/error/error.component.mjs +75 -0
  9. package/esm2022/lib/pages/error/error.module.mjs +26 -0
  10. package/esm2022/lib/pages/home/home.component.mjs +49 -0
  11. package/esm2022/lib/pages/home/home.module.mjs +36 -0
  12. package/esm2022/lib/pages/pages.component.mjs +60 -0
  13. package/esm2022/lib/pages/pages.module.mjs +95 -0
  14. package/esm2022/lib/pkg/cards/card/card.component.mjs +763 -0
  15. package/esm2022/lib/pkg/cards/card/index.mjs +3 -0
  16. package/esm2022/lib/pkg/cards/cards.component.mjs +27 -0
  17. package/esm2022/lib/pkg/cards/cards.module.mjs +21 -0
  18. package/esm2022/lib/pkg/cards/cards.utils.mjs +2 -0
  19. package/esm2022/lib/pkg/cards/index.mjs +4 -0
  20. package/esm2022/lib/pkg/index.mjs +2 -0
  21. package/esm2022/public-api.mjs +5 -0
  22. package/esm2022/thescaffold-ngx-apps-blog.mjs +5 -0
  23. package/fesm2022/thescaffold-ngx-apps-blog-article.module-BnLR8e24.mjs +114 -0
  24. package/fesm2022/thescaffold-ngx-apps-blog-article.module-BnLR8e24.mjs.map +1 -0
  25. package/fesm2022/thescaffold-ngx-apps-blog-docs.module-DRQ-g0-1.mjs +430 -0
  26. package/fesm2022/thescaffold-ngx-apps-blog-docs.module-DRQ-g0-1.mjs.map +1 -0
  27. package/fesm2022/thescaffold-ngx-apps-blog-error.module-BzAoFNog.mjs +99 -0
  28. package/fesm2022/thescaffold-ngx-apps-blog-error.module-BzAoFNog.mjs.map +1 -0
  29. package/fesm2022/thescaffold-ngx-apps-blog-home.module-CG11DLKD.mjs +876 -0
  30. package/fesm2022/thescaffold-ngx-apps-blog-home.module-CG11DLKD.mjs.map +1 -0
  31. package/fesm2022/thescaffold-ngx-apps-blog.mjs +178 -0
  32. package/fesm2022/thescaffold-ngx-apps-blog.mjs.map +1 -0
  33. package/index.d.ts +5 -0
  34. package/lib/app.module.d.ts +8 -0
  35. package/lib/index.d.ts +5 -0
  36. package/lib/pages/article/article.component.d.ts +11 -0
  37. package/lib/pages/article/article.module.d.ts +10 -0
  38. package/lib/pages/docs/docs.component.d.ts +17 -0
  39. package/lib/pages/docs/docs.module.d.ts +10 -0
  40. package/lib/pages/error/error.component.d.ts +11 -0
  41. package/lib/pages/error/error.module.d.ts +10 -0
  42. package/lib/pages/home/home.component.d.ts +7 -0
  43. package/lib/pages/home/home.module.d.ts +11 -0
  44. package/lib/pages/pages.component.d.ts +9 -0
  45. package/lib/pages/pages.module.d.ts +11 -0
  46. package/lib/pkg/cards/card/card.component.d.ts +9 -0
  47. package/lib/pkg/cards/card/index.d.ts +2 -0
  48. package/lib/pkg/cards/cards.component.d.ts +7 -0
  49. package/lib/pkg/cards/cards.module.d.ts +10 -0
  50. package/lib/pkg/cards/cards.utils.d.ts +29 -0
  51. package/lib/pkg/cards/index.d.ts +3 -0
  52. package/lib/pkg/index.d.ts +1 -0
  53. package/package.json +33 -0
  54. package/public-api.d.ts +1 -0
package/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # Ngx Apps
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.0.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project blog` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project blog`.
8
+
9
+ > Note: Don't forget to add `--project blog` or else it will be added to the default project in your `angular.json` file.
10
+
11
+ ## Build
12
+
13
+ Run `ng build blog` to build the project. The build artifacts will be stored in the `dist/` directory.
14
+
15
+ ## Publishing
16
+
17
+ After building your library with `ng build blog`, go to the dist folder `cd dist/blog` and run `npm publish`.
18
+
19
+ ## Running unit tests
20
+
21
+ Run `ng test blog` to execute the unit tests via [Karma](https://karma-runner.github.io).
22
+
23
+ ## Further help
24
+
25
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,17 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { AppModuleDirective } from '@thescaffold/ngx-common';
3
+ import { PagesModule } from './pages/pages.module';
4
+ import * as i0 from "@angular/core";
5
+ export class AppModule extends AppModuleDirective {
6
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AppModule, deps: null, target: i0.ɵɵFactoryTarget.NgModule }); }
7
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.5", ngImport: i0, type: AppModule, imports: [PagesModule], exports: [PagesModule] }); }
8
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AppModule, imports: [PagesModule, PagesModule] }); }
9
+ }
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AppModule, decorators: [{
11
+ type: NgModule,
12
+ args: [{
13
+ imports: [PagesModule],
14
+ exports: [PagesModule],
15
+ }]
16
+ }] });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Jsb2cvc3JjL2xpYi9hcHAubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQU1uRCxNQUFNLE9BQU8sU0FBVSxTQUFRLGtCQUFrQjs4R0FBcEMsU0FBUzsrR0FBVCxTQUFTLFlBSFYsV0FBVyxhQUNYLFdBQVc7K0dBRVYsU0FBUyxZQUhWLFdBQVcsRUFDWCxXQUFXOzsyRkFFVixTQUFTO2tCQUpyQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQztvQkFDdEIsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDO2lCQUN2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBcHBNb2R1bGVEaXJlY3RpdmUgfSBmcm9tICdAdGhlc2NhZmZvbGQvbmd4LWNvbW1vbic7XG5pbXBvcnQgeyBQYWdlc01vZHVsZSB9IGZyb20gJy4vcGFnZXMvcGFnZXMubW9kdWxlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1BhZ2VzTW9kdWxlXSxcbiAgZXhwb3J0czogW1BhZ2VzTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwTW9kdWxlIGV4dGVuZHMgQXBwTW9kdWxlRGlyZWN0aXZlIHt9XG4iXX0=
@@ -0,0 +1,6 @@
1
+ export { AppModule as BlogAppModule } from './app.module';
2
+ export { PagesModule } from './pages/pages.module';
3
+ export const routes = {
4
+ root: ['/', 'blog'],
5
+ };
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ibG9nL3NyYy9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsSUFBSSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0NBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBBcHBNb2R1bGUgYXMgQmxvZ0FwcE1vZHVsZSB9IGZyb20gJy4vYXBwLm1vZHVsZSc7XG5leHBvcnQgeyBQYWdlc01vZHVsZSB9IGZyb20gJy4vcGFnZXMvcGFnZXMubW9kdWxlJztcblxuZXhwb3J0IGNvbnN0IHJvdXRlcyA9IHtcbiAgcm9vdDogWycvJywgJ2Jsb2cnXSxcbn07XG4iXX0=
@@ -0,0 +1,82 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { ActivatedRoute } from '@angular/router';
3
+ import { MediaService } from '@thescaffold/ngx-core';
4
+ import { switchMap } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@angular/router";
8
+ import * as i3 from "@thescaffold/ngx-ui";
9
+ import * as i4 from "@thescaffold/ngx-core";
10
+ export class ArticleComponent {
11
+ constructor() {
12
+ this.route = inject(ActivatedRoute);
13
+ this.mediaService = inject(MediaService);
14
+ this.article$ = this.route.params.pipe(switchMap((params) => {
15
+ this.category = params['category'];
16
+ this.title = params['article'];
17
+ const name = this.category
18
+ ? `${this.category}/${this.title}`
19
+ : `${this.title}`;
20
+ return this.mediaService.context('blog').article(name);
21
+ }));
22
+ }
23
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: ArticleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.5", type: ArticleComponent, selector: "x-article", ngImport: i0, template: `
25
+ <div *ngIf="article$ | async as article; else empty" class="">
26
+ <div class="">
27
+ <nav>
28
+ <ol *ngIf="title" class="breadcrumb">
29
+ <li class="breadcrumb-item">
30
+ <a [routerLink]="'blog.root' | xRoute">{{
31
+ 'apps.blog.component.article.home.title' | xTranslate
32
+ }}</a>
33
+ </li>
34
+ <li *ngIf="category" class="breadcrumb-item">{{ category }}</li>
35
+ <li *ngIf="title" class="breadcrumb-item">{{ title }}</li>
36
+ </ol>
37
+ </nav>
38
+ </div>
39
+ <div [innerHTML]="article" class="w-75"></div>
40
+ </div>
41
+
42
+ <!-- misc -->
43
+ <ng-template #loader>
44
+ <x-element-loader></x-element-loader>
45
+ </ng-template>
46
+
47
+ <ng-template #empty>
48
+ <x-element-blank></x-element-blank>
49
+ </ng-template>
50
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.BlankComponent, selector: "x-element-blank", inputs: ["image", "icon", "type"] }, { kind: "component", type: i3.LoaderComponent, selector: "x-element-loader", inputs: ["data"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.RoutePipe, name: "xRoute" }, { kind: "pipe", type: i4.TranslatePipe, name: "xTranslate" }] }); }
51
+ }
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: ArticleComponent, decorators: [{
53
+ type: Component,
54
+ args: [{ selector: 'x-article', template: `
55
+ <div *ngIf="article$ | async as article; else empty" class="">
56
+ <div class="">
57
+ <nav>
58
+ <ol *ngIf="title" class="breadcrumb">
59
+ <li class="breadcrumb-item">
60
+ <a [routerLink]="'blog.root' | xRoute">{{
61
+ 'apps.blog.component.article.home.title' | xTranslate
62
+ }}</a>
63
+ </li>
64
+ <li *ngIf="category" class="breadcrumb-item">{{ category }}</li>
65
+ <li *ngIf="title" class="breadcrumb-item">{{ title }}</li>
66
+ </ol>
67
+ </nav>
68
+ </div>
69
+ <div [innerHTML]="article" class="w-75"></div>
70
+ </div>
71
+
72
+ <!-- misc -->
73
+ <ng-template #loader>
74
+ <x-element-loader></x-element-loader>
75
+ </ng-template>
76
+
77
+ <ng-template #empty>
78
+ <x-element-blank></x-element-blank>
79
+ </ng-template>
80
+ ` }]
81
+ }] });
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWNsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ibG9nL3NyYy9saWIvcGFnZXMvYXJ0aWNsZS9hcnRpY2xlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQWlDN0MsTUFBTSxPQUFPLGdCQUFnQjtJQS9CN0I7UUFnQ21CLFVBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0IsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFJckQsYUFBUSxHQUFvQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2hELFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRO2dCQUN4QixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2xDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FDSCxDQUFDO0tBQ0g7OEdBaEJZLGdCQUFnQjtrR0FBaEIsZ0JBQWdCLGlEQTdCakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJUOzsyRkFHVSxnQkFBZ0I7a0JBL0I1QixTQUFTOytCQUNFLFdBQVcsWUFDWDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTWVkaWFTZXJ2aWNlIH0gZnJvbSAnQHRoZXNjYWZmb2xkL25neC1jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd4LWFydGljbGUnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgKm5nSWY9XCJhcnRpY2xlJCB8IGFzeW5jIGFzIGFydGljbGU7IGVsc2UgZW1wdHlcIiBjbGFzcz1cIlwiPlxuICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICA8bmF2PlxuICAgICAgICAgIDxvbCAqbmdJZj1cInRpdGxlXCIgY2xhc3M9XCJicmVhZGNydW1iXCI+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJicmVhZGNydW1iLWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiJ2Jsb2cucm9vdCcgfCB4Um91dGVcIj57e1xuICAgICAgICAgICAgICAgICdhcHBzLmJsb2cuY29tcG9uZW50LmFydGljbGUuaG9tZS50aXRsZScgfCB4VHJhbnNsYXRlXG4gICAgICAgICAgICAgIH19PC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaSAqbmdJZj1cImNhdGVnb3J5XCIgY2xhc3M9XCJicmVhZGNydW1iLWl0ZW1cIj57eyBjYXRlZ29yeSB9fTwvbGk+XG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJ0aXRsZVwiIGNsYXNzPVwiYnJlYWRjcnVtYi1pdGVtXCI+e3sgdGl0bGUgfX08L2xpPlxuICAgICAgICAgIDwvb2w+XG4gICAgICAgIDwvbmF2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiYXJ0aWNsZVwiIGNsYXNzPVwidy03NVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBtaXNjIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjbG9hZGVyPlxuICAgICAgPHgtZWxlbWVudC1sb2FkZXI+PC94LWVsZW1lbnQtbG9hZGVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2VtcHR5PlxuICAgICAgPHgtZWxlbWVudC1ibGFuaz48L3gtZWxlbWVudC1ibGFuaz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBBcnRpY2xlQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVkaWFTZXJ2aWNlID0gaW5qZWN0KE1lZGlhU2VydmljZSk7XG5cbiAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBhcnRpY2xlJDogT2JzZXJ2YWJsZTxhbnk+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBzd2l0Y2hNYXAoKHBhcmFtcykgPT4ge1xuICAgICAgdGhpcy5jYXRlZ29yeSA9IHBhcmFtc1snY2F0ZWdvcnknXTtcbiAgICAgIHRoaXMudGl0bGUgPSBwYXJhbXNbJ2FydGljbGUnXTtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmNhdGVnb3J5XG4gICAgICAgID8gYCR7dGhpcy5jYXRlZ29yeX0vJHt0aGlzLnRpdGxlfWBcbiAgICAgICAgOiBgJHt0aGlzLnRpdGxlfWA7XG4gICAgICByZXR1cm4gdGhpcy5tZWRpYVNlcnZpY2UuY29udGV4dCgnYmxvZycpLmFydGljbGUobmFtZSk7XG4gICAgfSksXG4gICk7XG59XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { RouterModule } from '@angular/router';
3
+ import { SharedModule } from '@thescaffold/ngx-core';
4
+ import { ElementsModule, LayoutsModule } from '@thescaffold/ngx-ui';
5
+ import { ArticleComponent } from './article.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/router";
8
+ export class ArticleModule {
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: ArticleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.5", ngImport: i0, type: ArticleModule, declarations: [ArticleComponent], imports: [SharedModule, i1.RouterModule, LayoutsModule,
11
+ ElementsModule] }); }
12
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: ArticleModule, imports: [SharedModule,
13
+ RouterModule.forChild([
14
+ { path: ':category/:article', component: ArticleComponent },
15
+ { path: ':article', component: ArticleComponent },
16
+ ]),
17
+ LayoutsModule,
18
+ ElementsModule] }); }
19
+ }
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: ArticleModule, decorators: [{
21
+ type: NgModule,
22
+ args: [{
23
+ declarations: [ArticleComponent],
24
+ imports: [
25
+ SharedModule,
26
+ RouterModule.forChild([
27
+ { path: ':category/:article', component: ArticleComponent },
28
+ { path: ':article', component: ArticleComponent },
29
+ ]),
30
+ LayoutsModule,
31
+ ElementsModule,
32
+ ],
33
+ }]
34
+ }] });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWNsZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ibG9nL3NyYy9saWIvcGFnZXMvYXJ0aWNsZS9hcnRpY2xlLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBY3ZELE1BQU0sT0FBTyxhQUFhOzhHQUFiLGFBQWE7K0dBQWIsYUFBYSxpQkFYVCxnQkFBZ0IsYUFFN0IsWUFBWSxtQkFLWixhQUFhO1lBQ2IsY0FBYzsrR0FHTCxhQUFhLFlBVHRCLFlBQVk7WUFDWixZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUNwQixFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzNELEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7YUFDbEQsQ0FBQztZQUNGLGFBQWE7WUFDYixjQUFjOzsyRkFHTCxhQUFhO2tCQVp6QixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLGdCQUFnQixDQUFDO29CQUNoQyxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixZQUFZLENBQUMsUUFBUSxDQUFDOzRCQUNwQixFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7NEJBQzNELEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7eUJBQ2xELENBQUM7d0JBQ0YsYUFBYTt3QkFDYixjQUFjO3FCQUNmO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tICdAdGhlc2NhZmZvbGQvbmd4LWNvcmUnO1xuaW1wb3J0IHsgRWxlbWVudHNNb2R1bGUsIExheW91dHNNb2R1bGUgfSBmcm9tICdAdGhlc2NhZmZvbGQvbmd4LXVpJztcbmltcG9ydCB7IEFydGljbGVDb21wb25lbnQgfSBmcm9tICcuL2FydGljbGUuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbQXJ0aWNsZUNvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtcbiAgICBTaGFyZWRNb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlLmZvckNoaWxkKFtcbiAgICAgIHsgcGF0aDogJzpjYXRlZ29yeS86YXJ0aWNsZScsIGNvbXBvbmVudDogQXJ0aWNsZUNvbXBvbmVudCB9LFxuICAgICAgeyBwYXRoOiAnOmFydGljbGUnLCBjb21wb25lbnQ6IEFydGljbGVDb21wb25lbnQgfSxcbiAgICBdKSxcbiAgICBMYXlvdXRzTW9kdWxlLFxuICAgIEVsZW1lbnRzTW9kdWxlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBcnRpY2xlTW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,386 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { ActivatedRoute } from '@angular/router';
3
+ import { BaseDirective, MediaService, titleCase } from '@thescaffold/ngx-core';
4
+ import { map, switchMap } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@angular/forms";
8
+ import * as i3 from "@angular/router";
9
+ import * as i4 from "@thescaffold/ngx-ui";
10
+ import * as i5 from "@thescaffold/ngx-core";
11
+ export class DocsComponent extends BaseDirective {
12
+ constructor() {
13
+ super(...arguments);
14
+ this.mediaService = inject(MediaService);
15
+ this.route = inject(ActivatedRoute);
16
+ this.navList = [];
17
+ this.showHeaders = true;
18
+ this.nav$ = this.mediaService
19
+ .context('blog')
20
+ .index()
21
+ .pipe(map((content) => {
22
+ return (this.navList = content?.nav);
23
+ }));
24
+ this.breadcrumbs$ = this.route.url.pipe(map((segments) => {
25
+ const breads = [
26
+ {
27
+ title: this.translate('apps.blog.component.docs.home.title'),
28
+ url: '/blog',
29
+ },
30
+ ...(segments.length > 1
31
+ ? [
32
+ {
33
+ title: titleCase(segments[0].path.replace(/-/g, ' ')),
34
+ url: `/${segments[0]}`,
35
+ },
36
+ ]
37
+ : []),
38
+ ...(segments.length > 2
39
+ ? [
40
+ {
41
+ title: titleCase(segments[1].path.replace(/-/g, ' ')),
42
+ url: `/${segments[1]}`,
43
+ },
44
+ ]
45
+ : []),
46
+ ...(segments.length > 3
47
+ ? [
48
+ {
49
+ title: titleCase(segments[2].path.replace(/-/g, ' ')),
50
+ url: `/${segments[2]}`,
51
+ },
52
+ ]
53
+ : []),
54
+ {
55
+ title: titleCase(segments[segments.length - 1].path.replace(/-/g, ' ')),
56
+ url: null,
57
+ },
58
+ ];
59
+ return breads;
60
+ }));
61
+ this.docs$ = this.route.params.pipe(switchMap((params) => {
62
+ let name = '';
63
+ const sub1 = (this.currentNav = params['sub1']);
64
+ if (sub1) {
65
+ this.showHeaders = sub1.toLowerCase() != 'index';
66
+ name += sub1;
67
+ }
68
+ const sub2 = params['sub2'];
69
+ if (sub2) {
70
+ this.showHeaders = sub2.toLowerCase() != 'index';
71
+ name += `/${sub2}`;
72
+ }
73
+ const sub3 = params['sub3'];
74
+ if (sub3) {
75
+ this.showHeaders = sub3.toLowerCase() != 'index';
76
+ name += `/${sub3}`;
77
+ }
78
+ const sub4 = params['sub4'];
79
+ if (sub4) {
80
+ this.showHeaders = sub4.toLowerCase() != 'index';
81
+ name += `/${sub4}`;
82
+ }
83
+ const sub5 = params['sub5'];
84
+ if (sub5) {
85
+ this.showHeaders = sub5.toLowerCase() != 'index';
86
+ name += `/${sub5}`;
87
+ }
88
+ return this.mediaService.context('blog').article(name, true);
89
+ }));
90
+ }
91
+ onSelectChange(event) {
92
+ const selectedUrl = event.target.value;
93
+ if (selectedUrl) {
94
+ this.router.navigate([selectedUrl]);
95
+ }
96
+ }
97
+ getLowestLevelHeaders(headers) {
98
+ if (headers.length === 0)
99
+ return [];
100
+ // Find the lowest level in the array
101
+ const minLevel = Math.min(...headers.map((header) => header.level));
102
+ // Filter headers by the lowest level
103
+ return headers.filter((header) => header.level == minLevel);
104
+ }
105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: DocsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
106
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.5", type: DocsComponent, selector: "x-docs", usesInheritance: true, ngImport: i0, template: `
107
+ <div class="row m-0 p-0">
108
+ <div
109
+ class="col-12 col-lg-3 p-0 mb-3 sticky-top d-block d-lg-none"
110
+ style="max-height: 75vh; overflow-y: scroll;"
111
+ *ngIf="nav$ | async as nav; else loader"
112
+ >
113
+ <ng-container *ngIf="nav?.length">
114
+ <select (change)="onSelectChange($event)" class="form-select">
115
+ <option value="" disabled selected>Menu</option>
116
+ <ng-container *ngFor="let a of nav">
117
+ <optgroup [label]="a.title">
118
+ <option *ngIf="!a?.links?.length" [value]="a.url">
119
+ {{ a.title }}
120
+ </option>
121
+ <ng-container *ngIf="a?.links?.length">
122
+ <option *ngFor="let b of a.links" [value]="b.url">
123
+ -- {{ b.title }}
124
+ </option>
125
+ <ng-container *ngFor="let b of a.links">
126
+ <option *ngFor="let c of b.links" [value]="c.url">
127
+ ---- {{ c.title }}
128
+ </option>
129
+ </ng-container>
130
+ </ng-container>
131
+ </optgroup>
132
+ </ng-container>
133
+ </select>
134
+ </ng-container>
135
+ </div>
136
+ <div
137
+ class="col-12 col-lg-3 sticky-top d-none d-lg-block p-0 m-0"
138
+ style="max-height: 75vh; overflow-y: scroll;"
139
+ *ngIf="nav$ | async as nav; else loader"
140
+ >
141
+ <ul class="nav flex-column">
142
+ <ng-container *ngIf="nav?.length">
143
+ <li *ngFor="let a of nav" class="nav-item mb-5">
144
+ <p class="fw-bold fs-4 text-body" [innerHTML]="a.title"></p>
145
+ <ul *ngIf="a?.links?.length" class="nav flex-column">
146
+ <li *ngFor="let b of a?.links" class="nav-item">
147
+ <a
148
+ class="x-docs-parent-nav nav-link fs-6 ps-0 ms-0 pt-0 mt-0"
149
+ [routerLink]="b.url"
150
+ [routerLinkActive]="'active'"
151
+ [innerHTML]="b.title"
152
+ ></a>
153
+ <ng-container *ngIf="b?.links?.length">
154
+ <ul
155
+ *ngFor="let c of b.links"
156
+ class="nav flex-column border-start"
157
+ >
158
+ <li class="nav-item">
159
+ <a
160
+ class="x-docs-child-nav nav-link text-tiny"
161
+ [routerLink]="c.url"
162
+ [routerLinkActive]="'active'"
163
+ [innerHTML]="c.title"
164
+ ></a>
165
+ </li>
166
+ </ul>
167
+ </ng-container>
168
+ </li>
169
+ </ul>
170
+ </li>
171
+ </ng-container>
172
+ </ul>
173
+ </div>
174
+ <div class="col-12 col-lg-9 p-3 p-lg-5 bg-body-tertiary">
175
+ <div class="row" *ngIf="docs$ | async as docs; else loader">
176
+ <div class="col-12 col-lg-9 px-3">
177
+ <div *ngIf="breadcrumbs$ | async as breadcrumbs" class="">
178
+ <nav id="x-docs-nav">
179
+ <ol class="breadcrumb">
180
+ <li
181
+ *ngFor="let breadcrumb of breadcrumbs"
182
+ class="breadcrumb-item"
183
+ >
184
+ <a *ngIf="breadcrumb?.url" [routerLink]="breadcrumb.url">{{
185
+ breadcrumb.title
186
+ }}</a>
187
+ <span
188
+ *ngIf="!breadcrumb?.url"
189
+ [routerLink]="breadcrumb.url"
190
+ >{{ breadcrumb.title }}</span
191
+ >
192
+ </li>
193
+ </ol>
194
+ </nav>
195
+ </div>
196
+
197
+ <div
198
+ *ngIf="docs?.html; else empty"
199
+ data-bs-spy="scroll"
200
+ data-bs-target="#x-docs-nav"
201
+ data-bs-root-margin="0px 0px -40%"
202
+ data-bs-smooth-scroll="true"
203
+ class="scrollspy-example"
204
+ tabindex="0"
205
+ >
206
+ <div [innerHTML]="docs.html | xSafeHtml"></div>
207
+ </div>
208
+ </div>
209
+ <div
210
+ *ngIf="showHeaders && docs?.headers?.length"
211
+ class="col-lg-3 sticky-top d-none d-lg-block"
212
+ style="max-height: 75vh; overflow-y: scroll;"
213
+ >
214
+ <ul class="nav flex-column">
215
+ <li
216
+ *ngFor="let h of getLowestLevelHeaders(docs.headers)"
217
+ class="nav-item"
218
+ >
219
+ <a
220
+ class="x-docs-header-nav nav-link text-tiny"
221
+ [routerLink]="['./']"
222
+ [routerLinkActive]="'active'"
223
+ [fragment]="h.id"
224
+ [innerHTML]="h.text"
225
+ ></a>
226
+ </li>
227
+ </ul>
228
+ </div>
229
+ </div>
230
+ </div>
231
+ </div>
232
+
233
+ <div class="py-3"></div>
234
+
235
+ <!-- misc -->
236
+ <ng-template #loader>
237
+ <x-element-loader></x-element-loader>
238
+ </ng-template>
239
+
240
+ <ng-template #empty>
241
+ <x-element-blank></x-element-blank>
242
+ </ng-template>
243
+ `, isInline: true, styles: [".text-tiny{font-size:.9em}.x-docs-parent-nav.nav-link.active,.x-docs-parent-nav.nav-link:hover{font-weight:700}.x-docs-child-nav.nav-link.active,.x-docs-child-nav.nav-link:hover{border-left:5px solid;font-weight:700}.x-docs-header-nav.nav-link.active,.x-docs-header-nav.nav-link:hover{font-weight:700}\n"], dependencies: [{ 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: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i3.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: i4.BlankComponent, selector: "x-element-blank", inputs: ["image", "icon", "type"] }, { kind: "component", type: i4.LoaderComponent, selector: "x-element-loader", inputs: ["data"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.SafeHtmlPipe, name: "xSafeHtml" }] }); }
244
+ }
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: DocsComponent, decorators: [{
246
+ type: Component,
247
+ args: [{ selector: 'x-docs', template: `
248
+ <div class="row m-0 p-0">
249
+ <div
250
+ class="col-12 col-lg-3 p-0 mb-3 sticky-top d-block d-lg-none"
251
+ style="max-height: 75vh; overflow-y: scroll;"
252
+ *ngIf="nav$ | async as nav; else loader"
253
+ >
254
+ <ng-container *ngIf="nav?.length">
255
+ <select (change)="onSelectChange($event)" class="form-select">
256
+ <option value="" disabled selected>Menu</option>
257
+ <ng-container *ngFor="let a of nav">
258
+ <optgroup [label]="a.title">
259
+ <option *ngIf="!a?.links?.length" [value]="a.url">
260
+ {{ a.title }}
261
+ </option>
262
+ <ng-container *ngIf="a?.links?.length">
263
+ <option *ngFor="let b of a.links" [value]="b.url">
264
+ -- {{ b.title }}
265
+ </option>
266
+ <ng-container *ngFor="let b of a.links">
267
+ <option *ngFor="let c of b.links" [value]="c.url">
268
+ ---- {{ c.title }}
269
+ </option>
270
+ </ng-container>
271
+ </ng-container>
272
+ </optgroup>
273
+ </ng-container>
274
+ </select>
275
+ </ng-container>
276
+ </div>
277
+ <div
278
+ class="col-12 col-lg-3 sticky-top d-none d-lg-block p-0 m-0"
279
+ style="max-height: 75vh; overflow-y: scroll;"
280
+ *ngIf="nav$ | async as nav; else loader"
281
+ >
282
+ <ul class="nav flex-column">
283
+ <ng-container *ngIf="nav?.length">
284
+ <li *ngFor="let a of nav" class="nav-item mb-5">
285
+ <p class="fw-bold fs-4 text-body" [innerHTML]="a.title"></p>
286
+ <ul *ngIf="a?.links?.length" class="nav flex-column">
287
+ <li *ngFor="let b of a?.links" class="nav-item">
288
+ <a
289
+ class="x-docs-parent-nav nav-link fs-6 ps-0 ms-0 pt-0 mt-0"
290
+ [routerLink]="b.url"
291
+ [routerLinkActive]="'active'"
292
+ [innerHTML]="b.title"
293
+ ></a>
294
+ <ng-container *ngIf="b?.links?.length">
295
+ <ul
296
+ *ngFor="let c of b.links"
297
+ class="nav flex-column border-start"
298
+ >
299
+ <li class="nav-item">
300
+ <a
301
+ class="x-docs-child-nav nav-link text-tiny"
302
+ [routerLink]="c.url"
303
+ [routerLinkActive]="'active'"
304
+ [innerHTML]="c.title"
305
+ ></a>
306
+ </li>
307
+ </ul>
308
+ </ng-container>
309
+ </li>
310
+ </ul>
311
+ </li>
312
+ </ng-container>
313
+ </ul>
314
+ </div>
315
+ <div class="col-12 col-lg-9 p-3 p-lg-5 bg-body-tertiary">
316
+ <div class="row" *ngIf="docs$ | async as docs; else loader">
317
+ <div class="col-12 col-lg-9 px-3">
318
+ <div *ngIf="breadcrumbs$ | async as breadcrumbs" class="">
319
+ <nav id="x-docs-nav">
320
+ <ol class="breadcrumb">
321
+ <li
322
+ *ngFor="let breadcrumb of breadcrumbs"
323
+ class="breadcrumb-item"
324
+ >
325
+ <a *ngIf="breadcrumb?.url" [routerLink]="breadcrumb.url">{{
326
+ breadcrumb.title
327
+ }}</a>
328
+ <span
329
+ *ngIf="!breadcrumb?.url"
330
+ [routerLink]="breadcrumb.url"
331
+ >{{ breadcrumb.title }}</span
332
+ >
333
+ </li>
334
+ </ol>
335
+ </nav>
336
+ </div>
337
+
338
+ <div
339
+ *ngIf="docs?.html; else empty"
340
+ data-bs-spy="scroll"
341
+ data-bs-target="#x-docs-nav"
342
+ data-bs-root-margin="0px 0px -40%"
343
+ data-bs-smooth-scroll="true"
344
+ class="scrollspy-example"
345
+ tabindex="0"
346
+ >
347
+ <div [innerHTML]="docs.html | xSafeHtml"></div>
348
+ </div>
349
+ </div>
350
+ <div
351
+ *ngIf="showHeaders && docs?.headers?.length"
352
+ class="col-lg-3 sticky-top d-none d-lg-block"
353
+ style="max-height: 75vh; overflow-y: scroll;"
354
+ >
355
+ <ul class="nav flex-column">
356
+ <li
357
+ *ngFor="let h of getLowestLevelHeaders(docs.headers)"
358
+ class="nav-item"
359
+ >
360
+ <a
361
+ class="x-docs-header-nav nav-link text-tiny"
362
+ [routerLink]="['./']"
363
+ [routerLinkActive]="'active'"
364
+ [fragment]="h.id"
365
+ [innerHTML]="h.text"
366
+ ></a>
367
+ </li>
368
+ </ul>
369
+ </div>
370
+ </div>
371
+ </div>
372
+ </div>
373
+
374
+ <div class="py-3"></div>
375
+
376
+ <!-- misc -->
377
+ <ng-template #loader>
378
+ <x-element-loader></x-element-loader>
379
+ </ng-template>
380
+
381
+ <ng-template #empty>
382
+ <x-element-blank></x-element-blank>
383
+ </ng-template>
384
+ `, styles: [".text-tiny{font-size:.9em}.x-docs-parent-nav.nav-link.active,.x-docs-parent-nav.nav-link:hover{font-weight:700}.x-docs-child-nav.nav-link.active,.x-docs-child-nav.nav-link:hover{border-left:5px solid;font-weight:700}.x-docs-header-nav.nav-link.active,.x-docs-header-nav.nav-link:hover{font-weight:700}\n"] }]
385
+ }] });
386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ibG9nL3NyYy9saWIvcGFnZXMvZG9jcy9kb2NzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0UsT0FBTyxFQUFFLEdBQUcsRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7QUFnTGxELE1BQU0sT0FBTyxhQUFjLFNBQVEsYUFBYTtJQTlLaEQ7O1FBK0ttQixpQkFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxVQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXhDLFlBQU8sR0FBVSxFQUFFLENBQUM7UUFHNUIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFbkIsU0FBSSxHQUFvQixJQUFJLENBQUMsWUFBWTthQUN0QyxPQUFPLENBQUMsTUFBTSxDQUFDO2FBQ2YsS0FBSyxFQUFFO2FBQ1AsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUksT0FBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUNILENBQUM7UUFFSixpQkFBWSxHQUFvQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQ2pELEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2YsTUFBTSxNQUFNLEdBQUc7Z0JBQ2I7b0JBQ0UsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMscUNBQXFDLENBQUM7b0JBQzVELEdBQUcsRUFBRSxPQUFPO2lCQUNiO2dCQUNELEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ3JCLENBQUMsQ0FBQzt3QkFDRTs0QkFDRSxLQUFLLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDckQsR0FBRyxFQUFFLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO3lCQUN2QjtxQkFDRjtvQkFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNQLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ3JCLENBQUMsQ0FBQzt3QkFDRTs0QkFDRSxLQUFLLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDckQsR0FBRyxFQUFFLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO3lCQUN2QjtxQkFDRjtvQkFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNQLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ3JCLENBQUMsQ0FBQzt3QkFDRTs0QkFDRSxLQUFLLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDckQsR0FBRyxFQUFFLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO3lCQUN2QjtxQkFDRjtvQkFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNQO29CQUNFLEtBQUssRUFBRSxTQUFTLENBQ2QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFD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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5SVQ7OzJGQW1DVSxhQUFhO2tCQTlLekIsU0FBUzsrQkFDRSxRQUFRLFlBQ1I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUlUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJhc2VEaXJlY3RpdmUsIE1lZGlhU2VydmljZSwgdGl0bGVDYXNlIH0gZnJvbSAnQHRoZXNjYWZmb2xkL25neC1jb3JlJztcbmltcG9ydCB7IG1hcCwgT2JzZXJ2YWJsZSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3gtZG9jcycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgcC0wXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY29sLTEyIGNvbC1sZy0zIHAtMCBtYi0zIHN0aWNreS10b3AgZC1ibG9jayBkLWxnLW5vbmVcIlxuICAgICAgICBzdHlsZT1cIm1heC1oZWlnaHQ6IDc1dmg7IG92ZXJmbG93LXk6IHNjcm9sbDtcIlxuICAgICAgICAqbmdJZj1cIm5hdiQgfCBhc3luYyBhcyBuYXY7IGVsc2UgbG9hZGVyXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hdj8ubGVuZ3RoXCI+XG4gICAgICAgICAgPHNlbGVjdCAoY2hhbmdlKT1cIm9uU2VsZWN0Q2hhbmdlKCRldmVudClcIiBjbGFzcz1cImZvcm0tc2VsZWN0XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgZGlzYWJsZWQgc2VsZWN0ZWQ+TWVudTwvb3B0aW9uPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYSBvZiBuYXZcIj5cbiAgICAgICAgICAgICAgPG9wdGdyb3VwIFtsYWJlbF09XCJhLnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cIiFhPy5saW5rcz8ubGVuZ3RoXCIgW3ZhbHVlXT1cImEudXJsXCI+XG4gICAgICAgICAgICAgICAgICB7eyBhLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImE/LmxpbmtzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGIgb2YgYS5saW5rc1wiIFt2YWx1ZV09XCJiLnVybFwiPlxuICAgICAgICAgICAgICAgICAgICAtLSB7eyBiLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGIgb2YgYS5saW5rc1wiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjIG9mIGIubGlua3NcIiBbdmFsdWVdPVwiYy51cmxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAtLS0tIHt7IGMudGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImNvbC0xMiBjb2wtbGctMyBzdGlja3ktdG9wIGQtbm9uZSBkLWxnLWJsb2NrIHAtMCBtLTBcIlxuICAgICAgICBzdHlsZT1cIm1heC1oZWlnaHQ6IDc1dmg7IG92ZXJmbG93LXk6IHNjcm9sbDtcIlxuICAgICAgICAqbmdJZj1cIm5hdiQgfCBhc3luYyBhcyBuYXY7IGVsc2UgbG9hZGVyXCJcbiAgICAgID5cbiAgICAgICAgPHVsIGNsYXNzPVwibmF2IGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hdj8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGEgb2YgbmF2XCIgY2xhc3M9XCJuYXYtaXRlbSBtYi01XCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiZnctYm9sZCBmcy00IHRleHQtYm9keVwiIFtpbm5lckhUTUxdPVwiYS50aXRsZVwiPjwvcD5cbiAgICAgICAgICAgICAgPHVsICpuZ0lmPVwiYT8ubGlua3M/Lmxlbmd0aFwiIGNsYXNzPVwibmF2IGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBiIG9mIGE/LmxpbmtzXCIgY2xhc3M9XCJuYXYtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ4LWRvY3MtcGFyZW50LW5hdiBuYXYtbGluayBmcy02IHBzLTAgbXMtMCBwdC0wIG10LTBcIlxuICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJiLnVybFwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlXT1cIidhY3RpdmUnXCJcbiAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJiLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgID48L2E+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYj8ubGlua3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYyBvZiBiLmxpbmtzXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdiBmbGV4LWNvbHVtbiBib3JkZXItc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwieC1kb2NzLWNoaWxkLW5hdiBuYXYtbGluayB0ZXh0LXRpbnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJjLnVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlXT1cIidhY3RpdmUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJjLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1sZy05IHAtMyBwLWxnLTUgYmctYm9keS10ZXJ0aWFyeVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJkb2NzJCB8IGFzeW5jIGFzIGRvY3M7IGVsc2UgbG9hZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbGctOSBweC0zXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYnJlYWRjcnVtYnMkIHwgYXN5bmMgYXMgYnJlYWRjcnVtYnNcIiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICA8bmF2IGlkPVwieC1kb2NzLW5hdlwiPlxuICAgICAgICAgICAgICAgIDxvbCBjbGFzcz1cImJyZWFkY3J1bWJcIj5cbiAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYnJlYWRjcnVtYiBvZiBicmVhZGNydW1ic1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnJlYWRjcnVtYi1pdGVtXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJicmVhZGNydW1iPy51cmxcIiBbcm91dGVyTGlua109XCJicmVhZGNydW1iLnVybFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWRjcnVtYi50aXRsZVxuICAgICAgICAgICAgICAgICAgICB9fTwvYT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFicmVhZGNydW1iPy51cmxcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cImJyZWFkY3J1bWIudXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+e3sgYnJlYWRjcnVtYi50aXRsZSB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvb2w+XG4gICAgICAgICAgICAgIDwvbmF2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJkb2NzPy5odG1sOyBlbHNlIGVtcHR5XCJcbiAgICAgICAgICAgICAgZGF0YS1icy1zcHk9XCJzY3JvbGxcIlxuICAgICAgICAgICAgICBkYXRhLWJzLXRhcmdldD1cIiN4LWRvY3MtbmF2XCJcbiAgICAgICAgICAgICAgZGF0YS1icy1yb290LW1hcmdpbj1cIjBweCAwcHggLTQwJVwiXG4gICAgICAgICAgICAgIGRhdGEtYnMtc21vb3RoLXNjcm9sbD1cInRydWVcIlxuICAgICAgICAgICAgICBjbGFzcz1cInNjcm9sbHNweS1leGFtcGxlXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cImRvY3MuaHRtbCB8IHhTYWZlSHRtbFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJzaG93SGVhZGVycyAmJiBkb2NzPy5oZWFkZXJzPy5sZW5ndGhcIlxuICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGctMyBzdGlja3ktdG9wIGQtbm9uZSBkLWxnLWJsb2NrXCJcbiAgICAgICAgICAgIHN0eWxlPVwibWF4LWhlaWdodDogNzV2aDsgb3ZlcmZsb3cteTogc2Nyb2xsO1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibmF2IGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBoIG9mIGdldExvd2VzdExldmVsSGVhZGVycyhkb2NzLmhlYWRlcnMpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1pdGVtXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIngtZG9jcy1oZWFkZXItbmF2IG5hdi1saW5rIHRleHQtdGlueVwiXG4gICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy4vJ11cIlxuICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtBY3RpdmVdPVwiJ2FjdGl2ZSdcIlxuICAgICAgICAgICAgICAgICAgW2ZyYWdtZW50XT1cImguaWRcIlxuICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJoLnRleHRcIlxuICAgICAgICAgICAgICAgID48L2E+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInB5LTNcIj48L2Rpdj5cblxuICAgIDwhLS0gbWlzYyAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2xvYWRlcj5cbiAgICAgIDx4LWVsZW1lbnQtbG9hZGVyPjwveC1lbGVtZW50LWxvYWRlcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlICNlbXB0eT5cbiAgICAgIDx4LWVsZW1lbnQtYmxhbms+PC94LWVsZW1lbnQtYmxhbms+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLnRleHQtdGlueSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45ZW07XG4gICAgICB9XG5cbiAgICAgIC54LWRvY3MtcGFyZW50LW5hdi5uYXYtbGluay5hY3RpdmUge1xuICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgIH1cblxuICAgICAgLngtZG9jcy1wYXJlbnQtbmF2Lm5hdi1saW5rOmhvdmVyIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICB9XG5cbiAgICAgIC54LWRvY3MtY2hpbGQtbmF2Lm5hdi1saW5rLmFjdGl2ZSB7XG4gICAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQ7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgfVxuXG4gICAgICAueC1kb2NzLWNoaWxkLW5hdi5uYXYtbGluazpob3ZlciB7XG4gICAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQ7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgfVxuXG4gICAgICAueC1kb2NzLWhlYWRlci1uYXYubmF2LWxpbmsuYWN0aXZlIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICB9XG5cbiAgICAgIC54LWRvY3MtaGVhZGVyLW5hdi5uYXYtbGluazpob3ZlciB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERvY3NDb21wb25lbnQgZXh0ZW5kcyBCYXNlRGlyZWN0aXZlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtZWRpYVNlcnZpY2UgPSBpbmplY3QoTWVkaWFTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG5cbiAgcHJpdmF0ZSBuYXZMaXN0OiBhbnlbXSA9IFtdO1xuICBwcml2YXRlIGN1cnJlbnROYXY/OiBzdHJpbmc7XG5cbiAgc2hvd0hlYWRlcnMgPSB0cnVlO1xuXG4gIG5hdiQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMubWVkaWFTZXJ2aWNlXG4gICAgLmNvbnRleHQoJ2Jsb2cnKVxuICAgIC5pbmRleCgpXG4gICAgLnBpcGUoXG4gICAgICBtYXAoKGNvbnRlbnQpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLm5hdkxpc3QgPSAoY29udGVudCBhcyBhbnkpPy5uYXYpO1xuICAgICAgfSksXG4gICAgKTtcblxuICBicmVhZGNydW1icyQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMucm91dGUudXJsLnBpcGUoXG4gICAgbWFwKChzZWdtZW50cykgPT4ge1xuICAgICAgY29uc3QgYnJlYWRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlKCdhcHBzLmJsb2cuY29tcG9uZW50LmRvY3MuaG9tZS50aXRsZScpLFxuICAgICAgICAgIHVybDogJy9ibG9nJyxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKHNlZ21lbnRzLmxlbmd0aCA+IDFcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZUNhc2Uoc2VnbWVudHNbMF0ucGF0aC5yZXBsYWNlKC8tL2csICcgJykpLFxuICAgICAgICAgICAgICAgIHVybDogYC8ke3NlZ21lbnRzWzBdfWAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLihzZWdtZW50cy5sZW5ndGggPiAyXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGVDYXNlKHNlZ21lbnRzWzFdLnBhdGgucmVwbGFjZSgvLS9nLCAnICcpKSxcbiAgICAgICAgICAgICAgICB1cmw6IGAvJHtzZWdtZW50c1sxXX1gLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW10pLFxuICAgICAgICAuLi4oc2VnbWVudHMubGVuZ3RoID4gM1xuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlQ2FzZShzZWdtZW50c1syXS5wYXRoLnJlcGxhY2UoLy0vZywgJyAnKSksXG4gICAgICAgICAgICAgICAgdXJsOiBgLyR7c2VnbWVudHNbMl19YCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAge1xuICAgICAgICAgIHRpdGxlOiB0aXRsZUNhc2UoXG4gICAgICAgICAgICBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXS5wYXRoLnJlcGxhY2UoLy0vZywgJyAnKSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHVybDogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJldHVybiBicmVhZHM7XG4gICAgfSksXG4gICk7XG5cbiAgZG9jcyQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMucm91dGUucGFyYW1zLnBpcGUoXG4gICAgc3dpdGNoTWFwKChwYXJhbXMpID0+IHtcbiAgICAgIGxldCBuYW1lID0gJyc7XG5cbiAgICAgIGNvbnN0IHN1YjEgPSAodGhpcy5jdXJyZW50TmF2ID0gcGFyYW1zWydzdWIxJ10pO1xuICAgICAgaWYgKHN1YjEpIHtcbiAgICAgICAgdGhpcy5zaG93SGVhZGVycyA9IHN1YjEudG9Mb3dlckNhc2UoKSAhPSAnaW5kZXgnO1xuICAgICAgICBuYW1lICs9IHN1YjE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YjIgPSBwYXJhbXNbJ3N1YjInXTtcbiAgICAgIGlmIChzdWIyKSB7XG4gICAgICAgIHRoaXMuc2hvd0hlYWRlcnMgPSBzdWIyLnRvTG93ZXJDYXNlKCkgIT0gJ2luZGV4JztcbiAgICAgICAgbmFtZSArPSBgLyR7c3ViMn1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdWIzID0gcGFyYW1zWydzdWIzJ107XG4gICAgICBpZiAoc3ViMykge1xuICAgICAgICB0aGlzLnNob3dIZWFkZXJzID0gc3ViMy50b0xvd2VyQ2FzZSgpICE9ICdpbmRleCc7XG4gICAgICAgIG5hbWUgKz0gYC8ke3N1YjN9YDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3ViNCA9IHBhcmFtc1snc3ViNCddO1xuICAgICAgaWYgKHN1YjQpIHtcbiAgICAgICAgdGhpcy5zaG93SGVhZGVycyA9IHN1YjQudG9Mb3dlckNhc2UoKSAhPSAnaW5kZXgnO1xuICAgICAgICBuYW1lICs9IGAvJHtzdWI0fWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YjUgPSBwYXJhbXNbJ3N1YjUnXTtcbiAgICAgIGlmIChzdWI1KSB7XG4gICAgICAgIHRoaXMuc2hvd0hlYWRlcnMgPSBzdWI1LnRvTG93ZXJDYXNlKCkgIT0gJ2luZGV4JztcbiAgICAgICAgbmFtZSArPSBgLyR7c3ViNX1gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5tZWRpYVNlcnZpY2UuY29udGV4dCgnYmxvZycpLmFydGljbGUobmFtZSwgdHJ1ZSk7XG4gICAgfSksXG4gICk7XG5cbiAgb25TZWxlY3RDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkVXJsID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudCkudmFsdWU7XG4gICAgaWYgKHNlbGVjdGVkVXJsKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbc2VsZWN0ZWRVcmxdKTtcbiAgICB9XG4gIH1cblxuICBnZXRMb3dlc3RMZXZlbEhlYWRlcnMoaGVhZGVyczogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAvLyBGaW5kIHRoZSBsb3dlc3QgbGV2ZWwgaW4gdGhlIGFycmF5XG4gICAgY29uc3QgbWluTGV2ZWwgPSBNYXRoLm1pbiguLi5oZWFkZXJzLm1hcCgoaGVhZGVyKSA9PiBoZWFkZXIubGV2ZWwpKTtcblxuICAgIC8vIEZpbHRlciBoZWFkZXJzIGJ5IHRoZSBsb3dlc3QgbGV2ZWxcbiAgICByZXR1cm4gaGVhZGVycy5maWx0ZXIoKGhlYWRlcikgPT4gaGVhZGVyLmxldmVsID09IG1pbkxldmVsKTtcbiAgfVxufVxuIl19