@sitecore-jss/sitecore-jss-angular 21.6.2-canary.2 → 21.6.2

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 (65) hide show
  1. package/LICENSE.txt +202 -202
  2. package/README.md +7 -7
  3. package/angular.json +48 -48
  4. package/dist/README.md +7 -7
  5. package/dist/components/data-resolver-factory.d.ts +13 -13
  6. package/dist/components/date.directive.d.ts +20 -20
  7. package/dist/components/editframe.component.d.ts +22 -22
  8. package/dist/components/file.directive.d.ts +17 -17
  9. package/dist/components/generic-link.directive.d.ts +20 -20
  10. package/dist/components/guard-resolver-factory.d.ts +11 -11
  11. package/dist/components/hidden-rendering.component.d.ts +7 -7
  12. package/dist/components/image.directive.d.ts +35 -35
  13. package/dist/components/link.directive.d.ts +26 -26
  14. package/dist/components/missing-component.component.d.ts +7 -7
  15. package/dist/components/placeholder-loading.directive.d.ts +8 -8
  16. package/dist/components/placeholder.component.d.ts +59 -59
  17. package/dist/components/placeholder.token.d.ts +64 -64
  18. package/dist/components/raw.component.d.ts +12 -12
  19. package/dist/components/render-component.component.d.ts +33 -33
  20. package/dist/components/render-each.directive.d.ts +8 -8
  21. package/dist/components/render-empty.directive.d.ts +8 -8
  22. package/dist/components/rendering-field.d.ts +41 -41
  23. package/dist/components/rendering.d.ts +5 -5
  24. package/dist/components/rich-text.directive.d.ts +18 -18
  25. package/dist/components/router-link.directive.d.ts +19 -19
  26. package/dist/components/text.directive.d.ts +16 -16
  27. package/dist/esm2022/components/data-resolver-factory.mjs +58 -58
  28. package/dist/esm2022/components/date.directive.mjs +67 -67
  29. package/dist/esm2022/components/editframe.component.mjs +70 -70
  30. package/dist/esm2022/components/file.directive.mjs +48 -48
  31. package/dist/esm2022/components/generic-link.directive.mjs +67 -67
  32. package/dist/esm2022/components/guard-resolver-factory.mjs +85 -85
  33. package/dist/esm2022/components/hidden-rendering.component.mjs +20 -20
  34. package/dist/esm2022/components/image.directive.mjs +150 -150
  35. package/dist/esm2022/components/link.directive.mjs +122 -122
  36. package/dist/esm2022/components/missing-component.component.mjs +16 -16
  37. package/dist/esm2022/components/placeholder-loading.directive.mjs +16 -16
  38. package/dist/esm2022/components/placeholder.component.mjs +271 -271
  39. package/dist/esm2022/components/placeholder.token.mjs +27 -27
  40. package/dist/esm2022/components/raw.component.mjs +38 -38
  41. package/dist/esm2022/components/render-component.component.mjs +98 -98
  42. package/dist/esm2022/components/render-each.directive.mjs +16 -16
  43. package/dist/esm2022/components/render-empty.directive.mjs +16 -16
  44. package/dist/esm2022/components/rendering-field.mjs +1 -1
  45. package/dist/esm2022/components/rendering.mjs +7 -7
  46. package/dist/esm2022/components/rich-text.directive.mjs +68 -68
  47. package/dist/esm2022/components/router-link.directive.mjs +49 -49
  48. package/dist/esm2022/components/text.directive.mjs +61 -61
  49. package/dist/esm2022/jss-component-factory.service.mjs +87 -87
  50. package/dist/esm2022/lib.module.mjs +160 -160
  51. package/dist/esm2022/public_api.mjs +24 -24
  52. package/dist/esm2022/sitecore-jss-sitecore-jss-angular.mjs +4 -4
  53. package/dist/esm2022/utils.mjs +16 -16
  54. package/dist/fesm2022/sitecore-jss-sitecore-jss-angular.mjs +1507 -1507
  55. package/dist/index.d.ts +5 -5
  56. package/dist/jss-component-factory.service.d.ts +25 -25
  57. package/dist/lib.module.d.ts +46 -46
  58. package/dist/package.json +2 -2
  59. package/dist/public_api.d.ts +25 -25
  60. package/dist/utils.d.ts +6 -6
  61. package/ng-package.json +13 -13
  62. package/package.json +3 -3
  63. package/tsconfig.json +9 -9
  64. package/tsconfig.spec.json +17 -17
  65. package/typings/README.md +2 -2
