ag-studio-angular 0.0.1 → 1.0.1

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.
package/README.md ADDED
@@ -0,0 +1,183 @@
1
+ # Angular Embedded Analytics
2
+
3
+ <div align="center">
4
+ <picture>
5
+ <source media="(prefers-color-scheme: dark)" srcset="https://ag-grid.com/studio/images/ag-studio-logo-dark.svg"/>
6
+ <source media="(prefers-color-scheme: light)" srcset="https://ag-grid.com/studio/images/ag-studio-logo.svg"/>
7
+ <img width="100%" alt="AG Studio Logo" src="https://ag-grid.com/studio/images/ag-studio-logo.svg"/>
8
+ </picture>
9
+ <div align="center">
10
+ <h4><a href="https://ag-grid.com/studio/">Website</a> · <a href="https://ag-grid.com/studio/angular/overview/">Documentation</a> · <a href="https://ag-grid.com/studio/example/">Live Demo</a></h4>
11
+ </div>
12
+ <br>
13
+ <a href="https://www.npmjs.com/package/ag-studio-angular">
14
+ <img src="https://img.shields.io/npm/v/ag-studio-angular?style=for-the-badge" alt="NPM Version">
15
+ </a>
16
+ <a href="https://www.npmjs.com/package/ag-studio-angular">
17
+ <img src="https://img.shields.io/npm/dm/ag-studio-angular?style=for-the-badge" alt="NPM Downloads">
18
+ </a>
19
+ <br><br>
20
+ <!-- START MAIN DESCRIPTION -->
21
+ <p><strong><a href="https://ag-grid.com/studio/angular/overview/"><img src="https://ag-grid.com/images/fw-logos/angular.svg" height="16" width="16" alt="Angular Logo"> AG Studio</a></strong> is an <strong>Angular</strong> Embedded Analytics component for creating dashboards, built on top of <a href="https://ag-grid.com">AG Grid</a> and <a href="https://ag-grid.com/charts">AG Charts</a>.</p>
22
+ <!-- END MAIN DESCRIPTION -->
23
+ <br>
24
+ </div>
25
+
26
+ <picture>
27
+ <source srcset="https://ag-grid.com/studio/images/studio-footer.png" media="(prefers-color-scheme: light)">
28
+ <source srcset="https://ag-grid.com/studio/images/studio-footer-dark.png" media="(prefers-color-scheme: dark)">
29
+ <img src="https://ag-grid.com/studio/images/studio-footer.png" alt="AG Studio Preview">
30
+ </picture>
31
+ <div align="right">
32
+ <a href="https://ag-grid.com/studio/example/"><br><img alt="Live Demo" src="https://img.shields.io/badge/ag--grid.com%2Fstudio-Live%20Demo-blue?style=for-the-badge"></a>
33
+ </div>
34
+
35
+ ## Overview
36
+
37
+ AG Studio is an embedded analytics component that lets analysts build interactive dashboards on top of your data. Add a single component to your application, configure your data source and get drag-and-drop report building with advanced cross-filtering, powered by a built-in data engine.
38
+
39
+ ### How it Works
40
+
41
+ Your application owns the surrounding shell: routing, authentication, data fetching, persistence, whilst AG Studio handles everything inside the component boundary: the canvas, widgets, drag-and-drop, and filtering, all powered by a built-in data engine that runs entirely in the browser.
42
+
43
+ Once configured, analysts can use the drag-and-drop UI to create self-serve reports, and end users can then interact with those reports to interrogate their data with cross-filters and page-level filters.
44
+
45
+ You can ship pre-built reports in code so users see a finished dashboard on first load, or let analysts create reports from scratch using the drag-and-drop editor. The entire dashboard state is a single JSON object, so you can save and restore it later.
46
+
47
+ ### Features
48
+
49
+ | Feature | Description |
50
+ | ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
51
+ | [Drag & Drop Report Builder](https://ag-grid.com/studio/angular/modes-layout/) | Bar charts, line charts, pie charts, grids, KPI tiles, text, and images on a drag-and-drop canvas. Design in **edit mode**, then switch to **view mode** to lock the layout while keeping the dashboard fully interactive. |
52
+ | [Data Engine](https://ag-grid.com/studio/angular/data/) | Provide one or more data sources and the data engine automatically manages joins across tables via relationships, aggregation, filtering, and calculated fields through an expression language. No query layer required. |
53
+ | [Advanced Filtering](https://ag-grid.com/studio/angular/filters/) | Page-level filters, widget-level filters, and cross-filtering between widgets are all built in. Users can filter from the filters panel, from on-canvas filter widgets (list, button, and date), or by clicking data points in charts to cross-filter the rest of the page. |
54
+ | [Theming](https://ag-grid.com/studio/angular/theming/) | Full customisation via the Theming API. Override colours, fonts, spacing, and borders across the Studio UI, grid widgets, and chart widgets independently. Light and dark modes are supported out of the box. |
55
+ | [State Management](https://ag-grid.com/studio/angular/state/) | The entire dashboard state (pages, widgets, layout, and filters) is captured in a single serialisable JSON object. Save and restore state to persist reports, and let users switch between saved reports. |
56
+
57
+ ## Quick Start
58
+
59
+ <!-- START QUICK START DESCRIPTION -->
60
+
61
+ To configure AG Studio, simply provide your data and render the component.
62
+
63
+ <!-- END QUICK START DESCRIPTION -->
64
+
65
+ ### Installation
66
+
67
+ ```sh
68
+ npm install ag-studio-angular
69
+ ```
70
+
71
+ ### Setup
72
+
73
+ **1. Define Your Data**
74
+
75
+ Studio works with arrays of plain objects, where each array becomes a data source:
76
+
77
+ ```ts
78
+ const data = {
79
+ sources: [
80
+ {
81
+ id: 'products',
82
+ data: [
83
+ {
84
+ product_name: 'Printer',
85
+ category: 'Printing & Imaging',
86
+ brand: 'CleanSlate Office',
87
+ list_price: 109.09,
88
+ unit_cost: 92.26,
89
+ },
90
+ {
91
+ product_name: 'Notebook',
92
+ category: 'Paper & Notebooks',
93
+ brand: 'PaperLine',
94
+ list_price: 24.7,
95
+ unit_cost: 14.19,
96
+ },
97
+ {
98
+ product_name: 'Highlighters',
99
+ category: 'Writing Instruments',
100
+ brand: 'PaperLine',
101
+ list_price: 10.34,
102
+ unit_cost: 5.03,
103
+ },
104
+ // ... more rows
105
+ ],
106
+ },
107
+ ],
108
+ };
109
+ ```
110
+
111
+ **2. Add the Component**
112
+
113
+ Import `AgStudio` from `ag-studio-angular` and add it to your component. AG Studio fills the size of its parent, so ensure it has a height and width:
114
+
115
+ ```ts
116
+ import { Component } from '@angular/core';
117
+ import { AgStudio } from 'ag-studio-angular';
118
+
119
+ @Component({
120
+ selector: 'app-dashboard',
121
+ standalone: true,
122
+ imports: [AgStudio],
123
+ template: `
124
+ <div style="height: 100%; width: 100%">
125
+ <ag-studio [data]="data" mode="edit" />
126
+ </div>
127
+ `,
128
+ })
129
+ export class DashboardComponent {
130
+ data = data;
131
+ }
132
+ ```
133
+
134
+ That's it — users can now build reports using the drag-and-drop editor.
135
+
136
+ > **Note:** For more information on building dashboards with AG Studio, refer to our [Quick Start](https://ag-grid.com/studio/angular/quick-start/) guide or step through the full [Tutorial](https://ag-grid.com/studio/angular/tutorial/).
137
+
138
+ ## User Guides
139
+
140
+ Our [User Guides](https://ag-grid.com/studio/angular/user-interface/) contain comprehensive guides to help users understand how to use AG Studio.
141
+
142
+ ## Support
143
+
144
+ AG Studio customers have access to dedicated support via [ZenDesk](https://ag-grid.zendesk.com/hc/en-us), which is monitored by our engineering teams.
145
+
146
+ ## License
147
+
148
+ `ag-studio` has a **Commercial** license. See the [LICENSE file](./LICENSE.html) for more info.
149
+
150
+ [Request a free 45-day enterprise trial](https://ag-grid.com/studio/license-pricing/?tab=trial) to explore the full enterprise capabilities of AG Studio with no restrictions or watermarks.
151
+
152
+ <div><h2><img vertical-align="middle" width="32" height="32" src="https://ag-grid.com/images/ag-logos/svg-logos/AG-BrandMark_Light-Theme.svg" alt="AG Grid Logo">&nbsp;AG Grid</h2></div>
153
+
154
+ AG Studio is built on top of [AG Grid](https://www.ag-grid.com/) — the best JavaScript Data Grid in the world. If you need a standalone data grid with sorting, filtering, grouping, pivoting, and more, check out [AG Grid Repo](https://github.com/ag-grid/ag-grid).
155
+
156
+ <picture>
157
+ <source srcset="https://github.com/ag-grid/ag-grid/blob/latest/readme-assets/kitchen-sink-demo-light.gif?raw=true" media="(prefers-color-scheme: light)">
158
+ <source srcset="https://github.com/ag-grid/ag-grid/blob/latest/readme-assets/kitchen-sink-demo-dark.gif?raw=true" media="(prefers-color-scheme: dark)">
159
+ <img src="https://github.com/ag-grid/ag-grid/blob/latest/readme-assets/kitchen-sink-demo-light.gif?raw=true" alt="High Performance Demo">
160
+ </picture>
161
+
162
+ <div><h2><img vertical-align="middle" width="32" height="32" src="https://ag-grid.com/images/ag-logos/svg-logos/AG-BrandMark_Light-Theme.svg" alt="AG Charts Logo">&nbsp;AG Charts</h2></div>
163
+
164
+ AG Studio is built on top of [AG Charts](https://www.ag-grid.com/charts/) — the best JavaScript Charting library in the world. If you need standalone charts with bar, line, pie, scatter, treemap, and more, check out [AG Charts](https://github.com/ag-grid/ag-charts).
165
+
166
+ <picture>
167
+ <source media="(prefers-color-scheme: dark)" srcset="https://github.com/ag-grid/ag-charts/blob/latest/packages/ag-charts-website/public/images/readme-assets/gallery-dark.gif?raw=true"/>
168
+ <source media="(prefers-color-scheme: light)" srcset="https://github.com/ag-grid/ag-charts/blob/latest/packages/ag-charts-website/public/images/readme-assets/gallery.gif?raw=true"/>
169
+ <img width="100%" alt="Preview of AG Charts JavaScript Charting Examples" src="https://github.com/ag-grid/ag-charts/blob/latest/packages/ag-charts-website/public/images/readme-assets/gallery.gif?raw=true"/>
170
+ </picture>
171
+
172
+ <div align="center">
173
+
174
+ <hr/>
175
+
176
+ <strong>Follow us to keep up to date with all the latest news from AG Studio:</strong>
177
+
178
+ <a href="https://x.com/ag_grid"><img src="https://img.shields.io/badge/-X%20(Twitter)-black?style=for-the-badge&logo=x" alt="Twitter" height="36"></a>
179
+ <a href="https://www.linkedin.com/company/ag-grid/"><img src="https://img.shields.io/badge/-LinkedIn-blue?style=for-the-badge&logo=linkedin" alt="LinkedIn" height="36"></a>
180
+ <a href="https://www.youtube.com/c/ag-grid"><img src="https://img.shields.io/badge/-YouTube-red?style=for-the-badge&logo=youtube" alt="YouTube" height="36"></a>
181
+ <a href="https://blog.ag-grid.com"><img src="https://img.shields.io/badge/-Blog-grey?style=for-the-badge&logo=rss" alt="Blog" height="36"></a>
182
+
183
+ </div>
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWctc3R1ZGlvLWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9hZy1zdHVkaW8tYW5ndWxhci9zcmMvYWctc3R1ZGlvLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,321 @@
1
+ /* eslint-disable no-duplicate-imports */
2
+ // False positive lint error, ElementRef and co can't be type imports
3
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
4
+ import { Component, EventEmitter, Input, Output, ViewEncapsulation, booleanAttribute, } from '@angular/core';
5
+ import { _BOOLEAN_MIXED_STUDIO_PROPERTIES, _combineAttributesAndStudioProperties, _createStudio, _processPropertyChanges, } from 'ag-studio';
6
+ // @END_IMPORTS@
7
+ import { AngularFrameworkOverrides } from './angularFrameworkOverrides';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./angularFrameworkOverrides";
10
+ export class AgStudio {
11
+ constructor(elementDef, _angularFrameworkOverrides) {
12
+ this._angularFrameworkOverrides = _angularFrameworkOverrides;
13
+ this._initialised = false;
14
+ this._destroyed = false;
15
+ // in order to ensure firing of apiReady is deterministic
16
+ this._holdEvents = true;
17
+ this._fullyReady = new Promise((resolve) => {
18
+ this._resolveFullyReady = resolve;
19
+ });
20
+ // @START@
21
+ /** Change this value to set the tabIndex order of Studio within your application.
22
+ * @default 0
23
+ * @initial
24
+ */
25
+ this.tabIndex = undefined;
26
+ /** Set to `true` to operate Studio in RTL (Right to Left) mode.
27
+ * @default false
28
+ * @initial
29
+ */
30
+ this.enableRtl = undefined;
31
+ /** DOM element to use as the popup parent for Studio popups (context menus, etc.).
32
+ */
33
+ this.popupParent = undefined;
34
+ /** Theme to apply to Studio.
35
+ *
36
+ * @default studioTheme
37
+ */
38
+ this.theme = undefined;
39
+ /** If your theme uses a font that is available on Google Fonts, pass true to load it from Google's CDN.
40
+ */
41
+ this.loadThemeGoogleFonts = undefined;
42
+ /** The CSS layer that this theme should be rendered onto. When specified,
43
+ * Studio CSS will be wrapped in a `@layer ${themeCssLayer} { ... }` block.
44
+ *
45
+ * NOTE: when specifying `themeCssLayer` we recommend setting
46
+ * `themeStyleContainer` to `document.body` to ensure that Studio CSS
47
+ * comes after your application CSS, allowing your application to set the
48
+ * order of layers.
49
+ *
50
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/@layer
51
+ */
52
+ this.themeCssLayer = undefined;
53
+ /** The nonce attribute to set on style elements added to the document by
54
+ * themes. If "foo" is passed to this property, Studio can use the Content
55
+ * Security Policy `style-src 'nonce-foo'`, instead of the less secure
56
+ * `style-src 'unsafe-inline'`.
57
+ *
58
+ * Note: CSP nonces are global to a page, where a page has multiple Studio components,
59
+ * every one must have the same styleNonce set.
60
+ */
61
+ this.styleNonce = undefined;
62
+ /** An element to insert style elements into when injecting styles into the
63
+ * Studio. Styles are inserted at the start of the element.
64
+ *
65
+ * If undefined, styles will be added to the document head for Studio components
66
+ * rendered in the main document fragment, or to Studio wrapper element
67
+ * for other Studio components (e.g. those rendered in a shadow DOM or detached from the
68
+ * document).
69
+ *
70
+ * @initial
71
+ */
72
+ this.themeStyleContainer = undefined;
73
+ /** Allows overriding what `document` is used.
74
+ * Use this when you want Studio to use a different `document` than the one available on the global scope.
75
+ * This can happen if docking out components (something which Electron supports).
76
+ */
77
+ this.getDocument = undefined;
78
+ /** Disables touch support (but does not remove the browser's efforts to simulate mouse events on touch).
79
+ * @default false
80
+ * @initial
81
+ */
82
+ this.suppressTouch = undefined;
83
+ /** A map of key->value pairs for localising text within Studio.
84
+ * @initial
85
+ */
86
+ this.localeText = undefined;
87
+ /** A callback for localising text within Studio.
88
+ * @initial
89
+ */
90
+ this.getLocaleText = undefined;
91
+ /** Provide a custom `studioId` for this instance of Studio. Value will be set on the root DOM node using the attribute `studio-id` as well as being accessible via the `api.getStudioId()` method.
92
+ * @initial
93
+ */
94
+ this.studioId = undefined;
95
+ /** Provides a context object that is provided to different callbacks Studio uses. Used for passing additional information to the callbacks used by your application.
96
+ * @initial
97
+ */
98
+ this.context = undefined;
99
+ /** Initial state for Studio. Only read once on initialization. Can be used in conjunction with `api.getState()` to save and restore Studio state.
100
+ * @initial
101
+ */
102
+ this.initialState = undefined;
103
+ /** Defines the data sources used by Studio.
104
+ *
105
+ * If updated after initially being set, only changes to synchronous data will be processed.
106
+ * Any other changes will be ignored (e.g. adding/removing data sources, updating fields, etc.)
107
+ */
108
+ this.data = undefined;
109
+ /** Which mode Studio is in.
110
+ * @default 'view'
111
+ */
112
+ this.mode = undefined;
113
+ /** Default layout styling.
114
+ */
115
+ this.layout = undefined;
116
+ /** AI Assistant configuration.
117
+ *
118
+ * NOTE: The **AI Assistant** is an experimental feature. Behaviour will be
119
+ * slightly different depending on the LLM being used, and results can vary across queries.
120
+ *
121
+ * @initial
122
+ */
123
+ this.ai = undefined;
124
+ /** Overrides for the layout and widget configs.
125
+ */
126
+ this.overrides = undefined;
127
+ /** Configure which panels are displayed and on which side.
128
+ */
129
+ this.panels = undefined;
130
+ /** State has been updated.
131
+ */
132
+ this.stateUpdated = new EventEmitter();
133
+ /** The API has been initialised and is ready for most calls. The data engine has not been initialised yet, and the UI is not ready.
134
+ */
135
+ this.apiReady = new EventEmitter();
136
+ /** The data engine has been initialised, and the UI has been created, but may not be fully rendered yet.
137
+ */
138
+ this.studioReady = new EventEmitter();
139
+ /** An error has occurred within Studio.
140
+ */
141
+ this.errorRaised = new EventEmitter();
142
+ this._nativeElement = elementDef.nativeElement;
143
+ // NOSONAR
144
+ this._fullyReady.then(() => {
145
+ // Register the status flag reset before any events are fired
146
+ // so that we can swap to synchronous event firing as soon as the studio is ready
147
+ this._holdEvents = false;
148
+ });
149
+ }
150
+ ngAfterViewInit() {
151
+ // Run the setup outside of angular so all the event handlers that are created do not trigger change detection
152
+ this._angularFrameworkOverrides.runOutsideAngular(() => {
153
+ // Get all the inputs that are valid AgStudioProperties
154
+ const studioPropertiesKeys = Object.keys(this).filter((key) => !(key.startsWith('_') ||
155
+ key == 'studioProperties' ||
156
+ key == 'modules' ||
157
+ this[key] instanceof EventEmitter));
158
+ const coercedStudioProperties = {};
159
+ for (const key of studioPropertiesKeys) {
160
+ const valueToUse = getValueOrCoercedValue(key, this[key]);
161
+ coercedStudioProperties[key] = valueToUse;
162
+ }
163
+ const mergedStudioProperties = _combineAttributesAndStudioProperties(this.studioProperties, coercedStudioProperties, studioPropertiesKeys);
164
+ const studioParams = {
165
+ globalListener: this.globalListener.bind(this),
166
+ frameworkOverrides: this._angularFrameworkOverrides,
167
+ setThemeOnRootDiv: true,
168
+ modules: this.modules,
169
+ };
170
+ const api = _createStudio(this._nativeElement, mergedStudioProperties, studioParams);
171
+ if (api) {
172
+ this.api = api;
173
+ }
174
+ this._initialised = true;
175
+ // sometimes, especially in large client apps apiReady can fire before ngAfterViewInit
176
+ // this ties these together so that apiReady will always fire after agStudio's ngAfterViewInit
177
+ // the actual containing component's ngAfterViewInit will fire just after agStudio's
178
+ this._resolveFullyReady();
179
+ });
180
+ }
181
+ ngOnChanges(changes) {
182
+ if (this._initialised) {
183
+ // Run the changes outside of angular so any event handlers that are created do not trigger change detection
184
+ this._angularFrameworkOverrides.runOutsideAngular(() => {
185
+ const studioProperties = {};
186
+ for (const key of Object.keys(changes)) {
187
+ const value = changes[key];
188
+ studioProperties[key] = value.currentValue;
189
+ }
190
+ _processPropertyChanges(studioProperties, this.api);
191
+ });
192
+ }
193
+ }
194
+ ngOnDestroy() {
195
+ if (this._initialised) {
196
+ // need to do this before the destroy, so we know not to emit any events
197
+ // while tearing down the studio.
198
+ this._destroyed = true;
199
+ // could be null if studio failed to initialise
200
+ this.api?.destroy();
201
+ }
202
+ }
203
+ // we'll emit the emit if a user is listening for a given event either on the component via normal angular binding
204
+ // or via studioProperties
205
+ isEmitterUsed(eventType) {
206
+ const emitter = this[eventType];
207
+ // For RxJs compatibility we need to check for observed v7+ or observers v6
208
+ const emitterAny = emitter;
209
+ const hasEmitter = emitterAny?.observed ?? emitterAny?.observers?.length > 0;
210
+ // apiReady => onApiReady
211
+ const asEventName = `on${eventType.charAt(0).toUpperCase()}${eventType.substring(1)}`;
212
+ const hasStudioPropertyListener = !!this.studioProperties && !!this.studioProperties[asEventName];
213
+ return hasEmitter || hasStudioPropertyListener;
214
+ }
215
+ globalListener(eventType, event) {
216
+ // if we are tearing down, don't emit angular events, as this causes
217
+ // problems with the angular router
218
+ if (this._destroyed) {
219
+ return;
220
+ }
221
+ // generically look up the eventType
222
+ const emitter = this[eventType];
223
+ if (emitter && this.isEmitterUsed(eventType)) {
224
+ // Make sure we emit within the angular zone, so change detection works properly
225
+ const fireEmitter = () => this._angularFrameworkOverrides.runInsideAngular(() => emitter.emit(event));
226
+ if (this._holdEvents) {
227
+ // if the user is listening to events, wait for ngAfterViewInit to fire first, then emit the studio events
228
+ this._fullyReady.then(() => fireEmitter());
229
+ }
230
+ else {
231
+ fireEmitter();
232
+ }
233
+ }
234
+ }
235
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudio, deps: [{ token: i0.ElementRef }, { token: i1.AngularFrameworkOverrides }], target: i0.ɵɵFactoryTarget.Component }); }
236
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.14", type: AgStudio, isStandalone: true, selector: "ag-studio", inputs: { studioProperties: "studioProperties", modules: "modules", tabIndex: "tabIndex", enableRtl: ["enableRtl", "enableRtl", booleanAttribute], popupParent: "popupParent", theme: "theme", loadThemeGoogleFonts: ["loadThemeGoogleFonts", "loadThemeGoogleFonts", booleanAttribute], themeCssLayer: "themeCssLayer", styleNonce: "styleNonce", themeStyleContainer: "themeStyleContainer", getDocument: "getDocument", suppressTouch: ["suppressTouch", "suppressTouch", booleanAttribute], localeText: "localeText", getLocaleText: "getLocaleText", studioId: "studioId", context: "context", initialState: "initialState", data: "data", mode: "mode", layout: "layout", ai: "ai", overrides: "overrides", panels: "panels" }, outputs: { stateUpdated: "stateUpdated", apiReady: "apiReady", studioReady: "studioReady", errorRaised: "errorRaised" }, providers: [AngularFrameworkOverrides], usesOnChanges: true, ngImport: i0, template: '', isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
237
+ }
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudio, decorators: [{
239
+ type: Component,
240
+ args: [{
241
+ selector: 'ag-studio',
242
+ standalone: true,
243
+ template: '',
244
+ providers: [AngularFrameworkOverrides],
245
+ // tell angular we don't want view encapsulation, we don't want a shadow root
246
+ encapsulation: ViewEncapsulation.None,
247
+ }]
248
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.AngularFrameworkOverrides }], propDecorators: { studioProperties: [{
249
+ type: Input
250
+ }], modules: [{
251
+ type: Input
252
+ }], tabIndex: [{
253
+ type: Input
254
+ }], enableRtl: [{
255
+ type: Input,
256
+ args: [{ transform: booleanAttribute }]
257
+ }], popupParent: [{
258
+ type: Input
259
+ }], theme: [{
260
+ type: Input
261
+ }], loadThemeGoogleFonts: [{
262
+ type: Input,
263
+ args: [{ transform: booleanAttribute }]
264
+ }], themeCssLayer: [{
265
+ type: Input
266
+ }], styleNonce: [{
267
+ type: Input
268
+ }], themeStyleContainer: [{
269
+ type: Input
270
+ }], getDocument: [{
271
+ type: Input
272
+ }], suppressTouch: [{
273
+ type: Input,
274
+ args: [{ transform: booleanAttribute }]
275
+ }], localeText: [{
276
+ type: Input
277
+ }], getLocaleText: [{
278
+ type: Input
279
+ }], studioId: [{
280
+ type: Input
281
+ }], context: [{
282
+ type: Input
283
+ }], initialState: [{
284
+ type: Input
285
+ }], data: [{
286
+ type: Input
287
+ }], mode: [{
288
+ type: Input
289
+ }], layout: [{
290
+ type: Input
291
+ }], ai: [{
292
+ type: Input
293
+ }], overrides: [{
294
+ type: Input
295
+ }], panels: [{
296
+ type: Input
297
+ }], stateUpdated: [{
298
+ type: Output
299
+ }], apiReady: [{
300
+ type: Output
301
+ }], studioReady: [{
302
+ type: Output
303
+ }], errorRaised: [{
304
+ type: Output
305
+ }] } });
306
+ const booleanMixedStudioProperties = new Set(_BOOLEAN_MIXED_STUDIO_PROPERTIES);
307
+ /**
308
+ * Used to support the user setting combined boolean and string / object properties
309
+ * as plain HTML attributes and us correctly mapping that to true.
310
+ * For example cellSection can be boolean or an object
311
+ */
312
+ function getValueOrCoercedValue(key, valueToUse) {
313
+ if (booleanMixedStudioProperties.has(key)) {
314
+ // Handle plain HTML boolean attributes and convert them to boolean values
315
+ // Also handle the false string case to match Angular boolean attributes
316
+ // eslint-disable-next-line sonarjs/no-nested-conditional
317
+ return valueToUse === '' ? true : valueToUse === 'false' ? false : valueToUse;
318
+ }
319
+ return valueToUse;
320
+ }
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWctc3R1ZGlvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FnLXN0dWRpby1hbmd1bGFyL3NyYy9saWIvYWctc3R1ZGlvLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5Q0FBeUM7QUFDekMscUVBQXFFO0FBQ3JFLHNFQUFzRTtBQUN0RSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixnQkFBZ0IsR0FDbkIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNILGdDQUFnQyxFQUNoQyxxQ0FBcUMsRUFDckMsYUFBYSxFQUNiLHVCQUF1QixHQUMxQixNQUFNLFdBQVcsQ0FBQztBQW9CbkIsZ0JBQWdCO0FBRWhCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFVeEUsTUFBTSxPQUFPLFFBQVE7SUFpQmpCLFlBQ0ksVUFBc0IsRUFDTCwwQkFBcUQ7UUFBckQsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUEyQjtRQWZsRSxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRTNCLHlEQUF5RDtRQUNqRCxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVWLGdCQUFXLEdBQWtCLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQXFJSCxVQUFVO1FBQ1Y7OztXQUdHO1FBQ2EsYUFBUSxHQUF1QixTQUFTLENBQUM7UUFDekQ7OztXQUdHO1FBQzRDLGNBQVMsR0FBd0IsU0FBUyxDQUFDO1FBQzFGO1dBQ0c7UUFDYSxnQkFBVyxHQUFtQyxTQUFTLENBQUM7UUFDeEU7OztXQUdHO1FBQ2EsVUFBSyxHQUE4QixTQUFTLENBQUM7UUFD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Z0JBSXRCLFVBQVU7c0JBQXpCLEtBQUs7Z0JBSVUsYUFBYTtzQkFBNUIsS0FBSztnQkFJVSxRQUFRO3NCQUF2QixLQUFLO2dCQUlVLE9BQU87c0JBQXRCLEtBQUs7Z0JBSVUsWUFBWTtzQkFBM0IsS0FBSztnQkFNVSxJQUFJO3NCQUFuQixLQUFLO2dCQUlVLElBQUk7c0JBQW5CLEtBQUs7Z0JBR1UsTUFBTTtzQkFBckIsS0FBSztnQkFRVSxFQUFFO3NCQUFqQixLQUFLO2dCQUdVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBR1UsTUFBTTtzQkFBckIsS0FBSztnQkFJVyxZQUFZO3NCQUE1QixNQUFNO2dCQUlVLFFBQVE7c0JBQXhCLE1BQU07Z0JBR1UsV0FBVztzQkFBM0IsTUFBTTtnQkFHVSxXQUFXO3NCQUEzQixNQUFNOztBQUtYLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxHQUFHLENBQVMsZ0NBQWdDLENBQUMsQ0FBQztBQUN2Rjs7OztHQUlHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxHQUFXLEVBQUUsVUFBZTtJQUN4RCxJQUFJLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hDLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUseURBQXlEO1FBQ3pELE9BQU8sVUFBVSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUNsRixDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWR1cGxpY2F0ZS1pbXBvcnRzICovXG4vLyBGYWxzZSBwb3NpdGl2ZSBsaW50IGVycm9yLCBFbGVtZW50UmVmIGFuZCBjbyBjYW4ndCBiZSB0eXBlIGltcG9ydHNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC10eXBlLWltcG9ydHNcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgYm9vbGVhbkF0dHJpYnV0ZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IEFnU3R1ZGlvQXBpLCBBZ1N0dWRpb01vZHVsZSwgQWdTdHVkaW9Qcm9wZXJ0aWVzLCBfU3R1ZGlvUGFyYW1zIH0gZnJvbSAnYWctc3R1ZGlvJztcbmltcG9ydCB7XG4gICAgX0JPT0xFQU5fTUlYRURfU1RVRElPX1BST1BFUlRJRVMsXG4gICAgX2NvbWJpbmVBdHRyaWJ1dGVzQW5kU3R1ZGlvUHJvcGVydGllcyxcbiAgICBfY3JlYXRlU3R1ZGlvLFxuICAgIF9wcm9jZXNzUHJvcGVydHlDaGFuZ2VzLFxufSBmcm9tICdhZy1zdHVkaW8nO1xuLy8gQFNUQVJUX0lNUE9SVFNAXG5pbXBvcnQgdHlwZSB7XG4gICAgQWdBaUFzc2lzdGFudCxcbiAgICBBZ0RhdGFFbmdpbmUsXG4gICAgQWdEYXRhU291cmNlc0RlZmluaXRpb24sXG4gICAgQWdQYWdlTGF5b3V0U3RhdGUsXG4gICAgQWdQYW5lbENvbmZpZyxcbiAgICBBZ1JlcG9ydFN0YXRlLFxuICAgIEFnU3R1ZGlvQXBpUmVhZHlFdmVudCxcbiAgICBBZ1N0dWRpb0Vycm9yUmFpc2VkRXZlbnQsXG4gICAgQWdTdHVkaW9HZXRMb2NhbGVUZXh0UGFyYW1zLFxuICAgIEFnU3R1ZGlvTG9jYWxlVGV4dCxcbiAgICBBZ1N0dWRpb01vZGUsXG4gICAgQWdTdHVkaW9PdmVycmlkZXMsXG4gICAgQWdTdHVkaW9SZWFkeUV2ZW50LFxuICAgIEFnU3R1ZGlvU3RhdGVVcGRhdGVkRXZlbnQsXG4gICAgQWdTdHVkaW9UaGVtZSxcbn0gZnJvbSAnYWctc3R1ZGlvJztcblxuLy8gQEVORF9JTVBPUlRTQFxuXG5pbXBvcnQgeyBBbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzIH0gZnJvbSAnLi9hbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhZy1zdHVkaW8nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6ICcnLFxuICAgIHByb3ZpZGVyczogW0FuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXNdLFxuICAgIC8vIHRlbGwgYW5ndWxhciB3ZSBkb24ndCB3YW50IHZpZXcgZW5jYXBzdWxhdGlvbiwgd2UgZG9uJ3Qgd2FudCBhIHNoYWRvdyByb290XG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQWdTdHVkaW8gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgLy8gbm90IGludGVuZGVkIGZvciB1c2VyIHRvIGludGVyYWN0IHdpdGguIHNvIHB1dHRpbmcgXyBpbiBzbyBpZiB1c2VyIGdldHMgcmVmZXJlbmNlXG4gICAgLy8gdG8gdGhpcyBvYmplY3QsIHRoZXkga2luZCdhIGtub3cgaXQncyBub3QgcGFydCBvZiB0aGUgYWdyZWVkIGludGVyZmFjZVxuICAgIHByaXZhdGUgcmVhZG9ubHkgX25hdGl2ZUVsZW1lbnQ6IGFueTtcbiAgICBwcml2YXRlIF9pbml0aWFsaXNlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgLy8gaW4gb3JkZXIgdG8gZW5zdXJlIGZpcmluZyBvZiBhcGlSZWFkeSBpcyBkZXRlcm1pbmlzdGljXG4gICAgcHJpdmF0ZSBfaG9sZEV2ZW50cyA9IHRydWU7XG4gICAgcHJpdmF0ZSBfcmVzb2x2ZUZ1bGx5UmVhZHk6ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZnVsbHlSZWFkeTogUHJvbWlzZTx2b2lkPiA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVGdWxseVJlYWR5ID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIC8qKiBEYXNoIEFwaSBhdmFpbGFibGUgYWZ0ZXIgb25BcGlSZWFkeSBldmVudCBoYXMgZmlyZWQuICovXG4gICAgcHVibGljIGFwaTogQWdTdHVkaW9BcGk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZWxlbWVudERlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfYW5ndWxhckZyYW1ld29ya092ZXJyaWRlczogQW5ndWxhckZyYW1ld29ya092ZXJyaWRlc1xuICAgICkge1xuICAgICAgICB0aGlzLl9uYXRpdmVFbGVtZW50ID0gZWxlbWVudERlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAvLyBOT1NPTkFSXG4gICAgICAgIHRoaXMuX2Z1bGx5UmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgc3RhdHVzIGZsYWcgcmVzZXQgYmVmb3JlIGFueSBldmVudHMgYXJlIGZpcmVkXG4gICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBzd2FwIHRvIHN5bmNocm9ub3VzIGV2ZW50IGZpcmluZyBhcyBzb29uIGFzIHRoZSBzdHVkaW8gaXMgcmVhZHlcbiAgICAgICAgICAgIHRoaXMuX2hvbGRFdmVudHMgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICAvLyBSdW4gdGhlIHNldHVwIG91dHNpZGUgb2YgYW5ndWxhciBzbyBhbGwgdGhlIGV2ZW50IGhhbmRsZXJzIHRoYXQgYXJlIGNyZWF0ZWQgZG8gbm90IHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICB0aGlzLl9hbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgdGhlIGlucHV0cyB0aGF0IGFyZSB2YWxpZCBBZ1N0dWRpb1Byb3BlcnRpZXNcbiAgICAgICAgICAgIGNvbnN0IHN0dWRpb1Byb3BlcnRpZXNLZXlzID0gT2JqZWN0LmtleXModGhpcykuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChrZXkpID0+XG4gICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkuc3RhcnRzV2l0aCgnXycpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ3N0dWRpb1Byb3BlcnRpZXMnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ21vZHVsZXMnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW2tleSBhcyBrZXlvZiBBZ1N0dWRpb10gaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgY29lcmNlZFN0dWRpb1Byb3BlcnRpZXMgPSB7fSBhcyBBZ1N0dWRpb1Byb3BlcnRpZXM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBzdHVkaW9Qcm9wZXJ0aWVzS2V5cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlVG9Vc2UgPSBnZXRWYWx1ZU9yQ29lcmNlZFZhbHVlKGtleSwgdGhpc1trZXkgYXMga2V5b2YgQWdTdHVkaW9dKTtcbiAgICAgICAgICAgICAgICBjb2VyY2VkU3R1ZGlvUHJvcGVydGllc1trZXkgYXMga2V5b2YgQWdTdHVkaW9Qcm9wZXJ0aWVzXSA9IHZhbHVlVG9Vc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZFN0dWRpb1Byb3BlcnRpZXMgPSBfY29tYmluZUF0dHJpYnV0ZXNBbmRTdHVkaW9Qcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICAgIHRoaXMuc3R1ZGlvUHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICBjb2VyY2VkU3R1ZGlvUHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICBzdHVkaW9Qcm9wZXJ0aWVzS2V5c1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc3R1ZGlvUGFyYW1zOiBfU3R1ZGlvUGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGdsb2JhbExpc3RlbmVyOiB0aGlzLmdsb2JhbExpc3RlbmVyLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgZnJhbWV3b3JrT3ZlcnJpZGVzOiB0aGlzLl9hbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzLFxuICAgICAgICAgICAgICAgIHNldFRoZW1lT25Sb290RGl2OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1vZHVsZXM6IHRoaXMubW9kdWxlcyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGFwaSA9IF9jcmVhdGVTdHVkaW8odGhpcy5fbmF0aXZlRWxlbWVudCwgbWVyZ2VkU3R1ZGlvUHJvcGVydGllcywgc3R1ZGlvUGFyYW1zKTtcbiAgICAgICAgICAgIGlmIChhcGkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwaSA9IGFwaTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGlzZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBzb21ldGltZXMsIGVzcGVjaWFsbHkgaW4gbGFyZ2UgY2xpZW50IGFwcHMgYXBpUmVhZHkgY2FuIGZpcmUgYmVmb3JlIG5nQWZ0ZXJWaWV3SW5pdFxuICAgICAgICAgICAgLy8gdGhpcyB0aWVzIHRoZXNlIHRvZ2V0aGVyIHNvIHRoYXQgYXBpUmVhZHkgd2lsbCBhbHdheXMgZmlyZSBhZnRlciBhZ1N0dWRpbydzIG5nQWZ0ZXJWaWV3SW5pdFxuICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBjb250YWluaW5nIGNvbXBvbmVudCdzIG5nQWZ0ZXJWaWV3SW5pdCB3aWxsIGZpcmUganVzdCBhZnRlciBhZ1N0dWRpbydzXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlRnVsbHlSZWFkeSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsaXNlZCkge1xuICAgICAgICAgICAgLy8gUnVuIHRoZSBjaGFuZ2VzIG91dHNpZGUgb2YgYW5ndWxhciBzbyBhbnkgZXZlbnQgaGFuZGxlcnMgdGhhdCBhcmUgY3JlYXRlZCBkbyBub3QgdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgICAgICB0aGlzLl9hbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHVkaW9Qcm9wZXJ0aWVzOiBBZ1N0dWRpb1Byb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjaGFuZ2VzKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNoYW5nZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgc3R1ZGlvUHJvcGVydGllc1trZXkgYXMga2V5b2YgQWdTdHVkaW9Qcm9wZXJ0aWVzXSA9IHZhbHVlLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX3Byb2Nlc3NQcm9wZXJ0eUNoYW5nZXMoc3R1ZGlvUHJvcGVydGllcywgdGhpcy5hcGkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsaXNlZCkge1xuICAgICAgICAgICAgLy8gbmVlZCB0byBkbyB0aGlzIGJlZm9yZSB0aGUgZGVzdHJveSwgc28gd2Uga25vdyBub3QgdG8gZW1pdCBhbnkgZXZlbnRzXG4gICAgICAgICAgICAvLyB3aGlsZSB0ZWFyaW5nIGRvd24gdGhlIHN0dWRpby5cbiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBjb3VsZCBiZSBudWxsIGlmIHN0dWRpbyBmYWlsZWQgdG8gaW5pdGlhbGlzZVxuICAgICAgICAgICAgdGhpcy5hcGk/LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHdlJ2xsIGVtaXQgdGhlIGVtaXQgaWYgYSB1c2VyIGlzIGxpc3RlbmluZyBmb3IgYSBnaXZlbiBldmVudCBlaXRoZXIgb24gdGhlIGNvbXBvbmVudCB2aWEgbm9ybWFsIGFuZ3VsYXIgYmluZGluZ1xuICAgIC8vIG9yIHZpYSBzdHVkaW9Qcm9wZXJ0aWVzXG4gICAgcHJvdGVjdGVkIGlzRW1pdHRlclVzZWQoZXZlbnRUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZW1pdHRlciA9IDxFdmVudEVtaXR0ZXI8YW55Pj4oPGFueT50aGlzKVtldmVudFR5cGVdO1xuICAgICAgICAvLyBGb3IgUnhKcyBjb21wYXRpYmlsaXR5IHdlIG5lZWQgdG8gY2hlY2sgZm9yIG9ic2VydmVkIHY3KyBvciBvYnNlcnZlcnMgdjZcbiAgICAgICAgY29uc3QgZW1pdHRlckFueSA9IGVtaXR0ZXIgYXMgYW55O1xuICAgICAgICBjb25zdCBoYXNFbWl0dGVyID0gZW1pdHRlckFueT8ub2JzZXJ2ZWQgPz8gZW1pdHRlckFueT8ub2JzZXJ2ZXJzPy5sZW5ndGggPiAwO1xuXG4gICAgICAgIC8vIGFwaVJlYWR5ID0+IG9uQXBpUmVhZHlcbiAgICAgICAgY29uc3QgYXNFdmVudE5hbWUgPSBgb24ke2V2ZW50VHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke2V2ZW50VHlwZS5zdWJzdHJpbmcoMSl9YDtcbiAgICAgICAgY29uc3QgaGFzU3R1ZGlvUHJvcGVydHlMaXN0ZW5lciA9ICEhdGhpcy5zdHVkaW9Qcm9wZXJ0aWVzICYmICEhKHRoaXMuc3R1ZGlvUHJvcGVydGllcyBhcyBhbnkpW2FzRXZlbnROYW1lXTtcblxuICAgICAgICByZXR1cm4gaGFzRW1pdHRlciB8fCBoYXNTdHVkaW9Qcm9wZXJ0eUxpc3RlbmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2xvYmFsTGlzdGVuZXIoZXZlbnRUeXBlOiBzdHJpbmcsIGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gaWYgd2UgYXJlIHRlYXJpbmcgZG93biwgZG9uJ3QgZW1pdCBhbmd1bGFyIGV2ZW50cywgYXMgdGhpcyBjYXVzZXNcbiAgICAgICAgLy8gcHJvYmxlbXMgd2l0aCB0aGUgYW5ndWxhciByb3V0ZXJcbiAgICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2VuZXJpY2FsbHkgbG9vayB1cCB0aGUgZXZlbnRUeXBlXG4gICAgICAgIGNvbnN0IGVtaXR0ZXIgPSA8RXZlbnRFbWl0dGVyPGFueT4+KDxhbnk+dGhpcylbZXZlbnRUeXBlXTtcbiAgICAgICAgaWYgKGVtaXR0ZXIgJiYgdGhpcy5pc0VtaXR0ZXJVc2VkKGV2ZW50VHlwZSkpIHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBlbWl0IHdpdGhpbiB0aGUgYW5ndWxhciB6b25lLCBzbyBjaGFuZ2UgZGV0ZWN0aW9uIHdvcmtzIHByb3Blcmx5XG4gICAgICAgICAgICBjb25zdCBmaXJlRW1pdHRlciA9ICgpID0+IHRoaXMuX2FuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMucnVuSW5zaWRlQW5ndWxhcigoKSA9PiBlbWl0dGVyLmVtaXQoZXZlbnQpKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2hvbGRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBpcyBsaXN0ZW5pbmcgdG8gZXZlbnRzLCB3YWl0IGZvciBuZ0FmdGVyVmlld0luaXQgdG8gZmlyZSBmaXJzdCwgdGhlbiBlbWl0IHRoZSBzdHVkaW8gZXZlbnRzXG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbHlSZWFkeS50aGVuKCgpID0+IGZpcmVFbWl0dGVyKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaXJlRW1pdHRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFByb3ZpZGVkIGFuIGluaXRpYWwgc3R1ZGlvUHJvcGVydGllcyBjb25maWd1cmF0aW9uIHRvIHRoZSBjb21wb25lbnQuIElmIGEgcHJvcGVydHkgaXMgc3BlY2lmaWVkIGluIGJvdGggc3R1ZGlvUHJvcGVydGllcyBhbmQgdmlhIGNvbXBvbmVudCBiaW5kaW5nIHRoZSBjb21wb25lbnQgYmluZGluZyB0YWtlcyBwcmVjZWRlbmNlLiAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgc3R1ZGlvUHJvcGVydGllczogQWdTdHVkaW9Qcm9wZXJ0aWVzIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gcmVnaXN0ZXIgQUcgU3R1ZGlvIE1vZHVsZXMgZGlyZWN0bHkgd2l0aCB0aGlzIGluc3RhbmNlIG9mIFN0dWRpby5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbW9kdWxlczogQWdTdHVkaW9Nb2R1bGVbXSB8IHVuZGVmaW5lZDtcblxuICAgIC8vIEBTVEFSVEBcbiAgICAvKiogQ2hhbmdlIHRoaXMgdmFsdWUgdG8gc2V0IHRoZSB0YWJJbmRleCBvcmRlciBvZiBTdHVkaW8gd2l0aGluIHlvdXIgYXBwbGljYXRpb24uXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqIEBpbml0aWFsXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHRhYkluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIFNldCB0byBgdHJ1ZWAgdG8gb3BlcmF0ZSBTdHVkaW8gaW4gUlRMIChSaWdodCB0byBMZWZ0KSBtb2RlLlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICogQGluaXRpYWxcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcHVibGljIGVuYWJsZVJ0bDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogRE9NIGVsZW1lbnQgdG8gdXNlIGFzIHRoZSBwb3B1cCBwYXJlbnQgZm9yIFN0dWRpbyBwb3B1cHMgKGNvbnRleHQgbWVudXMsIGV0Yy4pLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwb3B1cFBhcmVudDogSFRNTEVsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBUaGVtZSB0byBhcHBseSB0byBTdHVkaW8uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBzdHVkaW9UaGVtZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyB0aGVtZTogQWdTdHVkaW9UaGVtZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogSWYgeW91ciB0aGVtZSB1c2VzIGEgZm9udCB0aGF0IGlzIGF2YWlsYWJsZSBvbiBHb29nbGUgRm9udHMsIHBhc3MgdHJ1ZSB0byBsb2FkIGl0IGZyb20gR29vZ2xlJ3MgQ0ROLlxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBwdWJsaWMgbG9hZFRoZW1lR29vZ2xlRm9udHM6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIFRoZSBDU1MgbGF5ZXIgdGhhdCB0aGlzIHRoZW1lIHNob3VsZCBiZSByZW5kZXJlZCBvbnRvLiBXaGVuIHNwZWNpZmllZCxcbiAgICAgKiBTdHVkaW8gQ1NTIHdpbGwgYmUgd3JhcHBlZCBpbiBhIGBAbGF5ZXIgJHt0aGVtZUNzc0xheWVyfSB7IC4uLiB9YCBibG9jay5cbiAgICAgKlxuICAgICAqIE5PVEU6IHdoZW4gc3BlY2lmeWluZyBgdGhlbWVDc3NMYXllcmAgd2UgcmVjb21tZW5kIHNldHRpbmdcbiAgICAgKiBgdGhlbWVTdHlsZUNvbnRhaW5lcmAgdG8gYGRvY3VtZW50LmJvZHlgIHRvIGVuc3VyZSB0aGF0IFN0dWRpbyBDU1NcbiAgICAgKiBjb21lcyBhZnRlciB5b3VyIGFwcGxpY2F0aW9uIENTUywgYWxsb3dpbmcgeW91ciBhcHBsaWNhdGlvbiB0byBzZXQgdGhlXG4gICAgICogb3JkZXIgb2YgbGF5ZXJzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQGxheWVyXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHRoZW1lQ3NzTGF5ZXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogVGhlIG5vbmNlIGF0dHJpYnV0ZSB0byBzZXQgb24gc3R5bGUgZWxlbWVudHMgYWRkZWQgdG8gdGhlIGRvY3VtZW50IGJ5XG4gICAgICogdGhlbWVzLiBJZiBcImZvb1wiIGlzIHBhc3NlZCB0byB0aGlzIHByb3BlcnR5LCBTdHVkaW8gY2FuIHVzZSB0aGUgQ29udGVudFxuICAgICAqIFNlY3VyaXR5IFBvbGljeSBgc3R5bGUtc3JjICdub25jZS1mb28nYCwgaW5zdGVhZCBvZiB0aGUgbGVzcyBzZWN1cmVcbiAgICAgKiBgc3R5bGUtc3JjICd1bnNhZmUtaW5saW5lJ2AuXG4gICAgICpcbiAgICAgKiBOb3RlOiBDU1Agbm9uY2VzIGFyZSBnbG9iYWwgdG8gYSBwYWdlLCB3aGVyZSBhIHBhZ2UgaGFzIG11bHRpcGxlIFN0dWRpbyBjb21wb25lbnRzLFxuICAgICAqIGV2ZXJ5IG9uZSBtdXN0IGhhdmUgdGhlIHNhbWUgc3R5bGVOb25jZSBzZXQuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHN0eWxlTm9uY2U6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQW4gZWxlbWVudCB0byBpbnNlcnQgc3R5bGUgZWxlbWVudHMgaW50byB3aGVuIGluamVjdGluZyBzdHlsZXMgaW50byB0aGVcbiAgICAgKiBTdHVkaW8uIFN0eWxlcyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgdW5kZWZpbmVkLCBzdHlsZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgaGVhZCBmb3IgU3R1ZGlvIGNvbXBvbmVudHNcbiAgICAgKiByZW5kZXJlZCBpbiB0aGUgbWFpbiBkb2N1bWVudCBmcmFnbWVudCwgb3IgdG8gU3R1ZGlvIHdyYXBwZXIgZWxlbWVudFxuICAgICAqIGZvciBvdGhlciBTdHVkaW8gY29tcG9uZW50cyAoZS5nLiB0aG9zZSByZW5kZXJlZCBpbiBhIHNoYWRvdyBET00gb3IgZGV0YWNoZWQgZnJvbSB0aGVcbiAgICAgKiBkb2N1bWVudCkuXG4gICAgICpcbiAgICAgKiBAaW5pdGlhbFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyB0aGVtZVN0eWxlQ29udGFpbmVyOiAoSFRNTEVsZW1lbnQgfCAoKCkgPT4gSFRNTEVsZW1lbnQgfCB2b2lkKSkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEFsbG93cyBvdmVycmlkaW5nIHdoYXQgYGRvY3VtZW50YCBpcyB1c2VkLlxuICAgICAqIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgU3R1ZGlvIHRvIHVzZSBhIGRpZmZlcmVudCBgZG9jdW1lbnRgIHRoYW4gdGhlIG9uZSBhdmFpbGFibGUgb24gdGhlIGdsb2JhbCBzY29wZS5cbiAgICAgKiBUaGlzIGNhbiBoYXBwZW4gaWYgZG9ja2luZyBvdXQgY29tcG9uZW50cyAoc29tZXRoaW5nIHdoaWNoIEVsZWN0cm9uIHN1cHBvcnRzKS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgZ2V0RG9jdW1lbnQ6ICgoKSA9PiBEb2N1bWVudCkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIERpc2FibGVzIHRvdWNoIHN1cHBvcnQgKGJ1dCBkb2VzIG5vdCByZW1vdmUgdGhlIGJyb3dzZXIncyBlZmZvcnRzIHRvIHNpbXVsYXRlIG1vdXNlIGV2ZW50cyBvbiB0b3VjaCkuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKiBAaW5pdGlhbFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBwdWJsaWMgc3VwcHJlc3NUb3VjaDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQSBtYXAgb2Yga2V5LT52YWx1ZSBwYWlycyBmb3IgbG9jYWxpc2luZyB0ZXh0IHdpdGhpbiBTdHVkaW8uXG4gICAgICogQGluaXRpYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbG9jYWxlVGV4dDogQWdTdHVkaW9Mb2NhbGVUZXh0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBBIGNhbGxiYWNrIGZvciBsb2NhbGlzaW5nIHRleHQgd2l0aGluIFN0dWRpby5cbiAgICAgKiBAaW5pdGlhbFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBnZXRMb2NhbGVUZXh0OiAoKHBhcmFtczogQWdTdHVkaW9HZXRMb2NhbGVUZXh0UGFyYW1zKSA9PiBzdHJpbmcpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBQcm92aWRlIGEgY3VzdG9tIGBzdHVkaW9JZGAgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgU3R1ZGlvLiBWYWx1ZSB3aWxsIGJlIHNldCBvbiB0aGUgcm9vdCBET00gbm9kZSB1c2luZyB0aGUgYXR0cmlidXRlIGBzdHVkaW8taWRgIGFzIHdlbGwgYXMgYmVpbmcgYWNjZXNzaWJsZSB2aWEgdGhlIGBhcGkuZ2V0U3R1ZGlvSWQoKWAgbWV0aG9kLlxuICAgICAqIEBpbml0aWFsXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHN0dWRpb0lkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIFByb3ZpZGVzIGEgY29udGV4dCBvYmplY3QgdGhhdCBpcyBwcm92aWRlZCB0byBkaWZmZXJlbnQgY2FsbGJhY2tzIFN0dWRpbyB1c2VzLiBVc2VkIGZvciBwYXNzaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhlIGNhbGxiYWNrcyB1c2VkIGJ5IHlvdXIgYXBwbGljYXRpb24uXG4gICAgICogQGluaXRpYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgY29udGV4dDogYW55ID0gdW5kZWZpbmVkO1xuICAgIC8qKiBJbml0aWFsIHN0YXRlIGZvciBTdHVkaW8uIE9ubHkgcmVhZCBvbmNlIG9uIGluaXRpYWxpemF0aW9uLiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGBhcGkuZ2V0U3RhdGUoKWAgdG8gc2F2ZSBhbmQgcmVzdG9yZSBTdHVkaW8gc3RhdGUuXG4gICAgICogQGluaXRpYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaW5pdGlhbFN0YXRlOiBBZ1JlcG9ydFN0YXRlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBEZWZpbmVzIHRoZSBkYXRhIHNvdXJjZXMgdXNlZCBieSBTdHVkaW8uXG4gICAgICpcbiAgICAgKiBJZiB1cGRhdGVkIGFmdGVyIGluaXRpYWxseSBiZWluZyBzZXQsIG9ubHkgY2hhbmdlcyB0byBzeW5jaHJvbm91cyBkYXRhIHdpbGwgYmUgcHJvY2Vzc2VkLlxuICAgICAqIEFueSBvdGhlciBjaGFuZ2VzIHdpbGwgYmUgaWdub3JlZCAoZS5nLiBhZGRpbmcvcmVtb3ZpbmcgZGF0YSBzb3VyY2VzLCB1cGRhdGluZyBmaWVsZHMsIGV0Yy4pXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGRhdGE6IEFnRGF0YVNvdXJjZXNEZWZpbml0aW9uIHwgQWdEYXRhRW5naW5lIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBXaGljaCBtb2RlIFN0dWRpbyBpcyBpbi5cbiAgICAgKiBAZGVmYXVsdCAndmlldydcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbW9kZTogQWdTdHVkaW9Nb2RlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBEZWZhdWx0IGxheW91dCBzdHlsaW5nLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsYXlvdXQ6IFBhcnRpYWw8QWdQYWdlTGF5b3V0U3RhdGU+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBBSSBBc3Npc3RhbnQgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIE5PVEU6IFRoZSAgICAgKipBSSBBc3Npc3RhbnQqKiBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4gQmVoYXZpb3VyIHdpbGwgYmVcbiAgICAgKiBzbGlnaHRseSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSBMTE0gYmVpbmcgdXNlZCwgYW5kIHJlc3VsdHMgY2FuIHZhcnkgYWNyb3NzIHF1ZXJpZXMuXG4gICAgICpcbiAgICAgKiBAaW5pdGlhbFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhaTogQWdBaUFzc2lzdGFudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogT3ZlcnJpZGVzIGZvciB0aGUgbGF5b3V0IGFuZCB3aWRnZXQgY29uZmlncy5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgb3ZlcnJpZGVzOiBBZ1N0dWRpb092ZXJyaWRlcyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQ29uZmlndXJlIHdoaWNoIHBhbmVscyBhcmUgZGlzcGxheWVkIGFuZCBvbiB3aGljaCBzaWRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwYW5lbHM6IEFnUGFuZWxDb25maWcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvKiogU3RhdGUgaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHN0YXRlVXBkYXRlZDogRXZlbnRFbWl0dGVyPEFnU3R1ZGlvU3RhdGVVcGRhdGVkRXZlbnQ+ID1cbiAgICAgICAgbmV3IEV2ZW50RW1pdHRlcjxBZ1N0dWRpb1N0YXRlVXBkYXRlZEV2ZW50PigpO1xuICAgIC8qKiBUaGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpc2VkIGFuZCBpcyByZWFkeSBmb3IgbW9zdCBjYWxscy4gVGhlIGRhdGEgZW5naW5lIGhhcyBub3QgYmVlbiBpbml0aWFsaXNlZCB5ZXQsIGFuZCB0aGUgVUkgaXMgbm90IHJlYWR5LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgYXBpUmVhZHk6IEV2ZW50RW1pdHRlcjxBZ1N0dWRpb0FwaVJlYWR5RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBZ1N0dWRpb0FwaVJlYWR5RXZlbnQ+KCk7XG4gICAgLyoqIFRoZSBkYXRhIGVuZ2luZSBoYXMgYmVlbiBpbml0aWFsaXNlZCwgYW5kIHRoZSBVSSBoYXMgYmVlbiBjcmVhdGVkLCBidXQgbWF5IG5vdCBiZSBmdWxseSByZW5kZXJlZCB5ZXQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzdHVkaW9SZWFkeTogRXZlbnRFbWl0dGVyPEFnU3R1ZGlvUmVhZHlFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFnU3R1ZGlvUmVhZHlFdmVudD4oKTtcbiAgICAvKiogQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdpdGhpbiBTdHVkaW8uXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyBlcnJvclJhaXNlZDogRXZlbnRFbWl0dGVyPEFnU3R1ZGlvRXJyb3JSYWlzZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFnU3R1ZGlvRXJyb3JSYWlzZWRFdmVudD4oKTtcblxuICAgIC8vIEBFTkRAXG59XG5cbmNvbnN0IGJvb2xlYW5NaXhlZFN0dWRpb1Byb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oX0JPT0xFQU5fTUlYRURfU1RVRElPX1BST1BFUlRJRVMpO1xuLyoqXG4gKiBVc2VkIHRvIHN1cHBvcnQgdGhlIHVzZXIgc2V0dGluZyBjb21iaW5lZCBib29sZWFuIGFuZCBzdHJpbmcgLyBvYmplY3QgcHJvcGVydGllc1xuICogYXMgcGxhaW4gSFRNTCBhdHRyaWJ1dGVzIGFuZCB1cyBjb3JyZWN0bHkgbWFwcGluZyB0aGF0IHRvIHRydWUuXG4gKiBGb3IgZXhhbXBsZSBjZWxsU2VjdGlvbiBjYW4gYmUgYm9vbGVhbiBvciBhbiBvYmplY3RcbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVPckNvZXJjZWRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWVUb1VzZTogYW55KTogYW55IHtcbiAgICBpZiAoYm9vbGVhbk1peGVkU3R1ZGlvUHJvcGVydGllcy5oYXMoa2V5KSkge1xuICAgICAgICAvLyBIYW5kbGUgcGxhaW4gSFRNTCBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIGNvbnZlcnQgdGhlbSB0byBib29sZWFuIHZhbHVlc1xuICAgICAgICAvLyBBbHNvIGhhbmRsZSB0aGUgZmFsc2Ugc3RyaW5nIGNhc2UgdG8gbWF0Y2ggQW5ndWxhciBib29sZWFuIGF0dHJpYnV0ZXNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvbm8tbmVzdGVkLWNvbmRpdGlvbmFsXG4gICAgICAgIHJldHVybiB2YWx1ZVRvVXNlID09PSAnJyA/IHRydWUgOiB2YWx1ZVRvVXNlID09PSAnZmFsc2UnID8gZmFsc2UgOiB2YWx1ZVRvVXNlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVUb1VzZTtcbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { AgStudio } from './ag-studio.component';
3
+ import * as i0 from "@angular/core";
4
+ export class AgStudioModule {
5
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
6
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule, imports: [AgStudio], exports: [AgStudio] }); }
7
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule }); }
8
+ }
9
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule, decorators: [{
10
+ type: NgModule,
11
+ args: [{
12
+ imports: [AgStudio],
13
+ exports: [AgStudio],
14
+ }]
15
+ }] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWctc3R1ZGlvLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FnLXN0dWRpby1hbmd1bGFyL3NyYy9saWIvYWctc3R1ZGlvLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFNakQsTUFBTSxPQUFPLGNBQWM7K0dBQWQsY0FBYztnSEFBZCxjQUFjLFlBSGIsUUFBUSxhQUNSLFFBQVE7Z0hBRVQsY0FBYzs7NEZBQWQsY0FBYztrQkFKMUIsUUFBUTttQkFBQztvQkFDTixPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztpQkFDdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBZ1N0dWRpbyB9IGZyb20gJy4vYWctc3R1ZGlvLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW0FnU3R1ZGlvXSxcbiAgICBleHBvcnRzOiBbQWdTdHVkaW9dLFxufSlcbmV4cG9ydCBjbGFzcyBBZ1N0dWRpb01vZHVsZSB7fVxuIl19