ngx-sp-infra 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/2a/a3/eba6ea21e2e566c49202226aa3c1a4d439fa0a2c077374e48d864f20f5f804dbd931f042ddaa359fd35903a0bd3663a223e24dc11e1ec44501cc688a0a9c +1 -0
- package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/46/44/91b55887c08130e8014b3dbe56b69c0c29f4e127bceafcd610165f4c8e77fefa799ab68c415c1b45cc4fa114565650f3fc3c258e1dc7b792935cbee43fa7 +1 -0
- package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/7e/62/f8e6238b8f05aeaee2346bcaeda2226be7ab048d3b15e3dbbdf37170d9d7fade0fdfc6cc265d1ecc1b47509c962115d0d4b9a503907d6790c632e191001b +1 -0
- package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/8d/53/ad58764bc240411378ae1c47c0c20525da378a3b143795a11bc3fdbf6c9cde6fb2de6c3947d673d5872b9ce205d6274114b3b4dfd27609a636df7fd0b600 +1 -0
- package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/9e/70/9fc33090191a9df303901910a34f5d1cc7ea38ac92e21006bf923a814a4dffe9ad5b7357989f95d4e371cd00318c29339ec3e935832e84f3571ba0ed5f25 +1 -0
- package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/a1/3a/6a6f351adef4b7c8b7d643b092ca26e0ceeb2a285456285f866504493c9c7db8d420d3a4f282c699a11f2f9933c828c8f8388f28e96372408d7b456f32a1 +1 -0
- package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/d3/e3/2852d10551b620a4dfaabb1268bf0ac681e206bfb66451e18ac43a2e5c7cdc8a75291e3a1a4038129f3e40cc11317edffe8434d7110d9579585a25843e15 +1 -0
- package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/f2/ee/05ff4c2260f161b6295a8507440a1b86c0f666f313866e5bf1de6829ae5fe384d6612d732d09c815fe515bd3d6379ed5f8136cf4a4e228b322309840240e +1 -0
- package/.angular/cache/16.2.0/ng-packagr/content-v2/sha512/fe/15/fb0370939f075c14617e0d5fd8411f76edb53e439e19683e5c4554ae7cabd0387c922f6ec6893ced3321ed77df2c851b82eea6a70b38b7396f68493eea19 +1 -0
- package/.angular/cache/16.2.0/ng-packagr/index-v5/10/17/ae308ad3e0cad0afd27bf9eafe0177fdb23b463e70e0dd30d23c117517f6 +2 -0
- package/.angular/cache/16.2.0/ng-packagr/index-v5/14/18/88eabde022c32e7a38011f4ab6f7945e52f018be1abbe6a96864f8f9e22c +2 -0
- package/.angular/cache/16.2.0/ng-packagr/index-v5/1c/b7/dcd00bf2f1de70eab7d9e1d9601fbd87f49d46c7b49671d81ccd4b20b3f1 +2 -0
- package/.angular/cache/16.2.0/ng-packagr/index-v5/4b/31/217b5311dae6305f9b5dc82062276c77f272d61fc3e27c2df5eb0d6b1fb7 +2 -0
- package/.angular/cache/16.2.0/ng-packagr/index-v5/6a/b0/e5091f9ee02b3fcac9821e92cc5113d6b0593bd8bacfb5cbac7dfca306c3 +2 -0
- package/.angular/cache/16.2.0/ng-packagr/index-v5/9b/66/70a7c5990683795072c8b98eb25407b36f55f8efa8d2e0bdef67a8e989ab +2 -0
- package/.angular/cache/16.2.0/ng-packagr/index-v5/a6/8b/af2670adca8f5d06d3d9577ffad4449e4897eaf85de2f4e7f43f93934a16 +2 -0
- package/.angular/cache/16.2.0/ng-packagr/index-v5/da/da/502cfd37a0e9e7f413a569ccf28dc682f9e942ec5e460c93c1dd7c4e531f +3 -0
- package/.angular/cache/16.2.0/ng-packagr/index-v5/f3/8b/4e00bb8eddd473ae09b0b5dee39fa8416aee7b659a770d18c767e5027992 +2 -0
- package/.editorconfig +16 -0
- package/README.md +27 -0
- package/angular.json +41 -0
- package/dist/ngx-sp-infra/README.md +12 -0
- package/dist/ngx-sp-infra/esm2022/lib/infra.module.mjs +137 -0
- package/dist/ngx-sp-infra/esm2022/lib/message/alert/alert.component.mjs +32 -0
- package/dist/ngx-sp-infra/esm2022/lib/message/confirm/confirm.component.mjs +52 -0
- package/dist/ngx-sp-infra/esm2022/lib/message/confirm-modal/confirm-modal.component.mjs +72 -0
- package/dist/ngx-sp-infra/esm2022/lib/message/message-enum.mjs +23 -0
- package/dist/ngx-sp-infra/esm2022/lib/message/message.service.mjs +132 -0
- package/dist/ngx-sp-infra/esm2022/lib/message/save/save.component.mjs +46 -0
- package/dist/ngx-sp-infra/esm2022/lib/models/DownloadArquivos.mjs +3 -0
- package/dist/ngx-sp-infra/esm2022/lib/models/email-model.mjs +35 -0
- package/dist/ngx-sp-infra/esm2022/lib/models/ierror.mjs +2 -0
- package/dist/ngx-sp-infra/esm2022/lib/models/ipagination.mjs +2 -0
- package/dist/ngx-sp-infra/esm2022/lib/models/report-file.mjs +7 -0
- package/dist/ngx-sp-infra/esm2022/lib/models/ret-error.mjs +3 -0
- package/dist/ngx-sp-infra/esm2022/lib/models/ret-feedback-message.mjs +7 -0
- package/dist/ngx-sp-infra/esm2022/lib/models/ret-report-file.mjs +3 -0
- package/dist/ngx-sp-infra/esm2022/lib/pipes/cpf-cnpj.pipe.mjs +23 -0
- package/dist/ngx-sp-infra/esm2022/lib/pipes/currency.pipe.mjs +16 -0
- package/dist/ngx-sp-infra/esm2022/lib/pipes/to-url.pipe.mjs +32 -0
- package/dist/ngx-sp-infra/esm2022/lib/utils/check-url-and-method.service.mjs +70 -0
- package/dist/ngx-sp-infra/esm2022/lib/utils/form-utils.mjs +38 -0
- package/dist/ngx-sp-infra/esm2022/lib/utils/ip-service.service.mjs +22 -0
- package/dist/ngx-sp-infra/esm2022/lib/utils/settings.service.mjs +32 -0
- package/dist/ngx-sp-infra/esm2022/lib/utils/utils.mjs +335 -0
- package/dist/ngx-sp-infra/esm2022/lib/validators/cpf-cnpj.validator.directive.mjs +24 -0
- package/dist/ngx-sp-infra/esm2022/lib/validators/cpf-cnpj.validator.mjs +54 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/breadcrumb/infra-breadcrumb/infra-breadcrumb.component.mjs +35 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/breadcrumb/infra-breadcrumb-item/infra-breadcrumb-item.component.mjs +28 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/breadcrumb/portalrh-breadcrumb/breadcrumb.component.mjs +21 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/click-outside/clickoutside.directive.mjs +167 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/combobox/combobox.component.mjs +545 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/combobox/pipes/filter-by.pipe.mjs +44 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/combobox/pipes/limit-to.pipe.mjs +19 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/field-control-error/field-control-error.component.mjs +23 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/field-error-message/field-error-message.component.mjs +33 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/loading/loading.component.mjs +12 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/loading-button/loading-button.component.mjs +15 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/ordering/ordering.component.mjs +56 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/svg-storage/svg-storage.component.mjs +94 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/tree/models/ret-tree.mjs +3 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/tree/models/tree-item.mjs +7 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/tree/pipes/search-tree.pipe.mjs +17 -0
- package/dist/ngx-sp-infra/esm2022/lib/widgets/tree/tree.component.mjs +91 -0
- package/dist/ngx-sp-infra/esm2022/ngx-sp-infra.mjs +5 -0
- package/dist/ngx-sp-infra/esm2022/public-api.mjs +51 -0
- package/dist/ngx-sp-infra/fesm2022/ngx-sp-infra.mjs +2313 -0
- package/dist/ngx-sp-infra/fesm2022/ngx-sp-infra.mjs.map +1 -0
- package/dist/ngx-sp-infra/index.d.ts +5 -0
- package/dist/ngx-sp-infra/lib/infra.module.d.ts +32 -0
- package/dist/ngx-sp-infra/lib/message/alert/alert.component.d.ts +14 -0
- package/dist/ngx-sp-infra/lib/message/confirm/confirm.component.d.ts +22 -0
- package/dist/ngx-sp-infra/lib/message/confirm-modal/confirm-modal.component.d.ts +33 -0
- package/dist/ngx-sp-infra/lib/message/message-enum.d.ts +20 -0
- package/dist/ngx-sp-infra/lib/message/message.service.d.ts +31 -0
- package/dist/ngx-sp-infra/lib/message/save/save.component.d.ts +21 -0
- package/dist/ngx-sp-infra/lib/models/DownloadArquivos.d.ts +11 -0
- package/dist/ngx-sp-infra/lib/models/email-model.d.ts +30 -0
- package/dist/ngx-sp-infra/lib/models/ierror.d.ts +4 -0
- package/dist/ngx-sp-infra/lib/models/ipagination.d.ts +5 -0
- package/dist/ngx-sp-infra/lib/models/report-file.d.ts +4 -0
- package/dist/ngx-sp-infra/lib/models/ret-error.d.ts +5 -0
- package/dist/ngx-sp-infra/lib/models/ret-feedback-message.d.ts +7 -0
- package/dist/ngx-sp-infra/lib/models/ret-report-file.d.ts +7 -0
- package/dist/ngx-sp-infra/lib/pipes/cpf-cnpj.pipe.d.ts +7 -0
- package/dist/ngx-sp-infra/lib/pipes/currency.pipe.d.ts +7 -0
- package/dist/ngx-sp-infra/lib/pipes/to-url.pipe.d.ts +16 -0
- package/dist/ngx-sp-infra/lib/utils/check-url-and-method.service.d.ts +35 -0
- package/dist/ngx-sp-infra/lib/utils/form-utils.d.ts +7 -0
- package/dist/ngx-sp-infra/lib/utils/ip-service.service.d.ts +9 -0
- package/dist/ngx-sp-infra/lib/utils/settings.service.d.ts +9 -0
- package/dist/ngx-sp-infra/lib/utils/utils.d.ts +58 -0
- package/dist/ngx-sp-infra/lib/validators/cpf-cnpj.validator.d.ts +18 -0
- package/dist/ngx-sp-infra/lib/validators/cpf-cnpj.validator.directive.d.ts +7 -0
- package/dist/ngx-sp-infra/lib/widgets/breadcrumb/infra-breadcrumb/infra-breadcrumb.component.d.ts +29 -0
- package/dist/ngx-sp-infra/lib/widgets/breadcrumb/infra-breadcrumb-item/infra-breadcrumb-item.component.d.ts +14 -0
- package/dist/ngx-sp-infra/lib/widgets/breadcrumb/portalrh-breadcrumb/breadcrumb.component.d.ts +10 -0
- package/dist/ngx-sp-infra/lib/widgets/click-outside/clickoutside.directive.d.ts +40 -0
- package/dist/ngx-sp-infra/lib/widgets/combobox/combobox.component.d.ts +174 -0
- package/dist/ngx-sp-infra/lib/widgets/combobox/pipes/filter-by.pipe.d.ts +10 -0
- package/dist/ngx-sp-infra/lib/widgets/combobox/pipes/limit-to.pipe.d.ts +7 -0
- package/dist/ngx-sp-infra/lib/widgets/field-control-error/field-control-error.component.d.ts +12 -0
- package/dist/ngx-sp-infra/lib/widgets/field-error-message/field-error-message.component.d.ts +14 -0
- package/dist/ngx-sp-infra/lib/widgets/loading/loading.component.d.ts +6 -0
- package/dist/ngx-sp-infra/lib/widgets/loading-button/loading-button.component.d.ts +7 -0
- package/dist/ngx-sp-infra/lib/widgets/ordering/ordering.component.d.ts +18 -0
- package/dist/ngx-sp-infra/lib/widgets/svg-storage/svg-storage.component.d.ts +16 -0
- package/dist/ngx-sp-infra/lib/widgets/tree/models/ret-tree.d.ts +7 -0
- package/dist/ngx-sp-infra/lib/widgets/tree/models/tree-item.d.ts +11 -0
- package/dist/ngx-sp-infra/lib/widgets/tree/pipes/search-tree.pipe.d.ts +8 -0
- package/dist/ngx-sp-infra/lib/widgets/tree/tree.component.d.ts +20 -0
- package/dist/ngx-sp-infra/package.json +37 -0
- package/dist/ngx-sp-infra/public-api.d.ts +47 -0
- package/package.json +43 -0
- package/projects/ngx-sp-infra/README.md +12 -0
- package/projects/ngx-sp-infra/karma.conf.js +44 -0
- package/projects/ngx-sp-infra/ng-package.json +7 -0
- package/projects/ngx-sp-infra/package-lock.json +225 -0
- package/projects/ngx-sp-infra/package.json +18 -0
- package/projects/ngx-sp-infra/src/lib/infra.module.ts +85 -0
- package/projects/ngx-sp-infra/src/lib/message/alert/alert.component.html +6 -0
- package/projects/ngx-sp-infra/src/lib/message/alert/alert.component.scss +5 -0
- package/projects/ngx-sp-infra/src/lib/message/alert/alert.component.ts +39 -0
- package/projects/ngx-sp-infra/src/lib/message/confirm/confirm.component.html +15 -0
- package/projects/ngx-sp-infra/src/lib/message/confirm/confirm.component.scss +0 -0
- package/projects/ngx-sp-infra/src/lib/message/confirm/confirm.component.ts +52 -0
- package/projects/ngx-sp-infra/src/lib/message/confirm-modal/confirm-modal.component.html +39 -0
- package/projects/ngx-sp-infra/src/lib/message/confirm-modal/confirm-modal.component.scss +0 -0
- package/projects/ngx-sp-infra/src/lib/message/confirm-modal/confirm-modal.component.ts +73 -0
- package/projects/ngx-sp-infra/src/lib/message/message-enum.ts +21 -0
- package/projects/ngx-sp-infra/src/lib/message/message.service.ts +169 -0
- package/projects/ngx-sp-infra/src/lib/message/save/save.component.html +35 -0
- package/projects/ngx-sp-infra/src/lib/message/save/save.component.scss +110 -0
- package/projects/ngx-sp-infra/src/lib/message/save/save.component.ts +44 -0
- package/projects/ngx-sp-infra/src/lib/models/DownloadArquivos.ts +12 -0
- package/projects/ngx-sp-infra/src/lib/models/email-model.ts +33 -0
- package/projects/ngx-sp-infra/src/lib/models/ierror.ts +4 -0
- package/projects/ngx-sp-infra/src/lib/models/ipagination.ts +5 -0
- package/projects/ngx-sp-infra/src/lib/models/report-file.ts +4 -0
- package/projects/ngx-sp-infra/src/lib/models/ret-error.ts +6 -0
- package/projects/ngx-sp-infra/src/lib/models/ret-feedback-message.ts +8 -0
- package/projects/ngx-sp-infra/src/lib/models/ret-report-file.ts +8 -0
- package/projects/ngx-sp-infra/src/lib/pipes/cpf-cnpj.pipe.ts +21 -0
- package/projects/ngx-sp-infra/src/lib/pipes/currency.pipe.ts +13 -0
- package/projects/ngx-sp-infra/src/lib/pipes/to-url.pipe.ts +33 -0
- package/projects/ngx-sp-infra/src/lib/utils/check-url-and-method.service.ts +84 -0
- package/projects/ngx-sp-infra/src/lib/utils/form-utils.ts +50 -0
- package/projects/ngx-sp-infra/src/lib/utils/ip-service.service.ts +22 -0
- package/projects/ngx-sp-infra/src/lib/utils/settings.service.ts +32 -0
- package/projects/ngx-sp-infra/src/lib/utils/utils.ts +427 -0
- package/projects/ngx-sp-infra/src/lib/validators/cpf-cnpj.validator.directive.ts +14 -0
- package/projects/ngx-sp-infra/src/lib/validators/cpf-cnpj.validator.ts +74 -0
- package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb/infra-breadcrumb.component.css +0 -0
- package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb/infra-breadcrumb.component.html +3 -0
- package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb/infra-breadcrumb.component.ts +34 -0
- package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb-item/infra-breadcrumb-item.component.css +0 -0
- package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb-item/infra-breadcrumb-item.component.html +1 -0
- package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/infra-breadcrumb-item/infra-breadcrumb-item.component.ts +29 -0
- package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/portalrh-breadcrumb/breadcrumb.component.css +0 -0
- package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/portalrh-breadcrumb/breadcrumb.component.html +5 -0
- package/projects/ngx-sp-infra/src/lib/widgets/breadcrumb/portalrh-breadcrumb/breadcrumb.component.ts +18 -0
- package/projects/ngx-sp-infra/src/lib/widgets/click-outside/clickoutside.directive.ts +183 -0
- package/projects/ngx-sp-infra/src/lib/widgets/combobox/combobox.component.html +40 -0
- package/projects/ngx-sp-infra/src/lib/widgets/combobox/combobox.component.scss +185 -0
- package/projects/ngx-sp-infra/src/lib/widgets/combobox/combobox.component.ts +637 -0
- package/projects/ngx-sp-infra/src/lib/widgets/combobox/combobox.service.ts +15 -0
- package/projects/ngx-sp-infra/src/lib/widgets/combobox/pipes/filter-by.pipe.ts +38 -0
- package/projects/ngx-sp-infra/src/lib/widgets/combobox/pipes/limit-to.pipe.ts +13 -0
- package/projects/ngx-sp-infra/src/lib/widgets/field-control-error/field-control-error.component.css +0 -0
- package/projects/ngx-sp-infra/src/lib/widgets/field-control-error/field-control-error.component.html +4 -0
- package/projects/ngx-sp-infra/src/lib/widgets/field-control-error/field-control-error.component.ts +18 -0
- package/projects/ngx-sp-infra/src/lib/widgets/field-error-message/field-error-message.component.css +0 -0
- package/projects/ngx-sp-infra/src/lib/widgets/field-error-message/field-error-message.component.html +4 -0
- package/projects/ngx-sp-infra/src/lib/widgets/field-error-message/field-error-message.component.ts +35 -0
- package/projects/ngx-sp-infra/src/lib/widgets/loading/loading.component.css +7 -0
- package/projects/ngx-sp-infra/src/lib/widgets/loading/loading.component.html +4 -0
- package/projects/ngx-sp-infra/src/lib/widgets/loading/loading.component.ts +12 -0
- package/projects/ngx-sp-infra/src/lib/widgets/loading-button/loading-button.component.css +3 -0
- package/projects/ngx-sp-infra/src/lib/widgets/loading-button/loading-button.component.html +2 -0
- package/projects/ngx-sp-infra/src/lib/widgets/loading-button/loading-button.component.ts +13 -0
- package/projects/ngx-sp-infra/src/lib/widgets/ordering/ordering.component.html +23 -0
- package/projects/ngx-sp-infra/src/lib/widgets/ordering/ordering.component.scss +0 -0
- package/projects/ngx-sp-infra/src/lib/widgets/ordering/ordering.component.ts +50 -0
- package/projects/ngx-sp-infra/src/lib/widgets/svg-storage/svg-storage.component.html +728 -0
- package/projects/ngx-sp-infra/src/lib/widgets/svg-storage/svg-storage.component.scss +0 -0
- package/projects/ngx-sp-infra/src/lib/widgets/svg-storage/svg-storage.component.ts +105 -0
- package/projects/ngx-sp-infra/src/lib/widgets/tree/README.md +33 -0
- package/projects/ngx-sp-infra/src/lib/widgets/tree/models/ret-tree.ts +8 -0
- package/projects/ngx-sp-infra/src/lib/widgets/tree/models/tree-item.ts +11 -0
- package/projects/ngx-sp-infra/src/lib/widgets/tree/pipes/search-tree.pipe.ts +15 -0
- package/projects/ngx-sp-infra/src/lib/widgets/tree/tree.component.html +51 -0
- package/projects/ngx-sp-infra/src/lib/widgets/tree/tree.component.scss +57 -0
- package/projects/ngx-sp-infra/src/lib/widgets/tree/tree.component.ts +88 -0
- package/projects/ngx-sp-infra/src/public-api.ts +58 -0
- package/projects/ngx-sp-infra/src/test.ts +15 -0
- package/projects/ngx-sp-infra/tsconfig.lib.json +15 -0
- package/projects/ngx-sp-infra/tsconfig.lib.prod.json +10 -0
- package/projects/ngx-sp-infra/tsconfig.spec.json +17 -0
- package/sp-ng-infra-0.0.0.tgz +0 -0
- package/tsconfig.json +42 -0
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
import { Component, Input, EventEmitter, Output, HostListener, ViewChildren, forwardRef } from '@angular/core';
|
|
2
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import { FilterByPipe } from './pipes/filter-by.pipe';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
import * as i2 from "@angular/forms";
|
|
7
|
+
import * as i3 from "./pipes/filter-by.pipe";
|
|
8
|
+
import * as i4 from "./pipes/limit-to.pipe";
|
|
9
|
+
export class ComboboxComponent {
|
|
10
|
+
get value() {
|
|
11
|
+
return this._value;
|
|
12
|
+
}
|
|
13
|
+
set value(val) {
|
|
14
|
+
this._value = val;
|
|
15
|
+
this.onChange(val);
|
|
16
|
+
this.onTouched();
|
|
17
|
+
}
|
|
18
|
+
constructor(cdref, _elementRef) {
|
|
19
|
+
this.cdref = cdref;
|
|
20
|
+
this._elementRef = _elementRef;
|
|
21
|
+
/**
|
|
22
|
+
* Get the required inputs
|
|
23
|
+
*/
|
|
24
|
+
this.options = [];
|
|
25
|
+
/**
|
|
26
|
+
* configuration options
|
|
27
|
+
*/
|
|
28
|
+
this.config = {};
|
|
29
|
+
/**
|
|
30
|
+
* Whether multiple selection or single selection allowed
|
|
31
|
+
*/
|
|
32
|
+
this.multiple = false;
|
|
33
|
+
/**
|
|
34
|
+
* change event when value changes to provide user to handle things in change event
|
|
35
|
+
*/
|
|
36
|
+
this.change = new EventEmitter();
|
|
37
|
+
/**
|
|
38
|
+
* The search text change event emitter emitted when user type in the search input
|
|
39
|
+
*/
|
|
40
|
+
this.searchChange = new EventEmitter();
|
|
41
|
+
/**
|
|
42
|
+
* Event emitted when dropdown is open.
|
|
43
|
+
*/
|
|
44
|
+
this.open = new EventEmitter();
|
|
45
|
+
/**
|
|
46
|
+
* Event emitted when dropdown is open.
|
|
47
|
+
*/
|
|
48
|
+
this.close = new EventEmitter();
|
|
49
|
+
/**
|
|
50
|
+
* Toogle the dropdown list
|
|
51
|
+
*/
|
|
52
|
+
this.toggleDropdown = false;
|
|
53
|
+
/**
|
|
54
|
+
* Available items for selection
|
|
55
|
+
*/
|
|
56
|
+
this.availableItems = [];
|
|
57
|
+
/**
|
|
58
|
+
* Selected Items
|
|
59
|
+
*/
|
|
60
|
+
this.selectedItems = [];
|
|
61
|
+
/**
|
|
62
|
+
* Selection text to be Displayed
|
|
63
|
+
*/
|
|
64
|
+
this.selectedDisplayText = '-';
|
|
65
|
+
/**
|
|
66
|
+
* variable to track if clicked inside or outside of component
|
|
67
|
+
*/
|
|
68
|
+
this.clickedInside = false;
|
|
69
|
+
/**
|
|
70
|
+
* variable to track keypress event inside and outsid of component
|
|
71
|
+
*/
|
|
72
|
+
this.insideKeyPress = false;
|
|
73
|
+
/**
|
|
74
|
+
* element to show not found text when not itmes match the search
|
|
75
|
+
*/
|
|
76
|
+
this.showNotFound = false;
|
|
77
|
+
this.onChange = () => {
|
|
78
|
+
// empty
|
|
79
|
+
};
|
|
80
|
+
this.onTouched = () => {
|
|
81
|
+
// empty
|
|
82
|
+
};
|
|
83
|
+
this.multiple = false;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* click listener for host inside this component i.e
|
|
87
|
+
* if many instances are there, this detects if clicked inside
|
|
88
|
+
* this instance
|
|
89
|
+
*/
|
|
90
|
+
clickInsideComponent() {
|
|
91
|
+
this.clickedInside = true;
|
|
92
|
+
}
|
|
93
|
+
blur() {
|
|
94
|
+
this.toggleDropdown = false;
|
|
95
|
+
}
|
|
96
|
+
focus() {
|
|
97
|
+
/* istanbul ignore else */
|
|
98
|
+
if (!this.disabled) {
|
|
99
|
+
this.toggleSelectDropdown();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* click handler on documnent to hide the open dropdown if clicked outside
|
|
104
|
+
*/
|
|
105
|
+
clickOutsideComponent() {
|
|
106
|
+
/* istanbul ignore else */
|
|
107
|
+
if (!this.clickedInside) {
|
|
108
|
+
this.toggleDropdown = false;
|
|
109
|
+
this.resetArrowKeyActiveElement();
|
|
110
|
+
// clear searh on close
|
|
111
|
+
this.searchText = undefined;
|
|
112
|
+
this.close.emit();
|
|
113
|
+
}
|
|
114
|
+
this.clickedInside = false;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* click handler on documnent to hide the open dropdown if clicked outside
|
|
118
|
+
*/
|
|
119
|
+
KeyPressOutsideComponent() {
|
|
120
|
+
/* istanbul ignore else */
|
|
121
|
+
if (!this.insideKeyPress) {
|
|
122
|
+
this.toggleDropdown = false;
|
|
123
|
+
this.resetArrowKeyActiveElement();
|
|
124
|
+
}
|
|
125
|
+
this.insideKeyPress = false;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Event handler for key up and down event and enter press for selecting element
|
|
129
|
+
*/
|
|
130
|
+
handleKeyboardEvent($event) {
|
|
131
|
+
this.insideKeyPress = true;
|
|
132
|
+
/* istanbul ignore else */
|
|
133
|
+
if ($event.keyCode === 27 || this.disabled) {
|
|
134
|
+
this.toggleDropdown = false;
|
|
135
|
+
this.insideKeyPress = false;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const avaOpts = this.availableOptions.toArray();
|
|
139
|
+
/* istanbul ignore else */
|
|
140
|
+
if ($event.keyCode !== 9 && avaOpts.length === 0 && !this.toggleDropdown) {
|
|
141
|
+
this.toggleDropdown = true;
|
|
142
|
+
}
|
|
143
|
+
// Arrow Down
|
|
144
|
+
/* istanbul ignore else */
|
|
145
|
+
if ($event.keyCode === 40 && avaOpts.length > 0) {
|
|
146
|
+
this.onArrowKeyDown();
|
|
147
|
+
/* istanbul ignore else */
|
|
148
|
+
if (this.focusedItemIndex >= avaOpts.length) {
|
|
149
|
+
this.focusedItemIndex = 0;
|
|
150
|
+
}
|
|
151
|
+
avaOpts[this.focusedItemIndex].nativeElement.focus();
|
|
152
|
+
$event.preventDefault();
|
|
153
|
+
}
|
|
154
|
+
// Arrow Up
|
|
155
|
+
/* istanbul ignore else */
|
|
156
|
+
if ($event.keyCode === 38 && avaOpts.length) {
|
|
157
|
+
this.onArrowKeyUp();
|
|
158
|
+
/* istanbul ignore else */
|
|
159
|
+
if (this.focusedItemIndex >= avaOpts.length) {
|
|
160
|
+
this.focusedItemIndex = avaOpts.length - 1;
|
|
161
|
+
}
|
|
162
|
+
avaOpts[this.focusedItemIndex].nativeElement.focus();
|
|
163
|
+
$event.preventDefault();
|
|
164
|
+
}
|
|
165
|
+
// Enter
|
|
166
|
+
/* istanbul ignore else */
|
|
167
|
+
if ($event.keyCode === 13 && this.focusedItemIndex !== null) {
|
|
168
|
+
const filteredItems = new FilterByPipe().transform(this.availableItems, this.searchText, this.config.searchOnKey);
|
|
169
|
+
this.selectItem(filteredItems[this.focusedItemIndex], this.availableItems.indexOf(filteredItems[this.focusedItemIndex]));
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
return $event.key;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Component onInit
|
|
176
|
+
*/
|
|
177
|
+
ngOnInit() {
|
|
178
|
+
/* istanbul ignore else */
|
|
179
|
+
if (typeof this.options !== 'undefined' && Array.isArray(this.options)) {
|
|
180
|
+
this.availableItems = [
|
|
181
|
+
...this.options.sort(this.config.customComparator),
|
|
182
|
+
];
|
|
183
|
+
this.initDropdownValuesAndOptions();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* after view init to subscribe to available option changes
|
|
188
|
+
*/
|
|
189
|
+
ngAfterViewInit() {
|
|
190
|
+
this.availableOptions.changes.subscribe(this.setNotFoundState.bind(this));
|
|
191
|
+
}
|
|
192
|
+
registerOnChange(fn) {
|
|
193
|
+
this.onChange = fn;
|
|
194
|
+
}
|
|
195
|
+
registerOnTouched(fn) {
|
|
196
|
+
this.onTouched = fn;
|
|
197
|
+
}
|
|
198
|
+
setDisabledState(isDisabled) {
|
|
199
|
+
this.disabled = isDisabled;
|
|
200
|
+
}
|
|
201
|
+
writeValue(value, internal) {
|
|
202
|
+
if (value) {
|
|
203
|
+
if (Array.isArray(value)) {
|
|
204
|
+
if (this.multiple) {
|
|
205
|
+
this.value = value;
|
|
206
|
+
}
|
|
207
|
+
else if (value.length > 0) {
|
|
208
|
+
this.value = value[0];
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
this.value = value;
|
|
213
|
+
}
|
|
214
|
+
/* istanbul ignore else */
|
|
215
|
+
if (this.selectedItems.length === 0) {
|
|
216
|
+
if (Array.isArray(value)) {
|
|
217
|
+
this.selectedItems = value;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
this.selectedItems.push(value);
|
|
221
|
+
}
|
|
222
|
+
this.initDropdownValuesAndOptions();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
this.value = [];
|
|
227
|
+
/* istanbul ignore else */
|
|
228
|
+
if (!internal) {
|
|
229
|
+
this.reset();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/* istanbul ignore else */
|
|
233
|
+
if (!internal) {
|
|
234
|
+
this.reset();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
reset() {
|
|
238
|
+
this.selectedItems = [];
|
|
239
|
+
this.availableItems = [...this.options.sort(this.config.customComparator)];
|
|
240
|
+
this.initDropdownValuesAndOptions();
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* function sets whether to show items not found text or not
|
|
244
|
+
*/
|
|
245
|
+
setNotFoundState() {
|
|
246
|
+
if (this.availableOptions.length === 0) {
|
|
247
|
+
this.showNotFound = true;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
this.showNotFound = false;
|
|
251
|
+
}
|
|
252
|
+
this.cdref.detectChanges();
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Component onchage i.e when any of the input properties change
|
|
256
|
+
*/
|
|
257
|
+
ngOnChanges(changes) {
|
|
258
|
+
this.selectedItems = [];
|
|
259
|
+
// this.searchText = null;
|
|
260
|
+
this.options = this.options || [];
|
|
261
|
+
/* istanbul ignore else */
|
|
262
|
+
if (changes['options']) {
|
|
263
|
+
this.availableItems = [
|
|
264
|
+
...this.options.sort(this.config.customComparator),
|
|
265
|
+
];
|
|
266
|
+
}
|
|
267
|
+
/* istanbul ignore else */
|
|
268
|
+
if (changes['value']) {
|
|
269
|
+
/* istanbul ignore else */
|
|
270
|
+
if (JSON.stringify(changes['value'].currentValue) === JSON.stringify([]) ||
|
|
271
|
+
changes['value'].currentValue === '' ||
|
|
272
|
+
changes['value'].currentValue === null) {
|
|
273
|
+
this.availableItems = [
|
|
274
|
+
...this.options.sort(this.config.customComparator),
|
|
275
|
+
];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
this.initDropdownValuesAndOptions();
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Deselct a selected items
|
|
282
|
+
* @param item: item to be deselected
|
|
283
|
+
* @param index: index of the item
|
|
284
|
+
*/
|
|
285
|
+
deselectItem(item, index) {
|
|
286
|
+
this.selectedItems.forEach((element, i) => {
|
|
287
|
+
/* istanbul ignore else */
|
|
288
|
+
if (item === element) {
|
|
289
|
+
this.selectedItems.splice(i, 1);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
let sortedItems = [...this.availableItems];
|
|
293
|
+
/* istanbul ignore else */
|
|
294
|
+
if (!this.availableItems.includes(item)) {
|
|
295
|
+
this.availableItems.push(item);
|
|
296
|
+
sortedItems = this.availableItems.sort(this.config.customComparator);
|
|
297
|
+
}
|
|
298
|
+
this.selectedItems = [...this.selectedItems];
|
|
299
|
+
this.availableItems = [...sortedItems];
|
|
300
|
+
/* istanbul ignore else */
|
|
301
|
+
if (!Array.isArray(this.value)) {
|
|
302
|
+
this.value = [];
|
|
303
|
+
}
|
|
304
|
+
this.valueChanged();
|
|
305
|
+
this.resetArrowKeyActiveElement();
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Select an item
|
|
309
|
+
* @param item: item to be selected
|
|
310
|
+
* @param index: index of the item
|
|
311
|
+
*/
|
|
312
|
+
selectItem(item, index) {
|
|
313
|
+
/* istanbul ignore else */
|
|
314
|
+
if (!this.multiple) {
|
|
315
|
+
/* istanbul ignore else */
|
|
316
|
+
if (this.selectedItems.length > 0) {
|
|
317
|
+
this.availableItems.push(this.selectedItems[0]);
|
|
318
|
+
}
|
|
319
|
+
this.selectedItems = [];
|
|
320
|
+
this.toggleDropdown = false;
|
|
321
|
+
}
|
|
322
|
+
this.availableItems.forEach((element, i) => {
|
|
323
|
+
/* istanbul ignore else */
|
|
324
|
+
if (item === element) {
|
|
325
|
+
this.selectedItems.push(item);
|
|
326
|
+
this.availableItems.splice(i, 1);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
/* istanbul ignore else */
|
|
330
|
+
if (this.config.clearOnSelection) {
|
|
331
|
+
this.searchText = undefined;
|
|
332
|
+
}
|
|
333
|
+
this.selectedItems = [...this.selectedItems];
|
|
334
|
+
this.availableItems = [...this.availableItems];
|
|
335
|
+
this.selectedItems.sort(this.config.customComparator);
|
|
336
|
+
this.availableItems.sort(this.config.customComparator);
|
|
337
|
+
// this.searchText = null;
|
|
338
|
+
this.valueChanged();
|
|
339
|
+
this.resetArrowKeyActiveElement();
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* When selected items changes trigger the chaange back to parent
|
|
343
|
+
*/
|
|
344
|
+
valueChanged() {
|
|
345
|
+
this.writeValue(this.selectedItems, true);
|
|
346
|
+
// this.valueChange.emit(this.value);
|
|
347
|
+
this.change.emit({ value: this.value });
|
|
348
|
+
this.setSelectedDisplayText();
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Toggle the dropdownlist on/off
|
|
352
|
+
*/
|
|
353
|
+
toggleSelectDropdown() {
|
|
354
|
+
this.toggleDropdown = !this.toggleDropdown;
|
|
355
|
+
if (this.toggleDropdown) {
|
|
356
|
+
this.open.emit();
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
this.searchText = undefined;
|
|
360
|
+
this.close.emit();
|
|
361
|
+
}
|
|
362
|
+
this.resetArrowKeyActiveElement();
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* The change handler for search text
|
|
366
|
+
*/
|
|
367
|
+
searchTextChanged() {
|
|
368
|
+
this.searchChange.emit(this.searchText);
|
|
369
|
+
}
|
|
370
|
+
changeSearchText($event) {
|
|
371
|
+
$event.stopPropagation();
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* initialize the config and other properties
|
|
375
|
+
*/
|
|
376
|
+
initDropdownValuesAndOptions() {
|
|
377
|
+
const config = {
|
|
378
|
+
displayKey: 'description',
|
|
379
|
+
height: 'auto',
|
|
380
|
+
search: false,
|
|
381
|
+
placeholder: '-',
|
|
382
|
+
searchPlaceholder: 'Pesquisar ',
|
|
383
|
+
limitTo: 0,
|
|
384
|
+
customComparator: undefined,
|
|
385
|
+
noResultsFound: 'Nada encontrado!',
|
|
386
|
+
moreText: 'Selecionados',
|
|
387
|
+
searchOnKey: null,
|
|
388
|
+
clearOnSelection: false,
|
|
389
|
+
inputDirection: 'ltr',
|
|
390
|
+
};
|
|
391
|
+
/* istanbul ignore else */
|
|
392
|
+
if (this.config === 'undefined' || Object.keys(this.config).length === 0) {
|
|
393
|
+
this.config = { ...config };
|
|
394
|
+
}
|
|
395
|
+
for (const key of Object.keys(config)) {
|
|
396
|
+
this.config[key] = this.config[key] ? this.config[key] : config[key];
|
|
397
|
+
}
|
|
398
|
+
this.config = { ...this.config };
|
|
399
|
+
// Adding placeholder in config as default param
|
|
400
|
+
this.selectedDisplayText = this.config['placeholder'];
|
|
401
|
+
/* istanbul ignore else */
|
|
402
|
+
if (this.value !== '' && typeof this.value !== 'undefined') {
|
|
403
|
+
if (Array.isArray(this.value)) {
|
|
404
|
+
this.selectedItems = this.value;
|
|
405
|
+
}
|
|
406
|
+
else if (this.value !== '' && this.value !== null) {
|
|
407
|
+
this.selectedItems[0] = this.value;
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
this.selectedItems = [];
|
|
411
|
+
this.value = [];
|
|
412
|
+
}
|
|
413
|
+
this.selectedItems.forEach((item) => {
|
|
414
|
+
const ind = this.availableItems.findIndex((aItem) => JSON.stringify(item) === JSON.stringify(aItem));
|
|
415
|
+
if (ind !== -1) {
|
|
416
|
+
this.availableItems.splice(ind, 1);
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
this.setSelectedDisplayText();
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* set the text to be displayed
|
|
424
|
+
*/
|
|
425
|
+
setSelectedDisplayText() {
|
|
426
|
+
let text = this.selectedItems[0];
|
|
427
|
+
/* istanbul ignore else */
|
|
428
|
+
if (typeof this.selectedItems[0] === 'object') {
|
|
429
|
+
text = this.config.displayFn
|
|
430
|
+
? this.config.displayFn(this.selectedItems[0])
|
|
431
|
+
: this.selectedItems[0][this.config.displayKey];
|
|
432
|
+
}
|
|
433
|
+
if (this.multiple && this.selectedItems.length > 0) {
|
|
434
|
+
this.selectedDisplayText =
|
|
435
|
+
this.selectedItems.length === 1
|
|
436
|
+
? text
|
|
437
|
+
: text +
|
|
438
|
+
` + ${this.selectedItems.length - 1} ${this.config.moreText}`;
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
this.selectedDisplayText =
|
|
442
|
+
this.selectedItems.length === 0 ? this.config.placeholder : text;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Event handler for arrow key up event thats focuses on a item
|
|
447
|
+
*/
|
|
448
|
+
onArrowKeyUp() {
|
|
449
|
+
/* istanbul ignore else */
|
|
450
|
+
if (this.focusedItemIndex === 0) {
|
|
451
|
+
this.focusedItemIndex = this.availableItems.length - 1;
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
/* istanbul ignore else */
|
|
455
|
+
if (this.onArrowKey()) {
|
|
456
|
+
this.focusedItemIndex;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Event handler for arrow key down event thats focuses on a item
|
|
461
|
+
*/
|
|
462
|
+
onArrowKeyDown() {
|
|
463
|
+
/* istanbul ignore else */
|
|
464
|
+
if (this.focusedItemIndex === this.availableItems.length - 1) {
|
|
465
|
+
this.focusedItemIndex = 0;
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
/* istanbul ignore else */
|
|
469
|
+
if (this.onArrowKey()) {
|
|
470
|
+
this.focusedItemIndex++;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
onArrowKey() {
|
|
474
|
+
/* istanbul ignore else */
|
|
475
|
+
if (this.focusedItemIndex === null) {
|
|
476
|
+
this.focusedItemIndex = 0;
|
|
477
|
+
return false;
|
|
478
|
+
}
|
|
479
|
+
return true;
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* will reset the element that is marked active using arrow keys
|
|
483
|
+
*/
|
|
484
|
+
resetArrowKeyActiveElement() {
|
|
485
|
+
this.focusedItemIndex = null;
|
|
486
|
+
}
|
|
487
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: ComboboxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
488
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: ComboboxComponent, selector: "app-combobox", inputs: { _value: "_value", options: "options", config: "config", multiple: "multiple", disabled: "disabled" }, outputs: { change: "change", searchChange: "searchChange", open: "open", close: "close" }, host: { listeners: { "click": "clickInsideComponent()", "blur": "blur()", "focus": "focus()", "document:click": "clickOutsideComponent()", "document:keydown": "KeyPressOutsideComponent()", "keydown": "handleKeyboardEvent($event)" } }, providers: [
|
|
489
|
+
{
|
|
490
|
+
provide: NG_VALUE_ACCESSOR,
|
|
491
|
+
useExisting: forwardRef(() => ComboboxComponent),
|
|
492
|
+
multi: true,
|
|
493
|
+
},
|
|
494
|
+
], viewQueries: [{ propertyName: "availableOptions", predicate: ["availableOption"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ngx-dropdown-container\" tabindex=\"0\">\n <button type=\"button\" tabindex=\"-1\" class=\"ngx-dropdown-button\" [ngClass]=\"{ 'ngx-disabled': disabled }\"\n [disabled]=\"disabled\" (click)=\"toggleSelectDropdown()\">\n <span class=\"display-text\">{{ selectedDisplayText }} </span>\n <span class=\"nsdicon-angle-down\"></span>\n </button>\n <div class=\"ngx-dropdown-list-container scroll-y\" *ngIf=\"toggleDropdown\" [style.maxHeight]=\"config.height\">\n <div class=\"search-container d-flex justify-content-between\" *ngIf=\"config.search\">\n <input (change)=\"changeSearchText($event)\" [style.direction]=\"config.inputDirection\" name=\"search-text\"\n (input)=\"searchTextChanged()\" [(ngModel)]=\"searchText\" tabindex=\"-1\" autocomplete=\"off\" />\n <label [ngClass]=\"{ active: searchText }\">\n <span class=\"nsdicon-search\"></span>\n {{ config.searchPlaceholder }}</label>\n </div>\n <ul class=\"selected-items\">\n <li class=\"d-flex flex-row\" tabindex=\"-1\" *ngFor=\"let selected of selectedItems; let i = index\"\n (click)=\"deselectItem(selected, i)\">\n <input type=\"checkbox\" class=\"form-check nsdicon-close me-2\" checked=\"true\">\n <div style=\"margin-top: 2px;\">{{\n config.displayFn\n ? config.displayFn(selected)\n : selected[config.displayKey] || selected\n }}</div>\n </li>\n </ul>\n <hr *ngIf=\"selectedItems.length > 0 && availableItems.length > 0\" />\n <ul class=\"available-items\">\n <li class=\"d-flex flex-row\" #availableOption *ngFor=\"let item of availableItems | filterBy: searchText: config.searchOnKey\n\t\t\t| limitTo: config.limitTo; let i = index\" tabindex=\"-1\"\n [ngClass]=\"{ active: focusedItemIndex == i && !item.disabled, disabled: item.disabled }\"\n (click)=\"selectItem(item, i)\">\n <input type=\"checkbox\" class=\"form-check nsdicon-close me-2\">\n <div style=\"margin-top: 2px;\">\n {{ config.displayFn ? config.displayFn(item) : item[config.displayKey] || item }}\n </div>\n </li>\n <li *ngIf=\"showNotFound\">{{ config.noResultsFound }}</li>\n </ul>\n </div>\n</div>\n", styles: [".ngx-dropdown-container{width:100%;position:relative}.ngx-dropdown-container button{display:inline-block;margin-bottom:0;font-weight:400;line-height:1.42857143;vertical-align:middle;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #ccc;border-radius:4px;color:#333;background-color:#fff;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;text-align:left}.ngx-dropdown-container button span{display:inline;vertical-align:middle}.ngx-dropdown-container button .nsdicon-angle-down{right:5px;position:relative;float:right}.ngx-dropdown-container button .nsdicon-angle-down:before{border-style:solid;border-width:.1em .1em 0 0;content:\"\";display:inline-block;height:10px;position:relative;vertical-align:text-top;width:10px;top:0;transform:rotate(135deg)}.ngx-dropdown-container .ngx-dropdown-button{width:100%;min-height:30px;padding:5px 10px;background-color:#fff}.ngx-dropdown-container .ngx-dropdown-button .display-text{display:inline-block;width:calc(100% - 20px)}.ngx-dropdown-container .ngx-dropdown-list-container{box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:4px;padding-left:10px;padding-right:10px;z-index:999999999;width:100%;background-clip:padding-box;background:white;position:absolute;box-shadow:5px 5px 5px #00000036;overflow-y:auto}.ngx-dropdown-container .ngx-dropdown-list-container .search-container{position:relative;padding-top:10px;margin-top:5px}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:2rem;width:100%;font-size:13px;margin:0;padding:0;box-shadow:none;box-sizing:content-box;transition:all .3s}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input:focus{border-bottom:1px solid #007bff}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input:focus+label{transform:translateY(-2px) scale(.8);transform-origin:0 0}.ngx-dropdown-container .ngx-dropdown-list-container .search-container label{color:#9e9e9e;position:absolute;top:0;left:0;height:100%;font-size:1rem;cursor:text;transition:transform .2s ease-out;transform-origin:0% 100%;text-align:initial;transform:translateY(12px);pointer-events:none}.ngx-dropdown-container .ngx-dropdown-list-container .search-container label.active{transform:translateY(-2px) scale(.8);transform-origin:0 0}.ngx-dropdown-container .ngx-dropdown-list-container ul{margin-top:1rem;margin-bottom:1rem;list-style-type:none;padding-left:0}.ngx-dropdown-container .ngx-dropdown-list-container ul.selected-items li{margin-bottom:2px}.ngx-dropdown-container .ngx-dropdown-list-container ul.selected-items li .nsdicon-close{accent-color:#007bff;font-weight:700;font-size:large}.ngx-dropdown-container .ngx-dropdown-list-container ul.available-items li.active{background-color:#337ab7;color:#fff}.ngx-dropdown-container .ngx-dropdown-list-container ul li{font-size:inherit;cursor:pointer;display:block;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:normal}.ngx-dropdown-container .ngx-disabled{pointer-events:none;background-color:#e9ecef;opacity:1;cursor:no-drop}.scroll-y{max-width:300px;overflow-y:scroll;overflow-x:hidden}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i3.FilterByPipe, name: "filterBy" }, { kind: "pipe", type: i4.LimitToPipe, name: "limitTo" }] }); }
|
|
495
|
+
}
|
|
496
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: ComboboxComponent, decorators: [{
|
|
497
|
+
type: Component,
|
|
498
|
+
args: [{ selector: 'app-combobox', providers: [
|
|
499
|
+
{
|
|
500
|
+
provide: NG_VALUE_ACCESSOR,
|
|
501
|
+
useExisting: forwardRef(() => ComboboxComponent),
|
|
502
|
+
multi: true,
|
|
503
|
+
},
|
|
504
|
+
], template: "<div class=\"ngx-dropdown-container\" tabindex=\"0\">\n <button type=\"button\" tabindex=\"-1\" class=\"ngx-dropdown-button\" [ngClass]=\"{ 'ngx-disabled': disabled }\"\n [disabled]=\"disabled\" (click)=\"toggleSelectDropdown()\">\n <span class=\"display-text\">{{ selectedDisplayText }} </span>\n <span class=\"nsdicon-angle-down\"></span>\n </button>\n <div class=\"ngx-dropdown-list-container scroll-y\" *ngIf=\"toggleDropdown\" [style.maxHeight]=\"config.height\">\n <div class=\"search-container d-flex justify-content-between\" *ngIf=\"config.search\">\n <input (change)=\"changeSearchText($event)\" [style.direction]=\"config.inputDirection\" name=\"search-text\"\n (input)=\"searchTextChanged()\" [(ngModel)]=\"searchText\" tabindex=\"-1\" autocomplete=\"off\" />\n <label [ngClass]=\"{ active: searchText }\">\n <span class=\"nsdicon-search\"></span>\n {{ config.searchPlaceholder }}</label>\n </div>\n <ul class=\"selected-items\">\n <li class=\"d-flex flex-row\" tabindex=\"-1\" *ngFor=\"let selected of selectedItems; let i = index\"\n (click)=\"deselectItem(selected, i)\">\n <input type=\"checkbox\" class=\"form-check nsdicon-close me-2\" checked=\"true\">\n <div style=\"margin-top: 2px;\">{{\n config.displayFn\n ? config.displayFn(selected)\n : selected[config.displayKey] || selected\n }}</div>\n </li>\n </ul>\n <hr *ngIf=\"selectedItems.length > 0 && availableItems.length > 0\" />\n <ul class=\"available-items\">\n <li class=\"d-flex flex-row\" #availableOption *ngFor=\"let item of availableItems | filterBy: searchText: config.searchOnKey\n\t\t\t| limitTo: config.limitTo; let i = index\" tabindex=\"-1\"\n [ngClass]=\"{ active: focusedItemIndex == i && !item.disabled, disabled: item.disabled }\"\n (click)=\"selectItem(item, i)\">\n <input type=\"checkbox\" class=\"form-check nsdicon-close me-2\">\n <div style=\"margin-top: 2px;\">\n {{ config.displayFn ? config.displayFn(item) : item[config.displayKey] || item }}\n </div>\n </li>\n <li *ngIf=\"showNotFound\">{{ config.noResultsFound }}</li>\n </ul>\n </div>\n</div>\n", styles: [".ngx-dropdown-container{width:100%;position:relative}.ngx-dropdown-container button{display:inline-block;margin-bottom:0;font-weight:400;line-height:1.42857143;vertical-align:middle;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #ccc;border-radius:4px;color:#333;background-color:#fff;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;text-align:left}.ngx-dropdown-container button span{display:inline;vertical-align:middle}.ngx-dropdown-container button .nsdicon-angle-down{right:5px;position:relative;float:right}.ngx-dropdown-container button .nsdicon-angle-down:before{border-style:solid;border-width:.1em .1em 0 0;content:\"\";display:inline-block;height:10px;position:relative;vertical-align:text-top;width:10px;top:0;transform:rotate(135deg)}.ngx-dropdown-container .ngx-dropdown-button{width:100%;min-height:30px;padding:5px 10px;background-color:#fff}.ngx-dropdown-container .ngx-dropdown-button .display-text{display:inline-block;width:calc(100% - 20px)}.ngx-dropdown-container .ngx-dropdown-list-container{box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:4px;padding-left:10px;padding-right:10px;z-index:999999999;width:100%;background-clip:padding-box;background:white;position:absolute;box-shadow:5px 5px 5px #00000036;overflow-y:auto}.ngx-dropdown-container .ngx-dropdown-list-container .search-container{position:relative;padding-top:10px;margin-top:5px}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:2rem;width:100%;font-size:13px;margin:0;padding:0;box-shadow:none;box-sizing:content-box;transition:all .3s}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input:focus{border-bottom:1px solid #007bff}.ngx-dropdown-container .ngx-dropdown-list-container .search-container input:focus+label{transform:translateY(-2px) scale(.8);transform-origin:0 0}.ngx-dropdown-container .ngx-dropdown-list-container .search-container label{color:#9e9e9e;position:absolute;top:0;left:0;height:100%;font-size:1rem;cursor:text;transition:transform .2s ease-out;transform-origin:0% 100%;text-align:initial;transform:translateY(12px);pointer-events:none}.ngx-dropdown-container .ngx-dropdown-list-container .search-container label.active{transform:translateY(-2px) scale(.8);transform-origin:0 0}.ngx-dropdown-container .ngx-dropdown-list-container ul{margin-top:1rem;margin-bottom:1rem;list-style-type:none;padding-left:0}.ngx-dropdown-container .ngx-dropdown-list-container ul.selected-items li{margin-bottom:2px}.ngx-dropdown-container .ngx-dropdown-list-container ul.selected-items li .nsdicon-close{accent-color:#007bff;font-weight:700;font-size:large}.ngx-dropdown-container .ngx-dropdown-list-container ul.available-items li.active{background-color:#337ab7;color:#fff}.ngx-dropdown-container .ngx-dropdown-list-container ul li{font-size:inherit;cursor:pointer;display:block;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:normal}.ngx-dropdown-container .ngx-disabled{pointer-events:none;background-color:#e9ecef;opacity:1;cursor:no-drop}.scroll-y{max-width:300px;overflow-y:scroll;overflow-x:hidden}\n"] }]
|
|
505
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { _value: [{
|
|
506
|
+
type: Input
|
|
507
|
+
}], options: [{
|
|
508
|
+
type: Input
|
|
509
|
+
}], config: [{
|
|
510
|
+
type: Input
|
|
511
|
+
}], multiple: [{
|
|
512
|
+
type: Input
|
|
513
|
+
}], disabled: [{
|
|
514
|
+
type: Input
|
|
515
|
+
}], change: [{
|
|
516
|
+
type: Output
|
|
517
|
+
}], searchChange: [{
|
|
518
|
+
type: Output
|
|
519
|
+
}], open: [{
|
|
520
|
+
type: Output
|
|
521
|
+
}], close: [{
|
|
522
|
+
type: Output
|
|
523
|
+
}], availableOptions: [{
|
|
524
|
+
type: ViewChildren,
|
|
525
|
+
args: ['availableOption']
|
|
526
|
+
}], clickInsideComponent: [{
|
|
527
|
+
type: HostListener,
|
|
528
|
+
args: ['click']
|
|
529
|
+
}], blur: [{
|
|
530
|
+
type: HostListener,
|
|
531
|
+
args: ['blur']
|
|
532
|
+
}], focus: [{
|
|
533
|
+
type: HostListener,
|
|
534
|
+
args: ['focus']
|
|
535
|
+
}], clickOutsideComponent: [{
|
|
536
|
+
type: HostListener,
|
|
537
|
+
args: ['document:click']
|
|
538
|
+
}], KeyPressOutsideComponent: [{
|
|
539
|
+
type: HostListener,
|
|
540
|
+
args: ['document:keydown']
|
|
541
|
+
}], handleKeyboardEvent: [{
|
|
542
|
+
type: HostListener,
|
|
543
|
+
args: ['keydown', ['$event']]
|
|
544
|
+
}] } });
|
|
545
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNwLWluZnJhL3NyYy9saWIvd2lkZ2V0cy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3AtaW5mcmEvc3JjL2xpYi93aWRnZXRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixTQUFTLEVBQVUsS0FBSyxFQUN4QixZQUFZLEVBQ1osTUFBTSxFQUNOLFlBQVksRUFHWixZQUFZLEVBS1osVUFBVSxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7O0FBZXRELE1BQU0sT0FBTyxpQkFBaUI7SUFnRzdCLElBQUksS0FBSztRQUNSLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUcsR0FBRztRQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUUsR0FBRyxDQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxZQUNTLEtBQXdCLEVBQ3pCLFdBQXVCO1FBRHRCLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3pCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBdEcvQjs7V0FFRztRQUNhLFlBQU8sR0FBUSxFQUFFLENBQUM7UUFFbEM7O1dBRUc7UUFDYSxXQUFNLEdBQVEsRUFBRSxDQUFDO1FBRWpDOztXQUVHO1FBQ2EsYUFBUSxHQUFHLEtBQUssQ0FBQztRQU9qQzs7V0FFRztRQUNjLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVoRTs7V0FFRztRQUNjLGlCQUFZLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFdEU7O1dBRUc7UUFDYyxTQUFJLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFOUQ7O1dBRUc7UUFDYyxVQUFLLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFL0Q7O1dBRUc7UUFDSSxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUU5Qjs7V0FFRztRQUNJLG1CQUFjLEdBQVEsRUFBRSxDQUFDO1FBRWhDOztXQUVHO1FBQ0ksa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFFL0I7O1dBRUc7UUFDSSx3QkFBbUIsR0FBRyxHQUFHLENBQUM7UUFPakM7O1dBRUc7UUFDSSxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUU3Qjs7V0FFRztRQUNJLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBTzlCOztXQUVHO1FBRUksaUJBQVksR0FBRyxLQUFLLENBQUM7UUF1QnJCLGFBQVEsR0FBUSxHQUFHLEVBQUU7WUFDM0IsUUFBUTtRQUNULENBQUMsQ0FBQTtRQUNNLGNBQVMsR0FBUSxHQUFHLEVBQUU7WUFDNUIsUUFBUTtRQUNULENBQUMsQ0FBQTtRQVJBLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFTRDs7OztPQUlHO0lBRUksb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFOEIsSUFBSTtRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRStCLEtBQUs7UUFDcEMsMEJBQTBCO1FBQzFCLElBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUNuQjtZQUNDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1NBQzVCO0lBQ0YsQ0FBQztJQUNEOztPQUVHO0lBRUkscUJBQXFCO1FBQzNCLDBCQUEwQjtRQUMxQixJQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFDeEI7WUFDQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM1QixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNsQyx1QkFBdUI7WUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNsQjtRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUVJLHdCQUF3QjtRQUM5QiwwQkFBMEI7UUFDMUIsSUFBSyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQ3pCO1lBQ0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDNUIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7U0FDbEM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ0Q7O09BRUc7SUFFSSxtQkFBbUIsQ0FBRyxNQUFxQjtRQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQiwwQkFBMEI7UUFDMUIsSUFBSyxNQUFNLENBQUMsT0FBTyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUMzQztZQUNDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLE9BQU87U0FDUDtRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoRCwwQkFBMEI7UUFDMUIsSUFBSyxNQUFNLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQ3pFO1lBQ0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDM0I7UUFDRCxhQUFhO1FBQ2IsMEJBQTBCO1FBQzFCLElBQUssTUFBTSxDQUFDLE9BQU8sS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2hEO1lBQ0MsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLDBCQUEwQjtZQUMxQixJQUFLLElBQUksQ0FBQyxnQkFBaUIsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUM3QztnQkFDQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO2FBQzFCO1lBQ0QsT0FBTyxDQUFFLElBQUksQ0FBQyxnQkFBaUIsQ0FBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4RCxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDeEI7UUFDRCxXQUFXO1FBQ1gsMEJBQTBCO1FBQzFCLElBQUssTUFBTSxDQUFDLE9BQU8sS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sRUFDNUM7WUFDQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsMEJBQTBCO1lBQzFCLElBQUssSUFBSSxDQUFDLGdCQUFpQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQzdDO2dCQUNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUMzQztZQUNELE9BQU8sQ0FBRSxJQUFJLENBQUMsZ0JBQWlCLENBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEQsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsUUFBUTtRQUNSLDBCQUEwQjtRQUMxQixJQUFLLE1BQU0sQ0FBQyxPQUFPLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLEVBQzVEO1lBQ0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQ2pELElBQUksQ0FBQyxjQUFjLEVBQ25CLElBQUksQ0FBQyxVQUFXLEVBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUN2QixDQUFDO1lBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FDZCxhQUFhLENBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFFLEVBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFFLGFBQWEsQ0FBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUUsQ0FBRSxDQUNyRSxDQUFDO1lBQ0YsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQTtJQUVsQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ2QsMEJBQTBCO1FBQzFCLElBQUssT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFdBQVcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUUsRUFDekU7WUFDQyxJQUFJLENBQUMsY0FBYyxHQUFHO2dCQUNyQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUU7YUFDcEQsQ0FBQztZQUNGLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1NBQ3BDO0lBQ0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBRSxDQUFFLENBQUM7SUFDL0UsQ0FBQztJQUVNLGdCQUFnQixDQUFHLEVBQU87UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVNLGlCQUFpQixDQUFHLEVBQU87UUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVNLGdCQUFnQixDQUFHLFVBQW1CO1FBQzVDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzVCLENBQUM7SUFFTSxVQUFVLENBQUcsS0FBVSxFQUFFLFFBQWtCO1FBQ2pELElBQUssS0FBSyxFQUNWO1lBQ0MsSUFBSyxLQUFLLENBQUMsT0FBTyxDQUFFLEtBQUssQ0FBRSxFQUMzQjtnQkFDQyxJQUFLLElBQUksQ0FBQyxRQUFRLEVBQ2xCO29CQUNDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2lCQUNuQjtxQkFBTSxJQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM1QjtvQkFDQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBRSxDQUFDLENBQUUsQ0FBQztpQkFDeEI7YUFDRDtpQkFDRDtnQkFDQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzthQUNuQjtZQUNELDBCQUEwQjtZQUMxQixJQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDcEM7Z0JBQ0MsSUFBSyxLQUFLLENBQUMsT0FBTyxDQUFFLEtBQUssQ0FBRSxFQUMzQjtvQkFDQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztpQkFDM0I7cUJBQ0Q7b0JBQ0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUUsS0FBSyxDQUFFLENBQUM7aUJBQ2pDO2dCQUNELElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2FBQ3BDO1NBQ0Q7YUFDRDtZQUNDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLDBCQUEwQjtZQUMxQixJQUFLLENBQUMsUUFBUSxFQUNkO2dCQUNDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNiO1NBQ0Q7UUFDRCwwQkFBMEI7UUFDMUIsSUFBSyxDQUFDLFFBQVEsRUFDZDtZQUNDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNiO0lBQ0YsQ0FBQztJQUVNLEtBQUs7UUFDWCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFFLENBQUUsQ0FBQztRQUMvRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBQ0Q7O09BRUc7SUFDSSxnQkFBZ0I7UUFDdEIsSUFBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDdkM7WUFDQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztTQUN6QjthQUNEO1lBQ0MsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDRDs7T0FFRztJQUNJLFdBQVcsQ0FBRyxPQUFzQjtRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QiwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNsQywwQkFBMEI7UUFDMUIsSUFBSyxPQUFPLENBQUUsU0FBUyxDQUFFLEVBQ3pCO1lBQ0MsSUFBSSxDQUFDLGNBQWMsR0FBRztnQkFDckIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFFO2FBQ3BELENBQUM7U0FDRjtRQUNELDBCQUEwQjtRQUMxQixJQUFLLE9BQU8sQ0FBRSxPQUFPLENBQUUsRUFDdkI7WUFDQywwQkFBMEI7WUFDMUIsSUFDQyxJQUFJLENBQUMsU0FBUyxDQUFFLE9BQU8sQ0FBRSxPQUFPLENBQUUsQ0FBQyxZQUFZLENBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFFLEVBQUUsQ0FBRTtnQkFDMUUsT0FBTyxDQUFFLE9BQU8sQ0FBRSxDQUFDLFlBQVksS0FBSyxFQUFFO2dCQUN0QyxPQUFPLENBQUUsT0FBTyxDQUFFLENBQUMsWUFBWSxLQUFLLElBQUksRUFFekM7Z0JBQ0MsSUFBSSxDQUFDLGNBQWMsR0FBRztvQkFDckIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFFO2lCQUNwRCxDQUFDO2FBQ0Y7U0FDRDtRQUNELElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksWUFBWSxDQUFHLElBQVMsRUFBRSxLQUFhO1FBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFFLENBQUUsT0FBWSxFQUFFLENBQVMsRUFBRyxFQUFFO1lBQ3pELDBCQUEwQjtZQUMxQixJQUFLLElBQUksS0FBSyxPQUFPLEVBQ3JCO2dCQUNDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFFLENBQUMsRUFBRSxDQUFDLENBQUUsQ0FBQzthQUNsQztRQUNGLENBQUMsQ0FBRSxDQUFDO1FBQ0osSUFBSSxXQUFXLEdBQUcsQ0FBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUUsQ0FBQztRQUM3QywwQkFBMEI7UUFDMUIsSUFBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFFLElBQUksQ0FBRSxFQUMxQztZQUNDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBRSxDQUFDO1lBQ2pDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFFLENBQUM7U0FDdkU7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFFLEdBQUcsV0FBVyxDQUFFLENBQUM7UUFDekMsMEJBQTBCO1FBQzFCLElBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxLQUFLLENBQUUsRUFDakM7WUFDQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztTQUNoQjtRQUNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFVBQVUsQ0FBRyxJQUFZLEVBQUUsS0FBYztRQUMvQywwQkFBMEI7UUFDMUIsSUFBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQ25CO1lBQ0MsMEJBQTBCO1lBQzFCLElBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNsQztnQkFDQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUMsQ0FBRSxDQUFFLENBQUM7YUFDcEQ7WUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztTQUM1QjtRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFFLENBQUUsT0FBWSxFQUFFLENBQVMsRUFBRyxFQUFFO1lBQzFELDBCQUEwQjtZQUMxQixJQUFLLElBQUksS0FBSyxPQUFPLEVBQ3JCO2dCQUNDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUM7YUFDbkM7UUFDRixDQUFDLENBQUUsQ0FBQztRQUVKLDBCQUEwQjtRQUMxQixJQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQ2pDO1lBQ0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFFLENBQUM7UUFDekQsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZO1FBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUUsQ0FBQztRQUM1QyxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUssSUFBSSxDQUFDLGNBQWMsRUFDeEI7WUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2pCO2FBQ0Q7WUFDQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRU0sZ0JBQWdCLENBQUcsTUFBVztRQUNwQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssNEJBQTRCO1FBQ25DLE1BQU0sTUFBTSxHQUFRO1lBQ25CLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsTUFBTSxFQUFFLEtBQUs7WUFDYixXQUFXLEVBQUUsR0FBRztZQUNoQixpQkFBaUIsRUFBRSxZQUFZO1lBQy9CLE9BQU8sRUFBRSxDQUFDO1lBQ1YsZ0JBQWdCLEVBQUUsU0FBUztZQUMzQixjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIsY0FBYyxFQUFFLEtBQUs7U0FDckIsQ0FBQztRQUNGLDBCQUEwQjtRQUMxQixJQUFLLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQzNFO1lBQ0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7U0FDNUI7UUFDRCxLQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUUsTUFBTSxDQUFFLEVBQ3hDO1lBQ0MsSUFBSSxDQUFDLE1BQU0sQ0FBRSxHQUFHLENBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFFLEdBQUcsQ0FBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFFLEdBQUcsQ0FBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUUsR0FBRyxDQUFFLENBQUM7U0FDN0U7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDakMsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFFLGFBQWEsQ0FBRSxDQUFDO1FBQ3hELDBCQUEwQjtRQUMxQixJQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQzNEO1lBQ0MsSUFBSyxLQUFLLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxLQUFLLENBQUUsRUFDaEM7Z0JBQ0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ2hDO2lCQUFNLElBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQ3BEO2dCQUNDLElBQUksQ0FBQyxhQUFhLENBQUUsQ0FBQyxDQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNyQztpQkFDRDtnQkFDQyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7YUFDaEI7WUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBRSxDQUFFLElBQVMsRUFBRyxFQUFFO2dCQUMzQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FDeEMsQ0FBRSxLQUFVLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUUsSUFBSSxDQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBRSxLQUFLLENBQUUsQ0FDcEUsQ0FBQztnQkFDRixJQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFDZjtvQkFDQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFFLENBQUM7aUJBQ3JDO1lBQ0YsQ0FBQyxDQUFFLENBQUM7U0FDSjtRQUNELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQjtRQUM3QixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUMsQ0FBRSxDQUFDO1FBQzNDLDBCQUEwQjtRQUMxQixJQUFLLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBRSxDQUFDLENBQUUsS0FBSyxRQUFRLEVBQ2hEO1lBQ0MsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFFLElBQUksQ0FBQyxhQUFhLENBQUUsQ0FBQyxDQUFFLENBQUU7Z0JBQ2xELENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUMsQ0FBRSxDQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFFLENBQUM7U0FDckQ7UUFDRCxJQUFLLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNuRDtZQUNDLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQzlCLENBQUMsQ0FBQyxJQUFJO29CQUNOLENBQUMsQ0FBQyxJQUFJO3dCQUNOLE1BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBRSxJQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUyxFQUFFLENBQUM7U0FDcEU7YUFDRDtZQUNDLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUNsRTtJQUNGLENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVk7UUFDbkIsMEJBQTBCO1FBQzFCLElBQUssSUFBSSxDQUFDLGdCQUFnQixLQUFLLENBQUMsRUFDaEM7WUFDQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELE9BQU87U0FDUDtRQUNELDBCQUEwQjtRQUMxQixJQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFDdEI7WUFDQyxJQUFJLENBQUMsZ0JBQWlCLENBQUM7U0FDdkI7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjO1FBQ3JCLDBCQUEwQjtRQUMxQixJQUFLLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzdEO1lBQ0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUMxQixPQUFPO1NBQ1A7UUFDRCwwQkFBMEI7UUFDMUIsSUFBSyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQ3RCO1lBQ0MsSUFBSSxDQUFDLGdCQUFpQixFQUFFLENBQUM7U0FDekI7SUFDRixDQUFDO0lBRU8sVUFBVTtRQUNqQiwwQkFBMEI7UUFDMUIsSUFBSyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUNuQztZQUNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFDMUIsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssMEJBQTBCO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQzs4R0E3bEJXLGlCQUFpQjtrR0FBakIsaUJBQWlCLDZkQVJsQjtZQUNWO2dCQUNDLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUUsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUU7Z0JBQ2xELEtBQUssRUFBRSxJQUFJO2FBQ1g7U0FDRCx1SkM1QkYsbXNFQXdDQTs7MkZEVmEsaUJBQWlCO2tCQVo3QixTQUFTOytCQUNDLGNBQWMsYUFHYjt3QkFDVjs0QkFDQyxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFFLEdBQUcsRUFBRSxrQkFBa0IsQ0FBRTs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ1g7cUJBQ0Q7aUlBS2UsTUFBTTtzQkFBckIsS0FBSztnQkFLVSxPQUFPO3NCQUF0QixLQUFLO2dCQUtVLE1BQU07c0JBQXJCLEtBQUs7Z0JBS1UsUUFBUTtzQkFBdkIsS0FBSztnQkFLVSxRQUFRO3NCQUF2QixLQUFLO2dCQUtXLE1BQU07c0JBQXRCLE1BQU07Z0JBS1UsWUFBWTtzQkFBNUIsTUFBTTtnQkFLVSxJQUFJO3NCQUFwQixNQUFNO2dCQUtVLEtBQUs7c0JBQXJCLE1BQU07Z0JBbURBLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBRSxpQkFBaUI7Z0JBZ0N6QixvQkFBb0I7c0JBRDFCLFlBQVk7dUJBQUUsT0FBTztnQkFLUyxJQUFJO3NCQUFsQyxZQUFZO3VCQUFFLE1BQU07Z0JBSVcsS0FBSztzQkFBcEMsWUFBWTt1QkFBRSxPQUFPO2dCQVdmLHFCQUFxQjtzQkFEM0IsWUFBWTt1QkFBRSxnQkFBZ0I7Z0JBa0J4Qix3QkFBd0I7c0JBRDlCLFlBQVk7dUJBQUUsa0JBQWtCO2dCQWMxQixtQkFBbUI7c0JBRHpCLFlBQVk7dUJBQUUsU0FBUyxFQUFFLENBQUUsUUFBUSxDQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LCBPbkluaXQsIElucHV0LFxuXHRFdmVudEVtaXR0ZXIsXG5cdE91dHB1dCxcblx0SG9zdExpc3RlbmVyLFxuXHRPbkNoYW5nZXMsXG5cdFNpbXBsZUNoYW5nZXMsXG5cdFZpZXdDaGlsZHJlbixcblx0RWxlbWVudFJlZixcblx0UXVlcnlMaXN0LFxuXHRBZnRlclZpZXdJbml0LFxuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0Zm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmlsdGVyQnlQaXBlIH0gZnJvbSAnLi9waXBlcy9maWx0ZXItYnkucGlwZSc7XG5cblxuQENvbXBvbmVudCgge1xuXHRzZWxlY3RvcjogJ2FwcC1jb21ib2JveCcsXG5cdHRlbXBsYXRlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsczogWyAnLi9jb21ib2JveC5jb21wb25lbnQuc2NzcycgXSxcblx0cHJvdmlkZXJzOiBbXG5cdFx0e1xuXHRcdFx0cHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG5cdFx0XHR1c2VFeGlzdGluZzogZm9yd2FyZFJlZiggKCkgPT4gQ29tYm9ib3hDb21wb25lbnQgKSxcblx0XHRcdG11bHRpOiB0cnVlLFxuXHRcdH0sXG5cdF1cbn0gKVxuZXhwb3J0IGNsYXNzIENvbWJvYm94Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuXG5cdC8qKiB2YWx1ZSBvZiB0aGUgZHJvcGRvd24gKi9cblx0QElucHV0KCkgcHVibGljIF92YWx1ZTogYW55O1xuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHJlcXVpcmVkIGlucHV0c1xuXHQgKi9cblx0QElucHV0KCkgcHVibGljIG9wdGlvbnM6IGFueSA9IFtdO1xuXG5cdC8qKlxuXHQgKiBjb25maWd1cmF0aW9uIG9wdGlvbnNcblx0ICovXG5cdEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IGFueSA9IHt9O1xuXG5cdC8qKlxuXHQgKiBXaGV0aGVyIG11bHRpcGxlIHNlbGVjdGlvbiBvciBzaW5nbGUgc2VsZWN0aW9uIGFsbG93ZWRcblx0ICovXG5cdEBJbnB1dCgpIHB1YmxpYyBtdWx0aXBsZSA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBWYWx1ZVxuXHQgKi9cblx0QElucHV0KCkgcHVibGljIGRpc2FibGVkOiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBjaGFuZ2UgZXZlbnQgd2hlbiB2YWx1ZSBjaGFuZ2VzIHRvIHByb3ZpZGUgdXNlciB0byBoYW5kbGUgdGhpbmdzIGluIGNoYW5nZSBldmVudFxuXHQgKi9cblx0QE91dHB1dCgpIHB1YmxpYyBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBUaGUgc2VhcmNoIHRleHQgY2hhbmdlIGV2ZW50IGVtaXR0ZXIgZW1pdHRlZCB3aGVuIHVzZXIgdHlwZSBpbiB0aGUgc2VhcmNoIGlucHV0XG5cdCAqL1xuXHRAT3V0cHV0KCkgcHVibGljIHNlYXJjaENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBkcm9wZG93biBpcyBvcGVuLlxuXHQgKi9cblx0QE91dHB1dCgpIHB1YmxpYyBvcGVuOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIGRyb3Bkb3duIGlzIG9wZW4uXG5cdCAqL1xuXHRAT3V0cHV0KCkgcHVibGljIGNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogVG9vZ2xlIHRoZSBkcm9wZG93biBsaXN0XG5cdCAqL1xuXHRwdWJsaWMgdG9nZ2xlRHJvcGRvd24gPSBmYWxzZTtcblxuXHQvKipcblx0ICogQXZhaWxhYmxlIGl0ZW1zIGZvciBzZWxlY3Rpb25cblx0ICovXG5cdHB1YmxpYyBhdmFpbGFibGVJdGVtczogYW55ID0gW107XG5cblx0LyoqXG5cdCAqIFNlbGVjdGVkIEl0ZW1zXG5cdCAqL1xuXHRwdWJsaWMgc2VsZWN0ZWRJdGVtczogYW55ID0gW107XG5cblx0LyoqXG5cdCAqIFNlbGVjdGlvbiB0ZXh0IHRvIGJlIERpc3BsYXllZFxuXHQgKi9cblx0cHVibGljIHNlbGVjdGVkRGlzcGxheVRleHQgPSAnLSc7XG5cblx0LyoqXG5cdCAqIFNlYXJjaCB0ZXh0XG5cdCAqL1xuXHRwdWJsaWMgc2VhcmNoVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiB2YXJpYWJsZSB0byB0cmFjayBpZiBjbGlja2VkIGluc2lkZSBvciBvdXRzaWRlIG9mIGNvbXBvbmVudFxuXHQgKi9cblx0cHVibGljIGNsaWNrZWRJbnNpZGUgPSBmYWxzZTtcblxuXHQvKipcblx0ICogdmFyaWFibGUgdG8gdHJhY2sga2V5cHJlc3MgZXZlbnQgaW5zaWRlIGFuZCBvdXRzaWQgb2YgY29tcG9uZW50XG5cdCAqL1xuXHRwdWJsaWMgaW5zaWRlS2V5UHJlc3MgPSBmYWxzZTtcblxuXHQvKipcblx0ICogdmFyaWFibGUgdG8gdHJhY2sgdGhlIGZvY3VzZWQgaXRlbSB3aGVudXNlciB1c2VzIGFycm93IGtleXMgdG8gc2VsZWN0IGl0ZW1cblx0ICovXG5cdHB1YmxpYyBmb2N1c2VkSXRlbUluZGV4OiBudW1iZXIgfCBudWxsO1xuXG5cdC8qKlxuXHQgKiBlbGVtZW50IHRvIHNob3cgbm90IGZvdW5kIHRleHQgd2hlbiBub3QgaXRtZXMgbWF0Y2ggdGhlIHNlYXJjaFxuXHQgKi9cblxuXHRwdWJsaWMgc2hvd05vdEZvdW5kID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBIb2xkIHRoZSByZWZlcmVuY2UgdG8gYXZhaWxhYmxlIGl0ZW1zIGluIHRoZSBsaXN0IHRvIGZvY3VzIG9uIHRoZSBpdGVtIHdoZW4gc2Nyb2xsaW5nXG5cdCAqL1xuXHRAVmlld0NoaWxkcmVuKCAnYXZhaWxhYmxlT3B0aW9uJyApXG5cdHB1YmxpYyBhdmFpbGFibGVPcHRpb25zOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cblx0Z2V0IHZhbHVlICgpIHtcblx0XHRyZXR1cm4gdGhpcy5fdmFsdWU7XG5cdH1cblx0c2V0IHZhbHVlICggdmFsICkge1xuXHRcdHRoaXMuX3ZhbHVlID0gdmFsO1xuXHRcdHRoaXMub25DaGFuZ2UoIHZhbCApO1xuXHRcdHRoaXMub25Ub3VjaGVkKCk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjZHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG5cdFx0cHVibGljIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmXG5cdCkge1xuXHRcdHRoaXMubXVsdGlwbGUgPSBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBvbkNoYW5nZTogYW55ID0gKCkgPT4ge1xuXHRcdC8vIGVtcHR5XG5cdH1cblx0cHVibGljIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge1xuXHRcdC8vIGVtcHR5XG5cdH1cblxuXHQvKipcblx0ICogY2xpY2sgbGlzdGVuZXIgZm9yIGhvc3QgaW5zaWRlIHRoaXMgY29tcG9uZW50IGkuZVxuXHQgKiBpZiBtYW55IGluc3RhbmNlcyBhcmUgdGhlcmUsIHRoaXMgZGV0ZWN0cyBpZiBjbGlja2VkIGluc2lkZVxuXHQgKiB0aGlzIGluc3RhbmNlXG5cdCAqL1xuXHRASG9zdExpc3RlbmVyKCAnY2xpY2snIClcblx0cHVibGljIGNsaWNrSW5zaWRlQ29tcG9uZW50ICgpIHtcblx0XHR0aGlzLmNsaWNrZWRJbnNpZGUgPSB0cnVlO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lciggJ2JsdXInICkgcHVibGljIGJsdXIgKCkge1xuXHRcdHRoaXMudG9nZ2xlRHJvcGRvd24gPSBmYWxzZTtcblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoICdmb2N1cycgKSBwdWJsaWMgZm9jdXMgKCkge1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCAhdGhpcy5kaXNhYmxlZCApXG5cdFx0e1xuXHRcdFx0dGhpcy50b2dnbGVTZWxlY3REcm9wZG93bigpO1xuXHRcdH1cblx0fVxuXHQvKipcblx0ICogY2xpY2sgaGFuZGxlciBvbiBkb2N1bW5lbnQgdG8gaGlkZSB0aGUgb3BlbiBkcm9wZG93biBpZiBjbGlja2VkIG91dHNpZGVcblx0ICovXG5cdEBIb3N0TGlzdGVuZXIoICdkb2N1bWVudDpjbGljaycgKVxuXHRwdWJsaWMgY2xpY2tPdXRzaWRlQ29tcG9uZW50ICgpIHtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggIXRoaXMuY2xpY2tlZEluc2lkZSApXG5cdFx0e1xuXHRcdFx0dGhpcy50b2dnbGVEcm9wZG93biA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZXNldEFycm93S2V5QWN0aXZlRWxlbWVudCgpO1xuXHRcdFx0Ly8gY2xlYXIgc2Vhcmggb24gY2xvc2Vcblx0XHRcdHRoaXMuc2VhcmNoVGV4dCA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMuY2xvc2UuZW1pdCgpO1xuXHRcdH1cblx0XHR0aGlzLmNsaWNrZWRJbnNpZGUgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBjbGljayBoYW5kbGVyIG9uIGRvY3VtbmVudCB0byBoaWRlIHRoZSBvcGVuIGRyb3Bkb3duIGlmIGNsaWNrZWQgb3V0c2lkZVxuXHQgKi9cblx0QEhvc3RMaXN0ZW5lciggJ2RvY3VtZW50OmtleWRvd24nIClcblx0cHVibGljIEtleVByZXNzT3V0c2lkZUNvbXBvbmVudCAoKSB7XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoICF0aGlzLmluc2lkZUtleVByZXNzIClcblx0XHR7XG5cdFx0XHR0aGlzLnRvZ2dsZURyb3Bkb3duID0gZmFsc2U7XG5cdFx0XHR0aGlzLnJlc2V0QXJyb3dLZXlBY3RpdmVFbGVtZW50KCk7XG5cdFx0fVxuXHRcdHRoaXMuaW5zaWRlS2V5UHJlc3MgPSBmYWxzZTtcblx0fVxuXHQvKipcblx0ICogRXZlbnQgaGFuZGxlciBmb3Iga2V5IHVwIGFuZCBkb3duIGV2ZW50IGFuZCBlbnRlciBwcmVzcyBmb3Igc2VsZWN0aW5nIGVsZW1lbnRcblx0ICovXG5cdEBIb3N0TGlzdGVuZXIoICdrZXlkb3duJywgWyAnJGV2ZW50JyBdIClcblx0cHVibGljIGhhbmRsZUtleWJvYXJkRXZlbnQgKCAkZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcblx0XHR0aGlzLmluc2lkZUtleVByZXNzID0gdHJ1ZTtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggJGV2ZW50LmtleUNvZGUgPT09IDI3IHx8IHRoaXMuZGlzYWJsZWQgKVxuXHRcdHtcblx0XHRcdHRoaXMudG9nZ2xlRHJvcGRvd24gPSBmYWxzZTtcblx0XHRcdHRoaXMuaW5zaWRlS2V5UHJlc3MgPSBmYWxzZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgYXZhT3B0cyA9IHRoaXMuYXZhaWxhYmxlT3B0aW9ucy50b0FycmF5KCk7XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoICRldmVudC5rZXlDb2RlICE9PSA5ICYmIGF2YU9wdHMubGVuZ3RoID09PSAwICYmICF0aGlzLnRvZ2dsZURyb3Bkb3duIClcblx0XHR7XG5cdFx0XHR0aGlzLnRvZ2dsZURyb3Bkb3duID0gdHJ1ZTtcblx0XHR9XG5cdFx0Ly8gQXJyb3cgRG93blxuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCAkZXZlbnQua2V5Q29kZSA9PT0gNDAgJiYgYXZhT3B0cy5sZW5ndGggPiAwIClcblx0XHR7XG5cdFx0XHR0aGlzLm9uQXJyb3dLZXlEb3duKCk7XG5cdFx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdFx0aWYgKCB0aGlzLmZvY3VzZWRJdGVtSW5kZXghID49IGF2YU9wdHMubGVuZ3RoIClcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5mb2N1c2VkSXRlbUluZGV4ID0gMDtcblx0XHRcdH1cblx0XHRcdGF2YU9wdHNbIHRoaXMuZm9jdXNlZEl0ZW1JbmRleCEgXS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG5cdFx0XHQkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdFx0Ly8gQXJyb3cgVXBcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggJGV2ZW50LmtleUNvZGUgPT09IDM4ICYmIGF2YU9wdHMubGVuZ3RoIClcblx0XHR7XG5cdFx0XHR0aGlzLm9uQXJyb3dLZXlVcCgpO1xuXHRcdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRcdGlmICggdGhpcy5mb2N1c2VkSXRlbUluZGV4ISA+PSBhdmFPcHRzLmxlbmd0aCApXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZm9jdXNlZEl0ZW1JbmRleCA9IGF2YU9wdHMubGVuZ3RoIC0gMTtcblx0XHRcdH1cblx0XHRcdGF2YU9wdHNbIHRoaXMuZm9jdXNlZEl0ZW1JbmRleCEgXS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG5cdFx0XHQkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdFx0Ly8gRW50ZXJcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggJGV2ZW50LmtleUNvZGUgPT09IDEzICYmIHRoaXMuZm9jdXNlZEl0ZW1JbmRleCAhPT0gbnVsbCApXG5cdFx0e1xuXHRcdFx0Y29uc3QgZmlsdGVyZWRJdGVtcyA9IG5ldyBGaWx0ZXJCeVBpcGUoKS50cmFuc2Zvcm0oXG5cdFx0XHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMsXG5cdFx0XHRcdHRoaXMuc2VhcmNoVGV4dCEsXG5cdFx0XHRcdHRoaXMuY29uZmlnLnNlYXJjaE9uS2V5XG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5zZWxlY3RJdGVtKFxuXHRcdFx0XHRmaWx0ZXJlZEl0ZW1zWyB0aGlzLmZvY3VzZWRJdGVtSW5kZXggXSxcblx0XHRcdFx0dGhpcy5hdmFpbGFibGVJdGVtcy5pbmRleE9mKCBmaWx0ZXJlZEl0ZW1zWyB0aGlzLmZvY3VzZWRJdGVtSW5kZXggXSApXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiAkZXZlbnQua2V5XG5cdFx0XG5cdH1cblxuXHQvKipcblx0ICogQ29tcG9uZW50IG9uSW5pdFxuXHQgKi9cblx0cHVibGljIG5nT25Jbml0ICgpIHtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggdHlwZW9mIHRoaXMub3B0aW9ucyAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheSggdGhpcy5vcHRpb25zICkgKVxuXHRcdHtcblx0XHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMgPSBbXG5cdFx0XHRcdC4uLnRoaXMub3B0aW9ucy5zb3J0KCB0aGlzLmNvbmZpZy5jdXN0b21Db21wYXJhdG9yICksXG5cdFx0XHRdO1xuXHRcdFx0dGhpcy5pbml0RHJvcGRvd25WYWx1ZXNBbmRPcHRpb25zKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIGFmdGVyIHZpZXcgaW5pdCB0byBzdWJzY3JpYmUgdG8gYXZhaWxhYmxlIG9wdGlvbiBjaGFuZ2VzXG5cdCAqL1xuXHRwdWJsaWMgbmdBZnRlclZpZXdJbml0ICgpIHtcblx0XHR0aGlzLmF2YWlsYWJsZU9wdGlvbnMuY2hhbmdlcy5zdWJzY3JpYmUoIHRoaXMuc2V0Tm90Rm91bmRTdGF0ZS5iaW5kKCB0aGlzICkgKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlICggZm46IGFueSApIHtcblx0XHR0aGlzLm9uQ2hhbmdlID0gZm47XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQgKCBmbjogYW55ICkge1xuXHRcdHRoaXMub25Ub3VjaGVkID0gZm47XG5cdH1cblxuXHRwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZSAoIGlzRGlzYWJsZWQ6IGJvb2xlYW4gKSB7XG5cdFx0dGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG5cdH1cblxuXHRwdWJsaWMgd3JpdGVWYWx1ZSAoIHZhbHVlOiBhbnksIGludGVybmFsPzogYm9vbGVhbiApIHtcblx0XHRpZiAoIHZhbHVlIClcblx0XHR7XG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoIHRoaXMubXVsdGlwbGUgKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZS5sZW5ndGggPiAwIClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMudmFsdWUgPSB2YWx1ZVsgMCBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRcdGlmICggdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMCApXG5cdFx0XHR7XG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMgPSB2YWx1ZTtcblx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmluaXREcm9wZG93blZhbHVlc0FuZE9wdGlvbnMoKTtcblx0XHRcdH1cblx0XHR9IGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLnZhbHVlID0gW107XG5cdFx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdFx0aWYgKCAhaW50ZXJuYWwgKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnJlc2V0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCAhaW50ZXJuYWwgKVxuXHRcdHtcblx0XHRcdHRoaXMucmVzZXQoKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgcmVzZXQgKCkge1xuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuXHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMgPSBbIC4uLnRoaXMub3B0aW9ucy5zb3J0KCB0aGlzLmNvbmZpZy5jdXN0b21Db21wYXJhdG9yICkgXTtcblx0XHR0aGlzLmluaXREcm9wZG93blZhbHVlc0FuZE9wdGlvbnMoKTtcblx0fVxuXHQvKipcblx0ICogZnVuY3Rpb24gc2V0cyB3aGV0aGVyIHRvIHNob3cgaXRlbXMgbm90IGZvdW5kIHRleHQgb3Igbm90XG5cdCAqL1xuXHRwdWJsaWMgc2V0Tm90Rm91bmRTdGF0ZSAoKSB7XG5cdFx0aWYgKCB0aGlzLmF2YWlsYWJsZU9wdGlvbnMubGVuZ3RoID09PSAwIClcblx0XHR7XG5cdFx0XHR0aGlzLnNob3dOb3RGb3VuZCA9IHRydWU7XG5cdFx0fSBlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5zaG93Tm90Rm91bmQgPSBmYWxzZTtcblx0XHR9XG5cdFx0dGhpcy5jZHJlZi5kZXRlY3RDaGFuZ2VzKCk7XG5cdH1cblx0LyoqXG5cdCAqIENvbXBvbmVudCBvbmNoYWdlIGkuZSB3aGVuIGFueSBvZiB0aGUgaW5wdXQgcHJvcGVydGllcyBjaGFuZ2Vcblx0ICovXG5cdHB1YmxpYyBuZ09uQ2hhbmdlcyAoIGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKSB7XG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG5cdFx0Ly8gdGhpcy5zZWFyY2hUZXh0ID0gbnVsbDtcblx0XHR0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgfHwgW107XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIGNoYW5nZXNbICdvcHRpb25zJyBdIClcblx0XHR7XG5cdFx0XHR0aGlzLmF2YWlsYWJsZUl0ZW1zID0gW1xuXHRcdFx0XHQuLi50aGlzLm9wdGlvbnMuc29ydCggdGhpcy5jb25maWcuY3VzdG9tQ29tcGFyYXRvciApLFxuXHRcdFx0XTtcblx0XHR9XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIGNoYW5nZXNbICd2YWx1ZScgXSApXG5cdFx0e1xuXHRcdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRcdGlmIChcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkoIGNoYW5nZXNbICd2YWx1ZScgXS5jdXJyZW50VmFsdWUgKSA9PT0gSlNPTi5zdHJpbmdpZnkoIFtdICkgfHxcblx0XHRcdFx0Y2hhbmdlc1sgJ3ZhbHVlJyBdLmN1cnJlbnRWYWx1ZSA9PT0gJycgfHxcblx0XHRcdFx0Y2hhbmdlc1sgJ3ZhbHVlJyBdLmN1cnJlbnRWYWx1ZSA9PT0gbnVsbFxuXHRcdFx0KVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmF2YWlsYWJsZUl0ZW1zID0gW1xuXHRcdFx0XHRcdC4uLnRoaXMub3B0aW9ucy5zb3J0KCB0aGlzLmNvbmZpZy5jdXN0b21Db21wYXJhdG9yICksXG5cdFx0XHRcdF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuaW5pdERyb3Bkb3duVmFsdWVzQW5kT3B0aW9ucygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlc2VsY3QgYSBzZWxlY3RlZCBpdGVtc1xuXHQgKiBAcGFyYW0gaXRlbTogIGl0ZW0gdG8gYmUgZGVzZWxlY3RlZFxuXHQgKiBAcGFyYW0gaW5kZXg6ICBpbmRleCBvZiB0aGUgaXRlbVxuXHQgKi9cblx0cHVibGljIGRlc2VsZWN0SXRlbSAoIGl0ZW06IGFueSwgaW5kZXg6IG51bWJlciApIHtcblx0XHR0aGlzLnNlbGVjdGVkSXRlbXMuZm9yRWFjaCggKCBlbGVtZW50OiBhbnksIGk6IG51bWJlciApID0+IHtcblx0XHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0XHRpZiAoIGl0ZW0gPT09IGVsZW1lbnQgKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdGxldCBzb3J0ZWRJdGVtcyA9IFsgLi4udGhpcy5hdmFpbGFibGVJdGVtcyBdO1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCAhdGhpcy5hdmFpbGFibGVJdGVtcy5pbmNsdWRlcyggaXRlbSApIClcblx0XHR7XG5cdFx0XHR0aGlzLmF2YWlsYWJsZUl0ZW1zLnB1c2goIGl0ZW0gKTtcblx0XHRcdHNvcnRlZEl0ZW1zID0gdGhpcy5hdmFpbGFibGVJdGVtcy5zb3J0KCB0aGlzLmNvbmZpZy5jdXN0b21Db21wYXJhdG9yICk7XG5cdFx0fVxuXHRcdHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFsgLi4udGhpcy5zZWxlY3RlZEl0ZW1zIF07XG5cdFx0dGhpcy5hdmFpbGFibGVJdGVtcyA9IFsgLi4uc29ydGVkSXRlbXMgXTtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggIUFycmF5LmlzQXJyYXkoIHRoaXMudmFsdWUgKSApXG5cdFx0e1xuXHRcdFx0dGhpcy52YWx1ZSA9IFtdO1xuXHRcdH1cblx0XHR0aGlzLnZhbHVlQ2hhbmdlZCgpO1xuXHRcdHRoaXMucmVzZXRBcnJvd0tleUFjdGl2ZUVsZW1lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZWxlY3QgYW4gaXRlbVxuXHQgKiBAcGFyYW0gaXRlbTogIGl0ZW0gdG8gYmUgc2VsZWN0ZWRcblx0ICogQHBhcmFtIGluZGV4OiAgaW5kZXggb2YgdGhlIGl0ZW1cblx0ICovXG5cdHB1YmxpYyBzZWxlY3RJdGVtICggaXRlbTogc3RyaW5nLCBpbmRleD86IG51bWJlciApIHtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggIXRoaXMubXVsdGlwbGUgKVxuXHRcdHtcblx0XHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0XHRpZiAoIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwIClcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5hdmFpbGFibGVJdGVtcy5wdXNoKCB0aGlzLnNlbGVjdGVkSXRlbXNbIDAgXSApO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG5cdFx0XHR0aGlzLnRvZ2dsZURyb3Bkb3duID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5hdmFpbGFibGVJdGVtcy5mb3JFYWNoKCAoIGVsZW1lbnQ6IGFueSwgaTogbnVtYmVyICkgPT4ge1xuXHRcdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRcdGlmICggaXRlbSA9PT0gZWxlbWVudCApXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKCBpdGVtICk7XG5cdFx0XHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIHRoaXMuY29uZmlnLmNsZWFyT25TZWxlY3Rpb24gKVxuXHRcdHtcblx0XHRcdHRoaXMuc2VhcmNoVGV4dCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHR0aGlzLnNlbGVjdGVkSXRlbXMgPSBbIC4uLnRoaXMuc2VsZWN0ZWRJdGVtcyBdO1xuXHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMgPSBbIC4uLnRoaXMuYXZhaWxhYmxlSXRlbXMgXTtcblx0XHR0aGlzLnNlbGVjdGVkSXRlbXMuc29ydCggdGhpcy5jb25maWcuY3VzdG9tQ29tcGFyYXRvciApO1xuXHRcdHRoaXMuYXZhaWxhYmxlSXRlbXMuc29ydCggdGhpcy5jb25maWcuY3VzdG9tQ29tcGFyYXRvciApO1xuXHRcdC8vIHRoaXMuc2VhcmNoVGV4dCA9IG51bGw7XG5cdFx0dGhpcy52YWx1ZUNoYW5nZWQoKTtcblx0XHR0aGlzLnJlc2V0QXJyb3dLZXlBY3RpdmVFbGVtZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogV2hlbiBzZWxlY3RlZCBpdGVtcyBjaGFuZ2VzIHRyaWdnZXIgdGhlIGNoYWFuZ2UgYmFjayB0byBwYXJlbnRcblx0ICovXG5cdHB1YmxpYyB2YWx1ZUNoYW5nZWQgKCkge1xuXHRcdHRoaXMud3JpdGVWYWx1ZSggdGhpcy5zZWxlY3RlZEl0ZW1zLCB0cnVlICk7XG5cdFx0Ly8gdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuXHRcdHRoaXMuY2hhbmdlLmVtaXQoIHsgdmFsdWU6IHRoaXMudmFsdWUgfSApO1xuXHRcdHRoaXMuc2V0U2VsZWN0ZWREaXNwbGF5VGV4dCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRvZ2dsZSB0aGUgZHJvcGRvd25saXN0IG9uL29mZlxuXHQgKi9cblx0cHVibGljIHRvZ2dsZVNlbGVjdERyb3Bkb3duICgpIHtcblx0XHR0aGlzLnRvZ2dsZURyb3Bkb3duID0gIXRoaXMudG9nZ2xlRHJvcGRvd247XG5cdFx0aWYgKCB0aGlzLnRvZ2dsZURyb3Bkb3duIClcblx0XHR7XG5cdFx0XHR0aGlzLm9wZW4uZW1pdCgpO1xuXHRcdH0gZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuc2VhcmNoVGV4dCA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMuY2xvc2UuZW1pdCgpO1xuXHRcdH1cblx0XHR0aGlzLnJlc2V0QXJyb3dLZXlBY3RpdmVFbGVtZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGNoYW5nZSBoYW5kbGVyIGZvciBzZWFyY2ggdGV4dFxuXHQgKi9cblx0cHVibGljIHNlYXJjaFRleHRDaGFuZ2VkICgpIHtcblx0XHR0aGlzLnNlYXJjaENoYW5nZS5lbWl0KCB0aGlzLnNlYXJjaFRleHQgKTtcblx0fVxuXG5cdHB1YmxpYyBjaGFuZ2VTZWFyY2hUZXh0ICggJGV2ZW50OiBhbnkgKSB7XG5cdFx0JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGluaXRpYWxpemUgdGhlIGNvbmZpZyBhbmQgb3RoZXIgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBpbml0RHJvcGRvd25WYWx1ZXNBbmRPcHRpb25zICgpIHtcblx0XHRjb25zdCBjb25maWc6IGFueSA9IHtcblx0XHRcdGRpc3BsYXlLZXk6ICdkZXNjcmlwdGlvbicsXG5cdFx0XHRoZWlnaHQ6ICdhdXRvJyxcblx0XHRcdHNlYXJjaDogZmFsc2UsXG5cdFx0XHRwbGFjZWhvbGRlcjogJy0nLFxuXHRcdFx0c2VhcmNoUGxhY2Vob2xkZXI6ICdQZXNxdWlzYXIgJyxcblx0XHRcdGxpbWl0VG86IDAsXG5cdFx0XHRjdXN0b21Db21wYXJhdG9yOiB1bmRlZmluZWQsXG5cdFx0XHRub1Jlc3VsdHNGb3VuZDogJ05hZGEgZW5jb250cmFkbyEnLFxuXHRcdFx0bW9yZVRleHQ6ICdTZWxlY2lvbmFkb3MnLFxuXHRcdFx0c2VhcmNoT25LZXk6IG51bGwsXG5cdFx0XHRjbGVhck9uU2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGlucHV0RGlyZWN0aW9uOiAnbHRyJyxcblx0XHR9O1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCB0aGlzLmNvbmZpZyA9PT0gJ3VuZGVmaW5lZCcgfHwgT2JqZWN0LmtleXMoIHRoaXMuY29uZmlnICkubGVuZ3RoID09PSAwIClcblx0XHR7XG5cdFx0XHR0aGlzLmNvbmZpZyA9IHsgLi4uY29uZmlnIH07XG5cdFx0fVxuXHRcdGZvciAoIGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyggY29uZmlnICkgKVxuXHRcdHtcblx0XHRcdHRoaXMuY29uZmlnWyBrZXkgXSA9IHRoaXMuY29uZmlnWyBrZXkgXSA/IHRoaXMuY29uZmlnWyBrZXkgXSA6IGNvbmZpZ1sga2V5IF07XG5cdFx0fVxuXHRcdHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZyB9O1xuXHRcdC8vIEFkZGluZyBwbGFjZWhvbGRlciBpbiBjb25maWcgYXMgZGVmYXVsdCBwYXJhbVxuXHRcdHRoaXMuc2VsZWN0ZWREaXNwbGF5VGV4dCA9IHRoaXMuY29uZmlnWyAncGxhY2Vob2xkZXInIF07XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIHRoaXMudmFsdWUgIT09ICcnICYmIHR5cGVvZiB0aGlzLnZhbHVlICE9PSAndW5kZWZpbmVkJyApXG5cdFx0e1xuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB0aGlzLnZhbHVlICkgKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLnZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmICggdGhpcy52YWx1ZSAhPT0gJycgJiYgdGhpcy52YWx1ZSAhPT0gbnVsbCApXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtc1sgMCBdID0gdGhpcy52YWx1ZTtcblx0XHRcdH0gZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMuZm9yRWFjaCggKCBpdGVtOiBhbnkgKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGluZCA9IHRoaXMuYXZhaWxhYmxlSXRlbXMuZmluZEluZGV4KFxuXHRcdFx0XHRcdCggYUl0ZW06IGFueSApID0+IEpTT04uc3RyaW5naWZ5KCBpdGVtICkgPT09IEpTT04uc3RyaW5naWZ5KCBhSXRlbSApXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmICggaW5kICE9PSAtMSApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLmF2YWlsYWJsZUl0ZW1zLnNwbGljZSggaW5kLCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cdFx0dGhpcy5zZXRTZWxlY3RlZERpc3BsYXlUZXh0KCk7XG5cdH1cblxuXHQvKipcblx0ICogc2V0IHRoZSB0ZXh0IHRvIGJlIGRpc3BsYXllZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXRTZWxlY3RlZERpc3BsYXlUZXh0ICgpIHtcblx0XHRsZXQgdGV4dDogc3RyaW5nID0gdGhpcy5zZWxlY3RlZEl0ZW1zWyAwIF07XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIHR5cGVvZiB0aGlzLnNlbGVjdGVkSXRlbXNbIDAgXSA9PT0gJ29iamVjdCcgKVxuXHRcdHtcblx0XHRcdHRleHQgPSB0aGlzLmNvbmZpZy5kaXNwbGF5Rm5cblx0XHRcdFx0PyB0aGlzLmNvbmZpZy5kaXNwbGF5Rm4oIHRoaXMuc2VsZWN0ZWRJdGVtc1sgMCBdIClcblx0XHRcdFx0OiB0aGlzLnNlbGVjdGVkSXRlbXNbIDAgXVsgdGhpcy5jb25maWcuZGlzcGxheUtleSBdO1xuXHRcdH1cblx0XHRpZiAoIHRoaXMubXVsdGlwbGUgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgKVxuXHRcdHtcblx0XHRcdHRoaXMuc2VsZWN0ZWREaXNwbGF5VGV4dCA9XG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDFcblx0XHRcdFx0XHQ/IHRleHRcblx0XHRcdFx0XHQ6IHRleHQgK1xuXHRcdFx0XHRcdGAgKyAkeyB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gMSB9ICR7IHRoaXMuY29uZmlnLm1vcmVUZXh0IH1gO1xuXHRcdH0gZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuc2VsZWN0ZWREaXNwbGF5VGV4dCA9XG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDAgPyB0aGlzLmNvbmZpZy5wbGFjZWhvbGRlciA6IHRleHQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50IGhhbmRsZXIgZm9yIGFycm93IGtleSB1cCBldmVudCB0aGF0cyBmb2N1c2VzIG9uIGEgaXRlbVxuXHQgKi9cblx0cHJpdmF0ZSBvbkFycm93S2V5VXAgKCkge1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCB0aGlzLmZvY3VzZWRJdGVtSW5kZXggPT09IDAgKVxuXHRcdHtcblx0XHRcdHRoaXMuZm9jdXNlZEl0ZW1JbmRleCA9IHRoaXMuYXZhaWxhYmxlSXRlbXMubGVuZ3RoIC0gMTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIHRoaXMub25BcnJvd0tleSgpIClcblx0XHR7XG5cdFx0XHR0aGlzLmZvY3VzZWRJdGVtSW5kZXghO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFdmVudCBoYW5kbGVyIGZvciBhcnJvdyBrZXkgZG93biBldmVudCB0aGF0cyBmb2N1c2VzIG9uIGEgaXRlbVxuXHQgKi9cblx0cHJpdmF0ZSBvbkFycm93S2V5RG93biAoKSB7XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblx0XHRpZiAoIHRoaXMuZm9jdXNlZEl0ZW1JbmRleCA9PT0gdGhpcy5hdmFpbGFibGVJdGVtcy5sZW5ndGggLSAxIClcblx0XHR7XG5cdFx0XHR0aGlzLmZvY3VzZWRJdGVtSW5kZXggPSAwO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHRcdGlmICggdGhpcy5vbkFycm93S2V5KCkgKVxuXHRcdHtcblx0XHRcdHRoaXMuZm9jdXNlZEl0ZW1JbmRleCErKztcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIG9uQXJyb3dLZXkgKCkge1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdFx0aWYgKCB0aGlzLmZvY3VzZWRJdGVtSW5kZXggPT09IG51bGwgKVxuXHRcdHtcblx0XHRcdHRoaXMuZm9jdXNlZEl0ZW1JbmRleCA9IDA7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIHdpbGwgcmVzZXQgdGhlIGVsZW1lbnQgdGhhdCBpcyBtYXJrZWQgYWN0aXZlIHVzaW5nIGFycm93IGtleXNcblx0ICovXG5cdHByaXZhdGUgcmVzZXRBcnJvd0tleUFjdGl2ZUVsZW1lbnQgKCkge1xuXHRcdHRoaXMuZm9jdXNlZEl0ZW1JbmRleCA9IG51bGw7XG5cdH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJuZ3gtZHJvcGRvd24tY29udGFpbmVyXCIgdGFiaW5kZXg9XCIwXCI+XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cIm5neC1kcm9wZG93bi1idXR0b25cIiBbbmdDbGFzc109XCJ7ICduZ3gtZGlzYWJsZWQnOiBkaXNhYmxlZCB9XCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0RHJvcGRvd24oKVwiPlxuICAgIDxzcGFuIGNsYXNzPVwiZGlzcGxheS10ZXh0XCI+e3sgc2VsZWN0ZWREaXNwbGF5VGV4dCB9fSA8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJuc2RpY29uLWFuZ2xlLWRvd25cIj48L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8ZGl2IGNsYXNzPVwibmd4LWRyb3Bkb3duLWxpc3QtY29udGFpbmVyIHNjcm9sbC15XCIgKm5nSWY9XCJ0b2dnbGVEcm9wZG93blwiIFtzdHlsZS5tYXhIZWlnaHRdPVwiY29uZmlnLmhlaWdodFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiICpuZ0lmPVwiY29uZmlnLnNlYXJjaFwiPlxuICAgICAgPGlucHV0IChjaGFuZ2UpPVwiY2hhbmdlU2VhcmNoVGV4dCgkZXZlbnQpXCIgW3N0eWxlLmRpcmVjdGlvbl09XCJjb25maWcuaW5wdXREaXJlY3Rpb25cIiBuYW1lPVwic2VhcmNoLXRleHRcIlxuICAgICAgICAoaW5wdXQpPVwic2VhcmNoVGV4dENoYW5nZWQoKVwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIHRhYmluZGV4PVwiLTFcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgPGxhYmVsIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWFyY2hUZXh0IH1cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuc2RpY29uLXNlYXJjaFwiPjwvc3Bhbj5cbiAgICAgICAge3sgY29uZmlnLnNlYXJjaFBsYWNlaG9sZGVyIH19PC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8dWwgY2xhc3M9XCJzZWxlY3RlZC1pdGVtc1wiPlxuICAgICAgPGxpIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCIgdGFiaW5kZXg9XCItMVwiICpuZ0Zvcj1cImxldCBzZWxlY3RlZCBvZiBzZWxlY3RlZEl0ZW1zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgKGNsaWNrKT1cImRlc2VsZWN0SXRlbShzZWxlY3RlZCwgaSlcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjayBuc2RpY29uLWNsb3NlIG1lLTJcIiBjaGVja2VkPVwidHJ1ZVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnB4O1wiPnt7XG4gICAgICAgICAgY29uZmlnLmRpc3BsYXlGblxuICAgICAgICAgID8gY29uZmlnLmRpc3BsYXlGbihzZWxlY3RlZClcbiAgICAgICAgICA6IHNlbGVjdGVkW2NvbmZpZy5kaXNwbGF5S2V5XSB8fCBzZWxlY3RlZFxuICAgICAgICAgIH19PC9kaXY+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gICAgPGhyICpuZ0lmPVwic2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwICYmIGF2YWlsYWJsZUl0ZW1zLmxlbmd0aCA+IDBcIiAvPlxuICAgIDx1bCBjbGFzcz1cImF2YWlsYWJsZS1pdGVtc1wiPlxuICAgICAgPGxpIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCIgI2F2YWlsYWJsZU9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhdmFpbGFibGVJdGVtcyB8IGZpbHRlckJ5OiBzZWFyY2hUZXh0OiBjb25maWcuc2VhcmNoT25LZXlcblx0XHRcdHwgbGltaXRUbzogY29uZmlnLmxpbWl0VG87IGxldCBpID0gaW5kZXhcIiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IGZvY3VzZWRJdGVtSW5kZXggPT0gaSAmJiAhaXRlbS5kaXNhYmxlZCwgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQgfVwiXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RJdGVtKGl0ZW0sIGkpXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2sgbnNkaWNvbi1jbG9zZSBtZS0yXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycHg7XCI+XG4gICAgICAgICAge3sgY29uZmlnLmRpc3BsYXlGbiA/IGNvbmZpZy5kaXNwbGF5Rm4oaXRlbSkgOiBpdGVtW2NvbmZpZy5kaXNwbGF5S2V5XSB8fCBpdGVtIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9saT5cbiAgICAgIDxsaSAqbmdJZj1cInNob3dOb3RGb3VuZFwiPnt7IGNvbmZpZy5ub1Jlc3VsdHNGb3VuZCB9fTwvbGk+XG4gICAgPC91bD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|