@@ -1,21 +1,21 @@
1
- import { Component, HostBinding } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class HiddenRenderingComponent {
4
- get style() {
5
- return 'background-image: linear-gradient(45deg, #ffffff 25%, #dcdcdc 25%, #dcdcdc 50%, #ffffff 50%, #ffffff 75%, #dcdcdc 75%, #dcdcdc 100%); background-size: 3px 3px; display: block; height: 100px;';
6
- }
7
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HiddenRenderingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: HiddenRenderingComponent, selector: "sc-hidden-rendering", host: { properties: { "style": "this.style" } }, ngImport: i0, template: '', isInline: true });
9
- }
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HiddenRenderingComponent, decorators: [{
11
- type: Component,
12
- args: [{
13
- selector: 'sc-hidden-rendering',
14
- template: '',
15
- }]
16
- }], propDecorators: { style: [{
17
- type: HostBinding,
18
- args: ['style']
19
- }] } });
20
- export const HIDDEN_RENDERING_NAME = 'Hidden Rendering';
1
+ import { Component, HostBinding } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class HiddenRenderingComponent {
4
+ get style() {
5
+ return 'background-image: linear-gradient(45deg, #ffffff 25%, #dcdcdc 25%, #dcdcdc 50%, #ffffff 50%, #ffffff 75%, #dcdcdc 75%, #dcdcdc 100%); background-size: 3px 3px; display: block; height: 100px;';
6
+ }
7
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HiddenRenderingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: HiddenRenderingComponent, selector: "sc-hidden-rendering", host: { properties: { "style": "this.style" } }, ngImport: i0, template: '', isInline: true });
9
+ }
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HiddenRenderingComponent, decorators: [{
11
+ type: Component,
12
+ args: [{
13
+ selector: 'sc-hidden-rendering',
14
+ template: '',
15
+ }]
16
+ }], propDecorators: { style: [{
17
+ type: HostBinding,
18
+ args: ['style']
19
+ }] } });
20
+ export const HIDDEN_RENDERING_NAME = 'Hidden Rendering';
21
21
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlkZGVuLXJlbmRlcmluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9oaWRkZW4tcmVuZGVyaW5nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLdkQsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxJQUEwQixLQUFLO1FBQzdCLE9BQU8sZ01BQWdNLENBQUM7SUFDMU0sQ0FBQzt3R0FIVSx3QkFBd0I7NEZBQXhCLHdCQUF3Qiw0R0FGekIsRUFBRTs7NEZBRUQsd0JBQXdCO2tCQUpwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFFBQVEsRUFBRSxFQUFFO2lCQUNiOzhCQUUyQixLQUFLO3NCQUE5QixXQUFXO3VCQUFDLE9BQU87O0FBS3RCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NjLWhpZGRlbi1yZW5kZXJpbmcnLFxyXG4gIHRlbXBsYXRlOiAnJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEhpZGRlblJlbmRlcmluZ0NvbXBvbmVudCB7XHJcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZScpIGdldCBzdHlsZSgpIHtcclxuICAgIHJldHVybiAnYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjZmZmZmZmIDI1JSwgI2RjZGNkYyAyNSUsICNkY2RjZGMgNTAlLCAjZmZmZmZmIDUwJSwgI2ZmZmZmZiA3NSUsICNkY2RjZGMgNzUlLCAjZGNkY2RjIDEwMCUpOyBiYWNrZ3JvdW5kLXNpemU6IDNweCAzcHg7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDEwMHB4Oyc7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgSElEREVOX1JFTkRFUklOR19OQU1FID0gJ0hpZGRlbiBSZW5kZXJpbmcnO1xyXG4iXX0=
@@ -1,151 +1,151 @@
1
- import { Directive, Input, } from '@angular/core';
2
- import { mediaApi } from '@sitecore-jss/sitecore-jss/media';
3
- import * as i0 from "@angular/core";
4
- export class ImageDirective {
5
- viewContainer;
6
- templateRef;
7
- renderer;
8
- elementRef;
9
- field;
10
- editable = true;
11
- /**
12
- * Custom regexp that finds media URL prefix that will be replaced by `/-/jssmedia` or `/~/jssmedia`.
13
- * @example
14
- * /\/([-~]{1})assets\//i
15
- * /-assets/website -> /-/jssmedia/website
16
- * /~assets/website -> /~/jssmedia/website
17
- */
18
- mediaUrlPrefix;
19
- urlParams = {};
20
- attrs = {};
21
- inlineRef = null;
22
- constructor(viewContainer, templateRef, renderer, elementRef) {
23
- this.viewContainer = viewContainer;
24
- this.templateRef = templateRef;
25
- this.renderer = renderer;
26
- this.elementRef = elementRef;
27
- }
28
- ngOnChanges(changes) {
29
- if (changes.field || changes.editable || changes.urlParams || changes.attrs) {
30
- this.viewContainer.clear();
31
- if (this.inlineRef) {
32
- this.inlineRef.remove();
33
- this.inlineRef = null;
34
- }
35
- this.updateView();
36
- }
37
- }
38
- updateView() {
39
- const overrideAttrs = {
40
- ...this.getElementAttrs(),
41
- ...this.attrs,
42
- };
43
- const media = this.field;
44
- if (!media || (!media.editable && !media.value && !media.src)) {
45
- return;
46
- }
47
- let attrs = {};
48
- // we likely have an experience editor value, should be a string
49
- if (this.editable && media.editable) {
50
- const foundImg = mediaApi.findEditorImageTag(media.editable);
51
- if (!foundImg) {
52
- return this.renderInlineWrapper(media.editable);
53
- }
54
- attrs = this.getImageAttrs(foundImg.attrs, overrideAttrs, this.urlParams);
55
- if (!attrs) {
56
- return this.renderInlineWrapper(media.editable);
57
- }
58
- const tempImg = this.renderer.createElement('img');
59
- Object.entries(attrs).forEach(([key, attrValue]) => tempImg.setAttribute(key, attrValue));
60
- const editableMarkup = media.editable.replace(foundImg.imgTag, tempImg.outerHTML);
61
- return this.renderInlineWrapper(editableMarkup);
62
- }
63
- // some wise-guy/gal is passing in a 'raw' image object value
64
- const img = media.src ? media : media.value;
65
- if (!img) {
66
- return null;
67
- }
68
- attrs = this.getImageAttrs(img, overrideAttrs, this.urlParams);
69
- if (attrs) {
70
- this.renderTemplate(attrs);
71
- }
72
- }
73
- getImageAttrs(fieldAttrs, parsedAttrs, imageParams) {
74
- const combinedAttrs = {
75
- ...fieldAttrs,
76
- ...parsedAttrs,
77
- };
78
- // eslint-disable-next-line prefer-const
79
- let { src, srcSet, ...otherAttrs } = combinedAttrs;
80
- if (!src) {
81
- return null;
82
- }
83
- const newAttrs = {
84
- ...otherAttrs,
85
- };
86
- // update image URL for jss handler and image rendering params
87
- src = mediaApi.updateImageUrl(src, imageParams, this.mediaUrlPrefix);
88
- if (srcSet) {
89
- // replace with HTML-formatted srcset, including updated image URLs
90
- newAttrs.srcSet = mediaApi.getSrcSet(src, srcSet, imageParams, this.mediaUrlPrefix);
91
- }
92
- else {
93
- newAttrs.src = src;
94
- }
95
- return newAttrs;
96
- }
97
- renderTemplate(imageProps) {
98
- const viewRef = this.viewContainer.createEmbeddedView(this.templateRef);
99
- viewRef.rootNodes.forEach((node) => {
100
- Object.entries(imageProps).forEach(([key, imgPropVal]) => this.renderer.setAttribute(node, key, imgPropVal));
101
- });
102
- }
103
- getElementAttrs() {
104
- const view = this.templateRef.createEmbeddedView(null);
105
- const element = view.rootNodes[0];
106
- if (!element) {
107
- view.destroy();
108
- return {};
109
- }
110
- const attrs = {};
111
- for (let i = 0; i < element.attributes.length; i++) {
112
- const attr = element.attributes.item(i);
113
- if (attr) {
114
- attrs[attr.name] = attr.value;
115
- }
116
- }
117
- view.destroy();
118
- return attrs;
119
- }
120
- renderInlineWrapper(editable) {
121
- const span = this.renderer.createElement('span');
122
- span.className = 'sc-image-wrapper';
123
- span.innerHTML = editable;
124
- const parentNode = this.renderer.parentNode(this.elementRef.nativeElement);
125
- this.renderer.insertBefore(parentNode, span, this.elementRef.nativeElement);
126
- parentNode.removeChild(this.elementRef.nativeElement);
127
- this.inlineRef = span;
128
- }
129
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ImageDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
130
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ImageDirective, selector: "[scImage]", inputs: { field: ["scImage", "field"], editable: ["scImageEditable", "editable"], mediaUrlPrefix: ["scImageMediaUrlPrefix", "mediaUrlPrefix"], urlParams: ["scImageUrlParams", "urlParams"], attrs: ["scImageAttrs", "attrs"] }, usesOnChanges: true, ngImport: i0 });
131
- }
132
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ImageDirective, decorators: [{
133
- type: Directive,
134
- args: [{ selector: '[scImage]' }]
135
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { field: [{
136
- type: Input,
137
- args: ['scImage']
138
- }], editable: [{
139
- type: Input,
140
- args: ['scImageEditable']
141
- }], mediaUrlPrefix: [{
142
- type: Input,
143
- args: ['scImageMediaUrlPrefix']
144
- }], urlParams: [{
145
- type: Input,
146
- args: ['scImageUrlParams']
147
- }], attrs: [{
148
- type: Input,
149
- args: ['scImageAttrs']
150
- }] } });
1
+ import { Directive, Input, } from '@angular/core';
2
+ import { mediaApi } from '@sitecore-jss/sitecore-jss/media';
3
+ import * as i0 from "@angular/core";
4
+ export class ImageDirective {
5
+ viewContainer;
6
+ templateRef;
7
+ renderer;
8
+ elementRef;
9
+ field;
10
+ editable = true;
11
+ /**
12
+ * Custom regexp that finds media URL prefix that will be replaced by `/-/jssmedia` or `/~/jssmedia`.
13
+ * @example
14
+ * /\/([-~]{1})assets\//i
15
+ * /-assets/website -> /-/jssmedia/website
16
+ * /~assets/website -> /~/jssmedia/website
17
+ */
18
+ mediaUrlPrefix;
19
+ urlParams = {};
20
+ attrs = {};
21
+ inlineRef = null;
22
+ constructor(viewContainer, templateRef, renderer, elementRef) {
23
+ this.viewContainer = viewContainer;
24
+ this.templateRef = templateRef;
25
+ this.renderer = renderer;
26
+ this.elementRef = elementRef;
27
+ }
28
+ ngOnChanges(changes) {
29
+ if (changes.field || changes.editable || changes.urlParams || changes.attrs) {
30
+ this.viewContainer.clear();
31
+ if (this.inlineRef) {
32
+ this.inlineRef.remove();
33
+ this.inlineRef = null;
34
+ }
35
+ this.updateView();
36
+ }
37
+ }
38
+ updateView() {
39
+ const overrideAttrs = {
40
+ ...this.getElementAttrs(),
41
+ ...this.attrs,
42
+ };
43
+ const media = this.field;
44
+ if (!media || (!media.editable && !media.value && !media.src)) {
45
+ return;
46
+ }
47
+ let attrs = {};
48
+ // we likely have an experience editor value, should be a string
49
+ if (this.editable && media.editable) {
50
+ const foundImg = mediaApi.findEditorImageTag(media.editable);
51
+ if (!foundImg) {
52
+ return this.renderInlineWrapper(media.editable);
53
+ }
54
+ attrs = this.getImageAttrs(foundImg.attrs, overrideAttrs, this.urlParams);
55
+ if (!attrs) {
56
+ return this.renderInlineWrapper(media.editable);
57
+ }
58
+ const tempImg = this.renderer.createElement('img');
59
+ Object.entries(attrs).forEach(([key, attrValue]) => tempImg.setAttribute(key, attrValue));
60
+ const editableMarkup = media.editable.replace(foundImg.imgTag, tempImg.outerHTML);
61
+ return this.renderInlineWrapper(editableMarkup);
62
+ }
63
+ // some wise-guy/gal is passing in a 'raw' image object value
64
+ const img = media.src ? media : media.value;
65
+ if (!img) {
66
+ return null;
67
+ }
68
+ attrs = this.getImageAttrs(img, overrideAttrs, this.urlParams);
69
+ if (attrs) {
70
+ this.renderTemplate(attrs);
71
+ }
72
+ }
73
+ getImageAttrs(fieldAttrs, parsedAttrs, imageParams) {
74
+ const combinedAttrs = {
75
+ ...fieldAttrs,
76
+ ...parsedAttrs,
77
+ };
78
+ // eslint-disable-next-line prefer-const
79
+ let { src, srcSet, ...otherAttrs } = combinedAttrs;
80
+ if (!src) {
81
+ return null;
82
+ }
83
+ const newAttrs = {
84
+ ...otherAttrs,
85
+ };
86
+ // update image URL for jss handler and image rendering params
87
+ src = mediaApi.updateImageUrl(src, imageParams, this.mediaUrlPrefix);
88
+ if (srcSet) {
89
+ // replace with HTML-formatted srcset, including updated image URLs
90
+ newAttrs.srcSet = mediaApi.getSrcSet(src, srcSet, imageParams, this.mediaUrlPrefix);
91
+ }
92
+ else {
93
+ newAttrs.src = src;
94
+ }
95
+ return newAttrs;
96
+ }
97
+ renderTemplate(imageProps) {
98
+ const viewRef = this.viewContainer.createEmbeddedView(this.templateRef);
99
+ viewRef.rootNodes.forEach((node) => {
100
+ Object.entries(imageProps).forEach(([key, imgPropVal]) => this.renderer.setAttribute(node, key, imgPropVal));
101
+ });
102
+ }
103
+ getElementAttrs() {
104
+ const view = this.templateRef.createEmbeddedView(null);
105
+ const element = view.rootNodes[0];
106
+ if (!element) {
107
+ view.destroy();
108
+ return {};
109
+ }
110
+ const attrs = {};
111
+ for (let i = 0; i < element.attributes.length; i++) {
112
+ const attr = element.attributes.item(i);
113
+ if (attr) {
114
+ attrs[attr.name] = attr.value;
115
+ }
116
+ }
117
+ view.destroy();
118
+ return attrs;
119
+ }
120
+ renderInlineWrapper(editable) {
121
+ const span = this.renderer.createElement('span');
122
+ span.className = 'sc-image-wrapper';
123
+ span.innerHTML = editable;
124
+ const parentNode = this.renderer.parentNode(this.elementRef.nativeElement);
125
+ this.renderer.insertBefore(parentNode, span, this.elementRef.nativeElement);
126
+ parentNode.removeChild(this.elementRef.nativeElement);
127
+ this.inlineRef = span;
128
+ }
129
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ImageDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
130
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ImageDirective, selector: "[scImage]", inputs: { field: ["scImage", "field"], editable: ["scImageEditable", "editable"], mediaUrlPrefix: ["scImageMediaUrlPrefix", "mediaUrlPrefix"], urlParams: ["scImageUrlParams", "urlParams"], attrs: ["scImageAttrs", "attrs"] }, usesOnChanges: true, ngImport: i0 });
131
+ }
132
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ImageDirective, decorators: [{
133
+ type: Directive,
134
+ args: [{ selector: '[scImage]' }]
135
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { field: [{
136
+ type: Input,
137
+ args: ['scImage']
138
+ }], editable: [{
139
+ type: Input,
140
+ args: ['scImageEditable']
141
+ }], mediaUrlPrefix: [{
142
+ type: Input,
143
+ args: ['scImageMediaUrlPrefix']
144
+ }], urlParams: [{
145
+ type: Input,
146
+ args: ['scImageUrlParams']
147
+ }], attrs: [{
148
+ type: Input,
149
+ args: ['scImageAttrs']
150
+ }] } });
151
151
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaW1hZ2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxHQU1OLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFJNUQsTUFBTSxPQUFPLGNBQWM7SUFxQmY7SUFDQTtJQUNBO0lBQ0E7SUF2QlEsS0FBSyxDQUFrQjtJQUVmLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFFMUM7Ozs7OztPQU1HO0lBQzZCLGNBQWMsQ0FBVTtJQUU3QixTQUFTLEdBQXlDLEVBQUUsQ0FBQztJQUV6RCxLQUFLLEdBQWlDLEVBQUUsQ0FBQztJQUV4RCxTQUFTLEdBQTJCLElBQUksQ0FBQztJQUVqRCxZQUNVLGFBQStCLEVBQy9CLFdBQWlDLEVBQ2pDLFFBQW1CLEVBQ25CLFVBQXNCO1FBSHRCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixnQkFBVyxHQUFYLFdBQVcsQ0FBc0I7UUFDakMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBQzdCLENBQUM7SUFFSixXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQzNFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzthQUN2QjtZQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztT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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NvbnRhaW5lclJlZixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgbWVkaWFBcGkgfSBmcm9tICdAc2l0ZWNvcmUtanNzL3NpdGVjb3JlLWpzcy9tZWRpYSc7XHJcbmltcG9ydCB7IEltYWdlRmllbGQsIEltYWdlRmllbGRWYWx1ZSB9IGZyb20gJy4vcmVuZGVyaW5nLWZpZWxkJztcclxuXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tzY0ltYWdlXScgfSlcclxuZXhwb3J0IGNsYXNzIEltYWdlRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoJ3NjSW1hZ2UnKSBmaWVsZDogSW1hZ2VGaWVsZCB8ICcnO1xyXG5cclxuICBASW5wdXQoJ3NjSW1hZ2VFZGl0YWJsZScpIGVkaXRhYmxlID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3VzdG9tIHJlZ2V4cCB0aGF0IGZpbmRzIG1lZGlhIFVSTCBwcmVmaXggdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGAvLS9qc3NtZWRpYWAgb3IgYC9+L2pzc21lZGlhYC5cclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIC9cXC8oWy1+XXsxfSlhc3NldHNcXC8vaVxyXG4gICAqIC8tYXNzZXRzL3dlYnNpdGUgLT4gLy0vanNzbWVkaWEvd2Vic2l0ZVxyXG4gICAqIC9+YXNzZXRzL3dlYnNpdGUgLT4gL34vanNzbWVkaWEvd2Vic2l0ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgnc2NJbWFnZU1lZGlhVXJsUHJlZml4JykgbWVkaWFVcmxQcmVmaXg/OiBSZWdFeHA7XHJcblxyXG4gIEBJbnB1dCgnc2NJbWFnZVVybFBhcmFtcycpIHVybFBhcmFtczogeyBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge307XHJcblxyXG4gIEBJbnB1dCgnc2NJbWFnZUF0dHJzJykgYXR0cnM6IHsgW3BhcmFtOiBzdHJpbmddOiB1bmtub3duIH0gPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBpbmxpbmVSZWY6IEhUTUxTcGFuRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPHVua25vd24+LFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcy5maWVsZCB8fCBjaGFuZ2VzLmVkaXRhYmxlIHx8IGNoYW5nZXMudXJsUGFyYW1zIHx8IGNoYW5nZXMuYXR0cnMpIHtcclxuICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKCk7XHJcbiAgICAgIGlmICh0aGlzLmlubGluZVJlZikge1xyXG4gICAgICAgIHRoaXMuaW5saW5lUmVmLnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuaW5saW5lUmVmID0gbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVZpZXcoKSB7XHJcbiAgICBjb25zdCBvdmVycmlkZUF0dHJzID0ge1xyXG4gICAgICAuLi50aGlzLmdldEVsZW1lbnRBdHRycygpLFxyXG4gICAgICAuLi50aGlzLmF0dHJzLFxyXG4gICAgfTtcclxuICAgIGNvbnN0IG1lZGlhID0gdGhpcy5maWVsZDtcclxuXHJcbiAgICBpZiAoIW1lZGlhIHx8ICghbWVkaWEuZWRpdGFibGUgJiYgIW1lZGlhLnZhbHVlICYmICFtZWRpYS5zcmMpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYXR0cnM6IHsgW2F0dHI6IHN0cmluZ106IHN0cmluZyB9IHwgbnVsbCA9IHt9O1xyXG5cclxuICAgIC8vIHdlIGxpa2VseSBoYXZlIGFuIGV4cGVyaWVuY2UgZWRpdG9yIHZhbHVlLCBzaG91bGQgYmUgYSBzdHJpbmdcclxuICAgIGlmICh0aGlzLmVkaXRhYmxlICYmIG1lZGlhLmVkaXRhYmxlKSB7XHJcbiAgICAgIGNvbnN0IGZvdW5kSW1nID0gbWVkaWFBcGkuZmluZEVkaXRvckltYWdlVGFnKG1lZGlhLmVkaXRhYmxlKTtcclxuICAgICAgaWYgKCFmb3VuZEltZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcklubGluZVdyYXBwZXIobWVkaWEuZWRpdGFibGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGF0dHJzID0gdGhpcy5nZXRJbWFnZUF0dHJzKGZvdW5kSW1nLmF0dHJzLCBvdmVycmlkZUF0dHJzLCB0aGlzLnVybFBhcmFtcyk7XHJcbiAgICAgIGlmICghYXR0cnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJJbmxpbmVXcmFwcGVyKG1lZGlhLmVkaXRhYmxlKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB0ZW1wSW1nOiBIVE1MSW1hZ2VFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtrZXksIGF0dHJWYWx1ZV06IFtzdHJpbmcsIHN0cmluZ10pID0+XHJcbiAgICAgICAgdGVtcEltZy5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyVmFsdWUpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGVkaXRhYmxlTWFya3VwID0gbWVkaWEuZWRpdGFibGUucmVwbGFjZShmb3VuZEltZy5pbWdUYWcsIHRlbXBJbWcub3V0ZXJIVE1MKTtcclxuICAgICAgcmV0dXJuIHRoaXMucmVuZGVySW5saW5lV3JhcHBlcihlZGl0YWJsZU1hcmt1cCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc29tZSB3aXNlLWd1eS9nYWwgaXMgcGFzc2luZyBpbiBhICdyYXcnIGltYWdlIG9iamVjdCB2YWx1ZVxyXG4gICAgY29uc3QgaW1nID0gbWVkaWEuc3JjID8gbWVkaWEgOiBtZWRpYS52YWx1ZTtcclxuICAgIGlmICghaW1nKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dHJzID0gdGhpcy5nZXRJbWFnZUF0dHJzKGltZywgb3ZlcnJpZGVBdHRycywgdGhpcy51cmxQYXJhbXMpO1xyXG4gICAgaWYgKGF0dHJzKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyVGVtcGxhdGUoYXR0cnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJbWFnZUF0dHJzKFxyXG4gICAgZmllbGRBdHRyczogSW1hZ2VGaWVsZFZhbHVlLFxyXG4gICAgcGFyc2VkQXR0cnM6IHsgW2F0dHI6IHN0cmluZ106IHVua25vd24gfSxcclxuICAgIGltYWdlUGFyYW1zOiB7IFtwYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH1cclxuICApOiB7IFthdHRyOiBzdHJpbmddOiBzdHJpbmcgfSB8IG51bGwge1xyXG4gICAgY29uc3QgY29tYmluZWRBdHRycyA9IHtcclxuICAgICAgLi4uZmllbGRBdHRycyxcclxuICAgICAgLi4ucGFyc2VkQXR0cnMsXHJcbiAgICB9O1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxyXG4gICAgbGV0IHsgc3JjLCBzcmNTZXQsIC4uLm90aGVyQXR0cnMgfSA9IGNvbWJpbmVkQXR0cnM7XHJcbiAgICBpZiAoIXNyYykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0F0dHJzOiB7IFthdHRyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAgICAgLi4uKG90aGVyQXR0cnMgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSksXHJcbiAgICB9O1xyXG4gICAgLy8gdXBkYXRlIGltYWdlIFVSTCBmb3IganNzIGhhbmRsZXIgYW5kIGltYWdlIHJlbmRlcmluZyBwYXJhbXNcclxuICAgIHNyYyA9IG1lZGlhQXBpLnVwZGF0ZUltYWdlVXJsKHNyYywgaW1hZ2VQYXJhbXMsIHRoaXMubWVkaWFVcmxQcmVmaXgpO1xyXG4gICAgaWYgKHNyY1NldCkge1xyXG4gICAgICAvLyByZXBsYWNlIHdpdGggSFRNTC1mb3JtYXR0ZWQgc3Jjc2V0LCBpbmNsdWRpbmcgdXBkYXRlZCBpbWFnZSBVUkxzXHJcbiAgICAgIG5ld0F0dHJzLnNyY1NldCA9IG1lZGlhQXBpLmdldFNyY1NldChzcmMsIHNyY1NldCwgaW1hZ2VQYXJhbXMsIHRoaXMubWVkaWFVcmxQcmVmaXgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbmV3QXR0cnMuc3JjID0gc3JjO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld0F0dHJzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJUZW1wbGF0ZShpbWFnZVByb3BzOiB7IFtwcm9wOiBzdHJpbmddOiBzdHJpbmcgfSkge1xyXG4gICAgY29uc3Qgdmlld1JlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZik7XHJcbiAgICB2aWV3UmVmLnJvb3ROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgIE9iamVjdC5lbnRyaWVzKGltYWdlUHJvcHMpLmZvckVhY2goKFtrZXksIGltZ1Byb3BWYWxdOiBbc3RyaW5nLCBzdHJpbmddKSA9PlxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKG5vZGUsIGtleSwgaW1nUHJvcFZhbClcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRFbGVtZW50QXR0cnMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy50ZW1wbGF0ZVJlZi5jcmVhdGVFbWJlZGRlZFZpZXcobnVsbCk7XHJcbiAgICBjb25zdCBlbGVtZW50OiBFbGVtZW50ID0gdmlldy5yb290Tm9kZXNbMF07XHJcbiAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgdmlldy5kZXN0cm95KCk7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICAgIGNvbnN0IGF0dHJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBhdHRyID0gZWxlbWVudC5hdHRyaWJ1dGVzLml0ZW0oaSk7XHJcbiAgICAgIGlmIChhdHRyKSB7XHJcbiAgICAgICAgYXR0cnNbYXR0ci5uYW1lXSA9IGF0dHIudmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHZpZXcuZGVzdHJveSgpO1xyXG4gICAgcmV0dXJuIGF0dHJzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJJbmxpbmVXcmFwcGVyKGVkaXRhYmxlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHNwYW46IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgc3Bhbi5jbGFzc05hbWUgPSAnc2MtaW1hZ2Utd3JhcHBlcic7XHJcbiAgICBzcGFuLmlubmVySFRNTCA9IGVkaXRhYmxlO1xyXG5cclxuICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUocGFyZW50Tm9kZSwgc3BhbiwgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy5pbmxpbmVSZWYgPSBzcGFuO1xyXG4gIH1cclxufVxyXG4iXX0=