@messaia/cdk 18.0.0 → 18.1.0-rc02
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/esm2022/lib/base/base.module.mjs +11 -15
- package/esm2022/lib/base/components/base.component.mjs +3 -3
- package/esm2022/lib/base/components/dynamic-table-config-dialog/dynamic-table-config-dialog.comnponent.mjs +121 -0
- package/esm2022/lib/base/components/generic-form-base.component.mjs +3 -3
- package/esm2022/lib/base/components/generic-form.component.mjs +3 -3
- package/esm2022/lib/base/components/generic-list.component.mjs +40 -32
- package/esm2022/lib/base/components/generic-reactive-form.component.mjs +3 -3
- package/esm2022/lib/base/interceptors/base.interceptor.mjs +3 -3
- package/esm2022/lib/base/interceptors/caching-interceptor.mjs +3 -3
- package/esm2022/lib/base/interceptors/loading.interceptor.mjs +3 -3
- package/esm2022/lib/base/interfaces/igeneric-list-component.mjs +1 -1
- package/esm2022/lib/base/services/file.service.mjs +3 -3
- package/esm2022/lib/base/services/loading-screen.service.mjs +3 -3
- package/esm2022/lib/base/services/print.service.mjs +3 -3
- package/esm2022/lib/chips/chips.module.mjs +4 -4
- package/esm2022/lib/chips/components/chips.component.mjs +4 -4
- package/esm2022/lib/chips/directives/autocomplete-option.directive.mjs +3 -3
- package/esm2022/lib/chips/directives/chip.directive.mjs +3 -3
- package/esm2022/lib/common/common.module.mjs +4 -4
- package/esm2022/lib/common/directives/delayed-hover.directive.mjs +3 -3
- package/esm2022/lib/common/directives/disable-control.directive.mjs +3 -3
- package/esm2022/lib/common/functions/utils.mjs +6 -6
- package/esm2022/lib/common/helpers/app-storage.mjs +3 -3
- package/esm2022/lib/common/helpers/dynamic-builder.mjs +3 -3
- package/esm2022/lib/common/helpers/dynamic-component-compiler.mjs +3 -3
- package/esm2022/lib/common/models/app-setting.mjs +3 -3
- package/esm2022/lib/common/pipes/bind.mjs +3 -3
- package/esm2022/lib/common/pipes/data-source.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/enum.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/file-size.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/filter.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/first-letter.mjs +3 -3
- package/esm2022/lib/common/pipes/form-array.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/form-control.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/form-group.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/func.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/join.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/keys.mjs +3 -3
- package/esm2022/lib/common/pipes/map.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/month-name.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/nested-property.mjs +3 -3
- package/esm2022/lib/common/pipes/only-number.mjs +3 -3
- package/esm2022/lib/common/pipes/order.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/placeholder.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/property-join.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/safe-html.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/split.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/time.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/titlecase.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/truncate.pipe.mjs +3 -3
- package/esm2022/lib/common/pipes/values.mjs +3 -3
- package/esm2022/lib/common/services/base.service.mjs +3 -3
- package/esm2022/lib/common/services/enum.service.mjs +3 -3
- package/esm2022/lib/common/services/event-queue.service.mjs +3 -3
- package/esm2022/lib/dialogs/alert-dialog/alert-dialog.component.mjs +3 -3
- package/esm2022/lib/dialogs/confirm-dialog/confirm-dialog.component.mjs +3 -3
- package/esm2022/lib/dialogs/dialog.component.mjs +12 -12
- package/esm2022/lib/dialogs/dialogs.module.mjs +4 -4
- package/esm2022/lib/dialogs/prompt-dialog/prompt-dialog.component.mjs +3 -3
- package/esm2022/lib/dialogs/services/dialog.service.mjs +3 -3
- package/esm2022/lib/file/file-input.component.mjs +3 -3
- package/esm2022/lib/file/file.module.mjs +4 -4
- package/esm2022/lib/form-validators/core/default-container.mjs +3 -1
- package/esm2022/lib/form-validators/decorators/prop.decorator.mjs +3 -1
- package/esm2022/lib/form-validators/directives/base-directive.mjs +3 -3
- package/esm2022/lib/form-validators/directives/control-host.directive.mjs +3 -3
- package/esm2022/lib/form-validators/directives/html-control-template.directive.mjs +3 -3
- package/esm2022/lib/form-validators/directives/rx-form.directive.mjs +3 -3
- package/esm2022/lib/form-validators/directives/template-validations/async-validation.directive.mjs +3 -3
- package/esm2022/lib/form-validators/directives/template-validations/base-validator.directive.mjs +3 -3
- package/esm2022/lib/form-validators/directives/template-validations/control-expression-process.mjs +3 -3
- package/esm2022/lib/form-validators/directives/template-validations/file-control.directive.mjs +3 -3
- package/esm2022/lib/form-validators/directives/template-validations/image-file-control.directive.mjs +3 -3
- package/esm2022/lib/form-validators/directives/template-validations/rxformcontrol.directive.mjs +3 -3
- package/esm2022/lib/form-validators/domain/element-processor/decimal.provider.mjs +3 -3
- package/esm2022/lib/form-validators/models/config/prop-config.mjs +1 -1
- package/esm2022/lib/form-validators/models/property-info.mjs +1 -1
- package/esm2022/lib/form-validators/services/reactive-form.module.mjs +8 -8
- package/esm2022/lib/form-validators/services/rx-form-builder.mjs +13 -6
- package/esm2022/lib/form-validators/services/typed-form-builder.mjs +3 -3
- package/esm2022/lib/forms/components/datepicker/datepicker-header.component.mjs +3 -3
- package/esm2022/lib/forms/components/generic-form/generic-form.component.mjs +15 -15
- package/esm2022/lib/forms/directives/mat-form-field-editor.directive.mjs +3 -3
- package/esm2022/lib/forms/directives/mat-form-field-readonly.directive.mjs +3 -3
- package/esm2022/lib/forms/directives/vd-generic-form-custom-field.directive.mjs +3 -3
- package/esm2022/lib/forms/forms.module.mjs +4 -4
- package/esm2022/lib/forms/helpers/abstract-mat-form-field.mjs +3 -3
- package/esm2022/lib/forms/helpers/abstract-select-form-field.component.mjs +3 -3
- package/esm2022/lib/forms/helpers/value-accessor-base.mjs +3 -3
- package/esm2022/lib/forms/pipes/field-func.pipe.mjs +3 -3
- package/esm2022/lib/forms/pipes/group-filter.pipe.mjs +3 -3
- package/esm2022/lib/forms/validators/empty-string-reset.directive.mjs +3 -3
- package/esm2022/lib/forms/validators/equal-validator.directive.mjs +3 -3
- package/esm2022/lib/forms/validators/native-element-injector.directive.mjs +3 -3
- package/esm2022/lib/forms/validators/unique-validator-directive.mjs +3 -3
- package/esm2022/lib/http/http.module.mjs +4 -4
- package/esm2022/lib/layout/dynamic-menu/dynamic-menu.component.mjs +3 -3
- package/esm2022/lib/layout/layout-card-over/layout-card-over.component.mjs +3 -3
- package/esm2022/lib/layout/layout-compact/layout-compact.component.mjs +3 -3
- package/esm2022/lib/layout/layout-footer/layout-footer.component.mjs +3 -3
- package/esm2022/lib/layout/layout-manage-list/layout-manage-list.component.mjs +3 -3
- package/esm2022/lib/layout/layout-manage-list/layout-manage-list.directives.mjs +9 -9
- package/esm2022/lib/layout/layout-nav/layout-nav.component.mjs +3 -3
- package/esm2022/lib/layout/layout-nav-list/layout-nav-list.component.mjs +3 -3
- package/esm2022/lib/layout/layout-nav-list/layout-nav-list.directives.mjs +9 -9
- package/esm2022/lib/layout/layout-toggle.class.mjs +3 -3
- package/esm2022/lib/layout/layout.component.mjs +3 -3
- package/esm2022/lib/layout/layout.directives.mjs +9 -9
- package/esm2022/lib/layout/layout.module.mjs +4 -4
- package/esm2022/lib/layout/list-toolbar/list-toolbar.component.mjs +3 -3
- package/esm2022/lib/layout/navigation-drawer/navigation-drawer.component.mjs +9 -9
- package/esm2022/lib/list/components/list.component.mjs +3 -3
- package/esm2022/lib/list/directives/vd-list-option.directive.mjs +3 -3
- package/esm2022/lib/list/list.module.mjs +4 -4
- package/esm2022/lib/media/directives/media-toggle.directive.mjs +3 -3
- package/esm2022/lib/media/media.module.mjs +4 -4
- package/esm2022/lib/media/services/media.service.mjs +3 -3
- package/esm2022/lib/menu/components/menu.component.mjs +3 -3
- package/esm2022/lib/menu/menu.module.mjs +4 -4
- package/esm2022/lib/menu/resolvers/menu-form-includes.resolve.mjs +3 -3
- package/esm2022/lib/menu/resolvers/menu-item-form-includes.resolve.mjs +3 -3
- package/esm2022/lib/menu/resolvers/menu-list-projection.resolve.mjs +3 -3
- package/esm2022/lib/menu/resolvers/menu-settings.resolve.mjs +3 -3
- package/esm2022/lib/menu/services/menu-items.service.mjs +3 -3
- package/esm2022/lib/menu/services/menu.resolve.mjs +6 -6
- package/esm2022/lib/menu/services/menu.service.mjs +3 -3
- package/esm2022/lib/search/search.module.mjs +4 -4
- package/esm2022/lib/select/components/select.component.mjs +3 -3
- package/esm2022/lib/select/directives/vd-select-option.directive.mjs +3 -3
- package/esm2022/lib/select/directives/vd-select-trigger.directive.mjs +3 -3
- package/esm2022/lib/select/select.module.mjs +4 -4
- package/esm2022/lib/table/components/dynamic-table/dynamic-table.component.mjs +132 -18
- package/esm2022/lib/table/components/filter-clear.component.mjs +3 -3
- package/esm2022/lib/table/components/filter-date.component.mjs +3 -3
- package/esm2022/lib/table/components/filter-input.component.mjs +3 -3
- package/esm2022/lib/table/components/filter-select/filter-select.component.mjs +6 -6
- package/esm2022/lib/table/directives/data-source-filter.directive.mjs +3 -3
- package/esm2022/lib/table/directives/vd-table-field.directive.mjs +3 -3
- package/esm2022/lib/table/functions/decorators.mjs +2 -2
- package/esm2022/lib/table/models/table-column-config.mjs +12 -14
- package/esm2022/lib/table/models/table-config.mjs +41 -0
- package/esm2022/lib/table/models/table-query-config.mjs +26 -0
- package/esm2022/lib/table/paginator-intl.mjs +3 -3
- package/esm2022/lib/table/table.module.mjs +7 -5
- package/esm2022/lib/table/table.static-data-source.mjs +1 -2
- package/fesm2022/messaia-cdk.mjs +5007 -4856
- package/fesm2022/messaia-cdk.mjs.map +1 -1
- package/lib/base/base.module.d.ts +5 -6
- package/lib/base/components/{dynamic-table-config-dialog.comnponent.d.ts → dynamic-table-config-dialog/dynamic-table-config-dialog.comnponent.d.ts} +12 -6
- package/lib/base/components/generic-list.component.d.ts +13 -12
- package/lib/base/interfaces/igeneric-list-component.d.ts +8 -4
- package/lib/common/functions/utils.d.ts +1 -1
- package/lib/common/styles/utilities/_general.scss +49 -2
- package/lib/common/theming/_m2-all-theme.scss +0 -2
- package/lib/form-validators/models/config/prop-config.d.ts +2 -0
- package/lib/form-validators/models/property-info.d.ts +8 -0
- package/lib/layout/_m2-layout-theme.scss +1 -1
- package/lib/table/components/dynamic-table/dynamic-table.component.d.ts +14 -5
- package/lib/table/models/table-config.d.ts +29 -0
- package/lib/table/models/table-query-config.d.ts +26 -0
- package/lib/table/table.module.d.ts +2 -0
- package/package.json +3 -3
- package/esm2022/lib/base/components/dynamic-table-config-dialog.comnponent.mjs +0 -155
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Injectable } from "@angular/core";
|
|
2
2
|
import { FormArray, FormBuilder, FormControl, FormGroup } from "@angular/forms";
|
|
3
|
+
import { Utils } from "../../common/functions/utils";
|
|
3
4
|
import { ARRAY_PROPERTY, BOOLEAN, FUNCTION_STRING, MODEL, NUMBER, OBJECT_PROPERTY, OBJECT_STRING, PROPERTY, RX_WEB_VALIDATOR, STRING } from "../const";
|
|
4
5
|
import { APP_VALIDATORS } from '../const/app-validators.const';
|
|
5
6
|
import { AnnotationTypes } from "../core/annotation-types";
|
|
@@ -773,8 +774,14 @@ export class RxFormBuilder extends BaseFormBuilder {
|
|
|
773
774
|
let propertyValidators = instanceContainer.propertyAnnotations.filter(t => t.propertyName == property.name && t.isValidator);
|
|
774
775
|
/* Extract updateOn configuration based on annotations. */
|
|
775
776
|
let updateOn = instanceContainer.propertyAnnotations.filter(t => t.propertyName == property.name && !t.isValidator && t.annotationType === "updateOn")[0];
|
|
777
|
+
/* Retrieve the value from entityObject based on valuePath or property name, or use the custom value function if provided */
|
|
778
|
+
let value = property.value
|
|
779
|
+
? property.value(entityObject)
|
|
780
|
+
: (property.valuePath
|
|
781
|
+
? Utils.getPropertyValue(entityObject, property.valuePath)
|
|
782
|
+
: entityObject[property.name]);
|
|
776
783
|
/* Sanitize the property value. */
|
|
777
|
-
let sanitizeValue = super.sanitizeValue(instanceContainer, property.name, super.getDefaultValue(property,
|
|
784
|
+
let sanitizeValue = super.sanitizeValue(instanceContainer, property.name, super.getDefaultValue(property, value, formBuilderConfiguration), json.entityObject, Object.assign({}, json.entityObject));
|
|
778
785
|
/* If the property value is undefined and there is a sanitized value, assign it. */
|
|
779
786
|
if (entityObject[property.name] === undefined && sanitizeValue) {
|
|
780
787
|
entityObject[property.name] = sanitizeValue;
|
|
@@ -918,7 +925,7 @@ export class RxFormBuilder extends BaseFormBuilder {
|
|
|
918
925
|
/* Obtain abstract control options for the global property. */
|
|
919
926
|
abstractControlOptions = this.getAbstractControlOptions("global", formBuilderConfiguration, abstractControlOptions);
|
|
920
927
|
/* Create a new RxFormGroup using the model, entity object, formGroupObject, and abstract control options. */
|
|
921
|
-
|
|
928
|
+
var formGroup = new RxFormGroup(json.model, json.entityObject, formGroupObject, abstractControlOptions);
|
|
922
929
|
/* If experimental mode is enabled, assign the form group to the entity object and override properties if needed. */
|
|
923
930
|
if (defaultContainer.isExperimental) {
|
|
924
931
|
json.entityObject["formGroup"] = formGroup;
|
|
@@ -1019,10 +1026,10 @@ export class RxFormBuilder extends BaseFormBuilder {
|
|
|
1019
1026
|
}
|
|
1020
1027
|
});
|
|
1021
1028
|
}
|
|
1022
|
-
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.
|
|
1023
|
-
/** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.
|
|
1029
|
+
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RxFormBuilder, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
1030
|
+
/** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RxFormBuilder });
|
|
1024
1031
|
}
|
|
1025
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.
|
|
1032
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RxFormBuilder, decorators: [{
|
|
1026
1033
|
type: Injectable
|
|
1027
1034
|
}] });
|
|
1028
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtZm9ybS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvZm9ybS12YWxpZGF0b3JzL3NlcnZpY2VzL3J4LWZvcm0tYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBNEMsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkksT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3ZKLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBT3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDekUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFD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QUFDO29CQUM3QyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsMEJBQTBCO2dCQUMxQixRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLENBQUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDOzBIQXBwQ1EsYUFBYTs4SEFBYixhQUFhOzsyRkFBYixhQUFhO2tCQUR6QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbE9wdGlvbnMsIEFzeW5jVmFsaWRhdG9yRm4sIEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvckZuIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG5pbXBvcnQgeyBBUlJBWV9QUk9QRVJUWSwgQk9PTEVBTiwgRlVOQ1RJT05fU1RSSU5HLCBNT0RFTCwgTlVNQkVSLCBPQkpFQ1RfUFJPUEVSVFksIE9CSkVDVF9TVFJJTkcsIFBST1BFUlRZLCBSWF9XRUJfVkFMSURBVE9SLCBTVFJJTkcgfSBmcm9tIFwiLi4vY29uc3RcIjtcclxuaW1wb3J0IHsgQVBQX1ZBTElEQVRPUlMgfSBmcm9tICcuLi9jb25zdC9hcHAtdmFsaWRhdG9ycy5jb25zdCc7XHJcbmltcG9ydCB7IEFubm90YXRpb25UeXBlcyB9IGZyb20gXCIuLi9jb3JlL2Fubm90YXRpb24tdHlwZXNcIjtcclxuaW1wb3J0IHsgZGVmYXVsdENvbnRhaW5lciB9IGZyb20gJy4uL2NvcmUvZGVmYXVsdC1jb250YWluZXInO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzXCI7XHJcbmltcG9ydCB7IERlY29yYXRvckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzL2RlY29yYXRvci1jb25maWd1cmF0aW9uXCI7XHJcbmltcG9ydCB7IEluc3RhbmNlQ29udGFpbmVyIH0gZnJvbSBcIi4uL21vZGVscy9pbnN0YW5jZS1jb250YWluZXJcIjtcclxuaW1wb3J0IHsgSUFic3RyYWN0Q29udHJvbCB9IGZyb20gXCIuLi9tb2RlbHMvaW50ZXJmYWNlL2ktYWJzdHJhY3QtY29udHJvbFwiO1xyXG5pbXBvcnQgeyBBcHBGb3JtR3JvdXAgfSBmcm9tICcuLi9tb2RlbHMvaW50ZXJmYWNlL2ktZm9ybS1ncm91cCc7XHJcbmltcG9ydCB7IFByb3BWYWxpZGF0aW9uQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9wcm9wLXZhbGlkYXRpb24tY29uZmlnXCI7XHJcbmltcG9ydCB7IFByb3BlcnR5SW5mbyB9IGZyb20gXCIuLi9tb2RlbHMvcHJvcGVydHktaW5mb1wiO1xyXG5pbXBvcnQgeyBhbmRWYWxpZGF0b3IgfSBmcm9tICcuLi9yZWFjdGl2ZS1mb3JtLXZhbGlkYXRvcnMvYW5kLnZhbGlkYXRvcic7XHJcbmltcG9ydCB7IGNvbmRpdGlvbmFsQ2hhbmdlVmFsaWRhdG9yIH0gZnJvbSBcIi4uL3JlYWN0aXZlLWZvcm0tdmFsaWRhdG9ycy9jb25kaXRpb25hbC1jaGFuZ2UudmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7IG5vdFZhbGlkYXRvciB9IGZyb20gJy4uL3JlYWN0aXZlLWZvcm0tdmFsaWRhdG9ycy9ub3QudmFsaWRhdG9yJztcclxuaW1wb3J0IHsgb3JWYWxpZGF0b3IgfSBmcm9tICcuLi9yZWFjdGl2ZS1mb3JtLXZhbGlkYXRvcnMvb3IudmFsaWRhdG9yJztcclxuaW1wb3J0IHsgVHlwZSB9IGZyb20gXCIuLi91dGlsXCI7XHJcbmltcG9ydCB7IExpbnEgfSBmcm9tICcuLi91dGlsL2xpbnEnO1xyXG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1Db25maWcgfSBmcm9tICcuLi91dGlsL3JlYWN0aXZlLWZvcm0tY29uZmlnJztcclxuaW1wb3J0IHsgUmVnZXhWYWxpZGF0b3IgfSBmcm9tIFwiLi4vdXRpbC9yZWdleC12YWxpZGF0b3JcIjtcclxuaW1wb3J0IHsgQmFzZUZvcm1CdWlsZGVyIH0gZnJvbSAnLi9iYXNlLWZvcm0tYnVpbGRlcic7XHJcbmltcG9ydCB7IFJ4Rm9ybUNvbnRyb2wgfSBmcm9tICcuL2Zvcm0tY29udHJvbCc7XHJcbmltcG9ydCB7IFJ4Rm9ybUFycmF5IH0gZnJvbSAnLi9yeC1mb3JtLWFycmF5JztcclxuaW1wb3J0IHsgUnhGb3JtR3JvdXAgfSBmcm9tICcuL3J4LWZvcm0tZ3JvdXAnO1xyXG5cclxuY29uc3QgTE9HSUNBTF9WQUxJREFUT1JTOiB7IFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uIH0gPSB7IGFuZDogYW5kVmFsaWRhdG9yLCBvcjogb3JWYWxpZGF0b3IsIG5vdDogbm90VmFsaWRhdG9yIH1cclxuY29uc3QgQVNZTkM6IHN0cmluZyA9IFwiYXN5bmNcIlxyXG5jb25zdCBFTlRJVFlfT0JKRUNUOiBzdHJpbmcgPSBcImVudGl0eU9iamVjdFwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUnhGb3JtQnVpbGRlciBleHRlbmRzIEJhc2VGb3JtQnVpbGRlciB7XHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IEFycmF5IHRvIHN0b3JlIGNvbmRpdGlvbmFsIG9iamVjdCBwcm9wZXJ0aWVzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uZGl0aW9uYWxPYmplY3RQcm9wczogYW55W10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IE9iamVjdCB0byBzdG9yZSBjb25kaXRpb25hbCB2YWxpZGF0aW9uIGluc3RhbmNlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlOiBhbnkgPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IEFycmF5IHRvIHN0b3JlIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBjb25kaXRpb25hbCBvYmplY3QgcHJvcGVydGllc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wczogYW55W10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IE9iamVjdCB0byBzdG9yZSBmb3JtIGdyb3VwIHByb3BlcnRpZXMgb3RoZXIgdmFsaWRhdG9yc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBmaWVsZDogT2JqZWN0IHRvIHN0b3JlIGN1cnJlbnQgZm9ybSBncm91cCBwcm9wZXJ0aWVzIG90aGVyIHZhbGlkYXRvcnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGZpZWxkOiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBmb3JtIGlzIG5lc3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzTmVzdGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGZpZWxkOiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBmb3JtIGdyb3VwIGlzIGNhbGxlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzR3JvdXBDYWxsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGZvcm0gaXMgbmVzdGVkIGJpbmRpbmdcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc05lc3RlZEJpbmRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgbWV0aG9kOiBHZXRzIHRoZSBpbnN0YW5jZSBjb250YWluZXIgYmFzZWQgb24gdGhlIGluc3RhbmNlIGZ1bmN0aW9uIGFuZCBlbnRpdHkgb2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2VGdW5jIFRoZSBmdW5jdGlvbiB0byBwcm92aWRlIGFuIGluc3RhbmNlIGZyb20uXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IFRoZSBlbnRpdHkgb2JqZWN0IHRvIHVzZS5cclxuICAgICAqIEByZXR1cm5zIFRoZSBwcm92aWRlZCBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0SW5zdGFuY2VDb250YWluZXIoaW5zdGFuY2VGdW5jOiBhbnksIGVudGl0eU9iamVjdDogYW55KTogSW5zdGFuY2VDb250YWluZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhY2VQcm92aWRlcihpbnN0YW5jZUZ1bmMsIGVudGl0eU9iamVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIG1ldGhvZDogRXh0cmFjdHMgZXhwcmVzc2lvbnMgZnJvbSB0aGUgZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24gZm9yIGR5bmFtaWMgdmFsaWRhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gYnVpbGRlci5cclxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGV4dHJhY3RlZCBleHByZXNzaW9ucyBvciBudWxsLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV4dHJhY3RFeHByZXNzaW9ucyhmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb246IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSB8IG51bGwge1xyXG4gICAgICAgIC8qIFxyXG4gICAgICAgICAqIEV4dHJhY3RzIGV4cHJlc3Npb25zIGZyb20gdGhlIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uIGZvciBkeW5hbWljIHZhbGlkYXRpb24uXHJcbiAgICAgICAgICogSWYgZHluYW1pYyB2YWxpZGF0aW9uIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgaXRlcmF0ZSB0aHJvdWdoIGVhY2ggcHJvcGVydHkgYW5kIGRlY29yYXRvci5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uICYmIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGRlY29yYXRvciBpbiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb25bcHJvcGVydHldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2tzIGlmIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBleGlzdHMgZm9yIHRoZSBjdXJyZW50IGRlY29yYXRvciAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmR5bmFtaWNWYWxpZGF0aW9uIGFzIGFueSlbcHJvcGVydHldW2RlY29yYXRvcl0uY29uZGl0aW9uYWxFeHByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QgY29sdW1ucyBmcm9tIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW5zID0gTGlucS5leHByZXNzaW9uQ29sdW1ucygoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmR5bmFtaWNWYWxpZGF0aW9uIGFzIGFueSlbcHJvcGVydHldW2RlY29yYXRvcl0uY29uZGl0aW9uYWxFeHByZXNzaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBjaGFuZ2UgdmFsaWRhdGlvbiBiYXNlZCBvbiB0aGUgZXh0cmFjdGVkIGNvbHVtbiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmFkZENoYW5nZVZhbGlkYXRpb24odGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZSwgcHJvcGVydHksIGNvbHVtbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQWRkcyBhc3luYyB2YWxpZGF0aW9uIHRvIHRoZSBwcm9wZXJ0eSBiYXNlZCBvbiBwcm92aWRlZCB2YWxpZGF0b3JzIGFuZCBjb25maWd1cmF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IGluZm9ybWF0aW9uLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5VmFsaWRhdG9ycyBUaGUgYXJyYXkgb2YgZGVjb3JhdG9yIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgcHJvcGVydHkuXHJcbiAgICAgKiBAcGFyYW0gcHJvcFZhbGlkYXRpb25Db25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHZhbGlkYXRpb24uXHJcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhc3luYyB2YWxpZGF0b3JzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFkZEFzeW5jVmFsaWRhdGlvbihwcm9wZXJ0eTogUHJvcGVydHlJbmZvLCBwcm9wZXJ0eVZhbGlkYXRvcnM6IERlY29yYXRvckNvbmZpZ3VyYXRpb25bXSwgcHJvcFZhbGlkYXRpb25Db25maWc6IFByb3BWYWxpZGF0aW9uQ29uZmlnKSB7XHJcbiAgICAgICAgLyogQ29sbGVjdHMgYXN5bmMgdmFsaWRhdG9ycyBmcm9tIHByb3BlcnR5IHZhbGlkYXRvcnMgYW5kIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIGxldCBhc3luY1ZhbGlkYXRvcnM6IGFueVtdID0gW107XHJcbiAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggcHJvcGVydHkgdmFsaWRhdG9ycyAqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wZXJ0eVZhbGlkYXRvciBvZiBwcm9wZXJ0eVZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0b3IgaXMgYXN5bmMgKi9cclxuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRvci5pc0FzeW5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogUHVzaCBlYWNoIGFzeW5jIHZhbGlkYXRvciBpbnRvIHRoZSBhc3luY1ZhbGlkYXRvcnMgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRvci5jb25maWcuZm9yRWFjaCgodDogYW55KSA9PiB7IGFzeW5jVmFsaWRhdG9ycy5wdXNoKHQpIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJvcFZhbGlkYXRpb25Db25maWcgJiYgKHByb3BWYWxpZGF0aW9uQ29uZmlnIGFzIGFueSlbQVNZTkNdKSB7XHJcbiAgICAgICAgICAgIC8qIEFkZCBhc3luYyB2YWxpZGF0b3JzIGZyb20gcHJvcFZhbGlkYXRpb25Db25maWcgKi9cclxuICAgICAgICAgICAgKHByb3BWYWxpZGF0aW9uQ29uZmlnIGFzIGFueSlbQVNZTkNdLmZvckVhY2goKHQ6IGFueSkgPT4geyBhc3luY1ZhbGlkYXRvcnMucHVzaCh0KSB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFzeW5jVmFsaWRhdG9ycztcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBBZGRzIGZvcm0gY29udHJvbCB2YWxpZGF0b3JzIGJhc2VkIG9uIHByb3BlcnR5IHZhbGlkYXRvcnMgYW5kIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBpbmZvcm1hdGlvbi5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eVZhbGlkYXRvcnMgVGhlIGFycmF5IG9mIGRlY29yYXRvciBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIHByb3BWYWxpZGF0aW9uQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSB2YWxpZGF0aW9uLlxyXG4gICAgICogQHBhcmFtIGluc3RhbmNlIFRoZSBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgb2JqZWN0LlxyXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZm9ybSBjb250cm9sIHZhbGlkYXRvcnMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWRkRm9ybUNvbnRyb2wocHJvcGVydHk6IFByb3BlcnR5SW5mbywgcHJvcGVydHlWYWxpZGF0b3JzOiBEZWNvcmF0b3JDb25maWd1cmF0aW9uW10sIHByb3BWYWxpZGF0aW9uQ29uZmlnOiBQcm9wVmFsaWRhdGlvbkNvbmZpZywgaW5zdGFuY2U6IEluc3RhbmNlQ29udGFpbmVyLCBlbnRpdHk6IGFueSkge1xyXG4gICAgICAgIGxldCB2YWxpZGF0b3JzID0gW107XHJcbiAgICAgICAgbGV0IGNvbHVtbnM6IGFueVtdID0gW107XHJcbiAgICAgICAgLyogQ2hlY2sgaWYgY29uZGl0aW9uYWwgdmFsaWRhdGlvbiBwcm9wcyBhcmUgZGVmaW5lZCBlaXRoZXIgaW4gaW5zdGFuY2Ugb3IgY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgKi9cclxuICAgICAgICBpZiAoKGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzICYmIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BlcnR5Lm5hbWVdKSB8fCAodGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyAmJiB0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BlcnR5Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAvKiBDb2xsZWN0cyBjb25kaXRpb25hbCB2YWxpZGF0aW9uIHByb3BlcnRpZXMgZnJvbSBpbnN0YW5jZSBhbmQgY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgYW5kIGFkZHMgY29uZGl0aW9uYWwgY2hhbmdlIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICBsZXQgcHJvcHM6IGFueVtdID0gW107XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiBjb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyBhcmUgZGVmaW5lZCBpbiBpbnN0YW5jZSBmb3IgdGhlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgIGlmICgoaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgJiYgaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNbcHJvcGVydHkubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXS5mb3JFYWNoKHQgPT4gcHJvcHMucHVzaCh0KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIGNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzIGFyZSBkZWZpbmVkIGluIGNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlIGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgJiYgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXS5mb3JFYWNoKCh0OiBhbnkpID0+IHByb3BzLnB1c2godCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgY29uZGl0aW9uYWwgY2hhbmdlIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goY29uZGl0aW9uYWxDaGFuZ2VWYWxpZGF0b3IocHJvcHMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIENoZWNrIGlmIGNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgb3IgYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzIGFyZSBkZWZpbmVkICovXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcy5sZW5ndGggPiAwIHx8IHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHByb3BDb25kaXRpb25zID0gW107XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiBjb25kaXRpb25hbE9iamVjdFByb3BzIGlzIGRlZmluZWQgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcykge1xyXG4gICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgZm9yIHByb3BlcnRpZXMgbWF0Y2hpbmcgdGhlIGN1cnJlbnQgcHJvcGVydHkgbmFtZSAqL1xyXG4gICAgICAgICAgICAgICAgcHJvcENvbmRpdGlvbnMgPSB0aGlzLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMuZmlsdGVyKHQgPT4gdC5wcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQ2hlY2sgaWYgYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzIGlzIGRlZmluZWQgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzIGZvciBwcm9wZXJ0aWVzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IG5hbWUgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcih0ID0+IHQucHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSkuZm9yRWFjaCh0ID0+IHByb3BDb25kaXRpb25zLnB1c2godCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwcm9wQ29uZGl0aW9ucy5mb3JFYWNoKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgLyogQWRkIHJlZmVyZW5jZSBwcm9wZXJ0eSBuYW1lIHRvIGNvbHVtbnMgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgIGlmICh0LnJlZmVyZW5jZVByb3BOYW1lICYmIGNvbHVtbnMuaW5kZXhPZih0LnJlZmVyZW5jZVByb3BOYW1lKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaCh0LnJlZmVyZW5jZVByb3BOYW1lKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgY29uZGl0aW9uYWwgY2hhbmdlIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goY29uZGl0aW9uYWxDaGFuZ2VWYWxpZGF0b3IoY29sdW1ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggcHJvcGVydHkgdmFsaWRhdG9ycyAqL1xyXG4gICAgICAgIGZvciAobGV0IHByb3BlcnR5VmFsaWRhdG9yIG9mIHByb3BlcnR5VmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsaWRhdG9yLmlzQXN5bmMpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcGVydHlWYWxpZGF0b3IuYW5ub3RhdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvKiBBZGQgcnVsZSB2YWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlcy5ydWxlOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goQVBQX1ZBTElEQVRPUlNbcHJvcGVydHlWYWxpZGF0b3IuYW5ub3RhdGlvblR5cGVdKHByb3BlcnR5VmFsaWRhdG9yLmNvbmZpZywgZW50aXR5KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBBZGQgbG9naWNhbCB2YWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlcy5hbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZXMub3I6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZXMubm90OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goTE9HSUNBTF9WQUxJREFUT1JTW3Byb3BlcnR5VmFsaWRhdG9yLmFubm90YXRpb25UeXBlXShwcm9wZXJ0eVZhbGlkYXRvci5jb25maWcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8qIEFkZCBjdXN0b20gdmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEFQUF9WQUxJREFUT1JTW3Byb3BlcnR5VmFsaWRhdG9yLmFubm90YXRpb25UeXBlXShwcm9wZXJ0eVZhbGlkYXRvci5jb25maWcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmcm9tIHByb3BWYWxpZGF0aW9uQ29uZmlnICovXHJcbiAgICAgICAgaWYgKHByb3BWYWxpZGF0aW9uQ29uZmlnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkaXRpb25hbFZhbGlkYXRpb24odmFsaWRhdG9ycywgcHJvcFZhbGlkYXRpb25Db25maWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogQWRkaXRpb25hbCB2YWxpZGF0aW9uIGZyb20gY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcGVydHkubmFtZV0pIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BlcnR5Lm5hbWVdLmZvckVhY2goKHQ6IGFueSkgPT4geyB2YWxpZGF0b3JzLnB1c2godCk7IH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQWRkcyBhZGRpdGlvbmFsIHZhbGlkYXRpb24gdG8gdGhlIHZhbGlkYXRpb25zIGFycmF5IGJhc2VkIG9uIHByb3BWYWxpZGF0aW9uQ29uZmlnLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdGlvbnMgQW4gYXJyYXkgb2YgZXhpc3RpbmcgdmFsaWRhdGlvbnMuXHJcbiAgICAgKiBAcGFyYW0gcHJvcFZhbGlkYXRpb25Db25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHZhbGlkYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWRkaXRpb25hbFZhbGlkYXRpb24odmFsaWRhdGlvbnM6IGFueVtdLCBwcm9wVmFsaWRhdGlvbkNvbmZpZzogUHJvcFZhbGlkYXRpb25Db25maWcgfCBhbnkpIHtcclxuICAgICAgICBmb3IgKHZhciBjb2wgaW4gQW5ub3RhdGlvblR5cGVzKSB7XHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXJyZW50IGFubm90YXRpb24gdHlwZSBleGlzdHMgYW5kIGl0J3Mgbm90IGEgY3VzdG9tIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICBpZiAocHJvcFZhbGlkYXRpb25Db25maWdbQW5ub3RhdGlvblR5cGVzW2NvbF1dICYmIGNvbCAhPSBcImN1c3RvbVwiKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBBZGQgdmFsaWRhdG9yIGZyb20gQVBQX1ZBTElEQVRPUlMgKi9cclxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25zLnB1c2goQVBQX1ZBTElEQVRPUlNbQW5ub3RhdGlvblR5cGVzW2NvbF1dKHByb3BWYWxpZGF0aW9uQ29uZmlnW0Fubm90YXRpb25UeXBlc1tjb2xdXSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBhbm5vdGF0aW9uIHR5cGUgaXMgY3VzdG9tIGFuZCB0aGUgY3VzdG9tIHZhbGlkYXRvciBleGlzdHMgaW4gdGhlIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgICAgICBlbHNlIGlmIChjb2wgPT0gQW5ub3RhdGlvblR5cGVzLmN1c3RvbSAmJiBwcm9wVmFsaWRhdGlvbkNvbmZpZ1tBbm5vdGF0aW9uVHlwZXNbY29sXV0pIHtcclxuICAgICAgICAgICAgICAgIC8qIEFkZCBjdXN0b20gdmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9ucy5wdXNoKHByb3BWYWxpZGF0aW9uQ29uZmlnW2NvbF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBlbnRpdHkgdHlwZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgb2JqZWN0IGFuZCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGZvciB3aGljaCB0aGUgZW50aXR5IHR5cGUgaXMgcmV0cmlldmVkLlxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gYnVpbGRlci5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIGlzU2FtZU9iamVjdENvbnN0cnVjdG9yIEluZGljYXRlcyBpZiB0aGUgZW50aXR5IHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIG9iamVjdCdzIGNvbnN0cnVjdG9yLlxyXG4gICAgICogQHJldHVybnMgVGhlIGVudGl0eSB0eXBlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEVudGl0eTxUPihvYmplY3Q6IFQsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXNTYW1lT2JqZWN0Q29uc3RydWN0b3I6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIC8qIENoZWNrIGlmIHRoZSBlbnRpdHkgdHlwZSBpcyBkZWZpbmVkIGluIHRoZSBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIGlmIChmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmdlbmVyaWNFbnRpdGllcyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZ2VuZXJpY0VudGl0aWVzW3Byb3BlcnR5TmFtZV0pIHtcclxuICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBlbnRpdHkgdHlwZSBmcm9tIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGUgKi9cclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5nZW5lcmljRW50aXRpZXNbcHJvcGVydHlOYW1lXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFJldHVybiB0aGUgb2JqZWN0J3MgY29uc3RydWN0b3IgaWYgaXNTYW1lT2JqZWN0Q29uc3RydWN0b3IgaXMgdHJ1ZSAqL1xyXG4gICAgICAgIHJldHVybiBpc1NhbWVPYmplY3RDb25zdHJ1Y3RvciA/IG9iamVjdCEuY29uc3RydWN0b3IgOiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBvYmplY3QgcHJvcGVydHkgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG9iamVjdCBhbmQgcHJvcGVydHkgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUluZm8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gYnVpbGRlci5cclxuICAgICAqIEByZXR1cm5zIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgb2JqZWN0IHByb3BlcnR5IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldE9iamVjdFByb3BlcnR5SW5zdGFuY2Uob2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBwcm9wZXJ0eUluZm86IFByb3BlcnR5SW5mbywgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uOiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgdHlwZSBpcyBPQkpFQ1RfUFJPUEVSVFkgYW5kIHRoZSBwcm9wZXJ0eSBleGlzdHMgaW4gdGhlIG9iamVjdCAqL1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8ucHJvcGVydHlUeXBlID09IE9CSkVDVF9QUk9QRVJUWSAmJiBvYmplY3RbcHJvcGVydHlJbmZvLm5hbWVdKSB7XHJcbiAgICAgICAgICAgIC8qIFJldHVybiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIG9iamVjdCBwcm9wZXJ0eSBpZiBpdCBleGlzdHMgKi9cclxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdFtwcm9wZXJ0eUluZm8ubmFtZV0uY29uc3RydWN0b3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgdHlwZSBpcyBBUlJBWV9QUk9QRVJUWSBhbmQgdGhlIHByb3BlcnR5IGV4aXN0cyBhbmQgY29udGFpbnMgaXRlbXMgaW4gdGhlIG9iamVjdCAqL1xyXG4gICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SW5mby5wcm9wZXJ0eVR5cGUgPT0gQVJSQVlfUFJPUEVSVFkgJiYgb2JqZWN0W3Byb3BlcnR5SW5mby5uYW1lXSAmJiBvYmplY3RbcHJvcGVydHlJbmZvLm5hbWVdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkgcHJvcGVydHkgaWYgaXQgZXhpc3RzICovXHJcbiAgICAgICAgICAgIHJldHVybiBvYmplY3RbcHJvcGVydHlJbmZvLm5hbWVdWzBdLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogUmV0dXJuIHRoZSBlbnRpdHkgdHlwZSBiYXNlZCBvbiB0aGUgb2JqZWN0IGFuZCBwcm9wZXJ0eSBpbmZvcm1hdGlvbiAqL1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEVudGl0eShvYmplY3QsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgcHJvcGVydHlJbmZvLm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGZvciBhZGRpdGlvbmFsIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbnMgZm9yIG9iamVjdCBwcm9wZXJ0aWVzIGluIHRoZSBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZUNvbnRhaW5lciBUaGUgY29udGFpbmVyIGZvciB0aGUgaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9ucy5cclxuICAgICAqIEBwYXJhbSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmb3JtIGJ1aWxkZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2hlY2tPYmplY3RQcm9wQWRkaXRpb25hbFZhbGlkYXRpb248VD4oaW5zdGFuY2VDb250YWluZXI6IEluc3RhbmNlQ29udGFpbmVyLCBvYmplY3Q6IFQsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgLyogRmlsdGVyIHByb3BlcnRpZXMgb2YgdHlwZSBPQkpFQ1RfUFJPUEVSVFkgb3IgQVJSQVlfUFJPUEVSVFkgKi9cclxuICAgICAgICB2YXIgcHJvcHMgPSBpbnN0YW5jZUNvbnRhaW5lci5wcm9wZXJ0aWVzPy5maWx0ZXIodCA9PiB0LnByb3BlcnR5VHlwZSA9PSBPQkpFQ1RfUFJPUEVSVFkgfHwgdC5wcm9wZXJ0eVR5cGUgPT0gQVJSQVlfUFJPUEVSVFkpO1xyXG5cclxuICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGZpbHRlcmVkIHByb3BlcnRpZXMgKi9cclxuICAgICAgICBwcm9wcz8uZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgbGV0IGVudGl0eSA9IHQuZW50aXR5O1xyXG5cclxuICAgICAgICAgICAgLyogSWYgZW50aXR5IHR5cGUgaXMgbm90IGRlZmluZWQgaW4gdGhlIHByb3BlcnR5LCByZXRyaWV2ZSBpdCBmcm9tIHRoZSBvYmplY3QgKi9cclxuICAgICAgICAgICAgaWYgKCF0LmVudGl0eSlcclxuICAgICAgICAgICAgICAgIGVudGl0eSA9IHRoaXMuZ2V0T2JqZWN0UHJvcGVydHlJbnN0YW5jZShvYmplY3QhLCB0LCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5nZXRJbnN0YW5jZUNvbnRhaW5lcihlbnRpdHksIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGluc3RhbmNlIGV4aXN0cyBhbmQgaGFzIGNvbmRpdGlvbmFsIHZhbGlkYXRpb24gcHJvcGVydGllcyAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0gaW5zdGFuY2VDb250YWluZXIucHJvcGVydGllcz8uZmlsdGVyKHQgPT4gdC5uYW1lID09IGtleSlbMF07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBjb25kaXRpb25hbCB2YWxpZGF0aW9uIHByb3BlcnRpZXMgaW4gaW5zdGFuY2UgY29udGFpbmVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzID0ge307XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1trZXldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW2tleV0gPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgY29uZGl0aW9uYWwgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1trZXldLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucHJvcGVydHlUeXBlICE9IEFSUkFZX1BST1BFUlRZKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyBhcyBhbnkpW2tleV0ucHVzaChbdC5uYW1lLCB4XS5qb2luKCcuJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyBhcyBhbnkpW2tleV0ucHVzaChbdC5uYW1lLCB4XS5qb2luKCdbXScpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWN0cyBhbiBvYmplY3QgY29udGFpbmluZyBtb2RlbCwgZW50aXR5T2JqZWN0LCBhbmQgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRvIGJlIHVzZWQgZm9yIG9iamVjdCBjb25zdHJ1Y3Rpb24uXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IFRoZSBlbnRpdHkgb2JqZWN0IHRvIGJlIHVzZWQuXHJcbiAgICAgKiBAcGFyYW0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZm9ybSBidWlsZGVyLlxyXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgbW9kZWwsIGVudGl0eU9iamVjdCwgYW5kIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRPYmplY3QobW9kZWw6IGFueSB8IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGVudGl0eU9iamVjdD86IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbj86IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xyXG4gICAgICAgIC8qIEluaXRpYWxpemVzIGFuIGVtcHR5IG9iamVjdCB0byBzdG9yZSB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiAqL1xyXG4gICAgICAgIGxldCBqc29uOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gICAgICAgIC8qIENoZWNrcyBpZiB0aGUgbW9kZWwgaXMgYSBmdW5jdGlvbiAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gRlVOQ1RJT05fU1RSSU5HKSB7XHJcbiAgICAgICAgICAgIGpzb24ubW9kZWwgPSBtb2RlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIENoZWNrcyBpZiB0aGUgbW9kZWwgaXMgYSBmdW5jdGlvbiBhbmQgZW50aXR5T2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gRlVOQ1RJT05fU1RSSU5HICYmIChlbnRpdHlPYmplY3QgaW5zdGFuY2VvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pKSB7XHJcbiAgICAgICAgICAgIC8qIENyZWF0ZXMgdGhlIGVudGl0eSBvYmplY3QgdXNpbmcgY3JlYXRlQ2xhc3NPYmplY3QgbWV0aG9kICovXHJcbiAgICAgICAgICAgIGpzb24uZW50aXR5T2JqZWN0ID0gdGhpcy5jcmVhdGVDbGFzc09iamVjdChqc29uLm1vZGVsLCBlbnRpdHlPYmplY3QpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogQ2hlY2tzIGlmIGVudGl0eU9iamVjdCBleGlzdHMgYW5kIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICBpZiAoZW50aXR5T2JqZWN0ICYmICEoZW50aXR5T2JqZWN0IGluc3RhbmNlb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSkge1xyXG4gICAgICAgICAgICBqc29uLmVudGl0eU9iamVjdCA9IGVudGl0eU9iamVjdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIENoZWNrcyBpZiBlbnRpdHlPYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGFuZCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gaXMgbm90IHByb3ZpZGVkICovXHJcbiAgICAgICAgaWYgKGVudGl0eU9iamVjdCBpbnN0YW5jZW9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAmJiAhZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uID0gZW50aXR5T2JqZWN0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKiBDaGVja3MgaWYgZW50aXR5T2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gYW5kIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBpcyBwcm92aWRlZCAqL1xyXG4gICAgICAgIGVsc2UgaWYgKCEoZW50aXR5T2JqZWN0IGluc3RhbmNlb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICAgICAgLyogU2V0cyB0aGUgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGluIHRoZSBKU09OICovXHJcbiAgICAgICAgICAgIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uID0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uO1xyXG4gICAgICAgICAgICAvKiBDcmVhdGVzIHRoZSBlbnRpdHkgb2JqZWN0IHVzaW5nIGNyZWF0ZUNsYXNzT2JqZWN0IG1ldGhvZCAqL1xyXG4gICAgICAgICAgICBqc29uLmVudGl0eU9iamVjdCA9IHRoaXMuY3JlYXRlQ2xhc3NPYmplY3QoanNvbi5tb2RlbCwganNvbi5mb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGpzb24uZW50aXR5T2JqZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIElmIGVudGl0eU9iamVjdCBkb2VzIG5vdCBleGlzdCAqL1xyXG4gICAgICAgIGlmICghZW50aXR5T2JqZWN0KSB7XHJcbiAgICAgICAgICAgIC8qIENoZWNrcyBpZiB0aGUgbW9kZWwgaXMgYW4gb2JqZWN0ICovXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gT0JKRUNUX1NUUklORykge1xyXG4gICAgICAgICAgICAgICAgLyogU3RvcmVzIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbW9kZWwgKi9cclxuICAgICAgICAgICAgICAgIGpzb24ubW9kZWwgPSBtb2RlbC5jb25zdHJ1Y3RvcjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQ3JlYXRlcyB0aGUgZW50aXR5IG9iamVjdCB1c2luZyBjcmVhdGVDbGFzc09iamVjdCBtZXRob2QgKi9cclxuICAgICAgICAgICAganNvbi5lbnRpdHlPYmplY3QgPSB0aGlzLmNyZWF0ZUNsYXNzT2JqZWN0KGpzb24ubW9kZWwsIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBtb2RlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIElmIGVudGl0eU9iamVjdCBleGlzdHMgYW5kIGlzIGFuIGluc3RhbmNlIG9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBhbmQgbW9kZWwgaXMgYW4gb2JqZWN0ICovXHJcbiAgICAgICAgZWxzZSBpZiAobW9kZWwgJiYgKGVudGl0eU9iamVjdCBpbnN0YW5jZW9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikgJiYgKHR5cGVvZiBtb2RlbCA9PSBPQkpFQ1RfU1RSSU5HKSkge1xyXG4gICAgICAgICAgICAvKiBTdG9yZXMgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBtb2RlbCAqL1xyXG4gICAgICAgICAgICBqc29uW01PREVMXSA9IG1vZGVsLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgICAgICAvKiBDcmVhdGVzIHRoZSBlbnRpdHkgb2JqZWN0IHVzaW5nIGNyZWF0ZUNsYXNzT2JqZWN0IG1ldGhvZCAqL1xyXG4gICAgICAgICAgICBqc29uW0VOVElUWV9PQkpFQ1RdID0gdGhpcy5jcmVhdGVDbGFzc09iamVjdChqc29uLm1vZGVsLCBqc29uLmZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgbW9kZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogUmV0dXJucyB0aGUgY29uc3RydWN0ZWQgSlNPTiBvYmplY3QgKi9cclxuICAgICAgICByZXR1cm4ganNvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBmb3JtIGNvbnRyb2wgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCB2YWxpZGF0b3JzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgZm9ybSBjb250cm9sLlxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvcnMgQW4gYXJyYXkgb2Ygc3luY2hyb25vdXMgdmFsaWRhdG9ycy5cclxuICAgICAqIEBwYXJhbSBhc3luY1ZhbGlkYXRvcnMgQW4gYXJyYXkgb2YgYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBJQWJzdHJhY3RDb250cm9sLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29udHJvbCh2YWx1ZT86IGFueSwgdmFsaWRhdG9ycz86IFZhbGlkYXRvckZuW10sIGFzeW5jVmFsaWRhdG9ycz86IEFzeW5jVmFsaWRhdG9yRm5bXSk6IElBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiBuZXcgUnhGb3JtQ29udHJvbCh2YWx1ZSwgeyB2YWxpZGF0b3JzOiB2YWxpZGF0b3JzLCBhc3luY1ZhbGlkYXRvcnM6IGFzeW5jVmFsaWRhdG9ycyB9LCB7fSwge30sICcnLCBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgZm9ybSBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFuZCB2YWxpZGF0b3IgY29uZmlndXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHZhbHVlcyBBbiBhcnJheSBvZiBvYmplY3RzIHRvIGluaXRpYWxpemUgdGhlIGZvcm0gYXJyYXkuXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciB2YWxpZGF0b3JzLlxyXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgRm9ybUFycmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXJyYXkodmFsdWVzOiBbeyBba2V5OiBzdHJpbmddOiBhbnkgfV0sIHZhbGlkYXRvckNvbmZpZz86IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIC8qIENyZWF0ZXMgYSBGb3JtR3JvdXAgaW5zdGFuY2Ugd2l0aCBhIHNpbmdsZSBjb250cm9sIG5hbWVkIFwidGVtcFwiIGFuZCBhc3NpZ25zIGl0IHRvIGZvcm1BcnJheSAqL1xyXG4gICAgICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmdyb3VwKHsgdGVtcDogdmFsdWVzIH0sIHZhbGlkYXRvckNvbmZpZykuZ2V0KFwidGVtcFwiKSBhcyBGb3JtQXJyYXk7XHJcblxyXG4gICAgICAgIC8qIEluc3RhbnRpYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRm9ybUJ1aWxkZXIgKi9cclxuICAgICAgICB2YXIgZm9ybUJ1aWxkZXIgPSBuZXcgRm9ybUJ1aWxkZXIoKTtcclxuXHJcbiAgICAgICAgLyogQ3JlYXRlcyBhIEZvcm1BcnJheSBpbnN0YW5jZSB1c2luZyB0aGUgY29udHJvbHMgb2YgdGhlIEZvcm1Hcm91cCAqL1xyXG4gICAgICAgIHJldHVybiBmb3JtQnVpbGRlci5hcnJheShmb3JtQXJyYXkuY29udHJvbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGZvcm0gZ3JvdXAgd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwIG9iamVjdCBhbmQgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBncm91cE9iamVjdCBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncm91cC5cclxuICAgICAqIEBwYXJhbSB2YWxpZGF0b3JDb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHZhbGlkYXRvcnMuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBGb3JtR3JvdXAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBncm91cChncm91cE9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgdmFsaWRhdG9yQ29uZmlnPzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKTogRm9ybUdyb3VwIHtcclxuICAgICAgICAvKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIG1vZGVsICovXHJcbiAgICAgICAgbGV0IG1vZGVsSW5zdGFuY2UgPSBzdXBlci5jcmVhdGVJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAvKiBJbml0aWFsaXplIGFuIGVtcHR5IG9iamVjdCBmb3IgdGhlIGVudGl0eSAqL1xyXG4gICAgICAgIGxldCBlbnRpdHlPYmplY3QgPSB7fTtcclxuXHJcbiAgICAgICAgLyogSW5pdGlhbGl6ZSBhbiBlbXB0eSBvYmplY3QgZm9yIGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0ge307XHJcblxyXG4gICAgICAgIC8qIFNldCBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yIHRvIGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yO1xyXG5cclxuICAgICAgICAvKiBDcmVhdGUgdGhlIHZhbGlkYXRvciBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JGb3JtR3JvdXAoZ3JvdXBPYmplY3QsIGVudGl0eU9iamVjdCwgbW9kZWxJbnN0YW5jZSwgdmFsaWRhdG9yQ29uZmlnISk7XHJcblxyXG4gICAgICAgIC8qIFNldCBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yIGJhY2sgdG8gZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3I7XHJcblxyXG4gICAgICAgIC8qIEZsYWcgdGhhdCBhIGdyb3VwIGlzIGJlaW5nIGNhbGxlZCAqL1xyXG4gICAgICAgIHRoaXMuaXNHcm91cENhbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qIENyZWF0ZSB0aGUgZm9ybSBncm91cCAqL1xyXG4gICAgICAgIGxldCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1Hcm91cChtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yLCBlbnRpdHlPYmplY3QsIHZhbGlkYXRvckNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8qIFJlc2V0IGlzR3JvdXBDYWxsZWQgZmxhZyAqL1xyXG4gICAgICAgIHRoaXMuaXNHcm91cENhbGxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKiBSZXNldCBmb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgKi9cclxuICAgICAgICB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHt9O1xyXG5cclxuICAgICAgICAvKiBSZXNldCBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3I7XHJcblxyXG4gICAgICAgIC8qIFJlc2V0IGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0ge307XHJcblxyXG4gICAgICAgIC8qIFJldHVybiB0aGUgY3JlYXRlZCBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgcmV0dXJuIGZvcm1Hcm91cDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IGFsbCBwcm9wZXJ0eSB2YWxpZGF0b3JzIHNwZWNpZmllZCBpbiB0aGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gdG8gYSBnaXZlbiBwcm9wZXJ0eS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB3aGljaCB2YWxpZGF0b3JzIGFyZSBhcHBsaWVkLlxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvckNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBmb3IgcHJvcGVydHkgdmFsaWRhdGlvbi5cclxuICAgICAqIEBwYXJhbSBtb2RlbEluc3RhbmNlIFRoZSBpbnN0YW5jZSBvZiB0aGUgbW9kZWwuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXBwbHlBbGxQcm9wVmFsaWRhdG9yKHByb3BOYW1lOiBzdHJpbmcsIHZhbGlkYXRvckNvbmZpZzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBtb2RlbEluc3RhbmNlOiBhbnkpIHtcclxuICAgICAgICAvKiBDaGVjayBpZiB0aGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gYW5kIGFwcGx5QWxsUHJvcHMgYXJyYXkgZXhpc3QgKi9cclxuICAgICAgICBpZiAodmFsaWRhdG9yQ29uZmlnICYmIHZhbGlkYXRvckNvbmZpZy5hcHBseUFsbFByb3BzKSB7XHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBleGNsdWRlUHJvcHMgYXJyYXkgZXhpc3RzIGFuZCBpZiB0aGUgcHJvcE5hbWUgaXMgbm90IGluIHRoZSBleGNsdWRlUHJvcHMgYXJyYXkgKi9cclxuICAgICAgICAgICAgaWYgKCEodmFsaWRhdG9yQ29uZmlnLmV4Y2x1ZGVQcm9wcyAmJiB2YWxpZGF0b3JDb25maWcuZXhjbHVkZVByb3BzLmxlbmd0aCA+IDAgJiYgdmFsaWRhdG9yQ29uZmlnLmV4Y2x1ZGVQcm9wcy5pbmRleE9mKHByb3BOYW1lKSA9PSAtMSkpIHtcclxuICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGl0ZW0gaW4gdGhlIGFwcGx5QWxsUHJvcHMgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgIHZhbGlkYXRvckNvbmZpZy5hcHBseUFsbFByb3BzLmZvckVhY2goKHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24gaXMgYW4gUnhXZWIgdmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQubmFtZSA9PSBSWF9XRUJfVkFMSURBVE9SKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFwcGx5IFJ4V2ViIHZhbGlkYXRvciB0byB0aGUgcHJvcE5hbWUgd2l0aCB0aGUgbW9kZWxJbnN0YW5jZSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0KHByb3BOYW1lLCBtb2RlbEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciBoYXMgYW4gZW50cnkgZm9yIHRoZSBwcm9wTmFtZSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgY3JlYXRlIGFuIGVtcHR5IGFycmF5IGZvciB0aGUgcHJvcE5hbWUgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogUHVzaCB0aGUgY3VzdG9tIHZhbGlkYXRvciB0byB0aGUgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdLnB1c2godCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogQ2hlY2tzIGlmIGR5bmFtaWMgdmFsaWRhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0byBhIHByb3BlcnR5LlxyXG4gICAgICAqIFxyXG4gICAgICAqIEBwYXJhbSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2suXHJcbiAgICAgICogQHBhcmFtIHZhbGlkYXRvckNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBmb3IgcHJvcGVydHkgdmFsaWRhdGlvbi5cclxuICAgICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGR5bmFtaWMgdmFsaWRhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgcHJvcGVydHkuXHJcbiAgICAgICovXHJcbiAgICBwcml2YXRlIGR5bmFtaWNWYWxpZGF0aW9uUHJvcENoZWNrKHByb3BOYW1lOiBzdHJpbmcsIHZhbGlkYXRvckNvbmZpZzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuICh2YWxpZGF0b3JDb25maWcgPT0gdW5kZWZpbmVkKSA/IHRydWUgOiAoIXZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWUpID8gdHJ1ZSA6IHZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWUgPT0gcHJvcE5hbWUgPyBmYWxzZSA6IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIG5vdCBhbiBvYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXHJcbiAgICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzTm90T2JqZWN0KHZhbHVlOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPSBPQkpFQ1RfU1RSSU5HO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHZhbGlkYXRvciBmb3JtIGdyb3VwIGJhc2VkIG9uIHRoZSBncm91cE9iamVjdCBhbmQgYXBwbGllcyB2YWxpZGF0aW9uIHJ1bGVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBPYmplY3QgVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSB0aGUgZm9ybSBncm91cC5cclxuICAgICAqIEBwYXJhbSBlbnRpdHlPYmplY3QgVGhlIGVudGl0eSBvYmplY3QgdG8gc3RvcmUgdGhlIGZvcm0gZ3JvdXAuXHJcbiAgICAgKiBAcGFyYW0gbW9kZWxJbnN0YW5jZSBUaGUgbW9kZWwgaW5zdGFuY2UgdXNlZCBmb3IgaW5pdGlhbGl6YXRpb24uXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSB2YWxpZGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVZhbGlkYXRvckZvcm1Hcm91cChncm91cE9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZW50aXR5T2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBtb2RlbEluc3RhbmNlOiBhbnksIHZhbGlkYXRvckNvbmZpZzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgLyogSXRlcmF0ZXMgb3ZlciBlYWNoIHByb3BlcnR5IGluIHRoZSBncm91cE9iamVjdCB0byBjcmVhdGUgZm9ybSBjb250cm9scyBhbmQgYXBwbHkgdmFsaWRhdG9ycy4gKi9cclxuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBncm91cE9iamVjdCkge1xyXG4gICAgICAgICAgICB2YXIgcHJvcCA9IGdyb3VwT2JqZWN0W3Byb3BOYW1lXTtcclxuXHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbiBhcnJheSBhbmQgbmVlZHMgdmFsaWRhdGlvbiAqL1xyXG4gICAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIEFycmF5ICYmIHByb3AubGVuZ3RoID4gMCAmJiB0aGlzLmlzTm90T2JqZWN0KHByb3BbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcFZhbGlkYXRvcnMgPSAocHJvcC5sZW5ndGggPiAxICYmIHByb3BbMV0gaW5zdGFuY2VvZiBBcnJheSkgPyBwcm9wWzFdIDogKHByb3AubGVuZ3RoID09IDIpID8gW3Byb3BbMV1dIDogW107XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlBZGRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgb3ZlciBlYWNoIHZhbGlkYXRvciBmb3IgdGhlIGN1cnJlbnQgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcFZhbGlkYXRvcnNbaV0ubmFtZSA9PSBSWF9XRUJfVkFMSURBVE9SKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BWYWxpZGF0b3JzW2ldKHByb3BOYW1lLCBtb2RlbEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlBZGRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIG90aGVyIHZhbGlkYXRvcnMgdG8gdGhlIGN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV0ucHVzaChwcm9wVmFsaWRhdG9yc1tpXSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogSWYgbm8gcHJvcGVydHkgdmFsaWRhdG9yIGFkZGVkLCBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBvYmplY3QgKi9cclxuICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHlBZGRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBQUk9QRVJUWSwgdW5kZWZpbmVkLCB0eXBlb2YgbW9kZWxJbnN0YW5jZSA9PSBPQkpFQ1RfU1RSSU5HID8gbW9kZWxJbnN0YW5jZSA6IHsgY29uc3RydWN0b3I6IG1vZGVsSW5zdGFuY2UgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogQXBwbHkgYWxsIHByb3BlcnR5IHZhbGlkYXRvcnMgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlBbGxQcm9wVmFsaWRhdG9yKHByb3BOYW1lLCB2YWxpZGF0b3JDb25maWcsIG1vZGVsSW5zdGFuY2UpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcCA9PT0gbnVsbCB8fCBwcm9wID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHByb3AgPT0gU1RSSU5HIHx8IHR5cGVvZiBwcm9wID09IE5VTUJFUiB8fCB0eXBlb2YgcHJvcCA9PSBCT09MRUFOIHx8IHByb3AgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBvYmplY3QgaWYgaXQncyBhIHNpbXBsZSB0eXBlICovXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgUFJPUEVSVFksIHVuZGVmaW5lZCwgdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT0gT0JKRUNUX1NUUklORyA/IG1vZGVsSW5zdGFuY2UgOiB7IGNvbnN0cnVjdG9yOiBtb2RlbEluc3RhbmNlIH0pO1xyXG4gICAgICAgICAgICAgICAgLyogQXBwbHkgYWxsIHByb3BlcnR5IHZhbGlkYXRvcnMgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlBbGxQcm9wVmFsaWRhdG9yKHByb3BOYW1lLCB2YWxpZGF0b3JDb25maWcsIG1vZGVsSW5zdGFuY2UpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhIEZvcm1BcnJheSwgYXNzaWduIGl0IGRpcmVjdGx5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3A7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIElmIGl0J3MgYW4gYXJyYXkgb2Ygb2JqZWN0cywgY3JlYXRlIGZvcm0gY29udHJvbHMgcmVjdXJzaXZlbHkgKi9cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcE1vZGVsSW5zdGFuY2UgPSBzdXBlci5jcmVhdGVJbnN0YW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kZWxJbnN0YW5jZSA9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3RvciA9IG1vZGVsSW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBhcyBhbiBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBBUlJBWV9QUk9QRVJUWSwgcHJvcE1vZGVsSW5zdGFuY2UuY29uc3RydWN0b3IsIG1vZGVsSW5zdGFuY2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGFuIGVtcHR5IGFycmF5IGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcm93IG9mIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGEgbmV3IG9iamVjdCBmb3IgZWFjaCBlbGVtZW50ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqT2JqZWN0ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFB1c2ggdGhlIG5ldyBvYmplY3QgaW50byB0aGUgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXS5wdXNoKGpPYmplY3QpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlY3Vyc2l2ZWx5IGNyZWF0ZSB2YWxpZGF0b3IgZm9ybSBncm91cHMgZm9yIGVhY2ggb2JqZWN0ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yRm9ybUdyb3VwKHJvdywgak9iamVjdCwgcHJvcE1vZGVsSW5zdGFuY2UuY29uc3RydWN0b3IsIHZhbGlkYXRvckNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wID09IE9CSkVDVF9TVFJJTkcgJiYgIShwcm9wIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgfHwgcHJvcCBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIGZvcm1Hcm91cCBiYXNlZCBvbiB0aGUgdHlwZSBvZiAncHJvcCcgKi9cclxuICAgICAgICAgICAgICAgIGxldCBmb3JtR3JvdXA6IGFueSA9IChwcm9wIGluc3RhbmNlb2YgRm9ybUFycmF5KSA/IHByb3AuY29udHJvbHNbMF0gOiBwcm9wO1xyXG5cclxuICAgICAgICAgICAgICAgIC8qIElmICdwcm9wJyBpcyBhIEZvcm1Hcm91cCBvciBSeEZvcm1Hcm91cCBhbmQgZG9lcyBub3QgaGF2ZSBhIG1vZGVsLCBjcmVhdGUgYSBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1Hcm91cC5tb2RlbCAmJiAocHJvcCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBwcm9wIGluc3RhbmNlb2YgUnhGb3JtR3JvdXApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwID0gdGhpcy5ncm91cChmb3JtR3JvdXAuY29udHJvbHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qIElmICdwcm9wJyBpcyBhIEZvcm1Hcm91cCBvciBSeEZvcm1Hcm91cCwgaW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgYXMgYW4gb2JqZWN0ICovXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBwcm9wIGluc3RhbmNlb2YgUnhGb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcDtcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgT0JKRUNUX1BST1BFUlRZLCBmb3JtR3JvdXAubW9kZWwsIG1vZGVsSW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLyogSWYgJ3Byb3AnIGlzIGEgRm9ybUFycmF5LCBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBhcyBhbiBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSBwcm9wO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBBUlJBWV9QUk9QRVJUWSwgZm9ybUdyb3VwLm1vZGVsLCBtb2RlbEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8qIElmICdwcm9wJyBpcyBuZWl0aGVyIGEgRm9ybUdyb3VwL1J4Rm9ybUdyb3VwIG5vciBhIEZvcm1BcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgZHluYW1pYyB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkIGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5keW5hbWljVmFsaWRhdGlvblByb3BDaGVjayhwcm9wTmFtZSwgdmFsaWRhdG9yQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHByb3BlcnR5IGZvciBkeW5hbWljIHZhbGlkYXRpb24gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciB0byB0aGUgY3VycmVudCBwcm9wZXJ0eSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgPSB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgZm9yIHRoZSBwcm9wZXJ0eSBtb2RlbCAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcE1vZGVsSW5zdGFuY2UgPSBzdXBlci5jcmVhdGVJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgb2JqZWN0ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXS5jb25zdHJ1Y3RvciA9IHByb3BNb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgT0JKRUNUX1BST1BFUlRZLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLmNvbnN0cnVjdG9yLCBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09IEZ1bmN0aW9uID8geyBjb25zdHJ1Y3RvcjogbW9kZWxJbnN0YW5jZSB9IDogbW9kZWxJbnN0YW5jZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnID0gdGhpcy5nZXRWYWxpZGF0b3JDb25maWcodmFsaWRhdG9yQ29uZmlnLCBncm91cE9iamVjdCwgcHJvcE5hbWUgKyBcIi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWN1cnNpdmVseSBjcmVhdGUgdGhlIHZhbGlkYXRvciBmb3JtIGdyb3VwIGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JGb3JtR3JvdXAoZ3JvdXBPYmplY3RbcHJvcE5hbWVdLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLmNvbnN0cnVjdG9yLCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHByb3BlcnR5IHdpdGhvdXQgZHluYW1pYyB2YWxpZGF0aW9uICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSBncm91cE9iamVjdFtwcm9wTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBvZiBzaW1wbGUgdHlwZSAqL1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgPT0gU1RSSU5HIHx8IHR5cGVvZiBwcm9wID09IE5VTUJFUiB8fCB0eXBlb2YgcHJvcCA9PSBCT09MRUFOIHx8IHByb3AgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBhbiBhcnJheSBvciBvYmplY3QgKi9cclxuICAgICAgICAgICAgZWxzZSBpZiAoKHByb3AgJiYgcHJvcC5sZW5ndGggPiAwICYmIHRoaXMuaXNOb3RPYmplY3QocHJvcFswXSkgJiYgIShwcm9wIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgfHwgcHJvcCBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpICYmICEocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkpKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcFswXVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBhIEZvcm1BcnJheSAqL1xyXG4gICAgICAgICAgICBlbHNlIGlmIChwcm9wIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBhIEZvcm1Db250cm9sICovXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHByb3AgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCB8fCBwcm9wIGluc3RhbmNlb2YgUnhGb3JtQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3BcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBQUk9QRVJUWSwgdW5kZWZpbmVkLCBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID8gbW9kZWxJbnN0YW5jZSA6IHsgY29uc3RydWN0b3I6IG1vZGVsSW5zdGFuY2UgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbGlkYXRvciBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIGVudGl0eSBvYmplY3QgYW5kIHJvb3QgcHJvcGVydHkgbmFtZS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvckNvbmZpZyBUaGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gdG8gcHJvY2Vzcy5cclxuICAgICAqIEBwYXJhbSBlbnRpdHlPYmplY3QgVGhlIGVudGl0eSBvYmplY3QgZm9yIHdoaWNoIHRoZSB2YWxpZGF0b3IgY29uZmlndXJhdGlvbiBpcyBhcHBsaWVkLlxyXG4gICAgICogQHBhcmFtIHJvb3RQcm9wZXJ0eU5hbWUgVGhlIHJvb3QgcHJvcGVydHkgbmFtZSB0byBjb25zaWRlci5cclxuICAgICAqIEBwYXJhbSBhcnJheVByb3BlcnR5TmFtZSBPcHRpb25hbC4gVGhlIGFycmF5IHByb3BlcnR5IG5hbWUgdG8gY29uc2lkZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvY2Vzc2VkIHZhbGlkYXRvciBjb25maWd1cmF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JDb25maWc6IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgZW50aXR5T2JqZWN0OiBhbnksIHJvb3RQcm9wZXJ0eU5hbWU6IHN0cmluZywgYXJyYXlQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGxldCBleGNsdWRlUHJvcHM6IGFueVtdID0gW107XHJcbiAgICAgICAgbGV0IGluY2x1ZGVQcm9wczogYW55W10gPSBbXTtcclxuICAgICAgICBsZXQgaWdub3JlVW5kZWZpbmVkUHJvcHM6IGFueVtdID0gW107XHJcblxyXG4gICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0b3JDb25maWcgZXhpc3RzICovXHJcbiAgICAgICAgaWYgKCF2YWxpZGF0b3JDb25maWcpIHJldHVybiB7fTtcclxuXHJcbiAgICAgICAgLyogUmV0cmlldmUgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzIGFuZCBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgKi9cclxuICAgICAgICBjb25zdCB2YWxpZGF0aW9uUHJvcHMgPSB0aGlzLmdldE9iamVjdEZvclByb3BlcnR5KHZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbiEsIHJvb3RQcm9wZXJ0eU5hbWUsIGFycmF5UHJvcGVydHlOYW1lKTtcclxuICAgICAgICBjb25zdCBhYnN0cmFjdENvbnRyb2xPcHRpb25zID0gdGhpcy5nZXRPYmplY3RGb3JQcm9wZXJ0eSh2YWxpZGF0b3JDb25maWcuYWJzdHJhY3RDb250cm9sT3B0aW9ucyEsIHJvb3RQcm9wZXJ0eU5hbWUsIGFycmF5UHJvcGVydHlOYW1lKTtcclxuXHJcbiAgICAgICAgLyogUG9wdWxhdGUgZXhjbHVkZVByb3BzLCBpbmNsdWRlUHJvcHMsIGFuZCBpZ25vcmVVbmRlZmluZWRQcm9wcyBhcnJheXMgKi9cclxuICAgICAgICBpZiAodmFsaWRhdG9yQ29uZmlnLmV4Y2x1ZGVQcm9wcykge1xyXG4gICAgICAgICAgICBleGNsdWRlUHJvcHMgPSB0aGlzLmdldFByb3BzKHZhbGlkYXRvckNvbmZpZy5leGNsdWRlUHJvcHMsIHJvb3RQcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbGlkYXRvckNvbmZpZy5pbmNsdWRlUHJvcHMpIHtcclxuICAgICAgICAgICAgaW5jbHVkZVByb3BzID0gdGhpcy5nZXRQcm9wcyh2YWxpZGF0b3JDb25maWcuaW5jbHVkZVByb3BzLCByb290UHJvcGVydHlOYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWxpZGF0b3JDb25maWcuaWdub3JlVW5kZWZpbmVkUHJvcHMpIHtcclxuICAgICAgICAgICAgaWdub3JlVW5kZWZpbmVkUHJvcHMgPSB0aGlzLmdldFByb3BzKHZhbGlkYXRvckNvbmZpZy5pZ25vcmVVbmRlZmluZWRQcm9wcywgcm9vdFByb3BlcnR5TmFtZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBBcHBlbmQgZ2xvYmFsIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucyBpZiBub3QgZm91bmQgKi9cclxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKGFic3RyYWN0Q29udHJvbE9wdGlvbnMpLmxlbmd0aCAmJiByb290UHJvcGVydHlOYW1lLmVuZHNXaXRoKCcuJykgJiYgdmFsaWRhdG9yQ29uZmlnLmFic3RyYWN0Q29udHJvbE9wdGlvbnMgJiYgdmFsaWRhdG9yQ29uZmlnLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbcm9vdFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgcm9vdFByb3BlcnR5TmFtZS5sZW5ndGggLSAxKV0pIHtcclxuICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9uc1snZ2xvYmFsJ10gPSB2YWxpZGF0b3JDb25maWcuYWJzdHJhY3RDb250cm9sT3B0aW9uc1tyb290UHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCByb290UHJvcGVydHlOYW1lLmxlbmd0aCAtIDEpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFJldHJpZXZlIGR5bmFtaWMgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgY29uc3QgZHluYW1pY1ZhbGlkYXRpb24gPSAodmFsaWRhdG9yQ29uZmlnLmR5bmFtaWNWYWxpZGF0aW9uQ29uZmlndXJhdGlvblByb3BlcnR5TmFtZSAmJiBlbnRpdHlPYmplY3RbdmFsaWRhdG9yQ29uZmlnLmR5bmFtaWNWYWxpZGF0aW9uQ29uZmlndXJhdGlvblByb3BlcnR5TmFtZV0pID8gZW50aXR5T2JqZWN0W3ZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWVdIDogdmFsaWRhdGlvblByb3BzO1xyXG5cclxuICAgICAgICAvKiBSZXR1cm4gcHJvY2Vzc2VkIHZhbGlkYXRvciBjb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWdub3JlVW5kZWZpbmVkUHJvcHM6IGlnbm9yZVVuZGVmaW5lZFByb3BzLFxyXG4gICAgICAgICAgICBpbmNsdWRlUHJvcHM6IGluY2x1ZGVQcm9wcyxcclxuICAgICAgICAgICAgZHluYW1pY1ZhbGlkYXRpb246IGR5bmFtaWNWYWxpZGF0aW9uLFxyXG4gICAgICAgICAgICBleGNsdWRlUHJvcHM6IGV4Y2x1ZGVQcm9wcyxcclxuICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9uczogYWJzdHJhY3RDb250cm9sT3B0aW9uc1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgb2JqZWN0IHByb3BlcnRpZXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCByb290IHByb3BlcnR5IG5hbWUgYW5kIGFycmF5IHByb3BlcnR5IG5hbWUgKGlmIHByb3ZpZGVkKS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHJvb3RPYmplY3QgVGhlIHJvb3Qgb2JqZWN0IHRvIHNlYXJjaCBmb3IgcHJvcGVydGllcy5cclxuICAgICAqIEBwYXJhbSByb290UHJvcGVydHlOYW1lIFRoZSByb290IHByb3BlcnR5IG5hbWUgdG8gbWF0Y2ggYWdhaW5zdC5cclxuICAgICAqIEBwYXJhbSBhcnJheVByb3BlcnR5TmFtZSBPcHRpb25hbC4gVGhlIGFycmF5IHByb3BlcnR5IG5hbWUgdG8gbWF0Y2ggYWdhaW5zdC5cclxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIG1hdGNoaW5nIHRoZSByb290IHByb3BlcnR5IG5hbWUgYW5kIGFycmF5IHByb3BlcnR5IG5hbWUgKGlmIHByb3ZpZGVkKS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRPYmplY3RGb3JQcm9wZXJ0eTxUPihyb290T2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IFQgfSwgcm9vdFByb3BlcnR5TmFtZTogc3RyaW5nLCBhcnJheVByb3BlcnR5TmFtZT86IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogVCB9IHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogVCB9ID0ge307XHJcblxyXG4gICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcm9vdCBvYmplY3QgKi9cclxuICAgICAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiByb290T2JqZWN0KSB7XHJcbiAgICAgICAgICAgIC8qIFNraXAgcHJvcGVydGllcyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgcm9vdFByb3BlcnR5TmFtZSBvciBhcnJheVByb3BlcnR5TmFtZSAqL1xyXG4gICAgICAgICAgICBpZiAoIXByb3BOYW1lLnN0YXJ0c1dpdGgocm9vdFByb3BlcnR5TmFtZSkgJiYgKCFhcnJheVByb3BlcnR5TmFtZSB8fCAhcHJvcE5hbWUuc3RhcnRzV2l0aChhcnJheVByb3BlcnR5TmFtZSkpKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogRXh0cmFjdCB0aGUgc3BsaXQgcHJvcGVydHkgbmFtZSAqL1xyXG4gICAgICAgICAgICBsZXQgc3BsaXRQcm9wID0gcHJvcE5hbWUuc3BsaXQoXCIuXCIsIDIpWzFdO1xyXG5cclxuICAgICAgICAgICAgLyogSWYgc3BsaXRQcm9wIGlzIHVuZGVmaW5lZCwgY29udGludWUgdG8gdGhlIG5leHQgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgaWYgKCFzcGxpdFByb3ApIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSByZXN1bHQgb2JqZWN0ICovXHJcbiAgICAgICAgICAgIHJlc3VsdFtzcGxpdFByb3BdID0gcm9vdE9iamVjdFtwcm9wTmFtZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHJvb3QgcHJvcGVydHkgbmFtZSBmcm9tIHRoZSBnaXZlbiBhcnJheSBvZiBwcm9wZXJ0aWVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgYXJyYXkgb2YgcHJvcGVydGllcyB0byBzZWFyY2guXHJcbiAgICAgKiBAcGFyYW0gcm9vdFByb3BlcnR5TmFtZSBUaGUgcm9vdCBwcm9wZXJ0eSBuYW1lIHRvIG1hdGNoIGFnYWluc3QuXHJcbiAgICAgKiBAcGFyYW0gaXNJZ25vcmVQcm9wIE9wdGlvbmFsLiBJbmRpY2F0ZXMgd2hldGhlciB0byBpbmNsdWRlIHRoZSByb290IHByb3BlcnR5IGl0c2VsZiBhcyBhIHByb3BlcnR5LlxyXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFByb3BzKHByb3BlcnRpZXM6IHN0cmluZ1tdLCByb290UHJvcGVydHlOYW1lOiBzdHJpbmcsIGlzSWdub3JlUHJvcDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IHByb3BzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgKi9cclxuICAgICAgICBmb3IgKGxldCBwcm9wIG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHByb3BlcnR5IGNvbnRhaW5zIHRoZSByb290UHJvcGVydHlOYW1lICovXHJcbiAgICAgICAgICAgIGlmIChwcm9wLmluZGV4T2Yocm9vdFByb3BlcnR5TmFtZSkgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzcGxpdFByb3BzID0gcHJvcC5zcGxpdChcIi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGhhcyB0d28gcGFydHMsIGFkZCB0aGUgc2Vjb25kIHBhcnQgdG8gdGhlIHByb3BzIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICBpZiAoc3BsaXRQcm9wcy5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goc3BsaXRQcm9wc1sxXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGhhcyBtb3JlIHRoYW4gdHdvIHBhcnRzLCBqb2luIHRoZSBwYXJ0cyBhZnRlciB0aGUgZmlyc3Qgb25lIGFuZCBhZGQgdG8gdGhlIHByb3BzIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzcGxpdFByb3BzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzcGxpdFByb3BzLnNwbGljZSgwLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHNwbGl0UHJvcHMuam9pbihcIi5cIikpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIElmIGlzSWdub3JlUHJvcCBpcyB0cnVlIGFuZCB0aGUgcm9vdCBwcm9wZXJ0eSBpdHNlbGYgaXMgcHJlc2VudCBpbiB0aGUgcHJvcGVydGllcyBhcnJheSwgYWRkICc6c2VsZjonIHRvIHRoZSBwcm9wcyBhcnJheSAqL1xyXG4gICAgICAgIGlmIChpc0lnbm9yZVByb3AgJiYgcHJvcGVydGllcy5maWx0ZXIoeCA9PiB4ID09IHJvb3RQcm9wZXJ0eU5hbWUucmVwbGFjZSgnLicsICcnKSkubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgcHJvcHMucHVzaCgnOnNlbGY6Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJvcHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgZm9ybSBncm91cCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgbW9kZWwsIGVudGl0eSBvYmplY3QsIGFuZCBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBvciB0eXBlIGRlZmluaXRpb24gdG8gY3JlYXRlIHRoZSBmb3JtIGdyb3VwIGZyb20uXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IE9wdGlvbmFsLiBUaGUgZW50aXR5IG9iamVjdCBmb3Igd2hpY2ggdGhlIGZvcm0gZ3JvdXAgaXMgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gT3B0aW9uYWwuIFRoZSBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbiB0byBjdXN0b21pemUgdGhlIGZvcm0gZ3JvdXAgY3JlYXRpb24uXHJcbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBSeEZvcm1Hcm91cCwgRm9ybUdyb3VwLCBvciBBcHBGb3JtR3JvdXA8VD4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmb3JtR3JvdXA8VD4obW9kZWw6IFR5cGU8VD4gfCB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBlbnRpdHlPYmplY3Q/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24/OiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pOiBSeEZvcm1Hcm91cCB8IEZvcm1Hcm91cCB8IEFwcEZvcm1Hcm91cDxUPiB7XHJcbiAgICAgICAgLyogUmV0cmlldmVzIG5lY2Vzc2FyeSBkYXRhIGZyb20gdGhlIHByb3ZpZGVkIG1vZGVsLCBlbnRpdHkgb2JqZWN0LCBhbmQgZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24gdG8gY3JlYXRlIGEgZm9ybSBncm91cCAqL1xyXG4gICAgICAgIGxldCBqc29uID0gdGhpcy5nZXRPYmplY3QobW9kZWwsIGVudGl0eU9iamVjdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKTtcclxuICAgICAgICBtb2RlbCA9IGpzb24ubW9kZWw7XHJcbiAgICAgICAgZW50aXR5T2JqZWN0ID0ganNvbi5lbnRpdHlPYmplY3Q7XHJcblxyXG4gICAgICAgIC8qIFxyXG4gICAgICAgICAqIElmIHRoZSBlbnRpdHkgb2JqZWN0J3MgY29uc3RydWN0b3IgZGlmZmVycyBmcm9tIHRoZSBtb2RlbCdzIGNvbnN0cnVjdG9yIGFuZCBmb3JtR3JvdXAgaXMgbm90IHByZXZpb3VzbHkgY2FsbGVkLFxyXG4gICAgICAgICAqIHVwZGF0ZSB0aGUgZW50aXR5IG9iamVjdCB0byBtYXRjaCB0aGUgbW9kZWwuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGVudGl0eU9iamVjdCEuY29uc3RydWN0b3IgIT0gbW9kZWwgJiYgIXRoaXMuaXNHcm91cENhbGxlZCkge1xyXG4gICAgICAgICAgICBlbnRpdHlPYmplY3QgPSBqc29uLmVudGl0eU9iamVjdCA9IHRoaXMudXBkYXRlT2JqZWN0KG1vZGVsLCBqc29uLmVudGl0eU9iamVjdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gPSBqc29uLmZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjtcclxuXHJcbiAgICAgICAgLyogRXh0cmFjdCBleHByZXNzaW9ucyBmcm9tIHRoZSBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBpZiBwcm92aWRlZC4gKi9cclxuICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdEV4cHJlc3Npb25zKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBHZXQgdGhlIGNvbnRhaW5lciBmb3IgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZSBtb2RlbCBhbmQgZW50aXR5IG9iamVjdC4gKi9cclxuICAgICAgICBsZXQgaW5zdGFuY2VDb250YWluZXI6IEluc3RhbmNlQ29udGFpbmVyID0gdGhpcy5nZXRJbnN0YW5jZUNvbnRhaW5lcihtb2RlbCwgZW50aXR5T2JqZWN0KTtcclxuXHJcbiAgICAgICAgLyogQ2hlY2sgYW5kIGFwcGx5IGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmb3Igb2JqZWN0IHByb3BlcnRpZXMuICovXHJcbiAgICAgICAgdGhpcy5jaGVja09iamVjdFByb3BBZGRpdGlvbmFsVmFsaWRhdGlvbihpbnN0YW5jZUNvbnRhaW5lciwgZW50aXR5T2JqZWN0LCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hKTtcclxuXHJcbiAgICAgICAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgZm9yIGZvcm0gZ3JvdXAgY3JlYXRpb24uICovXHJcbiAgICAgICAgbGV0IGZvcm1Hcm91cE9iamVjdCA9IHt9O1xyXG4gICAgICAgIGxldCBleHRlbmRlZFByb3BlcnRpZXMgPSB7fTtcclxuICAgICAgICB2YXIgYWRkaXRpb25hbFZhbGlkYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IFByb3BWYWxpZGF0aW9uQ29uZmlnIH0gPSB7fTtcclxuXHJcbiAgICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgaW5zdGFuY2UgY29udGFpbmVyLiAqL1xyXG4gICAgICAgIGluc3RhbmNlQ29udGFpbmVyLnByb3BlcnRpZXM/LmZvckVhY2gocHJvcGVydHkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaXNJbmNsdWRlUHJvcCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGJhc2VkIG9uIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGV4Y2x1ZGVkIGJhc2VkIG9uIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5leGNsdWRlUHJvcHMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmV4Y2x1ZGVQcm9wcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5leGNsdWRlUHJvcHMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKSA9PSAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiBkeW5hbWljIHZhbGlkYXRpb24gaXMgcHJvdmlkZWQgaW4gdGhlIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxWYWxpZGF0aW9ucyA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGJhc2VkIG9uIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pbmNsdWRlUHJvcHMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmluY2x1ZGVQcm9wcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pbmNsdWRlUHJvcHMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKSAhPSAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB1bmRlZmluZWQgcHJvcGVydGllcyBzaG91bGQgYmUgaWdub3JlZCBiYXNlZCBvbiBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbi4gKi9cclxuICAgICAgICAgICAgICAgIGlmIChmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaWdub3JlVW5kZWZpbmVkUHJvcHMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmlnbm9yZVVuZGVmaW5lZFByb3BzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpc0luY2x1ZGVQcm9wID0gIShcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkucHJvcGVydHlUeXBlID09IFBST1BFUlRZICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICFSZWdleFZhbGlkYXRvci5pc05vdEJsYW5rKGpzb24uZW50aXR5T2JqZWN0W3Byb3BlcnR5Lm5hbWVdKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaWdub3JlVW5kZWZpbmVkUHJvcHMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKSAhPT0gLTEgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pZ25vcmVVbmRlZmluZWRQcm9wcy5pbmRleE9mKFwiOnNlbGY6XCIpICE9PSAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lmlnbm9yZSkge1xyXG4gICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9ICFwcm9wZXJ0eS5pZ25vcmUuY2FsbChqc29uLmVudGl0eU9iamVjdCwganNvbi5lbnRpdHlPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkLCBjcmVhdGUgZm9ybSBjb250cm9scywgZm9ybSBncm91cHMsIG9yIGZvcm0gYXJyYXlzIGJhc2VkIG9uIGl0cyB0eXBlLiAqL1xyXG4gICAgICAgICAgICBpZiAoaXNJbmNsdWRlUHJvcCkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFBST1BFUlRZOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGFscmVhZHkgYSBmb3JtIGNvbnRyb2wsIGNyZWF0ZSBvbmUgd2l0aCBhcHByb3ByaWF0ZSB2YWxpZGF0b3JzIGFuZCBvcHRpb25zICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSBpbnN0YW5jZW9mIEZvcm1Db250cm9sIHx8IChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IHByb3BlcnR5IHZhbGlkYXRvcnMgYmFzZWQgb24gYW5ub3RhdGlvbnMuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlWYWxpZGF0b3JzID0gaW5zdGFuY2VDb250YWluZXIucHJvcGVydHlBbm5vdGF0aW9ucy5maWx0ZXIodCA9PiB0LnByb3BlcnR5TmFtZSA9PSBwcm9wZXJ0eS5uYW1lICYmIHQuaXNWYWxpZGF0b3IpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QgdXBkYXRlT24gY29uZmlndXJhdGlvbiBiYXNlZCBvbiBhbm5vdGF0aW9ucy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVPbiA9IGluc3RhbmNlQ29udGFpbmVyLnByb3BlcnR5QW5ub3RhdGlvbnMuZmlsdGVyKHQgPT4gdC5wcm9wZXJ0eU5hbWUgPT0gcHJvcGVydHkubmFtZSAmJiAhdC5pc1ZhbGlkYXRvciAmJiB0LmFubm90YXRpb25UeXBlID09PSBcInVwZGF0ZU9uXCIpWzBdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbml0aXplIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzYW5pdGl6ZVZhbHVlID0gc3VwZXIuc2FuaXRpemVWYWx1ZShpbnN0YW5jZUNvbnRhaW5lciwgcHJvcGVydHkubmFtZSwgc3VwZXIuZ2V0RGVmYXVsdFZhbHVlKHByb3BlcnR5LCAoZW50aXR5T2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0sIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEpLCBqc29uLmVudGl0eU9iamVjdCwgT2JqZWN0LmFzc2lnbih7fSwganNvbi5lbnRpdHlPYmplY3QpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdW5kZWZpbmVkIGFuZCB0aGVyZSBpcyBhIHNhbml0aXplZCB2YWx1ZSwgYXNzaWduIGl0LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9PT0gdW5kZWZpbmVkICYmIHNhbml0aXplVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW50aXR5T2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gPSBzYW5pdGl6ZVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBmb3JtIGNvbnRyb2wgdmFsaWRhdG9ycy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWxpZGF0b3JzID0gdGhpcy5hZGRGb3JtQ29udHJvbChwcm9wZXJ0eSwgcHJvcGVydHlWYWxpZGF0b3JzLCBhZGRpdGlvbmFsVmFsaWRhdGlvbnNbcHJvcGVydHkubmFtZV0sIGluc3RhbmNlQ29udGFpbmVyLCBlbnRpdHlPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmluZSBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgaW5jbHVkaW5nIHZhbGlkYXRvcnMgYW5kIGFzeW5jIHZhbGlkYXRvcnMuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWJzdHJhY3RDb250cm9sT3B0aW9uczogQWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHsgdmFsaWRhdG9yczogdmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzOiB0aGlzLmFkZEFzeW5jVmFsaWRhdGlvbihwcm9wZXJ0eSwgcHJvcGVydHlWYWxpZGF0b3JzLCBhZGRpdGlvbmFsVmFsaWRhdGlvbnNbcHJvcGVydHkubmFtZV0pIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0cmlldmUgYWRkaXRpb25hbCBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgYmFzZWQgb24gcHJvcGVydHkgbmFtZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0Q29udHJvbE9wdGlvbnMgPSB0aGlzLmdldEFic3RyYWN0Q29udHJvbE9wdGlvbnMocHJvcGVydHkubmFtZSwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISwgYWJzdHJhY3RDb250cm9sT3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzaWduIHVwZGF0ZU9uIGNvbmZpZ3VyYXRpb24gaWYgYXZhaWxhYmxlLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZU9uICYmICFhYnN0cmFjdENvbnRyb2xPcHRpb25zLnVwZGF0ZU9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucy51cGRhdGVPbiA9IHVwZGF0ZU9uLmNvbmZpZy5ydW5PbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDcmVhdGUgYSBuZXcgZm9ybSBjb250cm9sIGluc3RhbmNlLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gbmV3IFJ4Rm9ybUNvbnRyb2woc2FuaXRpemVWYWx1ZSwgYWJzdHJhY3RDb250cm9sT3B0aW9ucywganNvbi5lbnRpdHlPYmplY3QsIE9iamVjdC5hc3NpZ24oe30sIGpzb24uZW50aXR5T2JqZWN0KSwgcHJvcGVydHkubmFtZSwgaW5zdGFuY2VDb250YWluZXIuc2FuaXRpemVycyFbcHJvcGVydHkubmFtZV0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNOZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGEgZm9ybSBjb250cm9sLCB1c2UgaXRzIGRlZmF1bHQgdmFsdWUuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUdyb3VwT2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gPSBzdXBlci5nZXREZWZhdWx0VmFsdWUocHJvcGVydHksIChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhlIHByb3BlcnR5IGFzIGV4dGVuZGVkICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChleHRlbmRlZFByb3BlcnRpZXMgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBPQkpFQ1RfUFJPUEVSVFk6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3RWYWx1ZSA9IChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhbiBvYmplY3QgYW5kIG5vdCBhIGZvcm0gZ3JvdXAsIHJlY3Vyc2l2ZWx5IGNyZWF0ZSBhIGZvcm0gZ3JvdXAgZm9yIGl0ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RWYWx1ZSAmJiBvYmplY3RWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiAhKG9iamVjdFZhbHVlIGluc3RhbmNlb2YgRm9ybUdyb3VwIHx8IG9iamVjdFZhbHVlIGluc3RhbmNlb2YgUnhGb3JtR3JvdXApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgZmxhZ3MgdG8gaW5kaWNhdGUgbmVzdGVkIGJpbmRpbmcuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTmVzdGVkQmluZGluZyA9IHRoaXMuaXNOZXN0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb25kaXRpb25hbCBvYmplY3QgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgY3VycmVudCBwcm9wZXJ0eSBuYW1lLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlQ29udGFpbmVyICYmIGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcigodDogYW55KSA9PiB0Lm9iamVjdFByb3BOYW1lID09IHByb3BlcnR5Lm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb25kaXRpb25hbCBvYmplY3QgcHJvcGVydGllcyBmb3IgYnVpbGRlciBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHByb3BlcnR5IG5hbWUuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZSAmJiB0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxPYmplY3RQcm9wcy5maWx0ZXIoKHQ6IGFueSkgPT4gdC5vYmplY3RQcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGN1cnJlbnQgZm9ybSBncm91cCBvdGhlciB2YWxpZGF0b3IgaWYgYXZhaWxhYmxlLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BlcnR5Lm5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcGVydHkubmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT2J0YWluIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIG5lc3RlZCBvYmplY3QuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZyA9IHRoaXMuZ2V0VmFsaWRhdG9yQ29uZmlnKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEsIG9iamVjdFZhbHVlLCBgJHtwcm9wZXJ0eS5uYW1lfS5gKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPYnRhaW4gdGhlIGVudGl0eSB0byB1c2UgZm9yIHRoZSBuZXN0ZWQgb2JqZWN0LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVudGl0eSA9IHByb3BlcnR5LmVudGl0eVByb3ZpZGVyID8gcHJvcGVydHkuZW50aXR5UHJvdmlkZXIuY2FsbChlbnRpdHlPYmplY3QpIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENyZWF0ZSBhIGZvcm0gZ3JvdXAgZm9yIHRoZSBuZXN0ZWQgb2JqZWN0LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gdGhpcy5mb3JtR3JvdXAoZW50aXR5IHx8IHByb3BlcnR5LmVudGl0eSB8fCB0aGlzLmdldEVudGl0eShvYmplY3RWYWx1ZSwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISwgcHJvcGVydHkubmFtZSwgdHJ1ZSksIG9iamVjdFZhbHVlLCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBmbGFncyB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIG5lc3RlZCBiaW5kaW5nLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbE9iamVjdFByb3BzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc05lc3RlZEJpbmRpbmcgPSB0aGlzLmlzTmVzdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGEgZm9ybSBncm91cCwgdXNlIGl0IGFzIGlzICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdFZhbHVlIGluc3RhbmNlb2YgRm9ybUdyb3VwIHx8IG9iamVjdFZhbHVlIGluc3RhbmNlb2YgUnhGb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IG9iamVjdFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEFSUkFZX1BST1BFUlRZOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJyYXlPYmplY3RWYWx1ZSA9IChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhbiBhcnJheSBhbmQgbm90IGEgZm9ybSBhcnJheSwgcmVjdXJzaXZlbHkgY3JlYXRlIGEgZm9ybSBhcnJheSBmb3IgaXQgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5T2JqZWN0VmFsdWUgJiYgYXJyYXlPYmplY3RWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmICEoYXJyYXlPYmplY3RWYWx1ZSBpbnN0YW5jZW9mIEZvcm1BcnJheSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBmbGFncyB0byBpbmRpY2F0ZSBuZXN0ZWQgYmluZGluZy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNOZXN0ZWRCaW5kaW5nID0gdGhpcy5pc05lc3RlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBhbiBhcnJheSB0byBob2xkIGZvcm0gZ3JvdXBzIGZvciBlYWNoIHN1Yi1vYmplY3QgaW4gdGhlIGFycmF5LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm1BcnJheUdyb3VwID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVudGl0eSA9IHByb3BlcnR5LmVudGl0eVByb3ZpZGVyID8gcHJvcGVydHkuZW50aXR5UHJvdmlkZXIuY2FsbChlbnRpdHlPYmplY3QpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9iamVjdFZhbGlkYXRpb25Db25maWcgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgb3ZlciBlYWNoIHN1Yi1vYmplY3QgaW4gdGhlIGFycmF5LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViT2JqZWN0IG9mIGFycmF5T2JqZWN0VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29uZGl0aW9uYWwgb2JqZWN0IHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgcHJvcGVydHkgbmFtZSBhbmQgYXJyYXkgaW5kZXguICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlQ29udGFpbmVyICYmIGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbE9iamVjdFByb3BzID0gaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxPYmplY3RQcm9wcy5maWx0ZXIoKHQ6IGFueSkgPT4gdC5vYmplY3RQcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lICYmIHQuYXJyYXlJbmRleCA9PSBpbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlICYmIHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxPYmplY3RQcm9wcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxPYmplY3RQcm9wcy5maWx0ZXIoKHQ6IGFueSkgPT4gdC5vYmplY3RQcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lICYmIHQuYXJyYXlJbmRleCA9PSBpbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGN1cnJlbnQgZm9ybSBncm91cCBvdGhlciB2YWxpZGF0b3IgaWYgYXZhaWxhYmxlLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wZXJ0eS5uYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgPSB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wZXJ0eS5uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9idGFpbiB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzdWItb2JqZWN0LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFZhbGlkYXRpb25Db25maWcgPSB0aGlzLmdldFZhbGlkYXRvckNvbmZpZyhmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hLCBzdWJPYmplY3QsIGAke3Byb3BlcnR5Lm5hbWV9LmAsIGAke3Byb3BlcnR5Lm5hbWV9WyR7aW5kZXh9XS5gKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGEgZm9ybSBncm91cCBmb3IgdGhlIHN1Yi1vYmplY3QgYW5kIGFkZCBpdCB0byB0aGUgZm9ybUFycmF5R3JvdXAgYXJyYXkuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUFycmF5R3JvdXAucHVzaCh0aGlzLmZvcm1Hcm91cChlbnRpdHkgfHwgcHJvcGVydHkuZW50aXR5IHx8IHRoaXMuZ2V0RW50aXR5KHN1Yk9iamVjdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISwgcHJvcGVydHkubmFtZSwgdHJ1ZSksIHN1Yk9iamVjdCwgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZykpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIGluZGV4LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGNvbmRpdGlvbmFsIG9iamVjdCBwcm9wZXJ0aWVzIGFuZCBidWlsZGVyIGNvbmZpZ3VyYXRpb24gY29uZGl0aW9uYWwgb2JqZWN0IHByb3BlcnRpZXMuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbE9iamVjdFByb3BzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29uZmlndXJhdGlvbkNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPYnRhaW4gYWJzdHJhY3QgY29udHJvbCBvcHRpb25zIGZvciB0aGUgcHJvcGVydHkuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHRoaXMuZ2V0QWJzdHJhY3RDb250cm9sT3B0aW9ucyhwcm9wZXJ0eS5uYW1lLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hLCB7fSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGEgbmV3IFJ4Rm9ybUFycmF5IHVzaW5nIHRoZSBhcnJheU9iamVjdFZhbHVlIGFuZCB0aGUgZm9ybUFycmF5R3JvdXAsIGFsb25nIHdpdGggdGhlIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IG5ldyBSeEZvcm1BcnJheShhcnJheU9iamVjdFZhbHVlLCBmb3JtQXJyYXlHcm91cCwgYWJzdHJhY3RDb250cm9sT3B0aW9ucywgbnVsbCwgcHJvcGVydHkuYXJyYXlDb25maWcpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGF1dG9JbnN0YW5jZVB1c2ggaXMgZW5hYmxlZCwgb3ZlcnJpZGUgdGhlIHB1c2ggYW5kIHNwbGljZSBtZXRob2RzIG9mIHRoZSBhcnJheU9iamVjdFZhbHVlIHRvIG1hbmFnZSBmb3JtIGdyb3VwcyBkeW5hbWljYWxseS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWFjdGl2ZUZvcm1Db25maWcuYXV0b0luc3RhbmNlUHVzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5T2JqZWN0VmFsdWUucHVzaCA9IChpbnN0YW5jZTogYW55W10pOiBudW1iZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ybUdyb3VwID0gdGhpcy5mb3JtR3JvdXAoaW5zdGFuY2UuY29uc3RydWN0b3IsIGluc3RhbmNlLCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnISk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXS5wdXNoKGZvcm1Hcm91cCwgeyBpc0FkZGVkSW5zdGFuY2U6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5T2JqZWN0VmFsdWUuc3BsaWNlID0gKHN0YXJ0LCBkZWxldGVDb3VudCk6IGFueVtdID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuZCA9IChzdGFydCArIGRlbGV0ZUNvdW50ISkgLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXS5yZW1vdmVBdChpLCB7IGlzUmVtb3ZlZEluc3RhbmNlOiB0cnVlIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGZsYWdzIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgbmVzdGVkIGJpbmRpbmcuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTmVzdGVkQmluZGluZyA9IHRoaXMuaXNOZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgYSBmb3JtIGFycmF5LCB1c2UgaXQgYXMgaXMgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJyYXlPYmplY3RWYWx1ZSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gYXJyYXlPYmplY3RWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVzIGNyZWF0aW5nIGEgYmxhbmsgZm9ybSBhcnJheSwgY3JlYXRlIG9uZSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eS5hcnJheUNvbmZpZyAmJiBwcm9wZXJ0eS5hcnJheUNvbmZpZy5jcmVhdGVCbGFuaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gbmV3IFJ4Rm9ybUFycmF5KFtdLCBbXSwgbnVsbCwgbnVsbCwgcHJvcGVydHkuYXJyYXlDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvKiBJZiBubyBuZXN0ZWQgZm9ybSBncm91cHMgb3IgYXJyYXlzIGFyZSBjcmVhdGVkLCByZXNldCBjb25kaXRpb25hbCB2YWxpZGF0aW9uIGluc3RhbmNlIGFuZCByZWxhdGVkIHByb3BlcnRpZXMuICovXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTmVzdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29uZmlndXJhdGlvbkNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFNldCBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgZm9yIHRoZSBmb3JtIGdyb3VwIGJhc2VkIG9uIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgIGxldCBhYnN0cmFjdENvbnRyb2xPcHRpb25zOiBBYnN0cmFjdENvbnRyb2xPcHRpb25zID0ge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzOiBbXSxcclxuICAgICAgICAgICAgYXN5bmNWYWxpZGF0b3JzOiBbXSxcclxuICAgICAgICAgICAgdXBkYXRlT246IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9ucyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9uc1snZ2xvYmFsJ11cclxuICAgICAgICAgICAgICAgID8gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbJ2dsb2JhbCddXHJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qIE9idGFpbiBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgZm9yIHRoZSBnbG9iYWwgcHJvcGVydHkuICovXHJcbiAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHRoaXMuZ2V0QWJzdHJhY3RDb250cm9sT3B0aW9ucyhcImdsb2JhbFwiLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hLCBhYnN0cmFjdENvbnRyb2xPcHRpb25zKTtcclxuXHJcbiAgICAgICAgLyogQ3JlYXRlIGEgbmV3IFJ4Rm9ybUdyb3VwIHVzaW5nIHRoZSBtb2RlbCwgZW50aXR5IG9iamVjdCwgZm9ybUdyb3VwT2JqZWN0LCBhbmQgYWJzdHJhY3QgY29udHJvbCBvcHRpb25zLiAqL1xyXG4gICAgICAgIGxldCBmb3JtR3JvdXAgPSBuZXcgUnhGb3JtR3JvdXAoanNvbi5tb2RlbCwganNvbi5lbnRpdHlPYmplY3QsIGZvcm1Hcm91cE9iamVjdCwgYWJzdHJhY3RDb250cm9sT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIC8qIElmIGV4cGVyaW1lbnRhbCBtb2RlIGlzIGVuYWJsZWQsIGFzc2lnbiB0aGUgZm9ybSBncm91cCB0byB0aGUgZW50aXR5IG9iamVjdCBhbmQgb3ZlcnJpZGUgcHJvcGVydGllcyBpZiBuZWVkZWQuICovXHJcbiAgICAgICAgaWYgKGRlZmF1bHRDb250YWluZXIuaXNFeHBlcmltZW50YWwpIHtcclxuICAgICAgICAgICAganNvbi5lbnRpdHlPYmplY3RbXCJmb3JtR3JvdXBcIl0gPSBmb3JtR3JvdXA7XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVQcm9wZXJ0aWVzKGZvcm1Hcm91cCwganNvbi5lbnRpdHlPYmplY3QsIGV4dGVuZGVkUHJvcGVydGllcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBJZiBub3QgaW4gbmVzdGVkIGJpbmRpbmcgbW9kZSBhbmQgZm9ybUdyb3VwIGlzIG5vdCBwcmV2aW91c2x5IGNhbGxlZCwgcmVmcmVzaCBkaXNhYmxlIHN0YXR1cyBvZiB0aGUgZm9ybSBncm91cC4gKi9cclxuICAgICAgICBpZiAoIXRoaXMuaXNOZXN0ZWRCaW5kaW5nICYmICF0aGlzLmlzR3JvdXBDYWxsZWQpIHtcclxuICAgICAgICAgICAgZm9ybUdyb3VwLnJlZnJlc2hEaXNhYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZm9ybUdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3ZlcnJpZGVzIHByb3BlcnRpZXMgaW4gdGhlIGZvcm0gZ3JvdXAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGVudGl0eSBvYmplY3QgYW5kIHByb3BlcnRpZXMuXHJcbiAgICAgKiBAcGFyYW0gZm9ybUdyb3VwIFRoZSBSeEZvcm1Hcm91cCBpbnN0YW5jZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzLlxyXG4gICAgICogQHBhcmFtIGVudGl0eU9iamVjdCBUaGUgZW50aXR5IG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgdG8gb3ZlcnJpZGUgYXMga2V5cy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvdmVycmlkZVByb3BlcnRpZXMoZm9ybUdyb3VwOiBSeEZvcm1Hcm91cCwgZW50aXR5T2JqZWN0OiBhbnksIHByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9KSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcGVydGllcykuZm9yRWFjaCh0ID0+IHRoaXMub3ZlcnJpZGVQcm9wKGVudGl0eU9iamVjdCwgdCwgZm9ybUdyb3VwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucyBmb3IgYSBnaXZlbiBjb250cm9sIG5hbWUuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb250cm9sLlxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGNvbnRhaW5pbmcgdGhlIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucy5cclxuICAgICAqIEBwYXJhbSBhYnN0cmFjdENvbnRyb2xPcHRpb25zIFRoZSBleGlzdGluZyBBYnN0cmFjdENvbnRyb2xPcHRpb25zLlxyXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgQWJzdHJhY3RDb250cm9sT3B0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRBYnN0cmFjdENvbnRyb2xPcHRpb25zKG5hbWU6IHN0cmluZywgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uOiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGFic3RyYWN0Q29udHJvbE9wdGlvbnM6IEFic3RyYWN0Q29udHJvbE9wdGlvbnMpIHtcclxuICAgICAgICAvKiBVcGRhdGUgdXBkYXRlT24gb3B0aW9uIGlmIGRlZmluZWQgaW4gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9ucyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9uc1tuYW1lXSkge1xyXG4gICAgICAgICAgICBhYnN0cmFjdENvbnRyb2xPcHRpb25zLnVwZGF0ZU9uID0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbbmFtZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBDaGVjayBpZiBjb250cm9sT3B0aW9ucyBhcmUgZGVmaW5lZCBpbiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICBjb25zdCBjb250cm9sT3B0aW9ucyA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiA/IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5iYXNlQWJzdHJhY3RDb250cm9sT3B0aW9ucyA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xPcHRpb25zICYmIGNvbnRyb2xPcHRpb25zW25hbWVdKSB7XHJcbiAgICAgICAgICAgIC8qIFVwZGF0ZSB1cGRhdGVPbiBvcHRpb24gZnJvbSBjb250cm9sT3B0aW9ucyBpZiBkZWZpbmVkICovXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sT3B0aW9uc1tuYW1lXS51cGRhdGVPbikge1xyXG4gICAgICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucy51cGRhdGVPbiA9IGNvbnRyb2xPcHRpb25zW25hbWVdLnVwZGF0ZU9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgdmFsaWRhdG9ycyBmcm9tIGNvbnRyb2xPcHRpb25zIGlmIGRlZmluZWQgKi9cclxuICAgICAgICAgICAgaWYgKGNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxWYWxpZGF0b3JGbltdPmNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKHZhbGlkYXRvciA9PiAoPFZhbGlkYXRvckZuW10+YWJzdHJhY3RDb250cm9sT3B0aW9ucy52YWxpZGF0b3JzKS5wdXNoKHZhbGlkYXRvcikpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICg8VmFsaWRhdG9yRm5bXT5hYnN0cmFjdENvbnRyb2xPcHRpb25zLnZhbGlkYXRvcnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5wdXNoKDxWYWxpZGF0b3JGbj5jb250cm9sT3B0aW9uc1tuYW1lXS52YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQWRkIGFzeW5jIHZhbGlkYXRvcnMgZnJvbSBjb250cm9sT3B0aW9ucyBpZiBkZWZpbmVkICovXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sT3B0aW9uc1tuYW1lXS5hc3luY1ZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xPcHRpb25zW25hbWVdLmFzeW5jVmFsaWRhdG9ycykpIHtcclxuICAgICAgICAgICAgICAgICAgICAoPFZhbGlkYXRvckZuW10+Y29udHJvbE9wdGlvbnNbbmFtZV0uYXN5bmNWYWxpZGF0b3JzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCh2YWxpZGF0b3IgPT4gKDxWYWxpZGF0b3JGbltdPmFic3RyYWN0Q29udHJvbE9wdGlvbnMuYXN5bmNWYWxpZGF0b3JzKS5wdXNoKHZhbGlkYXRvcikpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICg8VmFsaWRhdG9yRm5bXT5hYnN0cmFjdENvbnRyb2xPcHRpb25zLmFzeW5jVmFsaWRhdG9ycylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnB1c2goPFZhbGlkYXRvckZuPmNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYWJzdHJhY3RDb250cm9sT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRlcyBhIHByb3BlcnR5IG9uIHRoZSBlbnRpdHkgb2JqZWN0IHdpdGggY3VzdG9tIGdldHRlcnMgYW5kIHNldHRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbnRpdHlPYmplY3QgVGhlIGVudGl0eSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmVlZHMgdG8gYmUgb3ZlcnJpZGRlbi5cclxuICAgICAqIEBwYXJhbSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgb3ZlcnJpZGRlbi5cclxuICAgICAqIEBwYXJhbSBmb3JtR3JvdXAgVGhlIFJ4Rm9ybUdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXR5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvdmVycmlkZVByb3AoZW50aXR5T2JqZWN0OiBhbnksIHByb3BOYW1lOiBzdHJpbmcsIGZvcm1Hcm91cDogUnhGb3JtR3JvdXApIHtcclxuICAgICAgICAvKiBHZXQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgYW5kIGN1cnJlbnQgdmFsdWUgKi9cclxuICAgICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKGVudGl0eU9iamVjdCksIHByb3BOYW1lKTtcclxuICAgICAgICBsZXQgdmFsdWUgPSBlbnRpdHlPYmplY3RbcHJvcE5hbWVdO1xyXG4gICAgICAgIGxldCBvbGRWYWx1ZTogYW55ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyogRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIGN1c3RvbSBnZXR0ZXJzIGFuZCBzZXR0ZXJzICovXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVudGl0eU9iamVjdCwgcHJvcE5hbWUsIHtcclxuICAgICAgICAgICAgLyogQ3VzdG9tIGdldHRlciAqL1xyXG4gICAgICAgICAgICBnZXQ6ICgpID0+IHsgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLmdldCEuY2FsbChlbnRpdHlPYmplY3QpIDogdmFsdWUgfSxcclxuICAgICAgICAgICAgLyogQ3VzdG9tIHNldHRlciAqL1xyXG4gICAgICAgICAgICBzZXQ6ICh2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHY7XHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB2YWx1ZSBoYXMgY2hhbmdlZCAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IHYpIHtcclxuICAgICAgICAgICAgICAgICAgICAvKiBDYWxsIHRoZSBvcmlnaW5hbCBzZXR0ZXIgaWYgZGVmaW5lZCAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0IS5jYWxsKGVudGl0eU9iamVjdCwgdik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBjb250cm9sIGluIHRoZSBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtR3JvdXAuY2hhbmdpbmcgJiYgZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtR3JvdXAuY29udHJvbHNbcHJvcE5hbWVdLnNldFZhbHVlKHYpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgb2xkIHZhbHVlICovXHJcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZSA9IHY7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
1035
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtZm9ybS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvZm9ybS12YWxpZGF0b3JzL3NlcnZpY2VzL3J4LWZvcm0tYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBNEMsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkksT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN2SixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU9yRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDekUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDdEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUV2RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFD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QUMsRUFBRSxDQUFDO29CQUNoQix5Q0FBeUM7b0JBQ3pDLElBQUksVUFBVSxFQUFFLENBQUM7d0JBQ2IsVUFBVSxDQUFDLEdBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMxQyxDQUFDO29CQUNELHdEQUF3RDtvQkFDeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO3dCQUN0RCxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0MsQ0FBQztnQkFDTCxDQUFDO2dCQUNELDBCQUEwQjtnQkFDMUIsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNqQixDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQzswSEEzcENRLGFBQWE7OEhBQWIsYUFBYTs7MkZBQWIsYUFBYTtrQkFEekIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2xPcHRpb25zLCBBc3luY1ZhbGlkYXRvckZuLCBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL2Z1bmN0aW9ucy91dGlsc1wiO1xyXG5pbXBvcnQgeyBBUlJBWV9QUk9QRVJUWSwgQk9PTEVBTiwgRlVOQ1RJT05fU1RSSU5HLCBNT0RFTCwgTlVNQkVSLCBPQkpFQ1RfUFJPUEVSVFksIE9CSkVDVF9TVFJJTkcsIFBST1BFUlRZLCBSWF9XRUJfVkFMSURBVE9SLCBTVFJJTkcgfSBmcm9tIFwiLi4vY29uc3RcIjtcclxuaW1wb3J0IHsgQVBQX1ZBTElEQVRPUlMgfSBmcm9tICcuLi9jb25zdC9hcHAtdmFsaWRhdG9ycy5jb25zdCc7XHJcbmltcG9ydCB7IEFubm90YXRpb25UeXBlcyB9IGZyb20gXCIuLi9jb3JlL2Fubm90YXRpb24tdHlwZXNcIjtcclxuaW1wb3J0IHsgZGVmYXVsdENvbnRhaW5lciB9IGZyb20gJy4uL2NvcmUvZGVmYXVsdC1jb250YWluZXInO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzXCI7XHJcbmltcG9ydCB7IERlY29yYXRvckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzL2RlY29yYXRvci1jb25maWd1cmF0aW9uXCI7XHJcbmltcG9ydCB7IEluc3RhbmNlQ29udGFpbmVyIH0gZnJvbSBcIi4uL21vZGVscy9pbnN0YW5jZS1jb250YWluZXJcIjtcclxuaW1wb3J0IHsgSUFic3RyYWN0Q29udHJvbCB9IGZyb20gXCIuLi9tb2RlbHMvaW50ZXJmYWNlL2ktYWJzdHJhY3QtY29udHJvbFwiO1xyXG5pbXBvcnQgeyBBcHBGb3JtR3JvdXAgfSBmcm9tICcuLi9tb2RlbHMvaW50ZXJmYWNlL2ktZm9ybS1ncm91cCc7XHJcbmltcG9ydCB7IFByb3BWYWxpZGF0aW9uQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9wcm9wLXZhbGlkYXRpb24tY29uZmlnXCI7XHJcbmltcG9ydCB7IFByb3BlcnR5SW5mbyB9IGZyb20gXCIuLi9tb2RlbHMvcHJvcGVydHktaW5mb1wiO1xyXG5pbXBvcnQgeyBhbmRWYWxpZGF0b3IgfSBmcm9tICcuLi9yZWFjdGl2ZS1mb3JtLXZhbGlkYXRvcnMvYW5kLnZhbGlkYXRvcic7XHJcbmltcG9ydCB7IGNvbmRpdGlvbmFsQ2hhbmdlVmFsaWRhdG9yIH0gZnJvbSBcIi4uL3JlYWN0aXZlLWZvcm0tdmFsaWRhdG9ycy9jb25kaXRpb25hbC1jaGFuZ2UudmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7IG5vdFZhbGlkYXRvciB9IGZyb20gJy4uL3JlYWN0aXZlLWZvcm0tdmFsaWRhdG9ycy9ub3QudmFsaWRhdG9yJztcclxuaW1wb3J0IHsgb3JWYWxpZGF0b3IgfSBmcm9tICcuLi9yZWFjdGl2ZS1mb3JtLXZhbGlkYXRvcnMvb3IudmFsaWRhdG9yJztcclxuaW1wb3J0IHsgVHlwZSB9IGZyb20gXCIuLi91dGlsXCI7XHJcbmltcG9ydCB7IExpbnEgfSBmcm9tICcuLi91dGlsL2xpbnEnO1xyXG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1Db25maWcgfSBmcm9tICcuLi91dGlsL3JlYWN0aXZlLWZvcm0tY29uZmlnJztcclxuaW1wb3J0IHsgUmVnZXhWYWxpZGF0b3IgfSBmcm9tIFwiLi4vdXRpbC9yZWdleC12YWxpZGF0b3JcIjtcclxuaW1wb3J0IHsgQmFzZUZvcm1CdWlsZGVyIH0gZnJvbSAnLi9iYXNlLWZvcm0tYnVpbGRlcic7XHJcbmltcG9ydCB7IFJ4Rm9ybUNvbnRyb2wgfSBmcm9tICcuL2Zvcm0tY29udHJvbCc7XHJcbmltcG9ydCB7IFJ4Rm9ybUFycmF5IH0gZnJvbSAnLi9yeC1mb3JtLWFycmF5JztcclxuaW1wb3J0IHsgUnhGb3JtR3JvdXAgfSBmcm9tICcuL3J4LWZvcm0tZ3JvdXAnO1xyXG5cclxuY29uc3QgTE9HSUNBTF9WQUxJREFUT1JTOiB7IFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uIH0gPSB7IGFuZDogYW5kVmFsaWRhdG9yLCBvcjogb3JWYWxpZGF0b3IsIG5vdDogbm90VmFsaWRhdG9yIH1cclxuY29uc3QgQVNZTkM6IHN0cmluZyA9IFwiYXN5bmNcIlxyXG5jb25zdCBFTlRJVFlfT0JKRUNUOiBzdHJpbmcgPSBcImVudGl0eU9iamVjdFwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUnhGb3JtQnVpbGRlciBleHRlbmRzIEJhc2VGb3JtQnVpbGRlciB7XHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IEFycmF5IHRvIHN0b3JlIGNvbmRpdGlvbmFsIG9iamVjdCBwcm9wZXJ0aWVzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uZGl0aW9uYWxPYmplY3RQcm9wczogYW55W10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IE9iamVjdCB0byBzdG9yZSBjb25kaXRpb25hbCB2YWxpZGF0aW9uIGluc3RhbmNlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlOiBhbnkgPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IEFycmF5IHRvIHN0b3JlIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBjb25kaXRpb25hbCBvYmplY3QgcHJvcGVydGllc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wczogYW55W10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IE9iamVjdCB0byBzdG9yZSBmb3JtIGdyb3VwIHByb3BlcnRpZXMgb3RoZXIgdmFsaWRhdG9yc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBmaWVsZDogT2JqZWN0IHRvIHN0b3JlIGN1cnJlbnQgZm9ybSBncm91cCBwcm9wZXJ0aWVzIG90aGVyIHZhbGlkYXRvcnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGZpZWxkOiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBmb3JtIGlzIG5lc3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzTmVzdGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGZpZWxkOiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBmb3JtIGdyb3VwIGlzIGNhbGxlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzR3JvdXBDYWxsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgZmllbGQ6IEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGZvcm0gaXMgbmVzdGVkIGJpbmRpbmdcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc05lc3RlZEJpbmRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgbWV0aG9kOiBHZXRzIHRoZSBpbnN0YW5jZSBjb250YWluZXIgYmFzZWQgb24gdGhlIGluc3RhbmNlIGZ1bmN0aW9uIGFuZCBlbnRpdHkgb2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2VGdW5jIFRoZSBmdW5jdGlvbiB0byBwcm92aWRlIGFuIGluc3RhbmNlIGZyb20uXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IFRoZSBlbnRpdHkgb2JqZWN0IHRvIHVzZS5cclxuICAgICAqIEByZXR1cm5zIFRoZSBwcm92aWRlZCBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0SW5zdGFuY2VDb250YWluZXIoaW5zdGFuY2VGdW5jOiBhbnksIGVudGl0eU9iamVjdDogYW55KTogSW5zdGFuY2VDb250YWluZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhY2VQcm92aWRlcihpbnN0YW5jZUZ1bmMsIGVudGl0eU9iamVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIG1ldGhvZDogRXh0cmFjdHMgZXhwcmVzc2lvbnMgZnJvbSB0aGUgZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24gZm9yIGR5bmFtaWMgdmFsaWRhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gYnVpbGRlci5cclxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGV4dHJhY3RlZCBleHByZXNzaW9ucyBvciBudWxsLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV4dHJhY3RFeHByZXNzaW9ucyhmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb246IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSB8IG51bGwge1xyXG4gICAgICAgIC8qIFxyXG4gICAgICAgICAqIEV4dHJhY3RzIGV4cHJlc3Npb25zIGZyb20gdGhlIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uIGZvciBkeW5hbWljIHZhbGlkYXRpb24uXHJcbiAgICAgICAgICogSWYgZHluYW1pYyB2YWxpZGF0aW9uIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgaXRlcmF0ZSB0aHJvdWdoIGVhY2ggcHJvcGVydHkgYW5kIGRlY29yYXRvci5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uICYmIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGRlY29yYXRvciBpbiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb25bcHJvcGVydHldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2tzIGlmIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBleGlzdHMgZm9yIHRoZSBjdXJyZW50IGRlY29yYXRvciAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmR5bmFtaWNWYWxpZGF0aW9uIGFzIGFueSlbcHJvcGVydHldW2RlY29yYXRvcl0uY29uZGl0aW9uYWxFeHByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QgY29sdW1ucyBmcm9tIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW5zID0gTGlucS5leHByZXNzaW9uQ29sdW1ucygoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmR5bmFtaWNWYWxpZGF0aW9uIGFzIGFueSlbcHJvcGVydHldW2RlY29yYXRvcl0uY29uZGl0aW9uYWxFeHByZXNzaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBjaGFuZ2UgdmFsaWRhdGlvbiBiYXNlZCBvbiB0aGUgZXh0cmFjdGVkIGNvbHVtbiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmFkZENoYW5nZVZhbGlkYXRpb24odGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZSwgcHJvcGVydHksIGNvbHVtbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQWRkcyBhc3luYyB2YWxpZGF0aW9uIHRvIHRoZSBwcm9wZXJ0eSBiYXNlZCBvbiBwcm92aWRlZCB2YWxpZGF0b3JzIGFuZCBjb25maWd1cmF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IGluZm9ybWF0aW9uLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5VmFsaWRhdG9ycyBUaGUgYXJyYXkgb2YgZGVjb3JhdG9yIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgcHJvcGVydHkuXHJcbiAgICAgKiBAcGFyYW0gcHJvcFZhbGlkYXRpb25Db25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHZhbGlkYXRpb24uXHJcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhc3luYyB2YWxpZGF0b3JzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFkZEFzeW5jVmFsaWRhdGlvbihwcm9wZXJ0eTogUHJvcGVydHlJbmZvLCBwcm9wZXJ0eVZhbGlkYXRvcnM6IERlY29yYXRvckNvbmZpZ3VyYXRpb25bXSwgcHJvcFZhbGlkYXRpb25Db25maWc6IFByb3BWYWxpZGF0aW9uQ29uZmlnKSB7XHJcbiAgICAgICAgLyogQ29sbGVjdHMgYXN5bmMgdmFsaWRhdG9ycyBmcm9tIHByb3BlcnR5IHZhbGlkYXRvcnMgYW5kIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIGxldCBhc3luY1ZhbGlkYXRvcnM6IGFueVtdID0gW107XHJcbiAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggcHJvcGVydHkgdmFsaWRhdG9ycyAqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wZXJ0eVZhbGlkYXRvciBvZiBwcm9wZXJ0eVZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0b3IgaXMgYXN5bmMgKi9cclxuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRvci5pc0FzeW5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogUHVzaCBlYWNoIGFzeW5jIHZhbGlkYXRvciBpbnRvIHRoZSBhc3luY1ZhbGlkYXRvcnMgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRvci5jb25maWcuZm9yRWFjaCgodDogYW55KSA9PiB7IGFzeW5jVmFsaWRhdG9ycy5wdXNoKHQpIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJvcFZhbGlkYXRpb25Db25maWcgJiYgKHByb3BWYWxpZGF0aW9uQ29uZmlnIGFzIGFueSlbQVNZTkNdKSB7XHJcbiAgICAgICAgICAgIC8qIEFkZCBhc3luYyB2YWxpZGF0b3JzIGZyb20gcHJvcFZhbGlkYXRpb25Db25maWcgKi9cclxuICAgICAgICAgICAgKHByb3BWYWxpZGF0aW9uQ29uZmlnIGFzIGFueSlbQVNZTkNdLmZvckVhY2goKHQ6IGFueSkgPT4geyBhc3luY1ZhbGlkYXRvcnMucHVzaCh0KSB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFzeW5jVmFsaWRhdG9ycztcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBBZGRzIGZvcm0gY29udHJvbCB2YWxpZGF0b3JzIGJhc2VkIG9uIHByb3BlcnR5IHZhbGlkYXRvcnMgYW5kIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBpbmZvcm1hdGlvbi5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eVZhbGlkYXRvcnMgVGhlIGFycmF5IG9mIGRlY29yYXRvciBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIHByb3BWYWxpZGF0aW9uQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSB2YWxpZGF0aW9uLlxyXG4gICAgICogQHBhcmFtIGluc3RhbmNlIFRoZSBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgb2JqZWN0LlxyXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZm9ybSBjb250cm9sIHZhbGlkYXRvcnMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWRkRm9ybUNvbnRyb2wocHJvcGVydHk6IFByb3BlcnR5SW5mbywgcHJvcGVydHlWYWxpZGF0b3JzOiBEZWNvcmF0b3JDb25maWd1cmF0aW9uW10sIHByb3BWYWxpZGF0aW9uQ29uZmlnOiBQcm9wVmFsaWRhdGlvbkNvbmZpZywgaW5zdGFuY2U6IEluc3RhbmNlQ29udGFpbmVyLCBlbnRpdHk6IGFueSkge1xyXG4gICAgICAgIGxldCB2YWxpZGF0b3JzID0gW107XHJcbiAgICAgICAgbGV0IGNvbHVtbnM6IGFueVtdID0gW107XHJcbiAgICAgICAgLyogQ2hlY2sgaWYgY29uZGl0aW9uYWwgdmFsaWRhdGlvbiBwcm9wcyBhcmUgZGVmaW5lZCBlaXRoZXIgaW4gaW5zdGFuY2Ugb3IgY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgKi9cclxuICAgICAgICBpZiAoKGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzICYmIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BlcnR5Lm5hbWVdKSB8fCAodGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyAmJiB0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BlcnR5Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAvKiBDb2xsZWN0cyBjb25kaXRpb25hbCB2YWxpZGF0aW9uIHByb3BlcnRpZXMgZnJvbSBpbnN0YW5jZSBhbmQgY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgYW5kIGFkZHMgY29uZGl0aW9uYWwgY2hhbmdlIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICBsZXQgcHJvcHM6IGFueVtdID0gW107XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiBjb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyBhcmUgZGVmaW5lZCBpbiBpbnN0YW5jZSBmb3IgdGhlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgIGlmICgoaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgJiYgaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNbcHJvcGVydHkubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXS5mb3JFYWNoKHQgPT4gcHJvcHMucHVzaCh0KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIGNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzIGFyZSBkZWZpbmVkIGluIGNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlIGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgJiYgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXS5mb3JFYWNoKCh0OiBhbnkpID0+IHByb3BzLnB1c2godCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgY29uZGl0aW9uYWwgY2hhbmdlIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goY29uZGl0aW9uYWxDaGFuZ2VWYWxpZGF0b3IocHJvcHMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIENoZWNrIGlmIGNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgb3IgYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzIGFyZSBkZWZpbmVkICovXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcy5sZW5ndGggPiAwIHx8IHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHByb3BDb25kaXRpb25zID0gW107XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiBjb25kaXRpb25hbE9iamVjdFByb3BzIGlzIGRlZmluZWQgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcykge1xyXG4gICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgZm9yIHByb3BlcnRpZXMgbWF0Y2hpbmcgdGhlIGN1cnJlbnQgcHJvcGVydHkgbmFtZSAqL1xyXG4gICAgICAgICAgICAgICAgcHJvcENvbmRpdGlvbnMgPSB0aGlzLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMuZmlsdGVyKHQgPT4gdC5wcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQ2hlY2sgaWYgYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzIGlzIGRlZmluZWQgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzIGZvciBwcm9wZXJ0aWVzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IG5hbWUgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcih0ID0+IHQucHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSkuZm9yRWFjaCh0ID0+IHByb3BDb25kaXRpb25zLnB1c2godCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwcm9wQ29uZGl0aW9ucy5mb3JFYWNoKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgLyogQWRkIHJlZmVyZW5jZSBwcm9wZXJ0eSBuYW1lIHRvIGNvbHVtbnMgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgIGlmICh0LnJlZmVyZW5jZVByb3BOYW1lICYmIGNvbHVtbnMuaW5kZXhPZih0LnJlZmVyZW5jZVByb3BOYW1lKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaCh0LnJlZmVyZW5jZVByb3BOYW1lKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgY29uZGl0aW9uYWwgY2hhbmdlIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goY29uZGl0aW9uYWxDaGFuZ2VWYWxpZGF0b3IoY29sdW1ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggcHJvcGVydHkgdmFsaWRhdG9ycyAqL1xyXG4gICAgICAgIGZvciAobGV0IHByb3BlcnR5VmFsaWRhdG9yIG9mIHByb3BlcnR5VmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsaWRhdG9yLmlzQXN5bmMpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcGVydHlWYWxpZGF0b3IuYW5ub3RhdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvKiBBZGQgcnVsZSB2YWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlcy5ydWxlOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goQVBQX1ZBTElEQVRPUlNbcHJvcGVydHlWYWxpZGF0b3IuYW5ub3RhdGlvblR5cGVdKHByb3BlcnR5VmFsaWRhdG9yLmNvbmZpZywgZW50aXR5KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBBZGQgbG9naWNhbCB2YWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlcy5hbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZXMub3I6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZXMubm90OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goTE9HSUNBTF9WQUxJREFUT1JTW3Byb3BlcnR5VmFsaWRhdG9yLmFubm90YXRpb25UeXBlXShwcm9wZXJ0eVZhbGlkYXRvci5jb25maWcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8qIEFkZCBjdXN0b20gdmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEFQUF9WQUxJREFUT1JTW3Byb3BlcnR5VmFsaWRhdG9yLmFubm90YXRpb25UeXBlXShwcm9wZXJ0eVZhbGlkYXRvci5jb25maWcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmcm9tIHByb3BWYWxpZGF0aW9uQ29uZmlnICovXHJcbiAgICAgICAgaWYgKHByb3BWYWxpZGF0aW9uQ29uZmlnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkaXRpb25hbFZhbGlkYXRpb24odmFsaWRhdG9ycywgcHJvcFZhbGlkYXRpb25Db25maWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogQWRkaXRpb25hbCB2YWxpZGF0aW9uIGZyb20gY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcGVydHkubmFtZV0pIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BlcnR5Lm5hbWVdLmZvckVhY2goKHQ6IGFueSkgPT4geyB2YWxpZGF0b3JzLnB1c2godCk7IH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQWRkcyBhZGRpdGlvbmFsIHZhbGlkYXRpb24gdG8gdGhlIHZhbGlkYXRpb25zIGFycmF5IGJhc2VkIG9uIHByb3BWYWxpZGF0aW9uQ29uZmlnLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdGlvbnMgQW4gYXJyYXkgb2YgZXhpc3RpbmcgdmFsaWRhdGlvbnMuXHJcbiAgICAgKiBAcGFyYW0gcHJvcFZhbGlkYXRpb25Db25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHZhbGlkYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWRkaXRpb25hbFZhbGlkYXRpb24odmFsaWRhdGlvbnM6IGFueVtdLCBwcm9wVmFsaWRhdGlvbkNvbmZpZzogUHJvcFZhbGlkYXRpb25Db25maWcgfCBhbnkpIHtcclxuICAgICAgICBmb3IgKHZhciBjb2wgaW4gQW5ub3RhdGlvblR5cGVzKSB7XHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXJyZW50IGFubm90YXRpb24gdHlwZSBleGlzdHMgYW5kIGl0J3Mgbm90IGEgY3VzdG9tIHZhbGlkYXRvciAqL1xyXG4gICAgICAgICAgICBpZiAocHJvcFZhbGlkYXRpb25Db25maWdbQW5ub3RhdGlvblR5cGVzW2NvbF1dICYmIGNvbCAhPSBcImN1c3RvbVwiKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBBZGQgdmFsaWRhdG9yIGZyb20gQVBQX1ZBTElEQVRPUlMgKi9cclxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25zLnB1c2goQVBQX1ZBTElEQVRPUlNbQW5ub3RhdGlvblR5cGVzW2NvbF1dKHByb3BWYWxpZGF0aW9uQ29uZmlnW0Fubm90YXRpb25UeXBlc1tjb2xdXSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBhbm5vdGF0aW9uIHR5cGUgaXMgY3VzdG9tIGFuZCB0aGUgY3VzdG9tIHZhbGlkYXRvciBleGlzdHMgaW4gdGhlIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgICAgICBlbHNlIGlmIChjb2wgPT0gQW5ub3RhdGlvblR5cGVzLmN1c3RvbSAmJiBwcm9wVmFsaWRhdGlvbkNvbmZpZ1tBbm5vdGF0aW9uVHlwZXNbY29sXV0pIHtcclxuICAgICAgICAgICAgICAgIC8qIEFkZCBjdXN0b20gdmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9ucy5wdXNoKHByb3BWYWxpZGF0aW9uQ29uZmlnW2NvbF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBlbnRpdHkgdHlwZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgb2JqZWN0IGFuZCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGZvciB3aGljaCB0aGUgZW50aXR5IHR5cGUgaXMgcmV0cmlldmVkLlxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gYnVpbGRlci5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIGlzU2FtZU9iamVjdENvbnN0cnVjdG9yIEluZGljYXRlcyBpZiB0aGUgZW50aXR5IHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIG9iamVjdCdzIGNvbnN0cnVjdG9yLlxyXG4gICAgICogQHJldHVybnMgVGhlIGVudGl0eSB0eXBlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEVudGl0eTxUPihvYmplY3Q6IFQsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXNTYW1lT2JqZWN0Q29uc3RydWN0b3I6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIC8qIENoZWNrIGlmIHRoZSBlbnRpdHkgdHlwZSBpcyBkZWZpbmVkIGluIHRoZSBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIGlmIChmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmdlbmVyaWNFbnRpdGllcyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZ2VuZXJpY0VudGl0aWVzW3Byb3BlcnR5TmFtZV0pIHtcclxuICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBlbnRpdHkgdHlwZSBmcm9tIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGUgKi9cclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5nZW5lcmljRW50aXRpZXNbcHJvcGVydHlOYW1lXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFJldHVybiB0aGUgb2JqZWN0J3MgY29uc3RydWN0b3IgaWYgaXNTYW1lT2JqZWN0Q29uc3RydWN0b3IgaXMgdHJ1ZSAqL1xyXG4gICAgICAgIHJldHVybiBpc1NhbWVPYmplY3RDb25zdHJ1Y3RvciA/IG9iamVjdCEuY29uc3RydWN0b3IgOiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBvYmplY3QgcHJvcGVydHkgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG9iamVjdCBhbmQgcHJvcGVydHkgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUluZm8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gYnVpbGRlci5cclxuICAgICAqIEByZXR1cm5zIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgb2JqZWN0IHByb3BlcnR5IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldE9iamVjdFByb3BlcnR5SW5zdGFuY2Uob2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBwcm9wZXJ0eUluZm86IFByb3BlcnR5SW5mbywgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uOiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgdHlwZSBpcyBPQkpFQ1RfUFJPUEVSVFkgYW5kIHRoZSBwcm9wZXJ0eSBleGlzdHMgaW4gdGhlIG9iamVjdCAqL1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8ucHJvcGVydHlUeXBlID09IE9CSkVDVF9QUk9QRVJUWSAmJiBvYmplY3RbcHJvcGVydHlJbmZvLm5hbWVdKSB7XHJcbiAgICAgICAgICAgIC8qIFJldHVybiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIG9iamVjdCBwcm9wZXJ0eSBpZiBpdCBleGlzdHMgKi9cclxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdFtwcm9wZXJ0eUluZm8ubmFtZV0uY29uc3RydWN0b3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgdHlwZSBpcyBBUlJBWV9QUk9QRVJUWSBhbmQgdGhlIHByb3BlcnR5IGV4aXN0cyBhbmQgY29udGFpbnMgaXRlbXMgaW4gdGhlIG9iamVjdCAqL1xyXG4gICAgICAgIGVsc2UgaWYgKHByb3BlcnR5SW5mby5wcm9wZXJ0eVR5cGUgPT0gQVJSQVlfUFJPUEVSVFkgJiYgb2JqZWN0W3Byb3BlcnR5SW5mby5uYW1lXSAmJiBvYmplY3RbcHJvcGVydHlJbmZvLm5hbWVdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkgcHJvcGVydHkgaWYgaXQgZXhpc3RzICovXHJcbiAgICAgICAgICAgIHJldHVybiBvYmplY3RbcHJvcGVydHlJbmZvLm5hbWVdWzBdLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogUmV0dXJuIHRoZSBlbnRpdHkgdHlwZSBiYXNlZCBvbiB0aGUgb2JqZWN0IGFuZCBwcm9wZXJ0eSBpbmZvcm1hdGlvbiAqL1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEVudGl0eShvYmplY3QsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgcHJvcGVydHlJbmZvLm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGZvciBhZGRpdGlvbmFsIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbnMgZm9yIG9iamVjdCBwcm9wZXJ0aWVzIGluIHRoZSBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZUNvbnRhaW5lciBUaGUgY29udGFpbmVyIGZvciB0aGUgaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9ucy5cclxuICAgICAqIEBwYXJhbSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmb3JtIGJ1aWxkZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2hlY2tPYmplY3RQcm9wQWRkaXRpb25hbFZhbGlkYXRpb248VD4oaW5zdGFuY2VDb250YWluZXI6IEluc3RhbmNlQ29udGFpbmVyLCBvYmplY3Q6IFQsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgLyogRmlsdGVyIHByb3BlcnRpZXMgb2YgdHlwZSBPQkpFQ1RfUFJPUEVSVFkgb3IgQVJSQVlfUFJPUEVSVFkgKi9cclxuICAgICAgICB2YXIgcHJvcHMgPSBpbnN0YW5jZUNvbnRhaW5lci5wcm9wZXJ0aWVzPy5maWx0ZXIodCA9PiB0LnByb3BlcnR5VHlwZSA9PSBPQkpFQ1RfUFJPUEVSVFkgfHwgdC5wcm9wZXJ0eVR5cGUgPT0gQVJSQVlfUFJPUEVSVFkpO1xyXG5cclxuICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGZpbHRlcmVkIHByb3BlcnRpZXMgKi9cclxuICAgICAgICBwcm9wcz8uZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgbGV0IGVudGl0eSA9IHQuZW50aXR5O1xyXG5cclxuICAgICAgICAgICAgLyogSWYgZW50aXR5IHR5cGUgaXMgbm90IGRlZmluZWQgaW4gdGhlIHByb3BlcnR5LCByZXRyaWV2ZSBpdCBmcm9tIHRoZSBvYmplY3QgKi9cclxuICAgICAgICAgICAgaWYgKCF0LmVudGl0eSlcclxuICAgICAgICAgICAgICAgIGVudGl0eSA9IHRoaXMuZ2V0T2JqZWN0UHJvcGVydHlJbnN0YW5jZShvYmplY3QhLCB0LCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5nZXRJbnN0YW5jZUNvbnRhaW5lcihlbnRpdHksIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGluc3RhbmNlIGV4aXN0cyBhbmQgaGFzIGNvbmRpdGlvbmFsIHZhbGlkYXRpb24gcHJvcGVydGllcyAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0gaW5zdGFuY2VDb250YWluZXIucHJvcGVydGllcz8uZmlsdGVyKHQgPT4gdC5uYW1lID09IGtleSlbMF07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBjb25kaXRpb25hbCB2YWxpZGF0aW9uIHByb3BlcnRpZXMgaW4gaW5zdGFuY2UgY29udGFpbmVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzID0ge307XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1trZXldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW2tleV0gPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgY29uZGl0aW9uYWwgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1trZXldLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucHJvcGVydHlUeXBlICE9IEFSUkFZX1BST1BFUlRZKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyBhcyBhbnkpW2tleV0ucHVzaChbdC5uYW1lLCB4XS5qb2luKCcuJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyBhcyBhbnkpW2tleV0ucHVzaChbdC5uYW1lLCB4XS5qb2luKCdbXScpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWN0cyBhbiBvYmplY3QgY29udGFpbmluZyBtb2RlbCwgZW50aXR5T2JqZWN0LCBhbmQgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRvIGJlIHVzZWQgZm9yIG9iamVjdCBjb25zdHJ1Y3Rpb24uXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IFRoZSBlbnRpdHkgb2JqZWN0IHRvIGJlIHVzZWQuXHJcbiAgICAgKiBAcGFyYW0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZm9ybSBidWlsZGVyLlxyXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgbW9kZWwsIGVudGl0eU9iamVjdCwgYW5kIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRPYmplY3QobW9kZWw6IGFueSB8IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGVudGl0eU9iamVjdD86IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbj86IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xyXG4gICAgICAgIC8qIEluaXRpYWxpemVzIGFuIGVtcHR5IG9iamVjdCB0byBzdG9yZSB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiAqL1xyXG4gICAgICAgIGxldCBqc29uOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gICAgICAgIC8qIENoZWNrcyBpZiB0aGUgbW9kZWwgaXMgYSBmdW5jdGlvbiAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gRlVOQ1RJT05fU1RSSU5HKSB7XHJcbiAgICAgICAgICAgIGpzb24ubW9kZWwgPSBtb2RlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIENoZWNrcyBpZiB0aGUgbW9kZWwgaXMgYSBmdW5jdGlvbiBhbmQgZW50aXR5T2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gRlVOQ1RJT05fU1RSSU5HICYmIChlbnRpdHlPYmplY3QgaW5zdGFuY2VvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pKSB7XHJcbiAgICAgICAgICAgIC8qIENyZWF0ZXMgdGhlIGVudGl0eSBvYmplY3QgdXNpbmcgY3JlYXRlQ2xhc3NPYmplY3QgbWV0aG9kICovXHJcbiAgICAgICAgICAgIGpzb24uZW50aXR5T2JqZWN0ID0gdGhpcy5jcmVhdGVDbGFzc09iamVjdChqc29uLm1vZGVsLCBlbnRpdHlPYmplY3QpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogQ2hlY2tzIGlmIGVudGl0eU9iamVjdCBleGlzdHMgYW5kIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICBpZiAoZW50aXR5T2JqZWN0ICYmICEoZW50aXR5T2JqZWN0IGluc3RhbmNlb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSkge1xyXG4gICAgICAgICAgICBqc29uLmVudGl0eU9iamVjdCA9IGVudGl0eU9iamVjdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIENoZWNrcyBpZiBlbnRpdHlPYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGFuZCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gaXMgbm90IHByb3ZpZGVkICovXHJcbiAgICAgICAgaWYgKGVudGl0eU9iamVjdCBpbnN0YW5jZW9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAmJiAhZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uID0gZW50aXR5T2JqZWN0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKiBDaGVja3MgaWYgZW50aXR5T2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gYW5kIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBpcyBwcm92aWRlZCAqL1xyXG4gICAgICAgIGVsc2UgaWYgKCEoZW50aXR5T2JqZWN0IGluc3RhbmNlb2YgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICAgICAgLyogU2V0cyB0aGUgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGluIHRoZSBKU09OICovXHJcbiAgICAgICAgICAgIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uID0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uO1xyXG4gICAgICAgICAgICAvKiBDcmVhdGVzIHRoZSBlbnRpdHkgb2JqZWN0IHVzaW5nIGNyZWF0ZUNsYXNzT2JqZWN0IG1ldGhvZCAqL1xyXG4gICAgICAgICAgICBqc29uLmVudGl0eU9iamVjdCA9IHRoaXMuY3JlYXRlQ2xhc3NPYmplY3QoanNvbi5tb2RlbCwganNvbi5mb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGpzb24uZW50aXR5T2JqZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIElmIGVudGl0eU9iamVjdCBkb2VzIG5vdCBleGlzdCAqL1xyXG4gICAgICAgIGlmICghZW50aXR5T2JqZWN0KSB7XHJcbiAgICAgICAgICAgIC8qIENoZWNrcyBpZiB0aGUgbW9kZWwgaXMgYW4gb2JqZWN0ICovXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gT0JKRUNUX1NUUklORykge1xyXG4gICAgICAgICAgICAgICAgLyogU3RvcmVzIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbW9kZWwgKi9cclxuICAgICAgICAgICAgICAgIGpzb24ubW9kZWwgPSBtb2RlbC5jb25zdHJ1Y3RvcjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQ3JlYXRlcyB0aGUgZW50aXR5IG9iamVjdCB1c2luZyBjcmVhdGVDbGFzc09iamVjdCBtZXRob2QgKi9cclxuICAgICAgICAgICAganNvbi5lbnRpdHlPYmplY3QgPSB0aGlzLmNyZWF0ZUNsYXNzT2JqZWN0KGpzb24ubW9kZWwsIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBtb2RlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIElmIGVudGl0eU9iamVjdCBleGlzdHMgYW5kIGlzIGFuIGluc3RhbmNlIG9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBhbmQgbW9kZWwgaXMgYW4gb2JqZWN0ICovXHJcbiAgICAgICAgZWxzZSBpZiAobW9kZWwgJiYgKGVudGl0eU9iamVjdCBpbnN0YW5jZW9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikgJiYgKHR5cGVvZiBtb2RlbCA9PSBPQkpFQ1RfU1RSSU5HKSkge1xyXG4gICAgICAgICAgICAvKiBTdG9yZXMgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBtb2RlbCAqL1xyXG4gICAgICAgICAgICBqc29uW01PREVMXSA9IG1vZGVsLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgICAgICAvKiBDcmVhdGVzIHRoZSBlbnRpdHkgb2JqZWN0IHVzaW5nIGNyZWF0ZUNsYXNzT2JqZWN0IG1ldGhvZCAqL1xyXG4gICAgICAgICAgICBqc29uW0VOVElUWV9PQkpFQ1RdID0gdGhpcy5jcmVhdGVDbGFzc09iamVjdChqc29uLm1vZGVsLCBqc29uLmZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgbW9kZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogUmV0dXJucyB0aGUgY29uc3RydWN0ZWQgSlNPTiBvYmplY3QgKi9cclxuICAgICAgICByZXR1cm4ganNvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBmb3JtIGNvbnRyb2wgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCB2YWxpZGF0b3JzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgZm9ybSBjb250cm9sLlxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvcnMgQW4gYXJyYXkgb2Ygc3luY2hyb25vdXMgdmFsaWRhdG9ycy5cclxuICAgICAqIEBwYXJhbSBhc3luY1ZhbGlkYXRvcnMgQW4gYXJyYXkgb2YgYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBJQWJzdHJhY3RDb250cm9sLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29udHJvbCh2YWx1ZT86IGFueSwgdmFsaWRhdG9ycz86IFZhbGlkYXRvckZuW10sIGFzeW5jVmFsaWRhdG9ycz86IEFzeW5jVmFsaWRhdG9yRm5bXSk6IElBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiBuZXcgUnhGb3JtQ29udHJvbCh2YWx1ZSwgeyB2YWxpZGF0b3JzOiB2YWxpZGF0b3JzLCBhc3luY1ZhbGlkYXRvcnM6IGFzeW5jVmFsaWRhdG9ycyB9LCB7fSwge30sICcnLCBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgZm9ybSBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFuZCB2YWxpZGF0b3IgY29uZmlndXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHZhbHVlcyBBbiBhcnJheSBvZiBvYmplY3RzIHRvIGluaXRpYWxpemUgdGhlIGZvcm0gYXJyYXkuXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciB2YWxpZGF0b3JzLlxyXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgRm9ybUFycmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXJyYXkodmFsdWVzOiBbeyBba2V5OiBzdHJpbmddOiBhbnkgfV0sIHZhbGlkYXRvckNvbmZpZz86IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIC8qIENyZWF0ZXMgYSBGb3JtR3JvdXAgaW5zdGFuY2Ugd2l0aCBhIHNpbmdsZSBjb250cm9sIG5hbWVkIFwidGVtcFwiIGFuZCBhc3NpZ25zIGl0IHRvIGZvcm1BcnJheSAqL1xyXG4gICAgICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmdyb3VwKHsgdGVtcDogdmFsdWVzIH0sIHZhbGlkYXRvckNvbmZpZykuZ2V0KFwidGVtcFwiKSBhcyBGb3JtQXJyYXk7XHJcblxyXG4gICAgICAgIC8qIEluc3RhbnRpYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRm9ybUJ1aWxkZXIgKi9cclxuICAgICAgICB2YXIgZm9ybUJ1aWxkZXIgPSBuZXcgRm9ybUJ1aWxkZXIoKTtcclxuXHJcbiAgICAgICAgLyogQ3JlYXRlcyBhIEZvcm1BcnJheSBpbnN0YW5jZSB1c2luZyB0aGUgY29udHJvbHMgb2YgdGhlIEZvcm1Hcm91cCAqL1xyXG4gICAgICAgIHJldHVybiBmb3JtQnVpbGRlci5hcnJheShmb3JtQXJyYXkuY29udHJvbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGZvcm0gZ3JvdXAgd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwIG9iamVjdCBhbmQgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBncm91cE9iamVjdCBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncm91cC5cclxuICAgICAqIEBwYXJhbSB2YWxpZGF0b3JDb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHZhbGlkYXRvcnMuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBGb3JtR3JvdXAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBncm91cChncm91cE9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgdmFsaWRhdG9yQ29uZmlnPzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKTogRm9ybUdyb3VwIHtcclxuICAgICAgICAvKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIG1vZGVsICovXHJcbiAgICAgICAgbGV0IG1vZGVsSW5zdGFuY2UgPSBzdXBlci5jcmVhdGVJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAvKiBJbml0aWFsaXplIGFuIGVtcHR5IG9iamVjdCBmb3IgdGhlIGVudGl0eSAqL1xyXG4gICAgICAgIGxldCBlbnRpdHlPYmplY3QgPSB7fTtcclxuXHJcbiAgICAgICAgLyogSW5pdGlhbGl6ZSBhbiBlbXB0eSBvYmplY3QgZm9yIGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0ge307XHJcblxyXG4gICAgICAgIC8qIFNldCBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yIHRvIGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yO1xyXG5cclxuICAgICAgICAvKiBDcmVhdGUgdGhlIHZhbGlkYXRvciBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JGb3JtR3JvdXAoZ3JvdXBPYmplY3QsIGVudGl0eU9iamVjdCwgbW9kZWxJbnN0YW5jZSwgdmFsaWRhdG9yQ29uZmlnISk7XHJcblxyXG4gICAgICAgIC8qIFNldCBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yIGJhY2sgdG8gZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3I7XHJcblxyXG4gICAgICAgIC8qIEZsYWcgdGhhdCBhIGdyb3VwIGlzIGJlaW5nIGNhbGxlZCAqL1xyXG4gICAgICAgIHRoaXMuaXNHcm91cENhbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qIENyZWF0ZSB0aGUgZm9ybSBncm91cCAqL1xyXG4gICAgICAgIGxldCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1Hcm91cChtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yLCBlbnRpdHlPYmplY3QsIHZhbGlkYXRvckNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8qIFJlc2V0IGlzR3JvdXBDYWxsZWQgZmxhZyAqL1xyXG4gICAgICAgIHRoaXMuaXNHcm91cENhbGxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKiBSZXNldCBmb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgKi9cclxuICAgICAgICB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHt9O1xyXG5cclxuICAgICAgICAvKiBSZXNldCBjdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3I7XHJcblxyXG4gICAgICAgIC8qIFJlc2V0IGZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciAqL1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0ge307XHJcblxyXG4gICAgICAgIC8qIFJldHVybiB0aGUgY3JlYXRlZCBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgcmV0dXJuIGZvcm1Hcm91cDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IGFsbCBwcm9wZXJ0eSB2YWxpZGF0b3JzIHNwZWNpZmllZCBpbiB0aGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gdG8gYSBnaXZlbiBwcm9wZXJ0eS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB3aGljaCB2YWxpZGF0b3JzIGFyZSBhcHBsaWVkLlxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvckNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBmb3IgcHJvcGVydHkgdmFsaWRhdGlvbi5cclxuICAgICAqIEBwYXJhbSBtb2RlbEluc3RhbmNlIFRoZSBpbnN0YW5jZSBvZiB0aGUgbW9kZWwuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXBwbHlBbGxQcm9wVmFsaWRhdG9yKHByb3BOYW1lOiBzdHJpbmcsIHZhbGlkYXRvckNvbmZpZzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBtb2RlbEluc3RhbmNlOiBhbnkpIHtcclxuICAgICAgICAvKiBDaGVjayBpZiB0aGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gYW5kIGFwcGx5QWxsUHJvcHMgYXJyYXkgZXhpc3QgKi9cclxuICAgICAgICBpZiAodmFsaWRhdG9yQ29uZmlnICYmIHZhbGlkYXRvckNvbmZpZy5hcHBseUFsbFByb3BzKSB7XHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBleGNsdWRlUHJvcHMgYXJyYXkgZXhpc3RzIGFuZCBpZiB0aGUgcHJvcE5hbWUgaXMgbm90IGluIHRoZSBleGNsdWRlUHJvcHMgYXJyYXkgKi9cclxuICAgICAgICAgICAgaWYgKCEodmFsaWRhdG9yQ29uZmlnLmV4Y2x1ZGVQcm9wcyAmJiB2YWxpZGF0b3JDb25maWcuZXhjbHVkZVByb3BzLmxlbmd0aCA+IDAgJiYgdmFsaWRhdG9yQ29uZmlnLmV4Y2x1ZGVQcm9wcy5pbmRleE9mKHByb3BOYW1lKSA9PSAtMSkpIHtcclxuICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGl0ZW0gaW4gdGhlIGFwcGx5QWxsUHJvcHMgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgIHZhbGlkYXRvckNvbmZpZy5hcHBseUFsbFByb3BzLmZvckVhY2goKHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24gaXMgYW4gUnhXZWIgdmFsaWRhdG9yICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQubmFtZSA9PSBSWF9XRUJfVkFMSURBVE9SKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFwcGx5IFJ4V2ViIHZhbGlkYXRvciB0byB0aGUgcHJvcE5hbWUgd2l0aCB0aGUgbW9kZWxJbnN0YW5jZSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0KHByb3BOYW1lLCBtb2RlbEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciBoYXMgYW4gZW50cnkgZm9yIHRoZSBwcm9wTmFtZSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgY3JlYXRlIGFuIGVtcHR5IGFycmF5IGZvciB0aGUgcHJvcE5hbWUgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogUHVzaCB0aGUgY3VzdG9tIHZhbGlkYXRvciB0byB0aGUgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdLnB1c2godCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgICogQ2hlY2tzIGlmIGR5bmFtaWMgdmFsaWRhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0byBhIHByb3BlcnR5LlxyXG4gICAgICAqIFxyXG4gICAgICAqIEBwYXJhbSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2suXHJcbiAgICAgICogQHBhcmFtIHZhbGlkYXRvckNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBmb3IgcHJvcGVydHkgdmFsaWRhdGlvbi5cclxuICAgICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGR5bmFtaWMgdmFsaWRhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgcHJvcGVydHkuXHJcbiAgICAgICovXHJcbiAgICBwcml2YXRlIGR5bmFtaWNWYWxpZGF0aW9uUHJvcENoZWNrKHByb3BOYW1lOiBzdHJpbmcsIHZhbGlkYXRvckNvbmZpZzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuICh2YWxpZGF0b3JDb25maWcgPT0gdW5kZWZpbmVkKSA/IHRydWUgOiAoIXZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWUpID8gdHJ1ZSA6IHZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWUgPT0gcHJvcE5hbWUgPyBmYWxzZSA6IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIG5vdCBhbiBvYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXHJcbiAgICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzTm90T2JqZWN0KHZhbHVlOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPSBPQkpFQ1RfU1RSSU5HO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHZhbGlkYXRvciBmb3JtIGdyb3VwIGJhc2VkIG9uIHRoZSBncm91cE9iamVjdCBhbmQgYXBwbGllcyB2YWxpZGF0aW9uIHJ1bGVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBPYmplY3QgVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSB0aGUgZm9ybSBncm91cC5cclxuICAgICAqIEBwYXJhbSBlbnRpdHlPYmplY3QgVGhlIGVudGl0eSBvYmplY3QgdG8gc3RvcmUgdGhlIGZvcm0gZ3JvdXAuXHJcbiAgICAgKiBAcGFyYW0gbW9kZWxJbnN0YW5jZSBUaGUgbW9kZWwgaW5zdGFuY2UgdXNlZCBmb3IgaW5pdGlhbGl6YXRpb24uXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yQ29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSB2YWxpZGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVZhbGlkYXRvckZvcm1Hcm91cChncm91cE9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZW50aXR5T2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBtb2RlbEluc3RhbmNlOiBhbnksIHZhbGlkYXRvckNvbmZpZzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgLyogSXRlcmF0ZXMgb3ZlciBlYWNoIHByb3BlcnR5IGluIHRoZSBncm91cE9iamVjdCB0byBjcmVhdGUgZm9ybSBjb250cm9scyBhbmQgYXBwbHkgdmFsaWRhdG9ycy4gKi9cclxuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBncm91cE9iamVjdCkge1xyXG4gICAgICAgICAgICB2YXIgcHJvcCA9IGdyb3VwT2JqZWN0W3Byb3BOYW1lXTtcclxuXHJcbiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbiBhcnJheSBhbmQgbmVlZHMgdmFsaWRhdGlvbiAqL1xyXG4gICAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIEFycmF5ICYmIHByb3AubGVuZ3RoID4gMCAmJiB0aGlzLmlzTm90T2JqZWN0KHByb3BbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcFZhbGlkYXRvcnMgPSAocHJvcC5sZW5ndGggPiAxICYmIHByb3BbMV0gaW5zdGFuY2VvZiBBcnJheSkgPyBwcm9wWzFdIDogKHByb3AubGVuZ3RoID09IDIpID8gW3Byb3BbMV1dIDogW107XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlBZGRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgb3ZlciBlYWNoIHZhbGlkYXRvciBmb3IgdGhlIGN1cnJlbnQgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcFZhbGlkYXRvcnNbaV0ubmFtZSA9PSBSWF9XRUJfVkFMSURBVE9SKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BWYWxpZGF0b3JzW2ldKHByb3BOYW1lLCBtb2RlbEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlBZGRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIG90aGVyIHZhbGlkYXRvcnMgdG8gdGhlIGN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV0ucHVzaChwcm9wVmFsaWRhdG9yc1tpXSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogSWYgbm8gcHJvcGVydHkgdmFsaWRhdG9yIGFkZGVkLCBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBvYmplY3QgKi9cclxuICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHlBZGRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBQUk9QRVJUWSwgdW5kZWZpbmVkLCB0eXBlb2YgbW9kZWxJbnN0YW5jZSA9PSBPQkpFQ1RfU1RSSU5HID8gbW9kZWxJbnN0YW5jZSA6IHsgY29uc3RydWN0b3I6IG1vZGVsSW5zdGFuY2UgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogQXBwbHkgYWxsIHByb3BlcnR5IHZhbGlkYXRvcnMgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlBbGxQcm9wVmFsaWRhdG9yKHByb3BOYW1lLCB2YWxpZGF0b3JDb25maWcsIG1vZGVsSW5zdGFuY2UpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcCA9PT0gbnVsbCB8fCBwcm9wID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHByb3AgPT0gU1RSSU5HIHx8IHR5cGVvZiBwcm9wID09IE5VTUJFUiB8fCB0eXBlb2YgcHJvcCA9PSBCT09MRUFOIHx8IHByb3AgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBvYmplY3QgaWYgaXQncyBhIHNpbXBsZSB0eXBlICovXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgUFJPUEVSVFksIHVuZGVmaW5lZCwgdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT0gT0JKRUNUX1NUUklORyA/IG1vZGVsSW5zdGFuY2UgOiB7IGNvbnN0cnVjdG9yOiBtb2RlbEluc3RhbmNlIH0pO1xyXG4gICAgICAgICAgICAgICAgLyogQXBwbHkgYWxsIHByb3BlcnR5IHZhbGlkYXRvcnMgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlBbGxQcm9wVmFsaWRhdG9yKHByb3BOYW1lLCB2YWxpZGF0b3JDb25maWcsIG1vZGVsSW5zdGFuY2UpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBhIEZvcm1BcnJheSwgYXNzaWduIGl0IGRpcmVjdGx5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3A7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIElmIGl0J3MgYW4gYXJyYXkgb2Ygb2JqZWN0cywgY3JlYXRlIGZvcm0gY29udHJvbHMgcmVjdXJzaXZlbHkgKi9cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcE1vZGVsSW5zdGFuY2UgPSBzdXBlci5jcmVhdGVJbnN0YW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kZWxJbnN0YW5jZSA9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3RvciA9IG1vZGVsSW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBhcyBhbiBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBBUlJBWV9QUk9QRVJUWSwgcHJvcE1vZGVsSW5zdGFuY2UuY29uc3RydWN0b3IsIG1vZGVsSW5zdGFuY2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGFuIGVtcHR5IGFycmF5IGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcm93IG9mIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGEgbmV3IG9iamVjdCBmb3IgZWFjaCBlbGVtZW50ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqT2JqZWN0ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFB1c2ggdGhlIG5ldyBvYmplY3QgaW50byB0aGUgYXJyYXkgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXS5wdXNoKGpPYmplY3QpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlY3Vyc2l2ZWx5IGNyZWF0ZSB2YWxpZGF0b3IgZm9ybSBncm91cHMgZm9yIGVhY2ggb2JqZWN0ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yRm9ybUdyb3VwKHJvdywgak9iamVjdCwgcHJvcE1vZGVsSW5zdGFuY2UuY29uc3RydWN0b3IsIHZhbGlkYXRvckNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wID09IE9CSkVDVF9TVFJJTkcgJiYgIShwcm9wIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgfHwgcHJvcCBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIGZvcm1Hcm91cCBiYXNlZCBvbiB0aGUgdHlwZSBvZiAncHJvcCcgKi9cclxuICAgICAgICAgICAgICAgIGxldCBmb3JtR3JvdXA6IGFueSA9IChwcm9wIGluc3RhbmNlb2YgRm9ybUFycmF5KSA/IHByb3AuY29udHJvbHNbMF0gOiBwcm9wO1xyXG5cclxuICAgICAgICAgICAgICAgIC8qIElmICdwcm9wJyBpcyBhIEZvcm1Hcm91cCBvciBSeEZvcm1Hcm91cCBhbmQgZG9lcyBub3QgaGF2ZSBhIG1vZGVsLCBjcmVhdGUgYSBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1Hcm91cC5tb2RlbCAmJiAocHJvcCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBwcm9wIGluc3RhbmNlb2YgUnhGb3JtR3JvdXApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwID0gdGhpcy5ncm91cChmb3JtR3JvdXAuY29udHJvbHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qIElmICdwcm9wJyBpcyBhIEZvcm1Hcm91cCBvciBSeEZvcm1Hcm91cCwgaW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgYXMgYW4gb2JqZWN0ICovXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBwcm9wIGluc3RhbmNlb2YgUnhGb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcDtcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgT0JKRUNUX1BST1BFUlRZLCBmb3JtR3JvdXAubW9kZWwsIG1vZGVsSW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLyogSWYgJ3Byb3AnIGlzIGEgRm9ybUFycmF5LCBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBhcyBhbiBhcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSBwcm9wO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBBUlJBWV9QUk9QRVJUWSwgZm9ybUdyb3VwLm1vZGVsLCBtb2RlbEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8qIElmICdwcm9wJyBpcyBuZWl0aGVyIGEgRm9ybUdyb3VwL1J4Rm9ybUdyb3VwIG5vciBhIEZvcm1BcnJheSAqL1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgZHluYW1pYyB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkIGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5keW5hbWljVmFsaWRhdGlvblByb3BDaGVjayhwcm9wTmFtZSwgdmFsaWRhdG9yQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHByb3BlcnR5IGZvciBkeW5hbWljIHZhbGlkYXRpb24gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciB0byB0aGUgY3VycmVudCBwcm9wZXJ0eSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgPSB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgZm9yIHRoZSBwcm9wZXJ0eSBtb2RlbCAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcE1vZGVsSW5zdGFuY2UgPSBzdXBlci5jcmVhdGVJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgb2JqZWN0ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXS5jb25zdHJ1Y3RvciA9IHByb3BNb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgT0JKRUNUX1BST1BFUlRZLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLmNvbnN0cnVjdG9yLCBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09IEZ1bmN0aW9uID8geyBjb25zdHJ1Y3RvcjogbW9kZWxJbnN0YW5jZSB9IDogbW9kZWxJbnN0YW5jZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnID0gdGhpcy5nZXRWYWxpZGF0b3JDb25maWcodmFsaWRhdG9yQ29uZmlnLCBncm91cE9iamVjdCwgcHJvcE5hbWUgKyBcIi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWN1cnNpdmVseSBjcmVhdGUgdGhlIHZhbGlkYXRvciBmb3JtIGdyb3VwIGZvciB0aGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JGb3JtR3JvdXAoZ3JvdXBPYmplY3RbcHJvcE5hbWVdLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLmNvbnN0cnVjdG9yLCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHByb3BlcnR5IHdpdGhvdXQgZHluYW1pYyB2YWxpZGF0aW9uICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSBncm91cE9iamVjdFtwcm9wTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBvZiBzaW1wbGUgdHlwZSAqL1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgPT0gU1RSSU5HIHx8IHR5cGVvZiBwcm9wID09IE5VTUJFUiB8fCB0eXBlb2YgcHJvcCA9PSBCT09MRUFOIHx8IHByb3AgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBhbiBhcnJheSBvciBvYmplY3QgKi9cclxuICAgICAgICAgICAgZWxzZSBpZiAoKHByb3AgJiYgcHJvcC5sZW5ndGggPiAwICYmIHRoaXMuaXNOb3RPYmplY3QocHJvcFswXSkgJiYgIShwcm9wIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgfHwgcHJvcCBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpICYmICEocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkpKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcFswXVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBhIEZvcm1BcnJheSAqL1xyXG4gICAgICAgICAgICBlbHNlIGlmIChwcm9wIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBc3NpZ24gcHJvcGVydHkgdmFsdWUgaWYgaXQncyBhIEZvcm1Db250cm9sICovXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHByb3AgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCB8fCBwcm9wIGluc3RhbmNlb2YgUnhGb3JtQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3BcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBQUk9QRVJUWSwgdW5kZWZpbmVkLCBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID8gbW9kZWxJbnN0YW5jZSA6IHsgY29uc3RydWN0b3I6IG1vZGVsSW5zdGFuY2UgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbGlkYXRvciBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIGVudGl0eSBvYmplY3QgYW5kIHJvb3QgcHJvcGVydHkgbmFtZS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvckNvbmZpZyBUaGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gdG8gcHJvY2Vzcy5cclxuICAgICAqIEBwYXJhbSBlbnRpdHlPYmplY3QgVGhlIGVudGl0eSBvYmplY3QgZm9yIHdoaWNoIHRoZSB2YWxpZGF0b3IgY29uZmlndXJhdGlvbiBpcyBhcHBsaWVkLlxyXG4gICAgICogQHBhcmFtIHJvb3RQcm9wZXJ0eU5hbWUgVGhlIHJvb3QgcHJvcGVydHkgbmFtZSB0byBjb25zaWRlci5cclxuICAgICAqIEBwYXJhbSBhcnJheVByb3BlcnR5TmFtZSBPcHRpb25hbC4gVGhlIGFycmF5IHByb3BlcnR5IG5hbWUgdG8gY29uc2lkZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvY2Vzc2VkIHZhbGlkYXRvciBjb25maWd1cmF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JDb25maWc6IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgZW50aXR5T2JqZWN0OiBhbnksIHJvb3RQcm9wZXJ0eU5hbWU6IHN0cmluZywgYXJyYXlQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGxldCBleGNsdWRlUHJvcHM6IGFueVtdID0gW107XHJcbiAgICAgICAgbGV0IGluY2x1ZGVQcm9wczogYW55W10gPSBbXTtcclxuICAgICAgICBsZXQgaWdub3JlVW5kZWZpbmVkUHJvcHM6IGFueVtdID0gW107XHJcblxyXG4gICAgICAgIC8qIENoZWNrIGlmIHRoZSB2YWxpZGF0b3JDb25maWcgZXhpc3RzICovXHJcbiAgICAgICAgaWYgKCF2YWxpZGF0b3JDb25maWcpIHJldHVybiB7fTtcclxuXHJcbiAgICAgICAgLyogUmV0cmlldmUgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzIGFuZCBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgKi9cclxuICAgICAgICBjb25zdCB2YWxpZGF0aW9uUHJvcHMgPSB0aGlzLmdldE9iamVjdEZvclByb3BlcnR5KHZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbiEsIHJvb3RQcm9wZXJ0eU5hbWUsIGFycmF5UHJvcGVydHlOYW1lKTtcclxuICAgICAgICBjb25zdCBhYnN0cmFjdENvbnRyb2xPcHRpb25zID0gdGhpcy5nZXRPYmplY3RGb3JQcm9wZXJ0eSh2YWxpZGF0b3JDb25maWcuYWJzdHJhY3RDb250cm9sT3B0aW9ucyEsIHJvb3RQcm9wZXJ0eU5hbWUsIGFycmF5UHJvcGVydHlOYW1lKTtcclxuXHJcbiAgICAgICAgLyogUG9wdWxhdGUgZXhjbHVkZVByb3BzLCBpbmNsdWRlUHJvcHMsIGFuZCBpZ25vcmVVbmRlZmluZWRQcm9wcyBhcnJheXMgKi9cclxuICAgICAgICBpZiAodmFsaWRhdG9yQ29uZmlnLmV4Y2x1ZGVQcm9wcykge1xyXG4gICAgICAgICAgICBleGNsdWRlUHJvcHMgPSB0aGlzLmdldFByb3BzKHZhbGlkYXRvckNvbmZpZy5leGNsdWRlUHJvcHMsIHJvb3RQcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbGlkYXRvckNvbmZpZy5pbmNsdWRlUHJvcHMpIHtcclxuICAgICAgICAgICAgaW5jbHVkZVByb3BzID0gdGhpcy5nZXRQcm9wcyh2YWxpZGF0b3JDb25maWcuaW5jbHVkZVByb3BzLCByb290UHJvcGVydHlOYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWxpZGF0b3JDb25maWcuaWdub3JlVW5kZWZpbmVkUHJvcHMpIHtcclxuICAgICAgICAgICAgaWdub3JlVW5kZWZpbmVkUHJvcHMgPSB0aGlzLmdldFByb3BzKHZhbGlkYXRvckNvbmZpZy5pZ25vcmVVbmRlZmluZWRQcm9wcywgcm9vdFByb3BlcnR5TmFtZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBBcHBlbmQgZ2xvYmFsIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucyBpZiBub3QgZm91bmQgKi9cclxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKGFic3RyYWN0Q29udHJvbE9wdGlvbnMpLmxlbmd0aCAmJiByb290UHJvcGVydHlOYW1lLmVuZHNXaXRoKCcuJykgJiYgdmFsaWRhdG9yQ29uZmlnLmFic3RyYWN0Q29udHJvbE9wdGlvbnMgJiYgdmFsaWRhdG9yQ29uZmlnLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbcm9vdFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgcm9vdFByb3BlcnR5TmFtZS5sZW5ndGggLSAxKV0pIHtcclxuICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9uc1snZ2xvYmFsJ10gPSB2YWxpZGF0b3JDb25maWcuYWJzdHJhY3RDb250cm9sT3B0aW9uc1tyb290UHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCByb290UHJvcGVydHlOYW1lLmxlbmd0aCAtIDEpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFJldHJpZXZlIGR5bmFtaWMgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgY29uc3QgZHluYW1pY1ZhbGlkYXRpb24gPSAodmFsaWRhdG9yQ29uZmlnLmR5bmFtaWNWYWxpZGF0aW9uQ29uZmlndXJhdGlvblByb3BlcnR5TmFtZSAmJiBlbnRpdHlPYmplY3RbdmFsaWRhdG9yQ29uZmlnLmR5bmFtaWNWYWxpZGF0aW9uQ29uZmlndXJhdGlvblByb3BlcnR5TmFtZV0pID8gZW50aXR5T2JqZWN0W3ZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWVdIDogdmFsaWRhdGlvblByb3BzO1xyXG5cclxuICAgICAgICAvKiBSZXR1cm4gcHJvY2Vzc2VkIHZhbGlkYXRvciBjb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWdub3JlVW5kZWZpbmVkUHJvcHM6IGlnbm9yZVVuZGVmaW5lZFByb3BzLFxyXG4gICAgICAgICAgICBpbmNsdWRlUHJvcHM6IGluY2x1ZGVQcm9wcyxcclxuICAgICAgICAgICAgZHluYW1pY1ZhbGlkYXRpb246IGR5bmFtaWNWYWxpZGF0aW9uLFxyXG4gICAgICAgICAgICBleGNsdWRlUHJvcHM6IGV4Y2x1ZGVQcm9wcyxcclxuICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9uczogYWJzdHJhY3RDb250cm9sT3B0aW9uc1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgb2JqZWN0IHByb3BlcnRpZXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCByb290IHByb3BlcnR5IG5hbWUgYW5kIGFycmF5IHByb3BlcnR5IG5hbWUgKGlmIHByb3ZpZGVkKS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHJvb3RPYmplY3QgVGhlIHJvb3Qgb2JqZWN0IHRvIHNlYXJjaCBmb3IgcHJvcGVydGllcy5cclxuICAgICAqIEBwYXJhbSByb290UHJvcGVydHlOYW1lIFRoZSByb290IHByb3BlcnR5IG5hbWUgdG8gbWF0Y2ggYWdhaW5zdC5cclxuICAgICAqIEBwYXJhbSBhcnJheVByb3BlcnR5TmFtZSBPcHRpb25hbC4gVGhlIGFycmF5IHByb3BlcnR5IG5hbWUgdG8gbWF0Y2ggYWdhaW5zdC5cclxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIG1hdGNoaW5nIHRoZSByb290IHByb3BlcnR5IG5hbWUgYW5kIGFycmF5IHByb3BlcnR5IG5hbWUgKGlmIHByb3ZpZGVkKS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRPYmplY3RGb3JQcm9wZXJ0eTxUPihyb290T2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IFQgfSwgcm9vdFByb3BlcnR5TmFtZTogc3RyaW5nLCBhcnJheVByb3BlcnR5TmFtZT86IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogVCB9IHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogVCB9ID0ge307XHJcblxyXG4gICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcm9vdCBvYmplY3QgKi9cclxuICAgICAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiByb290T2JqZWN0KSB7XHJcbiAgICAgICAgICAgIC8qIFNraXAgcHJvcGVydGllcyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgcm9vdFByb3BlcnR5TmFtZSBvciBhcnJheVByb3BlcnR5TmFtZSAqL1xyXG4gICAgICAgICAgICBpZiAoIXByb3BOYW1lLnN0YXJ0c1dpdGgocm9vdFByb3BlcnR5TmFtZSkgJiYgKCFhcnJheVByb3BlcnR5TmFtZSB8fCAhcHJvcE5hbWUuc3RhcnRzV2l0aChhcnJheVByb3BlcnR5TmFtZSkpKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogRXh0cmFjdCB0aGUgc3BsaXQgcHJvcGVydHkgbmFtZSAqL1xyXG4gICAgICAgICAgICBsZXQgc3BsaXRQcm9wID0gcHJvcE5hbWUuc3BsaXQoXCIuXCIsIDIpWzFdO1xyXG5cclxuICAgICAgICAgICAgLyogSWYgc3BsaXRQcm9wIGlzIHVuZGVmaW5lZCwgY29udGludWUgdG8gdGhlIG5leHQgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgaWYgKCFzcGxpdFByb3ApIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSByZXN1bHQgb2JqZWN0ICovXHJcbiAgICAgICAgICAgIHJlc3VsdFtzcGxpdFByb3BdID0gcm9vdE9iamVjdFtwcm9wTmFtZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHJvb3QgcHJvcGVydHkgbmFtZSBmcm9tIHRoZSBnaXZlbiBhcnJheSBvZiBwcm9wZXJ0aWVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgYXJyYXkgb2YgcHJvcGVydGllcyB0byBzZWFyY2guXHJcbiAgICAgKiBAcGFyYW0gcm9vdFByb3BlcnR5TmFtZSBUaGUgcm9vdCBwcm9wZXJ0eSBuYW1lIHRvIG1hdGNoIGFnYWluc3QuXHJcbiAgICAgKiBAcGFyYW0gaXNJZ25vcmVQcm9wIE9wdGlvbmFsLiBJbmRpY2F0ZXMgd2hldGhlciB0byBpbmNsdWRlIHRoZSByb290IHByb3BlcnR5IGl0c2VsZiBhcyBhIHByb3BlcnR5LlxyXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFByb3BzKHByb3BlcnRpZXM6IHN0cmluZ1tdLCByb290UHJvcGVydHlOYW1lOiBzdHJpbmcsIGlzSWdub3JlUHJvcDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IHByb3BzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgKi9cclxuICAgICAgICBmb3IgKGxldCBwcm9wIG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHByb3BlcnR5IGNvbnRhaW5zIHRoZSByb290UHJvcGVydHlOYW1lICovXHJcbiAgICAgICAgICAgIGlmIChwcm9wLmluZGV4T2Yocm9vdFByb3BlcnR5TmFtZSkgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzcGxpdFByb3BzID0gcHJvcC5zcGxpdChcIi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGhhcyB0d28gcGFydHMsIGFkZCB0aGUgc2Vjb25kIHBhcnQgdG8gdGhlIHByb3BzIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICBpZiAoc3BsaXRQcm9wcy5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goc3BsaXRQcm9wc1sxXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGhhcyBtb3JlIHRoYW4gdHdvIHBhcnRzLCBqb2luIHRoZSBwYXJ0cyBhZnRlciB0aGUgZmlyc3Qgb25lIGFuZCBhZGQgdG8gdGhlIHByb3BzIGFycmF5ICovXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzcGxpdFByb3BzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzcGxpdFByb3BzLnNwbGljZSgwLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHNwbGl0UHJvcHMuam9pbihcIi5cIikpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIElmIGlzSWdub3JlUHJvcCBpcyB0cnVlIGFuZCB0aGUgcm9vdCBwcm9wZXJ0eSBpdHNlbGYgaXMgcHJlc2VudCBpbiB0aGUgcHJvcGVydGllcyBhcnJheSwgYWRkICc6c2VsZjonIHRvIHRoZSBwcm9wcyBhcnJheSAqL1xyXG4gICAgICAgIGlmIChpc0lnbm9yZVByb3AgJiYgcHJvcGVydGllcy5maWx0ZXIoeCA9PiB4ID09IHJvb3RQcm9wZXJ0eU5hbWUucmVwbGFjZSgnLicsICcnKSkubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgcHJvcHMucHVzaCgnOnNlbGY6Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJvcHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgZm9ybSBncm91cCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgbW9kZWwsIGVudGl0eSBvYmplY3QsIGFuZCBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBvciB0eXBlIGRlZmluaXRpb24gdG8gY3JlYXRlIHRoZSBmb3JtIGdyb3VwIGZyb20uXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5T2JqZWN0IE9wdGlvbmFsLiBUaGUgZW50aXR5IG9iamVjdCBmb3Igd2hpY2ggdGhlIGZvcm0gZ3JvdXAgaXMgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gT3B0aW9uYWwuIFRoZSBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbiB0byBjdXN0b21pemUgdGhlIGZvcm0gZ3JvdXAgY3JlYXRpb24uXHJcbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBSeEZvcm1Hcm91cCwgRm9ybUdyb3VwLCBvciBBcHBGb3JtR3JvdXA8VD4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmb3JtR3JvdXA8VD4obW9kZWw6IFR5cGU8VD4gfCB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBlbnRpdHlPYmplY3Q/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24/OiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pOiBSeEZvcm1Hcm91cCB8IEZvcm1Hcm91cCB8IEFwcEZvcm1Hcm91cDxUPiB7XHJcbiAgICAgICAgLyogUmV0cmlldmVzIG5lY2Vzc2FyeSBkYXRhIGZyb20gdGhlIHByb3ZpZGVkIG1vZGVsLCBlbnRpdHkgb2JqZWN0LCBhbmQgZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24gdG8gY3JlYXRlIGEgZm9ybSBncm91cCAqL1xyXG4gICAgICAgIGxldCBqc29uID0gdGhpcy5nZXRPYmplY3QobW9kZWwsIGVudGl0eU9iamVjdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKTtcclxuICAgICAgICBtb2RlbCA9IGpzb24ubW9kZWw7XHJcbiAgICAgICAgZW50aXR5T2JqZWN0ID0ganNvbi5lbnRpdHlPYmplY3Q7XHJcblxyXG4gICAgICAgIC8qIFxyXG4gICAgICAgICAqIElmIHRoZSBlbnRpdHkgb2JqZWN0J3MgY29uc3RydWN0b3IgZGlmZmVycyBmcm9tIHRoZSBtb2RlbCdzIGNvbnN0cnVjdG9yIGFuZCBmb3JtR3JvdXAgaXMgbm90IHByZXZpb3VzbHkgY2FsbGVkLFxyXG4gICAgICAgICAqIHVwZGF0ZSB0aGUgZW50aXR5IG9iamVjdCB0byBtYXRjaCB0aGUgbW9kZWwuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGVudGl0eU9iamVjdCEuY29uc3RydWN0b3IgIT0gbW9kZWwgJiYgIXRoaXMuaXNHcm91cENhbGxlZCkge1xyXG4gICAgICAgICAgICBlbnRpdHlPYmplY3QgPSBqc29uLmVudGl0eU9iamVjdCA9IHRoaXMudXBkYXRlT2JqZWN0KG1vZGVsLCBqc29uLmVudGl0eU9iamVjdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gPSBqc29uLmZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjtcclxuXHJcbiAgICAgICAgLyogRXh0cmFjdCBleHByZXNzaW9ucyBmcm9tIHRoZSBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBpZiBwcm92aWRlZC4gKi9cclxuICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdEV4cHJlc3Npb25zKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBHZXQgdGhlIGNvbnRhaW5lciBmb3IgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZSBtb2RlbCBhbmQgZW50aXR5IG9iamVjdC4gKi9cclxuICAgICAgICBsZXQgaW5zdGFuY2VDb250YWluZXI6IEluc3RhbmNlQ29udGFpbmVyID0gdGhpcy5nZXRJbnN0YW5jZUNvbnRhaW5lcihtb2RlbCwgZW50aXR5T2JqZWN0KTtcclxuXHJcbiAgICAgICAgLyogQ2hlY2sgYW5kIGFwcGx5IGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmb3Igb2JqZWN0IHByb3BlcnRpZXMuICovXHJcbiAgICAgICAgdGhpcy5jaGVja09iamVjdFByb3BBZGRpdGlvbmFsVmFsaWRhdGlvbihpbnN0YW5jZUNvbnRhaW5lciwgZW50aXR5T2JqZWN0LCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hKTtcclxuXHJcbiAgICAgICAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgZm9yIGZvcm0gZ3JvdXAgY3JlYXRpb24uICovXHJcbiAgICAgICAgbGV0IGZvcm1Hcm91cE9iamVjdCA9IHt9O1xyXG4gICAgICAgIGxldCBleHRlbmRlZFByb3BlcnRpZXMgPSB7fTtcclxuICAgICAgICB2YXIgYWRkaXRpb25hbFZhbGlkYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IFByb3BWYWxpZGF0aW9uQ29uZmlnIH0gPSB7fTtcclxuXHJcbiAgICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgaW5zdGFuY2UgY29udGFpbmVyLiAqL1xyXG4gICAgICAgIGluc3RhbmNlQ29udGFpbmVyLnByb3BlcnRpZXM/LmZvckVhY2gocHJvcGVydHkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaXNJbmNsdWRlUHJvcCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGJhc2VkIG9uIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGV4Y2x1ZGVkIGJhc2VkIG9uIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5leGNsdWRlUHJvcHMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmV4Y2x1ZGVQcm9wcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5leGNsdWRlUHJvcHMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKSA9PSAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiBkeW5hbWljIHZhbGlkYXRpb24gaXMgcHJvdmlkZWQgaW4gdGhlIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxWYWxpZGF0aW9ucyA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGJhc2VkIG9uIGZvcm0gYnVpbGRlciBjb25maWd1cmF0aW9uLiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pbmNsdWRlUHJvcHMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmluY2x1ZGVQcm9wcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pbmNsdWRlUHJvcHMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKSAhPSAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB1bmRlZmluZWQgcHJvcGVydGllcyBzaG91bGQgYmUgaWdub3JlZCBiYXNlZCBvbiBmb3JtIGJ1aWxkZXIgY29uZmlndXJhdGlvbi4gKi9cclxuICAgICAgICAgICAgICAgIGlmIChmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaWdub3JlVW5kZWZpbmVkUHJvcHMgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmlnbm9yZVVuZGVmaW5lZFByb3BzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpc0luY2x1ZGVQcm9wID0gIShcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkucHJvcGVydHlUeXBlID09IFBST1BFUlRZICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICFSZWdleFZhbGlkYXRvci5pc05vdEJsYW5rKGpzb24uZW50aXR5T2JqZWN0W3Byb3BlcnR5Lm5hbWVdKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaWdub3JlVW5kZWZpbmVkUHJvcHMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKSAhPT0gLTEgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pZ25vcmVVbmRlZmluZWRQcm9wcy5pbmRleE9mKFwiOnNlbGY6XCIpICE9PSAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lmlnbm9yZSkge1xyXG4gICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9ICFwcm9wZXJ0eS5pZ25vcmUuY2FsbChqc29uLmVudGl0eU9iamVjdCwganNvbi5lbnRpdHlPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkLCBjcmVhdGUgZm9ybSBjb250cm9scywgZm9ybSBncm91cHMsIG9yIGZvcm0gYXJyYXlzIGJhc2VkIG9uIGl0cyB0eXBlLiAqL1xyXG4gICAgICAgICAgICBpZiAoaXNJbmNsdWRlUHJvcCkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFBST1BFUlRZOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGFscmVhZHkgYSBmb3JtIGNvbnRyb2wsIGNyZWF0ZSBvbmUgd2l0aCBhcHByb3ByaWF0ZSB2YWxpZGF0b3JzIGFuZCBvcHRpb25zICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSBpbnN0YW5jZW9mIEZvcm1Db250cm9sIHx8IChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IHByb3BlcnR5IHZhbGlkYXRvcnMgYmFzZWQgb24gYW5ub3RhdGlvbnMuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlWYWxpZGF0b3JzID0gaW5zdGFuY2VDb250YWluZXIucHJvcGVydHlBbm5vdGF0aW9ucy5maWx0ZXIodCA9PiB0LnByb3BlcnR5TmFtZSA9PSBwcm9wZXJ0eS5uYW1lICYmIHQuaXNWYWxpZGF0b3IpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QgdXBkYXRlT24gY29uZmlndXJhdGlvbiBiYXNlZCBvbiBhbm5vdGF0aW9ucy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVPbiA9IGluc3RhbmNlQ29udGFpbmVyLnByb3BlcnR5QW5ub3RhdGlvbnMuZmlsdGVyKHQgPT4gdC5wcm9wZXJ0eU5hbWUgPT0gcHJvcGVydHkubmFtZSAmJiAhdC5pc1ZhbGlkYXRvciAmJiB0LmFubm90YXRpb25UeXBlID09PSBcInVwZGF0ZU9uXCIpWzBdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tIGVudGl0eU9iamVjdCBiYXNlZCBvbiB2YWx1ZVBhdGggb3IgcHJvcGVydHkgbmFtZSwgb3IgdXNlIHRoZSBjdXN0b20gdmFsdWUgZnVuY3Rpb24gaWYgcHJvdmlkZWQgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHByb3BlcnR5LnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwcm9wZXJ0eS52YWx1ZShlbnRpdHlPYmplY3QpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocHJvcGVydHkudmFsdWVQYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVXRpbHMuZ2V0UHJvcGVydHlWYWx1ZShlbnRpdHlPYmplY3QsIHByb3BlcnR5LnZhbHVlUGF0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZW50aXR5T2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbml0aXplIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzYW5pdGl6ZVZhbHVlID0gc3VwZXIuc2FuaXRpemVWYWx1ZShpbnN0YW5jZUNvbnRhaW5lciwgcHJvcGVydHkubmFtZSwgc3VwZXIuZ2V0RGVmYXVsdFZhbHVlKHByb3BlcnR5LCB2YWx1ZSwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISksIGpzb24uZW50aXR5T2JqZWN0LCBPYmplY3QuYXNzaWduKHt9LCBqc29uLmVudGl0eU9iamVjdCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB1bmRlZmluZWQgYW5kIHRoZXJlIGlzIGEgc2FuaXRpemVkIHZhbHVlLCBhc3NpZ24gaXQuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGVudGl0eU9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID09PSB1bmRlZmluZWQgJiYgc2FuaXRpemVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnRpdHlPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IHNhbml0aXplVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIGZvcm0gY29udHJvbCB2YWxpZGF0b3JzLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbGlkYXRvcnMgPSB0aGlzLmFkZEZvcm1Db250cm9sKHByb3BlcnR5LCBwcm9wZXJ0eVZhbGlkYXRvcnMsIGFkZGl0aW9uYWxWYWxpZGF0aW9uc1twcm9wZXJ0eS5uYW1lXSwgaW5zdGFuY2VDb250YWluZXIsIGVudGl0eU9iamVjdCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVmaW5lIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucyBpbmNsdWRpbmcgdmFsaWRhdG9ycyBhbmQgYXN5bmMgdmFsaWRhdG9ycy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhYnN0cmFjdENvbnRyb2xPcHRpb25zOiBBYnN0cmFjdENvbnRyb2xPcHRpb25zID0geyB2YWxpZGF0b3JzOiB2YWxpZGF0b3JzLCBhc3luY1ZhbGlkYXRvcnM6IHRoaXMuYWRkQXN5bmNWYWxpZGF0aW9uKHByb3BlcnR5LCBwcm9wZXJ0eVZhbGlkYXRvcnMsIGFkZGl0aW9uYWxWYWxpZGF0aW9uc1twcm9wZXJ0eS5uYW1lXSkgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXRyaWV2ZSBhZGRpdGlvbmFsIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucyBiYXNlZCBvbiBwcm9wZXJ0eSBuYW1lLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHRoaXMuZ2V0QWJzdHJhY3RDb250cm9sT3B0aW9ucyhwcm9wZXJ0eS5uYW1lLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hLCBhYnN0cmFjdENvbnRyb2xPcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBc3NpZ24gdXBkYXRlT24gY29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGUuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlT24gJiYgIWFic3RyYWN0Q29udHJvbE9wdGlvbnMudXBkYXRlT24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdENvbnRyb2xPcHRpb25zLnVwZGF0ZU9uID0gdXBkYXRlT24uY29uZmlnLnJ1bk9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENyZWF0ZSBhIG5ldyBmb3JtIGNvbnRyb2wgaW5zdGFuY2UuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUdyb3VwT2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gPSBuZXcgUnhGb3JtQ29udHJvbChzYW5pdGl6ZVZhbHVlLCBhYnN0cmFjdENvbnRyb2xPcHRpb25zLCBqc29uLmVudGl0eU9iamVjdCwgT2JqZWN0LmFzc2lnbih7fSwganNvbi5lbnRpdHlPYmplY3QpLCBwcm9wZXJ0eS5uYW1lLCBpbnN0YW5jZUNvbnRhaW5lci5zYW5pdGl6ZXJzIVtwcm9wZXJ0eS5uYW1lXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc05lc3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgYSBmb3JtIGNvbnRyb2wsIHVzZSBpdHMgZGVmYXVsdCB2YWx1ZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtR3JvdXBPYmplY3QgYXMgYW55KVtwcm9wZXJ0eS5uYW1lXSA9IHN1cGVyLmdldERlZmF1bHRWYWx1ZShwcm9wZXJ0eSwgKGVudGl0eU9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFyayB0aGUgcHJvcGVydHkgYXMgZXh0ZW5kZWQgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgKGV4dGVuZGVkUHJvcGVydGllcyBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIE9CSkVDVF9QUk9QRVJUWTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9iamVjdFZhbHVlID0gKGVudGl0eU9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGlzIGFuIG9iamVjdCBhbmQgbm90IGEgZm9ybSBncm91cCwgcmVjdXJzaXZlbHkgY3JlYXRlIGEgZm9ybSBncm91cCBmb3IgaXQgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdFZhbHVlICYmIG9iamVjdFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmICEob2JqZWN0VmFsdWUgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgb2JqZWN0VmFsdWUgaW5zdGFuY2VvZiBSeEZvcm1Hcm91cCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBmbGFncyB0byBpbmRpY2F0ZSBuZXN0ZWQgYmluZGluZy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNOZXN0ZWRCaW5kaW5nID0gdGhpcy5pc05lc3RlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvbmRpdGlvbmFsIG9iamVjdCBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHByb3BlcnR5IG5hbWUuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VDb250YWluZXIgJiYgaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxPYmplY3RQcm9wcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMuZmlsdGVyKCh0OiBhbnkpID0+IHQub2JqZWN0UHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvbmRpdGlvbmFsIG9iamVjdCBwcm9wZXJ0aWVzIGZvciBidWlsZGVyIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgcHJvcGVydHkgbmFtZS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlICYmIHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxPYmplY3RQcm9wcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzID0gdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcigodDogYW55KSA9PiB0Lm9iamVjdFByb3BOYW1lID09IHByb3BlcnR5Lm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgY3VycmVudCBmb3JtIGdyb3VwIG90aGVyIHZhbGlkYXRvciBpZiBhdmFpbGFibGUuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcGVydHkubmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgPSB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wZXJ0eS5uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPYnRhaW4gdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgbmVzdGVkIG9iamVjdC4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnID0gdGhpcy5nZXRWYWxpZGF0b3JDb25maWcoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uISwgb2JqZWN0VmFsdWUsIGAke3Byb3BlcnR5Lm5hbWV9LmApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9idGFpbiB0aGUgZW50aXR5IHRvIHVzZSBmb3IgdGhlIG5lc3RlZCBvYmplY3QuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50aXR5ID0gcHJvcGVydHkuZW50aXR5UHJvdmlkZXIgPyBwcm9wZXJ0eS5lbnRpdHlQcm92aWRlci5jYWxsKGVudGl0eU9iamVjdCkgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGEgZm9ybSBncm91cCBmb3IgdGhlIG5lc3RlZCBvYmplY3QuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUdyb3VwT2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gPSB0aGlzLmZvcm1Hcm91cChlbnRpdHkgfHwgcHJvcGVydHkuZW50aXR5IHx8IHRoaXMuZ2V0RW50aXR5KG9iamVjdFZhbHVlLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hLCBwcm9wZXJ0eS5uYW1lLCB0cnVlKSwgb2JqZWN0VmFsdWUsIG9iamVjdFZhbGlkYXRpb25Db25maWcpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGZsYWdzIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgbmVzdGVkIGJpbmRpbmcuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTmVzdGVkQmluZGluZyA9IHRoaXMuaXNOZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgYSBmb3JtIGdyb3VwLCB1c2UgaXQgYXMgaXMgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0VmFsdWUgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgb2JqZWN0VmFsdWUgaW5zdGFuY2VvZiBSeEZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gb2JqZWN0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQVJSQVlfUFJPUEVSVFk6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnJheU9iamVjdFZhbHVlID0gKGVudGl0eU9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHByb3BlcnR5IGlzIGFuIGFycmF5IGFuZCBub3QgYSBmb3JtIGFycmF5LCByZWN1cnNpdmVseSBjcmVhdGUgYSBmb3JtIGFycmF5IGZvciBpdCAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlPYmplY3RWYWx1ZSAmJiBhcnJheU9iamVjdFZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgIShhcnJheU9iamVjdFZhbHVlIGluc3RhbmNlb2YgRm9ybUFycmF5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGZsYWdzIHRvIGluZGljYXRlIG5lc3RlZCBiaW5kaW5nLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc05lc3RlZEJpbmRpbmcgPSB0aGlzLmlzTmVzdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGFuIGFycmF5IHRvIGhvbGQgZm9ybSBncm91cHMgZm9yIGVhY2ggc3ViLW9iamVjdCBpbiB0aGUgYXJyYXkuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybUFycmF5R3JvdXAgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50aXR5ID0gcHJvcGVydHkuZW50aXR5UHJvdmlkZXIgPyBwcm9wZXJ0eS5lbnRpdHlQcm92aWRlci5jYWxsKGVudGl0eU9iamVjdCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZyA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXRlcmF0ZSBvdmVyIGVhY2ggc3ViLW9iamVjdCBpbiB0aGUgYXJyYXkuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWJPYmplY3Qgb2YgYXJyYXlPYmplY3RWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb25kaXRpb25hbCBvYmplY3QgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgY3VycmVudCBwcm9wZXJ0eSBuYW1lIGFuZCBhcnJheSBpbmRleC4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VDb250YWluZXIgJiYgaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxPYmplY3RQcm9wcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcigodDogYW55KSA9PiB0Lm9iamVjdFByb3BOYW1lID09IHByb3BlcnR5Lm5hbWUgJiYgdC5hcnJheUluZGV4ID09IGluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgJiYgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbE9iamVjdFByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzID0gdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcigodDogYW55KSA9PiB0Lm9iamVjdFByb3BOYW1lID09IHByb3BlcnR5Lm5hbWUgJiYgdC5hcnJheUluZGV4ID09IGluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgY3VycmVudCBmb3JtIGdyb3VwIG90aGVyIHZhbGlkYXRvciBpZiBhdmFpbGFibGUuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BlcnR5Lm5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BlcnR5Lm5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT2J0YWluIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIHN1Yi1vYmplY3QuICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZyA9IHRoaXMuZ2V0VmFsaWRhdG9yQ29uZmlnKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEsIHN1Yk9iamVjdCwgYCR7cHJvcGVydHkubmFtZX0uYCwgYCR7cHJvcGVydHkubmFtZX1bJHtpbmRleH1dLmApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDcmVhdGUgYSBmb3JtIGdyb3VwIGZvciB0aGUgc3ViLW9iamVjdCBhbmQgYWRkIGl0IHRvIHRoZSBmb3JtQXJyYXlHcm91cCBhcnJheS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQXJyYXlHcm91cC5wdXNoKHRoaXMuZm9ybUdyb3VwKGVudGl0eSB8fCBwcm9wZXJ0eS5lbnRpdHkgfHwgdGhpcy5nZXRFbnRpdHkoc3ViT2JqZWN0LCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24hLCBwcm9wZXJ0eS5uYW1lLCB0cnVlKSwgc3ViT2JqZWN0LCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCB0aGUgaW5kZXguICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgY29uZGl0aW9uYWwgb2JqZWN0IHByb3BlcnRpZXMgYW5kIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBjb25kaXRpb25hbCBvYmplY3QgcHJvcGVydGllcy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9idGFpbiBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMgZm9yIHRoZSBwcm9wZXJ0eS4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhYnN0cmFjdENvbnRyb2xPcHRpb25zID0gdGhpcy5nZXRBYnN0cmFjdENvbnRyb2xPcHRpb25zKHByb3BlcnR5Lm5hbWUsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEsIHt9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDcmVhdGUgYSBuZXcgUnhGb3JtQXJyYXkgdXNpbmcgdGhlIGFycmF5T2JqZWN0VmFsdWUgYW5kIHRoZSBmb3JtQXJyYXlHcm91cCwgYWxvbmcgd2l0aCB0aGUgYWJzdHJhY3QgY29udHJvbCBvcHRpb25zLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdID0gbmV3IFJ4Rm9ybUFycmF5KGFycmF5T2JqZWN0VmFsdWUsIGZvcm1BcnJheUdyb3VwLCBhYnN0cmFjdENvbnRyb2xPcHRpb25zLCBudWxsLCBwcm9wZXJ0eS5hcnJheUNvbmZpZyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgYXV0b0luc3RhbmNlUHVzaCBpcyBlbmFibGVkLCBvdmVycmlkZSB0aGUgcHVzaCBhbmQgc3BsaWNlIG1ldGhvZHMgb2YgdGhlIGFycmF5T2JqZWN0VmFsdWUgdG8gbWFuYWdlIGZvcm0gZ3JvdXBzIGR5bmFtaWNhbGx5LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWN0aXZlRm9ybUNvbmZpZy5hdXRvSW5zdGFuY2VQdXNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlPYmplY3RWYWx1ZS5wdXNoID0gKGluc3RhbmNlOiBhbnlbXSk6IG51bWJlciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1Hcm91cChpbnN0YW5jZS5jb25zdHJ1Y3RvciwgaW5zdGFuY2UsIG9iamVjdFZhbGlkYXRpb25Db25maWchKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdLnB1c2goZm9ybUdyb3VwLCB7IGlzQWRkZWRJbnN0YW5jZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlPYmplY3RWYWx1ZS5zcGxpY2UgPSAoc3RhcnQsIGRlbGV0ZUNvdW50KTogYW55W10gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gKHN0YXJ0ICsgZGVsZXRlQ291bnQhKSAtIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1Hcm91cE9iamVjdCBhcyBhbnkpW3Byb3BlcnR5Lm5hbWVdLnJlbW92ZUF0KGksIHsgaXNSZW1vdmVkSW5zdGFuY2U6IHRydWUgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgZmxhZ3MgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiBuZXN0ZWQgYmluZGluZy4gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNOZXN0ZWRCaW5kaW5nID0gdGhpcy5pc05lc3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgaXMgYWxyZWFkeSBhIGZvcm0gYXJyYXksIHVzZSBpdCBhcyBpcyAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcnJheU9iamVjdFZhbHVlIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUdyb3VwT2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gPSBhcnJheU9iamVjdFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgY29uZmlndXJhdGlvbiBzcGVjaWZpZXMgY3JlYXRpbmcgYSBibGFuayBmb3JtIGFycmF5LCBjcmVhdGUgb25lICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmFycmF5Q29uZmlnICYmIHByb3BlcnR5LmFycmF5Q29uZmlnLmNyZWF0ZUJsYW5rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUdyb3VwT2JqZWN0IGFzIGFueSlbcHJvcGVydHkubmFtZV0gPSBuZXcgUnhGb3JtQXJyYXkoW10sIFtdLCBudWxsLCBudWxsLCBwcm9wZXJ0eS5hcnJheUNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8qIElmIG5vIG5lc3RlZCBmb3JtIGdyb3VwcyBvciBhcnJheXMgYXJlIGNyZWF0ZWQsIHJlc2V0IGNvbmRpdGlvbmFsIHZhbGlkYXRpb24gaW5zdGFuY2UgYW5kIHJlbGF0ZWQgcHJvcGVydGllcy4gKi9cclxuICAgICAgICBpZiAoIXRoaXMuaXNOZXN0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZSA9IHt9O1xyXG4gICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogU2V0IGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucyBmb3IgdGhlIGZvcm0gZ3JvdXAgYmFzZWQgb24gZm9ybSBidWlsZGVyIGNvbmZpZ3VyYXRpb24uICovXHJcbiAgICAgICAgbGV0IGFic3RyYWN0Q29udHJvbE9wdGlvbnM6IEFic3RyYWN0Q29udHJvbE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtdLFxyXG4gICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnM6IFtdLFxyXG4gICAgICAgICAgICB1cGRhdGVPbjogZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uICYmIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5hYnN0cmFjdENvbnRyb2xPcHRpb25zICYmIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5hYnN0cmFjdENvbnRyb2xPcHRpb25zWydnbG9iYWwnXVxyXG4gICAgICAgICAgICAgICAgPyBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9uc1snZ2xvYmFsJ11cclxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyogT2J0YWluIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucyBmb3IgdGhlIGdsb2JhbCBwcm9wZXJ0eS4gKi9cclxuICAgICAgICBhYnN0cmFjdENvbnRyb2xPcHRpb25zID0gdGhpcy5nZXRBYnN0cmFjdENvbnRyb2xPcHRpb25zKFwiZ2xvYmFsXCIsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiEsIGFic3RyYWN0Q29udHJvbE9wdGlvbnMpO1xyXG5cclxuICAgICAgICAvKiBDcmVhdGUgYSBuZXcgUnhGb3JtR3JvdXAgdXNpbmcgdGhlIG1vZGVsLCBlbnRpdHkgb2JqZWN0LCBmb3JtR3JvdXBPYmplY3QsIGFuZCBhYnN0cmFjdCBjb250cm9sIG9wdGlvbnMuICovXHJcbiAgICAgICAgdmFyIGZvcm1Hcm91cDogUnhGb3JtR3JvdXAgPSBuZXcgUnhGb3JtR3JvdXAoanNvbi5tb2RlbCwganNvbi5lbnRpdHlPYmplY3QsIGZvcm1Hcm91cE9iamVjdCwgYWJzdHJhY3RDb250cm9sT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIC8qIElmIGV4cGVyaW1lbnRhbCBtb2RlIGlzIGVuYWJsZWQsIGFzc2lnbiB0aGUgZm9ybSBncm91cCB0byB0aGUgZW50aXR5IG9iamVjdCBhbmQgb3ZlcnJpZGUgcHJvcGVydGllcyBpZiBuZWVkZWQuICovXHJcbiAgICAgICAgaWYgKGRlZmF1bHRDb250YWluZXIuaXNFeHBlcmltZW50YWwpIHtcclxuICAgICAgICAgICAganNvbi5lbnRpdHlPYmplY3RbXCJmb3JtR3JvdXBcIl0gPSBmb3JtR3JvdXA7XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVQcm9wZXJ0aWVzKGZvcm1Hcm91cCwganNvbi5lbnRpdHlPYmplY3QsIGV4dGVuZGVkUHJvcGVydGllcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBJZiBub3QgaW4gbmVzdGVkIGJpbmRpbmcgbW9kZSBhbmQgZm9ybUdyb3VwIGlzIG5vdCBwcmV2aW91c2x5IGNhbGxlZCwgcmVmcmVzaCBkaXNhYmxlIHN0YXR1cyBvZiB0aGUgZm9ybSBncm91cC4gKi9cclxuICAgICAgICBpZiAoIXRoaXMuaXNOZXN0ZWRCaW5kaW5nICYmICF0aGlzLmlzR3JvdXBDYWxsZWQpIHtcclxuICAgICAgICAgICAgZm9ybUdyb3VwLnJlZnJlc2hEaXNhYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZm9ybUdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3ZlcnJpZGVzIHByb3BlcnRpZXMgaW4gdGhlIGZvcm0gZ3JvdXAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGVudGl0eSBvYmplY3QgYW5kIHByb3BlcnRpZXMuXHJcbiAgICAgKiBAcGFyYW0gZm9ybUdyb3VwIFRoZSBSeEZvcm1Hcm91cCBpbnN0YW5jZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzLlxyXG4gICAgICogQHBhcmFtIGVudGl0eU9iamVjdCBUaGUgZW50aXR5IG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgdG8gb3ZlcnJpZGUgYXMga2V5cy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvdmVycmlkZVByb3BlcnRpZXMoZm9ybUdyb3VwOiBSeEZvcm1Hcm91cCwgZW50aXR5T2JqZWN0OiBhbnksIHByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9KSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcGVydGllcykuZm9yRWFjaCh0ID0+IHRoaXMub3ZlcnJpZGVQcm9wKGVudGl0eU9iamVjdCwgdCwgZm9ybUdyb3VwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucyBmb3IgYSBnaXZlbiBjb250cm9sIG5hbWUuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb250cm9sLlxyXG4gICAgICogQHBhcmFtIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiBUaGUgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIGNvbnRhaW5pbmcgdGhlIGFic3RyYWN0IGNvbnRyb2wgb3B0aW9ucy5cclxuICAgICAqIEBwYXJhbSBhYnN0cmFjdENvbnRyb2xPcHRpb25zIFRoZSBleGlzdGluZyBBYnN0cmFjdENvbnRyb2xPcHRpb25zLlxyXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgQWJzdHJhY3RDb250cm9sT3B0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRBYnN0cmFjdENvbnRyb2xPcHRpb25zKG5hbWU6IHN0cmluZywgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uOiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGFic3RyYWN0Q29udHJvbE9wdGlvbnM6IEFic3RyYWN0Q29udHJvbE9wdGlvbnMpIHtcclxuICAgICAgICAvKiBVcGRhdGUgdXBkYXRlT24gb3B0aW9uIGlmIGRlZmluZWQgaW4gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9ucyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9uc1tuYW1lXSkge1xyXG4gICAgICAgICAgICBhYnN0cmFjdENvbnRyb2xPcHRpb25zLnVwZGF0ZU9uID0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbbmFtZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBDaGVjayBpZiBjb250cm9sT3B0aW9ucyBhcmUgZGVmaW5lZCBpbiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICBjb25zdCBjb250cm9sT3B0aW9ucyA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiA/IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5iYXNlQWJzdHJhY3RDb250cm9sT3B0aW9ucyA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xPcHRpb25zICYmIGNvbnRyb2xPcHRpb25zW25hbWVdKSB7XHJcbiAgICAgICAgICAgIC8qIFVwZGF0ZSB1cGRhdGVPbiBvcHRpb24gZnJvbSBjb250cm9sT3B0aW9ucyBpZiBkZWZpbmVkICovXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sT3B0aW9uc1tuYW1lXS51cGRhdGVPbikge1xyXG4gICAgICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucy51cGRhdGVPbiA9IGNvbnRyb2xPcHRpb25zW25hbWVdLnVwZGF0ZU9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiBBZGQgdmFsaWRhdG9ycyBmcm9tIGNvbnRyb2xPcHRpb25zIGlmIGRlZmluZWQgKi9cclxuICAgICAgICAgICAgaWYgKGNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxWYWxpZGF0b3JGbltdPmNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKHZhbGlkYXRvciA9PiAoPFZhbGlkYXRvckZuW10+YWJzdHJhY3RDb250cm9sT3B0aW9ucy52YWxpZGF0b3JzKS5wdXNoKHZhbGlkYXRvcikpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICg8VmFsaWRhdG9yRm5bXT5hYnN0cmFjdENvbnRyb2xPcHRpb25zLnZhbGlkYXRvcnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5wdXNoKDxWYWxpZGF0b3JGbj5jb250cm9sT3B0aW9uc1tuYW1lXS52YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogQWRkIGFzeW5jIHZhbGlkYXRvcnMgZnJvbSBjb250cm9sT3B0aW9ucyBpZiBkZWZpbmVkICovXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sT3B0aW9uc1tuYW1lXS5hc3luY1ZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xPcHRpb25zW25hbWVdLmFzeW5jVmFsaWRhdG9ycykpIHtcclxuICAgICAgICAgICAgICAgICAgICAoPFZhbGlkYXRvckZuW10+Y29udHJvbE9wdGlvbnNbbmFtZV0uYXN5bmNWYWxpZGF0b3JzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCh2YWxpZGF0b3IgPT4gKDxWYWxpZGF0b3JGbltdPmFic3RyYWN0Q29udHJvbE9wdGlvbnMuYXN5bmNWYWxpZGF0b3JzKS5wdXNoKHZhbGlkYXRvcikpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICg8VmFsaWRhdG9yRm5bXT5hYnN0cmFjdENvbnRyb2xPcHRpb25zLmFzeW5jVmFsaWRhdG9ycylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnB1c2goPFZhbGlkYXRvckZuPmNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYWJzdHJhY3RDb250cm9sT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRlcyBhIHByb3BlcnR5IG9uIHRoZSBlbnRpdHkgb2JqZWN0IHdpdGggY3VzdG9tIGdldHRlcnMgYW5kIHNldHRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbnRpdHlPYmplY3QgVGhlIGVudGl0eSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmVlZHMgdG8gYmUgb3ZlcnJpZGRlbi5cclxuICAgICAqIEBwYXJhbSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgb3ZlcnJpZGRlbi5cclxuICAgICAqIEBwYXJhbSBmb3JtR3JvdXAgVGhlIFJ4Rm9ybUdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXR5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvdmVycmlkZVByb3AoZW50aXR5T2JqZWN0OiBhbnksIHByb3BOYW1lOiBzdHJpbmcsIGZvcm1Hcm91cDogUnhGb3JtR3JvdXApIHtcclxuICAgICAgICAvKiBHZXQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgYW5kIGN1cnJlbnQgdmFsdWUgKi9cclxuICAgICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKGVudGl0eU9iamVjdCksIHByb3BOYW1lKTtcclxuICAgICAgICBsZXQgdmFsdWUgPSBlbnRpdHlPYmplY3RbcHJvcE5hbWVdO1xyXG4gICAgICAgIGxldCBvbGRWYWx1ZTogYW55ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyogRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIGN1c3RvbSBnZXR0ZXJzIGFuZCBzZXR0ZXJzICovXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVudGl0eU9iamVjdCwgcHJvcE5hbWUsIHtcclxuICAgICAgICAgICAgLyogQ3VzdG9tIGdldHRlciAqL1xyXG4gICAgICAgICAgICBnZXQ6ICgpID0+IHsgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLmdldCEuY2FsbChlbnRpdHlPYmplY3QpIDogdmFsdWUgfSxcclxuICAgICAgICAgICAgLyogQ3VzdG9tIHNldHRlciAqL1xyXG4gICAgICAgICAgICBzZXQ6ICh2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHY7XHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB2YWx1ZSBoYXMgY2hhbmdlZCAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IHYpIHtcclxuICAgICAgICAgICAgICAgICAgICAvKiBDYWxsIHRoZSBvcmlnaW5hbCBzZXR0ZXIgaWYgZGVmaW5lZCAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0IS5jYWxsKGVudGl0eU9iamVjdCwgdik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBjb250cm9sIGluIHRoZSBmb3JtIGdyb3VwICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtR3JvdXAuY2hhbmdpbmcgJiYgZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtR3JvdXAuY29udHJvbHNbcHJvcE5hbWVdLnNldFZhbHVlKHYpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgb2xkIHZhbHVlICovXHJcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZSA9IHY7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iXX0=
|