@softheon/armature 17.25.3 → 17.25.4

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.
@@ -46,6 +46,11 @@ export class SofTableComponent {
46
46
  this.updatedColumnState = new EventEmitter();
47
47
  /** Output filtered/sorted row data and table headers, all values returned will be formatted & translated */
48
48
  this.filteredRowDataForExport = new EventEmitter();
49
+ /**
50
+ * Keep track of the current column state
51
+ * @note If columns are re-defined (onChanges), this state will be applied
52
+ */
53
+ this.currentColumnState = {};
49
54
  /** Column names that should be filterable */
50
55
  this.colFilters = [];
51
56
  /** Row Height for table */
@@ -72,6 +77,9 @@ export class SofTableComponent {
72
77
  cellStyle: { justifyContent: "center" },
73
78
  suppressKeyboardEvent: (params) => {
74
79
  return params.event.key === 'Tab' ? true : false;
80
+ },
81
+ filterParams: {
82
+ maxNumConditions: 100, // by default filters have a max condition limit of only 2
75
83
  }
76
84
  };
77
85
  /** Length of data */
@@ -515,4 +523,4 @@ class SofTableFilter {
515
523
  /** A filter combining multiple conditions, taken from AgGrid*/
516
524
  class CombinedSimpleModel {
517
525
  }
518
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL2FnLWdyaWQtY29tcG9uZW50cy9zcmMvc29mLXRhYmxlL3NvZi10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcm1hdHVyZS9hZy1ncmlkLWNvbXBvbmVudHMvc3JjL3NvZi10YWJsZS9zb2YtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sTUFBTSxFQUVOLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFckQsT0FBTyxFQUdMLHlCQUF5QixFQUMxQixNQUFNLGtEQUFrRCxDQUFDO0FBZ0IxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBRXZELDRDQUE0QztBQU01QyxNQUFNLE9BQU8saUJBQWlCO0lBTDlCO1FBVUUsMkRBQTJEO1FBQzNDLFlBQU8sR0FBa0IsRUFBRSxDQUFDO1FBSzVDLGtCQUFrQjtRQUNGLCtCQUEwQixHQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTlFLG9CQUFvQjtRQUNKLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRTdDLDBDQUEwQztRQUMxQixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3Qyw0Q0FBNEM7UUFDNUIsd0JBQW1CLEdBQVksSUFBSSxDQUFDO1FBRXBELHVEQUF1RDtRQUN2QyxpQkFBWSxH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UzsrQkFDRSxXQUFXOzhCQU9MLE9BQU87c0JBQXRCLEtBQUs7Z0JBR1UsT0FBTztzQkFBdEIsS0FBSztnQkFHVyxRQUFRO3NCQUF4QixLQUFLO2dCQUdVLDBCQUEwQjtzQkFBekMsS0FBSztnQkFHVSxZQUFZO3NCQUEzQixLQUFLO2dCQUdVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBR1UsbUJBQW1CO3NCQUFsQyxLQUFLO2dCQUdVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBV1UseUJBQXlCO3NCQUF4QyxLQUFLO2dCQU1VLFNBQVM7c0JBQXhCLEtBQUs7Z0JBR1csZ0JBQWdCO3NCQUFoQyxLQUFLO2dCQUdXLGtCQUFrQjtzQkFBbEMsS0FBSztnQkFHSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBR0csd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUcyQixtQkFBbUI7c0JBQXBELFNBQVM7dUJBQUMscUJBQXFCO2dCQUdNLGdCQUFnQjtzQkFBckQsU0FBUzt1QkFBQyxrQkFBa0I7O0FBd2UvQixxQ0FBcUM7QUFDckMsTUFBTSxjQUFjO0lBQXBCO1FBS0UsZ0NBQWdDO1FBQ2hDLFlBQU8sR0FBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztDQUFBO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sbUJBQW1CO0NBT3hCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgXHJcbiAgQ29tcG9uZW50LCBcclxuICBFbGVtZW50UmVmLCBcclxuICBFdmVudEVtaXR0ZXIsIFxyXG4gIGluamVjdCwgXHJcbiAgSW5wdXQsIFxyXG4gIE9uQ2hhbmdlcywgXHJcbiAgT25Jbml0LCBcclxuICBPdXRwdXQsIFxyXG4gIHNpZ25hbCwgXHJcbiAgU2ltcGxlQ2hhbmdlcywgXHJcbiAgVmlld0NoaWxkLCBcclxuICBXcml0YWJsZVNpZ25hbCBcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IHRha2UsIHRhcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5cclxuaW1wb3J0IHsgXHJcbiAgQ29sdW1uRGF0YSwgXHJcbiAgQ29sdW1uT3B0aW9uc0RhdGEsIFxyXG4gIFNvZkNvbHVtbk9wdGlvbnNDb21wb25lbnQgXHJcbn0gZnJvbSAnLi4vY29sdW1uLW9wdGlvbnMtbW9kYWwvY29sdW1uLW9wdGlvbnMuY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7XHJcbiAgQXBwbHlDb2x1bW5TdGF0ZVBhcmFtcyxcclxuICBDb2xEZWYsXHJcbiAgQ29sdW1uLFxyXG4gIENvbHVtblN0YXRlLFxyXG4gIEZpbHRlck1vZGVsLFxyXG4gIEdyaWRBcGksXHJcbiAgR3JpZFJlYWR5RXZlbnQsXHJcbiAgSVJvd05vZGUsXHJcbiAgUGFnaW5hdGlvbkNoYW5nZWRFdmVudCxcclxuICBTdXBwcmVzc0tleWJvYXJkRXZlbnRQYXJhbXMsXHJcbiAgVGV4dEZpbHRlck1vZGVsXHJcbn0gZnJvbSBcImFnLWdyaWQtY29tbXVuaXR5XCI7XHJcblxyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcblxyXG4vKiogVGhlIFNvZnRoZW9uIEFybWF0dXJlIFRhYmxlIGNvbXBvbmVudCAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NvZi10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NvZi10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3NvZi10YWJsZS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFNvZlRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICAvKiogVGhlIGxhbmd1YWdlIHRleHQgb3IgYSBrZXkgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoaXMgY29tcG9uZW50ICovXHJcbiAgQElucHV0KCkgcHVibGljIHJvd0RhdGEhOiBBcnJheTxhbnk+O1xyXG5cclxuICAvKiogQ29sdW1uIERlZmluaXRpb25zOiBEZWZpbmVzICYgY29udHJvbHMgZ3JpZCBjb2x1bW5zLiAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xEZWZzOiBBcnJheTxDb2xEZWY+ID0gW107XHJcblxyXG4gIC8qKiBTaXplIG1vZGVzIGZvciB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIHByaXZhdGUgc2l6ZU1vZGU6ICdDb21wYWN0JyB8ICdSb29teScgfCAnRGVmYXVsdCc7XHJcblxyXG4gIC8qKiBQYWdlcyBzaXplcyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvcjogQXJyYXk8bnVtYmVyPiA9IFsxMCwgMjAsIDUwLCAxMDBdO1xyXG5cclxuICAvKiogRW5hYmxlIHNlYXJjaCAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKiogRW5hYmxlIGN1c3RvbSB0ZXh0IGZpbHRlciBkcm9wZG93bnMgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIEVuYWJsZSBjb2x1bW4gb3B0aW9ucyBtb2RhbCBzZWxlY3Rpb24gKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlQ29sdW1uT3B0aW9uczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKiBFbmFibGUgZXhwb3J0IGJ1dHRvbiB0byBvdXRwdXQgZmlsdGVyZWQgcm93IGRhdGEgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlRXhwb3J0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBcclxuICAgKiBUbyBkaXNwbGF5IHRoZSB0ZXh0IG9uIHRoZSBjb2x1bW4gb3B0aW9ucyBtb2RhbCwgd2hpY2ggc3RhdGVzIC1cclxuICAgKiBgXCJPcHRpb25zIHdpbGwgYmUgc2F2ZWQgZm9yIHRoZSBuZXh0IHRpbWUgeW91IGxvZyBpbi5cImBcclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEBkZXNjcmlwdGlvbiBzZXQgdG8gdHJ1ZSBpZiBzZXQtdXAgZm9yIHNhdmluZyBwcmVmZXJlbmNlcyB0byBVc2VyIGRhdGEuXHJcbiAgICogQG5vdGUgWW91IGNhbiBzdGlsbCBzYXZlIHByZWZlcmVuY2VzIHRvIF9sb2NhbF8gb3IgX3Nlc3Npb25fIHN0b3JhZ2VcclxuICAgKiB1c2luZyB0aGUgYHNhdmVkQ29sdW1uU3RhdGVgIGlucHV0LCBhbmQgYHVwZGF0ZWRDb2x1bW5TdGF0ZWAgb3V0cHV0IGV2ZW50LlxyXG4gICAqIEBzZWUgVGhlIERlbW8gc2l0ZSBpcyBzYXZpbmcgdG8gbG9jYWwgc3RvcmFnZS5cclxuICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93U2F2ZUNvbHVtbk9wdGlvbnNUZXh0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBcclxuICAgKiBOYW1lL2xhYmVsIG9mIHRoZSB0YWJsZSBcclxuICAgKiBAbm90ZSBzaG91bGQgYmUgYSB0cmFuc2xhdGlvbiBrZXlcclxuICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJsZU5hbWU6IHN0cmluZztcclxuXHJcbiAgLyoqIFVzZXJzIHNhdmVkIGNvbHVtbiBvcHRpb25zIHN0YXRlICovXHJcbiAgQElucHV0KCkgcHJpdmF0ZSBzYXZlZENvbHVtblN0YXRlOiBBcHBseUNvbHVtblN0YXRlUGFyYW1zO1xyXG5cclxuICAvKiogSW5pdGlhbCBmaWx0ZXIgbW9kZWwgKi9cclxuICBASW5wdXQoKSBwcml2YXRlIGluaXRpYWxGaWx0ZXJNb2RlbDogRmlsdGVyTW9kZWw7XHJcblxyXG4gIC8qKiBPdXRwdXQgdXBkYXRlZCBjb2x1bW4gb3B0aW9ucyBldmVudCB0byBzYXZlIHRvIHVzZXIgb3IgYnJvd3NlciBzdG9yYWdlICovXHJcbiAgQE91dHB1dCgpIHVwZGF0ZWRDb2x1bW5TdGF0ZTogRXZlbnRFbWl0dGVyPEFwcGx5Q29sdW1uU3RhdGVQYXJhbXM+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKiogT3V0cHV0IGZpbHRlcmVkL3NvcnRlZCByb3cgZGF0YSBhbmQgdGFibGUgaGVhZGVycywgYWxsIHZhbHVlcyByZXR1cm5lZCB3aWxsIGJlIGZvcm1hdHRlZCAmIHRyYW5zbGF0ZWQgKi9cclxuICBAT3V0cHV0KCkgZmlsdGVyZWRSb3dEYXRhRm9yRXhwb3J0OiBFdmVudEVtaXR0ZXI8RXhwb3J0VGFibGVEYXRhPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLyoqIHRoZSBzZWFyY2ggaW5wdXQgKi9cclxuICBAVmlld0NoaWxkKCdncmlkU2VhcmNoVGV4dElucHV0JykgZ3JpZFNlYXJjaFRleHRJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuXHJcbiAgLyoqIFRoZSBoaWRkZW4gZWxlbWVudCB0aGF0IGFubm91bmNlcyB3aGVuIHRoZSB0YWJsZSBjb250ZW50IGNoYW5nZXMgZnJvbSBmaWx0ZXIgKi9cclxuICBAVmlld0NoaWxkKCdhcmlhUmVzdWx0c0NvdW50JykgcHVibGljIGFyaWFSZXN1bHRzQ291bnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG5cclxuICAvKiogXHJcbiAgICogS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBjb2x1bW4gc3RhdGVcclxuICAgKiBAbm90ZSBJZiBjb2x1bW5zIGFyZSByZS1kZWZpbmVkIChvbkNoYW5nZXMpLCB0aGlzIHN0YXRlIHdpbGwgYmUgYXBwbGllZFxyXG4gICovXHJcbiAgcHJpdmF0ZSBjdXJyZW50Q29sdW1uU3RhdGU6IEFwcGx5Q29sdW1uU3RhdGVQYXJhbXM7XHJcblxyXG4gIC8qKiBDb2x1bW4gbmFtZXMgdGhhdCBzaG91bGQgYmUgZmlsdGVyYWJsZSAqL1xyXG4gIHB1YmxpYyBjb2xGaWx0ZXJzOiBBcnJheTxTb2ZUYWJsZUZpbHRlcj4gPSBbXTtcclxuXHJcbiAgLyoqIFJvdyBIZWlnaHQgZm9yIHRhYmxlICovXHJcbiAgcHVibGljIHJvd0hlaWdodDogbnVtYmVyID0gNDg7XHJcblxyXG4gIC8qKiBDdXJyZW50IFBhZ2UgSW5kZXggKi9cclxuICBwdWJsaWMgY3VycmVudFBhZ2U6IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKiBHcmlkIEFQSSAqL1xyXG4gIHByaXZhdGUgZ3JpZEFwaSE6IEdyaWRBcGk7XHJcblxyXG4gIC8qKiBJcyB0aGUgdGFibGUgcmVhZHkgdG8gYmUgZGlzcGxheWVkICovXHJcbiAgcHVibGljIGlzR3JpZERhdGFSZW5kZXJlZDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xyXG5cclxuICAvKiogRGVmYXVsdCBQYWdlIFNpemUgKi9cclxuICBwdWJsaWMgcGFnaW5hdGlvblBhZ2VTaXplOiBudW1iZXIgPSAyMDsgXHJcblxyXG4gIC8qKiBUb29sIHRpcCBzaG93IGRlbGF5ICovXHJcbiAgcHVibGljIHRvb2x0aXBTaG93RGVsYXk6IG51bWJlciA9IDUwMDtcclxuICBcclxuICAvKiogTnVtYmVyIG9mIGZpbHRlcnMgdXNlZCAqL1xyXG4gIHB1YmxpYyBmaWx0ZXJDb3VudDogbnVtYmVyID0gMDtcclxuICAvKiogXHJcbiAgICogRGVmYXVsdCBDb2x1bW4gRGVmaW5pdGlvbiBcclxuICAgKiBAbm90ZSAoc3VwcHJlc3NLZXlib2FyZEV2ZW50KSBUYWJsZSBjZWxscyBjYW4gYmUgbmF2aWdhdGVkIHdpdGggdGhlIGFycm93IGtleXMsIFxyXG4gICAqIGlmIHRoZSBjZWxsIGNvbnRhaW5zIGEgYnV0dG9uIHlvdSBjYW4gVGFiIGludG8gdGhlIGJ1dHRvbiwgZW50ZXIgfCBzcGFjZSB0byBpbnRlcmFjdC5cclxuICAqL1xyXG4gIHB1YmxpYyBkZWZhdWx0Q29sRGVmOiBDb2xEZWYgPSB7XHJcbiAgICByZXNpemFibGU6IGZhbHNlLCAvLyBkaXNhYmxlIHJlc2l6ZSBcclxuICAgIHN1cHByZXNzSGVhZGVyTWVudUJ1dHRvbjogdHJ1ZSwgLy8gZGlzYWJsZSBkZWZhdWx0IGZpbHRlciBtZW51IFxyXG4gICAgc3VwcHJlc3NNb3ZhYmxlOiB0cnVlLCAvLyBkaXNhYmxlIGRlZmF1bHQgZHJhZyAmIGRyb3AgZm9yIGNvbHVtbnMgXHJcbiAgICBjZWxsU3R5bGU6IHsganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIgfSxcclxuICAgIHN1cHByZXNzS2V5Ym9hcmRFdmVudDogKHBhcmFtczogU3VwcHJlc3NLZXlib2FyZEV2ZW50UGFyYW1zKSA9PiB7XHJcbiAgICAgIHJldHVybiBwYXJhbXMuZXZlbnQua2V5ID09PSAnVGFiJyA/IHRydWUgOiBmYWxzZTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvKiogTGVuZ3RoIG9mIGRhdGEgKi9cclxuICBwdWJsaWMgdG90YWxMZW5ndGg6IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKlRvdGFsIG51bWJlciBvZiBwYWdlcyAqL1xyXG4gIHB1YmxpYyB0b3RhbE51bWJlck9mUGFnZXM6IG51bWJlcjtcclxuXHJcbiAgLyoqIFBhZ2UgQ2hhbmdlIHRleHQgKi9cclxuICBwdWJsaWMgcGFnZUNoYW5nZVRleHQ6IHN0cmluZztcclxuXHJcbiAgLyoqIFBhZ2Ugc2VsZWN0b3IgYXJyYXkgKi9cclxuICBwdWJsaWMgcGFnZVNlbGVjdG9yOiBBcnJheTxudW1iZXI+ID0gW107XHJcblxyXG4gIC8qKiBGaWx0ZXIgUGFuZWwgb3BlbiBzdGF0ZSAqL1xyXG4gIHB1YmxpYyBmaWx0ZXJPcGVuU3RhdGU6IGJvb2xlYW47XHJcblxyXG4gIC8qKiBUaGUgbGlzdCBvZiBmaWx0ZXJzIGFuZCB0aGUgc2VsZWN0ZWQgdmFsdWVzICovXHJcbiAgcHVibGljIGZpbHRlclNlbGVjdGlvbnM6IEFycmF5PEFycmF5PHN0cmluZz4+ID0gW107XHJcblxyXG4gIC8qKiBtYXQtZGlhbG9nICovXHJcbiAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xyXG5cclxuICAvKiogVHJhbnNsYXRpb24gc2VydmljZSAqL1xyXG4gIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcclxuXHJcbiAgLyoqIE9uIGNvbXBvbmVudCBpbml0ICovXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXNpemVHcmlkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBbmd1bGFyIE9uIENoYW5nZXNcclxuICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgaW5wdXQgY2hhbmdlc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5yb3dEYXRhICYmICFjaGFuZ2VzLnJvd0RhdGEuZmlyc3RDaGFuZ2UgJiYgISF0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgdGhpcy50b3RhbExlbmd0aCA9IHRoaXMucm93RGF0YT8ubGVuZ3RoID8/IDA7IC8vIGhhbmRsZXMgbnVsbCwgdW5kZWZpbmVkIGFuZCBbXSBkYXRhIHJldHVybiwgc28gd2lsbCBub3QgbG9hZCBpbmRlZmluaXRlbHkgXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVGaWx0ZXJzKCk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpO1xyXG4gICAgICAgIHRoaXMuaXNHcmlkRGF0YVJlbmRlcmVkLnNldCh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlcy5jb2xEZWZzICYmICFjaGFuZ2VzLmNvbERlZnMuZmlyc3RDaGFuZ2UgJiYgISF0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ncmlkQXBpLmFwcGx5Q29sdW1uU3RhdGUodGhpcy5jdXJyZW50Q29sdW1uU3RhdGUpO1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVGaWx0ZXJzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGdyaWQgaGFzIGluZ2VzdGVkIHRoZSBpbnB1dCBkYXRhXHJcbiAgICogQHBhcmFtIHBhcmFtcyBHcmlkIFJlYWR5IEV2ZW50LFxyXG4gICAqIFRoZSBncmlkIGhhcyBpbml0aWFsaXplZCBhbmQgaXMgcmVhZHkgZm9yIG1vc3QgYXBpIGNhbGxzLCBidXQgbWF5IG5vdCBiZSBmdWxseSByZW5kZXJlZCB5ZXQuXHJcbiAgICogQG5vdGUgeW91IGNhbiBub3QgYWNjZXNzIHRoaXMuZ3JpZEFwaSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBydW4sIFxyXG4gICAqIGFueSBhdHRlbXB0cyB0byBhY2Nlc3MgdGhpcy5ncmlkQXBpIGluIHRoaXMgY29tcG9uZW50cyBuZ09uSW5pdCBvciB0aGUgZmlyc3QgbmdPbkNoYW5nZXMgY3ljbGVcclxuICAgKiB3aWxsIHJlc3VsdCBpbiBhIHR5cGUgZXJyb3I7IGJlaW5nIHRoaXMuZ3JpZEFwaSBpcyB1bmRlZmluZWQgYXQgdGhhdCB0aW1lLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkdyaWRSZWFkeShwYXJhbXM6IEdyaWRSZWFkeUV2ZW50KSB7XHJcbiAgICB0aGlzLmdyaWRBcGkgPSBwYXJhbXMuYXBpO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDE7XHJcbiAgICB0aGlzLnRvdGFsTGVuZ3RoID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRSb3dDb3VudCgpO1xyXG4gICAgd2luZG93Lm9ucmVzaXplID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2JpbGVXaWR0aFRocmVzaG9sZCA9IDc1MjtcclxuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IG1vYmlsZVdpZHRoVGhyZXNob2xkKSB7XHJcbiAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSA0MDtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSA9IDEwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVzaXplR3JpZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBGaXJlZCB0aGUgZmlyc3QgdGltZSBkYXRhIGlzIHJlbmRlcmVkIGludG8gdGhlIGdyaWQuICovXHJcbiAgcHVibGljIG9uRmlyc3REYXRhUmVuZGVyZWQoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2F2ZWRDb2x1bW5TdGF0ZT8uc3RhdGUubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtblN0YXRlOiBBcnJheTxDb2x1bW5TdGF0ZT4gPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5ncmlkQXBpLmdldENvbHVtblN0YXRlKCkpO1xyXG4gICAgICB0aGlzLnNhdmVkQ29sdW1uU3RhdGUgPSB7XHJcbiAgICAgICAgc3RhdGU6IGNvbHVtblN0YXRlLFxyXG4gICAgICAgIGFwcGx5T3JkZXI6IHRydWVcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZEFwaS5hcHBseUNvbHVtblN0YXRlKHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZWRDb2x1bW5TdGF0ZS5lbWl0KHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICB0aGlzLmN1cnJlbnRDb2x1bW5TdGF0ZSA9IHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZTtcclxuICAgIHRoaXMucG9wdWxhdGVGaWx0ZXJzKCk7XHJcbiAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgICB0aGlzLmlzR3JpZERhdGFSZW5kZXJlZC5zZXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVzaXplIGdyaWQgZnJvbSBzaXplIG1vZGUgKi9cclxuICBwcml2YXRlIHJlc2l6ZUdyaWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zaXplTW9kZSA9PT0gJ0NvbXBhY3QnKSB7XHJcbiAgICAgIHRoaXMucm93SGVpZ2h0ID0gNDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNpemVNb2RlID09PSAnUm9vbXknKSB7XHJcbiAgICAgIHRoaXMucm93SGVpZ2h0ID0gNTY7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5yb3dIZWlnaHQgPSA0ODtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIHBhZ2Ugc2VsZWN0aW9uIGNoYW5nZVxyXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgc2VsZWN0ZWQgcGFnZSBudW1iZXJcclxuICAgKi9cclxuICBwdWJsaWMgb25QYWdlTnVtYmVyQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vIFRoZSBwYWdlIHZhbHVlcyBhcmUgMSBvZmYgdG8gbWFrZSBhIDEtYmFzZWQgYXJyYXksIGJ1dCB0aGUgYWN0dWFsIHBhZ2VzIGFyZSBhIDAtYmFzZWQgYXJyYXkuXHJcbiAgICB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdvVG9QYWdlKHZhbHVlIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKiogT24gbmV4dCBwYWdlIGV2ZW50ICovXHJcbiAgcHVibGljIG5leHRQYWdlKCkge1xyXG4gICAgdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25Hb1RvTmV4dFBhZ2UoKTtcclxuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKVxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDE7XHJcbiAgfVxyXG5cclxuICAvKiogT24gUHJldmlvdXMgUGFnZSBFdmVudCAqL1xyXG4gIHB1YmxpYyBwcmV2aW91c1BhZ2UoKSB7XHJcbiAgICB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdvVG9QcmV2aW91c1BhZ2UoKTtcclxuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKVxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbiBDaGFuZ2UgUGFnZSBTaXplIEV2ZW50XHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBwYWdpbmF0aW9uIGV2ZW50XHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZVBhZ2VTaXplKGV2ZW50OiBQYWdpbmF0aW9uQ2hhbmdlZEV2ZW50KSB7XHJcbiAgICAvLyBPbmx5IG5lZWQgdG8gZG8gdGhpcyB3b3JrIGlmIHRoZSBwYWdlIHNpemUgaGFzIGNoYW5nZWQuXHJcbiAgICBpZiAoZXZlbnQubmV3UGFnZVNpemUpIHtcclxuICAgICAgLy8gVXBkYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsdGVyZWQgcm93cy5cclxuICAgICAgdGhpcy50b3RhbExlbmd0aCA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Um93Q291bnQoKTtcclxuICAgICAgLy8gSGFuZGxlIHRleHQgY2hhbmdlc1xyXG4gICAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGdyaWQgZmlsdGVyIGlzIGNoYW5nZWQgXHJcbiAgICogQHRvZG8gdXBkYXRlIHRoZSBmaWx0ZXIgZHJvcGRvd24gb3B0aW9ucyBiYXNlZCBvbiB0aGUgZmlsdGVyZWQgZGF0YSBzZXQsIGluc3RlYWQgb2YgdGhlIGNvbXBsZXRlIGRhdGEgc2V0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkZpbHRlckNoYW5nZWQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwcmV2aW91c1RvdGFsTGVuZ3RoOiBudW1iZXIgPSBOdW1iZXIodGhpcy50b3RhbExlbmd0aCk7XHJcbiAgICAvLyBVcGRhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBmaWx0ZXJlZCByb3dzLlxyXG4gICAgdGhpcy50b3RhbExlbmd0aCA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Um93Q291bnQoKTtcclxuICAgIGlmICh0aGlzLnRvdGFsTGVuZ3RoICE9PSBwcmV2aW91c1RvdGFsTGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuYXJpYVJlc3VsdHNDb3VudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgIHRoaXMuYXJpYVJlc3VsdHNDb3VudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMudG90YWxMZW5ndGggPT09IDBcclxuICAgICAgICA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdhcm1hdHVyZS5zb2YtdGFibGUuc2NyZWVuLXJlYWRlci5maWx0ZXJlZC1yZXN1bHRzLm5vLXJlc3VsdHMnKVxyXG4gICAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXHJcbiAgICAgICAgICAnYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuZmlsdGVyZWQtcmVzdWx0cy5oYXMtcmVzdWx0cycsIHsncmVzdWx0c0NvdW50JzogdGhpcy50b3RhbExlbmd0aH1cclxuICAgICAgICApO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFyaWFSZXN1bHRzQ291bnQubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICB9LCAxMDApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEdlbmVyYXRlZCB0ZXh0IGZvciBzaG93aW5nIHBhZ2VzIGluIGZvcm1hdDogMS0xMSBvZiAxMSAqL1xyXG4gIHByaXZhdGUgaGFuZGxlUGFnZUNoYW5nZVRleHQoKTogdm9pZCB7XHJcbiAgICAvLyBIYW5kbGUgZW1wdHkgdGFibGVcclxuICAgIGlmICghdGhpcy50b3RhbExlbmd0aCB8fCB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSA9PT0gMCkge1xyXG4gICAgICAvLyBSZXNldCB0aGUgcGFnaW5hdGlvbiBVSVxyXG4gICAgICB0aGlzLnRvdGFsTnVtYmVyT2ZQYWdlcyA9IDE7XHJcbiAgICAgIHRoaXMucGFnZVNlbGVjdG9yID0gWzFdO1xyXG4gICAgICB0aGlzLnBhZ2VDaGFuZ2VUZXh0ID0gYDBgO1xyXG4gICAgICB0aGlzLmdyaWRBcGkuc2hvd05vUm93c092ZXJsYXkoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkQXBpLmhpZGVPdmVybGF5KCk7XHJcbiAgICB9XHJcbiAgICAvLyBVcGRhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlc1xyXG4gICAgdGhpcy50b3RhbE51bWJlck9mUGFnZXMgPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldFRvdGFsUGFnZXMoKSB8fCBNYXRoLmNlaWwodGhpcy50b3RhbExlbmd0aCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplKSB8fCAxO1xyXG4gICAgLy8gUmVzZXQgdGhlIHBhZ2Ugc2VsZWN0b3JcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgY29uc3QgcGFnZVNlbGVjdG9yID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLnRvdGFsTnVtYmVyT2ZQYWdlczsgaSsrKSB7XHJcbiAgICAgIHBhZ2VTZWxlY3Rvci5wdXNoKGkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wYWdlU2VsZWN0b3IgPSBwYWdlU2VsZWN0b3I7XHJcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCh0aGlzLnRvdGFsTGVuZ3RoLCAwKTtcclxuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XHJcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRDdXJyZW50UGFnZSgpICogcGFnZVNpemU7XHJcbiAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggPCBsZW5ndGggPyBNYXRoLm1pbihzdGFydEluZGV4ICsgcGFnZVNpemUsIGxlbmd0aCkgOiBzdGFydEluZGV4ICsgcGFnZVNpemU7XHJcbiAgICB0aGlzLnBhZ2VDaGFuZ2VUZXh0ID0gYCR7c3RhcnRJbmRleCArIDF9IC0gJHtlbmRJbmRleH1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgdGhlIHNlYXJjaCBmaWx0ZXIgb24gZGF0YSB3aGVuIHNlYXJjaCB0ZXh0IGNoYW5nZWRcclxuICAgKi9cclxuICBwdWJsaWMgb25TZWFyY2hUZXh0Q2hhbmdlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZEFwaS5zZXRHcmlkT3B0aW9uKFwicXVpY2tGaWx0ZXJUZXh0XCIsIHRoaXMuZ3JpZFNlYXJjaFRleHRJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBUb2dnbGUgdGhlIGZpbHRlciBwYW5lbCBkaXNwbGF5ICovXHJcbiAgcHVibGljIHRvZ2dsZUZpbHRlclBhbmVsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJPcGVuU3RhdGUgPSAhdGhpcy5maWx0ZXJPcGVuU3RhdGU7XHJcbiAgfVxyXG5cclxuICAvKiogQXBwbHkgdGhlIHNlbGVjdGVkIGZpbHRlcnMgKi9cclxuICBwdWJsaWMgYXBwbHlGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgbGV0IHRhYmxlRmlsdGVyTW9kZWw6IEZpbHRlck1vZGVsID0ge307XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sRmlsdGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjb2xGaWx0ZXIgPSB0aGlzLmNvbEZpbHRlcnNbaV07XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSB0aGlzLmZpbHRlclNlbGVjdGlvbnNbaV07XHJcbiAgICAgIGlmICghc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAvLyBSZXNldCBvdXQgdGhlIGNvbHVtbiBmaWx0ZXJzXHJcbiAgICAgICAgdGhpcy5ncmlkQXBpLnNldENvbHVtbkZpbHRlck1vZGVsKGNvbEZpbHRlci5oZWFkZXIsIG51bGwpO1xyXG4gICAgICAgIHRhYmxlRmlsdGVyTW9kZWxbY29sRmlsdGVyLmhlYWRlcl0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAvLyBTZXQgdGhlIHNpbmdsZSBmaWx0ZXIgZm9yIHRoZSBjb2x1bW5cclxuICAgICAgICBsZXQgZmlsdGVyTW9kZWw6IFRleHRGaWx0ZXJNb2RlbCA9IHsgZmlsdGVyVHlwZTogJ3RleHQnLCB0eXBlOiAnZXF1YWxzJywgZmlsdGVyOiBzZWxlY3RlZEVsZW1lbnRzWzBdIH07XHJcbiAgICAgICAgLy8gQXBwbHkgdGhlIGZpbHRlciBtb2RlbCB0byB0aGUgY29sdW1uXHJcbiAgICAgICAgdGFibGVGaWx0ZXJNb2RlbFtjb2xGaWx0ZXIuaGVhZGVyXSA9IGZpbHRlck1vZGVsO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFNldCBtdWx0aXBsZSBPUiBmaWx0ZXJzIGZvciB0aGUgY29sdW1uXHJcbiAgICAgICAgbGV0IGZpbHRlck1vZGVsczogQ29tYmluZWRTaW1wbGVNb2RlbDxUZXh0RmlsdGVyTW9kZWw+ID0geyBmaWx0ZXJUeXBlOiAndGV4dCcsIG9wZXJhdG9yOiAnT1InLCBjb25kaXRpb25zOiBbXSB9O1xyXG4gICAgICAgIC8vIFNldCB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgaW4gdGhlIG1vZGVsXHJcbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RlZEVsZW1lbnQgb2Ygc2VsZWN0ZWRFbGVtZW50cykge1xyXG4gICAgICAgICAgZmlsdGVyTW9kZWxzLmNvbmRpdGlvbnMucHVzaCh7IGZpbHRlclR5cGU6ICd0ZXh0JywgdHlwZTogJ2VxdWFscycsIGZpbHRlcjogc2VsZWN0ZWRFbGVtZW50IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBcHBseSB0aGUgZmlsdGVyIG1vZGVsIGNvbGxlY3Rpb24gdG8gdGhlIGNvbHVtblxyXG4gICAgICAgIHRhYmxlRmlsdGVyTW9kZWxbY29sRmlsdGVyLmhlYWRlcl0gPSBmaWx0ZXJNb2RlbHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIE9uY2UgZXZlcnl0aGluZyBpcyBzZXQsIHVwZGF0ZSB0aGUgZmlsdGVyc1xyXG4gICAgdGhpcy5maWx0ZXJDb3VudCA9IHRoaXMuZ2V0RmlsdGVyQ291bnQoKTtcclxuICAgIHRoaXMuZ3JpZEFwaS5zZXRGaWx0ZXJNb2RlbCh0YWJsZUZpbHRlck1vZGVsKTtcclxuICAgIHRoaXMuZ3JpZEFwaS5vbkZpbHRlckNoYW5nZWQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhciBhbGwgZmlsdGVycyAqL1xyXG4gIHB1YmxpYyBjbGVhckZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICAvLyBDbGVhciBhbGwgc2VsZWN0aW9uc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbHRlclNlbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rpb25zW2ldID0gW107XHJcbiAgICB9XHJcbiAgICAvLyBTZXQgdGhlIGZ1bGwgZ3JpZCBmaWx0ZXIgbW9kZWwgdG8gbnVsbFxyXG4gICAgdGhpcy5ncmlkQXBpLnNldEZpbHRlck1vZGVsKG51bGwpO1xyXG4gICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICB0aGlzLmdyaWRBcGkub25GaWx0ZXJDaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmZpbHRlckNvdW50ID0gdGhpcy5nZXRGaWx0ZXJDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIG5vIGZpbHRlcnMgYXJlIHNlbGVjdGVkXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBhIGZpbHRlciBpcyBzZWxlY3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNFbXB0eUZpbHRlcnMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyU2VsZWN0aW9ucyB8fCAhdGhpcy5maWx0ZXJTZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgZmlsdGVyU2VsZWN0IG9mIHRoaXMuZmlsdGVyU2VsZWN0aW9ucykge1xyXG4gICAgICAvLyBJZiBhdCBsZWFzdCBvbmUgZmlsdGVyIGhhcyBiZWVuIHNlbGVjdGVkLCByZXR1cm4gZmFsc2VcclxuICAgICAgaWYgKGZpbHRlclNlbGVjdC5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIENhbmNlbCB0aGUgY2hhbmdlcyB0byB0aGUgZmlsdGVyIGFuZCBjbG9zZXMgdGhlIGZpbHRlciBwYW5lbCAqL1xyXG4gIHB1YmxpYyBjYW5jZWxGaWx0ZXJDaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgLy9TZXRzIHRoZSBmaWx0ZXIgc2VsZWN0aW9ucyBvbiBmaWx0ZXIgcGFuZWxcclxuICAgIHRoaXMuc2V0RmlsdGVyU2VsZWN0aW9ucygpO1xyXG4gICAgLy8gQ2xvc2UgdGhlIGZpbHRlciBwYW5lbFxyXG4gICAgdGhpcy50b2dnbGVGaWx0ZXJQYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBvcHVsYXRlcyB0aGUgZmlsdGVyIGRyb3Bkb3ducyAqL1xyXG4gIHByaXZhdGUgcG9wdWxhdGVGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgLy8gUmVzZXQgdGhlIGZpbHRlciBkcm9wZG93bnNcclxuICAgIHRoaXMuZmlsdGVyU2VsZWN0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5jb2xGaWx0ZXJzID0gW107XHJcbiAgICAvLyBHZXQgdGhlIGNvbHVtbiBkZWZpbml0aW9ucyB0aGF0IGhhdmUgYSBmaWx0ZXJcclxuICAgIGNvbnN0IGZpbHRlcmVkQ29sczogQXJyYXk8Q29sRGVmPiA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5EZWZzKCkuZmlsdGVyKChkZWYpID0+IGRlZlsnZmlsdGVyJ10pO1xyXG4gICAgLy8gQ3JlYXRlIGEgbWFwIHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMgZm9yIGVhY2ggZmllbGRcclxuICAgIGNvbnN0IGZpbHRlclZhbHVlc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8YW55Pj4oKTtcclxuICAgIC8vIEluaXRpYWxpemUgc2V0cyBmb3IgZWFjaCBmaWVsZCAoY29sdW1uKSBcclxuICAgIGZvciAoY29uc3QgY29sIG9mIGZpbHRlcmVkQ29scykge1xyXG4gICAgICBjb25zdCBmaWVsZDogc3RyaW5nID0gY29sW1wiZmllbGRcIl07XHJcbiAgICAgIGZpbHRlclZhbHVlc01hcC5zZXQoZmllbGQsIG5ldyBTZXQ8YW55PigpKTtcclxuICAgIH1cclxuICAgIC8vIFVzZSBmb3JFYWNoTm9kZSB0byBpdGVyYXRlIG92ZXIgdGhlIHJvd3NcclxuICAgIHRoaXMuZ3JpZEFwaS5mb3JFYWNoTm9kZSgobm9kZTogSVJvd05vZGUpID0+IHtcclxuICAgICAgaWYgKG5vZGUuZGF0YSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGZpbHRlcmVkQ29scykge1xyXG4gICAgICAgICAgY29uc3QgZmllbGQ6IHN0cmluZyA9IGNvbFtcImZpZWxkXCJdO1xyXG4gICAgICAgICAgY29uc3QgdmFsdWU6IGFueSA9IHRoaXMuZ3JpZEFwaS5nZXRDZWxsVmFsdWUoe3Jvd05vZGU6IG5vZGUsIGNvbEtleTogZmllbGR9KTtcclxuICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJWYWx1ZXNNYXAuZ2V0KGZpZWxkKT8uYWRkKHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgdW5pcXVlIHZhbHVlcyBmb3IgZWFjaCBmaWVsZCwgcG9wdWxhdGUgZmlsdGVyIG9wdGlvbnNcclxuICAgIGZvciAoY29uc3QgY29sIG9mIGZpbHRlcmVkQ29scykge1xyXG4gICAgICBjb25zdCBmaWVsZDogc3RyaW5nID0gY29sW1wiZmllbGRcIl07XHJcbiAgICAgIGNvbnN0IGxhYmVsOiBzdHJpbmcgPSBjb2xbXCJoZWFkZXJOYW1lXCJdO1xyXG4gICAgICBjb25zdCB1bmlxdWVWYWx1ZXM6IEFycmF5PGFueT4gPSBBcnJheS5mcm9tKGZpbHRlclZhbHVlc01hcC5nZXQoZmllbGQpIHx8IFtdKS5zb3J0KCk7XHJcbiAgICAgIGlmICh1bmlxdWVWYWx1ZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIC8vIEVuc3VyZSB0aGVyZSdzIHNwYWNlIGZvciBmaWx0ZXIgc2VsZWN0aW9uc1xyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VsZWN0aW9ucy5wdXNoKFtdKTsgXHJcbiAgICAgICAgdGhpcy5jb2xGaWx0ZXJzLnB1c2goeyBoZWFkZXI6IGZpZWxkLCBsYWJlbDogbGFiZWwsIG9wdGlvbnM6IHVuaXF1ZVZhbHVlcyB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkQXBpLnNldEZpbHRlck1vZGVsKHRoaXMuaW5pdGlhbEZpbHRlck1vZGVsKTtcclxuICAgIHRoaXMuc2V0RmlsdGVyU2VsZWN0aW9ucygpO1xyXG4gICAgdGhpcy5maWx0ZXJDb3VudCA9IHRoaXMuZ2V0RmlsdGVyQ291bnQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBPcGVuIHRoZSBjb2x1bW4gb3B0aW9ucyBtb2RhbCAqL1xyXG4gIHB1YmxpYyBvcGVuQ29sdW1uT3B0aW9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbHVtblN0YXRlOiBBcnJheTxDb2x1bW5TdGF0ZT4gPSB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uU3RhdGUoKTtcclxuICAgIGNvbnN0IGNvbHVtbkRhdGE6IEFycmF5PENvbHVtbkRhdGE+ID0gdGhpcy5jb2x1bW5TdGF0ZVRvRGF0YShjb2x1bW5TdGF0ZSk7XHJcbiAgICBjb25zdCBpbml0aWFsQ29sdW1uRGF0YTogQXJyYXk8Q29sdW1uRGF0YT4gPSB0aGlzLmNvbHVtblN0YXRlVG9EYXRhKHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZS5zdGF0ZSk7XHJcbiAgICBjb25zdCBjb2x1bW5PcHRpb25zRGF0YTogQ29sdW1uT3B0aW9uc0RhdGEgPSB7XHJcbiAgICAgIHRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXHJcbiAgICAgIGNvbHVtbkRhdGEsXHJcbiAgICAgIGluaXRpYWxDb2x1bW5EYXRhLFxyXG4gICAgICBzaG93U2F2ZUNvbHVtbk9wdGlvbnNUZXh0OiB0aGlzLnNob3dTYXZlQ29sdW1uT3B0aW9uc1RleHRcclxuICAgIH07XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFNvZkNvbHVtbk9wdGlvbnNDb21wb25lbnQsIHtcclxuICAgICAgd2lkdGg6ICc1MDBweCcsXHJcbiAgICAgIHBvc2l0aW9uOiB7IGJvdHRvbTogJzQwcHgnLCByaWdodDogJzQwcHgnIH0sXHJcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnY29sdW1uLW9wdGlvbnMtaGVhZGluZycsXHJcbiAgICAgIGRhdGE6IGNvbHVtbk9wdGlvbnNEYXRhXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnBpcGUoXHJcbiAgICAgIHRha2UoMSksXHJcbiAgICAgIHRhcCgodXBkYXRlZENvbHVtblN0YXRlOiBBcHBseUNvbHVtblN0YXRlUGFyYW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKHVwZGF0ZWRDb2x1bW5TdGF0ZSAmJiB1cGRhdGVkQ29sdW1uU3RhdGUuc3RhdGUubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWRBcGkuYXBwbHlDb2x1bW5TdGF0ZSh1cGRhdGVkQ29sdW1uU3RhdGUpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVkQ29sdW1uU3RhdGUuZW1pdCh1cGRhdGVkQ29sdW1uU3RhdGUpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uU3RhdGUgPSB1cGRhdGVkQ29sdW1uU3RhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcHMgYEFycmF5PENvbHVtblN0YXRlPmAgdG8gYEFycmF5PENvbHVtbkRhdGE+YCBcclxuICAgKiBAbm90ZSBmaWx0ZXJzIG91dCBhbnkgY29sdW1ucyBtYXJrZWQgYXMgJ3Bpbm5lZCcgYnkgdGhlIGNvbHVtbiBkZWZpbml0aW9ucy5cclxuICAgKiBAbm90ZSBmaWx0ZXJzIGFueSBjb2x1bW5zIHdpdGhvdXQgYSAnaGVhZGVyTmFtZScuXHJcbiAgICogQHBhcmFtIGNvbHVtblN0YXRlIHRoZSBjb2x1bW4gc3RhdGUgdG8gbW9kaWZ5XHJcbiAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgY29sdW1uIGRhdGEgZm9ybWF0dGVkIHRvIGJlIGluZ2VzdGVkIGJ5IHRoZSBgU29mQ29sdW1uT3B0aW9uc0NvbXBvbmVudGBcclxuICAqL1xyXG4gIHByaXZhdGUgY29sdW1uU3RhdGVUb0RhdGEoY29sdW1uU3RhdGU6IEFycmF5PENvbHVtblN0YXRlPik6IEFycmF5PENvbHVtbkRhdGE+IHtcclxuICAgIHJldHVybiBjb2x1bW5TdGF0ZVxyXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+IHtcclxuICAgICAgICBjb25zdCBoZWFkZXJOYW1lOiBzdHJpbmcgPSB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uRGVmKGNvbHVtbi5jb2xJZCk/LmhlYWRlck5hbWUgfHwgXCJcIjtcclxuICAgICAgICBpZiAoaGVhZGVyTmFtZSAmJiBoZWFkZXJOYW1lLmxlbmd0aCAmJiAhY29sdW1uLnBpbm5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWU6IHN0cmluZyA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5EZWYoY29sdW1uLmNvbElkKS5oZWFkZXJOYW1lO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBpZDogY29sdW1uLmNvbElkLFxyXG4gICAgICAgICAgaXNDaGVja2VkOiAhY29sdW1uLmhpZGUsXHJcbiAgICAgICAgICB0ZXh0OiBoZWFkZXJOYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKiBFbWl0IHRoZSBjdXJyZW50IGZpbHRlcmVkL3NvcnRlZCByb3cgZGF0YSAqL1xyXG4gIHB1YmxpYyBleHBvcnRGaWx0ZXJlZFJvd0RhdGEoKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3dEYXRhOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICBjb25zdCBjb2x1bW5zOiBBcnJheTxDb2x1bW4+ID0gdGhpcy5ncmlkQXBpLmdldEFsbERpc3BsYXllZENvbHVtbnMoKS5maWx0ZXIoKGNvbCkgPT4gY29sLmdldENvbERlZigpLmhlYWRlck5hbWUpO1xyXG4gICAgY29uc3QgdGFibGVIZWFkZXJzOiBBcnJheTxLZXlWYWxQYWlyPiA9IFtdO1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcclxuICAgICAgY29uc3QgY29sRGVmOiBDb2xEZWYgPSBjb2wuZ2V0Q29sRGVmKCk7XHJcbiAgICAgIHRhYmxlSGVhZGVycy5wdXNoKHtcclxuICAgICAgICBrZXk6IGNvbERlZi5maWVsZCxcclxuICAgICAgICB2YWx1ZTogY29sRGVmLmhlYWRlck5hbWVcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ3JpZEFwaS5mb3JFYWNoTm9kZUFmdGVyRmlsdGVyQW5kU29ydCgobm9kZTogSVJvd05vZGU8YW55PikgPT4ge1xyXG4gICAgICBjb25zdCBub2RlRGF0YTogYW55ID0ge307XHJcbiAgICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29sSWQ6IHN0cmluZyA9IGNvbC5nZXRDb2xJZCgpO1xyXG4gICAgICAgIC8vIFVzZSBncmlkQXBpJ3MgZ2V0Q2VsbFZhbHVlIHRvIGdldCB0aGUgdmFsdWUgdHJhbnNmb3JtZWQgYnkgdmFsdWVHZXR0ZXJcclxuICAgICAgICBub2RlRGF0YVtjb2xJZF0gPSB0aGlzLmdyaWRBcGkuZ2V0Q2VsbFZhbHVlKHsgcm93Tm9kZTogbm9kZSwgY29sS2V5OiBjb2xJZCB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJvd0RhdGEucHVzaChub2RlRGF0YSk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGV4cG9ydERhdGE6IEV4cG9ydFRhYmxlRGF0YSA9IHtcclxuICAgICAgdGFibGVIZWFkZXJzLFxyXG4gICAgICByb3dEYXRhXHJcbiAgICB9O1xyXG4gICAgdGhpcy5maWx0ZXJlZFJvd0RhdGFGb3JFeHBvcnQuZW1pdChleHBvcnREYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKiBTZXRzIGZpbHRlciBzZWxlY3Rpb25zIGZvciBmaWx0ZXIgcGFuZWwgKi9cclxuICBwcml2YXRlIHNldEZpbHRlclNlbGVjdGlvbnMoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sRmlsdGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyBHZXQgdGhlIHN0b3JlZCBmaWx0ZXJzIGZvciB0aGUgZ2l2ZW4gbW9kZWxcclxuICAgICAgY29uc3QgY29sRmlsdGVyID0gdGhpcy5jb2xGaWx0ZXJzW2ldO1xyXG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5GaWx0ZXJNb2RlbChjb2xGaWx0ZXIuaGVhZGVyKTtcclxuICAgICAgbGV0IGZpbHRlclNlbGVjdGlvbkRhdGEgPSBbXTtcclxuICAgICAgaWYgKG1vZGVsICYmIG1vZGVsW1wiY29uZGl0aW9uc1wiXSkge1xyXG4gICAgICAgIC8vIFRoZSBtb2RlbCBpcyBhIGNvbWJpbmVkIG1vZGVsIHdpdGggbXVsdGlwbGUgc2VsZWN0aW9uc1xyXG4gICAgICAgIGNvbnN0IGZpbHRlck1vZGVsID0gbW9kZWwgYXMgQ29tYmluZWRTaW1wbGVNb2RlbDxUZXh0RmlsdGVyTW9kZWw+O1xyXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBmaWx0ZXJNb2RlbC5jb25kaXRpb25zKSB7XHJcbiAgICAgICAgICBmaWx0ZXJTZWxlY3Rpb25EYXRhLnB1c2goZWxlbWVudC5maWx0ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChtb2RlbCkge1xyXG4gICAgICAgIC8vIEFzc3VtZSB0aGUgbW9kZWwgaXMgYSBzaW5nbGUgVGV4dCBGaWx0ZXIgTW9kZWxcclxuICAgICAgICBsZXQgZmlsdGVyU2VsZWN0aW9uOiBUZXh0RmlsdGVyTW9kZWwgPSBtb2RlbDtcclxuICAgICAgICBmaWx0ZXJTZWxlY3Rpb25EYXRhLnB1c2goZmlsdGVyU2VsZWN0aW9uLmZpbHRlcik7XHJcbiAgICAgIH1cclxuICAgICAgLy8gU2V0IHRoZSBmaWx0ZXIgc2VsZWN0aW9uc1xyXG4gICAgICB0aGlzLmZpbHRlclNlbGVjdGlvbnNbaV0gPSBmaWx0ZXJTZWxlY3Rpb25EYXRhO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEdldHMgdGhlIGNvdW50IG9mIGN1cnJlbnQgZmlsdGVyIHNlbGVjdGlvbnMgKi9cclxuICBwcml2YXRlIGdldEZpbHRlckNvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJTZWxlY3Rpb25zLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBhY2MuY29uY2F0KGN1cnIpLCBbXSkubGVuZ3RoO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRUYWJsZURhdGEge1xyXG4gIHRhYmxlSGVhZGVycz86IEFycmF5PEtleVZhbFBhaXI+O1xyXG4gIHJvd0RhdGE/OiBBcnJheTxhbnk+XHJcbn1cclxuXHJcbmludGVyZmFjZSBLZXlWYWxQYWlyIHsgXHJcbiAga2V5Pzogc3RyaW5nO1xyXG4gIHZhbHVlPzogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogVXNlZCBmb3Igc2V0dGluZyBmaWx0ZXIgdmFsdWVzICovXHJcbmNsYXNzIFNvZlRhYmxlRmlsdGVyIHtcclxuICAvKiogVGhlIGNvbHVtbiBoZWFkZXIgKi9cclxuICBoZWFkZXI6IHN0cmluZztcclxuICAvKiogVGhlIGNvbHVtbiBsYWJlbCBvciB0cmFuc2xhdGlvbiBrZXkgKi9cclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKiBUaGUgY29sdW1uIGZpbHRlciBvcHRpb25zICovXHJcbiAgb3B0aW9uczogc3RyaW5nW10gPSBbXTtcclxufVxyXG5cclxuLyoqIEEgZmlsdGVyIGNvbWJpbmluZyBtdWx0aXBsZSBjb25kaXRpb25zLCB0YWtlbiBmcm9tIEFnR3JpZCovXHJcbmNsYXNzIENvbWJpbmVkU2ltcGxlTW9kZWw8VD4ge1xyXG4gIC8qKiBUaGUgZmlsdGVyIHR5cGUuIFVzdWFsbHkgJ3RleHQnICovXHJcbiAgZmlsdGVyVHlwZTogc3RyaW5nO1xyXG4gIC8qKiBUaGUgb3BlcmF0b3IuIFVzdWFsbHkgJ09SJyAqL1xyXG4gIG9wZXJhdG9yOiAnQU5EJyB8ICdPUic7XHJcbiAgLyoqIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgRmlsdGVyIE1vZGVsICovXHJcbiAgY29uZGl0aW9uczogVFtdO1xyXG59XHJcbiIsIjxkaXYgXHJcbiAgW2Z4U2hvd109XCJpc0dyaWREYXRhUmVuZGVyZWQoKVwiXHJcbiAgZnhMYXlvdXRHYXA9XCIxNnB4XCIgbS1iLTI0PlxyXG4gIEBpZiAoZW5hYmxlRmlsdGVyICYmIGNvbEZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICA8YnV0dG9uIFxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlRmlsdGVyUGFuZWwoKVwiIFxyXG4gICAgICBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLXYyXCJcclxuICAgICAgdGhlbWU9XCJuZXV0cmFsXCIgXHJcbiAgICAgIFthdHRyLmVtcGhhc2lzXT1cImZpbHRlck9wZW5TdGF0ZSA/ICdzb2xpZCcgOiBmaWx0ZXJDb3VudCA9PT0gMCA/ICdzZWNvbmRhcnknIDogJ2NvbnRhaW5lZCdcIlxyXG4gICAgICBbbWF0QmFkZ2VdPVwiZmlsdGVyQ291bnRcIlxyXG4gICAgICBtYXRCYWRnZVBvc2l0aW9uPVwiYWZ0ZXJcIlxyXG4gICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiZmlsdGVyQ291bnQgPT09IDAgPyB0cnVlIDogZmFsc2VcIj5cclxuICAgICAgPGkgY2xhc3M9XCJwaCBwaC1ib2xkIHBoLXNsaWRlcnMtaG9yaXpvbnRhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAge3snYXJtYXR1cmUuc29mLXRhYmxlLmZpbHRlcicgfCB0cmFuc2xhdGV9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgfVxyXG4gIEBpZiAoZW5hYmxlU2VhcmNoKSB7XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJzb2YtZm9ybS1maWVsZCB0YWJsZS1zZWFyY2gtZmllbGQgZGVuc2UtNFwiIGZ4RmxleD1cImF1dG9cIj5cclxuICAgICAgPHNwYW4gbWF0UHJlZml4PlxyXG4gICAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1tYWduaWZ5aW5nLWdsYXNzIHNlYXJjaC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJzZWFyY2gtbGFiZWxcIj57eydhcm1hdHVyZS5zb2YtdGFibGUuc2VhcmNoJyB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBcclxuICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hUZXh0Q2hhbmdlZCgpXCIgXHJcbiAgICAgICAgI2dyaWRTZWFyY2hUZXh0SW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImdyaWRTZWFyY2hUZXh0SW5wdXRcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2FybWF0dXJlLnNvZi10YWJsZS5zY3JlZW4tcmVhZGVyLnNlYXJjaC1maWx0ZXItZGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlXCIvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICB9XHJcbiAgQGlmIChlbmFibGVDb2x1bW5PcHRpb25zKSB7XHJcbiAgICA8YnV0dG9uIFxyXG4gICAgICAoY2xpY2spPVwib3BlbkNvbHVtbk9wdGlvbnMoKVwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24taWNvbi12MlwiIFxyXG4gICAgICB0aGVtZT1cIm5ldXRyYWxcIiBlbXBoYXNpcz1cInNlY29uZGFyeVwiIGlkPVwib3Blbi1jb2x1bW4tb3B0aW9uc1wiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2FybWF0dXJlLnNvZi10YWJsZS5zY3JlZW4tcmVhZGVyLmNvbHVtbi1vcHRpb25zLWJ0bicgfCB0cmFuc2xhdGVcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCInYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuY29sdW1uLW9wdGlvbnMtYnRuJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCIhdG90YWxMZW5ndGhcIj5cclxuICAgICAgPGkgY2xhc3M9XCJwaC1ib2xkIHBoLXBhdXNlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgfVxyXG4gIEBpZihlbmFibGVFeHBvcnQpIHtcclxuICAgIDxidXR0b24gXHJcbiAgICAgIChjbGljayk9XCJleHBvcnRGaWx0ZXJlZFJvd0RhdGEoKVwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24taWNvbi12MlwiIFxyXG4gICAgICB0aGVtZT1cIm5ldXRyYWxcIiBlbXBoYXNpcz1cInNlY29uZGFyeVwiIGlkPVwiZXhwb3J0LXRhYmxlXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuZXhwb3J0LXRhYmxlJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgIFttYXRUb29sdGlwXT1cIidhcm1hdHVyZS5zb2YtdGFibGUuc2NyZWVuLXJlYWRlci5leHBvcnQtdGFibGUnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgW2Rpc2FibGVkXT1cIiF0b3RhbExlbmd0aFwiPlxyXG4gICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtZXhwb3J0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgfVxyXG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIltzb2YtdGFibGUtcmlnaHQtYnV0dG9uc11cIj48L25nLWNvbnRlbnQ+XHJcbiAgPCEtLSBcclxuICBPbmx5IGluamVjdCA8YnV0dG9uPidzIGluc2lkZSBhbiA8bmctY29udGFpbmVyIHNvZi10YWJsZS1yaWdodC1idXR0b25zPlxyXG4gIC4uLiBcclxuICA8bmctY29udGFpbmVyIHNvZi10YWJsZS1yaWdodC1idXR0b25zPlxyXG4gICAgPGJ1dHRvbiBcclxuICAgICAgKGNsaWNrKT1cImFueUZ1bmN0aW9uKClcIlxyXG4gICAgICBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLWljb24tdjJcIiBcclxuICAgICAgdGhlbWU9XCJuZXV0cmFsXCIgZW1waGFzaXM9XCJzZWNvbmRhcnlcIiBhcmlhLWxhYmVsPVwiYW55IGJ1dHRvblwiXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJhbnkgYnV0dG9uXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1hY29yblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIC4uLiBcclxuICBub3RlOiBtYWtlIHN1cmUgYnV0dG9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyB0byBtYXRjaCBvdGhlcnMgPVxyXG4gIGBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLWljb24tdjJcIiB0aGVtZT1cIm5ldXRyYWxcIiBlbXBoYXNpcz1cInNlY29uZGFyeVwiYFxyXG4gICogcmVtZW1iZXIgdG8gYWRkIGFyaWEtbGFiZWwgYW5kIHRvb2x0aXAgZm9yIGljb24gYnV0dG9uXHJcbiAgLS0+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAjYXJpYVJlc3VsdHNDb3VudCBjbGFzcz1cInNyLW9ubHlcIiBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj48L2Rpdj5cclxuXHJcbkBpZiAoaXNHcmlkRGF0YVJlbmRlcmVkKCkgJiYgZmlsdGVyT3BlblN0YXRlKSB7XHJcbiAgPGZpZWxkc2V0IFxyXG4gICAgY2xhc3M9XCJmaWx0ZXItcGFuZWxcIiByb2xlPVwicmVnaW9uXCJcclxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2FybWF0dXJlLnNvZi10YWJsZS5zY3JlZW4tcmVhZGVyLnNlbGVjdC1maWx0ZXJzLWRlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgPHA+XHJcbiAgICAgIDxpIGNsYXNzPVwicGggcGgtYm9sZCBwaC1zbGlkZXJzLWhvcml6b250YWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibS1sLThcIj57eydhcm1hdHVyZS5zb2YtdGFibGUuZmlsdGVyJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgPC9wPlxyXG4gICAgPGRpdiBjbGFzcz1cImZpbHRlci1wYW5lbC1zZWxlY3QtY29udGFpbmVyIG0tdi0yMFwiPlxyXG4gICAgICBAZm9yIChjb2xGaWx0ZXIgb2YgY29sRmlsdGVyczsgbGV0IGkgPSAkaW5kZXg7IHRyYWNrIGkpIHtcclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInNvZi1mb3JtLWZpZWxkIHRhYmxlLWZpbHRlci1zZWxlY3RcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+e3tjb2xGaWx0ZXIubGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyU2VsZWN0aW9uc1tpXVwiIFxyXG4gICAgICAgICAgICBtdWx0aXBsZSBcclxuICAgICAgICAgICAgaWQ9XCJmaWx0ZXJEcm9wZG93bnt7aX19XCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eydhcm1hdHVyZS5zb2YtdGFibGUuYWxsJyB8IHRyYW5zbGF0ZX19XCIgZGlzYWJsZVJpcHBsZT1cInRydWVcIj5cclxuICAgICAgICAgICAgQGZvciAoY29sT3B0aW9uIG9mIGNvbEZpbHRlci5vcHRpb25zOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiY29sT3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICB7e2NvbE9wdGlvbn19XHJcbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiNTAlXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiIFtkaXNhYmxlZF09XCJoYXNFbXB0eUZpbHRlcnMoKVwiIFxyXG4gICAgICAgICAgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi12MlwiXHJcbiAgICAgICAgICB0aGVtZT1cIm5ldXRyYWxcIiBlbXBoYXNpcz1cImZsb2F0aW5nXCJcclxuICAgICAgICAgIGlkPVwidGFibGVGaWx0ZXJDbGVhclwiPlxyXG4gICAgICAgICAge3snYXJtYXR1cmUuc29mLXRhYmxlLnJlc2V0JyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjUwJVwiPlxyXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjIlXCIgZnhMYXlvdXRBbGlnbj1cImZsZXgtZW5kXCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjAgMSBhdXRvXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbEZpbHRlckNoYW5nZXMoKVwiIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24tdjJcIiBcclxuICAgICAgICAgICAgICBpZD1cInRhYmxlRmlsdGVyQ2FuY2VsXCIgdGhlbWU9XCJuZXV0cmFsXCIgZW1waGFzaXM9XCJzZWNvbmRhcnlcIj5cclxuICAgICAgICAgICAgICB7eydhcm1hdHVyZS5zb2YtdGFibGUuY2FuY2VsJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjAgMSBhdXRvXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCIgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi12MlwiXHJcbiAgICAgICAgICAgICAgaWQ9XCJ0YWJsZUZpbHRlckFwcGx5XCIgdGhlbWU9XCJwcmltYXJ5XCIgZW1waGFzaXM9XCJzb2xpZFwiPlxyXG4gICAgICAgICAgICAgIHt7J2FybWF0dXJlLnNvZi10YWJsZS5yZXN1bHRzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9maWVsZHNldD5cclxufVxyXG5cclxuPGFnLWdyaWQtYW5ndWxhciBcclxuICBbZnhTaG93XT1cImlzR3JpZERhdGFSZW5kZXJlZCgpXCJcclxuICAoZ3JpZFJlYWR5KT1cIm9uR3JpZFJlYWR5KCRldmVudClcIiBcclxuICAoZmlyc3REYXRhUmVuZGVyZWQpPVwib25GaXJzdERhdGFSZW5kZXJlZCgpXCJcclxuICAoZmlsdGVyQ2hhbmdlZCk9XCJvbkZpbHRlckNoYW5nZWQoKVwiXHJcbiAgKHBhZ2luYXRpb25DaGFuZ2VkKT1cImNoYW5nZVBhZ2VTaXplKCRldmVudClcIiBcclxuICBbcm93RGF0YV09XCJyb3dEYXRhXCIgXHJcbiAgW2NvbHVtbkRlZnNdPVwiY29sRGVmc1wiIFxyXG4gIFtkZWZhdWx0Q29sRGVmXT1cImRlZmF1bHRDb2xEZWZcIiBcclxuICBbcGFnaW5hdGlvbl09XCJ0cnVlXCIgXHJcbiAgW3N1cHByZXNzUGFnaW5hdGlvblBhbmVsXT1cInRydWVcIlxyXG4gIFtwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3Rvcl09XCJwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvclwiIFxyXG4gIFtwYWdpbmF0aW9uUGFnZVNpemVdPVwicGFnaW5hdGlvblBhZ2VTaXplXCJcclxuICBbaGVhZGVySGVpZ2h0XT1cInJvd0hlaWdodFwiIFxyXG4gIFtyb3dIZWlnaHRdPVwicm93SGVpZ2h0XCIgXHJcbiAgW2RvbUxheW91dF09XCInYXV0b0hlaWdodCdcIiBcclxuICBbdG9vbHRpcFNob3dEZWxheV09XCJ0b29sdGlwU2hvd0RlbGF5XCJcclxuICBbb3ZlcmxheU5vUm93c1RlbXBsYXRlXT1cIignYXJtYXR1cmUuc29mLXRhYmxlLm5vLXJvd3MnIHwgdHJhbnNsYXRlKSB8fCAnTm8gcmVzdWx0cyBmb3VuZC4nXCJcclxuICBbY2xhc3Mubm8tcm93c109XCIhdG90YWxMZW5ndGhcIlxyXG4gIGNsYXNzPVwiYWctdGhlbWUtbWF0ZXJpYWxcIj5cclxuPC9hZy1ncmlkLWFuZ3VsYXI+XHJcblxyXG48ZGl2IFxyXG4gIFtmeFNob3ddPVwiaXNHcmlkRGF0YVJlbmRlcmVkKCkgJiYgdG90YWxMZW5ndGhcIlxyXG4gIGNsYXNzPVwiY3VzdG9tLXBhZ2luYXRvclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJmaXJzdC1zZWN0aW9uXCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uLXBhcnQtMVwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgPG1hdC1zZWxlY3QgXHJcbiAgICAgICAgI3BhZ2VTaXplU2VsZWN0XHJcbiAgICAgICAgaWQ9XCJwYWdlU2l6ZUlucHV0XCIgbmFtZT1cInBhZ2VTaXplSW5wdXRcIiBcclxuICAgICAgICBbKHZhbHVlKV09XCJwYWdpbmF0aW9uUGFnZVNpemVcIiBkaXNhYmxlUmlwcGxlPVwidHJ1ZVwiPlxyXG4gICAgICAgIEBmb3IgKHNpemUgb2YgcGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3I7IGxldCBpID0gJGluZGV4OyB0cmFjayBpKSB7XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiBcclxuICAgICAgICAgICAgY2xhc3M9XCJwYWdlLW9wdGlvblwiIGlkPVwic2l6ZXt7aX19XCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cInBhZ2luYXRpb25QYWdlU2l6ZVNlbGVjdG9yW2ldXCI+XHJcbiAgICAgICAgICAgIHt7c2l6ZX19XHJcbiAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJyZW50LXBhZ2VcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2VcIj57e3BhZ2luYXRpb25QYWdlU2l6ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWljb25cIj5cclxuICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiJ3BoLWJvbGQgcGgtY2FyZXQtJyArIChwYWdlU2l6ZVNlbGVjdC5wYW5lbE9wZW4gPyAndXAnOidkb3duJylcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxzcGFuIGNsYXNzPVwicGFnZUNoYW5nZVRleHRcIj5cclxuICAgICAge3twYWdlQ2hhbmdlVGV4dH19IHt7J2FybWF0dXJlLnNvZi10YWJsZS5vZicgfCB0cmFuc2xhdGV9fSB7e3RvdGFsTGVuZ3RofX1cclxuICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZ28tdG8tcGFnZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm91dGVyLWJveFwiPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uLXBhcnRcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgXHJcbiAgICAgICAgICAjcGFnZU51bWJlclNlbGVjdFxyXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblBhZ2VOdW1iZXJDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiXHJcbiAgICAgICAgICBbKHZhbHVlKV09XCJjdXJyZW50UGFnZVwiIFxyXG4gICAgICAgICAgaWQ9XCJwYWdlU2VsZWxjdG9yXCIgbmFtZT1cInBhZ2VTZWxlY3RvclwiIGRpc2FibGVSaXBwbGU9XCJ0cnVlXCI+XHJcbiAgICAgICAgICBAZm9yIChwYWdlIG9mIHBhZ2VTZWxlY3RvcjsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJwYWdlXCIgY2xhc3M9XCJwYWdlLW9wdGlvblwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3VycmVudC1wYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2VcIj57e3BhZ2V9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3VycmVudC1wYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2VcIj57e2N1cnJlbnRQYWdlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9mLXBhZ2VcIj4ge3snYXJtYXR1cmUuc29mLXRhYmxlLm9mJyB8IHRyYW5zbGF0ZX19IHt7dG90YWxOdW1iZXJPZlBhZ2VzfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiJ3BoLWJvbGQgcGgtY2FyZXQtJyArIChwYWdlTnVtYmVyU2VsZWN0LnBhbmVsT3BlbiA/ICd1cCc6J2Rvd24nKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5hdiBjbGFzcz1cInNlY29uZC1zZWN0aW9uXCI+XHJcbiAgICAgIDxidXR0b24gXHJcbiAgICAgICAgKGNsaWNrKT1cInByZXZpb3VzUGFnZSgpXCJcclxuICAgICAgICBpZD1cInByZXYtYnV0dG9uXCIgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi1pY29uLXYyXCIgdGhlbWU9XCJuZXV0cmFsXCIgZW1waGFzaXM9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gMVwiIFxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3NjcmVlbi1yZWFkZXIucGFnaW5hdGlvbi5wcmV2aW91cycgfCB0cmFuc2xhdGVcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtY2FyZXQtbGVmdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gXHJcbiAgICAgICAgKGNsaWNrKT1cIm5leHRQYWdlKClcIiBcclxuICAgICAgICBpZD1cIm5leHQtYnV0dG9uXCIgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi1pY29uLXYyXCIgdGhlbWU9XCJuZXV0cmFsXCIgZW1waGFzaXM9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gdG90YWxOdW1iZXJPZlBhZ2VzXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidzY3JlZW4tcmVhZGVyLnBhZ2luYXRpb24ubmV4dCcgfCB0cmFuc2xhdGVcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtY2FyZXQtcmlnaHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9uYXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuQGlmICghaXNHcmlkRGF0YVJlbmRlcmVkKCkpIHtcclxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb250YWluZXJcIj5cclxuICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjb2xvcj1cInByaW1hcnlcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiLz5cclxuICA8L2Rpdj5cclxufVxyXG4iXX0=
526
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL2FnLWdyaWQtY29tcG9uZW50cy9zcmMvc29mLXRhYmxlL3NvZi10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcm1hdHVyZS9hZy1ncmlkLWNvbXBvbmVudHMvc3JjL3NvZi10YWJsZS9zb2YtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sTUFBTSxFQUVOLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFckQsT0FBTyxFQUdMLHlCQUF5QixFQUMxQixNQUFNLGtEQUFrRCxDQUFDO0FBaUIxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBRXZELDRDQUE0QztBQU01QyxNQUFNLE9BQU8saUJBQWlCO0lBTDlCO1FBVUUsMkRBQTJEO1FBQzNDLFlBQU8sR0FBa0IsRUFBRSxDQUFDO1FBSzVDLGtCQUFrQjtRQUNGLCtCQUEwQixHQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTlFLG9CQUFvQjtRQUNKLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRTdDLDBDQUEwQztRQUMxQixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3Qyw0Q0FBNEM7UUFDNUIsd0JBQW1CLEdBQVksSUFBSSxDQUFDO1FBRXBELHVEQUF1RDtRQUN2QyxpQkFBWSxH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LENBQUMsTUFBTSxDQUFDO0lBQ2xGLENBQUM7OEdBemhCVSxpQkFBaUI7a0dBQWpCLGlCQUFpQixnMEJDL0M5Qiw4NlRBNk9BOzsyRkQ5TGEsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLFdBQVc7OEJBT0wsT0FBTztzQkFBdEIsS0FBSztnQkFHVSxPQUFPO3NCQUF0QixLQUFLO2dCQUdXLFFBQVE7c0JBQXhCLEtBQUs7Z0JBR1UsMEJBQTBCO3NCQUF6QyxLQUFLO2dCQUdVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBR1UsWUFBWTtzQkFBM0IsS0FBSztnQkFHVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBR1UsWUFBWTtzQkFBM0IsS0FBSztnQkFXVSx5QkFBeUI7c0JBQXhDLEtBQUs7Z0JBTVUsU0FBUztzQkFBeEIsS0FBSztnQkFHVyxnQkFBZ0I7c0JBQWhDLEtBQUs7Z0JBR1csa0JBQWtCO3NCQUFsQyxLQUFLO2dCQUdJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFHRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBRzJCLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBR00sZ0JBQWdCO3NCQUFyRCxTQUFTO3VCQUFDLGtCQUFrQjs7QUEyZS9CLHFDQUFxQztBQUNyQyxNQUFNLGNBQWM7SUFBcEI7UUFLRSxnQ0FBZ0M7UUFDaEMsWUFBTyxHQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0NBQUE7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxtQkFBbUI7Q0FPeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBcclxuICBDb21wb25lbnQsIFxyXG4gIEVsZW1lbnRSZWYsIFxyXG4gIEV2ZW50RW1pdHRlciwgXHJcbiAgaW5qZWN0LCBcclxuICBJbnB1dCwgXHJcbiAgT25DaGFuZ2VzLCBcclxuICBPbkluaXQsIFxyXG4gIE91dHB1dCwgXHJcbiAgc2lnbmFsLCBcclxuICBTaW1wbGVDaGFuZ2VzLCBcclxuICBWaWV3Q2hpbGQsIFxyXG4gIFdyaXRhYmxlU2lnbmFsIFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgdGFrZSwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcblxyXG5pbXBvcnQgeyBcclxuICBDb2x1bW5EYXRhLCBcclxuICBDb2x1bW5PcHRpb25zRGF0YSwgXHJcbiAgU29mQ29sdW1uT3B0aW9uc0NvbXBvbmVudCBcclxufSBmcm9tICcuLi9jb2x1bW4tb3B0aW9ucy1tb2RhbC9jb2x1bW4tb3B0aW9ucy5jb21wb25lbnQnO1xyXG5cclxuaW1wb3J0IHtcclxuICBBcHBseUNvbHVtblN0YXRlUGFyYW1zLFxyXG4gIENvbERlZixcclxuICBDb2x1bW4sXHJcbiAgQ29sdW1uU3RhdGUsXHJcbiAgRmlsdGVyTW9kZWwsXHJcbiAgR3JpZEFwaSxcclxuICBHcmlkUmVhZHlFdmVudCxcclxuICBJUm93Tm9kZSxcclxuICBJVGV4dEZpbHRlclBhcmFtcyxcclxuICBQYWdpbmF0aW9uQ2hhbmdlZEV2ZW50LFxyXG4gIFN1cHByZXNzS2V5Ym9hcmRFdmVudFBhcmFtcyxcclxuICBUZXh0RmlsdGVyTW9kZWxcclxufSBmcm9tIFwiYWctZ3JpZC1jb21tdW5pdHlcIjtcclxuXHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuXHJcbi8qKiBUaGUgU29mdGhlb24gQXJtYXR1cmUgVGFibGUgY29tcG9uZW50ICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc29mLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc29mLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc29mLXRhYmxlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU29mVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIC8qKiBUaGUgbGFuZ3VhZ2UgdGV4dCBvciBhIGtleSB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhpcyBjb21wb25lbnQgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcm93RGF0YSE6IEFycmF5PGFueT47XHJcblxyXG4gIC8qKiBDb2x1bW4gRGVmaW5pdGlvbnM6IERlZmluZXMgJiBjb250cm9scyBncmlkIGNvbHVtbnMuICovXHJcbiAgQElucHV0KCkgcHVibGljIGNvbERlZnM6IEFycmF5PENvbERlZj4gPSBbXTtcclxuXHJcbiAgLyoqIFNpemUgbW9kZXMgZm9yIHRhYmxlICovXHJcbiAgQElucHV0KCkgcHJpdmF0ZSBzaXplTW9kZTogJ0NvbXBhY3QnIHwgJ1Jvb215JyB8ICdEZWZhdWx0JztcclxuXHJcbiAgLyoqIFBhZ2VzIHNpemVzICovXHJcbiAgQElucHV0KCkgcHVibGljIHBhZ2luYXRpb25QYWdlU2l6ZVNlbGVjdG9yOiBBcnJheTxudW1iZXI+ID0gWzEwLCAyMCwgNTAsIDEwMF07XHJcblxyXG4gIC8qKiBFbmFibGUgc2VhcmNoICovXHJcbiAgQElucHV0KCkgcHVibGljIGVuYWJsZVNlYXJjaDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKiBFbmFibGUgY3VzdG9tIHRleHQgZmlsdGVyIGRyb3Bkb3ducyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKiogRW5hYmxlIGNvbHVtbiBvcHRpb25zIG1vZGFsIHNlbGVjdGlvbiAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVDb2x1bW5PcHRpb25zOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIEVuYWJsZSBleHBvcnQgYnV0dG9uIHRvIG91dHB1dCBmaWx0ZXJlZCByb3cgZGF0YSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVFeHBvcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFxyXG4gICAqIFRvIGRpc3BsYXkgdGhlIHRleHQgb24gdGhlIGNvbHVtbiBvcHRpb25zIG1vZGFsLCB3aGljaCBzdGF0ZXMgLVxyXG4gICAqIGBcIk9wdGlvbnMgd2lsbCBiZSBzYXZlZCBmb3IgdGhlIG5leHQgdGltZSB5b3UgbG9nIGluLlwiYFxyXG4gICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICogQGRlc2NyaXB0aW9uIHNldCB0byB0cnVlIGlmIHNldC11cCBmb3Igc2F2aW5nIHByZWZlcmVuY2VzIHRvIFVzZXIgZGF0YS5cclxuICAgKiBAbm90ZSBZb3UgY2FuIHN0aWxsIHNhdmUgcHJlZmVyZW5jZXMgdG8gX2xvY2FsXyBvciBfc2Vzc2lvbl8gc3RvcmFnZVxyXG4gICAqIHVzaW5nIHRoZSBgc2F2ZWRDb2x1bW5TdGF0ZWAgaW5wdXQsIGFuZCBgdXBkYXRlZENvbHVtblN0YXRlYCBvdXRwdXQgZXZlbnQuXHJcbiAgICogQHNlZSBUaGUgRGVtbyBzaXRlIGlzIHNhdmluZyB0byBsb2NhbCBzdG9yYWdlLlxyXG4gICovXHJcbiAgQElucHV0KCkgcHVibGljIHNob3dTYXZlQ29sdW1uT3B0aW9uc1RleHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFxyXG4gICAqIE5hbWUvbGFiZWwgb2YgdGhlIHRhYmxlIFxyXG4gICAqIEBub3RlIHNob3VsZCBiZSBhIHRyYW5zbGF0aW9uIGtleVxyXG4gICovXHJcbiAgQElucHV0KCkgcHVibGljIHRhYmxlTmFtZTogc3RyaW5nO1xyXG5cclxuICAvKiogVXNlcnMgc2F2ZWQgY29sdW1uIG9wdGlvbnMgc3RhdGUgKi9cclxuICBASW5wdXQoKSBwcml2YXRlIHNhdmVkQ29sdW1uU3RhdGU6IEFwcGx5Q29sdW1uU3RhdGVQYXJhbXM7XHJcblxyXG4gIC8qKiBJbml0aWFsIGZpbHRlciBtb2RlbCAqL1xyXG4gIEBJbnB1dCgpIHByaXZhdGUgaW5pdGlhbEZpbHRlck1vZGVsOiBGaWx0ZXJNb2RlbDtcclxuXHJcbiAgLyoqIE91dHB1dCB1cGRhdGVkIGNvbHVtbiBvcHRpb25zIGV2ZW50IHRvIHNhdmUgdG8gdXNlciBvciBicm93c2VyIHN0b3JhZ2UgKi9cclxuICBAT3V0cHV0KCkgdXBkYXRlZENvbHVtblN0YXRlOiBFdmVudEVtaXR0ZXI8QXBwbHlDb2x1bW5TdGF0ZVBhcmFtcz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8qKiBPdXRwdXQgZmlsdGVyZWQvc29ydGVkIHJvdyBkYXRhIGFuZCB0YWJsZSBoZWFkZXJzLCBhbGwgdmFsdWVzIHJldHVybmVkIHdpbGwgYmUgZm9ybWF0dGVkICYgdHJhbnNsYXRlZCAqL1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJlZFJvd0RhdGFGb3JFeHBvcnQ6IEV2ZW50RW1pdHRlcjxFeHBvcnRUYWJsZURhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKiogdGhlIHNlYXJjaCBpbnB1dCAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2dyaWRTZWFyY2hUZXh0SW5wdXQnKSBncmlkU2VhcmNoVGV4dElucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICAvKiogVGhlIGhpZGRlbiBlbGVtZW50IHRoYXQgYW5ub3VuY2VzIHdoZW4gdGhlIHRhYmxlIGNvbnRlbnQgY2hhbmdlcyBmcm9tIGZpbHRlciAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2FyaWFSZXN1bHRzQ291bnQnKSBwdWJsaWMgYXJpYVJlc3VsdHNDb3VudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIC8qKiBcclxuICAgKiBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IGNvbHVtbiBzdGF0ZVxyXG4gICAqIEBub3RlIElmIGNvbHVtbnMgYXJlIHJlLWRlZmluZWQgKG9uQ2hhbmdlcyksIHRoaXMgc3RhdGUgd2lsbCBiZSBhcHBsaWVkXHJcbiAgKi9cclxuICBwcml2YXRlIGN1cnJlbnRDb2x1bW5TdGF0ZTogQXBwbHlDb2x1bW5TdGF0ZVBhcmFtcyA9IHt9O1xyXG5cclxuICAvKiogQ29sdW1uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGZpbHRlcmFibGUgKi9cclxuICBwdWJsaWMgY29sRmlsdGVyczogQXJyYXk8U29mVGFibGVGaWx0ZXI+ID0gW107XHJcblxyXG4gIC8qKiBSb3cgSGVpZ2h0IGZvciB0YWJsZSAqL1xyXG4gIHB1YmxpYyByb3dIZWlnaHQ6IG51bWJlciA9IDQ4O1xyXG5cclxuICAvKiogQ3VycmVudCBQYWdlIEluZGV4ICovXHJcbiAgcHVibGljIGN1cnJlbnRQYWdlOiBudW1iZXIgPSAwO1xyXG5cclxuICAvKiogR3JpZCBBUEkgKi9cclxuICBwcml2YXRlIGdyaWRBcGkhOiBHcmlkQXBpO1xyXG5cclxuICAvKiogSXMgdGhlIHRhYmxlIHJlYWR5IHRvIGJlIGRpc3BsYXllZCAqL1xyXG4gIHB1YmxpYyBpc0dyaWREYXRhUmVuZGVyZWQ6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+ID0gc2lnbmFsKGZhbHNlKTtcclxuXHJcbiAgLyoqIERlZmF1bHQgUGFnZSBTaXplICovXHJcbiAgcHVibGljIHBhZ2luYXRpb25QYWdlU2l6ZTogbnVtYmVyID0gMjA7IFxyXG5cclxuICAvKiogVG9vbCB0aXAgc2hvdyBkZWxheSAqL1xyXG4gIHB1YmxpYyB0b29sdGlwU2hvd0RlbGF5OiBudW1iZXIgPSA1MDA7XHJcbiAgXHJcbiAgLyoqIE51bWJlciBvZiBmaWx0ZXJzIHVzZWQgKi9cclxuICBwdWJsaWMgZmlsdGVyQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgLyoqIFxyXG4gICAqIERlZmF1bHQgQ29sdW1uIERlZmluaXRpb24gXHJcbiAgICogQG5vdGUgKHN1cHByZXNzS2V5Ym9hcmRFdmVudCkgVGFibGUgY2VsbHMgY2FuIGJlIG5hdmlnYXRlZCB3aXRoIHRoZSBhcnJvdyBrZXlzLCBcclxuICAgKiBpZiB0aGUgY2VsbCBjb250YWlucyBhIGJ1dHRvbiB5b3UgY2FuIFRhYiBpbnRvIHRoZSBidXR0b24sIGVudGVyIHwgc3BhY2UgdG8gaW50ZXJhY3QuXHJcbiAgKi9cclxuICBwdWJsaWMgZGVmYXVsdENvbERlZjogQ29sRGVmID0ge1xyXG4gICAgcmVzaXphYmxlOiBmYWxzZSwgLy8gZGlzYWJsZSByZXNpemUgXHJcbiAgICBzdXBwcmVzc0hlYWRlck1lbnVCdXR0b246IHRydWUsIC8vIGRpc2FibGUgZGVmYXVsdCBmaWx0ZXIgbWVudSBcclxuICAgIHN1cHByZXNzTW92YWJsZTogdHJ1ZSwgLy8gZGlzYWJsZSBkZWZhdWx0IGRyYWcgJiBkcm9wIGZvciBjb2x1bW5zIFxyXG4gICAgY2VsbFN0eWxlOiB7IGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiIH0sXHJcbiAgICBzdXBwcmVzc0tleWJvYXJkRXZlbnQ6IChwYXJhbXM6IFN1cHByZXNzS2V5Ym9hcmRFdmVudFBhcmFtcykgPT4ge1xyXG4gICAgICByZXR1cm4gcGFyYW1zLmV2ZW50LmtleSA9PT0gJ1RhYicgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9LFxyXG4gICAgZmlsdGVyUGFyYW1zOiB7XHJcbiAgICAgIG1heE51bUNvbmRpdGlvbnM6IDEwMCwgLy8gYnkgZGVmYXVsdCBmaWx0ZXJzIGhhdmUgYSBtYXggY29uZGl0aW9uIGxpbWl0IG9mIG9ubHkgMlxyXG4gICAgfSBhcyBJVGV4dEZpbHRlclBhcmFtc1xyXG4gIH07XHJcblxyXG4gIC8qKiBMZW5ndGggb2YgZGF0YSAqL1xyXG4gIHB1YmxpYyB0b3RhbExlbmd0aDogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqVG90YWwgbnVtYmVyIG9mIHBhZ2VzICovXHJcbiAgcHVibGljIHRvdGFsTnVtYmVyT2ZQYWdlczogbnVtYmVyO1xyXG5cclxuICAvKiogUGFnZSBDaGFuZ2UgdGV4dCAqL1xyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlVGV4dDogc3RyaW5nO1xyXG5cclxuICAvKiogUGFnZSBzZWxlY3RvciBhcnJheSAqL1xyXG4gIHB1YmxpYyBwYWdlU2VsZWN0b3I6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuXHJcbiAgLyoqIEZpbHRlciBQYW5lbCBvcGVuIHN0YXRlICovXHJcbiAgcHVibGljIGZpbHRlck9wZW5TdGF0ZTogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFRoZSBsaXN0IG9mIGZpbHRlcnMgYW5kIHRoZSBzZWxlY3RlZCB2YWx1ZXMgKi9cclxuICBwdWJsaWMgZmlsdGVyU2VsZWN0aW9uczogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcclxuXHJcbiAgLyoqIG1hdC1kaWFsb2cgKi9cclxuICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XHJcblxyXG4gIC8qKiBUcmFuc2xhdGlvbiBzZXJ2aWNlICovXHJcbiAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xyXG5cclxuICAvKiogT24gY29tcG9uZW50IGluaXQgKi9cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc2l6ZUdyaWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFuZ3VsYXIgT24gQ2hhbmdlc1xyXG4gICAqIEBwYXJhbSBjaGFuZ2VzIFRoZSBpbnB1dCBjaGFuZ2VzXHJcbiAgICovXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnJvd0RhdGEgJiYgIWNoYW5nZXMucm93RGF0YS5maXJzdENoYW5nZSAmJiAhIXRoaXMuZ3JpZEFwaSkge1xyXG4gICAgICB0aGlzLnRvdGFsTGVuZ3RoID0gdGhpcy5yb3dEYXRhPy5sZW5ndGggPz8gMDsgLy8gaGFuZGxlcyBudWxsLCB1bmRlZmluZWQgYW5kIFtdIGRhdGEgcmV0dXJuLCBzbyB3aWxsIG5vdCBsb2FkIGluZGVmaW5pdGVseSBcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wb3B1bGF0ZUZpbHRlcnMoKTtcclxuICAgICAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgICAgICAgdGhpcy5pc0dyaWREYXRhUmVuZGVyZWQuc2V0KHRydWUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzLmNvbERlZnMgJiYgIWNoYW5nZXMuY29sRGVmcy5maXJzdENoYW5nZSAmJiAhIXRoaXMuZ3JpZEFwaSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmdyaWRBcGkuYXBwbHlDb2x1bW5TdGF0ZSh0aGlzLmN1cnJlbnRDb2x1bW5TdGF0ZSk7XHJcbiAgICAgICAgdGhpcy5wb3B1bGF0ZUZpbHRlcnMoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZ3JpZCBoYXMgaW5nZXN0ZWQgdGhlIGlucHV0IGRhdGFcclxuICAgKiBAcGFyYW0gcGFyYW1zIEdyaWQgUmVhZHkgRXZlbnQsXHJcbiAgICogVGhlIGdyaWQgaGFzIGluaXRpYWxpemVkIGFuZCBpcyByZWFkeSBmb3IgbW9zdCBhcGkgY2FsbHMsIGJ1dCBtYXkgbm90IGJlIGZ1bGx5IHJlbmRlcmVkIHlldC5cclxuICAgKiBAbm90ZSB5b3UgY2FuIG5vdCBhY2Nlc3MgdGhpcy5ncmlkQXBpIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIHJ1biwgXHJcbiAgICogYW55IGF0dGVtcHRzIHRvIGFjY2VzcyB0aGlzLmdyaWRBcGkgaW4gdGhpcyBjb21wb25lbnRzIG5nT25Jbml0IG9yIHRoZSBmaXJzdCBuZ09uQ2hhbmdlcyBjeWNsZVxyXG4gICAqIHdpbGwgcmVzdWx0IGluIGEgdHlwZSBlcnJvcjsgYmVpbmcgdGhpcy5ncmlkQXBpIGlzIHVuZGVmaW5lZCBhdCB0aGF0IHRpbWUuXHJcbiAgICovXHJcbiAgcHVibGljIG9uR3JpZFJlYWR5KHBhcmFtczogR3JpZFJlYWR5RXZlbnQpIHtcclxuICAgIHRoaXMuZ3JpZEFwaSA9IHBhcmFtcy5hcGk7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRDdXJyZW50UGFnZSgpICsgMTtcclxuICAgIHRoaXMudG90YWxMZW5ndGggPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldFJvd0NvdW50KCk7XHJcbiAgICB3aW5kb3cub25yZXNpemUgPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vYmlsZVdpZHRoVGhyZXNob2xkID0gNzUyO1xyXG4gICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gbW9iaWxlV2lkdGhUaHJlc2hvbGQpIHtcclxuICAgICAgICB0aGlzLnJvd0hlaWdodCA9IDQwO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplID0gMTA7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZXNpemVHcmlkKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEZpcmVkIHRoZSBmaXJzdCB0aW1lIGRhdGEgaXMgcmVuZGVyZWQgaW50byB0aGUgZ3JpZC4gKi9cclxuICBwdWJsaWMgb25GaXJzdERhdGFSZW5kZXJlZCgpIHtcclxuICAgIGlmICghdGhpcy5zYXZlZENvbHVtblN0YXRlPy5zdGF0ZS5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgY29sdW1uU3RhdGU6IEFycmF5PENvbHVtblN0YXRlPiA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uU3RhdGUoKSk7XHJcbiAgICAgIHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZSA9IHtcclxuICAgICAgICBzdGF0ZTogY29sdW1uU3RhdGUsXHJcbiAgICAgICAgYXBwbHlPcmRlcjogdHJ1ZVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkQXBpLmFwcGx5Q29sdW1uU3RhdGUodGhpcy5zYXZlZENvbHVtblN0YXRlKTtcclxuICAgIHRoaXMudXBkYXRlZENvbHVtblN0YXRlLmVtaXQodGhpcy5zYXZlZENvbHVtblN0YXRlKTtcclxuICAgIHRoaXMuY3VycmVudENvbHVtblN0YXRlID0gdGhpcy5zYXZlZENvbHVtblN0YXRlO1xyXG4gICAgdGhpcy5wb3B1bGF0ZUZpbHRlcnMoKTtcclxuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKTtcclxuICAgIHRoaXMuaXNHcmlkRGF0YVJlbmRlcmVkLnNldCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNpemUgZ3JpZCBmcm9tIHNpemUgbW9kZSAqL1xyXG4gIHByaXZhdGUgcmVzaXplR3JpZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNpemVNb2RlID09PSAnQ29tcGFjdCcpIHtcclxuICAgICAgdGhpcy5yb3dIZWlnaHQgPSA0MDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2l6ZU1vZGUgPT09ICdSb29teScpIHtcclxuICAgICAgdGhpcy5yb3dIZWlnaHQgPSA1NjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnJvd0hlaWdodCA9IDQ4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gcGFnZSBzZWxlY3Rpb24gY2hhbmdlXHJcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBzZWxlY3RlZCBwYWdlIG51bWJlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBvblBhZ2VOdW1iZXJDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgLy8gVGhlIHBhZ2UgdmFsdWVzIGFyZSAxIG9mZiB0byBtYWtlIGEgMS1iYXNlZCBhcnJheSwgYnV0IHRoZSBhY3R1YWwgcGFnZXMgYXJlIGEgMC1iYXNlZCBhcnJheS5cclxuICAgIHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR29Ub1BhZ2UodmFsdWUgLSAxKTtcclxuICB9XHJcblxyXG4gIC8qKiBPbiBuZXh0IHBhZ2UgZXZlbnQgKi9cclxuICBwdWJsaWMgbmV4dFBhZ2UoKSB7XHJcbiAgICB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdvVG9OZXh0UGFnZSgpO1xyXG4gICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpXHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRDdXJyZW50UGFnZSgpICsgMTtcclxuICB9XHJcblxyXG4gIC8qKiBPbiBQcmV2aW91cyBQYWdlIEV2ZW50ICovXHJcbiAgcHVibGljIHByZXZpb3VzUGFnZSgpIHtcclxuICAgIHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR29Ub1ByZXZpb3VzUGFnZSgpO1xyXG4gICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpXHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRDdXJyZW50UGFnZSgpICsgMTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIENoYW5nZSBQYWdlIFNpemUgRXZlbnRcclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIHBhZ2luYXRpb24gZXZlbnRcclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlUGFnZVNpemUoZXZlbnQ6IFBhZ2luYXRpb25DaGFuZ2VkRXZlbnQpIHtcclxuICAgIC8vIE9ubHkgbmVlZCB0byBkbyB0aGlzIHdvcmsgaWYgdGhlIHBhZ2Ugc2l6ZSBoYXMgY2hhbmdlZC5cclxuICAgIGlmIChldmVudC5uZXdQYWdlU2l6ZSkge1xyXG4gICAgICAvLyBVcGRhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBmaWx0ZXJlZCByb3dzLlxyXG4gICAgICB0aGlzLnRvdGFsTGVuZ3RoID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRSb3dDb3VudCgpO1xyXG4gICAgICAvLyBIYW5kbGUgdGV4dCBjaGFuZ2VzXHJcbiAgICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZ3JpZCBmaWx0ZXIgaXMgY2hhbmdlZCBcclxuICAgKiBAdG9kbyB1cGRhdGUgdGhlIGZpbHRlciBkcm9wZG93biBvcHRpb25zIGJhc2VkIG9uIHRoZSBmaWx0ZXJlZCBkYXRhIHNldCwgaW5zdGVhZCBvZiB0aGUgY29tcGxldGUgZGF0YSBzZXQuXHJcbiAgICovXHJcbiAgcHVibGljIG9uRmlsdGVyQ2hhbmdlZCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHByZXZpb3VzVG90YWxMZW5ndGg6IG51bWJlciA9IE51bWJlcih0aGlzLnRvdGFsTGVuZ3RoKTtcclxuICAgIC8vIFVwZGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGZpbHRlcmVkIHJvd3MuXHJcbiAgICB0aGlzLnRvdGFsTGVuZ3RoID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRSb3dDb3VudCgpO1xyXG4gICAgaWYgKHRoaXMudG90YWxMZW5ndGggIT09IHByZXZpb3VzVG90YWxMZW5ndGgpIHtcclxuICAgICAgdGhpcy5hcmlhUmVzdWx0c0NvdW50Lm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgdGhpcy5hcmlhUmVzdWx0c0NvdW50Lm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy50b3RhbExlbmd0aCA9PT0gMFxyXG4gICAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2FybWF0dXJlLnNvZi10YWJsZS5zY3JlZW4tcmVhZGVyLmZpbHRlcmVkLXJlc3VsdHMubm8tcmVzdWx0cycpXHJcbiAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcclxuICAgICAgICAgICdhcm1hdHVyZS5zb2YtdGFibGUuc2NyZWVuLXJlYWRlci5maWx0ZXJlZC1yZXN1bHRzLmhhcy1yZXN1bHRzJywgeydyZXN1bHRzQ291bnQnOiB0aGlzLnRvdGFsTGVuZ3RofVxyXG4gICAgICAgICk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXJpYVJlc3VsdHNDb3VudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgIH0sIDEwMCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogR2VuZXJhdGVkIHRleHQgZm9yIHNob3dpbmcgcGFnZXMgaW4gZm9ybWF0OiAxLTExIG9mIDExICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVQYWdlQ2hhbmdlVGV4dCgpOiB2b2lkIHtcclxuICAgIC8vIEhhbmRsZSBlbXB0eSB0YWJsZVxyXG4gICAgaWYgKCF0aGlzLnRvdGFsTGVuZ3RoIHx8IHRoaXMucGFnaW5hdGlvblBhZ2VTaXplID09PSAwKSB7XHJcbiAgICAgIC8vIFJlc2V0IHRoZSBwYWdpbmF0aW9uIFVJXHJcbiAgICAgIHRoaXMudG90YWxOdW1iZXJPZlBhZ2VzID0gMTtcclxuICAgICAgdGhpcy5wYWdlU2VsZWN0b3IgPSBbMV07XHJcbiAgICAgIHRoaXMucGFnZUNoYW5nZVRleHQgPSBgMGA7XHJcbiAgICAgIHRoaXMuZ3JpZEFwaS5zaG93Tm9Sb3dzT3ZlcmxheSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyaWRBcGkuaGlkZU92ZXJsYXkoKTtcclxuICAgIH1cclxuICAgIC8vIFVwZGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXHJcbiAgICB0aGlzLnRvdGFsTnVtYmVyT2ZQYWdlcyA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0VG90YWxQYWdlcygpIHx8IE1hdGguY2VpbCh0aGlzLnRvdGFsTGVuZ3RoIC8gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUpIHx8IDE7XHJcbiAgICAvLyBSZXNldCB0aGUgcGFnZSBzZWxlY3RvclxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICBjb25zdCBwYWdlU2VsZWN0b3IgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMudG90YWxOdW1iZXJPZlBhZ2VzOyBpKyspIHtcclxuICAgICAgcGFnZVNlbGVjdG9yLnB1c2goaSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBhZ2VTZWxlY3RvciA9IHBhZ2VTZWxlY3RvcjtcclxuICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KHRoaXMudG90YWxMZW5ndGgsIDApO1xyXG4gICAgY29uc3QgcGFnZVNpemUgPSB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZTtcclxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldEN1cnJlbnRQYWdlKCkgKiBwYWdlU2l6ZTtcclxuICAgIGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCA8IGxlbmd0aCA/IE1hdGgubWluKHN0YXJ0SW5kZXggKyBwYWdlU2l6ZSwgbGVuZ3RoKSA6IHN0YXJ0SW5kZXggKyBwYWdlU2l6ZTtcclxuICAgIHRoaXMucGFnZUNoYW5nZVRleHQgPSBgJHtzdGFydEluZGV4ICsgMX0gLSAke2VuZEluZGV4fWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBseSB0aGUgc2VhcmNoIGZpbHRlciBvbiBkYXRhIHdoZW4gc2VhcmNoIHRleHQgY2hhbmdlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBvblNlYXJjaFRleHRDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkQXBpLnNldEdyaWRPcHRpb24oXCJxdWlja0ZpbHRlclRleHRcIiwgdGhpcy5ncmlkU2VhcmNoVGV4dElucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRvZ2dsZSB0aGUgZmlsdGVyIHBhbmVsIGRpc3BsYXkgKi9cclxuICBwdWJsaWMgdG9nZ2xlRmlsdGVyUGFuZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlck9wZW5TdGF0ZSA9ICF0aGlzLmZpbHRlck9wZW5TdGF0ZTtcclxuICB9XHJcblxyXG4gIC8qKiBBcHBseSB0aGUgc2VsZWN0ZWQgZmlsdGVycyAqL1xyXG4gIHB1YmxpYyBhcHBseUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICBsZXQgdGFibGVGaWx0ZXJNb2RlbDogRmlsdGVyTW9kZWwgPSB7fTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xGaWx0ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNvbEZpbHRlciA9IHRoaXMuY29sRmlsdGVyc1tpXTtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IHRoaXMuZmlsdGVyU2VsZWN0aW9uc1tpXTtcclxuICAgICAgaWYgKCFzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgIC8vIFJlc2V0IG91dCB0aGUgY29sdW1uIGZpbHRlcnNcclxuICAgICAgICB0aGlzLmdyaWRBcGkuc2V0Q29sdW1uRmlsdGVyTW9kZWwoY29sRmlsdGVyLmhlYWRlciwgbnVsbCk7XHJcbiAgICAgICAgdGFibGVGaWx0ZXJNb2RlbFtjb2xGaWx0ZXIuaGVhZGVyXSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgIC8vIFNldCB0aGUgc2luZ2xlIGZpbHRlciBmb3IgdGhlIGNvbHVtblxyXG4gICAgICAgIGxldCBmaWx0ZXJNb2RlbDogVGV4dEZpbHRlck1vZGVsID0geyBmaWx0ZXJUeXBlOiAndGV4dCcsIHR5cGU6ICdlcXVhbHMnLCBmaWx0ZXI6IHNlbGVjdGVkRWxlbWVudHNbMF0gfTtcclxuICAgICAgICAvLyBBcHBseSB0aGUgZmlsdGVyIG1vZGVsIHRvIHRoZSBjb2x1bW5cclxuICAgICAgICB0YWJsZUZpbHRlck1vZGVsW2NvbEZpbHRlci5oZWFkZXJdID0gZmlsdGVyTW9kZWw7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gU2V0IG11bHRpcGxlIE9SIGZpbHRlcnMgZm9yIHRoZSBjb2x1bW5cclxuICAgICAgICBsZXQgZmlsdGVyTW9kZWxzOiBDb21iaW5lZFNpbXBsZU1vZGVsPFRleHRGaWx0ZXJNb2RlbD4gPSB7IGZpbHRlclR5cGU6ICd0ZXh0Jywgb3BlcmF0b3I6ICdPUicsIGNvbmRpdGlvbnM6IFtdIH07XHJcbiAgICAgICAgLy8gU2V0IHRoZSBzZWxlY3RlZCBlbGVtZW50cyBpbiB0aGUgbW9kZWxcclxuICAgICAgICBmb3IgKGNvbnN0IHNlbGVjdGVkRWxlbWVudCBvZiBzZWxlY3RlZEVsZW1lbnRzKSB7XHJcbiAgICAgICAgICBmaWx0ZXJNb2RlbHMuY29uZGl0aW9ucy5wdXNoKHsgZmlsdGVyVHlwZTogJ3RleHQnLCB0eXBlOiAnZXF1YWxzJywgZmlsdGVyOiBzZWxlY3RlZEVsZW1lbnQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFwcGx5IHRoZSBmaWx0ZXIgbW9kZWwgY29sbGVjdGlvbiB0byB0aGUgY29sdW1uXHJcbiAgICAgICAgdGFibGVGaWx0ZXJNb2RlbFtjb2xGaWx0ZXIuaGVhZGVyXSA9IGZpbHRlck1vZGVscztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gT25jZSBldmVyeXRoaW5nIGlzIHNldCwgdXBkYXRlIHRoZSBmaWx0ZXJzXHJcbiAgICB0aGlzLmZpbHRlckNvdW50ID0gdGhpcy5nZXRGaWx0ZXJDb3VudCgpO1xyXG4gICAgdGhpcy5ncmlkQXBpLnNldEZpbHRlck1vZGVsKHRhYmxlRmlsdGVyTW9kZWwpO1xyXG4gICAgdGhpcy5ncmlkQXBpLm9uRmlsdGVyQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsZWFyIGFsbCBmaWx0ZXJzICovXHJcbiAgcHVibGljIGNsZWFyRmlsdGVycygpOiB2b2lkIHtcclxuICAgIC8vIENsZWFyIGFsbCBzZWxlY3Rpb25zXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmlsdGVyU2VsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLmZpbHRlclNlbGVjdGlvbnNbaV0gPSBbXTtcclxuICAgIH1cclxuICAgIC8vIFNldCB0aGUgZnVsbCBncmlkIGZpbHRlciBtb2RlbCB0byBudWxsXHJcbiAgICB0aGlzLmdyaWRBcGkuc2V0RmlsdGVyTW9kZWwobnVsbCk7XHJcbiAgICAvLyBVcGRhdGUgdGhlIGRpc3BsYXlcclxuICAgIHRoaXMuZ3JpZEFwaS5vbkZpbHRlckNoYW5nZWQoKTtcclxuICAgIHRoaXMuZmlsdGVyQ291bnQgPSB0aGlzLmdldEZpbHRlckNvdW50KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgbm8gZmlsdGVycyBhcmUgc2VsZWN0ZWRcclxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGEgZmlsdGVyIGlzIHNlbGVjdGVkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGhhc0VtcHR5RmlsdGVycygpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJTZWxlY3Rpb25zIHx8ICF0aGlzLmZpbHRlclNlbGVjdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBmaWx0ZXJTZWxlY3Qgb2YgdGhpcy5maWx0ZXJTZWxlY3Rpb25zKSB7XHJcbiAgICAgIC8vIElmIGF0IGxlYXN0IG9uZSBmaWx0ZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIHJldHVybiBmYWxzZVxyXG4gICAgICBpZiAoZmlsdGVyU2VsZWN0Lmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKiogQ2FuY2VsIHRoZSBjaGFuZ2VzIHRvIHRoZSBmaWx0ZXIgYW5kIGNsb3NlcyB0aGUgZmlsdGVyIHBhbmVsICovXHJcbiAgcHVibGljIGNhbmNlbEZpbHRlckNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICAvL1NldHMgdGhlIGZpbHRlciBzZWxlY3Rpb25zIG9uIGZpbHRlciBwYW5lbFxyXG4gICAgdGhpcy5zZXRGaWx0ZXJTZWxlY3Rpb25zKCk7XHJcbiAgICAvLyBDbG9zZSB0aGUgZmlsdGVyIHBhbmVsXHJcbiAgICB0aGlzLnRvZ2dsZUZpbHRlclBhbmVsKCk7XHJcbiAgfVxyXG5cclxuICAvKiogUG9wdWxhdGVzIHRoZSBmaWx0ZXIgZHJvcGRvd25zICovXHJcbiAgcHJpdmF0ZSBwb3B1bGF0ZUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICAvLyBSZXNldCB0aGUgZmlsdGVyIGRyb3Bkb3duc1xyXG4gICAgdGhpcy5maWx0ZXJTZWxlY3Rpb25zID0gW107XHJcbiAgICB0aGlzLmNvbEZpbHRlcnMgPSBbXTtcclxuICAgIC8vIEdldCB0aGUgY29sdW1uIGRlZmluaXRpb25zIHRoYXQgaGF2ZSBhIGZpbHRlclxyXG4gICAgY29uc3QgZmlsdGVyZWRDb2xzOiBBcnJheTxDb2xEZWY+ID0gdGhpcy5ncmlkQXBpLmdldENvbHVtbkRlZnMoKS5maWx0ZXIoKGRlZikgPT4gZGVmWydmaWx0ZXInXSk7XHJcbiAgICAvLyBDcmVhdGUgYSBtYXAgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcyBmb3IgZWFjaCBmaWVsZFxyXG4gICAgY29uc3QgZmlsdGVyVmFsdWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIFNldDxhbnk+PigpO1xyXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXRzIGZvciBlYWNoIGZpZWxkIChjb2x1bW4pIFxyXG4gICAgZm9yIChjb25zdCBjb2wgb2YgZmlsdGVyZWRDb2xzKSB7XHJcbiAgICAgIGNvbnN0IGZpZWxkOiBzdHJpbmcgPSBjb2xbXCJmaWVsZFwiXTtcclxuICAgICAgZmlsdGVyVmFsdWVzTWFwLnNldChmaWVsZCwgbmV3IFNldDxhbnk+KCkpO1xyXG4gICAgfVxyXG4gICAgLy8gVXNlIGZvckVhY2hOb2RlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgcm93c1xyXG4gICAgdGhpcy5ncmlkQXBpLmZvckVhY2hOb2RlKChub2RlOiBJUm93Tm9kZSkgPT4ge1xyXG4gICAgICBpZiAobm9kZS5kYXRhKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgZmlsdGVyZWRDb2xzKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZDogc3RyaW5nID0gY29sW1wiZmllbGRcIl07XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZTogYW55ID0gdGhpcy5ncmlkQXBpLmdldENlbGxWYWx1ZSh7cm93Tm9kZTogbm9kZSwgY29sS2V5OiBmaWVsZH0pO1xyXG4gICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGZpbHRlclZhbHVlc01hcC5nZXQoZmllbGQpPy5hZGQodmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciBlYWNoIGZpZWxkLCBwb3B1bGF0ZSBmaWx0ZXIgb3B0aW9uc1xyXG4gICAgZm9yIChjb25zdCBjb2wgb2YgZmlsdGVyZWRDb2xzKSB7XHJcbiAgICAgIGNvbnN0IGZpZWxkOiBzdHJpbmcgPSBjb2xbXCJmaWVsZFwiXTtcclxuICAgICAgY29uc3QgbGFiZWw6IHN0cmluZyA9IGNvbFtcImhlYWRlck5hbWVcIl07XHJcbiAgICAgIGNvbnN0IHVuaXF1ZVZhbHVlczogQXJyYXk8YW55PiA9IEFycmF5LmZyb20oZmlsdGVyVmFsdWVzTWFwLmdldChmaWVsZCkgfHwgW10pLnNvcnQoKTtcclxuICAgICAgaWYgKHVuaXF1ZVZhbHVlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlJ3Mgc3BhY2UgZm9yIGZpbHRlciBzZWxlY3Rpb25zXHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rpb25zLnB1c2goW10pOyBcclxuICAgICAgICB0aGlzLmNvbEZpbHRlcnMucHVzaCh7IGhlYWRlcjogZmllbGQsIGxhYmVsOiBsYWJlbCwgb3B0aW9uczogdW5pcXVlVmFsdWVzIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyaWRBcGkuc2V0RmlsdGVyTW9kZWwodGhpcy5pbml0aWFsRmlsdGVyTW9kZWwpO1xyXG4gICAgdGhpcy5zZXRGaWx0ZXJTZWxlY3Rpb25zKCk7XHJcbiAgICB0aGlzLmZpbHRlckNvdW50ID0gdGhpcy5nZXRGaWx0ZXJDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW4gdGhlIGNvbHVtbiBvcHRpb25zIG1vZGFsICovXHJcbiAgcHVibGljIG9wZW5Db2x1bW5PcHRpb25zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29sdW1uU3RhdGU6IEFycmF5PENvbHVtblN0YXRlPiA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5TdGF0ZSgpO1xyXG4gICAgY29uc3QgY29sdW1uRGF0YTogQXJyYXk8Q29sdW1uRGF0YT4gPSB0aGlzLmNvbHVtblN0YXRlVG9EYXRhKGNvbHVtblN0YXRlKTtcclxuICAgIGNvbnN0IGluaXRpYWxDb2x1bW5EYXRhOiBBcnJheTxDb2x1bW5EYXRhPiA9IHRoaXMuY29sdW1uU3RhdGVUb0RhdGEodGhpcy5zYXZlZENvbHVtblN0YXRlLnN0YXRlKTtcclxuICAgIGNvbnN0IGNvbHVtbk9wdGlvbnNEYXRhOiBDb2x1bW5PcHRpb25zRGF0YSA9IHtcclxuICAgICAgdGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcclxuICAgICAgY29sdW1uRGF0YSxcclxuICAgICAgaW5pdGlhbENvbHVtbkRhdGEsXHJcbiAgICAgIHNob3dTYXZlQ29sdW1uT3B0aW9uc1RleHQ6IHRoaXMuc2hvd1NhdmVDb2x1bW5PcHRpb25zVGV4dFxyXG4gICAgfTtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU29mQ29sdW1uT3B0aW9uc0NvbXBvbmVudCwge1xyXG4gICAgICB3aWR0aDogJzUwMHB4JyxcclxuICAgICAgcG9zaXRpb246IHsgYm90dG9tOiAnNDBweCcsIHJpZ2h0OiAnNDBweCcgfSxcclxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdjb2x1bW4tb3B0aW9ucy1oZWFkaW5nJyxcclxuICAgICAgZGF0YTogY29sdW1uT3B0aW9uc0RhdGFcclxuICAgIH0pO1xyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgdGFwKCh1cGRhdGVkQ29sdW1uU3RhdGU6IEFwcGx5Q29sdW1uU3RhdGVQYXJhbXMpID0+IHtcclxuICAgICAgICBpZiAodXBkYXRlZENvbHVtblN0YXRlICYmIHVwZGF0ZWRDb2x1bW5TdGF0ZS5zdGF0ZS5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZEFwaS5hcHBseUNvbHVtblN0YXRlKHVwZGF0ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZWRDb2x1bW5TdGF0ZS5lbWl0KHVwZGF0ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5TdGF0ZSA9IHVwZGF0ZWRDb2x1bW5TdGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFwcyBgQXJyYXk8Q29sdW1uU3RhdGU+YCB0byBgQXJyYXk8Q29sdW1uRGF0YT5gIFxyXG4gICAqIEBub3RlIGZpbHRlcnMgb3V0IGFueSBjb2x1bW5zIG1hcmtlZCBhcyAncGlubmVkJyBieSB0aGUgY29sdW1uIGRlZmluaXRpb25zLlxyXG4gICAqIEBub3RlIGZpbHRlcnMgYW55IGNvbHVtbnMgd2l0aG91dCBhICdoZWFkZXJOYW1lJy5cclxuICAgKiBAcGFyYW0gY29sdW1uU3RhdGUgdGhlIGNvbHVtbiBzdGF0ZSB0byBtb2RpZnlcclxuICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiBjb2x1bW4gZGF0YSBmb3JtYXR0ZWQgdG8gYmUgaW5nZXN0ZWQgYnkgdGhlIGBTb2ZDb2x1bW5PcHRpb25zQ29tcG9uZW50YFxyXG4gICovXHJcbiAgcHJpdmF0ZSBjb2x1bW5TdGF0ZVRvRGF0YShjb2x1bW5TdGF0ZTogQXJyYXk8Q29sdW1uU3RhdGU+KTogQXJyYXk8Q29sdW1uRGF0YT4ge1xyXG4gICAgcmV0dXJuIGNvbHVtblN0YXRlXHJcbiAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWU6IHN0cmluZyA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5EZWYoY29sdW1uLmNvbElkKT8uaGVhZGVyTmFtZSB8fCBcIlwiO1xyXG4gICAgICAgIGlmIChoZWFkZXJOYW1lICYmIGhlYWRlck5hbWUubGVuZ3RoICYmICFjb2x1bW4ucGlubmVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gY29sdW1uO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLm1hcCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyTmFtZTogc3RyaW5nID0gdGhpcy5ncmlkQXBpLmdldENvbHVtbkRlZihjb2x1bW4uY29sSWQpLmhlYWRlck5hbWU7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGlkOiBjb2x1bW4uY29sSWQsXHJcbiAgICAgICAgICBpc0NoZWNrZWQ6ICFjb2x1bW4uaGlkZSxcclxuICAgICAgICAgIHRleHQ6IGhlYWRlck5hbWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVtaXQgdGhlIGN1cnJlbnQgZmlsdGVyZWQvc29ydGVkIHJvdyBkYXRhICovXHJcbiAgcHVibGljIGV4cG9ydEZpbHRlcmVkUm93RGF0YSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvd0RhdGE6IEFycmF5PGFueT4gPSBbXTtcclxuICAgIGNvbnN0IGNvbHVtbnM6IEFycmF5PENvbHVtbj4gPSB0aGlzLmdyaWRBcGkuZ2V0QWxsRGlzcGxheWVkQ29sdW1ucygpLmZpbHRlcigoY29sKSA9PiBjb2wuZ2V0Q29sRGVmKCkuaGVhZGVyTmFtZSk7XHJcbiAgICBjb25zdCB0YWJsZUhlYWRlcnM6IEFycmF5PEtleVZhbFBhaXI+ID0gW107XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xyXG4gICAgICBjb25zdCBjb2xEZWY6IENvbERlZiA9IGNvbC5nZXRDb2xEZWYoKTtcclxuICAgICAgdGFibGVIZWFkZXJzLnB1c2goe1xyXG4gICAgICAgIGtleTogY29sRGVmLmZpZWxkLFxyXG4gICAgICAgIHZhbHVlOiBjb2xEZWYuaGVhZGVyTmFtZVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5ncmlkQXBpLmZvckVhY2hOb2RlQWZ0ZXJGaWx0ZXJBbmRTb3J0KChub2RlOiBJUm93Tm9kZTxhbnk+KSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vZGVEYXRhOiBhbnkgPSB7fTtcclxuICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcclxuICAgICAgICBjb25zdCBjb2xJZDogc3RyaW5nID0gY29sLmdldENvbElkKCk7XHJcbiAgICAgICAgLy8gVXNlIGdyaWRBcGkncyBnZXRDZWxsVmFsdWUgdG8gZ2V0IHRoZSB2YWx1ZSB0cmFuc2Zvcm1lZCBieSB2YWx1ZUdldHRlclxyXG4gICAgICAgIG5vZGVEYXRhW2NvbElkXSA9IHRoaXMuZ3JpZEFwaS5nZXRDZWxsVmFsdWUoeyByb3dOb2RlOiBub2RlLCBjb2xLZXk6IGNvbElkIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgcm93RGF0YS5wdXNoKG5vZGVEYXRhKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZXhwb3J0RGF0YTogRXhwb3J0VGFibGVEYXRhID0ge1xyXG4gICAgICB0YWJsZUhlYWRlcnMsXHJcbiAgICAgIHJvd0RhdGFcclxuICAgIH07XHJcbiAgICB0aGlzLmZpbHRlcmVkUm93RGF0YUZvckV4cG9ydC5lbWl0KGV4cG9ydERhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNldHMgZmlsdGVyIHNlbGVjdGlvbnMgZm9yIGZpbHRlciBwYW5lbCAqL1xyXG4gIHByaXZhdGUgc2V0RmlsdGVyU2VsZWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xGaWx0ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vIEdldCB0aGUgc3RvcmVkIGZpbHRlcnMgZm9yIHRoZSBnaXZlbiBtb2RlbFxyXG4gICAgICBjb25zdCBjb2xGaWx0ZXIgPSB0aGlzLmNvbEZpbHRlcnNbaV07XHJcbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5ncmlkQXBpLmdldENvbHVtbkZpbHRlck1vZGVsKGNvbEZpbHRlci5oZWFkZXIpO1xyXG4gICAgICBsZXQgZmlsdGVyU2VsZWN0aW9uRGF0YSA9IFtdO1xyXG4gICAgICBpZiAobW9kZWwgJiYgbW9kZWxbXCJjb25kaXRpb25zXCJdKSB7XHJcbiAgICAgICAgLy8gVGhlIG1vZGVsIGlzIGEgY29tYmluZWQgbW9kZWwgd2l0aCBtdWx0aXBsZSBzZWxlY3Rpb25zXHJcbiAgICAgICAgY29uc3QgZmlsdGVyTW9kZWwgPSBtb2RlbCBhcyBDb21iaW5lZFNpbXBsZU1vZGVsPFRleHRGaWx0ZXJNb2RlbD47XHJcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZpbHRlck1vZGVsLmNvbmRpdGlvbnMpIHtcclxuICAgICAgICAgIGZpbHRlclNlbGVjdGlvbkRhdGEucHVzaChlbGVtZW50LmZpbHRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG1vZGVsKSB7XHJcbiAgICAgICAgLy8gQXNzdW1lIHRoZSBtb2RlbCBpcyBhIHNpbmdsZSBUZXh0IEZpbHRlciBNb2RlbFxyXG4gICAgICAgIGxldCBmaWx0ZXJTZWxlY3Rpb246IFRleHRGaWx0ZXJNb2RlbCA9IG1vZGVsO1xyXG4gICAgICAgIGZpbHRlclNlbGVjdGlvbkRhdGEucHVzaChmaWx0ZXJTZWxlY3Rpb24uZmlsdGVyKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBTZXQgdGhlIGZpbHRlciBzZWxlY3Rpb25zXHJcbiAgICAgIHRoaXMuZmlsdGVyU2VsZWN0aW9uc1tpXSA9IGZpbHRlclNlbGVjdGlvbkRhdGE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogR2V0cyB0aGUgY291bnQgb2YgY3VycmVudCBmaWx0ZXIgc2VsZWN0aW9ucyAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlclNlbGVjdGlvbnMucmVkdWNlKChhY2MsIGN1cnIpID0+IGFjYy5jb25jYXQoY3VyciksIFtdKS5sZW5ndGg7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFRhYmxlRGF0YSB7XHJcbiAgdGFibGVIZWFkZXJzPzogQXJyYXk8S2V5VmFsUGFpcj47XHJcbiAgcm93RGF0YT86IEFycmF5PGFueT5cclxufVxyXG5cclxuaW50ZXJmYWNlIEtleVZhbFBhaXIgeyBcclxuICBrZXk/OiBzdHJpbmc7XHJcbiAgdmFsdWU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBVc2VkIGZvciBzZXR0aW5nIGZpbHRlciB2YWx1ZXMgKi9cclxuY2xhc3MgU29mVGFibGVGaWx0ZXIge1xyXG4gIC8qKiBUaGUgY29sdW1uIGhlYWRlciAqL1xyXG4gIGhlYWRlcjogc3RyaW5nO1xyXG4gIC8qKiBUaGUgY29sdW1uIGxhYmVsIG9yIHRyYW5zbGF0aW9uIGtleSAqL1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBjb2x1bW4gZmlsdGVyIG9wdGlvbnMgKi9cclxuICBvcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG59XHJcblxyXG4vKiogQSBmaWx0ZXIgY29tYmluaW5nIG11bHRpcGxlIGNvbmRpdGlvbnMsIHRha2VuIGZyb20gQWdHcmlkKi9cclxuY2xhc3MgQ29tYmluZWRTaW1wbGVNb2RlbDxUPiB7XHJcbiAgLyoqIFRoZSBmaWx0ZXIgdHlwZS4gVXN1YWxseSAndGV4dCcgKi9cclxuICBmaWx0ZXJUeXBlOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBvcGVyYXRvci4gVXN1YWxseSAnT1InICovXHJcbiAgb3BlcmF0b3I6ICdBTkQnIHwgJ09SJztcclxuICAvKiogbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBGaWx0ZXIgTW9kZWwgKi9cclxuICBjb25kaXRpb25zOiBUW107XHJcbn1cclxuIiwiPGRpdiBcclxuICBbZnhTaG93XT1cImlzR3JpZERhdGFSZW5kZXJlZCgpXCJcclxuICBmeExheW91dEdhcD1cIjE2cHhcIiBtLWItMjQ+XHJcbiAgQGlmIChlbmFibGVGaWx0ZXIgJiYgY29sRmlsdGVycy5sZW5ndGgpIHtcclxuICAgIDxidXR0b24gXHJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVGaWx0ZXJQYW5lbCgpXCIgXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24tdjJcIlxyXG4gICAgICB0aGVtZT1cIm5ldXRyYWxcIiBcclxuICAgICAgW2F0dHIuZW1waGFzaXNdPVwiZmlsdGVyT3BlblN0YXRlID8gJ3NvbGlkJyA6IGZpbHRlckNvdW50ID09PSAwID8gJ3NlY29uZGFyeScgOiAnY29udGFpbmVkJ1wiXHJcbiAgICAgIFttYXRCYWRnZV09XCJmaWx0ZXJDb3VudFwiXHJcbiAgICAgIG1hdEJhZGdlUG9zaXRpb249XCJhZnRlclwiXHJcbiAgICAgIFttYXRCYWRnZUhpZGRlbl09XCJmaWx0ZXJDb3VudCA9PT0gMCA/IHRydWUgOiBmYWxzZVwiPlxyXG4gICAgICA8aSBjbGFzcz1cInBoIHBoLWJvbGQgcGgtc2xpZGVycy1ob3Jpem9udGFsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICB7eydhcm1hdHVyZS5zb2YtdGFibGUuZmlsdGVyJyB8IHRyYW5zbGF0ZX19XHJcbiAgICA8L2J1dHRvbj5cclxuICB9XHJcbiAgQGlmIChlbmFibGVTZWFyY2gpIHtcclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInNvZi1mb3JtLWZpZWxkIHRhYmxlLXNlYXJjaC1maWVsZCBkZW5zZS00XCIgZnhGbGV4PVwiYXV0b1wiPlxyXG4gICAgICA8c3BhbiBtYXRQcmVmaXg+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJwaC1ib2xkIHBoLW1hZ25pZnlpbmctZ2xhc3Mgc2VhcmNoLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cInNlYXJjaC1sYWJlbFwiPnt7J2FybWF0dXJlLnNvZi10YWJsZS5zZWFyY2gnIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IFxyXG4gICAgICAgIChpbnB1dCk9XCJvblNlYXJjaFRleHRDaGFuZ2VkKClcIiBcclxuICAgICAgICAjZ3JpZFNlYXJjaFRleHRJbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZ3JpZFNlYXJjaFRleHRJbnB1dFwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuc2VhcmNoLWZpbHRlci1kZXNjcmlwdGlvbicgfCB0cmFuc2xhdGVcIi8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIH1cclxuICBAaWYgKGVuYWJsZUNvbHVtbk9wdGlvbnMpIHtcclxuICAgIDxidXR0b24gXHJcbiAgICAgIChjbGljayk9XCJvcGVuQ29sdW1uT3B0aW9ucygpXCJcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi1pY29uLXYyXCIgXHJcbiAgICAgIHRoZW1lPVwibmV1dHJhbFwiIGVtcGhhc2lzPVwic2Vjb25kYXJ5XCIgaWQ9XCJvcGVuLWNvbHVtbi1vcHRpb25zXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuY29sdW1uLW9wdGlvbnMtYnRuJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgIFttYXRUb29sdGlwXT1cIidhcm1hdHVyZS5zb2YtdGFibGUuc2NyZWVuLXJlYWRlci5jb2x1bW4tb3B0aW9ucy1idG4nIHwgdHJhbnNsYXRlXCJcclxuICAgICAgW2Rpc2FibGVkXT1cIiF0b3RhbExlbmd0aFwiPlxyXG4gICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtcGF1c2VcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuICB9XHJcbiAgQGlmKGVuYWJsZUV4cG9ydCkge1xyXG4gICAgPGJ1dHRvbiBcclxuICAgICAgKGNsaWNrKT1cImV4cG9ydEZpbHRlcmVkUm93RGF0YSgpXCJcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi1pY29uLXYyXCIgXHJcbiAgICAgIHRoZW1lPVwibmV1dHJhbFwiIGVtcGhhc2lzPVwic2Vjb25kYXJ5XCIgaWQ9XCJleHBvcnQtdGFibGVcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidhcm1hdHVyZS5zb2YtdGFibGUuc2NyZWVuLXJlYWRlci5leHBvcnQtdGFibGUnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2FybWF0dXJlLnNvZi10YWJsZS5zY3JlZW4tcmVhZGVyLmV4cG9ydC10YWJsZScgfCB0cmFuc2xhdGVcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiIXRvdGFsTGVuZ3RoXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1leHBvcnRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuICB9XHJcbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3NvZi10YWJsZS1yaWdodC1idXR0b25zXVwiPjwvbmctY29udGVudD5cclxuICA8IS0tIFxyXG4gIE9ubHkgaW5qZWN0IDxidXR0b24+J3MgaW5zaWRlIGFuIDxuZy1jb250YWluZXIgc29mLXRhYmxlLXJpZ2h0LWJ1dHRvbnM+XHJcbiAgLi4uIFxyXG4gIDxuZy1jb250YWluZXIgc29mLXRhYmxlLXJpZ2h0LWJ1dHRvbnM+XHJcbiAgICA8YnV0dG9uIFxyXG4gICAgICAoY2xpY2spPVwiYW55RnVuY3Rpb24oKVwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24taWNvbi12MlwiIFxyXG4gICAgICB0aGVtZT1cIm5ldXRyYWxcIiBlbXBoYXNpcz1cInNlY29uZGFyeVwiIGFyaWEtbGFiZWw9XCJhbnkgYnV0dG9uXCJcclxuICAgICAgbWF0VG9vbHRpcD1cImFueSBidXR0b25cIj5cclxuICAgICAgPGkgY2xhc3M9XCJwaC1ib2xkIHBoLWFjb3JuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiAgLi4uIFxyXG4gIG5vdGU6IG1ha2Ugc3VyZSBidXR0b25zIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIHRvIG1hdGNoIG90aGVycyA9XHJcbiAgYG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24taWNvbi12MlwiIHRoZW1lPVwibmV1dHJhbFwiIGVtcGhhc2lzPVwic2Vjb25kYXJ5XCJgXHJcbiAgKiByZW1lbWJlciB0byBhZGQgYXJpYS1sYWJlbCBhbmQgdG9vbHRpcCBmb3IgaWNvbiBidXR0b25cclxuICAtLT5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICNhcmlhUmVzdWx0c0NvdW50IGNsYXNzPVwic3Itb25seVwiIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPjwvZGl2PlxyXG5cclxuQGlmIChpc0dyaWREYXRhUmVuZGVyZWQoKSAmJiBmaWx0ZXJPcGVuU3RhdGUpIHtcclxuICA8ZmllbGRzZXQgXHJcbiAgICBjbGFzcz1cImZpbHRlci1wYW5lbFwiIHJvbGU9XCJyZWdpb25cIlxyXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCInYXJtYXR1cmUuc29mLXRhYmxlLnNjcmVlbi1yZWFkZXIuc2VsZWN0LWZpbHRlcnMtZGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlXCI+XHJcbiAgICA8cD5cclxuICAgICAgPGkgY2xhc3M9XCJwaCBwaC1ib2xkIHBoLXNsaWRlcnMtaG9yaXpvbnRhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtOFwiPnt7J2FybWF0dXJlLnNvZi10YWJsZS5maWx0ZXInIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICA8L3A+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXBhbmVsLXNlbGVjdC1jb250YWluZXIgbS12LTIwXCI+XHJcbiAgICAgIEBmb3IgKGNvbEZpbHRlciBvZiBjb2xGaWx0ZXJzOyBsZXQgaSA9ICRpbmRleDsgdHJhY2sgaSkge1xyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwic29mLWZvcm0tZmllbGQgdGFibGUtZmlsdGVyLXNlbGVjdFwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57e2NvbEZpbHRlci5sYWJlbH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LXNlbGVjdCBcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJTZWxlY3Rpb25zW2ldXCIgXHJcbiAgICAgICAgICAgIG11bHRpcGxlIFxyXG4gICAgICAgICAgICBpZD1cImZpbHRlckRyb3Bkb3due3tpfX1cIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7J2FybWF0dXJlLnNvZi10YWJsZS5hbGwnIHwgdHJhbnNsYXRlfX1cIiBkaXNhYmxlUmlwcGxlPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICBAZm9yIChjb2xPcHRpb24gb2YgY29sRmlsdGVyLm9wdGlvbnM7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJjb2xPcHRpb25cIj5cclxuICAgICAgICAgICAgICAgIHt7Y29sT3B0aW9ufX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIj5cclxuICAgICAgPGRpdiBmeEZsZXg9XCI1MCVcIj5cclxuICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsdGVycygpXCIgW2Rpc2FibGVkXT1cImhhc0VtcHR5RmlsdGVycygpXCIgXHJcbiAgICAgICAgICBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLXYyXCJcclxuICAgICAgICAgIHRoZW1lPVwibmV1dHJhbFwiIGVtcGhhc2lzPVwiZmxvYXRpbmdcIlxyXG4gICAgICAgICAgaWQ9XCJ0YWJsZUZpbHRlckNsZWFyXCI+XHJcbiAgICAgICAgICB7eydhcm1hdHVyZS5zb2YtdGFibGUucmVzZXQnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiNTAlXCI+XHJcbiAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMiVcIiBmeExheW91dEFsaWduPVwiZmxleC1lbmRcIj5cclxuICAgICAgICAgIDxkaXYgZnhGbGV4PVwiMCAxIGF1dG9cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsRmlsdGVyQ2hhbmdlcygpXCIgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi12MlwiIFxyXG4gICAgICAgICAgICAgIGlkPVwidGFibGVGaWx0ZXJDYW5jZWxcIiB0aGVtZT1cIm5ldXRyYWxcIiBlbXBoYXNpcz1cInNlY29uZGFyeVwiPlxyXG4gICAgICAgICAgICAgIHt7J2FybWF0dXJlLnNvZi10YWJsZS5jYW5jZWwnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgZnhGbGV4PVwiMCAxIGF1dG9cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIiBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLXYyXCJcclxuICAgICAgICAgICAgICBpZD1cInRhYmxlRmlsdGVyQXBwbHlcIiB0aGVtZT1cInByaW1hcnlcIiBlbXBoYXNpcz1cInNvbGlkXCI+XHJcbiAgICAgICAgICAgICAge3snYXJtYXR1cmUuc29mLXRhYmxlLnJlc3VsdHMnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2ZpZWxkc2V0PlxyXG59XHJcblxyXG48YWctZ3JpZC1hbmd1bGFyIFxyXG4gIFtmeFNob3ddPVwiaXNHcmlkRGF0YVJlbmRlcmVkKClcIlxyXG4gIChncmlkUmVhZHkpPVwib25HcmlkUmVhZHkoJGV2ZW50KVwiIFxyXG4gIChmaXJzdERhdGFSZW5kZXJlZCk9XCJvbkZpcnN0RGF0YVJlbmRlcmVkKClcIlxyXG4gIChmaWx0ZXJDaGFuZ2VkKT1cIm9uRmlsdGVyQ2hhbmdlZCgpXCJcclxuICAocGFnaW5hdGlvbkNoYW5nZWQpPVwiY2hhbmdlUGFnZVNpemUoJGV2ZW50KVwiIFxyXG4gIFtyb3dEYXRhXT1cInJvd0RhdGFcIiBcclxuICBbY29sdW1uRGVmc109XCJjb2xEZWZzXCIgXHJcbiAgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiIFxyXG4gIFtwYWdpbmF0aW9uXT1cInRydWVcIiBcclxuICBbc3VwcHJlc3NQYWdpbmF0aW9uUGFuZWxdPVwidHJ1ZVwiXHJcbiAgW3BhZ2luYXRpb25QYWdlU2l6ZVNlbGVjdG9yXT1cInBhZ2luYXRpb25QYWdlU2l6ZVNlbGVjdG9yXCIgXHJcbiAgW3BhZ2luYXRpb25QYWdlU2l6ZV09XCJwYWdpbmF0aW9uUGFnZVNpemVcIlxyXG4gIFtoZWFkZXJIZWlnaHRdPVwicm93SGVpZ2h0XCIgXHJcbiAgW3Jvd0hlaWdodF09XCJyb3dIZWlnaHRcIiBcclxuICBbZG9tTGF5b3V0XT1cIidhdXRvSGVpZ2h0J1wiIFxyXG4gIFt0b29sdGlwU2hvd0RlbGF5XT1cInRvb2x0aXBTaG93RGVsYXlcIlxyXG4gIFtvdmVybGF5Tm9Sb3dzVGVtcGxhdGVdPVwiKCdhcm1hdHVyZS5zb2YtdGFibGUubm8tcm93cycgfCB0cmFuc2xhdGUpIHx8ICdObyByZXN1bHRzIGZvdW5kLidcIlxyXG4gIFtjbGFzcy5uby1yb3dzXT1cIiF0b3RhbExlbmd0aFwiXHJcbiAgY2xhc3M9XCJhZy10aGVtZS1tYXRlcmlhbFwiPlxyXG48L2FnLWdyaWQtYW5ndWxhcj5cclxuXHJcbjxkaXYgXHJcbiAgW2Z4U2hvd109XCJpc0dyaWREYXRhUmVuZGVyZWQoKSAmJiB0b3RhbExlbmd0aFwiXHJcbiAgY2xhc3M9XCJjdXN0b20tcGFnaW5hdG9yXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZpcnN0LXNlY3Rpb25cIj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24tcGFydC0xXCIgdHlwZT1cImJ1dHRvblwiPlxyXG4gICAgICA8bWF0LXNlbGVjdCBcclxuICAgICAgICAjcGFnZVNpemVTZWxlY3RcclxuICAgICAgICBpZD1cInBhZ2VTaXplSW5wdXRcIiBuYW1lPVwicGFnZVNpemVJbnB1dFwiIFxyXG4gICAgICAgIFsodmFsdWUpXT1cInBhZ2luYXRpb25QYWdlU2l6ZVwiIGRpc2FibGVSaXBwbGU9XCJ0cnVlXCI+XHJcbiAgICAgICAgQGZvciAoc2l6ZSBvZiBwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvcjsgbGV0IGkgPSAkaW5kZXg7IHRyYWNrIGkpIHtcclxuICAgICAgICAgIDxtYXQtb3B0aW9uIFxyXG4gICAgICAgICAgICBjbGFzcz1cInBhZ2Utb3B0aW9uXCIgaWQ9XCJzaXple3tpfX1cIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwicGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JbaV1cIj5cclxuICAgICAgICAgICAge3tzaXplfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnJlbnQtcGFnZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZVwiPnt7cGFnaW5hdGlvblBhZ2VTaXplfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtaWNvblwiPlxyXG4gICAgICAgICAgICAgIDxpIFtjbGFzc109XCIncGgtYm9sZCBwaC1jYXJldC0nICsgKHBhZ2VTaXplU2VsZWN0LnBhbmVsT3BlbiA/ICd1cCc6J2Rvd24nKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJwYWdlQ2hhbmdlVGV4dFwiPlxyXG4gICAgICB7e3BhZ2VDaGFuZ2VUZXh0fX0ge3snYXJtYXR1cmUuc29mLXRhYmxlLm9mJyB8IHRyYW5zbGF0ZX19IHt7dG90YWxMZW5ndGh9fVxyXG4gICAgPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJnby10by1wYWdlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwib3V0ZXItYm94XCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24tcGFydFwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgICA8bWF0LXNlbGVjdCBcclxuICAgICAgICAgICNwYWdlTnVtYmVyU2VsZWN0XHJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uUGFnZU51bWJlckNoYW5nZSgkZXZlbnQudmFsdWUpXCJcclxuICAgICAgICAgIFsodmFsdWUpXT1cImN1cnJlbnRQYWdlXCIgXHJcbiAgICAgICAgICBpZD1cInBhZ2VTZWxlbGN0b3JcIiBuYW1lPVwicGFnZVNlbGVjdG9yXCIgZGlzYWJsZVJpcHBsZT1cInRydWVcIj5cclxuICAgICAgICAgIEBmb3IgKHBhZ2Ugb2YgcGFnZVNlbGVjdG9yOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInBhZ2VcIiBjbGFzcz1cInBhZ2Utb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJyZW50LXBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZVwiPnt7cGFnZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJyZW50LXBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZVwiPnt7Y3VycmVudFBhZ2V9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib2YtcGFnZVwiPiB7eydhcm1hdHVyZS5zb2YtdGFibGUub2YnIHwgdHJhbnNsYXRlfX0ge3t0b3RhbE51bWJlck9mUGFnZXN9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWljb25cIj5cclxuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCIncGgtYm9sZCBwaC1jYXJldC0nICsgKHBhZ2VOdW1iZXJTZWxlY3QucGFuZWxPcGVuID8gJ3VwJzonZG93bicpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmF2IGNsYXNzPVwic2Vjb25kLXNlY3Rpb25cIj5cclxuICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAoY2xpY2spPVwicHJldmlvdXNQYWdlKClcIlxyXG4gICAgICAgIGlkPVwicHJldi1idXR0b25cIiBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLWljb24tdjJcIiB0aGVtZT1cIm5ldXRyYWxcIiBlbXBoYXNpcz1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRQYWdlID09PSAxXCIgXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInc2NyZWVuLXJlYWRlci5wYWdpbmF0aW9uLnByZXZpb3VzJyB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1jYXJldC1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAoY2xpY2spPVwibmV4dFBhZ2UoKVwiIFxyXG4gICAgICAgIGlkPVwibmV4dC1idXR0b25cIiBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLWljb24tdjJcIiB0aGVtZT1cIm5ldXRyYWxcIiBlbXBoYXNpcz1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRQYWdlID09PSB0b3RhbE51bWJlck9mUGFnZXNcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3NjcmVlbi1yZWFkZXIucGFnaW5hdGlvbi5uZXh0JyB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1jYXJldC1yaWdodFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L25hdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5AaWYgKCFpc0dyaWREYXRhUmVuZGVyZWQoKSkge1xyXG4gIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbnRhaW5lclwiPlxyXG4gICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIGNvbG9yPVwicHJpbWFyeVwiIG1vZGU9XCJpbmRldGVybWluYXRlXCIvPlxyXG4gIDwvZGl2PlxyXG59XHJcbiJdfQ==
@@ -102,6 +102,11 @@ class SofTableComponent {
102
102
  this.updatedColumnState = new EventEmitter();
103
103
  /** Output filtered/sorted row data and table headers, all values returned will be formatted & translated */
104
104
  this.filteredRowDataForExport = new EventEmitter();
105
+ /**
106
+ * Keep track of the current column state
107
+ * @note If columns are re-defined (onChanges), this state will be applied
108
+ */
109
+ this.currentColumnState = {};
105
110
  /** Column names that should be filterable */
106
111
  this.colFilters = [];
107
112
  /** Row Height for table */
@@ -128,6 +133,9 @@ class SofTableComponent {
128
133
  cellStyle: { justifyContent: "center" },
129
134
  suppressKeyboardEvent: (params) => {
130
135
  return params.event.key === 'Tab' ? true : false;
136
+ },
137
+ filterParams: {
138
+ maxNumConditions: 100, // by default filters have a max condition limit of only 2
131
139
  }
132
140
  };
133
141
  /** Length of data */
@@ -1 +1 @@
1
- {"version":3,"file":"softheon-armature-ag-grid-components.mjs","sources":["../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.ts","../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.html","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.ts","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.html","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.ts","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.html","../../../../projects/armature/ag-grid-components/src/ag-grid-components.module.ts","../../../../projects/armature/ag-grid-components/public-api.ts","../../../../projects/armature/ag-grid-components/softheon-armature-ag-grid-components.ts"],"sourcesContent":["import { Component, inject } from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\nimport { ApplyColumnStateParams, ColumnState } from \"ag-grid-community\";\r\n\r\n/** Table Column options dialog */\r\n@Component({\r\n selector: 'sof-column-options',\r\n templateUrl: './column-options.component.html',\r\n styleUrl: './column-options.component.scss'\r\n})\r\nexport class SofColumnOptionsComponent {\r\n\r\n /** dialog reference */\r\n private dialogRef: MatDialogRef<SofColumnOptionsComponent> = inject(MatDialogRef<SofColumnOptionsComponent>);\r\n\r\n /** dialog data */\r\n public data: ColumnOptionsData = inject(MAT_DIALOG_DATA);\r\n\r\n /** emit the updated column state */\r\n public applyUpdatedColumnState(): void {\r\n const columnState: Array<ColumnState> = this.data.columnData.map((column) => {\r\n return {\r\n colId: column.id,\r\n hide: !column.isChecked\r\n }\r\n });\r\n const updatedColumnState: ApplyColumnStateParams = {\r\n state: [...columnState],\r\n applyOrder: true\r\n };\r\n this.dialogRef.close(updatedColumnState);\r\n }\r\n\r\n /** reset the column data to its first saved value */\r\n public resetColumnData(): void {\r\n this.data.columnData = structuredClone(this.data.initialColumnData);\r\n }\r\n}\r\n\r\n/** \r\n * Column options modal data\r\n * @description data passed from the 'SofTableComponent'\r\n * @property `tableName: string` name of the table using the column options\r\n * @property `columnData: Array<ColumnData>` column data returned from the agGrid api\r\n * @property `initialColumnData: Array<ColumnData>` column data from saved user preference or initial `columnData` \r\n * @see {@link ColumnData}\r\n */\r\nexport interface ColumnOptionsData {\r\n /** name of the table using the column options */\r\n tableName?: string;\r\n /** column data returned from the agGrid api */\r\n columnData?: Array<ColumnData>;\r\n /** column data from saved user preference or initial `columnData` */\r\n initialColumnData?: Array<ColumnData>;\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n */\r\n showSaveColumnOptionsText?: boolean;\r\n}\r\n\r\n/** \r\n * Column data \r\n * @description column data derived from the agGrid api, adds id property to type `HandleInput`\r\n * @property `id: string` columns unique id\r\n * @property `text: string` columns header text\r\n * @property `isChecked: boolean` column not hidden\r\n*/\r\nexport interface ColumnData {\r\n /** columns unique id */\r\n id?: string;\r\n /** columns header text */\r\n text?: string;\r\n /** column not hidden */\r\n isChecked?: boolean;\r\n}\r\n","<div class=\"column-options-header\">\r\n <i class=\"ph-bold ph-square-split-horizontal\" aria-hidden=\"true\"></i>\r\n <h2 id=\"column-options-heading\">{{'armature.sof-table.column-options' | translate}}</h2>\r\n <button \r\n mat-dialog-close m-l-auto \r\n disableRipple=\"true\" id=\"column-options-close\" aria-label=\"close\">\r\n <i class=\"ph-bold ph-x close\" aria-hidden=\"true\"></i>\r\n </button>\r\n</div>\r\n<div class=\"column-options-container\">\r\n <div class=\"column-options-description\">\r\n <p>\r\n {{'armature.sof-table.column-options-description' | translate}} \r\n {{ data.showSaveColumnOptionsText ? ('armature.sof-table.column-options-description-saving' | translate) : ''}}\r\n </p>\r\n <p class=\"table-label\">{{data.tableName | translate}} {{'armature.sof-table.columns' | translate}}</p>\r\n </div>\r\n <div class=\"column-options-selections\">\r\n <sof-handle [handleList]=\"data.columnData\"/>\r\n </div>\r\n <div class=\"column-options-bottom\">\r\n <button\r\n (click)=\"resetColumnData()\"\r\n mat-flat-button\r\n theme=\"neutral\" emphasis=\"floating\"\r\n class=\"sof-button-v2\" m-r-auto\r\n id=\"column-options-reset\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n <button \r\n mat-flat-button mat-dialog-close \r\n theme=\"neutral\" emphasis=\"secondary\"\r\n class=\"sof-button-v2\"\r\n id=\"column-options-cancel\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n <button \r\n (click)=\"applyUpdatedColumnState()\"\r\n mat-flat-button \r\n class=\"sof-button-v2\"\r\n theme=\"primary\" emphasis=\"solid\"\r\n id=\"column-options-update\">\r\n {{'armature.sof-table.update' | translate}}\r\n </button>\r\n </div>\r\n</div>\r\n","import { \r\n Component, \r\n ElementRef, \r\n EventEmitter, \r\n inject, \r\n Input, \r\n OnChanges, \r\n OnInit, \r\n Output, \r\n signal, \r\n SimpleChanges, \r\n ViewChild, \r\n WritableSignal \r\n} from '@angular/core';\r\n\r\nimport { take, tap } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\nimport { \r\n ColumnData, \r\n ColumnOptionsData, \r\n SofColumnOptionsComponent \r\n} from '../column-options-modal/column-options.component';\r\n\r\nimport {\r\n ApplyColumnStateParams,\r\n ColDef,\r\n Column,\r\n ColumnState,\r\n FilterModel,\r\n GridApi,\r\n GridReadyEvent,\r\n IRowNode,\r\n PaginationChangedEvent,\r\n SuppressKeyboardEventParams,\r\n TextFilterModel\r\n} from \"ag-grid-community\";\r\n\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n/** The Softheon Armature Table component */\r\n@Component({\r\n selector: 'sof-table',\r\n templateUrl: './sof-table.component.html',\r\n styleUrl: './sof-table.component.scss'\r\n})\r\nexport class SofTableComponent implements OnInit, OnChanges {\r\n\r\n /** The language text or a key that will be shown in this component */\r\n @Input() public rowData!: Array<any>;\r\n\r\n /** Column Definitions: Defines & controls grid columns. */\r\n @Input() public colDefs: Array<ColDef> = [];\r\n\r\n /** Size modes for table */\r\n @Input() private sizeMode: 'Compact' | 'Roomy' | 'Default';\r\n\r\n /** Pages sizes */\r\n @Input() public paginationPageSizeSelector: Array<number> = [10, 20, 50, 100];\r\n\r\n /** Enable search */\r\n @Input() public enableSearch: boolean = true;\r\n\r\n /** Enable custom text filter dropdowns */\r\n @Input() public enableFilter: boolean = true;\r\n\r\n /** Enable column options modal selection */\r\n @Input() public enableColumnOptions: boolean = true;\r\n\r\n /** Enable export button to output filtered row data */\r\n @Input() public enableExport: boolean = false;\r\n\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n * @default false\r\n * @description set to true if set-up for saving preferences to User data.\r\n * @note You can still save preferences to _local_ or _session_ storage\r\n * using the `savedColumnState` input, and `updatedColumnState` output event.\r\n * @see The Demo site is saving to local storage.\r\n */\r\n @Input() public showSaveColumnOptionsText: boolean = false;\r\n\r\n /** \r\n * Name/label of the table \r\n * @note should be a translation key\r\n */\r\n @Input() public tableName: string;\r\n\r\n /** Users saved column options state */\r\n @Input() private savedColumnState: ApplyColumnStateParams;\r\n\r\n /** Initial filter model */\r\n @Input() private initialFilterModel: FilterModel;\r\n\r\n /** Output updated column options event to save to user or browser storage */\r\n @Output() updatedColumnState: EventEmitter<ApplyColumnStateParams> = new EventEmitter();\r\n\r\n /** Output filtered/sorted row data and table headers, all values returned will be formatted & translated */\r\n @Output() filteredRowDataForExport: EventEmitter<ExportTableData> = new EventEmitter();\r\n\r\n /** the search input */\r\n @ViewChild('gridSearchTextInput') gridSearchTextInput: ElementRef<HTMLInputElement>;\r\n\r\n /** The hidden element that announces when the table content changes from filter */\r\n @ViewChild('ariaResultsCount') public ariaResultsCount: ElementRef<HTMLElement>;\r\n\r\n /** \r\n * Keep track of the current column state\r\n * @note If columns are re-defined (onChanges), this state will be applied\r\n */\r\n private currentColumnState: ApplyColumnStateParams;\r\n\r\n /** Column names that should be filterable */\r\n public colFilters: Array<SofTableFilter> = [];\r\n\r\n /** Row Height for table */\r\n public rowHeight: number = 48;\r\n\r\n /** Current Page Index */\r\n public currentPage: number = 0;\r\n\r\n /** Grid API */\r\n private gridApi!: GridApi;\r\n\r\n /** Is the table ready to be displayed */\r\n public isGridDataRendered: WritableSignal<boolean> = signal(false);\r\n\r\n /** Default Page Size */\r\n public paginationPageSize: number = 20; \r\n\r\n /** Tool tip show delay */\r\n public tooltipShowDelay: number = 500;\r\n \r\n /** Number of filters used */\r\n public filterCount: number = 0;\r\n /** \r\n * Default Column Definition \r\n * @note (suppressKeyboardEvent) Table cells can be navigated with the arrow keys, \r\n * if the cell contains a button you can Tab into the button, enter | space to interact.\r\n */\r\n public defaultColDef: ColDef = {\r\n resizable: false, // disable resize \r\n suppressHeaderMenuButton: true, // disable default filter menu \r\n suppressMovable: true, // disable default drag & drop for columns \r\n cellStyle: { justifyContent: \"center\" },\r\n suppressKeyboardEvent: (params: SuppressKeyboardEventParams) => {\r\n return params.event.key === 'Tab' ? true : false;\r\n }\r\n };\r\n\r\n /** Length of data */\r\n public totalLength: number = 0;\r\n\r\n /**Total number of pages */\r\n public totalNumberOfPages: number;\r\n\r\n /** Page Change text */\r\n public pageChangeText: string;\r\n\r\n /** Page selector array */\r\n public pageSelector: Array<number> = [];\r\n\r\n /** Filter Panel open state */\r\n public filterOpenState: boolean;\r\n\r\n /** The list of filters and the selected values */\r\n public filterSelections: Array<Array<string>> = [];\r\n\r\n /** mat-dialog */\r\n private dialog: MatDialog = inject(MatDialog);\r\n\r\n /** Translation service */\r\n private translateService: TranslateService = inject(TranslateService);\r\n\r\n /** On component init */\r\n public ngOnInit(): void {\r\n this.resizeGrid();\r\n }\r\n\r\n /**\r\n * Angular On Changes\r\n * @param changes The input changes\r\n */\r\n public ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.rowData && !changes.rowData.firstChange && !!this.gridApi) {\r\n this.totalLength = this.rowData?.length ?? 0; // handles null, undefined and [] data return, so will not load indefinitely \r\n setTimeout(() => {\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n });\r\n }\r\n if (changes.colDefs && !changes.colDefs.firstChange && !!this.gridApi) {\r\n setTimeout(() => {\r\n this.gridApi.applyColumnState(this.currentColumnState);\r\n this.populateFilters();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Called when the grid has ingested the input data\r\n * @param params Grid Ready Event,\r\n * The grid has initialized and is ready for most api calls, but may not be fully rendered yet.\r\n * @note you can not access this.gridApi before this function is run, \r\n * any attempts to access this.gridApi in this components ngOnInit or the first ngOnChanges cycle\r\n * will result in a type error; being this.gridApi is undefined at that time.\r\n */\r\n public onGridReady(params: GridReadyEvent) {\r\n this.gridApi = params.api;\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n window.onresize = () => {\r\n const mobileWidthThreshold = 752;\r\n if (window.innerWidth <= mobileWidthThreshold) {\r\n this.rowHeight = 40;\r\n this.paginationPageSize = 10;\r\n }\r\n else {\r\n this.resizeGrid();\r\n }\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** Fired the first time data is rendered into the grid. */\r\n public onFirstDataRendered() {\r\n if (!this.savedColumnState?.state.length) {\r\n const columnState: Array<ColumnState> = structuredClone(this.gridApi.getColumnState());\r\n this.savedColumnState = {\r\n state: columnState,\r\n applyOrder: true\r\n };\r\n }\r\n this.gridApi.applyColumnState(this.savedColumnState);\r\n this.updatedColumnState.emit(this.savedColumnState);\r\n this.currentColumnState = this.savedColumnState;\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n }\r\n\r\n /** Resize grid from size mode */\r\n private resizeGrid(): void {\r\n if (this.sizeMode === 'Compact') {\r\n this.rowHeight = 40;\r\n }\r\n else if (this.sizeMode === 'Roomy') {\r\n this.rowHeight = 56;\r\n }\r\n else {\r\n this.rowHeight = 48;\r\n }\r\n }\r\n\r\n /**\r\n * On page selection change\r\n * @param value The selected page number\r\n */\r\n public onPageNumberChange(value: number): void {\r\n // The page values are 1 off to make a 1-based array, but the actual pages are a 0-based array.\r\n this.gridApi.paginationGoToPage(value - 1);\r\n }\r\n\r\n /** On next page event */\r\n public nextPage() {\r\n this.gridApi.paginationGoToNextPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /** On Previous Page Event */\r\n public previousPage() {\r\n this.gridApi.paginationGoToPreviousPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /**\r\n * On Change Page Size Event\r\n * @param event The pagination event\r\n */\r\n public changePageSize(event: PaginationChangedEvent) {\r\n // Only need to do this work if the page size has changed.\r\n if (event.newPageSize) {\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n // Handle text changes\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** \r\n * Called when the grid filter is changed \r\n * @todo update the filter dropdown options based on the filtered data set, instead of the complete data set.\r\n */\r\n public onFilterChanged(): void {\r\n const previousTotalLength: number = Number(this.totalLength);\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n if (this.totalLength !== previousTotalLength) {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n this.ariaResultsCount.nativeElement.innerHTML = this.totalLength === 0\r\n ? this.translateService.instant('armature.sof-table.screen-reader.filtered-results.no-results')\r\n : this.translateService.instant(\r\n 'armature.sof-table.screen-reader.filtered-results.has-results', {'resultsCount': this.totalLength}\r\n );\r\n setTimeout(() => {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n }, 100);\r\n }\r\n this.handlePageChangeText();\r\n }\r\n\r\n /** Generated text for showing pages in format: 1-11 of 11 */\r\n private handlePageChangeText(): void {\r\n // Handle empty table\r\n if (!this.totalLength || this.paginationPageSize === 0) {\r\n // Reset the pagination UI\r\n this.totalNumberOfPages = 1;\r\n this.pageSelector = [1];\r\n this.pageChangeText = `0`;\r\n this.gridApi.showNoRowsOverlay();\r\n return;\r\n } else {\r\n this.gridApi.hideOverlay();\r\n }\r\n // Update the total number of pages\r\n this.totalNumberOfPages = this.gridApi.paginationGetTotalPages() || Math.ceil(this.totalLength / this.paginationPageSize) || 1;\r\n // Reset the page selector\r\n this.currentPage = 1;\r\n const pageSelector = [];\r\n for (let i = 1; i <= this.totalNumberOfPages; i++) {\r\n pageSelector.push(i);\r\n }\r\n this.pageSelector = pageSelector;\r\n const length = Math.max(this.totalLength, 0);\r\n const pageSize = this.paginationPageSize;\r\n const startIndex = this.gridApi.paginationGetCurrentPage() * pageSize;\r\n const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;\r\n this.pageChangeText = `${startIndex + 1} - ${endIndex}`;\r\n }\r\n\r\n /**\r\n * Apply the search filter on data when search text changed\r\n */\r\n public onSearchTextChanged(): void {\r\n this.gridApi.setGridOption(\"quickFilterText\", this.gridSearchTextInput.nativeElement.value);\r\n }\r\n\r\n /** Toggle the filter panel display */\r\n public toggleFilterPanel(): void {\r\n this.filterOpenState = !this.filterOpenState;\r\n }\r\n\r\n /** Apply the selected filters */\r\n public applyFilters(): void {\r\n let tableFilterModel: FilterModel = {};\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n const colFilter = this.colFilters[i];\r\n const selectedElements = this.filterSelections[i];\r\n if (!selectedElements.length) {\r\n // Reset out the column filters\r\n this.gridApi.setColumnFilterModel(colFilter.header, null);\r\n tableFilterModel[colFilter.header] = null;\r\n }\r\n else if (selectedElements.length == 1) {\r\n // Set the single filter for the column\r\n let filterModel: TextFilterModel = { filterType: 'text', type: 'equals', filter: selectedElements[0] };\r\n // Apply the filter model to the column\r\n tableFilterModel[colFilter.header] = filterModel;\r\n }\r\n else {\r\n // Set multiple OR filters for the column\r\n let filterModels: CombinedSimpleModel<TextFilterModel> = { filterType: 'text', operator: 'OR', conditions: [] };\r\n // Set the selected elements in the model\r\n for (const selectedElement of selectedElements) {\r\n filterModels.conditions.push({ filterType: 'text', type: 'equals', filter: selectedElement });\r\n }\r\n // Apply the filter model collection to the column\r\n tableFilterModel[colFilter.header] = filterModels;\r\n }\r\n }\r\n // Once everything is set, update the filters\r\n this.filterCount = this.getFilterCount();\r\n this.gridApi.setFilterModel(tableFilterModel);\r\n this.gridApi.onFilterChanged();\r\n }\r\n\r\n /** Clear all filters */\r\n public clearFilters(): void {\r\n // Clear all selections\r\n for (let i = 0; i < this.filterSelections.length; i++) {\r\n this.filterSelections[i] = [];\r\n }\r\n // Set the full grid filter model to null\r\n this.gridApi.setFilterModel(null);\r\n // Update the display\r\n this.gridApi.onFilterChanged();\r\n this.filterCount = this.getFilterCount();\r\n }\r\n\r\n /**\r\n * Returns true if no filters are selected\r\n * @returns True if a filter is selected, false otherwise.\r\n */\r\n public hasEmptyFilters(): boolean {\r\n if (!this.filterSelections || !this.filterSelections.length) {\r\n return true;\r\n }\r\n for (const filterSelect of this.filterSelections) {\r\n // If at least one filter has been selected, return false\r\n if (filterSelect.length) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Cancel the changes to the filter and closes the filter panel */\r\n public cancelFilterChanges(): void {\r\n //Sets the filter selections on filter panel\r\n this.setFilterSelections();\r\n // Close the filter panel\r\n this.toggleFilterPanel();\r\n }\r\n\r\n /** Populates the filter dropdowns */\r\n private populateFilters(): void {\r\n // Reset the filter dropdowns\r\n this.filterSelections = [];\r\n this.colFilters = [];\r\n // Get the column definitions that have a filter\r\n const filteredCols: Array<ColDef> = this.gridApi.getColumnDefs().filter((def) => def['filter']);\r\n // Create a map to store unique values for each field\r\n const filterValuesMap = new Map<string, Set<any>>();\r\n // Initialize sets for each field (column) \r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n filterValuesMap.set(field, new Set<any>());\r\n }\r\n // Use forEachNode to iterate over the rows\r\n this.gridApi.forEachNode((node: IRowNode) => {\r\n if (node.data) {\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const value: any = this.gridApi.getCellValue({rowNode: node, colKey: field});\r\n if (value) {\r\n filterValuesMap.get(field)?.add(value);\r\n }\r\n }\r\n }\r\n });\r\n // Now that we have the unique values for each field, populate filter options\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const label: string = col[\"headerName\"];\r\n const uniqueValues: Array<any> = Array.from(filterValuesMap.get(field) || []).sort();\r\n if (uniqueValues.length > 1) {\r\n // Ensure there's space for filter selections\r\n this.filterSelections.push([]); \r\n this.colFilters.push({ header: field, label: label, options: uniqueValues });\r\n }\r\n }\r\n this.gridApi.setFilterModel(this.initialFilterModel);\r\n this.setFilterSelections();\r\n this.filterCount = this.getFilterCount();\r\n }\r\n\r\n /** Open the column options modal */\r\n public openColumnOptions(): void {\r\n const columnState: Array<ColumnState> = this.gridApi.getColumnState();\r\n const columnData: Array<ColumnData> = this.columnStateToData(columnState);\r\n const initialColumnData: Array<ColumnData> = this.columnStateToData(this.savedColumnState.state);\r\n const columnOptionsData: ColumnOptionsData = {\r\n tableName: this.tableName,\r\n columnData,\r\n initialColumnData,\r\n showSaveColumnOptionsText: this.showSaveColumnOptionsText\r\n };\r\n const dialogRef = this.dialog.open(SofColumnOptionsComponent, {\r\n width: '500px',\r\n position: { bottom: '40px', right: '40px' },\r\n ariaLabelledBy: 'column-options-heading',\r\n data: columnOptionsData\r\n });\r\n dialogRef.afterClosed().pipe(\r\n take(1),\r\n tap((updatedColumnState: ApplyColumnStateParams) => {\r\n if (updatedColumnState && updatedColumnState.state.length) {\r\n this.gridApi.applyColumnState(updatedColumnState);\r\n this.updatedColumnState.emit(updatedColumnState);\r\n this.currentColumnState = updatedColumnState;\r\n }\r\n })\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Maps `Array<ColumnState>` to `Array<ColumnData>` \r\n * @note filters out any columns marked as 'pinned' by the column definitions.\r\n * @note filters any columns without a 'headerName'.\r\n * @param columnState the column state to modify\r\n * @returns an array of column data formatted to be ingested by the `SofColumnOptionsComponent`\r\n */\r\n private columnStateToData(columnState: Array<ColumnState>): Array<ColumnData> {\r\n return columnState\r\n .filter((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId)?.headerName || \"\";\r\n if (headerName && headerName.length && !column.pinned) {\r\n return column;\r\n }\r\n })\r\n .map((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId).headerName;\r\n return {\r\n id: column.colId,\r\n isChecked: !column.hide,\r\n text: headerName\r\n };\r\n }\r\n );\r\n }\r\n\r\n /** Emit the current filtered/sorted row data */\r\n public exportFilteredRowData(): void {\r\n const rowData: Array<any> = [];\r\n const columns: Array<Column> = this.gridApi.getAllDisplayedColumns().filter((col) => col.getColDef().headerName);\r\n const tableHeaders: Array<KeyValPair> = [];\r\n columns.forEach((col) => {\r\n const colDef: ColDef = col.getColDef();\r\n tableHeaders.push({\r\n key: colDef.field,\r\n value: colDef.headerName\r\n });\r\n });\r\n this.gridApi.forEachNodeAfterFilterAndSort((node: IRowNode<any>) => {\r\n const nodeData: any = {};\r\n columns.forEach((col) => {\r\n const colId: string = col.getColId();\r\n // Use gridApi's getCellValue to get the value transformed by valueGetter\r\n nodeData[colId] = this.gridApi.getCellValue({ rowNode: node, colKey: colId });\r\n });\r\n rowData.push(nodeData);\r\n });\r\n const exportData: ExportTableData = {\r\n tableHeaders,\r\n rowData\r\n };\r\n this.filteredRowDataForExport.emit(exportData);\r\n }\r\n\r\n /** Sets filter selections for filter panel */\r\n private setFilterSelections(): void {\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n // Get the stored filters for the given model\r\n const colFilter = this.colFilters[i];\r\n const model = this.gridApi.getColumnFilterModel(colFilter.header);\r\n let filterSelectionData = [];\r\n if (model && model[\"conditions\"]) {\r\n // The model is a combined model with multiple selections\r\n const filterModel = model as CombinedSimpleModel<TextFilterModel>;\r\n for (const element of filterModel.conditions) {\r\n filterSelectionData.push(element.filter);\r\n }\r\n }\r\n else if (model) {\r\n // Assume the model is a single Text Filter Model\r\n let filterSelection: TextFilterModel = model;\r\n filterSelectionData.push(filterSelection.filter);\r\n }\r\n // Set the filter selections\r\n this.filterSelections[i] = filterSelectionData;\r\n }\r\n }\r\n\r\n /** Gets the count of current filter selections */\r\n private getFilterCount(): number {\r\n return this.filterSelections.reduce((acc, curr) => acc.concat(curr), []).length;\r\n }\r\n}\r\n\r\nexport interface ExportTableData {\r\n tableHeaders?: Array<KeyValPair>;\r\n rowData?: Array<any>\r\n}\r\n\r\ninterface KeyValPair { \r\n key?: string;\r\n value?: string;\r\n}\r\n\r\n/** Used for setting filter values */\r\nclass SofTableFilter {\r\n /** The column header */\r\n header: string;\r\n /** The column label or translation key */\r\n label: string;\r\n /** The column filter options */\r\n options: string[] = [];\r\n}\r\n\r\n/** A filter combining multiple conditions, taken from AgGrid*/\r\nclass CombinedSimpleModel<T> {\r\n /** The filter type. Usually 'text' */\r\n filterType: string;\r\n /** The operator. Usually 'OR' */\r\n operator: 'AND' | 'OR';\r\n /** multiple instances of the Filter Model */\r\n conditions: T[];\r\n}\r\n","<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n fxLayoutGap=\"16px\" m-b-24>\r\n @if (enableFilter && colFilters.length) {\r\n <button \r\n (click)=\"toggleFilterPanel()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n theme=\"neutral\" \r\n [attr.emphasis]=\"filterOpenState ? 'solid' : filterCount === 0 ? 'secondary' : 'contained'\"\r\n [matBadge]=\"filterCount\"\r\n matBadgePosition=\"after\"\r\n [matBadgeHidden]=\"filterCount === 0 ? true : false\">\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n {{'armature.sof-table.filter' | translate}}\r\n </button>\r\n }\r\n @if (enableSearch) {\r\n <mat-form-field class=\"sof-form-field table-search-field dense-4\" fxFlex=\"auto\">\r\n <span matPrefix>\r\n <i class=\"ph-bold ph-magnifying-glass search-icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n <mat-label class=\"search-label\">{{'armature.sof-table.search' | translate}}</mat-label>\r\n <input \r\n (input)=\"onSearchTextChanged()\" \r\n #gridSearchTextInput matInput type=\"text\" id=\"gridSearchTextInput\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.search-filter-description' | translate\"/>\r\n </mat-form-field>\r\n }\r\n @if (enableColumnOptions) {\r\n <button \r\n (click)=\"openColumnOptions()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" id=\"open-column-options\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n [disabled]=\"!totalLength\">\r\n <i class=\"ph-bold ph-pause\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n @if(enableExport) {\r\n <button \r\n (click)=\"exportFilteredRowData()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" id=\"export-table\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n [disabled]=\"!totalLength\">\r\n <i class=\"ph-bold ph-export\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n <ng-content select=\"[sof-table-right-buttons]\"></ng-content>\r\n <!-- \r\n Only inject <button>'s inside an <ng-container sof-table-right-buttons>\r\n ... \r\n <ng-container sof-table-right-buttons>\r\n <button \r\n (click)=\"anyFunction()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" aria-label=\"any button\"\r\n matTooltip=\"any button\">\r\n <i class=\"ph-bold ph-acorn\" aria-hidden=\"true\"></i>\r\n </button>\r\n </ng-container>\r\n ... \r\n note: make sure buttons have the following attributes to match others =\r\n `mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"`\r\n * remember to add aria-label and tooltip for icon button\r\n -->\r\n</div>\r\n\r\n<div #ariaResultsCount class=\"sr-only\" aria-live=\"assertive\"></div>\r\n\r\n@if (isGridDataRendered() && filterOpenState) {\r\n <fieldset \r\n class=\"filter-panel\" role=\"region\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.select-filters-description' | translate\">\r\n <p>\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n <span class=\"m-l-8\">{{'armature.sof-table.filter' | translate}}</span>\r\n </p>\r\n <div class=\"filter-panel-select-container m-v-20\">\r\n @for (colFilter of colFilters; let i = $index; track i) {\r\n <mat-form-field appearance=\"outline\" class=\"sof-form-field table-filter-select\">\r\n <mat-label>{{colFilter.label}}</mat-label>\r\n <mat-select \r\n [(ngModel)]=\"filterSelections[i]\" \r\n multiple \r\n id=\"filterDropdown{{i}}\"\r\n placeholder=\"{{'armature.sof-table.all' | translate}}\" disableRipple=\"true\">\r\n @for (colOption of colFilter.options; track $index) {\r\n <mat-option [value]=\"colOption\">\r\n {{colOption}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div fxLayout=\"row\">\r\n <div fxFlex=\"50%\">\r\n <button \r\n (click)=\"clearFilters()\" [disabled]=\"hasEmptyFilters()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n theme=\"neutral\" emphasis=\"floating\"\r\n id=\"tableFilterClear\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"50%\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"2%\" fxLayoutAlign=\"flex-end\">\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"cancelFilterChanges()\" mat-flat-button class=\"sof-button-v2\" \r\n id=\"tableFilterCancel\" theme=\"neutral\" emphasis=\"secondary\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"applyFilters()\" mat-flat-button class=\"sof-button-v2\"\r\n id=\"tableFilterApply\" theme=\"primary\" emphasis=\"solid\">\r\n {{'armature.sof-table.results' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </fieldset>\r\n}\r\n\r\n<ag-grid-angular \r\n [fxShow]=\"isGridDataRendered()\"\r\n (gridReady)=\"onGridReady($event)\" \r\n (firstDataRendered)=\"onFirstDataRendered()\"\r\n (filterChanged)=\"onFilterChanged()\"\r\n (paginationChanged)=\"changePageSize($event)\" \r\n [rowData]=\"rowData\" \r\n [columnDefs]=\"colDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [pagination]=\"true\" \r\n [suppressPaginationPanel]=\"true\"\r\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\" \r\n [paginationPageSize]=\"paginationPageSize\"\r\n [headerHeight]=\"rowHeight\" \r\n [rowHeight]=\"rowHeight\" \r\n [domLayout]=\"'autoHeight'\" \r\n [tooltipShowDelay]=\"tooltipShowDelay\"\r\n [overlayNoRowsTemplate]=\"('armature.sof-table.no-rows' | translate) || 'No results found.'\"\r\n [class.no-rows]=\"!totalLength\"\r\n class=\"ag-theme-material\">\r\n</ag-grid-angular>\r\n\r\n<div \r\n [fxShow]=\"isGridDataRendered() && totalLength\"\r\n class=\"custom-paginator\">\r\n <div class=\"first-section\">\r\n <button class=\"button-part-1\" type=\"button\">\r\n <mat-select \r\n #pageSizeSelect\r\n id=\"pageSizeInput\" name=\"pageSizeInput\" \r\n [(value)]=\"paginationPageSize\" disableRipple=\"true\">\r\n @for (size of paginationPageSizeSelector; let i = $index; track i) {\r\n <mat-option \r\n class=\"page-option\" id=\"size{{i}}\"\r\n [value]=\"paginationPageSizeSelector[i]\">\r\n {{size}}\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{paginationPageSize}}</span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageSizeSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n <span class=\"pageChangeText\">\r\n {{pageChangeText}} {{'armature.sof-table.of' | translate}} {{totalLength}}\r\n </span>\r\n </div>\r\n <div class=\"go-to-page\">\r\n <div class=\"outer-box\">\r\n <button class=\"button-part\" type=\"button\">\r\n <mat-select \r\n #pageNumberSelect\r\n (selectionChange)=\"onPageNumberChange($event.value)\"\r\n [(value)]=\"currentPage\" \r\n id=\"pageSelelctor\" name=\"pageSelector\" disableRipple=\"true\">\r\n @for (page of pageSelector; track $index) {\r\n <mat-option [value]=\"page\" class=\"page-option\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{page}}</span>\r\n </span>\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{currentPage}}</span>\r\n <span class=\"of-page\"> {{'armature.sof-table.of' | translate}} {{totalNumberOfPages}} </span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageNumberSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n </div>\r\n <nav class=\"second-section\">\r\n <button \r\n (click)=\"previousPage()\"\r\n id=\"prev-button\" mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"\r\n [disabled]=\"currentPage === 1\" \r\n [attr.aria-label]=\"'screen-reader.pagination.previous' | translate\">\r\n <i class=\"ph-bold ph-caret-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button \r\n (click)=\"nextPage()\" \r\n id=\"next-button\" mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"\r\n [disabled]=\"currentPage === totalNumberOfPages\"\r\n [attr.aria-label]=\"'screen-reader.pagination.next' | translate\">\r\n <i class=\"ph-bold ph-caret-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </nav>\r\n </div>\r\n</div>\r\n\r\n@if (!isGridDataRendered()) {\r\n <div class=\"loading-container\">\r\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\r\n </div>\r\n}\r\n","import { Component, Input } from '@angular/core';\r\n\r\n/** The Softheon Armature Table Cell component */\r\n@Component({\r\n selector: 'sof-table-cell',\r\n templateUrl: './table-cell.component.html',\r\n styleUrl: './table-cell.component.scss'\r\n})\r\nexport class SofTableCellComponent {\r\n\r\n /** All Components for Table Cell */\r\n @Input() public components: TableCellComponent[] = [];\r\n\r\n /** Any logic related to ag grid cell renderer data can be added here */\r\n public agInit(params): void {\r\n this.components = params['components'];\r\n }\r\n}\r\n\r\n/** Components to Render in Table Cell */\r\ninterface TableCellComponent {\r\n /** Component Class */\r\n component: any,\r\n /** Inputs needed for specific component */\r\n inputs: any\r\n}\r\n","<div class=\"table-cell\">\r\n <ng-container *ngFor=\"let currentComponent of components\">\r\n <ng-container *ngComponentOutlet=\"currentComponent.component; \r\n inputs:currentComponent.inputs;\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatOptionModule } from '@angular/material/core';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AgGridModule } from 'ag-grid-angular';\r\nimport { SofTableComponent } from './sof-table/sof-table.component';\r\nimport { SofTableCellComponent } from './table-cell/table-cell.component';\r\nimport { SofColumnOptionsComponent } from './column-options-modal/column-options.component';\r\nimport { BaseComponentModule } from '@softheon/armature';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\n\r\n/** The material modules */\r\nconst materialModules = [\r\n MatSelectModule,\r\n MatOptionModule,\r\n MatCheckboxModule,\r\n MatIconModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatRadioModule,\r\n MatBadgeModule,\r\n MatProgressSpinnerModule\r\n];\r\n\r\n@NgModule({\r\n declarations: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FlexLayoutModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslateModule,\r\n AgGridModule,\r\n ...materialModules,\r\n BaseComponentModule\r\n ],\r\n exports: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ]\r\n})\r\nexport class AgGridComponentsModule { }\r\n","/** Public API Surface of Ag Grid components */\r\nexport * from './src/ag-grid-components.module';\r\nexport * from './src/sof-table/sof-table.component';\r\nexport * from './src/table-cell/table-cell.component';\r\nexport * from './src/column-options-modal/column-options.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i8","i13"],"mappings":"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"}
1
+ {"version":3,"file":"softheon-armature-ag-grid-components.mjs","sources":["../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.ts","../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.html","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.ts","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.html","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.ts","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.html","../../../../projects/armature/ag-grid-components/src/ag-grid-components.module.ts","../../../../projects/armature/ag-grid-components/public-api.ts","../../../../projects/armature/ag-grid-components/softheon-armature-ag-grid-components.ts"],"sourcesContent":["import { Component, inject } from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\nimport { ApplyColumnStateParams, ColumnState } from \"ag-grid-community\";\r\n\r\n/** Table Column options dialog */\r\n@Component({\r\n selector: 'sof-column-options',\r\n templateUrl: './column-options.component.html',\r\n styleUrl: './column-options.component.scss'\r\n})\r\nexport class SofColumnOptionsComponent {\r\n\r\n /** dialog reference */\r\n private dialogRef: MatDialogRef<SofColumnOptionsComponent> = inject(MatDialogRef<SofColumnOptionsComponent>);\r\n\r\n /** dialog data */\r\n public data: ColumnOptionsData = inject(MAT_DIALOG_DATA);\r\n\r\n /** emit the updated column state */\r\n public applyUpdatedColumnState(): void {\r\n const columnState: Array<ColumnState> = this.data.columnData.map((column) => {\r\n return {\r\n colId: column.id,\r\n hide: !column.isChecked\r\n }\r\n });\r\n const updatedColumnState: ApplyColumnStateParams = {\r\n state: [...columnState],\r\n applyOrder: true\r\n };\r\n this.dialogRef.close(updatedColumnState);\r\n }\r\n\r\n /** reset the column data to its first saved value */\r\n public resetColumnData(): void {\r\n this.data.columnData = structuredClone(this.data.initialColumnData);\r\n }\r\n}\r\n\r\n/** \r\n * Column options modal data\r\n * @description data passed from the 'SofTableComponent'\r\n * @property `tableName: string` name of the table using the column options\r\n * @property `columnData: Array<ColumnData>` column data returned from the agGrid api\r\n * @property `initialColumnData: Array<ColumnData>` column data from saved user preference or initial `columnData` \r\n * @see {@link ColumnData}\r\n */\r\nexport interface ColumnOptionsData {\r\n /** name of the table using the column options */\r\n tableName?: string;\r\n /** column data returned from the agGrid api */\r\n columnData?: Array<ColumnData>;\r\n /** column data from saved user preference or initial `columnData` */\r\n initialColumnData?: Array<ColumnData>;\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n */\r\n showSaveColumnOptionsText?: boolean;\r\n}\r\n\r\n/** \r\n * Column data \r\n * @description column data derived from the agGrid api, adds id property to type `HandleInput`\r\n * @property `id: string` columns unique id\r\n * @property `text: string` columns header text\r\n * @property `isChecked: boolean` column not hidden\r\n*/\r\nexport interface ColumnData {\r\n /** columns unique id */\r\n id?: string;\r\n /** columns header text */\r\n text?: string;\r\n /** column not hidden */\r\n isChecked?: boolean;\r\n}\r\n","<div class=\"column-options-header\">\r\n <i class=\"ph-bold ph-square-split-horizontal\" aria-hidden=\"true\"></i>\r\n <h2 id=\"column-options-heading\">{{'armature.sof-table.column-options' | translate}}</h2>\r\n <button \r\n mat-dialog-close m-l-auto \r\n disableRipple=\"true\" id=\"column-options-close\" aria-label=\"close\">\r\n <i class=\"ph-bold ph-x close\" aria-hidden=\"true\"></i>\r\n </button>\r\n</div>\r\n<div class=\"column-options-container\">\r\n <div class=\"column-options-description\">\r\n <p>\r\n {{'armature.sof-table.column-options-description' | translate}} \r\n {{ data.showSaveColumnOptionsText ? ('armature.sof-table.column-options-description-saving' | translate) : ''}}\r\n </p>\r\n <p class=\"table-label\">{{data.tableName | translate}} {{'armature.sof-table.columns' | translate}}</p>\r\n </div>\r\n <div class=\"column-options-selections\">\r\n <sof-handle [handleList]=\"data.columnData\"/>\r\n </div>\r\n <div class=\"column-options-bottom\">\r\n <button\r\n (click)=\"resetColumnData()\"\r\n mat-flat-button\r\n theme=\"neutral\" emphasis=\"floating\"\r\n class=\"sof-button-v2\" m-r-auto\r\n id=\"column-options-reset\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n <button \r\n mat-flat-button mat-dialog-close \r\n theme=\"neutral\" emphasis=\"secondary\"\r\n class=\"sof-button-v2\"\r\n id=\"column-options-cancel\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n <button \r\n (click)=\"applyUpdatedColumnState()\"\r\n mat-flat-button \r\n class=\"sof-button-v2\"\r\n theme=\"primary\" emphasis=\"solid\"\r\n id=\"column-options-update\">\r\n {{'armature.sof-table.update' | translate}}\r\n </button>\r\n </div>\r\n</div>\r\n","import { \r\n Component, \r\n ElementRef, \r\n EventEmitter, \r\n inject, \r\n Input, \r\n OnChanges, \r\n OnInit, \r\n Output, \r\n signal, \r\n SimpleChanges, \r\n ViewChild, \r\n WritableSignal \r\n} from '@angular/core';\r\n\r\nimport { take, tap } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\nimport { \r\n ColumnData, \r\n ColumnOptionsData, \r\n SofColumnOptionsComponent \r\n} from '../column-options-modal/column-options.component';\r\n\r\nimport {\r\n ApplyColumnStateParams,\r\n ColDef,\r\n Column,\r\n ColumnState,\r\n FilterModel,\r\n GridApi,\r\n GridReadyEvent,\r\n IRowNode,\r\n ITextFilterParams,\r\n PaginationChangedEvent,\r\n SuppressKeyboardEventParams,\r\n TextFilterModel\r\n} from \"ag-grid-community\";\r\n\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n/** The Softheon Armature Table component */\r\n@Component({\r\n selector: 'sof-table',\r\n templateUrl: './sof-table.component.html',\r\n styleUrl: './sof-table.component.scss'\r\n})\r\nexport class SofTableComponent implements OnInit, OnChanges {\r\n\r\n /** The language text or a key that will be shown in this component */\r\n @Input() public rowData!: Array<any>;\r\n\r\n /** Column Definitions: Defines & controls grid columns. */\r\n @Input() public colDefs: Array<ColDef> = [];\r\n\r\n /** Size modes for table */\r\n @Input() private sizeMode: 'Compact' | 'Roomy' | 'Default';\r\n\r\n /** Pages sizes */\r\n @Input() public paginationPageSizeSelector: Array<number> = [10, 20, 50, 100];\r\n\r\n /** Enable search */\r\n @Input() public enableSearch: boolean = true;\r\n\r\n /** Enable custom text filter dropdowns */\r\n @Input() public enableFilter: boolean = true;\r\n\r\n /** Enable column options modal selection */\r\n @Input() public enableColumnOptions: boolean = true;\r\n\r\n /** Enable export button to output filtered row data */\r\n @Input() public enableExport: boolean = false;\r\n\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n * @default false\r\n * @description set to true if set-up for saving preferences to User data.\r\n * @note You can still save preferences to _local_ or _session_ storage\r\n * using the `savedColumnState` input, and `updatedColumnState` output event.\r\n * @see The Demo site is saving to local storage.\r\n */\r\n @Input() public showSaveColumnOptionsText: boolean = false;\r\n\r\n /** \r\n * Name/label of the table \r\n * @note should be a translation key\r\n */\r\n @Input() public tableName: string;\r\n\r\n /** Users saved column options state */\r\n @Input() private savedColumnState: ApplyColumnStateParams;\r\n\r\n /** Initial filter model */\r\n @Input() private initialFilterModel: FilterModel;\r\n\r\n /** Output updated column options event to save to user or browser storage */\r\n @Output() updatedColumnState: EventEmitter<ApplyColumnStateParams> = new EventEmitter();\r\n\r\n /** Output filtered/sorted row data and table headers, all values returned will be formatted & translated */\r\n @Output() filteredRowDataForExport: EventEmitter<ExportTableData> = new EventEmitter();\r\n\r\n /** the search input */\r\n @ViewChild('gridSearchTextInput') gridSearchTextInput: ElementRef<HTMLInputElement>;\r\n\r\n /** The hidden element that announces when the table content changes from filter */\r\n @ViewChild('ariaResultsCount') public ariaResultsCount: ElementRef<HTMLElement>;\r\n\r\n /** \r\n * Keep track of the current column state\r\n * @note If columns are re-defined (onChanges), this state will be applied\r\n */\r\n private currentColumnState: ApplyColumnStateParams = {};\r\n\r\n /** Column names that should be filterable */\r\n public colFilters: Array<SofTableFilter> = [];\r\n\r\n /** Row Height for table */\r\n public rowHeight: number = 48;\r\n\r\n /** Current Page Index */\r\n public currentPage: number = 0;\r\n\r\n /** Grid API */\r\n private gridApi!: GridApi;\r\n\r\n /** Is the table ready to be displayed */\r\n public isGridDataRendered: WritableSignal<boolean> = signal(false);\r\n\r\n /** Default Page Size */\r\n public paginationPageSize: number = 20; \r\n\r\n /** Tool tip show delay */\r\n public tooltipShowDelay: number = 500;\r\n \r\n /** Number of filters used */\r\n public filterCount: number = 0;\r\n /** \r\n * Default Column Definition \r\n * @note (suppressKeyboardEvent) Table cells can be navigated with the arrow keys, \r\n * if the cell contains a button you can Tab into the button, enter | space to interact.\r\n */\r\n public defaultColDef: ColDef = {\r\n resizable: false, // disable resize \r\n suppressHeaderMenuButton: true, // disable default filter menu \r\n suppressMovable: true, // disable default drag & drop for columns \r\n cellStyle: { justifyContent: \"center\" },\r\n suppressKeyboardEvent: (params: SuppressKeyboardEventParams) => {\r\n return params.event.key === 'Tab' ? true : false;\r\n },\r\n filterParams: {\r\n maxNumConditions: 100, // by default filters have a max condition limit of only 2\r\n } as ITextFilterParams\r\n };\r\n\r\n /** Length of data */\r\n public totalLength: number = 0;\r\n\r\n /**Total number of pages */\r\n public totalNumberOfPages: number;\r\n\r\n /** Page Change text */\r\n public pageChangeText: string;\r\n\r\n /** Page selector array */\r\n public pageSelector: Array<number> = [];\r\n\r\n /** Filter Panel open state */\r\n public filterOpenState: boolean;\r\n\r\n /** The list of filters and the selected values */\r\n public filterSelections: Array<Array<string>> = [];\r\n\r\n /** mat-dialog */\r\n private dialog: MatDialog = inject(MatDialog);\r\n\r\n /** Translation service */\r\n private translateService: TranslateService = inject(TranslateService);\r\n\r\n /** On component init */\r\n public ngOnInit(): void {\r\n this.resizeGrid();\r\n }\r\n\r\n /**\r\n * Angular On Changes\r\n * @param changes The input changes\r\n */\r\n public ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.rowData && !changes.rowData.firstChange && !!this.gridApi) {\r\n this.totalLength = this.rowData?.length ?? 0; // handles null, undefined and [] data return, so will not load indefinitely \r\n setTimeout(() => {\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n });\r\n }\r\n if (changes.colDefs && !changes.colDefs.firstChange && !!this.gridApi) {\r\n setTimeout(() => {\r\n this.gridApi.applyColumnState(this.currentColumnState);\r\n this.populateFilters();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Called when the grid has ingested the input data\r\n * @param params Grid Ready Event,\r\n * The grid has initialized and is ready for most api calls, but may not be fully rendered yet.\r\n * @note you can not access this.gridApi before this function is run, \r\n * any attempts to access this.gridApi in this components ngOnInit or the first ngOnChanges cycle\r\n * will result in a type error; being this.gridApi is undefined at that time.\r\n */\r\n public onGridReady(params: GridReadyEvent) {\r\n this.gridApi = params.api;\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n window.onresize = () => {\r\n const mobileWidthThreshold = 752;\r\n if (window.innerWidth <= mobileWidthThreshold) {\r\n this.rowHeight = 40;\r\n this.paginationPageSize = 10;\r\n }\r\n else {\r\n this.resizeGrid();\r\n }\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** Fired the first time data is rendered into the grid. */\r\n public onFirstDataRendered() {\r\n if (!this.savedColumnState?.state.length) {\r\n const columnState: Array<ColumnState> = structuredClone(this.gridApi.getColumnState());\r\n this.savedColumnState = {\r\n state: columnState,\r\n applyOrder: true\r\n };\r\n }\r\n this.gridApi.applyColumnState(this.savedColumnState);\r\n this.updatedColumnState.emit(this.savedColumnState);\r\n this.currentColumnState = this.savedColumnState;\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n this.isGridDataRendered.set(true);\r\n }\r\n\r\n /** Resize grid from size mode */\r\n private resizeGrid(): void {\r\n if (this.sizeMode === 'Compact') {\r\n this.rowHeight = 40;\r\n }\r\n else if (this.sizeMode === 'Roomy') {\r\n this.rowHeight = 56;\r\n }\r\n else {\r\n this.rowHeight = 48;\r\n }\r\n }\r\n\r\n /**\r\n * On page selection change\r\n * @param value The selected page number\r\n */\r\n public onPageNumberChange(value: number): void {\r\n // The page values are 1 off to make a 1-based array, but the actual pages are a 0-based array.\r\n this.gridApi.paginationGoToPage(value - 1);\r\n }\r\n\r\n /** On next page event */\r\n public nextPage() {\r\n this.gridApi.paginationGoToNextPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /** On Previous Page Event */\r\n public previousPage() {\r\n this.gridApi.paginationGoToPreviousPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /**\r\n * On Change Page Size Event\r\n * @param event The pagination event\r\n */\r\n public changePageSize(event: PaginationChangedEvent) {\r\n // Only need to do this work if the page size has changed.\r\n if (event.newPageSize) {\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n // Handle text changes\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** \r\n * Called when the grid filter is changed \r\n * @todo update the filter dropdown options based on the filtered data set, instead of the complete data set.\r\n */\r\n public onFilterChanged(): void {\r\n const previousTotalLength: number = Number(this.totalLength);\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n if (this.totalLength !== previousTotalLength) {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n this.ariaResultsCount.nativeElement.innerHTML = this.totalLength === 0\r\n ? this.translateService.instant('armature.sof-table.screen-reader.filtered-results.no-results')\r\n : this.translateService.instant(\r\n 'armature.sof-table.screen-reader.filtered-results.has-results', {'resultsCount': this.totalLength}\r\n );\r\n setTimeout(() => {\r\n this.ariaResultsCount.nativeElement.innerHTML = \"\";\r\n }, 100);\r\n }\r\n this.handlePageChangeText();\r\n }\r\n\r\n /** Generated text for showing pages in format: 1-11 of 11 */\r\n private handlePageChangeText(): void {\r\n // Handle empty table\r\n if (!this.totalLength || this.paginationPageSize === 0) {\r\n // Reset the pagination UI\r\n this.totalNumberOfPages = 1;\r\n this.pageSelector = [1];\r\n this.pageChangeText = `0`;\r\n this.gridApi.showNoRowsOverlay();\r\n return;\r\n } else {\r\n this.gridApi.hideOverlay();\r\n }\r\n // Update the total number of pages\r\n this.totalNumberOfPages = this.gridApi.paginationGetTotalPages() || Math.ceil(this.totalLength / this.paginationPageSize) || 1;\r\n // Reset the page selector\r\n this.currentPage = 1;\r\n const pageSelector = [];\r\n for (let i = 1; i <= this.totalNumberOfPages; i++) {\r\n pageSelector.push(i);\r\n }\r\n this.pageSelector = pageSelector;\r\n const length = Math.max(this.totalLength, 0);\r\n const pageSize = this.paginationPageSize;\r\n const startIndex = this.gridApi.paginationGetCurrentPage() * pageSize;\r\n const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;\r\n this.pageChangeText = `${startIndex + 1} - ${endIndex}`;\r\n }\r\n\r\n /**\r\n * Apply the search filter on data when search text changed\r\n */\r\n public onSearchTextChanged(): void {\r\n this.gridApi.setGridOption(\"quickFilterText\", this.gridSearchTextInput.nativeElement.value);\r\n }\r\n\r\n /** Toggle the filter panel display */\r\n public toggleFilterPanel(): void {\r\n this.filterOpenState = !this.filterOpenState;\r\n }\r\n\r\n /** Apply the selected filters */\r\n public applyFilters(): void {\r\n let tableFilterModel: FilterModel = {};\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n const colFilter = this.colFilters[i];\r\n const selectedElements = this.filterSelections[i];\r\n if (!selectedElements.length) {\r\n // Reset out the column filters\r\n this.gridApi.setColumnFilterModel(colFilter.header, null);\r\n tableFilterModel[colFilter.header] = null;\r\n }\r\n else if (selectedElements.length == 1) {\r\n // Set the single filter for the column\r\n let filterModel: TextFilterModel = { filterType: 'text', type: 'equals', filter: selectedElements[0] };\r\n // Apply the filter model to the column\r\n tableFilterModel[colFilter.header] = filterModel;\r\n }\r\n else {\r\n // Set multiple OR filters for the column\r\n let filterModels: CombinedSimpleModel<TextFilterModel> = { filterType: 'text', operator: 'OR', conditions: [] };\r\n // Set the selected elements in the model\r\n for (const selectedElement of selectedElements) {\r\n filterModels.conditions.push({ filterType: 'text', type: 'equals', filter: selectedElement });\r\n }\r\n // Apply the filter model collection to the column\r\n tableFilterModel[colFilter.header] = filterModels;\r\n }\r\n }\r\n // Once everything is set, update the filters\r\n this.filterCount = this.getFilterCount();\r\n this.gridApi.setFilterModel(tableFilterModel);\r\n this.gridApi.onFilterChanged();\r\n }\r\n\r\n /** Clear all filters */\r\n public clearFilters(): void {\r\n // Clear all selections\r\n for (let i = 0; i < this.filterSelections.length; i++) {\r\n this.filterSelections[i] = [];\r\n }\r\n // Set the full grid filter model to null\r\n this.gridApi.setFilterModel(null);\r\n // Update the display\r\n this.gridApi.onFilterChanged();\r\n this.filterCount = this.getFilterCount();\r\n }\r\n\r\n /**\r\n * Returns true if no filters are selected\r\n * @returns True if a filter is selected, false otherwise.\r\n */\r\n public hasEmptyFilters(): boolean {\r\n if (!this.filterSelections || !this.filterSelections.length) {\r\n return true;\r\n }\r\n for (const filterSelect of this.filterSelections) {\r\n // If at least one filter has been selected, return false\r\n if (filterSelect.length) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Cancel the changes to the filter and closes the filter panel */\r\n public cancelFilterChanges(): void {\r\n //Sets the filter selections on filter panel\r\n this.setFilterSelections();\r\n // Close the filter panel\r\n this.toggleFilterPanel();\r\n }\r\n\r\n /** Populates the filter dropdowns */\r\n private populateFilters(): void {\r\n // Reset the filter dropdowns\r\n this.filterSelections = [];\r\n this.colFilters = [];\r\n // Get the column definitions that have a filter\r\n const filteredCols: Array<ColDef> = this.gridApi.getColumnDefs().filter((def) => def['filter']);\r\n // Create a map to store unique values for each field\r\n const filterValuesMap = new Map<string, Set<any>>();\r\n // Initialize sets for each field (column) \r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n filterValuesMap.set(field, new Set<any>());\r\n }\r\n // Use forEachNode to iterate over the rows\r\n this.gridApi.forEachNode((node: IRowNode) => {\r\n if (node.data) {\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const value: any = this.gridApi.getCellValue({rowNode: node, colKey: field});\r\n if (value) {\r\n filterValuesMap.get(field)?.add(value);\r\n }\r\n }\r\n }\r\n });\r\n // Now that we have the unique values for each field, populate filter options\r\n for (const col of filteredCols) {\r\n const field: string = col[\"field\"];\r\n const label: string = col[\"headerName\"];\r\n const uniqueValues: Array<any> = Array.from(filterValuesMap.get(field) || []).sort();\r\n if (uniqueValues.length > 1) {\r\n // Ensure there's space for filter selections\r\n this.filterSelections.push([]); \r\n this.colFilters.push({ header: field, label: label, options: uniqueValues });\r\n }\r\n }\r\n this.gridApi.setFilterModel(this.initialFilterModel);\r\n this.setFilterSelections();\r\n this.filterCount = this.getFilterCount();\r\n }\r\n\r\n /** Open the column options modal */\r\n public openColumnOptions(): void {\r\n const columnState: Array<ColumnState> = this.gridApi.getColumnState();\r\n const columnData: Array<ColumnData> = this.columnStateToData(columnState);\r\n const initialColumnData: Array<ColumnData> = this.columnStateToData(this.savedColumnState.state);\r\n const columnOptionsData: ColumnOptionsData = {\r\n tableName: this.tableName,\r\n columnData,\r\n initialColumnData,\r\n showSaveColumnOptionsText: this.showSaveColumnOptionsText\r\n };\r\n const dialogRef = this.dialog.open(SofColumnOptionsComponent, {\r\n width: '500px',\r\n position: { bottom: '40px', right: '40px' },\r\n ariaLabelledBy: 'column-options-heading',\r\n data: columnOptionsData\r\n });\r\n dialogRef.afterClosed().pipe(\r\n take(1),\r\n tap((updatedColumnState: ApplyColumnStateParams) => {\r\n if (updatedColumnState && updatedColumnState.state.length) {\r\n this.gridApi.applyColumnState(updatedColumnState);\r\n this.updatedColumnState.emit(updatedColumnState);\r\n this.currentColumnState = updatedColumnState;\r\n }\r\n })\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Maps `Array<ColumnState>` to `Array<ColumnData>` \r\n * @note filters out any columns marked as 'pinned' by the column definitions.\r\n * @note filters any columns without a 'headerName'.\r\n * @param columnState the column state to modify\r\n * @returns an array of column data formatted to be ingested by the `SofColumnOptionsComponent`\r\n */\r\n private columnStateToData(columnState: Array<ColumnState>): Array<ColumnData> {\r\n return columnState\r\n .filter((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId)?.headerName || \"\";\r\n if (headerName && headerName.length && !column.pinned) {\r\n return column;\r\n }\r\n })\r\n .map((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId).headerName;\r\n return {\r\n id: column.colId,\r\n isChecked: !column.hide,\r\n text: headerName\r\n };\r\n }\r\n );\r\n }\r\n\r\n /** Emit the current filtered/sorted row data */\r\n public exportFilteredRowData(): void {\r\n const rowData: Array<any> = [];\r\n const columns: Array<Column> = this.gridApi.getAllDisplayedColumns().filter((col) => col.getColDef().headerName);\r\n const tableHeaders: Array<KeyValPair> = [];\r\n columns.forEach((col) => {\r\n const colDef: ColDef = col.getColDef();\r\n tableHeaders.push({\r\n key: colDef.field,\r\n value: colDef.headerName\r\n });\r\n });\r\n this.gridApi.forEachNodeAfterFilterAndSort((node: IRowNode<any>) => {\r\n const nodeData: any = {};\r\n columns.forEach((col) => {\r\n const colId: string = col.getColId();\r\n // Use gridApi's getCellValue to get the value transformed by valueGetter\r\n nodeData[colId] = this.gridApi.getCellValue({ rowNode: node, colKey: colId });\r\n });\r\n rowData.push(nodeData);\r\n });\r\n const exportData: ExportTableData = {\r\n tableHeaders,\r\n rowData\r\n };\r\n this.filteredRowDataForExport.emit(exportData);\r\n }\r\n\r\n /** Sets filter selections for filter panel */\r\n private setFilterSelections(): void {\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n // Get the stored filters for the given model\r\n const colFilter = this.colFilters[i];\r\n const model = this.gridApi.getColumnFilterModel(colFilter.header);\r\n let filterSelectionData = [];\r\n if (model && model[\"conditions\"]) {\r\n // The model is a combined model with multiple selections\r\n const filterModel = model as CombinedSimpleModel<TextFilterModel>;\r\n for (const element of filterModel.conditions) {\r\n filterSelectionData.push(element.filter);\r\n }\r\n }\r\n else if (model) {\r\n // Assume the model is a single Text Filter Model\r\n let filterSelection: TextFilterModel = model;\r\n filterSelectionData.push(filterSelection.filter);\r\n }\r\n // Set the filter selections\r\n this.filterSelections[i] = filterSelectionData;\r\n }\r\n }\r\n\r\n /** Gets the count of current filter selections */\r\n private getFilterCount(): number {\r\n return this.filterSelections.reduce((acc, curr) => acc.concat(curr), []).length;\r\n }\r\n}\r\n\r\nexport interface ExportTableData {\r\n tableHeaders?: Array<KeyValPair>;\r\n rowData?: Array<any>\r\n}\r\n\r\ninterface KeyValPair { \r\n key?: string;\r\n value?: string;\r\n}\r\n\r\n/** Used for setting filter values */\r\nclass SofTableFilter {\r\n /** The column header */\r\n header: string;\r\n /** The column label or translation key */\r\n label: string;\r\n /** The column filter options */\r\n options: string[] = [];\r\n}\r\n\r\n/** A filter combining multiple conditions, taken from AgGrid*/\r\nclass CombinedSimpleModel<T> {\r\n /** The filter type. Usually 'text' */\r\n filterType: string;\r\n /** The operator. Usually 'OR' */\r\n operator: 'AND' | 'OR';\r\n /** multiple instances of the Filter Model */\r\n conditions: T[];\r\n}\r\n","<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n fxLayoutGap=\"16px\" m-b-24>\r\n @if (enableFilter && colFilters.length) {\r\n <button \r\n (click)=\"toggleFilterPanel()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n theme=\"neutral\" \r\n [attr.emphasis]=\"filterOpenState ? 'solid' : filterCount === 0 ? 'secondary' : 'contained'\"\r\n [matBadge]=\"filterCount\"\r\n matBadgePosition=\"after\"\r\n [matBadgeHidden]=\"filterCount === 0 ? true : false\">\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n {{'armature.sof-table.filter' | translate}}\r\n </button>\r\n }\r\n @if (enableSearch) {\r\n <mat-form-field class=\"sof-form-field table-search-field dense-4\" fxFlex=\"auto\">\r\n <span matPrefix>\r\n <i class=\"ph-bold ph-magnifying-glass search-icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n <mat-label class=\"search-label\">{{'armature.sof-table.search' | translate}}</mat-label>\r\n <input \r\n (input)=\"onSearchTextChanged()\" \r\n #gridSearchTextInput matInput type=\"text\" id=\"gridSearchTextInput\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.search-filter-description' | translate\"/>\r\n </mat-form-field>\r\n }\r\n @if (enableColumnOptions) {\r\n <button \r\n (click)=\"openColumnOptions()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" id=\"open-column-options\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.column-options-btn' | translate\"\r\n [disabled]=\"!totalLength\">\r\n <i class=\"ph-bold ph-pause\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n @if(enableExport) {\r\n <button \r\n (click)=\"exportFilteredRowData()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" id=\"export-table\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n [matTooltip]=\"'armature.sof-table.screen-reader.export-table' | translate\"\r\n [disabled]=\"!totalLength\">\r\n <i class=\"ph-bold ph-export\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n <ng-content select=\"[sof-table-right-buttons]\"></ng-content>\r\n <!-- \r\n Only inject <button>'s inside an <ng-container sof-table-right-buttons>\r\n ... \r\n <ng-container sof-table-right-buttons>\r\n <button \r\n (click)=\"anyFunction()\"\r\n mat-flat-button class=\"sof-button-icon-v2\" \r\n theme=\"neutral\" emphasis=\"secondary\" aria-label=\"any button\"\r\n matTooltip=\"any button\">\r\n <i class=\"ph-bold ph-acorn\" aria-hidden=\"true\"></i>\r\n </button>\r\n </ng-container>\r\n ... \r\n note: make sure buttons have the following attributes to match others =\r\n `mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"`\r\n * remember to add aria-label and tooltip for icon button\r\n -->\r\n</div>\r\n\r\n<div #ariaResultsCount class=\"sr-only\" aria-live=\"assertive\"></div>\r\n\r\n@if (isGridDataRendered() && filterOpenState) {\r\n <fieldset \r\n class=\"filter-panel\" role=\"region\"\r\n [attr.aria-label]=\"'armature.sof-table.screen-reader.select-filters-description' | translate\">\r\n <p>\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n <span class=\"m-l-8\">{{'armature.sof-table.filter' | translate}}</span>\r\n </p>\r\n <div class=\"filter-panel-select-container m-v-20\">\r\n @for (colFilter of colFilters; let i = $index; track i) {\r\n <mat-form-field appearance=\"outline\" class=\"sof-form-field table-filter-select\">\r\n <mat-label>{{colFilter.label}}</mat-label>\r\n <mat-select \r\n [(ngModel)]=\"filterSelections[i]\" \r\n multiple \r\n id=\"filterDropdown{{i}}\"\r\n placeholder=\"{{'armature.sof-table.all' | translate}}\" disableRipple=\"true\">\r\n @for (colOption of colFilter.options; track $index) {\r\n <mat-option [value]=\"colOption\">\r\n {{colOption}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div fxLayout=\"row\">\r\n <div fxFlex=\"50%\">\r\n <button \r\n (click)=\"clearFilters()\" [disabled]=\"hasEmptyFilters()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n theme=\"neutral\" emphasis=\"floating\"\r\n id=\"tableFilterClear\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"50%\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"2%\" fxLayoutAlign=\"flex-end\">\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"cancelFilterChanges()\" mat-flat-button class=\"sof-button-v2\" \r\n id=\"tableFilterCancel\" theme=\"neutral\" emphasis=\"secondary\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"applyFilters()\" mat-flat-button class=\"sof-button-v2\"\r\n id=\"tableFilterApply\" theme=\"primary\" emphasis=\"solid\">\r\n {{'armature.sof-table.results' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </fieldset>\r\n}\r\n\r\n<ag-grid-angular \r\n [fxShow]=\"isGridDataRendered()\"\r\n (gridReady)=\"onGridReady($event)\" \r\n (firstDataRendered)=\"onFirstDataRendered()\"\r\n (filterChanged)=\"onFilterChanged()\"\r\n (paginationChanged)=\"changePageSize($event)\" \r\n [rowData]=\"rowData\" \r\n [columnDefs]=\"colDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [pagination]=\"true\" \r\n [suppressPaginationPanel]=\"true\"\r\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\" \r\n [paginationPageSize]=\"paginationPageSize\"\r\n [headerHeight]=\"rowHeight\" \r\n [rowHeight]=\"rowHeight\" \r\n [domLayout]=\"'autoHeight'\" \r\n [tooltipShowDelay]=\"tooltipShowDelay\"\r\n [overlayNoRowsTemplate]=\"('armature.sof-table.no-rows' | translate) || 'No results found.'\"\r\n [class.no-rows]=\"!totalLength\"\r\n class=\"ag-theme-material\">\r\n</ag-grid-angular>\r\n\r\n<div \r\n [fxShow]=\"isGridDataRendered() && totalLength\"\r\n class=\"custom-paginator\">\r\n <div class=\"first-section\">\r\n <button class=\"button-part-1\" type=\"button\">\r\n <mat-select \r\n #pageSizeSelect\r\n id=\"pageSizeInput\" name=\"pageSizeInput\" \r\n [(value)]=\"paginationPageSize\" disableRipple=\"true\">\r\n @for (size of paginationPageSizeSelector; let i = $index; track i) {\r\n <mat-option \r\n class=\"page-option\" id=\"size{{i}}\"\r\n [value]=\"paginationPageSizeSelector[i]\">\r\n {{size}}\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{paginationPageSize}}</span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageSizeSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n <span class=\"pageChangeText\">\r\n {{pageChangeText}} {{'armature.sof-table.of' | translate}} {{totalLength}}\r\n </span>\r\n </div>\r\n <div class=\"go-to-page\">\r\n <div class=\"outer-box\">\r\n <button class=\"button-part\" type=\"button\">\r\n <mat-select \r\n #pageNumberSelect\r\n (selectionChange)=\"onPageNumberChange($event.value)\"\r\n [(value)]=\"currentPage\" \r\n id=\"pageSelelctor\" name=\"pageSelector\" disableRipple=\"true\">\r\n @for (page of pageSelector; track $index) {\r\n <mat-option [value]=\"page\" class=\"page-option\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{page}}</span>\r\n </span>\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{currentPage}}</span>\r\n <span class=\"of-page\"> {{'armature.sof-table.of' | translate}} {{totalNumberOfPages}} </span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageNumberSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n </div>\r\n <nav class=\"second-section\">\r\n <button \r\n (click)=\"previousPage()\"\r\n id=\"prev-button\" mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"\r\n [disabled]=\"currentPage === 1\" \r\n [attr.aria-label]=\"'screen-reader.pagination.previous' | translate\">\r\n <i class=\"ph-bold ph-caret-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button \r\n (click)=\"nextPage()\" \r\n id=\"next-button\" mat-flat-button class=\"sof-button-icon-v2\" theme=\"neutral\" emphasis=\"secondary\"\r\n [disabled]=\"currentPage === totalNumberOfPages\"\r\n [attr.aria-label]=\"'screen-reader.pagination.next' | translate\">\r\n <i class=\"ph-bold ph-caret-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </nav>\r\n </div>\r\n</div>\r\n\r\n@if (!isGridDataRendered()) {\r\n <div class=\"loading-container\">\r\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\r\n </div>\r\n}\r\n","import { Component, Input } from '@angular/core';\r\n\r\n/** The Softheon Armature Table Cell component */\r\n@Component({\r\n selector: 'sof-table-cell',\r\n templateUrl: './table-cell.component.html',\r\n styleUrl: './table-cell.component.scss'\r\n})\r\nexport class SofTableCellComponent {\r\n\r\n /** All Components for Table Cell */\r\n @Input() public components: TableCellComponent[] = [];\r\n\r\n /** Any logic related to ag grid cell renderer data can be added here */\r\n public agInit(params): void {\r\n this.components = params['components'];\r\n }\r\n}\r\n\r\n/** Components to Render in Table Cell */\r\ninterface TableCellComponent {\r\n /** Component Class */\r\n component: any,\r\n /** Inputs needed for specific component */\r\n inputs: any\r\n}\r\n","<div class=\"table-cell\">\r\n <ng-container *ngFor=\"let currentComponent of components\">\r\n <ng-container *ngComponentOutlet=\"currentComponent.component; \r\n inputs:currentComponent.inputs;\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatOptionModule } from '@angular/material/core';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AgGridModule } from 'ag-grid-angular';\r\nimport { SofTableComponent } from './sof-table/sof-table.component';\r\nimport { SofTableCellComponent } from './table-cell/table-cell.component';\r\nimport { SofColumnOptionsComponent } from './column-options-modal/column-options.component';\r\nimport { BaseComponentModule } from '@softheon/armature';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\n\r\n/** The material modules */\r\nconst materialModules = [\r\n MatSelectModule,\r\n MatOptionModule,\r\n MatCheckboxModule,\r\n MatIconModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatRadioModule,\r\n MatBadgeModule,\r\n MatProgressSpinnerModule\r\n];\r\n\r\n@NgModule({\r\n declarations: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FlexLayoutModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslateModule,\r\n AgGridModule,\r\n ...materialModules,\r\n BaseComponentModule\r\n ],\r\n exports: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ]\r\n})\r\nexport class AgGridComponentsModule { }\r\n","/** Public API Surface of Ag Grid components */\r\nexport * from './src/ag-grid-components.module';\r\nexport * from './src/sof-table/sof-table.component';\r\nexport * from './src/table-cell/table-cell.component';\r\nexport * from './src/column-options-modal/column-options.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i8","i13"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;MAMa,yBAAyB,CAAA;AALtC,IAAA,WAAA,GAAA;;AAQU,QAAA,IAAA,CAAA,SAAS,GAA4C,MAAM,EAAC,YAAuC,EAAC,CAAC;;AAGtG,QAAA,IAAA,CAAA,IAAI,GAAsB,MAAM,CAAC,eAAe,CAAC,CAAC;AAqB1D,KAAA;;IAlBQ,uBAAuB,GAAA;AAC5B,QAAA,MAAM,WAAW,GAAuB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;YAC1E,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,EAAE;AAChB,gBAAA,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS;aACxB,CAAA;AACH,SAAC,CAAC,CAAC;AACH,QAAA,MAAM,kBAAkB,GAA2B;AACjD,YAAA,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC;AACvB,YAAA,UAAU,EAAE,IAAI;SACjB,CAAC;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;KAC1C;;IAGM,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;KACrE;8GA1BU,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,0DCVtC,6zDA8CA,EAAA,MAAA,EAAA,CAAA,w9BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,YAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FDpCa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBALrC,SAAS;+BACE,oBAAoB,EAAA,QAAA,EAAA,6zDAAA,EAAA,MAAA,EAAA,CAAA,w9BAAA,CAAA,EAAA,CAAA;;;AEmChC;MAMa,iBAAiB,CAAA;AAL9B,IAAA,WAAA,GAAA;;QAWkB,IAAO,CAAA,OAAA,GAAkB,EAAE,CAAC;;QAM5B,IAA0B,CAAA,0BAAA,GAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;;QAG9D,IAAY,CAAA,YAAA,GAAY,IAAI,CAAC;;QAG7B,IAAY,CAAA,YAAA,GAAY,IAAI,CAAC;;QAG7B,IAAmB,CAAA,mBAAA,GAAY,IAAI,CAAC;;QAGpC,IAAY,CAAA,YAAA,GAAY,KAAK,CAAC;AAE9C;;;;;;;;AAQE;QACc,IAAyB,CAAA,yBAAA,GAAY,KAAK,CAAC;;AAejD,QAAA,IAAA,CAAA,kBAAkB,GAAyC,IAAI,YAAY,EAAE,CAAC;;AAG9E,QAAA,IAAA,CAAA,wBAAwB,GAAkC,IAAI,YAAY,EAAE,CAAC;AAQvF;;;AAGE;QACM,IAAkB,CAAA,kBAAA,GAA2B,EAAE,CAAC;;QAGjD,IAAU,CAAA,UAAA,GAA0B,EAAE,CAAC;;QAGvC,IAAS,CAAA,SAAA,GAAW,EAAE,CAAC;;QAGvB,IAAW,CAAA,WAAA,GAAW,CAAC,CAAC;;AAMxB,QAAA,IAAA,CAAA,kBAAkB,GAA4B,MAAM,CAAC,KAAK,CAAC,CAAC;;QAG5D,IAAkB,CAAA,kBAAA,GAAW,EAAE,CAAC;;QAGhC,IAAgB,CAAA,gBAAA,GAAW,GAAG,CAAC;;QAG/B,IAAW,CAAA,WAAA,GAAW,CAAC,CAAC;AAC/B;;;;AAIE;AACK,QAAA,IAAA,CAAA,aAAa,GAAW;AAC7B,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,wBAAwB,EAAE,IAAI;AAC9B,YAAA,eAAe,EAAE,IAAI;AACrB,YAAA,SAAS,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE;AACvC,YAAA,qBAAqB,EAAE,CAAC,MAAmC,KAAI;AAC7D,gBAAA,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;aAClD;AACD,YAAA,YAAY,EAAE;gBACZ,gBAAgB,EAAE,GAAG;AACD,aAAA;SACvB,CAAC;;QAGK,IAAW,CAAA,WAAA,GAAW,CAAC,CAAC;;QASxB,IAAY,CAAA,YAAA,GAAkB,EAAE,CAAC;;QAMjC,IAAgB,CAAA,gBAAA,GAAyB,EAAE,CAAC;;AAG3C,QAAA,IAAA,CAAA,MAAM,GAAc,MAAM,CAAC,SAAS,CAAC,CAAC;;AAGtC,QAAA,IAAA,CAAA,gBAAgB,GAAqB,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAwZvE,KAAA;;IArZQ,QAAQ,GAAA;QACb,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;AAED;;;AAGG;AACI,IAAA,WAAW,CAAC,OAAsB,EAAA;AACvC,QAAA,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE;AACrE,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;YAC7C,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC5B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpC,aAAC,CAAC,CAAC;AACJ,SAAA;AACD,QAAA,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE;YACrE,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACvD,IAAI,CAAC,eAAe,EAAE,CAAC;AACzB,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;AAED;;;;;;;AAOG;AACI,IAAA,WAAW,CAAC,MAAsB,EAAA;AACvC,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;AACxD,QAAA,MAAM,CAAC,QAAQ,GAAG,MAAK;YACrB,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,YAAA,IAAI,MAAM,CAAC,UAAU,IAAI,oBAAoB,EAAE;AAC7C,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;AAC9B,aAAA;AACI,iBAAA;gBACH,IAAI,CAAC,UAAU,EAAE,CAAC;AACnB,aAAA;YACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC9B,SAAC,CAAA;KACF;;IAGM,mBAAmB,GAAA;QACxB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,EAAE;YACxC,MAAM,WAAW,GAAuB,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;YACvF,IAAI,CAAC,gBAAgB,GAAG;AACtB,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,UAAU,EAAE,IAAI;aACjB,CAAC;AACH,SAAA;QACD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAChD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACnC;;IAGO,UAAU,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;AAC/B,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACrB,SAAA;AACI,aAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE;AAClC,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACrB,SAAA;AACI,aAAA;AACH,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACrB,SAAA;KACF;AAED;;;AAGG;AACI,IAAA,kBAAkB,CAAC,KAAa,EAAA;;QAErC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;KAC5C;;IAGM,QAAQ,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;QACtC,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;KAChE;;IAGM,YAAY,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC;QAC1C,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;KAChE;AAED;;;AAGG;AACI,IAAA,cAAc,CAAC,KAA6B,EAAA;;QAEjD,IAAI,KAAK,CAAC,WAAW,EAAE;;YAErB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;;YAExD,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,SAAA;KACF;AAED;;;AAGG;IACI,eAAe,GAAA;QACpB,MAAM,mBAAmB,GAAW,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;;QAE7D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;AACxD,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,mBAAmB,EAAE;YAC5C,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS,GAAG,EAAE,CAAC;YACnD,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,KAAK,CAAC;kBAClE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,8DAA8D,CAAC;AAC/F,kBAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAC7B,+DAA+D,EAAE,EAAC,cAAc,EAAE,IAAI,CAAC,WAAW,EAAC,CACpG,CAAC;YACJ,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS,GAAG,EAAE,CAAC;aACpD,EAAE,GAAG,CAAC,CAAC;AACT,SAAA;QACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;KAC7B;;IAGO,oBAAoB,GAAA;;QAE1B,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,EAAE;;AAEtD,YAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAC5B,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;AACxB,YAAA,IAAI,CAAC,cAAc,GAAG,CAAA,CAAA,CAAG,CAAC;AAC1B,YAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACjC,OAAO;AACR,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;AAC5B,SAAA;;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;;AAE/H,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE;AACjD,YAAA,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtB,SAAA;AACD,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;AACjC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC7C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,QAAQ,CAAC;QACtE,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,QAAQ,EAAE,MAAM,CAAC,GAAG,UAAU,GAAG,QAAQ,CAAC;QACvG,IAAI,CAAC,cAAc,GAAG,CAAG,EAAA,UAAU,GAAG,CAAC,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAE,CAAC;KACzD;AAED;;AAEG;IACI,mBAAmB,GAAA;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KAC7F;;IAGM,iBAAiB,GAAA;AACtB,QAAA,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;KAC9C;;IAGM,YAAY,GAAA;QACjB,IAAI,gBAAgB,GAAgB,EAAE,CAAC;AACvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAClD,YAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;;gBAE5B,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1D,gBAAA,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAC3C,aAAA;AACI,iBAAA,IAAI,gBAAgB,CAAC,MAAM,IAAI,CAAC,EAAE;;AAErC,gBAAA,IAAI,WAAW,GAAoB,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;;AAEvG,gBAAA,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC;AAClD,aAAA;AACI,iBAAA;;AAEH,gBAAA,IAAI,YAAY,GAAyC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;;AAEhH,gBAAA,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE;AAC9C,oBAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;AAC/F,iBAAA;;AAED,gBAAA,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC;AACnD,aAAA;AACF,SAAA;;AAED,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;AACzC,QAAA,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;KAChC;;IAGM,YAAY,GAAA;;AAEjB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrD,YAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC/B,SAAA;;AAED,QAAA,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;;AAElC,QAAA,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;KAC1C;AAED;;;AAGG;IACI,eAAe,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;AAC3D,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AACD,QAAA,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAAE;;YAEhD,IAAI,YAAY,CAAC,MAAM,EAAE;AACvB,gBAAA,OAAO,KAAK,CAAC;AACd,aAAA;AACF,SAAA;AACD,QAAA,OAAO,IAAI,CAAC;KACb;;IAGM,mBAAmB,GAAA;;QAExB,IAAI,CAAC,mBAAmB,EAAE,CAAC;;QAE3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;;IAGO,eAAe,GAAA;;AAErB,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;;QAErB,MAAM,YAAY,GAAkB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;;AAEhG,QAAA,MAAM,eAAe,GAAG,IAAI,GAAG,EAAoB,CAAC;;AAEpD,QAAA,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE;AAC9B,YAAA,MAAM,KAAK,GAAW,GAAG,CAAC,OAAO,CAAC,CAAC;YACnC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAO,CAAC,CAAC;AAC5C,SAAA;;QAED,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAc,KAAI;YAC1C,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,gBAAA,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE;AAC9B,oBAAA,MAAM,KAAK,GAAW,GAAG,CAAC,OAAO,CAAC,CAAC;AACnC,oBAAA,MAAM,KAAK,GAAQ,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC;AAC7E,oBAAA,IAAI,KAAK,EAAE;wBACT,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AACxC,qBAAA;AACF,iBAAA;AACF,aAAA;AACH,SAAC,CAAC,CAAC;;AAEH,QAAA,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE;AAC9B,YAAA,MAAM,KAAK,GAAW,GAAG,CAAC,OAAO,CAAC,CAAC;AACnC,YAAA,MAAM,KAAK,GAAW,GAAG,CAAC,YAAY,CAAC,CAAC;AACxC,YAAA,MAAM,YAAY,GAAe,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACrF,YAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;;AAE3B,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/B,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;AAC9E,aAAA;AACF,SAAA;QACD,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACrD,IAAI,CAAC,mBAAmB,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;KAC1C;;IAGM,iBAAiB,GAAA;QACtB,MAAM,WAAW,GAAuB,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACtE,MAAM,UAAU,GAAsB,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;AAC1E,QAAA,MAAM,iBAAiB,GAAsB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACjG,QAAA,MAAM,iBAAiB,GAAsB;YAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU;YACV,iBAAiB;YACjB,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;SAC1D,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC5D,YAAA,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAC3C,YAAA,cAAc,EAAE,wBAAwB;AACxC,YAAA,IAAI,EAAE,iBAAiB;AACxB,SAAA,CAAC,CAAC;AACH,QAAA,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,CAC1B,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,kBAA0C,KAAI;AACjD,YAAA,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE;AACzD,gBAAA,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;AAClD,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AACjD,gBAAA,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;AAC9C,aAAA;AACH,SAAC,CAAC,CACH,CAAC,SAAS,EAAE,CAAC;KACf;AAED;;;;;;AAME;AACM,IAAA,iBAAiB,CAAC,WAA+B,EAAA;AACvD,QAAA,OAAO,WAAW;AACf,aAAA,MAAM,CAAC,CAAC,MAAM,KAAI;AACjB,YAAA,MAAM,UAAU,GAAW,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;YACrF,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AACrD,gBAAA,OAAO,MAAM,CAAC;AACf,aAAA;AACH,SAAC,CAAC;AACD,aAAA,GAAG,CAAC,CAAC,MAAM,KAAI;AACd,YAAA,MAAM,UAAU,GAAW,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;YAC9E,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,KAAK;AAChB,gBAAA,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI;AACvB,gBAAA,IAAI,EAAE,UAAU;aACjB,CAAC;AACJ,SAAC,CACF,CAAC;KACH;;IAGM,qBAAqB,GAAA;QAC1B,MAAM,OAAO,GAAe,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAkB,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,CAAC;QACjH,MAAM,YAAY,GAAsB,EAAE,CAAC;AAC3C,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACtB,YAAA,MAAM,MAAM,GAAW,GAAG,CAAC,SAAS,EAAE,CAAC;YACvC,YAAY,CAAC,IAAI,CAAC;gBAChB,GAAG,EAAE,MAAM,CAAC,KAAK;gBACjB,KAAK,EAAE,MAAM,CAAC,UAAU;AACzB,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,IAAmB,KAAI;YACjE,MAAM,QAAQ,GAAQ,EAAE,CAAC;AACzB,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACtB,gBAAA,MAAM,KAAK,GAAW,GAAG,CAAC,QAAQ,EAAE,CAAC;;gBAErC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAChF,aAAC,CAAC,CAAC;AACH,YAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,SAAC,CAAC,CAAC;AACH,QAAA,MAAM,UAAU,GAAoB;YAClC,YAAY;YACZ,OAAO;SACR,CAAC;AACF,QAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KAChD;;IAGO,mBAAmB,GAAA;AACzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;;YAE/C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClE,IAAI,mBAAmB,GAAG,EAAE,CAAC;AAC7B,YAAA,IAAI,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE;;gBAEhC,MAAM,WAAW,GAAG,KAA6C,CAAC;AAClE,gBAAA,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,UAAU,EAAE;AAC5C,oBAAA,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC1C,iBAAA;AACF,aAAA;AACI,iBAAA,IAAI,KAAK,EAAE;;gBAEd,IAAI,eAAe,GAAoB,KAAK,CAAC;AAC7C,gBAAA,mBAAmB,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AAClD,aAAA;;AAED,YAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;AAChD,SAAA;KACF;;IAGO,cAAc,GAAA;QACpB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;KACjF;8GAzhBU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,g0BC/C9B,86TA6OA,EAAA,MAAA,EAAA,CAAA,u8wDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gNAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,+bAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,6BAAA,EAAA,gCAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,wBAAA,EAAA,6BAAA,EAAA,oBAAA,EAAA,6BAAA,EAAA,8BAAA,EAAA,8BAAA,EAAA,wBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,0BAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,mBAAA,EAAA,wBAAA,EAAA,+BAAA,EAAA,wBAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,8BAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,+BAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,0BAAA,EAAA,mCAAA,EAAA,8BAAA,EAAA,qBAAA,EAAA,0BAAA,EAAA,wBAAA,EAAA,mBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,qCAAA,EAAA,mCAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,kCAAA,EAAA,sCAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,sCAAA,EAAA,sBAAA,EAAA,6BAAA,EAAA,4BAAA,EAAA,cAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,uBAAA,EAAA,2BAAA,EAAA,eAAA,EAAA,2BAAA,EAAA,qBAAA,EAAA,+BAAA,EAAA,4BAAA,EAAA,yBAAA,EAAA,OAAA,EAAA,wBAAA,EAAA,yBAAA,EAAA,+BAAA,EAAA,wBAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,8BAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,4BAAA,EAAA,wBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,0BAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,+BAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,4BAAA,EAAA,wBAAA,EAAA,6BAAA,EAAA,yBAAA,EAAA,2CAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,4BAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,mCAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,6BAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,6BAAA,EAAA,oBAAA,EAAA,gCAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,yBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,2BAAA,EAAA,iCAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,wBAAA,EAAA,uCAAA,EAAA,UAAA,EAAA,2BAAA,EAAA,yBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,4BAAA,EAAA,2CAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,kCAAA,EAAA,uCAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,iCAAA,EAAA,yBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,yBAAA,EAAA,gCAAA,EAAA,qCAAA,EAAA,2BAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,qCAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,4BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,yBAAA,EAAA,iCAAA,EAAA,wBAAA,EAAA,4BAAA,EAAA,oCAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,yBAAA,EAAA,wBAAA,EAAA,2BAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,6BAAA,EAAA,yBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,8BAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,+BAAA,EAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,2BAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,wBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,gCAAA,EAAA,0BAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,yBAAA,EAAA,wBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,aAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,6BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,aAAA,EAAA,eAAA,EAAA,+BAAA,EAAA,gCAAA,EAAA,8BAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,yBAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,UAAA,EAAA,QAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,cAAA,EAAA,eAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,wBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,cAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,qCAAA,EAAA,cAAA,EAAA,4BAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,aAAA,EAAA,aAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,cAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,0BAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,eAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,6BAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FD9La,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAL7B,SAAS;+BACE,WAAW,EAAA,QAAA,EAAA,86TAAA,EAAA,MAAA,EAAA,CAAA,u8wDAAA,CAAA,EAAA,CAAA;8BAOL,OAAO,EAAA,CAAA;sBAAtB,KAAK;gBAGU,OAAO,EAAA,CAAA;sBAAtB,KAAK;gBAGW,QAAQ,EAAA,CAAA;sBAAxB,KAAK;gBAGU,0BAA0B,EAAA,CAAA;sBAAzC,KAAK;gBAGU,YAAY,EAAA,CAAA;sBAA3B,KAAK;gBAGU,YAAY,EAAA,CAAA;sBAA3B,KAAK;gBAGU,mBAAmB,EAAA,CAAA;sBAAlC,KAAK;gBAGU,YAAY,EAAA,CAAA;sBAA3B,KAAK;gBAWU,yBAAyB,EAAA,CAAA;sBAAxC,KAAK;gBAMU,SAAS,EAAA,CAAA;sBAAxB,KAAK;gBAGW,gBAAgB,EAAA,CAAA;sBAAhC,KAAK;gBAGW,kBAAkB,EAAA,CAAA;sBAAlC,KAAK;gBAGI,kBAAkB,EAAA,CAAA;sBAA3B,MAAM;gBAGG,wBAAwB,EAAA,CAAA;sBAAjC,MAAM;gBAG2B,mBAAmB,EAAA,CAAA;sBAApD,SAAS;uBAAC,qBAAqB,CAAA;gBAGM,gBAAgB,EAAA,CAAA;sBAArD,SAAS;uBAAC,kBAAkB,CAAA;;AA2e/B;AACA,MAAM,cAAc,CAAA;AAApB,IAAA,WAAA,GAAA;;QAME,IAAO,CAAA,OAAA,GAAa,EAAE,CAAC;KACxB;AAAA,CAAA;AAED;AACA,MAAM,mBAAmB,CAAA;AAOxB;;AErmBD;MAMa,qBAAqB,CAAA;AALlC,IAAA,WAAA,GAAA;;QAQkB,IAAU,CAAA,UAAA,GAAyB,EAAE,CAAC;AAMvD,KAAA;;AAHQ,IAAA,MAAM,CAAC,MAAM,EAAA;AAClB,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;KACxC;8GARU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,4FCRlC,kSAOM,EAAA,MAAA,EAAA,CAAA,4GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,kCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FDCO,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBALjC,SAAS;+BACE,gBAAgB,EAAA,QAAA,EAAA,kSAAA,EAAA,MAAA,EAAA,CAAA,4GAAA,CAAA,EAAA,CAAA;8BAOV,UAAU,EAAA,CAAA;sBAAzB,KAAK;;;AEgBR;AACA,MAAM,eAAe,GAAG;IACtB,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,aAAa;IACb,eAAe;IACf,eAAe;IACf,kBAAkB;IAClB,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,qBAAqB;IACrB,aAAa;IACb,cAAc;IACd,cAAc;IACd,wBAAwB;CACzB,CAAC;MAwBW,sBAAsB,CAAA;8GAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,iBApB/B,iBAAiB;YACjB,qBAAqB;AACrB,YAAA,yBAAyB,aAGzB,YAAY;YACZ,gBAAgB;YAChB,WAAW;YACX,mBAAmB;YACnB,eAAe;AACf,YAAA,YAAY,EA7Bd,eAAe;YACf,eAAe;YACf,iBAAiB;YACjB,aAAa;YACb,eAAe;YACf,eAAe;YACf,kBAAkB;YAClB,cAAc;YACd,gBAAgB;YAChB,gBAAgB;YAChB,qBAAqB;YACrB,aAAa;YACb,cAAc;YACd,cAAc;YACd,wBAAwB,EAiBtB,mBAAmB,CAAA,EAAA,OAAA,EAAA,CAGnB,iBAAiB;YACjB,qBAAqB;YACrB,yBAAyB,CAAA,EAAA,CAAA,CAAA,EAAA;AAGhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,YAf/B,YAAY;YACZ,gBAAgB;YAChB,WAAW;YACX,mBAAmB;YACnB,eAAe;YACf,YAAY,EACT,eAAe,EAClB,mBAAmB,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAQV,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAtBlC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,iBAAiB;wBACjB,qBAAqB;wBACrB,yBAAyB;AAC1B,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,gBAAgB;wBAChB,WAAW;wBACX,mBAAmB;wBACnB,eAAe;wBACf,YAAY;AACZ,wBAAA,GAAG,eAAe;wBAClB,mBAAmB;AACpB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,iBAAiB;wBACjB,qBAAqB;wBACrB,yBAAyB;AAC1B,qBAAA;AACF,iBAAA,CAAA;;;ACnED;;ACAA;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softheon/armature",
3
- "version": "17.25.3",
3
+ "version": "17.25.4",
4
4
  "dependencies": {
5
5
  "tslib": "^2.5.0"
6
6
  },