{"version":3,"sources":["node_modules/browser-pack/_prelude.js","app/account/_module.js","app/account/components/change-password-page.js","app/account/components/forgot-password-page.js","app/account/components/login-page.js","app/account/components/logout-page.js","app/account/components/reset-password-page.js","app/account/services/favorites.js","app/account/services/user-account.js","app/additional-codes/_module.js","app/additional-codes/components/additional-code-picker.js","app/additional-codes/components/additional-codes-page.js","app/additional-codes/components/measure-additional-code-buttons.js","app/additional-codes/components/measure-additional-codes-expanded.js","app/additional-codes/filters/additional-code-typeahead-filter.js","app/additional-codes/modals/additional-code-selector.js","app/additional-codes/services/additional-codes-data.js","app/app.js","app/atr/_module.js","app/atr/components/atr-button.js","app/atr/components/atr-details.js","app/atr/components/atr-form.js","app/atr/components/atr-images.js","app/atr/components/atr-list.js","app/atr/components/atr-search-page.js","app/atr/modals/atr.js","app/atr/services/atr-data.js","app/belastingdienst/_module.js","app/belastingdienst/components/belastingdienst-page.js","app/belastingdienst/services/belastingdienst-data.js","app/bti/_module.js","app/bti/components/bti-button.js","app/bti/components/bti-details.js","app/bti/components/bti-form.js","app/bti/components/bti-images.js","app/bti/components/bti-list.js","app/bti/components/bti-search-page.js","app/bti/modals/bti.js","app/bti/services/bti-data.js","app/case-law/_module.js","app/case-law/components/case-law-button.js","app/case-law/components/case-law-links-to-news.js","app/case-law/components/case-law-news-page.js","app/case-law/components/case-law-news.js","app/case-law/components/case-law-subnav.js","app/case-law/components/eu-case-law-list-item.js","app/case-law/components/eu-case-law-news-item.js","app/case-law/components/eu-case-law-page.js","app/case-law/components/eu-case-law-summary-button.js","app/case-law/components/nl-case-law-list-item.js","app/case-law/components/nl-case-law-news-item.js","app/case-law/components/nl-case-law-page.js","app/case-law/modals/case-law-modal.js","app/case-law/modals/eu-case-law-summary-modal.js","app/case-law/modals/nl-case-law-judgment-modal.js","app/case-law/services/case-law-data.js","app/case-law/services/eu-case-law-data.js","app/case-law/services/nl-case-law-data.js","app/certificate-codes/_module.js","app/certificate-codes/components/certificate-code-picker.js","app/certificate-codes/components/certificate-codes-page.js","app/certificate-codes/filters/certificate-code-typeahead-filter.js","app/certificate-codes/modals/certificate-code-selector.js","app/certificate-codes/services/certificate-codes-data.js","app/classification-regulations/_module.js","app/classification-regulations/components/classification-regulation-new.js","app/classification-regulations/components/classification-regulation-old.js","app/classification-regulations/components/classification-regulation.js","app/classification-regulations/components/search-classification-regulations-english-page.js","app/classification-regulations/components/search-classification-regulations-page.js","app/classification-regulations/components/tarifering.js","app/classification-regulations/modals/classification-regulations-en.js","app/classification-regulations/modals/classification-regulations.js","app/classification-regulations/services/search-classification-regulations-english.js","app/classification-regulations/services/search-classification-regulations.js","app/compliance/_module.js","app/compliance/components/compliance-details-page.js","app/compliance/components/compliance-new-page.js","app/compliance/components/compliance-overview-page.js","app/compliance/filters/job-status-display.js","app/compliance/modals/compliance-info.js","app/compliance/modals/modals.js","app/compliance/services/compliance-data.js","app/config.js","app/core/_module.js","app/core/controllers/preloader.js","app/core/directives/convert-to-number.js","app/core/directives/has-permission.js","app/core/directives/ng-enter.js","app/core/directives/repeat-delimiter.js","app/core/directives/scroll-to-top-when.js","app/core/services.common/auth-check.js","app/core/services.common/common.js","app/core/services.common/error-handling.js","app/core/services.common/formatting.js","app/core/services.common/identity.js","app/core/services.common/interaction.js","app/core/services.common/language.js","app/core/services.common/notifications.js","app/core/services.common/preloader.js","app/core/services.common/version-history.js","app/core/services.data/data-context.js","app/core/services.data/preferences.js","app/core/services.data/serialization.js","app/core/services.state/application-state.js","app/correlation-table/_module.js","app/correlation-table/components/correlation-table-news-page.js","app/correlation-table/components/correlation-table-page.js","app/correlation-table/components/correlation-table-subnav.js","app/correlation-table/components/correlation-table.js","app/correlation-table/components/hs-2022-backward-page.js","app/correlation-table/components/hs-2022-backward.js","app/correlation-table/components/hs-2022-forward-page.js","app/correlation-table/components/hs-2022-forward.js","app/correlation-table/services/correlation-data.js","app/customs-value/_module.js","app/customs-value/components/transaction-value-calculator-page.js","app/customs-value/components/transaction-value-calculator.js","app/customs-value/components/transaction-value-component.js","app/customs-value/modals/transaction-value-calculator.js","app/customs-value/services/transaction-value-data.js","app/dashboard/_module.js","app/dashboard/components/landing-page.js","app/dashboard/modals/first-login.js","app/documentation/_module.js","app/documentation/components/documentation-button.js","app/documentation/services/documentation-service.js","app/duty/_module.js","app/duty/services/duty-data.js","app/ecics/_module.js","app/ecics/components/ecics-button.js","app/ecics/components/ecics-details.js","app/ecics/components/ecics-form.js","app/ecics/components/ecics-images.js","app/ecics/components/ecics-list.js","app/ecics/components/ecics-search-page.js","app/ecics/modals/ecics-modal.js","app/ecics/services/ecics-data.js","app/exchange-rates/_module.js","app/exchange-rates/components/currency-picker.js","app/exchange-rates/components/exchange-rates-page.js","app/exchange-rates/components/monetary-value-input.js","app/exchange-rates/filters/currency-typeahead-filter.js","app/exchange-rates/modals/currency-selector.js","app/exchange-rates/services/exchange-rate-data.js","app/ezt/_module.js","app/ezt/components/ezt-excise-code-picker.js","app/ezt/components/ezt-hinweise.js","app/ezt/components/ezt-nomenclature.js","app/ezt/components/ezt-texts-page.js","app/ezt/filters/ezt-excise-code-typeahead-filter.js","app/ezt/modals/ezt-excise-code-selector.js","app/ezt/services/ezt-data.js","app/footnotes/_module.js","app/footnotes/components/footnote-buttons.js","app/footnotes/components/footnote-overview-page.js","app/footnotes/modals/footnote.js","app/footnotes/modals/modals.js","app/footnotes/services/footnote-data.js","app/geography/_module.js","app/geography/components/country-picker.js","app/geography/components/region-display.js","app/geography/components/region-overview-page.js","app/geography/modals/modals.js","app/geography/modals/region.js","app/geography/services/country-data.js","app/geography/services/region-data.js","app/good/_module.js","app/good/components/anti-dumping-financial-measures.js","app/good/components/customs-value-check-result.js","app/good/components/duty-calculation-result.js","app/good/components/export-measures.js","app/good/components/favorite-button.js","app/good/components/financial-measure.js","app/good/components/general-measure.js","app/good/components/german-excise-measures.js","app/good/components/german-vat-measures.js","app/good/components/grouped-financial-measures.js","app/good/components/grouped-general-measures.js","app/good/components/grouped-vat-measures.js","app/good/components/import-measures-col-1.js","app/good/components/import-measures-col-2.js","app/good/components/measure-condition-buttons.js","app/good/components/measure-condition-groups-expanded.js","app/good/components/measure-many-condition-buttons.js","app/good/components/measure-preference-code-buttons.js","app/good/components/reference-date-and-country.js","app/good/controllers/good.js","app/good/directives/form/measure-filters-export-small.js","app/good/directives/form/measure-filters-import-small.js","app/good/directives/form/measure-filters-import.js","app/good/directives/form/value-quantity-import.js","app/good/modals/meursing-code.js","app/good/modals/modals.js","app/good/modals/uk-certificate-guidance.js","app/good/services/good-data.js","app/good/services/good-display.js","app/good/services/good-models.js","app/good/services/measure-grouping.js","app/links/_module.js","app/links/components/case-law-link-page.js","app/links/components/eur-lex-link-page.js","app/measure-types/_module.js","app/measure-types/components/measure-type-picker.js","app/measure-types/filters/measure-type-typeahead-filter.js","app/measure-types/modals/measure-type-selector.js","app/measure-types/services/measure-types-data.js","app/news/_module.js","app/news/components/case-law-links.js","app/news/components/case-law-news-page.js","app/news/components/news-overview-page.js","app/news/components/news-subnav.js","app/news/services/news-data.js","app/nomenclature/_module.js","app/nomenclature/components/chapter-page.js","app/nomenclature/components/commodity-code-description.js","app/nomenclature/components/export-refund-nomenclature.js","app/nomenclature/components/nomenclature-chapter.js","app/nomenclature/components/nomenclature-groups.js","app/nomenclature/components/nomenclature-heading.js","app/nomenclature/components/nomenclature-section.js","app/nomenclature/components/sections-page.js","app/nomenclature/components/tares-statistical-key-row.js","app/nomenclature/components/taric-code-row.js","app/nomenclature/services/nomenclature-data.js","app/nomenclature/services/nomenclature-tree.js","app/patterns/_module.js","app/patterns/components/background-pattern-01.js","app/patterns/components/background-pattern-02.js","app/preference-codes/_module.js","app/preference-codes/components/preference-code-button.js","app/preference-codes/components/preference-code-picker.js","app/preference-codes/filters/preference-code-typeahead-filter.js","app/preference-codes/modals/preference-code-selector.js","app/preference-codes/modals/preference-code.js","app/preference-codes/services/preference-code-data.js","app/quota/_module.js","app/quota/components/order-number-picker.js","app/quota/components/ordernumber-button.js","app/quota/components/uk-ordernumber-button.js","app/quota/filters/order-number-typeahead-filter.js","app/quota/modals/modals.js","app/quota/modals/order-quota.js","app/quota/modals/uk-order-quota.js","app/quota/services/quota-data.js","app/reference-date/_module.js","app/reference-date/components/reference-date-picker.js","app/reference-date/services/reference-date.js","app/referenceprices/_module.js","app/referenceprices/components/overview-page.js","app/referenceprices/services/referenceprices-data.js","app/regulations/_module.js","app/regulations/components/regulation-button.js","app/regulations/components/regulation-details-page.js","app/regulations/components/regulation.js","app/regulations/components/regulations-button.js","app/regulations/components/regulations-news-page.js","app/regulations/components/regulations-news.js","app/regulations/filters/celex-to-regulation-number.js","app/regulations/modals/regulation.js","app/regulations/modals/regulations.js","app/regulations/services/regulations-data.js","app/search/_module.js","app/search/components/found-texts.js","app/search/components/header-search-box.js","app/search/components/heading-search-results.js","app/search/components/large-search-box.js","app/search/components/nomenclature-search-form.js","app/search/components/pages/search-alphabetical-index.js","app/search/components/pages/search-annotations.js","app/search/components/pages/search-ccc-conclusions.js","app/search/components/pages/search-eu-explanatory-notes.js","app/search/components/pages/search-explanatory-notes-germany.js","app/search/components/pages/search-heading.js","app/search/components/pages/search-texts-germany.js","app/search/components/pages/search-wco-classification-opinions.js","app/search/components/pages/search-wco-explanatory-notes.js","app/search/components/pages/search.js","app/search/components/search-form.js","app/search/components/search-sub-nav.js","app/search/controllers/search-box.js","app/search/services/search.js","app/tares/_module.js","app/tares/components/tares-measures-page.js","app/tares/services/tares-statistical-keys-data.js","app/tares/services/tares-tariff-data.js","app/texts/_module.js","app/texts/components/annotation-button.js","app/texts/components/annotation.js","app/texts/components/ccc-conclusion.js","app/texts/components/explanatory-note-button.js","app/texts/components/note-source.js","app/texts/components/wco-classification-opinion.js","app/texts/modals/annotations.js","app/texts/modals/explanatory-note.js","app/texts/services/annotations-data.js","app/texts/services/text-data.js","app/trade-movement/_module.js","app/trade-movement/services/trade-movement.js","app/trade-statistics/_module.js","app/trade-statistics/components/trade-statistics-page.js","app/trade-statistics/components/trade-statistics-table.js","app/trade-statistics/services/trade-statistics-data.js","app/translations/en/_index.js","app/translations/en/account.js","app/translations/en/atr.js","app/translations/en/bti.js","app/translations/en/case-law.js","app/translations/en/classification-regulation.js","app/translations/en/compliance.js","app/translations/en/conclusion.js","app/translations/en/correlation-table.js","app/translations/en/customs-value-check.js","app/translations/en/customs-value.js","app/translations/en/dashboard.js","app/translations/en/documentation.js","app/translations/en/ecics.js","app/translations/en/exchange-rates.js","app/translations/en/ezt.js","app/translations/en/form-labels.js","app/translations/en/goods.js","app/translations/en/main-menu.js","app/translations/en/news.js","app/translations/en/nomenclature.js","app/translations/en/quota.js","app/translations/en/referenceprices.js","app/translations/en/regulation.js","app/translations/en/search.js","app/translations/en/shared-messages.js","app/translations/en/shared-ui.js","app/translations/en/sort-options.js","app/translations/en/status.js","app/translations/en/tares.js","app/translations/en/taric.js","app/translations/en/trade-statistics.js","app/translations/en/validate-business-info.js","app/translations/en/validation-errors.js","app/translations/it/_index.js","app/translations/it/bti.js","app/translations/it/classification-regulation.js","app/translations/it/dashboard.js","app/translations/it/exchange-rates.js","app/translations/it/goods.js","app/translations/it/nomenclature.js","app/translations/it/shared-ui.js","app/translations/it/taric.js","app/translations/nl/_index.js","app/translations/nl/account.js","app/translations/nl/atr.js","app/translations/nl/bti.js","app/translations/nl/case-law.js","app/translations/nl/classification-regulation.js","app/translations/nl/compliance.js","app/translations/nl/conclusion.js","app/translations/nl/correlation-table.js","app/translations/nl/customs-value-check.js","app/translations/nl/customs-value.js","app/translations/nl/dashboard.js","app/translations/nl/documentation.js","app/translations/nl/ecics.js","app/translations/nl/exchange-rates.js","app/translations/nl/ezt.js","app/translations/nl/form-labels.js","app/translations/nl/goods.js","app/translations/nl/main-menu.js","app/translations/nl/news.js","app/translations/nl/nomenclature.js","app/translations/nl/quota.js","app/translations/nl/referenceprices.js","app/translations/nl/regulation.js","app/translations/nl/search.js","app/translations/nl/shared-messages.js","app/translations/nl/shared-ui.js","app/translations/nl/sort-options.js","app/translations/nl/status.js","app/translations/nl/taric.js","app/translations/nl/trade-statistics.js","app/translations/nl/validate-business-info.js","app/translations/nl/validation-errors.js","app/units/_module.js","app/units/filters/is-not-retail-price.js","app/units/filters/is-retail-price.js","app/validate-business-info/_module.js","app/validate-business-info/components/validate-business-info-cd-form.js","app/validate-business-info/components/validate-business-info-eori-form.js","app/validate-business-info/components/validate-business-info-rex-form.js","app/validate-business-info/components/validate-business-info-subnav.js","app/validate-business-info/components/validate-business-info-vat-form.js","app/validate-business-info/modals/validate-business-info-rex-modal.js","app/validate-business-info/services/validate-business-info-data.js","app/vat-rates/_module.js","app/vat-rates/components/vat-measure.js","app/vat-rates/components/vat-rates.js","app/vat-rates/services/vat-rates-data.js","app/widgets/_module.js","app/widgets/components/feedback-button.js","app/widgets/components/goodscode-scroller.js","app/widgets/components/loading-indicator/loading-indicator-block.js","app/widgets/components/loading-indicator/loading-indicator-inline.js","app/widgets/components/loading-indicator/loading-indicator-small.js","app/widgets/components/modal-print-button.js","app/widgets/components/navbar-language-dropdown.js","app/widgets/components/navbar.js","app/widgets/components/print-button.js","app/widgets/components/recent-code-button.js","app/widgets/components/reference-country-picker.js","app/widgets/components/taric-status.js","app/widgets/components/translated-text.js","app/widgets/filters/add-hyperlinks.js","app/widgets/filters/country-typeahead-filter.js","app/widgets/filters/format-description.js","app/widgets/filters/format-duty.js","app/widgets/filters/format-ezt-code.js","app/widgets/filters/format-gn-code.js","app/widgets/filters/format-taric-code.js","app/widgets/filters/has-additional-code.js","app/widgets/filters/has-country.js","app/widgets/filters/highlight.js","app/widgets/filters/strip-taric-code.js","app/widgets/filters/taric-code-to-chapter-number.js","app/widgets/filters/taric-dashes.js","app/widgets/filters/to-currency-sign.js","app/widgets/filters/to-fixed.js","app/widgets/filters/trim.js","app/widgets/filters/trust.js","app/widgets/modals/are-you-sure.js","app/widgets/modals/logging-out.js","app/widgets/modals/modals.js","app/widgets/services/taric-status.js"],"names":[],"mappings":"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Cb,aAAa;QACT,SAAS;YACL,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,IAAI;;;IAGZ,eAAe;IACf,aAAa;;AAEjB;AClBA;AACA,OAAO,UAAU;IACb,KAAK;QACD,OAAO;;IAEX,QAAQ;QACJ,MAAM;QACN,cAAc;QACd,eAAe;QACf,QAAQ;;IAEZ,SAAS;QACL,OAAO;;IAEX,SAAS;QACL,OAAO;QACP,SAAS;QACT;YACI;YACA;YACA;YACA;YACA;YACA;YACA;QACJ;YACI;YACA;YACA;;IAER,UAAU;QACN;YACI;YACA;QACJ,gBAAgB;QAChB;YACI;YACA;YACA;YACA;;IAER,kBAAkB;QACd,OAAO;QACP,kBAAkB;QAClB,mBAAmB;;IAEvB,MAAM;QACF,OAAO;QACP;YACI;YACA;YACA;YACA;;IAER,KAAK;QACD,OAAO;QACP;YACI;YACA;YACA;YACA;;IAER,QAAQ;QACJ,qBAAqB;QACrB,qBAAqB;QACrB;YACI;YACA;YACA;;IAER,aAAa;QACT,cAAc;QACd;YACI;YACA;QACJ;YACI;YACA;YACA;YACA;QACJ;YACI;;;IAGR,UAAU;QACN,OAAO;QACP,UAAU;QACV,MAAM;QACN,MAAM;QACN,KAAK;QACL,kBAAkB;QAClB,iBAAiB;QACjB,SAAS;;IAEb,UAAU;QACN;YACI;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;QACJ;YACI;YACA;QACJ;YACI;YACA;YACA;QACJ;YACI;YACA;YACA;;IAER,MAAM;QACF;YACI;YACA;YACA;;IAER,IAAI;QACA,MAAM;QACN,MAAM;QACN,MAAM;QACN,UAAU;QACV,WAAW;;EAEjB;;AClIF;;;;AAIA,OAAO,UAAU;IACb,QAAQ;IACR,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,SAAS;IACT,KAAK;IACL,WAAW;IACX,OAAO;IACP,cAAc;IACd,eAAe;IACf,OAAO;IACP,UAAU;IACV,cAAc;IACd,OAAO;IACP,MAAM;IACN,OAAO;IACP,cAAc;IACd,OAAO;IACP,qBAA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","file":"app.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i'\r\n })\r\n .when('/account/forgot-password', {\r\n template: ''\r\n })\r\n .when('/account/login', {\r\n template: ''\r\n })\r\n .when('/account/logout', {\r\n template: ''\r\n })\r\n .when('/account/reset-password', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n controller: changePasswordPageController,\r\n templateUrl: 'account/components/change-password-page.html'\r\n}\r\n\r\nchangePasswordPageController.$inject = [\r\n '$analytics', \r\n '$translate', \r\n 'userAccountService',\r\n];\r\n\r\nfunction changePasswordPageController(\r\n $analytics, \r\n $translate, \r\n userAccountService\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n $postLink: focusInputField,\r\n changePassword: changePassword,\r\n checkStrength: checkStrength,\r\n model: {\r\n currentPassword: null,\r\n newPassword1: null,\r\n newPassword2: null,\r\n checks: {\r\n characters: false,\r\n lowercase: false,\r\n uppercase: false,\r\n nonalpha: false,\r\n number: false\r\n },\r\n passwordChangedSuccesfully: false,\r\n errorChangingPassword: false\r\n },\r\n status: {\r\n errors: [],\r\n translations: []\r\n }\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/change-password');\r\n }\r\n\r\n function focusInputField() {\r\n document.getElementById('currentPasswordInput').focus();\r\n }\r\n\r\n function changePassword() {\r\n var validation = validate();\r\n vm.status.errors = [];\r\n\r\n if (validation && validation.length > 0) {\r\n vm.status.errors = validation;\r\n return;\r\n }\r\n\r\n userAccountService.changePassword(vm.model.currentPassword, vm.model.newPassword1)\r\n .then(function (result) {\r\n if (result.IsSuccessful) {\r\n vm.model.passwordChangedSuccesfully = true;\r\n } else {\r\n for (var i = 0; i < result.Codes.length; i++) {\r\n result.Codes[i] = 'account.resetPassword.errors.dynamic.' + result.Codes[i];\r\n }\r\n vm.status.errors = result.Codes;\r\n }\r\n })\r\n .catch(function (error) {\r\n if (error && error.data && error.data.Message) {\r\n vm.status.errors = [error.data.Message];\r\n } else {\r\n vm.status.errors = [vm.status.translations['account.changePassword.errorChangingPassword']];\r\n }\r\n });\r\n }\r\n\r\n function checkStrength() {\r\n if (!vm.model.newPassword1) {\r\n vm.model.checks.characters = false;\r\n vm.model.checks.lowercase = false;\r\n vm.model.checks.nonalpha = false;\r\n vm.model.checks.number = false;\r\n vm.model.checks.uppercase = false;\r\n }\r\n\r\n vm.model.checks.characters = vm.model.newPassword1.length >= 8;\r\n vm.model.checks.lowercase = /[a-z]/.exec(vm.model.newPassword1) !== null;\r\n vm.model.checks.nonalpha = /\\W/.exec(vm.model.newPassword1) !== null;\r\n vm.model.checks.number = /\\d/.exec(vm.model.newPassword1) !== null;\r\n vm.model.checks.uppercase = /[A-Z]/.exec(vm.model.newPassword1) !== null;\r\n }\r\n\r\n function loadTranslations() {\r\n $translate([\r\n 'account.changePassword.errorChangingPassword',\r\n 'account.changePassword.errorCurrentPassword',\r\n 'account.changePassword.errorNewPasswordEmpty',\r\n 'account.changePassword.errorNewPasswordCompare'\r\n ]).then(function (translations) {\r\n vm.status.translations = translations;\r\n });\r\n }\r\n\r\n function validate() {\r\n var errors = [];\r\n\r\n if (!vm.model.currentPassword || vm.model.currentPassword === '')\r\n errors.push(vm.status.translations['account.changePassword.errorCurrentPassword']);\r\n\r\n if (!vm.model.newPassword1 || vm.model.newPassword1 === '')\r\n errors.push(vm.status.translations['account.changePassword.errorNewPasswordEmpty']);\r\n else if (vm.model.newPassword1 !== vm.model.newPassword2)\r\n errors.push(vm.status.translations['account.changePassword.errorNewPasswordCompare']);\r\n\r\n return errors.length > 0 ? errors : null;\r\n }\r\n\r\n loadTranslations();\r\n\r\n return vm;\r\n}\r\n","module.exports = {\r\n controller: forgotPasswordPageController,\r\n templateUrl: 'account/components/forgot-password-page.html'\r\n}\r\n\r\nforgotPasswordPageController.$inject = [\r\n '$analytics', \r\n '$location', \r\n '$translate', \r\n 'userAccountService',\r\n];\r\n\r\nfunction forgotPasswordPageController(\r\n $analytics, \r\n $location, \r\n $translate, \r\n userAccount\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $postLink: focusInputField,\r\n resetPassword: resetPassword,\r\n model: {\r\n username: null\r\n },\r\n navigateTo: navigateTo,\r\n status: {\r\n done: false,\r\n error: null,\r\n loading: false\r\n }\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/forgot-password');\r\n }\r\n\r\n function focusInputField() {\r\n document.getElementById('login-username').focus();\r\n }\r\n\r\n function resetPassword() {\r\n vm.status.loading = true;\r\n var language = $translate.use();\r\n\r\n userAccount.resetPassword(vm.model.username, language)\r\n .then(resetSuccess, resetError);\r\n\r\n function resetSuccess(data, status, headers) {\r\n vm.status.loading = false;\r\n vm.status.done = true;\r\n }\r\n\r\n function resetError(error, status) {\r\n vm.status.loading = false;\r\n vm.status.error = error;\r\n }\r\n }\r\n\r\n function navigateTo(path) {\r\n $location.url(path);\r\n }\r\n\r\n return vm;\r\n}\r\n","module.exports = {\r\n bindings: {},\r\n controller: loginPageController,\r\n templateUrl: 'account/components/login-page.html'\r\n};\r\n\r\nloginPageController.$inject = [\r\n '$analytics', \r\n '$location', \r\n 'userAccountService', \r\n 'preloaderService',\r\n];\r\n\r\nfunction loginPageController(\r\n $analytics, \r\n $location, \r\n userAccount, \r\n preloader\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $postLink: focusInputField,\r\n login: login,\r\n model: {\r\n password: null,\r\n rememberMe: true,\r\n username: null\r\n },\r\n navigateTo: navigateTo,\r\n status: {\r\n error: null,\r\n loading: false\r\n }\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/login');\r\n }\r\n\r\n function focusInputField() {\r\n document.getElementById('login-username').focus();\r\n }\r\n\r\n function login() {\r\n vm.status.loading = true;\r\n userAccount.login(vm.model, vm.model.rememberMe)\r\n .then(loginSuccess, loginError);\r\n \r\n var nextUrl = '/landing';\r\n var q = $location.search();\r\n if (q.redirect) {\r\n nextUrl = q.redirect;\r\n }\r\n function loginSuccess(data, status, headers) {\r\n preloader.run()\r\n .then(function() {\r\n vm.status.loading = false;\r\n $location.url(nextUrl);\r\n }, function() {\r\n vm.status.loading = false;\r\n $location.url(nextUrl);\r\n });\r\n }\r\n\r\n function loginError(error, status) {\r\n vm.status.loading = false;\r\n vm.status.error = error;\r\n }\r\n\r\n }\r\n\r\n function navigateTo(path) {\r\n $location.url(path);\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n controller: logoutPageController,\r\n templateUrl: 'account/components/logout-page.html'\r\n}\r\n\r\nlogoutPageController.$inject = [\r\n '$analytics', \r\n '$window', \r\n 'common'\r\n];\r\n\r\nfunction logoutPageController(\r\n $analytics, \r\n $window, \r\n common\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n loggedOut: false\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/logout');\r\n logout();\r\n }\r\n\r\n function logout() {\r\n common.identity.set(null);\r\n vm.loggedOut = true;\r\n \r\n common.$timeout(function () {\r\n $window.location.reload();\r\n }, 1000);\r\n }\r\n \r\n\r\n return vm;\r\n\r\n}","module.exports = {\r\n controller: resetPasswordPageController,\r\n templateUrl: 'account/components/reset-password-page.html'\r\n};\r\n\r\nresetPasswordPageController.$inject = [\r\n '$analytics', \r\n '$location', \r\n '$routeParams', \r\n 'userAccountService'\r\n];\r\n\r\nfunction resetPasswordPageController(\r\n $analytics, \r\n $location, \r\n $routeParams, \r\n userAccount\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $postLink: focusInputField,\r\n checkStrength: checkStrength,\r\n resetPassword: resetPassword,\r\n key: null,\r\n model: {\r\n password1: null,\r\n password2: null,\r\n checks: {\r\n characters: false,\r\n lowercase: false,\r\n uppercase: false,\r\n nonalpha: false,\r\n number: false\r\n }\r\n },\r\n navigateTo: navigateTo,\r\n status: {\r\n done: false,\r\n errors: [],\r\n invalidToken: false,\r\n loading: false\r\n }\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/reset-password');\r\n vm.key = $routeParams.key;\r\n\r\n if (vm.key === undefined || vm.key === null || vm.key === '') {\r\n vm.status.invalidToken = true;\r\n }\r\n }\r\n\r\n function focusInputField() {\r\n document.getElementById('reset-password1').focus();\r\n }\r\n\r\n function checkStrength() {\r\n if (!this.model.password1) {\r\n this.model.checks.characters = false;\r\n this.model.checks.lowercase = false;\r\n this.model.checks.nonalpha = false;\r\n this.model.checks.number = false;\r\n this.model.checks.uppercase = false;\r\n }\r\n\r\n this.model.checks.characters = this.model.password1.length >= 8;\r\n this.model.checks.lowercase = /[a-z]/.exec(this.model.password1) !== null;\r\n this.model.checks.nonalpha = /\\W/.exec(this.model.password1) !== null;\r\n this.model.checks.number = /\\d/.exec(this.model.password1) !== null;\r\n this.model.checks.uppercase = /[A-Z]/.exec(this.model.password1) !== null;\r\n }\r\n\r\n function navigateTo(path) {\r\n $location.url(path);\r\n }\r\n\r\n function resetPassword() {\r\n vm.status.errors = [];\r\n\r\n if (vm.model.password1 === null || vm.model.password1 === '') {\r\n vm.status.errors = ['account.resetPassword.errors.dynamic.PASSWORD_EMPTY'];\r\n return;\r\n }\r\n\r\n if (vm.model.password1 !== vm.model.password2) {\r\n vm.status.errors = ['account.resetPassword.errors.dynamic.PASSWORDS_NOTEQUAL'];\r\n return;\r\n }\r\n\r\n vm.status.loading = true;\r\n userAccount.confirmPassword(vm.key, vm.model.password1)\r\n .then(resetSuccess, resetError);\r\n\r\n function resetSuccess(data, status, headers) {\r\n if (data.IsSuccessful === true) {\r\n vm.status.loading = false;\r\n vm.status.done = true;\r\n } else {\r\n vm.status.loading = false;\r\n for (var i = 0; i < data.Codes.length; i++) {\r\n data.Codes[i] = 'account.resetPassword.errors.dynamic.' + data.Codes[i];\r\n }\r\n vm.status.errors = data.Codes;\r\n }\r\n }\r\n\r\n function resetError(error, status) {\r\n vm.status.loading = false;\r\n\r\n if (error.ExceptionMessage) {\r\n vm.status.errors = [error.ExceptionMessage];\r\n } else if (error.Message) {\r\n vm.status.errors = [error.Message];\r\n } else {\r\n vm.status.errors = [JSON.stringify(error)];\r\n }\r\n }\r\n }\r\n\r\n return vm;\r\n}\r\n","module.exports = ['common', 'preferenceService', favoritesService];\r\n\r\nfunction favoritesService(common, preferences) {\r\n\r\n var service = {\r\n favorites: [],\r\n add: add,\r\n isFavorite: isFavorite,\r\n init: load,\r\n load: load,\r\n remove: remove\r\n };\r\n\r\n function add(goodsCode, movement, countryCode, applicationSet) {\r\n var dfr = common.$q.defer();\r\n\r\n preferences.add({\r\n name: goodsCode + '_' + movement,\r\n category: 'favorite_codes',\r\n value: 'goodsnom=' + goodsCode + '&source=' + applicationSet + '&type=' + movement + '&country=' + (countryCode ? countryCode : null),\r\n valueType: 'stringValue'\r\n }).then(function (result) {\r\n load();\r\n dfr.resolve(result);\r\n });\r\n\r\n return dfr.promise;\r\n }\r\n\r\n function isFavorite(goodsCode, movement) {\r\n var preference = preferences.get(goodsCode + '_' + movement, 'favorite_codes');\r\n return preference !== null;\r\n }\r\n\r\n function load() {\r\n var deferred = common.$q.defer();\r\n preferences.getCategory('favorite_codes')\r\n .then(function (codes) {\r\n for (var i = 0; i < codes.length; i++) {\r\n var goodscode = codes[i].name;\r\n var movement = '';\r\n if (goodscode.indexOf('_') > -1) {\r\n var parts = goodscode.split('_');\r\n goodscode = parts[0];\r\n movement = parts[1];\r\n\r\n }\r\n codes[i].goodscode = goodscode;\r\n codes[i].movement = movement;\r\n }\r\n service.favorites = _.sortBy(codes, 'name');\r\n deferred.resolve(service.favorites);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function remove(goodsCode, movement) {\r\n var preference = preferences.get(goodsCode + '_' + movement, 'favorite_codes');\r\n\r\n // for old favorites which were saved without movement\r\n if (preference === null) {\r\n preference = preferences.get(goodsCode, 'favorite_codes');\r\n }\r\n preferences.remove(preference);\r\n load();\r\n }\r\n\r\n return service;\r\n}\r\n","module.exports = ['common', 'dataContext', userAccountService];\r\n\r\nfunction userAccountService(common, context) {\r\n\r\n var service = {\r\n changePassword: changePassword,\r\n confirmPassword: confirmPassword,\r\n resetPassword: resetPassword,\r\n login:login\r\n };\r\n\r\n function changePassword(oldPassword, newPassword) {\r\n var deferred = common.$q.defer();\r\n\r\n context.post(common.config.apiHosts.auth + '/auth/changepassword', { current_password: oldPassword, new_password: newPassword})\r\n .then(function (data) {\r\n deferred.resolve(data);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function confirmPassword(key, newPassword) {\r\n var deferred = common.$q.defer();\r\n\r\n //context.get(common.config.apiHosts.auth + '/auth/permissions')\r\n context.post(common.config.apiHosts.auth + '/auth/confirmpassword', { token: key, newPassword: newPassword })\r\n .then(function (data) {\r\n deferred.resolve(data);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function resetPassword(username, language) {\r\n var deferred = common.$q.defer();\r\n if (language === undefined || language === null) {\r\n language = 'en';\r\n }\r\n\r\n context.post(common.config.apiHosts.auth + '/auth/resetpassword', { username: username, language: language })\r\n .then(function (data) {\r\n deferred.resolve(data);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function login(userData, rememberMe) {\r\n var tokenUrl = common.config.apiHosts.auth + '/auth/token';\r\n if (!userData.grant_type) {\r\n userData.grant_type = 'password';\r\n }\r\n userData.application_key = common.config.applicationKey;\r\n userData.application_secret = common.config.applicationSecret;\r\n\r\n var deferred = common.$q.defer();\r\n context.post(tokenUrl, userData)\r\n .then(function (data) {\r\n common.identity.set(userData.username, data, rememberMe);\r\n deferred.resolve(data);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n return service;\r\n\r\n}","angular.module('taric.additionalcodes', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('measureAdditionalCodeButtons', require('./components/measure-additional-code-buttons'))\r\n .component('measureAdditionalCodesExpanded', require('./components/measure-additional-codes-expanded'))\r\n .component('additionalCodesPage', require('./components/additional-codes-page'))\r\n .component('additionalCodePicker', require('./components/additional-code-picker'))\r\n // Filters\r\n .filter('additionalCodeTypeahead', require('./filters/additional-code-typeahead-filter'))\r\n // Modals\r\n .factory('additionalCodeSelectorModal', require('./modals/additional-code-selector'))\r\n // Services\r\n .factory('additionalCodesDataService', require('./services/additional-codes-data'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/additional-codes', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: { \r\n additionalCode: '<', \r\n placeholder: '<', \r\n possibleAdditionalCodes: '< ', \r\n selectionChanged: '&' \r\n },\r\n controller: additionalCodePickerController,\r\n templateUrl: 'additional-codes/components/additional-code-picker.html'\r\n};\r\n\r\nadditionalCodePickerController.$inject = ['additionalCodeSelectorModal'];\r\n\r\nfunction additionalCodePickerController(additionalCodeSelectorModal) {\r\n var vm = {\r\n clear: clear,\r\n additionalCode: null,\r\n userInput: null,\r\n possibleAdditionalCodes: null,\r\n itemSelected: itemSelected,\r\n onBlur: onBlur,\r\n onEnter: onEnter,\r\n showModal: showModal\r\n };\r\n\r\n return vm;\r\n\r\n function showModal() {\r\n additionalCodeSelectorModal\r\n .show(vm.possibleAdditionalCodes, vm.additionalCode)\r\n .result\r\n .then(itemSelected)\r\n .catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n function clear(ev) {\r\n // console.log('clear');\r\n vm.userInput = null;\r\n clearSelection();\r\n }\r\n\r\n function clearSelection() {\r\n // console.log('clearSelection');\r\n vm.additionalCode = null;\r\n // state.filter.countryCode = null;\r\n // state.filter.countryName = null;\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ additionalCode: null });\r\n\r\n }\r\n\r\n function onBlur() {\r\n // console.log('onBlur', arguments, vm.userInput);\r\n // vm.additionalCode = _.chain(vm.possibleAdditionalCodes)\r\n // .find(function(additionalCode) {\r\n // return additionalCode.type + additionalCode.code === vm.userInput;\r\n // })\r\n // .value();\r\n // if (vm.additionalCode && vm.selectionChanged) {\r\n // vm.selectionChanged({ additionalCode: vm.additionalCode });\r\n // }\r\n // if (state.filter.countryCode && !vm.country) {\r\n // clearSelection();\r\n // }\r\n }\r\n\r\n function onEnter() {\r\n // console.log('onEnter', arguments);\r\n // if (state.filter.countryCode && !vm.country) {\r\n // clearSelection();\r\n // }\r\n }\r\n\r\n function itemSelected(item, model) {\r\n // console.log('itemSelected', item, model, vm.userInput);\r\n vm.additionalCode = item;\r\n // if (item && item.code && item.code !== state.filter.countryCode) {\r\n // state.filter.countryCode = item.code;\r\n // state.filter.countryName = item.name;\r\n\r\n\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ additionalCode: item });\r\n // }\r\n // else if (state.filter.countryCode !== null) {\r\n // clearSelection();\r\n // }\r\n }\r\n}\r\n\r\n","module.exports = {\r\n controller: additionalCodesPageController,\r\n templateUrl: 'additional-codes/components/additional-codes-page.html'\r\n};\r\n\r\nadditionalCodesPageController.$inject = [\r\n '$analytics', \r\n '$timeout',\r\n 'notificationsService', \r\n 'additionalCodesDataService', \r\n 'applicationStateService',\r\n];\r\n\r\nfunction additionalCodesPageController(\r\n $analytics, \r\n $timeout,\r\n notifications, \r\n additionalCodesData, \r\n state\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n filter: '',\r\n filterType: \"\",\r\n isLoading: false,\r\n isLoadingTypes: false,\r\n filteredAdditionalCodes: [],\r\n fileterdAdditionalCodeTypes: [],\r\n additionalCodes: [],\r\n additionalCodeTypes: [],\r\n referenceCountry: state.filter.referenceCountry,\r\n selectedType: null,\r\n loadAdditionalCode: loadAdditionalCode,\r\n clearFilter: clearFilter,\r\n changeFilter: changeFilter,\r\n clearFilterType: clearFilterType,\r\n changeFilterType: changeFilterType,\r\n focusInputTypeField: focusInputTypeField,\r\n focusInputField: focusInputField\r\n };\r\n\r\n function focusInputTypeField() {\r\n $timeout(function(){\r\n var inputEL = angular.element(document.querySelector('#inputFilterType'));\r\n if (inputEL) {\r\n inputEL[0].focus();\r\n }\r\n }, 0);\r\n }\r\n\r\n function focusInputField() {\r\n $timeout(function(){\r\n var inputEL = angular.element(document.querySelector('#inputFilter'));\r\n if (inputEL) {\r\n inputEL[0].focus();\r\n }\r\n }, 0);\r\n }\r\n\r\n function attached() {\r\n $analytics.pageTrack('/reference/additional-codes');\r\n loadTypes();\r\n notifications.subscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function dateChanged() {\r\n loadTypes();\r\n }\r\n\r\n function clearFilter() {\r\n vm.filter = '';\r\n vm.filteredAdditionalCodes = vm.additionalCodes;\r\n focusInputField();\r\n }\r\n\r\n function changeFilter() {\r\n vm.filteredAdditionalCodes = vm.additionalCodes.filter(function (el) {\r\n return (el.type.toLowerCase() + el.code.toLowerCase()).includes(vm.filter.toLowerCase()) || \r\n el.description.toLowerCase().includes(vm.filter.toLowerCase());\r\n });\r\n }\r\n\r\n \r\n function clearFilterType() {\r\n clearFilter();\r\n vm.filterType = \"\";\r\n vm.fileterdAdditionalCodeTypes = vm.additionalCodeTypes;\r\n vm.additionalCodes = [];\r\n vm.filteredAdditionalCodes = [];\r\n vm.selectedType = null;\r\n focusInputTypeField();\r\n }\r\n\r\n function changeFilterType() {\r\n vm.fileterdAdditionalCodeTypes = vm.additionalCodeTypes.filter(function (el) {\r\n return el.code.toLowerCase().includes(vm.filterType.toLowerCase()) || el.description.toLowerCase().includes(vm.filterType.toLowerCase());\r\n });\r\n if(vm.fileterdAdditionalCodeTypes.length === 1) {\r\n loadAdditionalCode(vm.fileterdAdditionalCodeTypes[0]);\r\n }\r\n if(vm.fileterdAdditionalCodeTypes.length === 0) {\r\n vm.additionalCodes = [];\r\n vm.filteredAdditionalCodes = [];\r\n vm.selectedType = null;\r\n vm.filter = \"\";\r\n }\r\n }\r\n\r\n function loadAdditionalCode(type) {\r\n vm.isLoading = true;\r\n vm.selectedType = type.code;\r\n vm.filter = \"\";\r\n additionalCodesData.getByType(type.code)\r\n .then(function (data) {\r\n vm.filteredAdditionalCodes = data;\r\n vm.additionalCodes = data;\r\n vm.isLoading = false;\r\n focusInputField();\r\n });\r\n }\r\n\r\n function loadTypes() {\r\n if (vm.referenceCountry == 'CH') {\r\n return;\r\n }\r\n vm.isLoadingTypes = true;\r\n vm.additionalCodes = [];\r\n vm.selectedType = null;\r\n \r\n additionalCodesData.getTypes()\r\n .then(function (data) {\r\n vm.additionalCodeTypes = data;\r\n vm.fileterdAdditionalCodeTypes = data;\r\n vm.isLoadingTypes = false;\r\n focusInputTypeField();\r\n });\r\n }\r\n\r\n return vm;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n measure: '<'\r\n },\r\n templateUrl: 'additional-codes/components/measure-additional-code-buttons.html'\r\n};","module.exports = {\r\n bindings: {\r\n measure: '<'\r\n },\r\n templateUrl: 'additional-codes/components/measure-additional-codes-expanded.html'\r\n};","module.exports = [additionalCodeTypeaheadFilter];\r\n\r\n// Takes care of ordering the results of the additional code typeahed. The logic is as follows:\r\n// First, show the matches on the additional code, ordered by code\r\n// Next, show the matches on the beginning of the additional code description, ordered by description\r\n// Finally, show the matches anywhere else in the description, ordered by description\r\nfunction additionalCodeTypeaheadFilter() {\r\n\r\n return function (additionalCodes, query) {\r\n var result;\r\n if (query === null || query === undefined || query === '') {\r\n result = _.sortBy(additionalCodes, function(additionalCode) {\r\n return additionalCode.type + additionalCode.code;\r\n });\r\n }\r\n else {\r\n var additionalCodeMatchPartition = _.partition(additionalCodes, function(additionalCode) {\r\n return (additionalCode.type + additionalCode.code).toLowerCase().indexOf(query.replace(' ', '').toLowerCase()) >= 0;\r\n });\r\n var additionalCodeMatchStartPartition = _.partition(additionalCodeMatchPartition[0], function(additionalCode) {\r\n return (additionalCode.type + additionalCode.code).toLowerCase().indexOf(query.replace(' ', '').toLowerCase()) === 0;\r\n });\r\n\r\n var additionalCodeStartMatches = _.sortBy(additionalCodeMatchStartPartition[0], function(additionalCode) {\r\n return additionalCode.type + additionalCode.code;\r\n });\r\n var additionalCodeOtherMatches = _.sortBy(additionalCodeMatchStartPartition[1], function(additionalCode) {\r\n return additionalCode.type + additionalCode.code;\r\n });\r\n\r\n var otherMatches = _.sortBy(additionalCodeMatchPartition[1], 'description');\r\n\r\n var descriptionStartMatchPartition = _.partition(otherMatches, function(additionalCode) {\r\n return additionalCode.description && additionalCode.description.toLowerCase().indexOf(query.toLowerCase()) === 0;\r\n });\r\n\r\n var otherDescriptionMatches = _.filter(descriptionStartMatchPartition[1], function(additionalCode) {\r\n return additionalCode.description && additionalCode.description.toLowerCase().indexOf(query.toLowerCase()) > -1;\r\n });\r\n\r\n result = _.concat(additionalCodeStartMatches, additionalCodeOtherMatches, descriptionStartMatchPartition[0], otherDescriptionMatches);\r\n }\r\n\r\n return putAntidumpingDefaultCodesFirst(result);\r\n }\r\n}\r\n\r\nfunction isAntidumpingDefaultCode(additionalCode) {\r\n return (additionalCode.type === '8' && additionalCode.code === '900') ||\r\n (additionalCode.type === 'A' && additionalCode.code === '999') ||\r\n (additionalCode.type === 'B' && additionalCode.code === '999') ||\r\n (additionalCode.type === 'C' && additionalCode.code === '999');\r\n}\r\n\r\nfunction putAntidumpingDefaultCodesFirst(additionalCodes) {\r\n var partition = _.partition(additionalCodes, function(additionalCode) {\r\n return isAntidumpingDefaultCode(additionalCode);\r\n });\r\n return _.concat(partition[0], partition[1]);\r\n}\r\n","module.exports = ['$analytics', '$uibModal', additionalCodeSelectorModal];\r\n\r\nfunction additionalCodeSelectorModal($analytics, $uibModal) {\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n additionalCodeSelectorModalController.$inject = ['$uibModalInstance', 'possibleAdditionalCodes', 'additionalCode'];\r\n\r\n function additionalCodeSelectorModalController($uibModalInstance, possibleAdditionalCodes, additionalCode) {\r\n var vm = {\r\n additionalCode: additionalCode,\r\n cancel: cancel,\r\n possibleAdditionalCodes: possibleAdditionalCodes,\r\n ok: ok\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function ok(code) {\r\n $uibModalInstance.close(code);\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(possibleAdditionalCodes, additionalCode) {\r\n $analytics.eventTrack('open-modal-additional-code-selector', { category: 'additional-codes' });\r\n\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: additionalCodeSelectorModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n additionalCode: function () {\r\n return additionalCode;\r\n },\r\n possibleAdditionalCodes: function () {\r\n return possibleAdditionalCodes;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'additional-codes/modals/additional-code-selector.html',\r\n windowClass: 'modal-additional-code-selector'\r\n });\r\n\r\n modalInstance.rendered.then(function() {\r\n var elementToFocusOnInModal = document.querySelector('.modal.in .focus-on-open-modal');\r\n if (elementToFocusOnInModal) {\r\n elementToFocusOnInModal.focus();\r\n }\r\n });\r\n\r\n return modalInstance;\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['common', 'dataContext', 'applicationStateService', additionalCodesDataService];\r\n\r\nfunction additionalCodesDataService(common, context, state) {\r\n\r\n var service = {\r\n additionalCodes: [],\r\n getByType: getByType,\r\n getTypes: getTypes\r\n };\r\n\r\n function getByType(additionalCodeType) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/additionalcodes' +\r\n '?type=' + additionalCodeType +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n function getTypes() {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/additionalcodes/types' +\r\n '?origin=EU,' + state.filter.referenceCountry +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n return service;\r\n\r\n}\r\n","window._ = require('lodash');\r\nwindow.angular = require('angular');\r\n\r\nangular.module('taric', [\r\n 'ngCookies',\r\n 'ngLocale',\r\n 'ngRoute',\r\n 'ngSanitize',\r\n // 3rd party modules\r\n 'angulartics',\r\n 'angulartics.google.analytics',\r\n 'ngFileUpload',\r\n 'chart.js',\r\n 'pascalprecht.translate',\r\n 'ui.bootstrap',\r\n 'ui.mask',\r\n 'ui.select',\r\n 'angular-intro',\r\n 'toastr',\r\n 'tmh.dynamicLocale',\r\n // Internal modules\r\n 'taric.core', // all core functionality\r\n 'taric.account', // all account related functionality\r\n 'taric.additionalcodes',\r\n 'taric.belastingdienst',\r\n 'taric.bti',\r\n 'taric.atr',\r\n 'taric.caseLaw',\r\n 'taric.certificateCodes',\r\n 'taric.classificationRegulations',\r\n 'taric.compliance', // all compliance related functionality\r\n 'taric.correlationTable',\r\n 'taric.customsValue',\r\n 'taric.dashboard',\r\n 'taric.documentation', // interactive tour\r\n 'taric.duty',\r\n 'taric.exchangeRates',\r\n 'taric.ezt',\r\n 'taric.ecics',\r\n 'taric.footnotes', // all footnotes related functionality\r\n 'taric.geography', // all country/region related functionality\r\n 'taric.good', // all good related functionality\r\n 'taric.links',\r\n 'taric.measureTypes',\r\n 'taric.news',\r\n 'taric.nomenclature', // all nomenclature related functionality\r\n 'taric.patterns',\r\n 'taric.preferenceCodes',\r\n 'taric.quota', // all text quota related functionality\r\n 'taric.referencePrices',\r\n 'taric.regulations',\r\n 'taric.search',\r\n 'taric.referenceDate',\r\n 'taric.tares', // The Swiss trade tariff\r\n 'taric.texts', // all text related functionality, e.g. explanatory notes, bti's, annotations, footnotes, etc.\r\n 'taric.tradeMovement',\r\n 'taric.tradeStatistics',\r\n 'taric.units', // measurement units\r\n 'taric.validateBusinessInfo',\r\n 'taric.vatRates',\r\n 'taric.widgets', // all shared interface functionality, e.g. general modals\r\n]);\r\n\r\ntry {\r\n angular.module(['ngSentry']);\r\n}\r\ncatch (e) {}\r\n\r\nrequire('angulartics');\r\nrequire('angulartics-google-analytics');\r\nrequire('angular-chart.js');\r\nrequire('angular-cookies');\r\nrequire('angular-dynamic-locale');\r\nrequire('angular-intro.js');\r\nrequire('angular-sanitize');\r\nrequire('angular-route');\r\nrequire('angular-toastr');\r\nrequire('angular-dynamic-locale');\r\nrequire('angular-translate');\r\nrequire('angular-ui-bootstrap');\r\nrequire('angular-ui-mask');\r\nrequire('chart.js');\r\nrequire('intro.js');\r\nrequire('ng-file-upload');\r\nrequire('ui-select');\r\n\r\nrequire('./translations/en/_index');\r\nrequire('./translations/it/_index');\r\nrequire('./translations/nl/_index');\r\n\r\nrequire('./config');\r\nrequire('./core/_module');\r\nrequire('./account/_module');\r\nrequire('./additional-codes/_module');\r\nrequire('./belastingdienst/_module');\r\nrequire('./bti/_module');\r\nrequire('./atr/_module');\r\nrequire('./case-law/_module');\r\nrequire('./certificate-codes/_module');\r\nrequire('./classification-regulations/_module');\r\nrequire('./compliance/_module');\r\nrequire('./correlation-table/_module');\r\nrequire('./customs-value/_module');\r\nrequire('./dashboard/_module');\r\nrequire('./documentation/_module');\r\nrequire('./duty/_module');\r\nrequire('./exchange-rates/_module');\r\nrequire('./ezt/_module');\r\nrequire('./ecics/_module');\r\nrequire('./footnotes/_module');\r\nrequire('./geography/_module');\r\nrequire('./good/_module');\r\nrequire('./links/_module');\r\nrequire('./measure-types/_module');\r\nrequire('./news/_module');\r\nrequire('./nomenclature/_module');\r\nrequire('./patterns/_module');\r\nrequire('./preference-codes/_module');\r\nrequire('./quota/_module');\r\nrequire('./reference-date/_module');\r\nrequire('./referenceprices/_module');\r\nrequire('./regulations/_module');\r\nrequire('./search/_module');\r\nrequire('./tares/_module');\r\nrequire('./texts/_module');\r\nrequire('./trade-movement/_module');\r\nrequire('./trade-statistics/_module');\r\nrequire('./units/_module');\r\nrequire('./validate-business-info/_module');\r\nrequire('./vat-rates/_module');\r\nrequire('./widgets/_module');\r\n\r\n","angular.module('taric.atr', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('atrButton', require('./components/atr-button'))\r\n .component('atrDetails', require('./components/atr-details'))\r\n .component('atrForm', require('./components/atr-form'))\r\n .component('atrImages', require('./components/atr-images'))\r\n .component('atrList', require('./components/atr-list'))\r\n .component('atrSearchPage', require('./components/atr-search-page'))\r\n // Modals\r\n .factory('atrModal', require('./modals/atr'))\r\n // Services\r\n .factory('atrDataService', require('./services/atr-data'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/atr/search', {\r\n reloadOnSearch: false,\r\n showSearchSubNav: true, \r\n template: '',\r\n })\r\n .when('/atr/home', {\r\n reloadOnSearch: false,\r\n showSearchSubNav: false, \r\n template: '',\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n isLarge: '<',\r\n item: '<'\r\n },\r\n controller: atrButtonController,\r\n templateUrl: 'atr/components/atr-button.html'\r\n};\r\n\r\natrButtonController.$inject = ['common', 'atrModal'];\r\n\r\nfunction atrButtonController(common, atrModal) {\r\n \r\n var vm = {\r\n showAtrs: showAtrs\r\n };\r\n\r\n function showAtrs() {\r\n var numberPattern = /^\\s*(?:\\d{2}[\\s.]*){1,5}$/;\r\n\r\n var code = common.formatting.removeTrailingZeros(vm.item.code);\r\n\r\n if (numberPattern.test(vm.item.searchQuery))\r\n atrModal.show(code, '');\r\n else\r\n atrModal.show(code, vm.item.searchQuery);\r\n }\r\n\r\n\r\n return vm;\r\n\r\n}\r\n\r\n","module.exports = {\r\n bindings: { \r\n activeAtr: '<' \r\n },\r\n controller: atrDetailsController,\r\n templateUrl: 'atr/components/atr-details.html'\r\n}\r\n\r\natrDetailsController.$inject = [\r\n '$filter', \r\n 'atrDataService', \r\n 'notificationsService'\r\n];\r\n\r\nfunction atrDetailsController(\r\n $filter, \r\n atrDataService, \r\n notifications\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n closeImages: closeImages,\r\n selectImage: selectImage,\r\n selectedImage: null,\r\n translateClassificationJustification: true,\r\n translateGoodsDescription: true\r\n };\r\n \r\n return vm;\r\n\r\n function attached() {\r\n notifications.subscribe('change_active_atr', onChangeActiveatr);\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('change_active_atr', onChangeActiveatr);\r\n }\r\n\r\n function onChangeActiveatr() {\r\n var activeAtr = atrDataService.data.activeAtr;\r\n closeImages();\r\n // vm.translateClassificationJustification = true;\r\n // vm.translateGoodsDescription = true;\r\n // if (activeAtr && activeAtr.IsTranslated) {\r\n \r\n // if (activeAtr.TranslatedClassificationJustification) {\r\n // vm.ClassificationJustificationTranslation = {\r\n // originalText: $filter('addHyperlinks')(activeAtr.ClassificationJustification),\r\n // translatedText: $filter('addHyperlinks')(activeAtr.TranslatedClassificationJustification.Result),\r\n // showTranslation: true\r\n // }\r\n // }\r\n // if (activeAtr.TranslatedGoodsDescription) {\r\n // vm.GoodsDescriptionTranslation = {\r\n // originalText: $filter('addHyperlinks')(activeAtr.GoodsDescription),\r\n // translatedText: $filter('addHyperlinks')(activeAtr.TranslatedGoodsDescription.Result),\r\n // showTranslation: true\r\n // }\r\n // }\r\n // }\r\n\r\n // { originalText: activeAtr.GoodsDescription, translatedText: activeAtr.TranslatedGoodsDescription.Result}\r\n }\r\n\r\n function closeImages() {\r\n vm.selectedImage = null;\r\n }\r\n\r\n function selectImage(image) {\r\n vm.selectedImage = image;\r\n }\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = {\r\n bindings: {\r\n updateQueryString: '<'\r\n },\r\n controller: atrFormController,\r\n templateUrl: 'atr/components/atr-form.html'\r\n}\r\n\r\natrFormController.$inject = [\r\n '$analytics', \r\n '$location', \r\n 'atrDataService', \r\n 'notificationsService'\r\n];\r\n\r\nfunction atrFormController(\r\n $analytics, \r\n $location, \r\n atrDataService, \r\n notificationsService\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n changeGoodsDescriptionQueryField: changeGoodsDescriptionQueryField,\r\n changeSearchQueryField: changeSearchQueryField,\r\n clearCommodityCode: clearCommodityCode,\r\n clearAtrReference: clearAtrReference,\r\n clearSearchQuery: clearSearchQuery,\r\n clearGoodsDescriptionQuery: clearGoodsDescriptionQuery,\r\n filter: atrDataService.filter,\r\n service: atrDataService,\r\n isLoading: false,\r\n issuedSinceDatepicker: {\r\n date: moment(atrDataService.filter.issuedSince, \"YYYY-MM-DD\").toDate(),\r\n dateChanged: issuedSinceDateChanged,\r\n blur: issuedSinceBlur,\r\n opened: false,\r\n open: openIssuedSinceDatePicker,\r\n dateOptions: {}\r\n },\r\n loadNew: loadNew,\r\n };\r\n\r\n function attached() {\r\n notificationsService.subscribe('language_changed', languageChanged);\r\n if (atrDataService.filter.searchQuery) {\r\n atrDataService.orderBy = 'KeywordRank-desc';\r\n }\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('language_changed', languageChanged);\r\n }\r\n \r\n function clearAtrReference() {\r\n atrDataService.filter.reference = '';\r\n }\r\n\r\n function clearCommodityCode() {\r\n atrDataService.filter.goodsCode = '';\r\n }\r\n\r\n\r\n function changeGoodsDescriptionQueryField() {\r\n if (atrDataService.filter.goodsDescriptionQuery && atrDataService.orderBy !== 'GoodsDescriptionRank-desc' ) {\r\n if (atrDataService.filter.searchQuery && atrDataService.orderBy === 'KeywordRank-desc') {\r\n // If the user has entered a keyword search query and we're ordering by that, don't overrid the ordering.\r\n }\r\n else {\r\n atrDataService.orderBy = 'GoodsDescriptionRank-desc';\r\n }\r\n }\r\n }\r\n\r\n function clearGoodsDescriptionQuery() {\r\n atrDataService.filter.goodsDescriptionQuery = '';\r\n }\r\n\r\n function changeSearchQueryField() {\r\n if (atrDataService.filter.searchQuery && atrDataService.orderBy !== 'KeywordRank-desc') {\r\n if (atrDataService.filter.goodsDescriptionQuery && atrDataService.orderBy === 'GoodsDescriptionRank-desc') {\r\n // If the user has entered a goods description search query and we're ordering by that, don't overrid the ordering.\r\n }\r\n else {\r\n atrDataService.orderBy = 'KeywordRank-desc';\r\n }\r\n }\r\n }\r\n\r\n function clearSearchQuery() {\r\n atrDataService.filter.searchQuery = '';\r\n }\r\n\r\n function languageChanged() {\r\n $location.search('query', null).replace();\r\n }\r\n\r\n function issuedSinceBlur() {\r\n if (!vm.issuedSinceDatepicker.date) {\r\n vm.filter.issuedSince = null;\r\n }\r\n }\r\n\r\n function issuedSinceDateChanged() {\r\n if (vm.issuedSinceDatepicker.date) {\r\n var newDate = moment(vm.issuedSinceDatepicker.date).format(\"YYYY-MM-DD\");\r\n if (newDate !== vm.filter.issuedSince) {\r\n vm.filter.issuedSince = newDate;\r\n }\r\n }\r\n else {\r\n vm.filter.issuedSince = null;\r\n }\r\n }\r\n\r\n function openIssuedSinceDatePicker() {\r\n vm.issuedSinceDatepicker.opened = true;\r\n }\r\n\r\n if (vm.updateQueryString) {\r\n updateSearchQuery();\r\n }\r\n\r\n return vm;\r\n\r\n function loadNew() {\r\n $analytics.pageTrack('/atr-search');\r\n if (vm.updateQueryString) {\r\n updateSearchQuery();\r\n }\r\n vm.isLoading = true;\r\n atrDataService.loadNewAtrs()\r\n .then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n\r\n function updateSearchQuery() {\r\n $location.search('query', vm.filter.searchQuery);\r\n $location.search('commodityCode', vm.filter.goodsCode);\r\n }\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = {\r\n bindings: {},\r\n controller: atrImagesController,\r\n templateUrl: 'atr/components/atr-images.html'\r\n}\r\n\r\natrImagesController.$inject = ['atrDataService', 'applicationStateService'];\r\n\r\nfunction atrImagesController(atrDataService, state) {\r\n var vm = {\r\n service: atrDataService,\r\n changeActiveAtr: atrDataService.changeActiveAtr,\r\n isLoading: false,\r\n loadMore: loadMore,\r\n referenceDate: moment(state.filter.date, 'YYYY-MM-DD').format('D-M-YY')\r\n };\r\n return vm;\r\n\r\n function loadMore() {\r\n vm.isLoading = true;\r\n atrDataService.loadMoreAtrs().then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n}","module.exports = {\r\n bindings: {},\r\n controller: atrListController,\r\n templateUrl: 'atr/components/atr-list.html'\r\n}\r\n\r\natrListController.$inject = ['atrDataService'];\r\n\r\nfunction atrListController(atrDataService) {\r\n var vm = {\r\n service: atrDataService,\r\n changeActiveAtr: atrDataService.changeActiveAtr,\r\n isLoading: false,\r\n loadMore: loadMore\r\n };\r\n return vm;\r\n\r\n function loadMore() {\r\n vm.isLoading = true;\r\n atrDataService.loadMoreAtrs().then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n}","module.exports = {\r\n controller: atrSearchController,\r\n templateUrl: 'atr/components/atr-search-page.html'\r\n};\r\n\r\natrSearchController.$inject = [\r\n '$analytics', \r\n '$location', \r\n '$route', \r\n 'atrDataService', \r\n 'searchService',\r\n];\r\n\r\nfunction atrSearchController(\r\n $analytics, \r\n $location, \r\n $route, \r\n atrDataService, \r\n searchService\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n showSearchSubNav: $route.current.$$route.showSearchSubNav,\r\n service: atrDataService,\r\n isLoading: false,\r\n loadNew: loadNew\r\n };\r\n\r\n var refresh;\r\n var opacity = 1;\r\n\r\n return vm;\r\n\r\n function attached() {\r\n $analytics.pageTrack('/atr-search');\r\n // The following is a hack, introduced in October 2020. The reason for it is that\r\n // Chrome would not render the atr images properly but a redraw would fix it.\r\n refresh = setInterval(function() {\r\n opacity = (opacity === 1 ? 0.99 : 1);\r\n document.querySelector('.bti-image-search-results').style.opacity = opacity;\r\n document.querySelector('.bti-detail').style.opacity = opacity;\r\n }, 40);\r\n init();\r\n }\r\n\r\n function detached() {\r\n document.querySelector('.bti-image-search-results').style.opacity = 1;\r\n document.querySelector('.bti-detail').style.opacity = 1;\r\n clearInterval(refresh);\r\n }\r\n\r\n function loadNew() {\r\n vm.isLoading = true;\r\n atrDataService.loadNewAtrs()\r\n .then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n\r\n function init() {\r\n atrDataService.resetFilter();\r\n var q = searchService.parseLocationSearchObject($location.search());\r\n atrDataService.filter.goodsCode = q.commodityCode;\r\n atrDataService.filter.searchQuery = q.query;\r\n loadNew();\r\n }\r\n\r\n}","module.exports = [\r\n '$analytics', \r\n '$uibModal', \r\n atrModal\r\n];\r\n\r\nfunction atrModal(\r\n $analytics, \r\n $uibModal\r\n) {\r\n\r\n var modal = {\r\n goodsCode: null,\r\n searchQuery: null,\r\n show: showModal\r\n };\r\n\r\n atrModalController.$inject = [\r\n '$uibModalInstance', \r\n 'atrDataService', \r\n 'goodsCode', \r\n 'searchQuery',\r\n ];\r\n\r\n function atrModalController(\r\n $uibModalInstance, \r\n atrDataService, \r\n goodsCode, \r\n searchQuery\r\n ) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n cancel: cancel,\r\n changeActiveAtr: changeActiveAtr,\r\n service: atrDataService,\r\n };\r\n\r\n var refresh;\r\n var opacity = 1;\r\n\r\n return vm;\r\n\r\n function attached() {\r\n // The following is a hack, introduced in October 2020. The reason for it is that\r\n // Chrome would not render the atr images properly but a redraw would fix it.\r\n refresh = setInterval(function() {\r\n opacity = (opacity === 1 ? 0.99 : 1);\r\n document.body.style.opacity = opacity;\r\n }, 40);\r\n init();\r\n }\r\n\r\n function detached() {\r\n document.body.style.opacity = 1;\r\n clearInterval(refresh);\r\n }\r\n\r\n\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function changeActiveAtr(atrReference) {\r\n atrDataService.changeActiveAtr(atrReference);\r\n }\r\n\r\n function init() {\r\n atrDataService.clearActiveAtr();\r\n atrDataService.resetFilter();\r\n atrDataService.filter.goodsCode = goodsCode;\r\n atrDataService.filter.searchQuery = searchQuery;\r\n atrDataService.loadNewAtrs();\r\n }\r\n\r\n\r\n }\r\n\r\n function showModal(goodsCode, searchQuery) {\r\n $analytics.eventTrack('open-modal-atr', { category: 'atr' });\r\n if (goodsCode)\r\n modal.goodsCode = goodsCode;\r\n if (searchQuery)\r\n modal.searchQuery = searchQuery;\r\n\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: atrModalController,\r\n controllerAs: 'ctrlAtrModal',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n goodsCode: function () {\r\n return modal.goodsCode;\r\n },\r\n searchQuery: function () {\r\n return modal.searchQuery;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'atr/modals/atr.html',\r\n windowClass: 'modal-bti'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}","module.exports = [\r\n 'dataContext', \r\n 'common', \r\n 'language', \r\n 'applicationStateService', \r\n 'notificationsService', \r\n atrDataService\r\n];\r\n\r\nfunction atrDataService(\r\n dataContext, \r\n common, \r\n language, \r\n state, \r\n notifications\r\n) {\r\n\r\n var activeatrReference = null;\r\n\r\n var service = {\r\n response: {},\r\n data: {\r\n activeAtr: null,\r\n isLoading: false,\r\n },\r\n display: 'list',\r\n filter: {\r\n goodsCode: null,\r\n issuedSince: null,\r\n reference: null,\r\n searchQuery: null,\r\n pageNumber: 1\r\n },\r\n orderBy: 'CommodityCode-asc',\r\n loadNewAtrs: loadNewAtrs,\r\n loadMoreAtrs: loadMoreAtrs,\r\n changeActiveAtr: changeActiveAtr,\r\n clearActiveAtr: clearActiveAtr,\r\n countAtrsByHeading: countAtrsByHeading,\r\n countAtrSearchResults: countAtrSearchResults,\r\n resetFilter: resetFilter\r\n };\r\n return service;\r\n\r\n function resetFilter() {\r\n service.filter.goodsCode = null;\r\n service.filter.issuedSince = null;\r\n service.filter.reference = null;\r\n service.filter.searchQuery = null;\r\n service.filter.goodsDescriptionQuery = null;\r\n service.filter.pageNumber = 1;\r\n service.display = 'list';\r\n }\r\n\r\n function loadNewAtrs() {\r\n service.data.activeAtr = null;\r\n service.filter.pageNumber = 1;\r\n return loadAtrs(service.filter);\r\n }\r\n\r\n function loadMoreAtrs() {\r\n return loadAtrs(service.filter);\r\n }\r\n\r\n function loadAtrs(filter) {\r\n\r\n var sort = service.orderBy.split('-')[0];\r\n var order = service.orderBy.split('-')[1];\r\n\r\n if (sort === 'KeywordRank' && !filter.searchQuery) {\r\n if (filter.goodsDescriptionQuery) {\r\n sort = 'GoodsDescriptionRank';\r\n service.orderBy = 'GoodsDescriptionRank-desc';\r\n }\r\n else {\r\n sort = 'CommodityCode';\r\n order = 'asc';\r\n service.orderBy = 'CommodityCode-asc'\r\n }\r\n }\r\n if (sort === 'GoodsDescriptionRank' && !filter.goodsDescriptionQuery) {\r\n if (filter.searchQuery) {\r\n sort = 'KeywordRank';\r\n service.orderBy = 'KeywordRank-desc';\r\n }\r\n else {\r\n sort = 'CommodityCode';\r\n order = 'asc';\r\n service.orderBy = 'CommodityCode-asc'\r\n }\r\n }\r\n\r\n var url = common.config.apiHosts.generic + '/atr/search' +\r\n '?goodscode=' + (filter.goodsCode || '') +\r\n '&pindex=' + (filter.pageNumber - 1) +\r\n '&psize=20' +\r\n '&lang=' + language.get() +\r\n '&date=' + state.filter.date +\r\n '&sort=' + sort +\r\n '&order=' + order;\r\n if (filter.searchQuery)\r\n url += '&keyword-query=' + filter.searchQuery;\r\n if (filter.goodsDescriptionQuery)\r\n url += '&goods-description-query=' + filter.goodsDescriptionQuery;\r\n if (filter.reference)\r\n url += '&reference=' + filter.reference;\r\n if (service.display === 'images') {\r\n url += '&imagesearch=1';\r\n }\r\n if (filter.issuedSince) {\r\n url += '&issuedsince=' + filter.issuedSince;\r\n }\r\n\r\n service.data.isLoading = true;\r\n return dataContext.get(url).then(function (paginatedatrs) {\r\n service.data.isLoading = false;\r\n service.response = paginatedatrs;\r\n if (service.response.Results.length > 0) {\r\n if (!activeatrReference) {\r\n changeActiveAtr(service.response.Results[0].RulingReference);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function clearActiveAtr() {\r\n service.data.activeAtr = null;\r\n }\r\n\r\n function changeActiveAtr(atrReference) {\r\n var url = common.config.apiHosts.generic + '/atr/' + atrReference.toString().trim() + '/';\r\n service.data.activeAtr = null;\r\n return dataContext.get(url).then(function (activeAtr) {\r\n service.data.activeAtr = activeAtr;\r\n notifications.publish('change_active_atr', activeAtr);\r\n _.forEach(service.response.Results, function (atr) {\r\n atr.active = false;\r\n if (atr.RulingReference === atrReference) {\r\n atr.active = true;\r\n }\r\n });\r\n });\r\n }\r\n\r\n function countAtrsByHeading(chapterCode) {\r\n var url = common.config.apiHosts.generic + '/atr/countbyheading/' + chapterCode;\r\n return dataContext.get(url);\r\n }\r\n\r\n function countAtrSearchResults(q) {\r\n var url = common.config.apiHosts.generic + '/atr/count' +\r\n '?lang=' + common.language.get() +\r\n '&goodscode=' + q.code +\r\n '&keyword-query=' + q.query;\r\n return dataContext.get(url);\r\n }\r\n}","angular.module('taric.belastingdienst', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('belastingdienstPage', require('./components/belastingdienst-page'))\r\n .factory('belastingdienstDataService', require('./services/belastingdienst-data'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n // .when('/nieuws-douane-voor-bedrijven', {\r\n // templateUrl: 'belastingdienst/components/belastingdienst-page.html'\r\n // })\r\n ;\r\n}\r\n","module.exports = {\r\n controller: belastingdienstPageController,\r\n templateUrl: 'belastingdienst/components/belastingdienst-page.html'\r\n};\r\n\r\nbelastingdienstPageController.$inject = [\r\n '$analytics', \r\n 'belastingdienstDataService'\r\n];\r\n\r\nfunction belastingdienstPageController(\r\n $analytics, \r\n belastingdienstData\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n isLoading: false,\r\n data: {\r\n items: []\r\n }\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/dutch-customs-news');\r\n loadItems();\r\n }\r\n\r\n function loadItems() {\r\n vm.isLoading = true;\r\n vm.data.items = [];\r\n belastingdienstData.getNews()\r\n .then(function (data) {\r\n vm.data.items = data;\r\n vm.isLoading = false;\r\n });\r\n\r\n }\r\n\r\n return vm;\r\n}\r\n","module.exports = ['common', 'dataContext', 'applicationStateService', belastingdienstDataService];\r\n\r\nfunction belastingdienstDataService(common, context, state) {\r\n\r\n var service = {\r\n getNews: getNews\r\n };\r\n\r\n\r\n function getNews() {\r\n var url = common.config.apiHosts.generic + '/belastingdienst/news' +\r\n '?date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n return service;\r\n\r\n}\r\n","angular.module('taric.bti', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('btiButton', require('./components/bti-button'))\r\n .component('btiDetails', require('./components/bti-details'))\r\n .component('btiForm', require('./components/bti-form'))\r\n .component('btiImages', require('./components/bti-images'))\r\n .component('btiList', require('./components/bti-list'))\r\n .component('btiSearchPage', require('./components/bti-search-page'))\r\n // Modals\r\n .factory('btiModal', require('./modals/bti'))\r\n // Services\r\n .factory('btiDataService', require('./services/bti-data'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/bti/search', {\r\n reloadOnSearch: false,\r\n showSearchSubNav: true, \r\n template: '',\r\n })\r\n .when('/bti/home', {\r\n reloadOnSearch: false,\r\n showSearchSubNav: false, \r\n template: '',\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n isLarge: '<',\r\n item: '<'\r\n },\r\n controller: btiButtonController,\r\n templateUrl: 'bti/components/bti-button.html'\r\n};\r\n\r\nbtiButtonController.$inject = ['common', 'btiModal'];\r\n\r\nfunction btiButtonController(common, btiModal) {\r\n \r\n var vm = {\r\n showBtis: showBtis\r\n };\r\n\r\n function showBtis() {\r\n var numberPattern = /^\\s*(?:\\d{2}[\\s.]*){1,5}$/;\r\n\r\n var code = common.formatting.removeTrailingZeros(vm.item.code);\r\n\r\n if (numberPattern.test(vm.item.searchQuery))\r\n btiModal.show(code, '');\r\n else\r\n btiModal.show(code, vm.item.searchQuery);\r\n }\r\n\r\n\r\n return vm;\r\n\r\n}\r\n\r\n","module.exports = {\r\n bindings: { \r\n activeBti: '<' \r\n },\r\n controller: btiDetailsController,\r\n templateUrl: 'bti/components/bti-details.html'\r\n}\r\n\r\nbtiDetailsController.$inject = [\r\n '$filter', \r\n 'btiDataService', \r\n 'notificationsService'\r\n];\r\n\r\nfunction btiDetailsController(\r\n $filter, \r\n btiDataService, \r\n notifications\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n closeImages: closeImages,\r\n selectImage: selectImage,\r\n selectedImage: null,\r\n translateClassificationJustification: true,\r\n translateGoodsDescription: true\r\n };\r\n \r\n return vm;\r\n\r\n function attached() {\r\n notifications.subscribe('change_active_bti', onChangeActiveBti);\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('change_active_bti', onChangeActiveBti);\r\n }\r\n\r\n function onChangeActiveBti() {\r\n var activeBti = btiDataService.data.activeBti;\r\n closeImages();\r\n vm.translateClassificationJustification = true;\r\n vm.translateGoodsDescription = true;\r\n if (activeBti && activeBti.IsTranslated) {\r\n \r\n if (activeBti.TranslatedClassificationJustification) {\r\n vm.ClassificationJustificationTranslation = {\r\n originalText: $filter('addHyperlinks')(activeBti.ClassificationJustification),\r\n translatedText: $filter('addHyperlinks')(activeBti.TranslatedClassificationJustification.Result),\r\n showTranslation: true\r\n }\r\n }\r\n if (activeBti.TranslatedGoodsDescription) {\r\n vm.GoodsDescriptionTranslation = {\r\n originalText: $filter('addHyperlinks')(activeBti.GoodsDescription),\r\n translatedText: $filter('addHyperlinks')(activeBti.TranslatedGoodsDescription.Result),\r\n showTranslation: true\r\n }\r\n }\r\n }\r\n\r\n // { originalText: activeBti.GoodsDescription, translatedText: activeBti.TranslatedGoodsDescription.Result}\r\n }\r\n\r\n function closeImages() {\r\n vm.selectedImage = null;\r\n }\r\n\r\n function selectImage(image) {\r\n vm.selectedImage = image;\r\n }\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = {\r\n bindings: {\r\n updateQueryString: '<'\r\n },\r\n controller: btiFormController,\r\n templateUrl: 'bti/components/bti-form.html'\r\n}\r\n\r\nbtiFormController.$inject = [\r\n '$analytics', \r\n '$location', \r\n 'btiDataService', \r\n 'notificationsService'\r\n];\r\n\r\nfunction btiFormController(\r\n $analytics, \r\n $location, \r\n btiDataService, \r\n notificationsService\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n changeGoodsDescriptionQueryField: changeGoodsDescriptionQueryField,\r\n changeSearchQueryField: changeSearchQueryField,\r\n clearCommodityCode: clearCommodityCode,\r\n clearBtiReference: clearBtiReference,\r\n clearCountry: clearCountry,\r\n clearSearchQuery: clearSearchQuery,\r\n clearGoodsDescriptionQuery: clearGoodsDescriptionQuery,\r\n filter: btiDataService.filter,\r\n service: btiDataService,\r\n isLoading: false,\r\n issuedSinceDatepicker: {\r\n date: moment(btiDataService.filter.issuedSince, \"YYYY-MM-DD\").toDate(),\r\n dateChanged: issuedSinceDateChanged,\r\n blur: issuedSinceBlur,\r\n opened: false,\r\n open: openIssuedSinceDatePicker,\r\n dateOptions: {}\r\n },\r\n loadNew: loadNew,\r\n onSelectCountry: onSelectCountry\r\n };\r\n\r\n function attached() {\r\n notificationsService.subscribe('language_changed', languageChanged);\r\n if (btiDataService.filter.searchQuery) {\r\n btiDataService.orderBy = 'KeywordRank-desc';\r\n }\r\n if (vm.updateQueryString) {\r\n updateSearchQuery();\r\n }\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('language_changed', languageChanged);\r\n }\r\n \r\n function clearBtiReference() {\r\n btiDataService.filter.reference = '';\r\n }\r\n\r\n function clearCommodityCode() {\r\n btiDataService.filter.goodsCode = '';\r\n }\r\n\r\n function clearCountry() {\r\n btiDataService.filter.country = '';\r\n }\r\n\r\n function onSelectCountry(country) {\r\n if (country) {\r\n btiDataService.filter.country = country.code;\r\n }\r\n else {\r\n btiDataService.filter.country = null;\r\n }\r\n }\r\n\r\n\r\n function changeGoodsDescriptionQueryField() {\r\n if (btiDataService.filter.goodsDescriptionQuery && btiDataService.orderBy !== 'GoodsDescriptionRank-desc' ) {\r\n if (btiDataService.filter.searchQuery && btiDataService.orderBy === 'KeywordRank-desc') {\r\n // If the user has entered a keyword search query and we're ordering by that, don't overrid the ordering.\r\n }\r\n else {\r\n btiDataService.orderBy = 'GoodsDescriptionRank-desc';\r\n }\r\n }\r\n }\r\n\r\n function clearGoodsDescriptionQuery() {\r\n btiDataService.filter.goodsDescriptionQuery = '';\r\n }\r\n\r\n function changeSearchQueryField() {\r\n if (btiDataService.filter.searchQuery && btiDataService.orderBy !== 'KeywordRank-desc') {\r\n if (btiDataService.filter.goodsDescriptionQuery && btiDataService.orderBy === 'GoodsDescriptionRank-desc') {\r\n // If the user has entered a goods description search query and we're ordering by that, don't overrid the ordering.\r\n }\r\n else {\r\n btiDataService.orderBy = 'KeywordRank-desc';\r\n }\r\n }\r\n }\r\n\r\n function clearSearchQuery() {\r\n btiDataService.filter.searchQuery = '';\r\n }\r\n\r\n function languageChanged() {\r\n $location.search('query', null).replace();\r\n }\r\n\r\n function issuedSinceBlur() {\r\n if (!vm.issuedSinceDatepicker.date) {\r\n vm.filter.issuedSince = null;\r\n }\r\n }\r\n\r\n function issuedSinceDateChanged() {\r\n if (vm.issuedSinceDatepicker.date) {\r\n var newDate = moment(vm.issuedSinceDatepicker.date).format(\"YYYY-MM-DD\");\r\n if (newDate !== vm.filter.issuedSince) {\r\n vm.filter.issuedSince = newDate;\r\n }\r\n }\r\n else {\r\n vm.filter.issuedSince = null;\r\n }\r\n }\r\n\r\n function openIssuedSinceDatePicker() {\r\n vm.issuedSinceDatepicker.opened = true;\r\n }\r\n\r\n return vm;\r\n\r\n function loadNew() {\r\n $analytics.pageTrack('/bti-search');\r\n if (vm.updateQueryString) {\r\n updateSearchQuery();\r\n }\r\n vm.isLoading = true;\r\n btiDataService.loadNewBtis()\r\n .then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n\r\n function updateSearchQuery() {\r\n $location.search('query', vm.filter.searchQuery);\r\n $location.search('commodityCode', vm.filter.goodsCode);\r\n }\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = {\r\n bindings: {},\r\n controller: btiImagesController,\r\n templateUrl: 'bti/components/bti-images.html'\r\n}\r\n\r\nbtiImagesController.$inject = ['btiDataService', 'applicationStateService'];\r\n\r\nfunction btiImagesController(btiDataService, state) {\r\n var vm = {\r\n service: btiDataService,\r\n changeActiveBti: btiDataService.changeActiveBti,\r\n isLoading: false,\r\n loadMore: loadMore,\r\n referenceDate: moment(state.filter.date, 'YYYY-MM-DD').format('D-M-YY')\r\n };\r\n return vm;\r\n\r\n function loadMore() {\r\n vm.isLoading = true;\r\n btiDataService.loadMoreBtis().then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n}","module.exports = {\r\n bindings: {},\r\n controller: btiListController,\r\n templateUrl: 'bti/components/bti-list.html'\r\n}\r\n\r\nbtiListController.$inject = ['btiDataService'];\r\n\r\nfunction btiListController(btiDataService) {\r\n var vm = {\r\n service: btiDataService,\r\n changeActiveBti: btiDataService.changeActiveBti,\r\n isLoading: false,\r\n loadMore: loadMore\r\n };\r\n return vm;\r\n\r\n function loadMore() {\r\n vm.isLoading = true;\r\n btiDataService.loadMoreBtis().then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n}","module.exports = {\r\n controller: btiSearchController,\r\n templateUrl: 'bti/components/bti-search-page.html'\r\n};\r\n\r\nbtiSearchController.$inject = [\r\n '$analytics', \r\n '$location', \r\n '$route', \r\n 'btiDataService', \r\n 'searchService',\r\n];\r\n\r\nfunction btiSearchController(\r\n $analytics, \r\n $location, \r\n $route, \r\n btiDataService, \r\n searchService\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n showSearchSubNav: $route.current.$$route.showSearchSubNav,\r\n service: btiDataService,\r\n isLoading: false,\r\n loadNew: loadNew\r\n };\r\n\r\n var refresh;\r\n var opacity = 1;\r\n\r\n return vm;\r\n\r\n function attached() {\r\n $analytics.pageTrack('/bti-search');\r\n // The following is a hack, introduced in October 2020. The reason for it is that\r\n // Chrome would not render the BTI images properly but a redraw would fix it.\r\n refresh = setInterval(function() {\r\n opacity = (opacity === 1 ? 0.99 : 1);\r\n document.querySelector('.bti-image-search-results').style.opacity = opacity;\r\n document.querySelector('.bti-detail').style.opacity = opacity;\r\n }, 40);\r\n init();\r\n }\r\n\r\n function detached() {\r\n document.querySelector('.bti-image-search-results').style.opacity = 1;\r\n document.querySelector('.bti-detail').style.opacity = 1;\r\n clearInterval(refresh);\r\n }\r\n\r\n function loadNew() {\r\n vm.isLoading = true;\r\n btiDataService.loadNewBtis()\r\n .then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n\r\n function init() {\r\n btiDataService.resetFilter();\r\n var q = searchService.parseLocationSearchObject($location.search());\r\n btiDataService.filter.goodsCode = q.commodityCode;\r\n btiDataService.filter.searchQuery = q.query;\r\n loadNew();\r\n }\r\n\r\n}","module.exports = [\r\n '$analytics', \r\n '$uibModal', \r\n btiModal\r\n];\r\n\r\nfunction btiModal(\r\n $analytics, \r\n $uibModal\r\n) {\r\n\r\n var modal = {\r\n goodsCode: null,\r\n searchQuery: null,\r\n show: showModal\r\n };\r\n\r\n btiModalController.$inject = [\r\n '$uibModalInstance', \r\n 'btiDataService', \r\n 'goodsCode', \r\n 'searchQuery',\r\n ];\r\n\r\n function btiModalController(\r\n $uibModalInstance, \r\n btiDataService, \r\n goodsCode, \r\n searchQuery\r\n ) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n cancel: cancel,\r\n changeActiveBti: changeActiveBti,\r\n service: btiDataService,\r\n };\r\n\r\n var refresh;\r\n var opacity = 1;\r\n\r\n return vm;\r\n\r\n function attached() {\r\n // The following is a hack, introduced in October 2020. The reason for it is that\r\n // Chrome would not render the BTI images properly but a redraw would fix it.\r\n refresh = setInterval(function() {\r\n opacity = (opacity === 1 ? 0.99 : 1);\r\n document.body.style.opacity = opacity;\r\n }, 40);\r\n init();\r\n }\r\n\r\n function detached() {\r\n document.body.style.opacity = 1;\r\n clearInterval(refresh);\r\n }\r\n\r\n\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function changeActiveBti(btiReference) {\r\n btiDataService.changeActiveBti(btiReference);\r\n }\r\n\r\n function init() {\r\n btiDataService.clearActiveBti();\r\n btiDataService.resetFilter();\r\n btiDataService.filter.goodsCode = goodsCode;\r\n btiDataService.filter.searchQuery = searchQuery;\r\n btiDataService.loadNewBtis();\r\n }\r\n\r\n\r\n }\r\n\r\n function showModal(goodsCode, searchQuery) {\r\n $analytics.eventTrack('open-modal-bti', { category: 'bti' });\r\n if (goodsCode)\r\n modal.goodsCode = goodsCode;\r\n if (searchQuery)\r\n modal.searchQuery = searchQuery;\r\n\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: btiModalController,\r\n controllerAs: 'ctrlBtiModal',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n goodsCode: function () {\r\n return modal.goodsCode;\r\n },\r\n searchQuery: function () {\r\n return modal.searchQuery;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'bti/modals/bti.html',\r\n windowClass: 'modal-bti'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}","module.exports = [\r\n 'dataContext', \r\n 'common', \r\n 'countryDataService',\r\n 'language', \r\n 'applicationStateService', \r\n 'notificationsService', \r\n btiDataService\r\n];\r\n\r\nfunction btiDataService(\r\n dataContext, \r\n common, \r\n countryDataService,\r\n language, \r\n state, \r\n notifications\r\n) {\r\n\r\n var activeBtiReference = null;\r\n var issuingCountryCodes = [\r\n\t\t'AT',\r\n\t\t'BE',\r\n\t\t'BG',\r\n\t\t'CY',\r\n\t\t'CZ',\r\n\t\t'DE',\r\n\t\t'DK',\r\n\t\t'EE',\r\n\t\t'ES',\r\n\t\t'FI',\r\n\t\t'FR',\r\n\t\t'GB',\r\n\t\t'GR',\r\n\t\t'HR',\r\n\t\t'HU',\r\n\t\t'IE',\r\n\t\t'IT',\r\n\t\t'LT',\r\n\t\t'LU',\r\n\t\t'LV',\r\n\t\t'MT',\r\n\t\t'NL',\r\n\t\t'PL',\r\n\t\t'PT',\r\n\t\t'RO',\r\n\t\t'SE',\r\n\t\t'SI',\r\n\t\t'SK',\r\n\t\t'XI'\r\n ];\r\n\r\n var service = {\r\n response: {},\r\n data: {\r\n activeBti: null,\r\n isLoading: false,\r\n },\r\n display: 'list',\r\n filter: {\r\n country: null,\r\n goodsCode: null,\r\n issuedSince: null,\r\n reference: null,\r\n searchQuery: null,\r\n pageNumber: 1\r\n },\r\n issuingCountries: _.map(issuingCountryCodes, function (countryCode) {\r\n var countryName = countryDataService.countries[countryCode];\r\n return { code: countryCode, name: countryName };\r\n }),\r\n orderBy: 'CommodityCode-asc',\r\n loadNewBtis: loadNewBtis,\r\n loadMoreBtis: loadMoreBtis,\r\n changeActiveBti: changeActiveBti,\r\n clearActiveBti: clearActiveBti,\r\n countBtisByHeading: countBtisByHeading,\r\n countBtiSearchResults: countBtiSearchResults,\r\n resetFilter: resetFilter\r\n };\r\n return service;\r\n\r\n function resetFilter() {\r\n service.filter.country = null;\r\n service.filter.goodsCode = null;\r\n service.filter.issuedSince = null;\r\n service.filter.reference = null;\r\n service.filter.searchQuery = null;\r\n service.filter.goodsDescriptionQuery = null;\r\n service.filter.pageNumber = 1;\r\n service.display = 'list';\r\n }\r\n\r\n function loadNewBtis() {\r\n service.data.activeBti = null;\r\n service.filter.pageNumber = 1;\r\n return loadBtis(service.filter);\r\n }\r\n\r\n function loadMoreBtis() {\r\n return loadBtis(service.filter);\r\n }\r\n\r\n function loadBtis(filter) {\r\n\r\n var sort = service.orderBy.split('-')[0];\r\n var order = service.orderBy.split('-')[1];\r\n\r\n if (sort === 'KeywordRank' && !filter.searchQuery) {\r\n if (filter.goodsDescriptionQuery) {\r\n sort = 'GoodsDescriptionRank';\r\n service.orderBy = 'GoodsDescriptionRank-desc';\r\n }\r\n else {\r\n sort = 'CommodityCode';\r\n order = 'asc';\r\n service.orderBy = 'CommodityCode-asc'\r\n }\r\n }\r\n if (sort === 'GoodsDescriptionRank' && !filter.goodsDescriptionQuery) {\r\n if (filter.searchQuery) {\r\n sort = 'KeywordRank';\r\n service.orderBy = 'KeywordRank-desc';\r\n }\r\n else {\r\n sort = 'CommodityCode';\r\n order = 'asc';\r\n service.orderBy = 'CommodityCode-asc'\r\n }\r\n }\r\n\r\n var url = common.config.apiHosts.generic + '/bti/search' +\r\n '?goodscode=' + (filter.goodsCode || '') +\r\n '&pindex=' + (filter.pageNumber - 1) +\r\n '&psize=20' +\r\n '&lang=' + language.get() +\r\n '&date=' + state.filter.date +\r\n '&sort=' + sort +\r\n '&order=' + order;\r\n if (filter.searchQuery)\r\n url += '&keyword-query=' + filter.searchQuery;\r\n if (filter.goodsDescriptionQuery)\r\n url += '&goods-description-query=' + filter.goodsDescriptionQuery;\r\n if (filter.reference)\r\n url += '&reference=' + makeSafeBtiReference(filter.reference);\r\n if (filter.country)\r\n url += '&country=' + filter.country;\r\n if (service.display === 'images') {\r\n url += '&imagesearch=1';\r\n }\r\n if (filter.issuedSince) {\r\n url += '&issuedsince=' + filter.issuedSince;\r\n }\r\n\r\n service.data.isLoading = true;\r\n return dataContext.get(url).then(function (paginatedBtis) {\r\n service.data.isLoading = false;\r\n service.response = paginatedBtis;\r\n if (service.response.Results.length > 0) {\r\n if (!activeBtiReference) {\r\n changeActiveBti(service.response.Results[0].BtiReference);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function clearActiveBti() {\r\n service.data.activeBti = null;\r\n }\r\n\r\n function changeActiveBti(btiReference) {\r\n var url = common.config.apiHosts.generic + '/bti/' + makeSafeBtiReference(btiReference.trim()) + '/';\r\n service.data.activeBti = null;\r\n return dataContext.get(url).then(function (activeBti) {\r\n service.data.activeBti = activeBti;\r\n notifications.publish('change_active_bti', activeBti);\r\n _.forEach(service.response.Results, function (bti) {\r\n bti.active = false;\r\n if (bti.BtiReference === btiReference) {\r\n bti.active = true;\r\n }\r\n });\r\n });\r\n }\r\n\r\n function makeSafeBtiReference(btiReference) {\r\n return btiReference.replace(/\\//g, \"_\");\r\n }\r\n\r\n function countBtisByHeading(chapterCode) {\r\n var url = common.config.apiHosts.generic + '/bti/countbyheading/' + chapterCode;\r\n return dataContext.get(url);\r\n }\r\n\r\n function countBtiSearchResults(q) {\r\n var url = common.config.apiHosts.generic + '/bti/count' +\r\n '?lang=' + common.language.get() +\r\n '&goodscode=' + q.code +\r\n '&keyword-query=' + q.query;\r\n return dataContext.get(url);\r\n }\r\n}","angular.module('taric.caseLaw', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('caseLawButton', require('./components/case-law-button'))\r\n .component('euCaseLawSummaryButton', require('./components/eu-case-law-summary-button'))\r\n .component('caseLawNews', require('./components/case-law-news'))\r\n .component('caseLawSubnav', require('./components/case-law-subnav'))\r\n .component('caseLawLinksToNews', require('./components/case-law-links-to-news'))\r\n .component('euCaseLawListItem', require('./components/eu-case-law-list-item'))\r\n .component('euCaseLawNewsItem', require('./components/eu-case-law-news-item'))\r\n .component('nlCaseLawListItem', require('./components/nl-case-law-list-item'))\r\n .component('nlCaseLawNewsItem', require('./components/nl-case-law-news-item'))\r\n // Pages\r\n .component('caseLawNewsPage', require('./components/case-law-news-page'))\r\n .component('euCaseLawPage', require('./components/eu-case-law-page'))\r\n .component('nlCaseLawPage', require('./components/nl-case-law-page'))\r\n // Modals\r\n .factory('euCaseLawSummaryModal', require('./modals/eu-case-law-summary-modal'))\r\n .factory('caseLawModal', require('./modals/case-law-modal'))\r\n .factory('nlCaseLawJudgmentModal', require('./modals/nl-case-law-judgment-modal'))\r\n // Services\r\n .factory('caseLawDataService', require('./services/case-law-data'))\r\n .factory('euCaseLawDataService', require('./services/eu-case-law-data'))\r\n .factory('nlCaseLawDataService', require('./services/nl-case-law-data'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/case-law/news', {\r\n template: ''\r\n })\r\n .when('/case-law/eu', {\r\n template: ''\r\n })\r\n .when('/case-law/nl', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n isLarge: '<',\r\n item: '<'\r\n },\r\n controller: caseLawButtonController,\r\n templateUrl: 'case-law/components/case-law-button.html'\r\n}\r\n\r\ncaseLawButtonController.$inject = ['caseLawModal'];\r\n\r\nfunction caseLawButtonController(caseLawModal) {\r\n\r\n var vm = {\r\n showCaseLaw: showCaseLaw\r\n };\r\n\r\n function showCaseLaw() {\r\n var numberPattern = /^\\s*(?:\\d{2}[\\s.]*){1,5}$/;\r\n\r\n if (numberPattern.test(vm.item.searchQuery))\r\n caseLawModal.show(vm.item.code, '');\r\n else\r\n caseLawModal.show(vm.item.code, vm.item.searchQuery);\r\n }\r\n\r\n\r\n return vm;\r\n\r\n}","module.exports = {\r\n templateUrl: 'case-law/components/case-law-links-to-news.html'\r\n};","module.exports = {\r\n controller: caseLawNewsPageController,\r\n templateUrl: 'case-law/components/case-law-news-page.html'\r\n};\r\n\r\ncaseLawNewsPageController.$inject = ['$analytics'];\r\n\r\nfunction caseLawNewsPageController($analytics) {\r\n var vm = {\r\n $onInit: attached\r\n };\r\n return vm;\r\n\r\n function attached() {\r\n $analytics.pageTrack('/case-law-news');\r\n }\r\n}","module.exports = {\r\n bindings: {\r\n goodscode: '<',\r\n searchQuery: '<'\r\n },\r\n controller: caseLawNewsController,\r\n templateUrl: 'case-law/components/case-law-news.html'\r\n};\r\n\r\ncaseLawNewsController.$inject = [\r\n 'euCaseLawDataService', \r\n 'nlCaseLawDataService', \r\n 'nlCaseLawJudgmentModal', \r\n 'language', \r\n 'identity',\r\n];\r\n\r\nfunction caseLawNewsController(\r\n euCaseLawDataService, \r\n nlCaseLawDataService, \r\n nlCaseLawJudgmentModal, \r\n language, \r\n identity\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n dataEU: euCaseLawDataService,\r\n dataNL: nlCaseLawDataService,\r\n identity: identity,\r\n isLoading: isLoading,\r\n language: language.get(),\r\n openUitspraak: openUitspraak,\r\n pageChangedEU: pageChangedEU,\r\n pageChangedNL: pageChangedNL\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n\r\n vm.dataEU.query.GoodsCode = vm.goodscode;\r\n vm.dataEU.query.Query = vm.searchQuery;\r\n vm.dataEU.query.Page = 1;\r\n\r\n vm.dataNL.query.GoodsCode = vm.goodscode;\r\n vm.dataNL.query.Query = vm.searchQuery;\r\n vm.dataNL.query.Page = 1;\r\n\r\n if (vm.identity.hasPermission('case-law-nl')) {\r\n loadLatestCaseLawNL();\r\n }\r\n if (vm.identity.hasPermission('case-law-eu')) {\r\n loadLatestCaseLawEU();\r\n }\r\n }\r\n\r\n function isLoading() {\r\n return vm.isLoadingNL || vm.isLoadingEU;\r\n }\r\n\r\n function pageChangedEU() {\r\n loadLatestCaseLawEU();\r\n var modal = document.getElementsByClassName('modal-case-law')[0];\r\n if (modal) {\r\n modal.scrollTo(0, 0);\r\n }\r\n else {\r\n document.getElementById(\"content\").scrollTo(0, 0);\r\n }\r\n }\r\n\r\n\r\n function pageChangedNL() {\r\n loadLatestCaseLawNL();\r\n var modal = document.getElementsByClassName('modal-case-law')[0];\r\n if (modal) {\r\n modal.scrollTo(0, 0);\r\n }\r\n else {\r\n document.getElementById(\"content\").scrollTo(0, 0);\r\n }\r\n }\r\n\r\n function loadLatestCaseLawEU() {\r\n vm.isLoadingEU = true;\r\n if (vm.identity.hasPermission('case-law-eu')) {\r\n euCaseLawDataService.loadCaseLaw()\r\n .then(function() {\r\n vm.isLoadingEU = false;\r\n });\r\n }\r\n }\r\n\r\n function loadLatestCaseLawNL() {\r\n vm.isLoadingNL = true;\r\n if (vm.identity.hasPermission('case-law-nl')) {\r\n nlCaseLawDataService.loadCaseLawSearchResults()\r\n .then(function() {\r\n vm.isLoadingNL = false;\r\n });\r\n }\r\n }\r\n\r\n function openUitspraak(ecli) {\r\n nlCaseLawJudgmentModal.show(ecli);\r\n }\r\n}\r\n","module.exports = {\r\n bindings: {\r\n active: '@'\r\n },\r\n templateUrl: 'case-law/components/case-law-subnav.html'\r\n};","module.exports = {\r\n bindings: {\r\n item: '<'\r\n },\r\n controller: euCaseLawListItemController,\r\n templateUrl: 'case-law/components/eu-case-law-list-item.html'\r\n};\r\n\r\neuCaseLawListItemController.$inject = ['euCaseLawSummaryModal', 'language'];\r\n\r\nfunction euCaseLawListItemController(euCaseLawSummaryModal, language) {\r\n var vm = {\r\n language: language.get(),\r\n showSummary: showSummary,\r\n };\r\n\r\n function showSummary(celex) {\r\n euCaseLawSummaryModal.show(celex);\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n item: '<'\r\n },\r\n controller: euCaseLawNewsItemController,\r\n templateUrl: 'case-law/components/eu-case-law-news-item.html'\r\n};\r\n\r\neuCaseLawNewsItemController.$inject = ['language'];\r\n\r\nfunction euCaseLawNewsItemController(language) {\r\n var vm = {\r\n language: language.get()\r\n };\r\n\r\n return vm;\r\n}","module.exports = {\r\n controller: euCaseLawPageController,\r\n templateUrl: 'case-law/components/eu-case-law-page.html'\r\n};\r\n\r\neuCaseLawPageController.$inject =['$analytics', 'euCaseLawDataService'];\r\n\r\nfunction euCaseLawPageController($analytics, euCaseLawDataService) {\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n data: euCaseLawDataService,\r\n clear: clearForm,\r\n dateOptions: {},\r\n format: 'dd-MM-yyyy',\r\n open1: open1,\r\n open2: open2,\r\n pageChanged: pageChanged,\r\n popup1: {\r\n opened: false,\r\n },\r\n popup2: {\r\n opened: false,\r\n },\r\n search: search,\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/case-law-eu');\r\n euCaseLawDataService.loadTags();\r\n euCaseLawDataService.loadCaseLaw();\r\n }\r\n\r\n function detached() {\r\n euCaseLawDataService.clear();\r\n }\r\n\r\n function clearForm() {\r\n euCaseLawDataService.clear();\r\n euCaseLawDataService.loadCaseLaw();\r\n }\r\n\r\n function open1() {\r\n vm.popup1.opened = true;\r\n }\r\n\r\n function open2() {\r\n vm.popup2.opened = true;\r\n }\r\n\r\n function pageChanged() {\r\n euCaseLawDataService.loadCaseLaw();\r\n var height = document.getElementsByClassName('rechtspraak-search-buttons')[0].offsetTop;\r\n var element = document.getElementById('content');\r\n element.scrollTo(0, height);\r\n }\r\n\r\n function search() {\r\n euCaseLawDataService.loadCaseLaw();\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n item: '<'\r\n },\r\n controller: euCaseLawSummaryButtonController,\r\n templateUrl: 'case-law/components/eu-case-law-summary-button.html'\r\n};\r\n\r\neuCaseLawSummaryButtonController.$inject = ['euCaseLawSummaryModal'];\r\n\r\nfunction euCaseLawSummaryButtonController(euCaseLawSummaryModal) {\r\n\r\n var vm = {\r\n showSummary: showSummary\r\n };\r\n\r\n function showSummary(workId) {\r\n euCaseLawSummaryModal.show(workId);\r\n }\r\n\r\n return vm;\r\n\r\n}","module.exports = {\r\n bindings: {\r\n item: '<'\r\n },\r\n controller: nlCaseLawListItemController,\r\n templateUrl: 'case-law/components/nl-case-law-list-item.html'\r\n};\r\n\r\nnlCaseLawListItemController.$inject = ['nlCaseLawJudgmentModal'];\r\n\r\nfunction nlCaseLawListItemController(nlCaseLawJudgmentModal) {\r\n var vm = {\r\n showJudgment: showJudgment,\r\n };\r\n\r\n function showJudgment(ecli) {\r\n nlCaseLawJudgmentModal.show(ecli);\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n item: '<'\r\n },\r\n controller: nlCaseLawNewsItemController,\r\n templateUrl: 'case-law/components/nl-case-law-news-item.html'\r\n};\r\n\r\nnlCaseLawNewsItemController.$inject = ['nlCaseLawJudgmentModal'];\r\n\r\nfunction nlCaseLawNewsItemController(nlCaseLawJudgmentModal) {\r\n var vm = {\r\n showJudgment: showJudgment,\r\n };\r\n\r\n function showJudgment(ecli) {\r\n nlCaseLawJudgmentModal.show(ecli);\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n controller: nlCaseLawPageController,\r\n templateUrl: 'case-law/components/nl-case-law-page.html'\r\n};\r\n\r\nnlCaseLawPageController.$inject = [\r\n '$analytics', \r\n '$routeParams', \r\n '$location', \r\n 'nlCaseLawDataService',\r\n];\r\n\r\nfunction nlCaseLawPageController(\r\n $analytics, \r\n $routeParams, \r\n $location, \r\n nlCaseLawDataService\r\n) {\r\n\r\n if ($routeParams.ecli && $routeParams.ecli.match(/ecli:eu/i)) {\r\n $location.url('/case-law-nl');\r\n }\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n data: nlCaseLawDataService,\r\n clear: clear,\r\n dateOptions: {},\r\n format: 'dd-MM-yyyy',\r\n open1: open1,\r\n open2: open2,\r\n pageChanged: pageChanged,\r\n popup1: {\r\n opened: false,\r\n },\r\n popup2: {\r\n opened: false,\r\n },\r\n search: search,\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/case-law/nl');\r\n nlCaseLawDataService.loadCaseLawSearchResults();\r\n }\r\n\r\n function detached() {\r\n clear();\r\n }\r\n\r\n function clear() {\r\n nlCaseLawDataService.clear();\r\n }\r\n\r\n function open1() {\r\n vm.popup1.opened = true;\r\n }\r\n\r\n function open2() {\r\n vm.popup2.opened = true;\r\n }\r\n\r\n function pageChanged() {\r\n nlCaseLawDataService.loadCaseLawSearchResults();\r\n var height = document.getElementsByClassName('rechtspraak-search-buttons')[0].offsetTop;\r\n var element = document.getElementById('content');\r\n element.scrollTo(0, height);\r\n }\r\n\r\n function search() {\r\n nlCaseLawDataService.loadCaseLawSearchResults();\r\n }\r\n\r\n return vm;\r\n}","module.exports = ['$analytics', '$uibModal', caseLawModal];\r\n\r\nfunction caseLawModal($analytics, $uibModal) {\r\n var modal = {\r\n goodscode: null,\r\n searchQuery: null,\r\n show: showModal\r\n };\r\n\r\n function showModal(goodscode, searchQuery) {\r\n $analytics.eventTrack('open-modal-case-law', { category: 'case-law' });\r\n\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: caseLawModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n goodscode: function () {\r\n return goodscode;\r\n },\r\n searchQuery: function () {\r\n return searchQuery;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'case-law/modals/case-law-modal.html',\r\n windowClass: 'modal-case-law modal-wide'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n caseLawModalController.$inject = ['$uibModalInstance', 'goodscode', 'searchQuery'];\r\n\r\n function caseLawModalController($uibModalInstance, goodscode, searchQuery) {\r\n\r\n var ctrl = {\r\n cancel: cancel,\r\n goodscode: goodscode,\r\n searchQuery: searchQuery,\r\n };\r\n\r\n return ctrl;\r\n\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n }\r\n\r\n return modal;\r\n\r\n}","module.exports = [\r\n '$analytics', \r\n '$uibModal', \r\n euCaseLawSummaryModal\r\n];\r\n\r\nfunction euCaseLawSummaryModal(\r\n $analytics, \r\n $uibModal\r\n) {\r\n \r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n euCaseLawSummaryModalController.$inject = [\r\n '$uibModalInstance', \r\n 'euCaseLawDataService', \r\n 'workId'\r\n ];\r\n\r\n function euCaseLawSummaryModalController(\r\n $uibModalInstance, \r\n euCaseLawDataService, \r\n workId\r\n ) {\r\n\r\n var vm = {\r\n cancel: cancel,\r\n workId: workId,\r\n $onInit: attached,\r\n summary: euCaseLawDataService.summary,\r\n // title\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function attached() {\r\n euCaseLawDataService.loadSummary(vm.workId).then(function() {\r\n var iframe = document.getElementById('eu-case-law-summary-iframe'),\r\n iframedoc = iframe.contentDocument || iframe.contentWindow.document;\r\n\r\n iframedoc.body.innerHTML = euCaseLawDataService.summary.html;\r\n });\r\n euCaseLawDataService.getSummaryPdfUrl(vm.workId);\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n\r\n\r\n function showModal(workId) {\r\n $analytics.eventTrack('open-modal-eu-case-law-summary', { category: 'case-law' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: euCaseLawSummaryModalController,\r\n controllerAs: 'ctrlEuCaseLawSummaryModal',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n workId: function() {\r\n return workId;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'case-law/modals/eu-case-law-summary-modal.html',\r\n windowClass: 'modal-eu-case-law-summary'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}","module.exports = [\r\n '$analytics', \r\n '$uibModal', \r\n nlCaseLawSummaryModal\r\n];\r\n\r\nfunction nlCaseLawSummaryModal(\r\n $analytics, \r\n $uibModal\r\n) {\r\n\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n nlCaseLawJudgmentModalController.$inject = [\r\n '$uibModalInstance', \r\n 'nlCaseLawDataService', \r\n 'ecli',\r\n ];\r\n\r\n function nlCaseLawJudgmentModalController(\r\n $uibModalInstance, \r\n nlCaseLawDataService, \r\n ecli\r\n ) {\r\n \r\n var vm = {\r\n cancel: cancel,\r\n ecli: ecli,\r\n $onInit: attached,\r\n judgment: nlCaseLawDataService.judgment,\r\n // title\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function attached() {\r\n nlCaseLawDataService.loadJudgment(vm.ecli);\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n\r\n\r\n function showModal(ecli) {\r\n $analytics.eventTrack('open-modal-nl-case-law-judgment', { category: 'case-law' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: nlCaseLawJudgmentModalController,\r\n controllerAs: 'ctrlNlCaseLawJudgmentModal',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n ecli: function() {\r\n return ecli;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'case-law/modals/nl-case-law-judgment-modal.html',\r\n windowClass: 'modal-nl-case-law-judgment'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}","module.exports = ['common', 'dataContext', 'identity', caseLawDataService];\r\n\r\nfunction caseLawDataService(common, context, identity) {\r\n var service = {\r\n euCaseLawItemsPerHeading: {},\r\n dutchCaseLawItemsPerHeading: {},\r\n getCaseLawInfo: getCaseLawInfo \r\n };\r\n return service;\r\n\r\n function getCaseLawInfo(chapterNumber) {\r\n var urlEU = common.config.apiHosts.generic + '/caselaw/eu/documents/countByHeading/' + chapterNumber;\r\n var urlNL = common.config.apiHosts.generic + '/caselaw/nl/documents/countByHeading/' + chapterNumber;\r\n if (identity.hasPermission('case-law-eu')) {\r\n var reqEU = context.get(urlEU);\r\n reqEU.then(function (data) {\r\n _.forEach(data, function (element) {\r\n service.euCaseLawItemsPerHeading[element.Heading + \"000000\"] = element.N;\r\n });\r\n });\r\n }\r\n if (identity.hasPermission('case-law-nl')) {\r\n var reqNL = context.get(urlNL);\r\n reqNL.then(function (data) {\r\n _.forEach(data, function (element) {\r\n service.dutchCaseLawItemsPerHeading[element.Heading + \"000000\"] = element.N;\r\n });\r\n });\r\n }\r\n }\r\n}","module.exports = ['$httpParamSerializer', '$location', '$routeParams', 'common', 'dataContext', 'identity', euCaseLawDataService];\r\n\r\nfunction euCaseLawDataService($httpParamSerializer, $location, $routeParams, common, context, identity) {\r\n var service = {\r\n isLoading: false,\r\n query: {\r\n Celex: null,\r\n Ecli: $routeParams.ecli || null,\r\n EndDate: null,\r\n GoodsCode: null,\r\n Lang: common.language.get(),\r\n Query: null,\r\n StartDate: null,\r\n Tag: null,\r\n Zaaknummer: null,\r\n Page: 1\r\n },\r\n tags: [],\r\n response: {},\r\n summary: {\r\n html: null,\r\n metadata: null,\r\n pdfUrl: null\r\n },\r\n clear: clear,\r\n getSummaryPdfUrl: getSummaryPdfUrl,\r\n loadCaseLaw: loadCaseLaw,\r\n loadCaseLawNews: loadCaseLawNews,\r\n loadSummary: loadSummary,\r\n loadTags: loadTags,\r\n };\r\n\r\n function clear() {\r\n service.query.Celex = null;\r\n service.query.Ecli = null;\r\n service.query.EndDate = null;\r\n service.query.GoodsCode = null;\r\n service.query.Query = null;\r\n service.query.StartDate = null;\r\n service.query.Tag = null;\r\n service.query.Zaaknummer = null;\r\n service.query.Page = 1;\r\n\r\n $location.search('ecli', null);\r\n }\r\n\r\n function loadTags() {\r\n if (identity.hasPermission('case-law-eu')) {\r\n context.get(common.config.apiHosts.generic + '/caselaw/eu/tags')\r\n .then(function (data) {\r\n service.tags = data;\r\n });\r\n }\r\n }\r\n\r\n function loadCaseLaw() {\r\n if (identity.hasPermission('case-law-eu')) {\r\n service.isLoading = true;\r\n service.response = {};\r\n return context.get(common.config.apiHosts.generic + '/caselaw/eu/search?' + $httpParamSerializer(service.query))\r\n .then(function (data) {\r\n service.response = data;\r\n service.isLoading = false;\r\n }, function (data, status, jqXhr) {\r\n if (status === 401) {\r\n service.isLoading = false;\r\n service.noAccess = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n function loadCaseLawNews(pageNumber) {\r\n clear();\r\n service.query.Page = pageNumber;\r\n if (identity.hasPermission('case-law-eu')) {\r\n service.isLoading = true;\r\n return context.get(common.config.apiHosts.generic + '/caselaw/eu/search?' + $httpParamSerializer(service.query))\r\n .then(function (data) {\r\n service.response = data;\r\n service.isLoading = false;\r\n }, function (data, status, jqXhr) {\r\n if (status === 401) {\r\n service.isLoading = false;\r\n service.noAccess = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n function loadSummary(workId) {\r\n if (identity.hasPermission('case-law-eu')) {\r\n service.summary.html = null;\r\n service.isLoading = true;\r\n return context.get(common.config.apiHosts.generic + '/caselaw/eu/summary/' + workId).then(function (html) {\r\n service.summary.html = html;\r\n service.isLoading = false;\r\n });\r\n }\r\n }\r\n\r\n function getSummaryPdfUrl(workId) {\r\n if (identity.hasPermission('case-law-eu')) {\r\n service.summary.html = null;\r\n service.isLoading = true;\r\n var url = common.config.apiHosts.generic +\r\n '/caselaw/eu/summary/' + workId + '/pdfUrl'\r\n return context.get(url).then(function (pdfUrl) {\r\n service.summary.pdfUrl = pdfUrl;\r\n service.isLoading = false;\r\n });\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n return service;\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = ['$location', '$routeParams', 'common', 'dataContext', 'identity', nlCaseLawDataService];\r\n\r\nfunction nlCaseLawDataService($location, $routeParams, common, context, identity) {\r\n var service = {\r\n clear: clear,\r\n isLoading: false,\r\n judgment: {},\r\n loadCaseLawNews: loadCaseLawNews,\r\n loadCaseLawSearchResults: loadCaseLawSearchResults,\r\n loadJudgment: loadJudgment,\r\n query: {\r\n Ecli: $routeParams.ecli || null,\r\n EndDate: null,\r\n GoodsCode: null,\r\n Query: null,\r\n StartDate: null,\r\n Tag: null,\r\n Zaaknummer: null,\r\n PageNumber: 1\r\n },\r\n response: {},\r\n };\r\n\r\n function clear() {\r\n service.query.Ecli = null;\r\n service.query.EndDate = null;\r\n service.query.GoodsCode = null;\r\n service.query.Query = null;\r\n service.query.StartDate = null;\r\n service.query.Tag = null;\r\n service.query.Zaaknummer = null;\r\n service.query.PageNumber = 1;\r\n $location.search('ecli', null);\r\n }\r\n\r\n function loadCaseLawNews(pageNumber) {\r\n clear();\r\n service.query.PageNumber = pageNumber;\r\n service.response = {};\r\n if (identity.hasPermission('case-law-nl')) {\r\n service.isLoadingNL = true;\r\n var dutchCaseLawUrl = common.config.apiHosts.generic + '/caselaw/nl/documents/search';\r\n\r\n dutchCaseLawUrl += '?size=10&page=' + service.query.PageNumber;\r\n\r\n // TODO: in production, it should not be possible to view unpublished items at all\r\n // Hence, it should be possible to remove this line by now\r\n dutchCaseLawUrl += '&published=True';\r\n return context.get(dutchCaseLawUrl)\r\n .then(function (data) {\r\n if (data) {\r\n service.response = data;\r\n }\r\n service.isLoading = false;\r\n }, function (data, status, jqXhr) {\r\n if (status === 401) {\r\n service.isLoading = false;\r\n service.noAccess = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n function loadCaseLawSearchResults() {\r\n if (identity.hasPermission('case-law-nl')) {\r\n service.isLoading = true;\r\n service.response = {};\r\n var dutchCaseLawUrl = common.config.apiHosts.generic + \"/caselaw/nl/documents/search\";\r\n if (service.query.Ecli) {\r\n dutchCaseLawUrl += '?fields=ecli&q=' + service.query.Ecli;\r\n }\r\n else if (service.query.Zaaknummer) {\r\n dutchCaseLawUrl += '?fields=zaaknummer&q=' + service.query.Zaaknummer;\r\n }\r\n else {\r\n dutchCaseLawUrl += '?page=' + service.query.PageNumber;\r\n if (service.query.GoodsCode) {\r\n dutchCaseLawUrl += \"&goodscode=\" + service.query.GoodsCode;\r\n }\r\n if (service.query.Query) {\r\n dutchCaseLawUrl += \"&fields=inhoudsindicatie,document&q=\" + service.query.Query;\r\n }\r\n // TODO: implementatie van zoeken op publicatiedatum\r\n if (service.query.StartDate) {\r\n dutchCaseLawUrl += '&uitspraakDatumStart=' + moment(service.query.StartDate).format('YYYY-MM-DD');\r\n }\r\n if (service.query.EndDate) {\r\n dutchCaseLawUrl += '&uitspraakDatumEinde=' + moment(service.query.EndDate).format('YYYY-MM-DD');\r\n }\r\n }\r\n // TODO: it should be possible to remove the next line\r\n dutchCaseLawUrl += '&published=True';\r\n return context.get(dutchCaseLawUrl)\r\n .then(function (data) {\r\n if (data) {\r\n service.response = data;\r\n }\r\n service.isLoading = false;\r\n }, function (data, status, jqXhr) {\r\n if (status === 401) {\r\n service.isLoading = false;\r\n service.noAccess = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n function loadJudgment(ecli) {\r\n if (identity.hasPermission('case-law-nl')) {\r\n service.isLoading = true;\r\n service.judgment.pdfUrl = 'https://uitspraken.rechtspraak.nl/InzienDocument/GetPdf?ecli=' + ecli;\r\n var dutchCaseLawUrl = common.config.apiHosts.generic + \"/caselaw/nl/documents/\" + ecli + \"/document\";\r\n context.get(dutchCaseLawUrl)\r\n .then(function (data) {\r\n if (data) {\r\n service.judgment.response = data;\r\n }\r\n service.isLoading = false;\r\n }, function (data, status, jqXhr) {\r\n if (status === 401) {\r\n service.isLoading = false;\r\n service.noAccess = true;\r\n }\r\n });\r\n }\r\n }\r\n return service;\r\n}","angular.module('taric.certificateCodes', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('certificateCodePicker', require('./components/certificate-code-picker'))\r\n // Pages\r\n .component('certificateCodesPage', require('./components/certificate-codes-page'))\r\n // Filters\r\n .filter('certificateCodeTypeahead', require('./filters/certificate-code-typeahead-filter'))\r\n // Modals\r\n .factory('certificateCodeSelectorModal', require('./modals/certificate-code-selector'))\r\n // Services\r\n .factory('certificateCodesDataService', require('./services/certificate-codes-data'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/certificate-codes', {\r\n template: ''\r\n })\r\n ;\r\n}","module.exports = {\r\n bindings: { \r\n placeholder: '<', \r\n certificateCodes: '<', \r\n possibleCertificateCodes: '< ', \r\n selectionChanged: '&' \r\n },\r\n controller: certificateCodePickerController,\r\n templateUrl: 'certificate-codes/components/certificate-code-picker.html'\r\n};\r\n\r\ncertificateCodePickerController.$inject = ['certificateCodeSelectorModal'];\r\n\r\nfunction certificateCodePickerController(certificateCodeSelectorModal) {\r\n var vm = {\r\n $onInit: attached,\r\n removeCertificateCode: removeCertificateCode,\r\n certificateCodes: [],\r\n possibleCertificateCodes: [],\r\n availableCertificateCodes: [],\r\n userInput: null,\r\n itemSelected: itemSelected,\r\n onBlur: onBlur,\r\n onFocus: onFocus,\r\n onEnter: onEnter,\r\n showModal: showModal\r\n };\r\n\r\n return vm;\r\n\r\n function showModal() {\r\n updateAvailableCertificateCodes();\r\n certificateCodeSelectorModal\r\n .show(vm.availableCertificateCodes, vm.certificateCodes)\r\n .result\r\n .then(itemSelected)\r\n .catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n function attached() {\r\n updateAvailableCertificateCodes();\r\n }\r\n\r\n // available means possible and not already selected\r\n function updateAvailableCertificateCodes() {\r\n vm.availableCertificateCodes = _.chain(vm.possibleCertificateCodes)\r\n .differenceBy(vm.certificateCodes, function (certificateCode) {\r\n return certificateCode.type + certificateCode.code;\r\n })\r\n .map(function (certificateCode) {\r\n if (certificateCode.origin === 'IT') {\r\n certificateCode.displayString = certificateCode.code + ' ' + certificateCode.type;\r\n }\r\n else {\r\n certificateCode.displayString = certificateCode.type + ' ' + certificateCode.code;\r\n }\r\n return certificateCode;\r\n })\r\n .value();\r\n }\r\n\r\n function removeCertificateCode(certificateCode) {\r\n vm.certificateCodes = _.filter(vm.certificateCodes, function (code) {\r\n return code.type !== certificateCode.type || code.code !== certificateCode.code;\r\n });\r\n updateAvailableCertificateCodes();\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ certificateCodes: vm.certificateCodes });\r\n }\r\n\r\n function onFocus() {\r\n updateAvailableCertificateCodes();\r\n }\r\n\r\n function onBlur() {\r\n\r\n }\r\n\r\n function onEnter() {\r\n\r\n }\r\n\r\n function itemSelected(item, model) {\r\n vm.userInput = null;\r\n // console.log('itemSelected', item, model, vm.userInput);\r\n vm.certificateCodes.push(item);\r\n updateAvailableCertificateCodes();\r\n\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ certificateCodes: vm.certificateCodes });\r\n\r\n }\r\n\r\n\r\n}\r\n","module.exports = {\r\n controller: certificateCodesPageController,\r\n templateUrl: 'certificate-codes/components/certificate-codes-page.html'\r\n};\r\n\r\ncertificateCodesPageController.$inject = [\r\n '$analytics', \r\n '$timeout',\r\n 'notificationsService', \r\n 'certificateCodesDataService', \r\n 'applicationStateService'\r\n];\r\n\r\nfunction certificateCodesPageController(\r\n $analytics, \r\n $timeout,\r\n notifications, \r\n certificateCodesData, \r\n state\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n isLoading: false,\r\n filter: \"\",\r\n filterType: \"\",\r\n isLoadingTypes: false,\r\n filteredCertificateCodes: [],\r\n certificateCodes: [],\r\n certificateCodeTypes: [],\r\n filteredCertificateCodeTypes: [],\r\n selectedType: null,\r\n referenceCountry: state.filter.referenceCountry,\r\n loadcertificateCodes: loadCertificateCodes,\r\n clearFilter: clearFilter,\r\n changeFilter: changeFilter,\r\n clearFilterType: clearFilterType,\r\n changeFilterType: changeFilterType,\r\n focusInputTypeField: focusInputTypeField,\r\n focusInputField: focusInputField\r\n };\r\n\r\n function focusInputTypeField() {\r\n $timeout(function(){\r\n var inputEL = angular.element(document.querySelector('#inputFilterType'));\r\n if (inputEL) {\r\n inputEL[0].focus();\r\n }\r\n }, 0);\r\n }\r\n\r\n function focusInputField() {\r\n $timeout(function(){\r\n var inputEL = angular.element(document.querySelector('#inputFilter'));\r\n if (inputEL) {\r\n inputEL[0].focus();\r\n }\r\n }, 0);\r\n }\r\n\r\n function attached() {\r\n $analytics.pageTrack('/reference/certificate-codes');\r\n loadTypes();\r\n notifications.subscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function clearFilter() {\r\n vm.filter = '';\r\n vm.filteredCertificateCodes = vm.certificateCodes;\r\n focusInputField();\r\n }\r\n\r\n function changeFilter() {\r\n vm.filteredCertificateCodes = vm.certificateCodes.filter(function (el) {\r\n return (el.type.toLowerCase() + el.code.toLowerCase()).includes(vm.filter.toLowerCase()) || \r\n el.description.toLowerCase().includes(vm.filter.toLowerCase());\r\n });\r\n }\r\n\r\n function clearFilterType() {\r\n clearFilter();\r\n vm.filterType = \"\";\r\n vm.filteredCertificateCodeTypes = vm.certificateCodeTypes;\r\n vm.certificateCodes = [];\r\n vm.filteredCertificateCodes = [];\r\n vm.selectedType = null;\r\n focusInputTypeField();\r\n }\r\n\r\n function changeFilterType() {\r\n vm.filteredCertificateCodeTypes = vm.certificateCodeTypes.filter(function (el) {\r\n return el.code.toLowerCase().includes(vm.filterType.toLowerCase()) || el.description.toLowerCase().includes(vm.filterType.toLowerCase());\r\n });\r\n if(vm.filteredCertificateCodeTypes.length === 1) {\r\n loadCertificateCodes(vm.filteredCertificateCodeTypes[0]);\r\n }\r\n if(vm.filteredCertificateCodeTypes.length === 0) {\r\n vm.certificateCodes = [];\r\n vm.filteredCertificateCodes = [];\r\n vm.selectedType = null;\r\n vm.filter = \"\";\r\n }\r\n }\r\n\r\n function dateChanged() {\r\n loadTypes();\r\n }\r\n\r\n function loadCertificateCodes(type) {\r\n if (vm.referenceCountry === 'CH') {\r\n return;\r\n }\r\n vm.isLoading = true;\r\n vm.selectedType = type.code;\r\n vm.filter = \"\";\r\n \r\n certificateCodesData.getByType(type.code)\r\n .then(function (data) {\r\n vm.filteredCertificateCodes = data\r\n vm.certificateCodes = data;\r\n vm.isLoading = false;\r\n focusInputField();\r\n });\r\n }\r\n\r\n function loadTypes() {\r\n if (vm.referenceCountry === 'CH') {\r\n return;\r\n }\r\n vm.isLoadingTypes = true;\r\n vm.certificateCodes = [];\r\n vm.selectedType = null;\r\n\r\n certificateCodesData.getTypes()\r\n .then(function (data) {\r\n vm.certificateCodeTypes = data;\r\n vm.filteredCertificateCodeTypes = data;\r\n vm.isLoadingTypes = false;\r\n focusInputTypeField();\r\n });\r\n }\r\n\r\n return vm;\r\n\r\n}","module.exports = [certificateCodeTypeaheadFilter];\r\n\r\n// Takes care of ordering the results of the certificate code typeahed. The logic is as follows:\r\n// First, show the matches on the certificate code, ordered by code\r\n// Next, show the matches on the beginning of the certificate code description, ordered by description\r\n// Finally, show the matches anywhere else in the description, ordered by description\r\nfunction certificateCodeTypeaheadFilter() {\r\n\r\n return function (certificateCodes, query) {\r\n var result;\r\n if (query === null || query === undefined || query === '') {\r\n result = _.sortBy(certificateCodes, function(certificateCode) {\r\n return certificateCode.type + certificateCode.code;\r\n });\r\n }\r\n else {\r\n var certificateCodeMatchPartition = _.partition(certificateCodes, function(certificateCode) {\r\n return (certificateCode.type + certificateCode.code).toLowerCase().indexOf(query.replace(' ', '').toLowerCase()) >= 0;\r\n });\r\n var certificateCodeMatchStartPartition = _.partition(certificateCodeMatchPartition[0], function(certificateCode) {\r\n return (certificateCode.type + certificateCode.code).toLowerCase().indexOf(query.replace(' ', '').toLowerCase()) === 0;\r\n });\r\n\r\n var certificateCodeStartMatches = _.sortBy(certificateCodeMatchStartPartition[0], function(certificateCode) {\r\n return certificateCode.type + certificateCode.code;\r\n });\r\n var certificateCodeOtherMatches = _.sortBy(certificateCodeMatchStartPartition[1], function(certificateCode) {\r\n return certificateCode.type + certificateCode.code;\r\n });\r\n\r\n var otherMatches = _.sortBy(certificateCodeMatchPartition[1], 'description');\r\n\r\n var descriptionStartMatchPartition = _.partition(otherMatches, function(certificateCode) {\r\n return certificateCode.description && certificateCode.description.toLowerCase().indexOf(query.toLowerCase()) === 0;\r\n });\r\n\r\n var otherDescriptionMatches = _.filter(descriptionStartMatchPartition[1], function(certificateCode) {\r\n return certificateCode.description && certificateCode.description.toLowerCase().indexOf(query.toLowerCase()) > -1;\r\n });\r\n\r\n result = _.concat(certificateCodeStartMatches, certificateCodeOtherMatches, descriptionStartMatchPartition[0], otherDescriptionMatches);\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n","module.exports = ['$analytics', '$uibModal', certificateCodeSelectorModal];\r\n\r\nfunction certificateCodeSelectorModal($analytics, $uibModal) {\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n certificateCodeSelectorModalController.$inject = ['$uibModalInstance', 'possibleCertificateCodes', 'certificateCode'];\r\n\r\n function certificateCodeSelectorModalController($uibModalInstance, possibleCertificateCodes, certificateCode) {\r\n var vm = {\r\n certificateCode: certificateCode,\r\n cancel: cancel,\r\n possibleCertificateCodes: possibleCertificateCodes,\r\n ok: ok\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function ok(code) {\r\n $uibModalInstance.close(code);\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(possibleCertificateCodes, certificateCode) {\r\n $analytics.eventTrack('open-modal-certificate-selector', { category: 'certificate-codes' });\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: certificateCodeSelectorModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n certificateCode: function () {\r\n return certificateCode;\r\n },\r\n possibleCertificateCodes: function () {\r\n return possibleCertificateCodes;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'certificate-codes/modals/certificate-code-selector.html',\r\n windowClass: 'modal-certificate-code-selector'\r\n });\r\n\r\n modalInstance.rendered.then(function() {\r\n var elementToFocusOnInModal = document.querySelector('.modal.in .focus-on-open-modal');\r\n if (elementToFocusOnInModal) {\r\n elementToFocusOnInModal.focus();\r\n }\r\n });\r\n\r\n return modalInstance;\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['common', 'dataContext', 'applicationStateService', certificateCodesDataService];\r\n\r\nfunction certificateCodesDataService(common, context, state) {\r\n\r\n var service = {\r\n getByType: getByType,\r\n getTypes: getTypes\r\n };\r\n\r\n function getByType(certificateType) {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/certificates' +\r\n '?type=' + certificateType +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n function getTypes() {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/certificates/types' +\r\n '?origin=EU,' + state.filter.referenceCountry +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n return service;\r\n\r\n}","angular.module('taric.classificationRegulations', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('classificationRegulation', require('./components/classification-regulation'))\r\n .component('classificationRegulationNew', require('./components/classification-regulation-new'))\r\n .component('classificationRegulationOld', require('./components/classification-regulation-old'))\r\n .component('tarifering', require('./components/tarifering'))\r\n // Pages\r\n .component('searchClassificationRegulationsPage', require('./components/search-classification-regulations-page'))\r\n .component('searchEnglishClassificationRegulationsPage', require('./components/search-classification-regulations-english-page'))\r\n // Modals\r\n .factory('classificationRegulationsModal', require('./modals/classification-regulations'))\r\n .factory('englishClassificationRegulationsModal', require('./modals/classification-regulations-en'))\r\n // Services\r\n .factory('searchClassificationRegulationsService', require('./services/search-classification-regulations'))\r\n .factory('searchEnglishClassificationRegulationsService', require('./services/search-classification-regulations-english'))\r\n ;\r\n\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/classification-regulations/nl/search/:searchquery', {\r\n template: ''\r\n })\r\n .when('/classification-regulations/en/search/:searchquery', {\r\n template: ''\r\n })\r\n .when('/classification-regulations/nl/search', {\r\n template: ''\r\n })\r\n .when('/classification-regulations/en/search', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: { \r\n classification: '<', \r\n query: '<',\r\n },\r\n templateUrl: 'classification-regulations/components/classification-regulation-new.html',\r\n};","module.exports = {\r\n bindings: { \r\n classification: '<', \r\n query: '<' \r\n },\r\n templateUrl: 'classification-regulations/components/classification-regulation-old.html',\r\n};","module.exports = {\r\n bindings: { \r\n classification: '<', \r\n query: '<' \r\n },\r\n templateUrl: 'classification-regulations/components/classification-regulation.html',\r\n};","module.exports = {\r\n controller: searchEnglishClassificationRegulationsController,\r\n templateUrl: 'classification-regulations/components/search-classification-regulations-english-page.html'\r\n};\r\n\r\nsearchEnglishClassificationRegulationsController.$inject = [\r\n '$analytics', \r\n '$location', \r\n 'language', \r\n 'searchEnglishClassificationRegulationsService',\r\n];\r\n\r\nfunction searchEnglishClassificationRegulationsController(\r\n $analytics, \r\n $location, \r\n language, \r\n searchEnglishClassificationRegulationsService\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n data: searchEnglishClassificationRegulationsService.data,\r\n isLoading: false,\r\n language: language.get(),\r\n noResults: noResults,\r\n parsedQuery: null,\r\n search: search\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n // TODO: parse properly\r\n vm.query = $location.search().query;\r\n vm.code = $location.search().commodityCode;\r\n $analytics.pageTrack('/classification-regulations-search');\r\n loadSearch();\r\n }\r\n\r\n function search(query) {\r\n $location.path('/classification-regulations/en/search').search(query);\r\n }\r\n\r\n function noResults() {\r\n return vm.language === 'en'\r\n && !vm.isLoading\r\n && vm.data.classificationRegulationsOld.length === 0\r\n && vm.data.classificationRegulationsNew.length === 0\r\n && queryIsValid();\r\n }\r\n\r\n function queryIsValid() {\r\n return vm.query && vm.query.length >= 2;\r\n }\r\n\r\n\r\n function loadSearch() {\r\n\r\n if (queryIsValid()) {\r\n\r\n if (vm.language === 'en') {\r\n vm.isLoading = true;\r\n searchEnglishClassificationRegulationsService.load(vm.code, vm.query)\r\n .then(function () {\r\n vm.isLoading = false;\r\n })\r\n .catch(function(){\r\n vm.isLoading = false;\r\n });\r\n }\r\n else if (vm.language === 'nl') {\r\n $location.path('/classification-regulations/nl/search').replace();\r\n }\r\n }\r\n }\r\n}","module.exports = {\r\n controller: searchClassificationRegulationsController,\r\n templateUrl: 'classification-regulations/components/search-classification-regulations-page.html'\r\n};\r\n\r\nsearchClassificationRegulationsController.$inject = [\r\n '$analytics', \r\n '$location', \r\n 'notificationsService', \r\n 'language', \r\n 'searchClassificationRegulationsService',\r\n];\r\n\r\nfunction searchClassificationRegulationsController(\r\n $analytics, \r\n $location, \r\n notificationsService, \r\n language, \r\n searchClassificationRegulationsService\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n data: searchClassificationRegulationsService.data,\r\n isLoading: false,\r\n language: language.get(),\r\n noResults: noResults,\r\n search: search\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n // TODO: parse properly\r\n vm.query = $location.search().query;\r\n vm.code = $location.search().commodityCode;\r\n $analytics.pageTrack('/classification-regulations-search');\r\n\r\n loadSearch();\r\n notificationsService.subscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function search(query) {\r\n $location.path('/classification-regulations/nl/search').search(query);\r\n }\r\n\r\n\r\n function noResults() {\r\n return vm.language === 'nl' && !vm.isLoading && vm.data.classificationRegulations.length === 0 && queryIsValid();\r\n }\r\n\r\n function queryIsValid() {\r\n return vm.query && vm.query.length >= 2;\r\n }\r\n\r\n\r\n function loadSearch() {\r\n\r\n if (queryIsValid()) {\r\n if (vm.language === 'nl') {\r\n vm.isLoading = true;\r\n searchClassificationRegulationsService.load(vm.code, vm.query)\r\n .then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n else if (vm.language === 'en') {\r\n $location.path('/classification-regulations/en/search').search({ code: vm.code, query: vm.query }).replace();\r\n }\r\n }\r\n else {\r\n searchClassificationRegulationsService.data.classificationRegulations = [];\r\n }\r\n }\r\n}","module.exports = {\r\n bindings: {\r\n tarifering: '<',\r\n query: '<'\r\n },\r\n controller: tariferingController,\r\n templateUrl: 'classification-regulations/components/tarifering.html'\r\n};\r\n\r\ntariferingController.$inject = [\r\n '$element', \r\n 'searchClassificationRegulationsService', \r\n 'language',\r\n];\r\n\r\nfunction tariferingController(\r\n $element, \r\n searchClassificationRegulationsService, \r\n language\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n language: language.get()\r\n };\r\n\r\n function attached() {\r\n setTimeout(function() {\r\n var tariferingLinks = $element[0].querySelectorAll('a[data-type=\"tarifering\"]');\r\n _.forEach(tariferingLinks, function(link) {\r\n link.addEventListener('click', function() {\r\n var heading = this.attributes['data-heading'].value;\r\n var tariferingNumber = this.attributes['data-tarifering-number'].value;\r\n searchClassificationRegulationsService.loadTarifering(heading, tariferingNumber)\r\n .then(function (newTarifering) {\r\n newTarifering.isReference = true;\r\n vm.referencedTarifering = newTarifering;\r\n });\r\n });\r\n });\r\n }, 0);\r\n\r\n }\r\n return vm;\r\n}\r\n","module.exports = ['$uibModal', 'common', 'dataContext', englishClassificationRegulationsModal];\r\n\r\nfunction englishClassificationRegulationsModal($uibModal, common, dataContext) {\r\n var modal = {\r\n goodsCode: null,\r\n searchQuery: null,\r\n show: showModal\r\n };\r\n\r\n englishClassificationRegulationsModalController.$inject = [\r\n '$uibModalInstance', \r\n 'goodsCode', \r\n 'language', \r\n 'searchQuery', \r\n 'applicationStateService', \r\n 'searchEnglishClassificationRegulationsService'\r\n ];\r\n\r\n function englishClassificationRegulationsModalController(\r\n $uibModalInstance, \r\n goodsCode, \r\n language, \r\n searchQuery, \r\n state, \r\n searchEnglishClassificationRegulationsService\r\n ) {\r\n var vm = {\r\n cancel: cancel,\r\n data: {\r\n classificationRegulationsNew: [],\r\n classificationRegulationsOld: []\r\n },\r\n goodsCode: goodsCode,\r\n isLoading: false,\r\n language: language.get(),\r\n load: load,\r\n referenceCountry: state.filter.referenceCountry,\r\n searchQuery: searchQuery\r\n };\r\n\r\n init();\r\n\r\n return vm;\r\n\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function init() {\r\n load();\r\n }\r\n\r\n function load() {\r\n if (vm.language === 'en') {\r\n vm.isLoading = true;\r\n common.$q.all([\r\n function() { return loadClassificationRegulationsNew() },\r\n function() { return loadClassificationRegulationsOld() }\r\n ])\r\n .then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n }\r\n\r\n function loadClassificationRegulationsNew() {\r\n var url = common.config.apiHosts.generic + '/classifications/en-after-2013/search?GoodsCode=' + (vm.goodsCode || '');\r\n if (vm.searchQuery)\r\n url += '&Query=' + vm.searchQuery;\r\n return dataContext.get(url).then(function (classificationRegulations) {\r\n vm.data.classificationRegulationsNew = classificationRegulations;\r\n });\r\n }\r\n\r\n function loadClassificationRegulationsOld() {\r\n var url = common.config.apiHosts.generic + 'classifications/en-before-2014/search?GoodsCode=' + (vm.goodsCode || '');\r\n if (vm.searchQuery)\r\n url += '&Query=' + vm.searchQuery;\r\n return dataContext.get(url).then(function (classificationRegulations) {\r\n vm.data.classificationRegulationsOld = classificationRegulations;\r\n });\r\n }\r\n\r\n\r\n }\r\n\r\n function showModal(goodsCode, searchQuery) {\r\n\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: englishClassificationRegulationsModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n goodsCode: function () {\r\n return goodsCode;\r\n },\r\n searchQuery: function () {\r\n return searchQuery;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'classification-regulations/modals/classification-regulations-en.html',\r\n windowClass: 'modal-classification-regulations'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['$uibModal', 'common', classificationRegulationsModal];\r\n\r\nfunction classificationRegulationsModal($uibModal, common) {\r\n var modal = {\r\n goodsCode: null,\r\n searchQuery: null,\r\n show: showModal\r\n };\r\n\r\n classificationRegulationsModalController.$inject = [\r\n '$uibModalInstance', \r\n 'goodsCode', \r\n 'language', \r\n 'searchQuery', \r\n 'applicationStateService', \r\n 'searchClassificationRegulationsService'\r\n ];\r\n\r\n function classificationRegulationsModalController(\r\n $uibModalInstance, \r\n goodsCode, \r\n language, \r\n searchQuery, \r\n state, \r\n searchClassificationRegulationsService\r\n ) {\r\n var vm = {\r\n cancel: cancel,\r\n data: searchClassificationRegulationsService.data,\r\n goodsCode: goodsCode,\r\n isLoading: false,\r\n language: language.get(),\r\n load: load,\r\n referenceCountry: state.filter.referenceCountry,\r\n searchQuery: searchQuery\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function init() {\r\n load();\r\n }\r\n\r\n function load() {\r\n if (vm.language === 'nl') {\r\n vm.isLoading = true;\r\n searchClassificationRegulationsService.load(goodsCode, searchQuery)\r\n .then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n }\r\n\r\n init();\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(goodsCode, searchQuery) {\r\n\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: classificationRegulationsModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n goodsCode: function () {\r\n return goodsCode;\r\n },\r\n searchQuery: function () {\r\n return searchQuery;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'classification-regulations/modals/classification-regulations.html',\r\n windowClass: 'modal-classification-regulations'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['$q', 'dataContext', 'config', 'language', 'applicationStateService', searchEnglishClassificationRegulations];\r\n\r\nfunction searchEnglishClassificationRegulations($q, dataContext, config, language, state) {\r\n var service = {\r\n data: {\r\n classificationRegulationsNew: [],\r\n classificationRegulationsOld: []\r\n },\r\n load: loadClassificationRegulations\r\n };\r\n return service;\r\n\r\n function loadClassificationRegulations(goodsCode, searchQuery) {\r\n return $q.all([\r\n loadClassificationRegulationsNew(goodsCode, searchQuery),\r\n loadClassificationRegulationsOld(goodsCode, searchQuery)\r\n ]);\r\n }\r\n\r\n function loadClassificationRegulationsNew(goodsCode, searchQuery) {\r\n service.data.classificationRegulationsNew = [];\r\n var url = config.apiHosts.generic + '/classifications/en-after-2013/search?GoodsCode=' + (goodsCode || '') +\r\n '&date=' + state.filter.date +\r\n '&lang=' + language.get();\r\n if (searchQuery)\r\n url += '&Query=' + searchQuery;\r\n return dataContext.get(url).then(function (classificationRegulations) {\r\n service.data.classificationRegulationsNew = classificationRegulations;\r\n });\r\n }\r\n\r\n function loadClassificationRegulationsOld(goodsCode, searchQuery) {\r\n service.data.classificationRegulationsOld = [];\r\n var url = config.apiHosts.generic + '/classifications/en-before-2014/search?GoodsCode=' + (goodsCode || '') +\r\n '&date=' + state.filter.date +\r\n '&lang=' + language.get();\r\n if (searchQuery)\r\n url += '&Query=' + searchQuery;\r\n return dataContext.get(url).then(function (classificationRegulations) {\r\n service.data.classificationRegulationsOld = classificationRegulations;\r\n });\r\n }\r\n}","module.exports = ['dataContext', 'config', 'language', 'applicationStateService', searchClassificationRegulations];\r\n\r\nfunction searchClassificationRegulations(dataContext, config, language, state) {\r\n var service = {\r\n data: {\r\n classificationRegulations: []\r\n },\r\n load: loadClassificationRegulations,\r\n loadTarifering: loadTarifering\r\n };\r\n return service;\r\n\r\n function loadClassificationRegulations(goodsCode, searchQuery) {\r\n service.data.classificationRegulations = [];\r\n var url = config.apiHosts.generic + '/classifications/search?GoodsCode=' + (goodsCode || '') +\r\n '&date=' + state.filter.date +\r\n '&lang=' + language.get();\r\n if (searchQuery) {\r\n url += '&Query=' + searchQuery;\r\n }\r\n return dataContext.get(url).then(function (classificationRegulations) {\r\n service.data.classificationRegulations = classificationRegulations;\r\n });\r\n }\r\n\r\n function loadTarifering(heading, tariferingNumber) {\r\n var url = config.apiHosts.generic + '/classifications/tariferingen/' + heading + '/' + tariferingNumber;\r\n return dataContext.get(url);\r\n }\r\n}","angular.module('taric.compliance', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('complianceDetailsPage', require('./components/compliance-details-page'))\r\n .component('complianceNewPage', require('./components/compliance-new-page'))\r\n .component('complianceOverviewPage', require('./components/compliance-overview-page'))\r\n .factory('complianceDataService', require('./services/compliance-data'))\r\n .factory('complianceInfoModal', require('./modals/compliance-info'))\r\n .factory('complianceModalsService', require('./modals/modals'))\r\n .filter('jobStatusDisplay', require('./filters/job-status-display'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/compliance-check', {\r\n template: ''\r\n })\r\n .when('/compliance-check/new', {\r\n template: ''\r\n })\r\n .when('/compliance-check/:jobId', {\r\n template: ''\r\n })\r\n ;\r\n}","module.exports = {\r\n controller: complianceDetailsController,\r\n templateUrl: 'compliance/components/compliance-details-page.html'\r\n};\r\n\r\ncomplianceDetailsController.$inject = [\r\n '$analytics', \r\n '$routeParams', \r\n 'complianceDataService'\r\n];\r\n\r\nfunction complianceDetailsController(\r\n $analytics, \r\n $routeParams, \r\n complianceData\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n canLoadMore: false,\r\n hasErrorCode: hasErrorCode,\r\n hideLinesWithoutRemarks: false,\r\n job: null,\r\n jobDetails: [],\r\n jobId: null,\r\n loadMore: loadMore,\r\n pageIndex: 0,\r\n pageSize: 100\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/abc-details');\r\n if ($routeParams.jobId) {\r\n vm.jobDetails = [];\r\n vm.jobId = parseInt($routeParams.jobId);\r\n vm.pageIndex = 0;\r\n loadJob();\r\n }\r\n }\r\n\r\n function hasErrorCode(errorCodes, line) {\r\n for (var i = 0; i < errorCodes.length; i++) {\r\n if (_.some(line.ErrorCodes, function (ec) { return ec.Result === errorCodes[i]; })) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function loadJob() {\r\n // TODO: Get the job info in a nice way, directly, but the API has to be changed to support this\r\n // For now we do the superfluous call to get everything and pick the job from there\r\n complianceData.loadJobs()\r\n .then(function (result) {\r\n vm.job = _.find(result, function (j) { return j.JobId === vm.jobId; });\r\n });\r\n\r\n complianceData.getJobDetails(vm.jobId, vm.pageIndex, vm.pageSize)\r\n .then(function (data) {\r\n vm.jobDetails = vm.jobDetails.concat(data);\r\n vm.canLoadMore = vm.pageSize === data.length;\r\n }, function (error) {\r\n\r\n });\r\n }\r\n\r\n function loadMore() {\r\n vm.pageIndex++;\r\n loadJob();\r\n }\r\n\r\n return vm;\r\n}\r\n","module.exports = {\r\n controller: complianceNewController,\r\n templateUrl: 'compliance/components/compliance-new-page.html'\r\n};\r\n\r\ncomplianceNewController.$inject = [\r\n '$analytics', \r\n '$translate', \r\n 'common', \r\n 'complianceDataService', \r\n 'language', \r\n 'applicationStateService', \r\n 'Upload'\r\n];\r\n\r\nfunction complianceNewController(\r\n $analytics, \r\n $translate, \r\n common, \r\n complianceData, \r\n languageService, \r\n state, \r\n fileUpload\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n errors: [],\r\n appStateFilter: state.filter,\r\n getFileDetails: getFileDetails,\r\n inputColumnChanged: inputColumnChanged,\r\n isUploading: false,\r\n jobTemplates: [],\r\n jobTypeChanged: jobTypeChanged,\r\n jobTypes: [],\r\n newJob: {\r\n file: null,\r\n inputColumns: null,\r\n jobType: '',\r\n movement: '0',\r\n name: null,\r\n outputType: '2',\r\n startRow: {\r\n value: 2\r\n }\r\n },\r\n save: saveJob,\r\n selectedJobType: null,\r\n selectedTemplate: null,\r\n translations: []\r\n };\r\n\r\n function attached() {\r\n common.auth.check();\r\n $analytics.pageTrack('/abc-new');\r\n $translate([\r\n 'compliance.errors.select_file_to_check', \r\n 'compliance.errors.specify_goodsnom_column', \r\n 'compliance.errors.invalid_goodsnom_column', \r\n 'compliance.errors.invalid_country_code_column', \r\n 'compliance.errors.specify_starting_row', \r\n 'compliance.errors.invalid_starting_row', \r\n 'compliance.errors.specify_jobtype'\r\n ])\r\n .then(function (result) {\r\n vm.translations = result;\r\n });\r\n\r\n getJobTemplates();\r\n getJobTypes();\r\n }\r\n\r\n function getFileDetails(e) {\r\n for (var i = 0; i < e.length; i++) {\r\n vm.newJob.name = e[i].name;\r\n }\r\n }\r\n\r\n function getJobTemplates() {\r\n complianceData.getJobTemplates()\r\n .then(function (data) {\r\n vm.jobTemplates = data;\r\n if (vm.jobTemplates.length > 0) {\r\n vm.selectedTemplate = vm.jobTemplates[0].Id;\r\n }\r\n });\r\n }\r\n\r\n function getJobTypes() {\r\n complianceData.getJobTypes()\r\n .then(function (data) {\r\n vm.jobTypes = data;\r\n if (vm.jobTypes && vm.jobTypes.length > 0) {\r\n vm.newJob.jobType = vm.jobTypes[0].JobType;\r\n jobTypeChanged();\r\n }\r\n });\r\n }\r\n\r\n function inputColumnChanged() {\r\n validateInputColumns();\r\n }\r\n\r\n function validateInputColumns() {\r\n let numberOfValidationErrors = 0;\r\n let columnNameCount = {};\r\n _.forEach(vm.newJob.inputDataTypes, function (inputDataType) {\r\n _.forEach(vm.newJob.inputColumns[inputDataType], function (value) {\r\n value.error = null;\r\n if (!value.name) {\r\n numberOfValidationErrors++;\r\n value.error = {\r\n message: 'columnNameCannotBeEmpty'\r\n };\r\n }\r\n else if (!value.name.match(/^[a-zA-z]+$/)) {\r\n numberOfValidationErrors++;\r\n value.error = {\r\n message: 'invalidColumnName'\r\n };\r\n }\r\n else {\r\n value.name = value.name.toUpperCase().replace(/[^A-Z]/g, '');\r\n if (columnNameCount[value.name] === undefined) {\r\n columnNameCount[value.name] = 1;\r\n }\r\n else {\r\n columnNameCount[value.name]++;\r\n }\r\n }\r\n });\r\n });\r\n const duplicateColumnNames = _.chain(columnNameCount)\r\n .pickBy(count => count > 1)\r\n .keys()\r\n .value();\r\n\r\n _.forEach(vm.newJob.inputDataTypes, function (inputDataType) {\r\n _.forEach(vm.newJob.inputColumns[inputDataType], function (value) {\r\n if (duplicateColumnNames.indexOf(value.name) !== -1) {\r\n numberOfValidationErrors++;\r\n value.error = {\r\n message: 'duplicateColumnName'\r\n };\r\n }\r\n });\r\n });\r\n return numberOfValidationErrors;\r\n }\r\n\r\n function jobTypeChanged() {\r\n vm.selectedJobType = vm.jobTypes.find(jt => jt.JobType === vm.newJob.jobType);\r\n\r\n vm.newJob.inputDataTypes = _.chain(vm.selectedJobType.InputColumns)\r\n .map(c => c.Id)\r\n .uniq()\r\n .value();\r\n vm.newJob.inputColumns = _.chain(vm.selectedJobType.InputColumns)\r\n .keyBy(c => c.Id)\r\n .mapValues(c => c.DefaultColumnIndices\r\n .map(i => ({ \r\n label: c.Description,\r\n name: columnIndexToExcel(i)\r\n }))\r\n )\r\n .value();\r\n }\r\n\r\n function validate(fromTemplate) {\r\n vm.errors = [];\r\n if (!vm.newJob.file) {\r\n vm.errors.push(vm.translations['compliance.errors.select_file_to_check']);\r\n }\r\n\r\n if (!fromTemplate) {\r\n \r\n if (!vm.newJob.startRow.value) {\r\n vm.errors.push(vm.translations['compliance.errors.specify_starting_row']);\r\n }\r\n else if (!('' + vm.newJob.startRow.value).match(/^[1-9][0-9]*$/)) {\r\n vm.errors.push(vm.translations['compliance.errors.invalid_starting_row']);\r\n }\r\n \r\n if (!vm.newJob.jobType) {\r\n vm.errors.push(vm.translations['compliance.errors.specify_jobtype']);\r\n }\r\n }\r\n\r\n var numberOfErrors = vm.errors.length + validateInputColumns();\r\n\r\n\r\n return numberOfErrors === 0;\r\n }\r\n\r\n function saveJob() {\r\n var usingTemplate = vm.selectedTemplate !== null;\r\n if (!validate(usingTemplate)) {\r\n return;\r\n }\r\n\r\n vm.isUploading = true;\r\n\r\n if (vm.selectedTemplate) {\r\n complianceData.createJobFromTemplate(vm.selectedTemplate)\r\n .then(function (jobResult) {\r\n fileUpload.upload({\r\n data: { file: vm.newJob.file },\r\n headers: { 'Authorization': 'Bearer ' + common.identity.token.tokenValue },\r\n url: common.config.apiHosts.generic + '/compliance/job/' + jobResult.Id + '/document?template=' + vm.selectedTemplate\r\n })\r\n .then(function (fileResult) {\r\n // At last, finalize the job\r\n complianceData.finalizeJob(jobResult.Id)\r\n .then(function (finalizeResult) {\r\n common.$location.url('/compliance-check');\r\n });\r\n });\r\n });\r\n }\r\n else {\r\n\r\n var job = {\r\n jobType: vm.newJob.jobType,\r\n language: languageService.get(),\r\n movement: vm.newJob.movement,\r\n outputType: parseInt(vm.newJob.outputType),\r\n referenceCountry: state.filter.referenceCountry\r\n };\r\n\r\n // First create the job\r\n complianceData.createJob(job)\r\n .then(function (jobResult) {\r\n\r\n var urlArgs = [\r\n 'docType=Excel',\r\n 'startingLine=' + (vm.newJob.startRow.value - 1),\r\n 'inputColumns=' + vm.newJob.inputDataTypes\r\n .map(id => id + '|' + vm.newJob.inputColumns[id]\r\n .map(c => excelColumnToIndex(c.name))\r\n .join(',')\r\n ).join(';') \r\n ];\r\n //Then upload the file\r\n fileUpload.upload({\r\n data: { \r\n file: vm.newJob.file\r\n },\r\n headers: { 'Authorization': 'Bearer ' + common.identity.token.tokenValue },\r\n url: common.config.apiHosts.generic + '/compliance/job/' + jobResult.Id + '/document?' + urlArgs.join('&')\r\n })\r\n .then(function (fileResult) {\r\n // At last, finalize the job\r\n complianceData.finalizeJob(jobResult.Id)\r\n .then(function (finalizeResult) {\r\n common.$location.url('/compliance-check');\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n // Converts Excel column name to zero-based index\r\n function excelColumnToIndex(columnName) {\r\n columnName = columnName.toUpperCase();\r\n let sum = 0;\r\n for (let i = 0; i < columnName.length; i++)\r\n {\r\n sum *= 26;\r\n sum += (columnName[i].charCodeAt() - 'A'.charCodeAt() + 1);\r\n }\r\n return sum - 1;\r\n }\r\n\r\n // Converts zero-based index to Excel column name\r\n function columnIndexToExcel(index) {\r\n let columnName = String.fromCharCode(65 + (index % 26));\r\n if (index >= 26) {\r\n columnName = String.fromCharCode(64 + index / 26) + columnName;\r\n }\r\n return columnName;\r\n }\r\n\r\n return vm;\r\n\r\n}\r\n","module.exports = {\r\n controller: complianceOverviewController,\r\n templateUrl: 'compliance/components/compliance-overview-page.html'\r\n};\r\n\r\ncomplianceOverviewController.$inject = [\r\n '$analytics', \r\n '$location', \r\n '$timeout', \r\n '$translate', \r\n 'common', \r\n 'complianceDataService', \r\n 'complianceModalsService', \r\n 'notificationsService', \r\n 'widgetModals'\r\n];\r\n\r\nfunction complianceOverviewController(\r\n $analytics, \r\n $location, \r\n $timeout, \r\n $translate, \r\n common, \r\n complianceData, \r\n complianceModalsService, \r\n notifications,\r\n widgetModals\r\n) {\r\n\r\n var loadJobStatusTimeOut;\r\n var loadJobStatusTimeOutHasBeenCancelled;\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n cancelJob: cancelJob,\r\n downloadFile: downloadFile,\r\n jobs: [],\r\n loading: false,\r\n query: {\r\n PageNumber: 0\r\n },\r\n loadJobs: loadJobs,\r\n newJob: newJob,\r\n pageChanged: pageChanged,\r\n showDetails: showDetails,\r\n showErrors: showErrors,\r\n showWarnings: showWarnings,\r\n translations: null\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/abc-overview');\r\n common.auth.check();\r\n\r\n if (common.identity.hasPermission('bestandscontrole')) {\r\n loadJobs(1);\r\n }\r\n\r\n $translate(['compliance.status.cancel_task_areyousure']).then(function (result) {\r\n vm.translations = result;\r\n });\r\n\r\n loadJobStatusTimeOutHasBeenCancelled = false;\r\n }\r\n\r\n function detached() {\r\n loadJobStatusTimeOutHasBeenCancelled = true;\r\n $timeout.cancel(loadJobStatusTimeOut);\r\n }\r\n\r\n function pageChanged() {\r\n notifications.publish('abc_page_changed');\r\n $timeout.cancel(loadJobStatusTimeOut);\r\n loadJobs(vm.query.PageNumber);\r\n }\r\n\r\n function cancelJob(jobId) {\r\n var modalRef = widgetModals.areYouSure.show(vm.translations['compliance.status.cancel_task_areyousure']);\r\n\r\n modalRef.result\r\n .then(function (modalResult) {\r\n if (modalResult === true) {\r\n complianceData.cancelJob(jobId)\r\n .then(function (result) {\r\n loadJobs(1);\r\n });\r\n }\r\n })\r\n .catch(function (error) {\r\n if (error === true) {\r\n // this is a false positive. Don't know why but it's built in like this at the moment\r\n complianceData.cancelJob(jobId)\r\n .then(function (result) {\r\n loadJobs(1);\r\n });\r\n }\r\n });\r\n }\r\n\r\n function downloadFile(jobId) {\r\n window.open(common.config.apiHosts['generic'] + '/compliance/job/' + jobId + '/download?token=' + encodeURIComponent(common.identity.token.tokenValue));\r\n }\r\n\r\n function loadJobs(pageNumber) {\r\n if (vm.loading)\r\n return;\r\n\r\n vm.loading = true;\r\n complianceData.loadJobs(pageNumber)\r\n .then(function (result) {\r\n if (!loadJobStatusTimeOutHasBeenCancelled) {\r\n loadJobStatusTimeOut = $timeout(function() {\r\n loadJobs(pageNumber);\r\n }, 10000);\r\n }\r\n vm.jobs = result\r\n vm.loading = false;\r\n });\r\n }\r\n\r\n function newJob() {\r\n\r\n $location.url('/compliance-check/new');\r\n }\r\n\r\n function showDetails(jobId) {\r\n $location.url('/compliance-check/' + jobId);\r\n }\r\n\r\n function showErrors(jobId) {\r\n complianceModalsService.complianceInfo.show(jobId).result\r\n .then(function (result) { }, function (error) { });\r\n }\r\n\r\n function showWarnings(jobId) {\r\n complianceModalsService.complianceInfo.show(jobId).result\r\n .then(function (result) { }, function (error) { });\r\n }\r\n\r\n return vm;\r\n\r\n}","module.exports = ['common', jobStatusDisplayFilter];\r\n\r\nfunction jobStatusDisplayFilter(common) {\r\n\r\n return function (input) {\r\n if (input === null || input === undefined)\r\n return null;\r\n\r\n var currentLanguage = common.language.get();\r\n\r\n if (currentLanguage && currentLanguage === 'nl')\r\n return dutchResult(input);\r\n return englishResult(input);\r\n };\r\n\r\n function dutchResult(input) {\r\n switch (input) {\r\n case 1:\r\n return 'Initialiseren';\r\n case 2:\r\n return 'Aangemaakt';\r\n case 3:\r\n return 'Klaar voor verwerking';\r\n case 4:\r\n return 'Wordt verwerkt';\r\n case 5:\r\n return 'Voltooid';\r\n case 6:\r\n return 'Geannuleerd';\r\n case 7:\r\n return 'Klaar voor uitvoer';\r\n case 8:\r\n return 'Klaar voor verwerking';\r\n case 255:\r\n return 'Fout';\r\n default:\r\n return input;\r\n }\r\n }\r\n\r\n function englishResult(input) {\r\n switch (input) {\r\n case 1:\r\n return 'Initializing';\r\n case 2:\r\n return 'Created';\r\n case 3:\r\n return 'Ready to be processed';\r\n case 4:\r\n return 'Being processed';\r\n case 5:\r\n return 'Completed';\r\n case 6:\r\n return 'Cancelled';\r\n case 7:\r\n return 'Ready for export';\r\n case 8:\r\n return 'Ready to be proecessed';\r\n case 255:\r\n return 'Error';\r\n default:\r\n return input;\r\n }\r\n }\r\n}\r\n","module.exports = ['$uibModal', 'complianceDataService', complianceInfoModal];\r\n\r\nfunction complianceInfoModal($uibModal, complianceData) {\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n complianceInfoModal.$inject = ['$uibModalInstance', 'jobId'];\r\n\r\n function complianceInfoModalController($uibModalInstance, jobId) {\r\n\r\n var ctrlComplianceInfoModal = {\r\n cancel: cancel,\r\n isLoading: false,\r\n jobId: jobId,\r\n warnings: []\r\n };\r\n\r\n function cancel() {\r\n // $(\".page-dashboard, .taric-page-content\").removeClass(\"noprint\");\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function loadInfo() {\r\n ctrlComplianceInfoModal.isLoading = true;\r\n complianceData.getJobLogs(ctrlComplianceInfoModal.jobId)\r\n .then(function (result) {\r\n ctrlComplianceInfoModal.warnings = _.map(_.filter(result, function (f) { return f.MessageCode !== 'code_found'; }), function (item) {\r\n switch (item.LogType) {\r\n case 0:\r\n item.CssClass = '';\r\n item.LogTypeDisplay = 'Not set';\r\n break;\r\n case 1:\r\n item.CssClass = 'danger';\r\n item.LogTypeDisplay = 'System error';\r\n break;\r\n case 2:\r\n item.CssClass = 'info';\r\n item.LogTypeDisplay = 'Info';\r\n break;\r\n case 3:\r\n item.CssClass = 'warning';\r\n item.LogTypeDisplay = 'Warning';\r\n break;\r\n case 4:\r\n item.CssClass = 'danger';\r\n item.LogTypeDisplay = 'Content error';\r\n break;\r\n case 5:\r\n item.CssClass = 'danger';\r\n item.LogTypeDisplay = 'User error';\r\n break;\r\n }\r\n\r\n return item;\r\n });\r\n ctrlComplianceInfoModal.isLoading = false;\r\n });\r\n }\r\n\r\n loadInfo();\r\n\r\n return ctrlComplianceInfoModal;\r\n }\r\n\r\n function showModal(jobId) {\r\n\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n controller: complianceInfoModalController,\r\n controllerAs: 'ctrlComplianceInfoModal',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n jobId: function () {\r\n return jobId;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'compliance/modals/compliance-info.html',\r\n windowClass: 'modal-wide'\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['complianceInfoModal', complianceModalsService];\r\n\r\nfunction complianceModalsService(complianceInfoModal) {\r\n\r\n var service = {\r\n complianceInfo: complianceInfoModal\r\n };\r\n\r\n return service;\r\n\r\n}\r\n","module.exports = ['common', 'dataContext', 'applicationStateService', complianceDataService];\r\n\r\nfunction complianceDataService(common, dataContext, state) {\r\n\r\n var service = {\r\n result: {},\r\n cancelJob: cancelJob,\r\n createJob: createJob,\r\n createJobFromTemplate: createJobFromTemplate,\r\n finalizeJob: finalizeJob,\r\n getJobDetails: getJobDetails,\r\n getJobErrors: getJobErrors,\r\n getJobLogs: getJobLogs,\r\n getJobTemplates: getJobTemplates,\r\n getJobTypes: getJobTypes,\r\n getJobWarnings: getJobWarnings,\r\n loadJobs: loadJobs\r\n };\r\n\r\n function cancelJob(jobId) {\r\n var deferred = common.$q.defer();\r\n\r\n var url = common.config.apiHosts.generic + '/compliance/job/' + jobId + '/cancel';\r\n\r\n dataContext.post(url, {})\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function createJob(job) {\r\n var deferred = common.$q.defer();\r\n\r\n var url = common.config.apiHosts.generic + '/compliance/job';\r\n\r\n dataContext.post(url, job)\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function createJobFromTemplate(templateId) {\r\n var deferred = common.$q.defer();\r\n\r\n var url = common.config.apiHosts.generic + '/compliance/job?template=' + templateId;\r\n\r\n dataContext.post(url, {})\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function finalizeJob(jobId) {\r\n var deferred = common.$q.defer();\r\n\r\n var url = common.config.apiHosts.generic + '/compliance/job/' + jobId + '/finalize';\r\n\r\n dataContext.post(url, {})\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function getJobDetails(jobId, pageIndex, pageSize) {\r\n var deferred = common.$q.defer();\r\n var url = common.config.apiHosts.generic + '/compliance/job/' + jobId + '/details?pindex=' + pageIndex + '&psize=' + pageSize;\r\n\r\n dataContext.get(url)\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function getJobErrors(jobId) {\r\n var deferred = common.$q.defer();\r\n\r\n var url = common.config.apiHosts.generic + '/compliance/job/' + jobId + '/error';\r\n\r\n dataContext.get(url)\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function getJobLogs(jobId) {\r\n var deferred = common.$q.defer();\r\n\r\n var url = common.config.apiHosts.generic + '/compliance/job/' + jobId + '/log';\r\n\r\n dataContext.get(url)\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function getJobTemplates() {\r\n var deferred = common.$q.defer();\r\n\r\n var url = common.config.apiHosts.generic + '/compliance/template';\r\n\r\n dataContext.get(url)\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function getJobTypes() {\r\n var deferred = common.$q.defer();\r\n\r\n var url = common.config.apiHosts.generic + '/compliance/jobtypes?referencecountry=' + state.filter.referenceCountry;\r\n\r\n dataContext.get(url)\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function getJobWarnings(jobId) {\r\n var deferred = common.$q.defer();\r\n\r\n var url = common.config.apiHosts.generic + '/compliance/job/' + jobId + '/warning';\r\n\r\n dataContext.get(url)\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function loadJobs(pageNumber) {\r\n var deferred = common.$q.defer();\r\n var pageIndex = pageNumber - 1;\r\n var url = common.config.apiHosts.generic + '/compliance/job/status?psize=20&pindex=' + pageIndex;\r\n\r\n dataContext.get(url)\r\n .then(function (result) {\r\n service.result = result;\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n return service;\r\n}\r\n","angular.module('taric')\r\n .config(['$routeProvider', routeConfigurator])\r\n .config(['$translateProvider', translationConfigurator])\r\n .value('config', {\r\n apiHosts: {\r\n auth: '/auth',\r\n generic: '/genericapi',\r\n dtv: '/dtvapi',\r\n },\r\n applicationKey: '69BA425103444812BBF83C276C5ABC74',\r\n applicationSecret: '9B9A1B5B786546D58F05697B053DB5FA',\r\n currentApi: 'dtv',\r\n version: 2.4\r\n })\r\n .run(['$location', '$rootScope', 'config', 'identity', authenticateRoutes]);\r\n\r\nfunction locationConfigurator($locationProvider) {\r\n //$locationProvider.html5Mode(true).hashprefix('');\r\n}\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/test', {\r\n templateUrl: 'widgets/test.html'\r\n })\r\n .otherwise({\r\n redirectTo: '/sections'\r\n });\r\n}\r\n\r\nfunction toastConfig(toastrConfig) {\r\n _.extend(toastrConfig, {\r\n positionClass: 'toast-bottom-right',\r\n timeOut: 2500\r\n });\r\n}\r\n\r\nfunction translationConfigurator($translateProvider) {\r\n var defaultLanguage = 'en';\r\n var translations_en = require('./translations/en/_index');\r\n var translations_it = require('./translations/it/_index');\r\n var translations_nl = require('./translations/nl/_index');\r\n\r\n $translateProvider\r\n .translations('en', translations_en)\r\n .translations('it', translations_it)\r\n .translations('nl', translations_nl)\r\n .preferredLanguage(defaultLanguage)\r\n .fallbackLanguage(defaultLanguage)\r\n .useSanitizeValueStrategy(null);\r\n}\r\n\r\nfunction authenticateRoutes($location, $rootScope, config, identity) {\r\n $rootScope.$on(\"$locationChangeStart\", function (event, next, current) {\r\n if (identity.isAuthenticated)\r\n return;\r\n\r\n var unauthenticatedRoutes = [\r\n '/account/login',\r\n '/account/forgot-password',\r\n '/account/request-password',\r\n '/account/reset-password',\r\n ];\r\n\r\n var locationToCheck = $location.path();\r\n\r\n if (unauthenticatedRoutes.indexOf(locationToCheck) > -1)\r\n return;\r\n\r\n var path = $location.path();\r\n if (path === '/account/logout' || path === '/' || path === '') {\r\n $location.url('/account/login');\r\n }\r\n else {\r\n $location.url('/account/login?redirect=' + $location.path());\r\n }\r\n event.preventDefault();\r\n });\r\n}\r\n","angular.module('taric.core', [])\r\n // controllers\r\n .controller('preloaderController', require('./controllers/preloader'))\r\n // directives\r\n .directive('convertToNumber', require('./directives/convert-to-number'))\r\n .directive('hasPermission', require('./directives/has-permission'))\r\n .directive('ngEnter', require('./directives/ng-enter'))\r\n .directive('repeatDelimiter', require('./directives/repeat-delimiter'))\r\n .directive('scrollToTopWhen', require('./directives/scroll-to-top-when'))\r\n // filters\r\n // services.common\r\n .factory('common', require('./services.common/common'))\r\n .factory('authCheckService', require('./services.common/auth-check'))\r\n .factory('formatting', require('./services.common/formatting'))\r\n .factory('identity', require('./services.common/identity'))\r\n .factory('interactionService', require('./services.common/interaction'))\r\n .factory('language', require('./services.common/language'))\r\n .factory('notificationsService', require('./services.common/notifications'))\r\n .factory('preloaderService', require('./services.common/preloader'))\r\n .factory('versionHistoryService', require('./services.common/version-history'))\r\n // services.data\r\n .factory('dataContext', require('./services.data/data-context'))\r\n .factory('preferenceService', require('./services.data/preferences'))\r\n .factory('serializationService', require('./services.data/serialization'))\r\n .factory('applicationStateService', require('./services.state/application-state'))\r\n \r\n // error handling\r\n .factory('errorHandlingService', require('./services.common/error-handling'))\r\n .config(['$httpProvider', function($httpProvider) {\r\n $httpProvider.interceptors.push('errorHandlingService');\r\n }])\r\n;\r\n","module.exports = ['identity', 'preloaderService', preloaderCtrl];\r\n\r\nfunction preloaderCtrl(identityService, preloaderService) {\r\n\r\n var vm = {\r\n identity: identityService,\r\n status: preloaderService.status\r\n };\r\n\r\n preloaderService.init();\r\n\r\n return vm;\r\n}","module.exports = [convertToNumberDirective];\r\n\r\nfunction convertToNumberDirective() {\r\n return {\r\n require: 'ngModel',\r\n link: function (scope, element, attrs, ngModel) {\r\n ngModel.$parsers.push(function (val) {\r\n if (!val) {\r\n return val;\r\n }\r\n val = replaceCommaByDot(val);\r\n if (!isNumericOrNumber(val)) {\r\n return null;\r\n }\r\n var result = parseFloat(val, 10);\r\n // console.log(val, result);\r\n // ngModel.$setViewValue(result);\r\n // ngModel.$render();\r\n return result;\r\n });\r\n ngModel.$formatters.push(function (val) {\r\n if (!val) {\r\n return val;\r\n }\r\n return replaceDotByComma('' + val);\r\n });\r\n }\r\n };\r\n}\r\n\r\nfunction replaceCommaByDot(str) {\r\n if (!str) {\r\n return str;\r\n }\r\n if (typeof str !== \"string\") {\r\n return str;\r\n }\r\n return str.replace(/,/g, '.');\r\n}\r\n\r\nfunction removeDot(str) {\r\n if (!str) {\r\n return str;\r\n }\r\n if (typeof str !== \"string\") {\r\n return str;\r\n }\r\n return str.replace(/\\./g, '');\r\n}\r\n\r\nfunction replaceDotByComma(str) {\r\n if (!str) {\r\n return str;\r\n }\r\n if (typeof str !== \"string\") {\r\n return str;\r\n }\r\n return str.replace(/\\./g, ',');\r\n}\r\n\r\nfunction isNumericOrNumber(input) {\r\n return _.isNumber(input) || isNumeric(input);\r\n}\r\n\r\nfunction isNumeric(str) {\r\n if (typeof str != \"string\") {\r\n return false; \r\n }\r\n return !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...\r\n !isNaN(parseFloat(str)); // ...and ensure strings of whitespace fail\r\n}\r\n","var jsep = require('jsep');\r\n\r\nmodule.exports = ['common', 'ngIfDirective', hasPermissionDirective];\r\n\r\nfunction hasPermissionDirective(common, ngIfDirective) {\r\n var ngIf = ngIfDirective[0];\r\n\r\n return {\r\n transclude: ngIf.transclude,\r\n priority: ngIf.priority - 1,\r\n terminal: ngIf.terminal,\r\n restrict: ngIf.restrict,\r\n link: function(scope, element, attributes) {\r\n // find the initial ng-if attribute\r\n var initialNgIf = attributes.ngIf, ifEvaluator;\r\n // if it exists, evaluates ngIf && ifAuthenticated\r\n if (initialNgIf) {\r\n ifEvaluator = function () {\r\n return scope.$eval(initialNgIf) && shouldShowElement(attributes.hasPermission);\r\n }\r\n } else { // if there's no ng-if, process normally\r\n ifEvaluator = function () {\r\n return shouldShowElement(attributes.hasPermission);\r\n }\r\n }\r\n attributes.ngIf = ifEvaluator;\r\n ngIf.link.apply(ngIf, arguments);\r\n }\r\n };\r\n\r\n\r\n // return {\r\n // link: function (scope, element, attrs) {\r\n // var show = false;\r\n // if (attrs && attrs.hasPermission) {\r\n // // JSEP interprets a hyphen - as an operator, so we replace it by the string 'HYPHEN'\r\n // var expression = attrs.hasPermission.replace(/-/g, 'HYPHEN');\r\n // show = evaluatePermissionExpressionTree(jsep(expression));\r\n // }\r\n\r\n // element.removeClass('ng-hide');\r\n // if (!show)\r\n // element.addClass('ng-hide');\r\n // }\r\n // };\r\n\r\n function shouldShowElement(hasPermission) {\r\n var expression = hasPermission.replace(/-/g, 'HYPHEN');\r\n return evaluatePermissionExpressionTree(jsep(expression));\r\n }\r\n\r\n function evaluatePermissionExpressionTree(tree) {\r\n if (tree.type === 'Literal') {\r\n return tree.value;\r\n }\r\n if (tree.type == 'BinaryExpression') {\r\n if (tree.operator === '&&') {\r\n return evaluatePermissionExpressionTree(tree['left']) && evaluatePermissionExpressionTree(tree['right']);\r\n }\r\n else if (tree.operator === '||') {\r\n return evaluatePermissionExpressionTree(tree['left']) || evaluatePermissionExpressionTree(tree['right']);\r\n }\r\n }\r\n if (tree.type === 'UnaryExpression') {\r\n if (tree.operator === '!') {\r\n return !evaluatePermissionExpressionTree(tree.argument);\r\n }\r\n }\r\n if (tree.type === 'Identifier') {\r\n return common.identity.hasPermission(tree.name) || common.identity.hasPermission(tree.name.replace(/HYPHEN/g, '-'));\r\n }\r\n // Unexpected node parsed (TODO: send error to Sentry)\r\n return false;\r\n }\r\n\r\n}\r\n","module.exports = [ngEnterDirective];\r\n\r\nfunction ngEnterDirective() {\r\n return function (scope, element, attrs) {\r\n element.bind(\"keydown keypress\", function (event) {\r\n if(event.which === 13) {\r\n scope.$apply(function (){\r\n scope.$eval(attrs.ngEnter);\r\n });\r\n\r\n event.preventDefault();\r\n }\r\n });\r\n };\r\n}","module.exports = [repeatDelimiterDirective];\r\n\r\nfunction repeatDelimiterDirective() {\r\n // I compile the list, injecting in the conditionally\r\n // visible delimiter onto the end of the template.\r\n function compile(element, attributes) {\r\n\r\n // Get the delimiter that goes between each item.\r\n var delimiter = (attributes.repeatDelimiter || \", \");\r\n\r\n // The delimiter will show on all BUT the last\r\n // item in the list.\r\n var delimiterHtml = (\r\n \"\" +\r\n delimiter +\r\n \"\"\r\n );\r\n\r\n // Add the delimiter to the end of the list item,\r\n // making sure to add the existing whitespace back\r\n // in after the delimiter.\r\n var html = element.html().replace(\r\n /(\\s*$)/i,\r\n function (whitespace) {\r\n\r\n return (delimiterHtml + whitespace);\r\n\r\n }\r\n );\r\n\r\n // Update the compiled HTML.\r\n element.html(html);\r\n\r\n }\r\n\r\n\r\n // Return the directive configuration. Notice that\r\n // our priority is 1 higher than ngRepeat - this will\r\n // be compiled before the ngRepeat compiles.\r\n return ({\r\n compile: compile,\r\n priority: 1001,\r\n restrict: \"A\"\r\n });\r\n\r\n}","module.exports = ['$timeout', 'notificationsService', scrollToTopWhenDirective];\r\n\r\nfunction scrollToTopWhenDirective($timeout, notifications) {\r\n return function (scope, element, attrs) {\r\n var eventNames = attrs.scrollToTopWhen.split(/,\\s?/)\r\n _.forEach(eventNames, function (eventName) {\r\n notifications.subscribe(eventName, function() {\r\n $timeout(function () {\r\n element[0].scrollTop = 0;\r\n });\r\n });\r\n });\r\n };\r\n}","module.exports = ['config', 'dataContext', 'identity', 'widgetModals', authCheckService];\r\n\r\nfunction authCheckService(config, context, identity, widgetModals) {\r\n\r\n var service = {\r\n check: checkUserStatus\r\n };\r\n\r\n function checkUserStatus() {\r\n if (!identity.isAuthenticated) {\r\n return;\r\n }\r\n\r\n context.get(config.apiHosts.auth + '/auth/me')\r\n .then(function (result) {\r\n identity.updateCookie();\r\n try {\r\n Sentry.configureScope(function (scope) {\r\n scope.setUser({ \"email\": result.EmailAddress });\r\n });\r\n }\r\n catch (e) {}\r\n })\r\n .catch(function (error) {\r\n if (error && error.status === 401) {\r\n identity.set(null);\r\n var modalRef = widgetModals.loggingOut.show();\r\n window.setTimeout(function () {\r\n modalRef.dismiss();\r\n window.location.href = '/#!/account/logout';\r\n }, 5000);\r\n }\r\n else if (error && error.status === 403) {\r\n // console.log('403', error);\r\n }\r\n });\r\n }\r\n\r\n return service;\r\n\r\n}","// The common service exports all services that will be used a lot in different other services and controllers\r\nmodule.exports = [\r\n '$location', \r\n '$q', \r\n '$timeout', \r\n 'authCheckService', \r\n 'config', \r\n 'formatting', \r\n 'identity', \r\n 'interactionService', \r\n 'language', \r\n commonService\r\n];\r\n\r\nfunction commonService(\r\n $location, \r\n $q, \r\n $timeout, \r\n authCheckService, \r\n config, \r\n formatting, \r\n identity, \r\n interaction, \r\n language\r\n) {\r\n var service = {\r\n $location: $location,\r\n $q: $q,\r\n $timeout: $timeout,\r\n auth: authCheckService,\r\n config: config,\r\n formatting: formatting,\r\n identity: identity,\r\n interaction: interaction,\r\n language: language\r\n };\r\n\r\n return service;\r\n}\r\n","module.exports = [\r\n '$injector',\r\n '$location', \r\n '$q',\r\n 'applicationStateService',\r\n errorHandlingService\r\n];\r\n\r\nfunction errorHandlingService(\r\n $injector,\r\n $location,\r\n $q,\r\n state\r\n) {\r\n\r\n var service = {\r\n responseError: handleHttpResponseError\r\n };\r\n\r\n return service;\r\n\r\n function handleHttpResponseError(rejection) {\r\n var preferenceService = $injector.get('preferenceService');\r\n var identityService = $injector.get('identity');\r\n if (rejection.status === 403 && rejection.data === 'No access to trade tariff') {\r\n var allowedTradeTariffs = identityService.getAllowedTradeTariffs();\r\n \r\n var referenceCountry;\r\n if (_.includes(allowedTradeTariffs, 'EU')) {\r\n referenceCountry = 'EU'; \r\n }\r\n else {\r\n referenceCountry = allowedTradeTariffs[0];\r\n }\r\n state.filter.referenceCountry = referenceCountry;\r\n preferenceService.setReferenceCountry(referenceCountry).then(function () {\r\n $location.url('/landing');\r\n });\r\n return $q.resolve({ data: null });\r\n }\r\n else {\r\n return $q.reject(rejection);\r\n }\r\n }\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = [formatting];\r\n\r\nfunction formatting() {\r\n var service = {\r\n cleanGoodsCode: cleanGoodsCode,\r\n flattenArray: flattenArray,\r\n formatDate: formatDate,\r\n formatDateFromNow: formatDateFromNow,\r\n goodsCodeToGoodsnomId: goodsCodeToGoodsnomId,\r\n isChapterCode: isChapterCode,\r\n isCommodityCode: isCommodityCode,\r\n isHeadingCode: isHeadingCode,\r\n isNullOrEmpty: isNullOrEmpty,\r\n padLeft: padLeft,\r\n padRight: padRight,\r\n removeTrailingZeros: removeTrailingZeros,\r\n replaceAll: replaceAll,\r\n romanToNumber: romanToNumber,\r\n toChapterNumber: toChapterNumber\r\n };\r\n\r\n return service;\r\n\r\n function cleanGoodsCode(goodsCode) {\r\n if (!goodsCode) return null;\r\n return replaceAll(goodsCode, '[\\\\s.,]', '');\r\n }\r\n\r\n function flattenArray(item, elemName) {\r\n var output = [];\r\n\r\n if (item[elemName] !== null && item[elemName] !== undefined && item[elemName].length > 0) {\r\n for (var i = 0; i < item[elemName].length; i++) {\r\n output.push(item[elemName][i]);\r\n var subItems = flattenArray(item[elemName][i], elemName);\r\n output = output.concat(subItems);\r\n }\r\n }\r\n return output;\r\n }\r\n\r\n function formatDate(date) {\r\n return moment(date).format('DD-MM-YYYY HH:mm');\r\n }\r\n\r\n function formatDateFromNow(date, useAgo) {\r\n if (useAgo === undefined || useAgo === null)\r\n useAgo = false;\r\n return moment(date).fromNow(useAgo);\r\n }\r\n\r\n function goodsCodeToGoodsnomId(goodsCode) {\r\n if (!goodsCode) return null;\r\n return padRight(replaceAll(goodsCode, '[\\\\s.,]', ''), 10);\r\n }\r\n\r\n function isChapterCode(code) {\r\n if (!code) return false;\r\n var goodsnomid = goodsCodeToGoodsnomId(code);\r\n return /[0-9]{10}/.test(goodsnomid) && goodsnomid.substring(2) === '00000000';\r\n }\r\n\r\n function isHeadingCode(code) {\r\n if (!code) return false;\r\n var goodsnomid = goodsCodeToGoodsnomId(code);\r\n return /[0-9]{10}/.test(goodsnomid) && goodsnomid.substring(2) !== '00000000' && goodsnomid.substring(4) === '000000';\r\n }\r\n\r\n function isCommodityCode(code) {\r\n if (!code) return false;\r\n var goodsnomid = goodsCodeToGoodsnomId(code);\r\n return /[0-9]{10}/.test(goodsnomid);\r\n }\r\n\r\n function isNullOrEmpty(source) {\r\n return (source === undefined ||\r\n source === null ||\r\n source === '');\r\n }\r\n\r\n function padLeft(n, width, z) {\r\n if (!n) return null;\r\n z = z || '0';\r\n n = n + '';\r\n return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;\r\n }\r\n\r\n function padRight(n, width, z) {\r\n if (!n) return null;\r\n z = z || '0';\r\n n = n + '';\r\n return n.length >= width ? n : n + new Array(width - n.length + 1).join(z);\r\n }\r\n\r\n function removeTrailingZeros(goodsCode) {\r\n if (!goodsCode) return null;\r\n var result = goodsCode.replace(/0+$/, '');\r\n return result.length % 2 === 0 ? result : result + '0';\r\n }\r\n\r\n function replaceAll(str, search, replacement) {\r\n return str.replace(new RegExp(search, 'g'), replacement);\r\n }\r\n\r\n function romanToNumber(roman) {\r\n switch (roman.toString().toLowerCase()) {\r\n case 'i':\r\n return '01';\r\n case 'ii':\r\n return '02';\r\n case 'iii':\r\n return '03';\r\n case 'iv':\r\n return '04';\r\n case 'v':\r\n return '05';\r\n case 'vi':\r\n return '06';\r\n case 'vii':\r\n return '07';\r\n case 'viii':\r\n return '08';\r\n case 'ix':\r\n return '09';\r\n case 'x':\r\n return '10';\r\n case 'xi':\r\n return '11';\r\n case 'xii':\r\n return '12';\r\n case 'xiii':\r\n return '13';\r\n case 'xiv':\r\n return '14';\r\n case 'xv':\r\n return '15';\r\n case 'xvi':\r\n return '16';\r\n case 'xvii':\r\n return '17';\r\n case 'xviii':\r\n return '18';\r\n case 'xix':\r\n return '19';\r\n case 'xx':\r\n return '20';\r\n case 'xxi':\r\n return '21';\r\n default:\r\n return roman;\r\n }\r\n }\r\n\r\n function toChapterNumber(code) {\r\n if (!code) return null;\r\n if (code.substring(0, 1) === '0') {\r\n return code.substring(1, 2);\r\n }\r\n return code.substring(0, 2);\r\n }\r\n}\r\n","module.exports = ['$cookies', '$q', '$rootScope', identityService];\r\n\r\nfunction identityService($cookies, $q, $rootScope) {\r\n var service = {\r\n init: getFromCookie,\r\n getAllTradeTariffs: getAllTradeTariffs,\r\n getAllowedTradeTariffs: getAllowedTradeTariffs,\r\n getDisallowedTradeTariffs: getDisallowedTradeTariffs,\r\n hasPermission: hasPermission,\r\n isAuthenticated: false,\r\n permissions: [],\r\n rememberMe: false,\r\n set: set,\r\n token: {\r\n tokenValue: null,\r\n tokenExpiresOn: null,\r\n tokenIssuedOn: null\r\n },\r\n updateCookie: updateCookie,\r\n removeCookie: removeCookie,\r\n userInfo: null\r\n };\r\n\r\n function getFromCookie() {\r\n var deferred = $q.defer();\r\n var token = $cookies.getObject('authToken');\r\n if (token !== undefined && token !== null && token !== '') {\r\n service.isAuthenticated = true;\r\n service.token = token;\r\n deferred.resolve(true);\r\n }\r\n else {\r\n deferred.resolve(false);\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n function hasPermission(name) {\r\n if (!name)\r\n return false;\r\n name = name.toLowerCase();\r\n var invertResult = name.indexOf('!') === 0;\r\n if (invertResult) {\r\n name = name.substring(1);\r\n }\r\n\r\n if (name.indexOf(',') > -1) {\r\n var names = name.split(',');\r\n for (var i = 0; i < names.length; i++) {\r\n if (_.indexOf(service.permissions, names[i]) > -1) {\r\n return invertResult ? false : true;\r\n }\r\n }\r\n return invertResult ? true : false;\r\n }\r\n else {\r\n var hasPermission = _.indexOf(service.permissions, name) > -1;\r\n return invertResult ? !hasPermission : hasPermission;\r\n }\r\n }\r\n\r\n function getAllTradeTariffs() {\r\n var tradeTariffs = ['EU', 'DE', 'BE', 'NL', 'GB', 'CH', 'SE', 'IT'];\r\n return tradeTariffs;\r\n }\r\n\r\n function getDisallowedTradeTariffs() {\r\n return _.difference(getAllTradeTariffs(), getAllowedTradeTariffs());\r\n }\r\n\r\n function getAllowedTradeTariffs() {\r\n var allowedTradeTariffs = _.chain(service.permissions)\r\n .filter(function (permission) {\r\n return _.startsWith(permission, 'trade_tariff_');\r\n })\r\n .map(function (permission) {\r\n return permission.substring(13).toUpperCase();\r\n })\r\n .value();\r\n return _.intersection(getAllTradeTariffs(), allowedTradeTariffs);\r\n }\r\n\r\n function set(username, data, rememberMe) {\r\n var date = getExpiryDate(rememberMe);\r\n if (!data) {\r\n service.isAuthenticated = false;\r\n service.permissions = [];\r\n service.token.tokenValue = null;\r\n service.token.tokenExpiresOn = null;\r\n service.token.tokenIssuedOn = null;\r\n service.username = null;\r\n $rootScope.$emit('identity:clear');\r\n $cookies.remove('authToken');\r\n }\r\n else {\r\n service.rememberMe = rememberMe;\r\n service.isAuthenticated = true;\r\n service.token = {\r\n rememberMe: !!rememberMe,\r\n tokenValue: data.access_token,\r\n tokenExpiresOn: data['expires_on'],\r\n tokenIssuedOn: data['issued_on']\r\n };\r\n service.userInfo = data;\r\n $cookies.putObject('authToken', service.token, { 'expires': date });\r\n $rootScope.$emit('identity:set');\r\n }\r\n }\r\n\r\n function getExpiryDate(rememberMe) {\r\n var date = new Date();\r\n if (rememberMe) {\r\n // add two weeks to date\r\n date.setTime(date.getTime() + (14 * 24 * 60 * 60 * 1000));\r\n } else {\r\n // add 20 minutes to date\r\n date.setTime(date.getTime() + (20* 60 * 1000));\r\n }\r\n return date;\r\n }\r\n\r\n function updateCookie() {\r\n var cookie = $cookies.getObject('authToken');\r\n var date = getExpiryDate(cookie.rememberMe);\r\n $cookies.putObject('authToken', cookie, { 'expires': date });\r\n }\r\n\r\n function removeCookie() {\r\n $cookies.remove('authToken');\r\n }\r\n\r\n return service;\r\n}\r\n","module.exports = [interactionService];\r\n\r\nfunction interactionService() {\r\n\r\n var service = {\r\n clearSelection: clearSelection,\r\n copyTextToClipboard: copyTextToClipboard\r\n };\r\n\r\n return service;\r\n\r\n function clearSelection() {\r\n if(document.selection && document.selection.empty) {\r\n document.selection.empty();\r\n } else if(window.getSelection) {\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n }\r\n }\r\n}\r\n\r\nfunction copyTextToClipboard(text) {\r\n if (!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text);\r\n return;\r\n }\r\n navigator.clipboard.writeText(text).then(function () {\r\n //console.log('Async: Copying to clipboard was successful!');\r\n }, function (err) {\r\n //console.error('Async: Could not copy text: ', err);\r\n });\r\n}\r\n\r\nfunction fallbackCopyTextToClipboard(text) {\r\n var textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n\r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"0\";\r\n textArea.style.left = \"0\";\r\n textArea.style.position = \"fixed\";\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n var successful = document.execCommand('copy');\r\n var msg = successful ? 'successful' : 'unsuccessful';\r\n //console.log('Fallback: Copying text command was ' + msg);\r\n } catch (err) {\r\n //console.error('Fallback: Oops, unable to copy', err);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}","module.exports = ['$locale', 'notificationsService', '$translate', 'tmhDynamicLocale', languageService];\r\n\r\nfunction languageService($locale, notifications, $translate, dynamicLocale) {\r\n var service = {\r\n $locale: $locale,\r\n $translate: $translate,\r\n currentLanguage: null,\r\n get: getLanguage,\r\n set: setLanguage,\r\n setSupportedLanguages: setSupportedLanguages,\r\n supportedLanguages: [\r\n \"cs\",\r\n \"da\",\r\n \"de\",\r\n \"et\",\r\n \"en\",\r\n \"es\",\r\n \"fr\",\r\n \"hr\",\r\n \"it\",\r\n \"lv\",\r\n \"lt\",\r\n \"hu\",\r\n \"nl\",\r\n \"pl\",\r\n \"pt\",\r\n \"ro\",\r\n \"sk\",\r\n \"sl\",\r\n \"fi\",\r\n \"sv\",\r\n \"el\",\r\n \"bg\"\r\n ],\r\n supportedLanguagesWithDescription: [\r\n {\r\n \"Id\": \"cs\",\r\n \"Description\": \"Ceština\"\r\n },\r\n {\r\n \"Id\": \"da\",\r\n \"Description\": \"Dansk\"\r\n },\r\n {\r\n \"Id\": \"de\",\r\n \"Description\": \"Deutsch\"\r\n },\r\n {\r\n \"Id\": \"et\",\r\n \"Description\": \"Eesti keel\"\r\n },\r\n {\r\n \"Id\": \"en\",\r\n \"Description\": \"English\"\r\n },\r\n {\r\n \"Id\": \"es\",\r\n \"Description\": \"Español\"\r\n },\r\n {\r\n \"Id\": \"fr\",\r\n \"Description\": \"Français\"\r\n },\r\n {\r\n \"Id\": \"hr\",\r\n \"Description\": \"Hrvatski\"\r\n },\r\n {\r\n \"Id\": \"it\",\r\n \"Description\": \"Italiano\"\r\n },\r\n {\r\n \"Id\": \"lv\",\r\n \"Description\": \"Latviešu valoda\"\r\n },\r\n {\r\n \"Id\": \"lt\",\r\n \"Description\": \"Lietuviu kalba\"\r\n },\r\n {\r\n \"Id\": \"hu\",\r\n \"Description\": \"Magyar\"\r\n },\r\n {\r\n \"Id\": \"nl\",\r\n \"Description\": \"Nederlands\"\r\n },\r\n {\r\n \"Id\": \"pl\",\r\n \"Description\": \"Polski\"\r\n },\r\n {\r\n \"Id\": \"pt\",\r\n \"Description\": \"Português\"\r\n },\r\n {\r\n \"Id\": \"ro\",\r\n \"Description\": \"Româna\"\r\n },\r\n {\r\n \"Id\": \"sk\",\r\n \"Description\": \"Slovenčina\"\r\n },\r\n {\r\n \"Id\": \"sl\",\r\n \"Description\": \"Slovenščina\"\r\n },\r\n {\r\n \"Id\": \"fi\",\r\n \"Description\": \"Suomi\"\r\n },\r\n {\r\n \"Id\": \"sv\",\r\n \"Description\": \"Svenska\"\r\n },\r\n {\r\n \"Id\": \"el\",\r\n \"Description\": \"ελληνικά\"\r\n },\r\n {\r\n \"Id\": \"bg\",\r\n \"Description\": \"български\"\r\n }\r\n ],\r\n };\r\n\r\n function setSupportedLanguages(languagesWithDescription) {\r\n service.supportedLanguagesWithDescription = _.map(languagesWithDescription, function(lang) {\r\n lang.Id = lang.Id.toLowerCase();\r\n return lang;\r\n });\r\n service.supportedLanguages = _.map(service.supportedLanguagesWithDescription, function(lang) {\r\n return lang.Id;\r\n });\r\n }\r\n\r\n function getLanguage() {\r\n return $translate.use();\r\n }\r\n\r\n function setLanguage(language) {\r\n language = language.toLowerCase();\r\n if (!language)\r\n return;\r\n\r\n if (service.supportedLanguages.indexOf(language) > -1) {\r\n if(language === 'en') {\r\n dynamicLocale.set('en-nl');\r\n }\r\n else {\r\n dynamicLocale.set(language);\r\n }\r\n service.currentLanguage = language;\r\n $translate.use(language);\r\n\r\n notifications.publish('language_changed', language);\r\n }\r\n }\r\n\r\n return service;\r\n}","module.exports = [notificationsService];\r\n\r\nfunction notificationsService() {\r\n\r\n var service = {\r\n subscribe: subscribe,\r\n unsubscribe: unsubscribe,\r\n publish: publish\r\n };\r\n\r\n var cache = {};\r\n\r\n function subscribe(topic, callback) {\r\n if (!cache[topic]) {\r\n cache[topic] = [];\r\n }\r\n cache[topic].push(callback);\r\n return [topic, callback];\r\n }\r\n\r\n function unsubscribe(topic, callback) {\r\n var callbackCount;\r\n if (cache[topic]) {\r\n callbackCount = cache[topic].length;\r\n while (callbackCount--) {\r\n if (cache[topic][callbackCount] === callback) {\r\n cache[topic].splice(callbackCount, 1);\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function publish(topic) {\r\n var callbackCount, event, res;\r\n event = cache[topic];\r\n if (event && event.length > 0) {\r\n callbackCount = event.length;\r\n while (callbackCount--) {\r\n if (event[callbackCount]) {\r\n res = event[callbackCount].apply({}, Array.prototype.slice.call(arguments, 1));\r\n }\r\n }\r\n publish(topic + \"_done\");\r\n return res;\r\n }\r\n }\r\n\r\n return service;\r\n}","module.exports = ['$window', '$q', '$cookies', 'config', 'countryDataService', 'dataContext',\r\n 'identity', 'language', 'preferenceService', 'applicationStateService', 'favoritesService', preloaderService];\r\n\r\nfunction preloaderService($window, $q, $cookies, config, countryDataService, context, identityService, languageService, preferenceService, state, favoritesService) {\r\n var service = {\r\n init: init,\r\n run: runWhenAuthenticated,\r\n identity: identityService,\r\n status: {\r\n isDone: true\r\n }\r\n };\r\n\r\n function init() {\r\n return identityService\r\n .init()\r\n .then(function(isAuthenticated) {\r\n if (isAuthenticated) {\r\n return runWhenAuthenticated();\r\n }\r\n });\r\n }\r\n\r\n function loadPermissions() {\r\n return context\r\n .get(config.apiHosts.generic + '/me/permission')\r\n .then(function (data) {\r\n identityService.permissions = [];\r\n var hasPermissions = false;\r\n for (var prop in data) {\r\n hasPermissions = true;\r\n identityService.permissions = identityService.permissions.concat(data[prop]);\r\n }\r\n if (!hasPermissions) {\r\n $cookies.remove('authToken');\r\n $window.location.reload();\r\n }\r\n })\r\n .catch(function () {\r\n $cookies.remove('authToken');\r\n $window.location.reload();\r\n });\r\n }\r\n\r\n function runWhenAuthenticated() {\r\n service.status.isDone = false;\r\n return loadPermissions()\r\n .then(function() { return preferenceService.init(); })\r\n .then(function() { return configureServicesBasedOnPreferences(); })\r\n .then(function() { return countryDataService.init(); })\r\n .then(function() { return loadSearchCountryPref(); })\r\n .then(function() { return favoritesService.init(); })\r\n .then(function() {\r\n service.status.isDone = true;\r\n })\r\n ;\r\n }\r\n\r\n function loadSearchCountryPref() {\r\n var deferred = $q.defer();\r\n var searchCountryPref = preferenceService.get('searchCountry', 'search');\r\n if (searchCountryPref) {\r\n var countryCode = searchCountryPref.value.split(',')[0];\r\n var countryName = searchCountryPref.value.split(',')[1];\r\n var searchCountryIsValidForReferenceCountry = _.some(countryDataService.ergaOmnesCountries, function (countryData) {\r\n return countryData.code === countryCode;\r\n });\r\n if (searchCountryIsValidForReferenceCountry) {\r\n state.filter.countryCode = countryCode;\r\n state.filter.countryName = countryName;\r\n state.remember.country = true;\r\n }\r\n else {\r\n preferenceService.remove(searchCountryPref);\r\n }\r\n }\r\n deferred.resolve();\r\n return $q.promise;\r\n }\r\n\r\n function configureServicesBasedOnPreferences() {\r\n var deferred = $q.defer();\r\n if (preferenceService.get('uccModeEnabled', 'settings') !== null) {\r\n state.uccModeEnabled = preferenceService.get('uccModeEnabled', 'settings').value;\r\n }\r\n if (preferenceService.get('language', 'website') !== null) {\r\n if (languageService.set) {\r\n languageService.set(preferenceService.get('language', 'website').value, false);\r\n }\r\n }\r\n var referenceCountryPref = preferenceService.get('referenceCountry', 'search');\r\n if (referenceCountryPref) {\r\n state.filter.referenceCountry = referenceCountryPref.value;\r\n config.currentApi = 'dtv';\r\n }\r\n\r\n if (preferenceService.get('movement') === null) {\r\n preferenceService.add({\r\n name: 'movement',\r\n category: 'user_preferences',\r\n value: 'import',\r\n valueType: 'stringValue'\r\n });\r\n state.filter.movement = 'import';\r\n }\r\n else {\r\n state.filter.movement = preferenceService.get('movement').movement;\r\n }\r\n deferred.resolve();\r\n return $q.promise;\r\n }\r\n\r\n\r\n\r\n return service;\r\n}","module.exports = ['$http', versionHistoryService];\r\n\r\nfunction versionHistoryService($http) {\r\n\tvar service = {\r\n get: get\r\n\t};\r\n\r\n function get() {\r\n\t\treturn $http.get('/version-history.json');\r\n\t}\r\n\r\n\treturn service;\r\n}\r\n","module.exports = ['$http', '$q', 'config', 'identity', 'language', dataContextService];\r\n\r\nfunction dataContextService($http, $q, config, identity, language) {\r\n var service = {\r\n del: function (url) { return requestWithoutData('DELETE', url); },\r\n get: function (url, id, headers) { return requestWithoutData('GET', url, id, headers); },\r\n post: function (url, parameters) { return requestWithData('POST', url, parameters); },\r\n put: function (url, parameters) { return requestWithData('PUT', url, parameters); },\r\n xhr: function (url, parameters) { return requestXhrWithData('POST', url, parameters); },\r\n cancel: cancel,\r\n formEncode: formEncode,\r\n getHeaders: getHeaders,\r\n pendingRequests: {}\r\n };\r\n\r\n function cancel(requestId) {\r\n if (service.pendingRequests[requestId]) {\r\n // console.log('Canceling request ' + requestId + ' with url ' + service.pendingRequests[requestId].url);\r\n service.pendingRequests[requestId].execute();\r\n }\r\n }\r\n\r\n function formEncode(obj) {\r\n var encodedString = '';\r\n for (var key in obj) {\r\n if (encodedString.length !== 0) {\r\n encodedString += '&';\r\n }\r\n\r\n encodedString += key + '=' + encodeURIComponent(obj[key]);\r\n }\r\n return encodedString.replace(/%20/g, '+');\r\n }\r\n\r\n // NB: request id indicates the type of request, like 'CHAPTER' or 'GOOD', for example\r\n function requestWithoutData(method, url, requestId, headers) {\r\n var canceller = $q.defer();\r\n var deferred = $q.defer();\r\n url = processUrl(url);\r\n\r\n var requestMetadata = {\r\n execute: function() {\r\n canceller.resolve({ isAborted: true });\r\n },\r\n deferred: deferred,\r\n url: url,\r\n };\r\n\r\n if (requestId) {\r\n if (service.pendingRequests[requestId]) {\r\n if (url === service.pendingRequests[requestId].url) {\r\n return service.pendingRequests[requestId].deferred.promise;\r\n }\r\n cancel(requestId);\r\n }\r\n\r\n requestMetadata.requestId = requestId;\r\n service.pendingRequests[requestId] = requestMetadata;\r\n }\r\n\r\n $http({ method: method, url: url, headers: getHeaders(headers), timeout: canceller.promise })\r\n .then(\r\n function(data) { \r\n requestWithoutDataSuccessCallback(data, requestMetadata); }, \r\n function(data) { \r\n requestWithoutDataErrorCallback(data, requestMetadata); });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function requestWithoutDataSuccessCallback(data, requestMetadata) {\r\n requestMetadata.deferred.resolve(data.data);\r\n if (requestMetadata.requestId && service.pendingRequests[requestMetadata.requestId]) {\r\n delete service.pendingRequests[requestMetadata.requestId];\r\n }\r\n }\r\n \r\n function requestWithoutDataErrorCallback(error, requestMetadata) {\r\n if (error && error.config && error.config.timeout && error.config.timeout.$$state && error.config.timeout.$$state.value && error.config.timeout.$$state.value.isAborted) {\r\n error.isAborted = true;\r\n }\r\n else if (error && error.status <= 0) {\r\n error.isAborted = true;\r\n }\r\n else {\r\n try {\r\n Sentry.configureScope(function (scope) {\r\n scope.setTag(\"last-api-error-status\", error.status);\r\n scope.setTag(\"last-api-error-url\", error.config.url);\r\n });\r\n }\r\n catch (e) {}\r\n }\r\n requestMetadata.deferred.reject(error);\r\n if (requestMetadata.requestId && service.pendingRequests[requestMetadata.requestId]) {\r\n delete service.pendingRequests[requestMetadata.requestId];\r\n }\r\n }\r\n\r\n function requestWithData(method, url, parameters) {\r\n var deferred = $q.defer();\r\n var inputData = JSON.stringify(parameters);\r\n url = processUrl(url);\r\n\r\n var config = { method: method, url: url, headers: getHeaders(), data: inputData, dataType: 'json' };\r\n\r\n $http(config)\r\n .then(successCallback, errorCallback);\r\n\r\n function successCallback(data, status, headers, cfg) { deferred.resolve(data.data); }\r\n function errorCallback(error) {\r\n try {\r\n Sentry.configureScope(function (scope) {\r\n scope.setTag(\"last-api-error-status\", error.status);\r\n scope.setTag(\"last-api-error-url\", error.config.url);\r\n });\r\n }\r\n catch (e) {}\r\n deferred.reject(error);\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function requestXhrWithData(method, url, parameters) {\r\n var deferred = $q.defer();\r\n url = processUrl(url);\r\n\r\n var headers = getHeaders();\r\n headers[\"Content-Type\"] = undefined;\r\n\r\n var config = { method: method, url: url, headers: headers, data: parameters };\r\n config.transformRequest = _.identity;\r\n\r\n $http(config)\r\n .then(successCallback, errorCallback, progressCallback);\r\n\r\n function successCallback(data, status, headers, cfg) { deferred.resolve(data.data); }\r\n function errorCallback(error) {\r\n try {\r\n Sentry.configureScope(function (scope) {\r\n scope.setTag(\"last-api-error-status\", error.status);\r\n scope.setTag(\"last-api-error-url\", error.config.url);\r\n });\r\n }\r\n catch (e) {}\r\n deferred.reject(error);\r\n }\r\n function progressCallback(progress) { deferred.notify(progress); }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n // we have to include the Bearer token with each call to the Web API controllers.\r\n function getHeaders(headers) {\r\n if (!headers) {\r\n headers = {};\r\n }\r\n if (identity.token && identity.token.tokenValue) {\r\n headers[\"Authorization\"] = \"Bearer \" + identity.token.tokenValue;\r\n }\r\n return headers;\r\n }\r\n\r\n function processUrl(url) {\r\n if (url === null || url === '')\r\n return url;\r\n // if (url.toLowerCase().indexOf('http://') !== 0 && url.toLowerCase().indexOf('https://') !== 0)\r\n // url = config.apiHost + url;\r\n\r\n if (url.indexOf('?') === -1) {\r\n url += '?lang=' + language.get();\r\n }\r\n else {\r\n url += '&lang=' + language.get();\r\n }\r\n return url;\r\n }\r\n\r\n return service;\r\n\r\n}\r\n","module.exports = ['$q', '$window', '$cookies', 'config', 'dataContext', 'language', preferenceService];\r\n\r\nfunction preferenceService($q, $window, $cookies, config, dataContext, language) {\r\n\r\n var service = {\r\n preferences: [],\r\n add: addPreference,\r\n get: getPreference,\r\n getAny: getAnyPreference,\r\n getCategory: getPreferencesByCategory,\r\n init: reload,\r\n initialized: false,\r\n reload: reload,\r\n remove: removePreference,\r\n replace: replacePreference,\r\n update: updatePreference,\r\n \r\n saveCountryPreference: saveCountryPreference,\r\n clearCountryPreference: clearCountryPreference,\r\n setLanguage: setLanguage,\r\n setReferenceCountry: setReferenceCountry\r\n };\r\n\r\n function replacePreference(preference) {\r\n var existingPreference = getPreference(preference.name, preference.category);\r\n if (existingPreference) {\r\n preference.id = existingPreference.id;\r\n updatePreference(preference);\r\n }\r\n else {\r\n addPreference(preference);\r\n }\r\n }\r\n\r\n function addPreference(preference) {\r\n if (preference === null)\r\n return;\r\n\r\n var deferred = $q.defer();\r\n\r\n var obj = toModel(preference);\r\n var req = dataContext.post(config.apiHosts.generic + '/preference', obj, true)\r\n .then(function (data) {\r\n service.preferences.push(fromModel(data));\r\n deferred.resolve(fromModel(data));\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function getPreference(name, category) {\r\n var result = _.find(service.preferences, function (preference) {\r\n if (category !== undefined) {\r\n return preference.name === name && preference.category === category;\r\n }\r\n return preference.name === name;\r\n });\r\n\r\n if (result === undefined)\r\n return null;\r\n\r\n return result;\r\n }\r\n\r\n function getAnyPreference(name) {\r\n var result = _.filter(service.preferences, function (preference) {\r\n return preference.name === name;\r\n });\r\n\r\n if (result === undefined || result === null)\r\n return [];\r\n return result;\r\n }\r\n\r\n function getPreferencesByCategory(name) {\r\n var deferred = $q.defer();\r\n\r\n if (service.initialized === true) {\r\n var result = [];\r\n\r\n for (var i = 0; i < service.preferences.length; i++) {\r\n if (service.preferences[i].category !== undefined && service.preferences[i].category !== null && service.preferences[i].category.toLowerCase() === name.toLowerCase()) {\r\n result.push(service.preferences[i]);\r\n }\r\n }\r\n\r\n deferred.resolve(result);\r\n }\r\n else {\r\n dataContext.get(config.apiHosts.generic + '/preference')\r\n .then(function (data) {\r\n var result = [];\r\n data = _.map(data, fromModel);\r\n\r\n for (var i = 0; i < data.length; i++) {\r\n if (data[i].category !== undefined && data[i].category !== null && data[i].category.toLowerCase() === name.toLowerCase()) {\r\n result.push(data[i]);\r\n }\r\n }\r\n\r\n deferred.resolve(result);\r\n });\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n function fromModel(item) {\r\n var result = {\r\n id: item.id,\r\n category: item.category,\r\n lastUpdate: item.lastUpdate,\r\n name: item.name,\r\n sortOrder: item.sortOrder,\r\n valueType: item.valueType\r\n };\r\n\r\n switch (item.valueType) {\r\n case 'booleanValue':\r\n result[item.name] = item.booleanValue;\r\n result.value = item.booleanValue;\r\n break;\r\n case 'dateTimeValue':\r\n result[item.name] = item.dateTimeValue;\r\n result.value = item.dateTimeValue;\r\n break;\r\n case 'numericValue':\r\n result[item.name] = item.numericValue;\r\n result.value = item.numericValue;\r\n break;\r\n default:\r\n result[item.name] = item.stringValue;\r\n result.value = item.stringValue;\r\n break;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function reload() {\r\n var deferred = $q.defer();\r\n\r\n dataContext.get(config.apiHosts.generic + '/preference')\r\n .then(function (data) {\r\n data = _.map(data, fromModel);\r\n service.preferences = data;\r\n service.initialized = true;\r\n deferred.resolve(data);\r\n }, function(error) {\r\n if (error && error.status === 401) {\r\n $cookies.remove('authToken');\r\n $window.location.reload();\r\n }\r\n deferred.reject();\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function removePreference(preference) {\r\n if (preference === null || preference.id === undefined || preference.id === null)\r\n return;\r\n\r\n var obj = toModel(preference);\r\n service.preferences.splice(_.findIndex(service.preferences, function (prefToFind) { return prefToFind.id === obj.id; }), 1);\r\n return dataContext.del(config.apiHosts.generic + '/preference/' + preference.id);\r\n }\r\n\r\n function toModel(preference) {\r\n var originalPreference = null;\r\n if (preference.id !== undefined && preference.id !== null)\r\n originalPreference = _.find(service.preferences, function (prefToFind) { return prefToFind.id === preference.id; });\r\n\r\n var obj = {\r\n id: preference.id !== undefined && preference.id !== null ? preference.id : -1,\r\n lastUpdate: new Date(),\r\n name: preference.name !== undefined && preference.name !== null ? preference.name : (originalPreference !== undefined && originalPreference !== null && originalPreference.name !== undefined && originalPreference.name !== null ? originalPreference.name : null),\r\n category: preference.category !== undefined && preference.category !== null ? preference.category : (originalPreference !== undefined && originalPreference !== null && originalPreference.category !== undefined && originalPreference.category !== null ? originalPreference.category : null),\r\n sortOrder: preference.sortOrder !== undefined && preference.sortOrder !== null ? preference.sortOrder : (originalPreference !== undefined && originalPreference !== null && originalPreference.sortOrder !== undefined && originalPreference.sortOrder !== null ? originalPreference.sortOrder : null),\r\n valueType: preference.valueType !== undefined && preference.valueType !== null ? preference.valueType : (originalPreference !== undefined && originalPreference !== null && originalPreference.valueType !== undefined && originalPreference.valueType !== null ? originalPreference.valueType : null)\r\n };\r\n\r\n if (obj.name === null)\r\n return null;\r\n if (obj.valueType === null)\r\n obj.valueType = 'stringValue';\r\n\r\n switch (obj.valueType) {\r\n case 'booleanValue':\r\n obj.booleanValue = preference.value;\r\n break;\r\n case 'dateTimeValue':\r\n obj.dateTimeValue = preference.value;\r\n break;\r\n case 'numericValue':\r\n obj.numericValue = preference.value;\r\n break;\r\n default:\r\n obj.stringValue = preference.value;\r\n break;\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n function updatePreference(preference) {\r\n if (preference === null)\r\n return;\r\n\r\n var obj = toModel(preference);\r\n var index = _.findIndex(service.preferences, function (prefToFind) { return prefToFind.id === obj.id; });\r\n if (index > -1)\r\n service.preferences[index] = fromModel(obj);\r\n\r\n return dataContext.put(config.apiHosts.generic + '/preference/' + obj.id, obj, true);\r\n }\r\n\r\n function setLanguage(lang) {\r\n language.set(lang);\r\n var currentPref = service.get('language', 'website');\r\n if (currentPref) {\r\n currentPref.value = lang;\r\n return service.update(currentPref);\r\n }\r\n else {\r\n return service.add({\r\n category: 'website',\r\n name: 'language',\r\n valueType: 'stringValue',\r\n value: lang\r\n });\r\n }\r\n }\r\n\r\n function setReferenceCountry(referenceCountry) {\r\n var currentPref = service.get('referenceCountry', 'user_preferences');\r\n if (referenceCountry === 'GB') {\r\n setLanguage('en');\r\n }\r\n if (currentPref) {\r\n currentPref.value = referenceCountry;\r\n return service.update(currentPref);\r\n }\r\n else {\r\n return service.add({\r\n category: 'search',\r\n name: 'referenceCountry',\r\n valueType: 'stringValue',\r\n value: referenceCountry\r\n });\r\n }\r\n }\r\n\r\n function saveCountryPreference(country) {\r\n service.add({ name: 'searchCountry', category: 'search', value: country.code + ',' + country.name });\r\n }\r\n\r\n function clearCountryPreference() {\r\n try {\r\n var pref = service.get('searchCountry', 'search');\r\n if (pref) {\r\n service.remove(pref);\r\n }\r\n } catch (err) { }\r\n }\r\n\r\n return service;\r\n}\r\n","module.exports = [serializationService];\r\n\r\nfunction serializationService() {\r\n var service = {\r\n serializeCustomsValue: serializeCustomsValue,\r\n serializeQuantities: serializeQuantities\r\n };\r\n return service;\r\n\r\n function serializeCustomsValue(customsValue) {\r\n if (customsValue.amount === null || customsValue.amount === undefined || customsValue.unit === null || customsValue.unit === undefined || customsValue.unit === '') {\r\n return '';\r\n }\r\n return customsValue.amount + ' ' + customsValue.unit;\r\n }\r\n\r\n function serializeQuantities(quantities) \r\n {\r\n var serializedQuantities = _.chain(quantities)\r\n .filter(function(quantity) {\r\n return quantity !== null && quantity !== undefined && quantity.Amount !== null && quantity.Amount !== undefined && quantity.Amount !== \"\";\r\n })\r\n .map(function(quantity) {\r\n var result = quantity.Amount + ' ' + quantity.Unit.code;\r\n if (quantity.Qualifier) {\r\n result += ' ' + quantity.Qualifier.code;\r\n }\r\n return result;\r\n })\r\n .value();\r\n return serializedQuantities;\r\n }\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = [applicationStateService];\r\n\r\nfunction applicationStateService() {\r\n\r\n var service = {\r\n filter: {\r\n date: moment().format('YYYY-MM-DD'),\r\n referenceCountry: 'NL',\r\n movement: 'import',\r\n countryCode: null,\r\n countryName: null,\r\n additionalCode: null\r\n },\r\n uccModeEnabled: 'no',\r\n remember: {\r\n country: false\r\n },\r\n currentCode: null,\r\n currentIndentation: null,\r\n countryHasChanged: countryHasChanged,\r\n updateCountryFilter: updateCountryFilter\r\n };\r\n\r\n function updateCountryFilter(country, rememberCountry) {\r\n if (country && (!service.filter.countryCode || service.filter.countryCode !== country.code)) {\r\n service.filter.countryCode = country.code;\r\n service.filter.countryName = country.name;\r\n }\r\n else if (!country && service.filter.countryCode) {\r\n service.filter.countryCode = null;\r\n service.filter.countryName = null;\r\n }\r\n service.remember.country = rememberCountry;\r\n }\r\n\r\n function countryHasChanged(country) {\r\n return (country && service.filter.countryCode !== country.code) || (!country && service.filter.countryCode);\r\n }\r\n\r\n\r\n return service;\r\n}","angular.module('taric.correlationTable', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('correlationTableSubnav', require('./components/correlation-table-subnav'))\r\n .component('correlationTable', require('./components/correlation-table'))\r\n .component('hs2022Backward', require('./components/hs-2022-backward'))\r\n .component('hs2022Forward', require('./components/hs-2022-forward'))\r\n \r\n .component('correlationTablePage', require('./components/correlation-table-page'))\r\n .component('correlationTableNewsPage', require('./components/correlation-table-news-page'))\r\n .component('hs2022BackwardPage', require('./components/hs-2022-backward-page'))\r\n .component('hs2022ForwardPage', require('./components/hs-2022-forward-page'))\r\n .factory('correlationDataService', require('./services/correlation-data'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/correlation-table/hs-2022-forward', {\r\n template: ''\r\n })\r\n .when('/correlation-table/hs-2022-backward', {\r\n template: ''\r\n })\r\n .when('/correlation-table/:activeSubnav/:code', {\r\n template: ''\r\n })\r\n .when('/correlation-table/:activeSubnav', {\r\n template: ''\r\n })\r\n .when('/correlation-table', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n controller: correlationTableNewsController,\r\n templateUrl: 'correlation-table/components/correlation-table-news-page.html'\r\n};\r\n\r\ncorrelationTableNewsController.$inject = ['$analytics', '$routeParams'];\r\n\r\nfunction correlationTableNewsController($analytics, $routeParams) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n activeSubnav: $routeParams.activeSubnav\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/news/correlation-table');\r\n }\r\n \r\n return vm;\r\n}\r\n","module.exports = {\r\n controller: correlationTableController,\r\n templateUrl: 'correlation-table/components/correlation-table-page.html'\r\n};\r\n\r\ncorrelationTableController.$inject = ['$analytics', '$routeParams'];\r\n\r\nfunction correlationTableController($analytics, $routeParams) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n activeSubnav: $routeParams.activeSubnav\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/news/correlation-table');\r\n }\r\n \r\n return vm;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n active: '@'\r\n },\r\n templateUrl: 'correlation-table/components/correlation-table-subnav.html'\r\n};","var moment = require('moment');\r\n\r\nmodule.exports = {\r\n controller: correlationTableController,\r\n templateUrl: 'correlation-table/components/correlation-table.html'\r\n};\r\n \r\ncorrelationTableController.$inject = [\r\n '$analytics', \r\n '$window', \r\n '$routeParams', \r\n '$translate', \r\n 'formatting', \r\n 'correlationDataService', \r\n 'applicationStateService', \r\n 'tradeMovementService', \r\n 'notificationsService',\r\n];\r\n\r\nfunction correlationTableController(\r\n $analytics, \r\n $window, \r\n $routeParams, \r\n $translate, \r\n formatting, \r\n correlationData, \r\n state, \r\n tradeMovement, \r\n notifications\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n beforeFirstSearch: true,\r\n changeDateInterval: changeDateInterval,\r\n data: {\r\n newCodes: [],\r\n oldCodes: []\r\n },\r\n error: null,\r\n filter: {\r\n dateInterval: 'upcoming-year',\r\n goodsnom: $routeParams.code,\r\n endDate: moment().add(1, 'Y').format('D-M-YYYY'),\r\n endDateFormatted: null,\r\n orderBy: 'date',\r\n orderDirection: 'ascending',\r\n startDate: moment().format('D-M-YYYY'),\r\n startDateFormatted: null,\r\n type: 'import'\r\n },\r\n isLoading: false,\r\n changeTradeMovement: changeTradeMovement,\r\n loadNewCodes: loadNewCodes,\r\n loadOldCodes: loadOldCodes,\r\n openOldCodeInNewWindow: openOldCodeInNewWindow,\r\n openNewCodeInNewWindow: openNewCodeInNewWindow,\r\n activeSubnav: $routeParams.activeSubnav,\r\n referenceCountry: state.filter.referenceCountry,\r\n translations: {}\r\n };\r\n \r\n return vm;\r\n\r\n function openOldCodeInNewWindow(oldCode, newCode) {\r\n if (oldCode.endDate) {\r\n if (moment(oldCode.endDate).isBefore(state.filter.referenceDate)) {\r\n $window.open('/#!/search/tree?commodityCode=' + oldCode.goodsnom + '&date=' + moment(oldCode.endDate).format('YYYY-MM-DD'));\r\n }\r\n }\r\n if (newCode.startDate) {\r\n if (moment(newCode.startDate).isBefore(state.filter.referenceDate)) {\r\n $window.open('/#!/search/tree?commodityCode=' + oldCode.goodsnom + '&date=' + moment(newCode.startDate).subtract(1, 'd').format('YYYY-MM-DD'));\r\n }\r\n }\r\n $window.open('/#!/search/' + oldCode.goodsnom);\r\n }\r\n\r\n function openNewCodeInNewWindow(oldCode, newCode) {\r\n if (newCode.startDate) {\r\n if (moment(newCode.startDate).isAfter(state.filter.referenceDate)) {\r\n $window.open('/#!/search/tree?commodityCode=' + newCode.goodsnom + '&date=' + moment(newCode.startDate).format('YYYY-MM-DD'));\r\n }\r\n }\r\n if (oldCode.endDate) {\r\n if (moment(oldCode.endDate).isAfter(state.filter.referenceDate)) {\r\n $window.open('/#!/search/tree?commodityCode=' + newCode.goodsnom + '&date=' + moment(oldCode.endDate).add(1, 'd').format('YYYY-MM-DD'));\r\n }\r\n }\r\n $window.open('/#!/search/tree?commodityCode=' + newCode.goodsnom);\r\n }\r\n\r\n function movementChanged() {\r\n vm.filter.type = state.filter.movement;\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_movement_changed', movementChanged);\r\n }\r\n\r\n function attached() {\r\n notifications.subscribe('filter_movement_changed', movementChanged);\r\n\r\n vm.filter.type = state.filter.movement;\r\n if (vm.activeSubnav.indexOf('recent') > 0) {\r\n vm.filter.dateInterval = 'last-year';\r\n vm.filter.startDate = moment().subtract(1, 'Y').format('D-M-YYYY');\r\n vm.filter.endDate = moment().format('D-M-YYYY');\r\n vm.filter.orderBy = 'date';\r\n vm.filter.orderDirection = 'descending';\r\n }\r\n else if (vm.activeSubnav.indexOf('upcoming') > 0) {\r\n vm.filter.dateInterval = 'upcoming-year';\r\n vm.filter.startDate = moment().format('D-M-YYYY');\r\n vm.filter.endDate = moment().add(1, 'Y').format('D-M-YYYY');\r\n vm.filter.orderBy = 'date';\r\n vm.filter.orderDirection = 'ascending';\r\n }\r\n else if ($routeParams.code) {\r\n vm.filter.dateInterval = 'choose-dates';\r\n if (formatting.isChapterCode($routeParams.code)) {\r\n vm.filter.startDate = moment().subtract(2, 'Y');\r\n }\r\n else if (formatting.isHeadingCode($routeParams.code)) {\r\n vm.filter.startDate = moment().subtract(5, 'Y');\r\n }\r\n else {\r\n vm.filter.startDate = moment().subtract(20, 'Y');\r\n }\r\n vm.filter.endDate = moment().add(2, 'M').format('D-M-YYYY');\r\n }\r\n else {\r\n vm.filter.dateInterval = 'choose-dates';\r\n vm.filter.startDate = moment().subtract(10, 'M').format('D-M-YYYY');\r\n vm.filter.endDate = moment().add(2, 'M').format('D-M-YYYY');\r\n }\r\n loadTranslations(); \r\n loadCorrelationTable();\r\n }\r\n\r\n function loadCorrelationTable() {\r\n if (vm.activeSubnav.indexOf('expired-codes') === 0) {\r\n loadOldCodes();\r\n }\r\n else if (vm.activeSubnav.indexOf('new-codes') === 0) {\r\n loadNewCodes();\r\n }\r\n }\r\n\r\n function changeTradeMovement(newTradeMovement) {\r\n tradeMovement.set(newTradeMovement);\r\n }\r\n\r\n function changeDateInterval(newDateInterval) {\r\n if (newDateInterval === 'upcoming-year') {\r\n vm.filter.startDate = moment().format('D-M-YYYY');\r\n vm.filter.endDate = moment().add(1, 'Y').format('D-M-YYYY');\r\n vm.filter.orderBy = 'date';\r\n vm.filter.orderDirection = 'ascending';\r\n }\r\n else if (newDateInterval === 'last-year') {\r\n vm.filter.startDate = moment().subtract(1, 'Y').format('D-M-YYYY');\r\n vm.filter.endDate = moment().format('D-M-YYYY');\r\n vm.filter.orderBy = 'date';\r\n vm.filter.orderDirection = 'descending';\r\n }\r\n else { // choose dates\r\n vm.filter.orderBy = 'commodityCode';\r\n vm.filter.orderDirection = 'ascending';\r\n }\r\n loadCorrelationTable();\r\n }\r\n\r\n function loadOldCodes() {\r\n $analytics.eventTrack('/load-correlation-table', { category: vm.activeSubnav });\r\n vm.activeSubnav = vm.activeSubnav.replace('new-codes', 'expired-codes');\r\n vm.beforeFirstSearch = false;\r\n vm.error = null;\r\n vm.isLoading = true;\r\n setDates();\r\n correlationData.getOldCodes(vm.filter.startDateFormatted, vm.filter.endDateFormatted, vm.filter.goodsnom, vm.filter.type, vm.filter.orderBy, vm.filter.orderDirection)\r\n .then(function (result) {\r\n vm.data.newCodes = [];\r\n vm.data.oldCodes = result;\r\n vm.isLoading = false;\r\n }, handleError);\r\n }\r\n\r\n function loadNewCodes() {\r\n $analytics.eventTrack('/load-correlation-table', { category: vm.activeSubnav });\r\n vm.activeSubnav = vm.activeSubnav.replace('expired-codes', 'new-codes');\r\n vm.beforeFirstSearch = false;\r\n vm.error = null;\r\n vm.isLoading = true;\r\n setDates();\r\n correlationData.getNewCodes(vm.filter.startDateFormatted, vm.filter.endDateFormatted, vm.filter.goodsnom, vm.filter.type, vm.filter.orderBy, vm.filter.orderDirection)\r\n .then(function (result) {\r\n vm.data.oldCodes = [];\r\n vm.data.newCodes = result;\r\n vm.isLoading = false;\r\n }, handleError);\r\n }\r\n\r\n function handleError(errorResponse) {\r\n vm.isLoading = false;\r\n if (errorResponse && errorResponse.data && errorResponse.data.Message) {\r\n if (errorResponse.data.Message === 'You cannot specify a period of more than a year') {\r\n vm.error = vm.translations['correlationTable.MaxOneYearInterval'];\r\n }\r\n else\r\n vm.error = errorResponse.data.Message;\r\n }\r\n else\r\n vm.error = 'An unexpected error occured. Please contact Taric Support.'; // TODO: translate\r\n }\r\n\r\n function setDates() {\r\n if (vm.filter.startDate !== null) {\r\n vm.filter.startDateFormatted = moment(vm.filter.startDate, 'DD-MM-YYYY').format('YYYY-MM-DD');\r\n vm.filter.startDate = moment(vm.filter.startDate, 'DD-MM-YYYY').format('D-M-YYYY');\r\n }\r\n if (vm.filter.endDate !== null) {\r\n vm.filter.endDateFormatted = moment(vm.filter.endDate, 'DD-MM-YYYY').format('YYYY-MM-DD');\r\n vm.filter.endDate = moment(vm.filter.endDate, 'DD-MM-YYYY').format('D-M-YYYY');\r\n }\r\n }\r\n\r\n function loadTranslations() {\r\n $translate([\r\n 'shared.ui.MaxOneYearInterval'\r\n ]).then(function (translations) {\r\n vm.translations = translations;\r\n });\r\n }\r\n}","module.exports = {\r\n controller: hs2022backwardController,\r\n templateUrl: 'correlation-table/components/hs-2022-backward-page.html'\r\n};\r\n\r\nhs2022backwardController.$inject = ['$analytics'];\r\n\r\nfunction hs2022backwardController($analytics) {\r\n\r\n var vm = {\r\n $onInit: attached\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/correlation-table/hs2022');\r\n }\r\n \r\n return vm;\r\n}\r\n","module.exports = {\r\n bindings: {},\r\n controller: hs2022BackwardCorrelationsController,\r\n templateUrl: 'correlation-table/components/hs-2022-backward.html'\r\n};\r\n\r\nhs2022BackwardCorrelationsController.$inject = ['correlationDataService'];\r\n\r\nfunction hs2022BackwardCorrelationsController(correlationDataService) {\r\n var vm = {\r\n $onInit: attached,\r\n search: search\r\n };\r\n return vm;\r\n\r\n function attached() {\r\n search();\r\n }\r\n\r\n function search(commodityCode) {\r\n vm.isLoading = true;\r\n return correlationDataService\r\n .getHs2022BackwardCorrelations(commodityCode)\r\n .then(function (result) {\r\n vm.isLoading = false;\r\n vm.result = result;\r\n });\r\n }\r\n}","module.exports = {\r\n controller: hs2022forwardController,\r\n templateUrl: 'correlation-table/components/hs-2022-forward-page.html'\r\n};\r\n\r\nhs2022forwardController.$inject = ['$analytics'];\r\n\r\nfunction hs2022forwardController($analytics) {\r\n\r\n var vm = {\r\n $onInit: attached\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/correlation-table/hs2022');\r\n }\r\n \r\n return vm;\r\n}\r\n","module.exports = {\r\n bindings: {},\r\n controller: hs2022ForwardCorrelationsController,\r\n templateUrl: 'correlation-table/components/hs-2022-forward.html'\r\n};\r\n\r\nhs2022ForwardCorrelationsController.$inject = ['correlationDataService'];\r\n\r\nfunction hs2022ForwardCorrelationsController(correlationDataService) {\r\n var vm = {\r\n $onInit: attached,\r\n search: search\r\n };\r\n return vm;\r\n\r\n function attached() {\r\n search();\r\n }\r\n\r\n function search(commodityCode) {\r\n vm.isLoading = true;\r\n return correlationDataService\r\n .getHs2022ForwardCorrelations(commodityCode)\r\n .then(function (result) {\r\n vm.isLoading = false;\r\n vm.result = result;\r\n })\r\n }\r\n}","module.exports = ['common', 'dataContext', correlationDataService];\r\n\r\nfunction correlationDataService(common, context) {\r\n\r\n var service = {\r\n getNewCodes: getNewCodes,\r\n getOldCodes: getOldCodes,\r\n getHs2022ForwardCorrelations: getHs2022ForwardCorrelations,\r\n getHs2022BackwardCorrelations: getHs2022BackwardCorrelations,\r\n };\r\n\r\n function getNewCodes(startDate, endDate, commodityCode, movementType, orderBy, orderDirection) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/commodity-code-correlation/originators';\r\n url += '?startDate=' + startDate + '&endDate=' + endDate;\r\n url += '&movement=' + movementType;\r\n url += '&orderby=' + orderBy;\r\n url += '&orderDirection=' + (orderDirection || 'ascending');\r\n if (commodityCode) {\r\n url += '&commodityCode=' + commodityCode;\r\n }\r\n\r\n return context.get(url);\r\n }\r\n\r\n function getOldCodes(startDate, endDate, commodityCode, movementType, orderBy, orderDirection) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/commodity-code-correlation/successors';\r\n url += '?startDate=' + startDate + '&endDate=' + endDate;\r\n url += '&movement=' + movementType;\r\n url += '&orderby=' + orderBy;\r\n url += '&orderDirection=' + (orderDirection || 'ascending');\r\n if (commodityCode) {\r\n url += '&commodityCode=' + commodityCode;\r\n }\r\n\r\n return context.get(url);\r\n }\r\n\r\n function getHs2022ForwardCorrelations(commodityCode) {\r\n var url = common.config.apiHosts.generic + '/hs-2022/forward-correlations'\r\n if (commodityCode) {\r\n url += '?goodscode=' + commodityCode;\r\n }\r\n return context.get(url);\r\n }\r\n\r\n function getHs2022BackwardCorrelations(commodityCode) {\r\n var url = common.config.apiHosts.generic + '/hs-2022/backward-correlations'\r\n if (commodityCode) {\r\n url += '?goodscode=' + commodityCode;\r\n }\r\n return context.get(url);\r\n }\r\n\r\n return service;\r\n\r\n}\r\n","angular.module('taric.customsValue', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('transactionValueCalculatorPage', require('./components/transaction-value-calculator-page'))\r\n .component('transactionValueCalculator', require('./components/transaction-value-calculator'))\r\n .component('transactionValueComponent', require('./components/transaction-value-component'))\r\n .factory('transactionValueCalculatorModal', require('./modals/transaction-value-calculator'))\r\n .factory('transactionValueDataService', require('./services/transaction-value-data'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/transaction-value-calculator', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n controller: transactionValueController,\r\n templateUrl: 'customs-value/components/transaction-value-calculator-page.html'\r\n};\r\n\r\ntransactionValueController.$inject = [\r\n '$analytics', \r\n '$window', \r\n 'transactionValueDataService', \r\n 'applicationStateService',\r\n];\r\n\r\nfunction transactionValueController(\r\n $analytics, \r\n $window, \r\n transactionValueDataService, \r\n state\r\n) {\r\n\r\n var vm = {\r\n referenceCountry: state.filter.referenceCountry,\r\n $onInit: attached,\r\n print: print\r\n };\r\n \r\n return vm;\r\n\r\n function attached() {\r\n $analytics.pageTrack('/transaction-value-calculator');\r\n transactionValueDataService.initTransactionValue();\r\n }\r\n\r\n function print() {\r\n $window.print();\r\n }\r\n}","module.exports = {\r\n controller: transactionValueCalculatorController,\r\n templateUrl: 'customs-value/components/transaction-value-calculator.html'\r\n};\r\n\r\ntransactionValueCalculatorController.$inject = ['transactionValueDataService'];\r\n\r\nfunction transactionValueCalculatorController(transactionValueDataService) {\r\n var vm = {\r\n $onInit: attached,\r\n onChangeTransactionValue: onChangeTransactionValue,\r\n activeTabs: {\r\n additions: 'delivery-costs',\r\n deductions: 'delivery-costs'\r\n },\r\n calculatorVersion: 'basic',\r\n data: {}\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n vm.data = transactionValueDataService.data;\r\n }\r\n\r\n function onChangeTransactionValue() {\r\n transactionValueDataService.calculateResult();\r\n }\r\n}\r\n","module.exports = {\r\n bindings: {\r\n fieldName: '@',\r\n fieldType: '@',\r\n label: '@',\r\n onClickHelpText: '@'\r\n },\r\n controller: transactionValueComponentController,\r\n templateUrl: 'customs-value/components/transaction-value-component.html'\r\n};\r\n\r\ntransactionValueComponentController.$inject = ['transactionValueDataService'];\r\n\r\nfunction transactionValueComponentController(transactionValueDataService) {\r\n var vm = {\r\n data: transactionValueDataService.data,\r\n showOnClickHelpText: false,\r\n addField: addField,\r\n removeField: removeField,\r\n onChangeTransactionValue: onChangeTransactionValue\r\n };\r\n\r\n return vm;\r\n\r\n function addField(fieldType, fieldName) {\r\n transactionValueDataService.addField(fieldType, fieldName);\r\n }\r\n \r\n function removeField(fieldType, fieldName, index) {\r\n transactionValueDataService.removeField(fieldType, fieldName, index);\r\n }\r\n \r\n function onChangeTransactionValue() {\r\n transactionValueDataService.calculateResult();\r\n }\r\n}\r\n\r\n","module.exports = [\r\n '$analytics', \r\n '$uibModal', \r\n transactionValueCalculatorModal\r\n];\r\n\r\nfunction transactionValueCalculatorModal(\r\n $analytics, \r\n $uibModal\r\n) {\r\n\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n transactionValueCalculatorModalController.$inject = [\r\n '$window', \r\n 'transactionValueDataService', \r\n '$uibModalInstance',\r\n ];\r\n\r\n function transactionValueCalculatorModalController(\r\n $window, \r\n transactionValueDataService, \r\n $uibModalInstance\r\n ) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n cancel: cancel,\r\n ok: ok,\r\n print: print,\r\n };\r\n\r\n return vm;\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function ok() {\r\n $uibModalInstance.close(transactionValueDataService.data.transactionValue.result);\r\n }\r\n\r\n function print() {\r\n $window.print();\r\n }\r\n\r\n function attached() {\r\n vm.data = transactionValueDataService.data;\r\n }\r\n\r\n }\r\n\r\n function showModal() {\r\n $analytics.eventTrack('open-modal-transaction-value-calculator', { category: 'transaction-value-calculator' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n controller: transactionValueCalculatorModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n size: 'lg',\r\n templateUrl: 'customs-value/modals/transaction-value-calculator.html',\r\n windowClass: 'modal-transaction-value-calculator modal-wide'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","var moment = require('moment');\r\n\r\nmodule.exports = ['common', 'dataContext', 'applicationStateService', transactionValueDataService];\r\n\r\nfunction transactionValueDataService(common, context, state) {\r\n\r\n var service = {\r\n data: {\r\n monetaryUnit: getDefaultMonetaryUnit(),\r\n transactionValue: null,\r\n },\r\n addField: addField,\r\n removeField: removeField,\r\n calculateResult: calculateResult,\r\n initTransactionValue: initTransactionValue\r\n };\r\n\r\n initTransactionValue();\r\n\r\n return service;\r\n\r\n function addField(fieldType, fieldName) {\r\n service.data.transactionValue[fieldType][fieldName].push(initializeMonetaryValue());\r\n }\r\n\r\n function removeField(fieldType, fieldName, index) {\r\n service.data.transactionValue[fieldType][fieldName] = _.filter(\r\n service.data.transactionValue[fieldType][fieldName], function(el, idx) { \r\n return idx != index \r\n });\r\n calculateResult();\r\n }\r\n\r\n function initTransactionValue() {\r\n service.data.transactionValue = {\r\n priceActuallyPaidOrPayble: initializeMonetaryValue(),\r\n additions: {\r\n commissionsAndBrokerage: [initializeMonetaryValue()],\r\n costOfContainersWhichAreOneWithGoods: [initializeMonetaryValue()],\r\n costOfPacking: [initializeMonetaryValue()],\r\n materialsComponentsAndParts: [initializeMonetaryValue()],\r\n toolsDiesAndMoulds: [initializeMonetaryValue()],\r\n materialsConsumedInProduction: [initializeMonetaryValue()],\r\n engineeringDevelopmentArtworkDesignPlansAndSketches: [initializeMonetaryValue()],\r\n royaltiesAndLicenseFees: [initializeMonetaryValue()],\r\n valueOfResaleDisposalOrUseThatAccruesToSeller: [initializeMonetaryValue()],\r\n transportCostsBeforeEntryIntoCustomsTerritory: [initializeMonetaryValue()],\r\n insuranceCostsBeforeEntryIntoCustomsTerritory: [initializeMonetaryValue()],\r\n loadingAndHandlingChargesBeforeEntryIntoCustomsTerritory: [initializeMonetaryValue()],\r\n otherAdditions: [initializeMonetaryValue()]\r\n },\r\n deductions: {\r\n transportCostsAfterEntryIntoCustomsTerritory: [initializeMonetaryValue()],\r\n chargesForConstructionErectionAssemblyMaintenanceOrTechnicalAssistance: [initializeMonetaryValue()],\r\n chargesForInterest: [initializeMonetaryValue()],\r\n chargesForRightToReproduce: [initializeMonetaryValue()],\r\n buyingCommisions: [initializeMonetaryValue()],\r\n importDuties: [initializeMonetaryValue()],\r\n paymentsMadeForRightToDistributeOrResell: [initializeMonetaryValue()],\r\n otherDeductions: [initializeMonetaryValue()]\r\n },\r\n result: initializeMonetaryValue()\r\n };\r\n }\r\n\r\n function calculateResult() {\r\n var amount = 0;\r\n if (service.data.transactionValue.priceActuallyPaidOrPayble.amount) {\r\n amount = service.data.transactionValue.priceActuallyPaidOrPayble.amount;\r\n }\r\n else {\r\n service.data.transactionValue.result.amount = undefined;\r\n return;\r\n }\r\n\r\n var additionFieldNames = [\r\n 'commissionsAndBrokerage',\r\n 'costOfContainersWhichAreOneWithGoods',\r\n 'costOfPacking',\r\n 'materialsComponentsAndParts',\r\n 'toolsDiesAndMoulds',\r\n 'materialsConsumedInProduction',\r\n 'engineeringDevelopmentArtworkDesignPlansAndSketches',\r\n 'royaltiesAndLicenseFees',\r\n 'valueOfResaleDisposalOrUseThatAccruesToSeller',\r\n 'transportCostsBeforeEntryIntoCustomsTerritory',\r\n 'insuranceCostsBeforeEntryIntoCustomsTerritory',\r\n 'loadingAndHandlingChargesBeforeEntryIntoCustomsTerritory',\r\n 'otherAdditions'\r\n ];\r\n\r\n var deductionFieldNames = [\r\n 'transportCostsAfterEntryIntoCustomsTerritory',\r\n 'chargesForConstructionErectionAssemblyMaintenanceOrTechnicalAssistance',\r\n 'chargesForInterest',\r\n 'chargesForRightToReproduce',\r\n 'buyingCommisions',\r\n // 'importDuties', // TODO: most likely we will remove this field completely!\r\n 'paymentsMadeForRightToDistributeOrResell',\r\n 'otherDeductions'\r\n ];\r\n\r\n _.forEach(additionFieldNames, function (additionFieldName) {\r\n _.forEach(service.data.transactionValue.additions[additionFieldName], function(additionField) {\r\n if (additionField.amount) {\r\n amount += additionField.amount;\r\n }\r\n });\r\n });\r\n _.forEach(deductionFieldNames, function (deductionFieldName) {\r\n _.forEach(service.data.transactionValue.deductions[deductionFieldName], function(deductionField) {\r\n if (deductionField.amount) {\r\n amount -= deductionField.amount;\r\n }\r\n });\r\n });\r\n \r\n service.data.transactionValue.result.amount = amount;\r\n }\r\n\r\n function getDefaultMonetaryUnit() {\r\n if (state.filter.referenceCountry === 'GB' && moment(state.filter.date).isAfter('2021-01-01')) {\r\n return 'GBP';\r\n }\r\n else {\r\n return 'EUR';\r\n }\r\n }\r\n\r\n function initializeMonetaryValue() {\r\n var monetaryUnit = getDefaultMonetaryUnit();\r\n return {\r\n amount: undefined,\r\n exchangeRate: 1,\r\n originalAmount: undefined,\r\n originalUnit: monetaryUnit,\r\n unit: monetaryUnit,\r\n };\r\n }\r\n\r\n}","angular.module('taric.dashboard', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('landingPage', require('./components/landing-page'))\r\n .factory('firstLoginModal', require('./modals/first-login'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/landing', {\r\n template: ''\r\n })\r\n .when('/dashboard', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","\r\nmodule.exports = {\r\n controller: landingPageController,\r\n templateUrl: 'dashboard/components/landing-page.html'\r\n};\r\n\r\nlandingPageController.$inject = [\r\n '$analytics', \r\n '$window', \r\n 'common', \r\n 'applicationStateService', \r\n 'documentationService', \r\n 'firstLoginModal',\r\n 'versionHistoryService', \r\n 'preferenceService',\r\n];\r\n\r\nfunction landingPageController(\r\n $analytics, \r\n $window, \r\n common, \r\n state, \r\n documentationService, \r\n firstLoginModal,\r\n versionHistoryService, \r\n preferences\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n common: common,\r\n setReferenceCountry: setReferenceCountry,\r\n toggleReferenceCountryNotAvailableMessage: toggleReferenceCountryNotAvailableMessage,\r\n allowedReferenceCountries: [],\r\n disallowedReferenceCountries: [],\r\n showReferenceCountryNotAvailableMessageFor: null,\r\n versionHistory: null\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/landing');\r\n common.auth.check();\r\n loadVersionHistory();\r\n documentationService.initialize('landing');\r\n vm.allowedReferenceCountries = common.identity.getAllowedTradeTariffs();\r\n vm.disallowedReferenceCountries = common.identity.getDisallowedTradeTariffs();\r\n var languagePreference = preferences.get('language', 'website');\r\n if (languagePreference === null) {\r\n firstLoginModal.show();\r\n }\r\n }\r\n\r\n function toggleReferenceCountryNotAvailableMessage(referenceCountry) {\r\n if (vm.showReferenceCountryNotAvailableMessageFor === referenceCountry) {\r\n vm.showReferenceCountryNotAvailableMessageFor = null;\r\n }\r\n else {\r\n vm.showReferenceCountryNotAvailableMessageFor = referenceCountry;\r\n }\r\n }\r\n\r\n function loadVersionHistory() {\r\n versionHistoryService.get().then(function (result) {\r\n vm.versionHistory = _.sortBy(result.data.history, 'releaseDate').reverse()[0];\r\n }, function (error) { } );\r\n }\r\n\r\n function setReferenceCountry(referenceCountry) {\r\n state.filter.referenceCountry = referenceCountry;\r\n preferences.setReferenceCountry(referenceCountry).then(function () {\r\n $window.location.reload();\r\n });\r\n documentationService.exit();\r\n common.$location.url('/');\r\n }\r\n\r\n return vm;\r\n}\r\n","module.exports = [\r\n '$analytics', \r\n '$uibModal', \r\n '$window',\r\n 'language',\r\n 'preferenceService',\r\n firstLoginModal\r\n];\r\n\r\nfunction firstLoginModal(\r\n $analytics, \r\n $uibModal,\r\n $window,\r\n languageService,\r\n preferences\r\n) {\r\n var modal = {\r\n show: showModal\r\n };\r\n \r\n firstLoginModalController.$inject = ['$uibModalInstance'];\r\n \r\n function firstLoginModalController($uibModalInstance) {\r\n \r\n var vm = {\r\n cancel: cancel,\r\n languages: languageService.supportedLanguagesWithDescription,\r\n setLanguageAndClose: setLanguageAndClose\r\n };\r\n\r\n return vm;\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function setLanguageAndClose(languageId) {\r\n preferences.setLanguage(languageId).then(function(){\r\n setTimeout(function() {\r\n // We set a timeout in order to give listeners\r\n // to the language changed event a chance to react\r\n // before reloading. For example, the query string\r\n // in the search function is cleared.\r\n $window.location.reload();\r\n }, 1);\r\n });\r\n }\r\n }\r\n\r\n\r\n function showModal() {\r\n $analytics.eventTrack('open-modal-first-login', { category: 'first-login' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: 'static',\r\n controller: firstLoginModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: false,\r\n modalFade: true,\r\n resolve: {},\r\n templateUrl: 'dashboard/modals/first-login.html',\r\n windowClass: 'modal-light'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","angular.module('taric.documentation', [])\r\n .component('documentationButton', require('./components/documentation-button'))\r\n .factory('documentationService', require('./services/documentation-service'))\r\n ;\r\n\r\n\r\n","module.exports = {\r\n bindings: {\r\n tour: '<'\r\n },\r\n controller: documentationButtonController,\r\n templateUrl: 'documentation/components/documentation-button.html'\r\n};\r\n\r\ndocumentationButtonController.$inject = ['$analytics', 'documentationService'];\r\n\r\nfunction documentationButtonController($analytics, documentationService) {\r\n var vm = {\r\n startTour: startTour\r\n }\r\n\r\n return vm;\r\n \r\n function startTour() {\r\n $analytics.eventTrack('start-tour', { category: 'documentation'});\r\n var currentTour = documentationService.getCurrentTour();\r\n // 2021-04-26 The tour of the measures page does not work properly with the if statement\r\n // because it loses the connection with the dom elements. However, there\r\n // was some other tour that did not start at the first modal without it, so I'll leave\r\n // this code here just in case. \r\n // if (currentTour.id !== vm.tour.id) {\r\n // documentationService.initialize(vm.tour.id);\r\n // }\r\n documentationService.initialize(vm.tour.id);\r\n documentationService.startTour();\r\n }\r\n}","module.exports = ['$timeout', '$translate', 'ngIntroService', 'preferenceService', documentationService];\r\n\r\nfunction documentationService($timeout, $translate, ngIntroService, preferences) {\r\n\r\n var currentTour = {\r\n id: null,\r\n running: false\r\n };\r\n\r\n var service = {\r\n addHints: addHints,\r\n exit: exit,\r\n getCurrentTour: getCurrentTour,\r\n next: next,\r\n startTour: startTour,\r\n initialize: initalizeTour\r\n };\r\n\r\n function getCurrentTour() {\r\n return currentTour;\r\n }\r\n\r\n ngIntroService.onExit(function() {\r\n currentTour.running = false;\r\n });\r\n\r\n var defaultIntroOptions = {\r\n disableInteraction: true,\r\n showStepNumbers: false,\r\n showBullets: false,\r\n exitOnOverlayClick: false,\r\n exitOnEsc: true,\r\n helperElementPadding: 0\r\n };\r\n\r\n var defaultTourConfig = {\r\n repeatAdNauseum: false, // TODO: set to false in production (it is good for debugging though)\r\n autoStart: false // TODO: set to false in production (it is good for debugging though)\r\n };\r\n\r\n var config = getTourConfig();\r\n\r\n return service;\r\n\r\n function exit() {\r\n ngIntroService.exit();\r\n }\r\n\r\n function next() {\r\n if (currentTour.running) {\r\n ngIntroService.next();\r\n }\r\n }\r\n\r\n function startTour() {\r\n currentTour.running = true;\r\n $timeout(function() {\r\n ngIntroService.start();\r\n }, 0);\r\n }\r\n\r\n function initalizeTour(id) {\r\n var tourConfig = _.find(config, { 'id': id });\r\n if (tourConfig) {\r\n $translate(tourConfig.translations)\r\n .then(function(translations) {\r\n tourConfig = _.defaults(tourConfig, defaultTourConfig);\r\n currentTour.id = id;\r\n var options = tourConfig.getOptions(translations);\r\n ngIntroService.setOptions(options);\r\n ngIntroService.onExit(function() {\r\n markTourAsExited(id);\r\n });\r\n if ((tourConfig.autoStart && isNewTour(id)) || tourConfig.repeatAdNauseum) {\r\n $timeout(function() {\r\n ngIntroService.start();\r\n }, 0);\r\n }\r\n });\r\n }\r\n }\r\n\r\n function addHints() {\r\n $timeout(function() {\r\n ngIntroService.addHints();\r\n ngIntroService.showHints();\r\n }, 0);\r\n }\r\n\r\n function isNewTour(id) {\r\n // return true; // good for debugging: all tours with autoStart: true will always auto-start\r\n var tourPreference = preferences.get(id, 'tourHasExited');\r\n return tourPreference === null;\r\n }\r\n\r\n function markTourAsExited(id) {\r\n preferences.replace({\r\n category: 'tourHasExited',\r\n name: id,\r\n value: true,\r\n valueType: 'booleanValue'\r\n });\r\n }\r\n\r\n function getTourConfig() {\r\n var config = [\r\n {\r\n id: 'abc',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.abc.intro']\r\n }\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.abc.intro',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'abc-new',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n element: document.querySelector('.introjs-abc-new-file'),\r\n intro: translations['documentation.abcNew.file']\r\n },\r\n {\r\n element: document.querySelector('.introjs-abc-new-input-options'),\r\n intro: translations['documentation.abcNew.inputOptions']\r\n },\r\n {\r\n element: document.querySelector('.introjs-abc-new-output-options'),\r\n intro: translations['documentation.abcNew.outputOptions']\r\n },\r\n {\r\n element: document.querySelector('.introjs-abc-new-submit'),\r\n intro: translations['documentation.abcNew.letsGo'],\r\n position: 'left'\r\n }\r\n \r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.abcNew.file',\r\n 'documentation.abcNew.inputOptions',\r\n 'documentation.abcNew.outputOptions',\r\n 'documentation.abcNew.letsGo',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'case-law',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.caseLaw.intro']\r\n }\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.caseLaw.intro',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'chapter',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.chapter.intro']\r\n },\r\n {\r\n element: document.querySelector('.introjs-heading'),\r\n intro: translations['documentation.chapter.heading']\r\n },\r\n {\r\n element: document.querySelector('.introjs-chapter-buttons'),\r\n intro: translations['documentation.chapter.chapterButtons']\r\n },\r\n {\r\n element: document.querySelector('.introjs-heading-buttons'),\r\n intro: translations['documentation.chapter.headingButtons'],\r\n position: 'left'\r\n }\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.chapter.intro',\r\n 'documentation.chapter.heading',\r\n 'documentation.chapter.chapterButtons',\r\n 'documentation.chapter.headingButtons',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'chapters',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.chapters.intro']\r\n },\r\n {\r\n element: '#large-search-box',\r\n intro: translations['documentation.chapters.largeSearchBox']\r\n },\r\n {\r\n element: '#introjs-reference-date-picker',\r\n intro: translations['documentation.header.referenceDatePicker'],\r\n position: 'bottom-right-aligned'\r\n },\r\n {\r\n element: '#introjs-import-export-toggle',\r\n intro: translations['documentation.header.tradeMovementPicker'],\r\n position: 'bottom-right-aligned'\r\n },\r\n {\r\n element: '#introjs-navbar-language-dropdown',\r\n intro: translations['documentation.header.languagePicker'],\r\n position: 'bottom-right-aligned'\r\n },\r\n {\r\n element: document.querySelector('.introjs-nomenclature-section'),\r\n intro: translations['documentation.chapters.sectionNotesAndExplanatoryNotes']\r\n }\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.chapters.intro',\r\n 'documentation.chapters.largeSearchBox',\r\n 'documentation.chapters.sectionNotesAndExplanatoryNotes',\r\n 'documentation.header.referenceDatePicker',\r\n 'documentation.header.tradeMovementPicker',\r\n 'documentation.header.languagePicker',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'correlation-table',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.correlationTable.intro']\r\n },\r\n {\r\n element: '#correlation-table-search-successors',\r\n intro: translations['documentation.correlationTable.searchSuccessors']\r\n },\r\n {\r\n element: '#correlation-table-search-originators',\r\n intro: translations['documentation.correlationTable.searchOriginators']\r\n }\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.correlationTable.intro',\r\n 'documentation.correlationTable.searchSuccessors',\r\n 'documentation.correlationTable.searchOriginators',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'ebti',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.ebti.intro']\r\n },\r\n {\r\n element: document.querySelector('.introjs-ebti-form'),\r\n intro: translations['documentation.ebti.form']\r\n }\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.ebti.intro',\r\n 'documentation.ebti.form',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'atr',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.atr.intro']\r\n },\r\n {\r\n element: document.querySelector('.introjs-atr-form'),\r\n intro: translations['documentation.atr.form']\r\n }\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.atr.intro',\r\n 'documentation.atr.form',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'landing',\r\n autoStart: false,\r\n repeatAdNauseum: false, // TODO: for debugging only\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n // disableInteraction: false,\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n element: '#introjs-navbar-language-dropdown',\r\n title: translations['documentation.landingPage.welcomeTitle'],\r\n intro: translations['documentation.landingPage.welcomeIntro']\r\n },\r\n // {\r\n // element: document.querySelector('.introjs-language-dropdown'),\r\n // intro: translations['documentation.header.languagePicker'],\r\n // position: 'left'\r\n // },\r\n {\r\n element: document.querySelector('.introjs-pick-trade-tariff'),\r\n intro: translations['documentation.landingPage.referenceCountryPicker']\r\n },\r\n {\r\n element: document.querySelector('.btn-help'),\r\n intro: translations['documentation.landingPage.introButton']\r\n },\r\n \r\n // {\r\n // element: '#introjs-reference-date-picker',\r\n // intro: translations['documentation.landingPage.referenceDatePicker']\r\n // },\r\n // {\r\n // element: '#introjs-import-export-toggle',\r\n // intro: translations['documentation.landingPage.tradeMovementPicker']\r\n // },\r\n // {\r\n // element: '#introjs-navbar-language-dropdown',\r\n // intro: translations['documentation.landingPage.languagePicker']\r\n // }\r\n ]\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.landingPage.welcomeTitle',\r\n 'documentation.landingPage.welcomeIntro',\r\n 'documentation.landingPage.referenceCountryPicker',\r\n 'documentation.landingPage.introButton',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'show-measures',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.measures.intro']\r\n },\r\n {\r\n element: document.querySelector('.show-measures-additional-search-options'),\r\n intro: translations['documentation.measures.form'],\r\n position: 'left'\r\n }\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.measures.intro',\r\n 'documentation.measures.form',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'validate-declaration',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.measures.intro']\r\n },\r\n {\r\n element: document.querySelector('.additional-search-options'),\r\n intro: translations['documentation.measures.validateDeclaration'],\r\n position: 'left'\r\n }\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.measures.intro',\r\n 'documentation.measures.validateDeclaration',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'calculate-duty',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.measures.intro']\r\n },\r\n {\r\n element: document.querySelector('.additional-search-options'),\r\n intro: translations['documentation.measures.calculateDuty'],\r\n position: 'left'\r\n }\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.measures.intro',\r\n 'documentation.measures.calculateDuty',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'menu',\r\n // autoStart: true,\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.mainMenu.intro'],\r\n },\r\n {\r\n element: '#side-menu-chapters',\r\n intro: translations['documentation.mainMenu.chapters'],\r\n position: 'right'\r\n },\r\n {\r\n element: '#side-menu-news',\r\n intro: translations['documentation.mainMenu.news'],\r\n position: 'right'\r\n },\r\n {\r\n element: '#side-menu-ebti',\r\n intro: translations['documentation.mainMenu.ebti'],\r\n position: 'right'\r\n },\r\n {\r\n element: '#side-menu-atr',\r\n intro: translations['documentation.mainMenu.atr'],\r\n position: 'right'\r\n },\r\n {\r\n element: '#side-menu-abc',\r\n intro: translations['documentation.mainMenu.abc'],\r\n position: 'right'\r\n },\r\n {\r\n element: '#side-menu-correlation-table',\r\n intro: translations['documentation.mainMenu.correlationTable'],\r\n position: 'right'\r\n },\r\n {\r\n element: '#side-menu-reference-prices',\r\n intro: translations['documentation.mainMenu.referencePrices'],\r\n position: 'right'\r\n },\r\n {\r\n element: '#side-menu-case-law',\r\n intro: translations['documentation.mainMenu.caseLaw'],\r\n position: 'right'\r\n },\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.mainMenu.intro',\r\n 'documentation.mainMenu.chapters',\r\n 'documentation.mainMenu.news',\r\n 'documentation.mainMenu.ebti',\r\n 'documentation.mainMenu.abc',\r\n 'documentation.mainMenu.correlationTable',\r\n 'documentation.mainMenu.referencePrices',\r\n 'documentation.mainMenu.caseLaw',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n {\r\n id: 'news',\r\n getOptions: function(translations) {\r\n var introOptions = {\r\n doneLabel: translations['documentation.ui.done'],\r\n nextLabel: translations['documentation.ui.next'],\r\n prevLabel: translations['documentation.ui.previous'],\r\n steps: [\r\n {\r\n intro: translations['documentation.news.intro']\r\n }\r\n ],\r\n };\r\n return _.defaults(introOptions, defaultIntroOptions);\r\n },\r\n translations: [\r\n 'documentation.news.intro',\r\n 'documentation.ui.done',\r\n 'documentation.ui.previous',\r\n 'documentation.ui.next',\r\n ]\r\n },\r\n ];\r\n\r\n return config;\r\n }\r\n}","angular.module('taric.duty', [])\r\n .factory('dutyDataService', require('./services/duty-data'))\r\n ;\r\n\r\n","module.exports = ['common', 'dataContext', 'applicationStateService', 'serializationService', dutyDataService];\r\n\r\nfunction dutyDataService(common, context, state, serializationService) {\r\n\r\n var service = {\r\n getUnits: getUnits,\r\n calculateDuty: calculateDuty\r\n };\r\n\r\n function getUnits(commodityCode, additionalCodeObjects, preferenceCode, germanExciseCode, uccModeEnabled) {\r\n var additionalCodes;\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/goods/' + commodityCode + '/units' +\r\n '?lang=' + common.language.get() +\r\n '&country=' + (state.filter.countryCode || '') +\r\n '&movement=' + state.filter.movement +\r\n '&german_excise_code=' + (germanExciseCode || '') +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date +\r\n '&ucc=' + (uccModeEnabled || '');\r\n if (additionalCodeObjects && additionalCodeObjects.length > 0) {\r\n additionalCodes = _.map(additionalCodeObjects, function(additionalCode) {\r\n return '' + additionalCode.type + additionalCode.code;\r\n });\r\n url += '&additionalcodes=' + additionalCodes.join(',');\r\n }\r\n if (preferenceCode) {\r\n url += \"&preferencecode=\" + preferenceCode.code;\r\n }\r\n return context.get(url);\r\n }\r\n\r\n function calculateDuty(query) {\r\n var quantities = serializationService.serializeQuantities(query.quantities);\r\n var additionalCodes = _.map(query.additionalCodes, function(additionalCode) {\r\n return '' + additionalCode.type + additionalCode.code;\r\n });\r\n var certificateCodes = _.map(query.certificateCodes, function(certificateCode) {\r\n if (certificateCode.origin === 'IT') {\r\n return '' + certificateCode.code + certificateCode.type;\r\n }\r\n return '' + certificateCode.type + certificateCode.code;\r\n });\r\n var preferenceCode = query.preferenceCode ? query.preferenceCode.code : null;\r\n var customsValue = serializationService.serializeCustomsValue(query.customsValue);\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/duties/calculate' +\r\n '?lang=' + common.language.get() +\r\n '&goodscode=' + query.commodityCode +\r\n '&additionalcodes=' + additionalCodes.join(',') +\r\n '&certificatecodes=' + certificateCodes.join(',') +\r\n '¤cycode=' + (query.currencyCode || '') +\r\n '&preferencecode=' + (preferenceCode || '') +\r\n '&customsvalue=' + customsValue +\r\n '&dutymeasuretypeid=' + (query.dutyMeasureTypeId || '') +\r\n '&ordernumber=' + (query.orderNumber || '') +\r\n '&quantities=' + quantities.join(',') +\r\n '&country=' + (query.countryOfOrigin || '') +\r\n '&german_national_commodity_code=' + (query.germanNationalCommodityCode || '') +\r\n '&german_excise_code=' + (query.germanExciseCode || '') +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date +\r\n '&ucc=' + (query.uccModeEnabled || '');\r\n return context.get(url);\r\n }\r\n\r\n return service;\r\n\r\n}\r\n","angular.module('taric.ecics', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('ecicsSearchPage', require('./components/ecics-search-page'))\r\n .component('ecicsButton', require('./components/ecics-button'))\r\n .component('ecicsDetails', require('./components/ecics-details'))\r\n .component('ecicsForm', require('./components/ecics-form'))\r\n .component('ecicsImages', require('./components/ecics-images'))\r\n .component('ecicsList', require('./components/ecics-list'))\r\n // Modals\r\n .factory('ecicsModal', require('./modals/ecics-modal'))\r\n // Services\r\n .factory('ecicsDataService', require('./services/ecics-data'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/ecics/search/:searchquery', {\r\n showSearchSubNav: true,\r\n template: '',\r\n })\r\n .when('/ecics/search/', {\r\n showSearchSubNav: true,\r\n template: '',\r\n })\r\n .when('/ecics/home/', {\r\n showSearchSubNav: false,\r\n template: '',\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n isLarge: '<',\r\n item: '<'\r\n },\r\n controller: ecicsButtonController,\r\n templateUrl: 'ecics/components/ecics-button.html'\r\n};\r\n\r\necicsButtonController.$inject = [\r\n 'common', \r\n 'ecicsModal'\r\n];\r\n\r\nfunction ecicsButtonController(\r\n common, \r\n ecicsModal\r\n) {\r\n\r\n var vm = {\r\n showEcics: showEcics\r\n };\r\n\r\n function showEcics() {\r\n var numberPattern = /^\\s*(?:\\d{2}[\\s.]*){1,5}$/;\r\n\r\n var code = common.formatting.removeTrailingZeros(vm.item.code);\r\n\r\n if (numberPattern.test(vm.item.searchQuery))\r\n ecicsModal.show(code, '');\r\n else\r\n ecicsModal.show(code, vm.item.searchQuery);\r\n }\r\n\r\n\r\n return vm;\r\n\r\n}\r\n","module.exports = {\r\n bindings: {\r\n activeItem: '<'\r\n },\r\n controller: ecicsDetailsController,\r\n templateUrl: 'ecics/components/ecics-details.html'\r\n}\r\n\r\necicsDetailsController.$inject = [\r\n 'ecicsDataService', \r\n 'language'\r\n];\r\n\r\nfunction ecicsDetailsController(\r\n ecicsDataService, \r\n language\r\n) {\r\n var vm = {\r\n service: ecicsDataService,\r\n language: language.get()\r\n };\r\n\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n updateQueryString: '<'\r\n },\r\n controller: ecicsFormController,\r\n templateUrl: 'ecics/components/ecics-form.html'\r\n};\r\n\r\necicsFormController.$inject = [\r\n '$location',\r\n 'ecicsDataService',\r\n];\r\n\r\nfunction ecicsFormController(\r\n $location,\r\n ecicsDataService\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n filter: ecicsDataService.filter,\r\n service: ecicsDataService,\r\n loadNew: loadNew\r\n };\r\n\r\n\r\n return vm;\r\n\r\n function attached() {\r\n if (vm.updateQueryString) {\r\n updateSearchQuery();\r\n }\r\n ecicsDataService.init();\r\n }\r\n\r\n function loadNew() {\r\n if (vm.updateQueryString) {\r\n updateSearchQuery();\r\n }\r\n ecicsDataService.loadNewItems();\r\n }\r\n\r\n function updateSearchQuery() {\r\n $location.search('query', vm.filter.name);\r\n $location.search('commodityCode', vm.filter.goodsCode);\r\n }\r\n}","module.exports = {\r\n controller: ecicsImagesController,\r\n templateUrl: 'ecics/components/ecics-images.html'\r\n};\r\n\r\necicsImagesController.$inject = ['ecicsDataService'];\r\n\r\nfunction ecicsImagesController(ecicsDataService) {\r\n var vm = {\r\n service: ecicsDataService,\r\n changeActiveItem: ecicsDataService.changeActiveItem,\r\n isLoading: false,\r\n loadMore: loadMore\r\n };\r\n return vm;\r\n\r\n function loadMore() {\r\n vm.isLoading = true;\r\n ecicsDataService.loadMoreItems().then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n}","module.exports = {\r\n controller: ecicsListController,\r\n templateUrl: 'ecics/components/ecics-list.html'\r\n};\r\n\r\necicsListController.$inject = ['ecicsDataService'];\r\n\r\nfunction ecicsListController(ecicsDataService) {\r\n var vm = {\r\n service: ecicsDataService,\r\n changeActiveItem: ecicsDataService.changeActiveItem,\r\n isLoading: false,\r\n loadMore: loadMore\r\n };\r\n return vm;\r\n\r\n function loadMore() {\r\n vm.isLoading = true;\r\n ecicsDataService.loadMoreItems().then(function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n}","module.exports = {\r\n bindings: {},\r\n controller: ecicsSearchPageController,\r\n templateUrl: 'ecics/components/ecics-search-page.html'\r\n}\r\n\r\necicsSearchPageController.$inject = [\r\n '$location', \r\n '$route', \r\n 'ecicsDataService',\r\n 'searchService'\r\n];\r\n\r\nfunction ecicsSearchPageController(\r\n $location, \r\n $route, \r\n ecicsDataService, \r\n searchService\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n showSearchSubNav: $route.current.$$route.showSearchSubNav,\r\n service: ecicsDataService,\r\n isLoading: false,\r\n loadNew: loadNew\r\n };\r\n\r\n return vm;\r\n \r\n function attached() {\r\n ecicsDataService.resetFilter();\r\n var q = searchService.parseLocationSearchObject($location.search());\r\n ecicsDataService.filter.goodsCode = q.commodityCode;\r\n ecicsDataService.filter.name = q.query;\r\n loadNew();\r\n }\r\n\r\n function loadNew() {\r\n // vm.isLoading = true;\r\n ecicsDataService.loadNewItems()\r\n .then(function () {\r\n // vm.isLoading = false;\r\n });\r\n }\r\n\r\n}","module.exports = ['$uibModal', ecicsModal];\r\n\r\nfunction ecicsModal($uibModal) {\r\n var modal = {\r\n goodsCode: null,\r\n searchQuery: null,\r\n show: showModal\r\n };\r\n\r\n ecicsModalController.$inject = ['$scope', '$uibModalInstance', 'ecicsDataService', 'goodsCode', 'searchQuery'];\r\n\r\n function ecicsModalController($scope, $uibModalInstance, ecicsDataService, goodsCode, searchQuery) {\r\n var vm = {\r\n attached: attached,\r\n cancel: cancel,\r\n changeActiveItem: changeActiveItem,\r\n service: ecicsDataService\r\n };\r\n\r\n var refresh;\r\n var opacity = 1;\r\n\r\n return vm;\r\n\r\n function attached() {\r\n // The following is a hack, introduced in October 2020. The reason for it is that\r\n // Chrome would not render the BTI images properly but a redraw would fix it.\r\n refresh = setInterval(function() {\r\n opacity = (opacity === 1 ? 0.99 : 1);\r\n document.body.style.opacity = opacity;\r\n }, 40);\r\n init();\r\n $scope.$on('$destroy', detached);\r\n }\r\n\r\n function detached() {\r\n document.body.style.opacity = 1;\r\n clearInterval(refresh);\r\n }\r\n\r\n\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function changeActiveItem(cus) {\r\n ecicsDataService.changeActiveItem(cus);\r\n }\r\n\r\n function init() {\r\n ecicsDataService.clearActiveItem();\r\n ecicsDataService.resetFilter();\r\n ecicsDataService.filter.goodsCode = goodsCode;\r\n ecicsDataService.filter.searchQuery = searchQuery;\r\n ecicsDataService.loadNewItems();\r\n }\r\n\r\n\r\n }\r\n\r\n function showModal(goodsCode,searchQuery) {\r\n if (goodsCode)\r\n modal.goodsCode = goodsCode;\r\n if (searchQuery)\r\n modal.searchQuery = searchQuery;\r\n\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: ecicsModalController,\r\n controllerAs: 'ctrlEcicsModal',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n goodsCode: function () {\r\n return modal.goodsCode;\r\n },\r\n searchQuery: function () {\r\n return modal.searchQuery;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'ecics/modals/ecics-modal.html',\r\n windowClass: 'modal-bti'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}","module.exports = ['dataContext', 'common', 'language', ecicsDataService];\r\n\r\nfunction ecicsDataService(dataContext, common, language) {\r\n\r\n var activeCus = null;\r\n\r\n var service = {\r\n characteristics: null,\r\n nomenclatures: null,\r\n response: {},\r\n data: {\r\n activeItem: null,\r\n isLoading: false,\r\n isLoadingDetails: false,\r\n },\r\n display: 'list',\r\n filter: {\r\n casRn: null,\r\n characteristic: '',\r\n cus: null,\r\n ecNumber: null,\r\n goodsCode: null,\r\n inChICode: null,\r\n inChIKey: null,\r\n name: null,\r\n nomenclature: '',\r\n pageNumber: 1,\r\n unNumber: 0\r\n },\r\n orderBy: 'Cus-asc',\r\n countPerChapter: countPerChapter,\r\n countPerHeading: countPerHeading,\r\n countForGoodsCode: countForGoodsCode,\r\n countForGoodsCodes: countForGoodsCodes,\r\n init: init,\r\n loadCharacteristics: loadCharacteristics,\r\n loadMoreItems: loadMoreItems,\r\n loadNewItems: loadNewItems,\r\n loadNomenclatures: loadNomenclatures,\r\n changeActiveItem: changeActiveItem,\r\n clearActiveItem: clearActiveItem,\r\n resetFilter: resetFilter\r\n };\r\n return service;\r\n\r\n function init() {\r\n if (!service.characteristics) {\r\n loadCharacteristics()\r\n .then(function(characteristics) {\r\n service.characteristics = characteristics;\r\n })\r\n }\r\n if (!service.nomenclatures) {\r\n loadNomenclatures()\r\n .then(function(nomenclatures) {\r\n service.nomenclatures = nomenclatures;\r\n })\r\n }\r\n }\r\n\r\n function resetFilter() {\r\n service.filter.casRn = null;\r\n service.filter.cus = null;\r\n service.filter.characteristic = '';\r\n service.filter.ecNumber = null;\r\n service.filter.inChICode = null;\r\n service.filter.inChIKey = null;\r\n service.filter.name = null;\r\n service.filter.nomenclature = '';\r\n service.filter.unNumber = null;\r\n service.filter.goodsCode = null;\r\n service.filter.pageNumber = 1;\r\n service.display = 'list';\r\n }\r\n\r\n function loadNewItems() {\r\n service.data.activeItem = null;\r\n service.filter.pageNumber = 1;\r\n return loadItems(service.filter);\r\n }\r\n\r\n function loadMoreItems() {\r\n return loadItems(service.filter);\r\n }\r\n\r\n function loadItems(filter) {\r\n\r\n var sort = service.orderBy.split('-')[0];\r\n var order = service.orderBy.split('-')[1];\r\n\r\n var url = common.config.apiHosts.generic + '/ecics/search' +\r\n '?goodscode=' + (filter.goodsCode || '') +\r\n '&casrn=' + (filter.casRn || '') +\r\n '&characteristic=' + (filter.characteristic || '') +\r\n '&cus=' + (filter.cus || '') +\r\n '&ecnumber=' + (filter.ecNumber || '') +\r\n '&inchicode=' + (filter.inChICode || '') +\r\n '&inchikey=' + (filter.inChIKey || '') +\r\n '&name=' + (filter.name || '') +\r\n '&ecicsnomenclature=' + (filter.nomenclature || '') +\r\n '&unnumber=' + (filter.unNumber || '') +\r\n '&PageIndex=' + (filter.pageNumber - 1) +\r\n '&PageSize=10' +\r\n '&lang=' + language.get() +\r\n // '&date=' + state.filter.date + // TODO: we could keep track of the history, in which case we'll need to pass a date\r\n '&Sort=' + sort +\r\n '&Order=' + order;\r\n\r\n // TODO: we could pass this parameter and not load the images on the server if we don't pass it\r\n // if (service.display === 'images') {\r\n // url += '&imagesearch=1';\r\n // }\r\n\r\n service.data.isLoading = true;\r\n return dataContext.get(url).then(function (paginatedItems) {\r\n service.data.isLoading = false;\r\n service.response = paginatedItems;\r\n if (service.response.Results.length > 0) {\r\n if (!activeCus) {\r\n changeActiveItem(service.response.Results[0].Cus);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function loadCharacteristics() {\r\n var url = common.config.apiHosts.generic + '/ecics/characteristics';\r\n return dataContext.get(url);\r\n }\r\n\r\n function loadNomenclatures() {\r\n var url = common.config.apiHosts.generic + '/ecics/nomenclatures';\r\n return dataContext.get(url);\r\n }\r\n\r\n function clearActiveItem() {\r\n service.data.activeItem = null;\r\n }\r\n\r\n function changeActiveItem(cus) {\r\n var url = common.config.apiHosts.generic + '/ecics/details/' + cus.trim() + '/';\r\n service.data.activeItem = null;\r\n service.data.isLoadingDetails = true;\r\n return dataContext.get(url).then(function (activeItem) {\r\n service.data.activeItem = activeItem;\r\n service.data.isLoadingDetails = false;\r\n _.forEach(service.response.Results, function (item) {\r\n item.active = false;\r\n if (item.Cus === cus) {\r\n item.active = true;\r\n }\r\n });\r\n });\r\n }\r\n\r\n function countPerChapter() {\r\n var url = common.config.apiHosts.generic + '/ecics/count-per-chapter/';\r\n return dataContext.get(url);\r\n }\r\n\r\n function countPerHeading(chapterNumber) {\r\n var url = common.config.apiHosts.generic + '/ecics/count-per-heading/' + chapterNumber.trim() + '/';\r\n return dataContext.get(url);\r\n }\r\n\r\n function countForGoodsCode(goodsCode) {\r\n var url = common.config.apiHosts.generic + '/ecics/count/' + goodsCode.trim() + '/';\r\n return dataContext.get(url);\r\n }\r\n\r\n function countForGoodsCodes(goodsCodes) {\r\n var goodsCodesQueryString = goodsCodes.join(',');\r\n var url = common.config.apiHosts.generic + '/ecics/count-for-goodscodes?goodscodes=' + goodsCodesQueryString;\r\n return dataContext.get(url);\r\n }\r\n}","angular.module('taric.exchangeRates', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('exchangeRatesPage', require('./components/exchange-rates-page'))\r\n .component('currencyPicker', require('./components/currency-picker'))\r\n .component('monetaryValueInput', require('./components/monetary-value-input'))\r\n // // Filters\r\n .filter('currencyTypeahead', require('./filters/currency-typeahead-filter'))\r\n // Modals\r\n .factory('currencySelectorModal', require('./modals/currency-selector'))\r\n // Services\r\n .factory('exchangeRateDataService', require('./services/exchange-rate-data'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/exchange-rates', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: { \r\n currency: '<', \r\n placeholder: '<', \r\n possibleCurrencies: '< ', \r\n selectionChanged: '&' \r\n },\r\n controller: currencyPickerController,\r\n templateUrl: 'exchange-rates/components/currency-picker.html'\r\n};\r\n\r\ncurrencyPickerController.$inject = ['currencySelectorModal'];\r\n\r\nfunction currencyPickerController(currencySelectorModal) {\r\n var vm = {\r\n $onInit: attached,\r\n clear: clear,\r\n currency: null,\r\n userInput: null,\r\n possibleCurrencies: null,\r\n itemSelected: itemSelected,\r\n onBlur: onBlur,\r\n onEnter: onEnter,\r\n showModal: showModal\r\n };\r\n\r\n return vm;\r\n\r\n function showModal() {\r\n currencySelectorModal\r\n .show(vm.possibleCurrencies, vm.currency)\r\n .result\r\n .then(itemSelected)\r\n .catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n function attached() {\r\n\r\n }\r\n\r\n function clear(ev) {\r\n vm.userInput = null;\r\n clearSelection();\r\n }\r\n\r\n function clearSelection() {\r\n vm.currency = null;\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ currency: null });\r\n\r\n }\r\n\r\n function onBlur() {\r\n \r\n }\r\n\r\n function onEnter() {\r\n \r\n }\r\n\r\n function itemSelected(item, model) {\r\n vm.currency = item;\r\n\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ currency: item });\r\n }\r\n}\r\n\r\n","module.exports = {\r\n controller: exchangeRatesController,\r\n templateUrl: 'exchange-rates/components/exchange-rates-page.html'\r\n};\r\n\r\nexchangeRatesController.$inject = [\r\n '$analytics', \r\n '$timeout',\r\n 'notificationsService', \r\n 'exchangeRateDataService', \r\n 'applicationStateService',\r\n];\r\n\r\nfunction exchangeRatesController(\r\n $analytics,\r\n $timeout, \r\n notifications, \r\n exchangeRateData, \r\n state\r\n) {\r\n\r\n var monetaryValuePrototype = {\r\n amount: 1,\r\n unit: 'EUR',\r\n originalAmount: 1,\r\n originalUnit: 'EUR'\r\n };\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n filter: \"\",\r\n isLoading: false,\r\n isLoadingCurrencies: false,\r\n exchangeRate: null,\r\n currencies: [],\r\n filteredCurrencies: [],\r\n selectedCurrency: null,\r\n monetaryValue: _.clone(monetaryValuePrototype),\r\n inverseMonetaryValue: _.clone(monetaryValuePrototype),\r\n referenceCountry: state.filter.referenceCountry,\r\n referenceDate: state.filter.date,\r\n decimalPlaces: 4,\r\n loadExchangeRate: loadExchangeRate,\r\n clearFilter: clearFilter,\r\n changeFilter: changeFilter,\r\n focusExchangeFilter: focusExchangeFilter,\r\n focusMonetaryFilter: focusMonetaryFilter\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/reference/exchange-rates');\r\n if (state.filter.referenceCountry === 'CH') {\r\n return;\r\n }\r\n var targetCurrency = exchangeRateData.getTargetCurrency(state.filter.referenceCountry);\r\n loadCurrencies(targetCurrency.code);\r\n notifications.subscribe('filter_date_changed', dateChanged);\r\n vm.monetaryValue.unit = targetCurrency.code;\r\n vm.monetaryValue.originalUnit = targetCurrency.code;\r\n vm.inverseMonetaryValue.unit = targetCurrency.code;\r\n vm.inverseMonetaryValue.originalUnit = targetCurrency.code;\r\n focusExchangeFilter();\r\n }\r\n\r\n function changeFilter() {\r\n vm.filteredCurrencies = vm.currencies.filter(function (el) {\r\n return el.code.toLowerCase().includes(vm.filter.toLowerCase()) || el.description.toLowerCase().includes(vm.filter.toLowerCase());\r\n });\r\n if(vm.filteredCurrencies.length === 1) {\r\n loadExchangeRate(vm.filteredCurrencies[0]);\r\n }\r\n }\r\n\r\n function clearFilter() {\r\n vm.filter = \"\";\r\n vm.filteredCurrencies = vm.currencies;\r\n focusExchangeFilter();\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function dateChanged() {\r\n vm.referenceDate = state.filter.date;\r\n var targetCurrency = exchangeRateData.getTargetCurrency(state.filter.referenceCountry);\r\n loadCurrencies(targetCurrency.code);\r\n focusExchangeFilter();\r\n }\r\n\r\n function loadExchangeRate(currency) {\r\n vm.isLoading = true;\r\n vm.selectedCurrency = currency.code;\r\n\r\n var targetCurrency = exchangeRateData.getTargetCurrency(state.filter.referenceCountry);\r\n \r\n exchangeRateData.getExchangeRate(currency.code, targetCurrency.code)\r\n .then(function (data) {\r\n vm.exchangeRate = data;\r\n vm.monetaryValue.originalUnit = currency.code;\r\n vm.monetaryValue.exchangeRate = data.APerB;\r\n vm.monetaryValue.amount = vm.monetaryValue.originalAmount / data.APerB;\r\n \r\n vm.inverseMonetaryValue.unit = currency.code;\r\n vm.inverseMonetaryValue.exchangeRate = 1.0 / data.APerB;\r\n vm.inverseMonetaryValue.amount = vm.inverseMonetaryValue.originalAmount * data.APerB;\r\n vm.isLoading = false;\r\n });\r\n }\r\n\r\n function loadCurrencies(targetCurrencyCode) {\r\n vm.isLoadingCurrencies = true;\r\n vm.exchangeRate = null;\r\n vm.selectedCurrency = null;\r\n exchangeRateData.getCurrencies(targetCurrencyCode)\r\n .then(function (data) {\r\n vm.currencies = data;\r\n vm.filteredCurrencies = data;\r\n vm.isLoadingCurrencies = false;\r\n if (vm.currencies && vm.currencies.length) {\r\n loadExchangeRate(vm.currencies[0]);\r\n }\r\n });\r\n\r\n }\r\n\r\n function focusExchangeFilter() {\r\n $timeout(function() {\r\n document.querySelector('.exchange-filter').focus();\r\n },0);\r\n }\r\n\r\n \r\n function focusMonetaryFilter() {\r\n $timeout(function() {\r\n document.querySelector('.monetary-filter:nth-child(1) input').focus();\r\n },0);\r\n }\r\n\r\n return vm;\r\n\r\n}\r\n","module.exports = {\r\n bindings: { \r\n monetaryValue: '<', \r\n twoWay: '<', \r\n currencyFixed: '<',\r\n decimalPlaces: '<',\r\n onChange: '&'\r\n },\r\n controller: monetaryValueInputController,\r\n templateUrl: 'exchange-rates/components/monetary-value-input.html'\r\n};\r\n\r\nmonetaryValueInputController.$inject = [\r\n 'currencySelectorModal', \r\n 'exchangeRateDataService', \r\n 'notificationsService',\r\n];\r\n\r\nfunction monetaryValueInputController(\r\n currencySelectorModal, \r\n exchangeRateDataService, \r\n notificationsService\r\n) {\r\n\r\n var vm = {\r\n $onChanges: $onChanges,\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n onChangeAmountInForeignCurrency: onChangeAmountInForeignCurrency,\r\n onChangeAmountInTargetCurrency: onChangeAmountInTargetCurrency,\r\n showModal: showModal,\r\n twoWay: false,\r\n currencies: []\r\n };\r\n \r\n return vm;\r\n\r\n function showModal() {\r\n exchangeRateDataService.getCurrenciesIncludingTargetCurrency()\r\n .then(function(currencies) {\r\n vm.currencies = currencies;\r\n })\r\n .then(function() {\r\n currencySelectorModal\r\n .show(vm.currencies, vm.monetaryValue.originalUnit)\r\n .result\r\n .then(itemSelected)\r\n .catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n })\r\n }\r\n\r\n function $onChanges() {\r\n // debugger;\r\n }\r\n\r\n function attached() {\r\n if (!vm.decimalPlaces) {\r\n vm.decimalPlaces = 5;\r\n }\r\n notificationsService.subscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function dateChanged() {\r\n if (vm.monetaryValue.unit !== vm.monetaryValue.originalUnit) {\r\n updateExchangeRate(vm.monetaryValue.originalUnit, vm.monetaryValue.unit);\r\n }\r\n }\r\n\r\n function updateExchangeRate(currencyA, currencyB) {\r\n // debugger;\r\n return exchangeRateDataService.getExchangeRate(currencyA, currencyB)\r\n .then(function (exchangeRate) {\r\n vm.monetaryValue.exchangeRate = exchangeRate.APerB;\r\n vm.monetaryValue.originalUnit = currencyA;\r\n onChangeAmountInForeignCurrency();\r\n });\r\n }\r\n\r\n function itemSelected(currency) {\r\n if (currency.code === vm.monetaryValue.unit) {\r\n vm.monetaryValue.originalUnit = currency.code;\r\n vm.monetaryValue.exchangeRate = 1;\r\n onChangeAmountInForeignCurrency();\r\n return;\r\n }\r\n return updateExchangeRate(currency.code, vm.monetaryValue.unit);\r\n }\r\n\r\n function onChangeAmountInForeignCurrency() {\r\n if (isNumericOrNumber(vm.monetaryValue.originalAmount) && _.isNumber(vm.monetaryValue.exchangeRate)) {\r\n vm.monetaryValue.amount = parseFloat(vm.monetaryValue.originalAmount) / vm.monetaryValue.exchangeRate;\r\n }\r\n else {\r\n vm.monetaryValue.amount = '';\r\n }\r\n if (vm.onChange) {\r\n vm.onChange(vm.monetaryValue);\r\n }\r\n }\r\n\r\n function onChangeAmountInTargetCurrency() {\r\n if (isNumericOrNumber(vm.monetaryValue.amount) && _.isNumber(vm.monetaryValue.exchangeRate)) {\r\n vm.monetaryValue.originalAmount = parseFloat(vm.monetaryValue.amount) * vm.monetaryValue.exchangeRate;\r\n }\r\n else {\r\n vm.monetaryValue.originalAmount = '';\r\n }\r\n if (vm.onChange) {\r\n vm.onChange(vm.monetaryValue);\r\n }\r\n }\r\n\r\n function isNumericOrNumber(input) {\r\n return _.isNumber(input) || isNumeric(input);\r\n }\r\n\r\n function isNumeric(str) {\r\n if (typeof str != \"string\") {\r\n return false; \r\n }\r\n return !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...\r\n !isNaN(parseFloat(str)); // ...and ensure strings of whitespace fail\r\n }\r\n}","module.exports = [currencyTypeaheadFilter];\r\n\r\n// Takes care of ordering the results of the currency code typeahed. The logic is as follows:\r\n// First, show the matches on the currency code, ordered by code\r\n// Next, show the matches on the beginning of the currency code name, ordered by name\r\n// Finally, show the matches anywhere else in the name, ordered by name\r\nfunction currencyTypeaheadFilter() {\r\n\r\n return function (currencies, query) {\r\n var result;\r\n if (query === null || query === undefined || query === '') {\r\n result = _.sortBy(currencies, function(currency) {\r\n return currency.code;\r\n });\r\n }\r\n else {\r\n var currencyCodeMatchPartition = _.partition(currencies, function(currency) {\r\n return currency.code.toLowerCase().indexOf(query.replace(' ', '').toLowerCase()) >= 0;\r\n });\r\n var currencyCodeMatchStartPartition = _.partition(currencyCodeMatchPartition[0], function(currency) {\r\n return currency.code.toLowerCase().indexOf(query.replace(' ', '').toLowerCase()) === 0;\r\n });\r\n\r\n var currencyStartMatches = _.sortBy(currencyCodeMatchStartPartition[0], function(currency) {\r\n return currency.code;\r\n });\r\n var currencyOtherMatches = _.sortBy(currencyCodeMatchStartPartition[1], function(currency) {\r\n return currency.code;\r\n });\r\n\r\n var otherMatches = _.sortBy(currencyCodeMatchPartition[1], 'description');\r\n\r\n var currencyNameStartMatchPartition = _.partition(otherMatches, function(currency) {\r\n return currency.description && currency.description.toLowerCase().indexOf(query.toLowerCase()) === 0;\r\n });\r\n\r\n var otherCurrencyNameMatches = _.filter(currencyNameStartMatchPartition[1], function(currency) {\r\n return currency.description && currency.description.toLowerCase().indexOf(query.toLowerCase()) > -1;\r\n });\r\n\r\n result = _.concat(currencyStartMatches, currencyOtherMatches, currencyNameStartMatchPartition[0], otherCurrencyNameMatches);\r\n }\r\n\r\n return putDefaultCurrenciesFirst(result);\r\n }\r\n}\r\n\r\nfunction isDefaultCurrency(currency) {\r\n return currency.code === 'EUR' || currency.code === 'GBP';\r\n}\r\n\r\nfunction putDefaultCurrenciesFirst(currencies) {\r\n var partition = _.partition(currencies, function(currency) {\r\n return isDefaultCurrency(currency);\r\n });\r\n return _.concat(partition[0], partition[1]);\r\n}\r\n","module.exports = ['$analytics', '$uibModal', currencyCodeSelectorModal];\r\n\r\nfunction currencyCodeSelectorModal($analytics, $uibModal) {\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n currencyCodeSelectorModalController.$inject = ['$uibModalInstance', 'possibleCurrencyCodes', 'currencyCode'];\r\n\r\n function currencyCodeSelectorModalController($uibModalInstance, possibleCurrencyCodes, currencyCode) {\r\n var vm = {\r\n currencyCode: currencyCode,\r\n cancel: cancel,\r\n possibleCurrencyCodes: possibleCurrencyCodes,\r\n ok: ok\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function ok(code) {\r\n $uibModalInstance.close(code);\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(possibleCurrencyCodes, currencyCode) {\r\n $analytics.eventTrack('open-modal-currency-selector', { category: 'exchange-rates' });\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: currencyCodeSelectorModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n currencyCode: function () {\r\n return currencyCode;\r\n },\r\n possibleCurrencyCodes: function () {\r\n return possibleCurrencyCodes;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'exchange-rates/modals/currency-selector.html',\r\n windowClass: 'modal-currency-code-selector'\r\n });\r\n\r\n modalInstance.rendered.then(function() {\r\n var elementToFocusOnInModal = document.querySelector('.modal.in .focus-on-open-modal');\r\n if (elementToFocusOnInModal) {\r\n elementToFocusOnInModal.focus();\r\n }\r\n });\r\n\r\n return modalInstance;\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['common', 'dataContext', 'applicationStateService', exchangeRateDataService];\r\n\r\nfunction exchangeRateDataService(common, context, state) {\r\n var service = {\r\n cachedExchangeRates: {},\r\n getCurrencies: getCurrencies,\r\n getCurrenciesIncludingTargetCurrency: getCurrenciesIncludingTargetCurrency,\r\n getExchangeRate: getExchangeRate,\r\n getTargetCurrency: getTargetCurrency\r\n };\r\n\r\n function getCurrencies(targetCurrency) {\r\n var url = common.config.apiHosts.dtv + '/exchange-rate-currencies/' + targetCurrency +\r\n '?lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n \r\n return context.get(url)\r\n .then(function (currencies) {\r\n return _.filter(currencies, function(currency) {\r\n return currency.code !== targetCurrency;\r\n })\r\n });\r\n }\r\n\r\n function getTargetCurrency(referenceCountry) {\r\n var gbp = {\r\n code: 'GBP',\r\n description: 'Pound'\r\n };\r\n var eur = {\r\n code: 'EUR',\r\n description: 'Euro'\r\n };\r\n var sek = {\r\n code: 'SEK',\r\n description: 'Swedish Krona'\r\n };\r\n if (referenceCountry === 'GB') {\r\n return gbp;\r\n }\r\n // else if (referenceCountry === 'SE') {\r\n // return sek;\r\n // }\r\n else {\r\n return eur;\r\n }\r\n }\r\n\r\n function getCurrenciesIncludingTargetCurrency() {\r\n \r\n var targetCurrency = getTargetCurrency(state.filter.referenceCountry);\r\n return getCurrencies(targetCurrency.code)\r\n .then(function (currencies) {\r\n return _.concat([targetCurrency], currencies);\r\n });\r\n }\r\n\r\n var memoized = _.memoize(getExchangeRateForReferenceCountryAtDate, function(currencyA, currencyB, referenceCountry, referenceDate) {\r\n return currencyA + '|' + currencyB + '|' + referenceCountry + '|' + referenceDate;\r\n });\r\n\r\n function getExchangeRate(currencyA, currencyB) {\r\n return memoized(currencyA, currencyB, state.filter.referenceCountry, state.filter.date);\r\n }\r\n\r\n function getExchangeRateForReferenceCountryAtDate(currencyA, currencyB, referenceCountry, referenceDate) {\r\n var url = common.config.apiHosts.dtv + '/exchange-rates/' + currencyA + '/' + currencyB +\r\n '?referencecountry=' + referenceCountry +\r\n '&date=' + referenceDate;\r\n \r\n return context.get(url);\r\n }\r\n\r\n return service;\r\n}","angular.module('taric.ezt', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('eztExciseCodePicker', require('./components/ezt-excise-code-picker'))\r\n .component('eztNomenclature', require('./components/ezt-nomenclature'))\r\n .component('eztHinweise', require('./components/ezt-hinweise'))\r\n .component('eztTextsPage', require('./components/ezt-texts-page'))\r\n // Controllers\r\n // Filters\r\n .filter('eztExciseCodeTypeahead', require('./filters/ezt-excise-code-typeahead-filter'))\r\n // Modals\r\n .factory('eztExciseCodeSelectorModal', require('./modals/ezt-excise-code-selector'))\r\n // Services\r\n .factory('eztDataService', require('./services/ezt-data'))\r\n ;\r\n\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/texts-german-customs', {\r\n template: ''\r\n })\r\n .when('/texts-german-customs/:documentType/:mainDocument', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n exciseCode: '<',\r\n exciseNomenclature: '<',\r\n selectionChanged: '&',\r\n validation: '<' \r\n },\r\n controller: eztExciseCodePickerController,\r\n templateUrl: 'ezt/components/ezt-excise-code-picker.html'\r\n};\r\n\r\neztExciseCodePickerController.$inject = [\r\n 'eztExciseCodeSelectorModal'\r\n];\r\n\r\nfunction eztExciseCodePickerController(\r\n eztExciseCodeSelectorModal\r\n) {\r\n var vm = {\r\n clear: clear,\r\n itemSelected: itemSelected,\r\n onBlur: onBlur,\r\n onEnter: onEnter,\r\n showModal: showModal\r\n }\r\n return vm;\r\n\r\n function clear(ev) {\r\n vm.userInput = null;\r\n clearSelection();\r\n }\r\n\r\n function clearSelection() {\r\n vm.exciseCode = null;\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ exciseCode: null });\r\n\r\n }\r\n\r\n function onBlur() {\r\n \r\n }\r\n\r\n function onEnter() {\r\n \r\n }\r\n\r\n function itemSelected(item) {\r\n vm.exciseCode = item;\r\n \r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ eztExciseCode: item });\r\n }\r\n\r\n function showModal() {\r\n eztExciseCodeSelectorModal\r\n .show(vm.exciseNomenclature, vm.exciseCode)\r\n .result\r\n .then(itemSelected)\r\n .catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n}","module.exports = {\r\n bindings: {\r\n countryCode: '<',\r\n currentCode: '<',\r\n hinweise: '<'\r\n },\r\n controller: eztHinweiseController,\r\n templateUrl: 'ezt/components/ezt-hinweise.html'\r\n};\r\n\r\neztHinweiseController.$inject = ['countryDataService'];\r\n\r\nfunction eztHinweiseController(countryDataService) {\r\n var vm = {\r\n getRelevantHinweise: getRelevantHinweise\r\n }\r\n return vm;\r\n\r\n function getRelevantHinweise() {\r\n if (!vm.hinweise) {\r\n return vm.hinweise;\r\n }\r\n return _.chain(vm.hinweise)\r\n .filter(hinweisIsValidForNationalGoodsNomenclature)\r\n .filter(hinweisIsValidForCountryCode)\r\n .value();\r\n }\r\n\r\n function hinweisIsValidForNationalGoodsNomenclature(hinweis) {\r\n if (_.endsWith(hinweis.NationalGoodsNomenclatureId, '0')) {\r\n return true;\r\n }\r\n return hinweis.NationalGoodsNomenclatureId === vm.currentCode;\r\n }\r\n\r\n function hinweisIsValidForCountryCode(hinweis) {\r\n if (!vm.countryCode) {\r\n return true;\r\n }\r\n if (!hinweis.GeographicalAreaId) {\r\n return true;\r\n }\r\n if (hinweis.GeographicalAreaId === vm.countryCode) {\r\n return true;\r\n }\r\n var regionMembers = countryDataService.regions[hinweis.GeographicalAreaId];\r\n if (regionMembers && _.includes(regionMembers, vm.countryCode)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}","module.exports = {\r\n bindings: {\r\n currentCode: '<',\r\n nomenclature: '<',\r\n onClickRow: '&',\r\n validation: '<' \r\n },\r\n controller: eztNomenclatureController,\r\n templateUrl: 'ezt/components/ezt-nomenclature.html'\r\n};\r\n\r\nfunction eztNomenclatureController() {\r\n var vm = {\r\n clickEztNomenclatureLine: clickEztNomenclatureLine\r\n }\r\n\r\n return vm;\r\n\r\n function clickEztNomenclatureLine(line) {\r\n if (line.ProdLin === '80' && vm.onClickRow) {\r\n vm.onClickRow({ commodityCode: line.CommodityCode });\r\n }\r\n }\r\n}","module.exports = {\r\n controller: EztTextsController,\r\n templateUrl: 'ezt/components/ezt-texts-page.html'\r\n};\r\n\r\nEztTextsController.$inject = [\r\n '$q', \r\n '$routeParams', \r\n 'eztDataService'\r\n];\r\n\r\nfunction EztTextsController(\r\n $q, \r\n $routeParams, \r\n eztDataService\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n scrollToDocument: scrollToDocument\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n var promises = [loadIndex()];\r\n if ($routeParams.documentType && $routeParams.mainDocument) {\r\n promises.push(loadDocuments($routeParams.documentType, $routeParams.mainDocument));\r\n }\r\n $q.all(promises);\r\n }\r\n\r\n function scrollToDocument(eztDocument) {\r\n document\r\n .querySelector('.' + eztDocument.HtmlClassName)\r\n .scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n \r\n function loadIndex() {\r\n vm.isLoadingIndex = true;\r\n return eztDataService.loadEztTextMainIndex()\r\n .then(function (index) {\r\n vm.isLoadingIndex = false;\r\n vm.mainIndex = index;\r\n });\r\n }\r\n\r\n function loadDocuments(documentType, mainDocument) {\r\n vm.isLoadingDocuments = true;\r\n return eztDataService.loadEztDocuments(documentType, mainDocument)\r\n .then(function (documents) {\r\n vm.isLoadingDocuments = false;\r\n vm.documents = documents;\r\n })\r\n }\r\n}","module.exports = [eztExciseCodeTypeaheadFilter];\r\n\r\n// Takes care of ordering the results of the excise code typeahed. The logic is as follows:\r\n// First, show the matches on the excise code, ordered by code (Id)\r\n// Next, show the matches on the beginning of the excise code description, ordered by description\r\n// Finally, show the matches anywhere else in the description, ordered by description\r\nfunction eztExciseCodeTypeaheadFilter() {\r\n\r\n return function (exciseCodes, query) {\r\n if (query === null || query === undefined || query === '') {\r\n return _.sortBy(exciseCodes, function(exciseCode) {\r\n return exciseCode.Id + exciseCode.ProdLin;\r\n });\r\n }\r\n else {\r\n return _.chain(exciseCodes).filter(function (exciseCode) {\r\n return exciseCode.ProdLin !== '80' || \r\n exciseCode.Id.toLowerCase().indexOf(query.replace(' ', '').toLowerCase()) >= 0 ||\r\n exciseCode.Description.toLowerCase().indexOf(query.toLowerCase()) >= 0;\r\n }).sortBy(function(exciseCode) {\r\n return exciseCode.Id + exciseCode.ProdLin;\r\n }).value();\r\n }\r\n }\r\n}\r\n\r\n\r\n","module.exports = ['$analytics', '$uibModal', eztExciseCodeSelectorModal];\r\n\r\nfunction eztExciseCodeSelectorModal($analytics, $uibModal) {\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n eztExciseCodeSelectorModalController.$inject = ['$uibModalInstance', 'exciseNomenclature', 'exciseCode'];\r\n\r\n function eztExciseCodeSelectorModalController($uibModalInstance, exciseNomenclature, exciseCode) {\r\n var vm = {\r\n exciseCode: exciseCode,\r\n cancel: cancel,\r\n exciseNomenclature: exciseNomenclature,\r\n ok: ok\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function ok(code) {\r\n if (code.ProdLin === '80') {\r\n $uibModalInstance.close(code);\r\n }\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(exciseNomenclature, exciseCode) {\r\n $analytics.eventTrack('open-modal-ezt-excise-code-selector', { category: 'additional-codes' });\r\n\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: eztExciseCodeSelectorModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n exciseCode: function () {\r\n return exciseCode;\r\n },\r\n exciseNomenclature: function () {\r\n return exciseNomenclature;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'ezt/modals/ezt-excise-code-selector.html',\r\n windowClass: 'modal-ezt-excise-code-selector'\r\n });\r\n\r\n modalInstance.rendered.then(function() {\r\n var elementToFocusOnInModal = document.querySelector('.modal.in .focus-on-open-modal');\r\n if (elementToFocusOnInModal) {\r\n elementToFocusOnInModal.focus();\r\n }\r\n });\r\n\r\n return modalInstance;\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = [\r\n 'common', \r\n 'dataContext', \r\n 'applicationStateService',\r\n eztDataService\r\n];\r\n\r\nfunction eztDataService(\r\n common, \r\n dataContext,\r\n state\r\n) {\r\n var service = {\r\n loadEztExciseNomenclature: loadEztExciseNomenclature,\r\n loadEztNomenclature: loadEztNomenclature,\r\n loadEztHinweise: loadEztHinweise,\r\n loadEztDocuments: loadEztDocuments,\r\n loadEztFootnote: loadEztFootnote,\r\n loadEztTextMainIndex: loadEztTextMainIndex\r\n };\r\n return service;\r\n\r\n function loadEztDocuments(documentType, mainDocument) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/ezt/texts/' + documentType + '/' + mainDocument +\r\n '?referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n \r\n return dataContext.get(url);\r\n }\r\n\r\n function loadEztTextMainIndex() {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/ezt/texts' +\r\n '?referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n \r\n return dataContext.get(url);\r\n }\r\n\r\n function loadEztNomenclature(commodityCode) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/ezt/nomenclature/' + commodityCode +\r\n '?movement=' + state.filter.movement +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry;\r\n\r\n if (state.filter.date !== null) {\r\n url += '&date=' + state.filter.date;\r\n }\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function loadEztHinweise(commodityCode) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/ezt/hinweise/' + commodityCode +\r\n '?movement=' + state.filter.movement +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry;\r\n\r\n if (state.filter.date !== null) {\r\n url += '&date=' + state.filter.date;\r\n }\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function loadEztFootnote(footnoteType, footnoteCode) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/ezt/footnotes/' + footnoteType + '/' + footnoteCode +\r\n '?movement=' + state.filter.movement +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry;\r\n\r\n if (state.filter.date !== null) {\r\n url += '&date=' + state.filter.date;\r\n }\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function loadEztExciseNomenclature(exciseTypeId) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/ezt/excise-nomenclature/' + exciseTypeId +\r\n '?movement=' + state.filter.movement +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry;\r\n\r\n if (state.filter.date !== null) {\r\n url += '&date=' + state.filter.date;\r\n }\r\n\r\n return dataContext.get(url);\r\n }\r\n}","angular.module('taric.footnotes', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('footnoteOverviewPage', require('./components/footnote-overview-page'))\r\n .component('footnoteButtons', require('./components/footnote-buttons'))\r\n .factory('footnoteDataService', require('./services/footnote-data'))\r\n .factory('footnoteModal', require('./modals/footnote'))\r\n .factory('footnoteModalsService', require('./modals/modals'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/footnotes', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n footnotes: '<'\r\n },\r\n controller: footnoteButtonsController,\r\n templateUrl: 'footnotes/components/footnote-buttons.html'\r\n};\r\n\r\nfootnoteButtonsController.$inject = [\r\n 'common', \r\n 'eztDataService',\r\n 'footnoteDataService', \r\n 'footnoteModalsService'\r\n];\r\n\r\nfunction footnoteButtonsController(\r\n common, \r\n eztDataService, \r\n footnoteData, \r\n footnoteModals\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n footnotes: [],\r\n footnotesByType: [],\r\n processFootnotes: processFootnotes,\r\n showFootnote: showFootnote\r\n };\r\n\r\n function attached() {\r\n vm.footnotesByType = processFootnotes(vm.footnotes);\r\n }\r\n\r\n function processFootnotes(footnotes) {\r\n if (!footnotes || footnotes.length == 0)\r\n return null;\r\n\r\n var footnotesByType = _.reduce(footnotes, function (accumulator, footnote) {\r\n if (accumulator[footnote.type] === undefined) {\r\n accumulator[footnote.type] = [footnote.code];\r\n }\r\n else {\r\n accumulator[footnote.type].push(footnote.code);\r\n }\r\n return accumulator;\r\n }, []);\r\n\r\n footnotesByType = _.mapValues(footnotesByType, function(codes, type) {\r\n if (codes && codes.length >= 5) {\r\n return [codes.length + (common.language.get() === 'nl' ? ' voetnoten' : ' footnotes')];\r\n }\r\n return codes;\r\n });\r\n\r\n return footnotesByType;\r\n }\r\n\r\n function showFootnote(footnote, footnotes) {\r\n return common.$q.all(_.map(footnotes, function(fn) {\r\n if (fn.type === \"TS\" || fn.origin === 'IT') {\r\n return fn;\r\n }\r\n if (fn.origin === 'DE') {\r\n return eztDataService.loadEztFootnote(fn.type, fn.code);\r\n }\r\n else {\r\n return footnoteData.getFootnote(fn.type, fn.code);\r\n }\r\n }))\r\n .then(function(footnotesWithDetails) {\r\n footnoteModals.footnote.show(footnote, footnotesWithDetails);\r\n });\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n controller: footnoteOverviewController,\r\n templateUrl: 'footnotes/components/footnote-overview-page.html'\r\n};\r\n\r\nfootnoteOverviewController.$inject = [\r\n '$analytics', \r\n '$timeout',\r\n 'notificationsService', \r\n 'footnoteDataService', \r\n 'applicationStateService'\r\n];\r\n\r\nfunction footnoteOverviewController(\r\n $analytics,\r\n $timeout, \r\n notifications, \r\n footnoteData, \r\n state\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n filter: \"\",\r\n filterType: \"\",\r\n isLoading: false,\r\n isLoadingTypes: false,\r\n footnotes: [],\r\n filteredFootnotes: [],\r\n footnoteTypes: [],\r\n filteredFootnoteTypes: [],\r\n selectedType: null,\r\n referenceCountry: state.filter.referenceCountry,\r\n loadFootnote: loadFootnotes,\r\n clearFilter: clearFilter,\r\n changeFilter: changeFilter,\r\n clearFilterType: clearFilterType,\r\n changeFilterType: changeFilterType,\r\n focusInputTypeField: focusInputTypeField,\r\n focusInputField: focusInputField\r\n };\r\n\r\n\r\n function focusInputTypeField() {\r\n $timeout(function(){\r\n var inputEL = angular.element(document.querySelector('#inputFilterType'));\r\n if (inputEL) {\r\n inputEL[0].focus();\r\n }\r\n }, 0);\r\n }\r\n\r\n function focusInputField() {\r\n $timeout(function(){\r\n var inputEL = angular.element(document.querySelector('#inputFilter'));\r\n if (inputEL) {\r\n inputEL[0].focus();\r\n }\r\n }, 0);\r\n }\r\n\r\n function attached() {\r\n $analytics.pageTrack('/reference/footnotes');\r\n loadTypes();\r\n notifications.subscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function dateChanged() {\r\n loadTypes();\r\n }\r\n\r\n function clearFilter() {\r\n vm.filter = '';\r\n vm.filteredFootnotes = vm.footnotes;\r\n focusInputField();\r\n }\r\n\r\n function changeFilter() {\r\n vm.filteredFootnotes = vm.footnotes.filter(function (el) {\r\n return (el.type.toLowerCase() + el.code.toLowerCase()).includes(vm.filter.toLowerCase()) || \r\n el.description.toLowerCase().includes(vm.filter.toLowerCase());\r\n });\r\n }\r\n\r\n function clearFilterType() {\r\n clearFilter();\r\n vm.filterType = \"\";\r\n vm.filteredFootnoteTypes = vm.footnoteTypes;\r\n vm.footnotes = [];\r\n vm.filteredFootnotes = [];\r\n vm.selectedType = null;\r\n focusInputTypeField();\r\n }\r\n\r\n function changeFilterType() {\r\n vm.filteredFootnoteTypes = vm.footnoteTypes.filter(function (el) {\r\n return el.code.toLowerCase().includes(vm.filterType.toLowerCase()) || el.description.toLowerCase().includes(vm.filterType.toLowerCase());\r\n });\r\n if(vm.filteredFootnoteTypes.length === 1) {\r\n loadFootnotes(vm.filteredFootnoteTypes[0]);\r\n }\r\n if(vm.filteredFootnoteTypes.length === 0) {\r\n vm.footnotes = [];\r\n vm.filteredFootnotes = [];\r\n vm.selectedType = null;\r\n vm.filter = \"\";\r\n }\r\n }\r\n\r\n\r\n function loadFootnotes(type) {\r\n if (vm.referenceCountry === 'CH') {\r\n return;\r\n }\r\n vm.isLoading = true;\r\n vm.selectedType = type.code;\r\n vm.filter = \"\";\r\n footnoteData.getFootnotes(type.code)\r\n .then(function (data) {\r\n vm.filteredFootnotes = data;\r\n vm.footnotes = data;\r\n vm.isLoading = false;\r\n focusInputField();\r\n });\r\n }\r\n\r\n function loadTypes() {\r\n if (vm.referenceCountry === 'CH') {\r\n return;\r\n }\r\n vm.isLoadingTypes = true;\r\n vm.footnotes = [];\r\n vm.filteredFootnoteTypes = [];\r\n vm.filter = \"\";\r\n vm.filterType = \"\";\r\n vm.selectedType = null;\r\n footnoteData.getTypes()\r\n .then(function (data) {\r\n vm.footnoteTypes = data;\r\n vm.filteredFootnoteTypes = data;\r\n vm.isLoadingTypes = false;\r\n focusInputTypeField();\r\n });\r\n }\r\n\r\n return vm;\r\n\r\n}\r\n","module.exports = ['$analytics', '$uibModal', footnoteModal];\r\n\r\nfunction footnoteModal($analytics, $uibModal) {\r\n var modal = {\r\n footnotes: [],\r\n show: showModal\r\n };\r\n\r\n footnoteModalController.$inject = ['$uibModalInstance', 'footnote', 'footnotes'];\r\n\r\n function footnoteModalController($uibModalInstance, footnote, footnotes) {\r\n\r\n var ctrlFootnoteModal = {\r\n cancel: cancel,\r\n footnote: footnote,\r\n footnotes: footnotes\r\n };\r\n\r\n function cancel() {\r\n// $(\".page-dashboard, .taric-page-content\").removeClass(\"noprint\");\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n return ctrlFootnoteModal;\r\n }\r\n\r\n function showModal(footnote, footnotes) {\r\n $analytics.eventTrack('open-modal-footnotes', { category: 'footnotes' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n controller: footnoteModalController,\r\n controllerAs: 'ctrlFootnoteModal',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n footnote: function () {\r\n return footnote;\r\n },\r\n footnotes: function () {\r\n return footnotes;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'footnotes/modals/footnote.html',\r\n windowClass: 'modal-footnote'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['footnoteModal', footnoteModalsService];\r\n\r\nfunction footnoteModalsService(footnoteModal) {\r\n\r\n var service = {\r\n footnote: footnoteModal\r\n };\r\n\r\n return service;\r\n\r\n}","module.exports = ['common', 'dataContext', 'applicationStateService', footnoteDataService];\r\n\r\nfunction footnoteDataService(common, context, state) {\r\n\r\n var service = {\r\n getFootnote: getFootnote,\r\n getFootnotes: getFootnotes,\r\n getTypes: getTypes\r\n };\r\n\r\n function getFootnote(footnoteType, footnoteCode) {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/footnotes/' + footnoteType + '/' + footnoteCode +\r\n '?lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n function getFootnotes(footnoteType) {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/footnotes' +\r\n '?type=' + footnoteType +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n function getTypes() {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/footnotes/types' +\r\n '?origin=EU,' + state.filter.referenceCountry +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n return service;\r\n\r\n}\r\n","angular.module('taric.geography', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('regionOverviewPage', require('./components/region-overview-page'))\r\n .component('countryPicker', require('./components/country-picker'))\r\n .component('regionDisplay', require('./components/region-display'))\r\n .factory('countryDataService', require('./services/country-data'))\r\n .factory('countryModals', require('./modals/modals'))\r\n .factory('regionDataService', require('./services/region-data'))\r\n .factory('regionModal', require('./modals/region'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/regions', {\r\n template: ''\r\n })\r\n ;\r\n}","module.exports = { \r\n bindings: { \r\n autoFocus: '<',\r\n countryCode: '<',\r\n possibleCountries: '<',\r\n rememberCountry: '<',\r\n selectionChanged: '&',\r\n showRememberCountryToggle: '<', \r\n validation: '<' \r\n },\r\n controller: countryPickerController,\r\n templateUrl: 'geography/components/country-picker.html'\r\n};\r\n\r\ncountryPickerController.$inject = ['$element', '$timeout'];\r\n\r\nfunction countryPickerController($element, $timeout) {\r\n var vm = {\r\n $onInit: attached,\r\n $postLink: postLink,\r\n clear: clear,\r\n country: null,\r\n itemSelected: itemSelected,\r\n onBlur: onBlur,\r\n onEnter: onEnter,\r\n toggleRememberCountry: toggleRememberCountry\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n if (vm.countryCode) {\r\n vm.country = _.find( vm.possibleCountries, function(country) {\r\n return country.code === vm.countryCode;\r\n });\r\n }\r\n }\r\n\r\n function postLink() {\r\n if (vm.autoFocus) {\r\n $timeout(function(){\r\n var rootEl = $element[0];\r\n var inputEl = rootEl.getElementsByClassName('js-autofocus')[0];\r\n inputEl.focus();\r\n }, 0);\r\n }\r\n }\r\n\r\n function clear() {\r\n vm.country = null;\r\n clearSelection();\r\n }\r\n\r\n function clearSelection() {\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ country: null, rememberCountry: vm.rememberCountry }); \r\n }\r\n\r\n function onBlur() {\r\n if (!vm.country) {\r\n clearSelection();\r\n }\r\n }\r\n\r\n function onEnter() {\r\n if (!vm.country) {\r\n clearSelection();\r\n }\r\n }\r\n\r\n function itemSelected(item, model) {\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ country: item, rememberCountry: vm.rememberCountry });\r\n }\r\n\r\n function toggleRememberCountry() {\r\n vm.rememberCountry = !vm.rememberCountry;\r\n if (vm.selectionChanged) {\r\n vm.selectionChanged({ country: vm.country, rememberCountry: vm.rememberCountry });\r\n }\r\n }\r\n}\r\n","module.exports = {\r\n bindings: { \r\n region: '<' \r\n },\r\n controller: regionDisplayController,\r\n templateUrl: 'geography/components/region-display.html'\r\n};\r\n\r\nregionDisplayController.$inject = ['countryModals'];\r\n\r\nfunction regionDisplayController(countryModals) {\r\n\r\n return {\r\n showRegion: function (region) {\r\n countryModals.region.show(region);\r\n }\r\n };\r\n\r\n}\r\n","module.exports = {\r\n controller: regionOverviewController,\r\n templateUrl: 'geography/components/region-overview-page.html'\r\n};\r\n\r\nregionOverviewController.$inject = [\r\n '$analytics', \r\n '$timeout',\r\n 'notificationsService', \r\n 'regionDataService',\r\n];\r\n\r\nfunction regionOverviewController(\r\n $analytics,\r\n $timeout, \r\n notifications, \r\n regionData\r\n) {\r\n \r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n regionFilter: '',\r\n countryFilter: '',\r\n isLoading: false,\r\n isLoadingRegion: false,\r\n countries: [],\r\n regions: [],\r\n filteredCountries: [],\r\n filteredRegions: [],\r\n selectedRegion: null,\r\n loadRegion: loadRegion,\r\n clearRegionFilter: clearRegionFilter,\r\n changeRegionFilter: changeRegionFilter,\r\n clearCountryFilter: clearCountryFilter,\r\n changeCountryFilter: changeCountryFilter,\r\n focusRegionFilter: focusRegionFilter,\r\n focusCountryFilter: focusCountryFilter,\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/reference/geographical-areas');\r\n loadRegions();\r\n notifications.subscribe('filter_date_changed', loadRegions);\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_date_changed', loadRegions);\r\n }\r\n\r\n function clearRegionFilter() {\r\n clearCountryFilter()\r\n vm.regionFilter = '';\r\n vm.filteredRegions = vm.regions;\r\n vm.countries = [];\r\n vm.filteredCountries = [];\r\n focusRegionFilter();\r\n }\r\n\r\n function changeRegionFilter() {\r\n vm.filteredRegions = vm.regions.filter(function (el) {\r\n return el.code.toLowerCase().includes(vm.regionFilter.toLowerCase()) || el.name.toLowerCase().includes(vm.regionFilter.toLowerCase());\r\n });\r\n if(vm.filteredRegions.length === 1) {\r\n loadRegion(vm.filteredRegions[0]);\r\n }\r\n if(vm.filteredRegions.length === 0) {\r\n vm.selectedRegion = null;\r\n vm.countries = [];\r\n vm.filteredCountries = [];\r\n vm.countryFilter = \"\";\r\n }\r\n }\r\n\r\n function clearCountryFilter() {\r\n vm.countryFilter = '';\r\n vm.filteredCountries = vm.countries;\r\n focusCountryFilter();\r\n }\r\n\r\n function changeCountryFilter() {\r\n vm.filteredCountries = vm.countries.filter(function (el) {\r\n return el.code.toLowerCase().includes(vm.countryFilter.toLowerCase()) || el.name.toLowerCase().includes(vm.countryFilter.toLowerCase());\r\n });\r\n }\r\n\r\n function loadRegions() {\r\n vm.isLoading = true;\r\n vm.countries = [];\r\n vm.selectedRegion = null;\r\n vm.regionFilter = '';\r\n regionData.get()\r\n .then(function (data) {\r\n vm.filteredRegions = data;\r\n vm.regions = data;\r\n vm.isLoading = false;\r\n focusRegionFilter();\r\n });\r\n }\r\n\r\n function loadRegion(region) {\r\n vm.isLoadingRegion = true;\r\n vm.selectedRegion = region.code;\r\n vm.countryFilter = \"\";\r\n regionData.getByCode(region.code)\r\n .then(function (data) {\r\n vm.filteredCountries = data;\r\n vm.countries = data;\r\n vm.isLoadingRegion = false;\r\n focusCountryFilter();\r\n });\r\n }\r\n\r\n function focusRegionFilter() {\r\n $timeout(function() {\r\n document.querySelector('.region-filter').focus();\r\n },0);\r\n }\r\n\r\n function focusCountryFilter() {\r\n $timeout(function() {\r\n document.querySelector('.country-filter').focus();\r\n },0);\r\n }\r\n\r\n return vm;\r\n}\r\n","module.exports = ['regionModal', countryModalsService];\r\n\r\nfunction countryModalsService(regionModal) {\r\n\r\n var service = {\r\n region: regionModal\r\n };\r\n\r\n return service;\r\n\r\n}\r\n","module.exports = ['$analytics', '$uibModal', regionModal];\r\n\r\nfunction regionModal($analytics, $uibModal) {\r\n var modal = {\r\n region: null,\r\n show: showModal\r\n };\r\n\r\n regionModalController.$inject = ['$uibModalInstance', 'countryDataService', 'region'];\r\n\r\n function regionModalController($uibModalInstance, countryDataService, region) {\r\n var vm = {\r\n cancel: cancel,\r\n countries: [],\r\n region: region,\r\n searchParameter: ''\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n var countryCodes = countryDataService.regions[region.code];\r\n vm.countries = _.map(countryCodes, function(countryCode) {\r\n return {\r\n code: countryCode,\r\n name: countryDataService.countries[countryCode]\r\n };\r\n });\r\n\r\n vm.countries = vm.countries.sort(function (a, b) {\r\n if (a.name > b.name)\r\n return 1;\r\n else if (a.name < b.name)\r\n return -1;\r\n return 0;\r\n });\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(region) {\r\n $analytics.eventTrack('open-modal-region-members', { category: 'geography' });\r\n var modalInstance = $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: regionModalController,\r\n controllerAs: 'ctrlRegionModal',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n region: function () {\r\n return region;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'geography/modals/region.html',\r\n windowClass: 'modal-region'\r\n });\r\n\r\n modalInstance.rendered.then(function() {\r\n var elementToFocusOnInModal = document.querySelector('.modal.in .focus-on-open-modal');\r\n if (elementToFocusOnInModal) {\r\n elementToFocusOnInModal.focus();\r\n }\r\n });\r\n\r\n return modalInstance.result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['common', 'dataContext', '$q', 'applicationStateService', 'notificationsService', countryDataService];\r\n\r\nfunction countryDataService(common, context, $q, state, notifications) {\r\n\r\n var service = {\r\n countries: null,\r\n ergaOmnesCountries: null,\r\n regions: null, // list of country codes per region\r\n getCountry: getCountry,\r\n getCountries: getCountries,\r\n preloadCountries: preloadCountries,\r\n getEuCountries: getEuCountries,\r\n preloadRegions: preloadRegions,\r\n init: init\r\n };\r\n\r\n notifications.subscribe('filter_date_changed', init);\r\n\r\n return service;\r\n\r\n function init() {\r\n return $q.all([ preloadCountries(), preloadRegions() ])\r\n .then(function() {\r\n return initErgaOmnesCountries()\r\n });\r\n }\r\n\r\n function getErgaOmnesRegionCode() {\r\n if (state.filter.referenceCountry == 'CH') {\r\n return '200000';\r\n }\r\n return '1011';\r\n }\r\n\r\n function initErgaOmnesCountries() {\r\n var ergaOmnesRegionCode = getErgaOmnesRegionCode();\r\n service.ergaOmnesCountries = _.chain(service.regions[ergaOmnesRegionCode])\r\n .map(function(countryCode) {\r\n return {\r\n code: countryCode,\r\n name: service.countries[countryCode],\r\n searchDisplay: countryCode + ' — ' + service.countries[countryCode]\r\n };\r\n }).filter(function(country) {\r\n return country.name !== undefined && (country.code === 'EU' || country.code !== state.filter.referenceCountry);\r\n }).sortBy(function(country) {\r\n return country.name;\r\n }).value();\r\n }\r\n\r\n function getCountry(countryCode) {\r\n if (countryCode === null || countryCode === undefined)\r\n return countryCode;\r\n if (service.countries === null)\r\n service.preloadCountries();\r\n return service.countries[countryCode];\r\n }\r\n\r\n function getEuCountries(q) {\r\n if (state.filter.referenceCountry == 'CH') {\r\n q.regionCode = '100001';\r\n }\r\n else {\r\n q.regionCode = '1010';\r\n }\r\n return getCountries(q);\r\n }\r\n\r\n function getCountries(q) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/countries' +\r\n '?referenceCountry=' + q.referenceCountry +\r\n '&lang=' + common.language.get() +\r\n '&date=' + state.filter.date;\r\n if (q.regionCode) {\r\n url += '®ion=' + q.regionCode;\r\n }\r\n return context.get(url);\r\n }\r\n\r\n function preloadCountries(regionCode) {\r\n var qCountriesLoaded = common.$q.defer();\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/countries' +\r\n '?referenceCountry=' + state.filter.referenceCountry +\r\n '&lang=' + common.language.get() +\r\n '&date=' + state.filter.date;\r\n if (regionCode) {\r\n url += '®ion=' + regionCode;\r\n }\r\n context.get(url).then(function (data) {\r\n service.countries = {};\r\n _.forEach(data, function (country) {\r\n if (!service.countries[country.code]) {\r\n service.countries[country.code] = country.name;\r\n }\r\n });\r\n qCountriesLoaded.resolve();\r\n });\r\n\r\n return qCountriesLoaded.promise;\r\n }\r\n\r\n function preloadRegions() {\r\n var qRegionsLoaded = common.$q.defer();\r\n\r\n // TODO: update this to be ready for the situation after Brexit so the UK version doesn't automatically get all EU regions\r\n var url = common.config.apiHosts[common.config.currentApi] + '/regions/members' +\r\n '?origin=EU,' + state.filter.referenceCountry +\r\n '&referenceCountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n context.get(url).then(function (data) {\r\n service.regions = {};\r\n _.forEach(data, function (region) {\r\n if (!service.regions[region.code]) {\r\n service.regions[region.code] = region.countryCodes;\r\n }\r\n });\r\n qRegionsLoaded.resolve();\r\n });\r\n\r\n return qRegionsLoaded.promise;\r\n }\r\n}\r\n","module.exports = ['common', 'dataContext', 'applicationStateService', regionDataService];\r\n\r\nfunction regionDataService(common, context, state) {\r\n\r\n var service = {\r\n get: get,\r\n getByCode: getByCode\r\n };\r\n\r\n function get() {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/regions' +\r\n '?origin=EU,' + state.filter.referenceCountry +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n function getByCode(code) {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/countries' +\r\n '?region=' + code +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n return service;\r\n}\r\n","angular.module('taric.good', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n \r\n .component('antiDumpingFinancialMeasures', require('./components/anti-dumping-financial-measures'))\r\n .component('customsValueCheckResult', require('./components/customs-value-check-result'))\r\n .component('dutyCalculationResult', require('./components/duty-calculation-result'))\r\n .component('exportMeasures', require('./components/export-measures'))\r\n .component('favoriteButton', require('./components/favorite-button'))\r\n .component('financialMeasure', require('./components/financial-measure'))\r\n .component('generalMeasure', require('./components/general-measure'))\r\n .component('groupedFinancialMeasures', require('./components/grouped-financial-measures'))\r\n .component('groupedGeneralMeasures', require('./components/grouped-general-measures'))\r\n .component('groupedVatMeasures', require('./components/grouped-vat-measures'))\r\n .component('germanExciseMeasures', require('./components/german-excise-measures'))\r\n .component('germanVatMeasures', require('./components/german-vat-measures'))\r\n .component('importMeasuresColumnOne', require('./components/import-measures-col-1'))\r\n .component('importMeasuresColumnTwo', require('./components/import-measures-col-2'))\r\n .component('measureConditionButtons', require('./components/measure-condition-buttons'))\r\n .component('measureConditionGroupsExpanded', require('./components/measure-condition-groups-expanded'))\r\n .component('measureManyConditionButtons', require('./components/measure-many-condition-buttons'))\r\n .component('measurePreferenceCodeButtons', require('./components/measure-preference-code-buttons'))\r\n .component('referenceDateAndCountry', require('./components/reference-date-and-country'))\r\n \r\n .controller('goodController', require('./controllers/good'))\r\n \r\n .directive('measureFiltersExportSmall', require('./directives/form/measure-filters-export-small'))\r\n .directive('measureFiltersImport', require('./directives/form/measure-filters-import'))\r\n .directive('measureFiltersImportSmall', require('./directives/form/measure-filters-import-small'))\r\n .directive('valueQuantityImport', require('./directives/form/value-quantity-import'))\r\n \r\n .factory('meursingModal', require('./modals/meursing-code'))\r\n .factory('ukCertificateGuidanceModal', require('./modals/uk-certificate-guidance'))\r\n .factory('goodModals', require('./modals/modals'))\r\n .factory('goodDataService', require('./services/good-data'))\r\n .factory('goodDisplayService', require('./services/good-display'))\r\n .factory('goodModelsService', require('./services/good-models'))\r\n .factory('measureGroupingService', require('./services/measure-grouping'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/good/:goodsnom', {\r\n templateUrl: 'good/controllers/good.html'\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n group: '<'\r\n },\r\n controller: antiDumpingFinancialMeasureController,\r\n templateUrl: 'good/components/anti-dumping-financial-measures.html'\r\n};\r\n\r\nantiDumpingFinancialMeasureController.$inject = ['goodDisplayService'];\r\n\r\nfunction antiDumpingFinancialMeasureController(goodDisplayService) {\r\n\r\n var vm = {\r\n group: null,\r\n setExpanded: setExpanded\r\n };\r\n\r\n function setExpanded(val) {\r\n if (val) {\r\n goodDisplayService.expandMeasures(vm.group.measures);\r\n }\r\n else {\r\n goodDisplayService.collapseMeasures(vm.group.measures);\r\n }\r\n }\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n result: '<'\r\n },\r\n templateUrl: 'good/components/customs-value-check-result.html'\r\n};","module.exports = {\r\n bindings: {\r\n dutyCalculationResult: '<',\r\n dutyCalculationErrors: '<'\r\n },\r\n controller: dutyCalculationResultController,\r\n templateUrl: 'good/components/duty-calculation-result.html'\r\n};\r\n\r\ndutyCalculationResultController.$inject = ['applicationStateService'];\r\n\r\nfunction dutyCalculationResultController(state) {\r\n var vm = {\r\n state: state\r\n }\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n measures: '<'\r\n },\r\n templateUrl: 'good/components/export-measures.html'\r\n};\r\n","module.exports = {\r\n bindings: {\r\n commodityCode: '<',\r\n tradeMovement: '<'\r\n },\r\n controller: favoriteButtonController,\r\n templateUrl: 'good/components/favorite-button.html'\r\n};\r\n\r\nfavoriteButtonController.$inject = ['favoritesService'];\r\n\r\nfunction favoriteButtonController(favoritesService) {\r\n var vm = {\r\n $onInit: $onInit,\r\n isFavorite: false,\r\n setFavorite: setFavorite\r\n };\r\n return vm;\r\n\r\n function $onInit() {\r\n vm.isFavorite = favoritesService.isFavorite(vm.commodityCode, vm.tradeMovement);\r\n }\r\n\r\n function setFavorite() {\r\n var add = vm.isFavorite === false;\r\n\r\n if (add) {\r\n favoritesService.add(\r\n vm.commodityCode,\r\n vm.tradeMovement,\r\n false, //vm.countryFilter !== null ? vm.countryFilter.code : null,\r\n 'dtv'//taricVars.applicationSet\r\n );\r\n vm.isFavorite = true;\r\n }\r\n else {\r\n favoritesService.remove(vm.commodityCode, vm.tradeMovement);\r\n vm.isFavorite = false;\r\n }\r\n }\r\n}","module.exports = {\r\n bindings: {\r\n measure: '<'\r\n },\r\n controller: financialMeasureController,\r\n templateUrl: 'good/components/financial-measure.html'\r\n};\r\n\r\nfinancialMeasureController.$inject = ['$window', 'applicationStateService'];\r\n\r\nfunction financialMeasureController($window, state) {\r\n var vm = {\r\n state: state,\r\n toggle: function(measure) {\r\n var textIsSelected = $window.getSelection().toString().length > 0;\r\n if (measure.isExpandable && !textIsSelected) {\r\n measure.expanded = !measure.expanded;\r\n }\r\n }\r\n }\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n measure: '<'\r\n },\r\n controller: generalMeasureController,\r\n templateUrl: 'good/components/general-measure.html'\r\n};\r\n\r\ngeneralMeasureController.$inject = ['$window'];\r\n\r\nfunction generalMeasureController($window) {\r\n var vm = {\r\n toggle: function(measure) {\r\n var textIsSelected = $window.getSelection().toString().length > 0;\r\n if (measure.isExpandable && !textIsSelected) {\r\n measure.expanded = !measure.expanded;\r\n }\r\n }\r\n }\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n exciseCode: '<',\r\n group: '<',\r\n measuretitle: '<'\r\n },\r\n templateUrl: 'good/components/german-excise-measures.html'\r\n};","module.exports = {\r\n bindings: {\r\n nationalNomenclatureId: '<',\r\n group: '<'\r\n },\r\n controller: germanVatMeasuresController,\r\n templateUrl: 'good/components/german-vat-measures.html'\r\n};\r\n\r\nfunction germanVatMeasuresController() {\r\n var vm = {\r\n $onChanges: $onChanges,\r\n filterMeasuresByNationalCommodityCode: filterMeasuresByNationalCommodityCode\r\n };\r\n\r\n return vm;\r\n\r\n function $onChanges() {\r\n vm.applicableMeasures = filterMeasuresByNationalCommodityCode(vm.group, vm.nationalNomenclatureId);\r\n }\r\n\r\n}\r\n\r\nfunction filterMeasuresByNationalCommodityCode(group, nationalNomenclatureId) {\r\n var filteredMeasures = _.filter(group, function (measure) {\r\n if (!nationalNomenclatureId) {\r\n return true;\r\n }\r\n if (!measure.german_national_commodity_codes) {\r\n return true;\r\n }\r\n if (measure.german_national_commodity_codes.lenghth === 0) {\r\n return true;\r\n }\r\n if (measure.german_national_commodity_codes[0][10] === '0') {\r\n return true;\r\n }\r\n if (_.includes(measure.german_national_commodity_codes, nationalNomenclatureId)) {\r\n return true;\r\n }\r\n return false;\r\n });\r\n return filteredMeasures\r\n}","module.exports = {\r\n bindings: {\r\n group: '<'\r\n },\r\n controller: groupedFinancialMeasuresController,\r\n templateUrl: 'good/components/grouped-financial-measures.html'\r\n};\r\n\r\ngroupedFinancialMeasuresController.$inject = ['goodDisplayService'];\r\n\r\nfunction groupedFinancialMeasuresController(goodDisplayService) {\r\n\r\n var vm = {\r\n setExpanded: setExpanded\r\n }\r\n\r\n return vm;\r\n\r\n function setExpanded(val) {\r\n if (val) {\r\n goodDisplayService.expandMeasures(vm.group.measures);\r\n }\r\n else {\r\n goodDisplayService.collapseMeasures(vm.group.measures);\r\n }\r\n }\r\n \r\n}","module.exports = {\r\n bindings: {\r\n group: '<'\r\n },\r\n controller: groupedGeneralMeasuresController,\r\n templateUrl: 'good/components/grouped-general-measures.html'\r\n};\r\n\r\ngroupedGeneralMeasuresController.$inject = ['goodDisplayService'];\r\nfunction groupedGeneralMeasuresController(goodDisplayService) {\r\n var vm = {\r\n setExpanded: setExpanded\r\n };\r\n\r\n function setExpanded(val) {\r\n if (val) {\r\n goodDisplayService.expandMeasures(vm.group.measures);\r\n }\r\n else {\r\n goodDisplayService.collapseMeasures(vm.group.measures);\r\n }\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n group: '<',\r\n measuretitle: '<'\r\n },\r\n templateUrl: 'good/components/grouped-vat-measures.html'\r\n};","module.exports = {\r\n bindings: {\r\n measures: '<',\r\n settings: '<', // commodityCode, eztExciseCode, eztNationalCommodityCode, referenceCountry\r\n },\r\n controller: importMeasuresColumnOneController,\r\n templateUrl: 'good/components/import-measures-col-1.html'\r\n};\r\n\r\nimportMeasuresColumnOneController.$inject = ['applicationStateService'];\r\nfunction importMeasuresColumnOneController(state) {\r\n var vm = {\r\n state: state\r\n };\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n measures: '<'\r\n },\r\n templateUrl: 'good/components/import-measures-col-2.html'\r\n};","module.exports = {\r\n bindings: {\r\n groups: '<'\r\n },\r\n templateUrl: 'good/components/measure-condition-buttons.html'\r\n};\r\n","module.exports = {\r\n bindings: {\r\n evaluation: '<',\r\n groups: '<'\r\n },\r\n controller: measureConditionGroupsExpandedController,\r\n templateUrl: 'good/components/measure-condition-groups-expanded.html'\r\n};\r\n\r\nmeasureConditionGroupsExpandedController.$inject = [\r\n 'applicationStateService',\r\n 'ukCertificateGuidanceModal'\r\n];\r\n\r\nfunction measureConditionGroupsExpandedController(\r\n state,\r\n ukCertificateGuidanceModal\r\n) {\r\n var vm = {\r\n referenceCountry: state.filter.referenceCountry,\r\n showUkGuidance: showUkGuidance\r\n };\r\n return vm;\r\n\r\n function showUkGuidance(conditionGroup, conditionIndex) {\r\n var certificates = _.chain(conditionGroup.conditions)\r\n .map(function (condition, index) {\r\n if (condition.certificate) {\r\n condition.certificate.active = (index === conditionIndex);\r\n }\r\n return condition;\r\n })\r\n .filter(function (condition) {\r\n return !!condition.certificate;\r\n })\r\n .map(function (condition) {\r\n return condition.certificate;\r\n })\r\n .value();\r\n ukCertificateGuidanceModal.show(certificates);\r\n }\r\n}","module.exports = {\r\n bindings: {\r\n groups: '<'\r\n },\r\n templateUrl: 'good/components/measure-many-condition-buttons.html'\r\n};\r\n","module.exports = {\r\n bindings: {\r\n measure: '<'\r\n },\r\n controller: measurePreferenceCodeButtonsController,\r\n templateUrl: 'good/components/measure-preference-code-buttons.html'\r\n};\r\n\r\nmeasurePreferenceCodeButtonsController.$inject = ['applicationStateService']\r\n\r\nfunction measurePreferenceCodeButtonsController(state) {\r\n var vm = {\r\n state: state\r\n };\r\n return vm;\r\n}","module.exports = {\r\n bindings: {},\r\n templateUrl: 'good/components/reference-date-and-country.html',\r\n controller: referenceDateAndCountryController\r\n};\r\n\r\nreferenceDateAndCountryController.$inject = ['applicationStateService'];\r\n\r\nfunction referenceDateAndCountryController(state) {\r\n var vm = {\r\n state: state\r\n };\r\n return vm;\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = [\r\n '$analytics', \r\n '$location', \r\n '$q',\r\n '$routeParams', \r\n '$timeout', \r\n '$window',\r\n 'additionalCodesDataService',\r\n 'common',\r\n 'dutyDataService', \r\n 'eztDataService',\r\n 'favoritesService', \r\n 'goodDataService', \r\n 'goodDisplayService', \r\n 'goodModals', \r\n 'goodModelsService', \r\n 'transactionValueDataService', \r\n 'transactionValueCalculatorModal',\r\n 'countryDataService',\r\n 'nomenclatureDataService', \r\n 'preferenceCodeDataService', \r\n 'preferenceService', \r\n 'measureGroupingService', \r\n 'notificationsService', \r\n 'applicationStateService', \r\n 'ecicsDataService',\r\n 'tradeStatisticsDataService', \r\n goodController\r\n];\r\n\r\nfunction goodController(\r\n $analytics, \r\n $location, \r\n $q, \r\n $routeParams, \r\n $timeout, \r\n $window,\r\n additionalCodesDataService,\r\n common,\r\n dutyDataService, \r\n eztDataService,\r\n favoritesService, \r\n goodDataService, \r\n goodDisplayService, \r\n goodModals, \r\n goodModelsService, \r\n transactionValueDataService, \r\n transactionValueCalculatorModal,\r\n countryDataService,\r\n nomenclatureDataService, \r\n preferenceCodeDataService, \r\n preferences, \r\n measureGroupingService, \r\n notificationsService, \r\n state,\r\n ecicsDataService,\r\n tradeStatisticsDataService\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n chapter: null,\r\n collapseMeasures: goodDisplayService.collapseMeasures,\r\n currentTab: 'show-measures',\r\n ergaOmnesCountries: countryDataService.ergaOmnesCountries,\r\n expandMeasures: goodDisplayService.expandMeasures,\r\n goHome: function () {\r\n $location.url('');\r\n },\r\n validationErrors: {\r\n quantities: {}\r\n },\r\n good: {\r\n generalInfo: {\r\n code: ''\r\n },\r\n measures: new goodModelsService.measuresDisplayModel(),\r\n nomenclatureGroups: []\r\n },\r\n hasAutonomousTariffSuspension: false,\r\n hasMeursing: false,\r\n isLoading: {\r\n generalInfo: true,\r\n meursingHeaders: true,\r\n measures: true\r\n },\r\n customsValue: {},\r\n customsValueCalculationMethod: 'calculate-value',\r\n applicableAntiDumpingAdditionalCodes: [],\r\n otherApplicableAdditionalTaricCodes: [],\r\n applicableNationalAdditionalCodes: [],\r\n antiDumpingAdditionalCode: null,\r\n otherAdditionalTaricCodes: {},\r\n meursingAdditionalCode: null,\r\n nationalAdditionalCode: null,\r\n certificateCodes: [],\r\n orderNumber: null,\r\n applicableOrderNumbers: [],\r\n preferenceCode: null,\r\n possiblePreferenceCodes: [],\r\n showUccToggle: false,\r\n quantities: [],\r\n section: null,\r\n numberOfEcicsItems: 0,\r\n state: state,\r\n anAdditionalCodeHasBeenSet: anAdditionalCodeHasBeenSet,\r\n calculateDuty: calculateDuty,\r\n evaluateMeasureConditions: evaluateMeasureConditions,\r\n countryPickerSelectionChanged: countryPickerSelectionChanged,\r\n goToNomenclature: goToNomenclature,\r\n onChangeCertificateCodes: onChangeCertificateCodes,\r\n onChangeAntidumpingAdditionalCode: onChangeAntidumpingAdditionalCode,\r\n onChangeDutyMeasureType: onChangeDutyMeasureType,\r\n onChangeEztExciseCode: onChangeEztExciseCode,\r\n onChangeNationalAdditionalCode: onChangeNationalAdditionalCode,\r\n onChangeSecondNationalAdditionalCode: onChangeSecondNationalAdditionalCode,\r\n onChangeOtherAdditionalCode: onChangeOtherAdditionalCode,\r\n onChangeOrderNumber: onChangeOrderNumber,\r\n onChangeOutputCurrency: onChangeOutputCurrency,\r\n onChangePreferenceCode: onChangePreferenceCode,\r\n showMeursingAdditionalCodeModal: showMeursingAdditionalCodeModal,\r\n showVerbruiksbelastingWarning: showVerbruiksbelastingWarning,\r\n loadMeursingTariffs: loadMeursingTariffs,\r\n changeTab: changeTab,\r\n selectEztNomenclature: selectEztNomenclature,\r\n showTransactionValueCalculator: showTransactionValueCalculator,\r\n validateDeclaration: validateDeclaration,\r\n uccSettingChanged: uccSettingChanged\r\n };\r\n\r\n\r\n var antiDumpingAdditionalCodeTypes = ['8', 'A', 'B', 'C'];\r\n var otherAdditionalTaricCodeTypes = ['2', '3', '4', '6', '9'];\r\n var nationalAdditionalCodeTypes = ['0', '1', '5', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];\r\n\r\n function uccSettingChanged(uccModeEnabled) {\r\n preferences.replace({\r\n category: 'settings',\r\n name: 'uccModeEnabled',\r\n value: uccModeEnabled,\r\n valueType: 'stringValue'\r\n });\r\n vm.state.uccModeEnabled = uccModeEnabled;\r\n vm.onChangePreferenceCode(null);\r\n }\r\n\r\n function countryPickerSelectionChanged(country, rememberCountry) {\r\n clearMeasureConditionEvaluation();\r\n vm.customsValueCheckResult = null;\r\n var countryHasChanged = state.countryHasChanged(country);\r\n state.updateCountryFilter(country, rememberCountry);\r\n if (rememberCountry && country) {\r\n preferences.saveCountryPreference(country);\r\n } else {\r\n preferences.clearCountryPreference();\r\n }\r\n if (countryHasChanged) {\r\n filterMeasuresByCountry();\r\n }\r\n }\r\n\r\n function showTransactionValueCalculator() {\r\n transactionValueCalculatorModal\r\n .show()\r\n .then(function(result) {\r\n if (result) {\r\n vm.customsValue = result;\r\n }\r\n })\r\n .catch(function(error) {\r\n });\r\n }\r\n\r\n function changeTab(tabId) {\r\n notificationsService.publish('declarable-code-change-tab');\r\n switch (tabId) {\r\n case 'show-measures':\r\n $analytics.pageTrack('/show-measures');\r\n vm.currentTab = 'show-measures';\r\n break;\r\n case 'show-hinweise':\r\n $analytics.pageTrack('/show-hinweise');\r\n vm.currentTab = 'show-hinweise';\r\n break;\r\n case 'validate-declaration':\r\n $analytics.pageTrack('/validate-declaration');\r\n vm.currentTab = 'validate-declaration';\r\n break;\r\n case 'calculate-duty':\r\n $analytics.pageTrack('/calculate-duty');\r\n vm.currentTab = 'calculate-duty';\r\n break;\r\n }\r\n }\r\n\r\n function onChangeCertificateCodes(certificateCodes) {\r\n vm.certificateCodes = certificateCodes;\r\n }\r\n\r\n function onChangeOutputCurrency(currency) {\r\n if (currency) {\r\n loadGood(vm.good.generalInfo.code, vm.nationalAdditionalCode, vm.meursingAdditionalCode, currency);\r\n }\r\n else {\r\n loadGood(vm.good.generalInfo.code, vm.nationalAdditionalCode, vm.meursingAdditionalCode);\r\n }\r\n vm.outputCurrency = currency;\r\n }\r\n\r\n function onChangeAntidumpingAdditionalCode(additionalCode) {\r\n // console.log('goodsController::onChangeAntidumpingAdditionalCode', additionalCode);\r\n vm.antiDumpingAdditionalCode = additionalCode;\r\n filterMeasures();\r\n }\r\n\r\n function onChangeOtherAdditionalCode(type, additionalCode) {\r\n // console.log('goodsController::onChangeOtherAdditionalCode', type, additionalCode);\r\n if (additionalCode) {\r\n vm.otherAdditionalTaricCodes[type] = additionalCode;\r\n }\r\n else if (type) {\r\n delete vm.otherAdditionalTaricCodes[type];\r\n }\r\n filterMeasures();\r\n }\r\n\r\n // TODO: save additional codes as object (or as string, but consistently - right now antidumping is saved as object)\r\n function onChangeNationalAdditionalCode(additionalCode) {\r\n var previousAdditionalCodeIsOptional = state.filter.referenceCountry === 'NL' &&\r\n !!vm.nationalAdditionalCodeObject &&\r\n (vm.nationalAdditionalCodeObject.type.toUpperCase() === 'T' ||\r\n vm.nationalAdditionalCodeObject.type.toUpperCase() === 'V');\r\n\r\n var additionalCodeIsOptional = state.filter.referenceCountry === 'NL' &&\r\n !!additionalCode &&\r\n (additionalCode.type.toUpperCase() === 'T' || additionalCode.type.toUpperCase() === 'V');\r\n\r\n if (additionalCode) {\r\n vm.nationalAdditionalCode = additionalCode.type + additionalCode.code;\r\n vm.nationalAdditionalCodeObject = additionalCode;\r\n }\r\n else {\r\n vm.nationalAdditionalCode = null;\r\n vm.nationalAdditionalCodeObject = null;\r\n }\r\n\r\n var shouldLoadOptionalAdditionalCodes = (additionalCodeIsOptional && !previousAdditionalCodeIsOptional) ||\r\n (!additionalCodeIsOptional && previousAdditionalCodeIsOptional);\r\n\r\n if (shouldLoadOptionalAdditionalCodes) {\r\n $q.all([\r\n loadGood(vm.good.generalInfo.code, vm.nationalAdditionalCode, vm.meursingAdditionalCode, vm.outputCurrency),\r\n loadUnits()\r\n ]);\r\n }\r\n else {\r\n filterMeasures();\r\n }\r\n }\r\n\r\n // TODO: save additional codes as object (or as string, but consistently - right now antidumping is saved as object)\r\n function onChangeSecondNationalAdditionalCode(additionalCode) {\r\n if (additionalCode) {\r\n vm.secondNationalAdditionalCode = additionalCode.type + additionalCode.code;\r\n vm.secondNationalAdditionalCodeObject = additionalCode;\r\n }\r\n else {\r\n vm.secondNationalAdditionalCode = null;\r\n vm.secondNationalAdditionalCodeObject = null;\r\n }\r\n filterMeasures();\r\n }\r\n\r\n function onChangeDutyMeasureType(dutyMeasureType) {\r\n var measurePreferenceCodesProperty = vm.state.uccModeEnabled === 'yes' ? 'ucc_preference_codes' : 'preference_codes';\r\n vm.dutyMeasureType = dutyMeasureType;\r\n if (!dutyMeasureType) {\r\n vm.preferenceCode = null;\r\n }\r\n else if (vm.preferenceCode && dutyMeasureType[measurePreferenceCodesProperty].indexOf(vm.preferenceCode.code) === -1) {\r\n vm.preferenceCode = null\r\n }\r\n\r\n // TODO: check if this should be moved to loadMeasuresCompleted, so that we\r\n // also perform this action if the duty measure type is changed for another reason\r\n if (dutyMeasureType && dutyMeasureType[measurePreferenceCodesProperty] && dutyMeasureType[measurePreferenceCodesProperty].length === 1) {\r\n vm.preferenceCode = _.find(vm.preferenceCodes, function (preferenceCode) {\r\n return preferenceCode.code === dutyMeasureType[measurePreferenceCodesProperty][0];\r\n });\r\n }\r\n\r\n filterMeasures();\r\n }\r\n\r\n function onChangePreferenceCode(preferenceCode) {\r\n var measurePreferenceCodesProperty = vm.state.uccModeEnabled === 'yes' ? 'ucc_preference_codes' : 'preference_codes';\r\n vm.preferenceCode = preferenceCode;\r\n if (!preferenceCode) {\r\n vm.dutyMeasureType = null;\r\n }\r\n else if (!vm.dutyMeasureType) {\r\n let dutyMeasureTypes = _.filter(vm.applicableDutyMeasureTypes, function (dutyMeasureType) {\r\n return dutyMeasureType[measurePreferenceCodesProperty].indexOf(preferenceCode.code) > -1;\r\n });\r\n if (dutyMeasureTypes.length === 1) {\r\n vm.dutyMeasureType = dutyMeasureTypes[0];\r\n }\r\n }\r\n else if (vm.dutyMeasureType && vm.dutyMeasureType[measurePreferenceCodesProperty].indexOf(preferenceCode.code) === -1) {\r\n vm.dutyMeasureType = null\r\n }\r\n \r\n filterMeasures();\r\n }\r\n\r\n function onChangeOrderNumber(orderNumber) {\r\n vm.orderNumber = orderNumber;\r\n filterMeasures();\r\n }\r\n\r\n function collectAdditionalCodes() {\r\n var additionalCodes = _.values(vm.otherAdditionalTaricCodes);\r\n if (vm.antiDumpingAdditionalCode) {\r\n additionalCodes.push(vm.antiDumpingAdditionalCode);\r\n }\r\n if (vm.meursingAdditionalCode) {\r\n additionalCodes.push({\r\n type: vm.meursingAdditionalCode.substring(0, 1),\r\n code: vm.meursingAdditionalCode.substring(1)\r\n });\r\n }\r\n if (vm.nationalAdditionalCodeObject) {\r\n additionalCodes.push(vm.nationalAdditionalCodeObject);\r\n }\r\n if (vm.secondNationalAdditionalCodeObject) {\r\n additionalCodes.push(vm.secondNationalAdditionalCodeObject);\r\n }\r\n return additionalCodes;\r\n }\r\n\r\n function setAntiDumpingAdditionalCodeToDefaultValue() {\r\n vm.antiDumpingAdditionalCode = _.find(vm.applicableAntiDumpingAdditionalCodes, function(additionalCode) {\r\n return (additionalCode.type === \"8\" && additionalCode.code === \"900\") ||\r\n (additionalCode.type === \"A\" && additionalCode.code === \"999\") ||\r\n (additionalCode.type === \"B\" && additionalCode.code === \"999\") ||\r\n (additionalCode.type === \"C\" && additionalCode.code === \"999\")\r\n ;\r\n });\r\n }\r\n function setPreferenceCodeToDefaultValue() {\r\n var thirdCountryDutyPreferenceCode = _.find(vm.possiblePreferenceCodes, function(preferenceCode) {\r\n return preferenceCode.code === '100';\r\n });\r\n var endUsePreferenceCode = _.find(vm.possiblePreferenceCodes, function(preferenceCode) {\r\n return preferenceCode.code === '140';\r\n });\r\n if (thirdCountryDutyPreferenceCode) {\r\n vm.preferenceCode = thirdCountryDutyPreferenceCode;\r\n let defaultDutyMeasureType = _.find(vm.applicableDutyMeasureTypes, function (dutyMeasureType) {\r\n return dutyMeasureType.id === '103';\r\n });\r\n if (defaultDutyMeasureType !== null) {\r\n vm.dutyMeasureType = defaultDutyMeasureType;\r\n }\r\n }\r\n else if (endUsePreferenceCode) {\r\n vm.preferenceCode = endUsePreferenceCode;\r\n }\r\n }\r\n\r\n function validateDeclaration() {\r\n vm.customsValueCheckResult = null;\r\n $analytics.eventTrack('submit-validate-declaration'); \r\n notificationsService.publish('submit-validate-declaration');\r\n checkCustomsValue();\r\n evaluateMeasureConditions();\r\n }\r\n\r\n function checkCustomsValue() {\r\n var netWeight = _.find(vm.quantities, function(quantity) {\r\n return quantity.UnitType && quantity.UnitType.Type === 'Weight';\r\n });\r\n if (netWeight && netWeight.Amount && vm.customsValue.amount && state.filter.countryCode) {\r\n var query = {\r\n commodityCode: vm.good.generalInfo.code,\r\n customsValue: vm.customsValue,\r\n date: state.filter.date,\r\n partnerCountry: state.filter.countryCode,\r\n quantities: vm.quantities,\r\n reportingCountry: state.filter.referenceCountry,\r\n tradeMovement: state.filter.movement, // TODO: process trade movement in API\r\n };\r\n if (query.reportingCountry !== 'EU' && query.reportingCountry !== 'CH' && query.reportingCountry !== 'GB') {\r\n tradeStatisticsDataService.checkCustomsValue(query)\r\n .then(function (result) {\r\n vm.customsValueCheckResult = result;\r\n });\r\n }\r\n }\r\n else {\r\n vm.customsValueCheckResult = null;\r\n }\r\n }\r\n\r\n function clearMeasureConditionEvaluation() {\r\n vm.measures = _.map(vm.measures, function (measure) {\r\n measure.conditionEvaluation = null;\r\n return measure;\r\n })\r\n vm.good.measures = measureGroupingService.group(vm.measures, state.filter.referenceCountry);\r\n }\r\n\r\n function evaluateMeasureConditions() {\r\n vm.isLoading.evaluateMeasureConditions = true;\r\n var additionalCodes = collectAdditionalCodes();\r\n if (vm.dutyMeasureType) {\r\n var dutyMeasureTypeId = vm.dutyMeasureType.id;\r\n }\r\n var query = {\r\n certificateCodes: vm.certificateCodes,\r\n commodityCode: vm.good.generalInfo.code,\r\n additionalCodes: additionalCodes,\r\n preferenceCode: vm.preferenceCode,\r\n uccModeEnabled: vm.state.uccModeEnabled,\r\n customsValue: vm.customsValue,\r\n dutyMeasureTypeId: dutyMeasureTypeId,\r\n orderNumber: vm.orderNumber,\r\n quantities: vm.quantities,\r\n countryCode: state.filter.countryCode,\r\n tradeMovement: state.filter.movement,\r\n };\r\n return goodDataService\r\n .evaluateMeasureConditions(query)\r\n .then(function(results) {\r\n vm.isLoading.evaluateMeasureConditions = false;\r\n\r\n vm.measures = _.map(vm.measures, function (measure) {\r\n var result = results[measure.id];\r\n if (result) {\r\n measure.conditionEvaluation = result;\r\n }\r\n return measure;\r\n })\r\n vm.good.measures = measureGroupingService.group(vm.measures, state.filter.referenceCountry);\r\n });\r\n }\r\n\r\n function setBritishVatCodeToOnlyPossibleValueIfNecessary() {\r\n if (state.filter.referenceCountry === 'GB') {\r\n if (vm.applicableNationalAdditionalCodes && vm.applicableNationalAdditionalCodes.length === 1 && !vm.nationalAdditionalCode) {\r\n var applicableNationalAdditionalCode = vm.applicableNationalAdditionalCodes[0];\r\n var vatMeasures = _.filter(vm.measures, function (measure) {\r\n return measure.series === 'P';\r\n });\r\n if (vatMeasures.length === 1) {\r\n var vatMeasure = vatMeasures[0];\r\n if (!!vatMeasure.additional_code && vatMeasure.additional_code.type === applicableNationalAdditionalCode.type && vatMeasure.additional_code.code === applicableNationalAdditionalCode.code) {\r\n vm.nationalAdditionalCodeObject = applicableNationalAdditionalCode;\r\n vm.nationalAdditionalCode = applicableNationalAdditionalCode.type + applicableNationalAdditionalCode.code;\r\n }\r\n }\r\n \r\n }\r\n }\r\n }\r\n\r\n function calculateDuty() {\r\n notificationsService.publish('submit-calculate-duty');\r\n $analytics.eventTrack('submit-calculate-duty');\r\n vm.dutyCalculationResult = null;\r\n vm.dutyCalculationErrors = null;\r\n vm.isLoading.dutyCalculation = true;\r\n var additionalCodes = collectAdditionalCodes();\r\n if (vm.dutyMeasureType) {\r\n var dutyMeasureTypeId = vm.dutyMeasureType.id;\r\n }\r\n var germanExciseCode = vm.eztExciseCode ? vm.eztExciseCode.Id : null;\r\n\r\n if (!vm.outputCurrency) {\r\n vm.outputCurrency = _.find(vm.possibleUnitsForCurrencyConversion, function (currency) {\r\n return currency.code === vm.monetaryUnit;\r\n });\r\n }\r\n\r\n var query = {\r\n certificateCodes: vm.certificateCodes,\r\n commodityCode: vm.good.generalInfo.code,\r\n currencyCode: vm.outputCurrency.code,\r\n additionalCodes: additionalCodes,\r\n preferenceCode: vm.preferenceCode,\r\n uccModeEnabled: vm.state.uccModeEnabled,\r\n customsValue: vm.customsValue,\r\n dutyMeasureTypeId: dutyMeasureTypeId,\r\n orderNumber: vm.orderNumber,\r\n quantities: vm.quantities,\r\n countryOfOrigin: state.filter.countryCode,\r\n germanNationalCommodityCode: vm.currentEztNationalCommodityCode,\r\n germanExciseCode: germanExciseCode\r\n };\r\n vm.validationErrors = {\r\n quantities: {}\r\n };\r\n checkCustomsValue();\r\n return dutyDataService\r\n .calculateDuty(query)\r\n .then(function(result) {\r\n var shouldFilterMeasures = false;\r\n vm.isLoading.dutyCalculation = false;\r\n if (vm.applicableAntiDumpingAdditionalCodes.length > 0 && !vm.antiDumpingAdditionalCode) {\r\n shouldFilterMeasures = true;\r\n setAntiDumpingAdditionalCodeToDefaultValue();\r\n }\r\n setBritishVatCodeToOnlyPossibleValueIfNecessary();\r\n if (vm.possiblePreferenceCodes.length > 0 && !vm.preferenceCode && !vm.dutyMeasureType) {\r\n shouldFilterMeasures = true;\r\n setPreferenceCodeToDefaultValue();\r\n }\r\n if (shouldFilterMeasures) {\r\n filterMeasures().then(function(){\r\n vm.dutyCalculationResult = result;\r\n });\r\n }\r\n else {\r\n vm.dutyCalculationResult = result;\r\n }\r\n }, function (error) {\r\n if (error && error.data) {\r\n _.forEach(error.data.Errors, function(errorMessage) {\r\n if (errorMessage.Code.indexOf('customs_value') !== -1) {\r\n vm.validationErrors.customsValue = true;\r\n }\r\n else if (errorMessage.Code.indexOf('country_of_origin') !== -1) {\r\n vm.validationErrors.countryOfOrigin = true;\r\n }\r\n else if (errorMessage.Code === 'quantity_missing') {\r\n let unitPlusQuantifier = errorMessage.Message.split(' (')[0];\r\n vm.validationErrors.quantities[unitPlusQuantifier] = true;\r\n // Exclude retail price errors\r\n if (unitPlusQuantifier !== '003' && unitPlusQuantifier !== 'RET') {\r\n vm.validationErrors.hasQuantitiesError = true;\r\n }\r\n }\r\n else if (errorMessage.Code === 'quantities_parse_error') {\r\n var messageParts = errorMessage.Message.split(' ');\r\n let unitPlusQuantifier;\r\n if (messageParts[messageParts.length - 1].length === 1) {\r\n unitPlusQuantifier = messageParts[messageParts.length - 2] + ' ' + messageParts[messageParts.length - 1];\r\n }\r\n else {\r\n unitPlusQuantifier = messageParts[messageParts.length - 1];\r\n }\r\n vm.validationErrors.quantities[unitPlusQuantifier] = true;\r\n // Exclude retail price errors\r\n if (unitPlusQuantifier !== '003' && unitPlusQuantifier !== 'RET') {\r\n vm.validationErrors.hasQuantitiesError = true;\r\n }\r\n }\r\n else if (errorMessage.Code === 'additional_code_validation_error') {\r\n vm.validationErrors.additionalCodes = true;\r\n }\r\n else if (errorMessage.Code.indexOf('order_number') > -1) {\r\n vm.validationErrors.orderNumber = true;\r\n }\r\n if (errorMessage.Code.indexOf('duty_measure_not_unique_for_preferencecode') !== -1 || errorMessage.Code.indexOf('add_duty_measure_id_for_end_use_choice') !== -1) {\r\n vm.validationErrors.dutyMeasureNotUniqueForPreferenceCode = true;\r\n }\r\n if (errorMessage.Code.indexOf('german_national_commodity_code') !== -1) {\r\n vm.validationErrors.germanNationalCommodityCode = true;\r\n }\r\n if (errorMessage.Code.indexOf('german_excise_code') !== -1) {\r\n vm.validationErrors.germanExciseCode = true;\r\n }\r\n if (errorMessage.Code === 'unsupported_duty_expression') {\r\n vm.dutyCalculationErrors = {\r\n unsupportedDutyExpression: true\r\n };\r\n }\r\n \r\n });\r\n vm.isLoading.dutyCalculation = false;\r\n }\r\n });\r\n }\r\n\r\n function filterMeasures() {\r\n var start = moment();\r\n vm.isLoading.measures = true;\r\n vm.validationErrors = {\r\n quantities: {}\r\n };\r\n vm.dutyCalculationResult = null;\r\n vm.dutyCalculationErrors = null;\r\n // NB: we add a timeout here, so that the loading indicator shows before angularjs gets busy\r\n // rendering the measures\r\n return $timeout(function () {\r\n vm.good.measures = goodModelsService.measuresDisplayModel();\r\n return $q.all([\r\n loadMeasures(state.filter.countryCode),\r\n loadUnits()\r\n ]).then(function() {\r\n return $timeout(function () {\r\n vm.isLoading.measures = false;\r\n // Uncomment this to see how long it takes to render measures when switching country\r\n // console.log(moment().diff(start, 'seconds', true));\r\n // console.log('goodsVM', vm);\r\n }, 0);\r\n });\r\n }, 0);\r\n }\r\n\r\n function filterMeasuresByCountry() {\r\n var start = moment();\r\n vm.isLoading.measures = true;\r\n vm.validationErrors = {\r\n quantities: {}\r\n };\r\n vm.dutyCalculationResult = null;\r\n // NB: we add a timeout here, so that the loading indicator shows before angularjs gets busy\r\n // rendering the measures\r\n return $timeout(function () {\r\n vm.good.measures = goodModelsService.measuresDisplayModel();\r\n return $q.all([\r\n loadMeasures(state.filter.countryCode),\r\n loadUnits()\r\n ]).then(function() {\r\n vm.isLoading.measures = false;\r\n return $timeout(function () {\r\n // Uncomment this to see how long it takes to render measures when switching country\r\n // console.log(moment().diff(start, 'seconds', true));\r\n }, 0);\r\n })\r\n }, 0);\r\n }\r\n\r\n function goToNomenclature(goodsnomid, indentation) {\r\n var selection = $window.getSelection();\r\n var textIsSelected = selection.toString().length > 0;\r\n if (textIsSelected) {\r\n selection.empty();\r\n }\r\n else {\r\n state.currentCode = goodsnomid;\r\n state.currentIndentation = indentation;\r\n state.navigatingFromMeasuresPage = true;\r\n $location.url('/search/' + goodsnomid);\r\n }\r\n }\r\n\r\n function dateChanged() {\r\n $location.url('/search/' + vm.good.generalInfo.code);\r\n }\r\n\r\n function loadEcicsCount(goodsCode) {\r\n return ecicsDataService.countForGoodsCode(goodsCode)\r\n .then(function(numberOfEcicsItems) {\r\n vm.numberOfEcicsItems = numberOfEcicsItems;\r\n });\r\n }\r\n\r\n var verbruiksbelastingHeadings = ['2009', '2106', '2201', '2202'];\r\n function showVerbruiksbelastingWarning() {\r\n return moment(state.filter.date).year() <= 2019 &&\r\n state.filter &&\r\n state.filter.referenceCountry === 'NL' &&\r\n verbruiksbelastingHeadings.indexOf(vm.good.generalInfo.code.substring(0, 4)) > -1;\r\n }\r\n\r\n function setMonetaryUnit() {\r\n if (state.filter.referenceCountry === 'GB' && moment(state.filter.date).isAfter('2021-01-01')) {\r\n vm.monetaryUnit = 'GBP';\r\n }\r\n else {\r\n vm.monetaryUnit = 'EUR';\r\n }\r\n vm.customsValue.unit = vm.monetaryUnit;\r\n vm.customsValue.originalUnit = vm.monetaryUnit;\r\n vm.customsValue.exchangeRate = 1;\r\n }\r\n\r\n function attached() {\r\n if (state.filter.referenceCountry == 'CH') {\r\n $location.path('/tares-measures/' + $routeParams.goodsnom);\r\n return;\r\n }\r\n $analytics.pageTrack('/show-measures');\r\n common.auth.check();\r\n if ($location.search().country) {\r\n vm.state.filter.countryCode = $location.search().country;\r\n }\r\n\r\n if ($routeParams.goodsnom !== null && $routeParams.goodsnom !== 'undefined') {\r\n clearGood();\r\n vm.good.generalInfo.code = $routeParams.goodsnom;\r\n state.currentCode = vm.good.generalInfo.code;\r\n setMonetaryUnit();\r\n transactionValueDataService.initTransactionValue();\r\n\r\n if (state.filter.movement === 'import') {\r\n\r\n var importPromises = [\r\n loadDescription(vm.good.generalInfo.code),\r\n loadGood(vm.good.generalInfo.code, vm.nationalAdditionalCode, vm.meursingAdditionalCode, vm.outputCurrency),\r\n loadNomenclatureGroups($routeParams.goodsnom),\r\n loadSection(vm.good.generalInfo.code),\r\n loadOptionalNationalAdditionalCodes(),\r\n loadAdditionalCodeTypes(),\r\n loadPreferenceCodes(),\r\n loadUnits(),\r\n loadEcicsCount(vm.good.generalInfo.code)\r\n ];\r\n if (vm.state.filter.referenceCountry === 'DE') {\r\n importPromises.push(loadGermanNationalNomenclature(vm.good.generalInfo.code));\r\n importPromises.push(loadEztHinweise(vm.good.generalInfo.code));\r\n }\r\n\r\n $q.all(importPromises);\r\n\r\n }\r\n else if (state.filter.movement === 'export') {\r\n\r\n var exportPromises = [\r\n loadDescription(vm.good.generalInfo.code),\r\n loadGood(vm.good.generalInfo.code, vm.nationalAdditionalCode, vm.meursingAdditionalCode, vm.outputCurrency),\r\n loadNomenclatureGroups($routeParams.goodsnom),\r\n loadSection(vm.good.generalInfo.code),\r\n loadAdditionalCodeTypes(),\r\n loadUnits(),\r\n loadEcicsCount(vm.good.generalInfo.code)\r\n ];\r\n if (vm.state.filter.referenceCountry === 'DE') {\r\n exportPromises.push(loadEztHinweise(vm.good.generalInfo.code));\r\n }\r\n $q.all(exportPromises);\r\n }\r\n }\r\n else {\r\n $location.url('');\r\n }\r\n notificationsService.subscribe('filter_movement_changed', movementChanged);\r\n notificationsService.subscribe('filter_date_changed', dateChanged);\r\n notificationsService.subscribe('language_changed', languageChanged);\r\n }\r\n\r\n function loadEztHinweise(commodityCode) {\r\n eztDataService.loadEztHinweise(commodityCode)\r\n .then(function (eztHinweise) {\r\n vm.eztHinweise = eztHinweise;\r\n vm.exciseHinweise = _.filter(vm.eztHinweise, function (hinweise) {\r\n return hinweise.ShortDescription === 'VST';\r\n });\r\n if (vm.exciseHinweise) {\r\n var exciseTypeIds = _.map(vm.exciseHinweise, function(hinweis) {\r\n return hinweis.HinweiseId;\r\n })\r\n loadEztExciseNomenclature(exciseTypeIds);\r\n }\r\n });\r\n }\r\n\r\n function loadGermanNationalNomenclature(commodityCode) {\r\n eztDataService.loadEztNomenclature(commodityCode)\r\n .then(function (eztNomenclature) {\r\n vm.eztNomenclature = eztNomenclature;\r\n if (vm.eztNomenclature && vm.eztNomenclature.length === 1) {\r\n vm.currentEztNationalCommodityCode = vm.eztNomenclature[0].CommodityCode;\r\n }\r\n });\r\n }\r\n\r\n function selectEztNomenclature(commodityCode) {\r\n vm.currentEztNationalCommodityCode = commodityCode;\r\n }\r\n\r\n function loadEztExciseNomenclature(exciseTypeIds) {\r\n vm.eztExciseNomenclature = [];\r\n _.forEach(exciseTypeIds, function (exciseTypeId) {\r\n eztDataService.loadEztExciseNomenclature(exciseTypeId)\r\n .then(function (eztExciseNomenclature) {\r\n vm.eztExciseNomenclature = _.chain(vm.eztExciseNomenclature)\r\n .concat(eztExciseNomenclature)\r\n .sortBy('Id')\r\n .value();\r\n });\r\n });\r\n }\r\n\r\n function onChangeEztExciseCode(eztExciseCode) {\r\n vm.eztExciseCode = eztExciseCode;\r\n loadUnits();\r\n }\r\n\r\n function loadUnits() {\r\n vm.isLoadingUnits = true;\r\n var additionalCodes = collectAdditionalCodes();\r\n var germanExciseCode = vm.eztExciseCode ? vm.eztExciseCode.Id : null;\r\n\r\n return dutyDataService\r\n .getUnits(vm.good.generalInfo.code, additionalCodes, vm.preferenceCode, germanExciseCode, vm.state.uccModeEnabled)\r\n .then(function (units) {\r\n vm.isLoadingUnits = false;\r\n var newQuantities =_.map(units, function(unit) {\r\n var oldQuantity = _.find(vm.quantities, function (quantity) {\r\n if (quantity.Unit.code === unit.Unit.code) {\r\n if (!quantity.Qualifier && !unit.Qualifier) {\r\n return true;\r\n }\r\n if (quantity.Qualifier && unit.Qualifier && quantity.Qualifier.code === unit.Qualifier.code) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n if (oldQuantity) {\r\n unit.Amount = oldQuantity.Amount;\r\n }\r\n else {\r\n unit.Amount = null;\r\n }\r\n return unit;\r\n });\r\n vm.quantities = newQuantities;\r\n });\r\n }\r\n\r\n function loadPreferenceCodes() {\r\n var q = $q.defer();\r\n if (!vm.preferenceCodeTypes || vm.preferenceCodeTypes.length === 0) {\r\n preferenceCodeDataService.getDescriptions().then (function (preferenceCodes) {\r\n // TODO: preloaded codes should be stored in a service\r\n vm.preferenceCodes = _.keyBy(preferenceCodes, 'code');\r\n // console.log(vm.preferenceCodeTypes);\r\n q.resolve(preferenceCodes);\r\n });\r\n }\r\n return q.promise;\r\n }\r\n\r\n function loadAdditionalCodeTypes() {\r\n var q = $q.defer();\r\n if (!vm.additionalCodeTypes || vm.additionalCodeTypes.length === 0) {\r\n additionalCodesDataService.getTypes().then (function (additionalCodeTypes) {\r\n // TODO: preloaded codes should be stored in a service\r\n vm.additionalCodeTypes = _.keyBy(additionalCodeTypes, 'code');\r\n // console.log(vm.additionalCodeTypes);\r\n q.resolve(additionalCodeTypes);\r\n });\r\n }\r\n return q.promise;\r\n }\r\n\r\n function loadOptionalNationalAdditionalCodes() {\r\n var q = $q.defer();\r\n if (state.filter.referenceCountry === 'NL') {\r\n if (!vm.optionalNationalAdditionalCodes || vm.optionalNationalAdditionalCodes.length === 0) {\r\n if (moment(state.filter.date).isBefore('2019-11-30')) {\r\n $q.all([\r\n additionalCodesDataService.getByType('T'),\r\n additionalCodesDataService.getByType('V')\r\n ]).then(function(results) {\r\n var additionalCodes = _.concat(results[0], results[1]);\r\n // TODO: preloaded codes should be stored in a service\r\n vm.optionalNationalAdditionalCodes = additionalCodes;\r\n q.resolve(additionalCodes);\r\n })\r\n }\r\n else {\r\n additionalCodesDataService.getByType('V').then (function (additionalCodes) {\r\n // TODO: preloaded codes should be stored in a service\r\n vm.optionalNationalAdditionalCodes = additionalCodes;\r\n q.resolve(additionalCodes);\r\n });\r\n }\r\n }\r\n }\r\n return q.promise;\r\n }\r\n\r\n function loadSection(goodsCode) {\r\n return nomenclatureDataService.getSectionForCommodityCode(goodsCode)\r\n .then(function (section) {\r\n vm.section = section;\r\n vm.chapter = _.find(section.chapters, function (chapter) {\r\n return chapter.code === goodsCode.substring(0, 2) + '00000000';\r\n });\r\n });\r\n }\r\n\r\n function loadDescription(goodscode) {\r\n return nomenclatureDataService.loadDescription(goodscode)\r\n .then(function(description) {\r\n if (description) {\r\n var indentation = description.lines[description.lines.length - 1].indent;\r\n state.currentIndentation = indentation;\r\n vm.good.generalInfo.description = description;\r\n }\r\n vm.isLoading.generalInfo = false;\r\n }, function(err) {\r\n if (!err.isAborted) {\r\n try {\r\n Sentry.captureException(err);\r\n }\r\n catch (error) {\r\n try {\r\n Sentry.captureMessage(err);\r\n }\r\n catch (e) {}\r\n }\r\n }\r\n });\r\n }\r\n\r\n function languageChanged() {\r\n if (vm.good.generalInfo.code) {\r\n loadGood(vm.good.generalInfo.code, vm.nationalAdditionalCode, vm.meursingAdditionalCode, vm.outputCurrency);\r\n }\r\n }\r\n\r\n // Subscribe to the languageChanged event to reload the data\r\n function detached() {\r\n notificationsService.unsubscribe('filter_movement_changed', movementChanged);\r\n notificationsService.unsubscribe('filter_date_changed', dateChanged);\r\n notificationsService.unsubscribe('language_changed', languageChanged);\r\n if (!state.remember.country && !$location.search().country) {\r\n state.filter.countryName = null;\r\n state.filter.countryCode = null;\r\n }\r\n }\r\n\r\n function clearGood() {\r\n vm.good = {\r\n generalInfo: {\r\n code: ''\r\n },\r\n measures: new goodModelsService.measuresDisplayModel(),\r\n nomenclatureGroups: []\r\n };\r\n vm.customsValueCheckResult = null;\r\n vm.antiDumpingAdditionalCode = null;\r\n vm.otherAdditionalTaricCodes = {};\r\n vm.meursingAdditionalCode = null;\r\n vm.nationalAdditionalCode = null;\r\n vm.nationalAdditionalCodeObject = null;\r\n vm.secondNationalAdditionalCodeObject = null;\r\n vm.orderNumber = null;\r\n vm.preferenceCode = null;\r\n vm.eztNomenclature = null;\r\n vm.eztHinWeise = null;\r\n vm.eztExciseHinweise = null;\r\n vm.currentEztNationalCommodityCode = null;\r\n vm.eztExciseNomenclature = null;\r\n vm.eztExciseCode = null;\r\n }\r\n\r\n function anAdditionalCodeHasBeenSet() {\r\n return !!vm.nationalAdditionalCodeObject || !!vm.secondNationalAdditionalCodeObject || \r\n !!vm.meursingAdditionalCode || !!vm.antiDumpingAdditionalCode ||\r\n _.some(vm.otherApplicableAdditionalTaricCodes, function(applicableCodesGroupedByType) {\r\n return !!vm.otherAdditionalTaricCodes[applicableCodesGroupedByType.type];\r\n });\r\n }\r\n\r\n function loadGood(goodsnom, nationalAdditionalCode, meursingAdditionalCode, currency) {\r\n vm.isLoading.generalInfo = true;\r\n vm.isLoading.measures = true;\r\n vm.good.measures = new goodModelsService.measuresDisplayModel();\r\n goodDataService\r\n .loadGood(goodsnom, nationalAdditionalCode, meursingAdditionalCode, currency, vm.state.uccModeEnabled)\r\n .then(loadGoodSuccess, function(err) {\r\n if (err.status === 400) {\r\n $location.url('search/' + goodsnom).replace();\r\n }\r\n else if (err.isAborted) {\r\n // do nothing; the user may already have navigated to a different page\r\n }\r\n else {\r\n var heading = goodsnom.substring(0, 4);\r\n try {\r\n Sentry.captureMessage(err);\r\n }\r\n catch (e) {}\r\n $location.url('search/' + heading).replace();\r\n }\r\n });\r\n }\r\n\r\n function loadNomenclatureGroups(goodsnom) {\r\n return nomenclatureDataService.loadNomenclatureGroups(goodsnom)\r\n .then(function(nomenclatureGroups) {\r\n vm.good.nomenclatureGroups = nomenclatureGroups;\r\n }, function(err) {\r\n if (!err.isAborted) {\r\n try {\r\n Sentry.captureException(err);\r\n }\r\n catch (e) {}\r\n }\r\n });\r\n }\r\n\r\n function loadGoodSuccess(data) {\r\n // var indentation = data.description.lines[data.description.lines.length - 1].indent;\r\n // state.currentIndentation = indentation;\r\n vm.good.generalInfo.description = data.good.description;\r\n vm.good.generalInfo.measure_series = data.good.measure_series;\r\n vm.good.generalInfo.restitutions = data.good.restitutions;\r\n vm.good.generalInfo.result_valid_on = data.good.result_valid_on;\r\n vm.good.generalInfo.not_up_to_date = data.good.not_up_to_date;\r\n\r\n vm.good.generalInfo.notes = data.good.notes;\r\n\r\n vm.monetaryUnitsUsedInMeasures = data.monetaryUnitsUsedInMeasures;\r\n vm.possibleUnitsForCurrencyConversion = data.metadata.possibleUnitsForCurrencyConversion;\r\n vm.isLoading.generalInfo = false;\r\n vm.isLoading.measures = false;\r\n setRecentCode();\r\n\r\n var countriesWithUccPreferenceCodes = ['NL', 'BE', 'SE'];\r\n var measuresWithUccPreferenceCodes = data.good.measures.filter(m => !!m.ucc_preference_codes);\r\n if (measuresWithUccPreferenceCodes.length === 0 || countriesWithUccPreferenceCodes.indexOf(state.filter.referenceCountry) === -1) {\r\n if (state.filter.movement === 'import') {\r\n uccSettingChanged('no');\r\n }\r\n vm.showUccToggle = false;\r\n }\r\n else {\r\n vm.showUccToggle = true;\r\n }\r\n\r\n loadMeasures(state.filter.countryCode);\r\n }\r\n\r\n function setRecentCode() {\r\n if (!vm.good || !vm.good.generalInfo || !vm.good.generalInfo.code)\r\n return;\r\n\r\n preferences.add({\r\n name: vm.good.generalInfo.code + '_' + state.filter.movement,\r\n category: 'recent_codes',\r\n value: 'goodsnom=' + vm.good.generalInfo.code + '&type=' + state.filter.movement,\r\n valueType: 'stringValue'\r\n });\r\n }\r\n\r\n function loadMeasures(countryCode) {\r\n vm.validationErrors = {\r\n quantities: {}\r\n };\r\n return goodDataService\r\n .loadMeasures(countryCode)\r\n .then(function (measuresResult) {\r\n loadMeasuresCompleted(measuresResult);\r\n });\r\n }\r\n\r\n function loadMeasuresCompleted(measuresResult) {\r\n\r\n vm.hasMeursing = measuresResult.has_meursing;\r\n\r\n var hasAutonomousTariffSuspension = _.some(measuresResult.measures, function (measure) {\r\n return measure.type_id === '112';\r\n });\r\n\r\n if (hasAutonomousTariffSuspension) {\r\n vm.hasAutonomousTariffSuspension = true;\r\n }\r\n\r\n var measurePreferenceCodesProperty = vm.state.uccModeEnabled === 'yes' ? 'ucc_preference_codes' : 'preference_codes';\r\n // TODO: convert to objects\r\n vm.possiblePreferenceCodes = _.chain(measuresResult.measures)\r\n .filter(function (measure) { return !!measure[measurePreferenceCodesProperty]; })\r\n .flatMap(function (measure) { return measure[measurePreferenceCodesProperty] })\r\n .uniqBy(function (preferenceCode) { return preferenceCode })\r\n .sortBy(function (preferenceCode) { return preferenceCode })\r\n .map(function (preferenceCode) {\r\n return _.find(vm.preferenceCodes, function(preferenceCodeObject) {\r\n return preferenceCodeObject.code === preferenceCode;\r\n });\r\n })\r\n .value();\r\n\r\n var possibleAdditionalCodes = _.chain(measuresResult.measures)\r\n .filter(function (measure) { return !!measure.additional_code; })\r\n .map(function (measure) { return measure.additional_code })\r\n .uniqBy(function (additionalCode) { return additionalCode.type + additionalCode.code })\r\n .sortBy(function (additionalCode) { return additionalCode.type + additionalCode.code })\r\n .value();\r\n\r\n vm.applicableAntiDumpingAdditionalCodes = _.filter(possibleAdditionalCodes, function(additionalCode) {\r\n return antiDumpingAdditionalCodeTypes.indexOf(additionalCode.type) !== -1;\r\n });\r\n\r\n // console.log('loadMeasuresCompleted', vm);\r\n\r\n vm.otherApplicableAdditionalTaricCodes = _.chain(possibleAdditionalCodes)\r\n .filter(function(additionalCode) {\r\n return otherAdditionalTaricCodeTypes.indexOf(additionalCode.type) !== -1;\r\n })\r\n .reduce(function(memo, additionalCode) {\r\n var codesOfType = _.find(memo, function(codesGroupedByType) {\r\n return codesGroupedByType.type === additionalCode.type;\r\n });\r\n if (codesOfType === undefined) {\r\n memo.push({\r\n type: additionalCode.type,\r\n codes: [ additionalCode ]\r\n });\r\n }\r\n else {\r\n codesOfType.codes.push(additionalCode);\r\n }\r\n return memo;\r\n }, [])\r\n .map(function(codeGroup) {\r\n codeGroup.codes = _.sortBy(codeGroup.codes, function(additionalCode) {\r\n return additionalCode.type + additionalCode.code;\r\n });\r\n return codeGroup;\r\n })\r\n .value();\r\n\r\n // console.log('otherApplicableAdditionalTaricCodes', vm.otherApplicableAdditionalTaricCodes);\r\n\r\n \r\n vm.applicableNationalAdditionalCodes = _.chain(possibleAdditionalCodes)\r\n .filter(function(additionalCode) {\r\n return antiDumpingAdditionalCodeTypes.indexOf(additionalCode.type) === -1 && otherAdditionalTaricCodeTypes.indexOf(additionalCode.type) === -1;\r\n })\r\n .sortBy(function (additionalCode) { return additionalCode.type + additionalCode.code; })\r\n .value();\r\n \r\n if (vm.state.filter.referenceCountry === 'SE' || vm.state.filter.referenceCountry === 'IT') {\r\n var applicableNationalAdditionalCodeTypes = _.chain(vm.applicableNationalAdditionalCodes)\r\n .map(code => code.type)\r\n .uniq()\r\n .sort()\r\n .value();\r\n if (applicableNationalAdditionalCodeTypes.length > 1) {\r\n var lastType = applicableNationalAdditionalCodeTypes[applicableNationalAdditionalCodeTypes.length - 1];\r\n vm.applicableSecondNationalAdditionalCodes = _.filter(vm.applicableNationalAdditionalCodes, function(additionalCode) {\r\n return additionalCode.type === lastType;\r\n });\r\n vm.applicableNationalAdditionalCodes = _.filter(vm.applicableNationalAdditionalCodes, function(additionalCode) {\r\n return additionalCode.type !== lastType;\r\n });\r\n\r\n }\r\n }\r\n\r\n if (vm.applicableNationalAdditionalCodes.length === 0) {\r\n vm.nationalAdditionalCodeIsOptional = true;\r\n vm.applicableNationalAdditionalCodes = vm.optionalNationalAdditionalCodes;\r\n }\r\n\r\n vm.hasAdditionalCodes = vm.hasMeursing ||\r\n vm.applicableAntiDumpingAdditionalCodes.length > 0 ||\r\n _.size(vm.otherApplicableAdditionalTaricCodes) > 0 ||\r\n (vm.state.filter.movement === 'import' && vm.applicableNationalAdditionalCodes && vm.applicableNationalAdditionalCodes.length > 0);\r\n\r\n // console.log('applicableNationalAdditionalCodes', vm.applicableNationalAdditionalCodes);\r\n\r\n\r\n // Clear additional codes which are not applicable for the country\r\n\r\n var antiDumpingAdditionalCodeIsApplicable = _.some(vm.applicableAntiDumpingAdditionalCodes, function (applicableCode) {\r\n return vm.antiDumpingAdditionalCode &&\r\n vm.antiDumpingAdditionalCode.type === applicableCode.type &&\r\n vm.antiDumpingAdditionalCode.code === applicableCode.code;\r\n });\r\n\r\n if (!antiDumpingAdditionalCodeIsApplicable) {\r\n vm.antiDumpingAdditionalCode = null;\r\n }\r\n\r\n var preferenceCodeIsApplicable = _.some(vm.possiblePreferenceCodes, function (possiblePreferenceCode) {\r\n return vm.preferenceCode && vm.preferenceCode.code === possiblePreferenceCode.code;\r\n });\r\n\r\n if (!preferenceCodeIsApplicable) {\r\n vm.preferenceCode = null;\r\n }\r\n\r\n\r\n _.forEach(vm.otherAdditionalTaricCodes, function(actualCode, type) {\r\n var groupedApplicableCodes = _.find(vm.otherApplicableAdditionalTaricCodes, function(group) {\r\n return group.type === type;\r\n });\r\n if (groupedApplicableCodes === undefined) {\r\n delete vm.otherAdditionalTaricCodes[type];\r\n }\r\n else {\r\n var actualCodeIsApplicable = _.some(groupedApplicableCodes.codes, function (applicableCode) {\r\n return actualCode && actualCode.type === applicableCode.type && actualCode.code === applicableCode.code;\r\n });\r\n if (!actualCodeIsApplicable) {\r\n delete vm.otherAdditionalTaricCodes[type];\r\n }\r\n }\r\n });\r\n\r\n // Filter measures\r\n\r\n var measures = _.filter(measuresResult.measures, function (measure) {\r\n return measureIsApplicableForAdditionalCode(measure, vm.antiDumpingAdditionalCode);\r\n });\r\n\r\n measures = _.filter(measures, function (measure) {\r\n if (vm.state.filter.referenceCountry === 'SE' || vm.state.filter.referenceCountry === 'IT') {\r\n return measureIsApplicableForAdditionalCode(measure, vm.nationalAdditionalCodeObject) &&\r\n measureIsApplicableForAdditionalCode(measure, vm.secondNationalAdditionalCodeObject);\r\n }\r\n return measureIsApplicableForAdditionalCode(measure, vm.nationalAdditionalCodeObject);\r\n });\r\n\r\n _.forEach(vm.otherAdditionalTaricCodes, function(additionalCode) {\r\n measures = _.filter(measures, function (measure) {\r\n return measureIsApplicableForAdditionalCode(measure, additionalCode);\r\n });\r\n });\r\n\r\n var measurePreferenceCodesProperty = vm.state.uccModeEnabled === 'yes' ? 'ucc_preference_codes' : 'preference_codes';\r\n if (vm.preferenceCode && state.filter.referenceCountry != 'GB') {\r\n measures = _.filter(measures, function (measure) {\r\n return !measure[measurePreferenceCodesProperty] ||\r\n measure[measurePreferenceCodesProperty].length === 0 ||\r\n measure[measurePreferenceCodesProperty].indexOf(vm.preferenceCode.code) > -1;\r\n });\r\n }\r\n\r\n var applicableDutyMeasures = _.filter(measures, function (measure) {\r\n return measure.series === 'C';\r\n });\r\n\r\n vm.applicableDutyMeasureTypes = _.chain(applicableDutyMeasures)\r\n .map(function (measure) {\r\n return {\r\n description: measure.description,\r\n id: measure.type_id,\r\n preference_codes: measure.preference_codes,\r\n ucc_preference_codes: measure.ucc_preference_codes,\r\n ucc_end_use_procedure_code_44: measure.ucc_end_use_procedure_code_44,\r\n };\r\n })\r\n .groupBy('id')\r\n .map(function (group) {\r\n return {\r\n description: group[0].description,\r\n id: group[0].id,\r\n preference_codes: _.chain(group).flatMap('preference_codes').uniq().sort().value(),\r\n ucc_preference_codes: _.chain(group).flatMap('ucc_preference_codes').uniq().sort().value(),\r\n ucc_end_use_procedure_code_44: group[0].ucc_end_use_procedure_code_44\r\n };\r\n })\r\n .value();\r\n\r\n if (vm.dutyMeasureType) {\r\n var dutyMeasureTypeIsApplicable = _.some(vm.applicableDutyMeasureTypes, function (measureType) {\r\n return vm.dutyMeasureType.id === measureType.id;\r\n });\r\n if (!dutyMeasureTypeIsApplicable) {\r\n vm.dutyMeasureType = null;\r\n }\r\n }\r\n\r\n if (vm.dutyMeasureType) {\r\n measures = _.filter(measures, function (measure) {\r\n return measure.series !== 'C' || measure.type_id === vm.dutyMeasureType.id;\r\n });\r\n }\r\n\r\n if (vm.dutyMeasureType || vm.preferenceCode) {\r\n vm.applicableOrderNumbers = _.chain(measures)\r\n .filter(function (measure) {\r\n return !!measure.ordernumber;\r\n })\r\n .map(function (measure) {\r\n return measure.ordernumber;\r\n })\r\n .uniqBy()\r\n .value();\r\n }\r\n else {\r\n vm.applicableOrderNumbers = [];\r\n }\r\n\r\n\r\n\r\n if (vm.orderNumber && vm.applicableOrderNumbers && vm.applicableOrderNumbers.indexOf(vm.orderNumber) === -1) {\r\n vm.orderNumber = null;\r\n }\r\n\r\n if (vm.applicableOrderNumbers && vm.applicableOrderNumbers.length === 1) {\r\n vm.orderNumber = vm.applicableOrderNumbers[0];\r\n }\r\n\r\n if (vm.orderNumber) {\r\n measures = _.filter(measures, function (measure) {\r\n return measure.series !== 'C' || measure.ordernumber === vm.orderNumber;\r\n });\r\n }\r\n\r\n vm.possibleCertificateCodes = _.chain(measures)\r\n .filter(function (measure) {\r\n return !!measure.conditions;\r\n })\r\n .flatMap(function (measure) {\r\n return measure.conditions;\r\n })\r\n .filter(function (condition) {\r\n return !!condition.certificate;\r\n })\r\n .map(function (condition) {\r\n return condition.certificate;\r\n })\r\n .uniqBy(function (certificate) {\r\n return certificate.type + certificate.code;\r\n })\r\n .sortBy(function (certificate) {\r\n return certificate.type + certificate.code;\r\n })\r\n .value();\r\n\r\n vm.measures = measures;\r\n\r\n if (vm.dutyMeasureType) {\r\n let possiblePreferenceCodesForDutyMeasureType = _.chain(measures)\r\n .filter(function (measure) {\r\n return measure.type_id === vm.dutyMeasureType.id;\r\n })\r\n .flatMap(function (measure) {\r\n return measure[measurePreferenceCodesProperty];\r\n })\r\n .uniq()\r\n .value();\r\n if (possiblePreferenceCodesForDutyMeasureType.length === 1) {\r\n vm.preferenceCode = _.find(vm.possiblePreferenceCodes, function(p) {\r\n return p.code === possiblePreferenceCodesForDutyMeasureType[0];\r\n });\r\n }\r\n }\r\n\r\n vm.good.numberOfMeasures = vm.measures.length;\r\n\r\n vm.good.measures = measureGroupingService.group(measures, state.filter.referenceCountry);\r\n }\r\n\r\n function measureIsApplicableForAdditionalCode(measure, additionalCode) {\r\n if (!additionalCode) {\r\n return true;\r\n }\r\n if (!measure.additional_code) {\r\n return true;\r\n }\r\n if (measure.additional_code.type !== additionalCode.type) {\r\n if (antiDumpingAdditionalCodeTypes.indexOf(measure.additional_code.type) > -1 && antiDumpingAdditionalCodeTypes.indexOf(additionalCode.type) > -1) {\r\n return false;\r\n }\r\n if (nationalAdditionalCodeTypes.indexOf(measure.additional_code.type) > -1 && nationalAdditionalCodeTypes.indexOf(additionalCode.type) > -1) {\r\n if (vm.state.filter.referenceCountry === 'SE' || vm.state.filter.referenceCountry === 'IT') {\r\n return true;\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n if (measure.additional_code.type === additionalCode.type && measure.additional_code.code === additionalCode.code) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n function movementChanged() {\r\n if (state.filter.movement === 'import') {\r\n $location.url('/search/' + vm.good.generalInfo.code);\r\n }\r\n else {\r\n vm.state.currentIndentation = null; // we're changing the goods code, so we should reset the indentation, too\r\n $location.url('/search/' + vm.good.generalInfo.code.substr(0, 8) + '00');\r\n }\r\n }\r\n\r\n function loadMeursingTariffs() {\r\n loadGood(vm.good.generalInfo.code, vm.nationalAdditionalCode, vm.meursingAdditionalCode, vm.outputCurrency);\r\n }\r\n\r\n function showMeursingAdditionalCodeModal () {\r\n goodModals.meursing\r\n .show()\r\n .result\r\n .then(function (result) {\r\n if (!result && !result.code)\r\n return;\r\n vm.meursingAdditionalCode = '7' + result.code;\r\n loadMeursingTariffs();\r\n })\r\n .catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return vm;\r\n}","module.exports = [measureFiltersDirective];\r\n\r\nfunction measureFiltersDirective() {\r\n var directive = {\r\n restrict: 'E',\r\n templateUrl: 'good/directives/form/measure-filters-export-small.html'\r\n };\r\n\r\n return directive;\r\n}\r\n","module.exports = [measureFiltersDirective];\r\n\r\nfunction measureFiltersDirective() {\r\n var directive = {\r\n restrict: 'E',\r\n templateUrl: 'good/directives/form/measure-filters-import-small.html'\r\n };\r\n\r\n return directive;\r\n}\r\n","module.exports = [measureFiltersDirective];\r\n\r\nfunction measureFiltersDirective() {\r\n var directive = {\r\n restrict: 'E',\r\n templateUrl: 'good/directives/form/measure-filters-import.html'\r\n };\r\n\r\n return directive;\r\n}\r\n","module.exports = [valueQuantityImportDirective];\r\n\r\nfunction valueQuantityImportDirective() {\r\n var directive = {\r\n restrict: 'E',\r\n templateUrl: 'good/directives/form/value-quantity-import.html'\r\n };\r\n\r\n return directive;\r\n}\r\n","module.exports = ['$analytics', '$uibModal', meursingModal];\r\n\r\nfunction meursingModal($analytics, $uibModal) {\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n meursingModalController.$inject = ['$uibModalInstance', 'common', 'dataContext'];\r\n\r\n function meursingModalController($uibModalInstance, common, dataContext) {\r\n var vm = {\r\n cancel: cancel,\r\n updateFilters: updateFilters,\r\n filterMeursingMelk: filterMeursingMelk,\r\n filterMeursingZetmeel: filterMeursingZetmeel,\r\n invalidCombination: false,\r\n isLoadingTypes: false,\r\n loadMeursingHeaders: loadMeursingHeaders,\r\n meursingAdditionalCode: null,\r\n meursingFilter: {\r\n melkvet: null,\r\n melkproteinen: null,\r\n zetmeel: null,\r\n saccharose: null\r\n },\r\n meursingHeaders: {\r\n melkvet: ['a', 'b'],\r\n melkproteinen: [],\r\n filteredProteinen: [],\r\n zetmeel: [],\r\n saccharose: [],\r\n filteredSaccharose: [],\r\n original: []\r\n },\r\n ok: ok\r\n };\r\n\r\n function updateFilters() {\r\n vm.invalidCombination = false;\r\n vm.meursingHeaders.filteredProteinen = _.filter(vm.meursingHeaders.melkproteinen, filterMeursingMelk);\r\n vm.meursingHeaders.filteredSaccharose = _.filter(vm.meursingHeaders.saccharose, filterMeursingZetmeel);\r\n if (!vm.meursingFilter.melkproteinen && vm.meursingHeaders.filteredProteinen) {\r\n vm.meursingFilter.melkproteinen = vm.meursingHeaders.filteredProteinen[0];\r\n }\r\n if (!vm.meursingFilter.saccharose && vm.meursingHeaders.filteredSaccharose) {\r\n vm.meursingFilter.saccharose = vm.meursingHeaders.filteredSaccharose[0];\r\n }\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function filterMeursingMelk(selectedItem) {\r\n var originalMelkvet = _.find(vm.meursingHeaders.original, function (header) { return header.numb === '010' && header.row_col_id === '0'; });\r\n var subheader = _.filter(originalMelkvet.subheaders, function (subheader) { return subheader.name === vm.meursingFilter.melkvet; });\r\n var subheaderSeqNumbs = _.map(subheader, function (subheader) { return subheader.seq_numb });\r\n\r\n return subheaderSeqNumbs.indexOf(selectedItem.seq_numb) > -1;\r\n }\r\n\r\n function filterMeursingZetmeel(selectedItem) {\r\n var originalZetmeel = _.find(vm.meursingHeaders.original, function (header) { return header.numb === '010' && header.row_col_id === '1'; });\r\n var subheader = _.filter(originalZetmeel.subheaders, function (subheader) { return subheader.name === vm.meursingFilter.zetmeel; });\r\n var subheaderSeqNumbs = _.map(subheader, function (subheader) { return subheader.seq_numb });\r\n\r\n return subheaderSeqNumbs.indexOf(selectedItem.seq_numb) > -1;\r\n }\r\n\r\n function loadMeursingAdditionalCode() {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/meursing/additionalcode';\r\n var headers = _.cloneDeep(vm.meursingHeaders.original);\r\n\r\n for (var i = 0; i < headers.length; i++) {\r\n var meursingHeader = headers[i];\r\n\r\n if (meursingHeader.numb === '010' && meursingHeader.row_col_id === '0') {\r\n meursingHeader.subheaders = [_.find(meursingHeader.subheaders, function (subheader) { return subheader.seq_numb === vm.meursingFilter.melkproteinen.seq_numb })];\r\n }\r\n else if (meursingHeader.numb === '010' && meursingHeader.row_col_id === '1') {\r\n meursingHeader.subheaders = [_.find(meursingHeader.subheaders, function (subheader) { return subheader.seq_numb === vm.meursingFilter.saccharose.seq_numb })];\r\n }\r\n else if (meursingHeader.numb === '020' && meursingHeader.row_col_id === '0') {\r\n meursingHeader.subheaders = [_.find(meursingHeader.subheaders, function (subheader) { return subheader.seq_numb === vm.meursingFilter.melkproteinen.seq_numb })];\r\n }\r\n else if (meursingHeader.numb === '020' && meursingHeader.row_col_id === '1') {\r\n meursingHeader.subheaders = [_.find(meursingHeader.subheaders, function (subheader) { return subheader.seq_numb === vm.meursingFilter.saccharose.seq_numb })];\r\n }\r\n }\r\n\r\n var args = { headers: headers };\r\n\r\n return dataContext.post(url, args);\r\n }\r\n\r\n function loadMeursingHeaders() {\r\n dataContext\r\n .get(common.config.apiHosts[common.config.currentApi] + '/meursing')\r\n .then(function (data) {\r\n vm.meursingHeaders.original = data.headers;\r\n _.forEach(data.headers, function (meursingHeader) {\r\n if (meursingHeader.numb === '010' && meursingHeader.row_col_id === '0') {\r\n vm.meursingHeaders.melkvet = _.uniq(_.map(meursingHeader.subheaders, function (sub) { return sub.name; }));\r\n vm.meursingFilter.melkvet = vm.meursingHeaders.melkvet[0];\r\n }\r\n else if (meursingHeader.numb === '010' && meursingHeader.row_col_id === '1') {\r\n vm.meursingHeaders.zetmeel = _.uniq(_.map(meursingHeader.subheaders, function (sub) { return sub.name; }));\r\n vm.meursingFilter.zetmeel = vm.meursingHeaders.zetmeel[0];\r\n }\r\n else if (meursingHeader.numb === '020' && meursingHeader.row_col_id === '0') {\r\n vm.meursingHeaders.melkproteinen = meursingHeader.subheaders;\r\n vm.meursingFilter.melkproteinen = vm.meursingHeaders.melkproteinen[0];\r\n }\r\n else if (meursingHeader.numb === '020' && meursingHeader.row_col_id === '1') {\r\n vm.meursingHeaders.saccharose = meursingHeader.subheaders;\r\n vm.meursingFilter.saccharose = vm.meursingHeaders.saccharose[0];\r\n }\r\n });\r\n updateFilters();\r\n });\r\n }\r\n\r\n function ok() {\r\n loadMeursingAdditionalCode().then(function(meursingAdditionalCode) {\r\n if (meursingAdditionalCode === null) {\r\n vm.invalidCombination = true;\r\n }\r\n else {\r\n $uibModalInstance.close(meursingAdditionalCode);\r\n }\r\n });\r\n }\r\n\r\n loadMeursingHeaders();\r\n\r\n return vm;\r\n }\r\n\r\n function showModal() {\r\n $analytics.eventTrack('open-modal-meursing');\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: meursingModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n size: 'lg',\r\n templateUrl: 'good/modals/meursing-code.html',\r\n windowClass: 'modal-meursing-code'\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['meursingModal', goodModalsService];\r\n\r\nfunction goodModalsService(meursingModal) {\r\n\r\n var service = {\r\n meursing: meursingModal,\r\n };\r\n\r\n return service;\r\n\r\n}\r\n","module.exports = ['$analytics', '$uibModal', ukCertificateGuidanceModal];\r\n\r\nfunction ukCertificateGuidanceModal($analytics, $uibModal) {\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n ukCertificateGuidanceModalController.$inject = ['$uibModalInstance', 'certificates'];\r\n\r\n function ukCertificateGuidanceModalController($uibModalInstance, certificates) {\r\n var vm = {\r\n certificates: certificates,\r\n cancel: cancel,\r\n ok: ok\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function ok(code) {\r\n $uibModalInstance.close(code);\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(certificates) {\r\n $analytics.eventTrack('open-modal-uk-certificate-guidance');\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: ukCertificateGuidanceModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n certificates: function () {\r\n return certificates;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'good/modals/uk-certificate-guidance.html',\r\n windowClass: 'modal-uk-certificate-guidance'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['$filter', 'common', 'dataContext', 'applicationStateService', 'serializationService', goodDataService];\r\n\r\nfunction goodDataService($filter, common, context, state, serializationService) {\r\n var service = {\r\n data: null,\r\n loadGood: loadGood,\r\n loadMeasures: loadMeasures,\r\n evaluateMeasureConditions: evaluateMeasureConditions\r\n };\r\n\r\n function evaluateMeasureConditions(query) {\r\n var quantities = serializationService.serializeQuantities(query.quantities);\r\n\r\n var additionalCodes = _.map(query.additionalCodes, function(additionalCode) {\r\n return '' + additionalCode.type + additionalCode.code;\r\n });\r\n var certificateCodes = _.map(query.certificateCodes, function(certificateCode) {\r\n if (certificateCode.origin === 'IT') {\r\n return '' + certificateCode.code + certificateCode.type; \r\n }\t\r\n return '' + certificateCode.type + certificateCode.code;\r\n });\r\n var preferenceCode = query.preferenceCode ? query.preferenceCode.code : null;\r\n var customsValue = serializationService.serializeCustomsValue(query.customsValue);\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] +\r\n '/goods/' + query.commodityCode + '/evaluate_measure_conditions' +\r\n '?lang=' + common.language.get() +\r\n '&additionalcodes=' + additionalCodes.join(',') +\r\n '&certificatecodes=' + certificateCodes.join(',') +\r\n '&preferencecode=' + (preferenceCode || '') +\r\n '&customsvalue=' + customsValue +\r\n '&dutymeasuretypeid=' + (query.dutyMeasureTypeId || '') +\r\n '&movement=' + query.tradeMovement +\r\n '&ordernumber=' + (query.orderNumber || '') +\r\n '&quantities=' + quantities.join(',') +\r\n '&country=' + (query.countryCode || '') +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date +\r\n '&ucc=' + (query.uccModeEnabled || '');\r\n return context.get(url);\r\n }\r\n\r\n function loadGood(goodsnom, nationalAdditionalCode, meursingAdditionalCode, currency, uccModeEnabled) {\r\n var deferred = common.$q.defer();\r\n\r\n loadGoodRaw(goodsnom, nationalAdditionalCode, meursingAdditionalCode, currency, uccModeEnabled)\r\n .then(function (data) {\r\n\r\n service.data = data;\r\n if (data.good && data.good.code) {\r\n if (state.filter.referenceCountry === 'GB') {\r\n if (data.good.result_valid_on && data.good.result_valid_on.substr(0, 10) !== state.filter.date) {\r\n data.good.not_up_to_date = true;\r\n }\r\n }\r\n }\r\n deferred.resolve(data);\r\n }, function(err) {\r\n return deferred.reject(err);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n // Loads the raw data for a good, based on its goodsnom\r\n function loadGoodRaw(goodsnom, nationalAdditionalCode, meursingAdditionalCode, currency, uccModeEnabled) {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/goods/' + goodsnom +\r\n '?movement=' + state.filter.movement +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&ucc=' + (uccModeEnabled || '');\r\n\r\n if (state.filter.date !== null) {\r\n url += '&date=' + state.filter.date;\r\n }\r\n if (meursingAdditionalCode) {\r\n if (meursingAdditionalCode.length === 3) {\r\n meursingAdditionalCode = '7' + meursingAdditionalCode;\r\n }\r\n url += '&meursingcode=' + meursingAdditionalCode;\r\n }\r\n if (nationalAdditionalCode) {\r\n url += '&nac=' + nationalAdditionalCode;\r\n }\r\n if (currency) {\r\n url += '¤cycode=' + currency.code;\r\n }\r\n\r\n return context.get(url, 'GOOD');\r\n }\r\n\r\n function loadMeasures(countryCode) {\r\n var deferred = common.$q.defer();\r\n var measures = $filter('hasCountry')(service.data.good.measures, countryCode);\r\n if (state.filter.referenceCountry === 'NL') {\r\n var someMeasuresHaveAnOptionalNationalAdditionalCode = _.some(measures, function (measure) {\r\n return measure.additional_code && measure.additional_code.type === 'V';\r\n });\r\n if (someMeasuresHaveAnOptionalNationalAdditionalCode) {\r\n measures = _.filter(measures, function (measure) {\r\n if (measure.series !== 'P') {\r\n return true;\r\n }\r\n if (measure.additional_code === null) {\r\n return false;\r\n }\r\n if (measure.additional_code.type !== 'V') {\r\n return false;\r\n }\r\n return true;\r\n });\r\n }\r\n }\r\n var result = {\r\n has_meursing: _.some(measures, function (measure) {\r\n return measure.has_meursing;\r\n }),\r\n measures: measures\r\n }\r\n deferred.resolve(result);\r\n\r\n return deferred.promise;\r\n }\r\n\r\n return service;\r\n}","module.exports = ['$filter', '$translate', 'common', goodDisplayService];\r\n\r\nfunction goodDisplayService($filter, $translate, common) {\r\n var service = {\r\n collapseMeasures: collapseMeasures,\r\n copyDescription: copyDescription,\r\n countryCodeMatcher: countryCodeMatcher,\r\n countryNameMatcher: countryNameMatcher,\r\n expandMeasures: expandMeasures,\r\n getFinancialConditionDescription: getFinancialConditionDescription,\r\n hasAdditionalCode: hasAdditionalCode,\r\n hasAdditionalCodeDescription: hasAdditionalCodeDescription,\r\n translations: []\r\n };\r\n\r\n function attached() {\r\n $translate([\r\n 'goods.financialConditions.E.title',\r\n 'goods.financialConditions.E.headers.col1',\r\n 'goods.financialConditions.E.headers.col2',\r\n 'goods.financialConditions.F.title',\r\n 'goods.financialConditions.F.headers.col1',\r\n 'goods.financialConditions.F.headers.col2',\r\n 'goods.financialConditions.L.title',\r\n 'goods.financialConditions.L.headers.col1',\r\n 'goods.financialConditions.L.headers.col2',\r\n 'goods.financialConditions.M.title',\r\n 'goods.financialConditions.M.headers.col1',\r\n 'goods.financialConditions.M.headers.col2',\r\n 'goods.financialConditions.V.title',\r\n 'goods.financialConditions.V.headers.col1',\r\n 'goods.financialConditions.V.headers.col2',\r\n ]).then(function (result) {\r\n service.translations = result;\r\n });\r\n }\r\n\r\n function copyDescription(lines, movement) {\r\n var description = _.chain(lines)\r\n .drop() // drop chapter\r\n .map(function(line, index) {\r\n var indents = _.repeat('- ', line.indent);\r\n var code = line.code;\r\n if (index === lines.length - 2) { // minus 2 because we dropped one\r\n if (movement === 'export') {\r\n code = $filter('formatGnCode')(code);\r\n }\r\n else {\r\n code = $filter('formatTaricCode')(code);\r\n }\r\n }\r\n else {\r\n code = $filter('stripTaricCode')(code);\r\n code = $filter('formatTaricCode')(code);\r\n }\r\n return code + '\\t' + indents + line.description;\r\n })\r\n .join(\"\\r\\n\")\r\n .value();\r\n common.interaction.copyTextToClipboard(description);\r\n }\r\n\r\n function collapseMeasures(measures) {\r\n _.forEach(measures, function (measure) {\r\n measure.expanded = false;\r\n if (measure.measures && measure.measures.length > 0) {\r\n _.forEach(measure.measures, function (submeasure) {\r\n submeasure.expanded = false;\r\n });\r\n }\r\n });\r\n }\r\n\r\n function countryCodeMatcher(strs) {\r\n return function findMatches(q, cb) {\r\n var matches, substrRegex;\r\n\r\n // an array that will be populated with substring matches\r\n matches = [];\r\n\r\n if (q.length > 1) {\r\n q = q.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\r\n // regex used to determine if a string contains the substring `q`\r\n substrRegex = new RegExp(q, 'i');\r\n\r\n // iterate through the pool of strings and for any string that\r\n // contains the substring `q`, add it to the `matches` array\r\n _.each(strs, function (str, i) {\r\n if (substrRegex.test(str.code)) {\r\n // the typeahead jQuery plugin expects suggestions to a\r\n // JavaScript object, refer to typeahead docs for more info\r\n matches.push({ value: str.name + ' (' + str.code + ')' });\r\n }\r\n });\r\n }\r\n cb(matches);\r\n };\r\n }\r\n\r\n function countryNameMatcher(strs) {\r\n return function findMatches(q, cb) {\r\n var matches, substrRegex;\r\n\r\n // an array that will be populated with substring matches\r\n matches = [];\r\n\r\n q = q.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\r\n // regex used to determine if a string contains the substring `q`\r\n substrRegex = new RegExp(q, 'i');\r\n\r\n // iterate through the pool of strings and for any string that\r\n // contains the substring `q`, add it to the `matches` array\r\n // second check country names\r\n _.each(strs, function (str, i) {\r\n if (substrRegex.test(str.name)) {\r\n // the typeahead jQuery plugin expects suggestions to a\r\n // JavaScript object, refer to typeahead docs for more info\r\n matches.push({ value: str.name + ' (' + str.code + ')' });\r\n }\r\n });\r\n\r\n cb(matches);\r\n };\r\n }\r\n\r\n function expandMeasures(measures) {\r\n _.forEach(measures, function (measure) {\r\n measure.expanded = true;\r\n if (measure.measures && measure.measures.length > 0) {\r\n _.forEach(measure.measures, function (submeasure) {\r\n submeasure.expanded = true;\r\n });\r\n }\r\n });\r\n }\r\n\r\n function getFinancialConditionDescription(code) {\r\n var output = {\r\n title: service.translations['goods.financialConditions.' + code + '.title'],\r\n headers: [service.translations[\r\n 'goods.financialConditions.' + code + '.headers.col1'], \r\n service.translations['goods.financialConditions.' + code + '.headers.col2'\r\n ]]\r\n };\r\n\r\n return output;\r\n }\r\n\r\n function hasAdditionalCode(measure, additionalCodeFilter) {\r\n var filterNormalizedToAdditionalCode;\r\n if (additionalCodeFilter === null || additionalCodeFilter === undefined || additionalCodeFilter === '')\r\n return true;\r\n\r\n filterNormalizedToAdditionalCode = additionalCodeFilter.toLowerCase().replace(\"-\", \"\").replace(/\\s/g, \"\");\r\n\r\n for (var i = 0; i < measure.additional_codes.length; i++) {\r\n if (measure.additional_codes[i] !== null) {\r\n if (measure.additional_codes[i].description.toLowerCase().indexOf(additionalCodeFilter.toLowerCase()) > -1)\r\n return true;\r\n if (measure.additional_codes[i].type.toLowerCase().indexOf(filterNormalizedToAdditionalCode.substr(0, 1)) > -1) { // search query starts with additional-code-type\r\n if (measure.additional_codes[i].code.indexOf(filterNormalizedToAdditionalCode.substr(1)) == 0)\r\n return true;\r\n }\r\n else if (measure.additional_codes[i].code.indexOf(filterNormalizedToAdditionalCode) == 0) { // type not entered but code matches\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function hasAdditionalCodeDescription(additionalCode, additionalCodeFilter) {\r\n var filterNormalizedToAdditionalCode;\r\n\r\n if (additionalCodeFilter === null || additionalCodeFilter === undefined || additionalCodeFilter === '')\r\n return true;\r\n\r\n filterNormalizedToAdditionalCode = additionalCodeFilter.toLowerCase().replace(\"-\", \"\").replace(/\\s/g, \"\");\r\n\r\n if (additionalCode.description !== null && additionalCode.description !== undefined && additionalCode.description.toLowerCase().indexOf(additionalCodeFilter.toLowerCase()) > -1)\r\n return true;\r\n\r\n if (additionalCode.type.toLowerCase().indexOf(filterNormalizedToAdditionalCode.substr(0, 1)) > -1) { // search query starts with additional-code-type\r\n if (additionalCode.code.indexOf(filterNormalizedToAdditionalCode.substr(1)) == 0)\r\n return true;\r\n }\r\n else if (additionalCode.code.indexOf(filterNormalizedToAdditionalCode) == 0) { // type not entered but code matches\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n attached();\r\n\r\n return service;\r\n}","module.exports = [goodModelsService];\r\n\r\nfunction goodModelsService() {\r\n var service = {\r\n measuresDisplayModel: measuresDisplayModel\r\n };\r\n\r\n function measuresDisplayModel() {\r\n return {\r\n import: {\r\n additionalDuties: [],\r\n antidumping: {\r\n financieel: [],\r\n nietFinancieel: []\r\n },\r\n conditions: [],\r\n tariffs: {\r\n accijns: [],\r\n contingenten: [],\r\n drd: [],\r\n preferenties: [],\r\n schorsingen: [],\r\n other: []\r\n },\r\n referencePrices: [],\r\n prohibitions: [],\r\n supplementaryAmount: [],\r\n toezichtAchteraf: [],\r\n vat: [],\r\n other: []\r\n },\r\n export: {\r\n additionalDuties: [],\r\n conditions: [],\r\n prohibitions: [],\r\n restitutions: [],\r\n toezichtAchteraf: [],\r\n other: []\r\n },\r\n general: {\r\n conditions: [],\r\n other: [],\r\n units: []\r\n }\r\n };\r\n }\r\n\r\n return service;\r\n}","module.exports = ['goodDisplayService', 'goodModelsService', measureGroupingService];\r\n\r\nfunction measureGroupingService(goodDisplayService, goodModelsService) {\r\n\r\n // This variable contains the result of the grouping process\r\n var measureGroupingResult;\r\n\r\n var service = {\r\n getCertificateGroupsFromConditionGroups: getCertificateGroupsFromConditionGroups,\r\n group: group,\r\n groupAntiDumpingMeasures: groupAntiDumpingMeasures,\r\n groupConditions: groupConditions,\r\n groupFinancialMeasures: groupFinancialMeasures,\r\n groupMeasures: groupMeasures,\r\n groupMeasuresByType: groupMeasuresByType,\r\n groupVatMeasures: groupVatMeasures,\r\n sortMeasuresByRegion: sortMeasuresByRegion,\r\n };\r\n\r\n return service;\r\n\r\n function group(measures, referenceCountry) {\r\n\r\n var measureSeriesIds = _.chain(measures)\r\n .map(function (measure) {\r\n return measure.series;\r\n })\r\n .uniq()\r\n .sortBy()\r\n .value();\r\n\r\n measureGroupingResult = new goodModelsService.measuresDisplayModel();\r\n\r\n _.forEach(measureSeriesIds, function (measureSeriesId) {\r\n var measuresInMeasureSeries = _.filter(measures, function (measure) {\r\n return measure.series === measureSeriesId;\r\n });\r\n groupMeasuresForMeasureSeries(measuresInMeasureSeries, measureSeriesId, referenceCountry);\r\n });\r\n\r\n return measureGroupingResult;\r\n\r\n }\r\n\r\n function groupMeasuresForMeasureSeries(measures, measureSeriesId, referenceCountry) {\r\n\r\n let sortedMeasures = service.sortMeasuresByRegion(measures);\r\n\r\n _.forEach(sortedMeasures, function (measure) {\r\n measure.conditionGroups = service.groupConditions(measure.conditions);\r\n measure.certificateGroups = service.getCertificateGroupsFromConditionGroups(measure.conditionGroups);\r\n\r\n measure.numberOfCertificates = _.filter(measure.conditions, function (condition) {\r\n return !!condition.certificate;\r\n }).length;\r\n });\r\n\r\n let groupedMeasures = service.groupMeasures(sortedMeasures);\r\n\r\n switch (measureSeriesId) {\r\n case 'A': {\r\n let measuresByType = service.groupMeasuresByType(groupedMeasures);\r\n _.forEach(measuresByType, function (group) {\r\n if (group.movement === 'import')\r\n measureGroupingResult.import.prohibitions.push(group);\r\n else if (group.movement === 'export')\r\n measureGroupingResult.export.prohibitions.push(group);\r\n });\r\n break;\r\n }\r\n case 'B': {\r\n let measuresByType = service.groupMeasuresByType(groupedMeasures);\r\n _.forEach(measuresByType, function (group) {\r\n if (group.movement === 'import')\r\n measureGroupingResult.import.conditions.push(group);\r\n else if (group.movement === 'export')\r\n measureGroupingResult.export.conditions.push(group);\r\n else\r\n measureGroupingResult.general.conditions.push(group);\r\n });\r\n break;\r\n }\r\n case 'C': {\r\n let financialMeasures = service.groupMeasuresByType(service.groupFinancialMeasures(groupedMeasures));\r\n _.forEach(financialMeasures, function (group) {\r\n switch (group.type_id) {\r\n case \"102\":\r\n case \"104\":\r\n case \"105\":\r\n measureGroupingResult.import.tariffs.other.push(group);\r\n break;\r\n case \"103\":\r\n measureGroupingResult.import.tariffs.drd.push(group);\r\n break;\r\n case \"106\":\r\n case \"140\":\r\n case \"142\":\r\n case \"145\":\r\n measureGroupingResult.import.tariffs.preferenties.push(group);\r\n break;\r\n case \"112\":\r\n case \"115\":\r\n case \"119\":\r\n case \"141\":\r\n measureGroupingResult.import.tariffs.schorsingen.push(group);\r\n break;\r\n case \"122\":\r\n case \"123\":\r\n case \"143\":\r\n case \"144\":\r\n case \"146\":\r\n case \"147\":\r\n case \"907\":\r\n measureGroupingResult.import.tariffs.contingenten.push(group);\r\n break;\r\n default:\r\n measureGroupingResult.import.tariffs.other.push(group);\r\n break;\r\n }\r\n });\r\n break;\r\n }\r\n case 'D': {\r\n sortedMeasures = _.sortBy(sortedMeasures, function (measure) {\r\n return measure.region.code + (measure.additional_code === null ? '' : (1000 - parseInt(measure.additional_code.code)));\r\n });\r\n\r\n let financialMeasures = service.groupAntiDumpingMeasures(sortedMeasures);\r\n _.forEach(financialMeasures, function (group) {\r\n switch (group.type_id) {\r\n case \"551\":\r\n case \"552\":\r\n case \"553\":\r\n case \"554\":\r\n case \"555\":\r\n measureGroupingResult.import.antidumping.financieel.push(group);\r\n break;\r\n }\r\n });\r\n\r\n var measuresByType = service.groupMeasuresByType(groupedMeasures);\r\n _.forEach(measuresByType, function (group) {\r\n if (['551', '552', '553', '554', '555'].indexOf(group.type_id) === -1) {\r\n measureGroupingResult.import.antidumping.nietFinancieel.push(group);\r\n }\r\n });\r\n break;\r\n }\r\n case 'E': {\r\n let financialMeasures = service.groupMeasuresByType(service.groupFinancialMeasures(groupedMeasures));\r\n _.forEach(financialMeasures, function (group) {\r\n measureGroupingResult.export.restitutions.push(group);\r\n });\r\n break;\r\n }\r\n case 'F':\r\n case 'J': {\r\n let financialMeasures = service.groupMeasuresByType(service.groupFinancialMeasures(groupedMeasures));\r\n _.forEach(financialMeasures, function (group) {\r\n if (group.movement === 'import')\r\n measureGroupingResult.import.additionalDuties.push(group);\r\n else if (group.movement === 'export')\r\n measureGroupingResult.export.additionalDuties.push(group);\r\n });\r\n break;\r\n }\r\n case 'K':\r\n case 'M': {\r\n let financialMeasures = service.groupMeasuresByType(service.groupFinancialMeasures(groupedMeasures));\r\n _.forEach(financialMeasures, function (group) {\r\n measureGroupingResult.import.referencePrices.push(group);\r\n });\r\n break;\r\n }\r\n case 'N': {\r\n let measuresByType = service.groupMeasuresByType(groupedMeasures);\r\n _.forEach(measuresByType, function (group) {\r\n if (group.movement === 'import')\r\n measureGroupingResult.import.toezichtAchteraf.push(group);\r\n else if (group.movement === 'export')\r\n measureGroupingResult.export.toezichtAchteraf.push(group);\r\n });\r\n break;\r\n }\r\n case 'O': {\r\n let measuresByType = service.groupMeasuresByType(service.groupFinancialMeasures(groupedMeasures));\r\n _.forEach(measuresByType, function (group) {\r\n measureGroupingResult.general.units.push(group);\r\n });\r\n\r\n break;\r\n }\r\n case '4': { // TODO: BE only\r\n let financialMeasures = service.groupMeasuresByType(service.groupFinancialMeasures(groupedMeasures));\r\n _.forEach(financialMeasures, function (group) {\r\n measureGroupingResult.import.vat.push(group);\r\n });\r\n break;\r\n }\r\n case 'P': // TODO: NL and GB only\r\n case 'Q': // TODO: NL and GB only\r\n case '5': { // TODO: BE only\r\n if (referenceCountry === 'DE') {\r\n if (measureSeriesId === 'P') {\r\n measureGroupingResult.import.vatDE = sortedMeasures;\r\n }\r\n else if (measureSeriesId === 'Q') {\r\n measureGroupingResult.import.exciseDE = sortedMeasures;\r\n }\r\n }\r\n else if (\r\n\r\n referenceCountry !== 'GB' && \r\n referenceCountry !== 'SE' && \r\n referenceCountry !== 'IT' && \r\n _.filter(sortedMeasures, function (measure) { \r\n return (measure.series === 'P' && measure.additional_code !== null) || \r\n measure.series === 'Q' || measure.series === '5'; \r\n }).length > 0\r\n\r\n ) {\r\n \r\n sortedMeasures = measures.sort(function (a, b) {\r\n if (a.additional_code == null && b.additional_code != null) {\r\n return -1;\r\n }\r\n else if (a.additional_code != null && b.additional_code == null) {\r\n return 1;\r\n }\r\n else if (a.additional_code == null && b.additional_code == null) {\r\n if (a.notes === null && b.notes !== null) {\r\n return -1;\r\n }\r\n else if (a.notes !== null && b.notes === null) {\r\n return 1;\r\n }\r\n else if (a.notes === null && b.notes === null) {\r\n return 0;\r\n }\r\n if (a.notes.length === 0 && b.notes.length !== 0) {\r\n return -1;\r\n }\r\n else if (a.notes.length !== 0 && b.notes.length === 0) {\r\n return 1;\r\n }\r\n else if (a.notes.length === 0 && b.notes.length === 0) {\r\n return 0;\r\n }\r\n if (a.notes[0].type > b.notes[0].type)\r\n return 1;\r\n else if (a.notes[0].type < b.notes[0].type)\r\n return -1;\r\n if (a.notes[0].code > b.notes[0].code)\r\n return 1;\r\n else if (a.notes[0].code < b.notes[0].code)\r\n return -1;\r\n return 0;\r\n }\r\n if (a.additional_code.type > b.additional_code.type)\r\n return 1;\r\n else if (a.additional_code.type < b.additional_code.type)\r\n return -1;\r\n if (a.additional_code.code > b.additional_code.code)\r\n return 1;\r\n else if (a.additional_code.code < b.additional_code.code)\r\n return -1;\r\n return 0;\r\n });\r\n if (referenceCountry === 'NL') {\r\n measureGroupingResult.import.vatExtended = service.groupVatMeasures(sortedMeasures, measureGroupingResult.import.vatExtended);\r\n }\r\n else { // i.e. referenceCountry === 'BE')\r\n measureGroupingResult.import.excise = service.groupVatMeasures(sortedMeasures, measureGroupingResult.import.excise);\r\n }\r\n _.forEach(measureGroupingResult.import.vatExtended, function (group) {\r\n group.measures = group.measures.sort(function (a, b) {\r\n return a.description > b.description ? 1 : -1;\r\n });\r\n });\r\n }\r\n else {\r\n let financialMeasures = service.groupMeasuresByType(service.groupFinancialMeasures(groupedMeasures));\r\n _.forEach(financialMeasures, function (group) {\r\n measureGroupingResult.import.vat.push(group);\r\n });\r\n }\r\n break;\r\n }\r\n case 'S': {\r\n let measuresByType = service.groupMeasuresByType(service.groupFinancialMeasures(groupedMeasures));\r\n _.forEach(measuresByType, function (group) {\r\n measureGroupingResult.import.supplementaryAmount.push(group);\r\n });\r\n\r\n break;\r\n }\r\n default: {\r\n let measuresByType = service.groupMeasuresByType(groupedMeasures);\r\n _.forEach(measuresByType, function (group) {\r\n if (group.movement === 'import')\r\n measureGroupingResult.import.other.push(group);\r\n else if (group.movement === 'export')\r\n measureGroupingResult.export.other.push(group);\r\n else\r\n measureGroupingResult.general.other.push(group);\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n\r\n function groupAntiDumpingMeasures(measures) {\r\n _.forEach(measures, function (measure) {\r\n if (measure.duty === '' && measure.conditions !== null && measure.conditions.length > 0) {\r\n var duties = [];\r\n _.forEach(measure.conditions, function (condition) {\r\n duties.push(condition.duty);\r\n });\r\n measure.duty = _.chain(duties)\r\n .uniq()\r\n .filter(function(duty){\r\n return !!duty;\r\n })\r\n .value()\r\n .join('; ');\r\n }\r\n });\r\n\r\n\r\n var groups = _.reduce(measures, function (memo, measure) {\r\n var g = _.find(memo, function (group) {\r\n return group.description === measure.description &&\r\n group.type_id === measure.type_id &&\r\n group.duty === measure.duty &&\r\n _.isEqual(group.conditions, measure.conditions) &&\r\n _.isEqual(group.region, measure.region) &&\r\n _.isEqual(group.excluded_regions, measure.excluded_regions) &&\r\n _.isEqual(group.notes, measure.notes) &&\r\n group.movement === measure.movement;\r\n });\r\n\r\n if (typeof (g) !== 'undefined') {\r\n if (g.hasAdditionalCodes === false)\r\n g.hasAdditionalCodes = measure.hasAdditionalCodes\r\n if (g.isExpandable === undefined || g.isExpandable === false)\r\n g.isExpandable = measure.conditions !== null && measure.conditions.length > 0;\r\n g.additional_codes.push(measure.additional_code);\r\n g.ids += '|' + measure.id;\r\n g.measures.push(measure);\r\n }\r\n else {\r\n memo.push({\r\n ids: '' + measure.id,\r\n additional_codes: [measure.additional_code],\r\n duty: measure.duty,\r\n hasAdditionalCodes: measure.hasAdditionalCodes,\r\n isExpandable: measure.conditions !== null && measure.conditions.length > 0,\r\n movement: measure.movement,\r\n description: measure.description,\r\n conditions: measure.conditions,\r\n conditionEvaluation: measure.conditionEvaluation,\r\n conditionGroups: measure.conditionGroups,\r\n certificateGroups: measure.certificateGroups,\r\n region: measure.region,\r\n excluded_regions: measure.excluded_regions,\r\n origin: measure.origin,\r\n series: measure.series,\r\n type_id: measure.type_id,\r\n notes: measure.notes,\r\n measures: [measure]\r\n });\r\n }\r\n return memo;\r\n }, []);\r\n\r\n groups = _.reduce(groups, function (memo, measure) {\r\n var g = _.find(memo, function (group) {\r\n return group.description === measure.description &&\r\n group.type_id === measure.type_id &&\r\n group.movement === measure.movement;\r\n });\r\n\r\n if (typeof (g) !== 'undefined') {\r\n if (g.hasAdditionalCodes === false)\r\n g.hasAdditionalCodes = measure.hasAdditionalCodes\r\n if (g.isExpandable === undefined || g.isExpandable === false)\r\n g.isExpandable = measure.additional_code !== null || (measure.conditions !== null && measure.conditions.length > 0);\r\n g.measures.push(measure);\r\n g.ids += '|' + measure.ids;\r\n }\r\n else {\r\n memo.push({\r\n ids: measure.ids,\r\n duty: measure.duty,\r\n hasAdditionalCodes: measure.hasAdditionalCodes,\r\n isExpandable: measure.isExpandable,\r\n movement: measure.movement,\r\n description: measure.description,\r\n conditions: measure.conditions,\r\n conditionEvaluation: measure.conditionEvaluation,\r\n conditionGroups: measure.conditionGroups,\r\n certificateGroups: measure.certificateGroups,\r\n region: measure.region,\r\n excluded_regions: measure.excluded_regions,\r\n origin: measure.origin,\r\n series: measure.series,\r\n type_id: measure.type_id,\r\n measures: [measure]\r\n });\r\n }\r\n return memo;\r\n }, []);\r\n\r\n return groups;\r\n }\r\n\r\n // Group conditions by code\r\n function groupConditions(conditions) {\r\n var groups = _.reduce(conditions, function (memo, condition) {\r\n var g = _.find(memo, function (group) {\r\n return group.code === condition.code;\r\n });\r\n\r\n if (typeof (g) !== 'undefined') {\r\n if (g.hasAmountDescription === false)\r\n g.hasAmountDescription = (condition.amount_description !== null && condition.amount_description !== '');\r\n if (g.hasCertificates === false)\r\n g.hasCertificates = (condition.certificate !== null);\r\n g.conditions.push(condition);\r\n }\r\n else {\r\n memo.push({\r\n hasAmountDescription: condition.amount_description !== null && condition.amount_description !== '',\r\n hasDuty: condition.duty !== null && condition.duty !== '',\r\n hasCertificates: condition.certificate !== null,\r\n code: condition.code,\r\n description: condition.description,\r\n descriptions: goodDisplayService.getFinancialConditionDescription(condition.code),\r\n conditions: [condition]\r\n });\r\n }\r\n return memo;\r\n }, []);\r\n\r\n return groups;\r\n }\r\n\r\n // Group measures by type, movement and duty\r\n function groupFinancialMeasures(measures) {\r\n var groups = _.reduce(measures, function (memo, measure) {\r\n var g = _.find(memo, function (group) {\r\n return group.type_id === measure.type_id &&\r\n group.movement === measure.movement &&\r\n group.duty === measure.duty &&\r\n measure.duty !== null && measure.duty !== '';\r\n });\r\n\r\n if (typeof (g) !== 'undefined') {\r\n if (g.isExpandable === false)\r\n g.isExpandable = measure.isExpandable;\r\n g.measures.push(measure);\r\n g.ids += '|' + measure.ids;\r\n }\r\n else {\r\n var grp = {\r\n ids: measure.ids,\r\n description: measure.description,\r\n isExpandable: measure.isExpandable,\r\n movement: measure.movement,\r\n duty: measure.duty ? measure.duty.replace(\"euc\", \"€\") : measure.duty,\r\n origin: measure.origin,\r\n type_id: measure.type_id,\r\n measures: [measure]\r\n };\r\n\r\n memo.push(grp);\r\n }\r\n return memo;\r\n }, []);\r\n\r\n return groups;\r\n }\r\n\r\n function groupMeasures(measures) {\r\n var groups = _.reduce(measures, function (memo, measure) {\r\n var g = _.find(memo, function (group) {\r\n\r\n return group.type_id === measure.type_id &&\r\n group.movement === measure.movement &&\r\n group.duty === measure.duty &&\r\n group.regionType !== '1' && measure.region.type !== '1' &&\r\n group.ucc_end_use_procedure_code_44 === measure.ucc_end_use_procedure_code_44 &&\r\n _.isEqual(group.conditions, measure.conditions) &&\r\n _.isEqual(group.notes, measure.notes) &&\r\n _.isEqual(group.ordernumber, measure.ordernumber) &&\r\n _.isEqual(group.preference_codes, measure.preference_codes) &&\r\n _.isEqual(group.ucc_preference_codes, measure.ucc_preference_codes) &&\r\n _.isEqual(group.additional_code, measure.additional_code)\r\n ;\r\n });\r\n\r\n if (typeof (g) !== 'undefined') {\r\n if (g.hasAdditionalCodes === false)\r\n g.hasAdditionalCodes = (measure.additional_code !== null);\r\n if (g.isExpandable === false)\r\n g.isExpandable = measure.additional_code !== null || measure.conditions.length > 0;\r\n g.ids += '|' + measure.id;\r\n g.measures.push(measure);\r\n }\r\n else {\r\n var grp = {\r\n ids: '' + measure.id,\r\n description: measure.description,\r\n hasAdditionalCodes: measure.additional_code !== null,\r\n isExpandable: measure.additional_code !== null || measure.conditions.length > 0,\r\n movement: measure.movement,\r\n regionType: measure.region.type,\r\n conditions: measure.conditions,\r\n conditionEvaluation: measure.conditionEvaluation,\r\n conditionGroups: measure.conditionGroups,\r\n certificateGroups: measure.certificateGroups,\r\n notes: measure.notes,\r\n ordernumber: measure.ordernumber,\r\n origin: measure.origin,\r\n additional_code: measure.additional_code,\r\n preference_codes: measure.preference_codes,\r\n ucc_preference_codes: measure.ucc_preference_codes,\r\n ucc_end_use_procedure_code_44: measure.ucc_end_use_procedure_code_44,\r\n duty: measure.duty,\r\n series: measure.series,\r\n type_id: measure.type_id,\r\n // region: measure.region,\r\n excluded_regions: measure.excluded_regions,\r\n numberOfCertificates: measure.numberOfCertificates,\r\n uk_quota_information: measure.uk_quota_information,\r\n measures: [measure]\r\n };\r\n\r\n memo.push(grp);\r\n }\r\n return memo;\r\n }, []);\r\n groups = _.sortBy(groups, function (group) {\r\n return (group.region ? group.region.code : '') + (group.additional_code ? group.additional_code.code : '');\r\n });\r\n return groups;\r\n }\r\n\r\n function groupMeasuresByType(measures) {\r\n var groups = _.reduce(measures, function (memo, measure) {\r\n var g = _.find(memo, function (group) {\r\n return group.description === measure.description &&\r\n group.type_id === measure.type_id &&\r\n group.movement === measure.movement;\r\n });\r\n\r\n if (typeof (g) !== 'undefined') {\r\n if (g.hasAdditionalCodes === false)\r\n g.hasAdditionalCodes = measure.hasAdditionalCodes\r\n if (g.isExpandable === false)\r\n g.isExpandable = measure.isExpandable;\r\n g.measures.push(measure);\r\n g.ids += '|' + measure.ids;\r\n }\r\n else {\r\n var grp = {\r\n ids: measure.ids,\r\n hasAdditionalCodes: measure.hasAdditionalCodes,\r\n isExpandable: measure.isExpandable,\r\n movement: measure.movement,\r\n description: measure.description,\r\n origin: measure.origin,\r\n type_id: measure.type_id,\r\n measures: [measure]\r\n };\r\n\r\n memo.push(grp);\r\n }\r\n return memo;\r\n }, []);\r\n\r\n return groups;\r\n }\r\n\r\n // Group measures by additional code\r\n function groupVatMeasures(measures, previouslyGroupedMeasures) {\r\n if (!previouslyGroupedMeasures) {\r\n previouslyGroupedMeasures = [];\r\n }\r\n var groups = _.reduce(measures, function (memo, measure) {\r\n var g = _.find(memo, function (group) {\r\n if (group.additional_code === null || measure.additional_code === null) {\r\n return group.additional_code === null && measure.additional_code === null;\r\n }\r\n return group.additional_code.type === measure.additional_code.type &&\r\n group.additional_code.code === measure.additional_code.code;\r\n });\r\n\r\n if (typeof (g) !== 'undefined') {\r\n g.measures.push(measure);\r\n }\r\n else {\r\n memo.push({\r\n additional_code: measure.additional_code,\r\n hasAdditionalCodes: !!measure.additional_code,\r\n origin: measure.origin,\r\n measures: [measure]\r\n });\r\n }\r\n return memo;\r\n }, previouslyGroupedMeasures);\r\n\r\n return groups;\r\n }\r\n\r\n function sortMeasuresByRegion(measures) {\r\n return measures.sort(function (a, b) {\r\n if (a.region.code > b.region.code) {\r\n return 1;\r\n }\r\n if (a.region.code < b.region.code) {\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n function getCertificateGroupsFromConditionGroups(conditionGroups) {\r\n return _.chain(conditionGroups)\r\n .map(function(conditionGroup) {\r\n return _.chain(conditionGroup.conditions)\r\n .filter(function (condition) {\r\n return !!condition.certificate;\r\n })\r\n .map(function (condition) {\r\n return condition.certificate;\r\n })\r\n .value();\r\n })\r\n .filter(function (certificateGroup) {\r\n return certificateGroup.length > 0;\r\n })\r\n .value();\r\n }\r\n\r\n}\r\n","angular.module('taric.links', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('caseLawLinkPage', require('./components/case-law-link-page'))\r\n .component('eurLexLinkPage', require('./components/eur-lex-link-page'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/links/case-law/:origin/:idType/:id', {\r\n template: ''\r\n })\r\n .when('/links/eur-lex/:idType/:id', {\r\n template: ''\r\n })\r\n ;\r\n}","module.exports = {\r\n controller: caseLawLinkController,\r\n templateUrl: 'links/components/case-law-link-page.html'\r\n};\r\n\r\ncaseLawLinkController.$inject = [\r\n '$location',\r\n '$routeParams',\r\n 'euCaseLawDataService',\r\n 'nlCaseLawDataService'\r\n];\r\n\r\nfunction caseLawLinkController(\r\n $location,\r\n $routeParams,\r\n euCaseLawDataService,\r\n nlCaseLawDataService\r\n) {\r\n var vm = {\r\n $onInit: attached\r\n };\r\n \r\n return vm;\r\n\r\n function attached() {\r\n switch ($routeParams.origin.toUpperCase()) {\r\n case 'EU':\r\n followEuCaseLawLink();\r\n break;\r\n case 'NL':\r\n followDutchCaseLawLink();\r\n break;\r\n }\r\n }\r\n\r\n function followEuCaseLawLink() {\r\n switch ($routeParams.idType) {\r\n case 'celex':\r\n euCaseLawDataService.query.Celex = $routeParams.id;\r\n break;\r\n case 'ecli':\r\n euCaseLawDataService.query.Ecli = $routeParams.id;\r\n break;\r\n }\r\n $location.url('case-law/eu').replace();\r\n }\r\n\r\n function followDutchCaseLawLink() {\r\n switch ($routeParams.idType) {\r\n case 'ecli':\r\n nlCaseLawDataService.query.Ecli = $routeParams.id;\r\n break;\r\n }\r\n $location.url('case-law/nl').replace();\r\n }\r\n\r\n\r\n}","module.exports = {\r\n controller: eurLexLinkController,\r\n templateUrl: 'links/components/eur-lex-link-page.html'\r\n};\r\n\r\neurLexLinkController.$inject = [\r\n '$location',\r\n '$routeParams',\r\n];\r\n\r\nfunction eurLexLinkController(\r\n $location,\r\n $routeParams\r\n) {\r\n var vm = {\r\n $onInit: attached\r\n };\r\n \r\n return vm;\r\n\r\n function attached() {\r\n switch ($routeParams.idType) {\r\n case 'celex':\r\n $location.url('regulation-details/' + $routeParams.id).replace();\r\n break;\r\n default:\r\n $location.url('news/regulations').replace();\r\n break;\r\n }\r\n }\r\n}","angular.module('taric.measureTypes', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('measureTypePicker', require('./components/measure-type-picker'))\r\n .filter('measureTypeTypeahead', require('./filters/measure-type-typeahead-filter'))\r\n .factory('measureTypeSelectorModal', require('./modals/measure-type-selector'))\r\n .factory('measureTypesDataService', require('./services/measure-types-data'));\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n // .when('/regulations', {\r\n // templateUrl: 'regulations/controllers/regulations-news.html'\r\n // })\r\n ;\r\n}","module.exports = {\r\n bindings: { \r\n placeholder: '<', \r\n measureType: '<', \r\n possibleMeasureTypes: '< ', \r\n selectionChanged: '&' \r\n },\r\n controller: measureTypePickerController,\r\n templateUrl: 'measure-types/components/measure-type-picker.html'\r\n};\r\n\r\nmeasureTypePickerController.$inject = ['measureTypeSelectorModal'];\r\n\r\nfunction measureTypePickerController(measureTypeSelectorModal) {\r\n var vm = {\r\n $onInit: attached,\r\n clear: clear,\r\n measureType: null,\r\n userInput: null,\r\n possibleMeasureTypes: null,\r\n itemSelected: itemSelected,\r\n onBlur: onBlur,\r\n onEnter: onEnter,\r\n showModal: showModal\r\n };\r\n\r\n return vm;\r\n\r\n function showModal() {\r\n measureTypeSelectorModal\r\n .show(vm.possibleMeasureTypes, vm.measureType)\r\n .result\r\n .then(itemSelected)\r\n .catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n function attached() {\r\n }\r\n\r\n function clear(ev) {\r\n vm.userInput = null;\r\n clearSelection();\r\n }\r\n\r\n function clearSelection() {\r\n vm.measureType = null;\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ measureType: null });\r\n\r\n }\r\n\r\n function onBlur() {\r\n }\r\n\r\n function onEnter() {\r\n }\r\n\r\n function itemSelected(item, model) {\r\n vm.measureType = item;\r\n\r\n if (vm.selectionChanged) {\r\n vm.selectionChanged({ measureType: item });\r\n }\r\n }\r\n\r\n\r\n}\r\n\r\n","module.exports = [measureTypeTypeaheadFilter];\r\n\r\n// Takes care of ordering the results of the order number typeahead.\r\n// It returns the matched order numbers, sorted\r\nfunction measureTypeTypeaheadFilter() {\r\n\r\n\r\n return function (measureTypes, query) {\r\n if (query === null || query === undefined)\r\n return measureTypes;\r\n\r\n var measureTypeMatchPartition = _.partition(measureTypes, function(measureType) {\r\n return measureType.description.toLowerCase().indexOf(query.replace(' ', '').toLowerCase()) === 0;\r\n });\r\n var startMatches = _.sortBy(measureTypeMatchPartition[0], function(measureType) {\r\n return measureType;\r\n });\r\n\r\n var otherMatchesPartition = _.partition(measureTypeMatchPartition[1], function(measureType) {\r\n return measureType.description.toLowerCase().indexOf(query.replace(' ', '').toLowerCase()) > 0;\r\n });\r\n\r\n var otherMatches = _.sortBy(otherMatchesPartition[0], function(measureType) {\r\n return measureType;\r\n });\r\n\r\n\r\n var result = _.concat(startMatches, otherMatches);\r\n\r\n\r\n return result;\r\n }\r\n}\r\n","module.exports = ['$analytics', '$uibModal', measureTypeSelectorModal];\r\n\r\nfunction measureTypeSelectorModal($analytics, $uibModal) {\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n measureTypeSelectorModalController.$inject = ['$uibModalInstance', 'possibleMeasureTypes', 'measureType'];\r\n\r\n function measureTypeSelectorModalController($uibModalInstance, possibleMeasureTypes, measureType) {\r\n var vm = {\r\n measureType: measureType,\r\n cancel: cancel,\r\n nationalMeasureTypes: [],\r\n possibleMeasureTypes: possibleMeasureTypes,\r\n ok: ok\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function ok(code) {\r\n $uibModalInstance.close(code);\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(possibleMeasureTypes, measureType) {\r\n $analytics.eventTrack('open-modal-measure-type-selector', { category: 'measure-types' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: measureTypeSelectorModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n measureType: function () {\r\n return measureType;\r\n },\r\n possibleMeasureTypes: function () {\r\n return possibleMeasureTypes;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'measure-types/modals/measure-type-selector.html',\r\n windowClass: 'modal-measure-type-selector'\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['common', 'applicationStateService', 'dataContext', measureTypesDataService];\r\n\r\nfunction measureTypesDataService(common, state, dataContext) {\r\n var service = {\r\n measureTypesDictionary: null,\r\n getMeasureTypesDictionary: getMeasureTypesDictionary,\r\n };\r\n\r\n function getMeasureTypesDictionary() {\r\n\r\n var deferred = common.$q.defer();\r\n if (service.measureTypesDictionary) {\r\n deferred.resolve(service.measureTypesDictionary);\r\n }\r\n else {\r\n var url = common.config.apiHosts[common.config.currentApi] +\r\n '/measure_types_dictionary' +\r\n '?lang=' + common.language.get() +\r\n '&date=' + state.filter.date;\r\n dataContext.get(url)\r\n .then(function(measureTypesDictionary) {\r\n service.measureTypesDictionary = measureTypesDictionary;\r\n deferred.resolve(measureTypesDictionary);\r\n });\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n return service;\r\n\r\n}\r\n","angular.module('taric.news', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('newsOverviewPage', require('./components/news-overview-page'))\r\n .component('newsSectionCaseLawNewsPage', require('./components/case-law-news-page'))\r\n .component('newsSubnav', require('./components/news-subnav'))\r\n .component('caseLawLinks', require('./components/case-law-links'))\r\n .factory('newsDataService', require('./services/news-data'))\r\n ;\r\n\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/news/overview', {\r\n template: ''\r\n })\r\n .when('/news/regulations', {\r\n template: ''\r\n })\r\n .when('/news/case-law', {\r\n template: ''\r\n })\r\n .when('/news/nieuws-douane-voor-bedrijven', {\r\n template: ''\r\n })\r\n .when('/news/correlation-table/:activeSubnav', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n templateUrl: 'news/components/case-law-links.html'\r\n};","module.exports = {\r\n controller: caseLawNewsPageController,\r\n templateUrl: 'news/components/case-law-news-page.html'\r\n};\r\n\r\ncaseLawNewsPageController.$inject = ['$analytics'];\r\n\r\nfunction caseLawNewsPageController($analytics) {\r\n var vm = {\r\n $onInit: attached\r\n };\r\n return vm;\r\n\r\n function attached() {\r\n $analytics.pageTrack('/case-law-news');\r\n }\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = {\r\n controller: newsItemsController,\r\n templateUrl: 'news/components/news-overview-page.html'\r\n};\r\n\r\nnewsItemsController.$inject = [\r\n '$analytics', \r\n '$location',\r\n '$window',\r\n 'common',\r\n 'newsDataService'\r\n];\r\n\r\nfunction newsItemsController(\r\n $analytics, \r\n $location,\r\n $window,\r\n common,\r\n newsDataService\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n dateOptions: {},\r\n format: 'dd-MM-yyyy',\r\n open1: open1,\r\n open2: open2,\r\n popup1: {\r\n opened: false,\r\n },\r\n popup2: {\r\n opened: false,\r\n },\r\n query: {\r\n StartDate: null,\r\n EndDate: null\r\n },\r\n copyNewsItemsToClipboard: copyNewsItemsToClipboard,\r\n searchNews: searchNews\r\n };\r\n return vm;\r\n\r\n function attached() {\r\n $analytics.pageTrack('/news-overview');\r\n vm.query.StartDate = moment().subtract(7, 'day').toDate();\r\n vm.query.EndDate = moment().toDate();\r\n vm.baseUrl = new $window.URL($location.absUrl()).origin;\r\n searchNews();\r\n }\r\n \r\n function searchNews() {\r\n vm.isLoading = true;\r\n return newsDataService.getNewsOverview(vm.query.StartDate, vm.query.EndDate)\r\n .then(function (newsItems) {\r\n vm.newsItems = _.map(newsItems, function (newsItem) {\r\n if (newsItem.Category === 'EU Case Law') {\r\n newsItem.Title = newsItem.Title.replace(/#(?!\\!)/g, '

');\r\n newsItem.Url = vm.baseUrl + '/#!/links/case-law/eu/celex/' + newsItem.CELEX;\r\n }\r\n else {\r\n newsItem.Url = vm.baseUrl + '/#!/links/eur-lex/celex/' + newsItem.CELEX;\r\n }\r\n return newsItem;\r\n });\r\n vm.isLoading = false;\r\n })\r\n .then(function() {\r\n vm.isLoading = false;\r\n });\r\n }\r\n\r\n function copyNewsItemsToClipboard() {\r\n var text = document.getElementById('news-overview-table').outerHTML;\r\n text = text.replace(/<\\!--(?:.|\\s)+?-->/g, '');\r\n text = text.replace(/class=\"[^\"]*\"/g, '');\r\n text = text.replace(/ng-\\w+=\"[^\"]*\"/g, '');\r\n common.interaction.copyTextToClipboard(text);\r\n }\r\n\r\n function open1() {\r\n vm.popup1.opened = true;\r\n }\r\n\r\n function open2() {\r\n vm.popup2.opened = true;\r\n }\r\n}","module.exports = {\r\n bindings: {\r\n active: '@'\r\n },\r\n controller: newsSubnavController,\r\n templateUrl: 'news/components/news-subnav.html'\r\n};\r\n\r\nnewsSubnavController.$inject = ['applicationStateService'];\r\n\r\nfunction newsSubnavController(state) {\r\n var vm = {\r\n referenceCountry: state.filter.referenceCountry\r\n };\r\n return vm;\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = [\r\n 'common', \r\n 'dataContext', \r\n newsDataService\r\n];\r\n\r\nfunction newsDataService(\r\n common, \r\n dataContext\r\n) {\r\n var service = {\r\n getNewsOverview: getNewsOverview\r\n };\r\n \r\n return service;\r\n \r\n function getNewsOverview(startDate, endDate) {\r\n var startDateString = moment(startDate).format('YYYY-MM-DD');\r\n var endDateString = moment(endDate).format('YYYY-MM-DD')\r\n var url = common.config.apiHosts.generic +\r\n '/news/overview/' +\r\n '?lang=' + common.language.get() +\r\n '&startdate=' + startDateString +\r\n '&enddate=' + endDateString;\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n}\r\n","angular.module('taric.nomenclature', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n //Components\r\n .component('commodityCodeDescription', require('./components/commodity-code-description'))\r\n .component('exportRefundNomenclature', require('./components/export-refund-nomenclature'))\r\n .component('nomenclatureSection', require('./components/nomenclature-section'))\r\n .component('nomenclatureChapter', require('./components/nomenclature-chapter'))\r\n .component('nomenclatureHeading', require('./components/nomenclature-heading'))\r\n .component('nomenclatureGroups', require('./components/nomenclature-groups'))\r\n .component('taricCodeRow', require('./components/taric-code-row'))\r\n .component('taresStatisticalKeyRow', require('./components/tares-statistical-key-row'))\r\n // Pages\r\n .component('chapterPage', require('./components/chapter-page'))\r\n .component('sectionsPage', require('./components/sections-page'))\r\n // Directives\r\n // .directive('taricCodeRow', require('./directives/taric-code-row'))\r\n // Services\r\n .factory('nomenclatureDataService', require('./services/nomenclature-data'))\r\n .factory('nomenclatureTreeService', require('./services/nomenclature-tree'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/sections', {\r\n template: ''\r\n })\r\n .when('/chapter/:chapterNumber', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n\r\n","module.exports = {\r\n controller: chapterController,\r\n templateUrl: 'nomenclature/components/chapter-page.html'\r\n};\r\n\r\nchapterController.$inject = [\r\n '$analytics', \r\n '$routeParams', \r\n 'atrDataService',\r\n 'btiDataService',\r\n 'caseLawDataService',\r\n 'notificationsService', \r\n 'nomenclatureDataService', \r\n 'nomenclatureTreeService',\r\n 'common', \r\n 'applicationStateService',\r\n 'ecicsDataService',\r\n];\r\n\r\nfunction chapterController(\r\n $analytics, \r\n $routeParams, \r\n atrDataService,\r\n btiDataService,\r\n caseLawDataService,\r\n notifications, \r\n nomenclatureDataService, \r\n nomenclatureTreeService,\r\n common, \r\n state,\r\n ecicsDataService\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n chapter: {},\r\n chapterNumber: '',\r\n ecicsCount: {},\r\n numberOfEcicsItems: 0,\r\n clickRow: clickRow,\r\n doubleClickRow: doubleClickRow,\r\n deselectLine: deselectLine,\r\n goHome: goHome,\r\n hasCaseLaw: hasCaseLaw,\r\n isLoading: false,\r\n isAuthorized: true,\r\n state: state,\r\n };\r\n\r\n function dateChanged() {\r\n loadChapter($routeParams.chapterNumber);\r\n }\r\n\r\n function attached() {\r\n $analytics.pageTrack('/chapter');\r\n common.auth.check();\r\n\r\n if ($routeParams.chapterNumber !== null && state.filter.movement !== null) {\r\n loadChapter($routeParams.chapterNumber);\r\n loadEcicsCount($routeParams.chapterNumber);\r\n }\r\n\r\n notifications.subscribe('filter_movement_changed', movementChanged);\r\n notifications.subscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function movementChanged() {\r\n loadChapter($routeParams.chapterNumber);\r\n }\r\n\r\n function loadEcicsCount(chapterNumber) {\r\n ecicsDataService.countPerHeading(chapterNumber)\r\n .then(function(ecicsCount) {\r\n vm.ecicsCount = ecicsCount;\r\n vm.numberOfEcicsItems = _.chain(vm.ecicsCount).values().sum().value();\r\n });\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_movement_changed', movementChanged);\r\n notifications.unsubscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n // TODO: this exact function is in controllers/search.js. Can we move this (or part of it) to the nomenclature tree service?\r\n function clickRow(heading) {\r\n state.currentCode = heading.value.commodityCode;\r\n state.currentIndentation = heading.value.indentation;\r\n if (!heading.hasChildren) {\r\n common.$location.url('good/' + heading.value.commodityCode);\r\n }\r\n else {\r\n heading.metadata.isExpanded = !heading.metadata.isExpanded;\r\n }\r\n }\r\n\r\n // TODO: this exact function is in controllers/search.js. Can we move this (or part of it) to the nomenclature tree service?\r\n function doubleClickRow(heading) {\r\n state.currentCode = heading.value.commodityCode;\r\n state.currentIndentation = heading.value.indentation;\r\n if (!heading.hasChildren) {\r\n common.$location.url('good/' + heading.value.commodityCode);\r\n }\r\n else if (heading.metadata.isExpanded) {\r\n nomenclatureTreeService.collapseAll(heading);\r\n }\r\n else {\r\n nomenclatureTreeService.expandAll(heading);\r\n }\r\n common.interaction.clearSelection();\r\n }\r\n\r\n function scrollHeadingIntoView() {\r\n setTimeout(function() {\r\n var activeHeading = document.querySelector('.taric-box.active');\r\n if (activeHeading) {\r\n activeHeading.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n }, 1);\r\n }\r\n\r\n function hasCaseLaw(heading) {\r\n return caseLawDataService.euCaseLawItemsPerHeading[heading] || caseLawDataService.dutchCaseLawItemsPerHeading[heading];\r\n }\r\n\r\n function goHome() {\r\n common.$location.url('');\r\n }\r\n\r\n function loadChapter(chapterNumber) {\r\n vm.isLoading = true;\r\n vm.chapterNumber = chapterNumber;\r\n\r\n caseLawDataService.getCaseLawInfo(chapterNumber);\r\n chapterNumber = common.formatting.padLeft(chapterNumber, 2, '0');\r\n chapterNumber = common.formatting.padRight(chapterNumber, 10, '0');\r\n atrDataService.countAtrsByHeading(chapterNumber)\r\n .then(function (atrCount) {\r\n vm.atrCount = atrCount;\r\n });\r\n btiDataService.countBtisByHeading(chapterNumber)\r\n .then(function (btiCount) {\r\n vm.btiCount = btiCount;\r\n });\r\n\r\n nomenclatureDataService.getChapter(chapterNumber, state.filter.movement, state.filter.date)\r\n .then(function(data) {\r\n vm.chapterNumber = data.metadata.chapterNumber;\r\n vm.sectionNumber = data.metadata.sectionNumber;\r\n vm.chapter = data.tree;\r\n scrollHeadingIntoView();\r\n nomenclatureDataService\r\n .getSection(data.metadata.sectionNumber)\r\n .then(function (section) {\r\n vm.section = section;\r\n vm.isLoading = false;\r\n })\r\n }, function () { \r\n vm.isLoading = false;\r\n });\r\n }\r\n\r\n function deselectLine() {\r\n vm.state.currentCode = null;\r\n vm.state.currentIndentation = null;\r\n }\r\n\r\n return vm;\r\n\r\n}","module.exports = {\r\n bindings: {\r\n description: '<',\r\n onClickDescriptionLine: '&'\r\n },\r\n controller: commodityCodeDescriptionExportController,\r\n templateUrl: 'nomenclature/components/commodity-code-description.html'\r\n}\r\n\r\ncommodityCodeDescriptionExportController.$inject = ['goodDisplayService', 'applicationStateService'];\r\n\r\nfunction commodityCodeDescriptionExportController(goodDisplayService, state) {\r\n var vm = {\r\n state: state,\r\n copyDescription: function() {\r\n goodDisplayService.copyDescription(vm.description.lines, state.filter.movement);\r\n }\r\n };\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n nomenclatureLines: '<'\r\n },\r\n templateUrl: 'nomenclature/components/export-refund-nomenclature.html'\r\n};","module.exports = {\r\n bindings: {\r\n chapter: '<',\r\n numberOfEcicsItems: '<',\r\n onClickChapter: '&'\r\n },\r\n controller: chapterController,\r\n templateUrl: 'nomenclature/components/nomenclature-chapter.html'\r\n};\r\n\r\nchapterController.$inject = ['language'];\r\n\r\nfunction chapterController(language) {\r\n var vm = {\r\n showAtrButton: language.get() === 'en'\r\n };\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n nomenclatureGroups: '<'\r\n },\r\n templateUrl: 'nomenclature/components/nomenclature-groups.html'\r\n};","module.exports = {\r\n bindings: {\r\n heading: '<',\r\n hasAtrs: '<',\r\n hasBtis: '<',\r\n hasCaseLaw: '<',\r\n hasEcics: '<',\r\n searchQuery: '<',\r\n onClickHeading: '&',\r\n onDoubleClickHeading: '&'\r\n },\r\n controller: headingController,\r\n templateUrl: 'nomenclature/components/nomenclature-heading.html'\r\n};\r\n\r\nheadingController.$inject = ['applicationStateService'];\r\n\r\nfunction headingController(state) {\r\n var vm = {\r\n state: state,\r\n clickHeading: clickHeading,\r\n doubleClickHeading: doubleClickHeading\r\n };\r\n return vm;\r\n\r\n function clickHeading() {\r\n vm.onClickHeading({ heading: vm.heading });\r\n }\r\n\r\n function doubleClickHeading() {\r\n vm.onDoubleClickHeading({ heading: vm.heading });\r\n }\r\n}","module.exports = {\r\n bindings: {\r\n active: '<',\r\n ecicsCount: '<',\r\n section: '<',\r\n onClickChapter: '&',\r\n onClickSection: '&'\r\n },\r\n controller: sectionController,\r\n templateUrl: 'nomenclature/components/nomenclature-section.html',\r\n};\r\n\r\nfunction sectionController() {\r\n var vm = {\r\n clickChapter: clickChapter,\r\n clickSection: clickSection\r\n };\r\n return vm;\r\n\r\n function clickSection() {\r\n vm.onClickSection({ section: vm.section });\r\n }\r\n\r\n function clickChapter(chapter) {\r\n vm.onClickChapter({ chapter: chapter });\r\n }\r\n}","module.exports = {\r\n controller: sectionsPageController,\r\n templateUrl: 'nomenclature/components/sections-page.html'\r\n};\r\n\r\nsectionsPageController.$inject = [\r\n '$analytics',\r\n '$location',\r\n 'common',\r\n 'documentationService',\r\n 'nomenclatureDataService',\r\n 'notificationsService',\r\n 'preferenceService',\r\n 'ecicsDataService',\r\n];\r\n\r\nfunction sectionsPageController(\r\n $analytics, \r\n $location, \r\n common, \r\n documentationService, \r\n nomenclatureDataService, \r\n notifications, \r\n preferenceService,\r\n ecicsDataService\r\n) {\r\n\r\n var vm = {\r\n activateSection: activateSection,\r\n activeSection: '',\r\n ecicsCount: {},\r\n fillChapters: fillSections,\r\n firstSections: [],\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n isLoading: false,\r\n loadChapter: loadChapter,\r\n loadChapters: loadChapters,\r\n loadRecentCodes: loadRecentCodes,\r\n numberOfRecentCodes: 10,\r\n recentCodes: [],\r\n secondSections: [],\r\n };\r\n\r\n\r\n\r\n function activateSection(sectionNumber) {\r\n if (sectionNumber === null || sectionNumber === undefined || sectionNumber === vm.activeSection)\r\n vm.activeSection = 0;\r\n else\r\n vm.activeSection = sectionNumber;\r\n }\r\n\r\n function fillSections(sectionsData) {\r\n var sections = sectionsData.data;\r\n _.forEach(sections, function (section) {\r\n if (section.chapters === null || section.chapters.length === 0)\r\n return;\r\n\r\n section.chapterDescription = common.formatting.padLeft(section.chapters[0].number, 2, '0');\r\n\r\n if (section.chapters.length > 1)\r\n section.chapterDescription += ' - ' + common.formatting.padLeft(section.chapters[section.chapters.length - 1].number, 2, '0');\r\n });\r\n\r\n var half = Math.floor(sections.length / 2) + 1;\r\n\r\n vm.firstSections = sections.slice(0, half);\r\n vm.secondSections = sections.slice(half, sections.length);\r\n vm.isLoading = false;\r\n documentationService.addHints();\r\n }\r\n\r\n function attached() {\r\n $analytics.pageTrack('/sections');\r\n common.auth.check();\r\n loadRecentCodes();\r\n loadChapters();\r\n loadEcicsCount();\r\n notifications.subscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function dateChanged() {\r\n loadChapters();\r\n }\r\n\r\n function loadEcicsCount() {\r\n ecicsDataService.countPerChapter()\r\n .then(function(ecicsCount) {\r\n vm.ecicsCount = ecicsCount;\r\n });\r\n }\r\n\r\n function loadRecentCodes() {\r\n return preferenceService.getCategory('recent_codes')\r\n .then(function (codes) {\r\n var recentCodes = _.chain(codes)\r\n .sortBy(function (code) { return new Date(code.lastUpdate).getTime(); }) // this solves a timezone difference issue for codes that were just added\r\n .reverse()\r\n .uniqBy('name')\r\n .take(vm.numberOfRecentCodes)\r\n .value();\r\n vm.recentCodes = recentCodes;\r\n });\r\n }\r\n\r\n function loadChapter(chapter) {\r\n $location.url('/chapter/' + chapter.code);\r\n }\r\n\r\n function loadChapters() {\r\n vm.isLoading = true;\r\n return nomenclatureDataService.getSections()\r\n .then(fillSections, function() {});\r\n }\r\n\r\n\r\n return vm;\r\n\r\n}","module.exports = {\r\n bindings: {\r\n currentKey: '<',\r\n keyNode: '<',\r\n onClickRow: '&'\r\n },\r\n controller: taresStatisticalKeyRowController,\r\n templateUrl: 'nomenclature/components/tares-statistical-key-row.html'\r\n};\r\n\r\ntaresStatisticalKeyRowController.$inject = [];\r\n\r\nfunction taresStatisticalKeyRowController() {\r\n var vm = {\r\n clickRow: clickRow\r\n };\r\n\r\n function clickRow(keyNode) {\r\n if (keyNode.value.prodlin === 80 && vm.onClickRow) {\r\n vm.onClickRow({ key: keyNode.value.key });\r\n }\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n code: '<',\r\n searchQuery: '@'\r\n },\r\n controller: taricCodeRowController,\r\n templateUrl: 'nomenclature/components/taric-code-row.html'\r\n}\r\n\r\ntaricCodeRowController.$inject = ['common', 'btiModal', 'applicationStateService', 'nomenclatureTreeService'];\r\n\r\nfunction taricCodeRowController(common, btiModal, state, nomenclatureTreeService) {\r\n var vm = {\r\n clickRow: clickRow,\r\n doubleClickRow: doubleClickRow,\r\n isLoading: false,\r\n state: state,\r\n showBti: showBti\r\n };\r\n\r\n function doubleClickRow(node) {\r\n state.currentCode = node.value.commodityCode;\r\n state.currentIndentation = node.value.indentation;\r\n if (!node.hasChildren) {\r\n common.$location\r\n .url('/good/' + node.value.commodityCode);\r\n }\r\n else if (node.metadata.isExpanded) {\r\n nomenclatureTreeService.collapseAll(node);\r\n }\r\n else {\r\n nomenclatureTreeService.expandAll(node);\r\n }\r\n common.interaction.clearSelection();\r\n }\r\n\r\n function clickRow(node) {\r\n state.currentCode = node.value.commodityCode;\r\n state.currentIndentation = node.value.indentation;\r\n\r\n if (!node.hasChildren)\r\n common.$location\r\n .url('/good/' + node.value.commodityCode);\r\n else {\r\n node.metadata.isExpanded = !node.metadata.isExpanded;\r\n }\r\n }\r\n\r\n function showBti(code, $event) {\r\n btiModal.show(code, vm.searchQuery);\r\n\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n return vm;\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = ['common', 'dataContext', 'applicationStateService', 'nomenclatureTreeService', nomenclatureDataService];\r\n\r\nfunction nomenclatureDataService(common, context, state, nomenclatureTreeService) {\r\n var service = {\r\n chapters: {},\r\n sections: [],\r\n browseChapter: browseChapter,\r\n browseHeading: browseHeading,\r\n getChapter: getChapter,\r\n getSections: getSections,\r\n getSection: getSection,\r\n getSectionForCommodityCode: getSectionForCommodityCode,\r\n getSubchapterNumber: getSubchapterNumber,\r\n isDeclarable: isDeclarable,\r\n loadDescription: loadDescription,\r\n loadNomenclatureGroups: loadNomenclatureGroups,\r\n searchHeadings: searchHeadings,\r\n searchTree: searchTree\r\n };\r\n return service;\r\n\r\n function getSections() {\r\n var maxNumberOfCachedItems = 10;\r\n var deferred = common.$q.defer();\r\n\r\n var language = common.language.get();\r\n var referenceCountry = state.filter.referenceCountry;\r\n var referenceDate = state.filter.date;\r\n var cacheDate = moment().format('YYYY-MM-DD');\r\n\r\n var cachedSections = _.find(service.sections, function(item) {\r\n return item.language === language &&\r\n item.referenceCountry === referenceCountry &&\r\n item.referenceDate === referenceDate &&\r\n item.cacheDate === cacheDate;\r\n });\r\n if (cachedSections) {\r\n cachedSections.lastUsedAt = Date.now();\r\n deferred.resolve(cachedSections);\r\n }\r\n else {\r\n loadSections(language, referenceCountry, referenceDate)\r\n .then(function (data) {\r\n var sections = {\r\n cacheDate: cacheDate,\r\n language: language,\r\n referenceCountry: referenceCountry,\r\n referenceDate: referenceDate,\r\n data: data,\r\n lastUsedAt: Date.now()\r\n };\r\n service.sections = _.concat(service.sections, sections);\r\n if (service.sections.length > maxNumberOfCachedItems) {\r\n service.sections = _.chain(service.sections)\r\n .sortBy(function(item) {\r\n return item.lastUsedAt;\r\n })\r\n .drop()\r\n .value();\r\n }\r\n deferred.resolve(sections);\r\n }, deferred.reject);\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function loadSections(language, referenceCountry, referenceDate) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/sections' +\r\n '?lang=' + language +\r\n '&referencecountry=' + referenceCountry +\r\n '&date=' + referenceDate;\r\n return context.get(url, 'SECTIONS');\r\n }\r\n\r\n function getSection(sectionNumber) {\r\n return getSections()\r\n .then(function (sections) {\r\n return _.find(sections.data, function (section) {\r\n return section.number === sectionNumber;\r\n });\r\n })\r\n }\r\n\r\n function getSectionForCommodityCode(goodsCode) {\r\n return getSections()\r\n .then(function (sections) {\r\n var chapterCode = goodsCode.substring(0, 2) + '00000000';\r\n return _.find(sections.data, function (section) {\r\n return _.some(section.chapters, function (chapter) {\r\n return chapter.code === chapterCode;\r\n });\r\n });\r\n })\r\n }\r\n\r\n function loadNomenclatureGroups(goodscode) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/nomenclature/' + goodscode + '/nomenclature-groups' +\r\n '?lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry;\r\n\r\n if (state.filter.date !== null) {\r\n url += '&date=' + state.filter.date;\r\n }\r\n return context.get(url, 'NOMENCLATURE_GROUPS');\r\n }\r\n\r\n // TODO: add a method for getting this data from the chapter\r\n // tree of the chapter of the goodscode. This should be possible if the chapter has been loaded previously.\r\n function loadDescription(goodscode) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/nomenclature/' + goodscode + '/description' +\r\n '?lang=' + common.language.get() +\r\n '&movement=' + state.filter.movement +\r\n '&referencecountry=' + state.filter.referenceCountry;\r\n\r\n if (state.filter.date !== null) {\r\n url += '&date=' + state.filter.date;\r\n }\r\n return context.get(url);\r\n }\r\n\r\n function isDeclarable(commodityCode) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/nomenclature/' + commodityCode + '/is-declarable' +\r\n '?lang=' + common.language.get() +\r\n '&movement=' + state.filter.movement +\r\n '&referencecountry=' + state.filter.referenceCountry;\r\n\r\n if (state.filter.date !== null) {\r\n url += '&date=' + state.filter.date;\r\n }\r\n return context.get(url);\r\n }\r\n\r\n function browseHeading(q) {\r\n var url = common.config.apiHosts.generic + '/nomenclature/browse-heading' + \r\n '?goodscode=' + q.commodityCode +\r\n '&movement=' + state.filter.movement +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n return context.get(url, 'SEARCH');\r\n }\r\n\r\n function browseChapter(q) {\r\n var url = common.config.apiHosts.generic + '/nomenclature/browse-chapter' + \r\n '?goodscode=' + q.commodityCode +\r\n '&movement=' + state.filter.movement +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n return context.get(url, 'SEARCH');\r\n }\r\n\r\n function searchTree(q) {\r\n var url = common.config.apiHosts.generic + '/nomenclature/search-tree-combined' + \r\n '?goodscode=' + q.commodityCode +\r\n '&q=' + q.query +\r\n '&includeBtis=' + q.includeBtis +\r\n '&includeCaseLaw=' + q.includeCaseLaw +\r\n '&includeClassificationRegulations=' + q.includeClassificationRegulations +\r\n '&movement=' + state.filter.movement +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n return context.get(url, 'SEARCH');\r\n }\r\n\r\n function searchHeadings(q) {\r\n var url = common.config.apiHosts.generic + '/nomenclature/search-combined' +\r\n '?q=' + q.query +\r\n '&includeBtis=' + q.includeBtis +\r\n '&includeCaseLaw=' + q.includeCaseLaw +\r\n '&includeClassificationRegulations=' + q.includeClassificationRegulations +\r\n '&movement=' + state.filter.movement +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date +\r\n '&orderby=' + q.orderBy;\r\n if (q.commodityCode) {\r\n url += \"&goodscode=\" + q.commodityCode;\r\n }\r\n return context.get(url, 'SEARCH');\r\n }\r\n\r\n function getChapter(chapterNumber, movement, date) {\r\n var deferred = common.$q.defer();\r\n\r\n var chapterCode = common.formatting.padRight(common.formatting.padLeft(chapterNumber + '', 2), 10);\r\n var key = chapterCode + '_' + movement + '_' + date;\r\n\r\n if (service.chapters[key] === undefined) {\r\n\r\n browseChapter({ commodityCode: chapterCode})\r\n .then(function (data) {\r\n nomenclatureTreeService.setCodeFromAndCodeTo(data.tree);\r\n service.chapters[key] = data;\r\n deferred.resolve(data);\r\n });\r\n }\r\n else\r\n deferred.resolve(service.chapters[key]);\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function getSubchapterNumber(chapterNumber, subchapterCode) {\r\n if (subchapterCode.length === 4) {\r\n subchapterCode += '000000';\r\n }\r\n return getChapter(chapterNumber, state.filter.movement, state.filter.date)\r\n .then(function (chapterInfo) {\r\n var subchapters = subchapter = _.filter(chapterInfo.tree.children, function (subchapterInfo) {\r\n return subchapterInfo.value.isSubchapter;\r\n });\r\n var subchapter = _.find(subchapters, function (subchapterInfo) {\r\n return subchapterInfo.value.commodityCode === subchapterCode;\r\n });\r\n if (!subchapter) {\r\n return null;\r\n }\r\n return subchapters.indexOf(subchapter) + 1;\r\n }, function(err) {\r\n \r\n });\r\n }\r\n}","module.exports = ['formatting', nomenclatureTreeService];\r\n\r\nfunction nomenclatureTreeService(formatting) {\r\n \r\n var service = {\r\n collapseAll: collapseAll,\r\n expandAll: expandAll,\r\n findNodeInTree: findNodeInTree,\r\n hasBti: hasBti,\r\n isDeclarableCode: isDeclarableCode,\r\n setCodeFromAndCodeTo: setCodeFromAndCodeTo\r\n \r\n };\r\n\r\n return service;\r\n\r\n function expandAll(rootNode) {\r\n if (rootNode.children && rootNode.children.length > 0) {\r\n rootNode.metadata.isExpanded = true;\r\n _.each(rootNode.children, function (node) {\r\n expandAll(node);\r\n });\r\n }\r\n }\r\n\r\n function collapseAll(rootNode) {\r\n if (rootNode.children && rootNode.children.length > 0) {\r\n rootNode.metadata.isExpanded = false;\r\n _.each(rootNode.children, function (node) {\r\n collapseAll(node);\r\n });\r\n }\r\n }\r\n\r\n // NB: btiCount is an object with commodity codes as keys and bti counts as values\r\n // Does the node or any of its childen have btis?\r\n function hasBti(node, btiCount) {\r\n if (!btiCount) {\r\n return false;\r\n }\r\n if (btiCount[node.value.commodityCode] > 0) {\r\n return true;\r\n }\r\n return _.some(node.children, function(child) {\r\n return hasBti(child, btiCount);\r\n })\r\n }\r\n\r\n function isDeclarableCode(commodityCode, rootNode) {\r\n var goodsNomenclatureId = formatting.goodsCodeToGoodsnomId(commodityCode);\r\n var foundNode = findNodeInTree(goodsNomenclatureId, rootNode);\r\n if (foundNode === null)\r\n return false;\r\n else if (!foundNode.hasChildren)\r\n return true; // We can navigate to it if it's an end node (doesn't have children)\r\n else if (foundNode.children === null || foundNode.children.length === 0)\r\n return false; /// We can't determine the right children (they may exist but not be loaded), so just return false\r\n\r\n // if the commodity code matches but the prodlin of the node is not 80,\r\n // then the node can have a descendant with the same commodity code and prodlin 80 \r\n // which is declarable. This is what we check here.\r\n for (var i = 0; i < foundNode.children.length; i++) {\r\n var childIsNavigable = isDeclarableCode(goodsNomenclatureId, foundNode.children[i]);\r\n if (childIsNavigable === true)\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n function findNodeInTree(code, rootNode) {\r\n if (rootNode === null) {\r\n return null;\r\n }\r\n var i,\r\n result,\r\n len = rootNode.children.length;\r\n if (rootNode.value.commodityCode === code && (!rootNode.value.prodlin || rootNode.value.prodlin === 80)) {\r\n return rootNode;\r\n }\r\n for (i = 0; i < len; i++) {\r\n if (i < len - 1 && rootNode.children[i + 1].value.commodityCode > rootNode.children[i].value.commodityCode && rootNode.children[i + 1].value.commodityCode <= code) {\r\n continue;\r\n }\r\n result = findNodeInTree(code, rootNode.children[i]);\r\n if (result !== null && !result.value.isSubchapter && (!result.value.prodlin || result.value.prodlin === 80)) {\r\n return result;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function setCodeFromAndCodeTo(rootNode) {\r\n if (rootNode === null) {\r\n return;\r\n }\r\n _.forEach(rootNode.children, setCodeFromAndCodeTo);\r\n if (rootNode.value.prodlin !== 80) {\r\n \r\n // This check is here to support older UK cache, where we didn't store the prodlin\r\n // Otherwise we'd just need rootNode.code_from = rootNode.code\r\n if (rootNode.value.prodlin) {\r\n rootNode.value.codeFrom = rootNode.value.commodityCode;\r\n }\r\n else if (rootNode.children && rootNode.children.length > 0 && rootNode.children[0].value.commodityCode === rootNode.value.commodityCode) {\r\n rootNode.value.codeFrom = rootNode.value.commodityCode;\r\n }\r\n\r\n if (rootNode.children && rootNode.children.length > 0) {\r\n var highestSubCode = _.maxBy(rootNode.children, function (node) {\r\n if (node.value.prodlin === 80) {\r\n return node.value.commodityCode;\r\n }\r\n // The else if statement is needed to support trees without prodlin \r\n // (where we check on the occurrence of the same commodity code on multipple indentiations)\r\n else if (!node.value.prodlin && (!node.children || node.children.length === 0 || node.children[0].value.commodityCode !== node.value.commodityCode)) {\r\n return node.value.commodityCode;\r\n }\r\n else {\r\n return node.value.codeTo;\r\n }\r\n });\r\n \r\n if (highestSubCode) {\r\n if (highestSubCode.value.prodlin === 80) {\r\n rootNode.value.codeTo = highestSubCode.value.commodityCode;\r\n }\r\n // The else if statement is needed to support trees without prodlin \r\n // (where we check on the occurrence of the same commodity code on multipple indentiations)\r\n else if (!highestSubCode.value.prodlin && (!highestSubCode.children || highestSubCode.children.length === 0 || highestSubCode.children[0].value.commodityCode !== highestSubCode.value.commodityCode)) {\r\n rootNode.value.codeTo = highestSubCode.value.commodityCode;\r\n }\r\n else {\r\n rootNode.value.codeTo = highestSubCode.value.codeTo;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}","angular.module('taric.patterns', [])\r\n .component('backgroundPattern01', require('./components/background-pattern-01'))\r\n .component('backgroundPattern02', require('./components/background-pattern-02'))\r\n ;","module.exports = {\r\n templateUrl: 'patterns/components/background-pattern-01.html'\r\n};","module.exports = {\r\n templateUrl: 'patterns/components/background-pattern-02.html'\r\n};","angular.module('taric.preferenceCodes', [])\r\n .component('preferenceCodeButton', require('./components/preference-code-button'))\r\n .component('preferenceCodePicker', require('./components/preference-code-picker'))\r\n .filter('preferenceCodeTypeahead', require('./filters/preference-code-typeahead-filter'))\r\n .factory('preferenceCodeModal', require('./modals/preference-code'))\r\n .factory('preferenceCodeSelectorModal', require('./modals/preference-code-selector'))\r\n .factory('preferenceCodeDataService', require('./services/preference-code-data'))\r\n ;\r\n\r\n","module.exports = {\r\n bindings: {\r\n preferenceCode: '<',\r\n useUccEndUseProcedureCode44: '<',\r\n },\r\n controller: preferenceCodeButtonController,\r\n templateUrl: 'preference-codes/components/preference-code-button.html'\r\n};\r\n\r\npreferenceCodeButtonController.$inject = ['preferenceCodeModal'];\r\n\r\nfunction preferenceCodeButtonController(preferenceCodeModal) {\r\n var vm = {\r\n selectPreferenceCode: selectPreferenceCode\r\n };\r\n return vm;\r\n\r\n function selectPreferenceCode(code, useUccEndUseProcedureCode44) {\r\n preferenceCodeModal.show(code, useUccEndUseProcedureCode44);\r\n }\r\n}\r\n","module.exports = {\r\n bindings: { \r\n placeholder: '<', \r\n preferenceCode: '<', \r\n possiblePreferenceCodes: '< ', \r\n selectionChanged: '&' \r\n },\r\n controller: preferenceCodePickerController,\r\n templateUrl: 'preference-codes/components/preference-code-picker.html'\r\n};\r\n\r\npreferenceCodePickerController.$inject = ['preferenceCodeSelectorModal'];\r\n\r\nfunction preferenceCodePickerController(preferenceCodeSelectorModal) {\r\n var vm = {\r\n clear: clear,\r\n preferenceCode: null,\r\n userInput: null,\r\n possiblePreferenceCodes: null,\r\n itemSelected: itemSelected,\r\n onBlur: onBlur,\r\n onEnter: onEnter,\r\n showModal: showModal\r\n };\r\n\r\n return vm;\r\n\r\n function showModal() {\r\n preferenceCodeSelectorModal\r\n .show(vm.possiblePreferenceCodes, vm.preferenceCode)\r\n .result\r\n .then(itemSelected)\r\n .catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n function clear(ev) {\r\n vm.userInput = null;\r\n clearSelection();\r\n }\r\n\r\n function clearSelection() {\r\n vm.preferenceCode = null;\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ preferenceCode: null });\r\n\r\n }\r\n\r\n function onBlur() {\r\n }\r\n\r\n function onEnter() {\r\n }\r\n\r\n function itemSelected(item, model) {\r\n vm.preferenceCode = item;\r\n\r\n if (vm.selectionChanged) {\r\n vm.selectionChanged({ preferenceCode: item });\r\n }\r\n }\r\n\r\n\r\n}\r\n","module.exports = [preferenceCodeTypeaheadFilter];\r\n\r\n// Takes care of ordering the results of the preference code typeahead. The logic is as follows:\r\n// First, show the matches on the preference code, ordered by code\r\n// Next, show the matches on the beginning of the preference code description, ordered by description\r\n// Finally, show the matches anywhere else in the description, ordered by description\r\nfunction preferenceCodeTypeaheadFilter() {\r\n\r\n\r\n return function (preferenceCodes, query) {\r\n if (query === null || query === undefined)\r\n return preferenceCodes;\r\n\r\n var preferenceCodeMatchPartition = _.partition(preferenceCodes, function(preferenceCode) {\r\n return (preferenceCode.code).toLowerCase().indexOf(query.replace(' ', '').toLowerCase()) === 0;\r\n });\r\n var preferenceCodeMatches = _.sortBy(preferenceCodeMatchPartition[0], function(preferenceCode) {\r\n return preferenceCode.code;\r\n });\r\n var otherMatches = _.sortBy(preferenceCodeMatchPartition[1], 'description');\r\n\r\n var descriptionStartMatchPartition = _.partition(otherMatches, function(preferenceCode) {\r\n return preferenceCode.description && preferenceCode.description.toLowerCase().indexOf(query.toLowerCase()) === 0;\r\n });\r\n\r\n var otherDescriptionMatches = _.filter(descriptionStartMatchPartition[1], function(preferenceCode) {\r\n return preferenceCode.description && preferenceCode.description.toLowerCase().indexOf(query.toLowerCase()) > -1;\r\n });\r\n\r\n var result = _.concat(preferenceCodeMatches, descriptionStartMatchPartition[0], otherDescriptionMatches);\r\n return result;\r\n }\r\n}\r\n","module.exports = ['$analytics', '$uibModal', preferenceCodeSelectorModal];\r\n\r\nfunction preferenceCodeSelectorModal($analytics, $uibModal) {\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n preferenceCodeSelectorModalController.$inject = ['$uibModalInstance', 'possiblePreferenceCodes', 'preferenceCode'];\r\n\r\n function preferenceCodeSelectorModalController($uibModalInstance, possiblePreferenceCodes, preferenceCode) {\r\n var vm = {\r\n preferenceCode: preferenceCode,\r\n cancel: cancel,\r\n nationalPreferenceCodes: [],\r\n possiblePreferenceCodes: possiblePreferenceCodes,\r\n ok: ok\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function ok(code) {\r\n $uibModalInstance.close(code);\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(possiblePreferenceCodes, preferenceCode) {\r\n $analytics.eventTrack('open-modal-preference-code-selector', { category: 'preference-codes' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: preferenceCodeSelectorModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n preferenceCode: function () {\r\n return preferenceCode;\r\n },\r\n possiblePreferenceCodes: function () {\r\n return possiblePreferenceCodes;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'preference-codes/modals/preference-code-selector.html',\r\n windowClass: 'modal-preference-code-selector'\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['$analytics', '$uibModal', preferenceCodeModal];\r\n\r\nfunction preferenceCodeModal($analytics, $uibModal) {\r\n var modal = {\r\n footnotes: [],\r\n show: showModal\r\n };\r\n\r\n preferenceCodeModalController.$inject = [\r\n '$uibModalInstance', \r\n 'preferenceCode', \r\n 'useUccEndUseProcedureCode44', \r\n 'preferenceCodeDataService'\r\n ];\r\n\r\n function preferenceCodeModalController(\r\n $uibModalInstance, \r\n preferenceCode, \r\n useUccEndUseProcedureCode44, \r\n preferenceCodeDataService\r\n ) {\r\n\r\n var vm = {\r\n cancel: cancel,\r\n data: preferenceCodeDataService.data,\r\n preferenceCode: preferenceCode,\r\n useUccEndUseProcedureCode44: useUccEndUseProcedureCode44\r\n };\r\n\r\n load(preferenceCode);\r\n\r\n return vm;\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function load(preferenceCode) {\r\n preferenceCodeDataService.getDescription(preferenceCode);\r\n }\r\n }\r\n\r\n\r\n function showModal(preferenceCode, useUccEndUseProcedureCode44) {\r\n $analytics.eventTrack('open-modal-preference-code-description', { category: 'preference-codes' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n controller: preferenceCodeModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n preferenceCode: function () {\r\n return preferenceCode;\r\n },\r\n useUccEndUseProcedureCode44: function () {\r\n return useUccEndUseProcedureCode44;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'preference-codes/modals/preference-code.html',\r\n windowClass: 'modal-preference-code'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['dataContext', 'config', preferenceCodeService];\r\n\r\nfunction preferenceCodeService(dataContext, config) {\r\n var service = {\r\n getDescription: getDescription,\r\n getDescriptions: getDescriptions,\r\n data: {\r\n code: null\r\n }\r\n };\r\n return service;\r\n\r\n function getDescription(preferenceCode) {\r\n var url = config.apiHosts.generic + '/preference-codes/' + preferenceCode;\r\n return dataContext.get(url)\r\n .then(function(code) {\r\n service.data.code = code;\r\n });\r\n }\r\n\r\n function getDescriptions() {\r\n var url = config.apiHosts.generic + '/preference-codes';\r\n return dataContext.get(url);\r\n }\r\n}\r\n","angular.module('taric.quota', [])\r\n .component('ordernumberButton', require('./components/ordernumber-button'))\r\n .component('ukOrdernumberButton', require('./components/uk-ordernumber-button'))\r\n .component('orderNumberPicker', require('./components/order-number-picker'))\r\n .filter('orderNumberTypeahead', require('./filters/order-number-typeahead-filter'))\r\n .factory('orderQuotaModal', require('./modals/order-quota'))\r\n .factory('ukOrderQuotaModal', require('./modals/uk-order-quota'))\r\n .factory('quotaModals', require('./modals/modals'))\r\n .factory('quotaDataService', require('./services/quota-data'))\r\n ;","module.exports = {\r\n bindings: { \r\n placeholder: '<', \r\n orderNumber: '<', \r\n possibleOrderNumbers: '< ', \r\n selectionChanged: '&' \r\n },\r\n controller: orderNumberPickerController,\r\n templateUrl: 'quota/components/order-number-picker.html'\r\n};\r\n\r\nfunction orderNumberPickerController() {\r\n \r\n var vm = {\r\n clear: clear,\r\n orderNumber: null,\r\n userInput: null,\r\n possibleOrderNumbers: null,\r\n itemSelected: itemSelected,\r\n onBlur: onBlur,\r\n onEnter: onEnter\r\n };\r\n \r\n return vm;\r\n\r\n function clear(ev) {\r\n vm.userInput = null;\r\n clearSelection();\r\n }\r\n \r\n function clearSelection() {\r\n vm.orderNumber = null;\r\n if (vm.selectionChanged)\r\n vm.selectionChanged({ orderNumber: null });\r\n\r\n }\r\n\r\n function onBlur() {\r\n }\r\n\r\n function onEnter() {\r\n }\r\n\r\n function itemSelected(item, model) {\r\n vm.orderNumber = item;\r\n\r\n if (vm.selectionChanged) {\r\n vm.selectionChanged({ orderNumber: item });\r\n }\r\n } \r\n}","module.exports = {\r\n bindings: { \r\n ordernumber: '<' \r\n },\r\n controller: orderNumberButtonController,\r\n templateUrl: 'quota/components/ordernumber-button.html'\r\n};\r\n\r\norderNumberButtonController.$inject = ['quotaModals'];\r\n\r\nfunction orderNumberButtonController(quotaModals) {\r\n var vm = {\r\n showOrderNumber: showOrderNumber\r\n };\r\n\r\n function showOrderNumber() {\r\n quotaModals.orderQuota.show(vm.ordernumber);\r\n }\r\n\r\n return vm;\r\n\r\n}","module.exports = {\r\n bindings: { \r\n ukQuotaInformation: '<' \r\n },\r\n controller: orderNumberButtonController,\r\n templateUrl: 'quota/components/uk-ordernumber-button.html'\r\n};\r\n\r\norderNumberButtonController.$inject = ['quotaModals'];\r\n\r\nfunction orderNumberButtonController(quotaModals) {\r\n var vm = {\r\n showOrderNumber: showOrderNumber\r\n };\r\n\r\n function showOrderNumber() {\r\n quotaModals.ukOrderQuota.show(vm.ukQuotaInformation);\r\n }\r\n\r\n return vm;\r\n\r\n}","module.exports = [orderNumberTypeaheadFilter];\r\n\r\n// Takes care of ordering the results of the order number typeahead.\r\n// It returns the matched order numbers, sorted\r\nfunction orderNumberTypeaheadFilter() {\r\n\r\n\r\n return function (orderNumbers, query) {\r\n if (query === null || query === undefined)\r\n return orderNumbers;\r\n\r\n var orderNumberMatchPartition = _.partition(orderNumbers, function(orderNumber) {\r\n return orderNumber.toLowerCase().indexOf(query) === 0;\r\n });\r\n\r\n var startMatches = _.sortBy(orderNumberMatchPartition[0], function(orderNumber) {\r\n return orderNumber;\r\n });\r\n\r\n var otherMatchesPartition = _.partition(orderNumberMatchPartition[1], function(orderNumber) {\r\n return orderNumber.toLowerCase().indexOf(query) > 0;\r\n });\r\n\r\n var otherMatches = _.sortBy(otherMatchesPartition[0], function(orderNumber) {\r\n return orderNumber;\r\n });\r\n\r\n\r\n var result = _.concat(startMatches, otherMatches);\r\n\r\n return result;\r\n }\r\n}\r\n","module.exports = ['orderQuotaModal', 'ukOrderQuotaModal', quotaModalsService];\r\n\r\nfunction quotaModalsService(orderQuotaModal, ukOrderQuotaModal) {\r\n\r\n var service = {\r\n orderQuota: orderQuotaModal,\r\n ukOrderQuota: ukOrderQuotaModal,\r\n };\r\n\r\n return service;\r\n\r\n}","module.exports = ['$analytics', '$uibModal', orderQuotaModal];\r\n\r\nfunction orderQuotaModal($analytics, $uibModal) {\r\n var modal = {\r\n order: null,\r\n show: showModal\r\n };\r\n\r\n orderNumberModalController.$inject = ['$translate', '$uibModalInstance', 'orderNumber', 'quotaDataService'];\r\n\r\n function orderNumberModalController($translate, $uibModalInstance, orderNumber, quotaDataService) {\r\n\r\n var translations = [];\r\n $translate(['shared-ui.Loading', 'taric.InformationForOrderNumber']).then(function (result) {\r\n translations = result;\r\n });\r\n\r\n var vm = {\r\n cancel: cancel,\r\n chart: {\r\n colors: ['#B7CDE6'],\r\n data: null,\r\n datasetOverride: [{\r\n backgroundColor: '#B7CDE6',\r\n borderColor: '#667280',\r\n borderWidth: 2,\r\n lineTension: 0.1,\r\n pointBorderColor: '#ffffff',\r\n pointBorderWidth: 3,\r\n pointRadius: 6,\r\n label: 'Balance',\r\n pointBackgroundColor: '#667280',\r\n type: 'line'\r\n }],\r\n labels: [],\r\n options: null,\r\n series: ['Series A']\r\n },\r\n orderData: null,\r\n ordernumber: orderNumber,\r\n title: translations['shared-ui.Loading'],\r\n isLoading: true\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function init() {\r\n //$('#orderNumberBalanceChart').show();\r\n vm.isLoading = true;\r\n\r\n quotaDataService.getOrderDetails(vm.ordernumber)\r\n .then(function (data) {\r\n vm.title = translations['taric.InformationForOrderNumber'] + ' ' + vm.ordernumber;\r\n if (data === null || data === 'null') {\r\n vm.isLoading = false;\r\n return;\r\n }\r\n\r\n vm.orderData = data;\r\n\r\n for (var i = 0; i < data.balance.length; i++) {\r\n data.balance[i].start_occurence_date = data.balance[i].start_occurence_date.substring(8, 10) + '-' + data.balance[i].start_occurence_date.substring(5, 7) + '-' + data.balance[i].start_occurence_date.substring(0, 4);\r\n }\r\n\r\n vm.chart.labels = _.map(data.balance, function (b) { return b.start_occurence_date; });\r\n vm.chart.data = [_.map(data.balance, function (b) { return b.new_balance; })];\r\n vm.isLoading = false;\r\n\r\n }, function () {\r\n vm.title = translations['taric.InformationForOrderNumber'] + ' ' + vm.ordernumber;\r\n vm.isLoading = false;\r\n });\r\n\r\n }\r\n\r\n init();\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(orderNumber) {\r\n $analytics.eventTrack('open-modal-quota-details', { category: 'quota' });\r\n return $uibModal.open({\r\n backdrop: true,\r\n controller: orderNumberModalController,\r\n controllerAs: 'vm',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n orderNumber: function () {\r\n return orderNumber;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'quota/modals/order-quota.html',\r\n windowClass: 'modal-order-number'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['$analytics', '$uibModal', ukOrderQuotaModal];\r\n\r\nfunction ukOrderQuotaModal($analytics, $uibModal) {\r\n var modal = {\r\n order: null,\r\n show: showModal\r\n };\r\n\r\n ukOrderNumberModalController.$inject = ['$uibModalInstance', 'ukQuotaInformation'];\r\n\r\n function ukOrderNumberModalController($uibModalInstance, ukQuotaInformation) {\r\n\r\n var vm = {\r\n cancel: cancel,\r\n ukQuotaInformation: ukQuotaInformation,\r\n };\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(ukQuotaInformation) {\r\n $analytics.eventTrack('open-modal-quota-details', { category: 'quota' });\r\n return $uibModal.open({\r\n backdrop: true,\r\n controller: ukOrderNumberModalController,\r\n controllerAs: 'vm',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n ukQuotaInformation: function () {\r\n return ukQuotaInformation;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'quota/modals/uk-order-quota.html',\r\n windowClass: 'modal-order-number'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['common', 'applicationStateService', 'dataContext', quotaDataService];\r\n\r\nfunction quotaDataService(common, state, context) {\r\n\r\n var service = {\r\n getOrderDetails: getOrderDetails\r\n };\r\n\r\n function getOrderDetails(orderNumber) {\r\n var deferred = common.$q.defer();\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/actions/quota/details' +\r\n '?ordernumber=' + orderNumber +\r\n '&date=' + state.filter.date;\r\n\r\n context.get(url)\r\n .then(deferred.resolve, deferred.reject);\r\n\r\n return deferred.promise;\r\n }\r\n\r\n return service;\r\n}","angular.module('taric.referenceDate', [])\r\n .component('referenceDatePicker', require('./components/reference-date-picker'))\r\n .factory('referenceDateService', require('./services/reference-date'))\r\n ;\r\n","var moment = require('moment');\r\n\r\nmodule.exports = {\r\n controller: referenceDatePickerController,\r\n templateUrl: 'reference-date/components/reference-date-picker.html'\r\n};\r\n\r\nreferenceDatePickerController.$inject = ['referenceDateService', 'applicationStateService'];\r\n\r\nfunction referenceDatePickerController(referenceDateService, state) {\r\n var vm = {\r\n $onInit: attached,\r\n blur: blur,\r\n dateChanged: dateChanged,\r\n dateOptions: {\r\n minDate: moment('1972-01-01').toDate()\r\n },\r\n format: 'd!-M!-yyyy',\r\n popup: {\r\n opened: false,\r\n },\r\n open: open,\r\n query: {\r\n date: getDate()\r\n }\r\n };\r\n\r\n function attached() {\r\n if (state.filter.referenceCountry === 'CH') {\r\n vm.dateOptions.minDate = moment('2022-01-01').toDate();\r\n }\r\n }\r\n\r\n function getDate() {\r\n return referenceDateService.getReferenceDate();\r\n }\r\n\r\n function dateChanged() {\r\n if (state.filter.referenceCountry === 'CH' && moment(vm.query.date).isBefore('2022-01-01')) {\r\n return;\r\n }\r\n referenceDateService.setReferenceDate(vm.query.date);\r\n }\r\n\r\n function blur() {\r\n if (!vm.query.date) {\r\n vm.query.date = getDate()\r\n }\r\n }\r\n\r\n function open() {\r\n vm.popup.opened = true;\r\n }\r\n\r\n return vm;\r\n}\r\n","var moment = require('moment');\r\n\r\nmodule.exports = ['applicationStateService', 'notificationsService', referenceDateService];\r\n\r\nfunction referenceDateService(state, notifications) {\r\n var service = {\r\n getReferenceDate: getReferenceDate,\r\n setReferenceDate: setReferenceDate\r\n };\r\n return service;\r\n\r\n function getReferenceDate() {\r\n return moment(state.filter.date, 'YYYY-MM-DD').toDate();\r\n }\r\n\r\n function setReferenceDate(newDate) {\r\n if (newDate) {\r\n var serializedDate = moment(newDate).format('YYYY-MM-DD');\r\n if (serializedDate !== state.filter.date) {\r\n state.filter.date = serializedDate;\r\n notifications.publish('filter_date_changed');\r\n }\r\n }\r\n }\r\n}","angular.module('taric.referencePrices', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('referencePricesOverviewPage', require('./components/overview-page'))\r\n .factory('referencePricesDataService', require('./services/referenceprices-data'));\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/referenceprices', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","var FileSaver = require('file-saver');\r\n\r\nmodule.exports = {\r\n controller: referencePriceOverviewController,\r\n templateUrl: 'referenceprices/components/overview-page.html'\r\n};\r\n\r\nreferencePriceOverviewController.$inject = [\r\n '$analytics', \r\n 'common', \r\n 'identity',\r\n 'notificationsService', \r\n 'countryDataService', \r\n 'referencePricesDataService', \r\n 'applicationStateService'\r\n];\r\n\r\nfunction referencePriceOverviewController(\r\n $analytics, \r\n common, \r\n identity,\r\n notifications, \r\n countryDataService, \r\n referencePricesDataService, \r\n state\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n dateChanged: dateChanged,\r\n download: download,\r\n downloadStreamXml: downloadStreamXml,\r\n loading: false,\r\n prices: {\r\n original: null,\r\n importValues: [],\r\n unitPrices: []\r\n },\r\n };\r\n\r\n function dateChanged() {\r\n loadData();\r\n }\r\n\r\n function attached() {\r\n $analytics.pageTrack('/reference-prices');\r\n loadData();\r\n notifications.subscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function loadData() {\r\n var getReferencePricesPromise;\r\n if (identity.hasPermission('reference_prices')) {\r\n getReferencePricesPromise = function() {\r\n return referencePricesDataService.getReferencePrices(common.language.get(), state.filter.date);\r\n };\r\n }\r\n else {\r\n getReferencePricesPromise = function() {\r\n return referencePricesDataService.getSampleReferencePrices(common.language.get());\r\n };\r\n }\r\n vm.loading = true;\r\n vm.prices.unitPrices = [];\r\n vm.prices.importValues = [];\r\n\r\n\r\n return getReferencePricesPromise()\r\n .then(function (result) {\r\n vm.prices.original = result.Result;\r\n for (var i = 0; i < result.Result.length; i++) {\r\n vm.prices.importValues = vm.prices.importValues.concat(\r\n _.map(result.Result[i].StandardImportValues, function (item) {\r\n if (item.CountryOfOrigin === '1011')\r\n item.CountryOfOrigin += ' — Erga Omnes';\r\n else {\r\n var country = countryDataService.getCountry(item.CountryOfOrigin);\r\n if (country)\r\n item.CountryOfOrigin += ' — ' + country;\r\n }\r\n item.Goodsnom = result.Result[i].Goodsnom;\r\n return item;\r\n }));\r\n vm.prices.unitPrices = vm.prices.unitPrices.concat(\r\n _.map(result.Result[i].UnitPrices, function (item) {\r\n if (item.Duty.indexOf(' euc') > -1) {\r\n item.Duty = '€ ' + item.Duty.replace(' euc', ' ');\r\n }\r\n if (item.CountryOfOrigin === '1011')\r\n item.CountryOfOrigin += ' — Erga Omnes';\r\n else {\r\n var country = countryDataService.getCountry(item.CountryOfOrigin);\r\n if (country)\r\n item.CountryOfOrigin += ' — ' + country;\r\n }\r\n item.Goodsnom = result.Result[i].Goodsnom;\r\n return item;\r\n }));\r\n }\r\n vm.loading = false;\r\n }, function () {\r\n vm.loading = false;\r\n });\r\n }\r\n\r\n function downloadStreamXml() {\r\n var fileName = 'valuationValues.xml';\r\n referencePricesDataService.getStreamXml(state.filter.date)\r\n .then(function(result) {\r\n var fileToSave = new Blob([result], {\r\n type: 'application/xml',\r\n name: fileName\r\n });\r\n \r\n // Global loaded in FileSaver.min.js\r\n FileSaver.saveAs(fileToSave, fileName);\r\n });\r\n }\r\n\r\n function download() {\r\n // Create a blob of the data\r\n var fileName = 'reference-prices.json';\r\n var json = JSON.stringify({\r\n result: vm.prices.original,\r\n referenceDate: state.filter.date\r\n });\r\n json = json.replace(/€/g, 'EUR').replace(/€\\s?EUR/g, 'EUR');\r\n json = json.replace(/Goodsnom/g, \"goodsnom\");\r\n json = json.replace(/StandardImportValues/g, \"standardImportValues\");\r\n json = json.replace(/UnitPrices/g, \"unitPrices\");\r\n json = json.replace(/CountryOfOrigin/g, \"countryOfOrigin\");\r\n json = json.replace(/Duty/g, \"duty\");\r\n json = json.replace(/StartDate/g, \"startDate\");\r\n json = json.replace(/EndDate/g, \"endDate\");\r\n json = json.replace(/(\\d+),(\\d+)/g, \"$1.$2\");\r\n var fileToSave = new Blob([json], {\r\n type: 'application/json',\r\n name: fileName\r\n });\r\n\r\n // Global loaded in FileSaver.min.js\r\n FileSaver.saveAs(fileToSave, fileName);\r\n\r\n // Save the file\r\n // var a = document.createElement(\"a\");\r\n // document.body.appendChild(a);\r\n // a.style = \"display: none\";\r\n\r\n // var url = window.URL.createObjectURL(fileToSave);\r\n // a.href = url;\r\n // a.download = fileName;\r\n // a.click();\r\n // window.URL.revokeObjectURL(url);\r\n\r\n }\r\n\r\n return vm;\r\n}\r\n","var moment = require('moment');\r\n\r\nmodule.exports = ['common', 'applicationStateService', 'dataContext', referencePricesDataService];\r\n\r\nfunction referencePricesDataService(common, state, dataContext) {\r\n var service = {\r\n getReferencePrices: getReferencePrices,\r\n getSampleReferencePrices: getSampleReferencePrices,\r\n getStreamXml: getStreamXml\r\n };\r\n\r\n function getReferencePrices(language, date) {\r\n var apiDate = date ? moment(date).format('YYYY-MM-DD') : moment().format('YYYY-MM-DD');\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] + '/representative-prices/json?lang=' + language + \r\n '&date=' + apiDate +\r\n '&referenceCountry=' + state.filter.referenceCountry;\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function getSampleReferencePrices(language) {\r\n \r\n var url = common.config.apiHosts[common.config.currentApi] + '/representative-prices/sample?lang=' + language + \r\n '&referenceCountry=' + state.filter.referenceCountry;\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function getStreamXml(date) {\r\n var apiDate = date ? moment(date).format('YYYY-MM-DD') : moment().format('YYYY-MM-DD');\r\n var url = common.config.apiHosts[common.config.currentApi] + '/representative-prices/stream' + \r\n '?date=' + apiDate +\r\n '&referenceCountry=' + state.filter.referenceCountry;\r\n var requestId = 'REFERENCE_PRICES_XML';\r\n var headers = { 'Accept': 'application/xml' };\r\n return dataContext.get(url, requestId, headers);\r\n }\r\n\r\n return service;\r\n\r\n}\r\n","angular.module('taric.regulations', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('regulationsNewsPage', require('./components/regulations-news-page'))\r\n .component('regulationDetailsPage', require('./components/regulation-details-page'))\r\n .component('regulation', require('./components/regulation'))\r\n .component('regulationButton', require('./components/regulation-button'))\r\n .component('regulationsButton', require('./components/regulations-button'))\r\n .component('regulationsNews', require('./components/regulations-news'))\r\n .factory('regulationModal', require('./modals/regulation'))\r\n .factory('regulationsModal', require('./modals/regulations'))\r\n .factory('regulationsDataService', require('./services/regulations-data'))\r\n .filter('celexToRegulationNumber', require('./filters/celex-to-regulation-number'));\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/regulations/news', {\r\n template: ''\r\n })\r\n .when('/regulation-details/:celex', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n measures: '<'\r\n },\r\n controller: regulationButtonController,\r\n templateUrl: 'regulations/components/regulation-button.html'\r\n};\r\n\r\nregulationButtonController.$inject = ['$q', 'regulationModal', 'regulationsDataService'];\r\n\r\nfunction regulationButtonController($q, regulationModal, regulationsData) {\r\n\r\n var vm = {\r\n showRegulation: showRegulation\r\n };\r\n\r\n function showRegulation() {\r\n return $q.all(\r\n _.chain(vm.measures)\r\n .filter(function(measure) {\r\n return !!measure.regulation;\r\n })\r\n .uniqBy(function(measure) {\r\n return measure.type + '|' + measure.regulation.id + '|' + measure.region.code;\r\n })\r\n .orderBy(function(measure) {\r\n return measure.regulation.reg_pubdate;\r\n })\r\n .map(function(measure) {\r\n return regulationsData\r\n .getRegulation(measure.regulation.id)\r\n .then(function(regulation) {\r\n measure.regulation.eurlex_regulation = regulation;\r\n return measure;\r\n });\r\n })\r\n .value()\r\n ).then(function(measures) {\r\n // console.log(measures);\r\n regulationModal.show(measures);\r\n });\r\n }\r\n\r\n\r\n return vm;\r\n\r\n}","module.exports = {\r\n controller: regulationDetailsController,\r\n templateUrl: 'regulations/components/regulation-details-page.html'\r\n};\r\n\r\nregulationDetailsController.$inject = [\r\n '$analytics', \r\n '$routeParams',\r\n 'common', \r\n 'notificationsService',\r\n 'regulationsDataService', \r\n 'measureTypesDataService',\r\n];\r\n\r\nfunction regulationDetailsController(\r\n $analytics, \r\n $routeParams,\r\n common, \r\n notificationsService,\r\n regulationsData, \r\n measureTypesData\r\n) {\r\n\r\n var vm = {\r\n celex: '',\r\n isLoading: false,\r\n languageId: common.language.get(),\r\n measureTypes: {},\r\n regulation: {},\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n $analytics.pageTrack('/regulation-details');\r\n common.auth.check();\r\n if ($routeParams.celex) {\r\n loadRegulationDetails($routeParams.celex);\r\n }\r\n notificationsService.subscribe('language_changed', languageChanged);\r\n notificationsService.subscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function dateChanged() {\r\n if ($routeParams.celex) {\r\n loadRegulationDetails($routeParams.celex);\r\n }\r\n }\r\n\r\n function loadMeasureTypes() {\r\n return measureTypesData\r\n .getMeasureTypesDictionary()\r\n .then(function(measureTypes) {\r\n vm.measureTypes = measureTypes;\r\n });\r\n }\r\n\r\n function languageChanged() {\r\n vm.languageId = common.language.get();\r\n if ($routeParams.celex) {\r\n loadRegulationDetails($routeParams.celex);\r\n }\r\n }\r\n\r\n function loadRegulationDetails(celex) {\r\n vm.celex = $routeParams.celex;\r\n vm.isLoading = true;\r\n return loadMeasureTypes()\r\n .then(function() {\r\n return regulationsData.getRegulationDetails(celex);\r\n })\r\n .then(function(regulation) {\r\n vm.regulation = regulation;\r\n vm.isLoading = false;\r\n });\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('language_changed', languageChanged);\r\n notificationsService.unsubscribe('filter_date_changed', dateChanged);\r\n }\r\n}\r\n","module.exports = {\r\n bindings: {\r\n regulation: '<',\r\n isListItem: '<'\r\n },\r\n controller: regulationController,\r\n templateUrl: 'regulations/components/regulation.html'\r\n};\r\n\r\nregulationController.$inject = ['regulationsDataService', 'measureTypesDataService', 'countryDataService', 'countryModals'];\r\n\r\nfunction regulationController(regulationsData, measureTypesData, countryData, countryModals) {\r\n\r\n var vm = {\r\n measureOverview: [],\r\n measureTypesDictionary: {},\r\n isLoadingMeasures: true,\r\n init: init,\r\n loadMeasureOverview: loadMeasureOverview,\r\n openRegionModal: openRegionModal\r\n };\r\n init();\r\n return vm;\r\n\r\n function init() {\r\n measureTypesData.getMeasureTypesDictionary()\r\n .then(function(measureTypesDictionary) {\r\n vm.measureTypesDictionary = measureTypesDictionary;\r\n vm.countryNamesDictionary = countryData.countries;\r\n loadMeasureOverview(vm.regulation.celex, 0);\r\n });\r\n }\r\n\r\n function loadMeasureOverview(celex, pageNumber) {\r\n vm.isLoadingMeasures = true;\r\n regulationsData.getMeasureOverview(celex, pageNumber)\r\n .then(function(measureOverview) {\r\n vm.measureOverview = measureOverview;\r\n vm.isLoadingMeasures = false;\r\n });\r\n }\r\n\r\n function openRegionModal(regionId, $event) {\r\n $event.preventDefault();\r\n var region = {\r\n code: regionId,\r\n type: '1'\r\n };\r\n countryModals.region.show(region);\r\n }\r\n}\r\n","module.exports = {\r\n bindings: {\r\n isLarge: '<',\r\n goodscode: '<'\r\n },\r\n controller: regulationsButtonController,\r\n templateUrl: 'regulations/components/regulations-button.html'\r\n};\r\n\r\nregulationsButtonController.$inject = ['regulationsModal'];\r\n\r\nfunction regulationsButtonController(regulationsModal) {\r\n\r\n var vm = {\r\n showRegulations: showRegulations\r\n };\r\n\r\n function showRegulations() {\r\n regulationsModal.show(vm.goodscode);\r\n }\r\n\r\n\r\n return vm;\r\n\r\n}","module.exports = {\r\n controller: regulationsNewsController,\r\n templateUrl: 'regulations/components/regulations-news-page.html'\r\n};\r\n\r\nregulationsNewsController.$inject = ['$analytics'];\r\n\r\nfunction regulationsNewsController($analytics) {\r\n var vm = {\r\n $onInit: attached\r\n };\r\n return vm;\r\n\r\n function attached() {\r\n $analytics.pageTrack('/regulations-news');\r\n }\r\n}","module.exports = {\r\n bindings: {\r\n goodscode: '<'\r\n },\r\n controller: regulationsNewsController,\r\n templateUrl: 'regulations/components/regulations-news.html'\r\n};\r\n\r\nregulationsNewsController.$inject = [\r\n 'notificationsService', \r\n 'regulationsDataService', \r\n 'measureTypesDataService',\r\n];\r\n\r\nfunction regulationsNewsController(\r\n notifications, \r\n regulationsData, \r\n measureTypesData\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n isLoadingRegulations: true,\r\n isLoadingGroups: false,\r\n isLoadingTypes: false,\r\n filter: {\r\n goodsCode: null\r\n },\r\n measureTypes: {},\r\n regulations: [],\r\n regulationTypes: [],\r\n regulationTypeDescriptions: {},\r\n regulationGroups: [],\r\n regulationGroupDescriptions: {},\r\n loadNews: loadNews\r\n };\r\n\r\n function attached() {\r\n vm.filter.goodsCode = vm.goodscode;\r\n load();\r\n notifications.subscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function dateChanged() {\r\n load();\r\n }\r\n\r\n function load() {\r\n return loadMeasureTypes()\r\n .then(function() {\r\n return loadNews(1);\r\n });\r\n }\r\n\r\n function loadMeasureTypes() {\r\n return measureTypesData\r\n .getMeasureTypesDictionary()\r\n .then(function(measureTypes) {\r\n vm.measureTypes = measureTypes;\r\n });\r\n }\r\n\r\n function loadNews(pageNumber) {\r\n if (!pageNumber) {\r\n pageNumber = 1;\r\n }\r\n vm.isLoadingRegulations = true;\r\n vm.regulations = [];\r\n return regulationsData.getRegulationNews(pageNumber - 1, vm.filter)\r\n .then(function (data) {\r\n vm.regulations = data;\r\n vm.isLoadingRegulations = false;\r\n });\r\n }\r\n\r\n function loadGroups() {\r\n vm.isLoadingGroups = true;\r\n vm.regulationGroups = [];\r\n\r\n return regulationsData.getRegulationGroups()\r\n .then(function (data) {\r\n vm.regulationGroups = data;\r\n vm.regulationGroupDescriptions = _.chain(data).keyBy('id').mapValues('description').value();\r\n vm.isLoadingGroups = false;\r\n });\r\n }\r\n\r\n function loadTypes() {\r\n vm.isLoadingTypes = true;\r\n vm.regulationTypes = [];\r\n\r\n return regulationsData.getRegulationTypes()\r\n .then(function (data) {\r\n vm.regulationTypes = data;\r\n vm.regulationTypeDescriptions = _.chain(data).keyBy('id').mapValues('description').value();\r\n vm.isLoadingTypes = false;\r\n });\r\n }\r\n\r\n\r\n return vm;\r\n\r\n}","module.exports = [celexToRegulationNumberFilter];\r\n\r\nfunction celexToRegulationNumberFilter() {\r\n\r\n\r\n return function (celex) {\r\n if (celex === null || celex === undefined) {\r\n return celex;\r\n }\r\n var year = celex.substr(1, 4);\r\n if (_.startsWith(year, '19')) {\r\n year = year.substr(2, 2);\r\n }\r\n var number = _.trimStart(celex.substr(6, 4), '0');\r\n \r\n return number + '/' + year;\r\n };\r\n}","module.exports = ['$analytics', '$uibModal', 'language', regulationModal];\r\n\r\nfunction regulationModal($analytics, $uibModal, language) {\r\n var modal = {\r\n measures: null,\r\n show: showModal\r\n };\r\n\r\n regulationModalController.$inject = ['$uibModalInstance', 'measures', 'applicationStateService'];\r\n\r\n function regulationModalController($uibModalInstance, measures, state) {\r\n var ctrlRegulationModal = {\r\n cancel: cancel,\r\n measures: measures,\r\n referenceCountry: state.filter.referenceCountry\r\n };\r\n\r\n function cancel() {\r\n// $(\".page-dashboard, .taric-page-content\").removeClass(\"noprint\");\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n return ctrlRegulationModal;\r\n }\r\n\r\n function showModal(measures) {\r\n $analytics.eventTrack('open-modal-regulation', { category: 'regulation' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: regulationModalController,\r\n controllerAs: 'ctrlRegulationModal',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n measures: function () {\r\n return _.map(measures, function(measure) {\r\n if (measure.regulation) {\r\n measure.regulation.oj_url = measure.regulation.url;\r\n if (measure.regulation.reg_journal_numb && measure.regulation.reg_journal_numb !== '1' && measure.regulation.reg_pubdate && measure.regulation.reg_journal_page) {\r\n measure.regulation.url =\r\n 'http://eur-lex.europa.eu/search.html?whOJ=NO_OJ%3D' + measure.regulation.reg_journal_numb.substring(2) +\r\n ',YEAR_OJ%3D' + measure.regulation.reg_pubdate.substring(0, 4) +\r\n ',PAGE_FIRST%3D' + _.padStart(measure.regulation.reg_journal_page, 4, '0') +\r\n '&DB_COLL_OJ=oj-l&type=advanced&lang=' + language.get();\r\n }\r\n }\r\n return measure;\r\n });\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'regulations/modals/regulation.html',\r\n windowClass: 'modal-regulation'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['$analytics', '$uibModal', regulationsModal];\r\n\r\nfunction regulationsModal($analytics, $uibModal) {\r\n var modal = {\r\n goodscode: null,\r\n show: showModal\r\n };\r\n\r\n regulationsModalController.$inject = ['$uibModalInstance', 'goodscode'];\r\n\r\n function regulationsModalController($uibModalInstance, goodscode) {\r\n var vm = {\r\n cancel: cancel,\r\n goodscode: goodscode\r\n };\r\n\r\n function cancel() {\r\n// $(\".page-dashboard, .taric-page-content\").removeClass(\"noprint\");\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(goodscode) {\r\n $analytics.eventTrack('open-modal-regulations', { category: 'regulations' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: regulationsModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n goodscode: function() {\r\n return goodscode;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'regulations/modals/regulations.html',\r\n windowClass: 'modal-wide'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['common', 'applicationStateService', 'dataContext', 'measureTypesDataService', regulationsDataService];\r\n\r\nfunction regulationsDataService(common, state, dataContext, measureTypesData) {\r\n var service = {\r\n getMeasureOverview: getMeasureOverview,\r\n getRegulation: getRegulation,\r\n getRegulationDetails: getRegulationDetails,\r\n getRegulationNews: getRegulationNews,\r\n getRegulationTypes: getRegulationTypes,\r\n getRegulationGroups: getRegulationGroups\r\n };\r\n\r\n function getRegulation(dtvRegulationId) {\r\n var url = common.config.apiHosts[common.config.currentApi] +\r\n '/regulations/byDtvRegulationId/' + dtvRegulationId +\r\n '?lang=' + common.language.get() +\r\n '&date=' + state.filter.date;\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function getMeasureOverview(celex, pageIndex) {\r\n var url = common.config.apiHosts[common.config.currentApi] +\r\n '/regulations/' + celex + '/measure_overview' +\r\n '?lang=' + common.language.get() +\r\n '&date=' + state.filter.date +\r\n '&pindex=' + pageIndex +\r\n '&psize=10';\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n\r\n function getRegulationDetails(celex) {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] +\r\n '/regulations/detailsByCelex/' + celex +\r\n '?lang=' + common.language.get() +\r\n '&date=' + state.filter.date;\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function getRegulationNews(pageNumber, filter) {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] +\r\n '/regulations/news' +\r\n '?lang=' + common.language.get() +\r\n '&date=' + state.filter.date +\r\n '&pindex=' + pageNumber +\r\n '&psize=10';\r\n\r\n if (filter && filter.goodsCode) {\r\n url += '&goodscode=' + filter.goodsCode;\r\n }\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function getRegulationTypes() {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] +\r\n '/regulations/types' +\r\n '?lang=' + common.language.get() +\r\n '&date=' + state.filter.date;\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function getRegulationGroups() {\r\n\r\n var url = common.config.apiHosts[common.config.currentApi] +\r\n '/regulations/groups' +\r\n '?lang=' + common.language.get() +\r\n '&date=' + state.filter.date;\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n return service;\r\n\r\n}\r\n","angular.module('taric.search', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('foundTexts', require('./components/found-texts'))\r\n .component('headingSearchResults', require('./components/heading-search-results'))\r\n .component('headerSearchBox', require('./components/header-search-box'))\r\n .component('largeSearchBox', require('./components/large-search-box'))\r\n .component('nomenclatureSearchForm', require('./components/nomenclature-search-form'))\r\n .component('searchForm', require('./components/search-form'))\r\n .component('searchSubNav', require('./components/search-sub-nav'))\r\n // Controllers\r\n .controller('searchBoxController', require('./controllers/search-box'))\r\n // Pages\r\n .component('searchAlphabeticalIndexPage', require('./components/pages/search-alphabetical-index'))\r\n .component('searchCccConclusionsPage', require('./components/pages/search-ccc-conclusions'))\r\n .component('searchAnnotationsPage', require('./components/pages/search-annotations'))\r\n .component('searchHeadingPage', require('./components/pages/search-heading'))\r\n .component('searchEuExplanatoryNotesPage', require('./components/pages/search-eu-explanatory-notes'))\r\n .component('searchExplanatoryNotesGermanyPage', require('./components/pages/search-explanatory-notes-germany'))\r\n .component('searchTextsGermanyPage', require('./components/pages/search-texts-germany'))\r\n .component('searchWcoClassificationOpinionsPage', require('./components/pages/search-wco-classification-opinions'))\r\n .component('searchWcoExplanatoryNotesPage', require('./components/pages/search-wco-explanatory-notes'))\r\n .component('searchPage', require('./components/pages/search'))\r\n // Services\r\n .factory('searchService', require('./services/search'))\r\n ;\r\n\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/search/heading', {\r\n template: ''\r\n })\r\n .when('/search/tree', {\r\n template: ''\r\n }) \r\n .when('/search/annotations', {\r\n template: ''\r\n })\r\n .when('/search/explanatory-notes/eu', {\r\n template: ''\r\n })\r\n .when('/search/explanatory-notes/germany', {\r\n template: ''\r\n })\r\n .when('/search/texts/germany', {\r\n template: ''\r\n })\r\n .when('/search/explanatory-notes/wco', {\r\n template: ''\r\n })\r\n .when('/search/classifications/wco', {\r\n template: ''\r\n })\r\n .when('/search/alphabetical-index', {\r\n template: ''\r\n })\r\n .when('/search/atr-index.page', {\r\n template: ''\r\n })\r\n .when('/search/ccc-conclusions', {\r\n template: ''\r\n })\r\n .when('/search/:searchquery', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n commodityCode: '<',\r\n foundTexts: '<',\r\n searchQuery: '<'\r\n },\r\n controller: foundTextsController,\r\n templateUrl: 'search/components/found-texts.html'\r\n};\r\n\r\nfoundTextsController.$inject = [\r\n 'btiModal', \r\n 'caseLawModal', \r\n 'classificationRegulationsModal'\r\n];\r\n\r\nfunction foundTextsController(\r\n btiModal, \r\n caseLawModal, \r\n classificationRegulationsModal\r\n) {\r\n var vm = {\r\n showBti: showBti,\r\n showCaseLaw: showCaseLaw,\r\n showClassificationRegulations: showClassificationRegulations,\r\n };\r\n return vm;\r\n\r\n function showBti(code, $event) {\r\n btiModal.show(code, vm.searchQuery);\r\n\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n function showClassificationRegulations(code, $event) {\r\n classificationRegulationsModal.show(code, vm.searchQuery);\r\n\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n function showCaseLaw(code, $event) {\r\n caseLawModal.show(code, vm.searchQuery);\r\n\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n}","module.exports = {\r\n controller: 'searchBoxController',\r\n templateUrl: 'search/components/header-search-box.html'\r\n};","module.exports = {\r\n bindings: {\r\n query: '<',\r\n headingResult: '<'\r\n },\r\n controller: headingSearchResultsController,\r\n templateUrl: 'search/components/heading-search-results.html'\r\n};\r\n\r\nheadingSearchResultsController.$inject = [\r\n '$location', \r\n 'btiModal', \r\n 'caseLawModal', \r\n 'classificationRegulationsModal',\r\n 'formatting', \r\n 'searchService', \r\n];\r\n\r\nfunction headingSearchResultsController(\r\n $location, \r\n btiModal, \r\n caseLawModal, \r\n classificationRegulationsModal, \r\n formatting, \r\n searchService\r\n) {\r\n var vm = {\r\n searchCode: searchCode,\r\n showBti: showBti,\r\n showCaseLaw: showCaseLaw,\r\n showClassificationRegulations: showClassificationRegulations,\r\n };\r\n\r\n return vm;\r\n\r\n function searchCode(code) {\r\n var q = searchService.createQueryFromLastQuery(vm.query);\r\n q.commodityCode = formatting.removeTrailingZeros(code);\r\n var queryString = searchService.serializeQuery(q);\r\n $location.path('/search/tree').search(queryString);\r\n }\r\n\r\n function showBti(code, $event) {\r\n btiModal.show(code, vm.query.QueryString);\r\n\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n function showClassificationRegulations(code, $event) {\r\n classificationRegulationsModal.show(code, vm.query.QueryString);\r\n\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n function showCaseLaw(code, $event) {\r\n caseLawModal.show(code, vm.query.QueryString);\r\n\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n}","module.exports = {\r\n controller: 'searchBoxController',\r\n templateUrl: 'search/components/large-search-box.html'\r\n};\r\n","module.exports = {\r\n bindings: {\r\n query: '<', \r\n searchHandler: '&'\r\n },\r\n controller: nomenclatureSearchFormController,\r\n templateUrl: 'search/components/nomenclature-search-form.html'\r\n};\r\n\r\nnomenclatureSearchFormController.$inject = [\r\n '$location', \r\n 'notificationsService',\r\n];\r\n\r\nfunction nomenclatureSearchFormController(\r\n $location, \r\n notificationsService\r\n) {\r\n \r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n query: {},\r\n validationResult: {},\r\n search: search\r\n };\r\n\r\n function attached() {\r\n notificationsService.subscribe('filter_movement_changed', movementChanged);\r\n notificationsService.subscribe('filter_date_changed', dateChanged);\r\n notificationsService.subscribe('language_changed', languageChanged);\r\n }\r\n \r\n function detached() {\r\n notificationsService.unsubscribe('filter_movement_changed', movementChanged);\r\n notificationsService.unsubscribe('filter_date_changed', dateChanged);\r\n notificationsService.unsubscribe('language_changed', languageChanged);\r\n }\r\n\r\n function languageChanged() {\r\n $location.search('query', null).replace();\r\n }\r\n\r\n function movementChanged() {\r\n vm.search(vm.query);\r\n }\r\n\r\n function dateChanged() {\r\n vm.search(vm.query);\r\n }\r\n\r\n function validateForm(query) {\r\n var result = {\r\n isValid: true,\r\n errors: {}\r\n };\r\n if (!query.query) {\r\n result.isValid = false;\r\n result.query = 'QueryIsRequired';\r\n }\r\n \r\n if (query.commodityCode) {\r\n query.commodityCode = query.commodityCode.replaceAll(/[.\\s]/g, '');\r\n if (!/^[0-9]{2,10}$/.test(query.commodityCode)) {\r\n result.isValid = false;\r\n result.commodityCode = 'CommodityCodeIsInvalid';\r\n }\r\n }\r\n if (query.query) {\r\n if (query.query.length < 2) {\r\n result.isValid = false;\r\n result.query = 'QueryIsTooShort';\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n function search(query) {\r\n vm.validationResult = validateForm(query);\r\n if (vm.validationResult.isValid) {\r\n if (vm.searchHandler) {\r\n vm.searchHandler({ query: query });\r\n }\r\n }\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n controller: searchAlphabeticalIndexController,\r\n templateUrl: 'search/components/pages/search-alphabetical-index.html'\r\n};\r\n\r\nsearchAlphabeticalIndexController.$inject = [\r\n '$analytics', \r\n '$location', \r\n 'dataContext', \r\n 'language', \r\n 'config', \r\n 'applicationStateService'\r\n];\r\n\r\nfunction searchAlphabeticalIndexController(\r\n $analytics, \r\n $location, \r\n dataContext, \r\n language, \r\n config, \r\n state\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n isLoading: false,\r\n language: language.get(),\r\n query: {\r\n QueryString: ''\r\n },\r\n results: [],\r\n search: search,\r\n\r\n };\r\n\r\n return vm;\r\n \r\n function attached() {\r\n $analytics.pageTrack('/alphabetical-index-search');\r\n loadSearch();\r\n }\r\n\r\n function search(query) {\r\n $location.path('/search/alphabetical-index').search(query);\r\n }\r\n\r\n\r\n function loadSearch() {\r\n vm.query.QueryString = $location.search().query;\r\n var url = config.apiHosts.generic + '/alphabetical-index/search' +\r\n '?lang=' + vm.language +\r\n '&q=' + vm.query.QueryString +\r\n '&date=' + state.filter.date;\r\n if (vm.query.QueryString && vm.query.QueryString.length > 1) {\r\n vm.language = language.get();\r\n vm.isLoading = true;\r\n if (vm.language === 'en' || vm.language === 'de') {\r\n dataContext.get(url)\r\n .then(function (data) {\r\n vm.isLoading = false;\r\n vm.results = data;\r\n });\r\n }\r\n }\r\n }\r\n}","module.exports = {\r\n controller: searchAnnotationsController,\r\n templateUrl: 'search/components/pages/search-annotations.html'\r\n};\r\n\r\nsearchAnnotationsController.$inject = [\r\n '$analytics', \r\n '$location',\r\n 'notificationsService', \r\n 'annotationsDataService'\r\n];\r\n\r\nfunction searchAnnotationsController(\r\n $analytics, \r\n $location,\r\n notificationsService, \r\n annotationsDataService\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n isLoading: false,\r\n query: {\r\n QueryString: ''\r\n },\r\n results: null,\r\n scrollToDocument: scrollToDocument,\r\n search: search\r\n };\r\n\r\n function attached() {\r\n vm.query.QueryString = $location.search().query;\r\n $analytics.pageTrack('/section-and-chapter-notes-search');\r\n loadSearch();\r\n notificationsService.subscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function scrollToDocument(result) {\r\n document\r\n .querySelector('.EU-Note-' + result.NomenclatureLevel + '-' + result.GoodsCodeOrSectionNumber)\r\n .scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n\r\n return vm;\r\n\r\n function search(query) {\r\n $location.path('/search/annotations').search(query);\r\n }\r\n\r\n function loadSearch() {\r\n if (vm.query.QueryString && vm.query.QueryString.length > 1) {\r\n vm.isLoading = true;\r\n annotationsDataService.searchNotes(vm.query.QueryString)\r\n .then(function(data) {\r\n vm.isLoading = false;\r\n vm.results = data;\r\n });\r\n }\r\n }\r\n}","module.exports = {\r\n controller: searchConclusionIndexController,\r\n templateUrl: 'search/components/pages/search-ccc-conclusions.html'\r\n};\r\n\r\nsearchConclusionIndexController.$inject = [\r\n '$analytics', \r\n '$location',\r\n 'searchService',\r\n 'textDataService', \r\n 'common',\r\n];\r\n\r\nfunction searchConclusionIndexController(\r\n $analytics, \r\n $location,\r\n searchService,\r\n textDataService,\r\n common\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n isLoading: false,\r\n results: null,\r\n commodityCode: '',\r\n query:'',\r\n search: search,\r\n clearCommodityCode: clearCommodityCode,\r\n clearQuery: clearQuery,\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n var q = searchService.parseLocationSearchObject($location.search());\r\n vm.commodityCode = q.commodityCode || '';\r\n vm.query = q.query || '';\r\n search();\r\n }\r\n\r\n function search() {\r\n if(vm.commodityCode.length > 0 || vm.query.length > 0) {\r\n vm.isLoading = true;\r\n $location.search('query', vm.query);\r\n $location.search('commodityCode', vm.commodityCode);\r\n return textDataService.getCccConclusions(vm.commodityCode, vm.query)\r\n .then(function (results) {\r\n vm.isLoading = false;\r\n vm.results = results;\r\n });\r\n }\r\n\r\n }\r\n\r\n function clearQuery() {\r\n vm.query = '';\r\n vm.results = null;\r\n }\r\n\r\n function clearCommodityCode() {\r\n vm.commodityCode = '';\r\n vm.results = null;\r\n }\r\n}","module.exports = {\r\n controller: searchEuExplanatoryNotesController,\r\n templateUrl: 'search/components/pages/search-eu-explanatory-notes.html'\r\n};\r\n\r\nsearchEuExplanatoryNotesController.$inject = [\r\n '$analytics', \r\n '$location', \r\n 'notificationsService', \r\n 'dataContext', \r\n 'language', \r\n 'config', \r\n 'applicationStateService',\r\n];\r\n\r\nfunction searchEuExplanatoryNotesController(\r\n $analytics, \r\n $location, \r\n notificationsService, \r\n dataContext, \r\n language, \r\n config, \r\n state\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n isLoading: false,\r\n query: {\r\n QueryString: ''\r\n },\r\n results: [],\r\n scrollToDocument: scrollToDocument,\r\n search: search\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n vm.query.QueryString = $location.search().query;\r\n $analytics.pageTrack('/eu-explanatory-notes-search');\r\n loadSearch();\r\n notificationsService.subscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function search(query) {\r\n $location.path('/search/explanatory-notes/eu').search(query);\r\n }\r\n\r\n function scrollToDocument(explanatoryNote) {\r\n var selector = '.explanatory-note-EU-' + explanatoryNote.NomenclatureLevel + '-' + explanatoryNote.GoodsCodeOrSectionNumber;\r\n document\r\n .querySelector(selector)\r\n .scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n\r\n\r\n function loadSearch() {\r\n var url = config.apiHosts.generic + '/explanatory-notes/eu/search' +\r\n '?lang=' + language.get() +\r\n '&q=' + vm.query.QueryString +\r\n '&date=' + state.filter.date;\r\n if (vm.query.QueryString && vm.query.QueryString.length > 1) {\r\n vm.isLoading = true;\r\n dataContext.get(url)\r\n .then(function (data) {\r\n vm.isLoading = false;\r\n vm.results = data;\r\n });\r\n }\r\n }\r\n}","module.exports = {\r\n controller: searchExplanatoryNotesGermanyController,\r\n templateUrl: 'search/components/pages/search-explanatory-notes-germany.html'\r\n};\r\n\r\nsearchExplanatoryNotesGermanyController.$inject = [\r\n '$analytics', \r\n '$location', \r\n 'notificationsService', \r\n 'dataContext', \r\n 'language', \r\n 'config', \r\n 'applicationStateService',\r\n];\r\n\r\nfunction searchExplanatoryNotesGermanyController(\r\n $analytics,\r\n $location, \r\n notificationsService, \r\n dataContext, \r\n language, \r\n config, \r\n state\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n isLoading: false,\r\n query: {\r\n QueryString: ''\r\n },\r\n results: [],\r\n scrollToDocument: scrollToDocument,\r\n search: search\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n vm.query.QueryString = $location.search().query;\r\n $analytics.pageTrack('/explanatory-notes-germany-search');\r\n loadSearch();\r\n notificationsService.subscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function search(query) {\r\n $location.path('/search/explanatory-notes/germany').search(query);\r\n }\r\n\r\n function scrollToDocument(eztDocument) {\r\n document\r\n .querySelector('.DOC_' + eztDocument.HtmlClassName)\r\n .scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n\r\n function loadSearch() {\r\n var url = config.apiHosts.dtv + '/ezt/explanatory-notes/search' +\r\n '?lang=' + language.get() +\r\n '&q=' + vm.query.QueryString +\r\n '&date=' + state.filter.date;\r\n if (vm.query.QueryString && vm.query.QueryString.length > 1) {\r\n vm.isLoading = true;\r\n dataContext.get(url)\r\n .then(function (data) {\r\n vm.isLoading = false;\r\n vm.result = data;\r\n });\r\n }\r\n }\r\n}","module.exports = {\r\n controller: searchHeadingController,\r\n templateUrl: 'search/components/pages/search-heading.html'\r\n};\r\n\r\nsearchHeadingController.$inject = [\r\n '$analytics', \r\n 'formatting', \r\n 'applicationStateService', \r\n 'searchService', \r\n '$location', \r\n 'nomenclatureDataService',\r\n];\r\n\r\nfunction searchHeadingController(\r\n $analytics, \r\n formatting, \r\n state, \r\n searchService, \r\n $location, \r\n nomenclatureDataService\r\n) {\r\n\r\n\r\n var vm = {\r\n $onInit: attached,\r\n chapterFilter: null,\r\n result: {},\r\n isLoading: false,\r\n q: {},\r\n search: search,\r\n state: state,\r\n };\r\n\r\n return vm;\r\n\r\n\r\n function attached() {\r\n $analytics.pageTrack('/nomenclature-search/headings');\r\n vm.q = searchService.parseLocationSearchObject($location.search());\r\n if (vm.q.commodityCode || vm.q.query) {\r\n search(vm.q);\r\n }\r\n }\r\n\r\n function search (q) {\r\n if (!q.commodityCode && !q.query) {\r\n return;\r\n }\r\n\r\n var queryString = searchService.serializeQuery(q);\r\n // NB: the back button will not work properly if we don't do this check\r\n if (queryString !== searchService.serializeQuery($location.search())) {\r\n $location.path('/search/heading').search(queryString);\r\n }\r\n\r\n vm.q = q;\r\n\r\n vm.isLoading = true;\r\n state.currentIndentation = null;\r\n\r\n if (!state.remember.country && !q.country) {\r\n state.filter.countryCode = null;\r\n state.filter.countryName = null;\r\n }\r\n\r\n // NB: if we'd remove this first if-statement, we could show results for a single heading in a flat format\r\n if (q.commodityCode && !formatting.isChapterCode(q.commodityCode)) {\r\n $location.path('/search/tree').replace();\r\n }\r\n else if (!q.query && q.commodityCode && formatting.isChapterCode(q.commodityCode)) {\r\n $location.url('/chapter/' + q.commodityCode.substring(0, 2)).replace();\r\n }\r\n else {\r\n if (q.commodityCode !== null) {\r\n vm.chapterFilter = formatting.toChapterNumber(q.commodityCode);\r\n }\r\n \r\n nomenclatureDataService.searchHeadings(q)\r\n .then(function (data) {\r\n vm.isLoading = false;\r\n vm.result = data;\r\n });\r\n }\r\n }\r\n}","module.exports = {\r\n controller: searchTextsGermanyController,\r\n templateUrl: 'search/components/pages/search-texts-germany.html'\r\n};\r\n\r\nsearchTextsGermanyController.$inject = [\r\n '$analytics', \r\n '$location', \r\n 'notificationsService', \r\n 'dataContext', \r\n 'language', \r\n 'config', \r\n 'applicationStateService',\r\n];\r\n\r\nfunction searchTextsGermanyController(\r\n $analytics, \r\n $location, \r\n notificationsService, \r\n dataContext, \r\n language, \r\n config, \r\n state\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n isLoading: false,\r\n query: {\r\n QueryString: ''\r\n },\r\n results: [],\r\n scrollToDocument: scrollToDocument,\r\n search: search\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n vm.query.QueryString = $location.search().query;\r\n $analytics.pageTrack('/texts-germany-search');\r\n loadSearch();\r\n notificationsService.subscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function search(query) {\r\n $location.path('/search/texts/germany').search(query);\r\n }\r\n\r\n function scrollToDocument(eztDocument) {\r\n document\r\n .querySelector('.' + eztDocument.HtmlClassName)\r\n .scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n\r\n\r\n function loadSearch() {\r\n var url = config.apiHosts.dtv + '/ezt/texts/search' +\r\n '?lang=' + language.get() +\r\n '&q=' + vm.query.QueryString +\r\n '&date=' + state.filter.date;\r\n if (vm.query.QueryString && vm.query.QueryString.length > 1) {\r\n vm.isLoading = true;\r\n dataContext.get(url)\r\n .then(function (data) {\r\n vm.isLoading = false;\r\n vm.result = data;\r\n });\r\n }\r\n }\r\n}","module.exports = {\r\n controller: searchWcoClassificationOpinionsController,\r\n templateUrl: 'search/components/pages/search-wco-classification-opinions.html'\r\n};\r\n\r\nsearchWcoClassificationOpinionsController.$inject = [\r\n '$analytics', \r\n '$location', \r\n 'notificationsService', \r\n 'dataContext', \r\n 'language', \r\n 'config', \r\n 'applicationStateService',\r\n];\r\n\r\nfunction searchWcoClassificationOpinionsController(\r\n $analytics, \r\n $location, \r\n notificationsService, \r\n dataContext, \r\n language, \r\n config, \r\n state\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n isLoading: false,\r\n language: language.get(),\r\n query: {\r\n QueryString: ''\r\n },\r\n results: [],\r\n scrollToDocument: scrollToDocument,\r\n search: search\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n vm.query.QueryString = $location.search().query;\r\n $analytics.pageTrack('/wco-classification-opinions-search');\r\n loadSearch();\r\n notificationsService.subscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function search(query) {\r\n $location.path('/search/classifications/wco').search(query);\r\n }\r\n\r\n function scrollToDocument(result) {\r\n var selector = '.classification-opinion-WCO-' + result.HsCode + '-' + result.Number;\r\n document\r\n .querySelector(selector)\r\n .scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n\r\n\r\n function loadSearch() {\r\n var url = config.apiHosts.generic + '/classifications/wco/search' +\r\n '?lang=' + language.get() +\r\n '&q=' + vm.query.QueryString +\r\n '&date=' + state.filter.date;\r\n if (vm.query.QueryString && vm.query.QueryString.length > 1) {\r\n vm.language = language.get();\r\n vm.isLoading = true;\r\n if (vm.language === 'en' || vm.language === 'fr') {\r\n dataContext.get(url)\r\n .then(function (data) {\r\n vm.isLoading = false;\r\n vm.results = data;\r\n });\r\n }\r\n }\r\n }\r\n}","module.exports = {\r\n controller: searchWcoExplanatoryNotesController,\r\n templateUrl: 'search/components/pages/search-wco-explanatory-notes.html'\r\n};\r\n\r\nsearchWcoExplanatoryNotesController.$inject = [\r\n '$analytics', \r\n '$location', \r\n 'notificationsService', \r\n 'dataContext', \r\n 'language', \r\n 'config', \r\n 'applicationStateService',\r\n];\r\n\r\nfunction searchWcoExplanatoryNotesController(\r\n $analytics, \r\n $location, \r\n notificationsService, \r\n dataContext, \r\n language, \r\n config, \r\n state\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n isLoading: false,\r\n language: language.get(),\r\n query: {\r\n QueryString: ''\r\n },\r\n results: [],\r\n scrollToDocument: scrollToDocument,\r\n search: search\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n vm.query.QueryString = $location.search().query;\r\n $analytics.pageTrack('/wco-explanatory-notes-search');\r\n loadSearch();\r\n notificationsService.subscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('filter_date_changed', loadSearch);\r\n }\r\n\r\n function search(query) {\r\n $location.path('/search/explanatory-notes/wco').search(query);\r\n }\r\n\r\n function scrollToDocument(explanatoryNote) {\r\n var selector = '.explanatory-note-WCO-' + explanatoryNote.NomenclatureLevel + '-' + explanatoryNote.GoodsCodeOrSectionNumber;\r\n document\r\n .querySelector(selector)\r\n .scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n\r\n\r\n function loadSearch() {\r\n var url = config.apiHosts.generic + '/explanatory-notes/wco/search' +\r\n '?lang=' + language.get() +\r\n '&q=' + vm.query.QueryString +\r\n '&date=' + state.filter.date;\r\n if (vm.query.QueryString && vm.query.QueryString.length > 1) {\r\n vm.language = language.get();\r\n vm.isLoading = true;\r\n if (vm.language === 'en' || vm.language === 'fr') {\r\n dataContext.get(url)\r\n .then(function (data) {\r\n vm.isLoading = false;\r\n vm.results = data;\r\n });\r\n }\r\n }\r\n }\r\n}","module.exports = {\r\n controller: searchController,\r\n templateUrl: 'search/components/pages/search.html'\r\n};\r\n\r\nsearchController.$inject = [\r\n '$analytics',\r\n '$routeParams', \r\n 'common', \r\n 'dataContext', \r\n 'formatting',\r\n 'btiDataService', \r\n 'btiModal', \r\n 'caseLawModal', \r\n 'classificationRegulationsModal', \r\n 'nomenclatureDataService',\r\n 'nomenclatureTreeService', \r\n 'notificationsService', \r\n 'applicationStateService', \r\n 'searchService',\r\n 'referenceDateService',\r\n 'ecicsDataService',\r\n];\r\n\r\nfunction searchController(\r\n $analytics, \r\n $routeParams, \r\n common, \r\n dataContext, \r\n formatting, \r\n btiDataService,\r\n btiModal, \r\n caseLawModal, \r\n classificationRegulationsModal, \r\n nomenclatureDataService,\r\n nomenclatureTreeService, \r\n notifications,\r\n state, \r\n searchService,\r\n referenceDateService,\r\n ecicsDataService\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n q: {},\r\n searchQuery: '',\r\n chapters: [],\r\n ecicsCount: {},\r\n isLoading: false,\r\n state: state,\r\n goHome: goHome,\r\n clickRow: clickRow,\r\n doubleClickRow: doubleClickRow,\r\n deselectLine: deselectLine,\r\n hasAtr: hasAtr,\r\n hasBti: hasBti,\r\n loadChapter: loadChapter,\r\n matchedGoodsCode: false,\r\n queryIsValid: queryIsValid,\r\n search: search,\r\n showBti: showBti,\r\n showCaseLaw: showCaseLaw,\r\n showClassificationRegulations: showClassificationRegulations\r\n };\r\n\r\n function attached() {\r\n common.auth.check();\r\n var referenceDate = common.$location.search().date;\r\n if (referenceDate) {\r\n referenceDateService.setReferenceDate(referenceDate);\r\n }\r\n // This is to support the older style links. This is only used with searchquery equal to a commodity code.\r\n if ($routeParams.searchquery) {\r\n if (common.formatting.isCommodityCode($routeParams.searchquery)) {\r\n common.$location.path('search/tree').search({ \r\n commodityCode: common.formatting.cleanGoodsCode($routeParams.searchquery) \r\n }).replace();\r\n }\r\n else {\r\n common.$location.path('search/headings').search({ \r\n query: $routeParams.searchquery \r\n }).replace();\r\n }\r\n }\r\n else {\r\n vm.q = searchService.parseLocationSearchObject(common.$location.search());\r\n loadSearchResults(vm.q);\r\n }\r\n notifications.subscribe('filter_movement_changed', movementChanged);\r\n notifications.subscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_movement_changed', movementChanged);\r\n notifications.unsubscribe('filter_date_changed', dateChanged);\r\n }\r\n\r\n function movementChanged() {\r\n loadSearchResults(vm.q);\r\n }\r\n\r\n function dateChanged() {\r\n loadSearchResults(vm.q);\r\n }\r\n\r\n function goHome() {\r\n common.$location.url('');\r\n }\r\n\r\n function clickRow(heading) {\r\n state.currentCode = heading.value.commodityCode;\r\n state.currentIndentation = heading.value.indentation;\r\n if (!heading.hasChildren) {\r\n common.$location.url('good/' + heading.value.commodityCode);\r\n }\r\n else {\r\n heading.metadata.isExpanded = !heading.metadata.isExpanded;\r\n }\r\n }\r\n\r\n function doubleClickRow(heading) {\r\n state.currentCode = heading.value.commodityCode;\r\n state.currentIndentation = heading.value.indentation;\r\n if (!heading.hasChildren) {\r\n common.$location.url('good/' + heading.value.commodityCode);\r\n }\r\n else if (heading.metadata.isExpanded) {\r\n nomenclatureTreeService.collapseAll(heading);\r\n }\r\n else {\r\n nomenclatureTreeService.expandAll(heading);\r\n }\r\n common.interaction.clearSelection();\r\n }\r\n\r\n function setSectionAndChapter(sectionNumber, chapterNumber) {\r\n \r\n return nomenclatureDataService.getSections()\r\n .then(function(wrapper) {\r\n vm.section = _.find(wrapper.data, function(section) {\r\n return section.number === sectionNumber;\r\n });\r\n vm.chapter = _.find(vm.section.chapters, function(chapter) {\r\n return chapter.number === chapterNumber;\r\n });\r\n });\r\n }\r\n\r\n function queryIsValid(q) {\r\n if (q.query) {\r\n return q.query.length > 1;\r\n }\r\n else {\r\n return !!q.commodityCode;\r\n }\r\n }\r\n\r\n function search(q) {\r\n if (queryIsValid(q)) {\r\n var queryString = searchService.serializeQuery(q);\r\n common.$location.path('/search/tree').search(queryString);\r\n }\r\n }\r\n\r\n function loadSearchResults(q) {\r\n if (!queryIsValid(q)) {\r\n return;\r\n }\r\n if (!q.commodityCode) {\r\n \r\n var queryString = searchService.serializeQuery(q);\r\n common.$location.path('/search/heading').search(queryString).replace();\r\n }\r\n\r\n vm.q = q;\r\n \r\n dataContext.cancel('GOOD');\r\n vm.isLoading = true;\r\n state.currentIndentation = null;\r\n\r\n if (!state.remember.country && !q.country) {\r\n state.filter.countryCode = null;\r\n state.filter.countryName = null;\r\n }\r\n \r\n if (!q.query) {\r\n\r\n // This is browsing, not searching. We can split this up.\r\n\r\n if (!q.commodityCode) {\r\n common.$location.url('');\r\n }\r\n var chapterCode = q.commodityCode.substring(0, 2);\r\n\r\n if (formatting.isChapterCode(q.commodityCode)) {\r\n common.$location.url('/chapter/' + chapterCode).replace();\r\n }\r\n vm.matchedGoodsCode = true;\r\n\r\n $analytics.pageTrack('/nomenclature-search/by-code');\r\n\r\n nomenclatureDataService.browseHeading(q)\r\n .then(function (data) {\r\n vm.searchType = 'browse'; // At some point we should just split browsing and searching into two different views\r\n vm.isLoading = false;\r\n if (!state.navigatingFromMeasuresPage && nomenclatureTreeService.isDeclarableCode(q.commodityCode, data.tree)) {\r\n dataContext.cancel('SEARCH');\r\n common.$location\r\n .url('/good/' + formatting.goodsCodeToGoodsnomId(q.commodityCode))\r\n .replace();\r\n }\r\n else {\r\n setSectionAndChapter(data.metadata.sectionNumber, data.metadata.chapterNumber);\r\n nomenclatureTreeService.setCodeFromAndCodeTo(data.tree);\r\n setEcicsCount(data.tree);\r\n setCurrentIndentation(data.tree);\r\n vm.metadata = data.metadata;\r\n vm.heading = data.tree;\r\n vm.lastQuery = data.query;\r\n }\r\n state.navigatingFromMeasuresPage = false;\r\n },\r\n function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n else if (q.commodityCode === null || formatting.isChapterCode(q.commodityCode)) {\r\n common.$location.path('/search/heading/').replace();\r\n }\r\n else {\r\n if (q.commodityCode) {\r\n $analytics.pageTrack('/nomenclature-search/by-text-and-code');\r\n }\r\n else {\r\n $analytics.pageTrack('/nomenclature-search/by-text');\r\n }\r\n vm.matchedGoodsCode = false;\r\n\r\n \r\n nomenclatureDataService.searchTree(q)\r\n .then(function (data) {\r\n vm.isLoading = false;\r\n\r\n if (!state.navigatingFromMeasuresPage && nomenclatureTreeService.isDeclarableCode(q.commodityCode, data.nomenclatureResult.tree)) {\r\n dataContext.cancel('SEARCH');\r\n common.$location\r\n .url('/good/' + formatting.goodsCodeToGoodsnomId(q.commodityCode))\r\n .replace();\r\n }\r\n else {\r\n nomenclatureTreeService.setCodeFromAndCodeTo(data.nomenclatureResult.tree);\r\n setEcicsCount(data.nomenclatureResult.tree);\r\n setSectionAndChapter(data.nomenclatureResult.metadata.sectionNumber, data.nomenclatureResult.metadata.chapterNumber);\r\n setCurrentIndentation(data.nomenclatureResult.tree);\r\n vm.metadata = data.nomenclatureResult.metadata;\r\n vm.heading = data.nomenclatureResult.tree;\r\n vm.foundTexts = data.foundTexts;\r\n vm.lastQuery = data.query;\r\n vm.lastQuery.Heading = data.query.RootCommodityCode.substring(0, 4);\r\n vm.numberOfResults = data.nomenclatureResult.numberOfResults;\r\n }\r\n state.navigatingFromMeasuresPage = false;\r\n }, function(err) {\r\n if (!err.isAborted) {\r\n try {\r\n Sentry.captureException(err);\r\n }\r\n catch (e) {}\r\n }\r\n });\r\n }\r\n }\r\n\r\n function setEcicsCount(tree) {\r\n if (!tree) {\r\n return;\r\n }\r\n ecicsDataService.countForGoodsCode(tree.value.commodityCode)\r\n .then(function(numberOfEcicsItems) {\r\n vm.ecicsCount = {};\r\n vm.ecicsCount[tree.value.commodityCode] = numberOfEcicsItems;\r\n });\r\n }\r\n\r\n function loadChapter(chapterCode) {\r\n common.$location.path('/chapter/' + chapterCode).search('');\r\n }\r\n\r\n function hasAtr() {\r\n return !vm.foundTexts || vm.foundTexts.atrCount > 0;\r\n }\r\n\r\n function hasBti() {\r\n return !vm.foundTexts || vm.foundTexts.btiCount > 0;\r\n }\r\n\r\n function setCurrentIndentation(node) {\r\n\r\n if (node === null) {\r\n return;\r\n }\r\n // Get currentCode from search result from server\r\n if (node.metadata.isCurrentCode) {\r\n state.currentCode = node.value.commodityCode;\r\n state.currentIndentation = node.value.indentation;\r\n }\r\n \r\n if (node.children !== null && node.children.length > 0) {\r\n _.forEach(node.children, function (child) {\r\n setCurrentIndentation(child);\r\n });\r\n }\r\n }\r\n\r\n function deselectLine() {\r\n state.currentCode = null;\r\n state.currentIndentation = null;\r\n }\r\n\r\n function showBti(code, $event) {\r\n btiModal.show(code, vm.q.query);\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n function showCaseLaw(code, $event) {\r\n caseLawModal.show(code, vm.q.query);\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n function showClassificationRegulations(code, $event) {\r\n classificationRegulationsModal.show(code, vm.q.query);\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n return vm;\r\n}\r\n","module.exports = {\r\n bindings: { \r\n searchHandler: '&', \r\n legend: '@' \r\n },\r\n controller: searchFormController,\r\n templateUrl: 'search/components/search-form.html'\r\n};\r\n\r\nsearchFormController.$inject = [\r\n '$location',\r\n 'notificationsService', \r\n 'language'\r\n];\r\n\r\nfunction searchFormController(\r\n $location, \r\n notificationsService, \r\n language\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n language: language.get(),\r\n query: {\r\n query: $location.search().query\r\n },\r\n validationResult: {},\r\n search: search\r\n };\r\n\r\n return vm;\r\n\r\n function attached() {\r\n notificationsService.subscribe('language_changed', languageChanged);\r\n }\r\n\r\n function detached() {\r\n notificationsService.unsubscribe('language_changed', languageChanged);\r\n }\r\n\r\n function languageChanged() {\r\n $location.search('query', null).replace();\r\n }\r\n\r\n function validateForm(query) {\r\n var result = {\r\n isValid: true,\r\n errors: {}\r\n };\r\n if (!query.query) {\r\n result.isValid = false;\r\n result.query = 'QueryIsRequired';\r\n }\r\n \r\n if (query.query) {\r\n if (query.query.length < 2) {\r\n result.isValid = false;\r\n result.query = 'QueryIsTooShort';\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n function search(query) {\r\n vm.validationResult = validateForm(query);\r\n if (vm.validationResult.isValid) {\r\n // Note that the search handlers are currently configured to receive only a query string\r\n vm.searchHandler({ query: query });\r\n }\r\n\r\n }\r\n}","module.exports = {\r\n bindings: { \r\n settings: '<' \r\n },\r\n controller: searchSubNavController,\r\n templateUrl: 'search/components/search-sub-nav.html'\r\n};\r\n\r\nsearchSubNavController.$inject = [\r\n '$scope', \r\n '$location', \r\n 'caseLawModal', \r\n 'language', \r\n 'searchService', \r\n 'applicationStateService', \r\n 'formatting',\r\n];\r\n\r\nfunction searchSubNavController(\r\n $scope, \r\n $location, \r\n caseLawModal, \r\n language, \r\n searchService, \r\n state, \r\n formatting\r\n) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n language: language.get(),\r\n referenceCountry: state.filter.referenceCountry,\r\n searchAlphabeticalIndex: searchAlphabeticalIndex,\r\n searchAnnotations: searchAnnotations,\r\n searchBtis: searchBtis,\r\n searchChemicals: searchChemicals,\r\n searchClassificationRegulations: searchClassificationRegulations,\r\n searchCccConclusions: searchCccConclusions,\r\n searchEuExplanatoryNotes: searchEuExplanatoryNotes,\r\n searchGermanExplanatoryNotes: searchGermanExplanatoryNotes,\r\n searchTextsGermanCustoms: searchTextsGermanCustoms,\r\n searchHeadings: searchHeadings,\r\n searchWcoClassificationOpinions: searchWcoClassificationOpinions,\r\n searchWcoExplanatoryNotes: searchWcoExplanatoryNotes,\r\n showCaseLaw: showCaseLaw,\r\n showHeadingSubNavItem: showHeadingSubNavItem,\r\n showSubHeadingSearch: showSubHeadingSearch,\r\n searchAtrs: searchAtrs,\r\n };\r\n \r\n return vm;\r\n \r\n function attached() {\r\n vm.q = searchService.parseLocationSearchObject($location.search());\r\n \r\n $scope.$on('$locationChangeSuccess', function () {\r\n vm.q = searchService.parseLocationSearchObject($location.search());\r\n });\r\n }\r\n\r\n function searchAnnotations() {\r\n $location.path('/search/annotations');\r\n }\r\n\r\n function searchEuExplanatoryNotes() {\r\n $location.path('/search/explanatory-notes/eu');\r\n }\r\n\r\n function searchGermanExplanatoryNotes() {\r\n $location.path('/search/explanatory-notes/germany');\r\n }\r\n\r\n function searchTextsGermanCustoms() {\r\n $location.path('/search/texts/germany');\r\n }\r\n\r\n function searchHeadings() {\r\n var search = $location.search();\r\n $location.search('commodityCode', '');\r\n if (search.orderBy !== 'commoditycode' && search.orderBy !== 'relevance') {\r\n $location.search('orderBy', 'relevance');\r\n }\r\n $location.path('/search/heading');\r\n }\r\n \r\n function searchWcoExplanatoryNotes() {\r\n $location.path('/search/explanatory-notes/wco');\r\n }\r\n\r\n function searchWcoClassificationOpinions() {\r\n $location.path('/search/classifications/wco/');\r\n }\r\n\r\n function searchBtis() {\r\n $location.path('/bti/search');\r\n }\r\n \r\n function searchAlphabeticalIndex() {\r\n $location.path('/search/alphabetical-index');\r\n }\r\n\r\n \r\n function searchAtrs() {\r\n $location.path('/atr/search');\r\n }\r\n\r\n function searchChemicals() {\r\n $location.path('/ecics/search');\r\n }\r\n\r\n function searchCccConclusions() {\r\n $location.path('/search/ccc-conclusions');\r\n }\r\n \r\n function searchClassificationRegulations() {\r\n $location.path('/classification-regulations/' + vm.language + '/search');\r\n }\r\n\r\n function showSubHeadingSearch() {\r\n $location.path('/search/tree').search({ \r\n commodityCode: formatting.removeTrailingZeros(vm.q.commodityCode),\r\n query: vm.q.query \r\n });\r\n }\r\n\r\n function showHeadingSubNavItem() {\r\n return vm.q.commodityCode && formatting.isHeadingCode(vm.q.commodityCode);\r\n }\r\n\r\n function showCaseLaw() {\r\n caseLawModal.show(vm.q.commodityCode, vm.q.query);\r\n }\r\n}","module.exports = [\r\n '$analytics',\r\n '$element',\r\n '$location',\r\n '$timeout',\r\n 'applicationStateService',\r\n 'searchService',\r\n 'tradeMovementService',\r\n searchBoxController];\r\n\r\nfunction searchBoxController($analytics, $element, $location, $timeout, state, searchService, tradeMovement) {\r\n\r\n var vm = {\r\n $postLink: link,\r\n filter: state.filter,\r\n search: search,\r\n searchTerm: '',\r\n setMovement: setMovement\r\n };\r\n\r\n function link() {\r\n $timeout(function(){\r\n var formEl = $element[0];\r\n var inputEl = formEl.getElementsByClassName('js-autofocus')[0];\r\n if (inputEl) {\r\n inputEl.focus();\r\n }\r\n }, 0);\r\n }\r\n\r\n function search() {\r\n var query = vm.searchTerm;\r\n var queryObject = searchService.parseQuery(query);\r\n queryObject.includeBtis = true;\r\n queryObject.includeClassificationRegulations = true;\r\n if (queryObject.movement) {\r\n setMovement(queryObject.movement);\r\n }\r\n if (queryObject.country) {\r\n state.filter.countryCode = queryObject.country;\r\n }\r\n if (queryObject.query) {\r\n queryObject.orderBy = 'relevance';\r\n $analytics.eventTrack('search-text', { value: query });\r\n }\r\n else {\r\n $analytics.eventTrack('search-code', { value: query });\r\n }\r\n var queryString = searchService.serializeQuery(queryObject);\r\n\r\n vm.searchTerm = '';\r\n if (queryObject.commodityCode && queryObject.commodityCode.length >= 4) {\r\n $location.path('search/tree').search(queryString);\r\n }\r\n else {\r\n $location.path('search/heading').search(queryString);\r\n }\r\n }\r\n\r\n function setMovement(movementType) {\r\n tradeMovement.set(movementType);\r\n }\r\n\r\n return vm;\r\n\r\n}","module.exports = ['common', 'countryDataService', 'applicationStateService', searchService];\r\n\r\nfunction searchService(common, countryDataService, state) {\r\n\r\n var service = {\r\n createQueryFromLastQuery: createQueryFromLastQuery,\r\n parseQuery: parseQuery,\r\n serializeQuery: serializeQuery,\r\n parseLocationSearchObject: parseLocationSearchObject\r\n };\r\n\r\n function parseLocationSearchObject(locationSearchObject) {\r\n var queryObject = _.clone(locationSearchObject);\r\n queryObject.includeBtis = (queryObject.includeBtis === 'true');\r\n queryObject.includeClassificationRegulations = (queryObject.includeClassificationRegulations === 'true');\r\n queryObject.includeCaseLaw = (queryObject.includeCaseLaw === 'true'); \r\n return queryObject; \r\n }\r\n\r\n function createQueryFromLastQuery(lastQuery) {\r\n return {\r\n commodityCode: lastQuery.CurrentCommodityCode,\r\n query: lastQuery.QueryString,\r\n includeBtis: lastQuery.IncludeBtis,\r\n includeCaseLaw: lastQuery.IncludeDutchCaseLaw || lastQuery.IncludeEuCaseLaw,\r\n includeClassificationRegulations: lastQuery.IncludeClassificationRegulations\r\n };\r\n }\r\n\r\n function serializeQuery(queryObject) {\r\n return _.chain(queryObject)\r\n .toPairs()\r\n .filter(function(pair) {\r\n return pair[0] !== 'rawQuery' && !!pair[1];\r\n })\r\n .map(function(pair) {\r\n return encodeURIComponent(pair[0]) + '=' + encodeURIComponent(pair[1]); \r\n })\r\n .join('&')\r\n .value();\r\n }\r\n\r\n function parseQuery(rawQueryString) {\r\n var queryObject = {};\r\n var words = [];\r\n var importMatches = ['import', 'inport', 'imp', 'invoer'];\r\n var exportMatches = ['export', 'exp', 'uitvoer'];\r\n\r\n common.auth.check();\r\n\r\n queryObject.rawQuery = rawQueryString;\r\n\r\n var numberPattern = /^\\s*(?:[0-9]{2}[\\s.]*){1,5}(?:[\\s.]?[0-9])?$/;\r\n\r\n if (rawQueryString) {\r\n words = rawQueryString.toLowerCase().split(' ');\r\n }\r\n\r\n for (let i = 0; i < importMatches.length; i++) {\r\n var foundIndex = words.indexOf(importMatches[i]);\r\n if (foundIndex > -1) {\r\n queryObject.movement = 'import';\r\n words.splice(foundIndex, 1);\r\n }\r\n }\r\n for (let i = 0; i < exportMatches.length; i++) {\r\n let foundIndex = words.indexOf(exportMatches[i]);\r\n if (foundIndex > -1) {\r\n queryObject.movement = 'export';\r\n words.splice(foundIndex, 1);\r\n }\r\n }\r\n\r\n // check to see if there are any country codes\r\n for (let i = 0; i < words.length; i++) {\r\n var foundCountryCodes = _.filter(countryDataService.ergaOmnesCountries, function (item) { \r\n return item.code.toUpperCase() === words[i].toUpperCase();\r\n });\r\n if (foundCountryCodes.length > 0) {\r\n queryObject.country = foundCountryCodes[0].code;\r\n words.splice(i, 1);\r\n break;\r\n }\r\n }\r\n // check to see if there are any country names\r\n for (let i = 0; i < words.length; i++) {\r\n var foundCountryNames = _.filter(countryDataService.ergaOmnesCountries, function (item) { \r\n return item.name.toLowerCase() === words[i].toLowerCase();\r\n });\r\n if (foundCountryNames.length > 0) {\r\n queryObject.country = foundCountryNames[0].code;\r\n words.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n var foundCode = '';\r\n for (let i = 0; i < words.length; i++) {\r\n if (numberPattern.test(words[i])) {\r\n if (isAllowedCode(words[i])) {\r\n foundCode += words[i].replaceAll('.', '');\r\n words.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n }\r\n if (foundCode === '') {\r\n queryObject.commodityCode = null;\r\n }\r\n else {\r\n if (foundCode.length > 10) {\r\n foundCode = foundCode.substring(0, 10);\r\n }\r\n queryObject.commodityCode = common.formatting.removeTrailingZeros(foundCode);\r\n }\r\n\r\n queryObject.query = words.join(' ');\r\n return queryObject;\r\n }\r\n\r\n function isAllowedCode(word) {\r\n if (word.indexOf('00') === 0 || word.indexOf('77') === 0) {\r\n return false;\r\n }\r\n if (word.indexOf('99') === 0 && state.filter.referenceCountry === 'GB') {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n return service;\r\n}","angular.module('taric.tares', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('taresMeasuresPage', require('./components/tares-measures-page'))\r\n // Services\r\n .factory('taresStatisticalKeysDataService', require('./services/tares-statistical-keys-data'))\r\n .factory('taresTariffDataService', require('./services/tares-tariff-data'))\r\n ;\r\n\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/tares-measures/:commodityCode', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n controller: taresMeasuresPageController,\r\n templateUrl: 'tares/components/tares-measures-page.html'\r\n};\r\n\r\ntaresMeasuresPageController.$inject = [\r\n '$analytics',\r\n '$location',\r\n '$routeParams', \r\n 'common',\r\n 'applicationStateService',\r\n 'countryDataService',\r\n 'countryModals',\r\n 'nomenclatureDataService',\r\n 'notificationsService', \r\n 'preferenceService',\r\n 'regionDataService',\r\n 'taresStatisticalKeysDataService',\r\n 'taresTariffDataService', \r\n];\r\n\r\nfunction taresMeasuresPageController(\r\n $analytics, \r\n $location,\r\n $routeParams,\r\n common,\r\n state,\r\n countryDataService,\r\n countryModals,\r\n nomenclatureDataService,\r\n notifications,\r\n preferences,\r\n regionDataService,\r\n taresStatisticalKeysDataService,\r\n taresTariffDataService\r\n) {\r\n \r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n ergaOmnesCountries: countryDataService.ergaOmnesCountries,\r\n onClickDescriptionLine: onClickDescriptionLine,\r\n onClickRegion: onClickRegion,\r\n onSelectCustomsReliefCode: onSelectCustomsReliefCode,\r\n onSelectStatisticalKey: onSelectStatisticalKey,\r\n countryPickerSelectionChanged: countryPickerSelectionChanged,\r\n input: {\r\n commodityCode: null,\r\n languageId: getLanguage(),\r\n statisticalKey: 0,\r\n customsReliefCode: 0\r\n },\r\n isLoading: false,\r\n state: state,\r\n tariffMasterData: null\r\n };\r\n\r\n return vm;\r\n\r\n function onSelectCustomsReliefCode(customsReliefCode) {\r\n vm.input.customsReliefCode = customsReliefCode;\r\n taresTariffDataService.filterTariffDataByCustomsReliefCode(vm.tariffMasterData, vm.input.customsReliefCode);\r\n }\r\n\r\n function onSelectStatisticalKey(key) {\r\n vm.input.statisticalKey = key;\r\n }\r\n\r\n function getLanguage() {\r\n var language = common.language.get();\r\n if (language !== 'en' && language !== 'de' && language !== 'fr' && language !== 'it') {\r\n return 'EN';\r\n }\r\n return language.toUpperCase();\r\n }\r\n\r\n function attached() {\r\n if (!$routeParams.commodityCode) {\r\n return;\r\n }\r\n // TODO: it may be better to create a component for the TARES tariff data,\r\n // so that we can re-use the same url as for the other trade tariffs\r\n if (state.filter.referenceCountry !== 'CH') {\r\n $location.path('/good/' + $routeParams.commodityCode);\r\n }\r\n $analytics.pageTrack('/tares-measures');\r\n vm.input.commodityCode = $routeParams.commodityCode;\r\n loadTariffData($routeParams.commodityCode);\r\n loadStatisticalKeys($routeParams.commodityCode);\r\n notifications.subscribe('filter_date_changed', dateChanged);\r\n notifications.subscribe('filter_movement_changed', movementChanged);\r\n notifications.subscribe('language_changed', languageChanged);\r\n\r\n // ergaOmnesCountries\r\n // countryPickerSelectionChanged(country, rememberCountry)\r\n }\r\n\r\n function countryPickerSelectionChanged(country, rememberCountry) {\r\n var countryHasChanged = state.countryHasChanged(country);\r\n state.updateCountryFilter(country, rememberCountry);\r\n if (rememberCountry && country) {\r\n preferences.saveCountryPreference(country);\r\n } else {\r\n preferences.clearCountryPreference();\r\n }\r\n if (countryHasChanged) {\r\n taresTariffDataService.filterTariffDataByCountry(vm.tariffMasterData, country ? country.code : null);\r\n }\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_date_changed', dateChanged);\r\n notifications.unsubscribe('filter_movement_changed', movementChanged);\r\n notifications.unsubscribe('language_changed', languageChanged);\r\n }\r\n\r\n function dateChanged() {\r\n loadTariffData($routeParams.commodityCode);\r\n }\r\n\r\n function movementChanged() {\r\n $location.url('/search/' + $routeParams.commodityCode);\r\n }\r\n\r\n function languageChanged() {\r\n loadTariffData($routeParams.commodityCode);\r\n }\r\n\r\n function onClickDescriptionLine(commodityCode, indentation) {\r\n state.currentCode = commodityCode;\r\n state.currentIndentation = indentation;\r\n state.navigatingFromMeasuresPage = true;\r\n $location.url('search/' + commodityCode);\r\n }\r\n\r\n function loadStatisticalKeys(commodityCode) {\r\n return taresStatisticalKeysDataService.loadStatisticalKeys(commodityCode)\r\n .then(function (statisticalKeys) {\r\n vm.statisticalKeys = statisticalKeys;\r\n })\r\n }\r\n\r\n function onClickRegion(region) {\r\n countryModals.region.show(region);\r\n }\r\n\r\n function loadTariffData(commodityCode) {\r\n vm.isLoading = true;\r\n return nomenclatureDataService.isDeclarable(commodityCode)\r\n .then(function(isDeclarable) {\r\n if (!isDeclarable) {\r\n $location.url('search/' + commodityCode);\r\n }\r\n else {\r\n common.$q.all([\r\n taresTariffDataService.loadTariffData(commodityCode)\r\n .then(function (tariffMasterData) {\r\n _.forEach(tariffMasterData.Result.CustomsReliefCodes, function (customsReliefCode) {\r\n if (customsReliefCode.ReliefCodeOnTariffLine) {\r\n vm.input.customsReliefCode = customsReliefCode.ReliefCode;\r\n }\r\n });\r\n // if (tariffMasterData.Result.CustomsReliefCodes.length === 1) {\r\n // vm.input.customsReliefCode = tariffMasterData.Result.CustomsReliefCodes[0].ReliefCode;\r\n // }\r\n taresTariffDataService.filterTariffDataByTradeMovement(tariffMasterData, vm.state.filter.movement);\r\n taresTariffDataService.filterTariffDataByCustomsReliefCode(tariffMasterData, vm.input.customsReliefCode);\r\n taresTariffDataService.filterTariffDataByCountry(tariffMasterData, vm.state.filter.countryCode);\r\n vm.tariffMasterData = tariffMasterData;\r\n return tariffMasterData;\r\n }),\r\n nomenclatureDataService.loadDescription(commodityCode)\r\n .then(function (description) {\r\n vm.description = description;\r\n return description;\r\n }),\r\n regionDataService.get()\r\n .then(function(regions) {\r\n vm.regions = _.keyBy(regions, 'code');\r\n })\r\n ]).then(function(results) {\r\n vm.isLoading = false;\r\n });\r\n }\r\n })\r\n }\r\n\r\n\r\n}\r\n","module.exports = [\r\n 'common', \r\n 'dataContext', \r\n 'applicationStateService',\r\n taresStatisticalKeysDataService\r\n];\r\n\r\nfunction taresStatisticalKeysDataService(\r\n common, \r\n dataContext,\r\n state\r\n) {\r\n var service = {\r\n loadStatisticalKeys: loadStatisticalKeys\r\n };\r\n return service;\r\n\r\n function loadStatisticalKeys(commodityCode) {\r\n var deferred = common.$q.defer();\r\n if (state.filter.referenceCountry === 'CH') {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/tares-statistical-keys' +\r\n '?goodscode=' + commodityCode +\r\n '&movement=' + state.filter.movement +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n \r\n dataContext.get(url)\r\n .then(function(data) {\r\n deferred.resolve(data);\r\n });\r\n }\r\n else {\r\n deferred.resolve([]);\r\n }\r\n return deferred.promise;\r\n }\r\n}","module.exports = [\r\n 'common', \r\n 'dataContext', \r\n 'applicationStateService',\r\n 'countryDataService',\r\n taresTariffDataService\r\n];\r\n\r\nfunction taresTariffDataService(\r\n common, \r\n dataContext,\r\n state,\r\n countryDataService\r\n) {\r\n var service = {\r\n loadTariffData: loadTariffData,\r\n filterTariffDataByCustomsReliefCode: filterTariffDataByCustomsReliefCode,\r\n filterTariffDataByCountry: filterTariffDataByCountry,\r\n filterTariffDataByTradeMovement: filterTariffDataByTradeMovement\r\n };\r\n return service;\r\n\r\n function loadTariffData(commodityCode) {\r\n var url = common.config.apiHosts[common.config.currentApi] + '/tares-measures/' + commodityCode +\r\n '?movement=' + state.filter.movement +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry;\r\n\r\n if (state.filter.date !== null) {\r\n url += '&date=' + state.filter.date;\r\n }\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function filterTariffDataByCustomsReliefCode(tariffMasterData, customsReliefCode) {\r\n tariffMasterData.Result.DutyRates = _.map(tariffMasterData.Result.DutyRates, function(dutyRate) {\r\n dutyRate.isValidForCustomsReliefCode = (dutyRate.CustomsFavourCode === customsReliefCode);\r\n return dutyRate;\r\n });\r\n }\r\n\r\n function filterTariffDataByCountry(tariffMasterData, country) {\r\n if (!tariffMasterData) {\r\n return tariffMasterData;\r\n }\r\n tariffMasterData.Result.DutyRates = _.map(tariffMasterData.Result.DutyRates, function (dutyRate) {\r\n dutyRate.isValidForCountry = dutyRateIsValidForCountry(dutyRate, country);\r\n return dutyRate;\r\n });\r\n tariffMasterData.Result.StatisticalCodes = _.map(tariffMasterData.Result.StatisticalCodes, function(statisticalCode) {\r\n statisticalCode.AdditionalTaxes = _.map(statisticalCode.AdditionalTaxes, function (measure) {\r\n measure.isValidForCountry = measureIsValidForCountry(measure, country);\r\n return measure;\r\n });\r\n statisticalCode.HasAdditionalTaxesForCountry = _.some(statisticalCode.AdditionalTaxes, function(measure) {\r\n return measure.isValidForCountry;\r\n });\r\n statisticalCode.NonCustomsLaws = _.map(statisticalCode.NonCustomsLaws, function (measure) {\r\n measure.isValidForCountry = measureIsValidForCountry(measure, country);\r\n return measure;\r\n });\r\n statisticalCode.HasNonCustomsLawsForCountry = _.some(statisticalCode.NonCustomsLaws, function(measure) {\r\n return measure.isValidForCountry;\r\n });\r\n statisticalCode.Permits = _.map(statisticalCode.Permits, function (measure) {\r\n measure.isValidForCountry = measureIsValidForCountry(measure, country);\r\n return measure;\r\n });\r\n statisticalCode.HasPermitsForCountry = _.some(statisticalCode.Permits, function(measure) {\r\n return measure.isValidForCountry;\r\n });\r\n return statisticalCode;\r\n });\r\n }\r\n\r\n function filterTariffDataByTradeMovement(tariffMasterData, tradeMovement) {\r\n if (!tariffMasterData) {\r\n return tariffMasterData;\r\n }\r\n if (tradeMovement === 'import') {\r\n tariffMasterData.Result.StatisticalCodes = _.filter(tariffMasterData.Result.StatisticalCodes, function(statisticalCode) {\r\n return statisticalCode.ValidForImport;\r\n });\r\n return tariffMasterData;\r\n }\r\n else if (tradeMovement === 'export') {\r\n tariffMasterData.Result.StatisticalCodes = _.filter(tariffMasterData.Result.StatisticalCodes, function(statisticalCode) {\r\n return statisticalCode.ValidForExport;\r\n });\r\n tariffMasterData.Result.TareSupplements = [];\r\n tariffMasterData.Result.CustomsReliefCodes = [];\r\n tariffMasterData.Result.CustomsFavourHintCodes = [];\r\n tariffMasterData.Result.DutyRates = [];\r\n tariffMasterData.Result.VatRates = [];\r\n return tariffMasterData;\r\n }\r\n return tariffMasterData;\r\n }\r\n\r\n function dutyRateIsValidForCountry(dutyRate, country) {\r\n if (!country) {\r\n return true;\r\n }\r\n if (!dutyRate.CountryGroupNumber) {\r\n return true;\r\n }\r\n return _.some(countryDataService.regions[dutyRate.CountryGroupNumber], function(countryInRegion) {\r\n return countryInRegion === country;\r\n });\r\n }\r\n\r\n function measureIsValidForCountry(measure, country) {\r\n if (!country) {\r\n return true;\r\n }\r\n var INCLUDE = 0;\r\n var EXCLUDE = 1;\r\n var countryGroupsForCountry = _.filter(measure.CountryGroupAssignment, function(countryGroup) {\r\n return _.some(countryDataService.regions[countryGroup.CountryGroupId], function(countryInRegion) {\r\n return countryInRegion === country;\r\n });\r\n });\r\n var countryIsIncluded = _.some(countryGroupsForCountry, function(countryGroup) {\r\n return countryGroup.AssignmentType == INCLUDE;\r\n });\r\n\r\n var countryIsExcluded = _.some(countryGroupsForCountry, function(countryGroup) {\r\n return countryGroup.AssignmentType == EXCLUDE;\r\n });\r\n \r\n return countryIsIncluded && !countryIsExcluded;\r\n }\r\n}","angular.module('taric.texts', [])\r\n .component('annotationButton', require('./components/annotation-button'))\r\n .component('annotation', require('./components/annotation'))\r\n .component('cccConclusion', require('./components/ccc-conclusion'))\r\n .component('explanatoryNoteButton', require('./components/explanatory-note-button'))\r\n .component('noteSource', require('./components/note-source'))\r\n .component('wcoClassificationOpinion', require('./components/wco-classification-opinion'))\r\n .factory('textDataService', require('./services/text-data'))\r\n .factory('annotationsDataService', require('./services/annotations-data'))\r\n .factory('annotationsModal', require('./modals/annotations'))\r\n .factory('explanatoryNoteModal', require('./modals/explanatory-note'))\r\n;","module.exports = {\r\n bindings: {\r\n isLarge: '<',\r\n item: '<'\r\n },\r\n controller: annotationButtonController,\r\n templateUrl: 'texts/components/annotation-button.html'\r\n};\r\n\r\nannotationButtonController.$inject = ['annotationsModal'];\r\n\r\nfunction annotationButtonController(annotationsModal) {\r\n\r\n var vm = {\r\n showAnnotation: showAnnotation\r\n };\r\n\r\n function showAnnotation() {\r\n annotationsModal.show(vm.item.section, vm.item.chapter);\r\n }\r\n\r\n\r\n return vm;\r\n\r\n}","module.exports = {\r\n bindings: {\r\n note: '<'\r\n },\r\n templateUrl: 'texts/components/annotation.html'\r\n};","module.exports = {\r\n bindings: {\r\n conclusion: '<'\r\n },\r\n templateUrl: 'texts/components/ccc-conclusion.html'\r\n};","module.exports = {\r\n bindings: {\r\n isLarge: '<',\r\n item: '<'\r\n },\r\n controller: explanatoryNoteButtonController,\r\n templateUrl: 'texts/components/explanatory-note-button.html'\r\n};\r\n\r\nexplanatoryNoteButtonController.$inject = ['common', 'explanatoryNoteModal'];\r\n\r\nfunction explanatoryNoteButtonController(common, explanatoryNoteModal) {\r\n\r\n var vm = {\r\n getCode: getCode,\r\n showExplanatoryNote: showExplanatoryNote\r\n };\r\n\r\n function getCode() {\r\n if (vm.item.type === 'section')\r\n return 'a' + common.formatting.padLeft(common.formatting.romanToNumber(vm.item.number), 2, '0');\r\n else if (vm.item.type === 'chapter' && vm.item.code)\r\n return 'h' + vm.item.code.substring(0, 2);\r\n else if (vm.item.type === 'chapter' && vm.item.number)\r\n return 'h' + common.formatting.padLeft(common.formatting.romanToNumber(vm.item.number), 2, '0');\r\n else if (vm.item.type === 'subchapter')\r\n return vm.item.code;\r\n else\r\n return vm.item.code.substring(0, 4);\r\n }\r\n\r\n function showExplanatoryNote() {\r\n explanatoryNoteModal.show(vm.getCode());\r\n }\r\n\r\n\r\n return vm;\r\n\r\n}","module.exports = {\r\n bindings: {\r\n note: '<',\r\n type: '@'\r\n },\r\n controller: noteSourceController,\r\n templateUrl: 'texts/components/note-source.html'\r\n};\r\n\r\nnoteSourceController.$inject = ['common'];\r\n\r\nfunction noteSourceController(common) {\r\n\r\n var vm = {\r\n language: common.language.get(),\r\n };\r\n\r\n return vm;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n opinion: '<'\r\n },\r\n templateUrl: 'texts/components/wco-classification-opinion.html'\r\n};","module.exports = [\r\n '$analytics', \r\n '$uibModal', \r\n annotationsModal\r\n];\r\n\r\nfunction annotationsModal(\r\n $analytics, \r\n $uibModal\r\n) {\r\n\r\n var modal = {\r\n chapter: null,\r\n section: null,\r\n show: showModal\r\n };\r\n\r\n annotationsModalController.$inject = [\r\n '$q', \r\n '$uibModalInstance', \r\n 'annotationsDataService', \r\n 'section', \r\n 'chapter',\r\n ];\r\n\r\n function annotationsModalController(\r\n $q, \r\n $uibModalInstance, \r\n annotationsDataService, \r\n section, \r\n chapter\r\n ) {\r\n \r\n var vm = {\r\n $onInit: attached,\r\n cancel: cancel,\r\n chapter: chapter,\r\n section: section\r\n };\r\n\r\n function attached() {\r\n vm.isLoading = true;\r\n var promises = [];\r\n if (chapter) {\r\n promises.push(annotationsDataService\r\n .getChapterNote(chapter)\r\n .then(function(note) {\r\n vm.chapterNote = note;\r\n }));\r\n }\r\n if (section) {\r\n promises.push(annotationsDataService\r\n .getSectionNote(section)\r\n .then(function(note) {\r\n vm.sectionNote = note;\r\n }));\r\n }\r\n return $q.all(promises)\r\n .then(function() {\r\n vm.isLoading = false;\r\n });\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(section, chapter) {\r\n $analytics.eventTrack('open-modal-legal-notes', { category: 'legal-notes' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: annotationsModalController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n chapter: function() {\r\n return chapter;\r\n },\r\n section: function() {\r\n return section;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'texts/modals/annotations.html',\r\n windowClass: 'modal-wide'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['$analytics', '$uibModal', explanatoryNoteModal];\r\n\r\nfunction explanatoryNoteModal($analytics, $uibModal) {\r\n var modal = {\r\n goodsCode: null,\r\n explanatoryNote: null,\r\n show: showModal\r\n };\r\n\r\n modalExplanatoryNoteController.$inject = [\r\n '$sce', \r\n '$uibModalInstance',\r\n 'applicationStateService', \r\n 'language', \r\n 'common', \r\n 'explanatoryNote', \r\n 'goodsCode', \r\n 'textDataService', \r\n 'nomenclatureDataService', \r\n 'identity'\r\n ];\r\n\r\n function modalExplanatoryNoteController(\r\n $sce, \r\n $uibModalInstance, \r\n state,\r\n language, \r\n common, \r\n explanatoryNote, \r\n goodsCode, \r\n textDataService, \r\n nomenclatureDataService, \r\n identity\r\n ) {\r\n var vm = {\r\n cancel: cancel,\r\n clickSectionNavItem: clickSectionNavItem,\r\n formatGermanDocumentDescription: formatGermanDocumentDescription,\r\n data: {\r\n currentNote: null,\r\n cccConclusions: [],\r\n englishClassificationsNew: [],\r\n englishClassificationsOld: [],\r\n notes: [],\r\n otherClassifications: [],\r\n sections: [],\r\n tariferingen: [],\r\n wcoClassificationOpinions: []\r\n },\r\n explanatoryNote: explanatoryNote,\r\n goodsCode: goodsCode,\r\n identity: identity,\r\n isLoading: true,\r\n language: language.get(),\r\n now: new Date(),\r\n ok: ok,\r\n translations: []\r\n };\r\n var levelOrder = ['section', 'chapter', 'subchapter', 'heading'];\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function clickSectionNavItem(item) {\r\n document.querySelector(item.selector).scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n\r\n function formatGermanDocumentDescription(description) {\r\n switch(description) {\r\n case 'AV':\r\n return 'Avise zum Harmonisierten System';\r\n case 'EE':\r\n return 'Einzelentscheidungen zur Kombinierten Nomenklatur';\r\n case 'GE - EuGH':\r\n return 'Gerichtliche Entscheidungen - EuGH';\r\n case 'GE - national':\r\n return 'Gerichtliche Entscheidungen - national';\r\n case 'HS':\r\n return 'Erläuterungen zum Harmonisierten System';\r\n case 'KN':\r\n return 'Erläuterungen zur Kombinierten Nomenklatur';\r\n case 'NEH':\r\n return 'Nationale Entscheidungen und Hinweise';\r\n default:\r\n return description;\r\n }\r\n }\r\n\r\n function formatHtml(note) {\r\n if (!note)\r\n return null;\r\n\r\n note = note.replace(/(?:\\\\[rn])+/g, \" \");\r\n while (note.indexOf('\\\\\"') > -1)\r\n note = note.replace('\\\\\"', '\"');\r\n\r\n note = $sce.trustAsHtml(note);\r\n return note.toString();\r\n }\r\n\r\n function getLevel(goodsCode) {\r\n var level;\r\n if (goodsCode[0] === 'a') {\r\n level = 'section';\r\n }\r\n else if (goodsCode[0] === 'h') {\r\n level = 'chapter';\r\n }\r\n else if (goodsCode.substring(goodsCode.length - 3) === 'sub') {\r\n level = 'subchapter';\r\n }\r\n else {\r\n level = 'heading';\r\n }\r\n return level;\r\n }\r\n\r\n function getGoodsCodeOrSectionNumber(goodsCode) {\r\n var result;\r\n if (goodsCode[0] === 'a') {\r\n result = goodsCode.substring(1);\r\n }\r\n else if (goodsCode[0] === 'h') {\r\n result = goodsCode.substring(1);\r\n }\r\n else if (goodsCode.substring(goodsCode.length - 3) === 'sub') {\r\n result = goodsCode.substring(0, goodsCode.length - 4);\r\n }\r\n else {\r\n result = goodsCode.substring(0, 4);\r\n }\r\n return result;\r\n }\r\n\r\n function loadWcoExplanatoryNotes(level, goodsCodeOrSectionNumber) {\r\n var deferred = common.$q.defer();\r\n if (identity.hasPermission('toelichtingen_wco')) {\r\n textDataService.getWcoExplanatoryNotes(level, goodsCodeOrSectionNumber)\r\n .then(function(notes) {\r\n _.forEach(notes, function(note) {\r\n addExplanatoryNote(note, 'wco');\r\n });\r\n deferred.resolve();\r\n });\r\n }\r\n else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n function loadEuExplanatoryNotes(level, goodsCodeOrSectionNumber) {\r\n var deferred = common.$q.defer();\r\n if (identity.hasPermission('toelichtingen_eu')) {\r\n textDataService.getEuExplanatoryNotes(level, goodsCodeOrSectionNumber)\r\n .then(function(notes) {\r\n _.forEach(notes, function(note) {\r\n addExplanatoryNote(note, 'eu');\r\n });\r\n deferred.resolve();\r\n });\r\n }\r\n else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n function loadGermanExplanatoryNotes(level, goodsCodeOrSectionNumber) {\r\n return textDataService.getGermanExplanatoryNotes(level, goodsCodeOrSectionNumber)\r\n .then(function(result) {\r\n vm.germanExplanatoryNotes = result;\r\n });\r\n }\r\n\r\n function init() {\r\n if (!vm.goodsCode)\r\n return;\r\n\r\n var level = getLevel(vm.goodsCode);\r\n var goodsCodeOrSectionNumber = getGoodsCodeOrSectionNumber(vm.goodsCode);\r\n\r\n var promises = [\r\n loadWcoExplanatoryNotes(level, goodsCodeOrSectionNumber),\r\n loadEuExplanatoryNotes(level, goodsCodeOrSectionNumber),\r\n ];\r\n\r\n if (state.filter.referenceCountry === 'DE') {\r\n promises.push(loadGermanExplanatoryNotes(level, goodsCodeOrSectionNumber));\r\n }\r\n\r\n\r\n common.$q.all(promises).then(function() {\r\n vm.isLoading = false;\r\n });\r\n\r\n // if (identity.hasPermission('toelichtingen_wco')) {\r\n // textDataService.getWcoExplanatoryNotes(level, goodsCodeOrSectionNumber)\r\n // .then(function(notes) {\r\n // _.forEach(notes, function(note) {\r\n // addExplanatoryNote(note, 'wco');\r\n // });\r\n // });\r\n // }\r\n // if (identity.hasPermission('toelichtingen_eu')) {\r\n // textDataService.getEuExplanatoryNotes(level, goodsCodeOrSectionNumber)\r\n // .then(function(notes) {\r\n // _.forEach(notes, function(note) {\r\n // addExplanatoryNote(note, 'eu');\r\n\r\n // });\r\n // });\r\n // }\r\n\r\n if (level == 'heading') {\r\n\r\n if (common.language.get() === 'nl') {\r\n // nieuwe tariferingen uit database\r\n textDataService.getTariferingen(vm.goodsCode)\r\n .then(function (tariferingen) {\r\n vm.data.tariferingen = tariferingen;\r\n if (tariferingen.length > 0) {\r\n vm.data.sections.push({\r\n title: 'nomenclature.Classifications',\r\n selector: '.tariferingen',\r\n index: 3\r\n });\r\n }\r\n });\r\n\r\n // overige indelingsverordeningen\r\n textDataService.getClassificationOther(goodsCode)\r\n .then(function (classifications) {\r\n if (classifications.length > 0) {\r\n vm.data.sections.push({\r\n title: 'classificationRegulation.ClassificationRegulations',\r\n selector: '.classification-regulations',\r\n index: 4\r\n });\r\n }\r\n vm.data.otherClassifications = classifications;\r\n });\r\n }\r\n else {\r\n\r\n textDataService.getOldEnglishClassifications(goodsCode)\r\n .then(function (data) {\r\n if (data.length > 0) {\r\n vm.data.sections.push({\r\n title: 'Classification Regulations (before 1-1-2014)',\r\n selector: '.classification-regulations-old h1',\r\n index: 3\r\n });\r\n }\r\n vm.data.englishClassificationsOld = data;\r\n });\r\n\r\n textDataService.getNewEnglishClassifications(goodsCode)\r\n .then(function (data) {\r\n if (data.length > 0) {\r\n vm.data.sections.push({\r\n title: 'Classification Regulations (from 1-1-2014)',\r\n selector: '.classification-regulations-new h1',\r\n index: 4\r\n });\r\n }\r\n vm.data.englishClassificationsNew = data;\r\n });\r\n\r\n textDataService.getCccConclusions(goodsCode)\r\n .then(function (data) {\r\n if (data.length > 0) {\r\n vm.data.sections.push({\r\n title: 'conclusion.CccConclusions',\r\n selector: '.ccc-conclusions',\r\n index: 8\r\n });\r\n }\r\n vm.data.cccConclusions = data;\r\n });\r\n }\r\n }\r\n if (identity.hasPermission('toelichtingen_wco')) {\r\n textDataService.getWcoClassificationOpinions(goodsCode)\r\n .then(function (result) {\r\n if (result.Opinions.length > 0) {\r\n vm.data.sections.push({\r\n title: 'nomenclature.WcoClassificationOpinions',\r\n selector: '.wco-classification-opinions',\r\n index: 7\r\n });\r\n }\r\n vm.data.wcoClassificationOpinions = result;\r\n });\r\n }\r\n }\r\n\r\n function makeSectionTitle(subfolder) {\r\n subfolder = subfolder.toLowerCase();\r\n switch (subfolder) {\r\n case 'wco':\r\n return 'nomenclature.ExplanatoryNotesHs';\r\n case 'eu':\r\n return 'nomenclature.ExplanatoryNotesCn';\r\n default:\r\n return 'nomenclature.ExplanatoryNotes' + ' ' + subfolder;\r\n }\r\n }\r\n\r\n function ok() {\r\n $uibModalInstance.close(true);\r\n }\r\n\r\n function makeTitle(nomenclatureLevel, goodsCodeOrSectionNumber, number) {\r\n switch(nomenclatureLevel) {\r\n case 'section':\r\n return 'nomenclature.Section_GoodsCodeOrSectionNumber_';\r\n case 'chapter':\r\n return 'nomenclature.Chapter_GoodsCodeOrSectionNumber_';\r\n case 'subchapter':\r\n return 'nomenclature.SubChapter_GoodsCodeOrSectionNumber_';\r\n case 'heading':\r\n default:\r\n return 'nomenclature.Heading_GoodsCodeOrSectionNumber_';\r\n }\r\n }\r\n\r\n function getSubchapterNumber(note) {\r\n var deferred = common.$q.defer();\r\n if (note.NomenclatureLevel === 'SUBCHAPTER') {\r\n var chapterNumber = note.GoodsCodeOrSectionNumber.substring(0, 2);\r\n nomenclatureDataService\r\n .getSubchapterNumber(chapterNumber, note.GoodsCodeOrSectionNumber)\r\n .then(function(number) {\r\n deferred.resolve(number);\r\n });\r\n }\r\n else {\r\n deferred.resolve(null);\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n function addExplanatoryNote(note, subfolder) {\r\n if (!note) {\r\n return;\r\n }\r\n\r\n getSubchapterNumber(note)\r\n .then(function(subchapterNumber) {\r\n var level = note.NomenclatureLevel.toLowerCase();\r\n\r\n var sectionTitle = makeSectionTitle(subfolder);\r\n var title = makeTitle(level, note.GoodsCodeOrSectionNumber, subchapterNumber);\r\n var number = (level === 'subchapter' ? subchapterNumber : note.GoodsCodeOrSectionNumber);\r\n\r\n var extraData = {\r\n subfolder: subfolder,\r\n sectionTitle: sectionTitle,\r\n title: title,\r\n level: level,\r\n goodsCode: number,\r\n NoteHtml: formatHtml(note.NoteHtml)\r\n }\r\n var noteWithExtraData = _.assign(\r\n {}, note, extraData\r\n );\r\n vm.data.notes.push(noteWithExtraData);\r\n\r\n var subsection = {\r\n title: title,\r\n subfolder: subfolder,\r\n goodsCode: number,\r\n level: level,\r\n selector: \".\" + subfolder + \"-note-\" + number,\r\n index: levelOrder.indexOf(level)\r\n };\r\n var section = _.find(vm.data.sections, function (section) {\r\n return section.title === sectionTitle;\r\n });\r\n if (section === undefined) {\r\n section = {\r\n title: sectionTitle,\r\n subfolder: subfolder,\r\n level: level,\r\n selector: \".\" + subfolder + \"-note\",\r\n index: subfolder.toLowerCase() === 'wco' ? 1 : 2,\r\n subsections: []\r\n };\r\n vm.data.sections.push(section);\r\n }\r\n section.subsections.push(subsection);\r\n\r\n if (vm.data.notes.length > 1) {\r\n vm.data.notes = _.sortBy(vm.data.notes, sortNotes);\r\n vm.data.sections = _.sortBy(vm.data.sections, sortNotes);\r\n }\r\n });\r\n }\r\n\r\n function sortNotes(note) {\r\n var mainOrderList = [\"wco\", \"eu\"]; // WCO notes first\r\n var subOrderList = ['section', 'chapter', 'subchapter', 'heading'];\r\n var mainOrder = note.subfolder ? mainOrderList.indexOf(note.subfolder.toLowerCase()) : 1000;\r\n if (mainOrder === -1) {\r\n mainOrder = 1000; // if note.subfolder is not found in the list above, put those notes at the end\r\n }\r\n var subOrder = subOrderList.indexOf(note.level);\r\n return mainOrder * 100 + subOrder;\r\n }\r\n\r\n init();\r\n\r\n return vm;\r\n }\r\n\r\n function showModal(goodsCode, explanatoryNote) {\r\n $analytics.eventTrack('open-modal-explanatory-notes', { category: 'explanatory-notes' });\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: modalExplanatoryNoteController,\r\n controllerAs: 'ctrl',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n explanatoryNote: function () {\r\n return explanatoryNote;\r\n },\r\n goodsCode: function () {\r\n return goodsCode;\r\n }\r\n },\r\n size: 'lg',\r\n templateUrl: 'texts/modals/explanatory-note.html',\r\n windowClass: 'modal-explanatory-note'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['common', 'dataContext', 'nomenclatureDataService', 'applicationStateService', annotationsService];\r\n\r\nfunction annotationsService(common, context, nomenclatureDataService, state) {\r\n var service = {\r\n getChapterNote: getChapterNote,\r\n getSectionNote: getSectionNote,\r\n searchNotes: searchNotes,\r\n };\r\n\r\n function getChapterNote(chapterNumber) {\r\n var url = common.config.apiHosts.generic + '/annotations/chapter/' + chapterNumber +\r\n '?lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n function getSectionNote(sectionNumber) {\r\n\r\n if (state.filter.referenceCountry === \"GB\") {\r\n return nomenclatureDataService\r\n .getSections()\r\n .then(function(sectionsData) {\r\n var section = _.find(sectionsData.data, function (section) {\r\n return section.number === sectionNumber;\r\n });\r\n return {\r\n NoteHtml: section.uk_section_note\r\n };\r\n })\r\n }\r\n\r\n var url = common.config.apiHosts.generic + '/annotations/section/' + sectionNumber +\r\n '?lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n function searchNotes(query) {\r\n var url = common.config.apiHosts.generic + '/annotations/search' +\r\n '?q=' + query +\r\n '&lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n\r\n return context.get(url);\r\n }\r\n\r\n return service;\r\n}","module.exports = ['common', 'dataContext', 'applicationStateService', 'identity', textDataService];\r\n\r\nfunction textDataService(common, context, state, identity) {\r\n\r\n var service = {\r\n getCccConclusions: getCccConclusions,\r\n getClassificationOther: getClassificationOther,\r\n getSectionsAndChaptersWithExplanatoryNotes: getSectionsAndChaptersWithExplanatoryNotes,\r\n getSubChaptersAndHeadingsWithExplanatoryNotes: getSubChaptersAndHeadingsWithExplanatoryNotes,\r\n getEuExplanatoryNotes: getEuExplanatoryNotes,\r\n getGermanExplanatoryNotes: getGermanExplanatoryNotes,\r\n getWcoExplanatoryNotes: getWcoExplanatoryNotes,\r\n getNewEnglishClassifications: getNewEnglishClassifications,\r\n getOldEnglishClassifications: getOldEnglishClassifications,\r\n getTariferingen: getTariferingen,\r\n getWcoClassificationOpinions: getWcoClassificationOpinions,\r\n };\r\n\r\n function formUrl(api, url) {\r\n var separator = url.indexOf('?') === -1 ? '?' : '&';\r\n return common.config.apiHosts[api] + url + separator +\r\n 'lang=' + common.language.get() +\r\n '&referencecountry=' + state.filter.referenceCountry +\r\n '&date=' + state.filter.date;\r\n }\r\n\r\n function getClassificationOther(code) {\r\n var deferred = common.$q.defer();\r\n\r\n var req = context.get(formUrl('generic', '/classifications/other/' + code))\r\n .then(deferred.resolve, deferred.reject);\r\n\r\n return deferred.promise;\r\n }\r\n\r\n // TODO: if we cache these, add more metadata (see nomenclature-data.js)\r\n var itemsWithExplanatoryNotes = {\r\n sectionsAndChapters: null,\r\n subchaptersAndHeadings: {}\r\n };\r\n\r\n function getWcoExplanatoryNotes(nomenclatureLevel, goodsCodeOrSectionNumber) {\r\n nomenclatureLevel = nomenclatureLevel.toUpperCase();\r\n var url = formUrl('generic', '/wco-explanatory-notes-for-goodscode/' + nomenclatureLevel + '/' + goodsCodeOrSectionNumber);\r\n return context.get(url);\r\n }\r\n\r\n function getEuExplanatoryNotes(nomenclatureLevel, goodsCodeOrSectionNumber) {\r\n nomenclatureLevel = nomenclatureLevel.toUpperCase();\r\n var url = formUrl('generic', '/eu-explanatory-notes-for-goodscode/' + nomenclatureLevel + '/' + goodsCodeOrSectionNumber);\r\n return context.get(url);\r\n }\r\n\r\n function getGermanExplanatoryNotes(nomenclatureLevel, goodsCodeOrSectionNumber) {\r\n nomenclatureLevel = nomenclatureLevel.toUpperCase();\r\n var url = formUrl('dtv', '/ezt/explanatory-notes/' + nomenclatureLevel + '/' + goodsCodeOrSectionNumber);\r\n return context.get(url);\r\n }\r\n\r\n function getSectionsAndChaptersWithExplanatoryNotes() {\r\n var deferred = common.$q.defer();\r\n if (itemsWithExplanatoryNotes.sectionsAndChapters) {\r\n deferred.resolve(itemsWithExplanatoryNotes.sectionsAndChapters);\r\n }\r\n else {\r\n var url = formUrl('generic', '/explanatory-notes/sections-and-chapters-with-notes/');\r\n context.get(url).then(function(response) {\r\n itemsWithExplanatoryNotes.sectionsAndChapters = response;\r\n deferred.resolve(response);\r\n });\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n function getSubChaptersAndHeadingsWithExplanatoryNotes(chapterId) {\r\n var deferred = common.$q.defer();\r\n if (itemsWithExplanatoryNotes.subchaptersAndHeadings[chapterId]) {\r\n deferred.resolve(itemsWithExplanatoryNotes.subchaptersAndHeadings[chapterId]);\r\n }\r\n else {\r\n var url = formUrl('generic', '/explanatory-notes/subchapters-and-headings-with-notes/' + chapterId);\r\n context.get(url).then(function(response) {\r\n itemsWithExplanatoryNotes.subchaptersAndHeadings[chapterId] = response;\r\n deferred.resolve(response);\r\n });\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n function getTariferingen(code) {\r\n var deferred = common.$q.defer();\r\n\r\n var req = context.get(formUrl('generic', '/classifications/tariferingen/' + code))\r\n .then(deferred.resolve, deferred.reject);\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function getNewEnglishClassifications(code) {\r\n var url = formUrl('generic', '/classifications/en-after-2013/' + code);\r\n return context.get(url);\r\n }\r\n\r\n function getOldEnglishClassifications(code) {\r\n var url = formUrl('generic', '/classifications/en-before-2014/' + code);\r\n return context.get(url);\r\n }\r\n\r\n function getWcoClassificationOpinions(code) {\r\n var deferred = common.$q.defer();\r\n if (!identity.hasPermission('toelichtingen_wco')) {\r\n deferred.reject();\r\n }\r\n else {\r\n context.get(formUrl('generic', '/classifications/wco/' + code))\r\n .then(deferred.resolve, deferred.reject);\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n function getCccConclusions(commodityCode, query) {\r\n var url = common.config.apiHosts.generic + '/ccc-conclusions/search?lang=en';\r\n if(commodityCode) {\r\n url = url + '&goodscode=' + commodityCode;\r\n }\r\n if(query) {\r\n url = url + '&q=' + query;\r\n }\r\n return context.get(url)\r\n }\r\n\r\n return service;\r\n\r\n}","angular.module('taric.tradeMovement', [])\r\n .factory('tradeMovementService', require('./services/trade-movement'))\r\n;","module.exports = ['applicationStateService', 'notificationsService', 'preferenceService', tradeMovementService];\r\n\r\nfunction tradeMovementService(state, notifications, preferences) {\r\n \r\n var service = {\r\n set: setTradeMovement\r\n };\r\n \r\n return service;\r\n\r\n function setTradeMovement(tradeMovement) {\r\n if ((tradeMovement !== 'import' && tradeMovement !== 'export') || tradeMovement === state.filter.movement) {\r\n return;\r\n }\r\n state.filter.movement = tradeMovement;\r\n notifications.publish('filter_movement_changed', tradeMovement);\r\n preferences.replace({\r\n name: 'movement',\r\n category: 'user_preferences',\r\n value: tradeMovement,\r\n valueType: 'stringValue'\r\n });\r\n}\r\n}","angular.module('taric.tradeStatistics', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n .component('tradeStatisticsTable', require('./components/trade-statistics-table'))\r\n .component('tradeStatisticsPage', require('./components/trade-statistics-page'))\r\n .factory('tradeStatisticsDataService', require('./services/trade-statistics-data'));\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/trade-statistics', {\r\n template: ''\r\n })\r\n ;\r\n}\r\n","module.exports = {\r\n controller: tradeStatisticsController,\r\n templateUrl: 'trade-statistics/components/trade-statistics-page.html'\r\n};\r\n\r\n\r\ntradeStatisticsController.$inject = [\r\n '$analytics', \r\n 'common', \r\n 'countryDataService',\r\n 'notificationsService',\r\n 'applicationStateService', \r\n 'tradeStatisticsDataService', \r\n];\r\n\r\nfunction tradeStatisticsController(\r\n $analytics, \r\n common, \r\n countryDataService,\r\n notifications,\r\n state,\r\n tradeStatisticsDataService\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n isLoading: false,\r\n availableYears: ['2020'],\r\n countryNames: {},\r\n partnerCountries: [],\r\n reportingCountries: [],\r\n query: {\r\n commodityCode: null,\r\n partnerCountry: null,\r\n reportingCountry: null,\r\n year: '2020'\r\n },\r\n sorting: {\r\n columnName: 'country',\r\n sortOrder: 'asc'\r\n },\r\n euAverageResult: null,\r\n result: null,\r\n tradeMovement: state.filter.movement,\r\n loadData: loadData,\r\n reportingCountryChanged: reportingCountryChanged,\r\n partnerCountryChanged: partnerCountryChanged,\r\n yearChanged: yearChanged\r\n };\r\n\r\n function attached() {\r\n $analytics.pageTrack('/trade-statistics');\r\n loadAvailableYears()\r\n .then(function() {\r\n return common.$q.all([\r\n loadData(),\r\n countryDataService.getEuCountries({ referenceCountry: 'EU' })\r\n .then(function(countries) {\r\n vm.reportingCountries = _.filter(countries, function (country) {\r\n return country.code !== 'XI';\r\n });\r\n // TODO: include GB (?)\r\n // TODO: include XI (?)\r\n }),\r\n countryDataService.getCountries({ referenceCountry: 'EU' })\r\n .then(function (countries) {\r\n vm.partnerCountries = _.filter(countries, function (country) {\r\n return country.code !== 'XI';\r\n });\r\n // TODO: include GB (?)\r\n // TODO: include XI (?)\r\n \r\n })\r\n ])\r\n })\r\n .then(function() {\r\n var reportingCountryNames = _.chain(vm.reportingCountries).keyBy('code').mapValues('name').value();\r\n var partnerCountryNames = _.chain(vm.partnerCountries).keyBy('code').mapValues('name').value();\r\n vm.countryNames = _.merge(vm.countryNames, reportingCountryNames, partnerCountryNames);\r\n vm.countryNames['RS'] = vm.countryNames['XS'];\r\n sortResultsBy(vm.sorting.columnName, vm.sorting.sortOrder);\r\n });\r\n notifications.subscribe('filter_movement_changed', movementChanged);\r\n }\r\n\r\n function detached() {\r\n notifications.unsubscribe('filter_movement_changed', movementChanged);\r\n }\r\n\r\n function loadAvailableYears() {\r\n return tradeStatisticsDataService.getAvailableYears()\r\n .then(function (years) {\r\n vm.availableYears = years;\r\n vm.query.year = years[0]; \r\n });\r\n }\r\n\r\n function movementChanged(tradeMovement) {\r\n vm.tradeMovement = tradeMovement;\r\n }\r\n\r\n function sortResultsBy(columnName, sortOrder) {\r\n var year = vm.result.years[0];\r\n if (columnName === 'country') {\r\n vm.result.rows = _.orderBy(vm.result.rows, function (row) {\r\n return vm.countryNames[row.country_id];\r\n }, [ sortOrder ]);\r\n }\r\n vm.result.rows = _.orderBy(vm.result.rows, function(row) {\r\n return row.samples[year][columnName];\r\n }, [ sortOrder ]);\r\n }\r\n\r\n function reportingCountryChanged(country) {\r\n var previousCountry = vm.query.reportingCountry;\r\n if (country) {\r\n vm.query.reportingCountry = country.code;\r\n }\r\n else {\r\n vm.query.reportingCountry = null;\r\n }\r\n if (vm.query.reportingCountry !== previousCountry) {\r\n loadData();\r\n }\r\n }\r\n\r\n function partnerCountryChanged(country) {\r\n var previousCountry = vm.query.partnerCountry;\r\n if (country) {\r\n vm.query.partnerCountry = country.code;\r\n }\r\n else {\r\n vm.query.partnerCountry = null;\r\n }\r\n if (vm.query.partnerCountry !== previousCountry) {\r\n loadData();\r\n }\r\n }\r\n\r\n function yearChanged() {\r\n loadData();\r\n }\r\n\r\n function loadData() {\r\n vm.isLoading = true;\r\n if (vm.query.partnerCountry) {\r\n // Load both the detailed statistics (as below) and the EU average\r\n return common.$q.all([tradeStatisticsDataService.getTradeStatistics(vm.query), tradeStatisticsDataService.getEuAverageTradeStatistics(vm.query)])\r\n .then(function(results) {\r\n vm.result = results[0];\r\n vm.euAverageResult = results[1];\r\n vm.isLoading = false;\r\n }, function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n else {\r\n return tradeStatisticsDataService.getTradeStatistics(vm.query)\r\n .then(function (result) {\r\n vm.result = result;\r\n sortResultsBy(vm.sorting.columnName, vm.sorting.sortOrder);\r\n vm.isLoading = false;\r\n }, function () {\r\n vm.isLoading = false;\r\n });\r\n }\r\n }\r\n return vm;\r\n}\r\n","module.exports = {\r\n bindings: {\r\n countryNames: '<',\r\n firstColumnLabel: '<',\r\n result: '<',\r\n tradeMovement: '<'\r\n },\r\n bindToController: true,\r\n controller: tradeStatisticsTableController,\r\n templateUrl: 'trade-statistics/components/trade-statistics-table.html'\r\n};\r\n\r\ntradeStatisticsTableController.$inject = [];\r\n\r\nfunction tradeStatisticsTableController() {\r\n\r\n var vm = {\r\n onClickSortBy: onClickSortBy,\r\n sorting: {\r\n columnName: 'country',\r\n sortOrder: 'asc'\r\n }\r\n };\r\n\r\n return vm;\r\n\r\n function onClickSortBy(columnName) {\r\n var sortOrder;\r\n if (vm.result) {\r\n if (columnName === vm.sorting.columnName) {\r\n sortOrder = vm.sorting.sortOrder === 'asc' ? 'desc' : 'asc';\r\n }\r\n else if (columnName === 'import_value' || columnName === 'import_weight' || columnName === 'export_value' || columnName === 'export_weight') {\r\n sortOrder = 'desc';\r\n }\r\n else {\r\n sortOrder = 'asc';\r\n }\r\n vm.sorting.columnName = columnName;\r\n vm.sorting.sortOrder = sortOrder;\r\n sortResultsBy(columnName, sortOrder)\r\n }\r\n }\r\n\r\n function sortResultsBy(columnName, sortOrder) {\r\n var year = vm.result.years[0];\r\n if (columnName === 'country') {\r\n vm.result.rows = _.orderBy(vm.result.rows, function (row) {\r\n return vm.countryNames[row.country_id];\r\n }, [ sortOrder ]);\r\n }\r\n vm.result.rows = _.orderBy(vm.result.rows, function(row) {\r\n return row.samples[year][columnName];\r\n }, [ sortOrder ]);\r\n }\r\n\r\n}","module.exports = ['$filter', 'common', 'dataContext', 'serializationService', regulationsDataService];\r\n\r\nfunction regulationsDataService($filter, common, dataContext, serializationService) {\r\n var service = {\r\n checkCustomsValue: checkCustomsValue,\r\n getAvailableYears: getAvailableYears,\r\n getTradeStatistics: getTradeStatistics,\r\n getEuAverageTradeStatistics: getEuAverageTradeStatistics\r\n };\r\n\r\n return service;\r\n\r\n function getAvailableYears() {\r\n var url = common.config.apiHosts.generic +\r\n '/trade-statistics/available-years';\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function getEuAverageTradeStatistics(tradeStatisticsQuery) {\r\n var url = common.config.apiHosts.generic +\r\n '/trade-statistics/eu-average' +\r\n '?lang=' + common.language.get();\r\n if (tradeStatisticsQuery.partnerCountry) {\r\n url += '&country=' + tradeStatisticsQuery.partnerCountry;\r\n }\r\n if (tradeStatisticsQuery.commodityCode) {\r\n url += '&goodscode=' + tradeStatisticsQuery.commodityCode;\r\n }\r\n if (tradeStatisticsQuery.year) {\r\n url += '&year=' + tradeStatisticsQuery.year;\r\n }\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function getTradeStatistics(tradeStatisticsQuery) {\r\n var url = common.config.apiHosts.generic +\r\n '/trade-statistics' +\r\n '?lang=' + common.language.get();\r\n if (tradeStatisticsQuery.reportingCountry) {\r\n url += '&referencecountry=' + tradeStatisticsQuery.reportingCountry;\r\n }\r\n if (tradeStatisticsQuery.partnerCountry) {\r\n url += '&country=' + tradeStatisticsQuery.partnerCountry;\r\n }\r\n if (tradeStatisticsQuery.commodityCode) {\r\n url += '&goodscode=' + tradeStatisticsQuery.commodityCode;\r\n }\r\n if (tradeStatisticsQuery.year) {\r\n url += '&year=' + tradeStatisticsQuery.year;\r\n }\r\n\r\n return dataContext.get(url);\r\n }\r\n\r\n function checkCustomsValue(checkCustomsValueQuery) {\r\n var url = common.config.apiHosts.generic +\r\n '/trade-statistics/customs-value-check' +\r\n '?lang=' + common.language.get() +\r\n '&referencecountry=' + checkCustomsValueQuery.reportingCountry +\r\n '&country=' + checkCustomsValueQuery.partnerCountry +\r\n '&goodscode=' + checkCustomsValueQuery.commodityCode +\r\n '&customsvalue=' + serializationService.serializeCustomsValue(checkCustomsValueQuery.customsValue) +\r\n '&quantities=' + serializationService.serializeQuantities(checkCustomsValueQuery.quantities) +\r\n '&date=' + checkCustomsValueQuery.date;\r\n\r\n return dataContext\r\n .get(url)\r\n .then(function (result) {\r\n result.CurrentCustomsValuePerUnitOfWeightFormatted = \r\n createFormattedValuePerUnitOfWeight(result.CustomsValuePerUnitOfWeight);\r\n\r\n if (result.AverageCustomsValuePerUnitOfWeight) {\r\n result.AverageCustomsValuePerUnitOfWeightFormatted = \r\n createFormattedValuePerUnitOfWeight(result.AverageCustomsValuePerUnitOfWeight);\r\n }\r\n\r\n result.Percentage = $filter('number')(result.ValueComparedToAverage * 100, 2) + '%';\r\n return result;\r\n });\r\n }\r\n\r\n function createFormattedValuePerUnitOfWeight(valuePerUnit) {\r\n return $filter('number')(valuePerUnit.Value.Amount, 2) + ' ' +\r\n $filter('toCurrencySign')(valuePerUnit.Value.MonetaryUnit.code) + ' / ' +\r\n (valuePerUnit.Unit.MeasurementUnit.code === 'KGM' ? 'kg' : valuePerUnit.Unit.MeasurementUnit.code)\r\n }\r\n}\r\n","module.exports = {\r\n account: require('./account'),\r\n bti: require('./bti'),\r\n atr: require('./atr'),\r\n caseLaw: require('./case-law'),\r\n classificationRegulation: require('./classification-regulation'),\r\n compliance: require('./compliance'),\r\n conclusion: require('./conclusion'), \r\n correlationTable: require('./correlation-table'),\r\n customsValue: require('./customs-value'),\r\n customsValueCheck: require('./customs-value-check'),\r\n dashboard: require('./dashboard'),\r\n documentation: require('./documentation'),\r\n exchangeRates: require('./exchange-rates'),\r\n ezt: require('./ezt'),\r\n formLabels: require('./form-labels'),\r\n ecics: require('./ecics'),\r\n goods: require('./goods'),\r\n mainMenu: require('./main-menu'),\r\n news: require('./news'),\r\n nomenclature: require('./nomenclature'),\r\n quota: require('./quota'),\r\n referenceprices: require('./referenceprices'),\r\n regulation: require('./regulation'),\r\n search: require('./search'),\r\n shared: {\r\n messages: require('./shared-messages'),\r\n ui: require('./shared-ui'),\r\n },\r\n sortOptions: require('./sort-options'),\r\n status: require('./status'),\r\n tares: require('./tares'),\r\n taric: require('./taric'),\r\n tradeStatistics: require('./trade-statistics'),\r\n validateBusinessInfo: require('./validate-business-info'),\r\n validationErrors: require('./validation-errors'),\r\n};\r\n","// See https://app.taricsupport.com/#!/account/change-password\r\n// See https://app.taricsupport.com/#!/account/login\r\n// See https://app.taricsupport.com/#!/account/forgot-password\r\nmodule.exports = {\r\n changePassword: {\r\n changePassword: 'Change password',\r\n currentPassword: 'Current password',\r\n errorCurrentPassword: 'The current password was not filled in',\r\n errorNewPasswordEmpty: 'The new password was not filled in',\r\n errorNewPasswordCompare: 'The new passwords do not match',\r\n newPassword1: 'New password',\r\n newPassword2: 'Confirm new password',\r\n passwordChangedSuccessfully: 'Password changed successfully.',\r\n errorChangingPassword: 'Error changing password. Please try again later.'\r\n },\r\n forgotPassword: {\r\n backToLogin: 'Back to the log in page',\r\n doneMessage: 'We\\'ve sent an email with instructions to the email address connected to your account. It should arrive within the next few minutes.',\r\n explanation: 'Please fill in your your username and we will send you an email with instructions on how to create a new password for your account',\r\n forgotPassword: 'Forgot your password?',\r\n resetPassword: 'Reset password'\r\n },\r\n login: {\r\n error: 'Username or password incorrect',\r\n logIn: 'Log in',\r\n password: 'Password',\r\n rememberMe: 'Keep me logged in',\r\n username: 'Username'\r\n },\r\n logout: {\r\n signedOut: 'You have been logged off',\r\n signingOut: 'You are being logged off...',\r\n title: 'Log out'\r\n },\r\n resetPassword: {\r\n backToLogin: 'Back to the login page',\r\n doneMessage: 'You have succesfully created a new password. You can use it to log in to your Taric Support account.',\r\n errors: {\r\n 'PASSWORD_INVALID_TOKEN': 'Your password reset request is not valid anymore',\r\n 'PASSWORD_ISCURRENT': 'The password you\\'ve entered as \\'Current password\\' is not your current password',\r\n 'PASSWORD_MINIMUM_LENGTH': 'The password should be at least 8 characters long',\r\n 'PASSWORD_NO_LOWERCASE': 'The password doesn\\'t have any lowercase characters',\r\n 'PASSWORD_NO_NONALPHA': 'The password doesn\\'t have any non-alphanumeric characters',\r\n 'PASSWORD_NO_NUMBERS': 'The password doesn\\'t have any numbers',\r\n 'PASSWORD_NO_UPPERCASE': 'The password doesn\\'t have any uppercase characters',\r\n 'PASSWORD_EMPTY': 'Please fill in a new password',\r\n 'PASSWORDS_NOTEQUAL': 'The passwords you\\'ve entered are not the same'\r\n },\r\n explanation: 'You are about to create a new password for your account. Please fill in the form below to continue. Your new password should be at least 8 characters long and should contain a combination of lowercase, uppercase and non-alphanumeric characters',\r\n invalidToken: 'Your link to create a new password has expired. Please request another link by filling out the \\'forgot password\\' form',\r\n password1: 'New password',\r\n password2: 'Repeat the new password',\r\n resetPassword: 'Create a new password',\r\n strength: {\r\n 'characters': '8 characters',\r\n 'lowercase': 'At least one lowercase character',\r\n 'nonalpha': 'At least one non-alphanumeric character',\r\n 'number': 'At least one number',\r\n 'oneOfFour': 'Match 3 of the following 4 conditions:',\r\n 'uppercase': 'At least one uppercase character',\r\n }\r\n }\r\n};","// See https://app.taricsupport.com/#!/atr/home\r\n// See https://www.tax.service.gov.uk/search-for-advance-tariff-rulings/search?enableTrackingConsent=true\r\nmodule.exports = {\r\n AdvanceTariffRulings: 'Advance Tariff Rulings',\r\n ATRs: 'ATRs',\r\n AtrReference: 'ATR Reference',\r\n attachments: 'Attachments',\r\n commodityDescription: 'Commodity description',\r\n copyDescription: 'This information is a copy of the information in the UK ATR database.',\r\n details: 'ATR Details',\r\n atrLinkText: 'Click here to see the up-to-date version in this database.',\r\n goodsDescription: 'Goods Description',\r\n issuedSince: 'Issued Since',\r\n Keywords: 'Keywords',\r\n motivation: 'Grounds for classification',\r\n NOIMAGE: 'NO IMAGE',\r\n noLongerValid: 'This ATR is no longer valid and can therefore no longer be found in the UK ATR database.',\r\n notValidOn_referenceDate_: 'not valid on {{ referenceDate | date: \\'dd-MM-yy\\' }}',\r\n possiblyInvalid: 'Note: in some cases, ATRs may be revoked before their normal period of validity has expired. Hence, it is possible that this ATR is no longer valid.', \r\n SearchAdvanceTariffRulings: 'Search Advance Tariff Rulings',\r\n _StartDate_until_ExpiryDate_: '{{ StartDate | date: \\'dd-MM-yyyy\\' }} until {{ ExpiryDate | date: \\'dd-MM-yyyy\\' }}'\r\n};\r\n","// See https://app.taricsupport.com/#!/bti/home\r\n// See https://ec.europa.eu/taxation_customs/dds2/ebti/ebti_home.jsp?Lang=en\r\nmodule.exports = {\r\n BindingTariffInformation: 'Binding Tariff Information',\r\n BtiFirstLetter: 'B',\r\n Btis: 'BTIs',\r\n BtiReference: 'BTI Reference',\r\n copyDescription: 'This information is a copy of the information in the EU EBTI-database.',\r\n countryOfOrigin: 'Issuing Country / Language',\r\n dateAndPlaceOfIssue: 'Date and Country of Issue',\r\n details: 'BTI Details',\r\n ebtiLinkText: 'Click here to see the up-to-date version in this database.',\r\n EuropeanBindingTariffInformation: 'European Binding Tariff Information',\r\n goodsDescription: 'Goods Description',\r\n issuedSince: 'Issued Since',\r\n Keywords: 'Keywords',\r\n motivation: 'Grounds for classification',\r\n nationalKeywords: 'National Keywords',\r\n NOIMAGE: 'NO IMAGE', // Shown instead of an image when no image is available\r\n noLongerValid: 'This BTI is no longer valid and can therefore no longer be found in the EU EBTI-database.',\r\n notValidOn_referenceDate_: 'not valid on {{ referenceDate | date: \\'dd-MM-yy\\' }}',\r\n possiblyInvalid: 'Note: in some cases, such as the publication of a classification regulation, BTIs may be revoked before their normal period of validity has expired. Hence, it is possible that this BTI is no longer valid.',\r\n PageTitleSearchBtis: 'Search BTIs',\r\n _btiCount_bindingTariffInformationDecisionsFound: '{{ btiCount }} binding tariff information decision(s) found',\r\n _StartDate_until_EndDate_: '{{ StartDate | date: \\'dd-MM-yyyy\\' }} until {{ EndDate | date: \\'dd-MM-yyyy\\' }}'\r\n};\r\n","// See https://app.taricsupport.com/#!/case-law/news\r\n// See https://app.taricsupport.com/#!/case-law/nl\r\n// See https://app.taricsupport.com/#!/case-law/eu\r\n// See https://eur-lex.europa.eu/homepage.html\r\n// See https://uitspraken.rechtspraak.nl/resultaat?inhoudsindicatie=zt0&publicatiestatus=ps1&sort=Relevance (in Dutch)\r\nmodule.exports = {\r\n buttons: {\r\n OpenSummary: 'Open Summary',\r\n },\r\n CaseLaw: 'Case Law',\r\n CaseLawFirstLetter: 'C',\r\n DutchCaseLaw: 'Dutch Case Law',\r\n DutchCaseLawSummary: 'Summary',\r\n EuropeanCaseLawSummary: 'Summary',\r\n DutchCaseLawJudgment: 'Judgment',\r\n EuropeanCaseLaw: 'European Case Law',\r\n CaseNumber: 'Case Number',\r\n ECLI: 'ECLI',\r\n EnterCELEXNumber: 'Enter CELEX Number',\r\n EnterECLINumber: 'Enter ECLI Number',\r\n EnterCaseNumber: 'Enter Case Number',\r\n Subject: 'Subject',\r\n subjects: {\r\n AllSubjects: 'All Subjects',\r\n dynamic: {\r\n Excise: 'Excise',\r\n CustomsValue: 'Customs Value',\r\n Dumping: 'Dumping',\r\n ImportOrExportProcedures: 'Import or Export Procedures',\r\n Classification: 'Classification',\r\n ImportExportAdvanceFixingCertificates: 'Import and Export licences and Advance-fixing Certificates',\r\n Origin: 'Origin',\r\n ExportRefunds: 'Export Refunds',\r\n }\r\n },\r\n MoreCaseLaw: 'More Case Law',\r\n ProcedureTypes: 'Procedure Types',\r\n References: 'References',\r\n FormalRelations: 'Formal Relations',\r\n JudicialAuthority: 'Judicial Authority',\r\n DateOfJudgment: 'Date of Judgment',\r\n DateOfPublication: 'Date of Publication',\r\n AreasOfLaw: 'Areas of Law',\r\n PublicationLocations: 'Publication Locations', // Which legal journal has the judgment been published in?\r\n OpenJudgment: 'Open Judgment',\r\n NoDutchJudgments: 'No Dutch Judgments',\r\n NoEuropeanJudgments: 'No European Judgments',\r\n DutchJudgments: 'Dutch Judgments',\r\n EuropeanJudgments: 'European Judgments',\r\n CaseLawFor_goodscode_: 'Case Law for {{ goodscode | stripTaricCode | formatTaricCode }}',\r\n CaseLawFor_goodscode_and_searchQuery_: 'Case Law for code {{ goodscode | stripTaricCode | formatTaricCode }} and query \"{{ searchQuery }}\"',\r\n CaseLawFor_searchQuery_: 'Case Law for {{ searchQuery }}',\r\n _TotalResults_results: '{{ TotalResults }} results' // NB: TotalResults is a number\r\n};","// See https://app.taricsupport.com/#!/classification-regulations/en/search?orderBy=relevance&includeBtis=true&includeClassificationRegulations=true&query=toy&commodityCode=\r\nmodule.exports = {\r\n ClassificationRegulations: 'Classification Regulations',\r\n NotAvailableInChosenLanguage: 'Classification Regulations are only available in English and Dutch'\r\n};","// See https://app.taricsupport.com/#!/compliance-check\r\nmodule.exports = {\r\n errors: {\r\n select_file_to_check: 'Select a file to check',\r\n specify_starting_row: 'Specify the first row containing data to be processed',\r\n invalid_starting_row: 'The starting row is invalid',\r\n specify_jobtype: 'Specify what type of check should be performed'\r\n },\r\n modal: {\r\n code: 'Code',\r\n title: 'ABC Errors and Warnings',\r\n lineNumber: 'Line',\r\n message: 'Message',\r\n },\r\n details: {\r\n backToOverview: 'Back to Overview',\r\n },\r\n newJob: {\r\n breadcrumb: 'Process a New File',\r\n countryOfDestination: 'County of Destination',\r\n countryOfOrigin: 'Country of Origin',\r\n errorMessages: {\r\n columnNameCannotBeEmpty: 'Column name cannot be empty',\r\n invalidColumnName: 'Invalid column name',\r\n duplicateColumnName: 'Duplicate column name',\r\n },\r\n jobTypes: {\r\n description: 'Type of job'\r\n },\r\n labelUseTemplateOrCustomCheck: 'Choose one of the preconfigured ABC jobs below or create a custom ABC job',\r\n optionCustomCheck: 'Create a custom ABC job',\r\n measureTypes: 'Measure Types',\r\n outputFormats: {\r\n csv: 'CSV',\r\n description: 'Output Format',\r\n excel: 'Excel',\r\n excelAnnotated: 'Excel with Color Indicators',\r\n plainText: 'Plain Text'\r\n },\r\n outputType: 'Please specify the type of output you want to receive',\r\n readFile: 'Please specify in which rows and columns we can find the relevant data',\r\n selectFile: 'Select an Excel file to process',\r\n openFile: 'Open File',\r\n selectedFile: 'Selected File',\r\n startCheck: 'Start Validating and Enriching File',\r\n startsOnRow: 'Starts on Row',\r\n title: 'ABC - Validate and Enrich a New File',\r\n uploadFile: 'Upload File'\r\n },\r\n overview: {\r\n breadcrumb: 'Taric Support ABC',\r\n contactUs: 'Contact us for more information about Taric Support ABC and the possibilities for your organization',\r\n dateAdded: 'Created At',\r\n dateCompleted: 'Completed At',\r\n description: 'Validate large amounts of commodity codes quickly by simply uploading an Excel file. Enrich these files with trade tariff data, like descriptions of the nomenclature, additional codes, import duties, VAT rates and certificate codes.',\r\n documentType: 'Type',\r\n downloadFile: 'Download File',\r\n file: 'File',\r\n noJobs: 'You haven\\'t checked any files yet.',\r\n numberOfErrors: '# Errors',\r\n numberOfLines: '# Lines',\r\n numberOfLogs: '# Messages',\r\n numberOfWarnings: '# Warnings',\r\n showDetails: 'Show details',\r\n startFirst: 'Process your first file',\r\n startNew: 'Process a new file',\r\n status: 'Status',\r\n title: 'Taric Support ABC - Automated Batch Control',\r\n },\r\n status: {\r\n cancel_task_areyousure: 'Are you sure you want to cancel this task?'\r\n }\r\n};\r\n","// See https://app.taricsupport.com/#!/search/ccc-conclusions?orderBy=relevance&includeBtis=true&includeClassificationRegulations=true&query=toy&commodityCode=\r\nmodule.exports = {\r\n AmendedBy: 'Amended by',\r\n AmendmentOf: 'Amendment of',\r\n CccConclusions: 'CCC Conclusions', // CCC = Customs Code Committee\r\n Documents: 'Documents',\r\n}","// See https://app.taricsupport.com/#!/correlation-table/expired-codes-search\r\nmodule.exports = {\r\n CombinedNomenclatureExportIntraStat: 'Combined Nomenclature — export/intrastat',\r\n CommodityCodeChanges: 'Commodity Code Changes',\r\n CorrelationTable: 'Correlation Table',\r\n DerivedFrom: 'Derived from',\r\n ExpiredCode: 'Expired Code',\r\n ExpiredCodes: 'Expired Codes',\r\n HarmonizedSystem2022: 'Harmonized System 2022',\r\n HS2022Forward: 'HS2017 to HS2022 Correlations',\r\n HS2022Backward: 'HS2022 to HS2017 Correlations',\r\n MaxOneYearInterval: 'You cannot specify a period of more than a year',\r\n NewCode: 'New Code',\r\n NewCodes: 'New Codes',\r\n Nomenclature: 'Nomenclature',\r\n RecentChanges: 'Recent changes',\r\n RecentCommodityCodeChanges: 'Recent commodity code changes',\r\n Remarks: 'Remarks',\r\n ReplacedBy: 'Replaced by',\r\n SearchCorrelationTable: 'Search correlation table',\r\n TaricImport: 'TARIC — import',\r\n UpcomingChanges: 'Upcoming changes',\r\n UpcomingCommodityCodeChanges: 'Upcoming commodity code changes'\r\n};","module.exports = {\r\n CustomsValueCheck: 'Customs Value Check',\r\n TheCurrentCustomsValueIs: 'The current customs value is {{ CurrentCustomsValuePerUnitOfWeightFormatted }}.',\r\n NoDataIsAvailableRegardingTheAverageCustomsValue: 'No data is available regarding the average customs value per unit of weight for commodities with commodity code {{ CommodityCode }} imported from {{ PartnerCountry }} into {{ ReportingCountry }}.',\r\n In_TheAverageWas: 'In {{ Year }}, the average customs value per unit of weight for commodities with commodity code {{ CommodityCode }} imported from {{ PartnerCountry }} into {{ ReportingCountry }} was {{ AverageCustomsValuePerUnitOfWeightFormatted }}.',\r\n TheCurrentCustomsValueIs_WhichIsPercentageOf_: 'The current customs value is {{ CurrentCustomsValuePerUnitOfWeightFormatted }}, which is {{ Percentage }} of this average.'\r\n};","// See https://app.taricsupport.com/#!/transaction-value-calculator\r\nmodule.exports = {\r\n TypeOfCalculator: 'Type of calculator', // Label for radio buttons to select the type of calculator\r\n Basic: 'Basic', // Basic calculator\r\n Advanced: 'Advanced', // Advanced calculator\r\n\r\n AddField: 'Add field', // Shown when hovering over a button containing a plus sign. If this button is clicked, a new form (input) field is added.\r\n RemoveField: 'Remove field', // Shown when hovering over a button containing a delete (X) sign. This button is next to a form (input) field. If this button is clicked, the form field is deleted.\r\n \r\n Additions: 'Additions', // Form Header. Additions to the price paid or payable to get to the transaction value\r\n\r\n // The following are from article 71 of the UCC (Regulation (EU) No 952/2013) (32013R0952)\r\n CommisionsAndBrokerageExceptBuyingCommissions: 'Commissions and brokerage, except buying commisions',\r\n PackagingCosts: 'Costs of packing and packaging',\r\n CostOfContainersWhichAreOneWithGoods: 'Cost of containers which are treated as being one, for customs purposes, with the goods in question',\r\n HelpForCostOfContainersWhichAreOneWithGoods: '

General rule 5 for the interpretation of the Combined Nomenclature:

  1. camera cases, musical instrument cases, gun cases, drawing-instrument cases, necklace cases and similar containers, specially shaped or fitted to contain a specific article or set of articles, suitable for long-term use and presented with the articles for which they are intended, shall be classified with such articles when of a kind normally sold therewith. This rule does not, however, apply to containers which give the whole its essential character;
  2. subject to the provisions of rule 5(a), packing materials and packing containers presented with the goods therein shall be classified with the goods if they are of a kind normally used for packing such goods. However, this provision is not binding when such packing materials or packing containers are clearly suitable for repetitive use.

The terms ‘packing materials’ and ‘packing containers’ mean any external or internal containers, holders, wrappings or supports other than transport devices (for example, transport containers), tarpaulins, tackle or ancillary transport equipment. The term ‘packing containers’ does not cover the containers referred to in general rule 5(a)

',\r\n CostOfPacking: 'Cost of packing, whether for labour or materials',\r\n GoodsAndServicesProvidedByBuyer: 'Goods and services provided by buyer',\r\n MaterialsComponentsAndParts: 'Materials, components, parts and similar items incorporated into the imported goods',\r\n ToolsDiesAndMoulds: 'Tools, dies, moulds and similar items used in the production of the imported goods',\r\n MaterialsConsumedInProduction: 'Materials consumed in the production of the imported goods',\r\n EngineeringDevelopmentArtworkDesignPlansAndSketches: 'Engineering, development, artwork, design work, and plans and sketches undertaken elsewhere than in the Union and necessary for the production of the imported goods',\r\n RoyaltiesAndLicenseFees: 'Royalties and licence fees related to the goods being valued that the buyer must pay, either directly or indirectly, as a condition of sale of the goods being valued',\r\n ValueOfResaleDisposalOrUseThatAccruesToSeller: 'Value of any part of the proceeds of any subsequent resale, disposal or use of the imported goods that accrues directly or indirectly to the seller',\r\n DeliveryCosts: 'Delivery costs',\r\n TransportCostsBeforeEntryIntoCustomsTerritory: 'Cost of transport of the imported goods before their entry into the customs territory of the Union',\r\n InsuranceCostsBeforeEntryIntoCustomsTerritory: 'Cost of insurance of the imported goods before their entry into the customs territory of the Union',\r\n LoadingAndHandlingChargesBeforeEntryIntoCustomsTerritory: 'Loading and handling charges associated with the transport of the imported goods before their entry into the customs territory of the Union',\r\n \r\n OtherAdditions: 'Other additions', // Form label. Other additions to the price paid or payable to get to the transaction value\r\n\r\n Deductions: 'Deductions', // Form Header. Deductions from the price paid or payable to get to the transaction value\r\n \r\n // The following are from article 72 of the UCC (Regulation (EU) No 952/2013) (32013R0952)\r\n TransportCostsAfterEntryIntoCustomsTerritory: 'The cost of transport of the imported goods after their entry into the customs territory of the Union (NB: this includes related costs, such as handling and insurance costs)',\r\n InternalNoteForTransportCostsAfterEntryIntoCustomsTerritory: 'TODO: these costs should be added to the base value for VAT calculation (see https://www.belastingdienst.nl/bibliotheek/handboeken/html/boeken/HDU/douanewaarde-bijlage_1_waarden_en_prijzen.html)',\r\n ChargesForConstructionErectionAssemblyMaintenanceOrTechnicalAssistance: 'Charges for construction, erection, assembly, maintenance or technical assistance, undertaken after the entry into the customs territory of the Union of the imported goods such as industrial plants, machinery or equipment',\r\n ChargesForInterest: 'Charges for interest under a financing arrangement entered into by the buyer and relating to the purchase of the imported goods',\r\n ChargesForRightToReproduce: 'Charges for the right to reproduce the imported goods in the Union',\r\n BuyingCommisions: 'Buying commissions',\r\n ImportDuties: 'Import duties or other charges payable in the Union by reason of the import or sale of the goods',\r\n PaymentsMadeForRightToDistributeOrResell: 'Payments made by the buyer for the right to distribute or resell the imported goods, if such payments are not a condition of the sale for export to the Union of the goods',\r\n \r\n OtherDeductions: 'Other deductions', // Form label. Other deductions from the price paid or payable to get to the transaction value\r\n\r\n // Article 86.1 UCC (Regulation (EU) No 952/2013) (32013R0952)\r\n HelpForOtherDeductions: 'For example: costs for storage and for usual forms of handling in the Union during storage in a customs warehouse of a temporary storage facility.',\r\n\r\n Method: 'Method', // Label for radio buttons for choosing how to set the customs value, by calculating it or by entering it\r\n CalculateValue: 'Calculate value', // Radio button for choosing to calculate the customs value\r\n EnterValue: 'Enter value', // Radio button for choosing to enter the customs value\r\n\r\n Price: 'Price', // Form Header\r\n PriceActuallyPaidOrPayable: 'Price actually paid or payable', // Form label\r\n Result: 'Result', // Result of the customs value calculation\r\n TransactionValue: 'Transaction value', // Form label\r\n TransactionValueCalculator: 'Transaction Value Calculator', // Page title; breadcrumb\r\n\r\n \r\n};\r\n","// See https://app.taricsupport.com/#!/sections\r\nmodule.exports = {\r\n exampleText: 'for example: 22030009 or 6911100090 import cn',\r\n landingPage: {\r\n dynamic: {\r\n DE: 'To the German Customs Tariff (EZT)',\r\n EU: 'To the European Customs Tariff (TARIC)',\r\n BE: 'To the Belgian Customs Tariff (TARBEL)',\r\n NL: 'To the Dutch Customs Tariff (DTV)',\r\n CH: 'To the Swiss Customs Tariff (TARES)',\r\n GB: 'To the UK Global Tariff (UKGT)',\r\n SE: 'To the Swedish Customs Tariff',\r\n IT: 'To the Italian Customs Tariff'\r\n }\r\n },\r\n RecentChanges: 'Recent Changes', // recent changes to the application\r\n RecentCodes: 'Recent Codes' // recent commodity codes\r\n};\r\n","// See the intro buttons at the top right of many pages in the application\r\nmodule.exports = {\r\n abc: {\r\n intro: 'With Taric Support ABC you can upload master data files, order manifests and customs declarations and, with one click of a button, validate them and enrich them with data from the trade tariff. What used to take days, now takes minutes.

How does it work? Upload a file, select a validation and press start. Seconds later, you can download an Excel file containing a lot of useful information.

Taric Support ABC combines the power of our API with the flexibility of uploading and downloading Excel files'\r\n },\r\n abcNew: {\r\n file: 'Select an Excel file to be validated and enriched.',\r\n inputOptions: 'Indicate which columns in the Excel file contain which type of data and at what row the data starts.',\r\n outputOptions: 'Choose if you want to do a check for import or export declarations, which type of job you would like to perform and in which format you would like to receive the output data.',\r\n letsGo: 'Let\\'s go!'\r\n },\r\n caseLaw: {\r\n intro: 'Under the heading \"News\" you will find the latest Dutch and European rulings.

Under the headings \"Dutch case law\" and \"European case law\" you will find advanced search functions to quickly find the relevant case law.',\r\n },\r\n chapter: {\r\n intro: 'On this page you can browse through a chapter. There are a lot of tools to help you with the classification process.',\r\n heading: 'Click a heading or subdivision to expand/collapse it.
Hint: you can double-click to also expand/collapse all of its subdivisions,',\r\n chapterButtons: \r\n 'The following data sources are available. You will always see the information which is relevant for the current chapter.' +\r\n '',\r\n headingButtons: \r\n 'The same data sources are also available for each heading. ' +\r\n 'In order to save space, the buttons are only marked with a single letter. ' +\r\n 'If you happen to forget, you can hover over a button to see what it does.'\r\n },\r\n chapters: {\r\n intro: \r\n 'This is the start page of the trade tariff and classification module.

' + \r\n 'You can use this page to start browsing through the sections and chapters of the nomenclature, or use the search box to query the tariff.',\r\n largeSearchBox: 'Use this search box or the one at the top of the page to search by commodity code or keyword.

Hint: in order to speed up your search, you can add \"import\" or \"export\" to specify the trade movement. You can also type the country of origin for import or the country of destination for export.',\r\n sectionNotesAndExplanatoryNotes: \r\n 'NB: in order to decide if a commodity may be classified under a given section or chapter, ' + \r\n 'you should always read the (legally) binding section and chapter notes. You can find them by clicking on the button marked by the letter N for Notes.

' +\r\n 'Furthermore, the explanatory notes published by the WCO and the EU, while not legally binding, are indispensible tools for understanding ' +\r\n 'the scope of sections, chapters, headings and subdivisions in the nomenclature. You can find them by clicking on the button marked by the letter E for Explanatory Notes',\r\n },\r\n correlationTable: {\r\n intro: 'Find the originators of new commodity codes and the successors of expired commodity codes.

You can search by start date or end date or you can search by commodity code (chapter, heading or subheading).

',\r\n searchSuccessors: 'Press to view successors of expired commodity codes.

Note that successors to expired codes are not necessarily new codes. It is also possible that the successor already existed and new commodities were added to it.',\r\n searchOriginators: 'Press to view originators (predecessors) of new commodity codes.

Note that the originator to a new commodity does not necessarily end. It\\'s possible that only part of the commodities that were previously classified under the originator are now to be classified under the new code.'\r\n },\r\n ebti: {\r\n intro: 'Organizations in the EU can submit a request for a binding opinion to their national customs authorities. These are called BTIs. They are an extremely useful tool in determining the correct classification of your product. After all, if you are filing a declaration for the same product, it will likely have the same classification.

Taric Support helps you with a total overview of all BTIs issued in Europe with accompanying photos and drawings, including a history of BTIs that are no longer valid. These BTIs, like the rest of the information, are easy to find based on the relevant commodity code.',\r\n form:\r\n 'The BTI search form allows you to search by commodity code (chapter, heading, subheading) and query by keyword and goods description, among other things.

' + \r\n 'NB: you can choose to either sort the BTIs by commodity code or by date, in essence creating a news feed with the latest BTIs, or use the issued since field to only show recent BTIs.

' +\r\n 'NB: you can also choose to view the results as images. Often, going through a list of images can be a quick way to get an idea of ' + \r\n 'whether or not a certain part of the nomenclature is applicable for the commodity you are classifying.'\r\n },\r\n atr: {\r\n intro: 'Organizations in the UK can submit a request for a binding opinion to their national customs authorities. These are called ATRs (Advance Tariff Rulings). They are an extremely useful tool in determining the correct classification of your product. After all, if you are filing a declaration for the same product, it will likely have the same classification.

Taric Support helps you with a total overview of all ATRs issued in the UK with accompanying photos and drawings, including a history of ATRs that are no longer valid. These ATRs, like the rest of the information, are easy to find based on the relevant commodity code.',\r\n form:\r\n 'The ATR search form allows you to search by commodity code (chapter, heading, subheading) and query by keyword and goods description, among other things.

' + \r\n 'NB: you can choose to either sort the ATRs by commodity code or by date, in essence creating a news feed with the latest ATRs, or use the issued since field to only show recent ATRs.

' +\r\n 'NB: you can also choose to view the results as images. Often, going through a list of images can be a quick way to get an idea of ' + \r\n 'whether or not a certain part of the nomenclature is applicable for the commodity you are classifying.'\r\n },\r\n header: {\r\n referenceDatePicker: 'Use the date picker to change the date for which you want to look up tariffs or regulations.',\r\n tradeMovementPicker: 'Choose whether to browse nomenclature and trade tariff measures for import or export',\r\n languagePicker: \r\n 'Pick one of 22 European languages. ' + \r\n 'Note that the supported languages for the interface are English and Dutch. However, most of the information is available in all 22 languages. ' +\r\n 'This may come in handy when communicating with a customer, supplier or colleague who has a different mother tongue.',\r\n },\r\n landingPage: {\r\n welcomeTitle: 'Welcome',\r\n welcomeIntro: \r\n 'Hello and welcome to Taric Support. Thank you for using our application. Please let us show you around.

' +\r\n 'If you\\'d prefer to continue in a different language, please click the button above to choose one of 22 languages.',\r\n referenceCountryPicker: \r\n 'The main data sources for Taric Support are a number of various trade tariffs. You can use these flags to choose between them.

' + \r\n 'This choice will affect both the nomenclature you will use for classification and the import and export measures that you will see. ' +\r\n 'For instance, the nomenclature used in the UK Global Tariff is not the same as the nomenclature used in TARIC, the integrated customs tariff of the EU.

' +\r\n 'NB: note that you can always change the current trade tariff by using the flags in the header bar.',\r\n introButton:\r\n 'You can click on the intro button to find out more about the page you are on'\r\n \r\n },\r\n mainMenu: {\r\n intro: 'Via the main menu, you can access the various modules in your subscription.

Hint: use the enter key to go through this tour.',\r\n chapters: 'Browse the trade tariff and nomenclature',\r\n news: 'The latest customs news',\r\n ebti: 'The entire EBTI database: hundreds of thousands of examples of products that have been classified by customs authorities',\r\n abc: 'Validate and enrich hundreds of codes per minute with Taric Support ABC',\r\n correlationTable: 'Find the predecessors and successors of commodity codes',\r\n referencePrices: 'A complete list of daily standard import values and unit prices for fruits and vegetables',\r\n caseLaw: 'Dutch and European customs case law.'\r\n },\r\n measures: {\r\n intro: \r\n 'This page shows an overview of measures that apply for import or export of a commodity with this commodity code.

' +\r\n 'We make use of a number of different colors to help you to quickly identify the various types of codes. ' +\r\n 'In this way we can display a lot of information in a compact format. The colors are as follows:

' +\r\n '',\r\n form:\r\n 'With this form you can filter the measures by country code, apply additional codes and choose the preferred duty treatment.

' +\r\n 'Hint: you can also add the country code and/or country name to the query that you type in the search box in the header bar.',\r\n validateDeclaration:\r\n 'In this screen you can validate the data for a customs declaration. First filter measures by country code, apply additional codes ' +\r\n 'and choose the preferred duty treatment. Next, enter the customs value and the relevant quantities. Finally choose the applicable ' +\r\n 'particular provision codes (Y-codes) and certificate codes and run the validation.',\r\n calculateDuty:\r\n 'In this screen you can calculate import duties and (for supported countries) national taxes. First filter measures by country code, apply additional codes ' +\r\n 'and choose the preferred duty treatment. Next, enter the customs value and the relevant quantities. Finally choose the applicable ' +\r\n 'particular provision codes (Y-codes) and certificate codes and press calculate duty.'\r\n },\r\n news: {\r\n intro: \r\n 'Choose \"EU Legislation\" for the latest regulations and announcements from EUR-Lex.

' +\r\n 'Choose \"Case Law\" for the latest rulings by the EU Court of Justice, as well as Dutch national rulings.

' +\r\n 'The menu item \"Dutch Customs News Feed\" shows news items published by the Dutch customs authorities (in Dutch only)'\r\n },\r\n ui: {\r\n done: 'Done',\r\n help: 'Help',\r\n next: 'Next',\r\n previous: 'Previous',\r\n startTour: 'Intro',\r\n },\r\n};","// For the original source, see the following web pages:\r\n// See https://ec.europa.eu/taxation_customs/dds2/ecics/chemicalsubstance_consultation.jsp\r\n// See https://ec.europa.eu/taxation_customs/dds2/ecics/chemicalsubstance_details.jsp?Lang=it&Cus=0010001-6\r\n// In Taric Support, see https://app.taricsupport.com/#!/ecics/home/\r\nmodule.exports = {\r\n CAS_RN: 'CAS RN', // do not translate\r\n ChemicalsSearch: 'Chemicals Search',\r\n Characteristic: 'Characteristic',\r\n Characteristics: 'Characteristics',\r\n Comment: 'Comment',\r\n CUS: 'CUS', // do not translate\r\n EC_Number: 'EC Number',\r\n Ecics: 'ECICS', // do not translate\r\n EcicsDetails: 'ECICS Details',\r\n EcicsLinkText: 'Click here to open this item in the ECICS database.',\r\n InChI: 'InChI', // do not translate\r\n InChIKey: 'InChI Key',\r\n LanguageCode: 'Language Code',\r\n Level: 'Level',\r\n Name: 'Name',\r\n Names: 'Names',\r\n Nomenclature: 'Nomenclature',\r\n Order: 'Order', // as in the ordering of a list\r\n SearchEcicsDatabase: 'Search ECICS Database',\r\n UN_Number: 'UN Number',\r\n};","// See https://app.taricsupport.com/#!/exchange-rates\r\nmodule.exports = {\r\n Currency: 'Currency',\r\n CurrencyCode: 'Currency Code',\r\n CurrencyCodeModalTitle: 'Select a currency code',\r\n CurrencyCodeTypeaheadPlaceholder: 'Search by currency code or name',\r\n CurrencyConversionResults: 'Currency Conversion Results',\r\n CurrencyName: 'Currency Name',\r\n ExchangeRates: 'Exchange Rates',\r\n NumberOfDecimalPlaces: 'Number of decimal places',\r\n UseTheFieldsBelowToConvertBetween_and_: 'Use the fields below to convert between {{ inverseMonetaryValue.unit }} and {{ monetaryValue.unit }}',\r\n};\r\n","// Choose German trade tariff (EZT - Elektronischer Zolltarif).\r\n// See https://app.taricsupport.com/#!/good/2203000100\r\n// See https://app.taricsupport.com/#!/texts-german-customs\r\n// See https://auskunft.ezt-online.de/ezto/Welcome.do\r\nmodule.exports = {\r\n ChooseNationalCommodityCodeToFindVatRate: 'Choose a national commodity code above to find the correct VAT rate.',\r\n ChooseExciseCodeToFindExciseRates: 'Choose an excise code above to find the correct excise rate.',\r\n ExciseCode: 'Excise code',\r\n ExplanatoryNotesProvidedByGermanCustoms: 'Explanatory Notes provided by German Customs',\r\n ExciseDutyRate: 'Excise duty rate',\r\n EztExciseCodeFieldPlaceHolder: 'Enter or search for excise code',\r\n EztExciseCodeSelectorModalTitle: 'Excise Nomenclature',\r\n GermanExplanatoryNotes: 'Explanatory Notes Germany',\r\n Hinweise: 'Hinweise',\r\n NationalCommodityCode: 'National Commodity Code',\r\n NationalNomenclature: 'National Nomenclature',\r\n TextsPublishedByGermanCustoms: 'Texts published by German Customs',\r\n TextsGermanCustoms: 'Texts German Customs',\r\n\r\n};","module.exports = {\r\n EuMemberState: 'EU member state'\r\n};","// To be translated by Taric Support and reviewed by translation agency\r\nmodule.exports = {\r\n tabs: {\r\n Measures: 'Measures',\r\n ValidateDeclaration: 'Validate declaration',\r\n CalculateDuty: 'Calculate duties'\r\n },\r\n form: {\r\n legendValue: 'Value',\r\n radioMethodLabel: 'Method',\t\r\n radioMethodOptionCalculateValue: 'Calculate value',\r\n radioMethodOptonEnterValue: 'Enter value'\r\n },\r\n financialConditions: {\r\n E: {\r\n title: 'The quantity or the price per unit declared, as appropriate, is equal or less than the specified maximum, or presentation of the required document',\r\n headers: {\r\n col1: 'Quantity or price per unit',\r\n col2: 'Tariff'\r\n }\r\n },\r\n F: {\r\n title: 'The net free at frontier price before duty must be equal to or greater than the minimum price',\r\n headers: {\r\n col1: 'Net free price at frontier, before duty',\r\n col2: 'Tariff'\r\n }\r\n },\r\n L: {\r\n title: 'CIF price must be higher than the minimum price',\r\n headers: {\r\n col1: 'CIF price',\r\n col2: 'Tariff'\r\n }\r\n },\r\n M: {\r\n title: 'Import price must be equal to or greater than the minimum price/reference price',\r\n headers: {\r\n col1: 'Import price',\r\n col2: 'Tariff'\r\n }\r\n },\r\n V: {\r\n title: 'Import price must be equal to or greater than the entry price',\r\n headers: {\r\n col1: 'Import price',\r\n col2: 'Tariff'\r\n }\r\n }\r\n },\r\n meursing: {\r\n calculateDescription: 'Fill in the information below to calculate the additional code for the agricultural element.',\r\n calculateTitle: 'Calculate additional code agricultural element',\r\n impossibleCombination: 'Invalid combination of ingredients (total weight over 100%)',\r\n milkfat: 'Milkfat (% weight)',\r\n milkproteins: 'Milkproteins (% weight)',\r\n saccharin: 'Sucrose/invert sugar/isoglucose (% weight)',\r\n starchGlucose: 'Starch/glucose (% weight)',\r\n }\r\n};\r\n","module.exports = {\r\n Chapters: 'Chapters',\r\n Search: 'Search',\r\n News: 'News',\r\n BindingTariffInformation: 'Binding Tariff Information',\t\r\n ChemicalsSearch: 'Chemicals Search',\r\n ValidateBusinessInformation: 'Validate Business Information',\t\r\n AdvanceTariffRulings: 'Advance Tariff Rulings',\r\n TaricSupportABC: 'ABC - Check File',\r\n CorrelationTable: 'Correlation Table',\r\n TradeStatistics: 'Trade Statistics',\r\n TransactionValue: 'Transaction Value',\r\n ReferencePrices: 'EU Reference Prices',\r\n CaseLaw: 'Case Law',\r\n TextsByGermanCustoms: 'Texts by German Customs',\r\n ReferenceLists: 'Reference Lists',\r\n AdditionalCodes: 'Additional Codes',\r\n CertificateCodes: 'Certificate Codes',\r\n Footnotes: 'Footnotes',\r\n Regions: 'Regions',\r\n ExchangeRates: 'Exchange Rates',\r\n ChangePassword: 'Change Password',\r\n Logout: 'Logout',\r\n Favorites: 'Favorites',\t\r\n};","module.exports = {\r\n DutchCustomsNewsFeed: 'Dutch Customs News Feed',\r\n NewsOverview: 'News Overview',\r\n OpenInTaricSupport: 'Open in Taric Support'\r\n};","module.exports = {\r\n Annotations: 'Notes',\r\n AnnotationsFirstLetter: 'N',\r\n\r\n Chapter: 'Chapter',\r\n Chapters: 'Chapters',\r\n Chapter_code_: 'Chapter {{ code }}',\r\n Chapter_GoodsCodeOrSectionNumber_: 'Chapter {{ GoodsCodeOrSectionNumber }}',\r\n\r\n CombinedNomenclature: 'Combined Nomenclature',\r\n\r\n CommodityClassification: 'Commodity Classification',\r\n CommodityCode: 'Commodity Code',\r\n CommodityCodes: 'Commodity Codes',\r\n CommodityCodesFoundInText: 'Commodity Codes Found in Text',\r\n \r\n\r\n Heading: 'Heading',\r\n Heading_code_: 'Heading {{ code }}',\r\n Heading_GoodsCodeOrSectionNumber_: 'Heading {{ GoodsCodeOrSectionNumber }}',\r\n Headings: 'Headings',\r\n\r\n Section: 'Section',\r\n Section_number_: 'Section {{ number }}',\r\n Section_GoodsCodeOrSectionNumber_: 'Section {{ GoodsCodeOrSectionNumber }}',\r\n Sections: 'Sections',\r\n\r\n SubChapter_GoodsCodeOrSectionNumber_: 'Subchapter {{ GoodsCodeOrSectionNumber }}',\r\n\r\n Subheading: 'Subheading',\r\n\r\n WcoClassificationOpinions: 'WCO Classification Opinions',\r\n Classifications: 'Classifications',\r\n ExplanatoryNotes: 'Explanatory Notes',\r\n ExplanatoryNotesFirstLetter: 'E',\r\n ExplanatoryNotesCn: 'CN Explanatory Notes - EU',\r\n ExplanatoryNotesHs: 'HS Explanatory Notes - WCO',\r\n Nomenclature: 'Nomenclature',\r\n NomenclatureGroups: 'Nomenclature Groups',\r\n NomenclatureHeadings: 'Nomenclature - Headings',\r\n NomenclatureHeading_code_: 'Nomenclature - Heading {{ code }}',\r\n\r\n SectionAndChapterNotes: 'Section and Chapter Notes',\r\n};","// See https://app.taricsupport.com/#!/good/0702000007\r\n// and press on one of the links marked \"order\"\r\n// See https://ec.europa.eu/taxation_customs/dds2/taric/quota_consultation.jsp?Origin=&Status=&Year=2024&Screen=0&europaPath=europa&logoPath=europa%2fecl%2fimages%2flogo&Expand=true&Critical=&Lang=it&Code=&Offset=0\r\nmodule.exports = {\r\n orderNumberPrefix: 'order:',\r\n orderNumber: {\r\n balance: 'Balance',\r\n changeDate: 'Change date',\r\n critical: 'Critical',\r\n currentVolume: 'Available volume',\r\n endDate: 'End date',\r\n initialVolume: 'Initial volume',\r\n measurementUnit: 'Measurement unit',\r\n noQuota: 'No quota could be found for this ordernumber.',\r\n noStatus: 'No status information available',\r\n periodStartDate: 'Period start date',\r\n region: 'Geographical area',\r\n startDate: 'Start date',\r\n status: 'Status'\r\n },\r\n quotaStatus: {\r\n block: 'Blocked',\r\n critical: 'Critical',\r\n exhaustion: 'Exhausted',\r\n reopening: 'Reopened',\r\n resume: 'Resumed',\r\n start: 'Started',\r\n suspension: 'Suspended',\r\n unblocking: 'Unblocked',\r\n unsuspension: 'Unsuspended'\r\n }\r\n};\r\n","// See https://app.taricsupport.com/#!/referenceprices\r\nmodule.exports = {\r\n NoAccess: '

An additional subscription is required to access this data.

' + \r\n '

This module gives a complete overview of the reference prices for agricultural products. ' +\r\n 'That is, you will find an always up-to-date overview of current Standard Import Values and Unit Prices. ' +\r\n 'You can also download this data for use in an external application.

' +\r\n '

This module requires an additional subscription. Please contact Taric Support for access.

' +\r\n '

Below is a sample of the data that is available. Please note that this sample concerns historical data.

',\r\n overview: {\r\n EndDate: 'Stops on',\r\n NoPrices: 'No reference prices could be found at this time',\r\n StandardImportValues: 'Standard Import Values',\r\n StartDate: 'Starts on',\r\n Title: 'EU Reference prices',\r\n UnitPrices: 'Unit Prices'\r\n }\r\n};","// See https://app.taricsupport.com/#!/news/regulations\r\nmodule.exports = {\r\n ActiveTaricMeasures: 'Active TARIC Measures',\r\n BaseRegulation: 'Base Regulation',\r\n BaseRegulations: 'Base Regulations',\r\n ChangedBy: 'Changed by',\r\n ClassificationReference: 'Reference to Classification of Heading',\r\n ClassificationInLegalActsDirectory: 'Classification in Legal Acts Directory',\r\n CountryRegion: 'Country/Region',\r\n DocumentNotFound: 'Document Not Found',\r\n GoBackToTheOverview: 'Go Back to the Overview',\r\n HereAreAFewThings: 'Here are a few things you may want to do.',\r\n InForce: 'In Force',\r\n ModificationRegulation: 'Modification Regulation',\r\n ModificationRegulations: 'Modification Regulations',\r\n Name: 'Name',\r\n NoModificationRegulations: 'No Modification Regulations',\r\n OfficialJournal: 'Official Journal',\r\n OJ: 'OJ',\r\n OpenDetails: 'Open Details',\r\n OpenDocumentOnEurLex: 'Open document on EUR-Lex',\r\n Note: 'Note',\r\n Note_CELEX_: 'Note {{ CELEX }}',\r\n Page: 'Page',\r\n PubDate: 'Publ. Date',\r\n PublicationDate: 'Publication Date',\r\n _count_publicationsFound: '{{ count }} Publications Found',\r\n PubNo: 'Pub No.',\r\n PubPage: 'Pub. Page',\r\n Regulation: 'Regulation',\r\n Regulation_CELEX_: 'Regulation {{ CELEX }}',\r\n Regulations: 'Regulations',\r\n ResourceType: 'Document Type',\r\n SearchEurLexFor: 'Search EUR-Lex for',\r\n ThereIsNoDocument_celex_: 'There is no document in our application with CELEX equal to {{ celex }}',\r\n ModalTitle: 'Regulations',\r\n consolidated: 'consolidated into the above text', // \"consolidated\" means \"incorporated into the above text\r\n unconsolidated: 'not consolidated into the above text', // \"consolidated\" means \"incorporated into the above text\r\n};\r\n","// See https://app.taricsupport.com/#!/search/heading?orderBy=relevance&includeBtis=true&includeClassificationRegulations=true\r\nmodule.exports = {\r\n AlphabeticalIndex: 'Alphabetical Index',\r\n AlsoSearchIn: 'Also search in',\r\n AlphabeticalIndexNotAvailableInChosenLanguage: 'Alphabetical Index Search is available in English and German. Please switch to one of these languages in order to continue your search.',\r\n CaseLawNoAccessMessage: 'Contact Taric Support for Access to the Case Law Module',\r\n CommodityCodeDescriptions: 'Commodity code descriptions',\r\n AdditionalDataSources: 'Additional data sources',\r\n SearchCccConclusions: 'Search CCC Conclusions', // CCC = Customs Code Committee\r\n Conclusion_Nav: 'CCC Conclusions',\r\n Documents: 'Documents',\r\n GoToChapter_code_: 'Go to Chapter {{ code }}',\r\n BrowseChapter_chapterCode_: 'Browse chapter {{ chapterCode }}',\r\n NoSearchResultsFor_QueryString_FoundInHeading_Heading_: 'No results for \"{{ QueryString }}\" found in heading {{ Heading }}',\r\n SearchResultsFor_QueryString_FoundInHeading_Heading_: 'Results for \"{{ QueryString }}\" found in heading {{ Heading }}',\r\n _commodityCode_isNotAValidCommodityCode: '{{ commodityCode }} is not a valid commodity code',\r\n SearchForSuccessors: 'Search for successors',\r\n SearchForOriginators: 'Search for originators',\r\n\r\n noResult: 'No results found for your search query',\r\n ClosestExistingParentMessage: 'However, commodity code {{ closestExistingParentCommodityCode | stripTaricCode | formatTaricCode }}, shown below, does exist.',\r\n \r\n NoResultsFoundForYourSearchQuery_QueryString_: 'No results found for your search query \"{{ QueryString }}\"',\r\n NoResultsFoundForYourSearchQuery_QueryString_FoundInChapter_Code_: 'No results found for your search query \"{{ QueryString }}\" found in chapter {{ Code }}.',\r\n \r\n Opinion_Number_: 'Opinion {{ Number }}', // Short For WCO Classification Opinion\r\n \r\n SearchResultsFor_QueryString_: 'Search results for \"{{ QueryString }}\"',\r\n SearchResultsFor_QueryString_FoundInAlphabeticalIndex: 'Search results for \"{{ QueryString }}\" found in the Alphabetical Index',\r\n SearchResultsFor_QueryString_FoundInCode: 'Search results for \"{{ QueryString }}\" found under code',\r\n SearchResultsFor_QueryString_FoundInHeading: 'Search results for \"{{ QueryString }}\" found in heading',\r\n SearchResultsFor_QueryString_FoundInHeadings: 'Search results for \"{{ QueryString }}\" found in the following headings',\r\n SearchResultsFor_QueryString_FoundInHeadingsInChapter_Code_: 'Search results for \"{{ QueryString }}\" found in the following headings in chapter {{ Code }}',\r\n SearchResultsFor_QueryString_FoundInAnnotations: 'Search results for \"{{ QueryString }}\" found in the following Section and Chapter Notes',\r\n SearchResultsFor_QueryString_FoundInEuExplanatoryNotes: 'Search results for \"{{ QueryString }}\" found in the following Explanatory Notes to the EU\\'s Combined Nomenclature',\r\n SearchResultsFor_QueryString_FoundInExplanatoryNotesGermany: 'Search results for \"{{ QueryString }}\" found in the following Explanatory Notes published by German Customs',\r\n SearchResultsFor_QueryString_FoundInTextsGermanCustoms: 'Search results for \"{{ QueryString }}\" found in the following texts published by German Customs',\r\n SearchResultsFor_QueryString_FoundInWcoExplanatoryNotes: 'Search results for \"{{ QueryString }}\" found in the following Explanatory Notes to the WCO\\'s Harmonised System',\r\n SearchResultsFor_QueryString_FoundInWcoClassificationOpinions: 'Search results for \"{{ QueryString }}\" found in the following WCO Classification Opinions',\r\n\r\n SearchNomenclature: 'Search Nomenclature',\r\n SearchAlphabeticalIndex: 'Search Alphabetical Index',\r\n SearchEUClassificationRegulations: 'Search EU Classification Regulations',\r\n SearchExplanatoryNotesGermany: 'Search Explanatory Notes Germany',\r\n SearchTextsGermanCustoms: 'Search Texts German Customs',\r\n SearchSectionAndChapterNotes: 'Search Section and Chapter Notes',\r\n SearchEUExplanatoryNotes: 'Search EU Explanatory Notes',\r\n SearchWCOExplanatoryNotes: 'Search HS Explanatory Notes (WCO)',\r\n SearchWCOClassificationOpinions: 'Search WCO Classification Opinions',\r\n TryOneOfTheFollowingActions: 'You may try one of the following actions',\r\n WcoExplanatoryNotesNotAvailableInChosenLanguage: 'The WCO Explanatory Notes are available in English and French. Please switch to one of these languages in order to continue your search.',\r\n WcoClassificationOpinionsNotAvailableInChosenLanguage: 'The WCO Classification Opinions are available in English and French. Please switch to one of these languages in order to continue your search.'\r\n};\r\n","module.exports = {\r\n historicSearchWarning: 'Note: date is not set to today',\r\n loggingOut: 'Your account is being used at a different location. It is not possible to use the same account from multiple locations. You are being logged out.',\r\n PleaseContactTaricSupportForAccessToTradeTariff: 'Please contact Taric Support for access to this trade tariff.',\r\n unauthorized: 'Your account does not have the proper permissions to access this functionality.',\r\n pickCountryForVatRates: 'Choose a country to see the applicable VAT rates',\r\n DataNotAvailableForSwissTradeTariff: 'This data is not available for the Swiss trade tariff.',\r\n ExchangeRatesNotAvailableForSwissTradeTariff: 'The exchange rates are not currently available for the Swiss trade tariff. If you are interested in this module, please let us know. ',\r\n TransactionValueCalculatorNotAvailableForSwissTradeTariff: 'The transaction value calculator is not currently available for the Swiss trade tariff.',\r\n textNewerThanRequested_StartDate_: 'Note: this text is not available for the date you\\'ve chosen. The text below is a later version. It is valid from {{ StartDate | date : \\'dd-MM-yyyy\\' }}.',\r\n NoWcoAccessMessage: 'For access to the WCO Explanatory Notes and Classification Opinions a separate subscription is necessary. Please contact us for more information',\r\n};\r\n","module.exports = {\r\n buttons: {\r\n Cancel: 'Cancel',\r\n Close: 'Close',\t\r\n CollapseAll: 'Collapse All', // As in 'collapsible part of a web page\r\n Delete: 'Delete',\r\n Download: 'Download',\r\n DownloadPDF: 'Download PDF',\r\n EmptyForm: 'Empty Form',\r\n ExpandAll: 'Expand All', // As in 'expand collapsible part of a web page'\r\n No: 'No',\r\n OK: 'OK',\r\n OpenPDF: 'Open PDF',\r\n Print: 'Print',\t\r\n Save: 'Save',\r\n Search: 'Search',\r\n Yes: 'Yes'\r\n },\r\n calendar: {\r\n Clear: 'Clear',\r\n OK: 'OK',\r\n Today: 'Today'\r\n },\r\n placeholders: {\r\n EnterCommodityCode: 'Enter Commodity Code',\r\n Search: 'Search',\r\n SearchByCountryNameOrCode: 'Search by country name or code',\r\n SearchInText: 'Search in Text',\r\n },\r\n translation: {\r\n ShowOriginal: 'Show Original',\r\n Translate: 'Translate',\r\n },\r\n areYouSureModalTitle: 'Are you sure?',\r\n \r\n Ascending: 'Ascending', // as in direction of sort order\r\n Descending: 'Descending', // as in direction of sort order\r\n \r\n Country: 'Country',\r\n Date: 'Date',\r\n DateFrom: 'Date From',\r\n DateTo: 'Date To',\r\n Description: 'Description',\r\n favorite: 'Favorite',\r\n favorites: 'Favorites',\r\n _count_found: '{{ count }} found', // NB: count is a number\r\n Images: 'Images', // as in 'pictures, show as images'\r\n List: 'List', // as in 'show as a list' (as opposed to 'show as images')\r\n Loading: 'Loading',\r\n MoreNews: 'More News',\r\n News: 'News',\r\n No: 'No',\r\n NoResults: 'No Results',\r\n NoWcoAccessMessage: 'For access to the WCO Explanatory Notes and Classification Opinions a separate subscription is necessary. Please contact us for more information',\r\n OrderBy: 'Order By',\r\n OrderDirection: 'Direction',\r\n Query: 'Query',\r\n Remember: 'Remember', // as in 'remember my choice'\r\n SearchTerm: 'Search Term',\r\n ShowResultsAs: 'Show Results As', // show as images or list\r\n Source: 'Source', // As in 'Source of the information'\r\n TextSearch: 'Search in Text',\r\n Total: 'Total', // as in 'total amount of the calculation'\r\n \r\n ValidityPeriod: 'Validity Period',\r\n ValidFrom: 'Valid From',\r\n ValidTo: 'Valid Until',\r\n ValidityStartDate: 'Start Date of Validity',\r\n ValidityEndDate: 'End Date of Validity',\r\n StartDate: 'Start Date',\r\n EndDate: 'End Date',\r\n \r\n Yes: 'Yes'\r\n};\r\n","// Various ways of ordering search results\r\nmodule.exports = {\r\n CommodityCode_Ascending: 'Commodity Code - Ascending',\r\n CommodityCode_Descending: 'Commodity Code - Descending',\r\n CUS_Ascending: 'CUS - Ascending',\r\n CUS_Descending: 'CUS - Descending',\r\n ValidFrom_Ascending: 'Valid From - Ascending',\r\n ValidFrom_Descending: 'Valid From - Descending',\r\n Relevance_Keywords: 'Relevance - Keywords',\r\n Relevance_GoodsDescription: 'Relevance - Goods Description',\r\n Relevance: 'Relevance',\r\n};","module.exports = {\r\n Version_versionNumber_: 'Version {{ versionNumber }}', // Version of application\r\n DataReadOn_lastSuccessfulDatabase_: 'Data last updated on {{ lastSuccessfulDatabase | date: \\'dd-MM HH:mm\\' }}'\r\n};\r\n","// See https://xtares.admin.ch/tares/login/loginFormFiller.do\r\n// Choose Swiss flag in Taric Support application\r\n// See https://app.taricsupport.com/#!/tares-measures/2203001000\r\n// See https://app.taricsupport.com/#!/tares-measures/3002510000\r\nmodule.exports = {\r\n Code: 'Code',\r\n CustomsFavourHintCodes: 'Customs Favour Hint Codes',\r\n CustomsReliefCode: 'Customs relief code',\r\n CustomsReliefCodes: 'Customs relief codes',\r\n Description: 'Description',\r\n DutyRates: 'Duty Rates',\r\n NoCustomsReliefCode: 'No Customs relief code',\r\n NormalDutyRate: 'Normal duty rate',\r\n ReliefCodeOnTariffLine: 'Relief code on tariff line',\r\n StatisticalKeys: 'Statistical Keys',\r\n Type: 'Type', // Type of code\r\n ValidForCustomsReliefCode: 'Valid for customs relief code',\r\n AssessmentCode: 'Assessment code',\r\n CountryGroup: 'Country group',\r\n CountryGroups: 'Country groups',\r\n ValidForCountry: 'Valid for country',\r\n CountryGroupDescription: 'Country group description',\r\n Value: 'Value',\t\r\n DutyExpression: 'Duty expression',\r\n Text: 'Text', // Duty Rate Texts\r\n DuringFullSupplyPeriod: 'during full supply period (cf. \"Remarks\", \"Tariff quotas\", \"reduced out-quota rate\")',\r\n VatRates: 'VAT Rates',\r\n AdditionalTare: 'Additional tare',\r\n OfTheNetWeight: 'of the net weight',\r\n ChooseStatisticalKey: 'Choose a statistical key to see more information',\r\n StatisticalKey: 'Statistical key',\r\n AdditionalCharges: 'Additional charges',\r\n Minimum: 'Minimum',\t\r\n Maximum: 'Maximum',\r\n excluding: 'excluding', // {{ region }} excluding {{ excludedRegion }}\r\n Key: 'Key', // AdditionalTax.Key\r\n TypeDescription: 'Type description',\r\n KeyDescription: 'Key description',\r\n AssignmentText: 'Assignment text', // AdditionalTax.AssignmentText\r\n Rate: 'Rate',\r\n Optional: 'Optional', // Is optional (yes/no)\r\n NonCustomsLaws: 'Non-customs laws',\r\n Permits: 'Permits',\r\n Tolerance: 'Tolerance', // permit tolerance - no permit allowed below this weight\r\n ToleranceCode: 'Tolerance code',\r\n PermitAuthority: 'Permit authority',\r\n PermitAuthorityDescription: 'Permit authority description',\r\n RequiredQuantitiesAndLimits: 'Required quantities and limits',\r\n RequiredQuantities: 'Required quantities',\r\n NetWeight: 'Net weight',\r\n InKgWithThreeDecimals: 'in kg with 3 decimals',\r\n SupplementaryUnit: 'Supplementary unit',\r\n MeanValueLimits: 'Mean value limits',\r\n MinimumValuePerKgNetWeight: 'Minimum value per kg (net weight)',\r\n MaximumValuePerKgNetWeight: 'Maximum value per kg (net weight)',\r\n MinimumValuePerSupplementaryUnit: 'Minimum value per supplementary unit',\r\n MaximumValuePerSupplementaryUnit: 'Maximum value per supplementary unit',\r\n WeightLimits: 'Weight limits',\r\n MinimumWeight: 'Minimum weight',\r\n MaximumWeight: 'Maximum weight',\r\n MinimumWeightPerSupplementaryUnit: 'Minimum weight per supplementary unit',\r\n MaximumWeightPerSupplementaryUnit: 'Maximum weight per supplementary unit',\r\n ProcessingCodes: 'Processing codes',\r\n};","module.exports = {\r\n errorMessages: {\r\n ErrorEvaluatingCondition: 'Error evaluating measure condition'\r\n },\r\n measureConditions: {\r\n Action: 'Action',\r\n Amount: 'Amount',\r\n Condition: 'Condition', // As in measure condition - conditions that must be met for a measure to be applicable and/or import/export to be allowed\r\n Description: 'Description',\r\n DutyRate: 'Duty Rate',\r\n noAction: 'none/positive',\r\n noCertificate: 'none'\r\n },\r\n measureSeries: {\r\n AdditionalDuties: 'Additional Duties',\r\n AntiDumpingMeasures: 'Anti-Dumping Measures',\r\n Duties: 'Duties',\r\n NationalTaxes: 'National Taxes',\r\n OtherMeasures: 'Other Measures',\r\n Prohibitions: 'Prohibitions',\r\n ReferencePrices: 'Reference Prices',\r\n Restitutions: 'Restitutions',\r\n RestrictionsAndControls: 'Restrictions and Controls',\r\n SupplementaryAmounts: 'Supplementary Amounts',\r\n SupplementaryUnit: 'Supplementary Unit',\r\n VatRates: 'VAT Rates',\r\n },\r\n referenceCountries: {\r\n BE: 'Belgium',\r\n CH: 'Switzerland',\r\n DE: 'Germany',\r\n EU: 'European Union',\r\n GB: 'Great-Britain',\r\n IT: 'Italy',\r\n NL: 'The Netherlands'\r\n },\r\n tradeMovements: {\r\n All: 'All',\r\n Export: 'Export',\r\n Import: 'Import'\r\n },\r\n unitTypes: {\r\n Area: 'Area',\r\n Energy: 'Energy',\r\n GrossWeight: 'Gross Weight',\r\n Items: 'Number of Items',\r\n Length: 'Length',\r\n NetWeight: 'Net Weight',\r\n Pairs: 'Number of Pairs',\r\n Power: 'Power', // As in electrical power\r\n Volume: 'Volume',\r\n Weight: 'Weight'\r\n },\r\n AddCertificateCode: 'Add Certificate Code',\r\n AdditionalCode: 'Additional Code',\r\n AdditionalCodesValidationError: 'Error in additional codes',\r\n AdditionalCodeTypeaheadPlaceholder: 'Search by additional code or description',\r\n AdditionalCodeModalTitle: 'Select an additional code',\r\n AdditionalCodes: 'Additional Codes',\r\n AdditionalCodeTypes: 'Additional Code Types',\r\n NoAdditionalCode: 'No Additional Code',\r\n NoAdditionalCodesFound: 'No Additional Codes Found',\r\n AgriculturalComponents: 'Agricultural Components',\r\n MeursingAdditionalCodePlaceHolder: 'Search for additional code',\r\n AutonomousTariffSuspensionsMessage: 'Recommendation: make use of the Autonomous Tariff Suspension that applies for this commodity code',\r\n CalculateDuty: 'Calculate Duty',\r\n CalculateDutyAndTaxes: 'Calculate Duty and Taxes',\r\n Certificate: 'Certificate',\r\n CertificateCodeTypeaheadPlaceholder: 'Search by certificate code or description',\r\n CertificateCodeModalTitle: 'Select a certificate code',\r\n CertificateCodes: 'Certificate Codes',\r\n CertificateCodeTypes: 'Certificate Code Types',\r\n CheckMeasureConditions: 'Check Measure Conditions', // check as in verify if all of the conditions have been met\r\n consumptionTaxWarning: 'Consumption Tax (Verbruiksbelasting) may apply, in which case a National Additional Code is required. Below you can search for National Additional Codes.',\r\n Countries: 'Countries',\r\n CountryOfDestination: 'Country of Destination',\r\n CountryOfOrigin: 'Country of Origin',\r\n CountryOrRegion: 'Country or Region',\r\n CustomsValue: 'Customs Value',\r\n Declaration: 'Declaration', // As in 'Customs Declaration'\r\n DeclarationCountry: 'Declaration Country', // As in 'Country where the customs declaration is done'\r\n DeclarationDate: 'Declaration Date', // As in 'Date of customs declaration'\r\n Destination: 'Destination', // As in 'Destination country'\r\n DutyCalculator: 'Duty Calculator',\r\n DutyCalculationErrors: {\r\n DutyMeasureNotUniqueForPreferenceCode: 'The duty measure is not unique for the preference code. Select duty measure with or without end-use.',\r\n Header: 'Duty Calculation Error',\r\n InvalidOrMissingQuantity: 'Invalid or missing quantity',\r\n UnsupportedDutyExpression: 'One of the measures for this duty calculation contains an unsupported duty expression.'\r\n },\r\n DutyCalculationResult: 'Duty Calculation Result',\r\n DutyMeasureType: 'Duty Measure Type',\r\n EuLegislation: 'EU Legislation',\r\n excl: 'excluding', // As in 'measure is valid for all countries excl. country1, country2...'\r\n Excises: 'Excises',\r\n ExportMeasures: 'Export Measures',\r\n exportRefundNomenclature: 'Export Refund Nomenclature',\r\n Footnote: 'Footnote',\r\n Footnotes: 'Footnotes',\r\n FootnoteTypes: 'Footnote Types',\r\n GeographicalArea: 'Geographical Area',\r\n GeographicalAreas: 'Geographical Areas',\r\n ImportMeasures: 'Import Measures',\r\n InformationForOrderNumber: 'Information for Order Number', // Order Number of Tariff Quota\r\n Legislation: 'Legislation',\r\n LegislationFirstLetter: 'L',\r\n Measure: 'Measure',\r\n Measures: 'Measures',\r\n MeasuresForExportFrom: 'Measures for export from',\r\n MeasuresForImportInto: 'Measures for import into',\r\n MeasuresValidOn: 'Measures valid on',\r\n MeasureTypeTypeaheadPlaceholder: 'Select measure type',\r\n MeasureTypeModalTitle: 'Select measure type',\r\n NationalAdditionalCode: 'National additional code',\r\n noCertificatesFound: 'No certificate codes found',\r\n noFootnotesFound: 'No Footnotes Found',\r\n noMeasuresFound: 'No Measures Found',\r\n noResultsForCommodityCodesInPeriod: 'No Results for the chosen commodity codes in the chosen period',\r\n OptionalNationalAdditionalCode: 'Optional national additional code',\r\n Origin: 'Origin', // As in 'Country of Origin'\r\n OtherChoices: 'Other Choices', // Header for print version, showing other choices the user has made to filter measures (e.g. reference date and reference country)\r\n PreferenceCode: 'Preference code',\r\n PreferenceCodeDisplayLabel: 'Preference codes display', // display preference codes that are valid for declarations under UCC or for declarations in the situation before UCC?\r\n PreferenceCodeDisplayLabelPreUcc: 'Pre-UCC', // UCC as in Union Customs Code\r\n PreferenceCodeDisplayLabelUcc: 'DMS / UCC', // UCC as in Union Customs Code\r\n PreferenceCodeTypeaheadPlaceholder: 'Search by preference code or description',\r\n PreferenceCodeModalTitle: 'Select a preference code',\r\n EndUseMeasureIsAllowedWithProcedureCode44: 'The end-use measure is allowed with customs procedure 44 \"End-use\"',\r\n PreferredDutyTreatment: 'Preferred Duty Treatment',\r\n Quantity: 'Quantity',\r\n QuotaOrderNumber: 'Quota Order Number',\r\n QuotaOrderNumberTypeaheadPlaceholder: 'Enter quota order number',\r\n ReferenceLists: 'Reference lists',\r\n Region: 'Region',\r\n Regions: 'Regions',\r\n RetailPrice: 'Retail Price',\r\n SearchByCodeOrDescription: 'Search by code or description',\r\n ShowQuotaInformation: 'Show Quota Information',\r\n Taxes: 'Taxes',\r\n Value: 'Value',\r\n ValidateDeclaration: 'Validate Declaration',\r\n VatAndExciseEtcetera: 'VAT, Excise, Storage and Consumption Tax',\r\n VAT: 'VAT'\r\n};\r\n","// See https://app.taricsupport.com/#!/trade-statistics\r\n// See https://trade.ec.europa.eu/access-to-markets/en/statistics\r\nmodule.exports = {\r\n ExportValue: 'Export value',\r\n ExportWeight: 'Export weight',\r\n ExportValuePerKg: 'Export value per kg',\r\n ImportValue: 'Import value',\r\n ImportWeight: 'Import weight',\r\n ImportValuePerKg: 'Import value per kg',\r\n MoreYearsComingSoon: 'More years coming soon',\r\n NoDataAvailable: 'No data available',\r\n ReportingCountry: 'Reporting country',\r\n StatisticsForImportFrom: 'Statistics for import from',\r\n StatisticsForImportInto: 'Statistics for import into',\r\n \r\n StatisticsForImportFrom_CountryName_In_Year_: 'Statistics for import from {{ CountryName }} in {{ Year }}',\r\n StatisticsForImportInto_CountryName_In_Year_: 'Statistics for import into {{ CountryName }} in {{ Year }}',\r\n StatisticsForImportIntoTheEU_In_Year_: 'Statistics for import into the EU in {{ Year }}',\r\n\r\n theEU: 'the EU',\r\n TradePartner: 'Trade partner',\r\n TradeStatistics: 'Trade statistics',\r\n Year: 'Year'\r\n};\r\n","module.exports = {\r\n vatNumber: 'VAT number',\r\n cdNumber: 'CD number',\r\n eoriNumber: 'EORI number',\r\n rexNumber: 'REX number',\r\n tinNumber: 'TIN number',\r\n cdChecking: 'Query EU Customs Decision System',\r\n checkEORINumber: 'Check EORI number',\r\n checkRexNumber: 'Check REX number',\r\n checkViesRegistrationForVatNumber: 'Check VIES registration for VAT number',\r\n vatCheck: 'Check VAT number (VIES)',\r\n eoriCheck: 'Check EORI number',\r\n rexCheck: 'Check REX number',\r\n cdCheck: 'Query Customs Decision System',\r\n eoriCheckResultValid: 'The checked EORI number is valid',\r\n eoriCheckResultInvalid: 'The checked EORI number is invalid',\r\n rexCheckResultInvalid: 'The checked REX-nummer is invalid',\r\n city: 'City',\r\n companyName: 'Company name',\r\n companyAddress: 'Company address',\r\n countryCode: 'Country code',\r\n postalCode: 'Postal Code',\r\n searchResults: 'Search results',\r\n serverError: 'An error occurred while processing your request', \r\n activitynameField: 'Activity',\r\n activityflagField: 'Flag',\r\n listOfGoods: 'List of goods',\r\n commodityCode: 'Commodity code',\r\n rexFieldError: 'Please enter a valid REX number',\r\n eoriFieldError: 'Please enter an valid EORI number',\r\n ValidateBusinessInformation: 'Validate Business Information',\r\n ViesWebSiteIntroText: 'You can use the EU\\'s VIES website to check if VAT numbers are valid for intra-community supply of goods or services.',\r\n GoToViesWebsite: 'Go To VIES Website (opens in new window)',\r\n PRODUCTION: 'Production',\r\n TRADING: 'Trading',\r\n};","module.exports = {\r\n dynamic: {\r\n CommodityCodeIsInvalid: 'Commodity code is invalid',\r\n CommodityCodeOrQueryIsRequired: 'Commodity code or search query is required',\r\n QueryIsTooShort: 'Search query is too short',\r\n QueryIsRequired: 'Search query is required',\r\n }\r\n};","module.exports = {\r\n // account: require('./account'),\r\n bti: require('./bti'),\r\n // atr: require('./atr'),\r\n // caseLaw: require('./case-law'),\r\n classificationRegulation: require('./classification-regulation'), // fully translated\r\n // compliance: require('./compliance'),\r\n // conclusion: require('./conclusion'),\r\n // correlationTable: require('./correlation-table'),\r\n // customsValue: require('./customs-value'),\r\n // customsValueCheck: require('./customs-value-check'),\r\n dashboard: require('./dashboard'), // partially translated\r\n // documentation: require('./documentation'),\r\n exchangeRates: require('./exchange-rates'),\r\n // ezt: require('./ezt'),\r\n // formLabels: require('./form-labels'),\r\n // ecics: require('./ecics'),\r\n goods: require('./goods'), // partially translated, tabs need translation\r\n // mainMenu: require('./main-menu'),\r\n // news: require('./news'),\r\n nomenclature: require('./nomenclature'), // fully translated, could use review\r\n // quota: require('./quota'),\r\n // referenceprices: require('./referenceprices'),\r\n // regulation: require('./regulation'),\r\n // search: require('./search'),\r\n shared: {\r\n // messages: require('./shared-messages'),\r\n ui: require('./shared-ui'),\r\n },\r\n // sortOptions: require('./sort-options'),\r\n // status: require('./status'),\r\n taric: require('./taric'), // partially translated\r\n // tradeStatistics: require('./trade-statistics'),\r\n // validateBusinessInfo: require('./validate-business-info'), \r\n // validationErrors: require('./validation-errors'),\r\n};","module.exports = {\r\n BindingTariffInformation: 'Informazioni Tariffarie Vincolanti',\r\n BtiFirstLetter: 'I',\r\n Btis: 'ITV',\r\n BtiReference: 'Riferimento ITV',\r\n // copyDescription: 'This information is a copy of the information in the EU EBTI-database.',\r\n countryOfOrigin: 'Paese che ha fornito l\\'ITV / Lingua',\r\n dateAndPlaceOfIssue: 'Luogo e data di rilascio',\r\n details: 'Dettagli dell\\'ITV',\r\n // ebtiLinkText: 'Click here to see the up-to-date version in this database.',\r\n EuropeanBindingTariffInformation: 'Informazioni Tariffarie Vincolanti Europee',\r\n goodsDescription: 'Descrizione della merce',\r\n issuedSince: 'Rilasciate a partire dal',\r\n Keywords: 'Parole chiave nazionali',\r\n motivation: 'Motivazione della classificazione',\r\n nationalKeywords: 'Parole chiave nazionali',\r\n // NOIMAGE: 'NO IMAGE', // Shown instead of an image when no image is available\r\n // noLongerValid: 'This BTI is no longer valid and can therefore no longer be found in the EU EBTI-database.',\r\n // notValidOn_referenceDate_: 'not valid on {{ referenceDate | date: \\'dd-MM-yy\\' }}',\r\n // possiblyInvalid: 'Note: in some cases, such as the publication of a classification regulation, BTIs may be revoked before their normal period of validity has expired. Hence, it is possible that this BTI is no longer valid.',\r\n PageTitleSearchBtis: 'Ricerca ITV',\r\n // _btiCount_bindingTariffInformationDecisionsFound: '{{ btiCount }} binding tariff information decision(s) found',\r\n // _StartDate_until_EndDate_: '{{ StartDate | date: \\'dd-MM-yyyy\\' }} until {{ EndDate | date: \\'dd-MM-yyyy\\' }}'\r\n};\r\n","module.exports = {\r\n ClassificationRegulations: 'Regolamenti di classificazione',\r\n NotAvailableInChosenLanguage: 'I regolamenti di classificazione sono disponibili solo in inglese e olandese'\r\n};","// See https://app.taricsupport.com/#!/sections\r\nmodule.exports = {\r\n exampleText: 'per esempio: 22030009 o 6911100090 import cn',\r\n // landingPage: {\r\n // dynamic: {\r\n // DE: 'To the German Customs Tariff (EZT)',\r\n // EU: 'To the European Customs Tariff (TARIC)',\r\n // BE: 'To the Belgian Customs Tariff (TARBEL)',\r\n // NL: 'To the Dutch Customs Tariff (DTV)',\r\n // CH: 'To the Swiss Customs Tariff (TARES)',\r\n // GB: 'To the UK Global Tariff (UKGT)',\r\n // SE: 'To the Swedish Customs Tariff',\r\n // IT: 'To the Italian Customs Tariff'\r\n // }\r\n // },\r\n // RecentChanges: 'Recent Changes', // recent changes to the application\r\n RecentCodes: 'Codici recenti' // recent commodity codes\r\n};\r\n","// See https://app.taricsupport.com/#!/exchange-rates\r\nmodule.exports = {\r\n Currency: 'Valuta',\r\n CurrencyCode: 'Codice valuta',\r\n CurrencyCodeModalTitle: 'Scegli codice valuta',\r\n CurrencyCodeTypeaheadPlaceholder: 'Cerca per codice o nome di valuta',\r\n CurrencyConversionResults: 'Risultati della conversione di valuta',\r\n CurrencyName: 'Nome valuta',\r\n ExchangeRates: 'Tassi di cambio',\r\n NumberOfDecimalPlaces: 'Numero di decimali',\r\n UseTheFieldsBelowToConvertBetween_and_: 'Utilizza i campi sottostanti per convertire tra {{ inverseMonetaryValue.unit }} e {{ monetaryValue.unit }}.',\r\n};\r\n","module.exports = {\r\n // tabs: {\r\n // Measures: 'Measures',\r\n // ValidateDeclaration: 'Validate declaration',\r\n // CalculateDuty: 'Calculate duties'\r\n // },\r\n form: {\r\n legendValue: 'Valore',\r\n radioMethodLabel: 'Metodo',\t\r\n radioMethodOptionCalculateValue: 'Calcolare il valore',\r\n radioMethodOptonEnterValue: 'Inserire il valore'\r\n },\r\n financialConditions: {\r\n E: {\r\n title: 'La quantità e il prezzo unitario dichiarato, secondo i casi, è uguale od inferiore alla quantità massima indicata, o presentazione del documento richiesto',\r\n headers: {\r\n col1: 'Quantità o prezzo unitario dichiarato',\r\n col2: 'Importo'\r\n }\r\n },\r\n F: {\r\n title: 'Prezzo netto franco frontiera, prima dello sdoganamento, deve essere uguale o superiore al prezzo minimo',\r\n headers: {\r\n col1: 'Prezzo netto franco frontiera, prima dello sdoganamento',\r\n col2: 'Importo'\r\n }\r\n },\r\n L: {\r\n title: 'Il prezzo CIF deve essere superiore al prezzo minimo',\r\n headers: {\r\n col1: 'Prezzo CIF',\r\n col2: 'Importo'\r\n }\r\n },\r\n M: {\r\n title: 'Il prezzo dichiarato deve essere uguale o superiore al prezzo minimo/ prezzo di riferimento',\r\n headers: {\r\n col1: 'Prezzo dichiarato',\r\n col2: 'Importo'\r\n }\r\n },\r\n V: {\r\n title: 'Il prezzo all\\'importazione deve essere uguale o superiore al prezzo d\\'entrata',\r\n headers: {\r\n col1: 'Prezzo all\\'importazione',\r\n col2: 'Importo'\r\n }\r\n }\r\n },\r\n meursing: {\r\n calculateDescription: '',\r\n calculateTitle: 'Ricerca elementi agricoli',\r\n impossibleCombination: 'Combinazione di ingredienti non valida (peso totale superiore al 100%)',\r\n milkfat: 'Materie grasse provenienti dal latte (% in peso)',\r\n milkproteins: 'Proteine del latte (% in peso)',\r\n saccharin: 'Saccarosio/Zucchero invertito/Isoglucosio (% in peso)',\r\n starchGlucose: 'Amido-Fecola/Glucosio (% in peso)',\r\n }\r\n};\r\n","module.exports = {\r\n Annotations: 'Note',\r\n AnnotationsFirstLetter: 'N',\r\n\r\n Chapter: 'Capitolo',\r\n Chapters: 'Capitoli',\r\n Chapter_code_: 'Capitolo {{ code }}',\r\n Chapter_GoodsCodeOrSectionNumber_: 'Capitolo {{ GoodsCodeOrSectionNumber }}',\r\n\r\n CombinedNomenclature: 'Nomenclatura combinata',\r\n\r\n CommodityClassification: 'Classificazione delle merci', // Check if this is correct\r\n CommodityCode: 'Codice nomenclatura', // Check if this is correct, I have also seen codice delle merci, codice merceologico, codice doganale and codide nomenclatura\r\n CommodityCodes: 'Codici nomenclatura', // Check if this is correct\r\n CommodityCodesFoundInText: 'Codici nomenclatura trovati nel testo', // Check if this is correct (trovati/presenti, not sure which one is better)\r\n\r\n Heading: 'Voce',\r\n Heading_code_: 'Voce {{ code }}',\r\n Heading_GoodsCodeOrSectionNumber_: 'Voce {{ GoodsCodeOrSectionNumber }}',\r\n Headings: 'Voci',\r\n\r\n Section: 'Sezione',\r\n Section_number_: 'Sezione {{ number }}',\r\n Section_GoodsCodeOrSectionNumber_: 'Sezione {{ GoodsCodeOrSectionNumber }}',\r\n Sections: 'Sezioni',\r\n\r\n SubChapter_GoodsCodeOrSectionNumber_: 'Sottocapitolo {{ GoodsCodeOrSectionNumber }}',\r\n \r\n Subheading: 'Sottovoce',\r\n\r\n WcoClassificationOpinions: 'Pareri di classifica dell\\'OMD',\r\n Classifications: 'Classificazioni',\r\n ExplanatoryNotesFirstLetter: 'E',\r\n ExplanatoryNotes: 'Note Esplicative',\r\n ExplanatoryNotesCn: 'Note Esplicative della NC dell\\'UE',\r\n ExplanatoryNotesHs: 'Note Esplicative del SA dell\\'OMD',\r\n Nomenclature: 'Nomenclatura',\r\n NomenclatureGroups: 'Gruppi di nomenclatura',\r\n NomenclatureHeadings: 'Nomenclatura - Voci',\r\n NomenclatureHeading_code_: 'Nomenclatura - Voce {{ code }}',\r\n\r\n SectionAndChapterNotes: 'Note di sezioni e di capitoli',\r\n};","module.exports = {\r\n buttons: {\r\n Cancel: 'Cancella',\r\n Close: 'Chiudi',\r\n CollapseAll: 'Riduci tutti',\r\n Delete: 'Elimina',\r\n Download: 'Scarica',\r\n DownloadPDF: 'Scarica PDF',\r\n EmptyForm: 'Svuota modulo',\r\n ExpandAll: 'Espandi tutti',\r\n No: 'No',\r\n OK: 'OK',\r\n OpenPDF: 'Apri PDF',\r\n Print: 'Stampa',\t\r\n Save: 'Salva',\r\n Search: 'Cerca',\r\n Yes: 'Sì',\r\n },\r\n calendar: {\r\n Clear: 'Svuota',\r\n OK: 'OK',\r\n Today: 'Oggi'\r\n },\r\n placeholders: {\r\n EnterCommodityCode: 'Inserisci il codice nomenclatura',\r\n Search: 'Cerca',\r\n SearchByCountryNameOrCode: 'Cerca per nome o codice del paese',\r\n SearchInText: 'Cerca nel testo',\r\n },\r\n translation: {\r\n ShowOriginal: 'Mostra originale',\r\n Translate: 'Traduci',\r\n },\r\n\r\n Ascending: 'Crescente', // as in direction of sort order\r\n Descending: 'Descrescente', // as in direction of sort order\r\n \r\n Country: 'Paese',\r\n Date: 'Data',\r\n DateFrom: 'Data da',\r\n DateTo: 'Data a',\r\n Description: 'Descrizione',\r\n \r\n favorite: 'Preferito',\r\n favorites: 'Preferiti',\r\n \r\n _count_found: '{{ count }} risultati trovati', // NB: count is a number\r\n Loading: 'Caricando',\r\n MoreNews: 'Altre notizie',\r\n News: 'Notizie',\r\n NoResults: 'Nessun risultato',\r\n \r\n No: 'No', // as in 'false'\r\n Yes: 'Sì', // as in 'true'\r\n\r\n Query: 'Query',\r\n Remember: 'Ricorda', // as in 'remember my choice'\r\n TextSearch: 'Ricerca testo',\r\n SearchTerm: 'Ricerca',\r\n \r\n OrderBy: 'Ordina per',\r\n OrderDirection: 'Direzione',\r\n ShowResultsAs: 'Mostra come', // show as images or list\r\n List: 'Lista', // as in 'show as a list' (as opposed to 'show as images')\r\n Images: 'Immagini', // as in 'pictures, show as images'\r\n Source: 'Fonte', // As in 'Source of the information'\r\n Total: 'Totale', // as in 'total amount of the calculation'\r\n ValidityPeriod: 'Periodo di validità',\r\n ValidFrom: 'Valido da',\r\n ValidTo: 'Valido a',\r\n ValidityStartDate: 'Data inizio validità',\r\n ValidityEndDate: 'Data fine validità',\r\n StartDate: 'Data di inizio',\r\n EndDate: 'Data di fine',\r\n\r\n};\r\n","module.exports = {\r\n // errorMessages: {\r\n // ErrorEvaluatingCondition: 'Error evaluating measure condition'\r\n // },\r\n measureConditions: {\r\n Action: 'Azione',\r\n Amount: 'Quantità',\r\n Condition: 'Condizione', // As in measure condition - conditions that must be met for a measure to be applicable and/or import/export to be allowed\r\n Description: 'Descrizione',\r\n DutyRate: 'Importo',\r\n noAction: '-', // 'none/positive',\r\n noCertificate: '-' // 'none'\r\n },\r\n measureSeries: {\r\n AdditionalDuties: 'Dazi addizionali',\r\n AntiDumpingMeasures: 'Dazi antidumping o compensativi',\r\n Duties: 'Dazi applicabili',\r\n NationalTaxes: 'Imposte nazionali',\r\n OtherMeasures: 'Altre misure',\r\n Prohibitions: 'Prohibizioni',\r\n ReferencePrices: 'Prezzo unitario, valore forfettario, prezzo rappresentativo',\r\n Restitutions: 'Restituzioni',\r\n RestrictionsAndControls: 'Restrizioni e controlli',\r\n SupplementaryAmounts: 'Importo supplementare',\r\n SupplementaryUnit: 'Unità supplementari',\r\n VatRates: 'IVA',\r\n },\r\n referenceCountries: {\r\n BE: 'Belgio',\r\n CH: 'Svizzera',\r\n DE: 'Germania',\r\n EU: 'Unione Europea',\r\n GB: 'Regno Unito',\r\n IT: 'Italia',\r\n NL: 'Paesi Bassi'\r\n },\r\n tradeMovements: {\r\n All: 'Tutti',\r\n Export: 'Esportazione',\r\n Import: 'Importazione'\r\n },\r\n unitTypes: {\r\n Area: 'Area',\r\n Energy: 'Energia',\r\n GrossWeight: 'Peso lordo',\r\n Items: 'Numero di pezzi',\r\n Length: 'Lunghezza',\r\n NetWeight: 'Peso netto',\r\n Pairs: 'Numero di paia',\r\n Power: 'Potenza', // As in electrical power\r\n Volume: 'Volume',\r\n Weight: 'Peso'\r\n },\r\n AddCertificateCode: 'Aggiungi codice di certificato',\r\n AdditionalCode: 'Codice addizionale',\r\n AdditionalCodesValidationError: 'Errore in codici addizionali',\r\n AdditionalCodeTypeaheadPlaceholder: 'Cerca per codice addizionale o descrizione',\r\n AdditionalCodeModalTitle: 'Scegli codice addizionale',\r\n AdditionalCodes: 'Codici addizionali',\r\n // NoAdditionalCode: 'No Additional Code',\r\n NoAdditionalCodesFound: 'Nessun codice addizionale trovato',\r\n AgriculturalComponents: 'Elementi agricoli',\r\n MeursingAdditionalCodePlaceHolder: 'Ricerca codice addizionale',\r\n // AutonomousTariffSuspensionsMessage: 'Recommendation: make use of the Autonomous Tariff Suspension that applies for this commodity code',\r\n CalculateDuty: 'Calcola dazi',\r\n CalculateDutyAndTaxes: 'Calcola dazi e tasse',\r\n Certificate: 'Certificato',\r\n CertificateCodeTypeaheadPlaceholder: 'Cerca per codice di certificato o descrizione',\r\n CertificateCodeModalTitle: 'Scegli codice di certificato',\r\n CertificateCodes: 'Codici di certificato',\r\n // CheckMeasureConditions: 'Check Measure Conditions', // check as in verify if all of the conditions have been met\r\n // consumptionTaxWarning: 'Consumption Tax (Verbruiksbelasting) may apply, in which case a National Additional Code is required. Below you can search for National Additional Codes.',\r\n CountryOfDestination: 'Paese di destinazione',\r\n CountryOfOrigin: 'Paese di origine',\r\n CountryOrRegion: 'Paese o regione',\r\n CustomsValue: 'Valore doganale',\r\n Declaration: 'Dichiarazione', // As in 'Customs Declaration'\r\n DeclarationCountry: 'Paese di dichiarazione', // As in 'Country where the customs declaration is done'\r\n DeclarationDate: 'Data di dichiarazione', // As in 'Date of customs declaration'\r\n Destination: 'Destinazione', // As in 'Destination country'\r\n // DutyCalculator: 'Duty Calculator',\r\n // DutyCalculationErrors: {\r\n // DutyMeasureNotUniqueForPreferenceCode: 'The duty measure is not unique for the preference code. Select duty measure with or without end-use.',\r\n // Header: 'Duty Calculation Error',\r\n // InvalidOrMissingQuantity: 'Invalid or missing quantity',\r\n // UnsupportedDutyExpression: 'One of the measures for this duty calculation contains an unsupported duty expression.'\r\n // },\r\n // DutyCalculationResult: 'Duty Calculation Result',\r\n DutyMeasureType: 'Tipo di misura del dazio',\r\n // EuLegislation: 'EU Legislation',\r\n excl: 'escluso', // As in 'measure is valid for all countries excl. country1, country2...'\r\n Excises: 'Accise',\r\n // ExportMeasures: 'Export Measures',\r\n // exportRefundNomenclature: 'Export Refund Nomenclature',\r\n Footnote: 'Nota',\r\n Footnotes: 'Note',\r\n GeographicalArea: 'Area geogragica',\r\n GeographicalAreas: 'Aree Geografiche',\r\n // ImportMeasures: 'Import Measures',\r\n // InformationForOrderNumber: 'Information for Order Number', // Order Number of Tariff Quota\r\n // Legislation: 'Legislation',\r\n // LegislationFirstLetter: 'L',\r\n Measure: 'Misura',\r\n Measures: 'Misure',\r\n // MeasuresForExportFrom: 'Measures for export from',\r\n // MeasuresForImportInto: 'Measures for import into',\r\n // MeasuresValidOn: 'Measures valid on',\r\n MeasureTypeTypeaheadPlaceholder: 'Cerca tipo di misura',\r\n MeasureTypeModalTitle: 'Scegli tipo di misura',\r\n NationalAdditionalCode: 'Codice addizionale nazionale',\r\n noCertificatesFound: 'Nessun codice di certificato trovato',\r\n noFootnotesFound: 'Nessuna nota trovata',\r\n noMeasuresFound: 'Nessuna misura trovata',\r\n // noResultsForCommodityCodesInPeriod: 'No Results for the chosen commodity codes in the chosen period',\r\n // OptionalNationalAdditionalCode: 'Optional national additional code',\r\n Origin: 'Origine', // As in 'Country of Origin'\r\n // OtherChoices: 'Other Choices', // Header for print version, showing other choices the user has made to filter measures (e.g. reference date and reference country)\r\n PreferenceCode: 'Codice preferenza',\r\n // PreferenceCodeDisplayLabel: 'Preference codes display', // display preference codes that are valid for declarations under UCC or for declarations in the situation before UCC?\r\n PreferenceCodeDisplayLabelPreUcc: 'Pre-CDU', // UCC as in Union Customs Code\r\n PreferenceCodeDisplayLabelUcc: 'CDU', // UCC as in Union Customs Code\r\n PreferenceCodeTypeaheadPlaceholder: 'Cerca per codice o descrizione',\r\n PreferenceCodeModalTitle: 'Scegli codice preferenza',\r\n // EndUseMeasureIsAllowedWithProcedureCode44: 'The end-use measure is allowed with customs procedure 44 \"End-use\"',\r\n PreferredDutyTreatment: 'Trattamento doganale',\r\n Quantity: 'Quantità',\r\n // QuotaOrderNumber: 'Quota Order Number',\r\n // QuotaOrderNumberTypeaheadPlaceholder: 'Enter quota order number',\r\n // ReferenceLists: 'Reference lists',\r\n Regions: 'Regioni',\r\n // RetailPrice: 'Retail Price',\r\n // SearchByCodeOrDescription: 'Search by code or description',\r\n // ShowQuotaInformation: 'Show Quota Information',\r\n // Taxes: 'Taxes',\r\n Value: 'Valore',\r\n // ValidateDeclaration: 'Validate Declaration',\r\n // VatAndExciseEtcetera: 'VAT, Excise, Storage and Consumption Tax',\r\n VAT: 'IVA'\r\n};","module.exports = {\r\n account: require('./account'),\r\n bti: require('./bti'),\r\n atr: require('./atr'),\r\n caseLaw: require('./case-law'),\r\n classificationRegulation: require('./classification-regulation'),\r\n compliance: require('./compliance'),\r\n conclusion: require('./conclusion'),\r\n correlationTable: require('./correlation-table'),\r\n customsValue: require('./customs-value'),\r\n customsValueCheck: require('./customs-value-check'),\r\n dashboard: require('./dashboard'),\r\n documentation: require('./documentation'),\r\n exchangeRates: require('./exchange-rates'),\r\n ezt: require('./ezt'),\r\n formLabels: require('./form-labels'),\r\n ecics: require('./ecics'),\r\n goods: require('./goods'),\r\n mainMenu: require('./main-menu'),\r\n news: require('./news'),\r\n nomenclature: require('./nomenclature'),\r\n quota: require('./quota'),\r\n referenceprices: require('./referenceprices'),\r\n regulation: require('./regulation'),\r\n search: require('./search'),\r\n shared: {\r\n messages: require('./shared-messages'),\r\n ui: require('./shared-ui'),\r\n },\r\n sortOptions: require('./sort-options'),\r\n status: require('./status'),\r\n taric: require('./taric'),\r\n tradeStatistics: require('./trade-statistics'),\r\n validateBusinessInfo: require('./validate-business-info'), \r\n validationErrors: require('./validation-errors'),\r\n};\r\n","module.exports = {\r\n changePassword: {\r\n changePassword: 'Wachtwoord veranderen',\r\n currentPassword: 'Huidig wachtwoord',\r\n errorCurrentPassword: 'Het huidige wachtwoord is niet ingevuld',\r\n errorNewPasswordEmpty: 'Het nieuwe wachtwoord is niet ingevuld',\r\n errorNewPasswordCompare: 'De nieuwe wachtwoorden komen niet overeen',\r\n newPassword1: 'Nieuw wachtwoord',\r\n newPassword2: 'Nieuw wachtwoord bevestigen',\r\n passwordChangedSuccessfully: 'Wachtwoord veranderd.',\r\n errorChangingPassword: 'Fout bij het veranderen van het wachtwoord.'\r\n },\r\n forgotPassword: {\r\n backToLogin: 'Terug naar de loginpagina',\r\n doneMessage: 'We hebben een e-mail verstuurd met instructies verstuurd naar het adres dat verbonden is aan uw account. De mail zou binnen een aantal minuten ontvangen moeten zijn.',\r\n explanation: 'Vul alstublieft uw gebruikersnaam in en wij sturen u een e-mail met de instructies om een nieuw wachtwoord aan te maken voor uw account',\r\n forgotPassword: 'Wachtwoord vergeten?',\r\n resetPassword: 'Wachtwoord resetten'\r\n },\r\n login: {\r\n error: 'Gebruikersnaam of wachtwoord onjuist',\r\n logIn: 'Inloggen',\r\n password: 'Wachtwoord',\r\n rememberMe: 'Houdt mij ingelogd',\r\n username: 'Gebruikersnaam'\r\n },\r\n logout: {\r\n signedOut: 'U bent uitgelogd',\r\n signingOut: 'U wordt uitgelogd...',\r\n title: 'Uitloggen'\r\n },\r\n resetPassword: {\r\n backToLogin: 'Terug naar de inlogpagina',\r\n doneMessage: 'U hebt een nieuw wachtwoord aangemaakt. U kunt dit wachtwoord nu gebruiken om in te loggen op uw Taric Support account.',\r\n errors: {\r\n dynamic: {\r\n 'PASSWORD_INVALID_TOKEN': 'Het verzoek om een nieuw wachtwoord aan te maken is verlopen',\r\n 'PASSWORD_ISCURRENT': 'Het wachtwoord dat u heeft ingevoerd bij \\'Huidig wachtwoord\\' is niet uw huidige wachtwoord',\r\n 'PASSWORD_MINIMUM_LENGTH': 'Het wachtwoord moet minimaal 8 karakters lang zijn',\r\n 'PASSWORD_NO_LOWERCASE': 'Het wachtwoord bevat geen kleine letters',\r\n 'PASSWORD_NO_NONALPHA': 'Het wachtwoord bevat geen non-alfanumerieke karakters',\r\n 'PASSWORD_NO_NUMBERS': 'Het wachtwoord bevat geen nummers',\r\n 'PASSWORD_NO_UPPERCASE': 'Het wachtwoord heeft geen hoofdletters',\r\n 'PASSWORD_EMPTY': 'Vul alstublieft een wachtwoord in',\r\n 'PASSWORDS_NOTEQUAL': 'De wachtwoorden die u heeft ingevuld komen niet overeen'\r\n }\r\n },\r\n explanation: 'U staat op het punt om een nieuw wachtwoord aan te maken voor uw account. Uw nieuwe wachtwoord moet minimaal 8 karakters lang zijn en moet een combinatie van hoofd- en kleine letters, nummers en non-alfanumerieke karakters bevatten',\r\n invalidToken: 'Uw link om een nieuw wachtwoord aan te maken is verlopen. Genereer een nieuwe link door het \\'wachtwoord vergeten\\' formulier opnieuw in te vullen',\r\n password1: 'Nieuw wachtwoord',\r\n password2: 'Nogmaals het nieuwe wachtwoord',\r\n resetPassword: 'Maak een nieuw wachtwoord',\r\n strength: {\r\n 'characters': '8 karakters',\r\n 'lowercase': 'Minimaal een kleine letter',\r\n 'nonalpha': 'Minimaal een non-alfanumeriek karakter',\r\n 'number': 'Minimaal een getal',\r\n 'oneOfFour': 'Voldoe aan 3 van de volgende 4 voorwaarden:',\r\n 'uppercase': 'Minimaal een hoofdletter',\r\n }\r\n }\r\n};","module.exports = {\r\n ATRs: 'ATR\\'s',\r\n AtrReference: 'Nummer ATR',\r\n attachments: 'Bijlagen',\r\n commodityDescription: 'Omschrijving goederen',\r\n copyDescription: 'Deze informatie is een kopie van de informatie in de ATR-database.',\r\n details: 'Details ATR',\r\n atrLinkText: 'Klik hier om de meest up-to-date versie te bekijken in deze database.',\r\n AdvanceTariffRulings: 'Advance Tariff Rulings',\r\n goodsDescription: 'Omschrijving van de goederen',\r\n issuedSince: 'Afgegeven sinds',\r\n Keywords: 'Sleutelwoorden',\r\n motivation: 'Motivering voor de indeling',\r\n NOIMAGE: 'GEEN AFBEELDINGEN',\r\n noLongerValid: 'Deze ATR is niet meer geldig en is daarom niet langer beschikbaar in de ATR-database.',\r\n notValidOn_referenceDate_: 'niet geldig op {{ referenceDate | date: \\'dd-MM-yy\\' }}',\r\n possiblyInvalid: 'NB: in sommige gevallen kan een ATR voor het aflopen van de normale geldigheidsduur ingetrokken worden. Het is daarom mogelijk dat deze ATR ondertussen niet meer geldig is.',\r\n SearchAdvanceTariffRulings: 'Zoek Advance Tariff Rulings',\r\n _StartDate_until_ExpiryDate_: '{{ StartDate | date: \\'dd-MM-yyyy\\' }} t/m {{ ExpiryDate | date: \\'dd-MM-yyyy\\' }}'\r\n};\r\n","module.exports = {\r\n BindingTariffInformation: 'Bindende Tariefinlichtingen',\r\n BtiFirstLetter: 'B',\r\n Btis: 'BTI\\'s',\r\n BtiReference: 'BTI-referentie',\r\n copyDescription: 'Deze informatie is een kopie van de informatie in de EBTI-database van de EU.',\r\n countryOfOrigin: 'Land van afgifte / Taal',\r\n dateAndPlaceOfIssue: 'Datum en plaats van afgifte',\r\n details: 'Details BTI',\r\n ebtiLinkText: 'Klik hier om de meest up-to-date versie te bekijken in deze database.',\r\n EuropeanBindingTariffInformation: 'Europese Bindende Tariefinlichtingen',\r\n goodsDescription: 'Omschrijving van de goederen',\r\n issuedSince: 'Afgegeven sinds',\r\n Keywords: 'Sleutelwoorden',\r\n motivation: 'Motivering voor de indeling',\r\n nationalKeywords: 'Nationale sleutelwoorden',\r\n NOIMAGE: 'GEEN AFBEELDING',\r\n noLongerValid: 'Deze BTI is niet meer geldig en is daarom niet langer beschikbaar in de EBTI-database van de EU.',\r\n notValidOn_referenceDate_: 'niet geldig op {{ referenceDate | date: \\'dd-MM-yy\\' }}',\r\n possiblyInvalid: 'NB: in sommige gevallen, zoals de publicatie van een indelingsverordening, kan een BTI voor het aflopen van de normale geldigheidsduur ingetrokken worden. Het is daarom mogelijk dat deze EBTI ondertussen niet meer geldig is.',\r\n PageTitleSearchBtis: 'Zoek BTI\\'s',\r\n _btiCount_bindingTariffInformationDecisionsFound: '{{ btiCount }} bindende tariefsinlichting(en) gevonden in deze post',\r\n _StartDate_until_EndDate_: '{{ StartDate | date: \\'dd-MM-yyyy\\' }} t/m {{ EndDate | date: \\'dd-MM-yyyy\\' }}'\r\n};\r\n","module.exports = {\r\n buttions: {\r\n OpenSummary: 'Open samenvatting',\r\n },\r\n CaseLaw: 'Rechtspraak',\r\n CaseLawFirstLetter: 'R',\r\n DutchCaseLaw: 'Nederlandse rechtspraak',\r\n DutchCaseLawJudgment: 'Uitspraak / Conclusie',\r\n DutchCaseLawSummary: 'Inhoudsindicatie',\r\n EuropeanCaseLaw: 'Europese rechtspraak',\r\n EuropeanCaseLawSummary: 'Samenvatting',\r\n CaseNumber: 'Zaaknummer',\r\n ECLI: 'ECLI',\r\n EnterCELEXNumber: 'Voer een CELEX-nummer in',\r\n EnterECLINumber: 'Voer een ECLI-nummer in',\r\n EnterCaseNumber: 'Voer een zaaknummer in',\r\n Subject: 'Onderwerp',\r\n subjects: {\r\n AllSubjects: 'Alle onderwerpen',\r\n dynamic: {\r\n Excise: 'Accijns',\r\n CustomsValue: 'Douanewaarde',\r\n Dumping: 'Dumping',\r\n ExportRefunds: 'Restituties bij uitvoer',\r\n ImportOrExportProcedures: 'In- en uitvoerprocedures',\r\n Classification: 'Indeling',\r\n ImportExportAdvanceFixingCertificates: 'Invoer-, uitvoer- en prefixatiecertificaten',\r\n Origin: 'Oorsprong',\r\n }\r\n },\r\n MoreCaseLaw: 'Meer rechtspraak',\r\n ProcedureTypes: 'Bijzondere kenmerken',\r\n References: 'Wetsverwijzingen',\r\n FormalRelations: 'Formele relaties',\r\n JudicialAuthority: 'Instantie',\r\n DateOfJudgment: 'Datum uitspraak',\r\n DateOfPublication: 'Datum publicatie',\r\n AreasOfLaw: 'Rechtsgebieden',\r\n OpenJudgment: 'Open volledige uitspraak',\r\n PublicationLocations: 'Vindplaatsen',\r\n NoDutchJudgments: 'Geen Nederlandse uitspraken',\r\n NoEuropeanJudgments: 'Geen Europese uitspraken',\r\n DutchJudgments: 'Nederlandse uitspraken',\r\n EuropeanJudgments: 'Europese uitspraken',\r\n CaseLawFor_goodscode_: 'Rechtspraak voor {{ goodscode | stripTaricCode | formatTaricCode }}',\r\n CaseLawFor_goodscode_and_searchQuery_: 'Rechtspraak voor code {{ goodscode | stripTaricCode | formatTaricCode }} en zoekopdracht \"{{ searchQuery }}\"',\r\n CaseLawFor_searchQuery_: 'Rechtspraak voor {{ searchQuery }}',\r\n _TotalResults_results: '{{ TotalResults }} resultaten' // NB: TotalResults is a number\r\n};","module.exports = {\r\n ClassificationRegulations: 'Indelingsverordeningen',\r\n EuClassificationRegulations: 'Indelingsverordeningen EU',\r\n NotAvailableInChosenLanguage: 'De EU-indelingsverordeningen zijn alleen in het Engels en het Nederlands beschikbaar'\r\n};","module.exports = {\r\n errors: {\r\n select_file_to_check: 'Selecteer een bestand om te controleren',\r\n specify_starting_row: 'Geef aan op welke rij de data begint',\r\n invalid_starting_row: 'De rij waarop de data begint, is ongeldig',\r\n specify_jobtype: 'Geef aan welke controle moet worden uitgevoerd'\r\n },\r\n modal: {\r\n code: 'Code',\r\n lineNumber: 'Regel',\r\n message: 'Bericht',\r\n title: 'ABC fouten en waarschuwingen',\r\n },\r\n details: {\r\n backToOverview: 'Terug naar overzicht',\r\n },\r\n newJob: {\r\n breadcrumb: 'Start nieuwe controle',\r\n countryOfDestination: 'Land van bestemming',\r\n countryOfOrigin: 'Land van oorsprong',\r\n errorMessages: {\r\n columnNameCannotBeEmpty: 'Kolomnaam mag niet leeg zijn',\r\n invalidColumnName: 'Ongeldige kolomnaam',\r\n duplicateColumnName: 'Dubbele kolomnaam',\r\n },\r\n jobTypes: {\r\n description: 'Soort controle'\r\n },\r\n labelUseTemplateOrCustomCheck: 'Kies een ABC-controle uit de lijst of stel een eigen controle samen',\r\n optionCustomCheck: 'Zelf samenstellen',\r\n measureTypes: 'Type maatregelen',\r\n outputFormats: {\r\n csv: 'CSV',\r\n description: 'Formaat uitvoer',\r\n excel: 'Excel',\r\n excelAnnotated: 'Excel met kleur-indicators',\r\n plainText: 'Plain text'\r\n },\r\n outputType: 'Geef aan wat u in de output wil ontvangen',\r\n readFile: 'Geef aan in welke rijen en kolommen we de relevante data kunnen vinden',\r\n selectFile: 'Selecteer een Excel-bestand om te verwerken',\r\n openFile: 'Open bestand',\r\n selectedFile: 'Geselecteerde bestand',\r\n startCheck: 'Start controle',\r\n startsOnRow: 'Begint op rij',\r\n title: 'ABC - Nieuwe bestandscontrole starten',\r\n uploadFile: 'Bestand uploaden'\r\n },\r\n overview: {\r\n breadcrumb: 'Taric Support ABC',\r\n contactUs: 'Neem contact met ons op voor meer informatie over Taric Support ABC en de mogelijkheden voor uw organisatie',\r\n dateAdded: 'Toegevoegd op',\r\n dateCompleted: 'Afgerond op',\r\n description: 'Valideer snel grote aantallen goederencodes. Upload een Excel-bestand en verrijk het bestand met informatie uit het douanetarief, zoals omschrijvingen van de nomenclatuur, aanvullende codes, invoerrechten, btw-tarieven en bescheidcodes.',\r\n documentType: 'Type',\r\n downloadFile: 'Download bestand',\r\n file: 'Bestand',\r\n noJobs: 'U heeft nog geen bestanden gecontroleerd.',\r\n numberOfErrors: '# Fouten',\r\n numberOfLines: '# Regels',\r\n numberOfLogs: '# Berichten',\r\n numberOfWarnings: '# Waarschuwingen',\r\n showDetails: 'Details bekijken',\r\n startFirst: 'Start uw eerste controle',\r\n startNew: 'Start een nieuwe controle',\r\n status: 'Status',\r\n title: 'Taric Support ABC - Automatische bestandscontrole',\r\n },\r\n status: {\r\n cancel_task_areyousure: 'Weet u zeker dat u deze taak wil annuleren?'\r\n }\r\n};\r\n","module.exports = {\r\n AmendedBy: 'Gewijzigd door',\r\n AmendmentOf: 'Wijziging van',\r\n CccConclusions: 'Conclusies CDW',\r\n Documents: 'Documenten',\r\n}","module.exports = {\r\n CombinedNomenclatureExportIntraStat: 'Gecombineerde Nomenclatuur — export/intrastat',\r\n CommodityCodeChanges: 'Veranderingen goederencodes',\r\n CorrelationTable: 'Transponeringstabel',\r\n DerivedFrom: 'Afgeleid van',\r\n ExpiredCode: 'Verlopen code',\r\n ExpiredCodes: 'Verlopen codes',\r\n HarmonizedSystem2022: 'Geharmoniseerd Systeem 2022',\r\n HS2022Forward: 'Transponering HS2017 naar HS2022',\r\n HS2022Backward: 'Transponering HS2022 naar HS2017',\r\n MaxOneYearInterval: 'Het verschil tussen start- en einddatum kan niet meer dan een jaar zijn',\r\n NewCode: 'Nieuwe code',\r\n NewCodes: 'Nieuwe codes',\r\n Nomenclature: 'Nomenclatuur',\r\n RecentChanges: 'Recente veranderingen',\r\n RecentCommodityCodeChanges: 'Recente veranderingen goederencodes',\r\n ReplacedBy: 'Vervangen door',\r\n Remarks: 'Opmerkingen',\r\n SearchCorrelationTable: 'Zoeken in transponeringstabel',\r\n TaricImport: 'TARIC — import',\r\n UpcomingChanges: 'Aankomende veranderingen',\r\n UpcomingCommodityCodeChanges: 'Aankomende veranderingen goederencodes'\r\n};","module.exports = {\r\n CustomsValueCheck: 'Controle douanewaarde',\r\n TheCurrentCustomsValueIs: 'De douanewaarde is {{ CurrentCustomsValuePerUnitOfWeightFormatted }}.',\r\n NoDataIsAvailableRegardingTheAverageCustomsValue: 'Er zijn geen gegevens beschikbaar voor de gemiddelde douanewaarde per eenheid van gewicht voor goederen met goederencode {{ CommodityCode }} geïmporteerd vanuit {{ PartnerCountry }} naar {{ ReportingCountry }}.',\r\n In_TheAverageWas: 'In {{ Year }} was de gemiddelde douanewaarde per eenheid van gewicht voor goederen met goederencode {{ CommodityCode }} geïmporteerd vanuit {{ PartnerCountry }} naar {{ ReportingCountry }} gelijk aan {{ AverageCustomsValuePerUnitOfWeightFormatted }}.',\r\n TheCurrentCustomsValueIs_WhichIsPercentageOf_: 'De opgegeven douanewaarde is {{ CurrentCustomsValuePerUnitOfWeightFormatted }}, wat {{ Percentage }} van dit gemiddelde is.'\r\n};","module.exports = {\r\n TypeOfCalculator: 'Type calculator',\r\n Basic: 'Eenvoudig',\r\n Advanced: 'Uitgebreid',\r\n AddField: 'Veld toevoegen',\r\n RemoveField: 'Veld verwijderen',\r\n \r\n Additions: 'Verhogingen',\r\n \r\n CommisionsAndBrokerageExceptBuyingCommissions: 'Commissies en courtage, met uitzondering van inkoopcommissies',\r\n PackagingCosts: 'Kosten verpakking',\r\n CostOfContainersWhichAreOneWithGoods: 'Kosten van verpakkingsmiddelen die voor douanedoeleinden worden geacht met de goederen één geheel te vormen',\r\n HelpForCostOfContainersWhichAreOneWithGoods: '

Algemene regel 5 voor de interpretatie van de gecombineerde nomenclatuur:

  1. etuis, foedralen en koffers voor camera\\'s, voor muziekinstrumenten of voor wapens, dozen voor tekeninstrumenten, juwelenkistjes en dergelijke bergingsmiddelen, speciaal gevormd of ingericht voor het opbergen van een bepaald artikel of van een stel of assortiment van artikelen, geschikt voor herhaald gebruik en aangeboden met de artikelen waarvoor ze bestemd zijn, worden ingedeeld onder dezelfde post als die artikelen indien zij van de soort zijn die normaal daarmee wordt verkocht. Deze regel geldt echter niet voor bergingsmiddelen die aan het geheel het wezenlijk karakter verlenen;
  2. behoudens het bepaalde onder 5 a) worden gevulde verpakkingsmiddelen ingedeeld met de verpakte goederen indien zij van de soort zijn die normaal als verpakking voor die goederen wordt gebruikt. Deze regel is echter niet verplichtend voor verpakkingsmiddelen die klaarblijkelijk geschikt zijn voor herhaald gebruik.

Onder „verpakkingsmiddelen” worden verstaan, alle uitwendige en inwendige bergingsmiddelen, omhulsels, opwindmiddelen en dergelijke voorzieningen, met uitsluiting van vervoermiddelen — met name containers —, dekkleden en het stuw- en hulpmateriaal. Hieronder worden echter niet de in algemene regel 5, onder a), bedoelde bergingsmiddelen verstaan.

',\r\n CostOfPacking: 'Kosten van het verpakken, waaronder zowel het arbeidsloon als het materiaal is begrepen',\r\n GoodsAndServicesProvidedByBuyer: 'Goederen en diensten geleverd door koper',\r\n MaterialsComponentsAndParts: 'Materialen, samenstellende delen, onderdelen en dergelijke die in de ingevoerde goederen worden verwerkt',\r\n ToolsDiesAndMoulds: 'Werktuigen, matrijzen, gietvormen en dergelijke voorwerpen die bij de voortbrenging van de ingevoerde goederen worden gebruikt',\r\n MaterialsConsumedInProduction: 'Materialen die bij de voortbrenging van de ingevoerde goederen worden verbruikt',\r\n EngineeringDevelopmentArtworkDesignPlansAndSketches: 'Engineering, ontwikkeling, werken van kunst, ontwerpen, en tekeningen en schetsen die buiten de Unie zijn verricht of vervaardigd en die noodzakelijk zijn voor de productie van de ingevoerde goederen',\r\n RoyaltiesAndLicenseFees: 'Royalty\\'s en licentierechten met betrekking tot de goederen waarvan de waarde wordt bepaald, die de koper als voorwaarde voor de verkoop van deze goederen direct of indirect moet betalen',\r\n DeliveryCosts: 'Leveringskosten',\r\n ValueOfResaleDisposalOrUseThatAccruesToSeller: 'Waarde van elk deel van de opbrengst van elke latere wederverkoop, overdracht of gebruik van de ingevoerde goederen dat de verkoper direct of indirect ten goede komt',\r\n TransportCostsBeforeEntryIntoCustomsTerritory: 'Vervoerskosten vóór binnenkomst in douanegebied van de Unie',\r\n InsuranceCostsBeforeEntryIntoCustomsTerritory: 'Verzekeringskosten vóór binnenkomst in douanegebied van de Unie',\r\n LoadingAndHandlingChargesBeforeEntryIntoCustomsTerritory: 'Kosten van het laden en behandelen van de ingevoerde goederen die verband houden met het vervoer vóór binnenkomst in douanegebied van de Unie',\r\n OtherAdditions: 'Overige verhogingen',\r\n \r\n Deductions: 'Verlagingen',\r\n \r\n TransportCostsAfterEntryIntoCustomsTerritory: 'Vervoerskosten na binnenkomst in douanegebied van de Unie en aanverwante kosten, zoals de buitenboordlossingskosten, verzekeringskosten, kosten voor het laden, kosten voor handling en de kosten voor het brengen in het vrije verkeer (documentkosten)',\r\n ChargesForConstructionErectionAssemblyMaintenanceOrTechnicalAssistance: 'Kosten van constructiewerkzaamheden, installatie, montage, onderhoud of technische bijstand welke met betrekking tot ingevoerde goederen, zoals industriële installaties, machines of materieel, na de binnenkomst ervan in het douanegebied van de Unie zijn verricht',\r\n ChargesForInterest: 'Te betalen rente uit hoofde van een door de koper in verband met de aankoop van ingevoerde goederen gesloten financieringsovereenkomst',\r\n ChargesForRightToReproduce: 'Kosten ter verkrijging van het recht tot verveelvoudiging van de in de Unie ingevoerde goederen',\r\n BuyingCommisions: 'Inkoopcommissies',\r\n ImportDuties: 'Rechten bij invoer en andere belastingen die in de Unie vanwege de invoer of de verkoop van de goederen dienen te worden voldaan',\r\n PaymentsMadeForRightToDistributeOrResell: 'Door de koper verrichte betalingen ter verkrijging van het recht tot distributie of wederverkoop van de ingevoerde goederen, indien deze betalingen geen voorwaarde zijn voor de verkoop van de goederen voor uitvoer naar de Unie',\r\n OtherDeductions: 'Overige verlagingen',\r\n\r\n // Article 86.1 UCC\r\n HelpForOtherDeductions: 'Bijvoorbeeld: kosten voor opslag en voor gebruikelijke behandelingen in de Unie gedurende de opslag in een douane-entrepot of een ruimte voor tijdelijke opslag.',\r\n\r\n Method: 'Methode',\r\n CalculateValue: 'Waarde berekenen',\r\n EnterValue: 'Waarde invoeren',\r\n\r\n Price: 'Prijs',\r\n PriceActuallyPaidOrPayable: 'Werkelijk betaalde of te betalen prijs',\r\n Result: 'Resultaat',\r\n TransactionValue: 'Transactiewaarde',\r\n TransactionValueCalculator: 'Calculator transactiewaarde'\r\n};\r\n","module.exports = {\r\n exampleText: 'bijvoorbeeld: 22030009 of 6911100090 import cn',\r\n landingPage: {\r\n dynamic: {\r\n DE: 'Naar het Duitse douanetarief (EZT)',\r\n EU: 'Naar het Europese douanetarief (TARIC)',\r\n BE: 'Naar het Belgische douanetarief (TARBEL)',\r\n NL: 'Naar het Nederlandse douanetarief (DTV)',\r\n CH: 'Naar het Zwitserse douanetarief (TARES)',\r\n GB: 'Naar het UK Global Tariff (UKGT)',\r\n SE: 'Naar het Zweedse douanetarief',\r\n IT: 'Naar het Italiaanse douanetarief'\r\n }\r\n },\r\n RecentChanges: 'Recente wijzigingen',\r\n RecentCodes: 'Recente codes'\r\n};\r\n","module.exports = {\r\n abc: {\r\n intro: 'Met Taric Support ABC kunt u met één druk op de knop artikelstambestanden, order-manifesten en aangiftes controleren en aanvullen met data uit het douanetarief. Wat dagen kostte, kost nu minuten.

Hoe het werkt? Upload een bestand, kies een controle en druk op start. Seconden later kunt u een bestand downloaden met allerlei nuttige data.

Taric Support ABC combineert de kracht van onze API met de flexibiliteit van het up- en downloaden van Excel-bestanden'\r\n },\r\n abcNew: {\r\n file: 'Kies een Excel-bestand om te controleren en te verrijken',\r\n inputOptions: 'Geef aan in welke kolommen van het Excel-bestand welk type data gevonden kan worden en op welke rij de data begint.',\r\n outputOptions: 'Kies of u een controle wilt doen voor invoer- of uitvoeraangiftes, wat voor type controle u wilt doen en in welk bestandsformaat u het resultaat wilt hebben.',\r\n letsGo: 'Starten maar!',\r\n },\r\n caseLaw: {\r\n intro: 'Onder het kopje \"Nieuws\" vindt u de laatste Nederlandse en Europese uitspraken.

Onder de kopjes \"Nederlandse rechtspraak\" en \"Europese rechtspraak\" vindt u een geavanceerde zoekfunctie om snel de relevante jurisprudentie te vinden.',\r\n },\r\n chapter: {\r\n intro: 'Op deze pagina kunt u door een hoofdstuk bladeren. Daarnaast zijn er een hoop bronnen om u te helpen bij het indelingsproces.',\r\n heading: 'Klik op een post of onderverdeling om deze in/uit te klappen.
Hint: dubbel-klik om ook alle onderverdelingen in/uit te klappen.',\r\n chapterButtons: \r\n 'De volgende bronnen zijn beschikbaar - u ziet steeds de informatie de betrekking heeft op het huidige hoofdstuk' +\r\n '',\r\n headingButtons: \r\n 'Deze bronnen zijn ook beschikbaar voor elke post - en elders in de applicatie. ' + \r\n 'Om ruimte te besparen, gebruiken we steeds alleen de eerste letter voor een knop. ' +\r\n 'Het went snel maar mocht u vergeten zijn waar zo\\'n letter voor staat: als u met uw muis boven een knop hangt, dan ziet u wat de knop doet.'\r\n },\r\n chapters: {\r\n intro: \r\n 'Dit is de startpagina van de module classificatie en tarief. ' + \r\n 'Op deze pagina kunt u door de afdelingen en hoofdstukken van de nomenclatuur bladeren, of het tarief doorzoeken via de zoekbox.',\r\n largeSearchBox: 'Zoek op goederencode of zoekwoord via deze zoekbox of die bovenaan de pagina.

Hint: om sneller te zoeken, kunt u de woorden \"import\" en \"export\" gebruiken om meteen aan te geven of u een zoekopdracht doet voor invoer of uitvoer. U kunt ook meteen een landcode of landnaam invullen.',\r\n sectionNotesAndExplanatoryNotes: 'NB: om te bepalen of een goed ingedeeld kan worden in een bepaalde afdeling of een bepaald hoofdstuk, ' + \r\n 'moet u altijd de (wettelijk bindende) aantekeningen bij de afdelingen en hoofdstukken lezen. U vindt deze door te klikken op de knop gemarkeerd met de letter A voor Aantekeningen.

' +\r\n 'Daarnaast zijn de toelichtingen die gepubliceerd worden door de WCO en de EU, hoewel niet wettelijk bindend, onmisbare hulpmiddelen om te bepalen welke goederen nu wel of niet onder ' +\r\n 'een bepaalde afdeling, hoofdstuk, post of onderverdeling vallen. U kunt ze vinden door te klikken op de knop gemarkeerd met de letter T voor Toelichtingen.',\r\n },\r\n correlationTable: {\r\n intro: 'Zoek de voorlopers van nieuwe goederencodes en de opvolgers van verlopen goederencodes.

U kunt zoeken op basis van start- of einddatum of op basis van goederencode (u kunt hier ook kiezen voor een hoofdstuk, post of onderverdeling).',\r\n searchSuccessors: 'Klik hier om opvolgers van verlopen goederencodes te bekijken.

NB: een opvolger van een verlopen code is niet noodzakelijk een nieuwe code. Het kan ook een al langer bestaande code zijn, waar goederen aan worden toegevoegd.',\r\n searchOriginators: 'Klik hier om voorlopers van nieuwe goederencodes te bekijken.

NB: een voorloper van een nieuwe code eindigt niet noodzakelijk. Het kan ook dat een deel van de goederen onder de nieuwe code valt en een deel nog steeds onder de oude code.'\r\n },\r\n ebti: {\r\n intro: 'Organisaties in de EU kunnen een verzoek om een bindend indelingsadvies indienen bij hun nationale douaneautoriteiten. Dit worden BTI\\'s genoemd. Ze zijn een uitermate handig hulpmiddel bij het bepalen van de juiste classificatie van uw product. Als u voor hetzelfde product aangifte doet, heeft het immers waarschijnlijk dezelfde classificatie.

Taric Support helpt u met een totaaloverzicht van alle afgegeven BTI\\'s in Europa met bijbehorende foto\\'s en tekeningen, inclusief een historie van BTI\\'s die niet meer geldig zijn. Deze BTI\\'s zijn, net als de rest van de informatie, gemakkelijk te vinden op basis van de relevante goederencode.',\r\n form:\r\n 'Met het zoekformulier voor BTI\\'s kunt u zoeken op goederencode (hoofdstuk, post, onderverdeling), maar ook op zoekwoord of omschrijving van de goederen, bijvoorbeeld.

' + \r\n 'NB: u kunt BTIs sorteren op goederencode, maar bijvoorbeeld ook op datum, waardoor u een nieuwsoverzicht krijgt met de laatste BTIs, of het veld \"Afgegeven sinds\" gebruiken om alleen recente BTI\\'s te tonen.

' +\r\n 'NB: u kunt de resultaten ook bekijken als afbeeldingen. Vaak kan het bekijken van een lijst van plaatjes een snelle manier zijn om te zien of een bepaald stuk van de nomenclatuur toepasselijk is voor het goed dat u aan het indelen bent'\r\n },\r\n atr: {\r\n intro: 'Organisaties in het Verenigd Koninkrijk kunnen een verzoek om een bindend indelingsadvies indienen bij hun nationale douaneautoriteiten. Dit worden ATR\\'s (Advance Tariff Rulings) genoemd. Ze zijn een uitermate handig hulpmiddel bij het bepalen van de juiste classificatie van uw product. Als u voor hetzelfde product aangifte doet, heeft het immers waarschijnlijk dezelfde classificatie.

Taric Support helpt u met een totaaloverzicht van alle afgegeven ATR\\'s in het Verenigd Koninkrijk met bijbehorende foto\\'s en tekeningen, inclusief een historie van ATR\\'s die niet meer geldig zijn. Deze ATR\\'s zijn, net als de rest van de informatie, gemakkelijk te vinden op basis van de relevante goederencode.',\r\n form:\r\n 'Met het zoekformulier voor ATR\\'s kunt u zoeken op goederencode (hoofdstuk, post, onderverdeling), maar ook op zoekwoord of omschrijving van de goederen, bijvoorbeeld.

' + \r\n 'NB: u kunt ATR\\'s sorteren op goederencode, maar bijvoorbeeld ook op datum, waardoor u een nieuwsoverzicht krijgt met de laatste ATR\\'s, of het veld \"Afgegeven sinds\" gebruiken om alleen recente ATR\\'s te tonen.

' +\r\n 'NB: u kunt de resultaten ook bekijken als afbeeldingen. Vaak kan het bekijken van een lijst van plaatjes een snelle manier zijn om te zien of een bepaald stuk van de nomenclatuur toepasselijk is voor het goed dat u aan het indelen bent'\r\n },\r\n header: {\r\n referenceDatePicker: 'Gebruik de datumkiezer om in te stellen voor welke datum u nomenclatuur, tarieven en maatregelen wilt bekijken.',\r\n tradeMovementPicker: 'Kies import of export om nomenclatuur en maatregelen te bekijken voor invoer of uitvoer.',\r\n languagePicker: \r\n 'Kies één van 22 Europese talen. '+ \r\n 'NB: de ondersteunde talen voor de interface zijn Nederlands en Engels, maar het grootste deel van de informatie is in alle 22 talen beschikbaar. ' +\r\n 'Handig voor als een klant, leverancier of collega een andere moedertaal heeft.',\r\n },\r\n landingPage: {\r\n welcomeTitle: 'Welkom / Welcome',\r\n welcomeIntro: \r\n 'Hallo! Welkom bij Taric Support. Bedankt voor het gebruiken van onze applicatie. Laten we even rondkijken.

' + \r\n 'Als u liever in een andere taal doorgaat, klik dan op de knop hierboven om één van de 22 mogelijke talen te kiezen.


' +\r\n 'Hello and welcome to Taric Support. Thank you for using our application. Please let us show you around.

' +\r\n 'If you\\'d prefer to continue in a different language, please click the button above to choose one of 22 possible languages.',\r\n referenceCountryPicker:\r\n 'De belangrijkste databronnen voor Taric Support zijn een aantal verschillende douanetarieven. Door op één van de vlaggen te klikken kunt u wisselen van douanetarief.

' + \r\n 'Deze keuze beïnvloedt zowel de nomenclatuur die u gebruikt voor het classificeren als de maatregelen voor in- en uitvoer die u te zien krijgt. ' +\r\n 'De nomenclatuur voor het UK Global Tariff is bijvoorbeeld niet hetzelfde als de nomenclatuur voor TARIC, het douanetarief van de EU.

' +\r\n 'NB: u kunt op elk moment wisselen van douanetarief door te klikken op de vlaggen in de menubalk.',\r\n introButton:\r\n 'Om meer informatie te krijgen over een bepaalde pagina, kunt u klikken op de introknop'\r\n },\r\n mainMenu: {\r\n intro: 'Via het menu krijgt u toegang tot de verschillende modules binnen uw abonnement.

Tip: gebruik de Enter-toets om door deze introductie te gaan.',\r\n chapters: 'Blader door de nomenclatuur en het douanetarief. U kunt hier ook direct in zoeken via de zoekbox in de menubalk.',\r\n news: 'Het laatste douanenieuws',\r\n ebti: 'De volledige EBTI-database: honderdduizenden voorbeelden van producten die door de douane zijn geclassificeerd',\r\n abc: 'Controleer en verrijk honderden codes per minuut met Taric Support ABC',\r\n correlationTable: 'Vind de voorlopers en opvolgers van goederencodes',\r\n referencePrices: 'Een complete lijst van de dagelijkse forfaitaire invoerwaardes en eenheidsprijzen voor groenten en fruit',\r\n caseLaw: 'Nederlandse en Europese douanerechtspraak.'\r\n },\r\n measures: {\r\n intro: \r\n 'Hier ziet u de maatregelen die gelden bij in- of uitvoer van een goed met deze goederencode.

' +\r\n 'Hierbij maken we gebruik van een aantal verschillende kleuren om u te helpen snel de verschillende types codes te herkennen. ' +\r\n 'Op deze manier kunnen we een veelheid aan informatie op een compacte manier weergeven. De kleuren zijn als volgt:

' +\r\n '',\r\n form:\r\n 'Met behulp van deze velden kunt u de maatregelen filteren op landcode, aanvullende codes toepassen en een keuze maken wat betreft het toe te passen invoerrecht.

' +\r\n 'Hint: het is ook mogelijk om de code of naam van het land meteen in de zoekbox in de bovenbalk te typen.',\r\n validateDeclaration:\r\n 'In dit scherm kunt u de gegevens voor een douane-aangifteregel controleren. Filter eerst op landcode, pas aanvullende codes toe ' +\r\n 'en maak een keuze voor wat betreft het toe te passen invoerrecht. Vul daarna de douanewaarde en de relevante hoeveelheden in. Kies tot slot de toepasbare ' +\r\n 'codes voor bijzondere bepalingen (Y-codes) en overige bescheidcodes en start de controle.',\r\n calculateDuty:\r\n 'In dit scherm kunt u de invoerrechten en (voor bepaalde landen) de nationale belastingen berekenen. Filter eerst op landcode, pas aanvullende codes toe ' +\r\n 'en maak een keuze voor wat betreft het toe te passen invoerrecht. Vul daarna de douanewaarde en de relevante hoeveelheden in. Kies tot slot de toepasbare ' +\r\n 'codes voor bijzondere bepalingen (Y-codes) en overige bescheidcodes en druk op de knop \"Bereken rechten\".',\r\n },\r\n news: {\r\n intro: \r\n 'Onder \"Wetgeving EU\" vindt u de laatste regelgeving en aankondigingen van EUR-Lex. ' +\r\n 'Onder \"Rechtspraak\" vindt u de laatste Nederlandse en Europese uitspraken.

' + \r\n 'Onder \"Douane voor bedrijven\" vindt u nieuwsberichten van de Nederlandse douane'\r\n },\r\n ui: {\r\n done: 'Einde',\r\n help: 'Help',\r\n next: 'Volgende',\r\n previous: 'Vorige',\r\n startTour: 'Intro'\r\n },\r\n};","module.exports = {\r\n CAS_RN: 'CAS RN',\r\n ChemicalsSearch: 'Zoek chemische stoffen',\r\n Characteristic: 'Kenmerk',\r\n Characteristics: 'Kenmerken',\r\n Comment: 'Opmerking',\r\n CUS: 'CUS',\r\n EC_Number: 'EC-nummer',\r\n Ecics: 'ECICS',\r\n EcicsDetails: 'ECICS-details',\r\n EcicsLinkText: 'Klik hier om dit item te openen in de ECICS-database.',\r\n InChI: 'InChI',\r\n InChIKey: 'InChI-sleutel',\r\n LanguageCode: 'Taalcode',\r\n Level: 'Niveau',\r\n Name: 'Naam',\r\n Names: 'Namen',\r\n Nomenclature: 'Nomenclatuur',\r\n Order: 'Volgorde',\r\n SearchEcicsDatabase: 'Zoek in ECICS-database',\r\n UN_Number: 'UN-Nummer',\r\n};","module.exports = {\r\n Currency: 'Munteenheid',\r\n CurrencyCode: 'Code munteenheid',\r\n CurrencyCodeModalTitle: 'Kies een munteenheid',\r\n CurrencyCodeTypeaheadPlaceholder: 'Zoek op code of naam munteenheid',\r\n CurrencyConversionResults: 'Resultaat van omrekening valuta',\r\n CurrencyName: 'Naam munteenheid',\r\n ExchangeRates: 'Wisselkoersen',\r\n NumberOfDecimalPlaces: 'Aantal cijfers achter de komma',\r\n UseTheFieldsBelowToConvertBetween_and_: 'Gebruik de velden hieronder om bedragen om te rekenen tussen {{ inverseMonetaryValue.unit }} en {{ monetaryValue.unit }}',\r\n};\r\n","module.exports = {\r\n ChooseNationalCommodityCodeToFindVatRate: 'Kies hierboven een nationale goederencode om de het juiste btw-tarief te vinden.',\r\n ChooseExciseCodeToFindExciseRates: 'Kies hierboven een accijnscode om het juiste accijnstarief te vinden.',\r\n ExciseCode: 'Accijnscode',\r\n ExplanatoryNotesProvidedByGermanCustoms: 'Toelichtingen beschikbaar gesteld door de Duitse douane',\r\n ExciseDutyRate: 'Tarief accijns',\r\n EztExciseCodeFieldPlaceHolder: 'Vul accijnscode in of zoek',\r\n EztExciseCodeSelectorModalTitle: 'Nomenclatuur accijns',\r\n GermanExplanatoryNotes: 'Toelichtingen Duitsland',\r\n Hinweise: 'Hinweise',\r\n NationalCommodityCode: 'Nationale goederencode',\r\n NationalNomenclature: 'Nationale nomenclatuur',\r\n TextsPublishedByGermanCustoms: 'Teksten gepubliceerd door Duitse douane',\r\n TextsGermanCustoms: 'Teksten Duitse douane'\r\n};","module.exports = {\r\n EuMemberState: 'EU-lidstaat'\r\n};","module.exports = {\r\n tabs: {\r\n Measures: 'Maatregelen',\r\n ValidateDeclaration: 'Valideer aangifte',\r\n CalculateDuty: 'Bereken rechten'\r\n },\r\n form: {\r\n legendValue: 'Waarde',\r\n radioMethodLabel: 'Methode',\t\r\n radioMethodOptionCalculateValue: 'Waarde berekenen',\r\n radioMethodOptonEnterValue: 'Waarde invoeren'\r\n },\r\n financialConditions: {\r\n E: {\r\n title: 'De aangegeven hoeveelheid of prijs per eenheid, naar gelang het geval, is gelijk aan of minder dan het aangeduide maximum, anders overlegging van het vereiste document',\r\n headers: {\r\n col1: 'Hoeveelheid of prijs per eenheid',\r\n col2: 'Tarief'\r\n }\r\n },\r\n F: {\r\n title: 'Tarief op basis van netto prijs franco grens, vóór inklaring',\r\n headers: {\r\n col1: 'Netto prijs franco grens, vóór inklaring',\r\n col2: 'Tarief'\r\n }\r\n },\r\n L: {\r\n title: 'De CIF-prijs moet hoger zijn dan de minimumprijs',\r\n headers: {\r\n col1: 'CIF-prijs',\r\n col2: 'Tarief'\r\n }\r\n },\r\n M: {\r\n title: 'De invoerprijs moet gelijk zijn aan of hoger dan de minimumprijs/referentieprijs',\r\n headers: {\r\n col1: 'Invoerprijs',\r\n col2: 'Tarief'\r\n }\r\n },\r\n V: {\r\n title: 'De invoerprijs dient gelijk te zijn of hoger dan de ingangprijs',\r\n headers: {\r\n col1: 'Invoerprijs',\r\n col2: 'Tarief'\r\n }\r\n }\r\n },\r\n meursing: {\r\n calculateDescription: 'Vul onderstaande gegevens in om de aanvullende code voor het berekenen van het agrarisch element op te vragen.',\r\n calculateTitle: 'Aanvullende code agrarisch element berekenen',\r\n impossibleCombination: 'Onmogelijke combinatie van ingredienten (totaal gewicht boven 100%)',\r\n milkfat: 'Melkvet (% gewicht)',\r\n milkproteins: 'Melkproteïnen (% gewicht)',\r\n saccharin: 'Saccharose/invertsuiker/isoglucose (% gewicht)',\r\n starchGlucose: 'Zetmeel/glucose (% gewicht)',\r\n }\r\n};\r\n","module.exports = {\r\n Chapters: 'Hoofdstukken',\r\n Search: 'Zoeken',\r\n News: 'Nieuws',\r\n BindingTariffInformation: 'Bindende tariefinlichtingen',\t\r\n ChemicalsSearch: 'Zoek chemische stoffen',\r\n ValidateBusinessInformation: 'Valideer bedrijfsinformatie',\t\r\n AdvanceTariffRulings: 'Advance Tariff Rulings',\r\n TaricSupportABC: 'ABC - Bestandscontrole',\r\n CorrelationTable: 'Transponeringstabel',\r\n TradeStatistics: 'Handelsstatistieken',\r\n TransactionValue: 'Transactiewaarde',\r\n ReferencePrices: 'Referentieprijzen EU',\r\n CaseLaw: 'Rechtspraak',\r\n TextsByGermanCustoms: 'Teksten Duitse douane',\r\n ReferenceLists: 'Referentielijsten',\r\n AdditionalCodes: 'Aanvullende codes',\r\n CertificateCodes: 'Bescheidcodes',\r\n Footnotes: 'Voetnoten',\r\n Regions: 'Regio\\'s',\r\n ExchangeRates: 'Wisselkoersen',\r\n ChangePassword: 'Wachtwoord wijzigen',\r\n Logout: 'Uitloggen',\r\n Favorites: 'Favorieten',\t\r\n};","module.exports = {\r\n DutchCustomsNewsFeed: 'Douane voor bedrijven',\r\n NewsOverview: 'Nieuwsoverzicht',\r\n OpenInTaricSupport: 'Open in Taric Support'\r\n};","module.exports = {\r\n Annotations: 'Aantekeningen',\r\n AnnotationsFirstLetter: 'A',\r\n\r\n Chapter: 'Hoofdstuk',\r\n Chapters: 'Hoofdstukken',\r\n Chapter_code_: 'Hoofdstuk {{ code }}',\r\n Chapter_GoodsCodeOrSectionNumber_: 'Hoofdstuk {{ GoodsCodeOrSectionNumber }}',\r\n \r\n CombinedNomenclature: 'Gecombineerde nomenclatuur',\r\n\r\n CommodityClassification: 'Classificatie goederen',\r\n CommodityCode: 'Goederencode',\r\n CommodityCodes: 'Goederencodes',\r\n CommodityCodesFoundInText: 'Goederencodes gevonden in tekst',\r\n\r\n Heading: 'Post',\r\n Heading_code_: 'Post {{ code }}',\r\n Heading_GoodsCodeOrSectionNumber_: 'Post {{ GoodsCodeOrSectionNumber }}',\r\n Headings: 'Posten',\r\n\r\n Section: 'Afdeling',\r\n Section_number_: 'Afdeling {{ number }}',\t\r\n Section_GoodsCodeOrSectionNumber_: 'Afdeling {{ GoodsCodeOrSectionNumber }}',\t\r\n Sections: 'Afdelingen',\r\n\r\n SubChapter_GoodsCodeOrSectionNumber_: 'Sub-hoofdstuk {{ GoodsCodeOrSectionNumber }}',\r\n\r\n Subheading: 'Onderverdeling',\r\n\r\n WcoClassificationOpinions: 'WCO Classification Opinions',\r\n Classifications: 'Tariferingen',\r\n ExplanatoryNotesFirstLetter: 'T',\r\n ExplanatoryNotes: 'Toelichtingen',\r\n ExplanatoryNotesCn: 'GN-toelichtingen - EU',\r\n ExplanatoryNotesHs: 'GS-toelichtingen - WCO',\r\n Nomenclature: 'Nomenclatuur',\r\n NomenclatureGroups: 'Nomenclatuurgroepen',\r\n NomenclatureHeadings: 'Nomenclatuur - Posten',\r\n NomenclatureHeading_code_: 'Nomenclatuur - Post {{ code }}',\r\n\r\n SectionAndChapterNotes: 'Aantekeningen nomenclatuur',\r\n};","module.exports = {\r\n orderNumberPrefix: 'order:',\r\n orderNumber: {\r\n balance: 'Saldo',\r\n changeDate: 'Datum wijziging',\r\n critical: 'Kritiek',\r\n currentVolume: 'Beschikbare hoeveelheid',\r\n endDate: 'Einddatum',\r\n initialVolume: 'Oorspronkelijke hoeveelheid',\r\n measurementUnit: 'Maatstaf',\r\n noQuota: 'Er is geen contingent gevonden voor dit ordernummer.',\r\n noStatus: 'Er is geen status-informatie beschikbaar',\r\n periodStartDate: 'Begindatum periode',\r\n region: 'Geografisch gebied',\r\n startDate: 'Ingangsdatum',\r\n status: 'Status',\r\n },\r\n quotaStatus: {\r\n block: 'Geblokkeerd',\r\n critical: 'Kritiek',\r\n exhaustion: 'Uitgeput',\r\n reopening: 'Heropend',\r\n resume: 'Hervat',\r\n start: 'Geopend',\r\n suspension: 'Geschorst',\r\n unblocking: 'Blokkering opgeheven',\r\n unsuspension: 'Schorsing opgeheven'\r\n }\r\n};\r\n","module.exports = {\r\n NoAccess: '

Voor toegang tot deze data is een extra abonnement vereist.

' +\r\n '

In deze module vindt u een compleet overzicht van de referentieprijzen voor landbouwproducten. ' +\r\n 'U vind hier elke dag de laatste dagwaardes, forfaitaire invoerwaarden en eenheidsprijzen.

' +\r\n '

Voor toegang is een apart abonnement vereist. Neem contact op met Taric Support als u interesse heeft.

' +\r\n '

Hieronder vindt u een voorbeeld van de data die beschikbaar is. NB: dit voorbeeld is geen actuele data.

',\r\n overview: {\r\n EndDate: 'Stopt op',\r\n NoPrices: 'Er konden op dit moment geen referentieprijzen gevonden worden',\r\n StandardImportValues: 'Forfaitaire invoerwaardes',\r\n StartDate: 'Start op',\r\n Title: 'Referentieprijzen EU',\r\n UnitPrices: 'Eenheidswaardes'\r\n }\r\n};","module.exports = {\r\n ActiveTaricMeasures: 'Actieve TARIC-maatregelen',\r\n BaseRegulation: 'Basisverordening',\r\n BaseRegulations: 'Basisverordeningen',\r\n ChangedBy: 'Gewijzigd door',\r\n ClassificationReference: 'Referentie naar tarifering van post',\r\n ClassificationInLegalActsDirectory: 'Indeling in het repertorium',\r\n CountryRegion: 'Land/Regio',\r\n DocumentNotFound: 'Document niet gevonden',\r\n GoBackToTheOverview: 'Ga terug naar het overzicht',\r\n HereAreAFewThings: 'Hier zijn een aantal mogelijke vervolgstappen.',\r\n InForce: 'Van kracht',\r\n ModificationRegulation: 'Wijzigingsverordening',\r\n ModificationRegulations: 'Wijzigingsverordeningen',\r\n Name: 'Naam',\r\n NoModificationRegulations: 'Geen wijzigingsverordeningen',\r\n Note: 'Nota',\r\n Note_CELEX_: 'Nota {{ CELEX }}',\r\n OfficialJournal: 'Publicatieblad',\r\n OJ: 'Pb',\r\n OpenDetails: 'Open details',\r\n OpenDocumentOnEurLex: 'Open document op EUR-Lex',\r\n Page: 'Pag.',\r\n PubNo: 'Pb nr.',\r\n PubDate: 'Publ. datum',\r\n PublicationDate: 'Publicatiedatum',\r\n PubPage: 'Publ. blad',\r\n _count_publicationsFound: '{{ count }} publicaties gevonden',\r\n Regulation: 'Verordening',\r\n Regulation_CELEX_: 'Verordening {{ CELEX }}',\r\n Regulations: 'Verordeningen',\r\n ResourceType: 'Type document',\r\n SearchEurLexFor: 'Zoek op EUR-Lex naar',\r\n ThereIsNoDocument_celex_: 'Er is geen document in onze application met CELEX gelijk aan {{ celex }}',\r\n ModalTitle: 'Wet- en regelgeving',\r\n consolidated: 'verwerkt in bovenstaande tekst',\r\n unconsolidated: 'niet verwerkt in bovenstaande tekst',\r\n};\r\n","module.exports = {\r\n AlsoSearchIn: 'Zoek ook in',\r\n AlphabeticalIndex: 'Alfabetische Index',\r\n AlphabeticalIndexNotAvailableInChosenLanguage: 'Zoeken in de alfabetische index is mogelijk in het Engels en in het Duits. Kies één van deze talen om deze te doorzoeken.',\r\n CaseLawNoAccessMessage: 'Neem contact op met Taric Support voor toegang tot de module rechtspraak',\r\n CommodityCodeDescriptions: 'Omschrijvingen goederencodes',\r\n AdditionalDataSources: 'Additionele databronnen',\r\n SearchCccConclusions: 'Zoek conclusies CDW',\r\n Conclusion_Nav: 'Conclusies CDW',\r\n Documents: 'Documenten',\r\n BrowseChapter_chapterCode_: 'Blader in hoofdstuk {{ chapterCode }}',\r\n GoToChapter_code_: 'Ga naar hoofdstuk {{ code }}',\r\n NoSearchResultsFor_QueryString_FoundInHeading_Heading_: 'Geen zoekresultaten voor \"{{ QueryString }}\" gevonden in post {{ Heading }}',\r\n SearchResultsFor_QueryString_FoundInHeading_Heading_: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden in post {{ Heading }}',\r\n _commodityCode_isNotAValidCommodityCode: '{{ commodityCode }} is geen geldige goederencode',\r\n SearchForSuccessors: 'Zoek opvolgers',\r\n SearchForOriginators: 'Zoek voorlopers',\r\n \r\n noResult: 'Er is geen resultaat gevonden voor uw zoekopdracht',\r\n ClosestExistingParentMessage: 'Goederencode {{ closestExistingParentCommodityCode | stripTaricCode | formatTaricCode }} – zie onder – bestaat wel.',\r\n \r\n NoResultsFoundForYourSearchQuery_QueryString_: 'Er is geen resultaat gevonden voor uw zoekopdracht \"{{ QueryString }}\"',\r\n NoResultsFoundForYourSearchQuery_QueryString_FoundInChapter_Code_: 'Er is geen resultaat gevonden voor uw zoekopdracht \"{{ QueryString }}\" in hoofdstuk {{ Code }}.',\r\n\r\n Opinion_Number_: 'Advies {{ Number }}', // Short For WCO Classification Opinion\r\n \r\n SearchResultsFor_QueryString_: 'Zoekresultaten voor \"{{ QueryString }}\"',\r\n SearchResultsFor_QueryString_FoundInAlphabeticalIndex: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden in de alfabetische index',\r\n SearchResultsFor_QueryString_FoundInCode: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden onder code',\r\n SearchResultsFor_QueryString_FoundInHeading: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden in post',\r\n SearchResultsFor_QueryString_FoundInHeadings: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden in de volgende posten',\r\n SearchResultsFor_QueryString_FoundInHeadingsInChapter_Code_: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden in de volgende posten in hoofdstuk {{ Code }}',\r\n SearchResultsFor_QueryString_FoundInAnnotations: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden in de volgende aantekeningen',\r\n SearchResultsFor_QueryString_FoundInEuExplanatoryNotes: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden in de volgende toelichtingen van de EU',\r\n SearchResultsFor_QueryString_FoundInExplanatoryNotesGermany: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden in de volgende toelichtingen gepubliceerd door de Duitse douane',\r\n SearchResultsFor_QueryString_FoundInTextsGermanCustoms: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden in de volgende teksten gepubliceerd door de Duitse douane',\r\n SearchResultsFor_QueryString_FoundInWcoExplanatoryNotes: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden in de volgende toelichtingen bij het Geharmoniseerd Systeem van de WDO',\r\n SearchResultsFor_QueryString_FoundInWcoClassificationOpinions: 'Zoekresultaten voor \"{{ QueryString }}\" gevonden in de volgende classification opinions van de WDO',\r\n \r\n SearchNomenclature: 'Zoek in nomenclatuur',\r\n SearchAlphabeticalIndex: 'Zoek in alfabetische index',\r\n SearchEUClassificationRegulations: 'Zoek in indelingsverordeningen EU',\r\n SearchSectionAndChapterNotes: 'Zoek in aantekeningen bij afdelingen en hoofdstukken',\r\n SearchEUExplanatoryNotes: 'Zoek in toelichtingen EU',\r\n SearchExplanatoryNotesGermany: 'Zoek in toelichtingen Duitsland',\r\n SearchTextsGermanCustoms: 'Zoek in teksten gepubliceerd door de Duitse douane',\r\n SearchWCOExplanatoryNotes: 'Zoek in HS-toelichtingen WCO',\r\n SearchWCOClassificationOpinions: 'Zoek in indelingsadviezen WCO',\r\n TryOneOfTheFollowingActions: 'U kunt één van de volgende acties proberen',\r\n WcoExplanatoryNotesNotAvailableInChosenLanguage: 'De HS-toelichtingen van de WDO (Werelddouaneorganisatie) zijn beschikbaar in het Engels en het Frans. Kies één van deze talen om ze te doorzoeken.',\r\n WcoClassificationOpinionsNotAvailableInChosenLanguage: 'De classification opinions van de WDO (Werelddouaneorganisatie) zijn beschikbaar in het Engels en het Frans. Kies één van deze talen om ze te doorzoeken.'\r\n};\r\n","module.exports = {\r\n historicSearchWarning: 'Let op: de datum is niet ingesteld op vandaag',\r\n loggingOut: 'Uw account wordt op een andere locatie gebruikt. Het is niet mogelijk om hetzelfde account vanaf meerdere locaties te gebruiken. U wordt uitgelogd.',\r\n PleaseContactTaricSupportForAccessToTradeTariff: 'Neem contact op met Taric Support voor toegang tot het douanetarief van dit land.',\r\n unauthorized: 'Uw account beschikt niet over de juiste rechten om deze functionaliteit te gebruiken.',\r\n pickCountryForVatRates: 'Kies een land om de btw-tarieven te zien',\r\n DataNotAvailableForSwissTradeTariff: 'Deze gegevens zijn niet beschibaar voor het Zwitserse douanetarief.',\r\n ExchangeRatesNotAvailableForSwissTradeTariff: 'De wisselkoersen zijn op het moment niet beschikbaar voor het Zwitserse douanetarief. Als u interesse heeft in deze module, neem dan contact met ons op.',\r\n TransactionValueCalculatorNotAvailableForSwissTradeTariff: 'De transactiewaardecalculator is op het moment niet beschikbaar voor het Zwitserse douanetarief.',\r\n textNewerThanRequested_StartDate_: 'NB: deze tekst is niet beschikbaar voor de door u gekozen datum. De onderstaande tekst is een latere versie, geldig vanaf {{ StartDate | date : \\'dd-MM-yyyy\\' }}.',\r\n NoWcoAccessMessage: 'Voor toegang tot de Toelichtingen en Indelingsadviezen van de WCO is een apart abonnement nodig. Neem contact met ons op voor meer informatie.',\r\n};\r\n","module.exports = {\r\n buttons: {\r\n Cancel: 'Annuleren',\r\n Close: 'Sluiten',\r\n CollapseAll: 'alles invouwen',\r\n Delete: 'Verwijderen',\r\n Download: 'Download',\t\r\n DownloadPDF: 'Download PDF',\r\n EmptyForm: 'Formulier leegmaken',\r\n ExpandAll: 'alles uitvouwen',\r\n No: 'Nee',\t\r\n OK: 'OK',\t\r\n OpenPDF: 'Open PDF',\r\n Print: 'Afdrukken',\t\r\n Save: 'Opslaan',\r\n Search: 'Zoeken',\r\n Yes: 'Ja'\r\n },\r\n calendar: {\r\n Clear: 'Wissen',\r\n OK: 'OK',\r\n Today: 'Vandaag'\r\n },\r\n placeholders: {\r\n EnterCommodityCode: 'Voer een goederencode in',\r\n Search: 'Zoeken...',\r\n SearchByCountryNameOrCode: 'Zoek op naam of code land',\r\n SearchInText: 'Zoek in tekst',\r\n },\r\n translation: {\r\n ShowOriginal: 'Toon origineel',\r\n Translate: 'Vertaal',\r\n },\r\n areYouSureModalTitle: 'Weet u het zeker?',\r\n \r\n Ascending: 'Oplopend',\r\n Descending: 'Aflopend',\r\n \r\n \r\n Country: 'Land',\r\n Date: 'Datum',\r\n DateFrom: 'Datum van',\r\n DateTo: 'Datum tot',\r\n Description: 'Omschrijving',\r\n favorite: 'favoriet',\r\n favorites: 'Favorieten',\r\n _count_found: '{{ count }} gevonden', // NB: count is a number\r\n Images: 'Afbeeldingen',\r\n List: 'Lijst',\r\n MoreNews: 'Meer nieuws',\r\n News: 'Nieuws',\r\n No: 'Nee',\r\n NoResults: 'Geen resultaten',\r\n OrderBy: 'Sorteren op',\r\n OrderDirection: 'Sorteervolgorde',\r\n Query: 'Zoekopdracht',\r\n Remember: 'Onthouden',\r\n SearchTerm: 'Zoekterm',\r\n ShowResultsAs: 'Toon resultaten als', // show as images or list\r\n Source: 'Bron', // As in 'Source of the information'\r\n TextSearch: 'Zoeken in tekst',\r\n Total: 'Totaal',\r\n ValidityPeriod: 'Periode geldigheid',\r\n ValidFrom: 'Geldig vanaf',\r\n ValidTo: 'Geldig tot',\r\n ValidityStartDate: 'Startdatum geldigheid',\r\n ValidityEndDate: 'Einddatum geldigheid',\r\n StartDate: 'Start Date',\r\n EndDate: 'Einddatum',\r\n Yes: 'Ja'\r\n};\r\n","module.exports = {\r\n CommodityCode_Ascending: 'Goederencode - oplopend',\r\n CommodityCode_Descending: 'Goederencode - aflopend',\r\n CUS_Ascending: 'CUS - oplopend',\r\n CUS_Descending: 'CUS - aflopend',\r\n ValidFrom_Ascending: 'Geldig vanaf - oplopend',\r\n ValidFrom_Descending: 'Geldig vanaf - aflopend',\r\n Relevance_Keywords: 'Relevantie - Sleutelwoorden',\r\n Relevance_GoodsDescription: 'Relevantie - Goederenomschrijving',\r\n Relevance: 'Relevantie',\r\n};","module.exports = {\r\n Version_versionNumber_: 'Versie {{ versionNumber }}',\r\n DataReadOn_lastSuccessfulDatabase_: 'Data vernieuwd op {{ lastSuccessfulDatabase | date: \\'dd-MM HH:mm\\' }}'\r\n};\r\n","module.exports = {\r\n errorMessages: {\r\n ErrorEvaluatingCondition: 'Fout bij controleren maatregelvoorwaarde'\r\n },\r\n measureConditions: {\r\n Action: 'Actie douane',\r\n Amount: 'Hoeveelheid',\r\n Condition: 'Voorwaarde', // As in measure condition - conditions that must be met for a measure to be applicable and/or import/export to be allowed\r\n Description: 'Omschrijving',\r\n DutyRate: 'Tarief',\r\n noAction: 'geen/positief',\r\n noCertificate: 'geen'\r\n },\r\n measureSeries: {\r\n AdditionalDuties: 'Aanvullende invoerrechten',\r\n AntiDumpingMeasures: 'Anti-dumpingmaatregelen',\r\n Duties: 'Invoerrechten',\r\n NationalTaxes: 'Nationale belastingen',\r\n OtherMeasures: 'Andere maatregelen',\r\n Prohibitions: 'Verboden',\r\n ReferencePrices: 'Referentieprijzen',\r\n Restitutions: 'Restituties',\r\n RestrictionsAndControls: 'Restricties en controles',\r\n SupplementaryAmounts: 'Aanvullende bedragen',\r\n SupplementaryUnit: 'Aanvullende eenheid',\r\n VatRates: 'Btw-tarieven',\r\n },\r\n referenceCountries: {\r\n BE: 'België',\r\n CH: 'Zwitserland',\r\n DE: 'Duitsland',\r\n EU: 'Europese Unie',\r\n GB: 'Groot-Brittannië',\r\n IT: 'Italië',\r\n NL: 'Nederland'\r\n },\r\n tradeMovements: {\r\n All: 'Alle',\r\n Export: 'Export',\r\n Import: 'Import'\r\n },\r\n unitTypes: {\r\n Area: 'Oppervlakte',\r\n Energy: 'Energie',\r\n GrossWeight: 'Brutogewicht',\r\n Items: 'Aantal',\r\n Length: 'Lengte',\r\n NetWeight: 'Nettogewicht',\r\n Pairs: 'Aantal paren',\r\n Power: 'Vermogen',\r\n Volume: 'Volume',\r\n Weight: 'Gewicht'\r\n },\r\n AddCertificateCode: 'Bescheidcode toevoegen',\r\n AdditionalCode: 'Aanvullende code',\r\n AdditionalCodesValidationError: 'Fout in aanvullende codes',\r\n AdditionalCodeTypeaheadPlaceholder: 'Zoek op aanvullende code of omschrijving',\r\n AdditionalCodeModalTitle: 'Kies een aanvullende code',\r\n AdditionalCodes: 'Aanvullende codes',\r\n AdditionalCodeTypes: 'Soorten aanvullende codes',\r\n NoAdditionalCode: 'Geen aanvullende code',\r\n NoAdditionalCodesFound: 'Geen aanvullende codes gevonden',\r\n AgriculturalComponents: 'Agrarisch element',\r\n MeursingAdditionalCodePlaceHolder: 'Zoek aanvullende code',\r\n AutonomousTariffSuspensionsMessage: 'Tip: maak gebruik van de autonome tariefschorsing die voor deze goederencode geldt',\r\n CalculateDuty: 'Bereken rechten',\r\n CalculateDutyAndTaxes: 'Bereken rechten',\r\n Certificate: 'Bescheid',\r\n CertificateCodeTypeaheadPlaceholder: 'Zoek op bescheidcode of omschrijving',\r\n CertificateCodeModalTitle: 'Kies een bescheidcode',\r\n CertificateCodes: 'Bescheidcodes',\r\n CertificateCodeTypes: 'Soorten bescheidcodes',\r\n CheckMeasureConditions: 'Controleer maatregelvoorwaarden',\r\n Condition: 'Voorwaarde',\r\n consumptionTaxWarning: 'Waarschuwing: verbruiksbelasting kan van toepassing zijn. U moet dan een nationale aanvullende code invullen. Hieronder kunt u zoeken op nationale aanvullende code.',\r\n Countries: 'Landen',\r\n CountryOfDestination: 'Land van bestemming',\r\n CountryOfOrigin: 'Land van oorsprong',\r\n CountryOrRegion: 'Land of regio',\r\n CustomsValue: 'Douanewaarde',\r\n Declaration: 'Aangifte',\r\n DeclarationCountry: 'Land aangifte',\r\n DeclarationDate: 'Datum aangifte',\r\n Destination: 'Bestemming', // As in 'Destination country'\r\n DutyCalculator: 'Bereken rechten',\r\n DutyCalculationErrors: {\r\n DutyMeasureNotUniqueForPreferenceCode: 'Meerdere maatregelen gevonden voor preferentiecode. Kies voor bijzondere bestemming of niet.',\r\n Header: 'Fout bij berekenen van rechten en belastingen',\r\n InvalidOrMissingQuantity: 'Foute of missende hoeveelheid',\r\n UnsupportedDutyExpression: 'Eén van de maatregelen voor deze berekening bevat een tariefsuitdrukking die niet ondersteund wordt.'\r\n },\r\n DutyCalculationResult: 'Resultaat berekening rechten en belastingen',\r\n DutyMeasureType: 'Type invoerrecht',\r\n EuLegislation: 'Wetgeving EU',\r\n excl: 'behalve',\r\n Excises: 'Accijnzen',\r\n exportRefundNomenclature: 'Restitutie-nomenclatuur',\r\n ExportMeasures: 'Maatregelen uitvoer',\r\n Footnote: 'Voetnoot',\r\n Footnotes: 'Voetnoten',\r\n FootnoteTypes: 'Soorten voetnoten',\r\n GeographicalArea: 'Geografische regio',\r\n GeographicalAreas: 'Geografische regio\\'s',\r\n ImportMeasures: 'Maatregelen invoer',\r\n InformationForOrderNumber: 'Informatie voor ordernummer',\r\n Legislation: 'Wetgeving',\r\n LegislationFirstLetter: 'W',\r\n Measure: 'Maatregel',\r\n Measures: 'Maatregelen',\r\n MeasuresForExportFrom: 'Maatregelen voor uitvoer vanuit',\r\n MeasuresForImportInto: 'Maatregelen voor invoer naar',\r\n MeasuresValidOn: 'Maatregelen geldig op',\r\n MeasureTypeTypeaheadPlaceholder: 'Kies maatregeltype',\r\n MeasureTypeModalTitle: 'Kies maatregeltype',\r\n NationalAdditionalCode: 'Nationale aanvullende code',\r\n noCertificatesFound: 'Geen bescheidcodes gevonden',\r\n noFootnotesFound: 'Geen voetnoten gevonden',\r\n noMeasuresFound: 'Geen maatregelen gevonden',\r\n noResultsForCommodityCodesInPeriod: 'Geen resultaten voor de gekozen goederencodes in het gekozen tijdvak',\r\n OptionalNationalAdditionalCode: 'Optionele nationale aanvullende code',\r\n Origin: 'Oorsprong', // As in 'Country of Origin'\r\n OtherChoices: 'Overige keuzes',\r\n PreferenceCode: 'Preferentiecode',\r\n PreferenceCodeDisplayLabel: 'Weergave preferentiecodes',\r\n PreferenceCodeDisplayLabelPreUcc: 'Vóór UCC',\r\n PreferenceCodeDisplayLabelUcc: 'DMS - UCC',\r\n PreferenceCodeTypeaheadPlaceholder: 'Zoek op preferentiecode of op omschrijving',\r\n PreferenceCodeModalTitle: 'Kies een preferentiecode',\r\n EndUseMeasureIsAllowedWithProcedureCode44: 'De maatregel bijzondere bestemming is toegestaan met douaneregeling 44 \"Bijzondere bestemming\"',\r\n PreferredDutyTreatment: 'Keuze invoerrecht',\r\n Quantity: 'Hoeveelheid',\r\n QuotaOrderNumber: 'Ordernummer contingent',\r\n QuotaOrderNumberTypeaheadPlaceholder: 'Vul ordernummer tariefcontingent in',\r\n ReferenceLists: 'Referentielijsten',\r\n Region: 'Regio',\r\n Regions: 'Regio\\'s',\r\n RetailPrice: 'Kleinhandelsprijs',\r\n SearchByCodeOrDescription: 'Zoek op code of omschrijving', \r\n ShowQuotaInformation: 'Toon informatie over tariefcontingent',\r\n Taxes: 'Belastingen',\r\n ValidateDeclaration: 'Valideer aangifte',\r\n Value: 'Waarde',\r\n VatAndExciseEtcetera: 'Omzetbelasting, accijnzen, voorraadheffing en verbruiksbelasting',\r\n VAT: 'Omzetbelasting'\r\n};\r\n","module.exports = {\r\n ExportValue: 'Waarde export',\r\n ExportWeight: 'Gewicht export',\r\n ExportValuePerKg: 'Waarde export per kg',\r\n ImportValue: 'Waarde import',\r\n ImportWeight: 'Gewicht import',\r\n ImportValuePerKg: 'Waarde import per kg',\r\n MoreYearsComingSoon: 'Meer jaren volgen binnenkort',\r\n NoDataAvailable: 'Geen data beschikbaar',\r\n ReportingCountry: 'Rapporterend land',\r\n StatisticsForImportFrom: 'Statistieken voor import uit',\r\n StatisticsForImportInto: 'Statistieken voor import in',\r\n\r\n StatisticsForImportFrom_CountryName_In_Year_: 'Statistieken voor import uit {{ CountryName }} in {{ Year }}',\r\n StatisticsForImportInto_CountryName_In_Year_: 'Statistieken voor import in {{ CountryName }} in {{ Year }}',\r\n StatisticsForImportIntoTheEU_In_Year_: 'Statistieken voor import in de EU in {{ Year }}',\r\n\r\n theEU: 'de EU',\r\n TradePartner: 'Handelspartner',\r\n TradeStatistics: 'Handelsstatistieken',\r\n Year: 'Jaar'\r\n};\r\n","module.exports = {\r\n vatNumber: 'BTW-nummer',\r\n cdNumber: 'CD-nummer',\r\n eoriNumber: 'EORI-nummer',\r\n rexNumber: 'REX-nummer',\r\n tinNumber: 'TIN-nummer',\r\n cdChecking: 'Query EU Customs Decision System',\r\n checkEORINumber: 'Controleer EORI-nummer',\r\n checkRexNumber: 'Controleer REX-nummer',\r\n checkViesRegistrationForVatNumber: 'Controleer VIES-registratie voor btw-nummer',\r\n vatCheck: 'Controleer btw-nummer (VIES)',\r\n eoriCheck: 'Controleer EORI-nummer',\r\n rexCheck: 'Controleer REX-nummer',\r\n cdCheck: 'Query Customs Decision System',\r\n eoriCheckResultValid: 'Het gecontroleerde EORI-nummer is geldig',\r\n eoriCheckResultInvalid: 'Het gecontroleerde EORI-nummer is ongeldig',\r\n rexCheckResultInvalid: 'Het gecontroleerde REX-nummer is ongeldig',\r\n city: 'Stad',\r\n companyName: 'Bedrijfsnaam',\r\n companyAddress: 'Bedrijfsadres',\r\n countryCode: 'Landcode',\r\n postalCode: 'Postcode',\r\n searchResults: 'Zoekresultaten',\r\n serverError: 'Er is een fout opgetreden bij het verwerken van uw verzoek.', \r\n activitynameField: 'Activiteit',\r\n activityflagField: 'Ja/Nee',\r\n listOfGoods: 'Lijst van goederen',\r\n commodityCode: 'Goederencode',\r\n rexFieldError: 'Vul een geldig REX-nummer in',\r\n eoriFieldError: 'Vul een geldig EORI-nummer in',\r\n ValidateBusinessInformation: 'Valideer bedrijfsinformatie',\r\n ViesWebSiteIntroText: 'Je kunt de VIES-website gebruiken om te controleren of een btw-nummer geldig is voor intra-communautaire levering van goederen of diensten.',\r\n GoToViesWebsite: 'Ga naar de VIES-website (opent in een nieuw venster)',\r\n PRODUCTION: 'Productie',\r\n TRADING: 'Handel',\r\n};","module.exports = {\r\n dynamic: {\r\n CommodityCodeIsInvalid: 'Goederencode is onjuist',\r\n CommodityCodeOrQueryIsRequired: 'Goederencode of zoektekst is verplicht',\r\n QueryIsTooShort: 'Zoektekst is te kort',\r\n QueryIsRequired: 'Zoektekst is verplicht',\r\n }\r\n};","angular.module('taric.units', [])\r\n // Filters\r\n .filter('isRetailPrice', require('./filters/is-retail-price'))\r\n .filter('isNotRetailPrice', require('./filters/is-not-retail-price'))\r\n ;\r\n","module.exports = [isNotRetailPriceFilter];\r\n\r\nfunction isNotRetailPriceFilter() {\r\n return function (units) {\r\n return _.filter(units, function(unit) { \r\n return unit.Unit.code !== 'RET' && /* GB */\r\n unit.Unit.code !== '003' && /* NL */\r\n unit.Unit.code !== '062' && /* DE */\r\n unit.Unit.code !== '063' /* DE */\r\n ; \r\n });\r\n };\r\n}\r\n","module.exports = [isRetailPriceFilter];\r\n\r\nfunction isRetailPriceFilter() {\r\n return function (units) {\r\n return _.filter(units, function(unit) { \r\n return unit.Unit.code === 'RET' || /* GB */ \r\n unit.Unit.code === '003' || /* NL */\r\n unit.Unit.code === '062' || /* DE */\r\n unit.Unit.code === '063'; /* DE */\r\n });\r\n };\r\n}\r\n","angular.module('taric.validateBusinessInfo', [])\r\n .config(['$routeProvider', routeConfigurator])\r\n // Components\r\n .component('validateBusinessInfoSubnav', require('./components/validate-business-info-subnav'))\r\n .component('validateBusinessInfoCdForm', require('./components/validate-business-info-cd-form'))\r\n .component('validateBusinessInfoEoriForm', require('./components/validate-business-info-eori-form'))\r\n .component('validateBusinessInfoRexForm', require('./components/validate-business-info-rex-form'))\r\n .component('validateBusinessInfoVatForm', require('./components/validate-business-info-vat-form'))\r\n // Modals\r\n .factory('validateBusinessInfoRexModal', require('./modals/validate-business-info-rex-modal'))\r\n // Services\r\n .factory('validateBusinessInfoDataService', require('./services/validate-business-info-data'))\r\n ;\r\n\r\nfunction routeConfigurator($routeProvider) {\r\n $routeProvider\r\n .when('/validate-business-info/home', {\r\n template: '',\r\n })\r\n .when('/validate-business-info/check-customs-decision', {\r\n template: ''\r\n })\r\n .when('/validate-business-info/check-eori-number', {\r\n template: ''\r\n })\r\n .when('/validate-business-info/check-rex-number', {\r\n template: ''\r\n })\r\n .when('/validate-business-info/vies-check-vat-number', {\r\n template: ''\r\n })\r\n\r\n ;\r\n}","module.exports = {\r\n controller: euCdVatFormController,\r\n templateUrl: 'validate-business-info/components/validate-business-info-cd-form.html'\r\n}\r\n\r\neuCdVatFormController.$inject = [\r\n 'validateBusinessInfoDataService',\r\n];\r\n\r\nfunction euCdVatFormController(\r\n validateBusinessInfoDataService\r\n) {\r\n var vm = {\r\n isLoading: false,\r\n service : validateBusinessInfoDataService,\r\n cdCheck: validateBusinessInfoDataService.cdCheck\r\n };\r\n\r\n return vm;\r\n}","module.exports = {\r\n controller: validateBusinessInfoEoriFormController,\r\n templateUrl: 'validate-business-info/components/validate-business-info-eori-form.html'\r\n}\r\n\r\nvalidateBusinessInfoEoriFormController.$inject = [\r\n '$timeout',\r\n 'validateBusinessInfoDataService',\r\n];\r\n\r\nfunction validateBusinessInfoEoriFormController(\r\n $timeout,\r\n validateBusinessInfoDataService\r\n) {\r\n var vm = {\r\n isLoading: false,\r\n noResult: false,\r\n showWarning: false,\r\n showError: false,\r\n errorMessage: null,\r\n service : validateBusinessInfoDataService,\r\n eoriCheck: validateBusinessInfoDataService.eoriCheck,\r\n checkEoriNumber: checkEoriNumber,\r\n clearEoriNumber: clearEoriNumber,\r\n };\r\n\r\n function clearEoriNumber() {\r\n validateBusinessInfoDataService.clearEoriNumber();\r\n }\r\n\r\n function checkEoriNumber() {\r\n vm.eoriCheck.result = null;\r\n var eoriRegex = /[A-Za-z][A-Za-z]?[0-9]{1,15}$/;\r\n if(!validateBusinessInfoDataService.eoriCheck.eoriNumber) {\r\n vm.showWarning = true;\r\n return $timeout(function() { \r\n vm.showWarning = false;\r\n }, 5000);\r\n }\r\n\r\n if(!eoriRegex.test(validateBusinessInfoDataService.eoriCheck.eoriNumber)) {\r\n vm.showWarning = true;\r\n return $timeout(function() { \r\n vm.showWarning = false;\r\n vm.errorMessage = null;\r\n }, 5000);\r\n }\r\n vm.isLoading = true;\r\n return validateBusinessInfoDataService.checkEoriNumber()\r\n .then(function () {\r\n vm.isLoading = false;\r\n if(validateBusinessInfoDataService.eoriCheck.messages.length > 0) {\r\n vm.showError = true;\r\n return $timeout(function() { \r\n vm.showError = false;\r\n }, 5000);\r\n }\r\n }).catch(function(error) {\r\n vm.isLoading = false;\r\n if(validateBusinessInfoDataService.eoriCheck.messages.length > 0) {\r\n vm.showError = true;\r\n return $timeout(function() { \r\n vm.showError = false;\r\n }, 5000);\r\n }\r\n });\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n controller: validateBusinessInfoRexFormController,\r\n templateUrl: 'validate-business-info/components/validate-business-info-rex-form.html'\r\n}\r\n\r\nvalidateBusinessInfoRexFormController.$inject = [\r\n '$timeout',\r\n '$sce',\r\n 'validateBusinessInfoDataService',\r\n 'validateBusinessInfoRexModal',\r\n];\r\n\r\nfunction validateBusinessInfoRexFormController(\r\n $timeout,\r\n $sce,\r\n validateBusinessInfoDataService,\r\n validateBusinessInfoRexModal\r\n) {\r\n var vm = {\r\n isLoading: false,\r\n showError: false,\r\n showWarning: false,\r\n errorMessage: null,\r\n init: true,\r\n service : validateBusinessInfoDataService,\r\n rexCheck: validateBusinessInfoDataService.rexCheck,\r\n checkRexNumber: checkRexNumber,\r\n clearRexNumber: clearRexNumber,\r\n clearEoriNumber: clearEoriNumber,\r\n clearTinNumber: clearTinNumber,\r\n showModalGoodsActivities: showModalGoodsActivities,\r\n showIcon: showIcon,\r\n };\r\n\r\n function showIcon(field) {\r\n if(field) {\r\n str = \"\";\r\n } else {\r\n str = \"\";\r\n }\r\n return $sce.trustAsHtml(str);\r\n } \r\n\r\n function showModalGoodsActivities(data) {\r\n validateBusinessInfoRexModal.show(data);\r\n }\r\n\r\n function clearRexNumber() {\r\n validateBusinessInfoDataService.clearRexNumber();\r\n\r\n }\r\n\r\n function clearEoriNumber() {\r\n validateBusinessInfoDataService.clearRexEoriNumber();\r\n }\r\n\r\n function clearTinNumber() {\r\n validateBusinessInfoDataService.clearRexTinNumber();\r\n }\r\n\r\n function checkRexNumber() {\r\n if(!validateBusinessInfoDataService.rexCheck.eoriNumber\r\n && !validateBusinessInfoDataService.rexCheck.rexNumber\r\n && !validateBusinessInfoDataService.rexCheck.tinNumber) {\r\n vm.showWarning = true;\r\n return $timeout(function() { \r\n vm.showWarning = false;\r\n }, 5000);\r\n }\r\n\r\n // if(!validateBusinessInfoDataService.rexCheck.rexNumber) {\r\n // vm.showWarning = true;\r\n // return $timeout(function() { \r\n // vm.showWarning = false;\r\n // vm.errorMessage = null;\r\n // }, 5000);\r\n // }\r\n\r\n var rexRegex = /[A-Za-z][A-Za-z]REX?[A-Z0-9]{1,50}$/;\r\n if(validateBusinessInfoDataService.rexCheck.rexNumber && !rexRegex.test(validateBusinessInfoDataService.rexCheck.rexNumber)) {\r\n vm.showWarning = true;\r\n return $timeout(function() { \r\n vm.showWarning = false;\r\n vm.errorMessage = null;\r\n }, 5000);\r\n }\r\n vm.isLoading = true;\r\n vm.noResult = false;\r\n vm.init = false;\r\n return validateBusinessInfoDataService.checkRexNumber()\r\n .then(function () {\r\n vm.isLoading = false;\r\n if(!validateBusinessInfoDataService.rexCheck.result) {\r\n vm.noResult = true;\r\n return $timeout(function() { \r\n vm.noResult = false;\r\n }, 8000);\r\n }\r\n if(validateBusinessInfoDataService.rexCheck.messages.length > 0) {\r\n vm.showError = true;\r\n return $timeout(function() { \r\n vm.showError = false;\r\n }, 5000);\r\n }\r\n }).catch(function(error) {\r\n vm.isLoading = false;\r\n if(validateBusinessInfoDataService.rexCheck.messages.length > 0) {\r\n vm.showError = true;\r\n return $timeout(function() { \r\n vm.showError = false;\r\n }, 5000);\r\n }\r\n });\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n active: '@'\r\n },\r\n controller: validateBusinessInfoSubnavController,\r\n templateUrl: 'validate-business-info/components/validate-business-info-subnav.html'\r\n};\r\n\r\nvalidateBusinessInfoSubnavController.$inject = ['applicationStateService'];\r\n\r\nfunction validateBusinessInfoSubnavController(state) {\r\n var vm = {\r\n referenceCountry: state.filter.referenceCountry\r\n };\r\n return vm;\r\n}","module.exports = {\r\n templateUrl: 'validate-business-info/components/validate-business-info-vat-form.html'\r\n}","module.exports = [\r\n '$analytics', \r\n '$uibModal', \r\n validateBusinessInfoRexModal\r\n];\r\n\r\nfunction validateBusinessInfoRexModal(\r\n $analytics, \r\n $uibModal\r\n) {\r\n var modal = {\r\n tableData: null,\r\n show: showModal\r\n };\r\n\r\n validateBusinessInfoRexModalController.$inject = [\r\n '$uibModalInstance', \r\n 'tableData',\r\n ];\r\n\r\n function validateBusinessInfoRexModalController(\r\n $uibModalInstance, \r\n tableData\r\n ) {\r\n\r\n var vm = {\r\n $onInit: attached,\r\n $onDestroy: detached,\r\n cancel: cancel,\r\n tableData: tableData\r\n };\r\n\r\n var refresh;\r\n var opacity = 1;\r\n\r\n return vm;\r\n\r\n function attached() {\r\n }\r\n\r\n function detached() {\r\n document.body.style.opacity = 1;\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n }\r\n\r\n\r\n function showModal(tableData) {\r\n $analytics.eventTrack('open-modal-rex', { category: 'rex' });\r\n if (tableData)\r\n modal.tableData = tableData;\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n bindToController: true,\r\n controller: validateBusinessInfoRexModalController,\r\n controllerAs: 'ctrleuRexModal',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n tableData: function () {\r\n return modal.tableData;\r\n }\r\n },\r\n templateUrl: 'validate-business-info/modals/validate-business-info-rex-modal.html',\r\n windowClass: 'modal-rex'\r\n }).result.catch(function (res) {\r\n if (!(res === 'cancel' || res === 'escape key press' || res === 'backdrop click')) {\r\n throw res;\r\n }\r\n });\r\n\r\n }\r\n\r\n return modal;\r\n\r\n}","module.exports = [\r\n 'dataContext', \r\n 'common', \r\n validateBusinessInfoDataService\r\n];\r\n\r\nfunction validateBusinessInfoDataService(\r\n dataContext, \r\n common\r\n) {\r\n\r\n var service = {\r\n response: {},\r\n isLoading:false,\r\n eoriCheck: {\r\n eoriNumber: null,\r\n result: null,\r\n messages : null ,\r\n },\r\n rexCheck: {\r\n eoriNumber: null,\r\n rexNumber: null,\r\n tinNumber: null,\r\n result: null,\r\n messages : null ,\r\n },\r\n cdCheck: {\r\n eoriNumber: null,\r\n cdNumber: null,\r\n result: null,\r\n messages : null ,\r\n },\r\n display: 'list',\r\n checkEoriNumber: checkEoriNumber,\r\n clearEoriNumber: clearEoriNumber,\r\n checkRexNumber: checkRexNumber,\r\n clearRexNumber: clearRexNumber,\r\n clearRexEoriNumber: clearRexEoriNumber,\r\n clearRexTinNumber: clearRexTinNumber,\r\n };\r\n return service;\r\n\r\n function clearEoriNumber() {\r\n service.eoriCheck.eoriNumber = null;\r\n service.eoriCheck.result = null;\r\n }\r\n\r\n function clearRexNumber() {\r\n service.rexCheck.rexNumber = null;\r\n service.rexCheck.result = null;\r\n }\r\n\r\n function clearRexEoriNumber() {\r\n service.rexCheck.eoriNumber = null;\r\n service.rexCheck.result = null;\r\n }\r\n\r\n function clearRexTinNumber() {\r\n service.rexCheck.tinNumber = null;\r\n service.rexCheck.result = null;\r\n }\r\n\r\n function checkRexNumber() {\r\n service.rexCheck.result = null;\r\n var url = common.config.apiHosts.generic + \r\n '/rex-numbers/check/' + \r\n '?rex=' + (service.rexCheck.rexNumber || '') +\r\n '&eori=' + (service.rexCheck.eoriNumber || '') +\r\n '&tin=' + (service.rexCheck.tinNumber || '');\r\n return dataContext.get(url).then(function (result) {\r\n service.rexCheck.messages = result.Messages;\r\n service.rexCheck.result = result.Result.resultField;\r\n }).catch(function(error) {\r\n throw error;\r\n });\r\n }\r\n\r\n function checkEoriNumber() {\r\n service.eoriCheck.result = null;\r\n var url = common.config.apiHosts.generic + \r\n '/eori-numbers/check?eori=' + \r\n (service.eoriCheck.eoriNumber || '');\r\n\r\n return dataContext.get(url).then(function (result) {\r\n service.eoriCheck.result = result.Result;\r\n service.eoriCheck.messages = result.Messages;\r\n }).catch(function(error) {\r\n throw error;\r\n });\r\n }\r\n}","angular.module('taric.vatRates', [])\r\n // .config(['$routeProvider', routeConfigurator])\r\n .component('vatMeasure', require('./components/vat-measure'))\r\n .component('vatRates', require('./components/vat-rates'))\r\n .factory('vatRatesDataService', require('./services/vat-rates-data'));\r\n\r\n// function routeConfigurator($routeProvider) {\r\n// $routeProvider\r\n// .when('/trade-statistics', {\r\n// templateUrl: 'trade-statistics/controllers/trade-statistics.html'\r\n// })\r\n// ;\r\n// }\r\n","module.exports = {\r\n bindings: {\r\n measure: '<'\r\n },\r\n templateUrl: 'vat-rates/components/vat-measure.html'\r\n}","module.exports = {\r\n bindings: {\r\n commodityCode: '<'\r\n },\r\n controller: vatRatesController,\r\n templateUrl: 'vat-rates/components/vat-rates.html'\r\n};\r\n\r\nvatRatesController.$inject = [\r\n 'preferenceService', \r\n 'vatRatesDataService'\r\n];\r\n\r\nfunction vatRatesController(\r\n preferenceService,\r\n vatRatesDataService\r\n) {\r\n var vm = {\r\n isLoading: false,\r\n vatRateCountryCode: null,\r\n measures: [],\r\n possibleVatRateCountries: [],\r\n $onInit: attached,\r\n vatRateCountryChanged: vatRateCountryChanged\r\n };\r\n\r\n function attached() {\r\n vatRatesDataService.getVatRatesCountries()\r\n .then(function (vatRatesCountries) {\r\n var vatRateCountryCodePreference = preferenceService.get('vat-rate-country');\r\n var preferredVatRateCountryCode = vatRateCountryCodePreference ? vatRateCountryCodePreference.value : null;\r\n var preferredVatRateCountry = _.find(vatRatesCountries, function (country) {\r\n return country.code == preferredVatRateCountryCode;\r\n });\r\n if (preferredVatRateCountry) {\r\n vm.vatRateCountryCode = preferredVatRateCountry.code;\r\n vatRateCountryChanged(preferredVatRateCountry);\r\n }\r\n vm.possibleVatRateCountries = vatRatesCountries\r\n });\r\n }\r\n\r\n function vatRateCountryChanged(country) {\r\n vm.measures = [];\r\n if (country) {\r\n vm.isLoading = true;\r\n vatRatesDataService.getVatRates(vm.commodityCode, country.code)\r\n .then(function (vatMeasures) {\r\n vm.isLoading = false;\r\n vm.measures = vatMeasures;\r\n });\r\n }\r\n vm.vatRateCountryCode = country ? country.code : null;\r\n preferenceService.replace({\r\n name: 'vat-rate-country',\r\n category: 'user_preferences',\r\n value: vm.vatRateCountryCode,\r\n valueType: 'stringValue'\r\n });\r\n }\r\n return vm;\r\n}","module.exports = [\r\n 'common',\r\n 'countryDataService', \r\n 'dataContext', \r\n 'applicationStateService',\r\n vatRatesDataService\r\n];\r\n\r\nfunction vatRatesDataService(\r\n common, \r\n countryDataService,\r\n dataContext,\r\n state\r\n) {\r\n var service = {\r\n getVatRatesCountries: getVatRatesCountries,\r\n getVatRates: getVatRates\r\n };\r\n return service;\r\n\r\n function getVatRatesCountries() {\r\n var url = common.config.apiHosts.generic + '/vat-rates-countries';\r\n return dataContext.get(url)\r\n .then(function (countryCodes) {\r\n return _.map(countryCodes, function (countryCode) {\r\n if (countryCode === 'EL') {\r\n return {\r\n code: countryCode,\r\n name: countryDataService.countries['GR']\r\n }\r\n }\r\n return {\r\n code: countryCode,\r\n name: countryDataService.countries[countryCode]\r\n };\r\n });\r\n });\r\n }\r\n\r\n function getVatRates(commodityCode, memberState) {\r\n var url = common.config.apiHosts.generic + '/vat-rates/' + commodityCode +\r\n '?referenceCountry=' + memberState +\r\n '&lang=' + common.language.get() +\r\n '&date=' + state.filter.date;\r\n return dataContext.get(url);\r\n }\r\n}","angular.module('taric.widgets', [])\r\n // Controllers\r\n // Components\r\n .component('feedbackButton', require('./components/feedback-button'))\r\n .component('goodscodeScroller', require('./components/goodscode-scroller'))\r\n .component('loadingIndicator', require('./components/loading-indicator/loading-indicator-block'))\r\n .component('loadingIndicatorInline', require('./components/loading-indicator/loading-indicator-inline'))\r\n .component('loadingIndicatorSmall', require('./components/loading-indicator/loading-indicator-small'))\r\n .component('modalPrintButton', require('./components/modal-print-button'))\r\n .component('navbarLanguageDropdown', require('./components/navbar-language-dropdown'))\r\n .component('printButton', require('./components/print-button'))\r\n .component('recentCodeButton', require('./components/recent-code-button'))\r\n .component('referenceCountryPicker', require('./components/reference-country-picker'))\r\n .component('taricNavbar', require('./components/navbar'))\r\n .component('taricStatus', require('./components/taric-status'))\r\n .component('translatedText', require('./components/translated-text'))\r\n // Filters\r\n .filter('addHyperlinks', require('./filters/add-hyperlinks'))\r\n .filter('countryTypeahead', require('./filters/country-typeahead-filter'))\r\n .filter('formatDescription', require('./filters/format-description'))\r\n .filter('formatDuty', require('./filters/format-duty'))\r\n .filter('formatGnCode', require('./filters/format-gn-code'))\r\n .filter('formatTaricCode', require('./filters/format-taric-code'))\r\n .filter('formatEztCode', require('./filters/format-ezt-code'))\r\n .filter('hasAdditionalCode', require('./filters/has-additional-code'))\r\n .filter('hasCountry', require('./filters/has-country'))\r\n .filter('taricCodeToChapterNumber', require('./filters/taric-code-to-chapter-number'))\r\n .filter('highlight', require('./filters/highlight'))\r\n .filter('trust', require('./filters/trust'))\r\n .filter('stripTaricCode', require('./filters/strip-taric-code'))\r\n .filter('taricDashes', require('./filters/taric-dashes'))\r\n .filter('toCurrencySign', require('./filters/to-currency-sign'))\r\n .filter('trim', require('./filters/trim'))\r\n .filter('toFixed', require('./filters/to-fixed'))\r\n // Modals\r\n .factory('areYouSureModal', require('./modals/are-you-sure'))\r\n .factory('loggingOutModal', require('./modals/logging-out'))\r\n .factory('widgetModals', require('./modals/modals'))\r\n // Services\r\n .factory('taricStatusService', require('./services/taric-status'))\r\n ;\r\n","module.exports = {\r\n controller: feedbackButtonController,\r\n templateUrl: 'widgets/components/feedback-button.html'\r\n};\r\n\r\nfeedbackButtonController.$inject = ['language'];\r\n\r\nfunction feedbackButtonController(language) {\r\n var vm = {\r\n language: language\r\n };\r\n return vm;\r\n}","module.exports = {\r\n bindings: {\r\n goodscodes: '<'\r\n },\t\r\n controller: goodscodeScrollerController,\r\n templateUrl: 'widgets/components/goodscode-scroller.html'\r\n};\r\n\r\ngoodscodeScrollerController.$inject = [\r\n '$element', \r\n];\r\n\r\nfunction goodscodeScrollerController(\r\n $element\r\n) {\r\n\r\n var chapterList, headingList, goodsCodeList;\r\n var vm = {\r\n $onInit: attached,\r\n $postLink: link,\r\n setCurrentChapter: setCurrentChapter,\r\n setCurrentHeading: setCurrentHeading\r\n };\r\n return vm;\r\n\r\n function attached() {\r\n \r\n vm.headings = _.chain(vm.goodscodes)\r\n .map(function(goodscode) {\r\n return goodscode.substring(0, 4);\r\n })\r\n .uniq()\r\n .value();\r\n vm.chapters = _.chain(vm.headings)\r\n .map(function(heading) {\r\n return heading.substring(0, 2);\r\n })\r\n .uniq()\r\n .value();\r\n\r\n vm.currentChapter = vm.chapters[0];\r\n vm.currentHeading = vm.headings[0];\r\n }\r\n \r\n function link() {\r\n chapterList = $element[0].getElementsByClassName('goodscode-scroller-chapter-list')[0];\r\n headingList = $element[0].getElementsByClassName('goodscode-scroller-heading-list')[0];\r\n goodsCodeList = $element[0].getElementsByClassName('goodscode-scroller-goodscode-list')[0];\r\n }\r\n\r\n function setCurrentChapter(chapter, $event) {\r\n $event.stopPropagation();\r\n vm.currentChapter = chapter;\r\n vm.currentHeading = _.find(vm.headings, function(heading) {\r\n return heading.substring(0, 2) === chapter;\r\n });\r\n\r\n var headingListItem = headingList.querySelector('li[data-chapter=\"' + chapter + '\"]');\r\n headingList.scrollTop = headingListItem.offsetTop - 40;\r\n\r\n var goodsCodeListItem = goodsCodeList.querySelector('li[data-chapter=\"' + chapter + '\"]');\r\n goodsCodeList.scrollTop = goodsCodeListItem.offsetTop - 40;\r\n }\r\n\r\n\r\n function setCurrentHeading(heading, $event) {\r\n $event.stopPropagation();\r\n vm.currentHeading = heading;\r\n var goodsCodeListItem = goodsCodeList.querySelector('li[data-heading=\"' + heading + '\"]');\r\n goodsCodeList.scrollTop = goodsCodeListItem.offsetTop - 40;\r\n }\r\n}","module.exports = {\r\n templateUrl: 'widgets/components/loading-indicator/loading-indicator-block.html'\r\n};","module.exports = {\r\n templateUrl: 'widgets/components/loading-indicator/loading-indicator-inline.html'\r\n};","module.exports = {\r\n templateUrl: 'widgets/components/loading-indicator/loading-indicator-small.html'\r\n};","module.exports = {\r\n controller: modalPrintButtonController,\r\n templateUrl: 'widgets/components/modal-print-button.html'\r\n};\r\n\r\nfunction modalPrintButtonController() {\r\n var vm = {\r\n printPage: printPage,\r\n };\r\n return vm;\r\n\r\n function printPage() {\r\n window.print();\r\n }\r\n}","module.exports = {\r\n controller: languageDropdownController,\r\n templateUrl: 'widgets/components/navbar-language-dropdown.html'\r\n};\r\n\r\nlanguageDropdownController.$inject = ['$timeout', '$window', 'common', 'documentationService', 'preferenceService'];\r\n\r\nfunction languageDropdownController($timeout, $window, common, documentationService, preferences) {\r\n\r\n var vm = {\r\n onClick: onClick,\r\n getLanguage: common.language.get,\r\n setLanguage: setLanguage,\r\n languageService: common.language\r\n };\r\n\r\n function onClick() {\r\n $timeout(function() {\r\n documentationService.exit();\r\n }, 0);\r\n }\r\n\r\n function setLanguage(language) {\r\n\r\n preferences.setLanguage(language).then(function(){\r\n setTimeout(function() {\r\n // We set a timeout in order to give listeners\r\n // to the language changed event a chance to react\r\n // before reloading. For example, the query string\r\n // in the search function is cleared.\r\n $window.location.reload();\r\n }, 1);\r\n });\r\n }\r\n\r\n return vm;\r\n\r\n}","var moment = require('moment');\r\n\r\nmodule.exports = {\r\n controller: navbarController,\r\n templateUrl: 'widgets/components/navbar.html'\r\n};\r\n\r\nnavbarController.$inject = ['$analytics', '$location', 'common', 'documentationService', 'favoritesService', 'preferenceService', 'applicationStateService'];\r\n\r\nfunction navbarController($analytics, $location, common, documentationService, favoriteService, preferences, state) {\r\n var vm = {\r\n config: common.config,\r\n identity: common.identity,\r\n favoriteService: favoriteService,\r\n language: common.language,\r\n openFavorite: openFavorite,\r\n removeFavorite: removeFavorite,\r\n setLanguage: setLanguage,\r\n showReferenceDatePicker: showReferenceDatePicker,\r\n showReferenceDateNotification: showReferenceDateNotification,\r\n showSidebar: false,\r\n supportedLanguages: common.language.supportedLanguages,\r\n toggle: toggle,\r\n\r\n };\r\n\r\n function toggle() {\r\n vm.showSidebar = !vm.showSidebar;\r\n if (vm.showSidebar) {\r\n $analytics.eventTrack('open-main-nav', { category: 'navigation' })\r\n }\r\n documentationService.initialize('menu');\r\n }\r\n\r\n function showReferenceDateNotification() {\r\n return showReferenceDatePicker() && state.filter.date !== moment().format('YYYY-MM-DD');\r\n }\r\n\r\n function showReferenceDatePicker() {\r\n if ($location.path().indexOf('/case-law') === 0) {\r\n return false;\r\n }\r\n if ($location.path().indexOf('/compliance-check') === 0) {\r\n return false;\r\n }\r\n if ($location.path().indexOf('/account') === 0) {\r\n return false;\r\n }\r\n if ($location.path().indexOf('/correlation-table') === 0) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function openFavorite(goodscode, movement, $event) {\r\n if (!movement) {\r\n movement = 'import';\r\n }\r\n state.filter.movement = movement;\r\n preferences.replace({\r\n name: 'movement',\r\n category: 'user_preferences',\r\n value: movement,\r\n valueType: 'stringValue'\r\n });\r\n vm.showSidebar = false;\r\n $location.url('/search/' + goodscode);\r\n }\r\n\r\n function removeFavorite(goodscode, movement, $event) {\r\n favoriteService.remove(goodscode, movement);\r\n $event.stopPropagation();\r\n }\r\n\r\n function setLanguage(lang) {\r\n preferences.setLanguage(lang);\r\n }\r\n\r\n return vm;\r\n}\r\n","module.exports = {\r\n controller: printButtonController,\r\n templateUrl: 'widgets/components/print-button.html'\r\n};\r\n\r\nfunction printButtonController() {\r\n var vm = {\r\n printPage: printPage,\r\n };\r\n return vm;\r\n\r\n function printPage() {\r\n window.print();\r\n }\r\n}","module.exports = {\r\n bindings: {\r\n recentCode: '<'\r\n },\r\n controller: recentCodeButtonController,\r\n templateUrl: 'widgets/components/recent-code-button.html'\r\n};\r\n\r\nrecentCodeButtonController.$inject = [\r\n '$location', \r\n 'applicationStateService', \r\n 'preferenceService',\r\n];\r\n\r\nfunction recentCodeButtonController(\r\n $location, \r\n state, \r\n preferences\r\n) {\r\n \r\n var vm = {\r\n allDone: false,\r\n $onInit: attached,\r\n country: null,\r\n formDisplay: formDisplay,\r\n goodsnom: null,\r\n showRecentCode: showRecentCode,\r\n source: null\r\n };\r\n\r\n function attached() {\r\n formDisplay();\r\n }\r\n\r\n function showRecentCode() {\r\n var movement = vm.source || 'import';\r\n state.filter.movement = movement;\r\n preferences.replace({\r\n name: 'movement',\r\n category: 'user_preferences',\r\n value: movement,\r\n valueType: 'stringValue'\r\n });\r\n $location.url('/good/' + vm.goodsnom);\r\n }\r\n\r\n function formDisplay() {\r\n if (vm.recentCode === undefined || vm.recentCode === null)\r\n return;\r\n var displayValues = vm.recentCode.name.split('_');\r\n vm.goodsnom = displayValues[0];\r\n if (displayValues.length > 1)\r\n vm.source = displayValues[1];\r\n if (displayValues.length > 2)\r\n vm.country = displayValues[2];\r\n vm.allDone = true;\r\n }\r\n\r\n return vm;\r\n}","module.exports = {\r\n controller: referenceCountryPickerController,\r\n templateUrl: 'widgets/components/reference-country-picker.html'\r\n};\r\n\r\nreferenceCountryPickerController.$inject = [\r\n '$window', \r\n 'countryDataService',\r\n 'identity',\r\n 'preferenceService', \r\n 'applicationStateService'\r\n];\r\n\r\nfunction referenceCountryPickerController(\r\n $window,\r\n countryDataService,\r\n identity, \r\n preferences, \r\n state\r\n) {\r\n var vm = {\r\n $onInit: attached,\r\n searchFilter: state.filter,\r\n countryNames: countryDataService.countries,\r\n referenceCountries: [],\r\n setReferenceCountry: setReferenceCountry\r\n };\r\n \r\n return vm;\r\n\r\n function attached() {\r\n vm.referenceCountries = identity.getAllowedTradeTariffs();\r\n vm.disallowedReferenceCountries = identity.getDisallowedTradeTariffs();\r\n }\r\n \r\n function setReferenceCountry(referenceCountry) {\r\n state.filter.referenceCountry = referenceCountry;\r\n preferences.setReferenceCountry(referenceCountry).then(function () {\r\n $window.location.reload();\r\n });\r\n }\r\n}","module.exports = {\r\n controller: taricStatusController,\r\n templateUrl: 'widgets/components/taric-status.html'\r\n};\r\n\r\ntaricStatusController.$inject = ['taricStatusService'];\r\n\r\nfunction taricStatusController(taricStatusService) {\r\n var vm = {\r\n $onInit: attached,\r\n service: taricStatusService\r\n };\r\n return vm;\r\n\r\n function attached() {\r\n taricStatusService.loadLastSuccessfulDatabase();\r\n }\r\n}","module.exports = {\r\n bindings: {\r\n translation: '<'\r\n },\r\n templateUrl: 'widgets/components/translated-text.html'\r\n};","module.exports = [addHyperlinksFilter];\r\n\r\nfunction addHyperlinksFilter() {\r\n function makeReplacementFunction(replaceRegex, replaceTemplate) {\r\n return function (str, searchRegex) {\r\n return str.replace(searchRegex, function () {\r\n var matchedString = arguments[0]; // Eg. posten xxxx en xxxx\r\n var result = matchedString.replace(replaceRegex, replaceTemplate);\r\n return result;\r\n });\r\n };\r\n }\r\n\r\n var options = {\r\n 'heading': {\r\n 'searchRegex': /((?:(?:[H|h]eading(?:s)?)|(?:[S|s]ubheading(?:s)?)|(?:CN(?:\\s|-)codes?))(?:\\s|\\n|| )*)(?:(?:ex)?(?:\\s|\\n|| )*)?(\\d{2}(?:(?:[.\\s]| )?\\d{2})+)(?:(?:(?:\\s|\\n|)*(?:;|,|and|or|to)(?:\\s|\\n|| )*(\\d{2}(?:(?:[.\\s]| )?\\d{2})+)))*/g,\r\n 'replaceRegex': /(\\d{2}(?:(?:[.\\s]| )?\\d{2})+)/g,\r\n 'replaceTemplate': '$1',\r\n },\r\n 'heading_FR': {\r\n 'searchRegex': /((?:(?:[N|n]o(?:<\\/sup>)?s?<\\/sup>\\$?)|(?:[S|s]ous-position(?:s)?)|n°)(?:\\s|\\n|| )*)(\\d{2}(?:[.\\s]?\\d{2})+)(?:(?:(?:\\s|\\n|| )*(?:;|,|et|ou|à)(?:\\s|\\n|| )*(\\d{2}(?:[.\\s]?\\d{2})+)))*/g,\r\n 'replaceRegex': /(\\d{2}(?:[.\\s]?\\d{2})+)/g,\r\n 'replaceTemplate': '$1',\r\n },\r\n 'heading_DE': {\r\n 'searchRegex': /((?:(?:Pos(?:\\.|ition|itionen)?)|(?:Unterpos(?:\\.|ition|itionen)?)|KN-Codes?)(?:\\s|\\n|| )*)(\\d{2}(?:(?:\\s|\\n|| )*\\d{2})+)(?:(?:(?:\\s|\\n|| )*(?:;|,|und|oder|bis|bzw\\.)(?:\\s|\\n|| )*(\\d{2}(?:(?:\\s|\\n|| )*\\d{2})+)))*/g,\r\n 'replaceRegex': /(\\d{2}(?:(?:\\s|\\n|| )*\\d{2})+)/g,\r\n 'replaceTemplate': '$1',\r\n },\r\n 'post': {\r\n 'searchRegex': /((?:(?:[P|p]ost(?:en)?)|(?:[O|o]nderverdeling(?:en)?)|(?:GN\\s?-\\s?codes?))(?:\\s|\\n|| )*)(\\d{2}(?:[.\\s]?\\d{2})+)(?:(?:(?:\\s|\\n|| )*(?:;|,|en|of|t\\/m|tot en met)(?:\\s|\\n|| )*(\\d{2}(?:[.\\s]?\\d{2})+)))*/g,\r\n 'replaceRegex': /(\\d{2}(?:[.\\s]?\\d{2})+)/g,\r\n 'replaceTemplate': '$1',\r\n },\r\n 'post2': { // in explanatory notes (versie 2015)\r\n 'searchRegex': /\\s*\\n?\\d{2}(?:(?:[.\\s]| )?\\d{2})+(?:(?:\\s(?:;|,|en|of|t\\/m|tot en met|and|or|to|und|oder|bis|bzw\\.|et|ou|à)\\s\\d{2}(?:(?:[.\\s]| )?\\d{2})+))*\\s*<\\/span>/g,\r\n 'replaceRegex': /(\\d{2}(?:(?:[.\\s]| )?\\d{2})+)/g,\r\n 'replaceTemplate': '$1',\r\n },\r\n 'code_tarifering': { // in tariferingen\r\n 'searchRegex': /\\d{4}(?:[.\\s]?\\d{2}){0,3}<\\/h5>/g,\r\n 'replaceRegex': /(\\d{4}(?:[.\\s]?\\d{2})+)/g,\r\n 'replaceTemplate': '$1',\r\n },\r\n 'hoofdstuk': {\r\n 'searchRegex': /((?:[H|h]oofdstuk(?:ken)?)(?:\\s|\\n|)*)(\\d{1,2})(?:(?:((?:\\s|\\n|| )*(?:;|,|en|of|t\\/m|tot en met)(?:\\s|\\n|| )*)(\\d{1,2})))*/g,\r\n 'replaceRegex': /(\\d{1,2})/g,\r\n 'replaceTemplate': '$1'\r\n },\r\n 'chapter': {\r\n 'searchRegex': /((?:[C|c]hapter(?:s)?)(?:\\s|\\n|| )*)(\\d{1,2})(?:(?:((?:\\s|\\n|| )*(?:;|,|and|or|to)(?:\\s|\\n|| )*)(\\d{1,2})))*/g,\r\n 'replaceRegex': /(\\d{1,2})/g,\r\n 'replaceTemplate': '$1'\r\n },\r\n 'kapitel': {\r\n 'searchRegex': /((?:K[Aa][Pp](?:\\.|itel)(?:s|n)?)(?:\\s|\\n|| )*)(\\d{1,2})(?:(?:((?:\\s|\\n|| )*(?:;|,|und|oder|bis|bzw\\.)(?:\\s|\\n|| )*)(\\d{1,2})))*/g,\r\n 'replaceRegex': /(\\d{1,2})/g,\r\n 'replaceTemplate': '$1'\r\n },\r\n 'chapitre': {\r\n 'searchRegex': /((?:[C|c]hapitre(?:s)?)(?:\\s|\\n|| )*)(\\d{1,2})(?:(?:((?:\\s|\\n|| )*(?:;|,|et|ou|à)(?:\\s|\\n|| )*)(\\d{1,2})))*/g,\r\n 'replaceRegex': /(\\d{1,2})/g,\r\n 'replaceTemplate': '$1'\r\n },\r\n 'afdeling': {\r\n 'searchRegex': /([A|a]fdeling(?:en)?) ([IVX]{1,5})(?: (;|en|of|t\\/m|tot en met|,) ([IVX]{1,5}))?/g,\r\n 'replaceRegex': /([IVX]{1,5})/g,\r\n 'replaceTemplate': '$1'\r\n },\r\n 'abschnitt': {\r\n 'searchRegex': /(A[Bb][Ss](?:\\.|chnitt)(?:s)?) ([IVX]{1,5})(?: (;|und|oder|bis|,|bzw\\.) ([IVX]{1,5}))?/g,\r\n 'replaceRegex': /([IVX]{1,5})/g,\r\n 'replaceTemplate': '$1'\r\n },\r\n 'section': {\r\n 'searchRegex': /([S|s]ections?)(?:\\s| )([IVX]{1,5})(?:(?:\\s| )(;|,|and|or|to|et|ou|à)(?:\\s| )([IVX]{1,5}))?/g,\r\n 'replaceRegex': /([IVX]{1,5})/g,\r\n 'replaceTemplate': '$1'\r\n },\r\n 'hyperlink': {\r\n 'searchRegex': /(http:\\/\\/.*?(?:\\.html?|:PDF))/g,\r\n 'replaceRegex': /(http:\\/\\/.*?(?:\\.html?|:PDF))/g,\r\n 'replaceTemplate': '$1'\r\n }\r\n };\r\n\r\n\r\n options.hoofdstuk.filter = makeReplacementFunction(options.hoofdstuk.replaceRegex, options.hoofdstuk.replaceTemplate);\r\n options.kapitel.filter = makeReplacementFunction(options.kapitel.replaceRegex, options.kapitel.replaceTemplate);\r\n options.chapter.filter = makeReplacementFunction(options.chapter.replaceRegex, options.chapter.replaceTemplate);\r\n options.chapitre.filter = makeReplacementFunction(options.chapitre.replaceRegex, options.chapitre.replaceTemplate);\r\n options.abschnitt.filter = makeReplacementFunction(options.abschnitt.replaceRegex, options.abschnitt.replaceTemplate);\r\n options.afdeling.filter = makeReplacementFunction(options.afdeling.replaceRegex, options.afdeling.replaceTemplate);\r\n options.section.filter = makeReplacementFunction(options.section.replaceRegex, options.section.replaceTemplate);\r\n options.hyperlink.filter = makeReplacementFunction(options.hyperlink.replaceRegex, options.hyperlink.replaceTemplate);\r\n\r\n options.post.filter = function (str, regex) {\r\n\r\n return str.replace(regex, function () {\r\n var matchedString = arguments[0];\r\n var result = matchedString.replace(/(\\d{2}(?:(?:[.\\s]| )*\\d{2})+)/g, function (postString) {\r\n var post = postString.replace(/[\\s.]/g, '');\r\n var prettyPost = post.substring(0, 4);\r\n if (post.length > 4) {\r\n prettyPost += ' ' + post.substring(4, 6);\r\n }\r\n if (post.length > 6) {\r\n prettyPost += ' ' + post.substring(6, 8);\r\n }\r\n if (post.length > 8) {\r\n prettyPost += ' ' + post.substring(8, 10);\r\n }\r\n return '' + prettyPost + '';\r\n });\r\n return result;\r\n });\r\n };\r\n\r\n options.post2.filter = makeReplacementFunction(options.post2.replaceRegex, options.post2.replaceTemplate);\r\n options.heading.filter = makeReplacementFunction(options.heading.replaceRegex, options.heading.replaceTemplate);\r\n options.heading_DE.filter = makeReplacementFunction(options.heading_DE.replaceRegex, options.heading_DE.replaceTemplate);\r\n options.heading_FR.filter = makeReplacementFunction(options.heading_FR.replaceRegex, options.heading_FR.replaceTemplate);\r\n options.code_tarifering.filter = makeReplacementFunction(options.code_tarifering.replaceRegex, options.code_tarifering.replaceTemplate);\r\n\r\n\r\n return function (str) {\r\n\r\n if (!str)\r\n return '';\r\n\r\n _.each(_.values(options), function (option) {\r\n str = option.filter(str, option.searchRegex);\r\n });\r\n\r\n return str;\r\n };\r\n}","module.exports = [countryTypeaheadFilter];\r\n\r\n// Takes care of ordering the results of the country typeahed. The logic is as follows:\r\n// First, show the matches on the country code (first letter or both), ordered by code\r\n// Next, show the matches on the beginning of the country name, ordered by name\r\n// Finally, show the matches anywhere else in the name, ordered by name\r\n// NB: this needs to be used in combination with a regular filter, since it does not take\r\n// care of removing results which don't match the query at all\r\nfunction countryTypeaheadFilter() {\r\n\r\n\r\n return function (countries, query) {\r\n if (query === null || query === undefined)\r\n return countries;\r\n\r\n var countryCodeMatchPartition = _.partition(countries, function(country) {\r\n return country.code && country.code.toLowerCase().indexOf(query.toLowerCase()) === 0;\r\n });\r\n var countryCodeMatches = _.sortBy(countryCodeMatchPartition[0], 'code');\r\n var otherMatches = _.sortBy(countryCodeMatchPartition[1], 'name');\r\n\r\n var nameMatchPartition = _.partition(otherMatches, function(country) {\r\n return country.name && country.name.toLowerCase().indexOf(query.toLowerCase()) === 0;\r\n });\r\n\r\n var result = _.concat(countryCodeMatches, nameMatchPartition[0], nameMatchPartition[1]);\r\n return result;\r\n }\r\n}\r\n","module.exports = [formatDescriptionFilter];\r\n\r\nfunction formatDescriptionFilter() {\r\n var replacements = [\r\n [/\\$(.)/g, '$1'],\r\n [/@(.)/g, '$1'],\r\n [/\\|/g, ' '],\r\n [/!X!/g, '×'],\r\n [/!x!/g, '×'],\r\n [/!O!/g, '°'],\r\n [/!o!/g, '°'],\r\n [/!>=!/g, '≥'],\r\n [/!<=!/g, '≤'],\r\n ];\r\n \r\n return function (input) {\r\n if (input === null || input === undefined)\r\n return input;\r\n for (var i = 0; i < replacements.length; i++) {\r\n input = input.replace(replacements[i][0], replacements[i][1]);\r\n }\r\n return input;\r\n };\r\n}","module.exports = [formatDutyFilter];\r\n\r\nfunction formatDutyFilter() {\r\n var i;\r\n var replacements = [\r\n ['van de waarde omzetbelasting', '']\r\n ];\r\n\r\n return function (input) {\r\n if (input === null || input === undefined)\r\n return input;\r\n\r\n for (i = 0; i < replacements.length; i++) {\r\n while (input.indexOf(replacements[i][0]) > -1)\r\n input = input.replace(replacements[i][0], replacements[i][1]);\r\n }\r\n\r\n var breakLength = 30;\r\n\r\n if (input.length > breakLength) {\r\n for (i = 1; i < input.length / breakLength; i++) {\r\n var breakIndex = input.indexOf(' ', i * breakLength);\r\n if (breakIndex <= 0)\r\n break;\r\n input = input.substr(0, breakIndex) + '
' + input.substr(breakIndex);\r\n }\r\n }\r\n\r\n return input;\r\n };\r\n}","module.exports = [formatEztCodeFilter];\r\n\r\nfunction formatEztCodeFilter() {\r\n return function (input) {\r\n if (!input)\r\n return input;\r\n if (input === null || input === 'undefined' || input.length === 0)\r\n return input;\r\n\r\n if (input.length > 10)\r\n input = input.substring(0, 4) + ' ' + input.substring(4, 6) + ' ' + input.substring(6, 8) + ' ' + input.substring(8, 10) + ' ' + input.substring(10);\r\n else if (input.length > 8)\r\n input = input.substring(0, 4) + ' ' + input.substring(4, 6) + ' ' + input.substring(6, 8) + ' ' + input.substring(8);\r\n else if (input.length > 6)\r\n input = input.substring(0, 4) + ' ' + input.substring(4, 6) + ' ' + input.substring(6);\r\n else if (input.length > 4)\r\n input = input.substring(0, 4) + ' ' + input.substring(4);\r\n\r\n return input;\r\n };}","module.exports = [formatGnCodeFilter];\r\n\r\nfunction formatGnCodeFilter() {\r\n return function (input) {\r\n if (!input)\r\n return input;\r\n if (input === null || input === 'undefined' || input.length === 0)\r\n return input;\r\n\r\n if (input.length > 8) {\r\n if (input.substring(8) === \"00\")\r\n input = input.substring(0, 4) + ' ' + input.substring(4, 6) + ' ' + input.substring(6, 8);\r\n else\r\n input = input.substring(0, 4) + ' ' + input.substring(4, 6) + ' ' + input.substring(6, 8) + ' ' + input.substring(8);\r\n }\r\n else if (input.length > 6)\r\n input = input.substring(0, 4) + ' ' + input.substring(4, 6) + ' ' + input.substring(6);\r\n else if (input.length > 4)\r\n input = input.substring(0, 4) + ' ' + input.substring(4);\r\n\r\n return input;\r\n };\r\n}\r\n","module.exports = [formatTaricCodeFilter];\r\n\r\nfunction formatTaricCodeFilter() {\r\n return function (input) {\r\n if (!input)\r\n return input;\r\n if (input === null || input === 'undefined' || input.length === 0)\r\n return input;\r\n\r\n if (input.length > 8)\r\n input = input.substring(0, 4) + ' ' + input.substring(4, 6) + ' ' + input.substring(6, 8) + ' ' + input.substring(8);\r\n else if (input.length > 6)\r\n input = input.substring(0, 4) + ' ' + input.substring(4, 6) + ' ' + input.substring(6);\r\n else if (input.length > 4)\r\n input = input.substring(0, 4) + ' ' + input.substring(4);\r\n\r\n return input;\r\n };}","module.exports = [hasAdditionalCodeFilter];\r\n\r\nfunction hasAdditionalCodeFilter() {\r\n function measureHasAdditionalCode(measure, additionalCode) {\r\n var addCodeType = additionalCode.substr(0, 1).toUpperCase();\r\n var addCode = additionalCode.substr(1);\r\n\r\n return measure.additional_code &&\r\n measure.additional_code.code && (\r\n measure.additional_code.type !== addCodeType ||\r\n (measure.additional_code.code === addCode &&\r\n measure.additional_code.type === addCodeType)\r\n );\r\n\r\n }\r\n\r\n return function (measures, additionalCode) {\r\n if (!measures || !additionalCode || additionalCode.length !== 4)\r\n return measures;\r\n return _.filter(measures, function (measure) {\r\n return measureHasAdditionalCode(measure, additionalCode);\r\n });\r\n };\r\n}\r\n","module.exports = ['countryDataService', hasCountryFilter];\r\n\r\nfunction hasCountryFilter(countryData) {\r\n function measureHasCountry(measure, countryCode) {\r\n if ((measure.region === null || measure.region === undefined) && measure.measures !== undefined && measure.measures.length > 0) { // measure without regions\r\n for (var i = 0; i < measure.measures.length; i++) {\r\n if (measureHasCountry(measure.measures[i], countryCode) === true) {\r\n return true;\r\n }\r\n }\r\n }\r\n else if (measure.region.type === \"1\") { // measures for country groups\r\n if (measure.excluded_regions !== null && measure.excluded_regions !== undefined && measure.excluded_regions.length > 0) {\r\n for (var j = 0; j < measure.excluded_regions.length; j++) {\r\n if (measure.excluded_regions[j].code.toLowerCase() === countryCode.toLowerCase())\r\n return false;\r\n }\r\n }\r\n\r\n return countryData.regions[measure.region.code].indexOf(countryCode) > -1;\r\n }\r\n else { // measures for countries\r\n return measure.region.code.toLowerCase() === countryCode.toLowerCase();\r\n }\r\n }\r\n\r\n return function (measures, countryCode) {\r\n if (countryCode === null || countryCode === undefined)\r\n return measures;\r\n\r\n return _.filter(measures, function (measure) {\r\n return measureHasCountry(measure, countryCode);\r\n });\r\n }\r\n}\r\n","module.exports = [highlightFilter];\r\n\r\nfunction highlightFilter() {\r\n return function (text, filterPhrase, splitWords) {\r\n if (text && filterPhrase) {\r\n var tag_re = /(<\\/?[^>]+>)/g;\r\n text = text.split(tag_re).map(function (substring) {\r\n var result = substring;\r\n if (!result || result.match(tag_re)) {\r\n return result;\r\n } else {\r\n var words = splitWords ? filterPhrase.split(' ') : [filterPhrase];\r\n _.forEach(words, function (word) {\r\n var filter_re = new RegExp(_.escapeRegExp(word), 'gi');\r\n result = result.replace(filter_re,\r\n function (str) { return '' + str + ''; });\r\n });\r\n return result;\r\n }\r\n }).join('');\r\n }\r\n return text;\r\n };\r\n}","module.exports = [stripTaricCodeFilter];\r\n\r\nfunction stripTaricCodeFilter() {\r\n return function (input) {\r\n if (input === undefined || input === null)\r\n return;\r\n if (input.length <= 2)\r\n return input;\r\n\r\n while (input.substring(input.length - 2) === '00' && input.length > 4) {\r\n input = input.substring(0, input.length - 2);\r\n }\r\n\r\n return input;\r\n };\r\n}","module.exports = [taricCodeToChapterNumber];\r\n\r\nfunction taricCodeToChapterNumber() {\r\n return function (input) {\r\n if (input === undefined || input === null)\r\n return input;\r\n if (input.length <= 2)\r\n return input;\r\n\r\n while (input.substring(input.length - 2) === '00' && input.length > 2) {\r\n input = input.substring(0, input.length - 2);\r\n }\r\n\r\n if (input.substring(0, 1) === '0')\r\n input = input.substring(1);\r\n\r\n return input;\r\n };\r\n}","module.exports = [taricDashesFilter];\r\n\r\nfunction taricDashesFilter() {\r\n return function (input) {\r\n if (!input) {\r\n return '';\r\n }\r\n var numeric = parseInt(input);\r\n return Array(numeric + 1).join('– ');\r\n }\r\n}","module.exports = [toCurrencySignFilter];\r\n\r\nfunction toCurrencySignFilter() {\r\n return function (input) {\r\n switch (input) {\r\n case 'EUR':\r\n return '€';\r\n case 'GBP':\r\n return '£';\r\n default:\r\n return input;\r\n }\r\n };\r\n}","module.exports = [toFixedFilter];\r\n\r\nfunction toFixedFilter() {\r\n return function (input, decimals) {\r\n try {\r\n return input.toFixed(decimals);\r\n }\r\n catch (ex) {\r\n return input;\r\n }\r\n };\r\n}","module.exports = [trimFilter];\r\n\r\nfunction trimFilter() {\r\n return function (input) {\r\n if (input === null || input === undefined)\r\n return input;\r\n\r\n return input.trim();\r\n };\r\n}\r\n","module.exports = ['$sce', trustFilter];\r\n\r\nfunction trustFilter($sce) {\r\n return function (value, type) {\r\n // Defaults to treating trusted text as `html`\r\n return $sce.trustAs(type || 'html', value);\r\n };\r\n}","module.exports = ['$uibModal', areYouSureModal];\r\n\r\nfunction areYouSureModal($uibModal) {\r\n var modal = {\r\n show: showModal\r\n };\r\n\r\n areYouSureModal.$inject = ['$uibModalInstance', 'modalBody'];\r\n\r\n function areYouSureModalController($uibModalInstance, modalBody) {\r\n\r\n var ctrlAreYouSureModal = {\r\n cancel: cancel,\r\n confirm: confirm,\r\n body: modalBody\r\n };\r\n\r\n function cancel() {\r\n // $(\".page-dashboard, .taric-page-content\").removeClass(\"noprint\");\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function confirm() {\r\n $uibModalInstance.dismiss(true);\r\n }\r\n\r\n return ctrlAreYouSureModal;\r\n }\r\n\r\n function showModal(modalBody) {\r\n\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n controller: areYouSureModalController,\r\n controllerAs: 'ctrlAreYouSureModal',\r\n keyboard: true,\r\n modalFade: true,\r\n resolve: {\r\n modalBody: function () {\r\n return modalBody;\r\n }\r\n },\r\n templateUrl: 'widgets/modals/are-you-sure.html',\r\n windowClass: 'modal-are-you-sure'\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['$uibModal', loggingOutModal];\r\n\r\nfunction loggingOutModal($uibModal) {\r\n var modal = {\r\n dismiss: dismissModal,\r\n modalRef: null,\r\n show: showModal\r\n };\r\n\r\n loggingOutModal.$inject = ['$uibModalInstance'];\r\n\r\n function loggingOutModalController($uibModalInstance) {\r\n\r\n var ctrlLoggingOutModal = {\r\n };\r\n\r\n function cancel() {\r\n // $(\".page-dashboard, .taric-page-content\").removeClass(\"noprint\");\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function confirm() {\r\n $uibModalInstance.dismiss(true);\r\n }\r\n\r\n return ctrlLoggingOutModal;\r\n }\r\n\r\n function dismissModal() {\r\n\r\n }\r\n\r\n function showModal() {\r\n\r\n return $uibModal.open({\r\n animation: true,\r\n backdrop: true,\r\n controller: loggingOutModalController,\r\n controllerAs: 'ctrlLoggingOutModal',\r\n keyboard: true,\r\n modalFade: true,\r\n templateUrl: 'widgets/modals/logging-out.html'\r\n });\r\n }\r\n\r\n return modal;\r\n}\r\n","module.exports = ['areYouSureModal', 'loggingOutModal', widgetModalsService];\r\n\r\nfunction widgetModalsService(areYouSureModal, loggingOutModal) {\r\n\r\n var service = {\r\n areYouSure: areYouSureModal,\r\n loggingOut: loggingOutModal\r\n };\r\n\r\n return service;\r\n\r\n}\r\n","module.exports = ['config', 'dataContext', 'applicationStateService', taricStatusService];\r\n\r\nfunction taricStatusService(config, context, state) {\r\n var service = {\r\n loadLastSuccessfulDatabase: loadLastSuccessfulDatabase,\r\n status: null,\r\n versionNumber: config.version\r\n };\r\n\r\n function loadLastSuccessfulDatabase() {\r\n return context.get(config.apiHosts[config.currentApi] + '/status?referencecountry=' + state.filter.referenceCountry)\r\n .then(function (result) {\r\n service.lastSuccessfulDatabase = result;\r\n });\r\n }\r\n\r\n return service;\r\n}\r\n\r\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2FjY291bnQvX21vZHVsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvYWNjb3VudC9jb21wb25lbnRzL2NoYW5nZS1wYXNzd29yZC1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9hY2NvdW50L2NvbXBvbmVudHMvZm9yZ290LXBhc3N3b3JkLXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2FjY291bnQvY29tcG9uZW50cy9sb2dpbi1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9hY2NvdW50L2NvbXBvbmVudHMvbG9nb3V0LXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2FjY291bnQvY29tcG9uZW50cy9yZXNldC1wYXNzd29yZC1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9hY2NvdW50L3NlcnZpY2VzL2Zhdm9yaXRlcy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvYWNjb3VudC9zZXJ2aWNlcy91c2VyLWFjY291bnQuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2FkZGl0aW9uYWwtY29kZXMvX21vZHVsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvYWRkaXRpb25hbC1jb2Rlcy9jb21wb25lbnRzL2FkZGl0aW9uYWwtY29kZS1waWNrZXIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2FkZGl0aW9uYWwtY29kZXMvY29tcG9uZW50cy9hZGRpdGlvbmFsLWNvZGVzLXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2FkZGl0aW9uYWwtY29kZXMvY29tcG9uZW50cy9tZWFzdXJlLWFkZGl0aW9uYWwtY29kZS1idXR0b25zLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9hZGRpdGlvbmFsLWNvZGVzL2NvbXBvbmVudHMvbWVhc3VyZS1hZGRpdGlvbmFsLWNvZGVzLWV4cGFuZGVkLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9hZGRpdGlvbmFsLWNvZGVzL2ZpbHRlcnMvYWRkaXRpb25hbC1jb2RlLXR5cGVhaGVhZC1maWx0ZXIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2FkZGl0aW9uYWwtY29kZXMvbW9kYWxzL2FkZGl0aW9uYWwtY29kZS1zZWxlY3Rvci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvYWRkaXRpb25hbC1jb2Rlcy9zZXJ2aWNlcy9hZGRpdGlvbmFsLWNvZGVzLWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2FwcC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvYXRyL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2F0ci9jb21wb25lbnRzL2F0ci1idXR0b24uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2F0ci9jb21wb25lbnRzL2F0ci1kZXRhaWxzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9hdHIvY29tcG9uZW50cy9hdHItZm9ybS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvYXRyL2NvbXBvbmVudHMvYXRyLWltYWdlcy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvYXRyL2NvbXBvbmVudHMvYXRyLWxpc3QuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2F0ci9jb21wb25lbnRzL2F0ci1zZWFyY2gtcGFnZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvYXRyL21vZGFscy9hdHIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2F0ci9zZXJ2aWNlcy9hdHItZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvYmVsYXN0aW5nZGllbnN0L19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2JlbGFzdGluZ2RpZW5zdC9jb21wb25lbnRzL2JlbGFzdGluZ2RpZW5zdC1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9iZWxhc3RpbmdkaWVuc3Qvc2VydmljZXMvYmVsYXN0aW5nZGllbnN0LWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2J0aS9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9idGkvY29tcG9uZW50cy9idGktYnV0dG9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9idGkvY29tcG9uZW50cy9idGktZGV0YWlscy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvYnRpL2NvbXBvbmVudHMvYnRpLWZvcm0uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2J0aS9jb21wb25lbnRzL2J0aS1pbWFnZXMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2J0aS9jb21wb25lbnRzL2J0aS1saXN0LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9idGkvY29tcG9uZW50cy9idGktc2VhcmNoLXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2J0aS9tb2RhbHMvYnRpLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9idGkvc2VydmljZXMvYnRpLWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2Nhc2UtbGF3L19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2Nhc2UtbGF3L2NvbXBvbmVudHMvY2FzZS1sYXctYnV0dG9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jYXNlLWxhdy9jb21wb25lbnRzL2Nhc2UtbGF3LWxpbmtzLXRvLW5ld3MuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2Nhc2UtbGF3L2NvbXBvbmVudHMvY2FzZS1sYXctbmV3cy1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jYXNlLWxhdy9jb21wb25lbnRzL2Nhc2UtbGF3LW5ld3MuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2Nhc2UtbGF3L2NvbXBvbmVudHMvY2FzZS1sYXctc3VibmF2LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jYXNlLWxhdy9jb21wb25lbnRzL2V1LWNhc2UtbGF3LWxpc3QtaXRlbS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2FzZS1sYXcvY29tcG9uZW50cy9ldS1jYXNlLWxhdy1uZXdzLWl0ZW0uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2Nhc2UtbGF3L2NvbXBvbmVudHMvZXUtY2FzZS1sYXctcGFnZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2FzZS1sYXcvY29tcG9uZW50cy9ldS1jYXNlLWxhdy1zdW1tYXJ5LWJ1dHRvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2FzZS1sYXcvY29tcG9uZW50cy9ubC1jYXNlLWxhdy1saXN0LWl0ZW0uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2Nhc2UtbGF3L2NvbXBvbmVudHMvbmwtY2FzZS1sYXctbmV3cy1pdGVtLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jYXNlLWxhdy9jb21wb25lbnRzL25sLWNhc2UtbGF3LXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2Nhc2UtbGF3L21vZGFscy9jYXNlLWxhdy1tb2RhbC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2FzZS1sYXcvbW9kYWxzL2V1LWNhc2UtbGF3LXN1bW1hcnktbW9kYWwuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2Nhc2UtbGF3L21vZGFscy9ubC1jYXNlLWxhdy1qdWRnbWVudC1tb2RhbC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2FzZS1sYXcvc2VydmljZXMvY2FzZS1sYXctZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2FzZS1sYXcvc2VydmljZXMvZXUtY2FzZS1sYXctZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2FzZS1sYXcvc2VydmljZXMvbmwtY2FzZS1sYXctZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2VydGlmaWNhdGUtY29kZXMvX21vZHVsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2VydGlmaWNhdGUtY29kZXMvY29tcG9uZW50cy9jZXJ0aWZpY2F0ZS1jb2RlLXBpY2tlci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2VydGlmaWNhdGUtY29kZXMvY29tcG9uZW50cy9jZXJ0aWZpY2F0ZS1jb2Rlcy1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jZXJ0aWZpY2F0ZS1jb2Rlcy9maWx0ZXJzL2NlcnRpZmljYXRlLWNvZGUtdHlwZWFoZWFkLWZpbHRlci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2VydGlmaWNhdGUtY29kZXMvbW9kYWxzL2NlcnRpZmljYXRlLWNvZGUtc2VsZWN0b3IuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NlcnRpZmljYXRlLWNvZGVzL3NlcnZpY2VzL2NlcnRpZmljYXRlLWNvZGVzLWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zL2NvbXBvbmVudHMvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbi1uZXcuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zL2NvbXBvbmVudHMvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbi1vbGQuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zL2NvbXBvbmVudHMvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvY29tcG9uZW50cy9zZWFyY2gtY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMtZW5nbGlzaC1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy9jb21wb25lbnRzL3NlYXJjaC1jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy9jb21wb25lbnRzL3RhcmlmZXJpbmcuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zL21vZGFscy9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy1lbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvbW9kYWxzL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy9zZXJ2aWNlcy9zZWFyY2gtY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMtZW5nbGlzaC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvc2VydmljZXMvc2VhcmNoLWNsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb21wbGlhbmNlL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvbXBsaWFuY2UvY29tcG9uZW50cy9jb21wbGlhbmNlLWRldGFpbHMtcGFnZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29tcGxpYW5jZS9jb21wb25lbnRzL2NvbXBsaWFuY2UtbmV3LXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvbXBsaWFuY2UvY29tcG9uZW50cy9jb21wbGlhbmNlLW92ZXJ2aWV3LXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvbXBsaWFuY2UvZmlsdGVycy9qb2Itc3RhdHVzLWRpc3BsYXkuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvbXBsaWFuY2UvbW9kYWxzL2NvbXBsaWFuY2UtaW5mby5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29tcGxpYW5jZS9tb2RhbHMvbW9kYWxzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb21wbGlhbmNlL3NlcnZpY2VzL2NvbXBsaWFuY2UtZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29uZmlnLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb3JlL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvcmUvY29udHJvbGxlcnMvcHJlbG9hZGVyLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb3JlL2RpcmVjdGl2ZXMvY29udmVydC10by1udW1iZXIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvcmUvZGlyZWN0aXZlcy9oYXMtcGVybWlzc2lvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29yZS9kaXJlY3RpdmVzL25nLWVudGVyLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb3JlL2RpcmVjdGl2ZXMvcmVwZWF0LWRlbGltaXRlci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29yZS9kaXJlY3RpdmVzL3Njcm9sbC10by10b3Atd2hlbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29yZS9zZXJ2aWNlcy5jb21tb24vYXV0aC1jaGVjay5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29yZS9zZXJ2aWNlcy5jb21tb24vY29tbW9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb3JlL3NlcnZpY2VzLmNvbW1vbi9lcnJvci1oYW5kbGluZy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29yZS9zZXJ2aWNlcy5jb21tb24vZm9ybWF0dGluZy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29yZS9zZXJ2aWNlcy5jb21tb24vaWRlbnRpdHkuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvcmUvc2VydmljZXMuY29tbW9uL2ludGVyYWN0aW9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb3JlL3NlcnZpY2VzLmNvbW1vbi9sYW5ndWFnZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29yZS9zZXJ2aWNlcy5jb21tb24vbm90aWZpY2F0aW9ucy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29yZS9zZXJ2aWNlcy5jb21tb24vcHJlbG9hZGVyLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb3JlL3NlcnZpY2VzLmNvbW1vbi92ZXJzaW9uLWhpc3RvcnkuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvcmUvc2VydmljZXMuZGF0YS9kYXRhLWNvbnRleHQuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvcmUvc2VydmljZXMuZGF0YS9wcmVmZXJlbmNlcy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29yZS9zZXJ2aWNlcy5kYXRhL3NlcmlhbGl6YXRpb24uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvcmUvc2VydmljZXMuc3RhdGUvYXBwbGljYXRpb24tc3RhdGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvcnJlbGF0aW9uLXRhYmxlL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvcnJlbGF0aW9uLXRhYmxlL2NvbXBvbmVudHMvY29ycmVsYXRpb24tdGFibGUtbmV3cy1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb3JyZWxhdGlvbi10YWJsZS9jb21wb25lbnRzL2NvcnJlbGF0aW9uLXRhYmxlLXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2NvcnJlbGF0aW9uLXRhYmxlL2NvbXBvbmVudHMvY29ycmVsYXRpb24tdGFibGUtc3VibmF2LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb3JyZWxhdGlvbi10YWJsZS9jb21wb25lbnRzL2NvcnJlbGF0aW9uLXRhYmxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb3JyZWxhdGlvbi10YWJsZS9jb21wb25lbnRzL2hzLTIwMjItYmFja3dhcmQtcGFnZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29ycmVsYXRpb24tdGFibGUvY29tcG9uZW50cy9ocy0yMDIyLWJhY2t3YXJkLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb3JyZWxhdGlvbi10YWJsZS9jb21wb25lbnRzL2hzLTIwMjItZm9yd2FyZC1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jb3JyZWxhdGlvbi10YWJsZS9jb21wb25lbnRzL2hzLTIwMjItZm9yd2FyZC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY29ycmVsYXRpb24tdGFibGUvc2VydmljZXMvY29ycmVsYXRpb24tZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY3VzdG9tcy12YWx1ZS9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jdXN0b21zLXZhbHVlL2NvbXBvbmVudHMvdHJhbnNhY3Rpb24tdmFsdWUtY2FsY3VsYXRvci1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9jdXN0b21zLXZhbHVlL2NvbXBvbmVudHMvdHJhbnNhY3Rpb24tdmFsdWUtY2FsY3VsYXRvci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY3VzdG9tcy12YWx1ZS9jb21wb25lbnRzL3RyYW5zYWN0aW9uLXZhbHVlLWNvbXBvbmVudC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY3VzdG9tcy12YWx1ZS9tb2RhbHMvdHJhbnNhY3Rpb24tdmFsdWUtY2FsY3VsYXRvci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvY3VzdG9tcy12YWx1ZS9zZXJ2aWNlcy90cmFuc2FjdGlvbi12YWx1ZS1kYXRhLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9kYXNoYm9hcmQvX21vZHVsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZGFzaGJvYXJkL2NvbXBvbmVudHMvbGFuZGluZy1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9kYXNoYm9hcmQvbW9kYWxzL2ZpcnN0LWxvZ2luLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9kb2N1bWVudGF0aW9uL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2RvY3VtZW50YXRpb24vY29tcG9uZW50cy9kb2N1bWVudGF0aW9uLWJ1dHRvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZG9jdW1lbnRhdGlvbi9zZXJ2aWNlcy9kb2N1bWVudGF0aW9uLXNlcnZpY2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2R1dHkvX21vZHVsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZHV0eS9zZXJ2aWNlcy9kdXR5LWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2VjaWNzL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2VjaWNzL2NvbXBvbmVudHMvZWNpY3MtYnV0dG9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9lY2ljcy9jb21wb25lbnRzL2VjaWNzLWRldGFpbHMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2VjaWNzL2NvbXBvbmVudHMvZWNpY3MtZm9ybS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZWNpY3MvY29tcG9uZW50cy9lY2ljcy1pbWFnZXMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2VjaWNzL2NvbXBvbmVudHMvZWNpY3MtbGlzdC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZWNpY3MvY29tcG9uZW50cy9lY2ljcy1zZWFyY2gtcGFnZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZWNpY3MvbW9kYWxzL2VjaWNzLW1vZGFsLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9lY2ljcy9zZXJ2aWNlcy9lY2ljcy1kYXRhLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9leGNoYW5nZS1yYXRlcy9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9leGNoYW5nZS1yYXRlcy9jb21wb25lbnRzL2N1cnJlbmN5LXBpY2tlci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZXhjaGFuZ2UtcmF0ZXMvY29tcG9uZW50cy9leGNoYW5nZS1yYXRlcy1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9leGNoYW5nZS1yYXRlcy9jb21wb25lbnRzL21vbmV0YXJ5LXZhbHVlLWlucHV0LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9leGNoYW5nZS1yYXRlcy9maWx0ZXJzL2N1cnJlbmN5LXR5cGVhaGVhZC1maWx0ZXIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2V4Y2hhbmdlLXJhdGVzL21vZGFscy9jdXJyZW5jeS1zZWxlY3Rvci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZXhjaGFuZ2UtcmF0ZXMvc2VydmljZXMvZXhjaGFuZ2UtcmF0ZS1kYXRhLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9lenQvX21vZHVsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZXp0L2NvbXBvbmVudHMvZXp0LWV4Y2lzZS1jb2RlLXBpY2tlci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZXp0L2NvbXBvbmVudHMvZXp0LWhpbndlaXNlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9lenQvY29tcG9uZW50cy9lenQtbm9tZW5jbGF0dXJlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9lenQvY29tcG9uZW50cy9lenQtdGV4dHMtcGFnZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZXp0L2ZpbHRlcnMvZXp0LWV4Y2lzZS1jb2RlLXR5cGVhaGVhZC1maWx0ZXIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2V6dC9tb2RhbHMvZXp0LWV4Y2lzZS1jb2RlLXNlbGVjdG9yLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9lenQvc2VydmljZXMvZXp0LWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2Zvb3Rub3Rlcy9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9mb290bm90ZXMvY29tcG9uZW50cy9mb290bm90ZS1idXR0b25zLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9mb290bm90ZXMvY29tcG9uZW50cy9mb290bm90ZS1vdmVydmlldy1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9mb290bm90ZXMvbW9kYWxzL2Zvb3Rub3RlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9mb290bm90ZXMvbW9kYWxzL21vZGFscy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZm9vdG5vdGVzL3NlcnZpY2VzL2Zvb3Rub3RlLWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dlb2dyYXBoeS9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9nZW9ncmFwaHkvY29tcG9uZW50cy9jb3VudHJ5LXBpY2tlci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ2VvZ3JhcGh5L2NvbXBvbmVudHMvcmVnaW9uLWRpc3BsYXkuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dlb2dyYXBoeS9jb21wb25lbnRzL3JlZ2lvbi1vdmVydmlldy1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9nZW9ncmFwaHkvbW9kYWxzL21vZGFscy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ2VvZ3JhcGh5L21vZGFscy9yZWdpb24uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dlb2dyYXBoeS9zZXJ2aWNlcy9jb3VudHJ5LWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dlb2dyYXBoeS9zZXJ2aWNlcy9yZWdpb24tZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9nb29kL2NvbXBvbmVudHMvYW50aS1kdW1waW5nLWZpbmFuY2lhbC1tZWFzdXJlcy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9jb21wb25lbnRzL2N1c3RvbXMtdmFsdWUtY2hlY2stcmVzdWx0LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9nb29kL2NvbXBvbmVudHMvZHV0eS1jYWxjdWxhdGlvbi1yZXN1bHQuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2QvY29tcG9uZW50cy9leHBvcnQtbWVhc3VyZXMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2QvY29tcG9uZW50cy9mYXZvcml0ZS1idXR0b24uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2QvY29tcG9uZW50cy9maW5hbmNpYWwtbWVhc3VyZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9jb21wb25lbnRzL2dlbmVyYWwtbWVhc3VyZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9jb21wb25lbnRzL2dlcm1hbi1leGNpc2UtbWVhc3VyZXMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2QvY29tcG9uZW50cy9nZXJtYW4tdmF0LW1lYXN1cmVzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9nb29kL2NvbXBvbmVudHMvZ3JvdXBlZC1maW5hbmNpYWwtbWVhc3VyZXMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2QvY29tcG9uZW50cy9ncm91cGVkLWdlbmVyYWwtbWVhc3VyZXMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2QvY29tcG9uZW50cy9ncm91cGVkLXZhdC1tZWFzdXJlcy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9jb21wb25lbnRzL2ltcG9ydC1tZWFzdXJlcy1jb2wtMS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9jb21wb25lbnRzL2ltcG9ydC1tZWFzdXJlcy1jb2wtMi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9jb21wb25lbnRzL21lYXN1cmUtY29uZGl0aW9uLWJ1dHRvbnMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2QvY29tcG9uZW50cy9tZWFzdXJlLWNvbmRpdGlvbi1ncm91cHMtZXhwYW5kZWQuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2QvY29tcG9uZW50cy9tZWFzdXJlLW1hbnktY29uZGl0aW9uLWJ1dHRvbnMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2QvY29tcG9uZW50cy9tZWFzdXJlLXByZWZlcmVuY2UtY29kZS1idXR0b25zLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9nb29kL2NvbXBvbmVudHMvcmVmZXJlbmNlLWRhdGUtYW5kLWNvdW50cnkuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2QvY29udHJvbGxlcnMvZ29vZC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9kaXJlY3RpdmVzL2Zvcm0vbWVhc3VyZS1maWx0ZXJzLWV4cG9ydC1zbWFsbC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9kaXJlY3RpdmVzL2Zvcm0vbWVhc3VyZS1maWx0ZXJzLWltcG9ydC1zbWFsbC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9kaXJlY3RpdmVzL2Zvcm0vbWVhc3VyZS1maWx0ZXJzLWltcG9ydC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9kaXJlY3RpdmVzL2Zvcm0vdmFsdWUtcXVhbnRpdHktaW1wb3J0LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9nb29kL21vZGFscy9tZXVyc2luZy1jb2RlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9nb29kL21vZGFscy9tb2RhbHMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2QvbW9kYWxzL3VrLWNlcnRpZmljYXRlLWd1aWRhbmNlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9nb29kL3NlcnZpY2VzL2dvb2QtZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvZ29vZC9zZXJ2aWNlcy9nb29kLWRpc3BsYXkuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2Qvc2VydmljZXMvZ29vZC1tb2RlbHMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2dvb2Qvc2VydmljZXMvbWVhc3VyZS1ncm91cGluZy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvbGlua3MvX21vZHVsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvbGlua3MvY29tcG9uZW50cy9jYXNlLWxhdy1saW5rLXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL2xpbmtzL2NvbXBvbmVudHMvZXVyLWxleC1saW5rLXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL21lYXN1cmUtdHlwZXMvX21vZHVsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvbWVhc3VyZS10eXBlcy9jb21wb25lbnRzL21lYXN1cmUtdHlwZS1waWNrZXIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL21lYXN1cmUtdHlwZXMvZmlsdGVycy9tZWFzdXJlLXR5cGUtdHlwZWFoZWFkLWZpbHRlci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvbWVhc3VyZS10eXBlcy9tb2RhbHMvbWVhc3VyZS10eXBlLXNlbGVjdG9yLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9tZWFzdXJlLXR5cGVzL3NlcnZpY2VzL21lYXN1cmUtdHlwZXMtZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvbmV3cy9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9uZXdzL2NvbXBvbmVudHMvY2FzZS1sYXctbGlua3MuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL25ld3MvY29tcG9uZW50cy9jYXNlLWxhdy1uZXdzLXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL25ld3MvY29tcG9uZW50cy9uZXdzLW92ZXJ2aWV3LXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL25ld3MvY29tcG9uZW50cy9uZXdzLXN1Ym5hdi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvbmV3cy9zZXJ2aWNlcy9uZXdzLWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL25vbWVuY2xhdHVyZS9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9ub21lbmNsYXR1cmUvY29tcG9uZW50cy9jaGFwdGVyLXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL25vbWVuY2xhdHVyZS9jb21wb25lbnRzL2NvbW1vZGl0eS1jb2RlLWRlc2NyaXB0aW9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9ub21lbmNsYXR1cmUvY29tcG9uZW50cy9leHBvcnQtcmVmdW5kLW5vbWVuY2xhdHVyZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvbm9tZW5jbGF0dXJlL2NvbXBvbmVudHMvbm9tZW5jbGF0dXJlLWNoYXB0ZXIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL25vbWVuY2xhdHVyZS9jb21wb25lbnRzL25vbWVuY2xhdHVyZS1ncm91cHMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL25vbWVuY2xhdHVyZS9jb21wb25lbnRzL25vbWVuY2xhdHVyZS1oZWFkaW5nLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9ub21lbmNsYXR1cmUvY29tcG9uZW50cy9ub21lbmNsYXR1cmUtc2VjdGlvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvbm9tZW5jbGF0dXJlL2NvbXBvbmVudHMvc2VjdGlvbnMtcGFnZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvbm9tZW5jbGF0dXJlL2NvbXBvbmVudHMvdGFyZXMtc3RhdGlzdGljYWwta2V5LXJvdy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvbm9tZW5jbGF0dXJlL2NvbXBvbmVudHMvdGFyaWMtY29kZS1yb3cuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL25vbWVuY2xhdHVyZS9zZXJ2aWNlcy9ub21lbmNsYXR1cmUtZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvbm9tZW5jbGF0dXJlL3NlcnZpY2VzL25vbWVuY2xhdHVyZS10cmVlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9wYXR0ZXJucy9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9wYXR0ZXJucy9jb21wb25lbnRzL2JhY2tncm91bmQtcGF0dGVybi0wMS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcGF0dGVybnMvY29tcG9uZW50cy9iYWNrZ3JvdW5kLXBhdHRlcm4tMDIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3ByZWZlcmVuY2UtY29kZXMvX21vZHVsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcHJlZmVyZW5jZS1jb2Rlcy9jb21wb25lbnRzL3ByZWZlcmVuY2UtY29kZS1idXR0b24uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3ByZWZlcmVuY2UtY29kZXMvY29tcG9uZW50cy9wcmVmZXJlbmNlLWNvZGUtcGlja2VyLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9wcmVmZXJlbmNlLWNvZGVzL2ZpbHRlcnMvcHJlZmVyZW5jZS1jb2RlLXR5cGVhaGVhZC1maWx0ZXIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3ByZWZlcmVuY2UtY29kZXMvbW9kYWxzL3ByZWZlcmVuY2UtY29kZS1zZWxlY3Rvci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcHJlZmVyZW5jZS1jb2Rlcy9tb2RhbHMvcHJlZmVyZW5jZS1jb2RlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9wcmVmZXJlbmNlLWNvZGVzL3NlcnZpY2VzL3ByZWZlcmVuY2UtY29kZS1kYXRhLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9xdW90YS9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9xdW90YS9jb21wb25lbnRzL29yZGVyLW51bWJlci1waWNrZXIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3F1b3RhL2NvbXBvbmVudHMvb3JkZXJudW1iZXItYnV0dG9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9xdW90YS9jb21wb25lbnRzL3VrLW9yZGVybnVtYmVyLWJ1dHRvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcXVvdGEvZmlsdGVycy9vcmRlci1udW1iZXItdHlwZWFoZWFkLWZpbHRlci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcXVvdGEvbW9kYWxzL21vZGFscy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcXVvdGEvbW9kYWxzL29yZGVyLXF1b3RhLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9xdW90YS9tb2RhbHMvdWstb3JkZXItcXVvdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3F1b3RhL3NlcnZpY2VzL3F1b3RhLWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3JlZmVyZW5jZS1kYXRlL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3JlZmVyZW5jZS1kYXRlL2NvbXBvbmVudHMvcmVmZXJlbmNlLWRhdGUtcGlja2VyLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9yZWZlcmVuY2UtZGF0ZS9zZXJ2aWNlcy9yZWZlcmVuY2UtZGF0ZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcmVmZXJlbmNlcHJpY2VzL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3JlZmVyZW5jZXByaWNlcy9jb21wb25lbnRzL292ZXJ2aWV3LXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3JlZmVyZW5jZXByaWNlcy9zZXJ2aWNlcy9yZWZlcmVuY2VwcmljZXMtZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcmVndWxhdGlvbnMvX21vZHVsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcmVndWxhdGlvbnMvY29tcG9uZW50cy9yZWd1bGF0aW9uLWJ1dHRvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcmVndWxhdGlvbnMvY29tcG9uZW50cy9yZWd1bGF0aW9uLWRldGFpbHMtcGFnZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcmVndWxhdGlvbnMvY29tcG9uZW50cy9yZWd1bGF0aW9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9yZWd1bGF0aW9ucy9jb21wb25lbnRzL3JlZ3VsYXRpb25zLWJ1dHRvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcmVndWxhdGlvbnMvY29tcG9uZW50cy9yZWd1bGF0aW9ucy1uZXdzLXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3JlZ3VsYXRpb25zL2NvbXBvbmVudHMvcmVndWxhdGlvbnMtbmV3cy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcmVndWxhdGlvbnMvZmlsdGVycy9jZWxleC10by1yZWd1bGF0aW9uLW51bWJlci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcmVndWxhdGlvbnMvbW9kYWxzL3JlZ3VsYXRpb24uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3JlZ3VsYXRpb25zL21vZGFscy9yZWd1bGF0aW9ucy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvcmVndWxhdGlvbnMvc2VydmljZXMvcmVndWxhdGlvbnMtZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvc2VhcmNoL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3NlYXJjaC9jb21wb25lbnRzL2ZvdW5kLXRleHRzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9zZWFyY2gvY29tcG9uZW50cy9oZWFkZXItc2VhcmNoLWJveC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvc2VhcmNoL2NvbXBvbmVudHMvaGVhZGluZy1zZWFyY2gtcmVzdWx0cy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvc2VhcmNoL2NvbXBvbmVudHMvbGFyZ2Utc2VhcmNoLWJveC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvc2VhcmNoL2NvbXBvbmVudHMvbm9tZW5jbGF0dXJlLXNlYXJjaC1mb3JtLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9zZWFyY2gvY29tcG9uZW50cy9wYWdlcy9zZWFyY2gtYWxwaGFiZXRpY2FsLWluZGV4LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9zZWFyY2gvY29tcG9uZW50cy9wYWdlcy9zZWFyY2gtYW5ub3RhdGlvbnMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3NlYXJjaC9jb21wb25lbnRzL3BhZ2VzL3NlYXJjaC1jY2MtY29uY2x1c2lvbnMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3NlYXJjaC9jb21wb25lbnRzL3BhZ2VzL3NlYXJjaC1ldS1leHBsYW5hdG9yeS1ub3Rlcy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvc2VhcmNoL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLWV4cGxhbmF0b3J5LW5vdGVzLWdlcm1hbnkuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3NlYXJjaC9jb21wb25lbnRzL3BhZ2VzL3NlYXJjaC1oZWFkaW5nLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9zZWFyY2gvY29tcG9uZW50cy9wYWdlcy9zZWFyY2gtdGV4dHMtZ2VybWFueS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvc2VhcmNoL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLXdjby1jbGFzc2lmaWNhdGlvbi1vcGluaW9ucy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvc2VhcmNoL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLXdjby1leHBsYW5hdG9yeS1ub3Rlcy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvc2VhcmNoL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9zZWFyY2gvY29tcG9uZW50cy9zZWFyY2gtZm9ybS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvc2VhcmNoL2NvbXBvbmVudHMvc2VhcmNoLXN1Yi1uYXYuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3NlYXJjaC9jb250cm9sbGVycy9zZWFyY2gtYm94LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC9zZWFyY2gvc2VydmljZXMvc2VhcmNoLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90YXJlcy9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90YXJlcy9jb21wb25lbnRzL3RhcmVzLW1lYXN1cmVzLXBhZ2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RhcmVzL3NlcnZpY2VzL3RhcmVzLXN0YXRpc3RpY2FsLWtleXMtZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdGFyZXMvc2VydmljZXMvdGFyZXMtdGFyaWZmLWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RleHRzL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RleHRzL2NvbXBvbmVudHMvYW5ub3RhdGlvbi1idXR0b24uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RleHRzL2NvbXBvbmVudHMvYW5ub3RhdGlvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdGV4dHMvY29tcG9uZW50cy9jY2MtY29uY2x1c2lvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdGV4dHMvY29tcG9uZW50cy9leHBsYW5hdG9yeS1ub3RlLWJ1dHRvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdGV4dHMvY29tcG9uZW50cy9ub3RlLXNvdXJjZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdGV4dHMvY29tcG9uZW50cy93Y28tY2xhc3NpZmljYXRpb24tb3Bpbmlvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdGV4dHMvbW9kYWxzL2Fubm90YXRpb25zLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90ZXh0cy9tb2RhbHMvZXhwbGFuYXRvcnktbm90ZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdGV4dHMvc2VydmljZXMvYW5ub3RhdGlvbnMtZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdGV4dHMvc2VydmljZXMvdGV4dC1kYXRhLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFkZS1tb3ZlbWVudC9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFkZS1tb3ZlbWVudC9zZXJ2aWNlcy90cmFkZS1tb3ZlbWVudC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhZGUtc3RhdGlzdGljcy9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFkZS1zdGF0aXN0aWNzL2NvbXBvbmVudHMvdHJhZGUtc3RhdGlzdGljcy1wYWdlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFkZS1zdGF0aXN0aWNzL2NvbXBvbmVudHMvdHJhZGUtc3RhdGlzdGljcy10YWJsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhZGUtc3RhdGlzdGljcy9zZXJ2aWNlcy90cmFkZS1zdGF0aXN0aWNzLWRhdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9lbi9faW5kZXguanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9lbi9hY2NvdW50LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vYXRyLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vYnRpLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vY2FzZS1sYXcuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9lbi9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vY29tcGxpYW5jZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL2NvbmNsdXNpb24uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9lbi9jb3JyZWxhdGlvbi10YWJsZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL2N1c3RvbXMtdmFsdWUtY2hlY2suanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9lbi9jdXN0b21zLXZhbHVlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vZGFzaGJvYXJkLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vZG9jdW1lbnRhdGlvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL2VjaWNzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vZXhjaGFuZ2UtcmF0ZXMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9lbi9lenQuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9lbi9mb3JtLWxhYmVscy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL2dvb2RzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vbWFpbi1tZW51LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vbmV3cy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL25vbWVuY2xhdHVyZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL3F1b3RhLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vcmVmZXJlbmNlcHJpY2VzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vcmVndWxhdGlvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL3NlYXJjaC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL3NoYXJlZC1tZXNzYWdlcy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL3NoYXJlZC11aS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL3NvcnQtb3B0aW9ucy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL3N0YXR1cy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL3RhcmVzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vdGFyaWMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9lbi90cmFkZS1zdGF0aXN0aWNzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvZW4vdmFsaWRhdGUtYnVzaW5lc3MtaW5mby5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2VuL3ZhbGlkYXRpb24tZXJyb3JzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvaXQvX2luZGV4LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvaXQvYnRpLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvaXQvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2l0L2Rhc2hib2FyZC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL2l0L2V4Y2hhbmdlLXJhdGVzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvaXQvZ29vZHMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9pdC9ub21lbmNsYXR1cmUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9pdC9zaGFyZWQtdWkuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9pdC90YXJpYy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL25sL19pbmRleC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL25sL2FjY291bnQuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC9hdHIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC9idGkuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC9jYXNlLWxhdy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL25sL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb24uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC9jb21wbGlhbmNlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvY29uY2x1c2lvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL25sL2NvcnJlbGF0aW9uLXRhYmxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvY3VzdG9tcy12YWx1ZS1jaGVjay5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL25sL2N1c3RvbXMtdmFsdWUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC9kYXNoYm9hcmQuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC9kb2N1bWVudGF0aW9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvZWNpY3MuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC9leGNoYW5nZS1yYXRlcy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL25sL2V6dC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL25sL2Zvcm0tbGFiZWxzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvZ29vZHMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC9tYWluLW1lbnUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC9uZXdzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvbm9tZW5jbGF0dXJlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvcXVvdGEuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC9yZWZlcmVuY2VwcmljZXMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC9yZWd1bGF0aW9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvc2VhcmNoLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvc2hhcmVkLW1lc3NhZ2VzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvc2hhcmVkLXVpLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvc29ydC1vcHRpb25zLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvc3RhdHVzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvdGFyaWMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3RyYW5zbGF0aW9ucy9ubC90cmFkZS1zdGF0aXN0aWNzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC90cmFuc2xhdGlvbnMvbmwvdmFsaWRhdGUtYnVzaW5lc3MtaW5mby5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdHJhbnNsYXRpb25zL25sL3ZhbGlkYXRpb24tZXJyb3JzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC91bml0cy9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC91bml0cy9maWx0ZXJzL2lzLW5vdC1yZXRhaWwtcHJpY2UuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3VuaXRzL2ZpbHRlcnMvaXMtcmV0YWlsLXByaWNlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC92YWxpZGF0ZS1idXNpbmVzcy1pbmZvL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8vY29tcG9uZW50cy92YWxpZGF0ZS1idXNpbmVzcy1pbmZvLWNkLWZvcm0uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8vY29tcG9uZW50cy92YWxpZGF0ZS1idXNpbmVzcy1pbmZvLWVvcmktZm9ybS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdmFsaWRhdGUtYnVzaW5lc3MtaW5mby9jb21wb25lbnRzL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8tcmV4LWZvcm0uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8vY29tcG9uZW50cy92YWxpZGF0ZS1idXNpbmVzcy1pbmZvLXN1Ym5hdi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdmFsaWRhdGUtYnVzaW5lc3MtaW5mby9jb21wb25lbnRzL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8tdmF0LWZvcm0uanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8vbW9kYWxzL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8tcmV4LW1vZGFsLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC92YWxpZGF0ZS1idXNpbmVzcy1pbmZvL3NlcnZpY2VzL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8tZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvdmF0LXJhdGVzL19tb2R1bGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3ZhdC1yYXRlcy9jb21wb25lbnRzL3ZhdC1tZWFzdXJlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC92YXQtcmF0ZXMvY29tcG9uZW50cy92YXQtcmF0ZXMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3ZhdC1yYXRlcy9zZXJ2aWNlcy92YXQtcmF0ZXMtZGF0YS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9fbW9kdWxlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC93aWRnZXRzL2NvbXBvbmVudHMvZmVlZGJhY2stYnV0dG9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC93aWRnZXRzL2NvbXBvbmVudHMvZ29vZHNjb2RlLXNjcm9sbGVyLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC93aWRnZXRzL2NvbXBvbmVudHMvbG9hZGluZy1pbmRpY2F0b3IvbG9hZGluZy1pbmRpY2F0b3ItYmxvY2suanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3dpZGdldHMvY29tcG9uZW50cy9sb2FkaW5nLWluZGljYXRvci9sb2FkaW5nLWluZGljYXRvci1pbmxpbmUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3dpZGdldHMvY29tcG9uZW50cy9sb2FkaW5nLWluZGljYXRvci9sb2FkaW5nLWluZGljYXRvci1zbWFsbC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9jb21wb25lbnRzL21vZGFsLXByaW50LWJ1dHRvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9jb21wb25lbnRzL25hdmJhci1sYW5ndWFnZS1kcm9wZG93bi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9jb21wb25lbnRzL25hdmJhci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9jb21wb25lbnRzL3ByaW50LWJ1dHRvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9jb21wb25lbnRzL3JlY2VudC1jb2RlLWJ1dHRvbi5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9jb21wb25lbnRzL3JlZmVyZW5jZS1jb3VudHJ5LXBpY2tlci5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9jb21wb25lbnRzL3RhcmljLXN0YXR1cy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9jb21wb25lbnRzL3RyYW5zbGF0ZWQtdGV4dC5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9maWx0ZXJzL2FkZC1oeXBlcmxpbmtzLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC93aWRnZXRzL2ZpbHRlcnMvY291bnRyeS10eXBlYWhlYWQtZmlsdGVyLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC93aWRnZXRzL2ZpbHRlcnMvZm9ybWF0LWRlc2NyaXB0aW9uLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC93aWRnZXRzL2ZpbHRlcnMvZm9ybWF0LWR1dHkuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3dpZGdldHMvZmlsdGVycy9mb3JtYXQtZXp0LWNvZGUuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3dpZGdldHMvZmlsdGVycy9mb3JtYXQtZ24tY29kZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9maWx0ZXJzL2Zvcm1hdC10YXJpYy1jb2RlLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC93aWRnZXRzL2ZpbHRlcnMvaGFzLWFkZGl0aW9uYWwtY29kZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9maWx0ZXJzL2hhcy1jb3VudHJ5LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC93aWRnZXRzL2ZpbHRlcnMvaGlnaGxpZ2h0LmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC93aWRnZXRzL2ZpbHRlcnMvc3RyaXAtdGFyaWMtY29kZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9maWx0ZXJzL3RhcmljLWNvZGUtdG8tY2hhcHRlci1udW1iZXIuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3dpZGdldHMvZmlsdGVycy90YXJpYy1kYXNoZXMuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3dpZGdldHMvZmlsdGVycy90by1jdXJyZW5jeS1zaWduLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC93aWRnZXRzL2ZpbHRlcnMvdG8tZml4ZWQuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3dpZGdldHMvZmlsdGVycy90cmltLmpzIiwiRDovYS8xL3MvVGFyaWMuQW5ndWxhckFwcGxpY2F0aW9uL2FwcC93aWRnZXRzL2ZpbHRlcnMvdHJ1c3QuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3dpZGdldHMvbW9kYWxzL2FyZS15b3Utc3VyZS5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9tb2RhbHMvbG9nZ2luZy1vdXQuanMiLCJEOi9hLzEvcy9UYXJpYy5Bbmd1bGFyQXBwbGljYXRpb24vYXBwL3dpZGdldHMvbW9kYWxzL21vZGFscy5qcyIsIkQ6L2EvMS9zL1RhcmljLkFuZ3VsYXJBcHBsaWNhdGlvbi9hcHAvd2lkZ2V0cy9zZXJ2aWNlcy90YXJpYy1zdGF0dXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQSxDQUFDO0tBQ0ksT0FBTyxpQkFBaUI7S0FDeEIsT0FBTyxDQUFDLGtCQUFrQjtLQUMxQixVQUFVLHNCQUFzQixRQUFRO0tBQ3hDLFVBQVUsc0JBQXNCLFFBQVE7S0FDeEMsVUFBVSxhQUFhLFFBQVE7S0FDL0IsVUFBVSxjQUFjLFFBQVE7S0FDaEMsVUFBVSxxQkFBcUIsUUFBUTtLQUN2QyxRQUFRLG9CQUFvQixRQUFRO0tBQ3BDLFFBQVEsc0JBQXNCLFFBQVE7O0FBRTNDLFNBQVMsa0JBQWtCLGdCQUFnQjtJQUN2QztTQUNLLEtBQUssNEJBQTRCO1lBQzlCLFVBQVU7O1NBRWIsS0FBSyw0QkFBNEI7WUFDOUIsVUFBVTs7U0FFYixLQUFLLGtCQUFrQjtZQUNwQixVQUFVOztTQUViLEtBQUssbUJBQW1CO1lBQ3JCLFVBQVU7O1NBRWIsS0FBSywyQkFBMkI7WUFDN0IsVUFBVTs7OztBQUl0QjtBQzlCQSxPQUFPLFVBQVU7SUFDYixZQUFZO0lBQ1osYUFBYTs7O0FBR2pCLDZCQUE2QixVQUFVO0lBQ25DO0lBQ0E7SUFDQTs7O0FBR0osU0FBUztJQUNMO0lBQ0E7SUFDQTtFQUNGO0lBQ0UsSUFBSSxLQUFLO1FBQ0wsU0FBUztRQUNULFdBQVc7UUFDWCxnQkFBZ0I7UUFDaEIsZUFBZTtRQUNmLE9BQU87WUFDSCxpQkFBaUI7WUFDakIsY0FBYztZQUNkLGNBQWM7WUFDZCxRQUFRO2dCQUNKLFlBQVk7Z0JBQ1osV0FBVztnQkFDWCxXQUFXO2dCQUNYLFVBQVU7Z0JBQ1YsUUFBUTs7WUFFWiw0QkFBNEI7WUFDNUIsdUJBQXVCOztRQUUzQixRQUFRO1lBQ0os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Ozs7UUFHOUIsU0FBUyxVQUFVO1lBQ2Ysa0JBQWtCLFFBQVE7OztRQUc5QixPQUFPOzs7SUFHWCxTQUFTLGVBQWU7Ozs7SUFJeEIsU0FBUyxZQUFZOztRQUVqQixPQUFPLFVBQVUsS0FBSztZQUNsQixXQUFXO1lBQ1gsVUFBVTtZQUNWLFlBQVk7WUFDWixjQUFjO1lBQ2QsVUFBVTtZQUNWLFdBQVc7WUFDWCxhQUFhOzs7O0lBSXJCLE9BQU87O0FBRVg7QUMvQ0EsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxtQkFBbUIsbUJBQW1COztBQUV6RCxTQUFTLG9CQUFvQixpQkFBaUIsaUJBQWlCOztJQUUzRCxJQUFJLFVBQVU7UUFDVixZQUFZO1FBQ1osWUFBWTs7O0lBR2hCLE9BQU87OztBQUdYO0FDWkEsT0FBTyxVQUFVLENBQUMsVUFBVSxlQUFlLDJCQUEyQjs7QUFFdEUsU0FBUyxtQkFBbUIsUUFBUSxTQUFTLE9BQU87SUFDaEQsSUFBSSxVQUFVO1FBQ1YsNEJBQTRCO1FBQzVCLFFBQVE7UUFDUixlQUFlLE9BQU87OztJQUcxQixTQUFTLDZCQUE2QjtRQUNsQyxPQUFPLFFBQVEsSUFBSSxPQUFPLFNBQVMsT0FBTyxjQUFjLDhCQUE4QixNQUFNLE9BQU87YUFDOUYsS0FBSyxVQUFVLFFBQVE7Z0JBQ3BCLFFBQVEseUJBQXlCOzs7O0lBSTdDLE9BQU87OztBQUdYIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwi77u/YW5ndWxhclxyXG4gICAgLm1vZHVsZSgndGFyaWMuYWNjb3VudCcsIFtdKVxyXG4gICAgLmNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgcm91dGVDb25maWd1cmF0b3JdKVxyXG4gICAgLmNvbXBvbmVudCgnY2hhbmdlUGFzc3dvcmRQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2NoYW5nZS1wYXNzd29yZC1wYWdlJykpXHJcbiAgICAuY29tcG9uZW50KCdmb3Jnb3RQYXNzd29yZFBhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZm9yZ290LXBhc3N3b3JkLXBhZ2UnKSlcclxuICAgIC5jb21wb25lbnQoJ2xvZ2luUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9sb2dpbi1wYWdlJykpXHJcbiAgICAuY29tcG9uZW50KCdsb2dvdXRQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2xvZ291dC1wYWdlJykpXHJcbiAgICAuY29tcG9uZW50KCdyZXNldFBhc3N3b3JkUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9yZXNldC1wYXNzd29yZC1wYWdlJykpXHJcbiAgICAuZmFjdG9yeSgnZmF2b3JpdGVzU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvZmF2b3JpdGVzJykpXHJcbiAgICAuZmFjdG9yeSgndXNlckFjY291bnRTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy91c2VyLWFjY291bnQnKSk7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL2FjY291bnQvY2hhbmdlLXBhc3N3b3JkJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxjaGFuZ2UtcGFzc3dvcmQtcGFnZT48Y2hhbmdlLXBhc3N3b3JkLXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9hY2NvdW50L2ZvcmdvdC1wYXNzd29yZCcsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8Zm9yZ290LXBhc3N3b3JkLXBhZ2U+PC9mb3Jnb3QtcGFzc3dvcmQtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2hlbignL2FjY291bnQvbG9naW4nLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPGxvZ2luLXBhZ2U+PC9sb2dpbi1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvYWNjb3VudC9sb2dvdXQnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPGxvZ291dC1wYWdlPjwvbG9nb3V0LXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9hY2NvdW50L3Jlc2V0LXBhc3N3b3JkJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxyZXNldC1wYXNzd29yZC1wYWdlPjwvcmVzZXQtcGFzc3dvcmQtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICA7XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBjaGFuZ2VQYXNzd29yZFBhZ2VDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdhY2NvdW50L2NvbXBvbmVudHMvY2hhbmdlLXBhc3N3b3JkLXBhZ2UuaHRtbCdcclxufVxyXG5cclxuY2hhbmdlUGFzc3dvcmRQYWdlQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckdHJhbnNsYXRlJywgXHJcbiAgICAndXNlckFjY291bnRTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGNoYW5nZVBhc3N3b3JkUGFnZUNvbnRyb2xsZXIoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICR0cmFuc2xhdGUsIFxyXG4gICAgdXNlckFjY291bnRTZXJ2aWNlXHJcbikge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRwb3N0TGluazogZm9jdXNJbnB1dEZpZWxkLFxyXG4gICAgICAgIGNoYW5nZVBhc3N3b3JkOiBjaGFuZ2VQYXNzd29yZCxcclxuICAgICAgICBjaGVja1N0cmVuZ3RoOiBjaGVja1N0cmVuZ3RoLFxyXG4gICAgICAgIG1vZGVsOiB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRQYXNzd29yZDogbnVsbCxcclxuICAgICAgICAgICAgbmV3UGFzc3dvcmQxOiBudWxsLFxyXG4gICAgICAgICAgICBuZXdQYXNzd29yZDI6IG51bGwsXHJcbiAgICAgICAgICAgIGNoZWNrczoge1xyXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBsb3dlcmNhc2U6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdXBwZXJjYXNlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG5vbmFscGhhOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG51bWJlcjogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcGFzc3dvcmRDaGFuZ2VkU3VjY2VzZnVsbHk6IGZhbHNlLFxyXG4gICAgICAgICAgICBlcnJvckNoYW5naW5nUGFzc3dvcmQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzdGF0dXM6IHtcclxuICAgICAgICAgICAgZXJyb3JzOiBbXSxcclxuICAgICAgICAgICAgdHJhbnNsYXRpb25zOiBbXVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9jaGFuZ2UtcGFzc3dvcmQnKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmb2N1c0lucHV0RmllbGQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1cnJlbnRQYXNzd29yZElucHV0JykuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VQYXNzd29yZCgpIHtcclxuICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IHZhbGlkYXRlKCk7XHJcbiAgICAgICAgdm0uc3RhdHVzLmVycm9ycyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAodmFsaWRhdGlvbiAmJiB2YWxpZGF0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdm0uc3RhdHVzLmVycm9ycyA9IHZhbGlkYXRpb247XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVzZXJBY2NvdW50U2VydmljZS5jaGFuZ2VQYXNzd29yZCh2bS5tb2RlbC5jdXJyZW50UGFzc3dvcmQsIHZtLm1vZGVsLm5ld1Bhc3N3b3JkMSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5Jc1N1Y2Nlc3NmdWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5wYXNzd29yZENoYW5nZWRTdWNjZXNmdWxseSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0LkNvZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5Db2Rlc1tpXSA9ICdhY2NvdW50LnJlc2V0UGFzc3dvcmQuZXJyb3JzLmR5bmFtaWMuJyArIHJlc3VsdC5Db2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc3RhdHVzLmVycm9ycyA9IHJlc3VsdC5Db2RlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLmRhdGEgJiYgZXJyb3IuZGF0YS5NZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc3RhdHVzLmVycm9ycyA9IFtlcnJvci5kYXRhLk1lc3NhZ2VdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zdGF0dXMuZXJyb3JzID0gW3ZtLnN0YXR1cy50cmFuc2xhdGlvbnNbJ2FjY291bnQuY2hhbmdlUGFzc3dvcmQuZXJyb3JDaGFuZ2luZ1Bhc3N3b3JkJ11dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjaGVja1N0cmVuZ3RoKCkge1xyXG4gICAgICAgIGlmICghdm0ubW9kZWwubmV3UGFzc3dvcmQxKSB7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLmNoZWNrcy5jaGFyYWN0ZXJzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLmNoZWNrcy5sb3dlcmNhc2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgdm0ubW9kZWwuY2hlY2tzLm5vbmFscGhhID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLmNoZWNrcy5udW1iZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgdm0ubW9kZWwuY2hlY2tzLnVwcGVyY2FzZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0ubW9kZWwuY2hlY2tzLmNoYXJhY3RlcnMgPSB2bS5tb2RlbC5uZXdQYXNzd29yZDEubGVuZ3RoID49IDg7XHJcbiAgICAgICAgdm0ubW9kZWwuY2hlY2tzLmxvd2VyY2FzZSA9IC9bYS16XS8uZXhlYyh2bS5tb2RlbC5uZXdQYXNzd29yZDEpICE9PSBudWxsO1xyXG4gICAgICAgIHZtLm1vZGVsLmNoZWNrcy5ub25hbHBoYSA9IC9cXFcvLmV4ZWModm0ubW9kZWwubmV3UGFzc3dvcmQxKSAhPT0gbnVsbDtcclxuICAgICAgICB2bS5tb2RlbC5jaGVja3MubnVtYmVyID0gL1xcZC8uZXhlYyh2bS5tb2RlbC5uZXdQYXNzd29yZDEpICE9PSBudWxsO1xyXG4gICAgICAgIHZtLm1vZGVsLmNoZWNrcy51cHBlcmNhc2UgPSAvW0EtWl0vLmV4ZWModm0ubW9kZWwubmV3UGFzc3dvcmQxKSAhPT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkVHJhbnNsYXRpb25zKCkge1xyXG4gICAgICAgICR0cmFuc2xhdGUoW1xyXG4gICAgICAgICAgICAnYWNjb3VudC5jaGFuZ2VQYXNzd29yZC5lcnJvckNoYW5naW5nUGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAnYWNjb3VudC5jaGFuZ2VQYXNzd29yZC5lcnJvckN1cnJlbnRQYXNzd29yZCcsXHJcbiAgICAgICAgICAgICdhY2NvdW50LmNoYW5nZVBhc3N3b3JkLmVycm9yTmV3UGFzc3dvcmRFbXB0eScsXHJcbiAgICAgICAgICAgICdhY2NvdW50LmNoYW5nZVBhc3N3b3JkLmVycm9yTmV3UGFzc3dvcmRDb21wYXJlJ1xyXG4gICAgICAgIF0pLnRoZW4oZnVuY3Rpb24gKHRyYW5zbGF0aW9ucykge1xyXG4gICAgICAgICAgICB2bS5zdGF0dXMudHJhbnNsYXRpb25zID0gdHJhbnNsYXRpb25zO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xyXG4gICAgICAgIHZhciBlcnJvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKCF2bS5tb2RlbC5jdXJyZW50UGFzc3dvcmQgfHwgdm0ubW9kZWwuY3VycmVudFBhc3N3b3JkID09PSAnJylcclxuICAgICAgICAgICAgZXJyb3JzLnB1c2godm0uc3RhdHVzLnRyYW5zbGF0aW9uc1snYWNjb3VudC5jaGFuZ2VQYXNzd29yZC5lcnJvckN1cnJlbnRQYXNzd29yZCddKTtcclxuXHJcbiAgICAgICAgaWYgKCF2bS5tb2RlbC5uZXdQYXNzd29yZDEgfHwgdm0ubW9kZWwubmV3UGFzc3dvcmQxID09PSAnJylcclxuICAgICAgICAgICAgZXJyb3JzLnB1c2godm0uc3RhdHVzLnRyYW5zbGF0aW9uc1snYWNjb3VudC5jaGFuZ2VQYXNzd29yZC5lcnJvck5ld1Bhc3N3b3JkRW1wdHknXSk7XHJcbiAgICAgICAgZWxzZSBpZiAodm0ubW9kZWwubmV3UGFzc3dvcmQxICE9PSB2bS5tb2RlbC5uZXdQYXNzd29yZDIpXHJcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHZtLnN0YXR1cy50cmFuc2xhdGlvbnNbJ2FjY291bnQuY2hhbmdlUGFzc3dvcmQuZXJyb3JOZXdQYXNzd29yZENvbXBhcmUnXSk7XHJcblxyXG4gICAgICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID4gMCA/IGVycm9ycyA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZFRyYW5zbGF0aW9ucygpO1xyXG5cclxuICAgIHJldHVybiB2bTtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGZvcmdvdFBhc3N3b3JkUGFnZUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2FjY291bnQvY29tcG9uZW50cy9mb3Jnb3QtcGFzc3dvcmQtcGFnZS5odG1sJ1xyXG59XHJcblxyXG5mb3Jnb3RQYXNzd29yZFBhZ2VDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyRsb2NhdGlvbicsIFxyXG4gICAgJyR0cmFuc2xhdGUnLCBcclxuICAgICd1c2VyQWNjb3VudFNlcnZpY2UnLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gZm9yZ290UGFzc3dvcmRQYWdlQ29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgJGxvY2F0aW9uLCBcclxuICAgICR0cmFuc2xhdGUsIFxyXG4gICAgdXNlckFjY291bnRcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRwb3N0TGluazogZm9jdXNJbnB1dEZpZWxkLFxyXG4gICAgICAgIHJlc2V0UGFzc3dvcmQ6IHJlc2V0UGFzc3dvcmQsXHJcbiAgICAgICAgbW9kZWw6IHtcclxuICAgICAgICAgICAgdXNlcm5hbWU6IG51bGxcclxuICAgICAgICB9LFxyXG4gICAgICAgIG5hdmlnYXRlVG86IG5hdmlnYXRlVG8sXHJcbiAgICAgICAgc3RhdHVzOiB7XHJcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxyXG4gICAgICAgICAgICBlcnJvcjogbnVsbCxcclxuICAgICAgICAgICAgbG9hZGluZzogZmFsc2VcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvZm9yZ290LXBhc3N3b3JkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZm9jdXNJbnB1dEZpZWxkKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpbi11c2VybmFtZScpLmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzZXRQYXNzd29yZCgpIHtcclxuICAgICAgICB2bS5zdGF0dXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgdmFyIGxhbmd1YWdlID0gJHRyYW5zbGF0ZS51c2UoKTtcclxuXHJcbiAgICAgICAgdXNlckFjY291bnQucmVzZXRQYXNzd29yZCh2bS5tb2RlbC51c2VybmFtZSwgbGFuZ3VhZ2UpXHJcbiAgICAgICAgICAgIC50aGVuKHJlc2V0U3VjY2VzcywgcmVzZXRFcnJvcik7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlc2V0U3VjY2VzcyhkYXRhLCBzdGF0dXMsIGhlYWRlcnMpIHtcclxuICAgICAgICAgICAgdm0uc3RhdHVzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdm0uc3RhdHVzLmRvbmUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcmVzZXRFcnJvcihlcnJvciwgc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHZtLnN0YXR1cy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLnN0YXR1cy5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBuYXZpZ2F0ZVRvKHBhdGgpIHtcclxuICAgICAgICAkbG9jYXRpb24udXJsKHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7fSxcclxuICAgIGNvbnRyb2xsZXI6IGxvZ2luUGFnZUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2FjY291bnQvY29tcG9uZW50cy9sb2dpbi1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG5sb2dpblBhZ2VDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyRsb2NhdGlvbicsIFxyXG4gICAgJ3VzZXJBY2NvdW50U2VydmljZScsIFxyXG4gICAgJ3ByZWxvYWRlclNlcnZpY2UnLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gbG9naW5QYWdlQ29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgJGxvY2F0aW9uLCBcclxuICAgIHVzZXJBY2NvdW50LCBcclxuICAgIHByZWxvYWRlclxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJHBvc3RMaW5rOiBmb2N1c0lucHV0RmllbGQsXHJcbiAgICAgICAgbG9naW46IGxvZ2luLFxyXG4gICAgICAgIG1vZGVsOiB7XHJcbiAgICAgICAgICAgIHBhc3N3b3JkOiBudWxsLFxyXG4gICAgICAgICAgICByZW1lbWJlck1lOiB0cnVlLFxyXG4gICAgICAgICAgICB1c2VybmFtZTogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbmF2aWdhdGVUbzogbmF2aWdhdGVUbyxcclxuICAgICAgICBzdGF0dXM6IHtcclxuICAgICAgICAgICAgZXJyb3I6IG51bGwsXHJcbiAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL2xvZ2luJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZm9jdXNJbnB1dEZpZWxkKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpbi11c2VybmFtZScpLmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9naW4oKSB7XHJcbiAgICAgICAgdm0uc3RhdHVzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHVzZXJBY2NvdW50LmxvZ2luKHZtLm1vZGVsLCB2bS5tb2RlbC5yZW1lbWJlck1lKVxyXG4gICAgICAgICAgICAudGhlbihsb2dpblN1Y2Nlc3MsIGxvZ2luRXJyb3IpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciBuZXh0VXJsID0gJy9sYW5kaW5nJztcclxuICAgICAgICB2YXIgcSA9ICRsb2NhdGlvbi5zZWFyY2goKTtcclxuICAgICAgICBpZiAocS5yZWRpcmVjdCkge1xyXG4gICAgICAgICAgICBuZXh0VXJsID0gcS5yZWRpcmVjdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnVuY3Rpb24gbG9naW5TdWNjZXNzKGRhdGEsIHN0YXR1cywgaGVhZGVycykge1xyXG4gICAgICAgICAgICBwcmVsb2FkZXIucnVuKClcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnN0YXR1cy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uLnVybChuZXh0VXJsKTtcclxuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnN0YXR1cy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uLnVybChuZXh0VXJsKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbG9naW5FcnJvcihlcnJvciwgc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHZtLnN0YXR1cy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLnN0YXR1cy5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbmF2aWdhdGVUbyhwYXRoKSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnVybChwYXRoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGxvZ291dFBhZ2VDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdhY2NvdW50L2NvbXBvbmVudHMvbG9nb3V0LXBhZ2UuaHRtbCdcclxufVxyXG5cclxubG9nb3V0UGFnZUNvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnJHdpbmRvdycsIFxyXG4gICAgJ2NvbW1vbidcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGxvZ291dFBhZ2VDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkd2luZG93LCBcclxuICAgIGNvbW1vblxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgbG9nZ2VkT3V0OiBmYWxzZVxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL2xvZ291dCcpO1xyXG4gICAgICAgIGxvZ291dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvZ291dCgpIHtcclxuICAgICAgICBjb21tb24uaWRlbnRpdHkuc2V0KG51bGwpO1xyXG4gICAgICAgIHZtLmxvZ2dlZE91dCA9IHRydWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29tbW9uLiR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuICAgIH1cclxuICAgIFxyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IHJlc2V0UGFzc3dvcmRQYWdlQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnYWNjb3VudC9jb21wb25lbnRzL3Jlc2V0LXBhc3N3b3JkLXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbnJlc2V0UGFzc3dvcmRQYWdlQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckbG9jYXRpb24nLCBcclxuICAgICckcm91dGVQYXJhbXMnLCBcclxuICAgICd1c2VyQWNjb3VudFNlcnZpY2UnXHJcbl07XHJcblxyXG5mdW5jdGlvbiByZXNldFBhc3N3b3JkUGFnZUNvbnRyb2xsZXIoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICRsb2NhdGlvbiwgXHJcbiAgICAkcm91dGVQYXJhbXMsIFxyXG4gICAgdXNlckFjY291bnRcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRwb3N0TGluazogZm9jdXNJbnB1dEZpZWxkLFxyXG4gICAgICAgIGNoZWNrU3RyZW5ndGg6IGNoZWNrU3RyZW5ndGgsXHJcbiAgICAgICAgcmVzZXRQYXNzd29yZDogcmVzZXRQYXNzd29yZCxcclxuICAgICAgICBrZXk6IG51bGwsXHJcbiAgICAgICAgbW9kZWw6IHtcclxuICAgICAgICAgICAgcGFzc3dvcmQxOiBudWxsLFxyXG4gICAgICAgICAgICBwYXNzd29yZDI6IG51bGwsXHJcbiAgICAgICAgICAgIGNoZWNrczoge1xyXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBsb3dlcmNhc2U6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdXBwZXJjYXNlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG5vbmFscGhhOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG51bWJlcjogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbmF2aWdhdGVUbzogbmF2aWdhdGVUbyxcclxuICAgICAgICBzdGF0dXM6IHtcclxuICAgICAgICAgICAgZG9uZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGVycm9yczogW10sXHJcbiAgICAgICAgICAgIGludmFsaWRUb2tlbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL3Jlc2V0LXBhc3N3b3JkJyk7XHJcbiAgICAgICAgdm0ua2V5ID0gJHJvdXRlUGFyYW1zLmtleTtcclxuXHJcbiAgICAgICAgaWYgKHZtLmtleSA9PT0gdW5kZWZpbmVkIHx8IHZtLmtleSA9PT0gbnVsbCB8fCB2bS5rZXkgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHZtLnN0YXR1cy5pbnZhbGlkVG9rZW4gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmb2N1c0lucHV0RmllbGQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0LXBhc3N3b3JkMScpLmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2hlY2tTdHJlbmd0aCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubW9kZWwucGFzc3dvcmQxKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuY2hlY2tzLmNoYXJhY3RlcnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5jaGVja3MubG93ZXJjYXNlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuY2hlY2tzLm5vbmFscGhhID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuY2hlY2tzLm51bWJlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmNoZWNrcy51cHBlcmNhc2UgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubW9kZWwuY2hlY2tzLmNoYXJhY3RlcnMgPSB0aGlzLm1vZGVsLnBhc3N3b3JkMS5sZW5ndGggPj0gODtcclxuICAgICAgICB0aGlzLm1vZGVsLmNoZWNrcy5sb3dlcmNhc2UgPSAvW2Etel0vLmV4ZWModGhpcy5tb2RlbC5wYXNzd29yZDEpICE9PSBudWxsO1xyXG4gICAgICAgIHRoaXMubW9kZWwuY2hlY2tzLm5vbmFscGhhID0gL1xcVy8uZXhlYyh0aGlzLm1vZGVsLnBhc3N3b3JkMSkgIT09IG51bGw7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5jaGVja3MubnVtYmVyID0gL1xcZC8uZXhlYyh0aGlzLm1vZGVsLnBhc3N3b3JkMSkgIT09IG51bGw7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5jaGVja3MudXBwZXJjYXNlID0gL1tBLVpdLy5leGVjKHRoaXMubW9kZWwucGFzc3dvcmQxKSAhPT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBuYXZpZ2F0ZVRvKHBhdGgpIHtcclxuICAgICAgICAkbG9jYXRpb24udXJsKHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlc2V0UGFzc3dvcmQoKSB7XHJcbiAgICAgICAgdm0uc3RhdHVzLmVycm9ycyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAodm0ubW9kZWwucGFzc3dvcmQxID09PSBudWxsIHx8IHZtLm1vZGVsLnBhc3N3b3JkMSA9PT0gJycpIHtcclxuICAgICAgICAgICAgdm0uc3RhdHVzLmVycm9ycyA9IFsnYWNjb3VudC5yZXNldFBhc3N3b3JkLmVycm9ycy5keW5hbWljLlBBU1NXT1JEX0VNUFRZJ107XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2bS5tb2RlbC5wYXNzd29yZDEgIT09IHZtLm1vZGVsLnBhc3N3b3JkMikge1xyXG4gICAgICAgICAgICB2bS5zdGF0dXMuZXJyb3JzID0gWydhY2NvdW50LnJlc2V0UGFzc3dvcmQuZXJyb3JzLmR5bmFtaWMuUEFTU1dPUkRTX05PVEVRVUFMJ107XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLnN0YXR1cy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB1c2VyQWNjb3VudC5jb25maXJtUGFzc3dvcmQodm0ua2V5LCB2bS5tb2RlbC5wYXNzd29yZDEpXHJcbiAgICAgICAgICAgIC50aGVuKHJlc2V0U3VjY2VzcywgcmVzZXRFcnJvcik7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlc2V0U3VjY2VzcyhkYXRhLCBzdGF0dXMsIGhlYWRlcnMpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEuSXNTdWNjZXNzZnVsID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5zdGF0dXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdm0uc3RhdHVzLmRvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdm0uc3RhdHVzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5Db2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuQ29kZXNbaV0gPSAnYWNjb3VudC5yZXNldFBhc3N3b3JkLmVycm9ycy5keW5hbWljLicgKyBkYXRhLkNvZGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdm0uc3RhdHVzLmVycm9ycyA9IGRhdGEuQ29kZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlc2V0RXJyb3IoZXJyb3IsIHN0YXR1cykge1xyXG4gICAgICAgICAgICB2bS5zdGF0dXMubG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVycm9yLkV4Y2VwdGlvbk1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIHZtLnN0YXR1cy5lcnJvcnMgPSBbZXJyb3IuRXhjZXB0aW9uTWVzc2FnZV07XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IuTWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgdm0uc3RhdHVzLmVycm9ycyA9IFtlcnJvci5NZXNzYWdlXTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZtLnN0YXR1cy5lcnJvcnMgPSBbSlNPTi5zdHJpbmdpZnkoZXJyb3IpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJ2NvbW1vbicsICdwcmVmZXJlbmNlU2VydmljZScsIGZhdm9yaXRlc1NlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gZmF2b3JpdGVzU2VydmljZShjb21tb24sIHByZWZlcmVuY2VzKSB7XHJcblxyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgZmF2b3JpdGVzOiBbXSxcclxuICAgICAgICBhZGQ6IGFkZCxcclxuICAgICAgICBpc0Zhdm9yaXRlOiBpc0Zhdm9yaXRlLFxyXG4gICAgICAgIGluaXQ6IGxvYWQsXHJcbiAgICAgICAgbG9hZDogbG9hZCxcclxuICAgICAgICByZW1vdmU6IHJlbW92ZVxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhZGQoZ29vZHNDb2RlLCBtb3ZlbWVudCwgY291bnRyeUNvZGUsIGFwcGxpY2F0aW9uU2V0KSB7XHJcbiAgICAgICAgdmFyIGRmciA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG5cclxuICAgICAgICBwcmVmZXJlbmNlcy5hZGQoe1xyXG4gICAgICAgICAgICBuYW1lOiBnb29kc0NvZGUgKyAnXycgKyBtb3ZlbWVudCxcclxuICAgICAgICAgICAgY2F0ZWdvcnk6ICdmYXZvcml0ZV9jb2RlcycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAnZ29vZHNub209JyArIGdvb2RzQ29kZSArICcmc291cmNlPScgKyBhcHBsaWNhdGlvblNldCArICcmdHlwZT0nICsgbW92ZW1lbnQgKyAnJmNvdW50cnk9JyArIChjb3VudHJ5Q29kZSA/IGNvdW50cnlDb2RlIDogbnVsbCksXHJcbiAgICAgICAgICAgIHZhbHVlVHlwZTogJ3N0cmluZ1ZhbHVlJ1xyXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICBsb2FkKCk7XHJcbiAgICAgICAgICAgIGRmci5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkZnIucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpc0Zhdm9yaXRlKGdvb2RzQ29kZSwgbW92ZW1lbnQpIHtcclxuICAgICAgICB2YXIgcHJlZmVyZW5jZSA9IHByZWZlcmVuY2VzLmdldChnb29kc0NvZGUgKyAnXycgKyBtb3ZlbWVudCwgJ2Zhdm9yaXRlX2NvZGVzJyk7XHJcbiAgICAgICAgcmV0dXJuIHByZWZlcmVuY2UgIT09IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZCgpIHtcclxuICAgICAgICB2YXIgZGVmZXJyZWQgPSBjb21tb24uJHEuZGVmZXIoKTtcclxuICAgICAgICBwcmVmZXJlbmNlcy5nZXRDYXRlZ29yeSgnZmF2b3JpdGVfY29kZXMnKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY29kZXMpIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZ29vZHNjb2RlID0gY29kZXNbaV0ubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbW92ZW1lbnQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ29vZHNjb2RlLmluZGV4T2YoJ18nKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IGdvb2RzY29kZS5zcGxpdCgnXycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnb29kc2NvZGUgPSBwYXJ0c1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZW1lbnQgPSBwYXJ0c1sxXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvZGVzW2ldLmdvb2RzY29kZSA9IGdvb2RzY29kZTtcclxuICAgICAgICAgICAgICAgICAgICBjb2Rlc1tpXS5tb3ZlbWVudCA9IG1vdmVtZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2VydmljZS5mYXZvcml0ZXMgPSBfLnNvcnRCeShjb2RlcywgJ25hbWUnKTtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoc2VydmljZS5mYXZvcml0ZXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZW1vdmUoZ29vZHNDb2RlLCBtb3ZlbWVudCkge1xyXG4gICAgICAgIHZhciBwcmVmZXJlbmNlID0gcHJlZmVyZW5jZXMuZ2V0KGdvb2RzQ29kZSArICdfJyArIG1vdmVtZW50LCAnZmF2b3JpdGVfY29kZXMnKTtcclxuXHJcbiAgICAgICAgLy8gZm9yIG9sZCBmYXZvcml0ZXMgd2hpY2ggd2VyZSBzYXZlZCB3aXRob3V0IG1vdmVtZW50XHJcbiAgICAgICAgaWYgKHByZWZlcmVuY2UgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcHJlZmVyZW5jZSA9IHByZWZlcmVuY2VzLmdldChnb29kc0NvZGUsICdmYXZvcml0ZV9jb2RlcycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcmVmZXJlbmNlcy5yZW1vdmUocHJlZmVyZW5jZSk7XHJcbiAgICAgICAgbG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0gWydjb21tb24nLCAnZGF0YUNvbnRleHQnLCB1c2VyQWNjb3VudFNlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gdXNlckFjY291bnRTZXJ2aWNlKGNvbW1vbiwgY29udGV4dCkge1xyXG5cclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGNoYW5nZVBhc3N3b3JkOiBjaGFuZ2VQYXNzd29yZCxcclxuICAgICAgICBjb25maXJtUGFzc3dvcmQ6IGNvbmZpcm1QYXNzd29yZCxcclxuICAgICAgICByZXNldFBhc3N3b3JkOiByZXNldFBhc3N3b3JkLFxyXG4gICAgICAgIGxvZ2luOmxvZ2luXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCkge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG5cclxuICAgICAgICBjb250ZXh0LnBvc3QoY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5hdXRoICsgJy9hdXRoL2NoYW5nZXBhc3N3b3JkJywgeyBjdXJyZW50X3Bhc3N3b3JkOiBvbGRQYXNzd29yZCwgbmV3X3Bhc3N3b3JkOiBuZXdQYXNzd29yZH0pXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGRhdGEpO1xyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjb25maXJtUGFzc3dvcmQoa2V5LCBuZXdQYXNzd29yZCkge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG5cclxuICAgICAgICAvL2NvbnRleHQuZ2V0KGNvbW1vbi5jb25maWcuYXBpSG9zdHMuYXV0aCArICcvYXV0aC9wZXJtaXNzaW9ucycpXHJcbiAgICAgICAgY29udGV4dC5wb3N0KGNvbW1vbi5jb25maWcuYXBpSG9zdHMuYXV0aCArICcvYXV0aC9jb25maXJtcGFzc3dvcmQnLCB7IHRva2VuOiBrZXksIG5ld1Bhc3N3b3JkOiBuZXdQYXNzd29yZCB9KVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShkYXRhKTtcclxuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzZXRQYXNzd29yZCh1c2VybmFtZSwgbGFuZ3VhZ2UpIHtcclxuICAgICAgICB2YXIgZGVmZXJyZWQgPSBjb21tb24uJHEuZGVmZXIoKTtcclxuICAgICAgICBpZiAobGFuZ3VhZ2UgPT09IHVuZGVmaW5lZCB8fCBsYW5ndWFnZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsYW5ndWFnZSA9ICdlbic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250ZXh0LnBvc3QoY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5hdXRoICsgJy9hdXRoL3Jlc2V0cGFzc3dvcmQnLCB7IHVzZXJuYW1lOiB1c2VybmFtZSwgbGFuZ3VhZ2U6IGxhbmd1YWdlIH0pXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGRhdGEpO1xyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2dpbih1c2VyRGF0YSwgcmVtZW1iZXJNZSkge1xyXG4gICAgICAgIHZhciB0b2tlblVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuYXV0aCArICcvYXV0aC90b2tlbic7XHJcbiAgICAgICAgaWYgKCF1c2VyRGF0YS5ncmFudF90eXBlKSB7XHJcbiAgICAgICAgICAgIHVzZXJEYXRhLmdyYW50X3R5cGUgPSAncGFzc3dvcmQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICB1c2VyRGF0YS5hcHBsaWNhdGlvbl9rZXkgPSBjb21tb24uY29uZmlnLmFwcGxpY2F0aW9uS2V5O1xyXG4gICAgICAgIHVzZXJEYXRhLmFwcGxpY2F0aW9uX3NlY3JldCA9IGNvbW1vbi5jb25maWcuYXBwbGljYXRpb25TZWNyZXQ7XHJcblxyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG4gICAgICAgIGNvbnRleHQucG9zdCh0b2tlblVybCwgdXNlckRhdGEpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBjb21tb24uaWRlbnRpdHkuc2V0KHVzZXJEYXRhLnVzZXJuYW1lLCBkYXRhLCByZW1lbWJlck1lKTtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoZGF0YSk7XHJcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG59Iiwi77u/YW5ndWxhci5tb2R1bGUoJ3RhcmljLmFkZGl0aW9uYWxjb2RlcycsIFtdKVxyXG4gICAgLmNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgcm91dGVDb25maWd1cmF0b3JdKVxyXG4gICAgLy8gQ29tcG9uZW50c1xyXG4gICAgLmNvbXBvbmVudCgnbWVhc3VyZUFkZGl0aW9uYWxDb2RlQnV0dG9ucycsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9tZWFzdXJlLWFkZGl0aW9uYWwtY29kZS1idXR0b25zJykpXHJcbiAgICAuY29tcG9uZW50KCdtZWFzdXJlQWRkaXRpb25hbENvZGVzRXhwYW5kZWQnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbWVhc3VyZS1hZGRpdGlvbmFsLWNvZGVzLWV4cGFuZGVkJykpXHJcbiAgICAuY29tcG9uZW50KCdhZGRpdGlvbmFsQ29kZXNQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2FkZGl0aW9uYWwtY29kZXMtcGFnZScpKVxyXG4gICAgLmNvbXBvbmVudCgnYWRkaXRpb25hbENvZGVQaWNrZXInLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvYWRkaXRpb25hbC1jb2RlLXBpY2tlcicpKVxyXG4gICAgLy8gRmlsdGVyc1xyXG4gICAgLmZpbHRlcignYWRkaXRpb25hbENvZGVUeXBlYWhlYWQnLCByZXF1aXJlKCcuL2ZpbHRlcnMvYWRkaXRpb25hbC1jb2RlLXR5cGVhaGVhZC1maWx0ZXInKSlcclxuICAgIC8vIE1vZGFsc1xyXG4gICAgLmZhY3RvcnkoJ2FkZGl0aW9uYWxDb2RlU2VsZWN0b3JNb2RhbCcsIHJlcXVpcmUoJy4vbW9kYWxzL2FkZGl0aW9uYWwtY29kZS1zZWxlY3RvcicpKVxyXG4gICAgLy8gU2VydmljZXNcclxuICAgIC5mYWN0b3J5KCdhZGRpdGlvbmFsQ29kZXNEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvYWRkaXRpb25hbC1jb2Rlcy1kYXRhJykpXHJcbiAgICA7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL2FkZGl0aW9uYWwtY29kZXMnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPGFkZGl0aW9uYWwtY29kZXMtcGFnZT48L2FkZGl0aW9uYWwtY29kZXMtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICA7XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczogeyBcclxuICAgICAgICBhZGRpdGlvbmFsQ29kZTogJzwnLCBcclxuICAgICAgICBwbGFjZWhvbGRlcjogJzwnLCBcclxuICAgICAgICBwb3NzaWJsZUFkZGl0aW9uYWxDb2RlczogJzwgJywgXHJcbiAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZDogJyYnIFxyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IGFkZGl0aW9uYWxDb2RlUGlja2VyQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnYWRkaXRpb25hbC1jb2Rlcy9jb21wb25lbnRzL2FkZGl0aW9uYWwtY29kZS1waWNrZXIuaHRtbCdcclxufTtcclxuXHJcbmFkZGl0aW9uYWxDb2RlUGlja2VyQ29udHJvbGxlci4kaW5qZWN0ID0gWydhZGRpdGlvbmFsQ29kZVNlbGVjdG9yTW9kYWwnXTtcclxuXHJcbmZ1bmN0aW9uIGFkZGl0aW9uYWxDb2RlUGlja2VyQ29udHJvbGxlcihhZGRpdGlvbmFsQ29kZVNlbGVjdG9yTW9kYWwpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBjbGVhcjogY2xlYXIsXHJcbiAgICAgICAgYWRkaXRpb25hbENvZGU6IG51bGwsXHJcbiAgICAgICAgdXNlcklucHV0OiBudWxsLFxyXG4gICAgICAgIHBvc3NpYmxlQWRkaXRpb25hbENvZGVzOiBudWxsLFxyXG4gICAgICAgIGl0ZW1TZWxlY3RlZDogaXRlbVNlbGVjdGVkLFxyXG4gICAgICAgIG9uQmx1cjogb25CbHVyLFxyXG4gICAgICAgIG9uRW50ZXI6IG9uRW50ZXIsXHJcbiAgICAgICAgc2hvd01vZGFsOiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbCgpIHtcclxuICAgICAgICBhZGRpdGlvbmFsQ29kZVNlbGVjdG9yTW9kYWxcclxuICAgICAgICAgICAgLnNob3codm0ucG9zc2libGVBZGRpdGlvbmFsQ29kZXMsIHZtLmFkZGl0aW9uYWxDb2RlKVxyXG4gICAgICAgICAgICAucmVzdWx0XHJcbiAgICAgICAgICAgIC50aGVuKGl0ZW1TZWxlY3RlZClcclxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghKHJlcyA9PT0gJ2NhbmNlbCcgfHwgcmVzID09PSAnZXNjYXBlIGtleSBwcmVzcycgfHwgcmVzID09PSAnYmFja2Ryb3AgY2xpY2snKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXIoZXYpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnY2xlYXInKTtcclxuICAgICAgICB2bS51c2VySW5wdXQgPSBudWxsO1xyXG4gICAgICAgIGNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2NsZWFyU2VsZWN0aW9uJyk7XHJcbiAgICAgICAgdm0uYWRkaXRpb25hbENvZGUgPSBudWxsO1xyXG4gICAgICAgIC8vIHN0YXRlLmZpbHRlci5jb3VudHJ5Q29kZSA9IG51bGw7XHJcbiAgICAgICAgLy8gc3RhdGUuZmlsdGVyLmNvdW50cnlOYW1lID0gbnVsbDtcclxuICAgICAgICBpZiAodm0uc2VsZWN0aW9uQ2hhbmdlZClcclxuICAgICAgICAgICAgdm0uc2VsZWN0aW9uQ2hhbmdlZCh7IGFkZGl0aW9uYWxDb2RlOiBudWxsIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkJsdXIoKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uQmx1cicsIGFyZ3VtZW50cywgdm0udXNlcklucHV0KTtcclxuICAgICAgICAvLyB2bS5hZGRpdGlvbmFsQ29kZSA9IF8uY2hhaW4odm0ucG9zc2libGVBZGRpdGlvbmFsQ29kZXMpXHJcbiAgICAgICAgLy8gICAgIC5maW5kKGZ1bmN0aW9uKGFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gYWRkaXRpb25hbENvZGUudHlwZSArIGFkZGl0aW9uYWxDb2RlLmNvZGUgPT09IHZtLnVzZXJJbnB1dDtcclxuICAgICAgICAvLyAgICAgfSlcclxuICAgICAgICAvLyAgICAgLnZhbHVlKCk7XHJcbiAgICAgICAgLy8gaWYgKHZtLmFkZGl0aW9uYWxDb2RlICYmIHZtLnNlbGVjdGlvbkNoYW5nZWQpIHtcclxuICAgICAgICAvLyAgICAgdm0uc2VsZWN0aW9uQ2hhbmdlZCh7IGFkZGl0aW9uYWxDb2RlOiB2bS5hZGRpdGlvbmFsQ29kZSB9KTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gaWYgKHN0YXRlLmZpbHRlci5jb3VudHJ5Q29kZSAmJiAhdm0uY291bnRyeSkge1xyXG4gICAgICAgIC8vICAgICBjbGVhclNlbGVjdGlvbigpO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkVudGVyKCkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdvbkVudGVyJywgYXJndW1lbnRzKTtcclxuICAgICAgICAvLyBpZiAoc3RhdGUuZmlsdGVyLmNvdW50cnlDb2RlICYmICF2bS5jb3VudHJ5KSB7XHJcbiAgICAgICAgLy8gICAgIGNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGl0ZW1TZWxlY3RlZChpdGVtLCBtb2RlbCkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdpdGVtU2VsZWN0ZWQnLCBpdGVtLCBtb2RlbCwgdm0udXNlcklucHV0KTtcclxuICAgICAgICB2bS5hZGRpdGlvbmFsQ29kZSA9IGl0ZW07XHJcbiAgICAgICAgLy8gaWYgKGl0ZW0gJiYgaXRlbS5jb2RlICYmIGl0ZW0uY29kZSAhPT0gc3RhdGUuZmlsdGVyLmNvdW50cnlDb2RlKSB7XHJcbiAgICAgICAgLy8gICAgIHN0YXRlLmZpbHRlci5jb3VudHJ5Q29kZSA9IGl0ZW0uY29kZTtcclxuICAgICAgICAvLyAgICAgc3RhdGUuZmlsdGVyLmNvdW50cnlOYW1lID0gaXRlbS5uYW1lO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKHZtLnNlbGVjdGlvbkNoYW5nZWQpXHJcbiAgICAgICAgICAgIHZtLnNlbGVjdGlvbkNoYW5nZWQoeyBhZGRpdGlvbmFsQ29kZTogaXRlbSB9KTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gZWxzZSBpZiAoc3RhdGUuZmlsdGVyLmNvdW50cnlDb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgIGNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG59XHJcblxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGFkZGl0aW9uYWxDb2Rlc1BhZ2VDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdhZGRpdGlvbmFsLWNvZGVzL2NvbXBvbmVudHMvYWRkaXRpb25hbC1jb2Rlcy1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG5hZGRpdGlvbmFsQ29kZXNQYWdlQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckdGltZW91dCcsXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLCBcclxuICAgICdhZGRpdGlvbmFsQ29kZXNEYXRhU2VydmljZScsIFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGFkZGl0aW9uYWxDb2Rlc1BhZ2VDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkdGltZW91dCxcclxuICAgIG5vdGlmaWNhdGlvbnMsIFxyXG4gICAgYWRkaXRpb25hbENvZGVzRGF0YSwgXHJcbiAgICBzdGF0ZVxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICAgICAgZmlsdGVyOiAnJyxcclxuICAgICAgICBmaWx0ZXJUeXBlOiBcIlwiLFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgaXNMb2FkaW5nVHlwZXM6IGZhbHNlLFxyXG4gICAgICAgIGZpbHRlcmVkQWRkaXRpb25hbENvZGVzOiBbXSxcclxuICAgICAgICBmaWxldGVyZEFkZGl0aW9uYWxDb2RlVHlwZXM6IFtdLFxyXG4gICAgICAgIGFkZGl0aW9uYWxDb2RlczogW10sXHJcbiAgICAgICAgYWRkaXRpb25hbENvZGVUeXBlczogW10sXHJcbiAgICAgICAgcmVmZXJlbmNlQ291bnRyeTogc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnksXHJcbiAgICAgICAgc2VsZWN0ZWRUeXBlOiBudWxsLFxyXG4gICAgICAgIGxvYWRBZGRpdGlvbmFsQ29kZTogbG9hZEFkZGl0aW9uYWxDb2RlLFxyXG4gICAgICAgIGNsZWFyRmlsdGVyOiBjbGVhckZpbHRlcixcclxuICAgICAgICBjaGFuZ2VGaWx0ZXI6IGNoYW5nZUZpbHRlcixcclxuICAgICAgICBjbGVhckZpbHRlclR5cGU6IGNsZWFyRmlsdGVyVHlwZSxcclxuICAgICAgICBjaGFuZ2VGaWx0ZXJUeXBlOiBjaGFuZ2VGaWx0ZXJUeXBlLFxyXG4gICAgICAgIGZvY3VzSW5wdXRUeXBlRmllbGQ6IGZvY3VzSW5wdXRUeXBlRmllbGQsXHJcbiAgICAgICAgZm9jdXNJbnB1dEZpZWxkOiBmb2N1c0lucHV0RmllbGRcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gZm9jdXNJbnB1dFR5cGVGaWVsZCgpIHtcclxuICAgICAgICAkdGltZW91dChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICB2YXIgaW5wdXRFTCA9IGFuZ3VsYXIuZWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaW5wdXRGaWx0ZXJUeXBlJykpO1xyXG4gICAgICAgICAgICBpZiAoaW5wdXRFTCkge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRFTFswXS5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZm9jdXNJbnB1dEZpZWxkKCkge1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHZhciBpbnB1dEVMID0gYW5ndWxhci5lbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbnB1dEZpbHRlcicpKTtcclxuICAgICAgICAgICAgaWYgKGlucHV0RUwpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0RUxbMF0uZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvcmVmZXJlbmNlL2FkZGl0aW9uYWwtY29kZXMnKTtcclxuICAgICAgICBsb2FkVHlwZXMoKTtcclxuICAgICAgICBub3RpZmljYXRpb25zLnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGRhdGVDaGFuZ2VkKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkZXRhY2hlZCgpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zLnVuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRhdGVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGxvYWRUeXBlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyRmlsdGVyKCkge1xyXG4gICAgICAgIHZtLmZpbHRlciA9ICcnO1xyXG4gICAgICAgIHZtLmZpbHRlcmVkQWRkaXRpb25hbENvZGVzID0gdm0uYWRkaXRpb25hbENvZGVzO1xyXG4gICAgICAgIGZvY3VzSW5wdXRGaWVsZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNoYW5nZUZpbHRlcigpIHtcclxuICAgICAgICB2bS5maWx0ZXJlZEFkZGl0aW9uYWxDb2RlcyA9IHZtLmFkZGl0aW9uYWxDb2Rlcy5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoZWwudHlwZS50b0xvd2VyQ2FzZSgpICsgZWwuY29kZS50b0xvd2VyQ2FzZSgpKS5pbmNsdWRlcyh2bS5maWx0ZXIudG9Mb3dlckNhc2UoKSkgfHwgXHJcbiAgICAgICAgICAgICAgICBlbC5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHZtLmZpbHRlci50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIGZ1bmN0aW9uIGNsZWFyRmlsdGVyVHlwZSgpIHtcclxuICAgICAgICBjbGVhckZpbHRlcigpO1xyXG4gICAgICAgIHZtLmZpbHRlclR5cGUgPSBcIlwiO1xyXG4gICAgICAgIHZtLmZpbGV0ZXJkQWRkaXRpb25hbENvZGVUeXBlcyA9IHZtLmFkZGl0aW9uYWxDb2RlVHlwZXM7XHJcbiAgICAgICAgdm0uYWRkaXRpb25hbENvZGVzID0gW107XHJcbiAgICAgICAgdm0uZmlsdGVyZWRBZGRpdGlvbmFsQ29kZXMgPSBbXTtcclxuICAgICAgICB2bS5zZWxlY3RlZFR5cGUgPSBudWxsO1xyXG4gICAgICAgIGZvY3VzSW5wdXRUeXBlRmllbGQoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VGaWx0ZXJUeXBlKCkge1xyXG4gICAgICAgIHZtLmZpbGV0ZXJkQWRkaXRpb25hbENvZGVUeXBlcyA9IHZtLmFkZGl0aW9uYWxDb2RlVHlwZXMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWwuY29kZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHZtLmZpbHRlclR5cGUudG9Mb3dlckNhc2UoKSkgfHwgZWwuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2bS5maWx0ZXJUeXBlLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmKHZtLmZpbGV0ZXJkQWRkaXRpb25hbENvZGVUeXBlcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgbG9hZEFkZGl0aW9uYWxDb2RlKHZtLmZpbGV0ZXJkQWRkaXRpb25hbENvZGVUeXBlc1swXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHZtLmZpbGV0ZXJkQWRkaXRpb25hbENvZGVUeXBlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdm0uYWRkaXRpb25hbENvZGVzID0gW107XHJcbiAgICAgICAgICAgIHZtLmZpbHRlcmVkQWRkaXRpb25hbENvZGVzID0gW107XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdGVkVHlwZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlciA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRBZGRpdGlvbmFsQ29kZSh0eXBlKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB2bS5zZWxlY3RlZFR5cGUgPSB0eXBlLmNvZGU7XHJcbiAgICAgICAgdm0uZmlsdGVyID0gXCJcIjtcclxuICAgICAgICBhZGRpdGlvbmFsQ29kZXNEYXRhLmdldEJ5VHlwZSh0eXBlLmNvZGUpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5maWx0ZXJlZEFkZGl0aW9uYWxDb2RlcyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICB2bS5hZGRpdGlvbmFsQ29kZXMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb2N1c0lucHV0RmllbGQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZFR5cGVzKCkge1xyXG4gICAgICAgIGlmICh2bS5yZWZlcmVuY2VDb3VudHJ5ID09ICdDSCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2bS5pc0xvYWRpbmdUeXBlcyA9IHRydWU7XHJcbiAgICAgICAgdm0uYWRkaXRpb25hbENvZGVzID0gW107XHJcbiAgICAgICAgdm0uc2VsZWN0ZWRUeXBlID0gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICBhZGRpdGlvbmFsQ29kZXNEYXRhLmdldFR5cGVzKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZtLmFkZGl0aW9uYWxDb2RlVHlwZXMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgdm0uZmlsZXRlcmRBZGRpdGlvbmFsQ29kZVR5cGVzID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZ1R5cGVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb2N1c0lucHV0VHlwZUZpZWxkKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgbWVhc3VyZTogJzwnXHJcbiAgICB9LFxyXG4gICAgdGVtcGxhdGVVcmw6ICdhZGRpdGlvbmFsLWNvZGVzL2NvbXBvbmVudHMvbWVhc3VyZS1hZGRpdGlvbmFsLWNvZGUtYnV0dG9ucy5odG1sJ1xyXG59OyIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBtZWFzdXJlOiAnPCdcclxuICAgIH0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2FkZGl0aW9uYWwtY29kZXMvY29tcG9uZW50cy9tZWFzdXJlLWFkZGl0aW9uYWwtY29kZXMtZXhwYW5kZWQuaHRtbCdcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IFthZGRpdGlvbmFsQ29kZVR5cGVhaGVhZEZpbHRlcl07XHJcblxyXG4vLyBUYWtlcyBjYXJlIG9mIG9yZGVyaW5nIHRoZSByZXN1bHRzIG9mIHRoZSBhZGRpdGlvbmFsIGNvZGUgdHlwZWFoZWQuIFRoZSBsb2dpYyBpcyBhcyBmb2xsb3dzOlxyXG4vLyBGaXJzdCwgc2hvdyB0aGUgbWF0Y2hlcyBvbiB0aGUgYWRkaXRpb25hbCBjb2RlLCBvcmRlcmVkIGJ5IGNvZGVcclxuLy8gTmV4dCwgc2hvdyB0aGUgbWF0Y2hlcyBvbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhZGRpdGlvbmFsIGNvZGUgZGVzY3JpcHRpb24sIG9yZGVyZWQgYnkgZGVzY3JpcHRpb25cclxuLy8gRmluYWxseSwgc2hvdyB0aGUgbWF0Y2hlcyBhbnl3aGVyZSBlbHNlIGluIHRoZSBkZXNjcmlwdGlvbiwgb3JkZXJlZCBieSBkZXNjcmlwdGlvblxyXG5mdW5jdGlvbiBhZGRpdGlvbmFsQ29kZVR5cGVhaGVhZEZpbHRlcigpIHtcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFkZGl0aW9uYWxDb2RlcywgcXVlcnkpIHtcclxuICAgICAgICB2YXIgcmVzdWx0O1xyXG4gICAgICAgIGlmIChxdWVyeSA9PT0gbnVsbCB8fCBxdWVyeSA9PT0gdW5kZWZpbmVkIHx8IHF1ZXJ5ID09PSAnJykge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBfLnNvcnRCeShhZGRpdGlvbmFsQ29kZXMsIGZ1bmN0aW9uKGFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkaXRpb25hbENvZGUudHlwZSArIGFkZGl0aW9uYWxDb2RlLmNvZGU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxDb2RlTWF0Y2hQYXJ0aXRpb24gPSBfLnBhcnRpdGlvbihhZGRpdGlvbmFsQ29kZXMsIGZ1bmN0aW9uKGFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGFkZGl0aW9uYWxDb2RlLnR5cGUgKyBhZGRpdGlvbmFsQ29kZS5jb2RlKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkucmVwbGFjZSgnICcsICcnKS50b0xvd2VyQ2FzZSgpKSA+PSAwO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxDb2RlTWF0Y2hTdGFydFBhcnRpdGlvbiA9IF8ucGFydGl0aW9uKGFkZGl0aW9uYWxDb2RlTWF0Y2hQYXJ0aXRpb25bMF0sIGZ1bmN0aW9uKGFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGFkZGl0aW9uYWxDb2RlLnR5cGUgKyBhZGRpdGlvbmFsQ29kZS5jb2RlKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkucmVwbGFjZSgnICcsICcnKS50b0xvd2VyQ2FzZSgpKSA9PT0gMDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgYWRkaXRpb25hbENvZGVTdGFydE1hdGNoZXMgPSBfLnNvcnRCeShhZGRpdGlvbmFsQ29kZU1hdGNoU3RhcnRQYXJ0aXRpb25bMF0sIGZ1bmN0aW9uKGFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkaXRpb25hbENvZGUudHlwZSArIGFkZGl0aW9uYWxDb2RlLmNvZGU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2YXIgYWRkaXRpb25hbENvZGVPdGhlck1hdGNoZXMgPSBfLnNvcnRCeShhZGRpdGlvbmFsQ29kZU1hdGNoU3RhcnRQYXJ0aXRpb25bMV0sIGZ1bmN0aW9uKGFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkaXRpb25hbENvZGUudHlwZSArIGFkZGl0aW9uYWxDb2RlLmNvZGU7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdmFyIG90aGVyTWF0Y2hlcyA9IF8uc29ydEJ5KGFkZGl0aW9uYWxDb2RlTWF0Y2hQYXJ0aXRpb25bMV0sICdkZXNjcmlwdGlvbicpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGRlc2NyaXB0aW9uU3RhcnRNYXRjaFBhcnRpdGlvbiA9IF8ucGFydGl0aW9uKG90aGVyTWF0Y2hlcywgZnVuY3Rpb24oYWRkaXRpb25hbENvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhZGRpdGlvbmFsQ29kZS5kZXNjcmlwdGlvbiAmJiBhZGRpdGlvbmFsQ29kZS5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkudG9Mb3dlckNhc2UoKSkgPT09IDA7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdmFyIG90aGVyRGVzY3JpcHRpb25NYXRjaGVzID0gXy5maWx0ZXIoZGVzY3JpcHRpb25TdGFydE1hdGNoUGFydGl0aW9uWzFdLCBmdW5jdGlvbihhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZGl0aW9uYWxDb2RlLmRlc2NyaXB0aW9uICYmIGFkZGl0aW9uYWxDb2RlLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihxdWVyeS50b0xvd2VyQ2FzZSgpKSA+IC0xO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IF8uY29uY2F0KGFkZGl0aW9uYWxDb2RlU3RhcnRNYXRjaGVzLCBhZGRpdGlvbmFsQ29kZU90aGVyTWF0Y2hlcywgZGVzY3JpcHRpb25TdGFydE1hdGNoUGFydGl0aW9uWzBdLCBvdGhlckRlc2NyaXB0aW9uTWF0Y2hlcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHV0QW50aWR1bXBpbmdEZWZhdWx0Q29kZXNGaXJzdChyZXN1bHQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0FudGlkdW1waW5nRGVmYXVsdENvZGUoYWRkaXRpb25hbENvZGUpIHtcclxuICAgIHJldHVybiAoYWRkaXRpb25hbENvZGUudHlwZSA9PT0gJzgnICYmIGFkZGl0aW9uYWxDb2RlLmNvZGUgPT09ICc5MDAnKSB8fFxyXG4gICAgICAgIChhZGRpdGlvbmFsQ29kZS50eXBlID09PSAnQScgJiYgYWRkaXRpb25hbENvZGUuY29kZSA9PT0gJzk5OScpIHx8XHJcbiAgICAgICAgKGFkZGl0aW9uYWxDb2RlLnR5cGUgPT09ICdCJyAmJiBhZGRpdGlvbmFsQ29kZS5jb2RlID09PSAnOTk5JykgfHxcclxuICAgICAgICAoYWRkaXRpb25hbENvZGUudHlwZSA9PT0gJ0MnICYmIGFkZGl0aW9uYWxDb2RlLmNvZGUgPT09ICc5OTknKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcHV0QW50aWR1bXBpbmdEZWZhdWx0Q29kZXNGaXJzdChhZGRpdGlvbmFsQ29kZXMpIHtcclxuICAgIHZhciBwYXJ0aXRpb24gPSBfLnBhcnRpdGlvbihhZGRpdGlvbmFsQ29kZXMsIGZ1bmN0aW9uKGFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIGlzQW50aWR1bXBpbmdEZWZhdWx0Q29kZShhZGRpdGlvbmFsQ29kZSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBfLmNvbmNhdChwYXJ0aXRpb25bMF0sIHBhcnRpdGlvblsxXSk7XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBbJyRhbmFseXRpY3MnLCAnJHVpYk1vZGFsJywgYWRkaXRpb25hbENvZGVTZWxlY3Rvck1vZGFsXTtcclxuXHJcbmZ1bmN0aW9uIGFkZGl0aW9uYWxDb2RlU2VsZWN0b3JNb2RhbCgkYW5hbHl0aWNzLCAkdWliTW9kYWwpIHtcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICBzaG93OiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgYWRkaXRpb25hbENvZGVTZWxlY3Rvck1vZGFsQ29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICdwb3NzaWJsZUFkZGl0aW9uYWxDb2RlcycsICdhZGRpdGlvbmFsQ29kZSddO1xyXG5cclxuICAgIGZ1bmN0aW9uIGFkZGl0aW9uYWxDb2RlU2VsZWN0b3JNb2RhbENvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIHBvc3NpYmxlQWRkaXRpb25hbENvZGVzLCBhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgIHZhciB2bSA9IHtcclxuICAgICAgICAgICAgYWRkaXRpb25hbENvZGU6IGFkZGl0aW9uYWxDb2RlLFxyXG4gICAgICAgICAgICBjYW5jZWw6IGNhbmNlbCxcclxuICAgICAgICAgICAgcG9zc2libGVBZGRpdGlvbmFsQ29kZXM6IHBvc3NpYmxlQWRkaXRpb25hbENvZGVzLFxyXG4gICAgICAgICAgICBvazogb2tcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gb2soY29kZSkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZShjb2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB2bTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TW9kYWwocG9zc2libGVBZGRpdGlvbmFsQ29kZXMsIGFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdvcGVuLW1vZGFsLWFkZGl0aW9uYWwtY29kZS1zZWxlY3RvcicsIHsgY2F0ZWdvcnk6ICdhZGRpdGlvbmFsLWNvZGVzJyB9KTtcclxuXHJcbiAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IGFkZGl0aW9uYWxDb2RlU2VsZWN0b3JNb2RhbENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ2N0cmwnLFxyXG4gICAgICAgICAgICBrZXlib2FyZDogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kYWxGYWRlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQ29kZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRpdGlvbmFsQ29kZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBwb3NzaWJsZUFkZGl0aW9uYWxDb2RlczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3NzaWJsZUFkZGl0aW9uYWxDb2RlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2l6ZTogJ2xnJyxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdhZGRpdGlvbmFsLWNvZGVzL21vZGFscy9hZGRpdGlvbmFsLWNvZGUtc2VsZWN0b3IuaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtYWRkaXRpb25hbC1jb2RlLXNlbGVjdG9yJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBtb2RhbEluc3RhbmNlLnJlbmRlcmVkLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50VG9Gb2N1c09uSW5Nb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC5pbiAuZm9jdXMtb24tb3Blbi1tb2RhbCcpO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudFRvRm9jdXNPbkluTW9kYWwpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRUb0ZvY3VzT25Jbk1vZGFsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1vZGFsO1xyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0gWydjb21tb24nLCAnZGF0YUNvbnRleHQnLCAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCBhZGRpdGlvbmFsQ29kZXNEYXRhU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBhZGRpdGlvbmFsQ29kZXNEYXRhU2VydmljZShjb21tb24sIGNvbnRleHQsIHN0YXRlKSB7XHJcblxyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgYWRkaXRpb25hbENvZGVzOiBbXSxcclxuICAgICAgICBnZXRCeVR5cGU6IGdldEJ5VHlwZSxcclxuICAgICAgICBnZXRUeXBlczogZ2V0VHlwZXNcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0QnlUeXBlKGFkZGl0aW9uYWxDb2RlVHlwZSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL2FkZGl0aW9uYWxjb2RlcycgK1xyXG4gICAgICAgICAgICAnP3R5cGU9JyArIGFkZGl0aW9uYWxDb2RlVHlwZSArXHJcbiAgICAgICAgICAgICcmbGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZyZWZlcmVuY2Vjb3VudHJ5PScgKyBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcblxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFR5cGVzKCkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL2FkZGl0aW9uYWxjb2Rlcy90eXBlcycgK1xyXG4gICAgICAgICAgICAnP29yaWdpbj1FVSwnICsgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgK1xyXG4gICAgICAgICAgICAnJmxhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICcmcmVmZXJlbmNlY291bnRyeT0nICsgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG5cclxuICAgICAgICByZXR1cm4gY29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbn1cclxuIiwid2luZG93Ll8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcclxud2luZG93LmFuZ3VsYXIgPSByZXF1aXJlKCdhbmd1bGFyJyk7XHJcblxyXG5hbmd1bGFyLm1vZHVsZSgndGFyaWMnLCBbXHJcbiAgICAnbmdDb29raWVzJyxcclxuICAgICduZ0xvY2FsZScsXHJcbiAgICAnbmdSb3V0ZScsXHJcbiAgICAnbmdTYW5pdGl6ZScsXHJcbiAgICAvLyAzcmQgcGFydHkgbW9kdWxlc1xyXG4gICAgJ2FuZ3VsYXJ0aWNzJyxcclxuICAgICdhbmd1bGFydGljcy5nb29nbGUuYW5hbHl0aWNzJyxcclxuICAgICduZ0ZpbGVVcGxvYWQnLFxyXG4gICAgJ2NoYXJ0LmpzJyxcclxuICAgICdwYXNjYWxwcmVjaHQudHJhbnNsYXRlJyxcclxuICAgICd1aS5ib290c3RyYXAnLFxyXG4gICAgJ3VpLm1hc2snLFxyXG4gICAgJ3VpLnNlbGVjdCcsXHJcbiAgICAnYW5ndWxhci1pbnRybycsXHJcbiAgICAndG9hc3RyJyxcclxuICAgICd0bWguZHluYW1pY0xvY2FsZScsXHJcbiAgICAvLyBJbnRlcm5hbCBtb2R1bGVzXHJcbiAgICAndGFyaWMuY29yZScsIC8vIGFsbCBjb3JlIGZ1bmN0aW9uYWxpdHlcclxuICAgICd0YXJpYy5hY2NvdW50JywgLy8gYWxsIGFjY291bnQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5XHJcbiAgICAndGFyaWMuYWRkaXRpb25hbGNvZGVzJyxcclxuICAgICd0YXJpYy5iZWxhc3RpbmdkaWVuc3QnLFxyXG4gICAgJ3RhcmljLmJ0aScsXHJcbiAgICAndGFyaWMuYXRyJyxcclxuICAgICd0YXJpYy5jYXNlTGF3JyxcclxuICAgICd0YXJpYy5jZXJ0aWZpY2F0ZUNvZGVzJyxcclxuICAgICd0YXJpYy5jbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zJyxcclxuICAgICd0YXJpYy5jb21wbGlhbmNlJywgLy8gYWxsIGNvbXBsaWFuY2UgcmVsYXRlZCBmdW5jdGlvbmFsaXR5XHJcbiAgICAndGFyaWMuY29ycmVsYXRpb25UYWJsZScsXHJcbiAgICAndGFyaWMuY3VzdG9tc1ZhbHVlJyxcclxuICAgICd0YXJpYy5kYXNoYm9hcmQnLFxyXG4gICAgJ3RhcmljLmRvY3VtZW50YXRpb24nLCAvLyBpbnRlcmFjdGl2ZSB0b3VyXHJcbiAgICAndGFyaWMuZHV0eScsXHJcbiAgICAndGFyaWMuZXhjaGFuZ2VSYXRlcycsXHJcbiAgICAndGFyaWMuZXp0JyxcclxuICAgICd0YXJpYy5lY2ljcycsXHJcbiAgICAndGFyaWMuZm9vdG5vdGVzJywgLy8gYWxsIGZvb3Rub3RlcyByZWxhdGVkIGZ1bmN0aW9uYWxpdHlcclxuICAgICd0YXJpYy5nZW9ncmFwaHknLCAvLyBhbGwgY291bnRyeS9yZWdpb24gcmVsYXRlZCBmdW5jdGlvbmFsaXR5XHJcbiAgICAndGFyaWMuZ29vZCcsIC8vIGFsbCBnb29kIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eVxyXG4gICAgJ3RhcmljLmxpbmtzJyxcclxuICAgICd0YXJpYy5tZWFzdXJlVHlwZXMnLFxyXG4gICAgJ3RhcmljLm5ld3MnLFxyXG4gICAgJ3RhcmljLm5vbWVuY2xhdHVyZScsIC8vIGFsbCBub21lbmNsYXR1cmUgcmVsYXRlZCBmdW5jdGlvbmFsaXR5XHJcbiAgICAndGFyaWMucGF0dGVybnMnLFxyXG4gICAgJ3RhcmljLnByZWZlcmVuY2VDb2RlcycsXHJcbiAgICAndGFyaWMucXVvdGEnLCAvLyBhbGwgdGV4dCBxdW90YSByZWxhdGVkIGZ1bmN0aW9uYWxpdHlcclxuICAgICd0YXJpYy5yZWZlcmVuY2VQcmljZXMnLFxyXG4gICAgJ3RhcmljLnJlZ3VsYXRpb25zJyxcclxuICAgICd0YXJpYy5zZWFyY2gnLFxyXG4gICAgJ3RhcmljLnJlZmVyZW5jZURhdGUnLFxyXG4gICAgJ3RhcmljLnRhcmVzJywgLy8gVGhlIFN3aXNzIHRyYWRlIHRhcmlmZlxyXG4gICAgJ3RhcmljLnRleHRzJywgLy8gYWxsIHRleHQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LCBlLmcuIGV4cGxhbmF0b3J5IG5vdGVzLCBidGkncywgYW5ub3RhdGlvbnMsIGZvb3Rub3RlcywgZXRjLlxyXG4gICAgJ3RhcmljLnRyYWRlTW92ZW1lbnQnLFxyXG4gICAgJ3RhcmljLnRyYWRlU3RhdGlzdGljcycsXHJcbiAgICAndGFyaWMudW5pdHMnLCAvLyBtZWFzdXJlbWVudCB1bml0c1xyXG4gICAgJ3RhcmljLnZhbGlkYXRlQnVzaW5lc3NJbmZvJyxcclxuICAgICd0YXJpYy52YXRSYXRlcycsXHJcbiAgICAndGFyaWMud2lkZ2V0cycsIC8vIGFsbCBzaGFyZWQgaW50ZXJmYWNlIGZ1bmN0aW9uYWxpdHksIGUuZy4gZ2VuZXJhbCBtb2RhbHNcclxuXSk7XHJcblxyXG50cnkge1xyXG4gICAgYW5ndWxhci5tb2R1bGUoWyduZ1NlbnRyeSddKTtcclxufVxyXG5jYXRjaCAoZSkge31cclxuXHJcbnJlcXVpcmUoJ2FuZ3VsYXJ0aWNzJyk7XHJcbnJlcXVpcmUoJ2FuZ3VsYXJ0aWNzLWdvb2dsZS1hbmFseXRpY3MnKTtcclxucmVxdWlyZSgnYW5ndWxhci1jaGFydC5qcycpO1xyXG5yZXF1aXJlKCdhbmd1bGFyLWNvb2tpZXMnKTtcclxucmVxdWlyZSgnYW5ndWxhci1keW5hbWljLWxvY2FsZScpO1xyXG5yZXF1aXJlKCdhbmd1bGFyLWludHJvLmpzJyk7XHJcbnJlcXVpcmUoJ2FuZ3VsYXItc2FuaXRpemUnKTtcclxucmVxdWlyZSgnYW5ndWxhci1yb3V0ZScpO1xyXG5yZXF1aXJlKCdhbmd1bGFyLXRvYXN0cicpO1xyXG5yZXF1aXJlKCdhbmd1bGFyLWR5bmFtaWMtbG9jYWxlJyk7XHJcbnJlcXVpcmUoJ2FuZ3VsYXItdHJhbnNsYXRlJyk7XHJcbnJlcXVpcmUoJ2FuZ3VsYXItdWktYm9vdHN0cmFwJyk7XHJcbnJlcXVpcmUoJ2FuZ3VsYXItdWktbWFzaycpO1xyXG5yZXF1aXJlKCdjaGFydC5qcycpO1xyXG5yZXF1aXJlKCdpbnRyby5qcycpO1xyXG5yZXF1aXJlKCduZy1maWxlLXVwbG9hZCcpO1xyXG5yZXF1aXJlKCd1aS1zZWxlY3QnKTtcclxuXHJcbnJlcXVpcmUoJy4vdHJhbnNsYXRpb25zL2VuL19pbmRleCcpO1xyXG5yZXF1aXJlKCcuL3RyYW5zbGF0aW9ucy9pdC9faW5kZXgnKTtcclxucmVxdWlyZSgnLi90cmFuc2xhdGlvbnMvbmwvX2luZGV4Jyk7XHJcblxyXG5yZXF1aXJlKCcuL2NvbmZpZycpO1xyXG5yZXF1aXJlKCcuL2NvcmUvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL2FjY291bnQvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL2FkZGl0aW9uYWwtY29kZXMvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL2JlbGFzdGluZ2RpZW5zdC9fbW9kdWxlJyk7XHJcbnJlcXVpcmUoJy4vYnRpL19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi9hdHIvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL2Nhc2UtbGF3L19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi9jZXJ0aWZpY2F0ZS1jb2Rlcy9fbW9kdWxlJyk7XHJcbnJlcXVpcmUoJy4vY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL2NvbXBsaWFuY2UvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL2NvcnJlbGF0aW9uLXRhYmxlL19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi9jdXN0b21zLXZhbHVlL19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi9kYXNoYm9hcmQvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL2RvY3VtZW50YXRpb24vX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL2R1dHkvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL2V4Y2hhbmdlLXJhdGVzL19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi9lenQvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL2VjaWNzL19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi9mb290bm90ZXMvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL2dlb2dyYXBoeS9fbW9kdWxlJyk7XHJcbnJlcXVpcmUoJy4vZ29vZC9fbW9kdWxlJyk7XHJcbnJlcXVpcmUoJy4vbGlua3MvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL21lYXN1cmUtdHlwZXMvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL25ld3MvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL25vbWVuY2xhdHVyZS9fbW9kdWxlJyk7XHJcbnJlcXVpcmUoJy4vcGF0dGVybnMvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL3ByZWZlcmVuY2UtY29kZXMvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL3F1b3RhL19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi9yZWZlcmVuY2UtZGF0ZS9fbW9kdWxlJyk7XHJcbnJlcXVpcmUoJy4vcmVmZXJlbmNlcHJpY2VzL19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi9yZWd1bGF0aW9ucy9fbW9kdWxlJyk7XHJcbnJlcXVpcmUoJy4vc2VhcmNoL19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi90YXJlcy9fbW9kdWxlJyk7XHJcbnJlcXVpcmUoJy4vdGV4dHMvX21vZHVsZScpO1xyXG5yZXF1aXJlKCcuL3RyYWRlLW1vdmVtZW50L19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi90cmFkZS1zdGF0aXN0aWNzL19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi91bml0cy9fbW9kdWxlJyk7XHJcbnJlcXVpcmUoJy4vdmFsaWRhdGUtYnVzaW5lc3MtaW5mby9fbW9kdWxlJyk7XHJcbnJlcXVpcmUoJy4vdmF0LXJhdGVzL19tb2R1bGUnKTtcclxucmVxdWlyZSgnLi93aWRnZXRzL19tb2R1bGUnKTtcclxuXHJcbiIsImFuZ3VsYXIubW9kdWxlKCd0YXJpYy5hdHInLCBbXSlcclxuICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIC8vIENvbXBvbmVudHNcclxuICAgIC5jb21wb25lbnQoJ2F0ckJ1dHRvbicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9hdHItYnV0dG9uJykpXHJcbiAgICAuY29tcG9uZW50KCdhdHJEZXRhaWxzJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2F0ci1kZXRhaWxzJykpXHJcbiAgICAuY29tcG9uZW50KCdhdHJGb3JtJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2F0ci1mb3JtJykpXHJcbiAgICAuY29tcG9uZW50KCdhdHJJbWFnZXMnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvYXRyLWltYWdlcycpKVxyXG4gICAgLmNvbXBvbmVudCgnYXRyTGlzdCcsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9hdHItbGlzdCcpKVxyXG4gICAgLmNvbXBvbmVudCgnYXRyU2VhcmNoUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9hdHItc2VhcmNoLXBhZ2UnKSlcclxuICAgIC8vIE1vZGFsc1xyXG4gICAgLmZhY3RvcnkoJ2F0ck1vZGFsJywgcmVxdWlyZSgnLi9tb2RhbHMvYXRyJykpXHJcbiAgICAvLyBTZXJ2aWNlc1xyXG4gICAgLmZhY3RvcnkoJ2F0ckRhdGFTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy9hdHItZGF0YScpKVxyXG4gICAgO1xyXG5cclxuZnVuY3Rpb24gcm91dGVDb25maWd1cmF0b3IoJHJvdXRlUHJvdmlkZXIpIHtcclxuICAgICRyb3V0ZVByb3ZpZGVyXHJcbiAgICAgICAgLndoZW4oJy9hdHIvc2VhcmNoJywge1xyXG4gICAgICAgICAgICByZWxvYWRPblNlYXJjaDogZmFsc2UsXHJcbiAgICAgICAgICAgIHNob3dTZWFyY2hTdWJOYXY6IHRydWUsIFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxhdHItc2VhcmNoLXBhZ2U+PC9hdHItc2VhcmNoLXBhZ2U+JyxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvYXRyL2hvbWUnLCB7XHJcbiAgICAgICAgICAgIHJlbG9hZE9uU2VhcmNoOiBmYWxzZSxcclxuICAgICAgICAgICAgc2hvd1NlYXJjaFN1Yk5hdjogZmFsc2UsIFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxhdHItc2VhcmNoLXBhZ2U+PC9hdHItc2VhcmNoLXBhZ2U+JyxcclxuICAgICAgICB9KVxyXG4gICAgICAgIDtcclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgaXNMYXJnZTogJzwnLFxyXG4gICAgICAgIGl0ZW06ICc8J1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IGF0ckJ1dHRvbkNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2F0ci9jb21wb25lbnRzL2F0ci1idXR0b24uaHRtbCdcclxufTtcclxuXHJcbmF0ckJ1dHRvbkNvbnRyb2xsZXIuJGluamVjdCA9IFsnY29tbW9uJywgJ2F0ck1vZGFsJ107XHJcblxyXG5mdW5jdGlvbiBhdHJCdXR0b25Db250cm9sbGVyKGNvbW1vbiwgYXRyTW9kYWwpIHtcclxuICAgIFxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIHNob3dBdHJzOiBzaG93QXRyc1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBzaG93QXRycygpIHtcclxuICAgICAgICB2YXIgbnVtYmVyUGF0dGVybiA9IC9eXFxzKig/OlxcZHsyfVtcXHMuXSopezEsNX0kLztcclxuXHJcbiAgICAgICAgdmFyIGNvZGUgPSBjb21tb24uZm9ybWF0dGluZy5yZW1vdmVUcmFpbGluZ1plcm9zKHZtLml0ZW0uY29kZSk7XHJcblxyXG4gICAgICAgIGlmIChudW1iZXJQYXR0ZXJuLnRlc3Qodm0uaXRlbS5zZWFyY2hRdWVyeSkpXHJcbiAgICAgICAgICAgIGF0ck1vZGFsLnNob3coY29kZSwgJycpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgYXRyTW9kYWwuc2hvdyhjb2RlLCB2bS5pdGVtLnNlYXJjaFF1ZXJ5KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxufVxyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczogeyBcclxuICAgICAgICBhY3RpdmVBdHI6ICc8JyBcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBhdHJEZXRhaWxzQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnYXRyL2NvbXBvbmVudHMvYXRyLWRldGFpbHMuaHRtbCdcclxufVxyXG5cclxuYXRyRGV0YWlsc0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckZmlsdGVyJywgXHJcbiAgICAnYXRyRGF0YVNlcnZpY2UnLCBcclxuICAgICdub3RpZmljYXRpb25zU2VydmljZSdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGF0ckRldGFpbHNDb250cm9sbGVyKFxyXG4gICAgJGZpbHRlciwgXHJcbiAgICBhdHJEYXRhU2VydmljZSwgXHJcbiAgICBub3RpZmljYXRpb25zXHJcbikge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIGNsb3NlSW1hZ2VzOiBjbG9zZUltYWdlcyxcclxuICAgICAgICBzZWxlY3RJbWFnZTogc2VsZWN0SW1hZ2UsXHJcbiAgICAgICAgc2VsZWN0ZWRJbWFnZTogbnVsbCxcclxuICAgICAgICB0cmFuc2xhdGVDbGFzc2lmaWNhdGlvbkp1c3RpZmljYXRpb246IHRydWUsXHJcbiAgICAgICAgdHJhbnNsYXRlR29vZHNEZXNjcmlwdGlvbjogdHJ1ZVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMuc3Vic2NyaWJlKCdjaGFuZ2VfYWN0aXZlX2F0cicsIG9uQ2hhbmdlQWN0aXZlYXRyKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkZXRhY2hlZCgpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zLnVuc3Vic2NyaWJlKCdjaGFuZ2VfYWN0aXZlX2F0cicsIG9uQ2hhbmdlQWN0aXZlYXRyKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkNoYW5nZUFjdGl2ZWF0cigpIHtcclxuICAgICAgICB2YXIgYWN0aXZlQXRyID0gYXRyRGF0YVNlcnZpY2UuZGF0YS5hY3RpdmVBdHI7XHJcbiAgICAgICAgY2xvc2VJbWFnZXMoKTtcclxuICAgICAgICAvLyB2bS50cmFuc2xhdGVDbGFzc2lmaWNhdGlvbkp1c3RpZmljYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIC8vIHZtLnRyYW5zbGF0ZUdvb2RzRGVzY3JpcHRpb24gPSB0cnVlO1xyXG4gICAgICAgIC8vIGlmIChhY3RpdmVBdHIgJiYgYWN0aXZlQXRyLklzVHJhbnNsYXRlZCkge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAvLyAgICAgaWYgKGFjdGl2ZUF0ci5UcmFuc2xhdGVkQ2xhc3NpZmljYXRpb25KdXN0aWZpY2F0aW9uKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB2bS5DbGFzc2lmaWNhdGlvbkp1c3RpZmljYXRpb25UcmFuc2xhdGlvbiA9IHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6ICRmaWx0ZXIoJ2FkZEh5cGVybGlua3MnKShhY3RpdmVBdHIuQ2xhc3NpZmljYXRpb25KdXN0aWZpY2F0aW9uKSxcclxuICAgICAgICAvLyAgICAgICAgICAgICB0cmFuc2xhdGVkVGV4dDogJGZpbHRlcignYWRkSHlwZXJsaW5rcycpKGFjdGl2ZUF0ci5UcmFuc2xhdGVkQ2xhc3NpZmljYXRpb25KdXN0aWZpY2F0aW9uLlJlc3VsdCksXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc2hvd1RyYW5zbGF0aW9uOiB0cnVlXHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgaWYgKGFjdGl2ZUF0ci5UcmFuc2xhdGVkR29vZHNEZXNjcmlwdGlvbikge1xyXG4gICAgICAgIC8vICAgICAgICAgdm0uR29vZHNEZXNjcmlwdGlvblRyYW5zbGF0aW9uID0ge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIG9yaWdpbmFsVGV4dDogJGZpbHRlcignYWRkSHlwZXJsaW5rcycpKGFjdGl2ZUF0ci5Hb29kc0Rlc2NyaXB0aW9uKSxcclxuICAgICAgICAvLyAgICAgICAgICAgICB0cmFuc2xhdGVkVGV4dDogJGZpbHRlcignYWRkSHlwZXJsaW5rcycpKGFjdGl2ZUF0ci5UcmFuc2xhdGVkR29vZHNEZXNjcmlwdGlvbi5SZXN1bHQpLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHNob3dUcmFuc2xhdGlvbjogdHJ1ZVxyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyB7IG9yaWdpbmFsVGV4dDogYWN0aXZlQXRyLkdvb2RzRGVzY3JpcHRpb24sIHRyYW5zbGF0ZWRUZXh0OiBhY3RpdmVBdHIuVHJhbnNsYXRlZEdvb2RzRGVzY3JpcHRpb24uUmVzdWx0fVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsb3NlSW1hZ2VzKCkge1xyXG4gICAgICAgIHZtLnNlbGVjdGVkSW1hZ2UgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlbGVjdEltYWdlKGltYWdlKSB7XHJcbiAgICAgICAgdm0uc2VsZWN0ZWRJbWFnZSA9IGltYWdlO1xyXG4gICAgfVxyXG59IiwidmFyIG1vbWVudCA9IHJlcXVpcmUoJ21vbWVudCcpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIHVwZGF0ZVF1ZXJ5U3RyaW5nOiAnPCdcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBhdHJGb3JtQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnYXRyL2NvbXBvbmVudHMvYXRyLWZvcm0uaHRtbCdcclxufVxyXG5cclxuYXRyRm9ybUNvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnJGxvY2F0aW9uJywgXHJcbiAgICAnYXRyRGF0YVNlcnZpY2UnLCBcclxuICAgICdub3RpZmljYXRpb25zU2VydmljZSdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGF0ckZvcm1Db250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkbG9jYXRpb24sIFxyXG4gICAgYXRyRGF0YVNlcnZpY2UsIFxyXG4gICAgbm90aWZpY2F0aW9uc1NlcnZpY2VcclxuKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICAgICAgY2hhbmdlR29vZHNEZXNjcmlwdGlvblF1ZXJ5RmllbGQ6IGNoYW5nZUdvb2RzRGVzY3JpcHRpb25RdWVyeUZpZWxkLFxyXG4gICAgICAgIGNoYW5nZVNlYXJjaFF1ZXJ5RmllbGQ6IGNoYW5nZVNlYXJjaFF1ZXJ5RmllbGQsXHJcbiAgICAgICAgY2xlYXJDb21tb2RpdHlDb2RlOiBjbGVhckNvbW1vZGl0eUNvZGUsXHJcbiAgICAgICAgY2xlYXJBdHJSZWZlcmVuY2U6IGNsZWFyQXRyUmVmZXJlbmNlLFxyXG4gICAgICAgIGNsZWFyU2VhcmNoUXVlcnk6IGNsZWFyU2VhcmNoUXVlcnksXHJcbiAgICAgICAgY2xlYXJHb29kc0Rlc2NyaXB0aW9uUXVlcnk6IGNsZWFyR29vZHNEZXNjcmlwdGlvblF1ZXJ5LFxyXG4gICAgICAgIGZpbHRlcjogYXRyRGF0YVNlcnZpY2UuZmlsdGVyLFxyXG4gICAgICAgIHNlcnZpY2U6IGF0ckRhdGFTZXJ2aWNlLFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgaXNzdWVkU2luY2VEYXRlcGlja2VyOiB7XHJcbiAgICAgICAgICAgIGRhdGU6IG1vbWVudChhdHJEYXRhU2VydmljZS5maWx0ZXIuaXNzdWVkU2luY2UsIFwiWVlZWS1NTS1ERFwiKS50b0RhdGUoKSxcclxuICAgICAgICAgICAgZGF0ZUNoYW5nZWQ6IGlzc3VlZFNpbmNlRGF0ZUNoYW5nZWQsXHJcbiAgICAgICAgICAgIGJsdXI6IGlzc3VlZFNpbmNlQmx1cixcclxuICAgICAgICAgICAgb3BlbmVkOiBmYWxzZSxcclxuICAgICAgICAgICAgb3Blbjogb3Blbklzc3VlZFNpbmNlRGF0ZVBpY2tlcixcclxuICAgICAgICAgICAgZGF0ZU9wdGlvbnM6IHt9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2FkTmV3OiBsb2FkTmV3LFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS5zdWJzY3JpYmUoJ2xhbmd1YWdlX2NoYW5nZWQnLCBsYW5ndWFnZUNoYW5nZWQpO1xyXG4gICAgICAgIGlmIChhdHJEYXRhU2VydmljZS5maWx0ZXIuc2VhcmNoUXVlcnkpIHtcclxuICAgICAgICAgICAgYXRyRGF0YVNlcnZpY2Uub3JkZXJCeSA9ICdLZXl3b3JkUmFuay1kZXNjJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2UudW5zdWJzY3JpYmUoJ2xhbmd1YWdlX2NoYW5nZWQnLCBsYW5ndWFnZUNoYW5nZWQpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBjbGVhckF0clJlZmVyZW5jZSgpIHtcclxuICAgICAgICBhdHJEYXRhU2VydmljZS5maWx0ZXIucmVmZXJlbmNlID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJDb21tb2RpdHlDb2RlKCkge1xyXG4gICAgICAgIGF0ckRhdGFTZXJ2aWNlLmZpbHRlci5nb29kc0NvZGUgPSAnJztcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY2hhbmdlR29vZHNEZXNjcmlwdGlvblF1ZXJ5RmllbGQoKSB7XHJcbiAgICAgICAgaWYgKGF0ckRhdGFTZXJ2aWNlLmZpbHRlci5nb29kc0Rlc2NyaXB0aW9uUXVlcnkgJiYgYXRyRGF0YVNlcnZpY2Uub3JkZXJCeSAhPT0gJ0dvb2RzRGVzY3JpcHRpb25SYW5rLWRlc2MnICkge1xyXG4gICAgICAgICAgICBpZiAoYXRyRGF0YVNlcnZpY2UuZmlsdGVyLnNlYXJjaFF1ZXJ5ICYmIGF0ckRhdGFTZXJ2aWNlLm9yZGVyQnkgPT09ICdLZXl3b3JkUmFuay1kZXNjJykge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgaGFzIGVudGVyZWQgYSBrZXl3b3JkIHNlYXJjaCBxdWVyeSBhbmQgd2UncmUgb3JkZXJpbmcgYnkgdGhhdCwgZG9uJ3Qgb3ZlcnJpZCB0aGUgb3JkZXJpbmcuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhdHJEYXRhU2VydmljZS5vcmRlckJ5ID0gJ0dvb2RzRGVzY3JpcHRpb25SYW5rLWRlc2MnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyR29vZHNEZXNjcmlwdGlvblF1ZXJ5KCkge1xyXG4gICAgICAgIGF0ckRhdGFTZXJ2aWNlLmZpbHRlci5nb29kc0Rlc2NyaXB0aW9uUXVlcnkgPSAnJztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VTZWFyY2hRdWVyeUZpZWxkKCkge1xyXG4gICAgICAgIGlmIChhdHJEYXRhU2VydmljZS5maWx0ZXIuc2VhcmNoUXVlcnkgJiYgYXRyRGF0YVNlcnZpY2Uub3JkZXJCeSAhPT0gJ0tleXdvcmRSYW5rLWRlc2MnKSB7XHJcbiAgICAgICAgICAgIGlmIChhdHJEYXRhU2VydmljZS5maWx0ZXIuZ29vZHNEZXNjcmlwdGlvblF1ZXJ5ICYmIGF0ckRhdGFTZXJ2aWNlLm9yZGVyQnkgPT09ICdHb29kc0Rlc2NyaXB0aW9uUmFuay1kZXNjJykge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgaGFzIGVudGVyZWQgYSBnb29kcyBkZXNjcmlwdGlvbiBzZWFyY2ggcXVlcnkgYW5kIHdlJ3JlIG9yZGVyaW5nIGJ5IHRoYXQsIGRvbid0IG92ZXJyaWQgdGhlIG9yZGVyaW5nLlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXRyRGF0YVNlcnZpY2Uub3JkZXJCeSA9ICdLZXl3b3JkUmFuay1kZXNjJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhclNlYXJjaFF1ZXJ5KCkge1xyXG4gICAgICAgIGF0ckRhdGFTZXJ2aWNlLmZpbHRlci5zZWFyY2hRdWVyeSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxhbmd1YWdlQ2hhbmdlZCgpIHtcclxuICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCdxdWVyeScsIG51bGwpLnJlcGxhY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpc3N1ZWRTaW5jZUJsdXIoKSB7XHJcbiAgICAgICAgaWYgKCF2bS5pc3N1ZWRTaW5jZURhdGVwaWNrZXIuZGF0ZSkge1xyXG4gICAgICAgICAgICB2bS5maWx0ZXIuaXNzdWVkU2luY2UgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpc3N1ZWRTaW5jZURhdGVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICh2bS5pc3N1ZWRTaW5jZURhdGVwaWNrZXIuZGF0ZSkge1xyXG4gICAgICAgICAgICB2YXIgbmV3RGF0ZSA9IG1vbWVudCh2bS5pc3N1ZWRTaW5jZURhdGVwaWNrZXIuZGF0ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcclxuICAgICAgICAgICAgaWYgKG5ld0RhdGUgIT09IHZtLmZpbHRlci5pc3N1ZWRTaW5jZSkge1xyXG4gICAgICAgICAgICAgICAgdm0uZmlsdGVyLmlzc3VlZFNpbmNlID0gbmV3RGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdm0uZmlsdGVyLmlzc3VlZFNpbmNlID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb3Blbklzc3VlZFNpbmNlRGF0ZVBpY2tlcigpIHtcclxuICAgICAgICB2bS5pc3N1ZWRTaW5jZURhdGVwaWNrZXIub3BlbmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodm0udXBkYXRlUXVlcnlTdHJpbmcpIHtcclxuICAgICAgICB1cGRhdGVTZWFyY2hRdWVyeSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkTmV3KCkge1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvYXRyLXNlYXJjaCcpO1xyXG4gICAgICAgIGlmICh2bS51cGRhdGVRdWVyeVN0cmluZykge1xyXG4gICAgICAgICAgICB1cGRhdGVTZWFyY2hRdWVyeSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGF0ckRhdGFTZXJ2aWNlLmxvYWROZXdBdHJzKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZVNlYXJjaFF1ZXJ5KCkge1xyXG4gICAgICAgICRsb2NhdGlvbi5zZWFyY2goJ3F1ZXJ5Jywgdm0uZmlsdGVyLnNlYXJjaFF1ZXJ5KTtcclxuICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCdjb21tb2RpdHlDb2RlJywgdm0uZmlsdGVyLmdvb2RzQ29kZSk7XHJcbiAgICB9XHJcbn0iLCJ2YXIgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9ICB7XHJcbiAgICBiaW5kaW5nczoge30sXHJcbiAgICBjb250cm9sbGVyOiBhdHJJbWFnZXNDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdhdHIvY29tcG9uZW50cy9hdHItaW1hZ2VzLmh0bWwnXHJcbn1cclxuXHJcbmF0ckltYWdlc0NvbnRyb2xsZXIuJGluamVjdCA9IFsnYXRyRGF0YVNlcnZpY2UnLCAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIGF0ckltYWdlc0NvbnRyb2xsZXIoYXRyRGF0YVNlcnZpY2UsIHN0YXRlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc2VydmljZTogYXRyRGF0YVNlcnZpY2UsXHJcbiAgICAgICAgY2hhbmdlQWN0aXZlQXRyOiBhdHJEYXRhU2VydmljZS5jaGFuZ2VBY3RpdmVBdHIsXHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBsb2FkTW9yZTogbG9hZE1vcmUsXHJcbiAgICAgICAgcmVmZXJlbmNlRGF0ZTogbW9tZW50KHN0YXRlLmZpbHRlci5kYXRlLCAnWVlZWS1NTS1ERCcpLmZvcm1hdCgnRC1NLVlZJylcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZE1vcmUoKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBhdHJEYXRhU2VydmljZS5sb2FkTW9yZUF0cnMoKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9ICB7XHJcbiAgICBiaW5kaW5nczoge30sXHJcbiAgICBjb250cm9sbGVyOiBhdHJMaXN0Q29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnYXRyL2NvbXBvbmVudHMvYXRyLWxpc3QuaHRtbCdcclxufVxyXG5cclxuYXRyTGlzdENvbnRyb2xsZXIuJGluamVjdCA9IFsnYXRyRGF0YVNlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIGF0ckxpc3RDb250cm9sbGVyKGF0ckRhdGFTZXJ2aWNlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc2VydmljZTogYXRyRGF0YVNlcnZpY2UsXHJcbiAgICAgICAgY2hhbmdlQWN0aXZlQXRyOiBhdHJEYXRhU2VydmljZS5jaGFuZ2VBY3RpdmVBdHIsXHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBsb2FkTW9yZTogbG9hZE1vcmVcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZE1vcmUoKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBhdHJEYXRhU2VydmljZS5sb2FkTW9yZUF0cnMoKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGF0clNlYXJjaENvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2F0ci9jb21wb25lbnRzL2F0ci1zZWFyY2gtcGFnZS5odG1sJ1xyXG59O1xyXG5cclxuYXRyU2VhcmNoQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckbG9jYXRpb24nLCBcclxuICAgICckcm91dGUnLCBcclxuICAgICdhdHJEYXRhU2VydmljZScsIFxyXG4gICAgJ3NlYXJjaFNlcnZpY2UnLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gYXRyU2VhcmNoQ29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgJGxvY2F0aW9uLCBcclxuICAgICRyb3V0ZSwgXHJcbiAgICBhdHJEYXRhU2VydmljZSwgXHJcbiAgICBzZWFyY2hTZXJ2aWNlXHJcbikge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIHNob3dTZWFyY2hTdWJOYXY6ICRyb3V0ZS5jdXJyZW50LiQkcm91dGUuc2hvd1NlYXJjaFN1Yk5hdixcclxuICAgICAgICBzZXJ2aWNlOiBhdHJEYXRhU2VydmljZSxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGxvYWROZXc6IGxvYWROZXdcclxuICAgIH07XHJcblxyXG4gICAgdmFyIHJlZnJlc2g7XHJcbiAgICB2YXIgb3BhY2l0eSA9IDE7XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvYXRyLXNlYXJjaCcpO1xyXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYSBoYWNrLCBpbnRyb2R1Y2VkIGluIE9jdG9iZXIgMjAyMC4gVGhlIHJlYXNvbiBmb3IgaXQgaXMgdGhhdFxyXG4gICAgICAgIC8vIENocm9tZSB3b3VsZCBub3QgcmVuZGVyIHRoZSBhdHIgaW1hZ2VzIHByb3Blcmx5IGJ1dCBhIHJlZHJhdyB3b3VsZCBmaXggaXQuXHJcbiAgICAgICAgcmVmcmVzaCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBvcGFjaXR5ID0gKG9wYWNpdHkgPT09IDEgPyAwLjk5IDogMSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5idGktaW1hZ2Utc2VhcmNoLXJlc3VsdHMnKS5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eTtcclxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJ0aS1kZXRhaWwnKS5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eTtcclxuICAgICAgICB9LCA0MCk7XHJcbiAgICAgICAgaW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5idGktaW1hZ2Utc2VhcmNoLXJlc3VsdHMnKS5zdHlsZS5vcGFjaXR5ID0gMTtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnRpLWRldGFpbCcpLnN0eWxlLm9wYWNpdHkgPSAxO1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwocmVmcmVzaCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZE5ldygpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGF0ckRhdGFTZXJ2aWNlLmxvYWROZXdBdHJzKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluaXQoKSB7XHJcbiAgICAgICAgYXRyRGF0YVNlcnZpY2UucmVzZXRGaWx0ZXIoKTtcclxuICAgICAgICB2YXIgcSA9IHNlYXJjaFNlcnZpY2UucGFyc2VMb2NhdGlvblNlYXJjaE9iamVjdCgkbG9jYXRpb24uc2VhcmNoKCkpO1xyXG4gICAgICAgIGF0ckRhdGFTZXJ2aWNlLmZpbHRlci5nb29kc0NvZGUgPSBxLmNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgYXRyRGF0YVNlcnZpY2UuZmlsdGVyLnNlYXJjaFF1ZXJ5ID0gcS5xdWVyeTtcclxuICAgICAgICBsb2FkTmV3KCk7XHJcbiAgICB9XHJcblxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyR1aWJNb2RhbCcsIFxyXG4gICAgYXRyTW9kYWxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGF0ck1vZGFsKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkdWliTW9kYWxcclxuKSB7XHJcblxyXG4gICAgdmFyIG1vZGFsID0ge1xyXG4gICAgICAgIGdvb2RzQ29kZTogbnVsbCxcclxuICAgICAgICBzZWFyY2hRdWVyeTogbnVsbCxcclxuICAgICAgICBzaG93OiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgYXRyTW9kYWxDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAgICAgJyR1aWJNb2RhbEluc3RhbmNlJywgXHJcbiAgICAgICAgJ2F0ckRhdGFTZXJ2aWNlJywgXHJcbiAgICAgICAgJ2dvb2RzQ29kZScsIFxyXG4gICAgICAgICdzZWFyY2hRdWVyeScsXHJcbiAgICBdO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0ck1vZGFsQ29udHJvbGxlcihcclxuICAgICAgICAkdWliTW9kYWxJbnN0YW5jZSwgXHJcbiAgICAgICAgYXRyRGF0YVNlcnZpY2UsIFxyXG4gICAgICAgIGdvb2RzQ29kZSwgXHJcbiAgICAgICAgc2VhcmNoUXVlcnlcclxuICAgICkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICAgICAgY2FuY2VsOiBjYW5jZWwsXHJcbiAgICAgICAgICAgIGNoYW5nZUFjdGl2ZUF0cjogY2hhbmdlQWN0aXZlQXRyLFxyXG4gICAgICAgICAgICBzZXJ2aWNlOiBhdHJEYXRhU2VydmljZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2YXIgcmVmcmVzaDtcclxuICAgICAgICB2YXIgb3BhY2l0eSA9IDE7XHJcblxyXG4gICAgICAgIHJldHVybiB2bTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYSBoYWNrLCBpbnRyb2R1Y2VkIGluIE9jdG9iZXIgMjAyMC4gVGhlIHJlYXNvbiBmb3IgaXQgaXMgdGhhdFxyXG4gICAgICAgICAgICAvLyBDaHJvbWUgd291bGQgbm90IHJlbmRlciB0aGUgYXRyIGltYWdlcyBwcm9wZXJseSBidXQgYSByZWRyYXcgd291bGQgZml4IGl0LlxyXG4gICAgICAgICAgICByZWZyZXNoID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gKG9wYWNpdHkgPT09IDEgPyAwLjk5IDogMSk7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm9wYWNpdHkgPSBvcGFjaXR5O1xyXG4gICAgICAgICAgICB9LCA0MCk7XHJcbiAgICAgICAgICAgIGluaXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm9wYWNpdHkgPSAxO1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKHJlZnJlc2gpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2hhbmdlQWN0aXZlQXRyKGF0clJlZmVyZW5jZSkge1xyXG4gICAgICAgICAgICBhdHJEYXRhU2VydmljZS5jaGFuZ2VBY3RpdmVBdHIoYXRyUmVmZXJlbmNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XHJcbiAgICAgICAgICAgIGF0ckRhdGFTZXJ2aWNlLmNsZWFyQWN0aXZlQXRyKCk7XHJcbiAgICAgICAgICAgIGF0ckRhdGFTZXJ2aWNlLnJlc2V0RmlsdGVyKCk7XHJcbiAgICAgICAgICAgIGF0ckRhdGFTZXJ2aWNlLmZpbHRlci5nb29kc0NvZGUgPSBnb29kc0NvZGU7XHJcbiAgICAgICAgICAgIGF0ckRhdGFTZXJ2aWNlLmZpbHRlci5zZWFyY2hRdWVyeSA9IHNlYXJjaFF1ZXJ5O1xyXG4gICAgICAgICAgICBhdHJEYXRhU2VydmljZS5sb2FkTmV3QXRycygpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChnb29kc0NvZGUsIHNlYXJjaFF1ZXJ5KSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdvcGVuLW1vZGFsLWF0cicsIHsgY2F0ZWdvcnk6ICdhdHInIH0pO1xyXG4gICAgICAgIGlmIChnb29kc0NvZGUpXHJcbiAgICAgICAgICAgIG1vZGFsLmdvb2RzQ29kZSA9IGdvb2RzQ29kZTtcclxuICAgICAgICBpZiAoc2VhcmNoUXVlcnkpXHJcbiAgICAgICAgICAgIG1vZGFsLnNlYXJjaFF1ZXJ5ID0gc2VhcmNoUXVlcnk7XHJcblxyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IGF0ck1vZGFsQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAnY3RybEF0ck1vZGFsJyxcclxuICAgICAgICAgICAga2V5Ym9hcmQ6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGFsRmFkZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgZ29vZHNDb2RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGFsLmdvb2RzQ29kZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZWFyY2hRdWVyeTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RhbC5zZWFyY2hRdWVyeTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2l6ZTogJ2xnJyxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdhdHIvbW9kYWxzL2F0ci5odG1sJyxcclxuICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdtb2RhbC1idGknXHJcbiAgICAgICAgfSkucmVzdWx0LmNhdGNoKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgaWYgKCEocmVzID09PSAnY2FuY2VsJyB8fCByZXMgPT09ICdlc2NhcGUga2V5IHByZXNzJyB8fCByZXMgPT09ICdiYWNrZHJvcCBjbGljaycpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyByZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbW9kYWw7XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyAgPSBbXHJcbiAgICAnZGF0YUNvbnRleHQnLCBcclxuICAgICdjb21tb24nLCBcclxuICAgICdsYW5ndWFnZScsIFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLCBcclxuICAgIGF0ckRhdGFTZXJ2aWNlXHJcbl07XHJcblxyXG5mdW5jdGlvbiBhdHJEYXRhU2VydmljZShcclxuICAgIGRhdGFDb250ZXh0LCBcclxuICAgIGNvbW1vbiwgXHJcbiAgICBsYW5ndWFnZSwgXHJcbiAgICBzdGF0ZSwgXHJcbiAgICBub3RpZmljYXRpb25zXHJcbikge1xyXG5cclxuICAgIHZhciBhY3RpdmVhdHJSZWZlcmVuY2UgPSBudWxsO1xyXG5cclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIHJlc3BvbnNlOiB7fSxcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIGFjdGl2ZUF0cjogbnVsbCxcclxuICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRpc3BsYXk6ICdsaXN0JyxcclxuICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgZ29vZHNDb2RlOiBudWxsLFxyXG4gICAgICAgICAgICBpc3N1ZWRTaW5jZTogbnVsbCxcclxuICAgICAgICAgICAgcmVmZXJlbmNlOiBudWxsLFxyXG4gICAgICAgICAgICBzZWFyY2hRdWVyeTogbnVsbCxcclxuICAgICAgICAgICAgcGFnZU51bWJlcjogMVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb3JkZXJCeTogJ0NvbW1vZGl0eUNvZGUtYXNjJyxcclxuICAgICAgICBsb2FkTmV3QXRyczogbG9hZE5ld0F0cnMsXHJcbiAgICAgICAgbG9hZE1vcmVBdHJzOiBsb2FkTW9yZUF0cnMsXHJcbiAgICAgICAgY2hhbmdlQWN0aXZlQXRyOiBjaGFuZ2VBY3RpdmVBdHIsXHJcbiAgICAgICAgY2xlYXJBY3RpdmVBdHI6IGNsZWFyQWN0aXZlQXRyLFxyXG4gICAgICAgIGNvdW50QXRyc0J5SGVhZGluZzogY291bnRBdHJzQnlIZWFkaW5nLFxyXG4gICAgICAgIGNvdW50QXRyU2VhcmNoUmVzdWx0czogY291bnRBdHJTZWFyY2hSZXN1bHRzLFxyXG4gICAgICAgIHJlc2V0RmlsdGVyOiByZXNldEZpbHRlclxyXG4gICAgfTtcclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJlc2V0RmlsdGVyKCkge1xyXG4gICAgICAgIHNlcnZpY2UuZmlsdGVyLmdvb2RzQ29kZSA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5maWx0ZXIuaXNzdWVkU2luY2UgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UuZmlsdGVyLnJlZmVyZW5jZSA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5maWx0ZXIuc2VhcmNoUXVlcnkgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UuZmlsdGVyLmdvb2RzRGVzY3JpcHRpb25RdWVyeSA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5maWx0ZXIucGFnZU51bWJlciA9IDE7XHJcbiAgICAgICAgc2VydmljZS5kaXNwbGF5ID0gJ2xpc3QnO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWROZXdBdHJzKCkge1xyXG4gICAgICAgIHNlcnZpY2UuZGF0YS5hY3RpdmVBdHIgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UuZmlsdGVyLnBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgICAgIHJldHVybiBsb2FkQXRycyhzZXJ2aWNlLmZpbHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZE1vcmVBdHJzKCkge1xyXG4gICAgICAgIHJldHVybiBsb2FkQXRycyhzZXJ2aWNlLmZpbHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZEF0cnMoZmlsdGVyKSB7XHJcblxyXG4gICAgICAgIHZhciBzb3J0ID0gc2VydmljZS5vcmRlckJ5LnNwbGl0KCctJylbMF07XHJcbiAgICAgICAgdmFyIG9yZGVyID0gc2VydmljZS5vcmRlckJ5LnNwbGl0KCctJylbMV07XHJcblxyXG4gICAgICAgIGlmIChzb3J0ID09PSAnS2V5d29yZFJhbmsnICYmICFmaWx0ZXIuc2VhcmNoUXVlcnkpIHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlci5nb29kc0Rlc2NyaXB0aW9uUXVlcnkpIHtcclxuICAgICAgICAgICAgICAgIHNvcnQgPSAnR29vZHNEZXNjcmlwdGlvblJhbmsnO1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5vcmRlckJ5ID0gJ0dvb2RzRGVzY3JpcHRpb25SYW5rLWRlc2MnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc29ydCA9ICdDb21tb2RpdHlDb2RlJztcclxuICAgICAgICAgICAgICAgIG9yZGVyID0gJ2FzYyc7XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLm9yZGVyQnkgPSAnQ29tbW9kaXR5Q29kZS1hc2MnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNvcnQgPT09ICdHb29kc0Rlc2NyaXB0aW9uUmFuaycgJiYgIWZpbHRlci5nb29kc0Rlc2NyaXB0aW9uUXVlcnkpIHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlci5zZWFyY2hRdWVyeSkge1xyXG4gICAgICAgICAgICAgICAgc29ydCA9ICdLZXl3b3JkUmFuayc7XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLm9yZGVyQnkgPSAnS2V5d29yZFJhbmstZGVzYyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzb3J0ID0gJ0NvbW1vZGl0eUNvZGUnO1xyXG4gICAgICAgICAgICAgICAgb3JkZXIgPSAnYXNjJztcclxuICAgICAgICAgICAgICAgIHNlcnZpY2Uub3JkZXJCeSA9ICdDb21tb2RpdHlDb2RlLWFzYydcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvYXRyL3NlYXJjaCcgK1xyXG4gICAgICAgICAgICAnP2dvb2RzY29kZT0nICsgKGZpbHRlci5nb29kc0NvZGUgfHwgJycpICtcclxuICAgICAgICAgICAgJyZwaW5kZXg9JyArIChmaWx0ZXIucGFnZU51bWJlciAtIDEpICtcclxuICAgICAgICAgICAgJyZwc2l6ZT0yMCcgK1xyXG4gICAgICAgICAgICAnJmxhbmc9JyArIGxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZSArXHJcbiAgICAgICAgICAgICcmc29ydD0nICsgc29ydCArXHJcbiAgICAgICAgICAgICcmb3JkZXI9JyArIG9yZGVyO1xyXG4gICAgICAgIGlmIChmaWx0ZXIuc2VhcmNoUXVlcnkpXHJcbiAgICAgICAgICAgIHVybCArPSAnJmtleXdvcmQtcXVlcnk9JyArIGZpbHRlci5zZWFyY2hRdWVyeTtcclxuICAgICAgICBpZiAoZmlsdGVyLmdvb2RzRGVzY3JpcHRpb25RdWVyeSlcclxuICAgICAgICAgICAgdXJsICs9ICcmZ29vZHMtZGVzY3JpcHRpb24tcXVlcnk9JyArIGZpbHRlci5nb29kc0Rlc2NyaXB0aW9uUXVlcnk7XHJcbiAgICAgICAgaWYgKGZpbHRlci5yZWZlcmVuY2UpXHJcbiAgICAgICAgICAgIHVybCArPSAnJnJlZmVyZW5jZT0nICsgZmlsdGVyLnJlZmVyZW5jZTtcclxuICAgICAgICBpZiAoc2VydmljZS5kaXNwbGF5ID09PSAnaW1hZ2VzJykge1xyXG4gICAgICAgICAgICB1cmwgKz0gJyZpbWFnZXNlYXJjaD0xJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlci5pc3N1ZWRTaW5jZSkge1xyXG4gICAgICAgICAgICB1cmwgKz0gJyZpc3N1ZWRzaW5jZT0nICsgZmlsdGVyLmlzc3VlZFNpbmNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VydmljZS5kYXRhLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpLnRoZW4oZnVuY3Rpb24gKHBhZ2luYXRlZGF0cnMpIHtcclxuICAgICAgICAgICAgc2VydmljZS5kYXRhLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXJ2aWNlLnJlc3BvbnNlID0gcGFnaW5hdGVkYXRycztcclxuICAgICAgICAgICAgaWYgKHNlcnZpY2UucmVzcG9uc2UuUmVzdWx0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZWF0clJlZmVyZW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUFjdGl2ZUF0cihzZXJ2aWNlLnJlc3BvbnNlLlJlc3VsdHNbMF0uUnVsaW5nUmVmZXJlbmNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyQWN0aXZlQXRyKCkge1xyXG4gICAgICAgIHNlcnZpY2UuZGF0YS5hY3RpdmVBdHIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNoYW5nZUFjdGl2ZUF0cihhdHJSZWZlcmVuY2UpIHtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9hdHIvJyArIGF0clJlZmVyZW5jZS50b1N0cmluZygpLnRyaW0oKSArICcvJztcclxuICAgICAgICBzZXJ2aWNlLmRhdGEuYWN0aXZlQXRyID0gbnVsbDtcclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCkudGhlbihmdW5jdGlvbiAoYWN0aXZlQXRyKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuZGF0YS5hY3RpdmVBdHIgPSBhY3RpdmVBdHI7XHJcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVibGlzaCgnY2hhbmdlX2FjdGl2ZV9hdHInLCBhY3RpdmVBdHIpO1xyXG4gICAgICAgICAgICBfLmZvckVhY2goc2VydmljZS5yZXNwb25zZS5SZXN1bHRzLCBmdW5jdGlvbiAoYXRyKSB7XHJcbiAgICAgICAgICAgICAgICBhdHIuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXRyLlJ1bGluZ1JlZmVyZW5jZSA9PT0gYXRyUmVmZXJlbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXRyLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvdW50QXRyc0J5SGVhZGluZyhjaGFwdGVyQ29kZSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2F0ci9jb3VudGJ5aGVhZGluZy8nICsgY2hhcHRlckNvZGU7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvdW50QXRyU2VhcmNoUmVzdWx0cyhxKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvYXRyL2NvdW50JyArXHJcbiAgICAgICAgICAgICc/bGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZnb29kc2NvZGU9JyArIHEuY29kZSArXHJcbiAgICAgICAgICAgICcma2V5d29yZC1xdWVyeT0nICsgcS5xdWVyeTtcclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcbn0iLCJhbmd1bGFyLm1vZHVsZSgndGFyaWMuYmVsYXN0aW5nZGllbnN0JywgW10pXHJcbiAgICAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCByb3V0ZUNvbmZpZ3VyYXRvcl0pXHJcbiAgICAuY29tcG9uZW50KCdiZWxhc3RpbmdkaWVuc3RQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2JlbGFzdGluZ2RpZW5zdC1wYWdlJykpXHJcbiAgICAuZmFjdG9yeSgnYmVsYXN0aW5nZGllbnN0RGF0YVNlcnZpY2UnLCByZXF1aXJlKCcuL3NlcnZpY2VzL2JlbGFzdGluZ2RpZW5zdC1kYXRhJykpXHJcbiAgICA7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAvLyAud2hlbignL25pZXV3cy1kb3VhbmUtdm9vci1iZWRyaWp2ZW4nLCB7XHJcbiAgICAgICAgLy8gICAgIHRlbXBsYXRlVXJsOiAnYmVsYXN0aW5nZGllbnN0L2NvbXBvbmVudHMvYmVsYXN0aW5nZGllbnN0LXBhZ2UuaHRtbCdcclxuICAgICAgICAvLyB9KVxyXG4gICAgICAgIDtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGJlbGFzdGluZ2RpZW5zdFBhZ2VDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdiZWxhc3RpbmdkaWVuc3QvY29tcG9uZW50cy9iZWxhc3RpbmdkaWVuc3QtcGFnZS5odG1sJ1xyXG59O1xyXG5cclxuYmVsYXN0aW5nZGllbnN0UGFnZUNvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnYmVsYXN0aW5nZGllbnN0RGF0YVNlcnZpY2UnXHJcbl07XHJcblxyXG5mdW5jdGlvbiBiZWxhc3RpbmdkaWVuc3RQYWdlQ29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgYmVsYXN0aW5nZGllbnN0RGF0YVxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIGl0ZW1zOiBbXVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9kdXRjaC1jdXN0b21zLW5ld3MnKTtcclxuICAgICAgICBsb2FkSXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkSXRlbXMoKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB2bS5kYXRhLml0ZW1zID0gW107XHJcbiAgICAgICAgYmVsYXN0aW5nZGllbnN0RGF0YS5nZXROZXdzKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZtLmRhdGEuaXRlbXMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBbJ2NvbW1vbicsICdkYXRhQ29udGV4dCcsICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIGJlbGFzdGluZ2RpZW5zdERhdGFTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIGJlbGFzdGluZ2RpZW5zdERhdGFTZXJ2aWNlKGNvbW1vbiwgY29udGV4dCwgc3RhdGUpIHtcclxuXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBnZXROZXdzOiBnZXROZXdzXHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBnZXROZXdzKCkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2JlbGFzdGluZ2RpZW5zdC9uZXdzJyArXHJcbiAgICAgICAgICAgICc/ZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcblxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxufVxyXG4iLCJhbmd1bGFyLm1vZHVsZSgndGFyaWMuYnRpJywgW10pXHJcbiAgICAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCByb3V0ZUNvbmZpZ3VyYXRvcl0pXHJcbiAgICAvLyBDb21wb25lbnRzXHJcbiAgICAuY29tcG9uZW50KCdidGlCdXR0b24nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvYnRpLWJ1dHRvbicpKVxyXG4gICAgLmNvbXBvbmVudCgnYnRpRGV0YWlscycsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9idGktZGV0YWlscycpKVxyXG4gICAgLmNvbXBvbmVudCgnYnRpRm9ybScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9idGktZm9ybScpKVxyXG4gICAgLmNvbXBvbmVudCgnYnRpSW1hZ2VzJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2J0aS1pbWFnZXMnKSlcclxuICAgIC5jb21wb25lbnQoJ2J0aUxpc3QnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvYnRpLWxpc3QnKSlcclxuICAgIC5jb21wb25lbnQoJ2J0aVNlYXJjaFBhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvYnRpLXNlYXJjaC1wYWdlJykpXHJcbiAgICAvLyBNb2RhbHNcclxuICAgIC5mYWN0b3J5KCdidGlNb2RhbCcsIHJlcXVpcmUoJy4vbW9kYWxzL2J0aScpKVxyXG4gICAgLy8gU2VydmljZXNcclxuICAgIC5mYWN0b3J5KCdidGlEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvYnRpLWRhdGEnKSlcclxuICAgIDtcclxuXHJcbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJhdG9yKCRyb3V0ZVByb3ZpZGVyKSB7XHJcbiAgICAkcm91dGVQcm92aWRlclxyXG4gICAgICAgIC53aGVuKCcvYnRpL3NlYXJjaCcsIHtcclxuICAgICAgICAgICAgcmVsb2FkT25TZWFyY2g6IGZhbHNlLFxyXG4gICAgICAgICAgICBzaG93U2VhcmNoU3ViTmF2OiB0cnVlLCBcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8YnRpLXNlYXJjaC1wYWdlPjwvYnRpLXNlYXJjaC1wYWdlPicsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2hlbignL2J0aS9ob21lJywge1xyXG4gICAgICAgICAgICByZWxvYWRPblNlYXJjaDogZmFsc2UsXHJcbiAgICAgICAgICAgIHNob3dTZWFyY2hTdWJOYXY6IGZhbHNlLCBcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8YnRpLXNlYXJjaC1wYWdlPjwvYnRpLXNlYXJjaC1wYWdlPicsXHJcbiAgICAgICAgfSlcclxuICAgICAgICA7XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIGlzTGFyZ2U6ICc8JyxcclxuICAgICAgICBpdGVtOiAnPCdcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBidGlCdXR0b25Db250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdidGkvY29tcG9uZW50cy9idGktYnV0dG9uLmh0bWwnXHJcbn07XHJcblxyXG5idGlCdXR0b25Db250cm9sbGVyLiRpbmplY3QgPSBbJ2NvbW1vbicsICdidGlNb2RhbCddO1xyXG5cclxuZnVuY3Rpb24gYnRpQnV0dG9uQ29udHJvbGxlcihjb21tb24sIGJ0aU1vZGFsKSB7XHJcbiAgICBcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBzaG93QnRpczogc2hvd0J0aXNcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0J0aXMoKSB7XHJcbiAgICAgICAgdmFyIG51bWJlclBhdHRlcm4gPSAvXlxccyooPzpcXGR7Mn1bXFxzLl0qKXsxLDV9JC87XHJcblxyXG4gICAgICAgIHZhciBjb2RlID0gY29tbW9uLmZvcm1hdHRpbmcucmVtb3ZlVHJhaWxpbmdaZXJvcyh2bS5pdGVtLmNvZGUpO1xyXG5cclxuICAgICAgICBpZiAobnVtYmVyUGF0dGVybi50ZXN0KHZtLml0ZW0uc2VhcmNoUXVlcnkpKVxyXG4gICAgICAgICAgICBidGlNb2RhbC5zaG93KGNvZGUsICcnKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGJ0aU1vZGFsLnNob3coY29kZSwgdm0uaXRlbS5zZWFyY2hRdWVyeSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbn1cclxuXHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHsgXHJcbiAgICAgICAgYWN0aXZlQnRpOiAnPCcgXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogYnRpRGV0YWlsc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2J0aS9jb21wb25lbnRzL2J0aS1kZXRhaWxzLmh0bWwnXHJcbn1cclxuXHJcbmJ0aURldGFpbHNDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGZpbHRlcicsIFxyXG4gICAgJ2J0aURhdGFTZXJ2aWNlJywgXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnXHJcbl07XHJcblxyXG5mdW5jdGlvbiBidGlEZXRhaWxzQ29udHJvbGxlcihcclxuICAgICRmaWx0ZXIsIFxyXG4gICAgYnRpRGF0YVNlcnZpY2UsIFxyXG4gICAgbm90aWZpY2F0aW9uc1xyXG4pIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICBjbG9zZUltYWdlczogY2xvc2VJbWFnZXMsXHJcbiAgICAgICAgc2VsZWN0SW1hZ2U6IHNlbGVjdEltYWdlLFxyXG4gICAgICAgIHNlbGVjdGVkSW1hZ2U6IG51bGwsXHJcbiAgICAgICAgdHJhbnNsYXRlQ2xhc3NpZmljYXRpb25KdXN0aWZpY2F0aW9uOiB0cnVlLFxyXG4gICAgICAgIHRyYW5zbGF0ZUdvb2RzRGVzY3JpcHRpb246IHRydWVcclxuICAgIH07XHJcbiAgICBcclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zLnN1YnNjcmliZSgnY2hhbmdlX2FjdGl2ZV9idGknLCBvbkNoYW5nZUFjdGl2ZUJ0aSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy51bnN1YnNjcmliZSgnY2hhbmdlX2FjdGl2ZV9idGknLCBvbkNoYW5nZUFjdGl2ZUJ0aSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25DaGFuZ2VBY3RpdmVCdGkoKSB7XHJcbiAgICAgICAgdmFyIGFjdGl2ZUJ0aSA9IGJ0aURhdGFTZXJ2aWNlLmRhdGEuYWN0aXZlQnRpO1xyXG4gICAgICAgIGNsb3NlSW1hZ2VzKCk7XHJcbiAgICAgICAgdm0udHJhbnNsYXRlQ2xhc3NpZmljYXRpb25KdXN0aWZpY2F0aW9uID0gdHJ1ZTtcclxuICAgICAgICB2bS50cmFuc2xhdGVHb29kc0Rlc2NyaXB0aW9uID0gdHJ1ZTtcclxuICAgICAgICBpZiAoYWN0aXZlQnRpICYmIGFjdGl2ZUJ0aS5Jc1RyYW5zbGF0ZWQpIHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVCdGkuVHJhbnNsYXRlZENsYXNzaWZpY2F0aW9uSnVzdGlmaWNhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdm0uQ2xhc3NpZmljYXRpb25KdXN0aWZpY2F0aW9uVHJhbnNsYXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxUZXh0OiAkZmlsdGVyKCdhZGRIeXBlcmxpbmtzJykoYWN0aXZlQnRpLkNsYXNzaWZpY2F0aW9uSnVzdGlmaWNhdGlvbiksXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlZFRleHQ6ICRmaWx0ZXIoJ2FkZEh5cGVybGlua3MnKShhY3RpdmVCdGkuVHJhbnNsYXRlZENsYXNzaWZpY2F0aW9uSnVzdGlmaWNhdGlvbi5SZXN1bHQpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dUcmFuc2xhdGlvbjogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVCdGkuVHJhbnNsYXRlZEdvb2RzRGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIHZtLkdvb2RzRGVzY3JpcHRpb25UcmFuc2xhdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6ICRmaWx0ZXIoJ2FkZEh5cGVybGlua3MnKShhY3RpdmVCdGkuR29vZHNEZXNjcmlwdGlvbiksXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlZFRleHQ6ICRmaWx0ZXIoJ2FkZEh5cGVybGlua3MnKShhY3RpdmVCdGkuVHJhbnNsYXRlZEdvb2RzRGVzY3JpcHRpb24uUmVzdWx0KSxcclxuICAgICAgICAgICAgICAgICAgICBzaG93VHJhbnNsYXRpb246IHRydWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8geyBvcmlnaW5hbFRleHQ6IGFjdGl2ZUJ0aS5Hb29kc0Rlc2NyaXB0aW9uLCB0cmFuc2xhdGVkVGV4dDogYWN0aXZlQnRpLlRyYW5zbGF0ZWRHb29kc0Rlc2NyaXB0aW9uLlJlc3VsdH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbG9zZUltYWdlcygpIHtcclxuICAgICAgICB2bS5zZWxlY3RlZEltYWdlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWxlY3RJbWFnZShpbWFnZSkge1xyXG4gICAgICAgIHZtLnNlbGVjdGVkSW1hZ2UgPSBpbWFnZTtcclxuICAgIH1cclxufSIsInZhciBtb21lbnQgPSByZXF1aXJlKCdtb21lbnQnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICB1cGRhdGVRdWVyeVN0cmluZzogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogYnRpRm9ybUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2J0aS9jb21wb25lbnRzL2J0aS1mb3JtLmh0bWwnXHJcbn1cclxuXHJcbmJ0aUZvcm1Db250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyRsb2NhdGlvbicsIFxyXG4gICAgJ2J0aURhdGFTZXJ2aWNlJywgXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnXHJcbl07XHJcblxyXG5mdW5jdGlvbiBidGlGb3JtQ29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgJGxvY2F0aW9uLCBcclxuICAgIGJ0aURhdGFTZXJ2aWNlLCBcclxuICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlXHJcbikge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIGNoYW5nZUdvb2RzRGVzY3JpcHRpb25RdWVyeUZpZWxkOiBjaGFuZ2VHb29kc0Rlc2NyaXB0aW9uUXVlcnlGaWVsZCxcclxuICAgICAgICBjaGFuZ2VTZWFyY2hRdWVyeUZpZWxkOiBjaGFuZ2VTZWFyY2hRdWVyeUZpZWxkLFxyXG4gICAgICAgIGNsZWFyQ29tbW9kaXR5Q29kZTogY2xlYXJDb21tb2RpdHlDb2RlLFxyXG4gICAgICAgIGNsZWFyQnRpUmVmZXJlbmNlOiBjbGVhckJ0aVJlZmVyZW5jZSxcclxuICAgICAgICBjbGVhckNvdW50cnk6IGNsZWFyQ291bnRyeSxcclxuICAgICAgICBjbGVhclNlYXJjaFF1ZXJ5OiBjbGVhclNlYXJjaFF1ZXJ5LFxyXG4gICAgICAgIGNsZWFyR29vZHNEZXNjcmlwdGlvblF1ZXJ5OiBjbGVhckdvb2RzRGVzY3JpcHRpb25RdWVyeSxcclxuICAgICAgICBmaWx0ZXI6IGJ0aURhdGFTZXJ2aWNlLmZpbHRlcixcclxuICAgICAgICBzZXJ2aWNlOiBidGlEYXRhU2VydmljZSxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGlzc3VlZFNpbmNlRGF0ZXBpY2tlcjoge1xyXG4gICAgICAgICAgICBkYXRlOiBtb21lbnQoYnRpRGF0YVNlcnZpY2UuZmlsdGVyLmlzc3VlZFNpbmNlLCBcIllZWVktTU0tRERcIikudG9EYXRlKCksXHJcbiAgICAgICAgICAgIGRhdGVDaGFuZ2VkOiBpc3N1ZWRTaW5jZURhdGVDaGFuZ2VkLFxyXG4gICAgICAgICAgICBibHVyOiBpc3N1ZWRTaW5jZUJsdXIsXHJcbiAgICAgICAgICAgIG9wZW5lZDogZmFsc2UsXHJcbiAgICAgICAgICAgIG9wZW46IG9wZW5Jc3N1ZWRTaW5jZURhdGVQaWNrZXIsXHJcbiAgICAgICAgICAgIGRhdGVPcHRpb25zOiB7fVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbG9hZE5ldzogbG9hZE5ldyxcclxuICAgICAgICBvblNlbGVjdENvdW50cnk6IG9uU2VsZWN0Q291bnRyeVxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS5zdWJzY3JpYmUoJ2xhbmd1YWdlX2NoYW5nZWQnLCBsYW5ndWFnZUNoYW5nZWQpO1xyXG4gICAgICAgIGlmIChidGlEYXRhU2VydmljZS5maWx0ZXIuc2VhcmNoUXVlcnkpIHtcclxuICAgICAgICAgICAgYnRpRGF0YVNlcnZpY2Uub3JkZXJCeSA9ICdLZXl3b3JkUmFuay1kZXNjJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZtLnVwZGF0ZVF1ZXJ5U3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZVNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnVuc3Vic2NyaWJlKCdsYW5ndWFnZV9jaGFuZ2VkJywgbGFuZ3VhZ2VDaGFuZ2VkKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZnVuY3Rpb24gY2xlYXJCdGlSZWZlcmVuY2UoKSB7XHJcbiAgICAgICAgYnRpRGF0YVNlcnZpY2UuZmlsdGVyLnJlZmVyZW5jZSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyQ29tbW9kaXR5Q29kZSgpIHtcclxuICAgICAgICBidGlEYXRhU2VydmljZS5maWx0ZXIuZ29vZHNDb2RlID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJDb3VudHJ5KCkge1xyXG4gICAgICAgIGJ0aURhdGFTZXJ2aWNlLmZpbHRlci5jb3VudHJ5ID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25TZWxlY3RDb3VudHJ5KGNvdW50cnkpIHtcclxuICAgICAgICBpZiAoY291bnRyeSkge1xyXG4gICAgICAgICAgICBidGlEYXRhU2VydmljZS5maWx0ZXIuY291bnRyeSA9IGNvdW50cnkuY29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGJ0aURhdGFTZXJ2aWNlLmZpbHRlci5jb3VudHJ5ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNoYW5nZUdvb2RzRGVzY3JpcHRpb25RdWVyeUZpZWxkKCkge1xyXG4gICAgICAgIGlmIChidGlEYXRhU2VydmljZS5maWx0ZXIuZ29vZHNEZXNjcmlwdGlvblF1ZXJ5ICYmIGJ0aURhdGFTZXJ2aWNlLm9yZGVyQnkgIT09ICdHb29kc0Rlc2NyaXB0aW9uUmFuay1kZXNjJyApIHtcclxuICAgICAgICAgICAgaWYgKGJ0aURhdGFTZXJ2aWNlLmZpbHRlci5zZWFyY2hRdWVyeSAmJiBidGlEYXRhU2VydmljZS5vcmRlckJ5ID09PSAnS2V5d29yZFJhbmstZGVzYycpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBlbnRlcmVkIGEga2V5d29yZCBzZWFyY2ggcXVlcnkgYW5kIHdlJ3JlIG9yZGVyaW5nIGJ5IHRoYXQsIGRvbid0IG92ZXJyaWQgdGhlIG9yZGVyaW5nLlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYnRpRGF0YVNlcnZpY2Uub3JkZXJCeSA9ICdHb29kc0Rlc2NyaXB0aW9uUmFuay1kZXNjJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhckdvb2RzRGVzY3JpcHRpb25RdWVyeSgpIHtcclxuICAgICAgICBidGlEYXRhU2VydmljZS5maWx0ZXIuZ29vZHNEZXNjcmlwdGlvblF1ZXJ5ID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2hhbmdlU2VhcmNoUXVlcnlGaWVsZCgpIHtcclxuICAgICAgICBpZiAoYnRpRGF0YVNlcnZpY2UuZmlsdGVyLnNlYXJjaFF1ZXJ5ICYmIGJ0aURhdGFTZXJ2aWNlLm9yZGVyQnkgIT09ICdLZXl3b3JkUmFuay1kZXNjJykge1xyXG4gICAgICAgICAgICBpZiAoYnRpRGF0YVNlcnZpY2UuZmlsdGVyLmdvb2RzRGVzY3JpcHRpb25RdWVyeSAmJiBidGlEYXRhU2VydmljZS5vcmRlckJ5ID09PSAnR29vZHNEZXNjcmlwdGlvblJhbmstZGVzYycpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBlbnRlcmVkIGEgZ29vZHMgZGVzY3JpcHRpb24gc2VhcmNoIHF1ZXJ5IGFuZCB3ZSdyZSBvcmRlcmluZyBieSB0aGF0LCBkb24ndCBvdmVycmlkIHRoZSBvcmRlcmluZy5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJ0aURhdGFTZXJ2aWNlLm9yZGVyQnkgPSAnS2V5d29yZFJhbmstZGVzYyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJTZWFyY2hRdWVyeSgpIHtcclxuICAgICAgICBidGlEYXRhU2VydmljZS5maWx0ZXIuc2VhcmNoUXVlcnkgPSAnJztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsYW5ndWFnZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgncXVlcnknLCBudWxsKS5yZXBsYWNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXNzdWVkU2luY2VCbHVyKCkge1xyXG4gICAgICAgIGlmICghdm0uaXNzdWVkU2luY2VEYXRlcGlja2VyLmRhdGUpIHtcclxuICAgICAgICAgICAgdm0uZmlsdGVyLmlzc3VlZFNpbmNlID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXNzdWVkU2luY2VEYXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAodm0uaXNzdWVkU2luY2VEYXRlcGlja2VyLmRhdGUpIHtcclxuICAgICAgICAgICAgdmFyIG5ld0RhdGUgPSBtb21lbnQodm0uaXNzdWVkU2luY2VEYXRlcGlja2VyLmRhdGUpLmZvcm1hdChcIllZWVktTU0tRERcIik7XHJcbiAgICAgICAgICAgIGlmIChuZXdEYXRlICE9PSB2bS5maWx0ZXIuaXNzdWVkU2luY2UpIHtcclxuICAgICAgICAgICAgICAgIHZtLmZpbHRlci5pc3N1ZWRTaW5jZSA9IG5ld0RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5pc3N1ZWRTaW5jZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG9wZW5Jc3N1ZWRTaW5jZURhdGVQaWNrZXIoKSB7XHJcbiAgICAgICAgdm0uaXNzdWVkU2luY2VEYXRlcGlja2VyLm9wZW5lZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWROZXcoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9idGktc2VhcmNoJyk7XHJcbiAgICAgICAgaWYgKHZtLnVwZGF0ZVF1ZXJ5U3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZVNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZtLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgYnRpRGF0YVNlcnZpY2UubG9hZE5ld0J0aXMoKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdXBkYXRlU2VhcmNoUXVlcnkoKSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgncXVlcnknLCB2bS5maWx0ZXIuc2VhcmNoUXVlcnkpO1xyXG4gICAgICAgICRsb2NhdGlvbi5zZWFyY2goJ2NvbW1vZGl0eUNvZGUnLCB2bS5maWx0ZXIuZ29vZHNDb2RlKTtcclxuICAgIH1cclxufSIsInZhciBtb21lbnQgPSByZXF1aXJlKCdtb21lbnQnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gIHtcclxuICAgIGJpbmRpbmdzOiB7fSxcclxuICAgIGNvbnRyb2xsZXI6IGJ0aUltYWdlc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2J0aS9jb21wb25lbnRzL2J0aS1pbWFnZXMuaHRtbCdcclxufVxyXG5cclxuYnRpSW1hZ2VzQ29udHJvbGxlci4kaW5qZWN0ID0gWydidGlEYXRhU2VydmljZScsICdhcHBsaWNhdGlvblN0YXRlU2VydmljZSddO1xyXG5cclxuZnVuY3Rpb24gYnRpSW1hZ2VzQ29udHJvbGxlcihidGlEYXRhU2VydmljZSwgc3RhdGUpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBzZXJ2aWNlOiBidGlEYXRhU2VydmljZSxcclxuICAgICAgICBjaGFuZ2VBY3RpdmVCdGk6IGJ0aURhdGFTZXJ2aWNlLmNoYW5nZUFjdGl2ZUJ0aSxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGxvYWRNb3JlOiBsb2FkTW9yZSxcclxuICAgICAgICByZWZlcmVuY2VEYXRlOiBtb21lbnQoc3RhdGUuZmlsdGVyLmRhdGUsICdZWVlZLU1NLUREJykuZm9ybWF0KCdELU0tWVknKVxyXG4gICAgfTtcclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkTW9yZSgpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGJ0aURhdGFTZXJ2aWNlLmxvYWRNb3JlQnRpcygpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0gIHtcclxuICAgIGJpbmRpbmdzOiB7fSxcclxuICAgIGNvbnRyb2xsZXI6IGJ0aUxpc3RDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdidGkvY29tcG9uZW50cy9idGktbGlzdC5odG1sJ1xyXG59XHJcblxyXG5idGlMaXN0Q29udHJvbGxlci4kaW5qZWN0ID0gWydidGlEYXRhU2VydmljZSddO1xyXG5cclxuZnVuY3Rpb24gYnRpTGlzdENvbnRyb2xsZXIoYnRpRGF0YVNlcnZpY2UpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBzZXJ2aWNlOiBidGlEYXRhU2VydmljZSxcclxuICAgICAgICBjaGFuZ2VBY3RpdmVCdGk6IGJ0aURhdGFTZXJ2aWNlLmNoYW5nZUFjdGl2ZUJ0aSxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGxvYWRNb3JlOiBsb2FkTW9yZVxyXG4gICAgfTtcclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkTW9yZSgpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGJ0aURhdGFTZXJ2aWNlLmxvYWRNb3JlQnRpcygpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogYnRpU2VhcmNoQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnYnRpL2NvbXBvbmVudHMvYnRpLXNlYXJjaC1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG5idGlTZWFyY2hDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyRsb2NhdGlvbicsIFxyXG4gICAgJyRyb3V0ZScsIFxyXG4gICAgJ2J0aURhdGFTZXJ2aWNlJywgXHJcbiAgICAnc2VhcmNoU2VydmljZScsXHJcbl07XHJcblxyXG5mdW5jdGlvbiBidGlTZWFyY2hDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkbG9jYXRpb24sIFxyXG4gICAgJHJvdXRlLCBcclxuICAgIGJ0aURhdGFTZXJ2aWNlLCBcclxuICAgIHNlYXJjaFNlcnZpY2VcclxuKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICAgICAgc2hvd1NlYXJjaFN1Yk5hdjogJHJvdXRlLmN1cnJlbnQuJCRyb3V0ZS5zaG93U2VhcmNoU3ViTmF2LFxyXG4gICAgICAgIHNlcnZpY2U6IGJ0aURhdGFTZXJ2aWNlLFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgbG9hZE5ldzogbG9hZE5ld1xyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgcmVmcmVzaDtcclxuICAgIHZhciBvcGFjaXR5ID0gMTtcclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9idGktc2VhcmNoJyk7XHJcbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyBhIGhhY2ssIGludHJvZHVjZWQgaW4gT2N0b2JlciAyMDIwLiBUaGUgcmVhc29uIGZvciBpdCBpcyB0aGF0XHJcbiAgICAgICAgLy8gQ2hyb21lIHdvdWxkIG5vdCByZW5kZXIgdGhlIEJUSSBpbWFnZXMgcHJvcGVybHkgYnV0IGEgcmVkcmF3IHdvdWxkIGZpeCBpdC5cclxuICAgICAgICByZWZyZXNoID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIG9wYWNpdHkgPSAob3BhY2l0eSA9PT0gMSA/IDAuOTkgOiAxKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJ0aS1pbWFnZS1zZWFyY2gtcmVzdWx0cycpLnN0eWxlLm9wYWNpdHkgPSBvcGFjaXR5O1xyXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnRpLWRldGFpbCcpLnN0eWxlLm9wYWNpdHkgPSBvcGFjaXR5O1xyXG4gICAgICAgIH0sIDQwKTtcclxuICAgICAgICBpbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJ0aS1pbWFnZS1zZWFyY2gtcmVzdWx0cycpLnN0eWxlLm9wYWNpdHkgPSAxO1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5idGktZGV0YWlsJykuc3R5bGUub3BhY2l0eSA9IDE7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChyZWZyZXNoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkTmV3KCkge1xyXG4gICAgICAgIHZtLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgYnRpRGF0YVNlcnZpY2UubG9hZE5ld0J0aXMoKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaW5pdCgpIHtcclxuICAgICAgICBidGlEYXRhU2VydmljZS5yZXNldEZpbHRlcigpO1xyXG4gICAgICAgIHZhciBxID0gc2VhcmNoU2VydmljZS5wYXJzZUxvY2F0aW9uU2VhcmNoT2JqZWN0KCRsb2NhdGlvbi5zZWFyY2goKSk7XHJcbiAgICAgICAgYnRpRGF0YVNlcnZpY2UuZmlsdGVyLmdvb2RzQ29kZSA9IHEuY29tbW9kaXR5Q29kZTtcclxuICAgICAgICBidGlEYXRhU2VydmljZS5maWx0ZXIuc2VhcmNoUXVlcnkgPSBxLnF1ZXJ5O1xyXG4gICAgICAgIGxvYWROZXcoKTtcclxuICAgIH1cclxuXHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnJHVpYk1vZGFsJywgXHJcbiAgICBidGlNb2RhbFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gYnRpTW9kYWwoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICR1aWJNb2RhbFxyXG4pIHtcclxuXHJcbiAgICB2YXIgbW9kYWwgPSB7XHJcbiAgICAgICAgZ29vZHNDb2RlOiBudWxsLFxyXG4gICAgICAgIHNlYXJjaFF1ZXJ5OiBudWxsLFxyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICBidGlNb2RhbENvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICAgICAnJHVpYk1vZGFsSW5zdGFuY2UnLCBcclxuICAgICAgICAnYnRpRGF0YVNlcnZpY2UnLCBcclxuICAgICAgICAnZ29vZHNDb2RlJywgXHJcbiAgICAgICAgJ3NlYXJjaFF1ZXJ5JyxcclxuICAgIF07XHJcblxyXG4gICAgZnVuY3Rpb24gYnRpTW9kYWxDb250cm9sbGVyKFxyXG4gICAgICAgICR1aWJNb2RhbEluc3RhbmNlLCBcclxuICAgICAgICBidGlEYXRhU2VydmljZSwgXHJcbiAgICAgICAgZ29vZHNDb2RlLCBcclxuICAgICAgICBzZWFyY2hRdWVyeVxyXG4gICAgKSB7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHtcclxuICAgICAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgICAgICBjYW5jZWw6IGNhbmNlbCxcclxuICAgICAgICAgICAgY2hhbmdlQWN0aXZlQnRpOiBjaGFuZ2VBY3RpdmVCdGksXHJcbiAgICAgICAgICAgIHNlcnZpY2U6IGJ0aURhdGFTZXJ2aWNlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciByZWZyZXNoO1xyXG4gICAgICAgIHZhciBvcGFjaXR5ID0gMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyBhIGhhY2ssIGludHJvZHVjZWQgaW4gT2N0b2JlciAyMDIwLiBUaGUgcmVhc29uIGZvciBpdCBpcyB0aGF0XHJcbiAgICAgICAgICAgIC8vIENocm9tZSB3b3VsZCBub3QgcmVuZGVyIHRoZSBCVEkgaW1hZ2VzIHByb3Blcmx5IGJ1dCBhIHJlZHJhdyB3b3VsZCBmaXggaXQuXHJcbiAgICAgICAgICAgIHJlZnJlc2ggPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAob3BhY2l0eSA9PT0gMSA/IDAuOTkgOiAxKTtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHk7XHJcbiAgICAgICAgICAgIH0sIDQwKTtcclxuICAgICAgICAgICAgaW5pdCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3BhY2l0eSA9IDE7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocmVmcmVzaCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygnY2FuY2VsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjaGFuZ2VBY3RpdmVCdGkoYnRpUmVmZXJlbmNlKSB7XHJcbiAgICAgICAgICAgIGJ0aURhdGFTZXJ2aWNlLmNoYW5nZUFjdGl2ZUJ0aShidGlSZWZlcmVuY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcclxuICAgICAgICAgICAgYnRpRGF0YVNlcnZpY2UuY2xlYXJBY3RpdmVCdGkoKTtcclxuICAgICAgICAgICAgYnRpRGF0YVNlcnZpY2UucmVzZXRGaWx0ZXIoKTtcclxuICAgICAgICAgICAgYnRpRGF0YVNlcnZpY2UuZmlsdGVyLmdvb2RzQ29kZSA9IGdvb2RzQ29kZTtcclxuICAgICAgICAgICAgYnRpRGF0YVNlcnZpY2UuZmlsdGVyLnNlYXJjaFF1ZXJ5ID0gc2VhcmNoUXVlcnk7XHJcbiAgICAgICAgICAgIGJ0aURhdGFTZXJ2aWNlLmxvYWROZXdCdGlzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd01vZGFsKGdvb2RzQ29kZSwgc2VhcmNoUXVlcnkpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJ29wZW4tbW9kYWwtYnRpJywgeyBjYXRlZ29yeTogJ2J0aScgfSk7XHJcbiAgICAgICAgaWYgKGdvb2RzQ29kZSlcclxuICAgICAgICAgICAgbW9kYWwuZ29vZHNDb2RlID0gZ29vZHNDb2RlO1xyXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSlcclxuICAgICAgICAgICAgbW9kYWwuc2VhcmNoUXVlcnkgPSBzZWFyY2hRdWVyeTtcclxuXHJcbiAgICAgICAgcmV0dXJuICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICBiYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgYmluZFRvQ29udHJvbGxlcjogdHJ1ZSxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogYnRpTW9kYWxDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsQnRpTW9kYWwnLFxyXG4gICAgICAgICAgICBrZXlib2FyZDogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kYWxGYWRlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICBnb29kc0NvZGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kYWwuZ29vZHNDb2RlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNlYXJjaFF1ZXJ5OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGFsLnNlYXJjaFF1ZXJ5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaXplOiAnbGcnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2J0aS9tb2RhbHMvYnRpLmh0bWwnLFxyXG4gICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLWJ0aSdcclxuICAgICAgICB9KS5yZXN1bHQuY2F0Y2goZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufSIsIm1vZHVsZS5leHBvcnRzICA9IFtcclxuICAgICdkYXRhQ29udGV4dCcsIFxyXG4gICAgJ2NvbW1vbicsIFxyXG4gICAgJ2NvdW50cnlEYXRhU2VydmljZScsXHJcbiAgICAnbGFuZ3VhZ2UnLCBcclxuICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIFxyXG4gICAgJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJywgXHJcbiAgICBidGlEYXRhU2VydmljZVxyXG5dO1xyXG5cclxuZnVuY3Rpb24gYnRpRGF0YVNlcnZpY2UoXHJcbiAgICBkYXRhQ29udGV4dCwgXHJcbiAgICBjb21tb24sIFxyXG4gICAgY291bnRyeURhdGFTZXJ2aWNlLFxyXG4gICAgbGFuZ3VhZ2UsIFxyXG4gICAgc3RhdGUsIFxyXG4gICAgbm90aWZpY2F0aW9uc1xyXG4pIHtcclxuXHJcbiAgICB2YXIgYWN0aXZlQnRpUmVmZXJlbmNlID0gbnVsbDtcclxuICAgIHZhciBpc3N1aW5nQ291bnRyeUNvZGVzID0gW1xyXG5cdFx0J0FUJyxcclxuXHRcdCdCRScsXHJcblx0XHQnQkcnLFxyXG5cdFx0J0NZJyxcclxuXHRcdCdDWicsXHJcblx0XHQnREUnLFxyXG5cdFx0J0RLJyxcclxuXHRcdCdFRScsXHJcblx0XHQnRVMnLFxyXG5cdFx0J0ZJJyxcclxuXHRcdCdGUicsXHJcblx0XHQnR0InLFxyXG5cdFx0J0dSJyxcclxuXHRcdCdIUicsXHJcblx0XHQnSFUnLFxyXG5cdFx0J0lFJyxcclxuXHRcdCdJVCcsXHJcblx0XHQnTFQnLFxyXG5cdFx0J0xVJyxcclxuXHRcdCdMVicsXHJcblx0XHQnTVQnLFxyXG5cdFx0J05MJyxcclxuXHRcdCdQTCcsXHJcblx0XHQnUFQnLFxyXG5cdFx0J1JPJyxcclxuXHRcdCdTRScsXHJcblx0XHQnU0knLFxyXG5cdFx0J1NLJyxcclxuXHRcdCdYSSdcclxuICAgIF07XHJcblxyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgcmVzcG9uc2U6IHt9LFxyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgYWN0aXZlQnRpOiBudWxsLFxyXG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGlzcGxheTogJ2xpc3QnLFxyXG4gICAgICAgIGZpbHRlcjoge1xyXG4gICAgICAgICAgICBjb3VudHJ5OiBudWxsLFxyXG4gICAgICAgICAgICBnb29kc0NvZGU6IG51bGwsXHJcbiAgICAgICAgICAgIGlzc3VlZFNpbmNlOiBudWxsLFxyXG4gICAgICAgICAgICByZWZlcmVuY2U6IG51bGwsXHJcbiAgICAgICAgICAgIHNlYXJjaFF1ZXJ5OiBudWxsLFxyXG4gICAgICAgICAgICBwYWdlTnVtYmVyOiAxXHJcbiAgICAgICAgfSxcclxuICAgICAgICBpc3N1aW5nQ291bnRyaWVzOiBfLm1hcChpc3N1aW5nQ291bnRyeUNvZGVzLCBmdW5jdGlvbiAoY291bnRyeUNvZGUpIHtcclxuICAgICAgICAgICAgdmFyIGNvdW50cnlOYW1lID0gY291bnRyeURhdGFTZXJ2aWNlLmNvdW50cmllc1tjb3VudHJ5Q29kZV07XHJcbiAgICAgICAgICAgIHJldHVybiB7IGNvZGU6IGNvdW50cnlDb2RlLCBuYW1lOiBjb3VudHJ5TmFtZSB9O1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIG9yZGVyQnk6ICdDb21tb2RpdHlDb2RlLWFzYycsXHJcbiAgICAgICAgbG9hZE5ld0J0aXM6IGxvYWROZXdCdGlzLFxyXG4gICAgICAgIGxvYWRNb3JlQnRpczogbG9hZE1vcmVCdGlzLFxyXG4gICAgICAgIGNoYW5nZUFjdGl2ZUJ0aTogY2hhbmdlQWN0aXZlQnRpLFxyXG4gICAgICAgIGNsZWFyQWN0aXZlQnRpOiBjbGVhckFjdGl2ZUJ0aSxcclxuICAgICAgICBjb3VudEJ0aXNCeUhlYWRpbmc6IGNvdW50QnRpc0J5SGVhZGluZyxcclxuICAgICAgICBjb3VudEJ0aVNlYXJjaFJlc3VsdHM6IGNvdW50QnRpU2VhcmNoUmVzdWx0cyxcclxuICAgICAgICByZXNldEZpbHRlcjogcmVzZXRGaWx0ZXJcclxuICAgIH07XHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiByZXNldEZpbHRlcigpIHtcclxuICAgICAgICBzZXJ2aWNlLmZpbHRlci5jb3VudHJ5ID0gbnVsbDtcclxuICAgICAgICBzZXJ2aWNlLmZpbHRlci5nb29kc0NvZGUgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UuZmlsdGVyLmlzc3VlZFNpbmNlID0gbnVsbDtcclxuICAgICAgICBzZXJ2aWNlLmZpbHRlci5yZWZlcmVuY2UgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UuZmlsdGVyLnNlYXJjaFF1ZXJ5ID0gbnVsbDtcclxuICAgICAgICBzZXJ2aWNlLmZpbHRlci5nb29kc0Rlc2NyaXB0aW9uUXVlcnkgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UuZmlsdGVyLnBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgICAgIHNlcnZpY2UuZGlzcGxheSA9ICdsaXN0JztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkTmV3QnRpcygpIHtcclxuICAgICAgICBzZXJ2aWNlLmRhdGEuYWN0aXZlQnRpID0gbnVsbDtcclxuICAgICAgICBzZXJ2aWNlLmZpbHRlci5wYWdlTnVtYmVyID0gMTtcclxuICAgICAgICByZXR1cm4gbG9hZEJ0aXMoc2VydmljZS5maWx0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRNb3JlQnRpcygpIHtcclxuICAgICAgICByZXR1cm4gbG9hZEJ0aXMoc2VydmljZS5maWx0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRCdGlzKGZpbHRlcikge1xyXG5cclxuICAgICAgICB2YXIgc29ydCA9IHNlcnZpY2Uub3JkZXJCeS5zcGxpdCgnLScpWzBdO1xyXG4gICAgICAgIHZhciBvcmRlciA9IHNlcnZpY2Uub3JkZXJCeS5zcGxpdCgnLScpWzFdO1xyXG5cclxuICAgICAgICBpZiAoc29ydCA9PT0gJ0tleXdvcmRSYW5rJyAmJiAhZmlsdGVyLnNlYXJjaFF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIuZ29vZHNEZXNjcmlwdGlvblF1ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICBzb3J0ID0gJ0dvb2RzRGVzY3JpcHRpb25SYW5rJztcclxuICAgICAgICAgICAgICAgIHNlcnZpY2Uub3JkZXJCeSA9ICdHb29kc0Rlc2NyaXB0aW9uUmFuay1kZXNjJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNvcnQgPSAnQ29tbW9kaXR5Q29kZSc7XHJcbiAgICAgICAgICAgICAgICBvcmRlciA9ICdhc2MnO1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5vcmRlckJ5ID0gJ0NvbW1vZGl0eUNvZGUtYXNjJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzb3J0ID09PSAnR29vZHNEZXNjcmlwdGlvblJhbmsnICYmICFmaWx0ZXIuZ29vZHNEZXNjcmlwdGlvblF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIuc2VhcmNoUXVlcnkpIHtcclxuICAgICAgICAgICAgICAgIHNvcnQgPSAnS2V5d29yZFJhbmsnO1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5vcmRlckJ5ID0gJ0tleXdvcmRSYW5rLWRlc2MnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc29ydCA9ICdDb21tb2RpdHlDb2RlJztcclxuICAgICAgICAgICAgICAgIG9yZGVyID0gJ2FzYyc7XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLm9yZGVyQnkgPSAnQ29tbW9kaXR5Q29kZS1hc2MnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2J0aS9zZWFyY2gnICtcclxuICAgICAgICAgICAgJz9nb29kc2NvZGU9JyArIChmaWx0ZXIuZ29vZHNDb2RlIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmcGluZGV4PScgKyAoZmlsdGVyLnBhZ2VOdW1iZXIgLSAxKSArXHJcbiAgICAgICAgICAgICcmcHNpemU9MjAnICtcclxuICAgICAgICAgICAgJyZsYW5nPScgKyBsYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGUgK1xyXG4gICAgICAgICAgICAnJnNvcnQ9JyArIHNvcnQgK1xyXG4gICAgICAgICAgICAnJm9yZGVyPScgKyBvcmRlcjtcclxuICAgICAgICBpZiAoZmlsdGVyLnNlYXJjaFF1ZXJ5KVxyXG4gICAgICAgICAgICB1cmwgKz0gJyZrZXl3b3JkLXF1ZXJ5PScgKyBmaWx0ZXIuc2VhcmNoUXVlcnk7XHJcbiAgICAgICAgaWYgKGZpbHRlci5nb29kc0Rlc2NyaXB0aW9uUXVlcnkpXHJcbiAgICAgICAgICAgIHVybCArPSAnJmdvb2RzLWRlc2NyaXB0aW9uLXF1ZXJ5PScgKyBmaWx0ZXIuZ29vZHNEZXNjcmlwdGlvblF1ZXJ5O1xyXG4gICAgICAgIGlmIChmaWx0ZXIucmVmZXJlbmNlKVxyXG4gICAgICAgICAgICB1cmwgKz0gJyZyZWZlcmVuY2U9JyArIG1ha2VTYWZlQnRpUmVmZXJlbmNlKGZpbHRlci5yZWZlcmVuY2UpO1xyXG4gICAgICAgIGlmIChmaWx0ZXIuY291bnRyeSlcclxuICAgICAgICAgICAgdXJsICs9ICcmY291bnRyeT0nICsgZmlsdGVyLmNvdW50cnk7XHJcbiAgICAgICAgaWYgKHNlcnZpY2UuZGlzcGxheSA9PT0gJ2ltYWdlcycpIHtcclxuICAgICAgICAgICAgdXJsICs9ICcmaW1hZ2VzZWFyY2g9MSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXIuaXNzdWVkU2luY2UpIHtcclxuICAgICAgICAgICAgdXJsICs9ICcmaXNzdWVkc2luY2U9JyArIGZpbHRlci5pc3N1ZWRTaW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNlcnZpY2UuZGF0YS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChwYWdpbmF0ZWRCdGlzKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuZGF0YS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2VydmljZS5yZXNwb25zZSA9IHBhZ2luYXRlZEJ0aXM7XHJcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlLnJlc3BvbnNlLlJlc3VsdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFhY3RpdmVCdGlSZWZlcmVuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VBY3RpdmVCdGkoc2VydmljZS5yZXNwb25zZS5SZXN1bHRzWzBdLkJ0aVJlZmVyZW5jZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhckFjdGl2ZUJ0aSgpIHtcclxuICAgICAgICBzZXJ2aWNlLmRhdGEuYWN0aXZlQnRpID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VBY3RpdmVCdGkoYnRpUmVmZXJlbmNlKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvYnRpLycgKyBtYWtlU2FmZUJ0aVJlZmVyZW5jZShidGlSZWZlcmVuY2UudHJpbSgpKSArICcvJztcclxuICAgICAgICBzZXJ2aWNlLmRhdGEuYWN0aXZlQnRpID0gbnVsbDtcclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCkudGhlbihmdW5jdGlvbiAoYWN0aXZlQnRpKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuZGF0YS5hY3RpdmVCdGkgPSBhY3RpdmVCdGk7XHJcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVibGlzaCgnY2hhbmdlX2FjdGl2ZV9idGknLCBhY3RpdmVCdGkpO1xyXG4gICAgICAgICAgICBfLmZvckVhY2goc2VydmljZS5yZXNwb25zZS5SZXN1bHRzLCBmdW5jdGlvbiAoYnRpKSB7XHJcbiAgICAgICAgICAgICAgICBidGkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoYnRpLkJ0aVJlZmVyZW5jZSA9PT0gYnRpUmVmZXJlbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnRpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1ha2VTYWZlQnRpUmVmZXJlbmNlKGJ0aVJlZmVyZW5jZSkge1xyXG4gICAgICAgIHJldHVybiBidGlSZWZlcmVuY2UucmVwbGFjZSgvXFwvL2csIFwiX1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjb3VudEJ0aXNCeUhlYWRpbmcoY2hhcHRlckNvZGUpIHtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9idGkvY291bnRieWhlYWRpbmcvJyArIGNoYXB0ZXJDb2RlO1xyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjb3VudEJ0aVNlYXJjaFJlc3VsdHMocSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2J0aS9jb3VudCcgK1xyXG4gICAgICAgICAgICAnP2xhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICcmZ29vZHNjb2RlPScgKyBxLmNvZGUgK1xyXG4gICAgICAgICAgICAnJmtleXdvcmQtcXVlcnk9JyArIHEucXVlcnk7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG59IiwiYW5ndWxhci5tb2R1bGUoJ3RhcmljLmNhc2VMYXcnLCBbXSlcclxuICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIC8vIENvbXBvbmVudHNcclxuICAgIC5jb21wb25lbnQoJ2Nhc2VMYXdCdXR0b24nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvY2FzZS1sYXctYnV0dG9uJykpXHJcbiAgICAuY29tcG9uZW50KCdldUNhc2VMYXdTdW1tYXJ5QnV0dG9uJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2V1LWNhc2UtbGF3LXN1bW1hcnktYnV0dG9uJykpXHJcbiAgICAuY29tcG9uZW50KCdjYXNlTGF3TmV3cycsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jYXNlLWxhdy1uZXdzJykpXHJcbiAgICAuY29tcG9uZW50KCdjYXNlTGF3U3VibmF2JywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2Nhc2UtbGF3LXN1Ym5hdicpKVxyXG4gICAgLmNvbXBvbmVudCgnY2FzZUxhd0xpbmtzVG9OZXdzJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2Nhc2UtbGF3LWxpbmtzLXRvLW5ld3MnKSlcclxuICAgIC5jb21wb25lbnQoJ2V1Q2FzZUxhd0xpc3RJdGVtJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2V1LWNhc2UtbGF3LWxpc3QtaXRlbScpKVxyXG4gICAgLmNvbXBvbmVudCgnZXVDYXNlTGF3TmV3c0l0ZW0nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZXUtY2FzZS1sYXctbmV3cy1pdGVtJykpXHJcbiAgICAuY29tcG9uZW50KCdubENhc2VMYXdMaXN0SXRlbScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9ubC1jYXNlLWxhdy1saXN0LWl0ZW0nKSlcclxuICAgIC5jb21wb25lbnQoJ25sQ2FzZUxhd05ld3NJdGVtJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL25sLWNhc2UtbGF3LW5ld3MtaXRlbScpKVxyXG4gICAgLy8gUGFnZXNcclxuICAgIC5jb21wb25lbnQoJ2Nhc2VMYXdOZXdzUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jYXNlLWxhdy1uZXdzLXBhZ2UnKSlcclxuICAgIC5jb21wb25lbnQoJ2V1Q2FzZUxhd1BhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZXUtY2FzZS1sYXctcGFnZScpKVxyXG4gICAgLmNvbXBvbmVudCgnbmxDYXNlTGF3UGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9ubC1jYXNlLWxhdy1wYWdlJykpXHJcbiAgICAvLyBNb2RhbHNcclxuICAgIC5mYWN0b3J5KCdldUNhc2VMYXdTdW1tYXJ5TW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9ldS1jYXNlLWxhdy1zdW1tYXJ5LW1vZGFsJykpXHJcbiAgICAuZmFjdG9yeSgnY2FzZUxhd01vZGFsJywgcmVxdWlyZSgnLi9tb2RhbHMvY2FzZS1sYXctbW9kYWwnKSlcclxuICAgIC5mYWN0b3J5KCdubENhc2VMYXdKdWRnbWVudE1vZGFsJywgcmVxdWlyZSgnLi9tb2RhbHMvbmwtY2FzZS1sYXctanVkZ21lbnQtbW9kYWwnKSlcclxuICAgIC8vIFNlcnZpY2VzXHJcbiAgICAuZmFjdG9yeSgnY2FzZUxhd0RhdGFTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy9jYXNlLWxhdy1kYXRhJykpXHJcbiAgICAuZmFjdG9yeSgnZXVDYXNlTGF3RGF0YVNlcnZpY2UnLCByZXF1aXJlKCcuL3NlcnZpY2VzL2V1LWNhc2UtbGF3LWRhdGEnKSlcclxuICAgIC5mYWN0b3J5KCdubENhc2VMYXdEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvbmwtY2FzZS1sYXctZGF0YScpKVxyXG4gICAgO1xyXG5cclxuZnVuY3Rpb24gcm91dGVDb25maWd1cmF0b3IoJHJvdXRlUHJvdmlkZXIpIHtcclxuICAgICRyb3V0ZVByb3ZpZGVyXHJcbiAgICAgICAgLndoZW4oJy9jYXNlLWxhdy9uZXdzJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxjYXNlLWxhdy1uZXdzLXBhZ2U+PC9jYXNlLWxhdy1uZXdzLXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9jYXNlLWxhdy9ldScsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8ZXUtY2FzZS1sYXctcGFnZT48L2V1LWNhc2UtbGF3LXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9jYXNlLWxhdy9ubCcsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8bmwtY2FzZS1sYXctcGFnZT48L25sLWNhc2UtbGF3LXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgO1xyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBpc0xhcmdlOiAnPCcsXHJcbiAgICAgICAgaXRlbTogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogY2FzZUxhd0J1dHRvbkNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2Nhc2UtbGF3L2NvbXBvbmVudHMvY2FzZS1sYXctYnV0dG9uLmh0bWwnXHJcbn1cclxuXHJcbmNhc2VMYXdCdXR0b25Db250cm9sbGVyLiRpbmplY3QgPSBbJ2Nhc2VMYXdNb2RhbCddO1xyXG5cclxuZnVuY3Rpb24gY2FzZUxhd0J1dHRvbkNvbnRyb2xsZXIoY2FzZUxhd01vZGFsKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIHNob3dDYXNlTGF3OiBzaG93Q2FzZUxhd1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBzaG93Q2FzZUxhdygpIHtcclxuICAgICAgICB2YXIgbnVtYmVyUGF0dGVybiA9IC9eXFxzKig/OlxcZHsyfVtcXHMuXSopezEsNX0kLztcclxuXHJcbiAgICAgICAgaWYgKG51bWJlclBhdHRlcm4udGVzdCh2bS5pdGVtLnNlYXJjaFF1ZXJ5KSlcclxuICAgICAgICAgICAgY2FzZUxhd01vZGFsLnNob3codm0uaXRlbS5jb2RlLCAnJyk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBjYXNlTGF3TW9kYWwuc2hvdyh2bS5pdGVtLmNvZGUsIHZtLml0ZW0uc2VhcmNoUXVlcnkpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICB0ZW1wbGF0ZVVybDogJ2Nhc2UtbGF3L2NvbXBvbmVudHMvY2FzZS1sYXctbGlua3MtdG8tbmV3cy5odG1sJ1xyXG59OyIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogY2FzZUxhd05ld3NQYWdlQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY2FzZS1sYXcvY29tcG9uZW50cy9jYXNlLWxhdy1uZXdzLXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbmNhc2VMYXdOZXdzUGFnZUNvbnRyb2xsZXIuJGluamVjdCA9IFsnJGFuYWx5dGljcyddO1xyXG5cclxuZnVuY3Rpb24gY2FzZUxhd05ld3NQYWdlQ29udHJvbGxlcigkYW5hbHl0aWNzKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWRcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9jYXNlLWxhdy1uZXdzJyk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgZ29vZHNjb2RlOiAnPCcsXHJcbiAgICAgICAgc2VhcmNoUXVlcnk6ICc8J1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IGNhc2VMYXdOZXdzQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY2FzZS1sYXcvY29tcG9uZW50cy9jYXNlLWxhdy1uZXdzLmh0bWwnXHJcbn07XHJcblxyXG5jYXNlTGF3TmV3c0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICdldUNhc2VMYXdEYXRhU2VydmljZScsIFxyXG4gICAgJ25sQ2FzZUxhd0RhdGFTZXJ2aWNlJywgXHJcbiAgICAnbmxDYXNlTGF3SnVkZ21lbnRNb2RhbCcsIFxyXG4gICAgJ2xhbmd1YWdlJywgXHJcbiAgICAnaWRlbnRpdHknLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gY2FzZUxhd05ld3NDb250cm9sbGVyKFxyXG4gICAgZXVDYXNlTGF3RGF0YVNlcnZpY2UsIFxyXG4gICAgbmxDYXNlTGF3RGF0YVNlcnZpY2UsIFxyXG4gICAgbmxDYXNlTGF3SnVkZ21lbnRNb2RhbCwgXHJcbiAgICBsYW5ndWFnZSwgXHJcbiAgICBpZGVudGl0eVxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgZGF0YUVVOiBldUNhc2VMYXdEYXRhU2VydmljZSxcclxuICAgICAgICBkYXRhTkw6IG5sQ2FzZUxhd0RhdGFTZXJ2aWNlLFxyXG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eSxcclxuICAgICAgICBpc0xvYWRpbmc6IGlzTG9hZGluZyxcclxuICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UuZ2V0KCksXHJcbiAgICAgICAgb3BlblVpdHNwcmFhazogb3BlblVpdHNwcmFhayxcclxuICAgICAgICBwYWdlQ2hhbmdlZEVVOiBwYWdlQ2hhbmdlZEVVLFxyXG4gICAgICAgIHBhZ2VDaGFuZ2VkTkw6IHBhZ2VDaGFuZ2VkTkxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG5cclxuICAgICAgICB2bS5kYXRhRVUucXVlcnkuR29vZHNDb2RlID0gdm0uZ29vZHNjb2RlO1xyXG4gICAgICAgIHZtLmRhdGFFVS5xdWVyeS5RdWVyeSA9IHZtLnNlYXJjaFF1ZXJ5O1xyXG4gICAgICAgIHZtLmRhdGFFVS5xdWVyeS5QYWdlID0gMTtcclxuXHJcbiAgICAgICAgdm0uZGF0YU5MLnF1ZXJ5Lkdvb2RzQ29kZSA9IHZtLmdvb2RzY29kZTtcclxuICAgICAgICB2bS5kYXRhTkwucXVlcnkuUXVlcnkgPSB2bS5zZWFyY2hRdWVyeTtcclxuICAgICAgICB2bS5kYXRhTkwucXVlcnkuUGFnZSA9IDE7XHJcblxyXG4gICAgICAgIGlmICh2bS5pZGVudGl0eS5oYXNQZXJtaXNzaW9uKCdjYXNlLWxhdy1ubCcpKSB7XHJcbiAgICAgICAgICAgIGxvYWRMYXRlc3RDYXNlTGF3TkwoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZtLmlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ2Nhc2UtbGF3LWV1JykpIHtcclxuICAgICAgICAgICAgbG9hZExhdGVzdENhc2VMYXdFVSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpc0xvYWRpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHZtLmlzTG9hZGluZ05MIHx8IHZtLmlzTG9hZGluZ0VVO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHBhZ2VDaGFuZ2VkRVUoKSB7XHJcbiAgICAgICAgbG9hZExhdGVzdENhc2VMYXdFVSgpO1xyXG4gICAgICAgIHZhciBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ21vZGFsLWNhc2UtbGF3JylbMF07XHJcbiAgICAgICAgaWYgKG1vZGFsKSB7XHJcbiAgICAgICAgICAgIG1vZGFsLnNjcm9sbFRvKDAsIDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250ZW50XCIpLnNjcm9sbFRvKDAsIDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gcGFnZUNoYW5nZWROTCgpIHtcclxuICAgICAgICBsb2FkTGF0ZXN0Q2FzZUxhd05MKCk7XHJcbiAgICAgICAgdmFyIG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbW9kYWwtY2FzZS1sYXcnKVswXTtcclxuICAgICAgICBpZiAobW9kYWwpIHtcclxuICAgICAgICAgICAgbW9kYWwuc2Nyb2xsVG8oMCwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbnRlbnRcIikuc2Nyb2xsVG8oMCwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRMYXRlc3RDYXNlTGF3RVUoKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nRVUgPSB0cnVlO1xyXG4gICAgICAgIGlmICh2bS5pZGVudGl0eS5oYXNQZXJtaXNzaW9uKCdjYXNlLWxhdy1ldScpKSB7XHJcbiAgICAgICAgICAgIGV1Q2FzZUxhd0RhdGFTZXJ2aWNlLmxvYWRDYXNlTGF3KClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmdFVSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZExhdGVzdENhc2VMYXdOTCgpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmdOTCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHZtLmlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ2Nhc2UtbGF3LW5sJykpIHtcclxuICAgICAgICAgICAgbmxDYXNlTGF3RGF0YVNlcnZpY2UubG9hZENhc2VMYXdTZWFyY2hSZXN1bHRzKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmdOTCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb3BlblVpdHNwcmFhayhlY2xpKSB7XHJcbiAgICAgICAgbmxDYXNlTGF3SnVkZ21lbnRNb2RhbC5zaG93KGVjbGkpO1xyXG4gICAgfVxyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBhY3RpdmU6ICdAJ1xyXG4gICAgfSxcclxuICAgIHRlbXBsYXRlVXJsOiAnY2FzZS1sYXcvY29tcG9uZW50cy9jYXNlLWxhdy1zdWJuYXYuaHRtbCdcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgaXRlbTogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogZXVDYXNlTGF3TGlzdEl0ZW1Db250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdjYXNlLWxhdy9jb21wb25lbnRzL2V1LWNhc2UtbGF3LWxpc3QtaXRlbS5odG1sJ1xyXG59O1xyXG5cclxuZXVDYXNlTGF3TGlzdEl0ZW1Db250cm9sbGVyLiRpbmplY3QgPSBbJ2V1Q2FzZUxhd1N1bW1hcnlNb2RhbCcsICdsYW5ndWFnZSddO1xyXG5cclxuZnVuY3Rpb24gZXVDYXNlTGF3TGlzdEl0ZW1Db250cm9sbGVyKGV1Q2FzZUxhd1N1bW1hcnlNb2RhbCwgbGFuZ3VhZ2UpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UuZ2V0KCksXHJcbiAgICAgICAgc2hvd1N1bW1hcnk6IHNob3dTdW1tYXJ5LFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBzaG93U3VtbWFyeShjZWxleCkge1xyXG4gICAgICAgIGV1Q2FzZUxhd1N1bW1hcnlNb2RhbC5zaG93KGNlbGV4KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgaXRlbTogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogZXVDYXNlTGF3TmV3c0l0ZW1Db250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdjYXNlLWxhdy9jb21wb25lbnRzL2V1LWNhc2UtbGF3LW5ld3MtaXRlbS5odG1sJ1xyXG59O1xyXG5cclxuZXVDYXNlTGF3TmV3c0l0ZW1Db250cm9sbGVyLiRpbmplY3QgPSBbJ2xhbmd1YWdlJ107XHJcblxyXG5mdW5jdGlvbiBldUNhc2VMYXdOZXdzSXRlbUNvbnRyb2xsZXIobGFuZ3VhZ2UpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UuZ2V0KClcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBldUNhc2VMYXdQYWdlQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY2FzZS1sYXcvY29tcG9uZW50cy9ldS1jYXNlLWxhdy1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG5ldUNhc2VMYXdQYWdlQ29udHJvbGxlci4kaW5qZWN0ID1bJyRhbmFseXRpY3MnLCAnZXVDYXNlTGF3RGF0YVNlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIGV1Q2FzZUxhd1BhZ2VDb250cm9sbGVyKCRhbmFseXRpY3MsIGV1Q2FzZUxhd0RhdGFTZXJ2aWNlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICAgICAgZGF0YTogZXVDYXNlTGF3RGF0YVNlcnZpY2UsXHJcbiAgICAgICAgY2xlYXI6IGNsZWFyRm9ybSxcclxuICAgICAgICBkYXRlT3B0aW9uczoge30sXHJcbiAgICAgICAgZm9ybWF0OiAnZGQtTU0teXl5eScsXHJcbiAgICAgICAgb3BlbjE6IG9wZW4xLFxyXG4gICAgICAgIG9wZW4yOiBvcGVuMixcclxuICAgICAgICBwYWdlQ2hhbmdlZDogcGFnZUNoYW5nZWQsXHJcbiAgICAgICAgcG9wdXAxOiB7XHJcbiAgICAgICAgICAgIG9wZW5lZDogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwb3B1cDI6IHtcclxuICAgICAgICAgICAgb3BlbmVkOiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNlYXJjaDogc2VhcmNoLFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL2Nhc2UtbGF3LWV1Jyk7XHJcbiAgICAgICAgZXVDYXNlTGF3RGF0YVNlcnZpY2UubG9hZFRhZ3MoKTtcclxuICAgICAgICBldUNhc2VMYXdEYXRhU2VydmljZS5sb2FkQ2FzZUxhdygpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIGV1Q2FzZUxhd0RhdGFTZXJ2aWNlLmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJGb3JtKCkge1xyXG4gICAgICAgIGV1Q2FzZUxhd0RhdGFTZXJ2aWNlLmNsZWFyKCk7XHJcbiAgICAgICAgZXVDYXNlTGF3RGF0YVNlcnZpY2UubG9hZENhc2VMYXcoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvcGVuMSgpIHtcclxuICAgICAgICB2bS5wb3B1cDEub3BlbmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvcGVuMigpIHtcclxuICAgICAgICB2bS5wb3B1cDIub3BlbmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwYWdlQ2hhbmdlZCgpIHtcclxuICAgICAgICBldUNhc2VMYXdEYXRhU2VydmljZS5sb2FkQ2FzZUxhdygpO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyZWNodHNwcmFhay1zZWFyY2gtYnV0dG9ucycpWzBdLm9mZnNldFRvcDtcclxuICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50Jyk7XHJcbiAgICAgICAgZWxlbWVudC5zY3JvbGxUbygwLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlYXJjaCgpIHtcclxuICAgICAgICBldUNhc2VMYXdEYXRhU2VydmljZS5sb2FkQ2FzZUxhdygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBpdGVtOiAnPCdcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBldUNhc2VMYXdTdW1tYXJ5QnV0dG9uQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY2FzZS1sYXcvY29tcG9uZW50cy9ldS1jYXNlLWxhdy1zdW1tYXJ5LWJ1dHRvbi5odG1sJ1xyXG59O1xyXG5cclxuZXVDYXNlTGF3U3VtbWFyeUJ1dHRvbkNvbnRyb2xsZXIuJGluamVjdCA9IFsnZXVDYXNlTGF3U3VtbWFyeU1vZGFsJ107XHJcblxyXG5mdW5jdGlvbiBldUNhc2VMYXdTdW1tYXJ5QnV0dG9uQ29udHJvbGxlcihldUNhc2VMYXdTdW1tYXJ5TW9kYWwpIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc2hvd1N1bW1hcnk6IHNob3dTdW1tYXJ5XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dTdW1tYXJ5KHdvcmtJZCkge1xyXG4gICAgICAgIGV1Q2FzZUxhd1N1bW1hcnlNb2RhbC5zaG93KHdvcmtJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBpdGVtOiAnPCdcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBubENhc2VMYXdMaXN0SXRlbUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2Nhc2UtbGF3L2NvbXBvbmVudHMvbmwtY2FzZS1sYXctbGlzdC1pdGVtLmh0bWwnXHJcbn07XHJcblxyXG5ubENhc2VMYXdMaXN0SXRlbUNvbnRyb2xsZXIuJGluamVjdCA9IFsnbmxDYXNlTGF3SnVkZ21lbnRNb2RhbCddO1xyXG5cclxuZnVuY3Rpb24gbmxDYXNlTGF3TGlzdEl0ZW1Db250cm9sbGVyKG5sQ2FzZUxhd0p1ZGdtZW50TW9kYWwpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBzaG93SnVkZ21lbnQ6IHNob3dKdWRnbWVudCxcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0p1ZGdtZW50KGVjbGkpIHtcclxuICAgICAgICBubENhc2VMYXdKdWRnbWVudE1vZGFsLnNob3coZWNsaSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIGl0ZW06ICc8J1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IG5sQ2FzZUxhd05ld3NJdGVtQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY2FzZS1sYXcvY29tcG9uZW50cy9ubC1jYXNlLWxhdy1uZXdzLWl0ZW0uaHRtbCdcclxufTtcclxuXHJcbm5sQ2FzZUxhd05ld3NJdGVtQ29udHJvbGxlci4kaW5qZWN0ID0gWydubENhc2VMYXdKdWRnbWVudE1vZGFsJ107XHJcblxyXG5mdW5jdGlvbiBubENhc2VMYXdOZXdzSXRlbUNvbnRyb2xsZXIobmxDYXNlTGF3SnVkZ21lbnRNb2RhbCkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIHNob3dKdWRnbWVudDogc2hvd0p1ZGdtZW50LFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBzaG93SnVkZ21lbnQoZWNsaSkge1xyXG4gICAgICAgIG5sQ2FzZUxhd0p1ZGdtZW50TW9kYWwuc2hvdyhlY2xpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IG5sQ2FzZUxhd1BhZ2VDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdjYXNlLWxhdy9jb21wb25lbnRzL25sLWNhc2UtbGF3LXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbm5sQ2FzZUxhd1BhZ2VDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyRyb3V0ZVBhcmFtcycsIFxyXG4gICAgJyRsb2NhdGlvbicsIFxyXG4gICAgJ25sQ2FzZUxhd0RhdGFTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIG5sQ2FzZUxhd1BhZ2VDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkcm91dGVQYXJhbXMsIFxyXG4gICAgJGxvY2F0aW9uLCBcclxuICAgIG5sQ2FzZUxhd0RhdGFTZXJ2aWNlXHJcbikge1xyXG5cclxuICAgIGlmICgkcm91dGVQYXJhbXMuZWNsaSAmJiAkcm91dGVQYXJhbXMuZWNsaS5tYXRjaCgvZWNsaTpldS9pKSkge1xyXG4gICAgICAgICRsb2NhdGlvbi51cmwoJy9jYXNlLWxhdy1ubCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICBkYXRhOiBubENhc2VMYXdEYXRhU2VydmljZSxcclxuICAgICAgICBjbGVhcjogY2xlYXIsXHJcbiAgICAgICAgZGF0ZU9wdGlvbnM6IHt9LFxyXG4gICAgICAgIGZvcm1hdDogJ2RkLU1NLXl5eXknLFxyXG4gICAgICAgIG9wZW4xOiBvcGVuMSxcclxuICAgICAgICBvcGVuMjogb3BlbjIsXHJcbiAgICAgICAgcGFnZUNoYW5nZWQ6IHBhZ2VDaGFuZ2VkLFxyXG4gICAgICAgIHBvcHVwMToge1xyXG4gICAgICAgICAgICBvcGVuZWQ6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcG9wdXAyOiB7XHJcbiAgICAgICAgICAgIG9wZW5lZDogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZWFyY2g6IHNlYXJjaCxcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9jYXNlLWxhdy9ubCcpO1xyXG4gICAgICAgIG5sQ2FzZUxhd0RhdGFTZXJ2aWNlLmxvYWRDYXNlTGF3U2VhcmNoUmVzdWx0cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIGNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXIoKSB7XHJcbiAgICAgICAgbmxDYXNlTGF3RGF0YVNlcnZpY2UuY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvcGVuMSgpIHtcclxuICAgICAgICB2bS5wb3B1cDEub3BlbmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvcGVuMigpIHtcclxuICAgICAgICB2bS5wb3B1cDIub3BlbmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwYWdlQ2hhbmdlZCgpIHtcclxuICAgICAgICBubENhc2VMYXdEYXRhU2VydmljZS5sb2FkQ2FzZUxhd1NlYXJjaFJlc3VsdHMoKTtcclxuICAgICAgICB2YXIgaGVpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncmVjaHRzcHJhYWstc2VhcmNoLWJ1dHRvbnMnKVswXS5vZmZzZXRUb3A7XHJcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudCcpO1xyXG4gICAgICAgIGVsZW1lbnQuc2Nyb2xsVG8oMCwgaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWFyY2goKSB7XHJcbiAgICAgICAgbmxDYXNlTGF3RGF0YVNlcnZpY2UubG9hZENhc2VMYXdTZWFyY2hSZXN1bHRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG59IiwibW9kdWxlLmV4cG9ydHMgPSBbJyRhbmFseXRpY3MnLCAnJHVpYk1vZGFsJywgY2FzZUxhd01vZGFsXTtcclxuXHJcbmZ1bmN0aW9uIGNhc2VMYXdNb2RhbCgkYW5hbHl0aWNzLCAkdWliTW9kYWwpIHtcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICBnb29kc2NvZGU6IG51bGwsXHJcbiAgICAgICAgc2VhcmNoUXVlcnk6IG51bGwsXHJcbiAgICAgICAgc2hvdzogc2hvd01vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChnb29kc2NvZGUsIHNlYXJjaFF1ZXJ5KSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdvcGVuLW1vZGFsLWNhc2UtbGF3JywgeyBjYXRlZ29yeTogJ2Nhc2UtbGF3JyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICBiYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgYmluZFRvQ29udHJvbGxlcjogdHJ1ZSxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogY2FzZUxhd01vZGFsQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAnY3RybCcsXHJcbiAgICAgICAgICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgIGdvb2RzY29kZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnb29kc2NvZGU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2VhcmNoUXVlcnk6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VhcmNoUXVlcnk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNpemU6ICdsZycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY2FzZS1sYXcvbW9kYWxzL2Nhc2UtbGF3LW1vZGFsLmh0bWwnLFxyXG4gICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLWNhc2UtbGF3IG1vZGFsLXdpZGUnXHJcbiAgICAgICAgfSkucmVzdWx0LmNhdGNoKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgaWYgKCEocmVzID09PSAnY2FuY2VsJyB8fCByZXMgPT09ICdlc2NhcGUga2V5IHByZXNzJyB8fCByZXMgPT09ICdiYWNrZHJvcCBjbGljaycpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyByZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjYXNlTGF3TW9kYWxDb250cm9sbGVyLiRpbmplY3QgPSBbJyR1aWJNb2RhbEluc3RhbmNlJywgJ2dvb2RzY29kZScsICdzZWFyY2hRdWVyeSddO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNhc2VMYXdNb2RhbENvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIGdvb2RzY29kZSwgc2VhcmNoUXVlcnkpIHtcclxuXHJcbiAgICAgICAgdmFyIGN0cmwgPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICBnb29kc2NvZGU6IGdvb2RzY29kZSxcclxuICAgICAgICAgICAgc2VhcmNoUXVlcnk6IHNlYXJjaFF1ZXJ5LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBjdHJsO1xyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdjYW5jZWwnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1vZGFsO1xyXG5cclxufSIsIm1vZHVsZS5leHBvcnRzID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckdWliTW9kYWwnLCBcclxuICAgIGV1Q2FzZUxhd1N1bW1hcnlNb2RhbFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gZXVDYXNlTGF3U3VtbWFyeU1vZGFsKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkdWliTW9kYWxcclxuKSB7XHJcbiAgICBcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICBzaG93OiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgZXVDYXNlTGF3U3VtbWFyeU1vZGFsQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgICAgICckdWliTW9kYWxJbnN0YW5jZScsIFxyXG4gICAgICAgICdldUNhc2VMYXdEYXRhU2VydmljZScsIFxyXG4gICAgICAgICd3b3JrSWQnXHJcbiAgICBdO1xyXG5cclxuICAgIGZ1bmN0aW9uIGV1Q2FzZUxhd1N1bW1hcnlNb2RhbENvbnRyb2xsZXIoXHJcbiAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UsIFxyXG4gICAgICAgIGV1Q2FzZUxhd0RhdGFTZXJ2aWNlLCBcclxuICAgICAgICB3b3JrSWRcclxuICAgICkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICB3b3JrSWQ6IHdvcmtJZCxcclxuICAgICAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgICAgIHN1bW1hcnk6IGV1Q2FzZUxhd0RhdGFTZXJ2aWNlLnN1bW1hcnksXHJcbiAgICAgICAgICAgIC8vIHRpdGxlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdjYW5jZWwnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgICAgICBldUNhc2VMYXdEYXRhU2VydmljZS5sb2FkU3VtbWFyeSh2bS53b3JrSWQpLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V1LWNhc2UtbGF3LXN1bW1hcnktaWZyYW1lJyksXHJcbiAgICAgICAgICAgICAgICAgICAgaWZyYW1lZG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZnJhbWVkb2MuYm9keS5pbm5lckhUTUwgPSBldUNhc2VMYXdEYXRhU2VydmljZS5zdW1tYXJ5Lmh0bWw7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBldUNhc2VMYXdEYXRhU2VydmljZS5nZXRTdW1tYXJ5UGRmVXJsKHZtLndvcmtJZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdm07XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TW9kYWwod29ya0lkKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdvcGVuLW1vZGFsLWV1LWNhc2UtbGF3LXN1bW1hcnknLCB7IGNhdGVnb3J5OiAnY2FzZS1sYXcnIH0pO1xyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IGV1Q2FzZUxhd1N1bW1hcnlNb2RhbENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ2N0cmxFdUNhc2VMYXdTdW1tYXJ5TW9kYWwnLFxyXG4gICAgICAgICAgICBrZXlib2FyZDogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kYWxGYWRlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICB3b3JrSWQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrSWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNpemU6ICdsZycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY2FzZS1sYXcvbW9kYWxzL2V1LWNhc2UtbGF3LXN1bW1hcnktbW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtZXUtY2FzZS1sYXctc3VtbWFyeSdcclxuICAgICAgICB9KS5yZXN1bHQuY2F0Y2goZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufSIsIm1vZHVsZS5leHBvcnRzID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckdWliTW9kYWwnLCBcclxuICAgIG5sQ2FzZUxhd1N1bW1hcnlNb2RhbFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gbmxDYXNlTGF3U3VtbWFyeU1vZGFsKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkdWliTW9kYWxcclxuKSB7XHJcblxyXG4gICAgdmFyIG1vZGFsID0ge1xyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICBubENhc2VMYXdKdWRnbWVudE1vZGFsQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgICAgICckdWliTW9kYWxJbnN0YW5jZScsIFxyXG4gICAgICAgICdubENhc2VMYXdEYXRhU2VydmljZScsIFxyXG4gICAgICAgICdlY2xpJyxcclxuICAgIF07XHJcblxyXG4gICAgZnVuY3Rpb24gbmxDYXNlTGF3SnVkZ21lbnRNb2RhbENvbnRyb2xsZXIoXHJcbiAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UsIFxyXG4gICAgICAgIG5sQ2FzZUxhd0RhdGFTZXJ2aWNlLCBcclxuICAgICAgICBlY2xpXHJcbiAgICApIHtcclxuICAgICAgICBcclxuICAgICAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICBlY2xpOiBlY2xpLFxyXG4gICAgICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAgICAganVkZ21lbnQ6IG5sQ2FzZUxhd0RhdGFTZXJ2aWNlLmp1ZGdtZW50LFxyXG4gICAgICAgICAgICAvLyB0aXRsZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygnY2FuY2VsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAgICAgbmxDYXNlTGF3RGF0YVNlcnZpY2UubG9hZEp1ZGdtZW50KHZtLmVjbGkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd01vZGFsKGVjbGkpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJ29wZW4tbW9kYWwtbmwtY2FzZS1sYXctanVkZ21lbnQnLCB7IGNhdGVnb3J5OiAnY2FzZS1sYXcnIH0pO1xyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IG5sQ2FzZUxhd0p1ZGdtZW50TW9kYWxDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsTmxDYXNlTGF3SnVkZ21lbnRNb2RhbCcsXHJcbiAgICAgICAgICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgIGVjbGk6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlY2xpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaXplOiAnbGcnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Nhc2UtbGF3L21vZGFscy9ubC1jYXNlLWxhdy1qdWRnbWVudC1tb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdtb2RhbC1ubC1jYXNlLWxhdy1qdWRnbWVudCdcclxuICAgICAgICB9KS5yZXN1bHQuY2F0Y2goZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufSIsIm1vZHVsZS5leHBvcnRzID0gWydjb21tb24nLCAnZGF0YUNvbnRleHQnLCAnaWRlbnRpdHknLCBjYXNlTGF3RGF0YVNlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gY2FzZUxhd0RhdGFTZXJ2aWNlKGNvbW1vbiwgY29udGV4dCwgaWRlbnRpdHkpIHtcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGV1Q2FzZUxhd0l0ZW1zUGVySGVhZGluZzoge30sXHJcbiAgICAgICAgZHV0Y2hDYXNlTGF3SXRlbXNQZXJIZWFkaW5nOiB7fSxcclxuICAgICAgICBnZXRDYXNlTGF3SW5mbzogZ2V0Q2FzZUxhd0luZm8gICAgICAgIFxyXG4gICAgfTtcclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIGdldENhc2VMYXdJbmZvKGNoYXB0ZXJOdW1iZXIpIHtcclxuICAgICAgICB2YXIgdXJsRVUgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2Nhc2VsYXcvZXUvZG9jdW1lbnRzL2NvdW50QnlIZWFkaW5nLycgKyBjaGFwdGVyTnVtYmVyO1xyXG4gICAgICAgIHZhciB1cmxOTCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvY2FzZWxhdy9ubC9kb2N1bWVudHMvY291bnRCeUhlYWRpbmcvJyArIGNoYXB0ZXJOdW1iZXI7XHJcbiAgICAgICAgaWYgKGlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ2Nhc2UtbGF3LWV1JykpIHtcclxuICAgICAgICAgICAgdmFyIHJlcUVVID0gY29udGV4dC5nZXQodXJsRVUpO1xyXG4gICAgICAgICAgICByZXFFVS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goZGF0YSwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmV1Q2FzZUxhd0l0ZW1zUGVySGVhZGluZ1tlbGVtZW50LkhlYWRpbmcgKyBcIjAwMDAwMFwiXSA9IGVsZW1lbnQuTjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ2Nhc2UtbGF3LW5sJykpIHtcclxuICAgICAgICAgICAgdmFyIHJlcU5MID0gY29udGV4dC5nZXQodXJsTkwpO1xyXG4gICAgICAgICAgICByZXFOTC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goZGF0YSwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmR1dGNoQ2FzZUxhd0l0ZW1zUGVySGVhZGluZ1tlbGVtZW50LkhlYWRpbmcgKyBcIjAwMDAwMFwiXSA9IGVsZW1lbnQuTjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFsnJGh0dHBQYXJhbVNlcmlhbGl6ZXInLCAnJGxvY2F0aW9uJywgJyRyb3V0ZVBhcmFtcycsICdjb21tb24nLCAnZGF0YUNvbnRleHQnLCAnaWRlbnRpdHknLCBldUNhc2VMYXdEYXRhU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBldUNhc2VMYXdEYXRhU2VydmljZSgkaHR0cFBhcmFtU2VyaWFsaXplciwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMsIGNvbW1vbiwgY29udGV4dCwgaWRlbnRpdHkpIHtcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgcXVlcnk6IHtcclxuICAgICAgICAgICAgQ2VsZXg6IG51bGwsXHJcbiAgICAgICAgICAgIEVjbGk6ICRyb3V0ZVBhcmFtcy5lY2xpIHx8IG51bGwsXHJcbiAgICAgICAgICAgIEVuZERhdGU6IG51bGwsXHJcbiAgICAgICAgICAgIEdvb2RzQ29kZTogbnVsbCxcclxuICAgICAgICAgICAgTGFuZzogY29tbW9uLmxhbmd1YWdlLmdldCgpLFxyXG4gICAgICAgICAgICBRdWVyeTogbnVsbCxcclxuICAgICAgICAgICAgU3RhcnREYXRlOiBudWxsLFxyXG4gICAgICAgICAgICBUYWc6IG51bGwsXHJcbiAgICAgICAgICAgIFphYWtudW1tZXI6IG51bGwsXHJcbiAgICAgICAgICAgIFBhZ2U6IDFcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRhZ3M6IFtdLFxyXG4gICAgICAgIHJlc3BvbnNlOiB7fSxcclxuICAgICAgICBzdW1tYXJ5OiB7XHJcbiAgICAgICAgICAgIGh0bWw6IG51bGwsXHJcbiAgICAgICAgICAgIG1ldGFkYXRhOiBudWxsLFxyXG4gICAgICAgICAgICBwZGZVcmw6IG51bGxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiBjbGVhcixcclxuICAgICAgICBnZXRTdW1tYXJ5UGRmVXJsOiBnZXRTdW1tYXJ5UGRmVXJsLFxyXG4gICAgICAgIGxvYWRDYXNlTGF3OiBsb2FkQ2FzZUxhdyxcclxuICAgICAgICBsb2FkQ2FzZUxhd05ld3M6IGxvYWRDYXNlTGF3TmV3cyxcclxuICAgICAgICBsb2FkU3VtbWFyeTogbG9hZFN1bW1hcnksXHJcbiAgICAgICAgbG9hZFRhZ3M6IGxvYWRUYWdzLFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhcigpIHtcclxuICAgICAgICBzZXJ2aWNlLnF1ZXJ5LkNlbGV4ID0gbnVsbDtcclxuICAgICAgICBzZXJ2aWNlLnF1ZXJ5LkVjbGkgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UucXVlcnkuRW5kRGF0ZSA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5xdWVyeS5Hb29kc0NvZGUgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UucXVlcnkuUXVlcnkgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UucXVlcnkuU3RhcnREYXRlID0gbnVsbDtcclxuICAgICAgICBzZXJ2aWNlLnF1ZXJ5LlRhZyA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5xdWVyeS5aYWFrbnVtbWVyID0gbnVsbDtcclxuICAgICAgICBzZXJ2aWNlLnF1ZXJ5LlBhZ2UgPSAxO1xyXG5cclxuICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCdlY2xpJywgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZFRhZ3MoKSB7XHJcbiAgICAgICAgaWYgKGlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ2Nhc2UtbGF3LWV1JykpIHtcclxuICAgICAgICAgICAgY29udGV4dC5nZXQoY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jYXNlbGF3L2V1L3RhZ3MnKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnRhZ3MgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRDYXNlTGF3KCkge1xyXG4gICAgICAgIGlmIChpZGVudGl0eS5oYXNQZXJtaXNzaW9uKCdjYXNlLWxhdy1ldScpKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2VydmljZS5yZXNwb25zZSA9IHt9O1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXQoY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jYXNlbGF3L2V1L3NlYXJjaD8nICsgJGh0dHBQYXJhbVNlcmlhbGl6ZXIoc2VydmljZS5xdWVyeSkpXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UucmVzcG9uc2UgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBqcVhocikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm5vQWNjZXNzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZENhc2VMYXdOZXdzKHBhZ2VOdW1iZXIpIHtcclxuICAgICAgICBjbGVhcigpO1xyXG4gICAgICAgIHNlcnZpY2UucXVlcnkuUGFnZSA9IHBhZ2VOdW1iZXI7XHJcbiAgICAgICAgaWYgKGlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ2Nhc2UtbGF3LWV1JykpIHtcclxuICAgICAgICAgICAgc2VydmljZS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXQoY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jYXNlbGF3L2V1L3NlYXJjaD8nICsgJGh0dHBQYXJhbVNlcmlhbGl6ZXIoc2VydmljZS5xdWVyeSkpXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UucmVzcG9uc2UgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBqcVhocikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm5vQWNjZXNzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZFN1bW1hcnkod29ya0lkKSB7XHJcbiAgICAgICAgaWYgKGlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ2Nhc2UtbGF3LWV1JykpIHtcclxuICAgICAgICAgICAgc2VydmljZS5zdW1tYXJ5Lmh0bWwgPSBudWxsO1xyXG4gICAgICAgICAgICBzZXJ2aWNlLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldChjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2Nhc2VsYXcvZXUvc3VtbWFyeS8nICsgd29ya0lkKS50aGVuKGZ1bmN0aW9uIChodG1sKSB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLnN1bW1hcnkuaHRtbCA9IGh0bWw7XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0U3VtbWFyeVBkZlVybCh3b3JrSWQpIHtcclxuICAgICAgICBpZiAoaWRlbnRpdHkuaGFzUGVybWlzc2lvbignY2FzZS1sYXctZXUnKSkge1xyXG4gICAgICAgICAgICBzZXJ2aWNlLnN1bW1hcnkuaHRtbCA9IG51bGw7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArXHJcbiAgICAgICAgICAgICAgICAnL2Nhc2VsYXcvZXUvc3VtbWFyeS8nICsgd29ya0lkICsgJy9wZGZVcmwnXHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpLnRoZW4oZnVuY3Rpb24gKHBkZlVybCkge1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5zdW1tYXJ5LnBkZlVybCA9IHBkZlVybDtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxufSIsInZhciBtb21lbnQgPSByZXF1aXJlKCdtb21lbnQnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gWyckbG9jYXRpb24nLCAnJHJvdXRlUGFyYW1zJywgJ2NvbW1vbicsICdkYXRhQ29udGV4dCcsICdpZGVudGl0eScsIG5sQ2FzZUxhd0RhdGFTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIG5sQ2FzZUxhd0RhdGFTZXJ2aWNlKCRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zLCBjb21tb24sIGNvbnRleHQsIGlkZW50aXR5KSB7XHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBjbGVhcjogY2xlYXIsXHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBqdWRnbWVudDoge30sXHJcbiAgICAgICAgbG9hZENhc2VMYXdOZXdzOiBsb2FkQ2FzZUxhd05ld3MsXHJcbiAgICAgICAgbG9hZENhc2VMYXdTZWFyY2hSZXN1bHRzOiBsb2FkQ2FzZUxhd1NlYXJjaFJlc3VsdHMsXHJcbiAgICAgICAgbG9hZEp1ZGdtZW50OiBsb2FkSnVkZ21lbnQsXHJcbiAgICAgICAgcXVlcnk6IHtcclxuICAgICAgICAgICAgRWNsaTogJHJvdXRlUGFyYW1zLmVjbGkgfHwgbnVsbCxcclxuICAgICAgICAgICAgRW5kRGF0ZTogbnVsbCxcclxuICAgICAgICAgICAgR29vZHNDb2RlOiBudWxsLFxyXG4gICAgICAgICAgICBRdWVyeTogbnVsbCxcclxuICAgICAgICAgICAgU3RhcnREYXRlOiBudWxsLFxyXG4gICAgICAgICAgICBUYWc6IG51bGwsXHJcbiAgICAgICAgICAgIFphYWtudW1tZXI6IG51bGwsXHJcbiAgICAgICAgICAgIFBhZ2VOdW1iZXI6IDFcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlc3BvbnNlOiB7fSxcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXIoKSB7XHJcbiAgICAgICAgc2VydmljZS5xdWVyeS5FY2xpID0gbnVsbDtcclxuICAgICAgICBzZXJ2aWNlLnF1ZXJ5LkVuZERhdGUgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UucXVlcnkuR29vZHNDb2RlID0gbnVsbDtcclxuICAgICAgICBzZXJ2aWNlLnF1ZXJ5LlF1ZXJ5ID0gbnVsbDtcclxuICAgICAgICBzZXJ2aWNlLnF1ZXJ5LlN0YXJ0RGF0ZSA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5xdWVyeS5UYWcgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UucXVlcnkuWmFha251bW1lciA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5xdWVyeS5QYWdlTnVtYmVyID0gMTtcclxuICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCdlY2xpJywgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZENhc2VMYXdOZXdzKHBhZ2VOdW1iZXIpIHtcclxuICAgICAgICBjbGVhcigpO1xyXG4gICAgICAgIHNlcnZpY2UucXVlcnkuUGFnZU51bWJlciA9IHBhZ2VOdW1iZXI7XHJcbiAgICAgICAgc2VydmljZS5yZXNwb25zZSA9IHt9O1xyXG4gICAgICAgIGlmIChpZGVudGl0eS5oYXNQZXJtaXNzaW9uKCdjYXNlLWxhdy1ubCcpKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuaXNMb2FkaW5nTkwgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgZHV0Y2hDYXNlTGF3VXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jYXNlbGF3L25sL2RvY3VtZW50cy9zZWFyY2gnO1xyXG5cclxuICAgICAgICAgICAgZHV0Y2hDYXNlTGF3VXJsICs9ICc/c2l6ZT0xMCZwYWdlPScgKyBzZXJ2aWNlLnF1ZXJ5LlBhZ2VOdW1iZXI7XHJcblxyXG4gICAgICAgICAgICAvLyBUT0RPOiBpbiBwcm9kdWN0aW9uLCBpdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIHZpZXcgdW5wdWJsaXNoZWQgaXRlbXMgYXQgYWxsXHJcbiAgICAgICAgICAgIC8vIEhlbmNlLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gcmVtb3ZlIHRoaXMgbGluZSBieSBub3dcclxuICAgICAgICAgICAgZHV0Y2hDYXNlTGF3VXJsICs9ICcmcHVibGlzaGVkPVRydWUnO1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXQoZHV0Y2hDYXNlTGF3VXJsKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnJlc3BvbnNlID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGpxWGhyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uubm9BY2Nlc3MgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkQ2FzZUxhd1NlYXJjaFJlc3VsdHMoKSB7XHJcbiAgICAgICAgaWYgKGlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ2Nhc2UtbGF3LW5sJykpIHtcclxuICAgICAgICAgICAgc2VydmljZS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBzZXJ2aWNlLnJlc3BvbnNlID0ge307XHJcbiAgICAgICAgICAgIHZhciBkdXRjaENhc2VMYXdVcmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyBcIi9jYXNlbGF3L25sL2RvY3VtZW50cy9zZWFyY2hcIjtcclxuICAgICAgICAgICAgaWYgKHNlcnZpY2UucXVlcnkuRWNsaSkge1xyXG4gICAgICAgICAgICAgICAgZHV0Y2hDYXNlTGF3VXJsICs9ICc/ZmllbGRzPWVjbGkmcT0nICsgc2VydmljZS5xdWVyeS5FY2xpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHNlcnZpY2UucXVlcnkuWmFha251bW1lcikge1xyXG4gICAgICAgICAgICAgICAgZHV0Y2hDYXNlTGF3VXJsICs9ICc/ZmllbGRzPXphYWtudW1tZXImcT0nICsgc2VydmljZS5xdWVyeS5aYWFrbnVtbWVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZHV0Y2hDYXNlTGF3VXJsICs9ICc/cGFnZT0nICsgc2VydmljZS5xdWVyeS5QYWdlTnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UucXVlcnkuR29vZHNDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHV0Y2hDYXNlTGF3VXJsICs9IFwiJmdvb2RzY29kZT1cIiArIHNlcnZpY2UucXVlcnkuR29vZHNDb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UucXVlcnkuUXVlcnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBkdXRjaENhc2VMYXdVcmwgKz0gXCImZmllbGRzPWluaG91ZHNpbmRpY2F0aWUsZG9jdW1lbnQmcT1cIiArIHNlcnZpY2UucXVlcnkuUXVlcnk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnRhdGllIHZhbiB6b2VrZW4gb3AgcHVibGljYXRpZWRhdHVtXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5xdWVyeS5TdGFydERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBkdXRjaENhc2VMYXdVcmwgKz0gJyZ1aXRzcHJhYWtEYXR1bVN0YXJ0PScgKyBtb21lbnQoc2VydmljZS5xdWVyeS5TdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UucXVlcnkuRW5kRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGR1dGNoQ2FzZUxhd1VybCArPSAnJnVpdHNwcmFha0RhdHVtRWluZGU9JyArIG1vbWVudChzZXJ2aWNlLnF1ZXJ5LkVuZERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFRPRE86IGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byByZW1vdmUgdGhlIG5leHQgbGluZVxyXG4gICAgICAgICAgICBkdXRjaENhc2VMYXdVcmwgKz0gJyZwdWJsaXNoZWQ9VHJ1ZSc7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldChkdXRjaENhc2VMYXdVcmwpXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UucmVzcG9uc2UgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywganFYaHIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5ub0FjY2VzcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRKdWRnbWVudChlY2xpKSB7XHJcbiAgICAgICAgaWYgKGlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ2Nhc2UtbGF3LW5sJykpIHtcclxuICAgICAgICAgICAgc2VydmljZS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBzZXJ2aWNlLmp1ZGdtZW50LnBkZlVybCA9ICdodHRwczovL3VpdHNwcmFrZW4ucmVjaHRzcHJhYWsubmwvSW56aWVuRG9jdW1lbnQvR2V0UGRmP2VjbGk9JyArIGVjbGk7XHJcbiAgICAgICAgICAgIHZhciBkdXRjaENhc2VMYXdVcmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyBcIi9jYXNlbGF3L25sL2RvY3VtZW50cy9cIiArIGVjbGkgKyBcIi9kb2N1bWVudFwiO1xyXG4gICAgICAgICAgICBjb250ZXh0LmdldChkdXRjaENhc2VMYXdVcmwpXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuanVkZ21lbnQucmVzcG9uc2UgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywganFYaHIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5ub0FjY2VzcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcbn0iLCLvu79hbmd1bGFyLm1vZHVsZSgndGFyaWMuY2VydGlmaWNhdGVDb2RlcycsIFtdKVxyXG4gICAgLmNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgcm91dGVDb25maWd1cmF0b3JdKVxyXG4gICAgLy8gQ29tcG9uZW50c1xyXG4gICAgLmNvbXBvbmVudCgnY2VydGlmaWNhdGVDb2RlUGlja2VyJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2NlcnRpZmljYXRlLWNvZGUtcGlja2VyJykpXHJcbiAgICAvLyBQYWdlc1xyXG4gICAgLmNvbXBvbmVudCgnY2VydGlmaWNhdGVDb2Rlc1BhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvY2VydGlmaWNhdGUtY29kZXMtcGFnZScpKVxyXG4gICAgLy8gRmlsdGVyc1xyXG4gICAgLmZpbHRlcignY2VydGlmaWNhdGVDb2RlVHlwZWFoZWFkJywgcmVxdWlyZSgnLi9maWx0ZXJzL2NlcnRpZmljYXRlLWNvZGUtdHlwZWFoZWFkLWZpbHRlcicpKVxyXG4gICAgLy8gTW9kYWxzXHJcbiAgICAuZmFjdG9yeSgnY2VydGlmaWNhdGVDb2RlU2VsZWN0b3JNb2RhbCcsIHJlcXVpcmUoJy4vbW9kYWxzL2NlcnRpZmljYXRlLWNvZGUtc2VsZWN0b3InKSlcclxuICAgIC8vIFNlcnZpY2VzXHJcbiAgICAuZmFjdG9yeSgnY2VydGlmaWNhdGVDb2Rlc0RhdGFTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy9jZXJ0aWZpY2F0ZS1jb2Rlcy1kYXRhJykpXHJcbiAgICA7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL2NlcnRpZmljYXRlLWNvZGVzJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxjZXJ0aWZpY2F0ZS1jb2Rlcy1wYWdlPjwvY2VydGlmaWNhdGUtY29kZXMtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICA7XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7IFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnPCcsIFxyXG4gICAgICAgIGNlcnRpZmljYXRlQ29kZXM6ICc8JywgXHJcbiAgICAgICAgcG9zc2libGVDZXJ0aWZpY2F0ZUNvZGVzOiAnPCAnLCBcclxuICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAnJicgXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogY2VydGlmaWNhdGVDb2RlUGlja2VyQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY2VydGlmaWNhdGUtY29kZXMvY29tcG9uZW50cy9jZXJ0aWZpY2F0ZS1jb2RlLXBpY2tlci5odG1sJ1xyXG59O1xyXG5cclxuY2VydGlmaWNhdGVDb2RlUGlja2VyQ29udHJvbGxlci4kaW5qZWN0ID0gWydjZXJ0aWZpY2F0ZUNvZGVTZWxlY3Rvck1vZGFsJ107XHJcblxyXG5mdW5jdGlvbiBjZXJ0aWZpY2F0ZUNvZGVQaWNrZXJDb250cm9sbGVyKGNlcnRpZmljYXRlQ29kZVNlbGVjdG9yTW9kYWwpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICByZW1vdmVDZXJ0aWZpY2F0ZUNvZGU6IHJlbW92ZUNlcnRpZmljYXRlQ29kZSxcclxuICAgICAgICBjZXJ0aWZpY2F0ZUNvZGVzOiBbXSxcclxuICAgICAgICBwb3NzaWJsZUNlcnRpZmljYXRlQ29kZXM6IFtdLFxyXG4gICAgICAgIGF2YWlsYWJsZUNlcnRpZmljYXRlQ29kZXM6IFtdLFxyXG4gICAgICAgIHVzZXJJbnB1dDogbnVsbCxcclxuICAgICAgICBpdGVtU2VsZWN0ZWQ6IGl0ZW1TZWxlY3RlZCxcclxuICAgICAgICBvbkJsdXI6IG9uQmx1cixcclxuICAgICAgICBvbkZvY3VzOiBvbkZvY3VzLFxyXG4gICAgICAgIG9uRW50ZXI6IG9uRW50ZXIsXHJcbiAgICAgICAgc2hvd01vZGFsOiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbCgpIHtcclxuICAgICAgICB1cGRhdGVBdmFpbGFibGVDZXJ0aWZpY2F0ZUNvZGVzKCk7XHJcbiAgICAgICAgY2VydGlmaWNhdGVDb2RlU2VsZWN0b3JNb2RhbFxyXG4gICAgICAgICAgICAuc2hvdyh2bS5hdmFpbGFibGVDZXJ0aWZpY2F0ZUNvZGVzLCB2bS5jZXJ0aWZpY2F0ZUNvZGVzKVxyXG4gICAgICAgICAgICAucmVzdWx0XHJcbiAgICAgICAgICAgIC50aGVuKGl0ZW1TZWxlY3RlZClcclxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghKHJlcyA9PT0gJ2NhbmNlbCcgfHwgcmVzID09PSAnZXNjYXBlIGtleSBwcmVzcycgfHwgcmVzID09PSAnYmFja2Ryb3AgY2xpY2snKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgdXBkYXRlQXZhaWxhYmxlQ2VydGlmaWNhdGVDb2RlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGF2YWlsYWJsZSBtZWFucyBwb3NzaWJsZSBhbmQgbm90IGFscmVhZHkgc2VsZWN0ZWRcclxuICAgIGZ1bmN0aW9uIHVwZGF0ZUF2YWlsYWJsZUNlcnRpZmljYXRlQ29kZXMoKSB7XHJcbiAgICAgICAgdm0uYXZhaWxhYmxlQ2VydGlmaWNhdGVDb2RlcyA9IF8uY2hhaW4odm0ucG9zc2libGVDZXJ0aWZpY2F0ZUNvZGVzKVxyXG4gICAgICAgICAgICAuZGlmZmVyZW5jZUJ5KHZtLmNlcnRpZmljYXRlQ29kZXMsIGZ1bmN0aW9uIChjZXJ0aWZpY2F0ZUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZUNvZGUudHlwZSArIGNlcnRpZmljYXRlQ29kZS5jb2RlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChjZXJ0aWZpY2F0ZUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjZXJ0aWZpY2F0ZUNvZGUub3JpZ2luID09PSAnSVQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVDb2RlLmRpc3BsYXlTdHJpbmcgPSBjZXJ0aWZpY2F0ZUNvZGUuY29kZSArICcgJyArIGNlcnRpZmljYXRlQ29kZS50eXBlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVDb2RlLmRpc3BsYXlTdHJpbmcgPSBjZXJ0aWZpY2F0ZUNvZGUudHlwZSArICcgJyArIGNlcnRpZmljYXRlQ29kZS5jb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNlcnRpZmljYXRlQ29kZTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlQ2VydGlmaWNhdGVDb2RlKGNlcnRpZmljYXRlQ29kZSkge1xyXG4gICAgICAgIHZtLmNlcnRpZmljYXRlQ29kZXMgPSBfLmZpbHRlcih2bS5jZXJ0aWZpY2F0ZUNvZGVzLCBmdW5jdGlvbiAoY29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29kZS50eXBlICE9PSBjZXJ0aWZpY2F0ZUNvZGUudHlwZSB8fCBjb2RlLmNvZGUgIT09IGNlcnRpZmljYXRlQ29kZS5jb2RlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHVwZGF0ZUF2YWlsYWJsZUNlcnRpZmljYXRlQ29kZXMoKTtcclxuICAgICAgICBpZiAodm0uc2VsZWN0aW9uQ2hhbmdlZClcclxuICAgICAgICAgICAgdm0uc2VsZWN0aW9uQ2hhbmdlZCh7IGNlcnRpZmljYXRlQ29kZXM6IHZtLmNlcnRpZmljYXRlQ29kZXMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25Gb2N1cygpIHtcclxuICAgICAgICB1cGRhdGVBdmFpbGFibGVDZXJ0aWZpY2F0ZUNvZGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25CbHVyKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkVudGVyKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpdGVtU2VsZWN0ZWQoaXRlbSwgbW9kZWwpIHtcclxuICAgICAgICB2bS51c2VySW5wdXQgPSBudWxsO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdpdGVtU2VsZWN0ZWQnLCBpdGVtLCBtb2RlbCwgdm0udXNlcklucHV0KTtcclxuICAgICAgICB2bS5jZXJ0aWZpY2F0ZUNvZGVzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgdXBkYXRlQXZhaWxhYmxlQ2VydGlmaWNhdGVDb2RlcygpO1xyXG5cclxuICAgICAgICBpZiAodm0uc2VsZWN0aW9uQ2hhbmdlZClcclxuICAgICAgICAgICAgdm0uc2VsZWN0aW9uQ2hhbmdlZCh7IGNlcnRpZmljYXRlQ29kZXM6IHZtLmNlcnRpZmljYXRlQ29kZXMgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBjZXJ0aWZpY2F0ZUNvZGVzUGFnZUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2NlcnRpZmljYXRlLWNvZGVzL2NvbXBvbmVudHMvY2VydGlmaWNhdGUtY29kZXMtcGFnZS5odG1sJ1xyXG59O1xyXG5cclxuY2VydGlmaWNhdGVDb2Rlc1BhZ2VDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyR0aW1lb3V0JyxcclxuICAgICdub3RpZmljYXRpb25zU2VydmljZScsIFxyXG4gICAgJ2NlcnRpZmljYXRlQ29kZXNEYXRhU2VydmljZScsIFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gY2VydGlmaWNhdGVDb2Rlc1BhZ2VDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkdGltZW91dCxcclxuICAgIG5vdGlmaWNhdGlvbnMsIFxyXG4gICAgY2VydGlmaWNhdGVDb2Rlc0RhdGEsIFxyXG4gICAgc3RhdGVcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgZmlsdGVyOiBcIlwiLFxyXG4gICAgICAgIGZpbHRlclR5cGU6IFwiXCIsXHJcbiAgICAgICAgaXNMb2FkaW5nVHlwZXM6IGZhbHNlLFxyXG4gICAgICAgIGZpbHRlcmVkQ2VydGlmaWNhdGVDb2RlczogW10sXHJcbiAgICAgICAgY2VydGlmaWNhdGVDb2RlczogW10sXHJcbiAgICAgICAgY2VydGlmaWNhdGVDb2RlVHlwZXM6IFtdLFxyXG4gICAgICAgIGZpbHRlcmVkQ2VydGlmaWNhdGVDb2RlVHlwZXM6IFtdLFxyXG4gICAgICAgIHNlbGVjdGVkVHlwZTogbnVsbCxcclxuICAgICAgICByZWZlcmVuY2VDb3VudHJ5OiBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSxcclxuICAgICAgICBsb2FkY2VydGlmaWNhdGVDb2RlczogbG9hZENlcnRpZmljYXRlQ29kZXMsXHJcbiAgICAgICAgY2xlYXJGaWx0ZXI6IGNsZWFyRmlsdGVyLFxyXG4gICAgICAgIGNoYW5nZUZpbHRlcjogY2hhbmdlRmlsdGVyLFxyXG4gICAgICAgIGNsZWFyRmlsdGVyVHlwZTogY2xlYXJGaWx0ZXJUeXBlLFxyXG4gICAgICAgIGNoYW5nZUZpbHRlclR5cGU6IGNoYW5nZUZpbHRlclR5cGUsXHJcbiAgICAgICAgZm9jdXNJbnB1dFR5cGVGaWVsZDogZm9jdXNJbnB1dFR5cGVGaWVsZCxcclxuICAgICAgICBmb2N1c0lucHV0RmllbGQ6IGZvY3VzSW5wdXRGaWVsZFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBmb2N1c0lucHV0VHlwZUZpZWxkKCkge1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHZhciBpbnB1dEVMID0gYW5ndWxhci5lbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbnB1dEZpbHRlclR5cGUnKSk7XHJcbiAgICAgICAgICAgIGlmIChpbnB1dEVMKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dEVMWzBdLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmb2N1c0lucHV0RmllbGQoKSB7XHJcbiAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgdmFyIGlucHV0RUwgPSBhbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2lucHV0RmlsdGVyJykpO1xyXG4gICAgICAgICAgICBpZiAoaW5wdXRFTCkge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRFTFswXS5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9yZWZlcmVuY2UvY2VydGlmaWNhdGUtY29kZXMnKTtcclxuICAgICAgICBsb2FkVHlwZXMoKTtcclxuICAgICAgICBub3RpZmljYXRpb25zLnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGRhdGVDaGFuZ2VkKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkZXRhY2hlZCgpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zLnVuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyRmlsdGVyKCkge1xyXG4gICAgICAgIHZtLmZpbHRlciA9ICcnO1xyXG4gICAgICAgIHZtLmZpbHRlcmVkQ2VydGlmaWNhdGVDb2RlcyA9IHZtLmNlcnRpZmljYXRlQ29kZXM7XHJcbiAgICAgICAgZm9jdXNJbnB1dEZpZWxkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2hhbmdlRmlsdGVyKCkge1xyXG4gICAgICAgIHZtLmZpbHRlcmVkQ2VydGlmaWNhdGVDb2RlcyA9IHZtLmNlcnRpZmljYXRlQ29kZXMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKGVsLnR5cGUudG9Mb3dlckNhc2UoKSArIGVsLmNvZGUudG9Mb3dlckNhc2UoKSkuaW5jbHVkZXModm0uZmlsdGVyLnRvTG93ZXJDYXNlKCkpIHx8IFxyXG4gICAgICAgICAgICAgICAgZWwuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2bS5maWx0ZXIudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJGaWx0ZXJUeXBlKCkge1xyXG4gICAgICAgIGNsZWFyRmlsdGVyKCk7XHJcbiAgICAgICAgdm0uZmlsdGVyVHlwZSA9IFwiXCI7XHJcbiAgICAgICAgdm0uZmlsdGVyZWRDZXJ0aWZpY2F0ZUNvZGVUeXBlcyA9IHZtLmNlcnRpZmljYXRlQ29kZVR5cGVzO1xyXG4gICAgICAgIHZtLmNlcnRpZmljYXRlQ29kZXMgPSBbXTtcclxuICAgICAgICB2bS5maWx0ZXJlZENlcnRpZmljYXRlQ29kZXMgPSBbXTtcclxuICAgICAgICB2bS5zZWxlY3RlZFR5cGUgPSBudWxsO1xyXG4gICAgICAgIGZvY3VzSW5wdXRUeXBlRmllbGQoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VGaWx0ZXJUeXBlKCkge1xyXG4gICAgICAgIHZtLmZpbHRlcmVkQ2VydGlmaWNhdGVDb2RlVHlwZXMgPSB2bS5jZXJ0aWZpY2F0ZUNvZGVUeXBlcy5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbC5jb2RlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModm0uZmlsdGVyVHlwZS50b0xvd2VyQ2FzZSgpKSB8fCBlbC5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHZtLmZpbHRlclR5cGUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYodm0uZmlsdGVyZWRDZXJ0aWZpY2F0ZUNvZGVUeXBlcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgbG9hZENlcnRpZmljYXRlQ29kZXModm0uZmlsdGVyZWRDZXJ0aWZpY2F0ZUNvZGVUeXBlc1swXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHZtLmZpbHRlcmVkQ2VydGlmaWNhdGVDb2RlVHlwZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHZtLmNlcnRpZmljYXRlQ29kZXMgPSBbXTtcclxuICAgICAgICAgICAgdm0uZmlsdGVyZWRDZXJ0aWZpY2F0ZUNvZGVzID0gW107XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdGVkVHlwZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlciA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRhdGVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGxvYWRUeXBlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRDZXJ0aWZpY2F0ZUNvZGVzKHR5cGUpIHtcclxuICAgICAgICBpZiAodm0ucmVmZXJlbmNlQ291bnRyeSA9PT0gJ0NIJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZtLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgdm0uc2VsZWN0ZWRUeXBlID0gdHlwZS5jb2RlO1xyXG4gICAgICAgIHZtLmZpbHRlciA9IFwiXCI7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY2VydGlmaWNhdGVDb2Rlc0RhdGEuZ2V0QnlUeXBlKHR5cGUuY29kZSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZtLmZpbHRlcmVkQ2VydGlmaWNhdGVDb2RlcyA9IGRhdGFcclxuICAgICAgICAgICAgICAgIHZtLmNlcnRpZmljYXRlQ29kZXMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb2N1c0lucHV0RmllbGQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZFR5cGVzKCkge1xyXG4gICAgICAgIGlmICh2bS5yZWZlcmVuY2VDb3VudHJ5ID09PSAnQ0gnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nVHlwZXMgPSB0cnVlO1xyXG4gICAgICAgIHZtLmNlcnRpZmljYXRlQ29kZXMgPSBbXTtcclxuICAgICAgICB2bS5zZWxlY3RlZFR5cGUgPSBudWxsO1xyXG5cclxuICAgICAgICBjZXJ0aWZpY2F0ZUNvZGVzRGF0YS5nZXRUeXBlcygpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5jZXJ0aWZpY2F0ZUNvZGVUeXBlcyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICB2bS5maWx0ZXJlZENlcnRpZmljYXRlQ29kZVR5cGVzID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZ1R5cGVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb2N1c0lucHV0VHlwZUZpZWxkKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFtjZXJ0aWZpY2F0ZUNvZGVUeXBlYWhlYWRGaWx0ZXJdO1xyXG5cclxuLy8gVGFrZXMgY2FyZSBvZiBvcmRlcmluZyB0aGUgcmVzdWx0cyBvZiB0aGUgY2VydGlmaWNhdGUgY29kZSB0eXBlYWhlZC4gVGhlIGxvZ2ljIGlzIGFzIGZvbGxvd3M6XHJcbi8vIEZpcnN0LCBzaG93IHRoZSBtYXRjaGVzIG9uIHRoZSBjZXJ0aWZpY2F0ZSBjb2RlLCBvcmRlcmVkIGJ5IGNvZGVcclxuLy8gTmV4dCwgc2hvdyB0aGUgbWF0Y2hlcyBvbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjZXJ0aWZpY2F0ZSBjb2RlIGRlc2NyaXB0aW9uLCBvcmRlcmVkIGJ5IGRlc2NyaXB0aW9uXHJcbi8vIEZpbmFsbHksIHNob3cgdGhlIG1hdGNoZXMgYW55d2hlcmUgZWxzZSBpbiB0aGUgZGVzY3JpcHRpb24sIG9yZGVyZWQgYnkgZGVzY3JpcHRpb25cclxuZnVuY3Rpb24gY2VydGlmaWNhdGVDb2RlVHlwZWFoZWFkRmlsdGVyKCkge1xyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAoY2VydGlmaWNhdGVDb2RlcywgcXVlcnkpIHtcclxuICAgICAgICB2YXIgcmVzdWx0O1xyXG4gICAgICAgIGlmIChxdWVyeSA9PT0gbnVsbCB8fCBxdWVyeSA9PT0gdW5kZWZpbmVkIHx8IHF1ZXJ5ID09PSAnJykge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBfLnNvcnRCeShjZXJ0aWZpY2F0ZUNvZGVzLCBmdW5jdGlvbihjZXJ0aWZpY2F0ZUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZUNvZGUudHlwZSArIGNlcnRpZmljYXRlQ29kZS5jb2RlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBjZXJ0aWZpY2F0ZUNvZGVNYXRjaFBhcnRpdGlvbiA9IF8ucGFydGl0aW9uKGNlcnRpZmljYXRlQ29kZXMsIGZ1bmN0aW9uKGNlcnRpZmljYXRlQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjZXJ0aWZpY2F0ZUNvZGUudHlwZSArIGNlcnRpZmljYXRlQ29kZS5jb2RlKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkucmVwbGFjZSgnICcsICcnKS50b0xvd2VyQ2FzZSgpKSA+PSAwO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdmFyIGNlcnRpZmljYXRlQ29kZU1hdGNoU3RhcnRQYXJ0aXRpb24gPSBfLnBhcnRpdGlvbihjZXJ0aWZpY2F0ZUNvZGVNYXRjaFBhcnRpdGlvblswXSwgZnVuY3Rpb24oY2VydGlmaWNhdGVDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGNlcnRpZmljYXRlQ29kZS50eXBlICsgY2VydGlmaWNhdGVDb2RlLmNvZGUpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihxdWVyeS5yZXBsYWNlKCcgJywgJycpLnRvTG93ZXJDYXNlKCkpID09PSAwO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBjZXJ0aWZpY2F0ZUNvZGVTdGFydE1hdGNoZXMgPSBfLnNvcnRCeShjZXJ0aWZpY2F0ZUNvZGVNYXRjaFN0YXJ0UGFydGl0aW9uWzBdLCBmdW5jdGlvbihjZXJ0aWZpY2F0ZUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZUNvZGUudHlwZSArIGNlcnRpZmljYXRlQ29kZS5jb2RlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdmFyIGNlcnRpZmljYXRlQ29kZU90aGVyTWF0Y2hlcyA9IF8uc29ydEJ5KGNlcnRpZmljYXRlQ29kZU1hdGNoU3RhcnRQYXJ0aXRpb25bMV0sIGZ1bmN0aW9uKGNlcnRpZmljYXRlQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNlcnRpZmljYXRlQ29kZS50eXBlICsgY2VydGlmaWNhdGVDb2RlLmNvZGU7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdmFyIG90aGVyTWF0Y2hlcyA9IF8uc29ydEJ5KGNlcnRpZmljYXRlQ29kZU1hdGNoUGFydGl0aW9uWzFdLCAnZGVzY3JpcHRpb24nKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBkZXNjcmlwdGlvblN0YXJ0TWF0Y2hQYXJ0aXRpb24gPSBfLnBhcnRpdGlvbihvdGhlck1hdGNoZXMsIGZ1bmN0aW9uKGNlcnRpZmljYXRlQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNlcnRpZmljYXRlQ29kZS5kZXNjcmlwdGlvbiAmJiBjZXJ0aWZpY2F0ZUNvZGUuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpID09PSAwO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBvdGhlckRlc2NyaXB0aW9uTWF0Y2hlcyA9IF8uZmlsdGVyKGRlc2NyaXB0aW9uU3RhcnRNYXRjaFBhcnRpdGlvblsxXSwgZnVuY3Rpb24oY2VydGlmaWNhdGVDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2VydGlmaWNhdGVDb2RlLmRlc2NyaXB0aW9uICYmIGNlcnRpZmljYXRlQ29kZS5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkudG9Mb3dlckNhc2UoKSkgPiAtMTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXN1bHQgPSBfLmNvbmNhdChjZXJ0aWZpY2F0ZUNvZGVTdGFydE1hdGNoZXMsIGNlcnRpZmljYXRlQ29kZU90aGVyTWF0Y2hlcywgZGVzY3JpcHRpb25TdGFydE1hdGNoUGFydGl0aW9uWzBdLCBvdGhlckRlc2NyaXB0aW9uTWF0Y2hlcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFsnJGFuYWx5dGljcycsICckdWliTW9kYWwnLCBjZXJ0aWZpY2F0ZUNvZGVTZWxlY3Rvck1vZGFsXTtcclxuXHJcbmZ1bmN0aW9uIGNlcnRpZmljYXRlQ29kZVNlbGVjdG9yTW9kYWwoJGFuYWx5dGljcywgJHVpYk1vZGFsKSB7XHJcbiAgICB2YXIgbW9kYWwgPSB7XHJcbiAgICAgICAgc2hvdzogc2hvd01vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIGNlcnRpZmljYXRlQ29kZVNlbGVjdG9yTW9kYWxDb250cm9sbGVyLiRpbmplY3QgPSBbJyR1aWJNb2RhbEluc3RhbmNlJywgJ3Bvc3NpYmxlQ2VydGlmaWNhdGVDb2RlcycsICdjZXJ0aWZpY2F0ZUNvZGUnXTtcclxuXHJcbiAgICBmdW5jdGlvbiBjZXJ0aWZpY2F0ZUNvZGVTZWxlY3Rvck1vZGFsQ29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgcG9zc2libGVDZXJ0aWZpY2F0ZUNvZGVzLCBjZXJ0aWZpY2F0ZUNvZGUpIHtcclxuICAgICAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgICAgIGNlcnRpZmljYXRlQ29kZTogY2VydGlmaWNhdGVDb2RlLFxyXG4gICAgICAgICAgICBjYW5jZWw6IGNhbmNlbCxcclxuICAgICAgICAgICAgcG9zc2libGVDZXJ0aWZpY2F0ZUNvZGVzOiBwb3NzaWJsZUNlcnRpZmljYXRlQ29kZXMsXHJcbiAgICAgICAgICAgIG9rOiBva1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygnY2FuY2VsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBvayhjb2RlKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKGNvZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChwb3NzaWJsZUNlcnRpZmljYXRlQ29kZXMsIGNlcnRpZmljYXRlQ29kZSkge1xyXG4gICAgICAgICRhbmFseXRpY3MuZXZlbnRUcmFjaygnb3Blbi1tb2RhbC1jZXJ0aWZpY2F0ZS1zZWxlY3RvcicsIHsgY2F0ZWdvcnk6ICdjZXJ0aWZpY2F0ZS1jb2RlcycgfSk7XHJcbiAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IGNlcnRpZmljYXRlQ29kZVNlbGVjdG9yTW9kYWxDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsJyxcclxuICAgICAgICAgICAga2V5Ym9hcmQ6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGFsRmFkZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgY2VydGlmaWNhdGVDb2RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlcnRpZmljYXRlQ29kZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBwb3NzaWJsZUNlcnRpZmljYXRlQ29kZXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zc2libGVDZXJ0aWZpY2F0ZUNvZGVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaXplOiAnbGcnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NlcnRpZmljYXRlLWNvZGVzL21vZGFscy9jZXJ0aWZpY2F0ZS1jb2RlLXNlbGVjdG9yLmh0bWwnLFxyXG4gICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLWNlcnRpZmljYXRlLWNvZGUtc2VsZWN0b3InXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG1vZGFsSW5zdGFuY2UucmVuZGVyZWQudGhlbihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnRUb0ZvY3VzT25Jbk1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1vZGFsLmluIC5mb2N1cy1vbi1vcGVuLW1vZGFsJyk7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50VG9Gb2N1c09uSW5Nb2RhbCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudFRvRm9jdXNPbkluTW9kYWwuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbW9kYWw7XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJ2NvbW1vbicsICdkYXRhQ29udGV4dCcsICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIGNlcnRpZmljYXRlQ29kZXNEYXRhU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBjZXJ0aWZpY2F0ZUNvZGVzRGF0YVNlcnZpY2UoY29tbW9uLCBjb250ZXh0LCBzdGF0ZSkge1xyXG5cclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGdldEJ5VHlwZTogZ2V0QnlUeXBlLFxyXG4gICAgICAgIGdldFR5cGVzOiBnZXRUeXBlc1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRCeVR5cGUoY2VydGlmaWNhdGVUeXBlKSB7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL2NlcnRpZmljYXRlcycgK1xyXG4gICAgICAgICAgICAnP3R5cGU9JyArIGNlcnRpZmljYXRlVHlwZSArXHJcbiAgICAgICAgICAgICcmbGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZyZWZlcmVuY2Vjb3VudHJ5PScgKyBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcblxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFR5cGVzKCkge1xyXG5cclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0c1tjb21tb24uY29uZmlnLmN1cnJlbnRBcGldICsgJy9jZXJ0aWZpY2F0ZXMvdHlwZXMnICtcclxuICAgICAgICAgICAgJz9vcmlnaW49RVUsJyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZsYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG59IiwiYW5ndWxhci5tb2R1bGUoJ3RhcmljLmNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnMnLCBbXSlcclxuICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIC8vIENvbXBvbmVudHNcclxuICAgIC5jb21wb25lbnQoJ2NsYXNzaWZpY2F0aW9uUmVndWxhdGlvbicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9uJykpXHJcbiAgICAuY29tcG9uZW50KCdjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25OZXcnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbi1uZXcnKSlcclxuICAgIC5jb21wb25lbnQoJ2NsYXNzaWZpY2F0aW9uUmVndWxhdGlvbk9sZCcsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9uLW9sZCcpKVxyXG4gICAgLmNvbXBvbmVudCgndGFyaWZlcmluZycsIHJlcXVpcmUoJy4vY29tcG9uZW50cy90YXJpZmVyaW5nJykpXHJcbiAgICAvLyBQYWdlc1xyXG4gICAgLmNvbXBvbmVudCgnc2VhcmNoQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc1BhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvc2VhcmNoLWNsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zLXBhZ2UnKSlcclxuICAgIC5jb21wb25lbnQoJ3NlYXJjaEVuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9zZWFyY2gtY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMtZW5nbGlzaC1wYWdlJykpXHJcbiAgICAvLyBNb2RhbHNcclxuICAgIC5mYWN0b3J5KCdjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucycpKVxyXG4gICAgLmZhY3RvcnkoJ2VuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy1lbicpKVxyXG4gICAgLy8gU2VydmljZXNcclxuICAgIC5mYWN0b3J5KCdzZWFyY2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvc2VhcmNoLWNsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zJykpXHJcbiAgICAuZmFjdG9yeSgnc2VhcmNoRW5nbGlzaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy9zZWFyY2gtY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMtZW5nbGlzaCcpKVxyXG4gICAgO1xyXG5cclxuXHJcbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJhdG9yKCRyb3V0ZVByb3ZpZGVyKSB7XHJcbiAgICAkcm91dGVQcm92aWRlclxyXG4gICAgICAgIC53aGVuKCcvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvbmwvc2VhcmNoLzpzZWFyY2hxdWVyeScsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8c2VhcmNoLWNsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zLXBhZ2U+PC9zZWFyY2gtY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2hlbignL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zL2VuL3NlYXJjaC86c2VhcmNocXVlcnknLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHNlYXJjaC1lbmdsaXNoLWNsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zLXBhZ2U+PC9zZWFyY2gtZW5nbGlzaC1jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvbmwvc2VhcmNoJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxzZWFyY2gtY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMtcGFnZT48L3NlYXJjaC1jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvZW4vc2VhcmNoJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxzZWFyY2gtZW5nbGlzaC1jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy1wYWdlPjwvc2VhcmNoLWVuZ2xpc2gtY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgIDtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7IFxyXG4gICAgICAgIGNsYXNzaWZpY2F0aW9uOiAnPCcsIFxyXG4gICAgICAgIHF1ZXJ5OiAnPCcsXHJcbiAgICB9LFxyXG4gICAgdGVtcGxhdGVVcmw6ICdjbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy9jb21wb25lbnRzL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb24tbmV3Lmh0bWwnLFxyXG59OyIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHsgXHJcbiAgICAgICAgY2xhc3NpZmljYXRpb246ICc8JywgXHJcbiAgICAgICAgcXVlcnk6ICc8JyBcclxuICAgIH0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zL2NvbXBvbmVudHMvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbi1vbGQuaHRtbCcsXHJcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczogeyBcclxuICAgICAgICBjbGFzc2lmaWNhdGlvbjogJzwnLCBcclxuICAgICAgICBxdWVyeTogJzwnIFxyXG4gICAgfSxcclxuICAgIHRlbXBsYXRlVXJsOiAnY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvY29tcG9uZW50cy9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9uLmh0bWwnLFxyXG59OyIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogc2VhcmNoRW5nbGlzaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdjbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy9jb21wb25lbnRzL3NlYXJjaC1jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy1lbmdsaXNoLXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbnNlYXJjaEVuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckbG9jYXRpb24nLCBcclxuICAgICdsYW5ndWFnZScsIFxyXG4gICAgJ3NlYXJjaEVuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zU2VydmljZScsXHJcbl07XHJcblxyXG5mdW5jdGlvbiBzZWFyY2hFbmdsaXNoQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc0NvbnRyb2xsZXIoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICRsb2NhdGlvbiwgXHJcbiAgICBsYW5ndWFnZSwgXHJcbiAgICBzZWFyY2hFbmdsaXNoQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc1NlcnZpY2VcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgIGRhdGE6IHNlYXJjaEVuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zU2VydmljZS5kYXRhLFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLmdldCgpLFxyXG4gICAgICAgIG5vUmVzdWx0czogbm9SZXN1bHRzLFxyXG4gICAgICAgIHBhcnNlZFF1ZXJ5OiBudWxsLFxyXG4gICAgICAgIHNlYXJjaDogc2VhcmNoXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAvLyBUT0RPOiBwYXJzZSBwcm9wZXJseVxyXG4gICAgICAgIHZtLnF1ZXJ5ID0gJGxvY2F0aW9uLnNlYXJjaCgpLnF1ZXJ5O1xyXG4gICAgICAgIHZtLmNvZGUgPSAkbG9jYXRpb24uc2VhcmNoKCkuY29tbW9kaXR5Q29kZTtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zLXNlYXJjaCcpO1xyXG4gICAgICAgIGxvYWRTZWFyY2goKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWFyY2gocXVlcnkpIHtcclxuICAgICAgICAkbG9jYXRpb24ucGF0aCgnL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zL2VuL3NlYXJjaCcpLnNlYXJjaChxdWVyeSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbm9SZXN1bHRzKCkge1xyXG4gICAgICAgIHJldHVybiB2bS5sYW5ndWFnZSA9PT0gJ2VuJ1xyXG4gICAgICAgICAgICAmJiAhdm0uaXNMb2FkaW5nXHJcbiAgICAgICAgICAgICYmIHZtLmRhdGEuY2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc09sZC5sZW5ndGggPT09IDBcclxuICAgICAgICAgICAgJiYgdm0uZGF0YS5jbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTmV3Lmxlbmd0aCA9PT0gMFxyXG4gICAgICAgICAgICAmJiBxdWVyeUlzVmFsaWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBxdWVyeUlzVmFsaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHZtLnF1ZXJ5ICYmIHZtLnF1ZXJ5Lmxlbmd0aCA+PSAyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkU2VhcmNoKCkge1xyXG5cclxuICAgICAgICBpZiAocXVlcnlJc1ZhbGlkKCkpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh2bS5sYW5ndWFnZSA9PT0gJ2VuJykge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHNlYXJjaEVuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zU2VydmljZS5sb2FkKHZtLmNvZGUsIHZtLnF1ZXJ5KVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodm0ubGFuZ3VhZ2UgPT09ICdubCcpIHtcclxuICAgICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCcvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvbmwvc2VhcmNoJykucmVwbGFjZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBzZWFyY2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvY29tcG9uZW50cy9zZWFyY2gtY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMtcGFnZS5odG1sJ1xyXG59O1xyXG5cclxuc2VhcmNoQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnJGxvY2F0aW9uJywgXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLCBcclxuICAgICdsYW5ndWFnZScsIFxyXG4gICAgJ3NlYXJjaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHNlYXJjaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkbG9jYXRpb24sIFxyXG4gICAgbm90aWZpY2F0aW9uc1NlcnZpY2UsIFxyXG4gICAgbGFuZ3VhZ2UsIFxyXG4gICAgc2VhcmNoQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc1NlcnZpY2VcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIGRhdGE6IHNlYXJjaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNTZXJ2aWNlLmRhdGEsXHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UuZ2V0KCksXHJcbiAgICAgICAgbm9SZXN1bHRzOiBub1Jlc3VsdHMsXHJcbiAgICAgICAgc2VhcmNoOiBzZWFyY2hcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIC8vIFRPRE86IHBhcnNlIHByb3Blcmx5XHJcbiAgICAgICAgdm0ucXVlcnkgPSAkbG9jYXRpb24uc2VhcmNoKCkucXVlcnk7XHJcbiAgICAgICAgdm0uY29kZSA9ICRsb2NhdGlvbi5zZWFyY2goKS5jb21tb2RpdHlDb2RlO1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMtc2VhcmNoJyk7XHJcblxyXG4gICAgICAgIGxvYWRTZWFyY2goKTtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBsb2FkU2VhcmNoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkZXRhY2hlZCgpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS51bnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGxvYWRTZWFyY2gpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlYXJjaChxdWVyeSkge1xyXG4gICAgICAgICRsb2NhdGlvbi5wYXRoKCcvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvbmwvc2VhcmNoJykuc2VhcmNoKHF1ZXJ5KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gbm9SZXN1bHRzKCkge1xyXG4gICAgICAgIHJldHVybiB2bS5sYW5ndWFnZSA9PT0gJ25sJyAmJiAhdm0uaXNMb2FkaW5nICYmIHZtLmRhdGEuY2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucy5sZW5ndGggPT09IDAgJiYgcXVlcnlJc1ZhbGlkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcXVlcnlJc1ZhbGlkKCkge1xyXG4gICAgICAgIHJldHVybiB2bS5xdWVyeSAmJiB2bS5xdWVyeS5sZW5ndGggPj0gMjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZFNlYXJjaCgpIHtcclxuXHJcbiAgICAgICAgaWYgKHF1ZXJ5SXNWYWxpZCgpKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5sYW5ndWFnZSA9PT0gJ25sJykge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHNlYXJjaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNTZXJ2aWNlLmxvYWQodm0uY29kZSwgdm0ucXVlcnkpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2bS5sYW5ndWFnZSA9PT0gJ2VuJykge1xyXG4gICAgICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy9lbi9zZWFyY2gnKS5zZWFyY2goeyBjb2RlOiB2bS5jb2RlLCBxdWVyeTogdm0ucXVlcnkgfSkucmVwbGFjZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzZWFyY2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zU2VydmljZS5kYXRhLmNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgdGFyaWZlcmluZzogJzwnLFxyXG4gICAgICAgIHF1ZXJ5OiAnPCdcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiB0YXJpZmVyaW5nQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvY29tcG9uZW50cy90YXJpZmVyaW5nLmh0bWwnXHJcbn07XHJcblxyXG50YXJpZmVyaW5nQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRlbGVtZW50JywgXHJcbiAgICAnc2VhcmNoQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc1NlcnZpY2UnLCBcclxuICAgICdsYW5ndWFnZScsXHJcbl07XHJcblxyXG5mdW5jdGlvbiB0YXJpZmVyaW5nQ29udHJvbGxlcihcclxuICAgICRlbGVtZW50LCBcclxuICAgIHNlYXJjaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNTZXJ2aWNlLCBcclxuICAgIGxhbmd1YWdlXHJcbikge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZS5nZXQoKVxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgdGFyaWZlcmluZ0xpbmtzID0gJGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvckFsbCgnYVtkYXRhLXR5cGU9XCJ0YXJpZmVyaW5nXCJdJyk7XHJcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0YXJpZmVyaW5nTGlua3MsIGZ1bmN0aW9uKGxpbmspIHtcclxuICAgICAgICAgICAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGluZyA9IHRoaXMuYXR0cmlidXRlc1snZGF0YS1oZWFkaW5nJ10udmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmlmZXJpbmdOdW1iZXIgPSB0aGlzLmF0dHJpYnV0ZXNbJ2RhdGEtdGFyaWZlcmluZy1udW1iZXInXS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zU2VydmljZS5sb2FkVGFyaWZlcmluZyhoZWFkaW5nLCB0YXJpZmVyaW5nTnVtYmVyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAobmV3VGFyaWZlcmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFyaWZlcmluZy5pc1JlZmVyZW5jZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5yZWZlcmVuY2VkVGFyaWZlcmluZyA9IG5ld1RhcmlmZXJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIDApO1xyXG5cclxuICAgIH1cclxuICAgIHJldHVybiB2bTtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFsnJHVpYk1vZGFsJywgJ2NvbW1vbicsICdkYXRhQ29udGV4dCcsIGVuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTW9kYWxdO1xyXG5cclxuZnVuY3Rpb24gZW5nbGlzaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNNb2RhbCgkdWliTW9kYWwsIGNvbW1vbiwgZGF0YUNvbnRleHQpIHtcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICBnb29kc0NvZGU6IG51bGwsXHJcbiAgICAgICAgc2VhcmNoUXVlcnk6IG51bGwsXHJcbiAgICAgICAgc2hvdzogc2hvd01vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIGVuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTW9kYWxDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAgICAgJyR1aWJNb2RhbEluc3RhbmNlJywgXHJcbiAgICAgICAgJ2dvb2RzQ29kZScsIFxyXG4gICAgICAgICdsYW5ndWFnZScsIFxyXG4gICAgICAgICdzZWFyY2hRdWVyeScsIFxyXG4gICAgICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIFxyXG4gICAgICAgICdzZWFyY2hFbmdsaXNoQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc1NlcnZpY2UnXHJcbiAgICBdO1xyXG5cclxuICAgIGZ1bmN0aW9uIGVuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTW9kYWxDb250cm9sbGVyKFxyXG4gICAgICAgICR1aWJNb2RhbEluc3RhbmNlLCBcclxuICAgICAgICBnb29kc0NvZGUsIFxyXG4gICAgICAgIGxhbmd1YWdlLCBcclxuICAgICAgICBzZWFyY2hRdWVyeSwgXHJcbiAgICAgICAgc3RhdGUsIFxyXG4gICAgICAgIHNlYXJjaEVuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgdmFyIHZtID0ge1xyXG4gICAgICAgICAgICBjYW5jZWw6IGNhbmNlbCxcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc05ldzogW10sXHJcbiAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zT2xkOiBbXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnb29kc0NvZGU6IGdvb2RzQ29kZSxcclxuICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLmdldCgpLFxyXG4gICAgICAgICAgICBsb2FkOiBsb2FkLFxyXG4gICAgICAgICAgICByZWZlcmVuY2VDb3VudHJ5OiBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSxcclxuICAgICAgICAgICAgc2VhcmNoUXVlcnk6IHNlYXJjaFF1ZXJ5XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaW5pdCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdm07XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcclxuICAgICAgICAgICAgbG9hZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbG9hZCgpIHtcclxuICAgICAgICAgICAgaWYgKHZtLmxhbmd1YWdlID09PSAnZW4nKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgY29tbW9uLiRxLmFsbChbXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiBsb2FkQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc05ldygpIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiBsb2FkQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc09sZCgpIH1cclxuICAgICAgICAgICAgICAgIF0pXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbG9hZENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNOZXcoKSB7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2NsYXNzaWZpY2F0aW9ucy9lbi1hZnRlci0yMDEzL3NlYXJjaD9Hb29kc0NvZGU9JyArICh2bS5nb29kc0NvZGUgfHwgJycpO1xyXG4gICAgICAgICAgICBpZiAodm0uc2VhcmNoUXVlcnkpXHJcbiAgICAgICAgICAgICAgICB1cmwgKz0gJyZRdWVyeT0nICsgdm0uc2VhcmNoUXVlcnk7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5kYXRhLmNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNOZXcgPSBjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGxvYWRDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zT2xkKCkge1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJ2NsYXNzaWZpY2F0aW9ucy9lbi1iZWZvcmUtMjAxNC9zZWFyY2g/R29vZHNDb2RlPScgKyAodm0uZ29vZHNDb2RlIHx8ICcnKTtcclxuICAgICAgICAgICAgaWYgKHZtLnNlYXJjaFF1ZXJ5KVxyXG4gICAgICAgICAgICAgICAgdXJsICs9ICcmUXVlcnk9JyArIHZtLnNlYXJjaFF1ZXJ5O1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCkudGhlbihmdW5jdGlvbiAoY2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgdm0uZGF0YS5jbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zT2xkID0gY2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd01vZGFsKGdvb2RzQ29kZSwgc2VhcmNoUXVlcnkpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICBiYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgYmluZFRvQ29udHJvbGxlcjogdHJ1ZSxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogZW5nbGlzaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNNb2RhbENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ2N0cmwnLFxyXG4gICAgICAgICAgICBrZXlib2FyZDogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kYWxGYWRlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICBnb29kc0NvZGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ29vZHNDb2RlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNlYXJjaFF1ZXJ5OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlYXJjaFF1ZXJ5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaXplOiAnbGcnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zL21vZGFscy9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy1lbi5odG1sJyxcclxuICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdtb2RhbC1jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucydcclxuICAgICAgICB9KS5yZXN1bHQuY2F0Y2goZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFsnJHVpYk1vZGFsJywgJ2NvbW1vbicsIGNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNNb2RhbF07XHJcblxyXG5mdW5jdGlvbiBjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTW9kYWwoJHVpYk1vZGFsLCBjb21tb24pIHtcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICBnb29kc0NvZGU6IG51bGwsXHJcbiAgICAgICAgc2VhcmNoUXVlcnk6IG51bGwsXHJcbiAgICAgICAgc2hvdzogc2hvd01vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIGNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNNb2RhbENvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICAgICAnJHVpYk1vZGFsSW5zdGFuY2UnLCBcclxuICAgICAgICAnZ29vZHNDb2RlJywgXHJcbiAgICAgICAgJ2xhbmd1YWdlJywgXHJcbiAgICAgICAgJ3NlYXJjaFF1ZXJ5JywgXHJcbiAgICAgICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgXHJcbiAgICAgICAgJ3NlYXJjaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNTZXJ2aWNlJ1xyXG4gICAgXTtcclxuXHJcbiAgICBmdW5jdGlvbiBjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTW9kYWxDb250cm9sbGVyKFxyXG4gICAgICAgICR1aWJNb2RhbEluc3RhbmNlLCBcclxuICAgICAgICBnb29kc0NvZGUsIFxyXG4gICAgICAgIGxhbmd1YWdlLCBcclxuICAgICAgICBzZWFyY2hRdWVyeSwgXHJcbiAgICAgICAgc3RhdGUsIFxyXG4gICAgICAgIHNlYXJjaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICBkYXRhOiBzZWFyY2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zU2VydmljZS5kYXRhLFxyXG4gICAgICAgICAgICBnb29kc0NvZGU6IGdvb2RzQ29kZSxcclxuICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLmdldCgpLFxyXG4gICAgICAgICAgICBsb2FkOiBsb2FkLFxyXG4gICAgICAgICAgICByZWZlcmVuY2VDb3VudHJ5OiBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSxcclxuICAgICAgICAgICAgc2VhcmNoUXVlcnk6IHNlYXJjaFF1ZXJ5XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdjYW5jZWwnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XHJcbiAgICAgICAgICAgIGxvYWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGxvYWQoKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5sYW5ndWFnZSA9PT0gJ25sJykge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHNlYXJjaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNTZXJ2aWNlLmxvYWQoZ29vZHNDb2RlLCBzZWFyY2hRdWVyeSlcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpbml0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiB2bTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TW9kYWwoZ29vZHNDb2RlLCBzZWFyY2hRdWVyeSkge1xyXG5cclxuICAgICAgICByZXR1cm4gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICBhbmltYXRpb246IHRydWUsXHJcbiAgICAgICAgICAgIGJhY2tkcm9wOiB0cnVlLFxyXG4gICAgICAgICAgICBiaW5kVG9Db250cm9sbGVyOiB0cnVlLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTW9kYWxDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsJyxcclxuICAgICAgICAgICAga2V5Ym9hcmQ6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGFsRmFkZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgZ29vZHNDb2RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvb2RzQ29kZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZWFyY2hRdWVyeTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWFyY2hRdWVyeTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2l6ZTogJ2xnJyxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy9tb2RhbHMvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMuaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMnXHJcbiAgICAgICAgfSkucmVzdWx0LmNhdGNoKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgaWYgKCEocmVzID09PSAnY2FuY2VsJyB8fCByZXMgPT09ICdlc2NhcGUga2V5IHByZXNzJyB8fCByZXMgPT09ICdiYWNrZHJvcCBjbGljaycpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyByZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbW9kYWw7XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBbJyRxJywgJ2RhdGFDb250ZXh0JywgJ2NvbmZpZycsICdsYW5ndWFnZScsICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIHNlYXJjaEVuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zXTtcclxuXHJcbmZ1bmN0aW9uIHNlYXJjaEVuZ2xpc2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zKCRxLCBkYXRhQ29udGV4dCwgY29uZmlnLCBsYW5ndWFnZSwgc3RhdGUpIHtcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc05ldzogW10sXHJcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNPbGQ6IFtdXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2FkOiBsb2FkQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc1xyXG4gICAgfTtcclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zKGdvb2RzQ29kZSwgc2VhcmNoUXVlcnkpIHtcclxuICAgICAgICByZXR1cm4gJHEuYWxsKFtcclxuICAgICAgICAgICAgbG9hZENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNOZXcoZ29vZHNDb2RlLCBzZWFyY2hRdWVyeSksXHJcbiAgICAgICAgICAgIGxvYWRDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zT2xkKGdvb2RzQ29kZSwgc2VhcmNoUXVlcnkpXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNOZXcoZ29vZHNDb2RlLCBzZWFyY2hRdWVyeSkge1xyXG4gICAgICAgIHNlcnZpY2UuZGF0YS5jbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTmV3ID0gW107XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jbGFzc2lmaWNhdGlvbnMvZW4tYWZ0ZXItMjAxMy9zZWFyY2g/R29vZHNDb2RlPScgKyAoZ29vZHNDb2RlIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGUgK1xyXG4gICAgICAgICAgICAnJmxhbmc9JyArIGxhbmd1YWdlLmdldCgpO1xyXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSlcclxuICAgICAgICAgICAgdXJsICs9ICcmUXVlcnk9JyArIHNlYXJjaFF1ZXJ5O1xyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuZGF0YS5jbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTmV3ID0gY2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc09sZChnb29kc0NvZGUsIHNlYXJjaFF1ZXJ5KSB7XHJcbiAgICAgICAgc2VydmljZS5kYXRhLmNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNPbGQgPSBbXTtcclxuICAgICAgICB2YXIgdXJsID0gY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2NsYXNzaWZpY2F0aW9ucy9lbi1iZWZvcmUtMjAxNC9zZWFyY2g/R29vZHNDb2RlPScgKyAoZ29vZHNDb2RlIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGUgK1xyXG4gICAgICAgICAgICAnJmxhbmc9JyArIGxhbmd1YWdlLmdldCgpO1xyXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSlcclxuICAgICAgICAgICAgdXJsICs9ICcmUXVlcnk9JyArIHNlYXJjaFF1ZXJ5O1xyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuZGF0YS5jbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zT2xkID0gY2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0gWydkYXRhQ29udGV4dCcsICdjb25maWcnLCAnbGFuZ3VhZ2UnLCAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCBzZWFyY2hDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zXTtcclxuXHJcbmZ1bmN0aW9uIHNlYXJjaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnMoZGF0YUNvbnRleHQsIGNvbmZpZywgbGFuZ3VhZ2UsIHN0YXRlKSB7XHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnM6IFtdXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2FkOiBsb2FkQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucyxcclxuICAgICAgICBsb2FkVGFyaWZlcmluZzogbG9hZFRhcmlmZXJpbmdcclxuICAgIH07XHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucyhnb29kc0NvZGUsIHNlYXJjaFF1ZXJ5KSB7XHJcbiAgICAgICAgc2VydmljZS5kYXRhLmNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnMgPSBbXTtcclxuICAgICAgICB2YXIgdXJsID0gY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2NsYXNzaWZpY2F0aW9ucy9zZWFyY2g/R29vZHNDb2RlPScgKyAoZ29vZHNDb2RlIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGUgK1xyXG4gICAgICAgICAgICAnJmxhbmc9JyArIGxhbmd1YWdlLmdldCgpO1xyXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSkge1xyXG4gICAgICAgICAgICB1cmwgKz0gJyZRdWVyeT0nICsgc2VhcmNoUXVlcnk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuZGF0YS5jbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zID0gY2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkVGFyaWZlcmluZyhoZWFkaW5nLCB0YXJpZmVyaW5nTnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jbGFzc2lmaWNhdGlvbnMvdGFyaWZlcmluZ2VuLycgKyBoZWFkaW5nICsgJy8nICsgdGFyaWZlcmluZ051bWJlcjtcclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcbn0iLCLvu79hbmd1bGFyLm1vZHVsZSgndGFyaWMuY29tcGxpYW5jZScsIFtdKVxyXG4gICAgLmNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgcm91dGVDb25maWd1cmF0b3JdKVxyXG4gICAgLmNvbXBvbmVudCgnY29tcGxpYW5jZURldGFpbHNQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2NvbXBsaWFuY2UtZGV0YWlscy1wYWdlJykpXHJcbiAgICAuY29tcG9uZW50KCdjb21wbGlhbmNlTmV3UGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jb21wbGlhbmNlLW5ldy1wYWdlJykpXHJcbiAgICAuY29tcG9uZW50KCdjb21wbGlhbmNlT3ZlcnZpZXdQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2NvbXBsaWFuY2Utb3ZlcnZpZXctcGFnZScpKVxyXG4gICAgLmZhY3RvcnkoJ2NvbXBsaWFuY2VEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvY29tcGxpYW5jZS1kYXRhJykpXHJcbiAgICAuZmFjdG9yeSgnY29tcGxpYW5jZUluZm9Nb2RhbCcsIHJlcXVpcmUoJy4vbW9kYWxzL2NvbXBsaWFuY2UtaW5mbycpKVxyXG4gICAgLmZhY3RvcnkoJ2NvbXBsaWFuY2VNb2RhbHNTZXJ2aWNlJywgcmVxdWlyZSgnLi9tb2RhbHMvbW9kYWxzJykpXHJcbiAgICAuZmlsdGVyKCdqb2JTdGF0dXNEaXNwbGF5JywgcmVxdWlyZSgnLi9maWx0ZXJzL2pvYi1zdGF0dXMtZGlzcGxheScpKVxyXG4gICAgO1xyXG5cclxuZnVuY3Rpb24gcm91dGVDb25maWd1cmF0b3IoJHJvdXRlUHJvdmlkZXIpIHtcclxuICAgICRyb3V0ZVByb3ZpZGVyXHJcbiAgICAgICAgLndoZW4oJy9jb21wbGlhbmNlLWNoZWNrJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxjb21wbGlhbmNlLW92ZXJ2aWV3LXBhZ2U+PC9jb21wbGlhbmNlLW92ZXJ2aWV3LXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9jb21wbGlhbmNlLWNoZWNrL25ldycsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8Y29tcGxpYW5jZS1uZXctcGFnZT48L2NvbXBsaWFuY2UtbmV3LXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9jb21wbGlhbmNlLWNoZWNrLzpqb2JJZCcsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8Y29tcGxpYW5jZS1kZXRhaWxzLXBhZ2U+PC9jb21wbGlhbmNlLWRldGFpbHMtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICA7XHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGNvbXBsaWFuY2VEZXRhaWxzQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY29tcGxpYW5jZS9jb21wb25lbnRzL2NvbXBsaWFuY2UtZGV0YWlscy1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG5jb21wbGlhbmNlRGV0YWlsc0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnJHJvdXRlUGFyYW1zJywgXHJcbiAgICAnY29tcGxpYW5jZURhdGFTZXJ2aWNlJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gY29tcGxpYW5jZURldGFpbHNDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkcm91dGVQYXJhbXMsIFxyXG4gICAgY29tcGxpYW5jZURhdGFcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgIGNhbkxvYWRNb3JlOiBmYWxzZSxcclxuICAgICAgICBoYXNFcnJvckNvZGU6IGhhc0Vycm9yQ29kZSxcclxuICAgICAgICBoaWRlTGluZXNXaXRob3V0UmVtYXJrczogZmFsc2UsXHJcbiAgICAgICAgam9iOiBudWxsLFxyXG4gICAgICAgIGpvYkRldGFpbHM6IFtdLFxyXG4gICAgICAgIGpvYklkOiBudWxsLFxyXG4gICAgICAgIGxvYWRNb3JlOiBsb2FkTW9yZSxcclxuICAgICAgICBwYWdlSW5kZXg6IDAsXHJcbiAgICAgICAgcGFnZVNpemU6IDEwMFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL2FiYy1kZXRhaWxzJyk7XHJcbiAgICAgICAgaWYgKCRyb3V0ZVBhcmFtcy5qb2JJZCkge1xyXG4gICAgICAgICAgICB2bS5qb2JEZXRhaWxzID0gW107XHJcbiAgICAgICAgICAgIHZtLmpvYklkID0gcGFyc2VJbnQoJHJvdXRlUGFyYW1zLmpvYklkKTtcclxuICAgICAgICAgICAgdm0ucGFnZUluZGV4ID0gMDtcclxuICAgICAgICAgICAgbG9hZEpvYigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBoYXNFcnJvckNvZGUoZXJyb3JDb2RlcywgbGluZSkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3JDb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoXy5zb21lKGxpbmUuRXJyb3JDb2RlcywgZnVuY3Rpb24gKGVjKSB7IHJldHVybiBlYy5SZXN1bHQgPT09IGVycm9yQ29kZXNbaV07IH0pKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZEpvYigpIHtcclxuICAgICAgICAvLyBUT0RPOiBHZXQgdGhlIGpvYiBpbmZvIGluIGEgbmljZSB3YXksIGRpcmVjdGx5LCBidXQgdGhlIEFQSSBoYXMgdG8gYmUgY2hhbmdlZCB0byBzdXBwb3J0IHRoaXNcclxuICAgICAgICAvLyBGb3Igbm93IHdlIGRvIHRoZSBzdXBlcmZsdW91cyBjYWxsIHRvIGdldCBldmVyeXRoaW5nIGFuZCBwaWNrIHRoZSBqb2IgZnJvbSB0aGVyZVxyXG4gICAgICAgIGNvbXBsaWFuY2VEYXRhLmxvYWRKb2JzKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdm0uam9iID0gXy5maW5kKHJlc3VsdCwgZnVuY3Rpb24gKGopIHsgcmV0dXJuIGouSm9iSWQgPT09IHZtLmpvYklkOyB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbXBsaWFuY2VEYXRhLmdldEpvYkRldGFpbHModm0uam9iSWQsIHZtLnBhZ2VJbmRleCwgdm0ucGFnZVNpemUpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5qb2JEZXRhaWxzID0gdm0uam9iRGV0YWlscy5jb25jYXQoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB2bS5jYW5Mb2FkTW9yZSA9IHZtLnBhZ2VTaXplID09PSBkYXRhLmxlbmd0aDtcclxuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkTW9yZSgpIHtcclxuICAgICAgICB2bS5wYWdlSW5kZXgrKztcclxuICAgICAgICBsb2FkSm9iKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogY29tcGxpYW5jZU5ld0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2NvbXBsaWFuY2UvY29tcG9uZW50cy9jb21wbGlhbmNlLW5ldy1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG5jb21wbGlhbmNlTmV3Q29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckdHJhbnNsYXRlJywgXHJcbiAgICAnY29tbW9uJywgXHJcbiAgICAnY29tcGxpYW5jZURhdGFTZXJ2aWNlJywgXHJcbiAgICAnbGFuZ3VhZ2UnLCBcclxuICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIFxyXG4gICAgJ1VwbG9hZCdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGNvbXBsaWFuY2VOZXdDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkdHJhbnNsYXRlLCBcclxuICAgIGNvbW1vbiwgXHJcbiAgICBjb21wbGlhbmNlRGF0YSwgXHJcbiAgICBsYW5ndWFnZVNlcnZpY2UsIFxyXG4gICAgc3RhdGUsIFxyXG4gICAgZmlsZVVwbG9hZFxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgZXJyb3JzOiBbXSxcclxuICAgICAgICBhcHBTdGF0ZUZpbHRlcjogc3RhdGUuZmlsdGVyLFxyXG4gICAgICAgIGdldEZpbGVEZXRhaWxzOiBnZXRGaWxlRGV0YWlscyxcclxuICAgICAgICBpbnB1dENvbHVtbkNoYW5nZWQ6IGlucHV0Q29sdW1uQ2hhbmdlZCxcclxuICAgICAgICBpc1VwbG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgam9iVGVtcGxhdGVzOiBbXSxcclxuICAgICAgICBqb2JUeXBlQ2hhbmdlZDogam9iVHlwZUNoYW5nZWQsXHJcbiAgICAgICAgam9iVHlwZXM6IFtdLFxyXG4gICAgICAgIG5ld0pvYjoge1xyXG4gICAgICAgICAgICBmaWxlOiBudWxsLFxyXG4gICAgICAgICAgICBpbnB1dENvbHVtbnM6IG51bGwsXHJcbiAgICAgICAgICAgIGpvYlR5cGU6ICcnLFxyXG4gICAgICAgICAgICBtb3ZlbWVudDogJzAnLFxyXG4gICAgICAgICAgICBuYW1lOiBudWxsLFxyXG4gICAgICAgICAgICBvdXRwdXRUeXBlOiAnMicsXHJcbiAgICAgICAgICAgIHN0YXJ0Um93OiB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogMlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzYXZlOiBzYXZlSm9iLFxyXG4gICAgICAgIHNlbGVjdGVkSm9iVHlwZTogbnVsbCxcclxuICAgICAgICBzZWxlY3RlZFRlbXBsYXRlOiBudWxsLFxyXG4gICAgICAgIHRyYW5zbGF0aW9uczogW11cclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgY29tbW9uLmF1dGguY2hlY2soKTtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL2FiYy1uZXcnKTtcclxuICAgICAgICAkdHJhbnNsYXRlKFtcclxuICAgICAgICAgICAgJ2NvbXBsaWFuY2UuZXJyb3JzLnNlbGVjdF9maWxlX3RvX2NoZWNrJywgXHJcbiAgICAgICAgICAgICdjb21wbGlhbmNlLmVycm9ycy5zcGVjaWZ5X2dvb2Rzbm9tX2NvbHVtbicsIFxyXG4gICAgICAgICAgICAnY29tcGxpYW5jZS5lcnJvcnMuaW52YWxpZF9nb29kc25vbV9jb2x1bW4nLCBcclxuICAgICAgICAgICAgJ2NvbXBsaWFuY2UuZXJyb3JzLmludmFsaWRfY291bnRyeV9jb2RlX2NvbHVtbicsIFxyXG4gICAgICAgICAgICAnY29tcGxpYW5jZS5lcnJvcnMuc3BlY2lmeV9zdGFydGluZ19yb3cnLCBcclxuICAgICAgICAgICAgJ2NvbXBsaWFuY2UuZXJyb3JzLmludmFsaWRfc3RhcnRpbmdfcm93JywgXHJcbiAgICAgICAgICAgICdjb21wbGlhbmNlLmVycm9ycy5zcGVjaWZ5X2pvYnR5cGUnXHJcbiAgICAgICAgXSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdm0udHJhbnNsYXRpb25zID0gcmVzdWx0O1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ2V0Sm9iVGVtcGxhdGVzKCk7XHJcbiAgICAgICAgZ2V0Sm9iVHlwZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRGaWxlRGV0YWlscyhlKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZtLm5ld0pvYi5uYW1lID0gZVtpXS5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRKb2JUZW1wbGF0ZXMoKSB7XHJcbiAgICAgICAgY29tcGxpYW5jZURhdGEuZ2V0Sm9iVGVtcGxhdGVzKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZtLmpvYlRlbXBsYXRlcyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uam9iVGVtcGxhdGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zZWxlY3RlZFRlbXBsYXRlID0gdm0uam9iVGVtcGxhdGVzWzBdLklkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRKb2JUeXBlcygpIHtcclxuICAgICAgICBjb21wbGlhbmNlRGF0YS5nZXRKb2JUeXBlcygpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5qb2JUeXBlcyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uam9iVHlwZXMgJiYgdm0uam9iVHlwZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm5ld0pvYi5qb2JUeXBlID0gdm0uam9iVHlwZXNbMF0uSm9iVHlwZTtcclxuICAgICAgICAgICAgICAgICAgICBqb2JUeXBlQ2hhbmdlZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpbnB1dENvbHVtbkNoYW5nZWQoKSB7XHJcbiAgICAgICAgdmFsaWRhdGVJbnB1dENvbHVtbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUlucHV0Q29sdW1ucygpIHtcclxuICAgICAgICBsZXQgbnVtYmVyT2ZWYWxpZGF0aW9uRXJyb3JzID0gMDtcclxuICAgICAgICBsZXQgY29sdW1uTmFtZUNvdW50ID0ge307XHJcbiAgICAgICAgXy5mb3JFYWNoKHZtLm5ld0pvYi5pbnB1dERhdGFUeXBlcywgZnVuY3Rpb24gKGlucHV0RGF0YVR5cGUpIHtcclxuICAgICAgICAgICAgXy5mb3JFYWNoKHZtLm5ld0pvYi5pbnB1dENvbHVtbnNbaW5wdXREYXRhVHlwZV0sIGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUuZXJyb3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZWYWxpZGF0aW9uRXJyb3JzKys7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZXJyb3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdjb2x1bW5OYW1lQ2Fubm90QmVFbXB0eSdcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXZhbHVlLm5hbWUubWF0Y2goL15bYS16QS16XSskLykpIHtcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlZhbGlkYXRpb25FcnJvcnMrKztcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5lcnJvciA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2ludmFsaWRDb2x1bW5OYW1lJ1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gdmFsdWUubmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoL1teQS1aXS9nLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbk5hbWVDb3VudFt2YWx1ZS5uYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVDb3VudFt2YWx1ZS5uYW1lXSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lQ291bnRbdmFsdWUubmFtZV0rKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGR1cGxpY2F0ZUNvbHVtbk5hbWVzID0gXy5jaGFpbihjb2x1bW5OYW1lQ291bnQpXHJcbiAgICAgICAgICAgIC5waWNrQnkoY291bnQgPT4gY291bnQgPiAxKVxyXG4gICAgICAgICAgICAua2V5cygpXHJcbiAgICAgICAgICAgIC52YWx1ZSgpO1xyXG5cclxuICAgICAgICBfLmZvckVhY2godm0ubmV3Sm9iLmlucHV0RGF0YVR5cGVzLCBmdW5jdGlvbiAoaW5wdXREYXRhVHlwZSkge1xyXG4gICAgICAgICAgICBfLmZvckVhY2godm0ubmV3Sm9iLmlucHV0Q29sdW1uc1tpbnB1dERhdGFUeXBlXSwgZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlQ29sdW1uTmFtZXMuaW5kZXhPZih2YWx1ZS5uYW1lKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlZhbGlkYXRpb25FcnJvcnMrKztcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5lcnJvciA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2R1cGxpY2F0ZUNvbHVtbk5hbWUnXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG51bWJlck9mVmFsaWRhdGlvbkVycm9ycztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBqb2JUeXBlQ2hhbmdlZCgpIHtcclxuICAgICAgICB2bS5zZWxlY3RlZEpvYlR5cGUgPSB2bS5qb2JUeXBlcy5maW5kKGp0ID0+IGp0LkpvYlR5cGUgPT09IHZtLm5ld0pvYi5qb2JUeXBlKTtcclxuXHJcbiAgICAgICAgdm0ubmV3Sm9iLmlucHV0RGF0YVR5cGVzID0gXy5jaGFpbih2bS5zZWxlY3RlZEpvYlR5cGUuSW5wdXRDb2x1bW5zKVxyXG4gICAgICAgICAgICAubWFwKGMgPT4gYy5JZClcclxuICAgICAgICAgICAgLnVuaXEoKVxyXG4gICAgICAgICAgICAudmFsdWUoKTtcclxuICAgICAgICB2bS5uZXdKb2IuaW5wdXRDb2x1bW5zID0gXy5jaGFpbih2bS5zZWxlY3RlZEpvYlR5cGUuSW5wdXRDb2x1bW5zKVxyXG4gICAgICAgICAgICAua2V5QnkoYyA9PiBjLklkKVxyXG4gICAgICAgICAgICAubWFwVmFsdWVzKGMgPT4gYy5EZWZhdWx0Q29sdW1uSW5kaWNlc1xyXG4gICAgICAgICAgICAgICAgLm1hcChpID0+ICh7IFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjLkRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbkluZGV4VG9FeGNlbChpKVxyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUoZnJvbVRlbXBsYXRlKSB7XHJcbiAgICAgICAgdm0uZXJyb3JzID0gW107XHJcbiAgICAgICAgaWYgKCF2bS5uZXdKb2IuZmlsZSkge1xyXG4gICAgICAgICAgICB2bS5lcnJvcnMucHVzaCh2bS50cmFuc2xhdGlvbnNbJ2NvbXBsaWFuY2UuZXJyb3JzLnNlbGVjdF9maWxlX3RvX2NoZWNrJ10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFmcm9tVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICghdm0ubmV3Sm9iLnN0YXJ0Um93LnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5lcnJvcnMucHVzaCh2bS50cmFuc2xhdGlvbnNbJ2NvbXBsaWFuY2UuZXJyb3JzLnNwZWNpZnlfc3RhcnRpbmdfcm93J10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCEoJycgKyB2bS5uZXdKb2Iuc3RhcnRSb3cudmFsdWUpLm1hdGNoKC9eWzEtOV1bMC05XSokLykpIHtcclxuICAgICAgICAgICAgICAgIHZtLmVycm9ycy5wdXNoKHZtLnRyYW5zbGF0aW9uc1snY29tcGxpYW5jZS5lcnJvcnMuaW52YWxpZF9zdGFydGluZ19yb3cnXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICBpZiAoIXZtLm5ld0pvYi5qb2JUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5lcnJvcnMucHVzaCh2bS50cmFuc2xhdGlvbnNbJ2NvbXBsaWFuY2UuZXJyb3JzLnNwZWNpZnlfam9idHlwZSddKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG51bWJlck9mRXJyb3JzID0gdm0uZXJyb3JzLmxlbmd0aCArIHZhbGlkYXRlSW5wdXRDb2x1bW5zKCk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gbnVtYmVyT2ZFcnJvcnMgPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2F2ZUpvYigpIHtcclxuICAgICAgICB2YXIgdXNpbmdUZW1wbGF0ZSA9IHZtLnNlbGVjdGVkVGVtcGxhdGUgIT09IG51bGw7XHJcbiAgICAgICAgaWYgKCF2YWxpZGF0ZSh1c2luZ1RlbXBsYXRlKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2bS5pc1VwbG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh2bS5zZWxlY3RlZFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIGNvbXBsaWFuY2VEYXRhLmNyZWF0ZUpvYkZyb21UZW1wbGF0ZSh2bS5zZWxlY3RlZFRlbXBsYXRlKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGpvYlJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVVcGxvYWQudXBsb2FkKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogeyBmaWxlOiB2bS5uZXdKb2IuZmlsZSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogJ0JlYXJlciAnICsgY29tbW9uLmlkZW50aXR5LnRva2VuLnRva2VuVmFsdWUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2NvbXBsaWFuY2Uvam9iLycgKyBqb2JSZXN1bHQuSWQgKyAnL2RvY3VtZW50P3RlbXBsYXRlPScgKyB2bS5zZWxlY3RlZFRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGZpbGVSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0IGxhc3QsIGZpbmFsaXplIHRoZSBqb2JcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsaWFuY2VEYXRhLmZpbmFsaXplSm9iKGpvYlJlc3VsdC5JZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZmluYWxpemVSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLiRsb2NhdGlvbi51cmwoJy9jb21wbGlhbmNlLWNoZWNrJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgdmFyIGpvYiA9IHtcclxuICAgICAgICAgICAgICAgIGpvYlR5cGU6IHZtLm5ld0pvYi5qb2JUeXBlLFxyXG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlU2VydmljZS5nZXQoKSxcclxuICAgICAgICAgICAgICAgIG1vdmVtZW50OiB2bS5uZXdKb2IubW92ZW1lbnQsXHJcbiAgICAgICAgICAgICAgICBvdXRwdXRUeXBlOiBwYXJzZUludCh2bS5uZXdKb2Iub3V0cHV0VHlwZSksXHJcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VDb3VudHJ5OiBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gRmlyc3QgY3JlYXRlIHRoZSBqb2JcclxuICAgICAgICAgICAgY29tcGxpYW5jZURhdGEuY3JlYXRlSm9iKGpvYilcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChqb2JSZXN1bHQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVybEFyZ3MgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdkb2NUeXBlPUV4Y2VsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXJ0aW5nTGluZT0nICsgKHZtLm5ld0pvYi5zdGFydFJvdy52YWx1ZSAtIDEpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnaW5wdXRDb2x1bW5zPScgKyB2bS5uZXdKb2IuaW5wdXREYXRhVHlwZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoaWQgPT4gaWQgKyAnfCcgKyB2bS5uZXdKb2IuaW5wdXRDb2x1bW5zW2lkXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoYyA9PiBleGNlbENvbHVtblRvSW5kZXgoYy5uYW1lKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignLCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmpvaW4oJzsnKSBcclxuICAgICAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vVGhlbiB1cGxvYWQgdGhlIGZpbGVcclxuICAgICAgICAgICAgICAgICAgICBmaWxlVXBsb2FkLnVwbG9hZCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiB2bS5uZXdKb2IuZmlsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogJ0JlYXJlciAnICsgY29tbW9uLmlkZW50aXR5LnRva2VuLnRva2VuVmFsdWUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2NvbXBsaWFuY2Uvam9iLycgKyBqb2JSZXN1bHQuSWQgKyAnL2RvY3VtZW50PycgKyB1cmxBcmdzLmpvaW4oJyYnKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChmaWxlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdCBsYXN0LCBmaW5hbGl6ZSB0aGUgam9iXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGlhbmNlRGF0YS5maW5hbGl6ZUpvYihqb2JSZXN1bHQuSWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGZpbmFsaXplUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi4kbG9jYXRpb24udXJsKCcvY29tcGxpYW5jZS1jaGVjaycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDb252ZXJ0cyBFeGNlbCBjb2x1bW4gbmFtZSB0byB6ZXJvLWJhc2VkIGluZGV4XHJcbiAgICBmdW5jdGlvbiBleGNlbENvbHVtblRvSW5kZXgoY29sdW1uTmFtZSkge1xyXG4gICAgICAgIGNvbHVtbk5hbWUgPSBjb2x1bW5OYW1lLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgbGV0IHN1bSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5OYW1lLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3VtICo9IDI2O1xyXG4gICAgICAgICAgICBzdW0gKz0gKGNvbHVtbk5hbWVbaV0uY2hhckNvZGVBdCgpIC0gJ0EnLmNoYXJDb2RlQXQoKSArIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VtIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb252ZXJ0cyB6ZXJvLWJhc2VkIGluZGV4IHRvIEV4Y2VsIGNvbHVtbiBuYW1lXHJcbiAgICBmdW5jdGlvbiBjb2x1bW5JbmRleFRvRXhjZWwoaW5kZXgpIHtcclxuICAgICAgICBsZXQgY29sdW1uTmFtZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyAoaW5kZXggJSAyNikpO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSAyNikge1xyXG4gICAgICAgICAgICBjb2x1bW5OYW1lID0gU3RyaW5nLmZyb21DaGFyQ29kZSg2NCArIGluZGV4IC8gMjYpICsgY29sdW1uTmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGNvbXBsaWFuY2VPdmVydmlld0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2NvbXBsaWFuY2UvY29tcG9uZW50cy9jb21wbGlhbmNlLW92ZXJ2aWV3LXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbmNvbXBsaWFuY2VPdmVydmlld0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnJGxvY2F0aW9uJywgXHJcbiAgICAnJHRpbWVvdXQnLCBcclxuICAgICckdHJhbnNsYXRlJywgXHJcbiAgICAnY29tbW9uJywgXHJcbiAgICAnY29tcGxpYW5jZURhdGFTZXJ2aWNlJywgXHJcbiAgICAnY29tcGxpYW5jZU1vZGFsc1NlcnZpY2UnLCBcclxuICAgICdub3RpZmljYXRpb25zU2VydmljZScsIFxyXG4gICAgJ3dpZGdldE1vZGFscydcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGNvbXBsaWFuY2VPdmVydmlld0NvbnRyb2xsZXIoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICRsb2NhdGlvbiwgXHJcbiAgICAkdGltZW91dCwgXHJcbiAgICAkdHJhbnNsYXRlLCBcclxuICAgIGNvbW1vbiwgXHJcbiAgICBjb21wbGlhbmNlRGF0YSwgXHJcbiAgICBjb21wbGlhbmNlTW9kYWxzU2VydmljZSwgXHJcbiAgICBub3RpZmljYXRpb25zLFxyXG4gICAgd2lkZ2V0TW9kYWxzXHJcbikge1xyXG5cclxuICAgIHZhciBsb2FkSm9iU3RhdHVzVGltZU91dDtcclxuICAgIHZhciBsb2FkSm9iU3RhdHVzVGltZU91dEhhc0JlZW5DYW5jZWxsZWQ7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIGNhbmNlbEpvYjogY2FuY2VsSm9iLFxyXG4gICAgICAgIGRvd25sb2FkRmlsZTogZG93bmxvYWRGaWxlLFxyXG4gICAgICAgIGpvYnM6IFtdLFxyXG4gICAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIHF1ZXJ5OiB7XHJcbiAgICAgICAgICAgIFBhZ2VOdW1iZXI6IDBcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxvYWRKb2JzOiBsb2FkSm9icyxcclxuICAgICAgICBuZXdKb2I6IG5ld0pvYixcclxuICAgICAgICBwYWdlQ2hhbmdlZDogcGFnZUNoYW5nZWQsXHJcbiAgICAgICAgc2hvd0RldGFpbHM6IHNob3dEZXRhaWxzLFxyXG4gICAgICAgIHNob3dFcnJvcnM6IHNob3dFcnJvcnMsXHJcbiAgICAgICAgc2hvd1dhcm5pbmdzOiBzaG93V2FybmluZ3MsXHJcbiAgICAgICAgdHJhbnNsYXRpb25zOiBudWxsXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvYWJjLW92ZXJ2aWV3Jyk7XHJcbiAgICAgICAgY29tbW9uLmF1dGguY2hlY2soKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbW1vbi5pZGVudGl0eS5oYXNQZXJtaXNzaW9uKCdiZXN0YW5kc2NvbnRyb2xlJykpIHtcclxuICAgICAgICAgICAgbG9hZEpvYnMoMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkdHJhbnNsYXRlKFsnY29tcGxpYW5jZS5zdGF0dXMuY2FuY2VsX3Rhc2tfYXJleW91c3VyZSddKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgdm0udHJhbnNsYXRpb25zID0gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsb2FkSm9iU3RhdHVzVGltZU91dEhhc0JlZW5DYW5jZWxsZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkZXRhY2hlZCgpIHtcclxuICAgICAgICBsb2FkSm9iU3RhdHVzVGltZU91dEhhc0JlZW5DYW5jZWxsZWQgPSB0cnVlO1xyXG4gICAgICAgICR0aW1lb3V0LmNhbmNlbChsb2FkSm9iU3RhdHVzVGltZU91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcGFnZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy5wdWJsaXNoKCdhYmNfcGFnZV9jaGFuZ2VkJyk7XHJcbiAgICAgICAgJHRpbWVvdXQuY2FuY2VsKGxvYWRKb2JTdGF0dXNUaW1lT3V0KTtcclxuICAgICAgICBsb2FkSm9icyh2bS5xdWVyeS5QYWdlTnVtYmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjYW5jZWxKb2Ioam9iSWQpIHtcclxuICAgICAgICB2YXIgbW9kYWxSZWYgPSB3aWRnZXRNb2RhbHMuYXJlWW91U3VyZS5zaG93KHZtLnRyYW5zbGF0aW9uc1snY29tcGxpYW5jZS5zdGF0dXMuY2FuY2VsX3Rhc2tfYXJleW91c3VyZSddKTtcclxuXHJcbiAgICAgICAgbW9kYWxSZWYucmVzdWx0XHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChtb2RhbFJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1vZGFsUmVzdWx0ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxpYW5jZURhdGEuY2FuY2VsSm9iKGpvYklkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkSm9icygxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBmYWxzZSBwb3NpdGl2ZS4gRG9uJ3Qga25vdyB3aHkgYnV0IGl0J3MgYnVpbHQgaW4gbGlrZSB0aGlzIGF0IHRoZSBtb21lbnRcclxuICAgICAgICAgICAgICAgICAgICBjb21wbGlhbmNlRGF0YS5jYW5jZWxKb2Ioam9iSWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRKb2JzKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZG93bmxvYWRGaWxlKGpvYklkKSB7XHJcbiAgICAgICAgd2luZG93Lm9wZW4oY29tbW9uLmNvbmZpZy5hcGlIb3N0c1snZ2VuZXJpYyddICsgJy9jb21wbGlhbmNlL2pvYi8nICsgam9iSWQgKyAnL2Rvd25sb2FkP3Rva2VuPScgKyBlbmNvZGVVUklDb21wb25lbnQoY29tbW9uLmlkZW50aXR5LnRva2VuLnRva2VuVmFsdWUpKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkSm9icyhwYWdlTnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHZtLmxvYWRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdm0ubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgY29tcGxpYW5jZURhdGEubG9hZEpvYnMocGFnZU51bWJlcilcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkSm9iU3RhdHVzVGltZU91dEhhc0JlZW5DYW5jZWxsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2FkSm9iU3RhdHVzVGltZU91dCA9ICR0aW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkSm9icyhwYWdlTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCAxMDAwMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2bS5qb2JzID0gcmVzdWx0XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG5ld0pvYigpIHtcclxuXHJcbiAgICAgICAgJGxvY2F0aW9uLnVybCgnL2NvbXBsaWFuY2UtY2hlY2svbmV3Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0RldGFpbHMoam9iSWQpIHtcclxuICAgICAgICAkbG9jYXRpb24udXJsKCcvY29tcGxpYW5jZS1jaGVjay8nICsgam9iSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dFcnJvcnMoam9iSWQpIHtcclxuICAgICAgICBjb21wbGlhbmNlTW9kYWxzU2VydmljZS5jb21wbGlhbmNlSW5mby5zaG93KGpvYklkKS5yZXN1bHRcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgeyB9LCBmdW5jdGlvbiAoZXJyb3IpIHsgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd1dhcm5pbmdzKGpvYklkKSB7XHJcbiAgICAgICAgY29tcGxpYW5jZU1vZGFsc1NlcnZpY2UuY29tcGxpYW5jZUluZm8uc2hvdyhqb2JJZCkucmVzdWx0XHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsgfSwgZnVuY3Rpb24gKGVycm9yKSB7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFsnY29tbW9uJywgam9iU3RhdHVzRGlzcGxheUZpbHRlcl07XHJcblxyXG5mdW5jdGlvbiBqb2JTdGF0dXNEaXNwbGF5RmlsdGVyKGNvbW1vbikge1xyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIHZhciBjdXJyZW50TGFuZ3VhZ2UgPSBjb21tb24ubGFuZ3VhZ2UuZ2V0KCk7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50TGFuZ3VhZ2UgJiYgY3VycmVudExhbmd1YWdlID09PSAnbmwnKVxyXG4gICAgICAgICAgICByZXR1cm4gZHV0Y2hSZXN1bHQoaW5wdXQpO1xyXG4gICAgICAgIHJldHVybiBlbmdsaXNoUmVzdWx0KGlucHV0KTtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gZHV0Y2hSZXN1bHQoaW5wdXQpIHtcclxuICAgICAgICBzd2l0Y2ggKGlucHV0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnSW5pdGlhbGlzZXJlbic7XHJcbiAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnQWFuZ2VtYWFrdCc7XHJcbiAgICAgICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnS2xhYXIgdm9vciB2ZXJ3ZXJraW5nJztcclxuICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdXb3JkdCB2ZXJ3ZXJrdCc7XHJcbiAgICAgICAgICAgIGNhc2UgNTpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnVm9sdG9vaWQnO1xyXG4gICAgICAgICAgICBjYXNlIDY6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0dlYW5udWxlZXJkJztcclxuICAgICAgICAgICAgY2FzZSA3OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdLbGFhciB2b29yIHVpdHZvZXInO1xyXG4gICAgICAgICAgICBjYXNlIDg6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0tsYWFyIHZvb3IgdmVyd2Vya2luZyc7XHJcbiAgICAgICAgICAgIGNhc2UgMjU1OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdGb3V0JztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZW5nbGlzaFJlc3VsdChpbnB1dCkge1xyXG4gICAgICAgIHN3aXRjaCAoaW5wdXQpIHtcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdJbml0aWFsaXppbmcnO1xyXG4gICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0NyZWF0ZWQnO1xyXG4gICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1JlYWR5IHRvIGJlIHByb2Nlc3NlZCc7XHJcbiAgICAgICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnQmVpbmcgcHJvY2Vzc2VkJztcclxuICAgICAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdDb21wbGV0ZWQnO1xyXG4gICAgICAgICAgICBjYXNlIDY6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0NhbmNlbGxlZCc7XHJcbiAgICAgICAgICAgIGNhc2UgNzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnUmVhZHkgZm9yIGV4cG9ydCc7XHJcbiAgICAgICAgICAgIGNhc2UgODpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnUmVhZHkgdG8gYmUgcHJvZWNlc3NlZCc7XHJcbiAgICAgICAgICAgIGNhc2UgMjU1OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdFcnJvcic7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0gWyckdWliTW9kYWwnLCAnY29tcGxpYW5jZURhdGFTZXJ2aWNlJywgY29tcGxpYW5jZUluZm9Nb2RhbF07XHJcblxyXG5mdW5jdGlvbiBjb21wbGlhbmNlSW5mb01vZGFsKCR1aWJNb2RhbCwgY29tcGxpYW5jZURhdGEpIHtcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICBzaG93OiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgY29tcGxpYW5jZUluZm9Nb2RhbC4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICdqb2JJZCddO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBsaWFuY2VJbmZvTW9kYWxDb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlLCBqb2JJZCkge1xyXG5cclxuICAgICAgICB2YXIgY3RybENvbXBsaWFuY2VJbmZvTW9kYWwgPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICBqb2JJZDogam9iSWQsXHJcbiAgICAgICAgICAgIHdhcm5pbmdzOiBbXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAkKFwiLnBhZ2UtZGFzaGJvYXJkLCAudGFyaWMtcGFnZS1jb250ZW50XCIpLnJlbW92ZUNsYXNzKFwibm9wcmludFwiKTtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygnY2FuY2VsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBsb2FkSW5mbygpIHtcclxuICAgICAgICAgICAgY3RybENvbXBsaWFuY2VJbmZvTW9kYWwuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29tcGxpYW5jZURhdGEuZ2V0Sm9iTG9ncyhjdHJsQ29tcGxpYW5jZUluZm9Nb2RhbC5qb2JJZClcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjdHJsQ29tcGxpYW5jZUluZm9Nb2RhbC53YXJuaW5ncyA9IF8ubWFwKF8uZmlsdGVyKHJlc3VsdCwgZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYuTWVzc2FnZUNvZGUgIT09ICdjb2RlX2ZvdW5kJzsgfSksIGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbS5Mb2dUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5Dc3NDbGFzcyA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uTG9nVHlwZURpc3BsYXkgPSAnTm90IHNldCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5Dc3NDbGFzcyA9ICdkYW5nZXInO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uTG9nVHlwZURpc3BsYXkgPSAnU3lzdGVtIGVycm9yJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLkNzc0NsYXNzID0gJ2luZm8nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uTG9nVHlwZURpc3BsYXkgPSAnSW5mbyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5Dc3NDbGFzcyA9ICd3YXJuaW5nJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLkxvZ1R5cGVEaXNwbGF5ID0gJ1dhcm5pbmcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uQ3NzQ2xhc3MgPSAnZGFuZ2VyJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLkxvZ1R5cGVEaXNwbGF5ID0gJ0NvbnRlbnQgZXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uQ3NzQ2xhc3MgPSAnZGFuZ2VyJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLkxvZ1R5cGVEaXNwbGF5ID0gJ1VzZXIgZXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBjdHJsQ29tcGxpYW5jZUluZm9Nb2RhbC5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9hZEluZm8oKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGN0cmxDb21wbGlhbmNlSW5mb01vZGFsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChqb2JJZCkge1xyXG5cclxuICAgICAgICByZXR1cm4gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICBhbmltYXRpb246IHRydWUsXHJcbiAgICAgICAgICAgIGJhY2tkcm9wOiB0cnVlLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBjb21wbGlhbmNlSW5mb01vZGFsQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAnY3RybENvbXBsaWFuY2VJbmZvTW9kYWwnLFxyXG4gICAgICAgICAgICBrZXlib2FyZDogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kYWxGYWRlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICBqb2JJZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqb2JJZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2l6ZTogJ2xnJyxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb21wbGlhbmNlL21vZGFscy9jb21wbGlhbmNlLWluZm8uaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtd2lkZSdcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbW9kYWw7XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJ2NvbXBsaWFuY2VJbmZvTW9kYWwnLCBjb21wbGlhbmNlTW9kYWxzU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBjb21wbGlhbmNlTW9kYWxzU2VydmljZShjb21wbGlhbmNlSW5mb01vZGFsKSB7XHJcblxyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgY29tcGxpYW5jZUluZm86IGNvbXBsaWFuY2VJbmZvTW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0gWydjb21tb24nLCAnZGF0YUNvbnRleHQnLCAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCBjb21wbGlhbmNlRGF0YVNlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gY29tcGxpYW5jZURhdGFTZXJ2aWNlKGNvbW1vbiwgZGF0YUNvbnRleHQsIHN0YXRlKSB7XHJcblxyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgcmVzdWx0OiB7fSxcclxuICAgICAgICBjYW5jZWxKb2I6IGNhbmNlbEpvYixcclxuICAgICAgICBjcmVhdGVKb2I6IGNyZWF0ZUpvYixcclxuICAgICAgICBjcmVhdGVKb2JGcm9tVGVtcGxhdGU6IGNyZWF0ZUpvYkZyb21UZW1wbGF0ZSxcclxuICAgICAgICBmaW5hbGl6ZUpvYjogZmluYWxpemVKb2IsXHJcbiAgICAgICAgZ2V0Sm9iRGV0YWlsczogZ2V0Sm9iRGV0YWlscyxcclxuICAgICAgICBnZXRKb2JFcnJvcnM6IGdldEpvYkVycm9ycyxcclxuICAgICAgICBnZXRKb2JMb2dzOiBnZXRKb2JMb2dzLFxyXG4gICAgICAgIGdldEpvYlRlbXBsYXRlczogZ2V0Sm9iVGVtcGxhdGVzLFxyXG4gICAgICAgIGdldEpvYlR5cGVzOiBnZXRKb2JUeXBlcyxcclxuICAgICAgICBnZXRKb2JXYXJuaW5nczogZ2V0Sm9iV2FybmluZ3MsXHJcbiAgICAgICAgbG9hZEpvYnM6IGxvYWRKb2JzXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGNhbmNlbEpvYihqb2JJZCkge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG5cclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jb21wbGlhbmNlL2pvYi8nICsgam9iSWQgKyAnL2NhbmNlbCc7XHJcblxyXG4gICAgICAgIGRhdGFDb250ZXh0LnBvc3QodXJsLCB7fSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjcmVhdGVKb2Ioam9iKSB7XHJcbiAgICAgICAgdmFyIGRlZmVycmVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2NvbXBsaWFuY2Uvam9iJztcclxuXHJcbiAgICAgICAgZGF0YUNvbnRleHQucG9zdCh1cmwsIGpvYilcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjcmVhdGVKb2JGcm9tVGVtcGxhdGUodGVtcGxhdGVJZCkge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG5cclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jb21wbGlhbmNlL2pvYj90ZW1wbGF0ZT0nICsgdGVtcGxhdGVJZDtcclxuXHJcbiAgICAgICAgZGF0YUNvbnRleHQucG9zdCh1cmwsIHt9KVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZpbmFsaXplSm9iKGpvYklkKSB7XHJcbiAgICAgICAgdmFyIGRlZmVycmVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2NvbXBsaWFuY2Uvam9iLycgKyBqb2JJZCArICcvZmluYWxpemUnO1xyXG5cclxuICAgICAgICBkYXRhQ29udGV4dC5wb3N0KHVybCwge30pXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Sm9iRGV0YWlscyhqb2JJZCwgcGFnZUluZGV4LCBwYWdlU2l6ZSkge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2NvbXBsaWFuY2Uvam9iLycgKyBqb2JJZCArICcvZGV0YWlscz9waW5kZXg9JyArIHBhZ2VJbmRleCArICcmcHNpemU9JyArIHBhZ2VTaXplO1xyXG5cclxuICAgICAgICBkYXRhQ29udGV4dC5nZXQodXJsKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEpvYkVycm9ycyhqb2JJZCkge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG5cclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jb21wbGlhbmNlL2pvYi8nICsgam9iSWQgKyAnL2Vycm9yJztcclxuXHJcbiAgICAgICAgZGF0YUNvbnRleHQuZ2V0KHVybClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRKb2JMb2dzKGpvYklkKSB7XHJcbiAgICAgICAgdmFyIGRlZmVycmVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2NvbXBsaWFuY2Uvam9iLycgKyBqb2JJZCArICcvbG9nJztcclxuXHJcbiAgICAgICAgZGF0YUNvbnRleHQuZ2V0KHVybClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRKb2JUZW1wbGF0ZXMoKSB7XHJcbiAgICAgICAgdmFyIGRlZmVycmVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2NvbXBsaWFuY2UvdGVtcGxhdGUnO1xyXG5cclxuICAgICAgICBkYXRhQ29udGV4dC5nZXQodXJsKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEpvYlR5cGVzKCkge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG5cclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jb21wbGlhbmNlL2pvYnR5cGVzP3JlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5O1xyXG5cclxuICAgICAgICBkYXRhQ29udGV4dC5nZXQodXJsKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEpvYldhcm5pbmdzKGpvYklkKSB7XHJcbiAgICAgICAgdmFyIGRlZmVycmVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2NvbXBsaWFuY2Uvam9iLycgKyBqb2JJZCArICcvd2FybmluZyc7XHJcblxyXG4gICAgICAgIGRhdGFDb250ZXh0LmdldCh1cmwpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZEpvYnMocGFnZU51bWJlcikge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG4gICAgICAgIHZhciBwYWdlSW5kZXggPSBwYWdlTnVtYmVyIC0gMTtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jb21wbGlhbmNlL2pvYi9zdGF0dXM/cHNpemU9MjAmcGluZGV4PScgKyBwYWdlSW5kZXg7XHJcblxyXG4gICAgICAgIGRhdGFDb250ZXh0LmdldCh1cmwpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2UucmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxufVxyXG4iLCJhbmd1bGFyLm1vZHVsZSgndGFyaWMnKVxyXG4gICAgLmNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgcm91dGVDb25maWd1cmF0b3JdKVxyXG4gICAgLmNvbmZpZyhbJyR0cmFuc2xhdGVQcm92aWRlcicsIHRyYW5zbGF0aW9uQ29uZmlndXJhdG9yXSlcclxuICAgIC52YWx1ZSgnY29uZmlnJywge1xyXG4gICAgICAgIGFwaUhvc3RzOiB7XHJcbiAgICAgICAgICAgIGF1dGg6ICcvYXV0aCcsXHJcbiAgICAgICAgICAgIGdlbmVyaWM6ICcvZ2VuZXJpY2FwaScsXHJcbiAgICAgICAgICAgIGR0djogJy9kdHZhcGknLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYXBwbGljYXRpb25LZXk6ICc2OUJBNDI1MTAzNDQ0ODEyQkJGODNDMjc2QzVBQkM3NCcsXHJcbiAgICAgICAgYXBwbGljYXRpb25TZWNyZXQ6ICc5QjlBMUI1Qjc4NjU0NkQ1OEYwNTY5N0IwNTNEQjVGQScsXHJcbiAgICAgICAgY3VycmVudEFwaTogJ2R0dicsXHJcbiAgICAgICAgdmVyc2lvbjogMi40XHJcbiAgICB9KVxyXG4gICAgLnJ1bihbJyRsb2NhdGlvbicsICckcm9vdFNjb3BlJywgJ2NvbmZpZycsICdpZGVudGl0eScsIGF1dGhlbnRpY2F0ZVJvdXRlc10pO1xyXG5cclxuZnVuY3Rpb24gbG9jYXRpb25Db25maWd1cmF0b3IoJGxvY2F0aW9uUHJvdmlkZXIpIHtcclxuICAgIC8vJGxvY2F0aW9uUHJvdmlkZXIuaHRtbDVNb2RlKHRydWUpLmhhc2hwcmVmaXgoJycpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL3Rlc3QnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnd2lkZ2V0cy90ZXN0Lmh0bWwnXHJcbiAgICAgICAgfSlcclxuICAgICAgICAub3RoZXJ3aXNlKHtcclxuICAgICAgICAgICAgcmVkaXJlY3RUbzogJy9zZWN0aW9ucydcclxuICAgICAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdG9hc3RDb25maWcodG9hc3RyQ29uZmlnKSB7XHJcbiAgICBfLmV4dGVuZCh0b2FzdHJDb25maWcsIHtcclxuICAgICAgICBwb3NpdGlvbkNsYXNzOiAndG9hc3QtYm90dG9tLXJpZ2h0JyxcclxuICAgICAgICB0aW1lT3V0OiAyNTAwXHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdHJhbnNsYXRpb25Db25maWd1cmF0b3IoJHRyYW5zbGF0ZVByb3ZpZGVyKSB7XHJcbiAgICB2YXIgZGVmYXVsdExhbmd1YWdlID0gJ2VuJztcclxuICAgIHZhciB0cmFuc2xhdGlvbnNfZW4gPSByZXF1aXJlKCcuL3RyYW5zbGF0aW9ucy9lbi9faW5kZXgnKTtcclxuICAgIHZhciB0cmFuc2xhdGlvbnNfaXQgPSByZXF1aXJlKCcuL3RyYW5zbGF0aW9ucy9pdC9faW5kZXgnKTtcclxuICAgIHZhciB0cmFuc2xhdGlvbnNfbmwgPSByZXF1aXJlKCcuL3RyYW5zbGF0aW9ucy9ubC9faW5kZXgnKTtcclxuXHJcbiAgICAkdHJhbnNsYXRlUHJvdmlkZXJcclxuICAgICAgICAudHJhbnNsYXRpb25zKCdlbicsIHRyYW5zbGF0aW9uc19lbilcclxuICAgICAgICAudHJhbnNsYXRpb25zKCdpdCcsIHRyYW5zbGF0aW9uc19pdClcclxuICAgICAgICAudHJhbnNsYXRpb25zKCdubCcsIHRyYW5zbGF0aW9uc19ubClcclxuICAgICAgICAucHJlZmVycmVkTGFuZ3VhZ2UoZGVmYXVsdExhbmd1YWdlKVxyXG4gICAgICAgIC5mYWxsYmFja0xhbmd1YWdlKGRlZmF1bHRMYW5ndWFnZSlcclxuICAgICAgICAudXNlU2FuaXRpemVWYWx1ZVN0cmF0ZWd5KG51bGwpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhdXRoZW50aWNhdGVSb3V0ZXMoJGxvY2F0aW9uLCAkcm9vdFNjb3BlLCBjb25maWcsIGlkZW50aXR5KSB7XHJcbiAgICAkcm9vdFNjb3BlLiRvbihcIiRsb2NhdGlvbkNoYW5nZVN0YXJ0XCIsIGZ1bmN0aW9uIChldmVudCwgbmV4dCwgY3VycmVudCkge1xyXG4gICAgICAgIGlmIChpZGVudGl0eS5pc0F1dGhlbnRpY2F0ZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdmFyIHVuYXV0aGVudGljYXRlZFJvdXRlcyA9IFtcclxuICAgICAgICAgICAgJy9hY2NvdW50L2xvZ2luJyxcclxuICAgICAgICAgICAgJy9hY2NvdW50L2ZvcmdvdC1wYXNzd29yZCcsXHJcbiAgICAgICAgICAgICcvYWNjb3VudC9yZXF1ZXN0LXBhc3N3b3JkJyxcclxuICAgICAgICAgICAgJy9hY2NvdW50L3Jlc2V0LXBhc3N3b3JkJyxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB2YXIgbG9jYXRpb25Ub0NoZWNrID0gJGxvY2F0aW9uLnBhdGgoKTtcclxuXHJcbiAgICAgICAgaWYgKHVuYXV0aGVudGljYXRlZFJvdXRlcy5pbmRleE9mKGxvY2F0aW9uVG9DaGVjaykgPiAtMSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB2YXIgcGF0aCA9ICRsb2NhdGlvbi5wYXRoKCk7XHJcbiAgICAgICAgaWYgKHBhdGggPT09ICcvYWNjb3VudC9sb2dvdXQnIHx8IHBhdGggPT09ICcvJyB8fCBwYXRoID09PSAnJykge1xyXG4gICAgICAgICAgICAkbG9jYXRpb24udXJsKCcvYWNjb3VudC9sb2dpbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgJGxvY2F0aW9uLnVybCgnL2FjY291bnQvbG9naW4/cmVkaXJlY3Q9JyArICRsb2NhdGlvbi5wYXRoKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfSk7XHJcbn1cclxuIiwi77u/YW5ndWxhci5tb2R1bGUoJ3RhcmljLmNvcmUnLCBbXSlcclxuICAgIC8vIGNvbnRyb2xsZXJzXHJcbiAgICAuY29udHJvbGxlcigncHJlbG9hZGVyQ29udHJvbGxlcicsIHJlcXVpcmUoJy4vY29udHJvbGxlcnMvcHJlbG9hZGVyJykpXHJcbiAgICAvLyBkaXJlY3RpdmVzXHJcbiAgICAuZGlyZWN0aXZlKCdjb252ZXJ0VG9OdW1iZXInLCByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvY29udmVydC10by1udW1iZXInKSlcclxuICAgIC5kaXJlY3RpdmUoJ2hhc1Blcm1pc3Npb24nLCByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvaGFzLXBlcm1pc3Npb24nKSlcclxuICAgIC5kaXJlY3RpdmUoJ25nRW50ZXInLCByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvbmctZW50ZXInKSlcclxuICAgIC5kaXJlY3RpdmUoJ3JlcGVhdERlbGltaXRlcicsIHJlcXVpcmUoJy4vZGlyZWN0aXZlcy9yZXBlYXQtZGVsaW1pdGVyJykpXHJcbiAgICAuZGlyZWN0aXZlKCdzY3JvbGxUb1RvcFdoZW4nLCByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvc2Nyb2xsLXRvLXRvcC13aGVuJykpXHJcbiAgICAvLyBmaWx0ZXJzXHJcbiAgICAvLyBzZXJ2aWNlcy5jb21tb25cclxuICAgIC5mYWN0b3J5KCdjb21tb24nLCByZXF1aXJlKCcuL3NlcnZpY2VzLmNvbW1vbi9jb21tb24nKSlcclxuICAgIC5mYWN0b3J5KCdhdXRoQ2hlY2tTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy5jb21tb24vYXV0aC1jaGVjaycpKVxyXG4gICAgLmZhY3RvcnkoJ2Zvcm1hdHRpbmcnLCByZXF1aXJlKCcuL3NlcnZpY2VzLmNvbW1vbi9mb3JtYXR0aW5nJykpXHJcbiAgICAuZmFjdG9yeSgnaWRlbnRpdHknLCByZXF1aXJlKCcuL3NlcnZpY2VzLmNvbW1vbi9pZGVudGl0eScpKVxyXG4gICAgLmZhY3RvcnkoJ2ludGVyYWN0aW9uU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMuY29tbW9uL2ludGVyYWN0aW9uJykpXHJcbiAgICAuZmFjdG9yeSgnbGFuZ3VhZ2UnLCByZXF1aXJlKCcuL3NlcnZpY2VzLmNvbW1vbi9sYW5ndWFnZScpKVxyXG4gICAgLmZhY3RvcnkoJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy5jb21tb24vbm90aWZpY2F0aW9ucycpKVxyXG4gICAgLmZhY3RvcnkoJ3ByZWxvYWRlclNlcnZpY2UnLCByZXF1aXJlKCcuL3NlcnZpY2VzLmNvbW1vbi9wcmVsb2FkZXInKSlcclxuICAgIC5mYWN0b3J5KCd2ZXJzaW9uSGlzdG9yeVNlcnZpY2UnLCByZXF1aXJlKCcuL3NlcnZpY2VzLmNvbW1vbi92ZXJzaW9uLWhpc3RvcnknKSlcclxuICAgIC8vIHNlcnZpY2VzLmRhdGFcclxuICAgIC5mYWN0b3J5KCdkYXRhQ29udGV4dCcsIHJlcXVpcmUoJy4vc2VydmljZXMuZGF0YS9kYXRhLWNvbnRleHQnKSlcclxuICAgIC5mYWN0b3J5KCdwcmVmZXJlbmNlU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMuZGF0YS9wcmVmZXJlbmNlcycpKVxyXG4gICAgLmZhY3RvcnkoJ3NlcmlhbGl6YXRpb25TZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy5kYXRhL3NlcmlhbGl6YXRpb24nKSlcclxuICAgIC5mYWN0b3J5KCdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMuc3RhdGUvYXBwbGljYXRpb24tc3RhdGUnKSlcclxuICAgIFxyXG4gICAgLy8gZXJyb3IgaGFuZGxpbmdcclxuICAgIC5mYWN0b3J5KCdlcnJvckhhbmRsaW5nU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMuY29tbW9uL2Vycm9yLWhhbmRsaW5nJykpXHJcbiAgICAuY29uZmlnKFsnJGh0dHBQcm92aWRlcicsIGZ1bmN0aW9uKCRodHRwUHJvdmlkZXIpIHtcclxuICAgICAgICAkaHR0cFByb3ZpZGVyLmludGVyY2VwdG9ycy5wdXNoKCdlcnJvckhhbmRsaW5nU2VydmljZScpO1xyXG4gICAgfV0pXHJcbjtcclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJ2lkZW50aXR5JywgJ3ByZWxvYWRlclNlcnZpY2UnLCBwcmVsb2FkZXJDdHJsXTtcclxuXHJcbmZ1bmN0aW9uIHByZWxvYWRlckN0cmwoaWRlbnRpdHlTZXJ2aWNlLCBwcmVsb2FkZXJTZXJ2aWNlKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eVNlcnZpY2UsXHJcbiAgICAgICAgc3RhdHVzOiBwcmVsb2FkZXJTZXJ2aWNlLnN0YXR1c1xyXG4gICAgfTtcclxuXHJcbiAgICBwcmVsb2FkZXJTZXJ2aWNlLmluaXQoKTtcclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFtjb252ZXJ0VG9OdW1iZXJEaXJlY3RpdmVdO1xyXG5cclxuZnVuY3Rpb24gY29udmVydFRvTnVtYmVyRGlyZWN0aXZlKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICByZXF1aXJlOiAnbmdNb2RlbCcsXHJcbiAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycywgbmdNb2RlbCkge1xyXG4gICAgICAgICAgICBuZ01vZGVsLiRwYXJzZXJzLnB1c2goZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFsID0gcmVwbGFjZUNvbW1hQnlEb3QodmFsKTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOdW1lcmljT3JOdW1iZXIodmFsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlRmxvYXQodmFsLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh2YWwsIHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAvLyBuZ01vZGVsLiRzZXRWaWV3VmFsdWUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIC8vIG5nTW9kZWwuJHJlbmRlcigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG5nTW9kZWwuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbiAodmFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZURvdEJ5Q29tbWEoJycgKyB2YWwpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiByZXBsYWNlQ29tbWFCeURvdChzdHIpIHtcclxuICAgIGlmICghc3RyKSB7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2Ygc3RyICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvLC9nLCAnLicpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVEb3Qoc3RyKSB7XHJcbiAgICBpZiAoIXN0cikge1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcLi9nLCAnJyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcGxhY2VEb3RCeUNvbW1hKHN0cikge1xyXG4gICAgaWYgKCFzdHIpIHtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXC4vZywgJywnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNOdW1lcmljT3JOdW1iZXIoaW5wdXQpIHtcclxuICAgIHJldHVybiBfLmlzTnVtYmVyKGlucHV0KSB8fCBpc051bWVyaWMoaW5wdXQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc051bWVyaWMoc3RyKSB7XHJcbiAgICBpZiAodHlwZW9mIHN0ciAhPSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgXHJcbiAgICB9XHJcbiAgICByZXR1cm4gIWlzTmFOKHN0cikgJiYgLy8gdXNlIHR5cGUgY29lcmNpb24gdG8gcGFyc2UgdGhlIF9lbnRpcmV0eV8gb2YgdGhlIHN0cmluZyAoYHBhcnNlRmxvYXRgIGFsb25lIGRvZXMgbm90IGRvIHRoaXMpLi4uXHJcbiAgICAgICAgICAgIWlzTmFOKHBhcnNlRmxvYXQoc3RyKSk7IC8vIC4uLmFuZCBlbnN1cmUgc3RyaW5ncyBvZiB3aGl0ZXNwYWNlIGZhaWxcclxufVxyXG4iLCLvu792YXIganNlcCA9IHJlcXVpcmUoJ2pzZXAnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gWydjb21tb24nLCAnbmdJZkRpcmVjdGl2ZScsIGhhc1Blcm1pc3Npb25EaXJlY3RpdmVdO1xyXG5cclxuZnVuY3Rpb24gaGFzUGVybWlzc2lvbkRpcmVjdGl2ZShjb21tb24sIG5nSWZEaXJlY3RpdmUpIHtcclxuICAgIHZhciBuZ0lmID0gbmdJZkRpcmVjdGl2ZVswXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHRyYW5zY2x1ZGU6IG5nSWYudHJhbnNjbHVkZSxcclxuICAgICAgICBwcmlvcml0eTogbmdJZi5wcmlvcml0eSAtIDEsXHJcbiAgICAgICAgdGVybWluYWw6IG5nSWYudGVybWluYWwsXHJcbiAgICAgICAgcmVzdHJpY3Q6IG5nSWYucmVzdHJpY3QsXHJcbiAgICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5pdGlhbCBuZy1pZiBhdHRyaWJ1dGVcclxuICAgICAgICAgICAgdmFyIGluaXRpYWxOZ0lmID0gYXR0cmlidXRlcy5uZ0lmLCBpZkV2YWx1YXRvcjtcclxuICAgICAgICAgICAgLy8gaWYgaXQgZXhpc3RzLCBldmFsdWF0ZXMgbmdJZiAmJiBpZkF1dGhlbnRpY2F0ZWRcclxuICAgICAgICAgICAgaWYgKGluaXRpYWxOZ0lmKSB7XHJcbiAgICAgICAgICAgICAgICBpZkV2YWx1YXRvciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NvcGUuJGV2YWwoaW5pdGlhbE5nSWYpICYmIHNob3VsZFNob3dFbGVtZW50KGF0dHJpYnV0ZXMuaGFzUGVybWlzc2lvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGlmIHRoZXJlJ3Mgbm8gbmctaWYsIHByb2Nlc3Mgbm9ybWFsbHlcclxuICAgICAgICAgICAgICAgIGlmRXZhbHVhdG9yID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaG91bGRTaG93RWxlbWVudChhdHRyaWJ1dGVzLmhhc1Blcm1pc3Npb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMubmdJZiA9IGlmRXZhbHVhdG9yO1xyXG4gICAgICAgICAgICBuZ0lmLmxpbmsuYXBwbHkobmdJZiwgYXJndW1lbnRzKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvLyByZXR1cm4ge1xyXG4gICAgLy8gICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcclxuICAgIC8vICAgICAgICAgdmFyIHNob3cgPSBmYWxzZTtcclxuICAgIC8vICAgICAgICAgaWYgKGF0dHJzICYmIGF0dHJzLmhhc1Blcm1pc3Npb24pIHtcclxuICAgIC8vICAgICAgICAgICAgIC8vIEpTRVAgaW50ZXJwcmV0cyBhIGh5cGhlbiAtIGFzIGFuIG9wZXJhdG9yLCBzbyB3ZSByZXBsYWNlIGl0IGJ5IHRoZSBzdHJpbmcgJ0hZUEhFTidcclxuICAgIC8vICAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gYXR0cnMuaGFzUGVybWlzc2lvbi5yZXBsYWNlKC8tL2csICdIWVBIRU4nKTtcclxuICAgIC8vICAgICAgICAgICAgIHNob3cgPSBldmFsdWF0ZVBlcm1pc3Npb25FeHByZXNzaW9uVHJlZShqc2VwKGV4cHJlc3Npb24pKTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgZWxlbWVudC5yZW1vdmVDbGFzcygnbmctaGlkZScpO1xyXG4gICAgLy8gICAgICAgICBpZiAoIXNob3cpXHJcbiAgICAvLyAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCduZy1oaWRlJyk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfTtcclxuXHJcbiAgICBmdW5jdGlvbiBzaG91bGRTaG93RWxlbWVudChoYXNQZXJtaXNzaW9uKSB7XHJcbiAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBoYXNQZXJtaXNzaW9uLnJlcGxhY2UoLy0vZywgJ0hZUEhFTicpO1xyXG4gICAgICAgIHJldHVybiBldmFsdWF0ZVBlcm1pc3Npb25FeHByZXNzaW9uVHJlZShqc2VwKGV4cHJlc3Npb24pKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBldmFsdWF0ZVBlcm1pc3Npb25FeHByZXNzaW9uVHJlZSh0cmVlKSB7XHJcbiAgICAgICAgaWYgKHRyZWUudHlwZSA9PT0gJ0xpdGVyYWwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cmVlLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHJlZS50eXBlID09ICdCaW5hcnlFeHByZXNzaW9uJykge1xyXG4gICAgICAgICAgICBpZiAodHJlZS5vcGVyYXRvciA9PT0gJyYmJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlUGVybWlzc2lvbkV4cHJlc3Npb25UcmVlKHRyZWVbJ2xlZnQnXSkgJiYgZXZhbHVhdGVQZXJtaXNzaW9uRXhwcmVzc2lvblRyZWUodHJlZVsncmlnaHQnXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodHJlZS5vcGVyYXRvciA9PT0gJ3x8Jykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlUGVybWlzc2lvbkV4cHJlc3Npb25UcmVlKHRyZWVbJ2xlZnQnXSkgfHwgZXZhbHVhdGVQZXJtaXNzaW9uRXhwcmVzc2lvblRyZWUodHJlZVsncmlnaHQnXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRyZWUudHlwZSA9PT0gJ1VuYXJ5RXhwcmVzc2lvbicpIHtcclxuICAgICAgICAgICAgaWYgKHRyZWUub3BlcmF0b3IgPT09ICchJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFldmFsdWF0ZVBlcm1pc3Npb25FeHByZXNzaW9uVHJlZSh0cmVlLmFyZ3VtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHJlZS50eXBlID09PSAnSWRlbnRpZmllcicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbW1vbi5pZGVudGl0eS5oYXNQZXJtaXNzaW9uKHRyZWUubmFtZSkgfHwgY29tbW9uLmlkZW50aXR5Lmhhc1Blcm1pc3Npb24odHJlZS5uYW1lLnJlcGxhY2UoL0hZUEhFTi9nLCAnLScpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVW5leHBlY3RlZCBub2RlIHBhcnNlZCAoVE9ETzogc2VuZCBlcnJvciB0byBTZW50cnkpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFtuZ0VudGVyRGlyZWN0aXZlXTtcclxuXHJcbmZ1bmN0aW9uIG5nRW50ZXJEaXJlY3RpdmUoKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xyXG4gICAgICAgIGVsZW1lbnQuYmluZChcImtleWRvd24ga2V5cHJlc3NcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmKGV2ZW50LndoaWNoID09PSAxMykge1xyXG4gICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpe1xyXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLiRldmFsKGF0dHJzLm5nRW50ZXIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0gW3JlcGVhdERlbGltaXRlckRpcmVjdGl2ZV07XHJcblxyXG5mdW5jdGlvbiByZXBlYXREZWxpbWl0ZXJEaXJlY3RpdmUoKSB7XHJcbiAgICAvLyBJIGNvbXBpbGUgdGhlIGxpc3QsIGluamVjdGluZyBpbiB0aGUgY29uZGl0aW9uYWxseVxyXG4gICAgLy8gdmlzaWJsZSBkZWxpbWl0ZXIgb250byB0aGUgZW5kIG9mIHRoZSB0ZW1wbGF0ZS5cclxuICAgIGZ1bmN0aW9uIGNvbXBpbGUoZWxlbWVudCwgYXR0cmlidXRlcykge1xyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIGRlbGltaXRlciB0aGF0IGdvZXMgYmV0d2VlbiBlYWNoIGl0ZW0uXHJcbiAgICAgICAgdmFyIGRlbGltaXRlciA9IChhdHRyaWJ1dGVzLnJlcGVhdERlbGltaXRlciB8fCBcIiwgXCIpO1xyXG5cclxuICAgICAgICAvLyBUaGUgZGVsaW1pdGVyIHdpbGwgc2hvdyBvbiBhbGwgQlVUIHRoZSBsYXN0XHJcbiAgICAgICAgLy8gaXRlbSBpbiB0aGUgbGlzdC5cclxuICAgICAgICB2YXIgZGVsaW1pdGVySHRtbCA9IChcclxuICAgICAgICAgICAgXCI8c3BhbiBuZy1zaG93PScgISAkbGFzdCAnPlwiICtcclxuICAgICAgICAgICAgZGVsaW1pdGVyICtcclxuICAgICAgICAgICAgXCI8L3NwYW4+XCJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIGRlbGltaXRlciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGl0ZW0sXHJcbiAgICAgICAgLy8gbWFraW5nIHN1cmUgdG8gYWRkIHRoZSBleGlzdGluZyB3aGl0ZXNwYWNlIGJhY2tcclxuICAgICAgICAvLyBpbiBhZnRlciB0aGUgZGVsaW1pdGVyLlxyXG4gICAgICAgIHZhciBodG1sID0gZWxlbWVudC5odG1sKCkucmVwbGFjZShcclxuICAgICAgICAgICAgLyhcXHMqJCkvaSxcclxuICAgICAgICAgICAgZnVuY3Rpb24gKHdoaXRlc3BhY2UpIHtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGRlbGltaXRlckh0bWwgKyB3aGl0ZXNwYWNlKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbXBpbGVkIEhUTUwuXHJcbiAgICAgICAgZWxlbWVudC5odG1sKGh0bWwpO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSBkaXJlY3RpdmUgY29uZmlndXJhdGlvbi4gTm90aWNlIHRoYXRcclxuICAgIC8vIG91ciBwcmlvcml0eSBpcyAxIGhpZ2hlciB0aGFuIG5nUmVwZWF0IC0gdGhpcyB3aWxsXHJcbiAgICAvLyBiZSBjb21waWxlZCBiZWZvcmUgdGhlIG5nUmVwZWF0IGNvbXBpbGVzLlxyXG4gICAgcmV0dXJuICh7XHJcbiAgICAgICAgY29tcGlsZTogY29tcGlsZSxcclxuICAgICAgICBwcmlvcml0eTogMTAwMSxcclxuICAgICAgICByZXN0cmljdDogXCJBXCJcclxuICAgIH0pO1xyXG5cclxufSIsIm1vZHVsZS5leHBvcnRzID0gWyckdGltZW91dCcsICdub3RpZmljYXRpb25zU2VydmljZScsIHNjcm9sbFRvVG9wV2hlbkRpcmVjdGl2ZV07XHJcblxyXG5mdW5jdGlvbiBzY3JvbGxUb1RvcFdoZW5EaXJlY3RpdmUoJHRpbWVvdXQsIG5vdGlmaWNhdGlvbnMpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XHJcbiAgICAgICAgdmFyIGV2ZW50TmFtZXMgPSBhdHRycy5zY3JvbGxUb1RvcFdoZW4uc3BsaXQoLyxcXHM/LylcclxuICAgICAgICBfLmZvckVhY2goZXZlbnROYW1lcywgZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xyXG4gICAgICAgICAgbm90aWZpY2F0aW9ucy5zdWJzY3JpYmUoZXZlbnROYW1lLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIGVsZW1lbnRbMF0uc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFsnY29uZmlnJywgJ2RhdGFDb250ZXh0JywgJ2lkZW50aXR5JywgJ3dpZGdldE1vZGFscycsIGF1dGhDaGVja1NlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gYXV0aENoZWNrU2VydmljZShjb25maWcsIGNvbnRleHQsIGlkZW50aXR5LCB3aWRnZXRNb2RhbHMpIHtcclxuXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBjaGVjazogY2hlY2tVc2VyU3RhdHVzXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGNoZWNrVXNlclN0YXR1cygpIHtcclxuICAgICAgICBpZiAoIWlkZW50aXR5LmlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250ZXh0LmdldChjb25maWcuYXBpSG9zdHMuYXV0aCArICcvYXV0aC9tZScpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIGlkZW50aXR5LnVwZGF0ZUNvb2tpZSgpO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBTZW50cnkuY29uZmlndXJlU2NvcGUoZnVuY3Rpb24gKHNjb3BlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnNldFVzZXIoeyBcImVtYWlsXCI6IHJlc3VsdC5FbWFpbEFkZHJlc3MgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge31cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkuc2V0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RhbFJlZiA9IHdpZGdldE1vZGFscy5sb2dnaW5nT3V0LnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsUmVmLmRpc21pc3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnLyMhL2FjY291bnQvbG9nb3V0JztcclxuICAgICAgICAgICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJzQwMycsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG59Iiwi77u/Ly8gVGhlIGNvbW1vbiBzZXJ2aWNlIGV4cG9ydHMgYWxsIHNlcnZpY2VzIHRoYXQgd2lsbCBiZSB1c2VkIGEgbG90IGluIGRpZmZlcmVudCBvdGhlciBzZXJ2aWNlcyBhbmQgY29udHJvbGxlcnNcclxubW9kdWxlLmV4cG9ydHMgPSBbXHJcbiAgICAnJGxvY2F0aW9uJywgXHJcbiAgICAnJHEnLCBcclxuICAgICckdGltZW91dCcsIFxyXG4gICAgJ2F1dGhDaGVja1NlcnZpY2UnLCBcclxuICAgICdjb25maWcnLCBcclxuICAgICdmb3JtYXR0aW5nJywgXHJcbiAgICAnaWRlbnRpdHknLCBcclxuICAgICdpbnRlcmFjdGlvblNlcnZpY2UnLCBcclxuICAgICdsYW5ndWFnZScsIFxyXG4gICAgY29tbW9uU2VydmljZVxyXG5dO1xyXG5cclxuZnVuY3Rpb24gY29tbW9uU2VydmljZShcclxuICAgICRsb2NhdGlvbiwgXHJcbiAgICAkcSwgXHJcbiAgICAkdGltZW91dCwgXHJcbiAgICBhdXRoQ2hlY2tTZXJ2aWNlLCBcclxuICAgIGNvbmZpZywgXHJcbiAgICBmb3JtYXR0aW5nLCBcclxuICAgIGlkZW50aXR5LCBcclxuICAgIGludGVyYWN0aW9uLCBcclxuICAgIGxhbmd1YWdlXHJcbikge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgJGxvY2F0aW9uOiAkbG9jYXRpb24sXHJcbiAgICAgICAgJHE6ICRxLFxyXG4gICAgICAgICR0aW1lb3V0OiAkdGltZW91dCxcclxuICAgICAgICBhdXRoOiBhdXRoQ2hlY2tTZXJ2aWNlLFxyXG4gICAgICAgIGNvbmZpZzogY29uZmlnLFxyXG4gICAgICAgIGZvcm1hdHRpbmc6IGZvcm1hdHRpbmcsXHJcbiAgICAgICAgaWRlbnRpdHk6IGlkZW50aXR5LFxyXG4gICAgICAgIGludGVyYWN0aW9uOiBpbnRlcmFjdGlvbixcclxuICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBbXHJcbiAgICAnJGluamVjdG9yJyxcclxuICAgICckbG9jYXRpb24nLCBcclxuICAgICckcScsXHJcbiAgICAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLFxyXG4gICAgZXJyb3JIYW5kbGluZ1NlcnZpY2VcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGVycm9ySGFuZGxpbmdTZXJ2aWNlKFxyXG4gICAgJGluamVjdG9yLFxyXG4gICAgJGxvY2F0aW9uLFxyXG4gICAgJHEsXHJcbiAgICBzdGF0ZVxyXG4pIHtcclxuXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICByZXNwb25zZUVycm9yOiBoYW5kbGVIdHRwUmVzcG9uc2VFcnJvclxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiBoYW5kbGVIdHRwUmVzcG9uc2VFcnJvcihyZWplY3Rpb24pIHtcclxuICAgICAgICB2YXIgcHJlZmVyZW5jZVNlcnZpY2UgPSAkaW5qZWN0b3IuZ2V0KCdwcmVmZXJlbmNlU2VydmljZScpO1xyXG4gICAgICAgIHZhciBpZGVudGl0eVNlcnZpY2UgPSAkaW5qZWN0b3IuZ2V0KCdpZGVudGl0eScpO1xyXG4gICAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDMgJiYgcmVqZWN0aW9uLmRhdGEgPT09ICdObyBhY2Nlc3MgdG8gdHJhZGUgdGFyaWZmJykge1xyXG4gICAgICAgICAgICB2YXIgYWxsb3dlZFRyYWRlVGFyaWZmcyA9IGlkZW50aXR5U2VydmljZS5nZXRBbGxvd2VkVHJhZGVUYXJpZmZzKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlQ291bnRyeTtcclxuICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoYWxsb3dlZFRyYWRlVGFyaWZmcywgJ0VVJykpIHtcclxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZUNvdW50cnkgPSAnRVUnOyAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZUNvdW50cnkgPSBhbGxvd2VkVHJhZGVUYXJpZmZzWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID0gcmVmZXJlbmNlQ291bnRyeTtcclxuICAgICAgICAgICAgcHJlZmVyZW5jZVNlcnZpY2Uuc2V0UmVmZXJlbmNlQ291bnRyeShyZWZlcmVuY2VDb3VudHJ5KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICRsb2NhdGlvbi51cmwoJy9sYW5kaW5nJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gJHEucmVzb2x2ZSh7IGRhdGE6IG51bGwgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJHEucmVqZWN0KHJlamVjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Iiwi77u/dmFyIG1vbWVudCA9IHJlcXVpcmUoJ21vbWVudCcpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBbZm9ybWF0dGluZ107XHJcblxyXG5mdW5jdGlvbiBmb3JtYXR0aW5nKCkge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgY2xlYW5Hb29kc0NvZGU6IGNsZWFuR29vZHNDb2RlLFxyXG4gICAgICAgIGZsYXR0ZW5BcnJheTogZmxhdHRlbkFycmF5LFxyXG4gICAgICAgIGZvcm1hdERhdGU6IGZvcm1hdERhdGUsXHJcbiAgICAgICAgZm9ybWF0RGF0ZUZyb21Ob3c6IGZvcm1hdERhdGVGcm9tTm93LFxyXG4gICAgICAgIGdvb2RzQ29kZVRvR29vZHNub21JZDogZ29vZHNDb2RlVG9Hb29kc25vbUlkLFxyXG4gICAgICAgIGlzQ2hhcHRlckNvZGU6IGlzQ2hhcHRlckNvZGUsXHJcbiAgICAgICAgaXNDb21tb2RpdHlDb2RlOiBpc0NvbW1vZGl0eUNvZGUsXHJcbiAgICAgICAgaXNIZWFkaW5nQ29kZTogaXNIZWFkaW5nQ29kZSxcclxuICAgICAgICBpc051bGxPckVtcHR5OiBpc051bGxPckVtcHR5LFxyXG4gICAgICAgIHBhZExlZnQ6IHBhZExlZnQsXHJcbiAgICAgICAgcGFkUmlnaHQ6IHBhZFJpZ2h0LFxyXG4gICAgICAgIHJlbW92ZVRyYWlsaW5nWmVyb3M6IHJlbW92ZVRyYWlsaW5nWmVyb3MsXHJcbiAgICAgICAgcmVwbGFjZUFsbDogcmVwbGFjZUFsbCxcclxuICAgICAgICByb21hblRvTnVtYmVyOiByb21hblRvTnVtYmVyLFxyXG4gICAgICAgIHRvQ2hhcHRlck51bWJlcjogdG9DaGFwdGVyTnVtYmVyXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFuR29vZHNDb2RlKGdvb2RzQ29kZSkge1xyXG4gICAgICAgIGlmICghZ29vZHNDb2RlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gcmVwbGFjZUFsbChnb29kc0NvZGUsICdbXFxcXHMuLF0nLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZmxhdHRlbkFycmF5KGl0ZW0sIGVsZW1OYW1lKSB7XHJcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoaXRlbVtlbGVtTmFtZV0gIT09IG51bGwgJiYgaXRlbVtlbGVtTmFtZV0gIT09IHVuZGVmaW5lZCAmJiBpdGVtW2VsZW1OYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbVtlbGVtTmFtZV0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGl0ZW1bZWxlbU5hbWVdW2ldKTtcclxuICAgICAgICAgICAgICAgIHZhciBzdWJJdGVtcyA9IGZsYXR0ZW5BcnJheShpdGVtW2VsZW1OYW1lXVtpXSwgZWxlbU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChzdWJJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUpIHtcclxuICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdCgnREQtTU0tWVlZWSBISDptbScpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZvcm1hdERhdGVGcm9tTm93KGRhdGUsIHVzZUFnbykge1xyXG4gICAgICAgIGlmICh1c2VBZ28gPT09IHVuZGVmaW5lZCB8fCB1c2VBZ28gPT09IG51bGwpXHJcbiAgICAgICAgICAgIHVzZUFnbyA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkuZnJvbU5vdyh1c2VBZ28pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdvb2RzQ29kZVRvR29vZHNub21JZChnb29kc0NvZGUpIHtcclxuICAgICAgICBpZiAoIWdvb2RzQ29kZSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHBhZFJpZ2h0KHJlcGxhY2VBbGwoZ29vZHNDb2RlLCAnW1xcXFxzLixdJywgJycpLCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXNDaGFwdGVyQ29kZShjb2RlKSB7XHJcbiAgICAgICAgaWYgKCFjb2RlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdmFyIGdvb2Rzbm9taWQgPSBnb29kc0NvZGVUb0dvb2Rzbm9tSWQoY29kZSk7XHJcbiAgICAgICAgcmV0dXJuIC9bMC05XXsxMH0vLnRlc3QoZ29vZHNub21pZCkgJiYgZ29vZHNub21pZC5zdWJzdHJpbmcoMikgPT09ICcwMDAwMDAwMCc7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXNIZWFkaW5nQ29kZShjb2RlKSB7XHJcbiAgICAgICAgaWYgKCFjb2RlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdmFyIGdvb2Rzbm9taWQgPSBnb29kc0NvZGVUb0dvb2Rzbm9tSWQoY29kZSk7XHJcbiAgICAgICAgcmV0dXJuIC9bMC05XXsxMH0vLnRlc3QoZ29vZHNub21pZCkgJiYgZ29vZHNub21pZC5zdWJzdHJpbmcoMikgIT09ICcwMDAwMDAwMCcgJiYgZ29vZHNub21pZC5zdWJzdHJpbmcoNCkgPT09ICcwMDAwMDAnO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGlzQ29tbW9kaXR5Q29kZShjb2RlKSB7XHJcbiAgICAgICAgaWYgKCFjb2RlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdmFyIGdvb2Rzbm9taWQgPSBnb29kc0NvZGVUb0dvb2Rzbm9tSWQoY29kZSk7XHJcbiAgICAgICAgcmV0dXJuIC9bMC05XXsxMH0vLnRlc3QoZ29vZHNub21pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXNOdWxsT3JFbXB0eShzb3VyY2UpIHtcclxuICAgICAgICByZXR1cm4gKHNvdXJjZSA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgICAgIHNvdXJjZSA9PT0gbnVsbCB8fFxyXG4gICAgICAgICAgICBzb3VyY2UgPT09ICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwYWRMZWZ0KG4sIHdpZHRoLCB6KSB7XHJcbiAgICAgICAgaWYgKCFuKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB6ID0geiB8fCAnMCc7XHJcbiAgICAgICAgbiA9IG4gKyAnJztcclxuICAgICAgICByZXR1cm4gbi5sZW5ndGggPj0gd2lkdGggPyBuIDogbmV3IEFycmF5KHdpZHRoIC0gbi5sZW5ndGggKyAxKS5qb2luKHopICsgbjtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwYWRSaWdodChuLCB3aWR0aCwgeikge1xyXG4gICAgICAgIGlmICghbikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgeiA9IHogfHwgJzAnO1xyXG4gICAgICAgIG4gPSBuICsgJyc7XHJcbiAgICAgICAgcmV0dXJuIG4ubGVuZ3RoID49IHdpZHRoID8gbiA6IG4gKyBuZXcgQXJyYXkod2lkdGggLSBuLmxlbmd0aCArIDEpLmpvaW4oeik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlVHJhaWxpbmdaZXJvcyhnb29kc0NvZGUpIHtcclxuICAgICAgICBpZiAoIWdvb2RzQ29kZSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IGdvb2RzQ29kZS5yZXBsYWNlKC8wKyQvLCAnJyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5sZW5ndGggJSAyID09PSAwID8gcmVzdWx0IDogcmVzdWx0ICsgJzAnO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlcGxhY2VBbGwoc3RyLCBzZWFyY2gsIHJlcGxhY2VtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoc2VhcmNoLCAnZycpLCByZXBsYWNlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcm9tYW5Ub051bWJlcihyb21hbikge1xyXG4gICAgICAgIHN3aXRjaCAocm9tYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2knOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcwMSc7XHJcbiAgICAgICAgICAgIGNhc2UgJ2lpJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnMDInO1xyXG4gICAgICAgICAgICBjYXNlICdpaWknOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcwMyc7XHJcbiAgICAgICAgICAgIGNhc2UgJ2l2JzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnMDQnO1xyXG4gICAgICAgICAgICBjYXNlICd2JzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnMDUnO1xyXG4gICAgICAgICAgICBjYXNlICd2aSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJzA2JztcclxuICAgICAgICAgICAgY2FzZSAndmlpJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnMDcnO1xyXG4gICAgICAgICAgICBjYXNlICd2aWlpJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnMDgnO1xyXG4gICAgICAgICAgICBjYXNlICdpeCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJzA5JztcclxuICAgICAgICAgICAgY2FzZSAneCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJzEwJztcclxuICAgICAgICAgICAgY2FzZSAneGknOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcxMSc7XHJcbiAgICAgICAgICAgIGNhc2UgJ3hpaSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJzEyJztcclxuICAgICAgICAgICAgY2FzZSAneGlpaSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJzEzJztcclxuICAgICAgICAgICAgY2FzZSAneGl2JzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnMTQnO1xyXG4gICAgICAgICAgICBjYXNlICd4dic6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJzE1JztcclxuICAgICAgICAgICAgY2FzZSAneHZpJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnMTYnO1xyXG4gICAgICAgICAgICBjYXNlICd4dmlpJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnMTcnO1xyXG4gICAgICAgICAgICBjYXNlICd4dmlpaSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJzE4JztcclxuICAgICAgICAgICAgY2FzZSAneGl4JzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnMTknO1xyXG4gICAgICAgICAgICBjYXNlICd4eCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJzIwJztcclxuICAgICAgICAgICAgY2FzZSAneHhpJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnMjEnO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvbWFuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0b0NoYXB0ZXJOdW1iZXIoY29kZSkge1xyXG4gICAgICAgIGlmICghY29kZSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgaWYgKGNvZGUuc3Vic3RyaW5nKDAsIDEpID09PSAnMCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvZGUuc3Vic3RyaW5nKDEsIDIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29kZS5zdWJzdHJpbmcoMCwgMik7XHJcbiAgICB9XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJyRjb29raWVzJywgJyRxJywgJyRyb290U2NvcGUnLCBpZGVudGl0eVNlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gaWRlbnRpdHlTZXJ2aWNlKCRjb29raWVzLCAkcSwgJHJvb3RTY29wZSkge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgaW5pdDogZ2V0RnJvbUNvb2tpZSxcclxuICAgICAgICBnZXRBbGxUcmFkZVRhcmlmZnM6IGdldEFsbFRyYWRlVGFyaWZmcyxcclxuICAgICAgICBnZXRBbGxvd2VkVHJhZGVUYXJpZmZzOiBnZXRBbGxvd2VkVHJhZGVUYXJpZmZzLFxyXG4gICAgICAgIGdldERpc2FsbG93ZWRUcmFkZVRhcmlmZnM6IGdldERpc2FsbG93ZWRUcmFkZVRhcmlmZnMsXHJcbiAgICAgICAgaGFzUGVybWlzc2lvbjogaGFzUGVybWlzc2lvbixcclxuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXSxcclxuICAgICAgICByZW1lbWJlck1lOiBmYWxzZSxcclxuICAgICAgICBzZXQ6IHNldCxcclxuICAgICAgICB0b2tlbjoge1xyXG4gICAgICAgICAgICB0b2tlblZhbHVlOiBudWxsLFxyXG4gICAgICAgICAgICB0b2tlbkV4cGlyZXNPbjogbnVsbCxcclxuICAgICAgICAgICAgdG9rZW5Jc3N1ZWRPbjogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdXBkYXRlQ29va2llOiB1cGRhdGVDb29raWUsXHJcbiAgICAgICAgcmVtb3ZlQ29va2llOiByZW1vdmVDb29raWUsXHJcbiAgICAgICAgdXNlckluZm86IG51bGxcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0RnJvbUNvb2tpZSgpIHtcclxuICAgICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xyXG4gICAgICAgIHZhciB0b2tlbiA9ICRjb29raWVzLmdldE9iamVjdCgnYXV0aFRva2VuJyk7XHJcbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwgJiYgdG9rZW4gIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuaXNBdXRoZW50aWNhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2VydmljZS50b2tlbiA9IHRva2VuO1xyXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGhhc1Blcm1pc3Npb24obmFtZSkge1xyXG4gICAgICAgIGlmICghbmFtZSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgdmFyIGludmVydFJlc3VsdCA9IG5hbWUuaW5kZXhPZignIScpID09PSAwO1xyXG4gICAgICAgIGlmIChpbnZlcnRSZXN1bHQpIHtcclxuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG5hbWUuaW5kZXhPZignLCcpID4gLTEpIHtcclxuICAgICAgICAgICAgdmFyIG5hbWVzID0gbmFtZS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXy5pbmRleE9mKHNlcnZpY2UucGVybWlzc2lvbnMsIG5hbWVzW2ldKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludmVydFJlc3VsdCA/IGZhbHNlIDogdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gaW52ZXJ0UmVzdWx0ID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGhhc1Blcm1pc3Npb24gPSBfLmluZGV4T2Yoc2VydmljZS5wZXJtaXNzaW9ucywgbmFtZSkgPiAtMTtcclxuICAgICAgICAgICAgcmV0dXJuIGludmVydFJlc3VsdCA/ICFoYXNQZXJtaXNzaW9uIDogaGFzUGVybWlzc2lvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0QWxsVHJhZGVUYXJpZmZzKCkge1xyXG4gICAgICAgIHZhciB0cmFkZVRhcmlmZnMgPSBbJ0VVJywgJ0RFJywgJ0JFJywgJ05MJywgJ0dCJywgJ0NIJywgJ1NFJywgJ0lUJ107XHJcbiAgICAgICAgcmV0dXJuIHRyYWRlVGFyaWZmcztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXREaXNhbGxvd2VkVHJhZGVUYXJpZmZzKCkge1xyXG4gICAgICAgIHJldHVybiBfLmRpZmZlcmVuY2UoZ2V0QWxsVHJhZGVUYXJpZmZzKCksIGdldEFsbG93ZWRUcmFkZVRhcmlmZnMoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0QWxsb3dlZFRyYWRlVGFyaWZmcygpIHtcclxuICAgICAgICB2YXIgYWxsb3dlZFRyYWRlVGFyaWZmcyA9IF8uY2hhaW4oc2VydmljZS5wZXJtaXNzaW9ucylcclxuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAocGVybWlzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uc3RhcnRzV2l0aChwZXJtaXNzaW9uLCAndHJhZGVfdGFyaWZmXycpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChwZXJtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGVybWlzc2lvbi5zdWJzdHJpbmcoMTMpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC52YWx1ZSgpO1xyXG4gICAgICAgIHJldHVybiBfLmludGVyc2VjdGlvbihnZXRBbGxUcmFkZVRhcmlmZnMoKSwgYWxsb3dlZFRyYWRlVGFyaWZmcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0KHVzZXJuYW1lLCBkYXRhLCByZW1lbWJlck1lKSB7XHJcbiAgICAgICAgdmFyIGRhdGUgPSBnZXRFeHBpcnlEYXRlKHJlbWVtYmVyTWUpO1xyXG4gICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgICBzZXJ2aWNlLmlzQXV0aGVudGljYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXJ2aWNlLnBlcm1pc3Npb25zID0gW107XHJcbiAgICAgICAgICAgIHNlcnZpY2UudG9rZW4udG9rZW5WYWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHNlcnZpY2UudG9rZW4udG9rZW5FeHBpcmVzT24gPSBudWxsO1xyXG4gICAgICAgICAgICBzZXJ2aWNlLnRva2VuLnRva2VuSXNzdWVkT24gPSBudWxsO1xyXG4gICAgICAgICAgICBzZXJ2aWNlLnVzZXJuYW1lID0gbnVsbDtcclxuICAgICAgICAgICAgJHJvb3RTY29wZS4kZW1pdCgnaWRlbnRpdHk6Y2xlYXInKTtcclxuICAgICAgICAgICAgJGNvb2tpZXMucmVtb3ZlKCdhdXRoVG9rZW4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UucmVtZW1iZXJNZSA9IHJlbWVtYmVyTWU7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuaXNBdXRoZW50aWNhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2VydmljZS50b2tlbiA9IHtcclxuICAgICAgICAgICAgICAgIHJlbWVtYmVyTWU6ICEhcmVtZW1iZXJNZSxcclxuICAgICAgICAgICAgICAgIHRva2VuVmFsdWU6IGRhdGEuYWNjZXNzX3Rva2VuLFxyXG4gICAgICAgICAgICAgICAgdG9rZW5FeHBpcmVzT246IGRhdGFbJ2V4cGlyZXNfb24nXSxcclxuICAgICAgICAgICAgICAgIHRva2VuSXNzdWVkT246IGRhdGFbJ2lzc3VlZF9vbiddXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHNlcnZpY2UudXNlckluZm8gPSBkYXRhO1xyXG4gICAgICAgICAgICAkY29va2llcy5wdXRPYmplY3QoJ2F1dGhUb2tlbicsIHNlcnZpY2UudG9rZW4sIHsgJ2V4cGlyZXMnOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICAkcm9vdFNjb3BlLiRlbWl0KCdpZGVudGl0eTpzZXQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0RXhwaXJ5RGF0ZShyZW1lbWJlck1lKSB7XHJcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGlmIChyZW1lbWJlck1lKSB7XHJcbiAgICAgICAgICAgIC8vIGFkZCB0d28gd2Vla3MgdG8gZGF0ZVxyXG4gICAgICAgICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyAoMTQgKiAyNCAqIDYwICogNjAgKiAxMDAwKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gYWRkIDIwIG1pbnV0ZXMgdG8gZGF0ZVxyXG4gICAgICAgICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyAoMjAqIDYwICogMTAwMCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVDb29raWUoKSB7XHJcbiAgICAgICAgdmFyIGNvb2tpZSA9ICRjb29raWVzLmdldE9iamVjdCgnYXV0aFRva2VuJyk7XHJcbiAgICAgICAgdmFyIGRhdGUgPSBnZXRFeHBpcnlEYXRlKGNvb2tpZS5yZW1lbWJlck1lKTtcclxuICAgICAgICAkY29va2llcy5wdXRPYmplY3QoJ2F1dGhUb2tlbicsIGNvb2tpZSwgIHsgJ2V4cGlyZXMnOiBkYXRlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlbW92ZUNvb2tpZSgpIHtcclxuICAgICAgICAkY29va2llcy5yZW1vdmUoJ2F1dGhUb2tlbicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gW2ludGVyYWN0aW9uU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBpbnRlcmFjdGlvblNlcnZpY2UoKSB7XHJcblxyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgY2xlYXJTZWxlY3Rpb246IGNsZWFyU2VsZWN0aW9uLFxyXG4gICAgICAgIGNvcHlUZXh0VG9DbGlwYm9hcmQ6IGNvcHlUZXh0VG9DbGlwYm9hcmRcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKSB7XHJcbiAgICAgICAgaWYoZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTtcclxuICAgICAgICB9IGVsc2UgaWYod2luZG93LmdldFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjb3B5VGV4dFRvQ2xpcGJvYXJkKHRleHQpIHtcclxuICAgIGlmICghbmF2aWdhdG9yLmNsaXBib2FyZCkge1xyXG4gICAgICAgIGZhbGxiYWNrQ29weVRleHRUb0NsaXBib2FyZCh0ZXh0KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKCdBc3luYzogQ29weWluZyB0byBjbGlwYm9hcmQgd2FzIHN1Y2Nlc3NmdWwhJyk7XHJcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmVycm9yKCdBc3luYzogQ291bGQgbm90IGNvcHkgdGV4dDogJywgZXJyKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmYWxsYmFja0NvcHlUZXh0VG9DbGlwYm9hcmQodGV4dCkge1xyXG4gICAgdmFyIHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xyXG4gICAgdGV4dEFyZWEudmFsdWUgPSB0ZXh0O1xyXG5cclxuICAgIC8vIEF2b2lkIHNjcm9sbGluZyB0byBib3R0b21cclxuICAgIHRleHRBcmVhLnN0eWxlLnRvcCA9IFwiMFwiO1xyXG4gICAgdGV4dEFyZWEuc3R5bGUubGVmdCA9IFwiMFwiO1xyXG4gICAgdGV4dEFyZWEuc3R5bGUucG9zaXRpb24gPSBcImZpeGVkXCI7XHJcblxyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0QXJlYSk7XHJcbiAgICB0ZXh0QXJlYS5mb2N1cygpO1xyXG4gICAgdGV4dEFyZWEuc2VsZWN0KCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICB2YXIgc3VjY2Vzc2Z1bCA9IGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XHJcbiAgICAgICAgdmFyIG1zZyA9IHN1Y2Nlc3NmdWwgPyAnc3VjY2Vzc2Z1bCcgOiAndW5zdWNjZXNzZnVsJztcclxuICAgICAgICAvL2NvbnNvbGUubG9nKCdGYWxsYmFjazogQ29weWluZyB0ZXh0IGNvbW1hbmQgd2FzICcgKyBtc2cpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmVycm9yKCdGYWxsYmFjazogT29wcywgdW5hYmxlIHRvIGNvcHknLCBlcnIpO1xyXG4gICAgfVxyXG5cclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpO1xyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJyRsb2NhbGUnLCAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLCAnJHRyYW5zbGF0ZScsICd0bWhEeW5hbWljTG9jYWxlJywgbGFuZ3VhZ2VTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIGxhbmd1YWdlU2VydmljZSgkbG9jYWxlLCBub3RpZmljYXRpb25zLCAkdHJhbnNsYXRlLCBkeW5hbWljTG9jYWxlKSB7XHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICAkbG9jYWxlOiAkbG9jYWxlLFxyXG4gICAgICAgICR0cmFuc2xhdGU6ICR0cmFuc2xhdGUsXHJcbiAgICAgICAgY3VycmVudExhbmd1YWdlOiBudWxsLFxyXG4gICAgICAgIGdldDogZ2V0TGFuZ3VhZ2UsXHJcbiAgICAgICAgc2V0OiBzZXRMYW5ndWFnZSxcclxuICAgICAgICBzZXRTdXBwb3J0ZWRMYW5ndWFnZXM6IHNldFN1cHBvcnRlZExhbmd1YWdlcyxcclxuICAgICAgICBzdXBwb3J0ZWRMYW5ndWFnZXM6IFtcclxuICAgICAgICAgICAgXCJjc1wiLFxyXG4gICAgICAgICAgICBcImRhXCIsXHJcbiAgICAgICAgICAgIFwiZGVcIixcclxuICAgICAgICAgICAgXCJldFwiLFxyXG4gICAgICAgICAgICBcImVuXCIsXHJcbiAgICAgICAgICAgIFwiZXNcIixcclxuICAgICAgICAgICAgXCJmclwiLFxyXG4gICAgICAgICAgICBcImhyXCIsXHJcbiAgICAgICAgICAgIFwiaXRcIixcclxuICAgICAgICAgICAgXCJsdlwiLFxyXG4gICAgICAgICAgICBcImx0XCIsXHJcbiAgICAgICAgICAgIFwiaHVcIixcclxuICAgICAgICAgICAgXCJubFwiLFxyXG4gICAgICAgICAgICBcInBsXCIsXHJcbiAgICAgICAgICAgIFwicHRcIixcclxuICAgICAgICAgICAgXCJyb1wiLFxyXG4gICAgICAgICAgICBcInNrXCIsXHJcbiAgICAgICAgICAgIFwic2xcIixcclxuICAgICAgICAgICAgXCJmaVwiLFxyXG4gICAgICAgICAgICBcInN2XCIsXHJcbiAgICAgICAgICAgIFwiZWxcIixcclxuICAgICAgICAgICAgXCJiZ1wiXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIHN1cHBvcnRlZExhbmd1YWdlc1dpdGhEZXNjcmlwdGlvbjogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJJZFwiOiBcImNzXCIsXHJcbiAgICAgICAgICAgICAgXCJEZXNjcmlwdGlvblwiOiBcIkNlxaF0aW5hXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFwiSWRcIjogXCJkYVwiLFxyXG4gICAgICAgICAgICAgIFwiRGVzY3JpcHRpb25cIjogXCJEYW5za1wiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcIklkXCI6IFwiZGVcIixcclxuICAgICAgICAgICAgICBcIkRlc2NyaXB0aW9uXCI6IFwiRGV1dHNjaFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcIklkXCI6IFwiZXRcIixcclxuICAgICAgICAgICAgICBcIkRlc2NyaXB0aW9uXCI6IFwiRWVzdGkga2VlbFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcIklkXCI6IFwiZW5cIixcclxuICAgICAgICAgICAgICBcIkRlc2NyaXB0aW9uXCI6IFwiRW5nbGlzaFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcIklkXCI6IFwiZXNcIixcclxuICAgICAgICAgICAgICBcIkRlc2NyaXB0aW9uXCI6IFwiRXNwYcOxb2xcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJJZFwiOiBcImZyXCIsXHJcbiAgICAgICAgICAgICAgXCJEZXNjcmlwdGlvblwiOiBcIkZyYW7Dp2Fpc1wiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcIklkXCI6IFwiaHJcIixcclxuICAgICAgICAgICAgICBcIkRlc2NyaXB0aW9uXCI6IFwiSHJ2YXRza2lcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJJZFwiOiBcIml0XCIsXHJcbiAgICAgICAgICAgICAgXCJEZXNjcmlwdGlvblwiOiBcIkl0YWxpYW5vXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFwiSWRcIjogXCJsdlwiLFxyXG4gICAgICAgICAgICAgIFwiRGVzY3JpcHRpb25cIjogXCJMYXR2aWXFoXUgdmFsb2RhXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFwiSWRcIjogXCJsdFwiLFxyXG4gICAgICAgICAgICAgIFwiRGVzY3JpcHRpb25cIjogXCJMaWV0dXZpdSBrYWxiYVwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcIklkXCI6IFwiaHVcIixcclxuICAgICAgICAgICAgICBcIkRlc2NyaXB0aW9uXCI6IFwiTWFneWFyXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFwiSWRcIjogXCJubFwiLFxyXG4gICAgICAgICAgICAgIFwiRGVzY3JpcHRpb25cIjogXCJOZWRlcmxhbmRzXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFwiSWRcIjogXCJwbFwiLFxyXG4gICAgICAgICAgICAgIFwiRGVzY3JpcHRpb25cIjogXCJQb2xza2lcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJJZFwiOiBcInB0XCIsXHJcbiAgICAgICAgICAgICAgXCJEZXNjcmlwdGlvblwiOiBcIlBvcnR1Z3XDqnNcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJJZFwiOiBcInJvXCIsXHJcbiAgICAgICAgICAgICAgXCJEZXNjcmlwdGlvblwiOiBcIlJvbcOibmFcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJJZFwiOiBcInNrXCIsXHJcbiAgICAgICAgICAgICAgXCJEZXNjcmlwdGlvblwiOiBcIlNsb3ZlbsSNaW5hXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFwiSWRcIjogXCJzbFwiLFxyXG4gICAgICAgICAgICAgIFwiRGVzY3JpcHRpb25cIjogXCJTbG92ZW7FocSNaW5hXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFwiSWRcIjogXCJmaVwiLFxyXG4gICAgICAgICAgICAgIFwiRGVzY3JpcHRpb25cIjogXCJTdW9taVwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcIklkXCI6IFwic3ZcIixcclxuICAgICAgICAgICAgICBcIkRlc2NyaXB0aW9uXCI6IFwiU3ZlbnNrYVwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcIklkXCI6IFwiZWxcIixcclxuICAgICAgICAgICAgICBcIkRlc2NyaXB0aW9uXCI6IFwizrXOu867zrfOvc65zrrOrFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcIklkXCI6IFwiYmdcIixcclxuICAgICAgICAgICAgICBcIkRlc2NyaXB0aW9uXCI6IFwi0LHRitC70LPQsNGA0YHQutC4XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0U3VwcG9ydGVkTGFuZ3VhZ2VzKGxhbmd1YWdlc1dpdGhEZXNjcmlwdGlvbikge1xyXG4gICAgICAgIHNlcnZpY2Uuc3VwcG9ydGVkTGFuZ3VhZ2VzV2l0aERlc2NyaXB0aW9uID0gXy5tYXAobGFuZ3VhZ2VzV2l0aERlc2NyaXB0aW9uLCBmdW5jdGlvbihsYW5nKSB7XHJcbiAgICAgICAgICAgIGxhbmcuSWQgPSBsYW5nLklkLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBsYW5nO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNlcnZpY2Uuc3VwcG9ydGVkTGFuZ3VhZ2VzID0gXy5tYXAoc2VydmljZS5zdXBwb3J0ZWRMYW5ndWFnZXNXaXRoRGVzY3JpcHRpb24sIGZ1bmN0aW9uKGxhbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxhbmcuSWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0TGFuZ3VhZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuICR0cmFuc2xhdGUudXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcclxuICAgICAgICBsYW5ndWFnZSA9IGxhbmd1YWdlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFsYW5ndWFnZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAoc2VydmljZS5zdXBwb3J0ZWRMYW5ndWFnZXMuaW5kZXhPZihsYW5ndWFnZSkgPiAtMSkge1xyXG4gICAgICAgICAgICBpZihsYW5ndWFnZSA9PT0gJ2VuJykge1xyXG4gICAgICAgICAgICAgIGR5bmFtaWNMb2NhbGUuc2V0KCdlbi1ubCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGR5bmFtaWNMb2NhbGUuc2V0KGxhbmd1YWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSA9IGxhbmd1YWdlO1xyXG4gICAgICAgICAgICAkdHJhbnNsYXRlLnVzZShsYW5ndWFnZSk7XHJcblxyXG4gICAgICAgICAgICBub3RpZmljYXRpb25zLnB1Ymxpc2goJ2xhbmd1YWdlX2NoYW5nZWQnLCBsYW5ndWFnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbbm90aWZpY2F0aW9uc1NlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gbm90aWZpY2F0aW9uc1NlcnZpY2UoKSB7XHJcblxyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXHJcbiAgICAgICAgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlLFxyXG4gICAgICAgIHB1Ymxpc2g6IHB1Ymxpc2hcclxuICAgIH07XHJcblxyXG4gICAgdmFyIGNhY2hlID0ge307XHJcblxyXG4gICAgZnVuY3Rpb24gc3Vic2NyaWJlKHRvcGljLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICghY2FjaGVbdG9waWNdKSB7XHJcbiAgICAgICAgICAgIGNhY2hlW3RvcGljXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYWNoZVt0b3BpY10ucHVzaChjYWxsYmFjayk7XHJcbiAgICAgICAgcmV0dXJuIFt0b3BpYywgY2FsbGJhY2tdO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKHRvcGljLCBjYWxsYmFjaykge1xyXG4gICAgICAgIHZhciBjYWxsYmFja0NvdW50O1xyXG4gICAgICAgIGlmIChjYWNoZVt0b3BpY10pIHtcclxuICAgICAgICAgICAgY2FsbGJhY2tDb3VudCA9IGNhY2hlW3RvcGljXS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHdoaWxlIChjYWxsYmFja0NvdW50LS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjYWNoZVt0b3BpY11bY2FsbGJhY2tDb3VudF0gPT09IGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVbdG9waWNdLnNwbGljZShjYWxsYmFja0NvdW50LCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwdWJsaXNoKHRvcGljKSB7XHJcbiAgICAgICAgdmFyIGNhbGxiYWNrQ291bnQsIGV2ZW50LCByZXM7XHJcbiAgICAgICAgZXZlbnQgPSBjYWNoZVt0b3BpY107XHJcbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY2FsbGJhY2tDb3VudCA9IGV2ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgd2hpbGUgKGNhbGxiYWNrQ291bnQtLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50W2NhbGxiYWNrQ291bnRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gZXZlbnRbY2FsbGJhY2tDb3VudF0uYXBwbHkoe30sIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHB1Ymxpc2godG9waWMgKyBcIl9kb25lXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxufSIsIm1vZHVsZS5leHBvcnRzID0gWyckd2luZG93JywgJyRxJywgJyRjb29raWVzJywgJ2NvbmZpZycsICdjb3VudHJ5RGF0YVNlcnZpY2UnLCAnZGF0YUNvbnRleHQnLFxyXG4gICAgJ2lkZW50aXR5JywgJ2xhbmd1YWdlJywgJ3ByZWZlcmVuY2VTZXJ2aWNlJywgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgJ2Zhdm9yaXRlc1NlcnZpY2UnLCBwcmVsb2FkZXJTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIHByZWxvYWRlclNlcnZpY2UoJHdpbmRvdywgJHEsICRjb29raWVzLCBjb25maWcsIGNvdW50cnlEYXRhU2VydmljZSwgY29udGV4dCwgaWRlbnRpdHlTZXJ2aWNlLCBsYW5ndWFnZVNlcnZpY2UsIHByZWZlcmVuY2VTZXJ2aWNlLCBzdGF0ZSwgZmF2b3JpdGVzU2VydmljZSkge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgaW5pdDogaW5pdCxcclxuICAgICAgICBydW46IHJ1bldoZW5BdXRoZW50aWNhdGVkLFxyXG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eVNlcnZpY2UsXHJcbiAgICAgICAgc3RhdHVzOiB7XHJcbiAgICAgICAgICAgIGlzRG9uZTogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gaW5pdCgpIHtcclxuICAgICAgICByZXR1cm4gaWRlbnRpdHlTZXJ2aWNlXHJcbiAgICAgICAgLmluaXQoKVxyXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgICAgICAgICBpZiAoaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVuV2hlbkF1dGhlbnRpY2F0ZWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRQZXJtaXNzaW9ucygpIHtcclxuICAgICAgICByZXR1cm4gY29udGV4dFxyXG4gICAgICAgICAgICAuZ2V0KGNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9tZS9wZXJtaXNzaW9uJylcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGlkZW50aXR5U2VydmljZS5wZXJtaXNzaW9ucyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGhhc1Blcm1pc3Npb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9ucyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHlTZXJ2aWNlLnBlcm1pc3Npb25zID0gaWRlbnRpdHlTZXJ2aWNlLnBlcm1pc3Npb25zLmNvbmNhdChkYXRhW3Byb3BdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghaGFzUGVybWlzc2lvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAkY29va2llcy5yZW1vdmUoJ2F1dGhUb2tlbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICR3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkY29va2llcy5yZW1vdmUoJ2F1dGhUb2tlbicpO1xyXG4gICAgICAgICAgICAgICAgJHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcnVuV2hlbkF1dGhlbnRpY2F0ZWQoKSB7XHJcbiAgICAgICAgc2VydmljZS5zdGF0dXMuaXNEb25lID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGxvYWRQZXJtaXNzaW9ucygpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkgeyByZXR1cm4gcHJlZmVyZW5jZVNlcnZpY2UuaW5pdCgpOyB9KVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbigpIHsgcmV0dXJuIGNvbmZpZ3VyZVNlcnZpY2VzQmFzZWRPblByZWZlcmVuY2VzKCk7IH0pXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkgeyByZXR1cm4gY291bnRyeURhdGFTZXJ2aWNlLmluaXQoKTsgfSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7IHJldHVybiBsb2FkU2VhcmNoQ291bnRyeVByZWYoKTsgfSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7IHJldHVybiBmYXZvcml0ZXNTZXJ2aWNlLmluaXQoKTsgfSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLnN0YXR1cy5pc0RvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICA7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZFNlYXJjaENvdW50cnlQcmVmKCkge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XHJcbiAgICAgICAgdmFyIHNlYXJjaENvdW50cnlQcmVmID0gcHJlZmVyZW5jZVNlcnZpY2UuZ2V0KCdzZWFyY2hDb3VudHJ5JywgJ3NlYXJjaCcpO1xyXG4gICAgICAgIGlmIChzZWFyY2hDb3VudHJ5UHJlZikge1xyXG4gICAgICAgICAgICB2YXIgY291bnRyeUNvZGUgPSBzZWFyY2hDb3VudHJ5UHJlZi52YWx1ZS5zcGxpdCgnLCcpWzBdO1xyXG4gICAgICAgICAgICB2YXIgY291bnRyeU5hbWUgPSBzZWFyY2hDb3VudHJ5UHJlZi52YWx1ZS5zcGxpdCgnLCcpWzFdO1xyXG4gICAgICAgICAgICB2YXIgc2VhcmNoQ291bnRyeUlzVmFsaWRGb3JSZWZlcmVuY2VDb3VudHJ5ID0gXy5zb21lKGNvdW50cnlEYXRhU2VydmljZS5lcmdhT21uZXNDb3VudHJpZXMsIGZ1bmN0aW9uIChjb3VudHJ5RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50cnlEYXRhLmNvZGUgPT09IGNvdW50cnlDb2RlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKHNlYXJjaENvdW50cnlJc1ZhbGlkRm9yUmVmZXJlbmNlQ291bnRyeSkge1xyXG4gICAgICAgICAgICAgICAgc3RhdGUuZmlsdGVyLmNvdW50cnlDb2RlID0gY291bnRyeUNvZGU7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZS5maWx0ZXIuY291bnRyeU5hbWUgPSBjb3VudHJ5TmFtZTtcclxuICAgICAgICAgICAgICAgIHN0YXRlLnJlbWVtYmVyLmNvdW50cnkgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJlZmVyZW5jZVNlcnZpY2UucmVtb3ZlKHNlYXJjaENvdW50cnlQcmVmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XHJcbiAgICAgICAgcmV0dXJuICRxLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY29uZmlndXJlU2VydmljZXNCYXNlZE9uUHJlZmVyZW5jZXMoKSB7XHJcbiAgICAgICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKTtcclxuICAgICAgICBpZiAocHJlZmVyZW5jZVNlcnZpY2UuZ2V0KCd1Y2NNb2RlRW5hYmxlZCcsICdzZXR0aW5ncycpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHN0YXRlLnVjY01vZGVFbmFibGVkID0gcHJlZmVyZW5jZVNlcnZpY2UuZ2V0KCd1Y2NNb2RlRW5hYmxlZCcsICdzZXR0aW5ncycpLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJlZmVyZW5jZVNlcnZpY2UuZ2V0KCdsYW5ndWFnZScsICd3ZWJzaXRlJykgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGxhbmd1YWdlU2VydmljZS5zZXQpIHtcclxuICAgICAgICAgICAgICAgIGxhbmd1YWdlU2VydmljZS5zZXQocHJlZmVyZW5jZVNlcnZpY2UuZ2V0KCdsYW5ndWFnZScsICd3ZWJzaXRlJykudmFsdWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVmZXJlbmNlQ291bnRyeVByZWYgPSBwcmVmZXJlbmNlU2VydmljZS5nZXQoJ3JlZmVyZW5jZUNvdW50cnknLCAnc2VhcmNoJyk7XHJcbiAgICAgICAgaWYgKHJlZmVyZW5jZUNvdW50cnlQcmVmKSB7XHJcbiAgICAgICAgICAgIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID0gcmVmZXJlbmNlQ291bnRyeVByZWYudmFsdWU7XHJcbiAgICAgICAgICAgIGNvbmZpZy5jdXJyZW50QXBpID0gJ2R0dic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJlZmVyZW5jZVNlcnZpY2UuZ2V0KCdtb3ZlbWVudCcpID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZWZlcmVuY2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnbW92ZW1lbnQnLFxyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICd1c2VyX3ByZWZlcmVuY2VzJyxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiAnaW1wb3J0JyxcclxuICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogJ3N0cmluZ1ZhbHVlJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc3RhdGUuZmlsdGVyLm1vdmVtZW50ID0gJ2ltcG9ydCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzdGF0ZS5maWx0ZXIubW92ZW1lbnQgPSBwcmVmZXJlbmNlU2VydmljZS5nZXQoJ21vdmVtZW50JykubW92ZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm4gJHEucHJvbWlzZTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJyRodHRwJywgdmVyc2lvbkhpc3RvcnlTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIHZlcnNpb25IaXN0b3J5U2VydmljZSgkaHR0cCkge1xyXG5cdHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGdldDogZ2V0XHJcblx0fTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXQoKSB7XHJcblx0XHRyZXR1cm4gJGh0dHAuZ2V0KCcvdmVyc2lvbi1oaXN0b3J5Lmpzb24nKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBzZXJ2aWNlO1xyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0gWyckaHR0cCcsICckcScsICdjb25maWcnLCAnaWRlbnRpdHknLCAnbGFuZ3VhZ2UnLCBkYXRhQ29udGV4dFNlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gZGF0YUNvbnRleHRTZXJ2aWNlKCRodHRwLCAkcSwgY29uZmlnLCBpZGVudGl0eSwgbGFuZ3VhZ2UpIHtcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGRlbDogZnVuY3Rpb24gKHVybCkgeyByZXR1cm4gcmVxdWVzdFdpdGhvdXREYXRhKCdERUxFVEUnLCB1cmwpOyB9LFxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKHVybCwgaWQsIGhlYWRlcnMpIHsgcmV0dXJuIHJlcXVlc3RXaXRob3V0RGF0YSgnR0VUJywgdXJsLCBpZCwgaGVhZGVycyk7IH0sXHJcbiAgICAgICAgcG9zdDogZnVuY3Rpb24gKHVybCwgcGFyYW1ldGVycykgeyByZXR1cm4gcmVxdWVzdFdpdGhEYXRhKCdQT1NUJywgdXJsLCBwYXJhbWV0ZXJzKTsgfSxcclxuICAgICAgICBwdXQ6IGZ1bmN0aW9uICh1cmwsIHBhcmFtZXRlcnMpIHsgcmV0dXJuIHJlcXVlc3RXaXRoRGF0YSgnUFVUJywgdXJsLCBwYXJhbWV0ZXJzKTsgfSxcclxuICAgICAgICB4aHI6IGZ1bmN0aW9uICh1cmwsIHBhcmFtZXRlcnMpIHsgcmV0dXJuIHJlcXVlc3RYaHJXaXRoRGF0YSgnUE9TVCcsIHVybCwgcGFyYW1ldGVycyk7IH0sXHJcbiAgICAgICAgY2FuY2VsOiBjYW5jZWwsXHJcbiAgICAgICAgZm9ybUVuY29kZTogZm9ybUVuY29kZSxcclxuICAgICAgICBnZXRIZWFkZXJzOiBnZXRIZWFkZXJzLFxyXG4gICAgICAgIHBlbmRpbmdSZXF1ZXN0czoge31cclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gY2FuY2VsKHJlcXVlc3RJZCkge1xyXG4gICAgICAgIGlmIChzZXJ2aWNlLnBlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0SWRdKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdDYW5jZWxpbmcgcmVxdWVzdCAnICsgcmVxdWVzdElkICsgJyB3aXRoIHVybCAnICsgc2VydmljZS5wZW5kaW5nUmVxdWVzdHNbcmVxdWVzdElkXS51cmwpO1xyXG4gICAgICAgICAgICBzZXJ2aWNlLnBlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0SWRdLmV4ZWN1dGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZm9ybUVuY29kZShvYmopIHtcclxuICAgICAgICB2YXIgZW5jb2RlZFN0cmluZyA9ICcnO1xyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcclxuICAgICAgICAgICAgaWYgKGVuY29kZWRTdHJpbmcubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBlbmNvZGVkU3RyaW5nICs9ICcmJztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZW5jb2RlZFN0cmluZyArPSBrZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZW5jb2RlZFN0cmluZy5yZXBsYWNlKC8lMjAvZywgJysnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBOQjogcmVxdWVzdCBpZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgcmVxdWVzdCwgbGlrZSAnQ0hBUFRFUicgb3IgJ0dPT0QnLCBmb3IgZXhhbXBsZVxyXG4gICAgZnVuY3Rpb24gcmVxdWVzdFdpdGhvdXREYXRhKG1ldGhvZCwgdXJsLCByZXF1ZXN0SWQsIGhlYWRlcnMpIHtcclxuICAgICAgICB2YXIgY2FuY2VsbGVyID0gJHEuZGVmZXIoKTtcclxuICAgICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xyXG4gICAgICAgIHVybCA9IHByb2Nlc3NVcmwodXJsKTtcclxuXHJcbiAgICAgICAgdmFyIHJlcXVlc3RNZXRhZGF0YSA9IHtcclxuICAgICAgICAgICAgZXhlY3V0ZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBjYW5jZWxsZXIucmVzb2x2ZSh7IGlzQWJvcnRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGVmZXJyZWQ6IGRlZmVycmVkLFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAocmVxdWVzdElkKSB7XHJcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlLnBlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0SWRdKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsID09PSBzZXJ2aWNlLnBlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0SWRdLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLnBlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0SWRdLmRlZmVycmVkLnByb21pc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYW5jZWwocmVxdWVzdElkKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVxdWVzdE1ldGFkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcclxuICAgICAgICAgICAgc2VydmljZS5wZW5kaW5nUmVxdWVzdHNbcmVxdWVzdElkXSA9IHJlcXVlc3RNZXRhZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRodHRwKHsgbWV0aG9kOiBtZXRob2QsIHVybDogdXJsLCBoZWFkZXJzOiBnZXRIZWFkZXJzKGhlYWRlcnMpLCB0aW1lb3V0OiBjYW5jZWxsZXIucHJvbWlzZSB9KVxyXG4gICAgICAgICAgICAudGhlbihcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGRhdGEpIHsgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFdpdGhvdXREYXRhU3VjY2Vzc0NhbGxiYWNrKGRhdGEsIHJlcXVlc3RNZXRhZGF0YSk7IH0sIFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oZGF0YSkgeyAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RXaXRob3V0RGF0YUVycm9yQ2FsbGJhY2soZGF0YSwgcmVxdWVzdE1ldGFkYXRhKTsgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlcXVlc3RXaXRob3V0RGF0YVN1Y2Nlc3NDYWxsYmFjayhkYXRhLCByZXF1ZXN0TWV0YWRhdGEpIHtcclxuICAgICAgICByZXF1ZXN0TWV0YWRhdGEuZGVmZXJyZWQucmVzb2x2ZShkYXRhLmRhdGEpO1xyXG4gICAgICAgIGlmIChyZXF1ZXN0TWV0YWRhdGEucmVxdWVzdElkICYmIHNlcnZpY2UucGVuZGluZ1JlcXVlc3RzW3JlcXVlc3RNZXRhZGF0YS5yZXF1ZXN0SWRdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBzZXJ2aWNlLnBlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0TWV0YWRhdGEucmVxdWVzdElkXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGZ1bmN0aW9uIHJlcXVlc3RXaXRob3V0RGF0YUVycm9yQ2FsbGJhY2soZXJyb3IsIHJlcXVlc3RNZXRhZGF0YSkge1xyXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5jb25maWcgJiYgZXJyb3IuY29uZmlnLnRpbWVvdXQgJiYgZXJyb3IuY29uZmlnLnRpbWVvdXQuJCRzdGF0ZSAmJiBlcnJvci5jb25maWcudGltZW91dC4kJHN0YXRlLnZhbHVlICYmIGVycm9yLmNvbmZpZy50aW1lb3V0LiQkc3RhdGUudmFsdWUuaXNBYm9ydGVkKSB7XHJcbiAgICAgICAgICAgIGVycm9yLmlzQWJvcnRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGVycm9yICYmIGVycm9yLnN0YXR1cyA8PSAwKSB7XHJcbiAgICAgICAgICAgIGVycm9yLmlzQWJvcnRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgU2VudHJ5LmNvbmZpZ3VyZVNjb3BlKGZ1bmN0aW9uIChzY29wZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnNldFRhZyhcImxhc3QtYXBpLWVycm9yLXN0YXR1c1wiLCBlcnJvci5zdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnNldFRhZyhcImxhc3QtYXBpLWVycm9yLXVybFwiLCBlcnJvci5jb25maWcudXJsKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7fVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXF1ZXN0TWV0YWRhdGEuZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcclxuICAgICAgICBpZiAocmVxdWVzdE1ldGFkYXRhLnJlcXVlc3RJZCAmJiBzZXJ2aWNlLnBlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0TWV0YWRhdGEucmVxdWVzdElkXSkge1xyXG4gICAgICAgICAgICBkZWxldGUgc2VydmljZS5wZW5kaW5nUmVxdWVzdHNbcmVxdWVzdE1ldGFkYXRhLnJlcXVlc3RJZF07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlcXVlc3RXaXRoRGF0YShtZXRob2QsIHVybCwgcGFyYW1ldGVycykge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XHJcbiAgICAgICAgdmFyIGlucHV0RGF0YSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHVybCA9IHByb2Nlc3NVcmwodXJsKTtcclxuXHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHsgbWV0aG9kOiBtZXRob2QsIHVybDogdXJsLCBoZWFkZXJzOiBnZXRIZWFkZXJzKCksIGRhdGE6IGlucHV0RGF0YSwgZGF0YVR5cGU6ICdqc29uJyB9O1xyXG5cclxuICAgICAgICAkaHR0cChjb25maWcpXHJcbiAgICAgICAgICAgIC50aGVuKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHN1Y2Nlc3NDYWxsYmFjayhkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNmZykgeyBkZWZlcnJlZC5yZXNvbHZlKGRhdGEuZGF0YSk7IH1cclxuICAgICAgICBmdW5jdGlvbiBlcnJvckNhbGxiYWNrKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBTZW50cnkuY29uZmlndXJlU2NvcGUoZnVuY3Rpb24gKHNjb3BlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2V0VGFnKFwibGFzdC1hcGktZXJyb3Itc3RhdHVzXCIsIGVycm9yLnN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2V0VGFnKFwibGFzdC1hcGktZXJyb3ItdXJsXCIsIGVycm9yLmNvbmZpZy51cmwpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZXF1ZXN0WGhyV2l0aERhdGEobWV0aG9kLCB1cmwsIHBhcmFtZXRlcnMpIHtcclxuICAgICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xyXG4gICAgICAgIHVybCA9IHByb2Nlc3NVcmwodXJsKTtcclxuXHJcbiAgICAgICAgdmFyIGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHsgbWV0aG9kOiBtZXRob2QsIHVybDogdXJsLCBoZWFkZXJzOiBoZWFkZXJzLCBkYXRhOiBwYXJhbWV0ZXJzIH07XHJcbiAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3QgPSBfLmlkZW50aXR5O1xyXG5cclxuICAgICAgICAkaHR0cChjb25maWcpXHJcbiAgICAgICAgICAgIC50aGVuKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgcHJvZ3Jlc3NDYWxsYmFjayk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHN1Y2Nlc3NDYWxsYmFjayhkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNmZykgeyBkZWZlcnJlZC5yZXNvbHZlKGRhdGEuZGF0YSk7IH1cclxuICAgICAgICBmdW5jdGlvbiBlcnJvckNhbGxiYWNrKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBTZW50cnkuY29uZmlndXJlU2NvcGUoZnVuY3Rpb24gKHNjb3BlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2V0VGFnKFwibGFzdC1hcGktZXJyb3Itc3RhdHVzXCIsIGVycm9yLnN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2V0VGFnKFwibGFzdC1hcGktZXJyb3ItdXJsXCIsIGVycm9yLmNvbmZpZy51cmwpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHByb2dyZXNzQ2FsbGJhY2socHJvZ3Jlc3MpIHsgZGVmZXJyZWQubm90aWZ5KHByb2dyZXNzKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3ZSBoYXZlIHRvIGluY2x1ZGUgdGhlIEJlYXJlciB0b2tlbiB3aXRoIGVhY2ggY2FsbCB0byB0aGUgV2ViIEFQSSBjb250cm9sbGVycy5cclxuICAgIGZ1bmN0aW9uIGdldEhlYWRlcnMoaGVhZGVycykge1xyXG4gICAgICAgIGlmICghaGVhZGVycykge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZGVudGl0eS50b2tlbiAmJiBpZGVudGl0eS50b2tlbi50b2tlblZhbHVlKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gXCJCZWFyZXIgXCIgKyBpZGVudGl0eS50b2tlbi50b2tlblZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGVhZGVycztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwcm9jZXNzVXJsKHVybCkge1xyXG4gICAgICAgIGlmICh1cmwgPT09IG51bGwgfHwgdXJsID09PSAnJylcclxuICAgICAgICAgICAgcmV0dXJuIHVybDtcclxuICAgICAgICAvLyBpZiAodXJsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignaHR0cDovLycpICE9PSAwICYmIHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2h0dHBzOi8vJykgIT09IDApXHJcbiAgICAgICAgLy8gICAgIHVybCA9IGNvbmZpZy5hcGlIb3N0ICsgdXJsO1xyXG5cclxuICAgICAgICBpZiAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdXJsICs9ICc/bGFuZz0nICsgbGFuZ3VhZ2UuZ2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB1cmwgKz0gJyZsYW5nPScgKyBsYW5ndWFnZS5nZXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVybDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJyRxJywgJyR3aW5kb3cnLCAnJGNvb2tpZXMnLCAnY29uZmlnJywgJ2RhdGFDb250ZXh0JywgJ2xhbmd1YWdlJywgcHJlZmVyZW5jZVNlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gcHJlZmVyZW5jZVNlcnZpY2UoJHEsICR3aW5kb3csICRjb29raWVzLCBjb25maWcsIGRhdGFDb250ZXh0LCBsYW5ndWFnZSkge1xyXG5cclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIHByZWZlcmVuY2VzOiBbXSxcclxuICAgICAgICBhZGQ6IGFkZFByZWZlcmVuY2UsXHJcbiAgICAgICAgZ2V0OiBnZXRQcmVmZXJlbmNlLFxyXG4gICAgICAgIGdldEFueTogZ2V0QW55UHJlZmVyZW5jZSxcclxuICAgICAgICBnZXRDYXRlZ29yeTogZ2V0UHJlZmVyZW5jZXNCeUNhdGVnb3J5LFxyXG4gICAgICAgIGluaXQ6IHJlbG9hZCxcclxuICAgICAgICBpbml0aWFsaXplZDogZmFsc2UsXHJcbiAgICAgICAgcmVsb2FkOiByZWxvYWQsXHJcbiAgICAgICAgcmVtb3ZlOiByZW1vdmVQcmVmZXJlbmNlLFxyXG4gICAgICAgIHJlcGxhY2U6IHJlcGxhY2VQcmVmZXJlbmNlLFxyXG4gICAgICAgIHVwZGF0ZTogdXBkYXRlUHJlZmVyZW5jZSxcclxuICAgICAgICBcclxuICAgICAgICBzYXZlQ291bnRyeVByZWZlcmVuY2U6IHNhdmVDb3VudHJ5UHJlZmVyZW5jZSxcclxuICAgICAgICBjbGVhckNvdW50cnlQcmVmZXJlbmNlOiBjbGVhckNvdW50cnlQcmVmZXJlbmNlLFxyXG4gICAgICAgIHNldExhbmd1YWdlOiBzZXRMYW5ndWFnZSxcclxuICAgICAgICBzZXRSZWZlcmVuY2VDb3VudHJ5OiBzZXRSZWZlcmVuY2VDb3VudHJ5XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIHJlcGxhY2VQcmVmZXJlbmNlKHByZWZlcmVuY2UpIHtcclxuICAgICAgICB2YXIgZXhpc3RpbmdQcmVmZXJlbmNlID0gZ2V0UHJlZmVyZW5jZShwcmVmZXJlbmNlLm5hbWUsIHByZWZlcmVuY2UuY2F0ZWdvcnkpO1xyXG4gICAgICAgIGlmIChleGlzdGluZ1ByZWZlcmVuY2UpIHtcclxuICAgICAgICAgICAgcHJlZmVyZW5jZS5pZCA9IGV4aXN0aW5nUHJlZmVyZW5jZS5pZDtcclxuICAgICAgICAgICAgdXBkYXRlUHJlZmVyZW5jZShwcmVmZXJlbmNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGFkZFByZWZlcmVuY2UocHJlZmVyZW5jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGFkZFByZWZlcmVuY2UocHJlZmVyZW5jZSkge1xyXG4gICAgICAgIGlmIChwcmVmZXJlbmNlID09PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgIHZhciBvYmogPSB0b01vZGVsKHByZWZlcmVuY2UpO1xyXG4gICAgICAgIHZhciByZXEgPSBkYXRhQ29udGV4dC5wb3N0KGNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9wcmVmZXJlbmNlJywgb2JqLCB0cnVlKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5wcmVmZXJlbmNlcy5wdXNoKGZyb21Nb2RlbChkYXRhKSk7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGZyb21Nb2RlbChkYXRhKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRQcmVmZXJlbmNlKG5hbWUsIGNhdGVnb3J5KSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IF8uZmluZChzZXJ2aWNlLnByZWZlcmVuY2VzLCBmdW5jdGlvbiAocHJlZmVyZW5jZSkge1xyXG4gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZlcmVuY2UubmFtZSA9PT0gbmFtZSAmJiBwcmVmZXJlbmNlLmNhdGVnb3J5ID09PSBjYXRlZ29yeTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcHJlZmVyZW5jZS5uYW1lID09PSBuYW1lO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEFueVByZWZlcmVuY2UobmFtZSkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBfLmZpbHRlcihzZXJ2aWNlLnByZWZlcmVuY2VzLCBmdW5jdGlvbiAocHJlZmVyZW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJlZmVyZW5jZS5uYW1lID09PSBuYW1lO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgfHwgcmVzdWx0ID09PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRQcmVmZXJlbmNlc0J5Q2F0ZWdvcnkobmFtZSkge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgIGlmIChzZXJ2aWNlLmluaXRpYWxpemVkID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VydmljZS5wcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UucHJlZmVyZW5jZXNbaV0uY2F0ZWdvcnkgIT09IHVuZGVmaW5lZCAmJiBzZXJ2aWNlLnByZWZlcmVuY2VzW2ldLmNhdGVnb3J5ICE9PSBudWxsICYmIHNlcnZpY2UucHJlZmVyZW5jZXNbaV0uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc2VydmljZS5wcmVmZXJlbmNlc1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFDb250ZXh0LmdldChjb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvcHJlZmVyZW5jZScpXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gXy5tYXAoZGF0YSwgZnJvbU1vZGVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhW2ldLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgZGF0YVtpXS5jYXRlZ29yeSAhPT0gbnVsbCAmJiBkYXRhW2ldLmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZGF0YVtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmcm9tTW9kZWwoaXRlbSkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLFxyXG4gICAgICAgICAgICBjYXRlZ29yeTogaXRlbS5jYXRlZ29yeSxcclxuICAgICAgICAgICAgbGFzdFVwZGF0ZTogaXRlbS5sYXN0VXBkYXRlLFxyXG4gICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXHJcbiAgICAgICAgICAgIHNvcnRPcmRlcjogaXRlbS5zb3J0T3JkZXIsXHJcbiAgICAgICAgICAgIHZhbHVlVHlwZTogaXRlbS52YWx1ZVR5cGVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGl0ZW0udmFsdWVUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW5WYWx1ZSc6XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaXRlbS5uYW1lXSA9IGl0ZW0uYm9vbGVhblZhbHVlO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gaXRlbS5ib29sZWFuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnZGF0ZVRpbWVWYWx1ZSc6XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaXRlbS5uYW1lXSA9IGl0ZW0uZGF0ZVRpbWVWYWx1ZTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IGl0ZW0uZGF0ZVRpbWVWYWx1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdudW1lcmljVmFsdWUnOlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2l0ZW0ubmFtZV0gPSBpdGVtLm51bWVyaWNWYWx1ZTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IGl0ZW0ubnVtZXJpY1ZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaXRlbS5uYW1lXSA9IGl0ZW0uc3RyaW5nVmFsdWU7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQudmFsdWUgPSBpdGVtLnN0cmluZ1ZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlbG9hZCgpIHtcclxuICAgICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xyXG5cclxuICAgICAgICBkYXRhQ29udGV4dC5nZXQoY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL3ByZWZlcmVuY2UnKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YSA9IF8ubWFwKGRhdGEsIGZyb21Nb2RlbCk7XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLnByZWZlcmVuY2VzID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2UuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShkYXRhKTtcclxuICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5zdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICRjb29raWVzLnJlbW92ZSgnYXV0aFRva2VuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZW1vdmVQcmVmZXJlbmNlKHByZWZlcmVuY2UpIHtcclxuICAgICAgICBpZiAocHJlZmVyZW5jZSA9PT0gbnVsbCB8fCBwcmVmZXJlbmNlLmlkID09PSB1bmRlZmluZWQgfHwgcHJlZmVyZW5jZS5pZCA9PT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB2YXIgb2JqID0gdG9Nb2RlbChwcmVmZXJlbmNlKTtcclxuICAgICAgICBzZXJ2aWNlLnByZWZlcmVuY2VzLnNwbGljZShfLmZpbmRJbmRleChzZXJ2aWNlLnByZWZlcmVuY2VzLCBmdW5jdGlvbiAocHJlZlRvRmluZCkgeyByZXR1cm4gcHJlZlRvRmluZC5pZCA9PT0gb2JqLmlkOyB9KSwgMSk7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmRlbChjb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvcHJlZmVyZW5jZS8nICsgcHJlZmVyZW5jZS5pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdG9Nb2RlbChwcmVmZXJlbmNlKSB7XHJcbiAgICAgICAgdmFyIG9yaWdpbmFsUHJlZmVyZW5jZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHByZWZlcmVuY2UuaWQgIT09IHVuZGVmaW5lZCAmJiBwcmVmZXJlbmNlLmlkICE9PSBudWxsKVxyXG4gICAgICAgICAgICBvcmlnaW5hbFByZWZlcmVuY2UgPSBfLmZpbmQoc2VydmljZS5wcmVmZXJlbmNlcywgZnVuY3Rpb24gKHByZWZUb0ZpbmQpIHsgcmV0dXJuIHByZWZUb0ZpbmQuaWQgPT09IHByZWZlcmVuY2UuaWQ7IH0pO1xyXG5cclxuICAgICAgICB2YXIgb2JqID0ge1xyXG4gICAgICAgICAgICBpZDogcHJlZmVyZW5jZS5pZCAhPT0gdW5kZWZpbmVkICYmIHByZWZlcmVuY2UuaWQgIT09IG51bGwgPyBwcmVmZXJlbmNlLmlkIDogLTEsXHJcbiAgICAgICAgICAgIGxhc3RVcGRhdGU6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgICAgIG5hbWU6IHByZWZlcmVuY2UubmFtZSAhPT0gdW5kZWZpbmVkICYmIHByZWZlcmVuY2UubmFtZSAhPT0gbnVsbCA/IHByZWZlcmVuY2UubmFtZSA6IChvcmlnaW5hbFByZWZlcmVuY2UgIT09IHVuZGVmaW5lZCAmJiBvcmlnaW5hbFByZWZlcmVuY2UgIT09IG51bGwgJiYgb3JpZ2luYWxQcmVmZXJlbmNlLm5hbWUgIT09IHVuZGVmaW5lZCAmJiBvcmlnaW5hbFByZWZlcmVuY2UubmFtZSAhPT0gbnVsbCA/IG9yaWdpbmFsUHJlZmVyZW5jZS5uYW1lIDogbnVsbCksXHJcbiAgICAgICAgICAgIGNhdGVnb3J5OiBwcmVmZXJlbmNlLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgcHJlZmVyZW5jZS5jYXRlZ29yeSAhPT0gbnVsbCA/IHByZWZlcmVuY2UuY2F0ZWdvcnkgOiAob3JpZ2luYWxQcmVmZXJlbmNlICE9PSB1bmRlZmluZWQgJiYgb3JpZ2luYWxQcmVmZXJlbmNlICE9PSBudWxsICYmIG9yaWdpbmFsUHJlZmVyZW5jZS5jYXRlZ29yeSAhPT0gdW5kZWZpbmVkICYmIG9yaWdpbmFsUHJlZmVyZW5jZS5jYXRlZ29yeSAhPT0gbnVsbCA/IG9yaWdpbmFsUHJlZmVyZW5jZS5jYXRlZ29yeSA6IG51bGwpLFxyXG4gICAgICAgICAgICBzb3J0T3JkZXI6IHByZWZlcmVuY2Uuc29ydE9yZGVyICE9PSB1bmRlZmluZWQgJiYgcHJlZmVyZW5jZS5zb3J0T3JkZXIgIT09IG51bGwgPyBwcmVmZXJlbmNlLnNvcnRPcmRlciA6IChvcmlnaW5hbFByZWZlcmVuY2UgIT09IHVuZGVmaW5lZCAmJiBvcmlnaW5hbFByZWZlcmVuY2UgIT09IG51bGwgJiYgb3JpZ2luYWxQcmVmZXJlbmNlLnNvcnRPcmRlciAhPT0gdW5kZWZpbmVkICYmIG9yaWdpbmFsUHJlZmVyZW5jZS5zb3J0T3JkZXIgIT09IG51bGwgPyBvcmlnaW5hbFByZWZlcmVuY2Uuc29ydE9yZGVyIDogbnVsbCksXHJcbiAgICAgICAgICAgIHZhbHVlVHlwZTogcHJlZmVyZW5jZS52YWx1ZVR5cGUgIT09IHVuZGVmaW5lZCAmJiBwcmVmZXJlbmNlLnZhbHVlVHlwZSAhPT0gbnVsbCA/IHByZWZlcmVuY2UudmFsdWVUeXBlIDogKG9yaWdpbmFsUHJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkICYmIG9yaWdpbmFsUHJlZmVyZW5jZSAhPT0gbnVsbCAmJiBvcmlnaW5hbFByZWZlcmVuY2UudmFsdWVUeXBlICE9PSB1bmRlZmluZWQgJiYgb3JpZ2luYWxQcmVmZXJlbmNlLnZhbHVlVHlwZSAhPT0gbnVsbCA/IG9yaWdpbmFsUHJlZmVyZW5jZS52YWx1ZVR5cGUgOiBudWxsKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChvYmoubmFtZSA9PT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgaWYgKG9iai52YWx1ZVR5cGUgPT09IG51bGwpXHJcbiAgICAgICAgICAgIG9iai52YWx1ZVR5cGUgPSAnc3RyaW5nVmFsdWUnO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKG9iai52YWx1ZVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnYm9vbGVhblZhbHVlJzpcclxuICAgICAgICAgICAgICAgIG9iai5ib29sZWFuVmFsdWUgPSBwcmVmZXJlbmNlLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lVmFsdWUnOlxyXG4gICAgICAgICAgICAgICAgb2JqLmRhdGVUaW1lVmFsdWUgPSBwcmVmZXJlbmNlLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ251bWVyaWNWYWx1ZSc6XHJcbiAgICAgICAgICAgICAgICBvYmoubnVtZXJpY1ZhbHVlID0gcHJlZmVyZW5jZS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgb2JqLnN0cmluZ1ZhbHVlID0gcHJlZmVyZW5jZS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVQcmVmZXJlbmNlKHByZWZlcmVuY2UpIHtcclxuICAgICAgICBpZiAocHJlZmVyZW5jZSA9PT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB2YXIgb2JqID0gdG9Nb2RlbChwcmVmZXJlbmNlKTtcclxuICAgICAgICB2YXIgaW5kZXggPSBfLmZpbmRJbmRleChzZXJ2aWNlLnByZWZlcmVuY2VzLCBmdW5jdGlvbiAocHJlZlRvRmluZCkgeyByZXR1cm4gcHJlZlRvRmluZC5pZCA9PT0gb2JqLmlkOyB9KTtcclxuICAgICAgICBpZiAoaW5kZXggPiAtMSlcclxuICAgICAgICAgICAgc2VydmljZS5wcmVmZXJlbmNlc1tpbmRleF0gPSBmcm9tTW9kZWwob2JqKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LnB1dChjb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvcHJlZmVyZW5jZS8nICsgb2JqLmlkLCBvYmosIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNldExhbmd1YWdlKGxhbmcpIHtcclxuICAgICAgICBsYW5ndWFnZS5zZXQobGFuZyk7XHJcbiAgICAgICAgdmFyIGN1cnJlbnRQcmVmID0gc2VydmljZS5nZXQoJ2xhbmd1YWdlJywgJ3dlYnNpdGUnKTtcclxuICAgICAgICBpZiAoY3VycmVudFByZWYpIHtcclxuICAgICAgICAgICAgY3VycmVudFByZWYudmFsdWUgPSBsYW5nO1xyXG4gICAgICAgICAgICByZXR1cm4gc2VydmljZS51cGRhdGUoY3VycmVudFByZWYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiAnd2Vic2l0ZScsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnbGFuZ3VhZ2UnLFxyXG4gICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAnc3RyaW5nVmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGxhbmdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNldFJlZmVyZW5jZUNvdW50cnkocmVmZXJlbmNlQ291bnRyeSkge1xyXG4gICAgICAgIHZhciBjdXJyZW50UHJlZiA9IHNlcnZpY2UuZ2V0KCdyZWZlcmVuY2VDb3VudHJ5JywgJ3VzZXJfcHJlZmVyZW5jZXMnKTtcclxuICAgICAgICBpZiAocmVmZXJlbmNlQ291bnRyeSA9PT0gJ0dCJykge1xyXG4gICAgICAgICAgICBzZXRMYW5ndWFnZSgnZW4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1cnJlbnRQcmVmKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRQcmVmLnZhbHVlID0gcmVmZXJlbmNlQ291bnRyeTtcclxuICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UudXBkYXRlKGN1cnJlbnRQcmVmKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogJ3NlYXJjaCcsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAncmVmZXJlbmNlQ291bnRyeScsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6ICdzdHJpbmdWYWx1ZScsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVmZXJlbmNlQ291bnRyeVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2F2ZUNvdW50cnlQcmVmZXJlbmNlKGNvdW50cnkpIHtcclxuICAgICAgICBzZXJ2aWNlLmFkZCh7IG5hbWU6ICdzZWFyY2hDb3VudHJ5JywgY2F0ZWdvcnk6ICdzZWFyY2gnLCB2YWx1ZTogY291bnRyeS5jb2RlICsgJywnICsgY291bnRyeS5uYW1lIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyQ291bnRyeVByZWZlcmVuY2UoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHByZWYgPSBzZXJ2aWNlLmdldCgnc2VhcmNoQ291bnRyeScsICdzZWFyY2gnKTtcclxuICAgICAgICAgICAgaWYgKHByZWYpIHtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2UucmVtb3ZlKHByZWYpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7IH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFtzZXJpYWxpemF0aW9uU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBzZXJpYWxpemF0aW9uU2VydmljZSgpIHtcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIHNlcmlhbGl6ZUN1c3RvbXNWYWx1ZTogc2VyaWFsaXplQ3VzdG9tc1ZhbHVlLFxyXG4gICAgICAgIHNlcmlhbGl6ZVF1YW50aXRpZXM6IHNlcmlhbGl6ZVF1YW50aXRpZXNcclxuICAgIH07XHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiBzZXJpYWxpemVDdXN0b21zVmFsdWUoY3VzdG9tc1ZhbHVlKSB7XHJcbiAgICAgICAgaWYgKGN1c3RvbXNWYWx1ZS5hbW91bnQgPT09IG51bGwgfHwgY3VzdG9tc1ZhbHVlLmFtb3VudCA9PT0gdW5kZWZpbmVkIHx8IGN1c3RvbXNWYWx1ZS51bml0ID09PSBudWxsIHx8IGN1c3RvbXNWYWx1ZS51bml0ID09PSB1bmRlZmluZWQgfHwgY3VzdG9tc1ZhbHVlLnVuaXQgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGN1c3RvbXNWYWx1ZS5hbW91bnQgKyAnICcgKyBjdXN0b21zVmFsdWUudW5pdDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXJpYWxpemVRdWFudGl0aWVzKHF1YW50aXRpZXMpIFxyXG4gICAge1xyXG4gICAgICAgIHZhciBzZXJpYWxpemVkUXVhbnRpdGllcyA9IF8uY2hhaW4ocXVhbnRpdGllcylcclxuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihxdWFudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1YW50aXR5ICE9PSBudWxsICYmIHF1YW50aXR5ICE9PSB1bmRlZmluZWQgJiYgcXVhbnRpdHkuQW1vdW50ICE9PSBudWxsICYmIHF1YW50aXR5LkFtb3VudCAhPT0gdW5kZWZpbmVkICYmIHF1YW50aXR5LkFtb3VudCAhPT0gXCJcIjtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbihxdWFudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHF1YW50aXR5LkFtb3VudCArICcgJyArIHF1YW50aXR5LlVuaXQuY29kZTtcclxuICAgICAgICAgICAgICAgIGlmIChxdWFudGl0eS5RdWFsaWZpZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJyAnICsgcXVhbnRpdHkuUXVhbGlmaWVyLmNvZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudmFsdWUoKTtcclxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZFF1YW50aXRpZXM7XHJcbiAgICB9XHJcbn0iLCJ2YXIgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFthcHBsaWNhdGlvblN0YXRlU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBhcHBsaWNhdGlvblN0YXRlU2VydmljZSgpIHtcclxuXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgZGF0ZTogbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgICAgICAgIHJlZmVyZW5jZUNvdW50cnk6ICdOTCcsXHJcbiAgICAgICAgICAgIG1vdmVtZW50OiAnaW1wb3J0JyxcclxuICAgICAgICAgICAgY291bnRyeUNvZGU6IG51bGwsXHJcbiAgICAgICAgICAgIGNvdW50cnlOYW1lOiBudWxsLFxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsQ29kZTogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdWNjTW9kZUVuYWJsZWQ6ICdubycsXHJcbiAgICAgICAgcmVtZW1iZXI6IHtcclxuICAgICAgICAgICAgY291bnRyeTogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIGN1cnJlbnRDb2RlOiBudWxsLFxyXG4gICAgICAgIGN1cnJlbnRJbmRlbnRhdGlvbjogbnVsbCxcclxuICAgICAgICBjb3VudHJ5SGFzQ2hhbmdlZDogY291bnRyeUhhc0NoYW5nZWQsXHJcbiAgICAgICAgdXBkYXRlQ291bnRyeUZpbHRlcjogdXBkYXRlQ291bnRyeUZpbHRlclxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVDb3VudHJ5RmlsdGVyKGNvdW50cnksIHJlbWVtYmVyQ291bnRyeSkge1xyXG4gICAgICAgIGlmIChjb3VudHJ5ICYmICghc2VydmljZS5maWx0ZXIuY291bnRyeUNvZGUgfHwgc2VydmljZS5maWx0ZXIuY291bnRyeUNvZGUgIT09IGNvdW50cnkuY29kZSkpIHtcclxuICAgICAgICAgICAgc2VydmljZS5maWx0ZXIuY291bnRyeUNvZGUgPSBjb3VudHJ5LmNvZGU7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuZmlsdGVyLmNvdW50cnlOYW1lID0gY291bnRyeS5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghY291bnRyeSAmJiBzZXJ2aWNlLmZpbHRlci5jb3VudHJ5Q29kZSkge1xyXG4gICAgICAgICAgICBzZXJ2aWNlLmZpbHRlci5jb3VudHJ5Q29kZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuZmlsdGVyLmNvdW50cnlOYW1lID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VydmljZS5yZW1lbWJlci5jb3VudHJ5ID0gcmVtZW1iZXJDb3VudHJ5O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvdW50cnlIYXNDaGFuZ2VkKGNvdW50cnkpIHtcclxuICAgICAgICByZXR1cm4gKGNvdW50cnkgJiYgc2VydmljZS5maWx0ZXIuY291bnRyeUNvZGUgIT09IGNvdW50cnkuY29kZSkgfHwgKCFjb3VudHJ5ICYmIHNlcnZpY2UuZmlsdGVyLmNvdW50cnlDb2RlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcbn0iLCJhbmd1bGFyLm1vZHVsZSgndGFyaWMuY29ycmVsYXRpb25UYWJsZScsIFtdKVxyXG4gICAgLmNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgcm91dGVDb25maWd1cmF0b3JdKVxyXG4gICAgLmNvbXBvbmVudCgnY29ycmVsYXRpb25UYWJsZVN1Ym5hdicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jb3JyZWxhdGlvbi10YWJsZS1zdWJuYXYnKSlcclxuICAgIC5jb21wb25lbnQoJ2NvcnJlbGF0aW9uVGFibGUnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvY29ycmVsYXRpb24tdGFibGUnKSlcclxuICAgIC5jb21wb25lbnQoJ2hzMjAyMkJhY2t3YXJkJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2hzLTIwMjItYmFja3dhcmQnKSlcclxuICAgIC5jb21wb25lbnQoJ2hzMjAyMkZvcndhcmQnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvaHMtMjAyMi1mb3J3YXJkJykpXHJcbiAgICBcclxuICAgIC5jb21wb25lbnQoJ2NvcnJlbGF0aW9uVGFibGVQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2NvcnJlbGF0aW9uLXRhYmxlLXBhZ2UnKSlcclxuICAgIC5jb21wb25lbnQoJ2NvcnJlbGF0aW9uVGFibGVOZXdzUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jb3JyZWxhdGlvbi10YWJsZS1uZXdzLXBhZ2UnKSlcclxuICAgIC5jb21wb25lbnQoJ2hzMjAyMkJhY2t3YXJkUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9ocy0yMDIyLWJhY2t3YXJkLXBhZ2UnKSlcclxuICAgIC5jb21wb25lbnQoJ2hzMjAyMkZvcndhcmRQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2hzLTIwMjItZm9yd2FyZC1wYWdlJykpXHJcbiAgICAuZmFjdG9yeSgnY29ycmVsYXRpb25EYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvY29ycmVsYXRpb24tZGF0YScpKVxyXG4gICAgO1xyXG5cclxuZnVuY3Rpb24gcm91dGVDb25maWd1cmF0b3IoJHJvdXRlUHJvdmlkZXIpIHtcclxuICAgICRyb3V0ZVByb3ZpZGVyXHJcbiAgICAgICAgLndoZW4oJy9jb3JyZWxhdGlvbi10YWJsZS9ocy0yMDIyLWZvcndhcmQnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPGhzLTIwMjItZm9yd2FyZC1wYWdlPjwvaHMtMjAyMi1mb3J3YXJkLXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9jb3JyZWxhdGlvbi10YWJsZS9ocy0yMDIyLWJhY2t3YXJkJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxocy0yMDIyLWJhY2t3YXJkLXBhZ2U+PC9ocy0yMDIyLWJhY2t3YXJkLXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9jb3JyZWxhdGlvbi10YWJsZS86YWN0aXZlU3VibmF2Lzpjb2RlJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxjb3JyZWxhdGlvbi10YWJsZS1wYWdlPjwvY29ycmVsYXRpb24tdGFibGUtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2hlbignL2NvcnJlbGF0aW9uLXRhYmxlLzphY3RpdmVTdWJuYXYnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPGNvcnJlbGF0aW9uLXRhYmxlLXBhZ2U+PC9jb3JyZWxhdGlvbi10YWJsZS1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvY29ycmVsYXRpb24tdGFibGUnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPGNvcnJlbGF0aW9uLXRhYmxlLXBhZ2U+PC9jb3JyZWxhdGlvbi10YWJsZS1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIDtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGNvcnJlbGF0aW9uVGFibGVOZXdzQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY29ycmVsYXRpb24tdGFibGUvY29tcG9uZW50cy9jb3JyZWxhdGlvbi10YWJsZS1uZXdzLXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbmNvcnJlbGF0aW9uVGFibGVOZXdzQ29udHJvbGxlci4kaW5qZWN0ID0gWyckYW5hbHl0aWNzJywgJyRyb3V0ZVBhcmFtcyddO1xyXG5cclxuZnVuY3Rpb24gY29ycmVsYXRpb25UYWJsZU5ld3NDb250cm9sbGVyKCRhbmFseXRpY3MsICRyb3V0ZVBhcmFtcykge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICBhY3RpdmVTdWJuYXY6ICRyb3V0ZVBhcmFtcy5hY3RpdmVTdWJuYXZcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9uZXdzL2NvcnJlbGF0aW9uLXRhYmxlJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB2bTtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGNvcnJlbGF0aW9uVGFibGVDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdjb3JyZWxhdGlvbi10YWJsZS9jb21wb25lbnRzL2NvcnJlbGF0aW9uLXRhYmxlLXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbmNvcnJlbGF0aW9uVGFibGVDb250cm9sbGVyLiRpbmplY3QgPSBbJyRhbmFseXRpY3MnLCAnJHJvdXRlUGFyYW1zJ107XHJcblxyXG5mdW5jdGlvbiBjb3JyZWxhdGlvblRhYmxlQ29udHJvbGxlcigkYW5hbHl0aWNzLCAkcm91dGVQYXJhbXMpIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgYWN0aXZlU3VibmF2OiAkcm91dGVQYXJhbXMuYWN0aXZlU3VibmF2XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvbmV3cy9jb3JyZWxhdGlvbi10YWJsZScpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gdm07XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIGFjdGl2ZTogJ0AnXHJcbiAgICB9LFxyXG4gICAgdGVtcGxhdGVVcmw6ICdjb3JyZWxhdGlvbi10YWJsZS9jb21wb25lbnRzL2NvcnJlbGF0aW9uLXRhYmxlLXN1Ym5hdi5odG1sJ1xyXG59OyIsInZhciBtb21lbnQgPSByZXF1aXJlKCdtb21lbnQnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogY29ycmVsYXRpb25UYWJsZUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2NvcnJlbGF0aW9uLXRhYmxlL2NvbXBvbmVudHMvY29ycmVsYXRpb24tdGFibGUuaHRtbCdcclxufTtcclxuICAgIFxyXG5jb3JyZWxhdGlvblRhYmxlQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckd2luZG93JywgXHJcbiAgICAnJHJvdXRlUGFyYW1zJywgXHJcbiAgICAnJHRyYW5zbGF0ZScsIFxyXG4gICAgJ2Zvcm1hdHRpbmcnLCBcclxuICAgICdjb3JyZWxhdGlvbkRhdGFTZXJ2aWNlJywgXHJcbiAgICAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCBcclxuICAgICd0cmFkZU1vdmVtZW50U2VydmljZScsIFxyXG4gICAgJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGNvcnJlbGF0aW9uVGFibGVDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkd2luZG93LCBcclxuICAgICRyb3V0ZVBhcmFtcywgXHJcbiAgICAkdHJhbnNsYXRlLCBcclxuICAgIGZvcm1hdHRpbmcsIFxyXG4gICAgY29ycmVsYXRpb25EYXRhLCBcclxuICAgIHN0YXRlLCBcclxuICAgIHRyYWRlTW92ZW1lbnQsIFxyXG4gICAgbm90aWZpY2F0aW9uc1xyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICAgICAgYmVmb3JlRmlyc3RTZWFyY2g6IHRydWUsXHJcbiAgICAgICAgY2hhbmdlRGF0ZUludGVydmFsOiBjaGFuZ2VEYXRlSW50ZXJ2YWwsXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICBuZXdDb2RlczogW10sXHJcbiAgICAgICAgICAgIG9sZENvZGVzOiBbXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IG51bGwsXHJcbiAgICAgICAgZmlsdGVyOiB7XHJcbiAgICAgICAgICAgIGRhdGVJbnRlcnZhbDogJ3VwY29taW5nLXllYXInLFxyXG4gICAgICAgICAgICBnb29kc25vbTogJHJvdXRlUGFyYW1zLmNvZGUsXHJcbiAgICAgICAgICAgIGVuZERhdGU6IG1vbWVudCgpLmFkZCgxLCAnWScpLmZvcm1hdCgnRC1NLVlZWVknKSxcclxuICAgICAgICAgICAgZW5kRGF0ZUZvcm1hdHRlZDogbnVsbCxcclxuICAgICAgICAgICAgb3JkZXJCeTogJ2RhdGUnLFxyXG4gICAgICAgICAgICBvcmRlckRpcmVjdGlvbjogJ2FzY2VuZGluZycsXHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogbW9tZW50KCkuZm9ybWF0KCdELU0tWVlZWScpLFxyXG4gICAgICAgICAgICBzdGFydERhdGVGb3JtYXR0ZWQ6IG51bGwsXHJcbiAgICAgICAgICAgIHR5cGU6ICdpbXBvcnQnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGNoYW5nZVRyYWRlTW92ZW1lbnQ6IGNoYW5nZVRyYWRlTW92ZW1lbnQsXHJcbiAgICAgICAgbG9hZE5ld0NvZGVzOiBsb2FkTmV3Q29kZXMsXHJcbiAgICAgICAgbG9hZE9sZENvZGVzOiBsb2FkT2xkQ29kZXMsXHJcbiAgICAgICAgb3Blbk9sZENvZGVJbk5ld1dpbmRvdzogb3Blbk9sZENvZGVJbk5ld1dpbmRvdyxcclxuICAgICAgICBvcGVuTmV3Q29kZUluTmV3V2luZG93OiBvcGVuTmV3Q29kZUluTmV3V2luZG93LFxyXG4gICAgICAgIGFjdGl2ZVN1Ym5hdjogJHJvdXRlUGFyYW1zLmFjdGl2ZVN1Ym5hdixcclxuICAgICAgICByZWZlcmVuY2VDb3VudHJ5OiBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSxcclxuICAgICAgICB0cmFuc2xhdGlvbnM6IHt9XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gb3Blbk9sZENvZGVJbk5ld1dpbmRvdyhvbGRDb2RlLCBuZXdDb2RlKSB7XHJcbiAgICAgICAgaWYgKG9sZENvZGUuZW5kRGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAobW9tZW50KG9sZENvZGUuZW5kRGF0ZSkuaXNCZWZvcmUoc3RhdGUuZmlsdGVyLnJlZmVyZW5jZURhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAkd2luZG93Lm9wZW4oJy8jIS9zZWFyY2gvdHJlZT9jb21tb2RpdHlDb2RlPScgKyBvbGRDb2RlLmdvb2Rzbm9tICsgJyZkYXRlPScgKyBtb21lbnQob2xkQ29kZS5lbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5ld0NvZGUuc3RhcnREYXRlKSB7XHJcbiAgICAgICAgICAgIGlmIChtb21lbnQobmV3Q29kZS5zdGFydERhdGUpLmlzQmVmb3JlKHN0YXRlLmZpbHRlci5yZWZlcmVuY2VEYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgJHdpbmRvdy5vcGVuKCcvIyEvc2VhcmNoL3RyZWU/Y29tbW9kaXR5Q29kZT0nICsgb2xkQ29kZS5nb29kc25vbSArICcmZGF0ZT0nICsgbW9tZW50KG5ld0NvZGUuc3RhcnREYXRlKS5zdWJ0cmFjdCgxLCAnZCcpLmZvcm1hdCgnWVlZWS1NTS1ERCcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAkd2luZG93Lm9wZW4oJy8jIS9zZWFyY2gvJyArIG9sZENvZGUuZ29vZHNub20pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG9wZW5OZXdDb2RlSW5OZXdXaW5kb3cob2xkQ29kZSwgbmV3Q29kZSkge1xyXG4gICAgICAgIGlmIChuZXdDb2RlLnN0YXJ0RGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAobW9tZW50KG5ld0NvZGUuc3RhcnREYXRlKS5pc0FmdGVyKHN0YXRlLmZpbHRlci5yZWZlcmVuY2VEYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgJHdpbmRvdy5vcGVuKCcvIyEvc2VhcmNoL3RyZWU/Y29tbW9kaXR5Q29kZT0nICsgbmV3Q29kZS5nb29kc25vbSArICcmZGF0ZT0nICsgbW9tZW50KG5ld0NvZGUuc3RhcnREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9sZENvZGUuZW5kRGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAobW9tZW50KG9sZENvZGUuZW5kRGF0ZSkuaXNBZnRlcihzdGF0ZS5maWx0ZXIucmVmZXJlbmNlRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICR3aW5kb3cub3BlbignLyMhL3NlYXJjaC90cmVlP2NvbW1vZGl0eUNvZGU9JyArIG5ld0NvZGUuZ29vZHNub20gKyAnJmRhdGU9JyArIG1vbWVudChvbGRDb2RlLmVuZERhdGUpLmFkZCgxLCAnZCcpLmZvcm1hdCgnWVlZWS1NTS1ERCcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAkd2luZG93Lm9wZW4oJy8jIS9zZWFyY2gvdHJlZT9jb21tb2RpdHlDb2RlPScgKyBuZXdDb2RlLmdvb2Rzbm9tKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtb3ZlbWVudENoYW5nZWQoKSB7XHJcbiAgICAgICAgdm0uZmlsdGVyLnR5cGUgPSBzdGF0ZS5maWx0ZXIubW92ZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy51bnN1YnNjcmliZSgnZmlsdGVyX21vdmVtZW50X2NoYW5nZWQnLCBtb3ZlbWVudENoYW5nZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMuc3Vic2NyaWJlKCdmaWx0ZXJfbW92ZW1lbnRfY2hhbmdlZCcsIG1vdmVtZW50Q2hhbmdlZCk7XHJcblxyXG4gICAgICAgIHZtLmZpbHRlci50eXBlID0gc3RhdGUuZmlsdGVyLm1vdmVtZW50O1xyXG4gICAgICAgIGlmICh2bS5hY3RpdmVTdWJuYXYuaW5kZXhPZigncmVjZW50JykgPiAwKSB7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5kYXRlSW50ZXJ2YWwgPSAnbGFzdC15ZWFyJztcclxuICAgICAgICAgICAgdm0uZmlsdGVyLnN0YXJ0RGF0ZSA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICdZJykuZm9ybWF0KCdELU0tWVlZWScpO1xyXG4gICAgICAgICAgICB2bS5maWx0ZXIuZW5kRGF0ZSA9IG1vbWVudCgpLmZvcm1hdCgnRC1NLVlZWVknKTtcclxuICAgICAgICAgICAgdm0uZmlsdGVyLm9yZGVyQnkgPSAnZGF0ZSc7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5vcmRlckRpcmVjdGlvbiA9ICdkZXNjZW5kaW5nJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodm0uYWN0aXZlU3VibmF2LmluZGV4T2YoJ3VwY29taW5nJykgPiAwKSB7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5kYXRlSW50ZXJ2YWwgPSAndXBjb21pbmcteWVhcic7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5zdGFydERhdGUgPSBtb21lbnQoKS5mb3JtYXQoJ0QtTS1ZWVlZJyk7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5lbmREYXRlID0gbW9tZW50KCkuYWRkKDEsICdZJykuZm9ybWF0KCdELU0tWVlZWScpO1xyXG4gICAgICAgICAgICB2bS5maWx0ZXIub3JkZXJCeSA9ICdkYXRlJztcclxuICAgICAgICAgICAgdm0uZmlsdGVyLm9yZGVyRGlyZWN0aW9uID0gJ2FzY2VuZGluZyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCRyb3V0ZVBhcmFtcy5jb2RlKSB7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5kYXRlSW50ZXJ2YWwgPSAnY2hvb3NlLWRhdGVzJztcclxuICAgICAgICAgICAgaWYgKGZvcm1hdHRpbmcuaXNDaGFwdGVyQ29kZSgkcm91dGVQYXJhbXMuY29kZSkpIHtcclxuICAgICAgICAgICAgICAgIHZtLmZpbHRlci5zdGFydERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdCgyLCAnWScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1hdHRpbmcuaXNIZWFkaW5nQ29kZSgkcm91dGVQYXJhbXMuY29kZSkpIHtcclxuICAgICAgICAgICAgICAgIHZtLmZpbHRlci5zdGFydERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdCg1LCAnWScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdm0uZmlsdGVyLnN0YXJ0RGF0ZSA9IG1vbWVudCgpLnN1YnRyYWN0KDIwLCAnWScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5lbmREYXRlID0gbW9tZW50KCkuYWRkKDIsICdNJykuZm9ybWF0KCdELU0tWVlZWScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdm0uZmlsdGVyLmRhdGVJbnRlcnZhbCA9ICdjaG9vc2UtZGF0ZXMnO1xyXG4gICAgICAgICAgICB2bS5maWx0ZXIuc3RhcnREYXRlID0gbW9tZW50KCkuc3VidHJhY3QoMTAsICdNJykuZm9ybWF0KCdELU0tWVlZWScpO1xyXG4gICAgICAgICAgICB2bS5maWx0ZXIuZW5kRGF0ZSA9IG1vbWVudCgpLmFkZCgyLCAnTScpLmZvcm1hdCgnRC1NLVlZWVknKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9hZFRyYW5zbGF0aW9ucygpOyAgIFxyXG4gICAgICAgIGxvYWRDb3JyZWxhdGlvblRhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZENvcnJlbGF0aW9uVGFibGUoKSB7XHJcbiAgICAgICAgaWYgKHZtLmFjdGl2ZVN1Ym5hdi5pbmRleE9mKCdleHBpcmVkLWNvZGVzJykgPT09IDApIHtcclxuICAgICAgICAgICAgbG9hZE9sZENvZGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHZtLmFjdGl2ZVN1Ym5hdi5pbmRleE9mKCduZXctY29kZXMnKSA9PT0gMCkge1xyXG4gICAgICAgICAgICBsb2FkTmV3Q29kZXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2hhbmdlVHJhZGVNb3ZlbWVudChuZXdUcmFkZU1vdmVtZW50KSB7XHJcbiAgICAgICAgdHJhZGVNb3ZlbWVudC5zZXQobmV3VHJhZGVNb3ZlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2hhbmdlRGF0ZUludGVydmFsKG5ld0RhdGVJbnRlcnZhbCkge1xyXG4gICAgICAgIGlmIChuZXdEYXRlSW50ZXJ2YWwgPT09ICd1cGNvbWluZy15ZWFyJykge1xyXG4gICAgICAgICAgICB2bS5maWx0ZXIuc3RhcnREYXRlID0gbW9tZW50KCkuZm9ybWF0KCdELU0tWVlZWScpO1xyXG4gICAgICAgICAgICB2bS5maWx0ZXIuZW5kRGF0ZSA9IG1vbWVudCgpLmFkZCgxLCAnWScpLmZvcm1hdCgnRC1NLVlZWVknKTtcclxuICAgICAgICAgICAgdm0uZmlsdGVyLm9yZGVyQnkgPSAnZGF0ZSc7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5vcmRlckRpcmVjdGlvbiA9ICdhc2NlbmRpbmcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChuZXdEYXRlSW50ZXJ2YWwgPT09ICdsYXN0LXllYXInKSB7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5zdGFydERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnWScpLmZvcm1hdCgnRC1NLVlZWVknKTtcclxuICAgICAgICAgICAgdm0uZmlsdGVyLmVuZERhdGUgPSBtb21lbnQoKS5mb3JtYXQoJ0QtTS1ZWVlZJyk7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5vcmRlckJ5ID0gJ2RhdGUnO1xyXG4gICAgICAgICAgICB2bS5maWx0ZXIub3JkZXJEaXJlY3Rpb24gPSAnZGVzY2VuZGluZyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgeyAvLyBjaG9vc2UgZGF0ZXNcclxuICAgICAgICAgICAgdm0uZmlsdGVyLm9yZGVyQnkgPSAnY29tbW9kaXR5Q29kZSc7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5vcmRlckRpcmVjdGlvbiA9ICdhc2NlbmRpbmcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsb2FkQ29ycmVsYXRpb25UYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRPbGRDb2RlcygpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJy9sb2FkLWNvcnJlbGF0aW9uLXRhYmxlJywgeyBjYXRlZ29yeTogdm0uYWN0aXZlU3VibmF2IH0pO1xyXG4gICAgICAgIHZtLmFjdGl2ZVN1Ym5hdiA9IHZtLmFjdGl2ZVN1Ym5hdi5yZXBsYWNlKCduZXctY29kZXMnLCAnZXhwaXJlZC1jb2RlcycpO1xyXG4gICAgICAgIHZtLmJlZm9yZUZpcnN0U2VhcmNoID0gZmFsc2U7XHJcbiAgICAgICAgdm0uZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIHZtLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgc2V0RGF0ZXMoKTtcclxuICAgICAgICBjb3JyZWxhdGlvbkRhdGEuZ2V0T2xkQ29kZXModm0uZmlsdGVyLnN0YXJ0RGF0ZUZvcm1hdHRlZCwgdm0uZmlsdGVyLmVuZERhdGVGb3JtYXR0ZWQsIHZtLmZpbHRlci5nb29kc25vbSwgdm0uZmlsdGVyLnR5cGUsIHZtLmZpbHRlci5vcmRlckJ5LCB2bS5maWx0ZXIub3JkZXJEaXJlY3Rpb24pXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHZtLmRhdGEubmV3Q29kZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHZtLmRhdGEub2xkQ29kZXMgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSwgaGFuZGxlRXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWROZXdDb2RlcygpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJy9sb2FkLWNvcnJlbGF0aW9uLXRhYmxlJywgeyBjYXRlZ29yeTogdm0uYWN0aXZlU3VibmF2IH0pO1xyXG4gICAgICAgIHZtLmFjdGl2ZVN1Ym5hdiA9IHZtLmFjdGl2ZVN1Ym5hdi5yZXBsYWNlKCdleHBpcmVkLWNvZGVzJywgJ25ldy1jb2RlcycpO1xyXG4gICAgICAgIHZtLmJlZm9yZUZpcnN0U2VhcmNoID0gZmFsc2U7XHJcbiAgICAgICAgdm0uZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIHZtLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgc2V0RGF0ZXMoKTtcclxuICAgICAgICBjb3JyZWxhdGlvbkRhdGEuZ2V0TmV3Q29kZXModm0uZmlsdGVyLnN0YXJ0RGF0ZUZvcm1hdHRlZCwgdm0uZmlsdGVyLmVuZERhdGVGb3JtYXR0ZWQsIHZtLmZpbHRlci5nb29kc25vbSwgdm0uZmlsdGVyLnR5cGUsIHZtLmZpbHRlci5vcmRlckJ5LCB2bS5maWx0ZXIub3JkZXJEaXJlY3Rpb24pXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHZtLmRhdGEub2xkQ29kZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHZtLmRhdGEubmV3Q29kZXMgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSwgaGFuZGxlRXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yUmVzcG9uc2UpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZXJyb3JSZXNwb25zZSAmJiBlcnJvclJlc3BvbnNlLmRhdGEgJiYgZXJyb3JSZXNwb25zZS5kYXRhLk1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yUmVzcG9uc2UuZGF0YS5NZXNzYWdlID09PSAnWW91IGNhbm5vdCBzcGVjaWZ5IGEgcGVyaW9kIG9mIG1vcmUgdGhhbiBhIHllYXInKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5lcnJvciA9IHZtLnRyYW5zbGF0aW9uc1snY29ycmVsYXRpb25UYWJsZS5NYXhPbmVZZWFySW50ZXJ2YWwnXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB2bS5lcnJvciA9IGVycm9yUmVzcG9uc2UuZGF0YS5NZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHZtLmVycm9yID0gJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZC4gUGxlYXNlIGNvbnRhY3QgVGFyaWMgU3VwcG9ydC4nOyAvLyBUT0RPOiB0cmFuc2xhdGVcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXREYXRlcygpIHtcclxuICAgICAgICBpZiAodm0uZmlsdGVyLnN0YXJ0RGF0ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2bS5maWx0ZXIuc3RhcnREYXRlRm9ybWF0dGVkID0gbW9tZW50KHZtLmZpbHRlci5zdGFydERhdGUsICdERC1NTS1ZWVlZJykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlci5zdGFydERhdGUgPSBtb21lbnQodm0uZmlsdGVyLnN0YXJ0RGF0ZSwgJ0RELU1NLVlZWVknKS5mb3JtYXQoJ0QtTS1ZWVlZJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2bS5maWx0ZXIuZW5kRGF0ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2bS5maWx0ZXIuZW5kRGF0ZUZvcm1hdHRlZCA9IG1vbWVudCh2bS5maWx0ZXIuZW5kRGF0ZSwgJ0RELU1NLVlZWVknKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICAgICAgdm0uZmlsdGVyLmVuZERhdGUgPSBtb21lbnQodm0uZmlsdGVyLmVuZERhdGUsICdERC1NTS1ZWVlZJykuZm9ybWF0KCdELU0tWVlZWScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkVHJhbnNsYXRpb25zKCkge1xyXG4gICAgICAgICR0cmFuc2xhdGUoW1xyXG4gICAgICAgICAgICAnc2hhcmVkLnVpLk1heE9uZVllYXJJbnRlcnZhbCdcclxuICAgICAgICBdKS50aGVuKGZ1bmN0aW9uICh0cmFuc2xhdGlvbnMpIHtcclxuICAgICAgICAgICAgdm0udHJhbnNsYXRpb25zID0gdHJhbnNsYXRpb25zO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBoczIwMjJiYWNrd2FyZENvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2NvcnJlbGF0aW9uLXRhYmxlL2NvbXBvbmVudHMvaHMtMjAyMi1iYWNrd2FyZC1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG5oczIwMjJiYWNrd2FyZENvbnRyb2xsZXIuJGluamVjdCA9IFsnJGFuYWx5dGljcyddO1xyXG5cclxuZnVuY3Rpb24gaHMyMDIyYmFja3dhcmRDb250cm9sbGVyKCRhbmFseXRpY3MpIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWRcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9jb3JyZWxhdGlvbi10YWJsZS9oczIwMjInKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHZtO1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHt9LFxyXG4gICAgY29udHJvbGxlcjogaHMyMDIyQmFja3dhcmRDb3JyZWxhdGlvbnNDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdjb3JyZWxhdGlvbi10YWJsZS9jb21wb25lbnRzL2hzLTIwMjItYmFja3dhcmQuaHRtbCdcclxufTtcclxuXHJcbmhzMjAyMkJhY2t3YXJkQ29ycmVsYXRpb25zQ29udHJvbGxlci4kaW5qZWN0ID0gWydjb3JyZWxhdGlvbkRhdGFTZXJ2aWNlJ107XHJcblxyXG5mdW5jdGlvbiBoczIwMjJCYWNrd2FyZENvcnJlbGF0aW9uc0NvbnRyb2xsZXIoY29ycmVsYXRpb25EYXRhU2VydmljZSkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgIHNlYXJjaDogc2VhcmNoXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIHNlYXJjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlYXJjaChjb21tb2RpdHlDb2RlKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gY29ycmVsYXRpb25EYXRhU2VydmljZVxyXG4gICAgICAgICAgICAuZ2V0SHMyMDIyQmFja3dhcmRDb3JyZWxhdGlvbnMoY29tbW9kaXR5Q29kZSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2bS5yZXN1bHQgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBoczIwMjJmb3J3YXJkQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY29ycmVsYXRpb24tdGFibGUvY29tcG9uZW50cy9ocy0yMDIyLWZvcndhcmQtcGFnZS5odG1sJ1xyXG59O1xyXG5cclxuaHMyMDIyZm9yd2FyZENvbnRyb2xsZXIuJGluamVjdCA9IFsnJGFuYWx5dGljcyddO1xyXG5cclxuZnVuY3Rpb24gaHMyMDIyZm9yd2FyZENvbnRyb2xsZXIoJGFuYWx5dGljcykge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL2NvcnJlbGF0aW9uLXRhYmxlL2hzMjAyMicpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gdm07XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge30sXHJcbiAgICBjb250cm9sbGVyOiBoczIwMjJGb3J3YXJkQ29ycmVsYXRpb25zQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY29ycmVsYXRpb24tdGFibGUvY29tcG9uZW50cy9ocy0yMDIyLWZvcndhcmQuaHRtbCdcclxufTtcclxuXHJcbmhzMjAyMkZvcndhcmRDb3JyZWxhdGlvbnNDb250cm9sbGVyLiRpbmplY3QgPSBbJ2NvcnJlbGF0aW9uRGF0YVNlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIGhzMjAyMkZvcndhcmRDb3JyZWxhdGlvbnNDb250cm9sbGVyKGNvcnJlbGF0aW9uRGF0YVNlcnZpY2UpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICBzZWFyY2g6IHNlYXJjaFxyXG4gICAgfTtcclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICBzZWFyY2goKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWFyY2goY29tbW9kaXR5Q29kZSkge1xyXG4gICAgICAgIHZtLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGNvcnJlbGF0aW9uRGF0YVNlcnZpY2VcclxuICAgICAgICAgICAgLmdldEhzMjAyMkZvcndhcmRDb3JyZWxhdGlvbnMoY29tbW9kaXR5Q29kZSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2bS5yZXN1bHQgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFsnY29tbW9uJywgJ2RhdGFDb250ZXh0JywgY29ycmVsYXRpb25EYXRhU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBjb3JyZWxhdGlvbkRhdGFTZXJ2aWNlKGNvbW1vbiwgY29udGV4dCkge1xyXG5cclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGdldE5ld0NvZGVzOiBnZXROZXdDb2RlcyxcclxuICAgICAgICBnZXRPbGRDb2RlczogZ2V0T2xkQ29kZXMsXHJcbiAgICAgICAgZ2V0SHMyMDIyRm9yd2FyZENvcnJlbGF0aW9uczogZ2V0SHMyMDIyRm9yd2FyZENvcnJlbGF0aW9ucyxcclxuICAgICAgICBnZXRIczIwMjJCYWNrd2FyZENvcnJlbGF0aW9uczogZ2V0SHMyMDIyQmFja3dhcmRDb3JyZWxhdGlvbnMsXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGdldE5ld0NvZGVzKHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgY29tbW9kaXR5Q29kZSwgbW92ZW1lbnRUeXBlLCBvcmRlckJ5LCBvcmRlckRpcmVjdGlvbikge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL2NvbW1vZGl0eS1jb2RlLWNvcnJlbGF0aW9uL29yaWdpbmF0b3JzJztcclxuICAgICAgICB1cmwgKz0gJz9zdGFydERhdGU9JyArIHN0YXJ0RGF0ZSArICcmZW5kRGF0ZT0nICsgZW5kRGF0ZTtcclxuICAgICAgICB1cmwgKz0gJyZtb3ZlbWVudD0nICsgbW92ZW1lbnRUeXBlO1xyXG4gICAgICAgIHVybCArPSAnJm9yZGVyYnk9JyArIG9yZGVyQnk7XHJcbiAgICAgICAgdXJsICs9ICcmb3JkZXJEaXJlY3Rpb249JyArIChvcmRlckRpcmVjdGlvbiB8fCAnYXNjZW5kaW5nJyk7XHJcbiAgICAgICAgaWYgKGNvbW1vZGl0eUNvZGUpIHtcclxuICAgICAgICAgICAgdXJsICs9ICcmY29tbW9kaXR5Q29kZT0nICsgY29tbW9kaXR5Q29kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldE9sZENvZGVzKHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgY29tbW9kaXR5Q29kZSwgbW92ZW1lbnRUeXBlLCBvcmRlckJ5LCBvcmRlckRpcmVjdGlvbikge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL2NvbW1vZGl0eS1jb2RlLWNvcnJlbGF0aW9uL3N1Y2Nlc3NvcnMnO1xyXG4gICAgICAgIHVybCArPSAnP3N0YXJ0RGF0ZT0nICsgc3RhcnREYXRlICsgJyZlbmREYXRlPScgKyBlbmREYXRlO1xyXG4gICAgICAgIHVybCArPSAnJm1vdmVtZW50PScgKyBtb3ZlbWVudFR5cGU7XHJcbiAgICAgICAgdXJsICs9ICcmb3JkZXJieT0nICsgb3JkZXJCeTtcclxuICAgICAgICB1cmwgKz0gJyZvcmRlckRpcmVjdGlvbj0nICsgKG9yZGVyRGlyZWN0aW9uIHx8ICdhc2NlbmRpbmcnKTtcclxuICAgICAgICBpZiAoY29tbW9kaXR5Q29kZSkge1xyXG4gICAgICAgICAgICB1cmwgKz0gJyZjb21tb2RpdHlDb2RlPScgKyBjb21tb2RpdHlDb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0SHMyMDIyRm9yd2FyZENvcnJlbGF0aW9ucyhjb21tb2RpdHlDb2RlKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvaHMtMjAyMi9mb3J3YXJkLWNvcnJlbGF0aW9ucydcclxuICAgICAgICBpZiAoY29tbW9kaXR5Q29kZSkge1xyXG4gICAgICAgICAgICB1cmwgKz0gJz9nb29kc2NvZGU9JyArIGNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEhzMjAyMkJhY2t3YXJkQ29ycmVsYXRpb25zKGNvbW1vZGl0eUNvZGUpIHtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9ocy0yMDIyL2JhY2t3YXJkLWNvcnJlbGF0aW9ucydcclxuICAgICAgICBpZiAoY29tbW9kaXR5Q29kZSkge1xyXG4gICAgICAgICAgICB1cmwgKz0gJz9nb29kc2NvZGU9JyArIGNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxufVxyXG4iLCJhbmd1bGFyLm1vZHVsZSgndGFyaWMuY3VzdG9tc1ZhbHVlJywgW10pXHJcbiAgICAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCByb3V0ZUNvbmZpZ3VyYXRvcl0pXHJcbiAgICAuY29tcG9uZW50KCd0cmFuc2FjdGlvblZhbHVlQ2FsY3VsYXRvclBhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvdHJhbnNhY3Rpb24tdmFsdWUtY2FsY3VsYXRvci1wYWdlJykpXHJcbiAgICAuY29tcG9uZW50KCd0cmFuc2FjdGlvblZhbHVlQ2FsY3VsYXRvcicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy90cmFuc2FjdGlvbi12YWx1ZS1jYWxjdWxhdG9yJykpXHJcbiAgICAuY29tcG9uZW50KCd0cmFuc2FjdGlvblZhbHVlQ29tcG9uZW50JywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3RyYW5zYWN0aW9uLXZhbHVlLWNvbXBvbmVudCcpKVxyXG4gICAgLmZhY3RvcnkoJ3RyYW5zYWN0aW9uVmFsdWVDYWxjdWxhdG9yTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy90cmFuc2FjdGlvbi12YWx1ZS1jYWxjdWxhdG9yJykpXHJcbiAgICAuZmFjdG9yeSgndHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy90cmFuc2FjdGlvbi12YWx1ZS1kYXRhJykpXHJcbiAgICA7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL3RyYW5zYWN0aW9uLXZhbHVlLWNhbGN1bGF0b3InLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHRyYW5zYWN0aW9uLXZhbHVlLWNhbGN1bGF0b3ItcGFnZT48L3RyYW5zYWN0aW9uLXZhbHVlLWNhbGN1bGF0b3ItcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICA7XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiB0cmFuc2FjdGlvblZhbHVlQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnY3VzdG9tcy12YWx1ZS9jb21wb25lbnRzL3RyYW5zYWN0aW9uLXZhbHVlLWNhbGN1bGF0b3ItcGFnZS5odG1sJ1xyXG59O1xyXG5cclxudHJhbnNhY3Rpb25WYWx1ZUNvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnJHdpbmRvdycsIFxyXG4gICAgJ3RyYW5zYWN0aW9uVmFsdWVEYXRhU2VydmljZScsIFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHRyYW5zYWN0aW9uVmFsdWVDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkd2luZG93LCBcclxuICAgIHRyYW5zYWN0aW9uVmFsdWVEYXRhU2VydmljZSwgXHJcbiAgICBzdGF0ZVxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgcmVmZXJlbmNlQ291bnRyeTogc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnksXHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgcHJpbnQ6IHByaW50XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy90cmFuc2FjdGlvbi12YWx1ZS1jYWxjdWxhdG9yJyk7XHJcbiAgICAgICAgdHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlLmluaXRUcmFuc2FjdGlvblZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcHJpbnQoKSB7XHJcbiAgICAgICAgJHdpbmRvdy5wcmludCgpO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiB0cmFuc2FjdGlvblZhbHVlQ2FsY3VsYXRvckNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2N1c3RvbXMtdmFsdWUvY29tcG9uZW50cy90cmFuc2FjdGlvbi12YWx1ZS1jYWxjdWxhdG9yLmh0bWwnXHJcbn07XHJcblxyXG50cmFuc2FjdGlvblZhbHVlQ2FsY3VsYXRvckNvbnRyb2xsZXIuJGluamVjdCA9IFsndHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlJ107XHJcblxyXG5mdW5jdGlvbiB0cmFuc2FjdGlvblZhbHVlQ2FsY3VsYXRvckNvbnRyb2xsZXIodHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgb25DaGFuZ2VUcmFuc2FjdGlvblZhbHVlOiBvbkNoYW5nZVRyYW5zYWN0aW9uVmFsdWUsXHJcbiAgICAgICAgYWN0aXZlVGFiczoge1xyXG4gICAgICAgICAgICBhZGRpdGlvbnM6ICdkZWxpdmVyeS1jb3N0cycsXHJcbiAgICAgICAgICAgIGRlZHVjdGlvbnM6ICdkZWxpdmVyeS1jb3N0cydcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNhbGN1bGF0b3JWZXJzaW9uOiAnYmFzaWMnLFxyXG4gICAgICAgIGRhdGE6IHt9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICB2bS5kYXRhID0gdHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25DaGFuZ2VUcmFuc2FjdGlvblZhbHVlKCkge1xyXG4gICAgICAgIHRyYW5zYWN0aW9uVmFsdWVEYXRhU2VydmljZS5jYWxjdWxhdGVSZXN1bHQoKTtcclxuICAgIH1cclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgZmllbGROYW1lOiAnQCcsXHJcbiAgICAgICAgZmllbGRUeXBlOiAnQCcsXHJcbiAgICAgICAgbGFiZWw6ICdAJyxcclxuICAgICAgICBvbkNsaWNrSGVscFRleHQ6ICdAJ1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IHRyYW5zYWN0aW9uVmFsdWVDb21wb25lbnRDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdjdXN0b21zLXZhbHVlL2NvbXBvbmVudHMvdHJhbnNhY3Rpb24tdmFsdWUtY29tcG9uZW50Lmh0bWwnXHJcbn07XHJcblxyXG50cmFuc2FjdGlvblZhbHVlQ29tcG9uZW50Q29udHJvbGxlci4kaW5qZWN0ID0gWyd0cmFuc2FjdGlvblZhbHVlRGF0YVNlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIHRyYW5zYWN0aW9uVmFsdWVDb21wb25lbnRDb250cm9sbGVyKHRyYW5zYWN0aW9uVmFsdWVEYXRhU2VydmljZSkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIGRhdGE6IHRyYW5zYWN0aW9uVmFsdWVEYXRhU2VydmljZS5kYXRhLFxyXG4gICAgICAgIHNob3dPbkNsaWNrSGVscFRleHQ6IGZhbHNlLFxyXG4gICAgICAgIGFkZEZpZWxkOiBhZGRGaWVsZCxcclxuICAgICAgICByZW1vdmVGaWVsZDogcmVtb3ZlRmllbGQsXHJcbiAgICAgICAgb25DaGFuZ2VUcmFuc2FjdGlvblZhbHVlOiBvbkNoYW5nZVRyYW5zYWN0aW9uVmFsdWVcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGFkZEZpZWxkKGZpZWxkVHlwZSwgZmllbGROYW1lKSB7XHJcbiAgICAgICAgdHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlLmFkZEZpZWxkKGZpZWxkVHlwZSwgZmllbGROYW1lKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlRmllbGQoZmllbGRUeXBlLCBmaWVsZE5hbWUsIGluZGV4KSB7XHJcbiAgICAgICAgdHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlLnJlbW92ZUZpZWxkKGZpZWxkVHlwZSwgZmllbGROYW1lLCBpbmRleCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGZ1bmN0aW9uIG9uQ2hhbmdlVHJhbnNhY3Rpb25WYWx1ZSgpIHtcclxuICAgICAgICB0cmFuc2FjdGlvblZhbHVlRGF0YVNlcnZpY2UuY2FsY3VsYXRlUmVzdWx0KCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsIm1vZHVsZS5leHBvcnRzID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckdWliTW9kYWwnLCBcclxuICAgIHRyYW5zYWN0aW9uVmFsdWVDYWxjdWxhdG9yTW9kYWxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHRyYW5zYWN0aW9uVmFsdWVDYWxjdWxhdG9yTW9kYWwoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICR1aWJNb2RhbFxyXG4pIHtcclxuXHJcbiAgICB2YXIgbW9kYWwgPSB7XHJcbiAgICAgICAgc2hvdzogc2hvd01vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIHRyYW5zYWN0aW9uVmFsdWVDYWxjdWxhdG9yTW9kYWxDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAgICAgJyR3aW5kb3cnLCBcclxuICAgICAgICAndHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlJywgXHJcbiAgICAgICAgJyR1aWJNb2RhbEluc3RhbmNlJyxcclxuICAgIF07XHJcblxyXG4gICAgZnVuY3Rpb24gdHJhbnNhY3Rpb25WYWx1ZUNhbGN1bGF0b3JNb2RhbENvbnRyb2xsZXIoXHJcbiAgICAgICAgJHdpbmRvdywgXHJcbiAgICAgICAgdHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlLCBcclxuICAgICAgICAkdWliTW9kYWxJbnN0YW5jZVxyXG4gICAgKSB7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHtcclxuICAgICAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICBvazogb2ssXHJcbiAgICAgICAgICAgIHByaW50OiBwcmludCxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdm07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygnY2FuY2VsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBvaygpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UodHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlLmRhdGEudHJhbnNhY3Rpb25WYWx1ZS5yZXN1bHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcHJpbnQoKSB7XHJcbiAgICAgICAgICAgICR3aW5kb3cucHJpbnQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgICAgICB2bS5kYXRhID0gdHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlLmRhdGE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TW9kYWwoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdvcGVuLW1vZGFsLXRyYW5zYWN0aW9uLXZhbHVlLWNhbGN1bGF0b3InLCB7IGNhdGVnb3J5OiAndHJhbnNhY3Rpb24tdmFsdWUtY2FsY3VsYXRvcicgfSk7XHJcbiAgICAgICAgcmV0dXJuICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICBiYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogdHJhbnNhY3Rpb25WYWx1ZUNhbGN1bGF0b3JNb2RhbENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ2N0cmwnLFxyXG4gICAgICAgICAgICBrZXlib2FyZDogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kYWxGYWRlOiB0cnVlLFxyXG4gICAgICAgICAgICBzaXplOiAnbGcnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2N1c3RvbXMtdmFsdWUvbW9kYWxzL3RyYW5zYWN0aW9uLXZhbHVlLWNhbGN1bGF0b3IuaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtdHJhbnNhY3Rpb24tdmFsdWUtY2FsY3VsYXRvciBtb2RhbC13aWRlJ1xyXG4gICAgICAgIH0pLnJlc3VsdC5jYXRjaChmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgIGlmICghKHJlcyA9PT0gJ2NhbmNlbCcgfHwgcmVzID09PSAnZXNjYXBlIGtleSBwcmVzcycgfHwgcmVzID09PSAnYmFja2Ryb3AgY2xpY2snKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1vZGFsO1xyXG59XHJcbiIsInZhciBtb21lbnQgPSByZXF1aXJlKCdtb21lbnQnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gWydjb21tb24nLCAnZGF0YUNvbnRleHQnLCAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCB0cmFuc2FjdGlvblZhbHVlRGF0YVNlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gdHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlKGNvbW1vbiwgY29udGV4dCwgc3RhdGUpIHtcclxuXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIG1vbmV0YXJ5VW5pdDogZ2V0RGVmYXVsdE1vbmV0YXJ5VW5pdCgpLFxyXG4gICAgICAgICAgICB0cmFuc2FjdGlvblZhbHVlOiBudWxsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWRkRmllbGQ6IGFkZEZpZWxkLFxyXG4gICAgICAgIHJlbW92ZUZpZWxkOiByZW1vdmVGaWVsZCxcclxuICAgICAgICBjYWxjdWxhdGVSZXN1bHQ6IGNhbGN1bGF0ZVJlc3VsdCxcclxuICAgICAgICBpbml0VHJhbnNhY3Rpb25WYWx1ZTogaW5pdFRyYW5zYWN0aW9uVmFsdWVcclxuICAgIH07XHJcblxyXG4gICAgaW5pdFRyYW5zYWN0aW9uVmFsdWUoKTtcclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiBhZGRGaWVsZChmaWVsZFR5cGUsIGZpZWxkTmFtZSkge1xyXG4gICAgICAgIHNlcnZpY2UuZGF0YS50cmFuc2FjdGlvblZhbHVlW2ZpZWxkVHlwZV1bZmllbGROYW1lXS5wdXNoKGluaXRpYWxpemVNb25ldGFyeVZhbHVlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlbW92ZUZpZWxkKGZpZWxkVHlwZSwgZmllbGROYW1lLCBpbmRleCkge1xyXG4gICAgICAgIHNlcnZpY2UuZGF0YS50cmFuc2FjdGlvblZhbHVlW2ZpZWxkVHlwZV1bZmllbGROYW1lXSA9IF8uZmlsdGVyKFxyXG4gICAgICAgICAgICBzZXJ2aWNlLmRhdGEudHJhbnNhY3Rpb25WYWx1ZVtmaWVsZFR5cGVdW2ZpZWxkTmFtZV0sIGZ1bmN0aW9uKGVsLCBpZHgpIHsgXHJcbiAgICAgICAgICAgIHJldHVybiBpZHggIT0gaW5kZXggXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2FsY3VsYXRlUmVzdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaW5pdFRyYW5zYWN0aW9uVmFsdWUoKSB7XHJcbiAgICAgICAgc2VydmljZS5kYXRhLnRyYW5zYWN0aW9uVmFsdWUgPSB7XHJcbiAgICAgICAgICAgIHByaWNlQWN0dWFsbHlQYWlkT3JQYXlibGU6IGluaXRpYWxpemVNb25ldGFyeVZhbHVlKCksXHJcbiAgICAgICAgICAgIGFkZGl0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgY29tbWlzc2lvbnNBbmRCcm9rZXJhZ2U6IFtpbml0aWFsaXplTW9uZXRhcnlWYWx1ZSgpXSxcclxuICAgICAgICAgICAgICAgIGNvc3RPZkNvbnRhaW5lcnNXaGljaEFyZU9uZVdpdGhHb29kczogW2luaXRpYWxpemVNb25ldGFyeVZhbHVlKCldLFxyXG4gICAgICAgICAgICAgICAgY29zdE9mUGFja2luZzogW2luaXRpYWxpemVNb25ldGFyeVZhbHVlKCldLFxyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxzQ29tcG9uZW50c0FuZFBhcnRzOiBbaW5pdGlhbGl6ZU1vbmV0YXJ5VmFsdWUoKV0sXHJcbiAgICAgICAgICAgICAgICB0b29sc0RpZXNBbmRNb3VsZHM6IFtpbml0aWFsaXplTW9uZXRhcnlWYWx1ZSgpXSxcclxuICAgICAgICAgICAgICAgIG1hdGVyaWFsc0NvbnN1bWVkSW5Qcm9kdWN0aW9uOiBbaW5pdGlhbGl6ZU1vbmV0YXJ5VmFsdWUoKV0sXHJcbiAgICAgICAgICAgICAgICBlbmdpbmVlcmluZ0RldmVsb3BtZW50QXJ0d29ya0Rlc2lnblBsYW5zQW5kU2tldGNoZXM6IFtpbml0aWFsaXplTW9uZXRhcnlWYWx1ZSgpXSxcclxuICAgICAgICAgICAgICAgIHJveWFsdGllc0FuZExpY2Vuc2VGZWVzOiBbaW5pdGlhbGl6ZU1vbmV0YXJ5VmFsdWUoKV0sXHJcbiAgICAgICAgICAgICAgICB2YWx1ZU9mUmVzYWxlRGlzcG9zYWxPclVzZVRoYXRBY2NydWVzVG9TZWxsZXI6IFtpbml0aWFsaXplTW9uZXRhcnlWYWx1ZSgpXSxcclxuICAgICAgICAgICAgICAgIHRyYW5zcG9ydENvc3RzQmVmb3JlRW50cnlJbnRvQ3VzdG9tc1RlcnJpdG9yeTogW2luaXRpYWxpemVNb25ldGFyeVZhbHVlKCldLFxyXG4gICAgICAgICAgICAgICAgaW5zdXJhbmNlQ29zdHNCZWZvcmVFbnRyeUludG9DdXN0b21zVGVycml0b3J5OiBbaW5pdGlhbGl6ZU1vbmV0YXJ5VmFsdWUoKV0sXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nQW5kSGFuZGxpbmdDaGFyZ2VzQmVmb3JlRW50cnlJbnRvQ3VzdG9tc1RlcnJpdG9yeTogW2luaXRpYWxpemVNb25ldGFyeVZhbHVlKCldLFxyXG4gICAgICAgICAgICAgICAgb3RoZXJBZGRpdGlvbnM6IFtpbml0aWFsaXplTW9uZXRhcnlWYWx1ZSgpXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkZWR1Y3Rpb25zOiB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc3BvcnRDb3N0c0FmdGVyRW50cnlJbnRvQ3VzdG9tc1RlcnJpdG9yeTogW2luaXRpYWxpemVNb25ldGFyeVZhbHVlKCldLFxyXG4gICAgICAgICAgICAgICAgY2hhcmdlc0ZvckNvbnN0cnVjdGlvbkVyZWN0aW9uQXNzZW1ibHlNYWludGVuYW5jZU9yVGVjaG5pY2FsQXNzaXN0YW5jZTogW2luaXRpYWxpemVNb25ldGFyeVZhbHVlKCldLFxyXG4gICAgICAgICAgICAgICAgY2hhcmdlc0ZvckludGVyZXN0OiBbaW5pdGlhbGl6ZU1vbmV0YXJ5VmFsdWUoKV0sXHJcbiAgICAgICAgICAgICAgICBjaGFyZ2VzRm9yUmlnaHRUb1JlcHJvZHVjZTogW2luaXRpYWxpemVNb25ldGFyeVZhbHVlKCldLFxyXG4gICAgICAgICAgICAgICAgYnV5aW5nQ29tbWlzaW9uczogW2luaXRpYWxpemVNb25ldGFyeVZhbHVlKCldLFxyXG4gICAgICAgICAgICAgICAgaW1wb3J0RHV0aWVzOiBbaW5pdGlhbGl6ZU1vbmV0YXJ5VmFsdWUoKV0sXHJcbiAgICAgICAgICAgICAgICBwYXltZW50c01hZGVGb3JSaWdodFRvRGlzdHJpYnV0ZU9yUmVzZWxsOiBbaW5pdGlhbGl6ZU1vbmV0YXJ5VmFsdWUoKV0sXHJcbiAgICAgICAgICAgICAgICBvdGhlckRlZHVjdGlvbnM6IFtpbml0aWFsaXplTW9uZXRhcnlWYWx1ZSgpXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICByZXN1bHQ6IGluaXRpYWxpemVNb25ldGFyeVZhbHVlKClcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZVJlc3VsdCgpIHtcclxuICAgICAgICB2YXIgYW1vdW50ID0gMDtcclxuICAgICAgICBpZiAoc2VydmljZS5kYXRhLnRyYW5zYWN0aW9uVmFsdWUucHJpY2VBY3R1YWxseVBhaWRPclBheWJsZS5hbW91bnQpIHtcclxuICAgICAgICAgICAgYW1vdW50ID0gc2VydmljZS5kYXRhLnRyYW5zYWN0aW9uVmFsdWUucHJpY2VBY3R1YWxseVBhaWRPclBheWJsZS5hbW91bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzZXJ2aWNlLmRhdGEudHJhbnNhY3Rpb25WYWx1ZS5yZXN1bHQuYW1vdW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgYWRkaXRpb25GaWVsZE5hbWVzID0gW1xyXG4gICAgICAgICAgICAnY29tbWlzc2lvbnNBbmRCcm9rZXJhZ2UnLFxyXG4gICAgICAgICAgICAnY29zdE9mQ29udGFpbmVyc1doaWNoQXJlT25lV2l0aEdvb2RzJyxcclxuICAgICAgICAgICAgJ2Nvc3RPZlBhY2tpbmcnLFxyXG4gICAgICAgICAgICAnbWF0ZXJpYWxzQ29tcG9uZW50c0FuZFBhcnRzJyxcclxuICAgICAgICAgICAgJ3Rvb2xzRGllc0FuZE1vdWxkcycsXHJcbiAgICAgICAgICAgICdtYXRlcmlhbHNDb25zdW1lZEluUHJvZHVjdGlvbicsXHJcbiAgICAgICAgICAgICdlbmdpbmVlcmluZ0RldmVsb3BtZW50QXJ0d29ya0Rlc2lnblBsYW5zQW5kU2tldGNoZXMnLFxyXG4gICAgICAgICAgICAncm95YWx0aWVzQW5kTGljZW5zZUZlZXMnLFxyXG4gICAgICAgICAgICAndmFsdWVPZlJlc2FsZURpc3Bvc2FsT3JVc2VUaGF0QWNjcnVlc1RvU2VsbGVyJyxcclxuICAgICAgICAgICAgJ3RyYW5zcG9ydENvc3RzQmVmb3JlRW50cnlJbnRvQ3VzdG9tc1RlcnJpdG9yeScsXHJcbiAgICAgICAgICAgICdpbnN1cmFuY2VDb3N0c0JlZm9yZUVudHJ5SW50b0N1c3RvbXNUZXJyaXRvcnknLFxyXG4gICAgICAgICAgICAnbG9hZGluZ0FuZEhhbmRsaW5nQ2hhcmdlc0JlZm9yZUVudHJ5SW50b0N1c3RvbXNUZXJyaXRvcnknLFxyXG4gICAgICAgICAgICAnb3RoZXJBZGRpdGlvbnMnXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgdmFyIGRlZHVjdGlvbkZpZWxkTmFtZXMgPSBbXHJcbiAgICAgICAgICAgICd0cmFuc3BvcnRDb3N0c0FmdGVyRW50cnlJbnRvQ3VzdG9tc1RlcnJpdG9yeScsXHJcbiAgICAgICAgICAgICdjaGFyZ2VzRm9yQ29uc3RydWN0aW9uRXJlY3Rpb25Bc3NlbWJseU1haW50ZW5hbmNlT3JUZWNobmljYWxBc3Npc3RhbmNlJyxcclxuICAgICAgICAgICAgJ2NoYXJnZXNGb3JJbnRlcmVzdCcsXHJcbiAgICAgICAgICAgICdjaGFyZ2VzRm9yUmlnaHRUb1JlcHJvZHVjZScsXHJcbiAgICAgICAgICAgICdidXlpbmdDb21taXNpb25zJyxcclxuICAgICAgICAgICAgLy8gJ2ltcG9ydER1dGllcycsIC8vIFRPRE86IG1vc3QgbGlrZWx5IHdlIHdpbGwgcmVtb3ZlIHRoaXMgZmllbGQgY29tcGxldGVseSFcclxuICAgICAgICAgICAgJ3BheW1lbnRzTWFkZUZvclJpZ2h0VG9EaXN0cmlidXRlT3JSZXNlbGwnLFxyXG4gICAgICAgICAgICAnb3RoZXJEZWR1Y3Rpb25zJ1xyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIF8uZm9yRWFjaChhZGRpdGlvbkZpZWxkTmFtZXMsIGZ1bmN0aW9uIChhZGRpdGlvbkZpZWxkTmFtZSkge1xyXG4gICAgICAgICAgICBfLmZvckVhY2goc2VydmljZS5kYXRhLnRyYW5zYWN0aW9uVmFsdWUuYWRkaXRpb25zW2FkZGl0aW9uRmllbGROYW1lXSwgZnVuY3Rpb24oYWRkaXRpb25GaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFkZGl0aW9uRmllbGQuYW1vdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYW1vdW50ICs9IGFkZGl0aW9uRmllbGQuYW1vdW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBfLmZvckVhY2goZGVkdWN0aW9uRmllbGROYW1lcywgZnVuY3Rpb24gKGRlZHVjdGlvbkZpZWxkTmFtZSkge1xyXG4gICAgICAgICAgICBfLmZvckVhY2goc2VydmljZS5kYXRhLnRyYW5zYWN0aW9uVmFsdWUuZGVkdWN0aW9uc1tkZWR1Y3Rpb25GaWVsZE5hbWVdLCBmdW5jdGlvbihkZWR1Y3Rpb25GaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRlZHVjdGlvbkZpZWxkLmFtb3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFtb3VudCAtPSBkZWR1Y3Rpb25GaWVsZC5hbW91bnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHNlcnZpY2UuZGF0YS50cmFuc2FjdGlvblZhbHVlLnJlc3VsdC5hbW91bnQgPSBhbW91bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0RGVmYXVsdE1vbmV0YXJ5VW5pdCgpIHtcclxuICAgICAgICBpZiAoc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgPT09ICdHQicgJiYgbW9tZW50KHN0YXRlLmZpbHRlci5kYXRlKS5pc0FmdGVyKCcyMDIxLTAxLTAxJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdHQlAnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICdFVVInO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpbml0aWFsaXplTW9uZXRhcnlWYWx1ZSgpIHtcclxuICAgICAgICB2YXIgbW9uZXRhcnlVbml0ID0gZ2V0RGVmYXVsdE1vbmV0YXJ5VW5pdCgpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFtb3VudDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBleGNoYW5nZVJhdGU6IDEsXHJcbiAgICAgICAgICAgIG9yaWdpbmFsQW1vdW50OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIG9yaWdpbmFsVW5pdDogbW9uZXRhcnlVbml0LFxyXG4gICAgICAgICAgICB1bml0OiBtb25ldGFyeVVuaXQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbn0iLCLvu79hbmd1bGFyLm1vZHVsZSgndGFyaWMuZGFzaGJvYXJkJywgW10pXHJcbiAgICAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCByb3V0ZUNvbmZpZ3VyYXRvcl0pXHJcbiAgICAuY29tcG9uZW50KCdsYW5kaW5nUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9sYW5kaW5nLXBhZ2UnKSlcclxuICAgIC5mYWN0b3J5KCdmaXJzdExvZ2luTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9maXJzdC1sb2dpbicpKVxyXG4gICAgO1xyXG5cclxuZnVuY3Rpb24gcm91dGVDb25maWd1cmF0b3IoJHJvdXRlUHJvdmlkZXIpIHtcclxuICAgICRyb3V0ZVByb3ZpZGVyXHJcbiAgICAgICAgLndoZW4oJy9sYW5kaW5nJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxsYW5kaW5nLXBhZ2U+PC9sYW5kaW5nLXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9kYXNoYm9hcmQnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPGxhbmRpbmctcGFnZT48L2xhbmRpbmctcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICA7XHJcbn1cclxuIiwi77u/XHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogbGFuZGluZ1BhZ2VDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdkYXNoYm9hcmQvY29tcG9uZW50cy9sYW5kaW5nLXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbmxhbmRpbmdQYWdlQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckd2luZG93JywgXHJcbiAgICAnY29tbW9uJywgXHJcbiAgICAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCBcclxuICAgICdkb2N1bWVudGF0aW9uU2VydmljZScsIFxyXG4gICAgJ2ZpcnN0TG9naW5Nb2RhbCcsXHJcbiAgICAndmVyc2lvbkhpc3RvcnlTZXJ2aWNlJywgXHJcbiAgICAncHJlZmVyZW5jZVNlcnZpY2UnLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gbGFuZGluZ1BhZ2VDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkd2luZG93LCBcclxuICAgIGNvbW1vbiwgXHJcbiAgICBzdGF0ZSwgXHJcbiAgICBkb2N1bWVudGF0aW9uU2VydmljZSwgXHJcbiAgICBmaXJzdExvZ2luTW9kYWwsXHJcbiAgICB2ZXJzaW9uSGlzdG9yeVNlcnZpY2UsIFxyXG4gICAgcHJlZmVyZW5jZXNcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgIGNvbW1vbjogY29tbW9uLFxyXG4gICAgICAgIHNldFJlZmVyZW5jZUNvdW50cnk6IHNldFJlZmVyZW5jZUNvdW50cnksXHJcbiAgICAgICAgdG9nZ2xlUmVmZXJlbmNlQ291bnRyeU5vdEF2YWlsYWJsZU1lc3NhZ2U6IHRvZ2dsZVJlZmVyZW5jZUNvdW50cnlOb3RBdmFpbGFibGVNZXNzYWdlLFxyXG4gICAgICAgIGFsbG93ZWRSZWZlcmVuY2VDb3VudHJpZXM6IFtdLFxyXG4gICAgICAgIGRpc2FsbG93ZWRSZWZlcmVuY2VDb3VudHJpZXM6IFtdLFxyXG4gICAgICAgIHNob3dSZWZlcmVuY2VDb3VudHJ5Tm90QXZhaWxhYmxlTWVzc2FnZUZvcjogbnVsbCxcclxuICAgICAgICB2ZXJzaW9uSGlzdG9yeTogbnVsbFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL2xhbmRpbmcnKTtcclxuICAgICAgICBjb21tb24uYXV0aC5jaGVjaygpO1xyXG4gICAgICAgIGxvYWRWZXJzaW9uSGlzdG9yeSgpO1xyXG4gICAgICAgIGRvY3VtZW50YXRpb25TZXJ2aWNlLmluaXRpYWxpemUoJ2xhbmRpbmcnKTtcclxuICAgICAgICB2bS5hbGxvd2VkUmVmZXJlbmNlQ291bnRyaWVzID0gY29tbW9uLmlkZW50aXR5LmdldEFsbG93ZWRUcmFkZVRhcmlmZnMoKTtcclxuICAgICAgICB2bS5kaXNhbGxvd2VkUmVmZXJlbmNlQ291bnRyaWVzID0gY29tbW9uLmlkZW50aXR5LmdldERpc2FsbG93ZWRUcmFkZVRhcmlmZnMoKTtcclxuICAgICAgICB2YXIgbGFuZ3VhZ2VQcmVmZXJlbmNlID0gcHJlZmVyZW5jZXMuZ2V0KCdsYW5ndWFnZScsICd3ZWJzaXRlJyk7XHJcbiAgICAgICAgaWYgKGxhbmd1YWdlUHJlZmVyZW5jZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBmaXJzdExvZ2luTW9kYWwuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0b2dnbGVSZWZlcmVuY2VDb3VudHJ5Tm90QXZhaWxhYmxlTWVzc2FnZShyZWZlcmVuY2VDb3VudHJ5KSB7XHJcbiAgICAgICAgaWYgKHZtLnNob3dSZWZlcmVuY2VDb3VudHJ5Tm90QXZhaWxhYmxlTWVzc2FnZUZvciA9PT0gcmVmZXJlbmNlQ291bnRyeSkge1xyXG4gICAgICAgICAgICB2bS5zaG93UmVmZXJlbmNlQ291bnRyeU5vdEF2YWlsYWJsZU1lc3NhZ2VGb3IgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdm0uc2hvd1JlZmVyZW5jZUNvdW50cnlOb3RBdmFpbGFibGVNZXNzYWdlRm9yID0gcmVmZXJlbmNlQ291bnRyeTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZFZlcnNpb25IaXN0b3J5KCkge1xyXG4gICAgICAgIHZlcnNpb25IaXN0b3J5U2VydmljZS5nZXQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgdm0udmVyc2lvbkhpc3RvcnkgPSBfLnNvcnRCeShyZXN1bHQuZGF0YS5oaXN0b3J5LCAncmVsZWFzZURhdGUnKS5yZXZlcnNlKClbMF07XHJcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7IH0gKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRSZWZlcmVuY2VDb3VudHJ5KHJlZmVyZW5jZUNvdW50cnkpIHtcclxuICAgICAgICBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9IHJlZmVyZW5jZUNvdW50cnk7XHJcbiAgICAgICAgcHJlZmVyZW5jZXMuc2V0UmVmZXJlbmNlQ291bnRyeShyZWZlcmVuY2VDb3VudHJ5KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBkb2N1bWVudGF0aW9uU2VydmljZS5leGl0KCk7XHJcbiAgICAgICAgY29tbW9uLiRsb2NhdGlvbi51cmwoJy8nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyR1aWJNb2RhbCcsIFxyXG4gICAgJyR3aW5kb3cnLFxyXG4gICAgJ2xhbmd1YWdlJyxcclxuICAgICdwcmVmZXJlbmNlU2VydmljZScsXHJcbiAgICBmaXJzdExvZ2luTW9kYWxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGZpcnN0TG9naW5Nb2RhbChcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgJHVpYk1vZGFsLFxyXG4gICAgJHdpbmRvdyxcclxuICAgIGxhbmd1YWdlU2VydmljZSxcclxuICAgIHByZWZlcmVuY2VzXHJcbikge1xyXG4gICAgdmFyIG1vZGFsID0ge1xyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgZmlyc3RMb2dpbk1vZGFsQ29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZSddO1xyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBmaXJzdExvZ2luTW9kYWxDb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIHZtID0ge1xyXG4gICAgICAgICAgICBjYW5jZWw6IGNhbmNlbCxcclxuICAgICAgICAgICAgbGFuZ3VhZ2VzOiBsYW5ndWFnZVNlcnZpY2Uuc3VwcG9ydGVkTGFuZ3VhZ2VzV2l0aERlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBzZXRMYW5ndWFnZUFuZENsb3NlOiBzZXRMYW5ndWFnZUFuZENsb3NlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gc2V0TGFuZ3VhZ2VBbmRDbG9zZShsYW5ndWFnZUlkKSB7XHJcbiAgICAgICAgICAgIHByZWZlcmVuY2VzLnNldExhbmd1YWdlKGxhbmd1YWdlSWQpLnRoZW4oZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2V0IGEgdGltZW91dCBpbiBvcmRlciB0byBnaXZlIGxpc3RlbmVyc1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBsYW5ndWFnZSBjaGFuZ2VkIGV2ZW50IGEgY2hhbmNlIHRvIHJlYWN0XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHJlbG9hZGluZy4gRm9yIGV4YW1wbGUsIHRoZSBxdWVyeSBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgc2VhcmNoIGZ1bmN0aW9uIGlzIGNsZWFyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sIDEpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJ29wZW4tbW9kYWwtZmlyc3QtbG9naW4nLCB7IGNhdGVnb3J5OiAnZmlyc3QtbG9naW4nIH0pO1xyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBmaXJzdExvZ2luTW9kYWxDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsJyxcclxuICAgICAgICAgICAga2V5Ym9hcmQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc29sdmU6IHt9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Rhc2hib2FyZC9tb2RhbHMvZmlyc3QtbG9naW4uaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtbGlnaHQnXHJcbiAgICAgICAgfSkucmVzdWx0LmNhdGNoKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgaWYgKCEocmVzID09PSAnY2FuY2VsJyB8fCByZXMgPT09ICdlc2NhcGUga2V5IHByZXNzJyB8fCByZXMgPT09ICdiYWNrZHJvcCBjbGljaycpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyByZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbW9kYWw7XHJcbn1cclxuIiwiYW5ndWxhci5tb2R1bGUoJ3RhcmljLmRvY3VtZW50YXRpb24nLCBbXSlcclxuICAgIC5jb21wb25lbnQoJ2RvY3VtZW50YXRpb25CdXR0b24nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZG9jdW1lbnRhdGlvbi1idXR0b24nKSlcclxuICAgIC5mYWN0b3J5KCdkb2N1bWVudGF0aW9uU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvZG9jdW1lbnRhdGlvbi1zZXJ2aWNlJykpXHJcbiAgICA7XHJcblxyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIHRvdXI6ICc8J1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IGRvY3VtZW50YXRpb25CdXR0b25Db250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdkb2N1bWVudGF0aW9uL2NvbXBvbmVudHMvZG9jdW1lbnRhdGlvbi1idXR0b24uaHRtbCdcclxufTtcclxuXHJcbmRvY3VtZW50YXRpb25CdXR0b25Db250cm9sbGVyLiRpbmplY3QgPSBbJyRhbmFseXRpY3MnLCAnZG9jdW1lbnRhdGlvblNlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIGRvY3VtZW50YXRpb25CdXR0b25Db250cm9sbGVyKCRhbmFseXRpY3MsIGRvY3VtZW50YXRpb25TZXJ2aWNlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc3RhcnRUb3VyOiBzdGFydFRvdXJcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbiAgICBcclxuICAgIGZ1bmN0aW9uIHN0YXJ0VG91cigpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJ3N0YXJ0LXRvdXInLCB7IGNhdGVnb3J5OiAnZG9jdW1lbnRhdGlvbid9KTtcclxuICAgICAgICB2YXIgY3VycmVudFRvdXIgPSBkb2N1bWVudGF0aW9uU2VydmljZS5nZXRDdXJyZW50VG91cigpO1xyXG4gICAgICAgIC8vIDIwMjEtMDQtMjYgVGhlIHRvdXIgb2YgdGhlIG1lYXN1cmVzIHBhZ2UgZG9lcyBub3Qgd29yayBwcm9wZXJseSB3aXRoIHRoZSBpZiBzdGF0ZW1lbnRcclxuICAgICAgICAvLyBiZWNhdXNlIGl0IGxvc2VzIHRoZSBjb25uZWN0aW9uIHdpdGggdGhlIGRvbSBlbGVtZW50cy4gSG93ZXZlciwgdGhlcmVcclxuICAgICAgICAvLyB3YXMgc29tZSBvdGhlciB0b3VyIHRoYXQgZGlkIG5vdCBzdGFydCBhdCB0aGUgZmlyc3QgbW9kYWwgd2l0aG91dCBpdCwgc28gSSdsbCBsZWF2ZVxyXG4gICAgICAgIC8vIHRoaXMgY29kZSBoZXJlIGp1c3QgaW4gY2FzZS4gXHJcbiAgICAgICAgLy8gaWYgKGN1cnJlbnRUb3VyLmlkICE9PSB2bS50b3VyLmlkKSB7XHJcbiAgICAgICAgLy8gICAgIGRvY3VtZW50YXRpb25TZXJ2aWNlLmluaXRpYWxpemUodm0udG91ci5pZCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIGRvY3VtZW50YXRpb25TZXJ2aWNlLmluaXRpYWxpemUodm0udG91ci5pZCk7XHJcbiAgICAgICAgZG9jdW1lbnRhdGlvblNlcnZpY2Uuc3RhcnRUb3VyKCk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFsnJHRpbWVvdXQnLCAnJHRyYW5zbGF0ZScsICduZ0ludHJvU2VydmljZScsICdwcmVmZXJlbmNlU2VydmljZScsIGRvY3VtZW50YXRpb25TZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIGRvY3VtZW50YXRpb25TZXJ2aWNlKCR0aW1lb3V0LCAkdHJhbnNsYXRlLCBuZ0ludHJvU2VydmljZSwgcHJlZmVyZW5jZXMpIHtcclxuXHJcbiAgICB2YXIgY3VycmVudFRvdXIgPSB7XHJcbiAgICAgICAgaWQ6IG51bGwsXHJcbiAgICAgICAgcnVubmluZzogZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgYWRkSGludHM6IGFkZEhpbnRzLFxyXG4gICAgICAgIGV4aXQ6IGV4aXQsXHJcbiAgICAgICAgZ2V0Q3VycmVudFRvdXI6IGdldEN1cnJlbnRUb3VyLFxyXG4gICAgICAgIG5leHQ6IG5leHQsXHJcbiAgICAgICAgc3RhcnRUb3VyOiBzdGFydFRvdXIsXHJcbiAgICAgICAgaW5pdGlhbGl6ZTogaW5pdGFsaXplVG91clxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRDdXJyZW50VG91cigpIHtcclxuICAgICAgICByZXR1cm4gY3VycmVudFRvdXI7XHJcbiAgICB9XHJcblxyXG4gICAgbmdJbnRyb1NlcnZpY2Uub25FeGl0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGN1cnJlbnRUb3VyLnJ1bm5pbmcgPSBmYWxzZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHZhciBkZWZhdWx0SW50cm9PcHRpb25zID0ge1xyXG4gICAgICAgIGRpc2FibGVJbnRlcmFjdGlvbjogdHJ1ZSxcclxuICAgICAgICBzaG93U3RlcE51bWJlcnM6IGZhbHNlLFxyXG4gICAgICAgIHNob3dCdWxsZXRzOiBmYWxzZSxcclxuICAgICAgICBleGl0T25PdmVybGF5Q2xpY2s6IGZhbHNlLFxyXG4gICAgICAgIGV4aXRPbkVzYzogdHJ1ZSxcclxuICAgICAgICBoZWxwZXJFbGVtZW50UGFkZGluZzogMFxyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgZGVmYXVsdFRvdXJDb25maWcgPSB7XHJcbiAgICAgICAgcmVwZWF0QWROYXVzZXVtOiBmYWxzZSwgLy8gVE9ETzogc2V0IHRvIGZhbHNlIGluIHByb2R1Y3Rpb24gKGl0IGlzIGdvb2QgZm9yIGRlYnVnZ2luZyB0aG91Z2gpXHJcbiAgICAgICAgYXV0b1N0YXJ0OiBmYWxzZSAvLyBUT0RPOiBzZXQgdG8gZmFsc2UgaW4gcHJvZHVjdGlvbiAoaXQgaXMgZ29vZCBmb3IgZGVidWdnaW5nIHRob3VnaClcclxuICAgIH07XHJcblxyXG4gICAgdmFyIGNvbmZpZyA9IGdldFRvdXJDb25maWcoKTtcclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiBleGl0KCkge1xyXG4gICAgICAgIG5nSW50cm9TZXJ2aWNlLmV4aXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBuZXh0KCkge1xyXG4gICAgICAgIGlmIChjdXJyZW50VG91ci5ydW5uaW5nKSB7XHJcbiAgICAgICAgICAgIG5nSW50cm9TZXJ2aWNlLm5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc3RhcnRUb3VyKCkge1xyXG4gICAgICAgIGN1cnJlbnRUb3VyLnJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBuZ0ludHJvU2VydmljZS5zdGFydCgpO1xyXG4gICAgICAgIH0sIDApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluaXRhbGl6ZVRvdXIoaWQpIHtcclxuICAgICAgICB2YXIgdG91ckNvbmZpZyA9IF8uZmluZChjb25maWcsIHsgJ2lkJzogaWQgfSk7XHJcbiAgICAgICAgaWYgKHRvdXJDb25maWcpIHtcclxuICAgICAgICAgICAgJHRyYW5zbGF0ZSh0b3VyQ29uZmlnLnRyYW5zbGF0aW9ucylcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHRyYW5zbGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdXJDb25maWcgPSBfLmRlZmF1bHRzKHRvdXJDb25maWcsIGRlZmF1bHRUb3VyQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG91ci5pZCA9IGlkO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gdG91ckNvbmZpZy5nZXRPcHRpb25zKHRyYW5zbGF0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmdJbnRyb1NlcnZpY2Uuc2V0T3B0aW9ucyhvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICBuZ0ludHJvU2VydmljZS5vbkV4aXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtUb3VyQXNFeGl0ZWQoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgodG91ckNvbmZpZy5hdXRvU3RhcnQgJiYgaXNOZXdUb3VyKGlkKSkgfHwgdG91ckNvbmZpZy5yZXBlYXRBZE5hdXNldW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ0ludHJvU2VydmljZS5zdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYWRkSGludHMoKSB7XHJcbiAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIG5nSW50cm9TZXJ2aWNlLmFkZEhpbnRzKCk7XHJcbiAgICAgICAgICAgIG5nSW50cm9TZXJ2aWNlLnNob3dIaW50cygpO1xyXG4gICAgICAgIH0sIDApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGlzTmV3VG91cihpZCkge1xyXG4gICAgICAgIC8vIHJldHVybiB0cnVlOyAvLyBnb29kIGZvciBkZWJ1Z2dpbmc6IGFsbCB0b3VycyB3aXRoIGF1dG9TdGFydDogdHJ1ZSB3aWxsIGFsd2F5cyBhdXRvLXN0YXJ0XHJcbiAgICAgICAgdmFyIHRvdXJQcmVmZXJlbmNlID0gcHJlZmVyZW5jZXMuZ2V0KGlkLCAndG91ckhhc0V4aXRlZCcpO1xyXG4gICAgICAgIHJldHVybiB0b3VyUHJlZmVyZW5jZSA9PT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtYXJrVG91ckFzRXhpdGVkKGlkKSB7XHJcbiAgICAgICAgcHJlZmVyZW5jZXMucmVwbGFjZSh7XHJcbiAgICAgICAgICAgIGNhdGVnb3J5OiAndG91ckhhc0V4aXRlZCcsXHJcbiAgICAgICAgICAgIG5hbWU6IGlkLFxyXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZSxcclxuICAgICAgICAgICAgdmFsdWVUeXBlOiAnYm9vbGVhblZhbHVlJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFRvdXJDb25maWcoKSB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWQ6ICdhYmMnLFxyXG4gICAgICAgICAgICAgICAgZ2V0T3B0aW9uczogZnVuY3Rpb24odHJhbnNsYXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludHJvT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZUxhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkuZG9uZSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5uZXh0J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLnByZXZpb3VzJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5hYmMuaW50cm8nXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uZGVmYXVsdHMoaW50cm9PcHRpb25zLCBkZWZhdWx0SW50cm9PcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM6IFtcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5hYmMuaW50cm8nLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLmRvbmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLnByZXZpb3VzJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi51aS5uZXh0JyxcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWQ6ICdhYmMtbmV3JyxcclxuICAgICAgICAgICAgICAgIGdldE9wdGlvbnM6IGZ1bmN0aW9uKHRyYW5zbGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRyb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLmRvbmUnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkubmV4dCddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5wcmV2aW91cyddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnRyb2pzLWFiYy1uZXctZmlsZScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24uYWJjTmV3LmZpbGUnXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW50cm9qcy1hYmMtbmV3LWlucHV0LW9wdGlvbnMnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLmFiY05ldy5pbnB1dE9wdGlvbnMnXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW50cm9qcy1hYmMtbmV3LW91dHB1dC1vcHRpb25zJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5hYmNOZXcub3V0cHV0T3B0aW9ucyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnRyb2pzLWFiYy1uZXctc3VibWl0JyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5hYmNOZXcubGV0c0dvJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdsZWZ0J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5kZWZhdWx0cyhpbnRyb09wdGlvbnMsIGRlZmF1bHRJbnRyb09wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLmFiY05ldy5maWxlJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5hYmNOZXcuaW5wdXRPcHRpb25zJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5hYmNOZXcub3V0cHV0T3B0aW9ucycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24uYWJjTmV3LmxldHNHbycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkuZG9uZScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkucHJldmlvdXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLm5leHQnLFxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZDogJ2Nhc2UtbGF3JyxcclxuICAgICAgICAgICAgICAgIGdldE9wdGlvbnM6IGZ1bmN0aW9uKHRyYW5zbGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRyb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLmRvbmUnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkubmV4dCddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5wcmV2aW91cyddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24uY2FzZUxhdy5pbnRybyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5kZWZhdWx0cyhpbnRyb09wdGlvbnMsIGRlZmF1bHRJbnRyb09wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLmNhc2VMYXcuaW50cm8nLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLmRvbmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLnByZXZpb3VzJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi51aS5uZXh0JyxcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWQ6ICdjaGFwdGVyJyxcclxuICAgICAgICAgICAgICAgIGdldE9wdGlvbnM6IGZ1bmN0aW9uKHRyYW5zbGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRyb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLmRvbmUnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkubmV4dCddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5wcmV2aW91cyddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24uY2hhcHRlci5pbnRybyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnRyb2pzLWhlYWRpbmcnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLmNoYXB0ZXIuaGVhZGluZyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnRyb2pzLWNoYXB0ZXItYnV0dG9ucycpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24uY2hhcHRlci5jaGFwdGVyQnV0dG9ucyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnRyb2pzLWhlYWRpbmctYnV0dG9ucycpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24uY2hhcHRlci5oZWFkaW5nQnV0dG9ucyddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnbGVmdCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfLmRlZmF1bHRzKGludHJvT3B0aW9ucywgZGVmYXVsdEludHJvT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24uY2hhcHRlci5pbnRybycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24uY2hhcHRlci5oZWFkaW5nJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5jaGFwdGVyLmNoYXB0ZXJCdXR0b25zJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5jaGFwdGVyLmhlYWRpbmdCdXR0b25zJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi51aS5kb25lJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi51aS5wcmV2aW91cycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkubmV4dCcsXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkOiAnY2hhcHRlcnMnLFxyXG4gICAgICAgICAgICAgICAgZ2V0T3B0aW9uczogZnVuY3Rpb24odHJhbnNsYXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludHJvT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZUxhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkuZG9uZSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5uZXh0J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLnByZXZpb3VzJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5jaGFwdGVycy5pbnRybyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6ICcjbGFyZ2Utc2VhcmNoLWJveCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5jaGFwdGVycy5sYXJnZVNlYXJjaEJveCddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6ICcjaW50cm9qcy1yZWZlcmVuY2UtZGF0ZS1waWNrZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24uaGVhZGVyLnJlZmVyZW5jZURhdGVQaWNrZXInXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2JvdHRvbS1yaWdodC1hbGlnbmVkJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiAnI2ludHJvanMtaW1wb3J0LWV4cG9ydC10b2dnbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24uaGVhZGVyLnRyYWRlTW92ZW1lbnRQaWNrZXInXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2JvdHRvbS1yaWdodC1hbGlnbmVkJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiAnI2ludHJvanMtbmF2YmFyLWxhbmd1YWdlLWRyb3Bkb3duJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLmhlYWRlci5sYW5ndWFnZVBpY2tlciddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYm90dG9tLXJpZ2h0LWFsaWduZWQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnRyb2pzLW5vbWVuY2xhdHVyZS1zZWN0aW9uJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5jaGFwdGVycy5zZWN0aW9uTm90ZXNBbmRFeHBsYW5hdG9yeU5vdGVzJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfLmRlZmF1bHRzKGludHJvT3B0aW9ucywgZGVmYXVsdEludHJvT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24uY2hhcHRlcnMuaW50cm8nLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLmNoYXB0ZXJzLmxhcmdlU2VhcmNoQm94JyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5jaGFwdGVycy5zZWN0aW9uTm90ZXNBbmRFeHBsYW5hdG9yeU5vdGVzJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5oZWFkZXIucmVmZXJlbmNlRGF0ZVBpY2tlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24uaGVhZGVyLnRyYWRlTW92ZW1lbnRQaWNrZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLmhlYWRlci5sYW5ndWFnZVBpY2tlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkuZG9uZScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkucHJldmlvdXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLm5leHQnLFxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZDogJ2NvcnJlbGF0aW9uLXRhYmxlJyxcclxuICAgICAgICAgICAgICAgIGdldE9wdGlvbnM6IGZ1bmN0aW9uKHRyYW5zbGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRyb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLmRvbmUnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkubmV4dCddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5wcmV2aW91cyddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24uY29ycmVsYXRpb25UYWJsZS5pbnRybyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6ICcjY29ycmVsYXRpb24tdGFibGUtc2VhcmNoLXN1Y2Nlc3NvcnMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24uY29ycmVsYXRpb25UYWJsZS5zZWFyY2hTdWNjZXNzb3JzJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogJyNjb3JyZWxhdGlvbi10YWJsZS1zZWFyY2gtb3JpZ2luYXRvcnMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24uY29ycmVsYXRpb25UYWJsZS5zZWFyY2hPcmlnaW5hdG9ycyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5kZWZhdWx0cyhpbnRyb09wdGlvbnMsIGRlZmF1bHRJbnRyb09wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLmNvcnJlbGF0aW9uVGFibGUuaW50cm8nLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLmNvcnJlbGF0aW9uVGFibGUuc2VhcmNoU3VjY2Vzc29ycycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24uY29ycmVsYXRpb25UYWJsZS5zZWFyY2hPcmlnaW5hdG9ycycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkuZG9uZScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkucHJldmlvdXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLm5leHQnLFxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZDogJ2VidGknLFxyXG4gICAgICAgICAgICAgICAgZ2V0T3B0aW9uczogZnVuY3Rpb24odHJhbnNsYXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludHJvT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZUxhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkuZG9uZSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5uZXh0J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLnByZXZpb3VzJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5lYnRpLmludHJvJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmludHJvanMtZWJ0aS1mb3JtJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5lYnRpLmZvcm0nXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uZGVmYXVsdHMoaW50cm9PcHRpb25zLCBkZWZhdWx0SW50cm9PcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM6IFtcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5lYnRpLmludHJvJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5lYnRpLmZvcm0nLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLmRvbmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLnByZXZpb3VzJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi51aS5uZXh0JyxcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWQ6ICdhdHInLFxyXG4gICAgICAgICAgICAgICAgZ2V0T3B0aW9uczogZnVuY3Rpb24odHJhbnNsYXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludHJvT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZUxhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkuZG9uZSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5uZXh0J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLnByZXZpb3VzJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5hdHIuaW50cm8nXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW50cm9qcy1hdHItZm9ybScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24uYXRyLmZvcm0nXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uZGVmYXVsdHMoaW50cm9PcHRpb25zLCBkZWZhdWx0SW50cm9PcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM6IFtcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5hdHIuaW50cm8nLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLmF0ci5mb3JtJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi51aS5kb25lJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi51aS5wcmV2aW91cycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkubmV4dCcsXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkOiAnbGFuZGluZycsXHJcbiAgICAgICAgICAgICAgICBhdXRvU3RhcnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcmVwZWF0QWROYXVzZXVtOiBmYWxzZSwgLy8gVE9ETzogZm9yIGRlYnVnZ2luZyBvbmx5XHJcbiAgICAgICAgICAgICAgICBnZXRPcHRpb25zOiBmdW5jdGlvbih0cmFuc2xhdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW50cm9PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlSW50ZXJhY3Rpb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lTGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5kb25lJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLm5leHQnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkxhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkucHJldmlvdXMnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiAnI2ludHJvanMtbmF2YmFyLWxhbmd1YWdlLWRyb3Bkb3duJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLmxhbmRpbmdQYWdlLndlbGNvbWVUaXRsZSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24ubGFuZGluZ1BhZ2Uud2VsY29tZUludHJvJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZWxlbWVudDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmludHJvanMtbGFuZ3VhZ2UtZHJvcGRvd24nKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLmhlYWRlci5sYW5ndWFnZVBpY2tlciddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHBvc2l0aW9uOiAnbGVmdCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmludHJvanMtcGljay10cmFkZS10YXJpZmYnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLmxhbmRpbmdQYWdlLnJlZmVyZW5jZUNvdW50cnlQaWNrZXInXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnRuLWhlbHAnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLmxhbmRpbmdQYWdlLmludHJvQnV0dG9uJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBlbGVtZW50OiAnI2ludHJvanMtcmVmZXJlbmNlLWRhdGUtcGlja2VyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLmxhbmRpbmdQYWdlLnJlZmVyZW5jZURhdGVQaWNrZXInXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBlbGVtZW50OiAnI2ludHJvanMtaW1wb3J0LWV4cG9ydC10b2dnbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24ubGFuZGluZ1BhZ2UudHJhZGVNb3ZlbWVudFBpY2tlciddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGVsZW1lbnQ6ICcjaW50cm9qcy1uYXZiYXItbGFuZ3VhZ2UtZHJvcGRvd24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24ubGFuZGluZ1BhZ2UubGFuZ3VhZ2VQaWNrZXInXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5kZWZhdWx0cyhpbnRyb09wdGlvbnMsIGRlZmF1bHRJbnRyb09wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLmxhbmRpbmdQYWdlLndlbGNvbWVUaXRsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24ubGFuZGluZ1BhZ2Uud2VsY29tZUludHJvJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5sYW5kaW5nUGFnZS5yZWZlcmVuY2VDb3VudHJ5UGlja2VyJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5sYW5kaW5nUGFnZS5pbnRyb0J1dHRvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkuZG9uZScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkucHJldmlvdXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLm5leHQnLFxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZDogJ3Nob3ctbWVhc3VyZXMnLFxyXG4gICAgICAgICAgICAgICAgZ2V0T3B0aW9uczogZnVuY3Rpb24odHJhbnNsYXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludHJvT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZUxhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkuZG9uZSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5uZXh0J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLnByZXZpb3VzJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5tZWFzdXJlcy5pbnRybyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaG93LW1lYXN1cmVzLWFkZGl0aW9uYWwtc2VhcmNoLW9wdGlvbnMnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLm1lYXN1cmVzLmZvcm0nXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2xlZnQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5kZWZhdWx0cyhpbnRyb09wdGlvbnMsIGRlZmF1bHRJbnRyb09wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLm1lYXN1cmVzLmludHJvJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5tZWFzdXJlcy5mb3JtJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi51aS5kb25lJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi51aS5wcmV2aW91cycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkubmV4dCcsXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkOiAndmFsaWRhdGUtZGVjbGFyYXRpb24nLFxyXG4gICAgICAgICAgICAgICAgZ2V0T3B0aW9uczogZnVuY3Rpb24odHJhbnNsYXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludHJvT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZUxhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkuZG9uZSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5uZXh0J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLnByZXZpb3VzJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5tZWFzdXJlcy5pbnRybyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hZGRpdGlvbmFsLXNlYXJjaC1vcHRpb25zJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5tZWFzdXJlcy52YWxpZGF0ZURlY2xhcmF0aW9uJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdsZWZ0J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uZGVmYXVsdHMoaW50cm9PcHRpb25zLCBkZWZhdWx0SW50cm9PcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM6IFtcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5tZWFzdXJlcy5pbnRybycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24ubWVhc3VyZXMudmFsaWRhdGVEZWNsYXJhdGlvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkuZG9uZScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkucHJldmlvdXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLm5leHQnLFxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZDogJ2NhbGN1bGF0ZS1kdXR5JyxcclxuICAgICAgICAgICAgICAgIGdldE9wdGlvbnM6IGZ1bmN0aW9uKHRyYW5zbGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRyb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLmRvbmUnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkubmV4dCddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5wcmV2aW91cyddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24ubWVhc3VyZXMuaW50cm8nXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWRkaXRpb25hbC1zZWFyY2gtb3B0aW9ucycpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24ubWVhc3VyZXMuY2FsY3VsYXRlRHV0eSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnbGVmdCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfLmRlZmF1bHRzKGludHJvT3B0aW9ucywgZGVmYXVsdEludHJvT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24ubWVhc3VyZXMuaW50cm8nLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLm1lYXN1cmVzLmNhbGN1bGF0ZUR1dHknLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLmRvbmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLnByZXZpb3VzJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi51aS5uZXh0JyxcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWQ6ICdtZW51JyxcclxuICAgICAgICAgICAgICAgIC8vIGF1dG9TdGFydDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGdldE9wdGlvbnM6IGZ1bmN0aW9uKHRyYW5zbGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRyb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLmRvbmUnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkubmV4dCddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5wcmV2aW91cyddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24ubWFpbk1lbnUuaW50cm8nXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogJyNzaWRlLW1lbnUtY2hhcHRlcnMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24ubWFpbk1lbnUuY2hhcHRlcnMnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JpZ2h0J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiAnI3NpZGUtbWVudS1uZXdzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLm1haW5NZW51Lm5ld3MnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JpZ2h0J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiAnI3NpZGUtbWVudS1lYnRpJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLm1haW5NZW51LmVidGknXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JpZ2h0J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiAnI3NpZGUtbWVudS1hdHInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24ubWFpbk1lbnUuYXRyJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdyaWdodCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogJyNzaWRlLW1lbnUtYWJjJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLm1haW5NZW51LmFiYyddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAncmlnaHQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6ICcjc2lkZS1tZW51LWNvcnJlbGF0aW9uLXRhYmxlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLm1haW5NZW51LmNvcnJlbGF0aW9uVGFibGUnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JpZ2h0J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiAnI3NpZGUtbWVudS1yZWZlcmVuY2UtcHJpY2VzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLm1haW5NZW51LnJlZmVyZW5jZVByaWNlcyddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAncmlnaHQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6ICcjc2lkZS1tZW51LWNhc2UtbGF3JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRybzogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLm1haW5NZW51LmNhc2VMYXcnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JpZ2h0J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfLmRlZmF1bHRzKGludHJvT3B0aW9ucywgZGVmYXVsdEludHJvT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24ubWFpbk1lbnUuaW50cm8nLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLm1haW5NZW51LmNoYXB0ZXJzJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5tYWluTWVudS5uZXdzJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5tYWluTWVudS5lYnRpJyxcclxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbi5tYWluTWVudS5hYmMnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLm1haW5NZW51LmNvcnJlbGF0aW9uVGFibGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLm1haW5NZW51LnJlZmVyZW5jZVByaWNlcycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24ubWFpbk1lbnUuY2FzZUxhdycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkuZG9uZScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkucHJldmlvdXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLm5leHQnLFxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZDogJ25ld3MnLFxyXG4gICAgICAgICAgICAgICAgZ2V0T3B0aW9uczogZnVuY3Rpb24odHJhbnNsYXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludHJvT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZUxhYmVsOiB0cmFuc2xhdGlvbnNbJ2RvY3VtZW50YXRpb24udWkuZG9uZSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGFiZWw6IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi51aS5uZXh0J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZMYWJlbDogdHJhbnNsYXRpb25zWydkb2N1bWVudGF0aW9uLnVpLnByZXZpb3VzJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm86IHRyYW5zbGF0aW9uc1snZG9jdW1lbnRhdGlvbi5uZXdzLmludHJvJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfLmRlZmF1bHRzKGludHJvT3B0aW9ucywgZGVmYXVsdEludHJvT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24ubmV3cy5pbnRybycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkuZG9uZScsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24udWkucHJldmlvdXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uLnVpLm5leHQnLFxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICB9XHJcbn0iLCJhbmd1bGFyLm1vZHVsZSgndGFyaWMuZHV0eScsIFtdKVxyXG4gICAgLmZhY3RvcnkoJ2R1dHlEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvZHV0eS1kYXRhJykpXHJcbiAgICA7XHJcblxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFsnY29tbW9uJywgJ2RhdGFDb250ZXh0JywgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgJ3NlcmlhbGl6YXRpb25TZXJ2aWNlJywgZHV0eURhdGFTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIGR1dHlEYXRhU2VydmljZShjb21tb24sIGNvbnRleHQsIHN0YXRlLCBzZXJpYWxpemF0aW9uU2VydmljZSkge1xyXG5cclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGdldFVuaXRzOiBnZXRVbml0cyxcclxuICAgICAgICBjYWxjdWxhdGVEdXR5OiBjYWxjdWxhdGVEdXR5XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGdldFVuaXRzKGNvbW1vZGl0eUNvZGUsIGFkZGl0aW9uYWxDb2RlT2JqZWN0cywgcHJlZmVyZW5jZUNvZGUsIGdlcm1hbkV4Y2lzZUNvZGUsIHVjY01vZGVFbmFibGVkKSB7XHJcbiAgICAgICAgdmFyIGFkZGl0aW9uYWxDb2RlcztcclxuXHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvZ29vZHMvJyArIGNvbW1vZGl0eUNvZGUgKyAnL3VuaXRzJyArXHJcbiAgICAgICAgICAgICc/bGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZjb3VudHJ5PScgKyAoc3RhdGUuZmlsdGVyLmNvdW50cnlDb2RlIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmbW92ZW1lbnQ9JyArIHN0YXRlLmZpbHRlci5tb3ZlbWVudCArXHJcbiAgICAgICAgICAgICcmZ2VybWFuX2V4Y2lzZV9jb2RlPScgKyAoZ2VybWFuRXhjaXNlQ29kZSB8fCAnJykgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZSArXHJcbiAgICAgICAgICAgICcmdWNjPScgKyAodWNjTW9kZUVuYWJsZWQgfHwgJycpO1xyXG4gICAgICAgIGlmIChhZGRpdGlvbmFsQ29kZU9iamVjdHMgJiYgYWRkaXRpb25hbENvZGVPYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYWRkaXRpb25hbENvZGVzID0gXy5tYXAoYWRkaXRpb25hbENvZGVPYmplY3RzLCBmdW5jdGlvbihhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnICsgYWRkaXRpb25hbENvZGUudHlwZSArIGFkZGl0aW9uYWxDb2RlLmNvZGU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB1cmwgKz0gJyZhZGRpdGlvbmFsY29kZXM9JyArIGFkZGl0aW9uYWxDb2Rlcy5qb2luKCcsJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcmVmZXJlbmNlQ29kZSkge1xyXG4gICAgICAgICAgICB1cmwgKz0gXCImcHJlZmVyZW5jZWNvZGU9XCIgKyBwcmVmZXJlbmNlQ29kZS5jb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVEdXR5KHF1ZXJ5KSB7XHJcbiAgICAgICAgdmFyIHF1YW50aXRpZXMgPSBzZXJpYWxpemF0aW9uU2VydmljZS5zZXJpYWxpemVRdWFudGl0aWVzKHF1ZXJ5LnF1YW50aXRpZXMpO1xyXG4gICAgICAgIHZhciBhZGRpdGlvbmFsQ29kZXMgPSBfLm1hcChxdWVyeS5hZGRpdGlvbmFsQ29kZXMsIGZ1bmN0aW9uKGFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJyArIGFkZGl0aW9uYWxDb2RlLnR5cGUgKyBhZGRpdGlvbmFsQ29kZS5jb2RlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZhciBjZXJ0aWZpY2F0ZUNvZGVzID0gXy5tYXAocXVlcnkuY2VydGlmaWNhdGVDb2RlcywgZnVuY3Rpb24oY2VydGlmaWNhdGVDb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChjZXJ0aWZpY2F0ZUNvZGUub3JpZ2luID09PSAnSVQnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJycgKyBjZXJ0aWZpY2F0ZUNvZGUuY29kZSArIGNlcnRpZmljYXRlQ29kZS50eXBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAnJyArIGNlcnRpZmljYXRlQ29kZS50eXBlICsgY2VydGlmaWNhdGVDb2RlLmNvZGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdmFyIHByZWZlcmVuY2VDb2RlID0gcXVlcnkucHJlZmVyZW5jZUNvZGUgPyBxdWVyeS5wcmVmZXJlbmNlQ29kZS5jb2RlIDogbnVsbDtcclxuICAgICAgICB2YXIgY3VzdG9tc1ZhbHVlID0gc2VyaWFsaXphdGlvblNlcnZpY2Uuc2VyaWFsaXplQ3VzdG9tc1ZhbHVlKHF1ZXJ5LmN1c3RvbXNWYWx1ZSk7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL2R1dGllcy9jYWxjdWxhdGUnICtcclxuICAgICAgICAgICAgJz9sYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgK1xyXG4gICAgICAgICAgICAnJmdvb2RzY29kZT0nICsgcXVlcnkuY29tbW9kaXR5Q29kZSArXHJcbiAgICAgICAgICAgICcmYWRkaXRpb25hbGNvZGVzPScgKyBhZGRpdGlvbmFsQ29kZXMuam9pbignLCcpICtcclxuICAgICAgICAgICAgJyZjZXJ0aWZpY2F0ZWNvZGVzPScgKyBjZXJ0aWZpY2F0ZUNvZGVzLmpvaW4oJywnKSArXHJcbiAgICAgICAgICAgICcmY3VycmVuY3ljb2RlPScgKyAocXVlcnkuY3VycmVuY3lDb2RlIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmcHJlZmVyZW5jZWNvZGU9JyArIChwcmVmZXJlbmNlQ29kZSB8fCAnJykgK1xyXG4gICAgICAgICAgICAnJmN1c3RvbXN2YWx1ZT0nICsgY3VzdG9tc1ZhbHVlICtcclxuICAgICAgICAgICAgJyZkdXR5bWVhc3VyZXR5cGVpZD0nICsgKHF1ZXJ5LmR1dHlNZWFzdXJlVHlwZUlkIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmb3JkZXJudW1iZXI9JyArIChxdWVyeS5vcmRlck51bWJlciB8fCAnJykgK1xyXG4gICAgICAgICAgICAnJnF1YW50aXRpZXM9JyArIHF1YW50aXRpZXMuam9pbignLCcpICtcclxuICAgICAgICAgICAgJyZjb3VudHJ5PScgKyAocXVlcnkuY291bnRyeU9mT3JpZ2luIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmZ2VybWFuX25hdGlvbmFsX2NvbW1vZGl0eV9jb2RlPScgKyAocXVlcnkuZ2VybWFuTmF0aW9uYWxDb21tb2RpdHlDb2RlIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmZ2VybWFuX2V4Y2lzZV9jb2RlPScgKyAocXVlcnkuZ2VybWFuRXhjaXNlQ29kZSB8fCAnJykgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZSArXHJcbiAgICAgICAgICAgICcmdWNjPScgKyAocXVlcnkudWNjTW9kZUVuYWJsZWQgfHwgJycpO1xyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxufVxyXG4iLCJhbmd1bGFyLm1vZHVsZSgndGFyaWMuZWNpY3MnLCBbXSlcclxuICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIC8vIENvbXBvbmVudHNcclxuICAgIC5jb21wb25lbnQoJ2VjaWNzU2VhcmNoUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9lY2ljcy1zZWFyY2gtcGFnZScpKVxyXG4gICAgLmNvbXBvbmVudCgnZWNpY3NCdXR0b24nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZWNpY3MtYnV0dG9uJykpXHJcbiAgICAuY29tcG9uZW50KCdlY2ljc0RldGFpbHMnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZWNpY3MtZGV0YWlscycpKVxyXG4gICAgLmNvbXBvbmVudCgnZWNpY3NGb3JtJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2VjaWNzLWZvcm0nKSlcclxuICAgIC5jb21wb25lbnQoJ2VjaWNzSW1hZ2VzJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2VjaWNzLWltYWdlcycpKVxyXG4gICAgLmNvbXBvbmVudCgnZWNpY3NMaXN0JywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2VjaWNzLWxpc3QnKSlcclxuICAgIC8vIE1vZGFsc1xyXG4gICAgLmZhY3RvcnkoJ2VjaWNzTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9lY2ljcy1tb2RhbCcpKVxyXG4gICAgLy8gU2VydmljZXNcclxuICAgIC5mYWN0b3J5KCdlY2ljc0RhdGFTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy9lY2ljcy1kYXRhJykpXHJcbiAgICA7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL2VjaWNzL3NlYXJjaC86c2VhcmNocXVlcnknLCB7XHJcbiAgICAgICAgICAgIHNob3dTZWFyY2hTdWJOYXY6IHRydWUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPGVjaWNzLXNlYXJjaC1wYWdlPjwvZWNpY3Mtc2VhcmNoLXBhZ2U+JyxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvZWNpY3Mvc2VhcmNoLycsIHtcclxuICAgICAgICAgICAgc2hvd1NlYXJjaFN1Yk5hdjogdHJ1ZSxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8ZWNpY3Mtc2VhcmNoLXBhZ2U+PC9lY2ljcy1zZWFyY2gtcGFnZT4nLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9lY2ljcy9ob21lLycsIHtcclxuICAgICAgICAgICAgc2hvd1NlYXJjaFN1Yk5hdjogZmFsc2UsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPGVjaWNzLXNlYXJjaC1wYWdlPjwvZWNpY3Mtc2VhcmNoLXBhZ2U+JyxcclxuICAgICAgICB9KVxyXG4gICAgICAgIDtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgaXNMYXJnZTogJzwnLFxyXG4gICAgICAgIGl0ZW06ICc8J1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IGVjaWNzQnV0dG9uQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnZWNpY3MvY29tcG9uZW50cy9lY2ljcy1idXR0b24uaHRtbCdcclxufTtcclxuXHJcbmVjaWNzQnV0dG9uQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJ2NvbW1vbicsIFxyXG4gICAgJ2VjaWNzTW9kYWwnXHJcbl07XHJcblxyXG5mdW5jdGlvbiBlY2ljc0J1dHRvbkNvbnRyb2xsZXIoXHJcbiAgICBjb21tb24sIFxyXG4gICAgZWNpY3NNb2RhbFxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc2hvd0VjaWNzOiBzaG93RWNpY3NcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0VjaWNzKCkge1xyXG4gICAgICAgIHZhciBudW1iZXJQYXR0ZXJuID0gL15cXHMqKD86XFxkezJ9W1xccy5dKil7MSw1fSQvO1xyXG5cclxuICAgICAgICB2YXIgY29kZSA9IGNvbW1vbi5mb3JtYXR0aW5nLnJlbW92ZVRyYWlsaW5nWmVyb3Modm0uaXRlbS5jb2RlKTtcclxuXHJcbiAgICAgICAgaWYgKG51bWJlclBhdHRlcm4udGVzdCh2bS5pdGVtLnNlYXJjaFF1ZXJ5KSlcclxuICAgICAgICAgICAgZWNpY3NNb2RhbC5zaG93KGNvZGUsICcnKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGVjaWNzTW9kYWwuc2hvdyhjb2RlLCB2bS5pdGVtLnNlYXJjaFF1ZXJ5KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgYWN0aXZlSXRlbTogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogZWNpY3NEZXRhaWxzQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnZWNpY3MvY29tcG9uZW50cy9lY2ljcy1kZXRhaWxzLmh0bWwnXHJcbn1cclxuXHJcbmVjaWNzRGV0YWlsc0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICdlY2ljc0RhdGFTZXJ2aWNlJywgXHJcbiAgICAnbGFuZ3VhZ2UnXHJcbl07XHJcblxyXG5mdW5jdGlvbiBlY2ljc0RldGFpbHNDb250cm9sbGVyKFxyXG4gICAgZWNpY3NEYXRhU2VydmljZSwgXHJcbiAgICBsYW5ndWFnZVxyXG4pIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBzZXJ2aWNlOiBlY2ljc0RhdGFTZXJ2aWNlLFxyXG4gICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZS5nZXQoKVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgdXBkYXRlUXVlcnlTdHJpbmc6ICc8J1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IGVjaWNzRm9ybUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2VjaWNzL2NvbXBvbmVudHMvZWNpY3MtZm9ybS5odG1sJ1xyXG59O1xyXG5cclxuZWNpY3NGb3JtQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRsb2NhdGlvbicsXHJcbiAgICAnZWNpY3NEYXRhU2VydmljZScsXHJcbl07XHJcblxyXG5mdW5jdGlvbiBlY2ljc0Zvcm1Db250cm9sbGVyKFxyXG4gICAgJGxvY2F0aW9uLFxyXG4gICAgZWNpY3NEYXRhU2VydmljZVxyXG4pIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICBmaWx0ZXI6IGVjaWNzRGF0YVNlcnZpY2UuZmlsdGVyLFxyXG4gICAgICAgIHNlcnZpY2U6IGVjaWNzRGF0YVNlcnZpY2UsXHJcbiAgICAgICAgbG9hZE5ldzogbG9hZE5ld1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIGlmICh2bS51cGRhdGVRdWVyeVN0cmluZykge1xyXG4gICAgICAgICAgICB1cGRhdGVTZWFyY2hRdWVyeSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlY2ljc0RhdGFTZXJ2aWNlLmluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkTmV3KCkge1xyXG4gICAgICAgIGlmICh2bS51cGRhdGVRdWVyeVN0cmluZykge1xyXG4gICAgICAgICAgICB1cGRhdGVTZWFyY2hRdWVyeSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlY2ljc0RhdGFTZXJ2aWNlLmxvYWROZXdJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZVNlYXJjaFF1ZXJ5KCkge1xyXG4gICAgICAgICRsb2NhdGlvbi5zZWFyY2goJ3F1ZXJ5Jywgdm0uZmlsdGVyLm5hbWUpO1xyXG4gICAgICAgICRsb2NhdGlvbi5zZWFyY2goJ2NvbW1vZGl0eUNvZGUnLCB2bS5maWx0ZXIuZ29vZHNDb2RlKTtcclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogZWNpY3NJbWFnZXNDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdlY2ljcy9jb21wb25lbnRzL2VjaWNzLWltYWdlcy5odG1sJ1xyXG59O1xyXG5cclxuZWNpY3NJbWFnZXNDb250cm9sbGVyLiRpbmplY3QgPSBbJ2VjaWNzRGF0YVNlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIGVjaWNzSW1hZ2VzQ29udHJvbGxlcihlY2ljc0RhdGFTZXJ2aWNlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc2VydmljZTogZWNpY3NEYXRhU2VydmljZSxcclxuICAgICAgICBjaGFuZ2VBY3RpdmVJdGVtOiBlY2ljc0RhdGFTZXJ2aWNlLmNoYW5nZUFjdGl2ZUl0ZW0sXHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBsb2FkTW9yZTogbG9hZE1vcmVcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZE1vcmUoKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBlY2ljc0RhdGFTZXJ2aWNlLmxvYWRNb3JlSXRlbXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGVjaWNzTGlzdENvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2VjaWNzL2NvbXBvbmVudHMvZWNpY3MtbGlzdC5odG1sJ1xyXG59O1xyXG5cclxuZWNpY3NMaXN0Q29udHJvbGxlci4kaW5qZWN0ID0gWydlY2ljc0RhdGFTZXJ2aWNlJ107XHJcblxyXG5mdW5jdGlvbiBlY2ljc0xpc3RDb250cm9sbGVyKGVjaWNzRGF0YVNlcnZpY2UpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBzZXJ2aWNlOiBlY2ljc0RhdGFTZXJ2aWNlLFxyXG4gICAgICAgIGNoYW5nZUFjdGl2ZUl0ZW06IGVjaWNzRGF0YVNlcnZpY2UuY2hhbmdlQWN0aXZlSXRlbSxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGxvYWRNb3JlOiBsb2FkTW9yZVxyXG4gICAgfTtcclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkTW9yZSgpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGVjaWNzRGF0YVNlcnZpY2UubG9hZE1vcmVJdGVtcygpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHt9LFxyXG4gICAgY29udHJvbGxlcjogZWNpY3NTZWFyY2hQYWdlQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnZWNpY3MvY29tcG9uZW50cy9lY2ljcy1zZWFyY2gtcGFnZS5odG1sJ1xyXG59XHJcblxyXG5lY2ljc1NlYXJjaFBhZ2VDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGxvY2F0aW9uJywgXHJcbiAgICAnJHJvdXRlJywgXHJcbiAgICAnZWNpY3NEYXRhU2VydmljZScsXHJcbiAgICAnc2VhcmNoU2VydmljZSdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGVjaWNzU2VhcmNoUGFnZUNvbnRyb2xsZXIoXHJcbiAgICAkbG9jYXRpb24sIFxyXG4gICAgJHJvdXRlLCBcclxuICAgIGVjaWNzRGF0YVNlcnZpY2UsIFxyXG4gICAgc2VhcmNoU2VydmljZVxyXG4pIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICBzaG93U2VhcmNoU3ViTmF2OiAkcm91dGUuY3VycmVudC4kJHJvdXRlLnNob3dTZWFyY2hTdWJOYXYsXHJcbiAgICAgICAgc2VydmljZTogZWNpY3NEYXRhU2VydmljZSxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGxvYWROZXc6IGxvYWROZXdcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICBlY2ljc0RhdGFTZXJ2aWNlLnJlc2V0RmlsdGVyKCk7XHJcbiAgICAgICAgdmFyIHEgPSBzZWFyY2hTZXJ2aWNlLnBhcnNlTG9jYXRpb25TZWFyY2hPYmplY3QoJGxvY2F0aW9uLnNlYXJjaCgpKTtcclxuICAgICAgICBlY2ljc0RhdGFTZXJ2aWNlLmZpbHRlci5nb29kc0NvZGUgPSBxLmNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgZWNpY3NEYXRhU2VydmljZS5maWx0ZXIubmFtZSA9IHEucXVlcnk7XHJcbiAgICAgICAgbG9hZE5ldygpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWROZXcoKSB7XHJcbiAgICAgICAgLy8gdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBlY2ljc0RhdGFTZXJ2aWNlLmxvYWROZXdJdGVtcygpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIC8vIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFsnJHVpYk1vZGFsJywgZWNpY3NNb2RhbF07XHJcblxyXG5mdW5jdGlvbiBlY2ljc01vZGFsKCR1aWJNb2RhbCkge1xyXG4gICAgdmFyIG1vZGFsID0ge1xyXG4gICAgICAgIGdvb2RzQ29kZTogbnVsbCxcclxuICAgICAgICBzZWFyY2hRdWVyeTogbnVsbCxcclxuICAgICAgICBzaG93OiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgZWNpY3NNb2RhbENvbnRyb2xsZXIuJGluamVjdCA9IFsnJHNjb3BlJywgJyR1aWJNb2RhbEluc3RhbmNlJywgJ2VjaWNzRGF0YVNlcnZpY2UnLCAnZ29vZHNDb2RlJywgJ3NlYXJjaFF1ZXJ5J107XHJcblxyXG4gICAgZnVuY3Rpb24gZWNpY3NNb2RhbENvbnRyb2xsZXIoJHNjb3BlLCAkdWliTW9kYWxJbnN0YW5jZSwgZWNpY3NEYXRhU2VydmljZSwgZ29vZHNDb2RlLCBzZWFyY2hRdWVyeSkge1xyXG4gICAgICAgIHZhciB2bSA9IHtcclxuICAgICAgICAgICAgYXR0YWNoZWQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICAgICBjYW5jZWw6IGNhbmNlbCxcclxuICAgICAgICAgICAgY2hhbmdlQWN0aXZlSXRlbTogY2hhbmdlQWN0aXZlSXRlbSxcclxuICAgICAgICAgICAgc2VydmljZTogZWNpY3NEYXRhU2VydmljZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciByZWZyZXNoO1xyXG4gICAgICAgIHZhciBvcGFjaXR5ID0gMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyBhIGhhY2ssIGludHJvZHVjZWQgaW4gT2N0b2JlciAyMDIwLiBUaGUgcmVhc29uIGZvciBpdCBpcyB0aGF0XHJcbiAgICAgICAgICAgIC8vIENocm9tZSB3b3VsZCBub3QgcmVuZGVyIHRoZSBCVEkgaW1hZ2VzIHByb3Blcmx5IGJ1dCBhIHJlZHJhdyB3b3VsZCBmaXggaXQuXHJcbiAgICAgICAgICAgIHJlZnJlc2ggPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAob3BhY2l0eSA9PT0gMSA/IDAuOTkgOiAxKTtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHk7XHJcbiAgICAgICAgICAgIH0sIDQwKTtcclxuICAgICAgICAgICAgaW5pdCgpO1xyXG4gICAgICAgICAgICAkc2NvcGUuJG9uKCckZGVzdHJveScsIGRldGFjaGVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm9wYWNpdHkgPSAxO1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKHJlZnJlc2gpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2hhbmdlQWN0aXZlSXRlbShjdXMpIHtcclxuICAgICAgICAgICAgZWNpY3NEYXRhU2VydmljZS5jaGFuZ2VBY3RpdmVJdGVtKGN1cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xyXG4gICAgICAgICAgICBlY2ljc0RhdGFTZXJ2aWNlLmNsZWFyQWN0aXZlSXRlbSgpO1xyXG4gICAgICAgICAgICBlY2ljc0RhdGFTZXJ2aWNlLnJlc2V0RmlsdGVyKCk7XHJcbiAgICAgICAgICAgIGVjaWNzRGF0YVNlcnZpY2UuZmlsdGVyLmdvb2RzQ29kZSA9IGdvb2RzQ29kZTtcclxuICAgICAgICAgICAgZWNpY3NEYXRhU2VydmljZS5maWx0ZXIuc2VhcmNoUXVlcnkgPSBzZWFyY2hRdWVyeTtcclxuICAgICAgICAgICAgZWNpY3NEYXRhU2VydmljZS5sb2FkTmV3SXRlbXMoKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TW9kYWwoZ29vZHNDb2RlLHNlYXJjaFF1ZXJ5KSB7XHJcbiAgICAgICAgaWYgKGdvb2RzQ29kZSlcclxuICAgICAgICAgICAgbW9kYWwuZ29vZHNDb2RlID0gZ29vZHNDb2RlO1xyXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSlcclxuICAgICAgICAgICAgbW9kYWwuc2VhcmNoUXVlcnkgPSBzZWFyY2hRdWVyeTtcclxuXHJcbiAgICAgICAgcmV0dXJuICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICBiYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgYmluZFRvQ29udHJvbGxlcjogdHJ1ZSxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogZWNpY3NNb2RhbENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ2N0cmxFY2ljc01vZGFsJyxcclxuICAgICAgICAgICAga2V5Ym9hcmQ6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGFsRmFkZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgZ29vZHNDb2RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGFsLmdvb2RzQ29kZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZWFyY2hRdWVyeTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RhbC5zZWFyY2hRdWVyeTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2l6ZTogJ2xnJyxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdlY2ljcy9tb2RhbHMvZWNpY3MtbW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtYnRpJ1xyXG4gICAgICAgIH0pLnJlc3VsdC5jYXRjaChmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgIGlmICghKHJlcyA9PT0gJ2NhbmNlbCcgfHwgcmVzID09PSAnZXNjYXBlIGtleSBwcmVzcycgfHwgcmVzID09PSAnYmFja2Ryb3AgY2xpY2snKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1vZGFsO1xyXG59IiwibW9kdWxlLmV4cG9ydHMgID0gWydkYXRhQ29udGV4dCcsICdjb21tb24nLCAnbGFuZ3VhZ2UnLCBlY2ljc0RhdGFTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIGVjaWNzRGF0YVNlcnZpY2UoZGF0YUNvbnRleHQsIGNvbW1vbiwgbGFuZ3VhZ2UpIHtcclxuXHJcbiAgICB2YXIgYWN0aXZlQ3VzID0gbnVsbDtcclxuXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBjaGFyYWN0ZXJpc3RpY3M6IG51bGwsXHJcbiAgICAgICAgbm9tZW5jbGF0dXJlczogbnVsbCxcclxuICAgICAgICByZXNwb25zZToge30sXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICBhY3RpdmVJdGVtOiBudWxsLFxyXG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0xvYWRpbmdEZXRhaWxzOiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRpc3BsYXk6ICdsaXN0JyxcclxuICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgY2FzUm46IG51bGwsXHJcbiAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljOiAnJyxcclxuICAgICAgICAgICAgY3VzOiBudWxsLFxyXG4gICAgICAgICAgICBlY051bWJlcjogbnVsbCxcclxuICAgICAgICAgICAgZ29vZHNDb2RlOiBudWxsLFxyXG4gICAgICAgICAgICBpbkNoSUNvZGU6IG51bGwsXHJcbiAgICAgICAgICAgIGluQ2hJS2V5OiBudWxsLFxyXG4gICAgICAgICAgICBuYW1lOiBudWxsLFxyXG4gICAgICAgICAgICBub21lbmNsYXR1cmU6ICcnLFxyXG4gICAgICAgICAgICBwYWdlTnVtYmVyOiAxLFxyXG4gICAgICAgICAgICB1bk51bWJlcjogMFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb3JkZXJCeTogJ0N1cy1hc2MnLFxyXG4gICAgICAgIGNvdW50UGVyQ2hhcHRlcjogY291bnRQZXJDaGFwdGVyLFxyXG4gICAgICAgIGNvdW50UGVySGVhZGluZzogY291bnRQZXJIZWFkaW5nLFxyXG4gICAgICAgIGNvdW50Rm9yR29vZHNDb2RlOiBjb3VudEZvckdvb2RzQ29kZSxcclxuICAgICAgICBjb3VudEZvckdvb2RzQ29kZXM6IGNvdW50Rm9yR29vZHNDb2RlcyxcclxuICAgICAgICBpbml0OiBpbml0LFxyXG4gICAgICAgIGxvYWRDaGFyYWN0ZXJpc3RpY3M6IGxvYWRDaGFyYWN0ZXJpc3RpY3MsXHJcbiAgICAgICAgbG9hZE1vcmVJdGVtczogbG9hZE1vcmVJdGVtcyxcclxuICAgICAgICBsb2FkTmV3SXRlbXM6IGxvYWROZXdJdGVtcyxcclxuICAgICAgICBsb2FkTm9tZW5jbGF0dXJlczogbG9hZE5vbWVuY2xhdHVyZXMsXHJcbiAgICAgICAgY2hhbmdlQWN0aXZlSXRlbTogY2hhbmdlQWN0aXZlSXRlbSxcclxuICAgICAgICBjbGVhckFjdGl2ZUl0ZW06IGNsZWFyQWN0aXZlSXRlbSxcclxuICAgICAgICByZXNldEZpbHRlcjogcmVzZXRGaWx0ZXJcclxuICAgIH07XHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiBpbml0KCkge1xyXG4gICAgICAgIGlmICghc2VydmljZS5jaGFyYWN0ZXJpc3RpY3MpIHtcclxuICAgICAgICAgICAgbG9hZENoYXJhY3RlcmlzdGljcygpXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihjaGFyYWN0ZXJpc3RpY3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmNoYXJhY3RlcmlzdGljcyA9IGNoYXJhY3RlcmlzdGljcztcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghc2VydmljZS5ub21lbmNsYXR1cmVzKSB7XHJcbiAgICAgICAgICAgIGxvYWROb21lbmNsYXR1cmVzKClcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKG5vbWVuY2xhdHVyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm5vbWVuY2xhdHVyZXMgPSBub21lbmNsYXR1cmVzO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzZXRGaWx0ZXIoKSB7XHJcbiAgICAgICAgc2VydmljZS5maWx0ZXIuY2FzUm4gPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UuZmlsdGVyLmN1cyA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5maWx0ZXIuY2hhcmFjdGVyaXN0aWMgPSAnJztcclxuICAgICAgICBzZXJ2aWNlLmZpbHRlci5lY051bWJlciA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5maWx0ZXIuaW5DaElDb2RlID0gbnVsbDtcclxuICAgICAgICBzZXJ2aWNlLmZpbHRlci5pbkNoSUtleSA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5maWx0ZXIubmFtZSA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5maWx0ZXIubm9tZW5jbGF0dXJlID0gJyc7XHJcbiAgICAgICAgc2VydmljZS5maWx0ZXIudW5OdW1iZXIgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UuZmlsdGVyLmdvb2RzQ29kZSA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5maWx0ZXIucGFnZU51bWJlciA9IDE7XHJcbiAgICAgICAgc2VydmljZS5kaXNwbGF5ID0gJ2xpc3QnO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWROZXdJdGVtcygpIHtcclxuICAgICAgICBzZXJ2aWNlLmRhdGEuYWN0aXZlSXRlbSA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5maWx0ZXIucGFnZU51bWJlciA9IDE7XHJcbiAgICAgICAgcmV0dXJuIGxvYWRJdGVtcyhzZXJ2aWNlLmZpbHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZE1vcmVJdGVtcygpIHtcclxuICAgICAgICByZXR1cm4gbG9hZEl0ZW1zKHNlcnZpY2UuZmlsdGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkSXRlbXMoZmlsdGVyKSB7XHJcblxyXG4gICAgICAgIHZhciBzb3J0ID0gc2VydmljZS5vcmRlckJ5LnNwbGl0KCctJylbMF07XHJcbiAgICAgICAgdmFyIG9yZGVyID0gc2VydmljZS5vcmRlckJ5LnNwbGl0KCctJylbMV07XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2VjaWNzL3NlYXJjaCcgK1xyXG4gICAgICAgICAgICAnP2dvb2RzY29kZT0nICsgKGZpbHRlci5nb29kc0NvZGUgfHwgJycpICtcclxuICAgICAgICAgICAgJyZjYXNybj0nICsgKGZpbHRlci5jYXNSbiB8fCAnJykgK1xyXG4gICAgICAgICAgICAnJmNoYXJhY3RlcmlzdGljPScgKyAoZmlsdGVyLmNoYXJhY3RlcmlzdGljIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmY3VzPScgKyAoZmlsdGVyLmN1cyB8fCAnJykgK1xyXG4gICAgICAgICAgICAnJmVjbnVtYmVyPScgKyAoZmlsdGVyLmVjTnVtYmVyIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmaW5jaGljb2RlPScgKyAoZmlsdGVyLmluQ2hJQ29kZSB8fCAnJykgK1xyXG4gICAgICAgICAgICAnJmluY2hpa2V5PScgKyAoZmlsdGVyLmluQ2hJS2V5IHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmbmFtZT0nICsgKGZpbHRlci5uYW1lIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmZWNpY3Nub21lbmNsYXR1cmU9JyArIChmaWx0ZXIubm9tZW5jbGF0dXJlIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmdW5udW1iZXI9JyArIChmaWx0ZXIudW5OdW1iZXIgfHwgJycpICtcclxuICAgICAgICAgICAgJyZQYWdlSW5kZXg9JyArIChmaWx0ZXIucGFnZU51bWJlciAtIDEpICtcclxuICAgICAgICAgICAgJyZQYWdlU2l6ZT0xMCcgK1xyXG4gICAgICAgICAgICAnJmxhbmc9JyArIGxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgLy8gJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZSArIC8vIFRPRE86IHdlIGNvdWxkIGtlZXAgdHJhY2sgb2YgdGhlIGhpc3RvcnksIGluIHdoaWNoIGNhc2Ugd2UnbGwgbmVlZCB0byBwYXNzIGEgZGF0ZVxyXG4gICAgICAgICAgICAnJlNvcnQ9JyArIHNvcnQgK1xyXG4gICAgICAgICAgICAnJk9yZGVyPScgKyBvcmRlcjtcclxuXHJcbiAgICAgICAgLy8gVE9ETzogd2UgY291bGQgcGFzcyB0aGlzIHBhcmFtZXRlciBhbmQgbm90IGxvYWQgdGhlIGltYWdlcyBvbiB0aGUgc2VydmVyIGlmIHdlIGRvbid0IHBhc3MgaXRcclxuICAgICAgICAvLyBpZiAoc2VydmljZS5kaXNwbGF5ID09PSAnaW1hZ2VzJykge1xyXG4gICAgICAgIC8vICAgICB1cmwgKz0gJyZpbWFnZXNlYXJjaD0xJztcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIHNlcnZpY2UuZGF0YS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChwYWdpbmF0ZWRJdGVtcykge1xyXG4gICAgICAgICAgICBzZXJ2aWNlLmRhdGEuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNlcnZpY2UucmVzcG9uc2UgPSBwYWdpbmF0ZWRJdGVtcztcclxuICAgICAgICAgICAgaWYgKHNlcnZpY2UucmVzcG9uc2UuUmVzdWx0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZUN1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUFjdGl2ZUl0ZW0oc2VydmljZS5yZXNwb25zZS5SZXN1bHRzWzBdLkN1cyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkQ2hhcmFjdGVyaXN0aWNzKCkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2VjaWNzL2NoYXJhY3RlcmlzdGljcyc7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWROb21lbmNsYXR1cmVzKCkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2VjaWNzL25vbWVuY2xhdHVyZXMnO1xyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhckFjdGl2ZUl0ZW0oKSB7XHJcbiAgICAgICAgc2VydmljZS5kYXRhLmFjdGl2ZUl0ZW0gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNoYW5nZUFjdGl2ZUl0ZW0oY3VzKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvZWNpY3MvZGV0YWlscy8nICsgY3VzLnRyaW0oKSArICcvJztcclxuICAgICAgICBzZXJ2aWNlLmRhdGEuYWN0aXZlSXRlbSA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5kYXRhLmlzTG9hZGluZ0RldGFpbHMgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChhY3RpdmVJdGVtKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuZGF0YS5hY3RpdmVJdGVtID0gYWN0aXZlSXRlbTtcclxuICAgICAgICAgICAgc2VydmljZS5kYXRhLmlzTG9hZGluZ0RldGFpbHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgXy5mb3JFYWNoKHNlcnZpY2UucmVzcG9uc2UuUmVzdWx0cywgZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5DdXMgPT09IGN1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY291bnRQZXJDaGFwdGVyKCkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2VjaWNzL2NvdW50LXBlci1jaGFwdGVyLyc7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvdW50UGVySGVhZGluZyhjaGFwdGVyTnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvZWNpY3MvY291bnQtcGVyLWhlYWRpbmcvJyArIGNoYXB0ZXJOdW1iZXIudHJpbSgpICsgJy8nO1xyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjb3VudEZvckdvb2RzQ29kZShnb29kc0NvZGUpIHtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9lY2ljcy9jb3VudC8nICsgZ29vZHNDb2RlLnRyaW0oKSArICcvJztcclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY291bnRGb3JHb29kc0NvZGVzKGdvb2RzQ29kZXMpIHtcclxuICAgICAgICB2YXIgZ29vZHNDb2Rlc1F1ZXJ5U3RyaW5nID0gZ29vZHNDb2Rlcy5qb2luKCcsJyk7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvZWNpY3MvY291bnQtZm9yLWdvb2RzY29kZXM/Z29vZHNjb2Rlcz0nICsgZ29vZHNDb2Rlc1F1ZXJ5U3RyaW5nO1xyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxufSIsIu+7v2FuZ3VsYXIubW9kdWxlKCd0YXJpYy5leGNoYW5nZVJhdGVzJywgW10pXHJcbiAgICAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCByb3V0ZUNvbmZpZ3VyYXRvcl0pXHJcbiAgICAvLyBDb21wb25lbnRzXHJcbiAgICAuY29tcG9uZW50KCdleGNoYW5nZVJhdGVzUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9leGNoYW5nZS1yYXRlcy1wYWdlJykpXHJcbiAgICAuY29tcG9uZW50KCdjdXJyZW5jeVBpY2tlcicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jdXJyZW5jeS1waWNrZXInKSlcclxuICAgIC5jb21wb25lbnQoJ21vbmV0YXJ5VmFsdWVJbnB1dCcsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9tb25ldGFyeS12YWx1ZS1pbnB1dCcpKVxyXG4gICAgLy8gLy8gRmlsdGVyc1xyXG4gICAgLmZpbHRlcignY3VycmVuY3lUeXBlYWhlYWQnLCByZXF1aXJlKCcuL2ZpbHRlcnMvY3VycmVuY3ktdHlwZWFoZWFkLWZpbHRlcicpKVxyXG4gICAgLy8gTW9kYWxzXHJcbiAgICAuZmFjdG9yeSgnY3VycmVuY3lTZWxlY3Rvck1vZGFsJywgcmVxdWlyZSgnLi9tb2RhbHMvY3VycmVuY3ktc2VsZWN0b3InKSlcclxuICAgIC8vIFNlcnZpY2VzXHJcbiAgICAuZmFjdG9yeSgnZXhjaGFuZ2VSYXRlRGF0YVNlcnZpY2UnLCByZXF1aXJlKCcuL3NlcnZpY2VzL2V4Y2hhbmdlLXJhdGUtZGF0YScpKVxyXG4gICAgO1xyXG5cclxuZnVuY3Rpb24gcm91dGVDb25maWd1cmF0b3IoJHJvdXRlUHJvdmlkZXIpIHtcclxuICAgICRyb3V0ZVByb3ZpZGVyXHJcbiAgICAgICAgLndoZW4oJy9leGNoYW5nZS1yYXRlcycsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8ZXhjaGFuZ2UtcmF0ZXMtcGFnZT48L2V4Y2hhbmdlLXJhdGVzLXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgO1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHsgXHJcbiAgICAgICAgY3VycmVuY3k6ICc8JywgXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6ICc8JywgXHJcbiAgICAgICAgcG9zc2libGVDdXJyZW5jaWVzOiAnPCAnLCBcclxuICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAnJicgXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogY3VycmVuY3lQaWNrZXJDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdleGNoYW5nZS1yYXRlcy9jb21wb25lbnRzL2N1cnJlbmN5LXBpY2tlci5odG1sJ1xyXG59O1xyXG5cclxuY3VycmVuY3lQaWNrZXJDb250cm9sbGVyLiRpbmplY3QgPSBbJ2N1cnJlbmN5U2VsZWN0b3JNb2RhbCddO1xyXG5cclxuZnVuY3Rpb24gY3VycmVuY3lQaWNrZXJDb250cm9sbGVyKGN1cnJlbmN5U2VsZWN0b3JNb2RhbCkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgIGNsZWFyOiBjbGVhcixcclxuICAgICAgICBjdXJyZW5jeTogbnVsbCxcclxuICAgICAgICB1c2VySW5wdXQ6IG51bGwsXHJcbiAgICAgICAgcG9zc2libGVDdXJyZW5jaWVzOiBudWxsLFxyXG4gICAgICAgIGl0ZW1TZWxlY3RlZDogaXRlbVNlbGVjdGVkLFxyXG4gICAgICAgIG9uQmx1cjogb25CbHVyLFxyXG4gICAgICAgIG9uRW50ZXI6IG9uRW50ZXIsXHJcbiAgICAgICAgc2hvd01vZGFsOiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbCgpIHtcclxuICAgICAgICBjdXJyZW5jeVNlbGVjdG9yTW9kYWxcclxuICAgICAgICAgICAgLnNob3codm0ucG9zc2libGVDdXJyZW5jaWVzLCB2bS5jdXJyZW5jeSlcclxuICAgICAgICAgICAgLnJlc3VsdFxyXG4gICAgICAgICAgICAudGhlbihpdGVtU2VsZWN0ZWQpXHJcbiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhcihldikge1xyXG4gICAgICAgIHZtLnVzZXJJbnB1dCA9IG51bGw7XHJcbiAgICAgICAgY2xlYXJTZWxlY3Rpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpIHtcclxuICAgICAgICB2bS5jdXJyZW5jeSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHZtLnNlbGVjdGlvbkNoYW5nZWQpXHJcbiAgICAgICAgICAgIHZtLnNlbGVjdGlvbkNoYW5nZWQoeyBjdXJyZW5jeTogbnVsbCB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25CbHVyKCkge1xyXG4gICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25FbnRlcigpIHtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpdGVtU2VsZWN0ZWQoaXRlbSwgbW9kZWwpIHtcclxuICAgICAgICB2bS5jdXJyZW5jeSA9IGl0ZW07XHJcblxyXG4gICAgICAgIGlmICh2bS5zZWxlY3Rpb25DaGFuZ2VkKVxyXG4gICAgICAgICAgICB2bS5zZWxlY3Rpb25DaGFuZ2VkKHsgY3VycmVuY3k6IGl0ZW0gfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogZXhjaGFuZ2VSYXRlc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2V4Y2hhbmdlLXJhdGVzL2NvbXBvbmVudHMvZXhjaGFuZ2UtcmF0ZXMtcGFnZS5odG1sJ1xyXG59O1xyXG5cclxuZXhjaGFuZ2VSYXRlc0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnJHRpbWVvdXQnLFxyXG4gICAgJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJywgXHJcbiAgICAnZXhjaGFuZ2VSYXRlRGF0YVNlcnZpY2UnLCBcclxuICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsXHJcbl07XHJcblxyXG5mdW5jdGlvbiBleGNoYW5nZVJhdGVzQ29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsXHJcbiAgICAkdGltZW91dCwgXHJcbiAgICBub3RpZmljYXRpb25zLCBcclxuICAgIGV4Y2hhbmdlUmF0ZURhdGEsIFxyXG4gICAgc3RhdGVcclxuKSB7XHJcblxyXG4gICAgdmFyIG1vbmV0YXJ5VmFsdWVQcm90b3R5cGUgPSB7XHJcbiAgICAgICAgYW1vdW50OiAxLFxyXG4gICAgICAgIHVuaXQ6ICdFVVInLFxyXG4gICAgICAgIG9yaWdpbmFsQW1vdW50OiAxLFxyXG4gICAgICAgIG9yaWdpbmFsVW5pdDogJ0VVUidcclxuICAgIH07XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIGZpbHRlcjogXCJcIixcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGlzTG9hZGluZ0N1cnJlbmNpZXM6IGZhbHNlLFxyXG4gICAgICAgIGV4Y2hhbmdlUmF0ZTogbnVsbCxcclxuICAgICAgICBjdXJyZW5jaWVzOiBbXSxcclxuICAgICAgICBmaWx0ZXJlZEN1cnJlbmNpZXM6IFtdLFxyXG4gICAgICAgIHNlbGVjdGVkQ3VycmVuY3k6IG51bGwsXHJcbiAgICAgICAgbW9uZXRhcnlWYWx1ZTogXy5jbG9uZShtb25ldGFyeVZhbHVlUHJvdG90eXBlKSxcclxuICAgICAgICBpbnZlcnNlTW9uZXRhcnlWYWx1ZTogXy5jbG9uZShtb25ldGFyeVZhbHVlUHJvdG90eXBlKSxcclxuICAgICAgICByZWZlcmVuY2VDb3VudHJ5OiBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSxcclxuICAgICAgICByZWZlcmVuY2VEYXRlOiBzdGF0ZS5maWx0ZXIuZGF0ZSxcclxuICAgICAgICBkZWNpbWFsUGxhY2VzOiA0LFxyXG4gICAgICAgIGxvYWRFeGNoYW5nZVJhdGU6IGxvYWRFeGNoYW5nZVJhdGUsXHJcbiAgICAgICAgY2xlYXJGaWx0ZXI6IGNsZWFyRmlsdGVyLFxyXG4gICAgICAgIGNoYW5nZUZpbHRlcjogY2hhbmdlRmlsdGVyLFxyXG4gICAgICAgIGZvY3VzRXhjaGFuZ2VGaWx0ZXI6IGZvY3VzRXhjaGFuZ2VGaWx0ZXIsXHJcbiAgICAgICAgZm9jdXNNb25ldGFyeUZpbHRlcjogZm9jdXNNb25ldGFyeUZpbHRlclxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL3JlZmVyZW5jZS9leGNoYW5nZS1yYXRlcycpO1xyXG4gICAgICAgIGlmIChzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9PT0gJ0NIJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB0YXJnZXRDdXJyZW5jeSA9IGV4Y2hhbmdlUmF0ZURhdGEuZ2V0VGFyZ2V0Q3VycmVuY3koc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkpO1xyXG4gICAgICAgIGxvYWRDdXJyZW5jaWVzKHRhcmdldEN1cnJlbmN5LmNvZGUpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgICAgIHZtLm1vbmV0YXJ5VmFsdWUudW5pdCA9IHRhcmdldEN1cnJlbmN5LmNvZGU7XHJcbiAgICAgICAgdm0ubW9uZXRhcnlWYWx1ZS5vcmlnaW5hbFVuaXQgPSB0YXJnZXRDdXJyZW5jeS5jb2RlO1xyXG4gICAgICAgIHZtLmludmVyc2VNb25ldGFyeVZhbHVlLnVuaXQgPSB0YXJnZXRDdXJyZW5jeS5jb2RlO1xyXG4gICAgICAgIHZtLmludmVyc2VNb25ldGFyeVZhbHVlLm9yaWdpbmFsVW5pdCA9IHRhcmdldEN1cnJlbmN5LmNvZGU7XHJcbiAgICAgICAgZm9jdXNFeGNoYW5nZUZpbHRlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNoYW5nZUZpbHRlcigpIHtcclxuICAgICAgICB2bS5maWx0ZXJlZEN1cnJlbmNpZXMgPSB2bS5jdXJyZW5jaWVzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsLmNvZGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2bS5maWx0ZXIudG9Mb3dlckNhc2UoKSkgfHwgZWwuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2bS5maWx0ZXIudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYodm0uZmlsdGVyZWRDdXJyZW5jaWVzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBsb2FkRXhjaGFuZ2VSYXRlKHZtLmZpbHRlcmVkQ3VycmVuY2llc1swXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyRmlsdGVyKCkge1xyXG4gICAgICAgIHZtLmZpbHRlciA9IFwiXCI7XHJcbiAgICAgICAgdm0uZmlsdGVyZWRDdXJyZW5jaWVzID0gdm0uY3VycmVuY2llcztcclxuICAgICAgICBmb2N1c0V4Y2hhbmdlRmlsdGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy51bnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGRhdGVDaGFuZ2VkKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkYXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICB2bS5yZWZlcmVuY2VEYXRlID0gc3RhdGUuZmlsdGVyLmRhdGU7XHJcbiAgICAgICAgdmFyIHRhcmdldEN1cnJlbmN5ID0gZXhjaGFuZ2VSYXRlRGF0YS5nZXRUYXJnZXRDdXJyZW5jeShzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSk7XHJcbiAgICAgICAgbG9hZEN1cnJlbmNpZXModGFyZ2V0Q3VycmVuY3kuY29kZSk7XHJcbiAgICAgICAgZm9jdXNFeGNoYW5nZUZpbHRlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRFeGNoYW5nZVJhdGUoY3VycmVuY3kpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHZtLnNlbGVjdGVkQ3VycmVuY3kgPSBjdXJyZW5jeS5jb2RlO1xyXG5cclxuICAgICAgICB2YXIgdGFyZ2V0Q3VycmVuY3kgPSBleGNoYW5nZVJhdGVEYXRhLmdldFRhcmdldEN1cnJlbmN5KHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5KTtcclxuICAgICAgICBcclxuICAgICAgICBleGNoYW5nZVJhdGVEYXRhLmdldEV4Y2hhbmdlUmF0ZShjdXJyZW5jeS5jb2RlLCB0YXJnZXRDdXJyZW5jeS5jb2RlKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdm0uZXhjaGFuZ2VSYXRlID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLm1vbmV0YXJ5VmFsdWUub3JpZ2luYWxVbml0ID0gY3VycmVuY3kuY29kZTtcclxuICAgICAgICAgICAgICAgIHZtLm1vbmV0YXJ5VmFsdWUuZXhjaGFuZ2VSYXRlID0gZGF0YS5BUGVyQjtcclxuICAgICAgICAgICAgICAgIHZtLm1vbmV0YXJ5VmFsdWUuYW1vdW50ID0gdm0ubW9uZXRhcnlWYWx1ZS5vcmlnaW5hbEFtb3VudCAvIGRhdGEuQVBlckI7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHZtLmludmVyc2VNb25ldGFyeVZhbHVlLnVuaXQgPSBjdXJyZW5jeS5jb2RlO1xyXG4gICAgICAgICAgICAgICAgdm0uaW52ZXJzZU1vbmV0YXJ5VmFsdWUuZXhjaGFuZ2VSYXRlID0gMS4wIC8gZGF0YS5BUGVyQjtcclxuICAgICAgICAgICAgICAgIHZtLmludmVyc2VNb25ldGFyeVZhbHVlLmFtb3VudCA9IHZtLmludmVyc2VNb25ldGFyeVZhbHVlLm9yaWdpbmFsQW1vdW50ICogZGF0YS5BUGVyQjtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkQ3VycmVuY2llcyh0YXJnZXRDdXJyZW5jeUNvZGUpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmdDdXJyZW5jaWVzID0gdHJ1ZTtcclxuICAgICAgICB2bS5leGNoYW5nZVJhdGUgPSBudWxsO1xyXG4gICAgICAgIHZtLnNlbGVjdGVkQ3VycmVuY3kgPSBudWxsO1xyXG4gICAgICAgIGV4Y2hhbmdlUmF0ZURhdGEuZ2V0Q3VycmVuY2llcyh0YXJnZXRDdXJyZW5jeUNvZGUpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5jdXJyZW5jaWVzID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLmZpbHRlcmVkQ3VycmVuY2llcyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmdDdXJyZW5jaWVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uY3VycmVuY2llcyAmJiB2bS5jdXJyZW5jaWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRFeGNoYW5nZVJhdGUodm0uY3VycmVuY2llc1swXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmb2N1c0V4Y2hhbmdlRmlsdGVyKCkge1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhjaGFuZ2UtZmlsdGVyJykuZm9jdXMoKTtcclxuICAgICAgICB9LDApO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG4gICAgZnVuY3Rpb24gZm9jdXNNb25ldGFyeUZpbHRlcigpIHtcclxuICAgICAgICAkdGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1vbmV0YXJ5LWZpbHRlcjpudGgtY2hpbGQoMSkgaW5wdXQnKS5mb2N1cygpO1xyXG4gICAgICAgIH0sMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7IFxyXG4gICAgICAgIG1vbmV0YXJ5VmFsdWU6ICc8JywgXHJcbiAgICAgICAgdHdvV2F5OiAnPCcsIFxyXG4gICAgICAgIGN1cnJlbmN5Rml4ZWQ6ICc8JyxcclxuICAgICAgICBkZWNpbWFsUGxhY2VzOiAnPCcsXHJcbiAgICAgICAgb25DaGFuZ2U6ICcmJ1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IG1vbmV0YXJ5VmFsdWVJbnB1dENvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2V4Y2hhbmdlLXJhdGVzL2NvbXBvbmVudHMvbW9uZXRhcnktdmFsdWUtaW5wdXQuaHRtbCdcclxufTtcclxuXHJcbm1vbmV0YXJ5VmFsdWVJbnB1dENvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICdjdXJyZW5jeVNlbGVjdG9yTW9kYWwnLCBcclxuICAgICdleGNoYW5nZVJhdGVEYXRhU2VydmljZScsIFxyXG4gICAgJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIG1vbmV0YXJ5VmFsdWVJbnB1dENvbnRyb2xsZXIoXHJcbiAgICBjdXJyZW5jeVNlbGVjdG9yTW9kYWwsIFxyXG4gICAgZXhjaGFuZ2VSYXRlRGF0YVNlcnZpY2UsIFxyXG4gICAgbm90aWZpY2F0aW9uc1NlcnZpY2VcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkNoYW5nZXM6ICRvbkNoYW5nZXMsXHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICAgICAgb25DaGFuZ2VBbW91bnRJbkZvcmVpZ25DdXJyZW5jeTogb25DaGFuZ2VBbW91bnRJbkZvcmVpZ25DdXJyZW5jeSxcclxuICAgICAgICBvbkNoYW5nZUFtb3VudEluVGFyZ2V0Q3VycmVuY3k6IG9uQ2hhbmdlQW1vdW50SW5UYXJnZXRDdXJyZW5jeSxcclxuICAgICAgICBzaG93TW9kYWw6IHNob3dNb2RhbCxcclxuICAgICAgICB0d29XYXk6IGZhbHNlLFxyXG4gICAgICAgIGN1cnJlbmNpZXM6IFtdXHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd01vZGFsKCkge1xyXG4gICAgICAgIGV4Y2hhbmdlUmF0ZURhdGFTZXJ2aWNlLmdldEN1cnJlbmNpZXNJbmNsdWRpbmdUYXJnZXRDdXJyZW5jeSgpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGN1cnJlbmNpZXMpIHtcclxuICAgICAgICAgICAgICAgIHZtLmN1cnJlbmNpZXMgPSBjdXJyZW5jaWVzO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbmN5U2VsZWN0b3JNb2RhbFxyXG4gICAgICAgICAgICAgICAgICAgIC5zaG93KHZtLmN1cnJlbmNpZXMsIHZtLm1vbmV0YXJ5VmFsdWUub3JpZ2luYWxVbml0KVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZXN1bHRcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihpdGVtU2VsZWN0ZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVzID09PSAnY2FuY2VsJyB8fCByZXMgPT09ICdlc2NhcGUga2V5IHByZXNzJyB8fCByZXMgPT09ICdiYWNrZHJvcCBjbGljaycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiAkb25DaGFuZ2VzKCkge1xyXG4gICAgICAgIC8vIGRlYnVnZ2VyO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIGlmICghdm0uZGVjaW1hbFBsYWNlcykge1xyXG4gICAgICAgICAgICB2bS5kZWNpbWFsUGxhY2VzID0gNTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2Uuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnVuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRhdGVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICh2bS5tb25ldGFyeVZhbHVlLnVuaXQgIT09IHZtLm1vbmV0YXJ5VmFsdWUub3JpZ2luYWxVbml0KSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZUV4Y2hhbmdlUmF0ZSh2bS5tb25ldGFyeVZhbHVlLm9yaWdpbmFsVW5pdCwgdm0ubW9uZXRhcnlWYWx1ZS51bml0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdXBkYXRlRXhjaGFuZ2VSYXRlKGN1cnJlbmN5QSwgY3VycmVuY3lCKSB7XHJcbiAgICAgICAgLy8gZGVidWdnZXI7XHJcbiAgICAgICAgcmV0dXJuIGV4Y2hhbmdlUmF0ZURhdGFTZXJ2aWNlLmdldEV4Y2hhbmdlUmF0ZShjdXJyZW5jeUEsIGN1cnJlbmN5QilcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGV4Y2hhbmdlUmF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9uZXRhcnlWYWx1ZS5leGNoYW5nZVJhdGUgPSBleGNoYW5nZVJhdGUuQVBlckI7XHJcbiAgICAgICAgICAgICAgICB2bS5tb25ldGFyeVZhbHVlLm9yaWdpbmFsVW5pdCA9IGN1cnJlbmN5QTtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlQW1vdW50SW5Gb3JlaWduQ3VycmVuY3koKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXRlbVNlbGVjdGVkKGN1cnJlbmN5KSB7XHJcbiAgICAgICAgaWYgKGN1cnJlbmN5LmNvZGUgPT09IHZtLm1vbmV0YXJ5VmFsdWUudW5pdCkge1xyXG4gICAgICAgICAgICB2bS5tb25ldGFyeVZhbHVlLm9yaWdpbmFsVW5pdCA9IGN1cnJlbmN5LmNvZGU7XHJcbiAgICAgICAgICAgIHZtLm1vbmV0YXJ5VmFsdWUuZXhjaGFuZ2VSYXRlID0gMTtcclxuICAgICAgICAgICAgb25DaGFuZ2VBbW91bnRJbkZvcmVpZ25DdXJyZW5jeSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1cGRhdGVFeGNoYW5nZVJhdGUoY3VycmVuY3kuY29kZSwgdm0ubW9uZXRhcnlWYWx1ZS51bml0KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkNoYW5nZUFtb3VudEluRm9yZWlnbkN1cnJlbmN5KCkge1xyXG4gICAgICAgIGlmIChpc051bWVyaWNPck51bWJlcih2bS5tb25ldGFyeVZhbHVlLm9yaWdpbmFsQW1vdW50KSAmJiBfLmlzTnVtYmVyKHZtLm1vbmV0YXJ5VmFsdWUuZXhjaGFuZ2VSYXRlKSkge1xyXG4gICAgICAgICAgICB2bS5tb25ldGFyeVZhbHVlLmFtb3VudCA9IHBhcnNlRmxvYXQodm0ubW9uZXRhcnlWYWx1ZS5vcmlnaW5hbEFtb3VudCkgLyB2bS5tb25ldGFyeVZhbHVlLmV4Y2hhbmdlUmF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLm1vbmV0YXJ5VmFsdWUuYW1vdW50ID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2bS5vbkNoYW5nZSkge1xyXG4gICAgICAgICAgICB2bS5vbkNoYW5nZSh2bS5tb25ldGFyeVZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25DaGFuZ2VBbW91bnRJblRhcmdldEN1cnJlbmN5KCkge1xyXG4gICAgICAgIGlmIChpc051bWVyaWNPck51bWJlcih2bS5tb25ldGFyeVZhbHVlLmFtb3VudCkgJiYgXy5pc051bWJlcih2bS5tb25ldGFyeVZhbHVlLmV4Y2hhbmdlUmF0ZSkpIHtcclxuICAgICAgICAgICAgdm0ubW9uZXRhcnlWYWx1ZS5vcmlnaW5hbEFtb3VudCA9IHBhcnNlRmxvYXQodm0ubW9uZXRhcnlWYWx1ZS5hbW91bnQpICogdm0ubW9uZXRhcnlWYWx1ZS5leGNoYW5nZVJhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2bS5tb25ldGFyeVZhbHVlLm9yaWdpbmFsQW1vdW50ID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2bS5vbkNoYW5nZSkge1xyXG4gICAgICAgICAgICB2bS5vbkNoYW5nZSh2bS5tb25ldGFyeVZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXNOdW1lcmljT3JOdW1iZXIoaW5wdXQpIHtcclxuICAgICAgICByZXR1cm4gXy5pc051bWJlcihpbnB1dCkgfHwgaXNOdW1lcmljKGlucHV0KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpc051bWVyaWMoc3RyKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzdHIgIT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICFpc05hTihzdHIpICYmIC8vIHVzZSB0eXBlIGNvZXJjaW9uIHRvIHBhcnNlIHRoZSBfZW50aXJldHlfIG9mIHRoZSBzdHJpbmcgKGBwYXJzZUZsb2F0YCBhbG9uZSBkb2VzIG5vdCBkbyB0aGlzKS4uLlxyXG4gICAgICAgICAgICAgICAgIWlzTmFOKHBhcnNlRmxvYXQoc3RyKSk7IC8vIC4uLmFuZCBlbnN1cmUgc3RyaW5ncyBvZiB3aGl0ZXNwYWNlIGZhaWxcclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0gW2N1cnJlbmN5VHlwZWFoZWFkRmlsdGVyXTtcclxuXHJcbi8vIFRha2VzIGNhcmUgb2Ygb3JkZXJpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIGN1cnJlbmN5IGNvZGUgdHlwZWFoZWQuIFRoZSBsb2dpYyBpcyBhcyBmb2xsb3dzOlxyXG4vLyBGaXJzdCwgc2hvdyB0aGUgbWF0Y2hlcyBvbiB0aGUgY3VycmVuY3kgY29kZSwgb3JkZXJlZCBieSBjb2RlXHJcbi8vIE5leHQsIHNob3cgdGhlIG1hdGNoZXMgb24gdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVuY3kgY29kZSBuYW1lLCBvcmRlcmVkIGJ5IG5hbWVcclxuLy8gRmluYWxseSwgc2hvdyB0aGUgbWF0Y2hlcyBhbnl3aGVyZSBlbHNlIGluIHRoZSBuYW1lLCBvcmRlcmVkIGJ5IG5hbWVcclxuZnVuY3Rpb24gY3VycmVuY3lUeXBlYWhlYWRGaWx0ZXIoKSB7XHJcblxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjdXJyZW5jaWVzLCBxdWVyeSkge1xyXG4gICAgICAgIHZhciByZXN1bHQ7XHJcbiAgICAgICAgaWYgKHF1ZXJ5ID09PSBudWxsIHx8IHF1ZXJ5ID09PSB1bmRlZmluZWQgfHwgcXVlcnkgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IF8uc29ydEJ5KGN1cnJlbmNpZXMsIGZ1bmN0aW9uKGN1cnJlbmN5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVuY3kuY29kZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgY3VycmVuY3lDb2RlTWF0Y2hQYXJ0aXRpb24gPSBfLnBhcnRpdGlvbihjdXJyZW5jaWVzLCBmdW5jdGlvbihjdXJyZW5jeSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbmN5LmNvZGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5LnJlcGxhY2UoJyAnLCAnJykudG9Mb3dlckNhc2UoKSkgPj0gMDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW5jeUNvZGVNYXRjaFN0YXJ0UGFydGl0aW9uID0gXy5wYXJ0aXRpb24oY3VycmVuY3lDb2RlTWF0Y2hQYXJ0aXRpb25bMF0sIGZ1bmN0aW9uKGN1cnJlbmN5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVuY3kuY29kZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkucmVwbGFjZSgnICcsICcnKS50b0xvd2VyQ2FzZSgpKSA9PT0gMDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgY3VycmVuY3lTdGFydE1hdGNoZXMgPSBfLnNvcnRCeShjdXJyZW5jeUNvZGVNYXRjaFN0YXJ0UGFydGl0aW9uWzBdLCBmdW5jdGlvbihjdXJyZW5jeSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbmN5LmNvZGU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2YXIgY3VycmVuY3lPdGhlck1hdGNoZXMgPSBfLnNvcnRCeShjdXJyZW5jeUNvZGVNYXRjaFN0YXJ0UGFydGl0aW9uWzFdLCBmdW5jdGlvbihjdXJyZW5jeSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbmN5LmNvZGU7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdmFyIG90aGVyTWF0Y2hlcyA9IF8uc29ydEJ5KGN1cnJlbmN5Q29kZU1hdGNoUGFydGl0aW9uWzFdLCAnZGVzY3JpcHRpb24nKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBjdXJyZW5jeU5hbWVTdGFydE1hdGNoUGFydGl0aW9uID0gXy5wYXJ0aXRpb24ob3RoZXJNYXRjaGVzLCBmdW5jdGlvbihjdXJyZW5jeSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbmN5LmRlc2NyaXB0aW9uICYmIGN1cnJlbmN5LmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihxdWVyeS50b0xvd2VyQ2FzZSgpKSA9PT0gMDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgb3RoZXJDdXJyZW5jeU5hbWVNYXRjaGVzID0gXy5maWx0ZXIoY3VycmVuY3lOYW1lU3RhcnRNYXRjaFBhcnRpdGlvblsxXSwgZnVuY3Rpb24oY3VycmVuY3kpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW5jeS5kZXNjcmlwdGlvbiAmJiBjdXJyZW5jeS5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkudG9Mb3dlckNhc2UoKSkgPiAtMTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXN1bHQgPSBfLmNvbmNhdChjdXJyZW5jeVN0YXJ0TWF0Y2hlcywgY3VycmVuY3lPdGhlck1hdGNoZXMsIGN1cnJlbmN5TmFtZVN0YXJ0TWF0Y2hQYXJ0aXRpb25bMF0sIG90aGVyQ3VycmVuY3lOYW1lTWF0Y2hlcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHV0RGVmYXVsdEN1cnJlbmNpZXNGaXJzdChyZXN1bHQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0RlZmF1bHRDdXJyZW5jeShjdXJyZW5jeSkge1xyXG4gICAgcmV0dXJuIGN1cnJlbmN5LmNvZGUgPT09ICdFVVInIHx8IGN1cnJlbmN5LmNvZGUgPT09ICdHQlAnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwdXREZWZhdWx0Q3VycmVuY2llc0ZpcnN0KGN1cnJlbmNpZXMpIHtcclxuICAgIHZhciBwYXJ0aXRpb24gPSBfLnBhcnRpdGlvbihjdXJyZW5jaWVzLCBmdW5jdGlvbihjdXJyZW5jeSkge1xyXG4gICAgICAgIHJldHVybiBpc0RlZmF1bHRDdXJyZW5jeShjdXJyZW5jeSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBfLmNvbmNhdChwYXJ0aXRpb25bMF0sIHBhcnRpdGlvblsxXSk7XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBbJyRhbmFseXRpY3MnLCAnJHVpYk1vZGFsJywgY3VycmVuY3lDb2RlU2VsZWN0b3JNb2RhbF07XHJcblxyXG5mdW5jdGlvbiBjdXJyZW5jeUNvZGVTZWxlY3Rvck1vZGFsKCRhbmFseXRpY3MsICR1aWJNb2RhbCkge1xyXG4gICAgdmFyIG1vZGFsID0ge1xyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICBjdXJyZW5jeUNvZGVTZWxlY3Rvck1vZGFsQ29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICdwb3NzaWJsZUN1cnJlbmN5Q29kZXMnLCAnY3VycmVuY3lDb2RlJ107XHJcblxyXG4gICAgZnVuY3Rpb24gY3VycmVuY3lDb2RlU2VsZWN0b3JNb2RhbENvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIHBvc3NpYmxlQ3VycmVuY3lDb2RlcywgY3VycmVuY3lDb2RlKSB7XHJcbiAgICAgICAgdmFyIHZtID0ge1xyXG4gICAgICAgICAgICBjdXJyZW5jeUNvZGU6IGN1cnJlbmN5Q29kZSxcclxuICAgICAgICAgICAgY2FuY2VsOiBjYW5jZWwsXHJcbiAgICAgICAgICAgIHBvc3NpYmxlQ3VycmVuY3lDb2RlczogcG9zc2libGVDdXJyZW5jeUNvZGVzLFxyXG4gICAgICAgICAgICBvazogb2tcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gb2soY29kZSkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZShjb2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB2bTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TW9kYWwocG9zc2libGVDdXJyZW5jeUNvZGVzLCBjdXJyZW5jeUNvZGUpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJ29wZW4tbW9kYWwtY3VycmVuY3ktc2VsZWN0b3InLCB7IGNhdGVnb3J5OiAnZXhjaGFuZ2UtcmF0ZXMnIH0pO1xyXG4gICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICBhbmltYXRpb246IHRydWUsXHJcbiAgICAgICAgICAgIGJhY2tkcm9wOiB0cnVlLFxyXG4gICAgICAgICAgICBiaW5kVG9Db250cm9sbGVyOiB0cnVlLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBjdXJyZW5jeUNvZGVTZWxlY3Rvck1vZGFsQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAnY3RybCcsXHJcbiAgICAgICAgICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW5jeUNvZGU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcG9zc2libGVDdXJyZW5jeUNvZGVzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc3NpYmxlQ3VycmVuY3lDb2RlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2l6ZTogJ2xnJyxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdleGNoYW5nZS1yYXRlcy9tb2RhbHMvY3VycmVuY3ktc2VsZWN0b3IuaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtY3VycmVuY3ktY29kZS1zZWxlY3RvcidcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbW9kYWxJbnN0YW5jZS5yZW5kZXJlZC50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudFRvRm9jdXNPbkluTW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubW9kYWwuaW4gLmZvY3VzLW9uLW9wZW4tbW9kYWwnKTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRUb0ZvY3VzT25Jbk1vZGFsKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50VG9Gb2N1c09uSW5Nb2RhbC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBtb2RhbEluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFsnY29tbW9uJywgJ2RhdGFDb250ZXh0JywgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgZXhjaGFuZ2VSYXRlRGF0YVNlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gZXhjaGFuZ2VSYXRlRGF0YVNlcnZpY2UoY29tbW9uLCBjb250ZXh0LCBzdGF0ZSkge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgY2FjaGVkRXhjaGFuZ2VSYXRlczoge30sXHJcbiAgICAgICAgZ2V0Q3VycmVuY2llczogZ2V0Q3VycmVuY2llcyxcclxuICAgICAgICBnZXRDdXJyZW5jaWVzSW5jbHVkaW5nVGFyZ2V0Q3VycmVuY3k6IGdldEN1cnJlbmNpZXNJbmNsdWRpbmdUYXJnZXRDdXJyZW5jeSxcclxuICAgICAgICBnZXRFeGNoYW5nZVJhdGU6IGdldEV4Y2hhbmdlUmF0ZSxcclxuICAgICAgICBnZXRUYXJnZXRDdXJyZW5jeTogZ2V0VGFyZ2V0Q3VycmVuY3lcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q3VycmVuY2llcyh0YXJnZXRDdXJyZW5jeSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmR0diArICcvZXhjaGFuZ2UtcmF0ZS1jdXJyZW5jaWVzLycgKyB0YXJnZXRDdXJyZW5jeSArXHJcbiAgICAgICAgICAgICAgICAnP2xhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KHVybClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGN1cnJlbmNpZXMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmZpbHRlcihjdXJyZW5jaWVzLCBmdW5jdGlvbihjdXJyZW5jeSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW5jeS5jb2RlICE9PSB0YXJnZXRDdXJyZW5jeTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFRhcmdldEN1cnJlbmN5KHJlZmVyZW5jZUNvdW50cnkpIHtcclxuICAgICAgICB2YXIgZ2JwID0ge1xyXG4gICAgICAgICAgICBjb2RlOiAnR0JQJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdQb3VuZCdcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBldXIgPSB7XHJcbiAgICAgICAgICAgIGNvZGU6ICdFVVInLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0V1cm8nXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgc2VrID0ge1xyXG4gICAgICAgICAgICBjb2RlOiAnU0VLJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTd2VkaXNoIEtyb25hJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHJlZmVyZW5jZUNvdW50cnkgPT09ICdHQicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdicDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZWxzZSBpZiAocmVmZXJlbmNlQ291bnRyeSA9PT0gJ1NFJykge1xyXG4gICAgICAgIC8vICAgICByZXR1cm4gc2VrO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV1cjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q3VycmVuY2llc0luY2x1ZGluZ1RhcmdldEN1cnJlbmN5KCkge1xyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciB0YXJnZXRDdXJyZW5jeSA9IGdldFRhcmdldEN1cnJlbmN5KHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5KTtcclxuICAgICAgICByZXR1cm4gZ2V0Q3VycmVuY2llcyh0YXJnZXRDdXJyZW5jeS5jb2RlKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY3VycmVuY2llcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY29uY2F0KFt0YXJnZXRDdXJyZW5jeV0sIGN1cnJlbmNpZXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgbWVtb2l6ZWQgPSBfLm1lbW9pemUoZ2V0RXhjaGFuZ2VSYXRlRm9yUmVmZXJlbmNlQ291bnRyeUF0RGF0ZSwgZnVuY3Rpb24oY3VycmVuY3lBLCBjdXJyZW5jeUIsIHJlZmVyZW5jZUNvdW50cnksIHJlZmVyZW5jZURhdGUpIHtcclxuICAgICAgICByZXR1cm4gY3VycmVuY3lBICsgJ3wnICsgY3VycmVuY3lCICsgJ3wnICsgcmVmZXJlbmNlQ291bnRyeSArICd8JyArIHJlZmVyZW5jZURhdGU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRFeGNoYW5nZVJhdGUoY3VycmVuY3lBLCBjdXJyZW5jeUIpIHtcclxuICAgICAgICByZXR1cm4gbWVtb2l6ZWQoY3VycmVuY3lBLCBjdXJyZW5jeUIsIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5LCBzdGF0ZS5maWx0ZXIuZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0RXhjaGFuZ2VSYXRlRm9yUmVmZXJlbmNlQ291bnRyeUF0RGF0ZShjdXJyZW5jeUEsIGN1cnJlbmN5QiwgcmVmZXJlbmNlQ291bnRyeSwgcmVmZXJlbmNlRGF0ZSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmR0diArICcvZXhjaGFuZ2UtcmF0ZXMvJyArIGN1cnJlbmN5QSArICcvJyArIGN1cnJlbmN5QiArXHJcbiAgICAgICAgICAgICAgICAnP3JlZmVyZW5jZWNvdW50cnk9JyArIHJlZmVyZW5jZUNvdW50cnkgK1xyXG4gICAgICAgICAgICAgICAgJyZkYXRlPScgKyByZWZlcmVuY2VEYXRlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG59IiwiYW5ndWxhci5tb2R1bGUoJ3RhcmljLmV6dCcsIFtdKVxyXG4gICAgLmNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgcm91dGVDb25maWd1cmF0b3JdKVxyXG4gICAgLy8gQ29tcG9uZW50c1xyXG4gICAgLmNvbXBvbmVudCgnZXp0RXhjaXNlQ29kZVBpY2tlcicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9lenQtZXhjaXNlLWNvZGUtcGlja2VyJykpXHJcbiAgICAuY29tcG9uZW50KCdlenROb21lbmNsYXR1cmUnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZXp0LW5vbWVuY2xhdHVyZScpKVxyXG4gICAgLmNvbXBvbmVudCgnZXp0SGlud2Vpc2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZXp0LWhpbndlaXNlJykpXHJcbiAgICAuY29tcG9uZW50KCdlenRUZXh0c1BhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZXp0LXRleHRzLXBhZ2UnKSlcclxuICAgIC8vIENvbnRyb2xsZXJzXHJcbiAgICAvLyBGaWx0ZXJzXHJcbiAgICAuZmlsdGVyKCdlenRFeGNpc2VDb2RlVHlwZWFoZWFkJywgcmVxdWlyZSgnLi9maWx0ZXJzL2V6dC1leGNpc2UtY29kZS10eXBlYWhlYWQtZmlsdGVyJykpXHJcbiAgICAvLyBNb2RhbHNcclxuICAgIC5mYWN0b3J5KCdlenRFeGNpc2VDb2RlU2VsZWN0b3JNb2RhbCcsIHJlcXVpcmUoJy4vbW9kYWxzL2V6dC1leGNpc2UtY29kZS1zZWxlY3RvcicpKVxyXG4gICAgLy8gU2VydmljZXNcclxuICAgIC5mYWN0b3J5KCdlenREYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvZXp0LWRhdGEnKSlcclxuICAgIDtcclxuXHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL3RleHRzLWdlcm1hbi1jdXN0b21zJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxlenQtdGV4dHMtcGFnZT48L2V6dC10ZXh0cy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvdGV4dHMtZ2VybWFuLWN1c3RvbXMvOmRvY3VtZW50VHlwZS86bWFpbkRvY3VtZW50Jywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxlenQtdGV4dHMtcGFnZT48L2V6dC10ZXh0cy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgO1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBleGNpc2VDb2RlOiAnPCcsXHJcbiAgICAgICAgZXhjaXNlTm9tZW5jbGF0dXJlOiAnPCcsXHJcbiAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZDogJyYnLFxyXG4gICAgICAgIHZhbGlkYXRpb246ICc8JyBcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBlenRFeGNpc2VDb2RlUGlja2VyQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnZXp0L2NvbXBvbmVudHMvZXp0LWV4Y2lzZS1jb2RlLXBpY2tlci5odG1sJ1xyXG59O1xyXG5cclxuZXp0RXhjaXNlQ29kZVBpY2tlckNvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICdlenRFeGNpc2VDb2RlU2VsZWN0b3JNb2RhbCdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGV6dEV4Y2lzZUNvZGVQaWNrZXJDb250cm9sbGVyKFxyXG4gICAgZXp0RXhjaXNlQ29kZVNlbGVjdG9yTW9kYWxcclxuKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgY2xlYXI6IGNsZWFyLFxyXG4gICAgICAgIGl0ZW1TZWxlY3RlZDogaXRlbVNlbGVjdGVkLFxyXG4gICAgICAgIG9uQmx1cjogb25CbHVyLFxyXG4gICAgICAgIG9uRW50ZXI6IG9uRW50ZXIsXHJcbiAgICAgICAgc2hvd01vZGFsOiBzaG93TW9kYWxcclxuICAgIH1cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhcihldikge1xyXG4gICAgICAgIHZtLnVzZXJJbnB1dCA9IG51bGw7XHJcbiAgICAgICAgY2xlYXJTZWxlY3Rpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpIHtcclxuICAgICAgICB2bS5leGNpc2VDb2RlID0gbnVsbDtcclxuICAgICAgICBpZiAodm0uc2VsZWN0aW9uQ2hhbmdlZClcclxuICAgICAgICAgICAgdm0uc2VsZWN0aW9uQ2hhbmdlZCh7IGV4Y2lzZUNvZGU6IG51bGwgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG9uQmx1cigpIHtcclxuICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG9uRW50ZXIoKSB7XHJcbiAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpdGVtU2VsZWN0ZWQoaXRlbSkge1xyXG4gICAgICAgIHZtLmV4Y2lzZUNvZGUgPSBpdGVtO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh2bS5zZWxlY3Rpb25DaGFuZ2VkKVxyXG4gICAgICAgICAgICB2bS5zZWxlY3Rpb25DaGFuZ2VkKHsgZXp0RXhjaXNlQ29kZTogaXRlbSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TW9kYWwoKSB7XHJcbiAgICAgICAgZXp0RXhjaXNlQ29kZVNlbGVjdG9yTW9kYWxcclxuICAgICAgICAgICAgLnNob3codm0uZXhjaXNlTm9tZW5jbGF0dXJlLCB2bS5leGNpc2VDb2RlKVxyXG4gICAgICAgICAgICAucmVzdWx0XHJcbiAgICAgICAgICAgIC50aGVuKGl0ZW1TZWxlY3RlZClcclxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghKHJlcyA9PT0gJ2NhbmNlbCcgfHwgcmVzID09PSAnZXNjYXBlIGtleSBwcmVzcycgfHwgcmVzID09PSAnYmFja2Ryb3AgY2xpY2snKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgY291bnRyeUNvZGU6ICc8JyxcclxuICAgICAgICBjdXJyZW50Q29kZTogJzwnLFxyXG4gICAgICAgIGhpbndlaXNlOiAnPCdcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBlenRIaW53ZWlzZUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2V6dC9jb21wb25lbnRzL2V6dC1oaW53ZWlzZS5odG1sJ1xyXG59O1xyXG5cclxuZXp0SGlud2Vpc2VDb250cm9sbGVyLiRpbmplY3QgPSBbJ2NvdW50cnlEYXRhU2VydmljZSddO1xyXG5cclxuZnVuY3Rpb24gZXp0SGlud2Vpc2VDb250cm9sbGVyKGNvdW50cnlEYXRhU2VydmljZSkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIGdldFJlbGV2YW50SGlud2Vpc2U6IGdldFJlbGV2YW50SGlud2Vpc2VcclxuICAgIH1cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRSZWxldmFudEhpbndlaXNlKCkge1xyXG4gICAgICAgIGlmICghdm0uaGlud2Vpc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZtLmhpbndlaXNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXy5jaGFpbih2bS5oaW53ZWlzZSlcclxuICAgICAgICAgICAgLmZpbHRlcihoaW53ZWlzSXNWYWxpZEZvck5hdGlvbmFsR29vZHNOb21lbmNsYXR1cmUpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoaGlud2Vpc0lzVmFsaWRGb3JDb3VudHJ5Q29kZSlcclxuICAgICAgICAgICAgLnZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaGlud2Vpc0lzVmFsaWRGb3JOYXRpb25hbEdvb2RzTm9tZW5jbGF0dXJlKGhpbndlaXMpIHtcclxuICAgICAgICBpZiAoXy5lbmRzV2l0aChoaW53ZWlzLk5hdGlvbmFsR29vZHNOb21lbmNsYXR1cmVJZCwgJzAnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhpbndlaXMuTmF0aW9uYWxHb29kc05vbWVuY2xhdHVyZUlkID09PSB2bS5jdXJyZW50Q29kZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBoaW53ZWlzSXNWYWxpZEZvckNvdW50cnlDb2RlKGhpbndlaXMpIHtcclxuICAgICAgICBpZiAoIXZtLmNvdW50cnlDb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWhpbndlaXMuR2VvZ3JhcGhpY2FsQXJlYUlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaGlud2Vpcy5HZW9ncmFwaGljYWxBcmVhSWQgPT09IHZtLmNvdW50cnlDb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVnaW9uTWVtYmVycyA9IGNvdW50cnlEYXRhU2VydmljZS5yZWdpb25zW2hpbndlaXMuR2VvZ3JhcGhpY2FsQXJlYUlkXTtcclxuICAgICAgICBpZiAocmVnaW9uTWVtYmVycyAmJiBfLmluY2x1ZGVzKHJlZ2lvbk1lbWJlcnMsIHZtLmNvdW50cnlDb2RlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIGN1cnJlbnRDb2RlOiAnPCcsXHJcbiAgICAgICAgbm9tZW5jbGF0dXJlOiAnPCcsXHJcbiAgICAgICAgb25DbGlja1JvdzogJyYnLFxyXG4gICAgICAgIHZhbGlkYXRpb246ICc8JyBcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBlenROb21lbmNsYXR1cmVDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdlenQvY29tcG9uZW50cy9lenQtbm9tZW5jbGF0dXJlLmh0bWwnXHJcbn07XHJcblxyXG5mdW5jdGlvbiBlenROb21lbmNsYXR1cmVDb250cm9sbGVyKCkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIGNsaWNrRXp0Tm9tZW5jbGF0dXJlTGluZTogY2xpY2tFenROb21lbmNsYXR1cmVMaW5lXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNsaWNrRXp0Tm9tZW5jbGF0dXJlTGluZShsaW5lKSB7XHJcbiAgICAgICAgaWYgKGxpbmUuUHJvZExpbiA9PT0gJzgwJyAmJiB2bS5vbkNsaWNrUm93KSB7XHJcbiAgICAgICAgICAgIHZtLm9uQ2xpY2tSb3coeyBjb21tb2RpdHlDb2RlOiBsaW5lLkNvbW1vZGl0eUNvZGUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBFenRUZXh0c0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2V6dC9jb21wb25lbnRzL2V6dC10ZXh0cy1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG5FenRUZXh0c0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckcScsIFxyXG4gICAgJyRyb3V0ZVBhcmFtcycsIFxyXG4gICAgJ2V6dERhdGFTZXJ2aWNlJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gRXp0VGV4dHNDb250cm9sbGVyKFxyXG4gICAgJHEsIFxyXG4gICAgJHJvdXRlUGFyYW1zLCBcclxuICAgIGV6dERhdGFTZXJ2aWNlXHJcbikge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgIHNjcm9sbFRvRG9jdW1lbnQ6IHNjcm9sbFRvRG9jdW1lbnRcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtsb2FkSW5kZXgoKV07XHJcbiAgICAgICAgaWYgKCRyb3V0ZVBhcmFtcy5kb2N1bWVudFR5cGUgJiYgJHJvdXRlUGFyYW1zLm1haW5Eb2N1bWVudCkge1xyXG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGxvYWREb2N1bWVudHMoJHJvdXRlUGFyYW1zLmRvY3VtZW50VHlwZSwgJHJvdXRlUGFyYW1zLm1haW5Eb2N1bWVudCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkcS5hbGwocHJvbWlzZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvRG9jdW1lbnQoZXp0RG9jdW1lbnQpIHtcclxuICAgICAgICBkb2N1bWVudFxyXG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvcignLicgKyBlenREb2N1bWVudC5IdG1sQ2xhc3NOYW1lKVxyXG4gICAgICAgICAgICAuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBsb2FkSW5kZXgoKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nSW5kZXggPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBlenREYXRhU2VydmljZS5sb2FkRXp0VGV4dE1haW5JbmRleCgpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nSW5kZXggPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHZtLm1haW5JbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkRG9jdW1lbnRzKGRvY3VtZW50VHlwZSwgbWFpbkRvY3VtZW50KSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nRG9jdW1lbnRzID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZXp0RGF0YVNlcnZpY2UubG9hZEV6dERvY3VtZW50cyhkb2N1bWVudFR5cGUsIG1haW5Eb2N1bWVudClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRvY3VtZW50cykge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nRG9jdW1lbnRzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2bS5kb2N1bWVudHMgPSBkb2N1bWVudHM7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFtlenRFeGNpc2VDb2RlVHlwZWFoZWFkRmlsdGVyXTtcclxuXHJcbi8vIFRha2VzIGNhcmUgb2Ygb3JkZXJpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIGV4Y2lzZSBjb2RlIHR5cGVhaGVkLiBUaGUgbG9naWMgaXMgYXMgZm9sbG93czpcclxuLy8gRmlyc3QsIHNob3cgdGhlIG1hdGNoZXMgb24gdGhlIGV4Y2lzZSBjb2RlLCBvcmRlcmVkIGJ5IGNvZGUgKElkKVxyXG4vLyBOZXh0LCBzaG93IHRoZSBtYXRjaGVzIG9uIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4Y2lzZSBjb2RlIGRlc2NyaXB0aW9uLCBvcmRlcmVkIGJ5IGRlc2NyaXB0aW9uXHJcbi8vIEZpbmFsbHksIHNob3cgdGhlIG1hdGNoZXMgYW55d2hlcmUgZWxzZSBpbiB0aGUgZGVzY3JpcHRpb24sIG9yZGVyZWQgYnkgZGVzY3JpcHRpb25cclxuZnVuY3Rpb24gZXp0RXhjaXNlQ29kZVR5cGVhaGVhZEZpbHRlcigpIHtcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV4Y2lzZUNvZGVzLCBxdWVyeSkge1xyXG4gICAgICAgIGlmIChxdWVyeSA9PT0gbnVsbCB8fCBxdWVyeSA9PT0gdW5kZWZpbmVkIHx8IHF1ZXJ5ID09PSAnJykge1xyXG4gICAgICAgICAgICByZXR1cm4gXy5zb3J0QnkoZXhjaXNlQ29kZXMsIGZ1bmN0aW9uKGV4Y2lzZUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBleGNpc2VDb2RlLklkICsgZXhjaXNlQ29kZS5Qcm9kTGluO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfLmNoYWluKGV4Y2lzZUNvZGVzKS5maWx0ZXIoZnVuY3Rpb24gKGV4Y2lzZUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBleGNpc2VDb2RlLlByb2RMaW4gIT09ICc4MCcgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgZXhjaXNlQ29kZS5JZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkucmVwbGFjZSgnICcsICcnKS50b0xvd2VyQ2FzZSgpKSA+PSAwIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgZXhjaXNlQ29kZS5EZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkudG9Mb3dlckNhc2UoKSkgPj0gMDtcclxuICAgICAgICAgICAgfSkuc29ydEJ5KGZ1bmN0aW9uKGV4Y2lzZUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBleGNpc2VDb2RlLklkICsgZXhjaXNlQ29kZS5Qcm9kTGluO1xyXG4gICAgICAgICAgICB9KS52YWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuXHJcbiIsIm1vZHVsZS5leHBvcnRzID0gWyckYW5hbHl0aWNzJywgJyR1aWJNb2RhbCcsIGV6dEV4Y2lzZUNvZGVTZWxlY3Rvck1vZGFsXTtcclxuXHJcbmZ1bmN0aW9uIGV6dEV4Y2lzZUNvZGVTZWxlY3Rvck1vZGFsKCRhbmFseXRpY3MsICR1aWJNb2RhbCkge1xyXG4gICAgdmFyIG1vZGFsID0ge1xyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICBlenRFeGNpc2VDb2RlU2VsZWN0b3JNb2RhbENvbnRyb2xsZXIuJGluamVjdCA9IFsnJHVpYk1vZGFsSW5zdGFuY2UnLCAnZXhjaXNlTm9tZW5jbGF0dXJlJywgJ2V4Y2lzZUNvZGUnXTtcclxuXHJcbiAgICBmdW5jdGlvbiBlenRFeGNpc2VDb2RlU2VsZWN0b3JNb2RhbENvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIGV4Y2lzZU5vbWVuY2xhdHVyZSwgZXhjaXNlQ29kZSkge1xyXG4gICAgICAgIHZhciB2bSA9IHtcclxuICAgICAgICAgICAgZXhjaXNlQ29kZTogZXhjaXNlQ29kZSxcclxuICAgICAgICAgICAgY2FuY2VsOiBjYW5jZWwsXHJcbiAgICAgICAgICAgIGV4Y2lzZU5vbWVuY2xhdHVyZTogZXhjaXNlTm9tZW5jbGF0dXJlLFxyXG4gICAgICAgICAgICBvazogb2tcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gb2soY29kZSkge1xyXG4gICAgICAgICAgICBpZiAoY29kZS5Qcm9kTGluID09PSAnODAnKSB7XHJcbiAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZShjb2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChleGNpc2VOb21lbmNsYXR1cmUsIGV4Y2lzZUNvZGUpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJ29wZW4tbW9kYWwtZXp0LWV4Y2lzZS1jb2RlLXNlbGVjdG9yJywgeyBjYXRlZ29yeTogJ2FkZGl0aW9uYWwtY29kZXMnIH0pO1xyXG5cclxuICAgICAgICB2YXIgbW9kYWxJbnN0YW5jZSA9ICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICBiYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgYmluZFRvQ29udHJvbGxlcjogdHJ1ZSxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogZXp0RXhjaXNlQ29kZVNlbGVjdG9yTW9kYWxDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsJyxcclxuICAgICAgICAgICAga2V5Ym9hcmQ6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGFsRmFkZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgZXhjaXNlQ29kZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBleGNpc2VDb2RlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGV4Y2lzZU5vbWVuY2xhdHVyZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBleGNpc2VOb21lbmNsYXR1cmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNpemU6ICdsZycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnZXp0L21vZGFscy9lenQtZXhjaXNlLWNvZGUtc2VsZWN0b3IuaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtZXp0LWV4Y2lzZS1jb2RlLXNlbGVjdG9yJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBtb2RhbEluc3RhbmNlLnJlbmRlcmVkLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50VG9Gb2N1c09uSW5Nb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC5pbiAuZm9jdXMtb24tb3Blbi1tb2RhbCcpO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudFRvRm9jdXNPbkluTW9kYWwpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRUb0ZvY3VzT25Jbk1vZGFsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1vZGFsO1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gW1xyXG4gICAgJ2NvbW1vbicsIFxyXG4gICAgJ2RhdGFDb250ZXh0JywgXHJcbiAgICAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLFxyXG4gICAgZXp0RGF0YVNlcnZpY2VcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGV6dERhdGFTZXJ2aWNlKFxyXG4gICAgY29tbW9uLCBcclxuICAgIGRhdGFDb250ZXh0LFxyXG4gICAgc3RhdGVcclxuKSB7XHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBsb2FkRXp0RXhjaXNlTm9tZW5jbGF0dXJlOiBsb2FkRXp0RXhjaXNlTm9tZW5jbGF0dXJlLFxyXG4gICAgICAgIGxvYWRFenROb21lbmNsYXR1cmU6IGxvYWRFenROb21lbmNsYXR1cmUsXHJcbiAgICAgICAgbG9hZEV6dEhpbndlaXNlOiBsb2FkRXp0SGlud2Vpc2UsXHJcbiAgICAgICAgbG9hZEV6dERvY3VtZW50czogbG9hZEV6dERvY3VtZW50cyxcclxuICAgICAgICBsb2FkRXp0Rm9vdG5vdGU6IGxvYWRFenRGb290bm90ZSxcclxuICAgICAgICBsb2FkRXp0VGV4dE1haW5JbmRleDogbG9hZEV6dFRleHRNYWluSW5kZXhcclxuICAgIH07XHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkRXp0RG9jdW1lbnRzKGRvY3VtZW50VHlwZSwgbWFpbkRvY3VtZW50KSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvZXp0L3RleHRzLycgKyBkb2N1bWVudFR5cGUgKyAnLycgKyBtYWluRG9jdW1lbnQgK1xyXG4gICAgICAgICAgICAnP3JlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZEV6dFRleHRNYWluSW5kZXgoKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvZXp0L3RleHRzJyArXHJcbiAgICAgICAgICAgICc/cmVmZXJlbmNlY291bnRyeT0nICsgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkRXp0Tm9tZW5jbGF0dXJlKGNvbW1vZGl0eUNvZGUpIHtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0c1tjb21tb24uY29uZmlnLmN1cnJlbnRBcGldICsgJy9lenQvbm9tZW5jbGF0dXJlLycgKyBjb21tb2RpdHlDb2RlICtcclxuICAgICAgICAgICAgJz9tb3ZlbWVudD0nICsgc3RhdGUuZmlsdGVyLm1vdmVtZW50ICtcclxuICAgICAgICAgICAgJyZsYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgICtcclxuICAgICAgICAgICAgJyZyZWZlcmVuY2Vjb3VudHJ5PScgKyBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeTtcclxuXHJcbiAgICAgICAgaWYgKHN0YXRlLmZpbHRlci5kYXRlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHVybCArPSAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRFenRIaW53ZWlzZShjb21tb2RpdHlDb2RlKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvZXp0L2hpbndlaXNlLycgKyBjb21tb2RpdHlDb2RlICtcclxuICAgICAgICAgICAgJz9tb3ZlbWVudD0nICsgc3RhdGUuZmlsdGVyLm1vdmVtZW50ICtcclxuICAgICAgICAgICAgJyZsYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgICtcclxuICAgICAgICAgICAgJyZyZWZlcmVuY2Vjb3VudHJ5PScgKyBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeTtcclxuXHJcbiAgICAgICAgaWYgKHN0YXRlLmZpbHRlci5kYXRlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHVybCArPSAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRFenRGb290bm90ZShmb290bm90ZVR5cGUsIGZvb3Rub3RlQ29kZSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL2V6dC9mb290bm90ZXMvJyArIGZvb3Rub3RlVHlwZSArICcvJyArIGZvb3Rub3RlQ29kZSArXHJcbiAgICAgICAgICAgICc/bW92ZW1lbnQ9JyArIHN0YXRlLmZpbHRlci5tb3ZlbWVudCArXHJcbiAgICAgICAgICAgICcmbGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICArXHJcbiAgICAgICAgICAgICcmcmVmZXJlbmNlY291bnRyeT0nICsgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnk7XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5maWx0ZXIuZGF0ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB1cmwgKz0gJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkRXp0RXhjaXNlTm9tZW5jbGF0dXJlKGV4Y2lzZVR5cGVJZCkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL2V6dC9leGNpc2Utbm9tZW5jbGF0dXJlLycgKyBleGNpc2VUeXBlSWQgK1xyXG4gICAgICAgICAgICAnP21vdmVtZW50PScgKyBzdGF0ZS5maWx0ZXIubW92ZW1lbnQgK1xyXG4gICAgICAgICAgICAnJmxhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSAgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5O1xyXG5cclxuICAgICAgICBpZiAoc3RhdGUuZmlsdGVyLmRhdGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdXJsICs9ICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcbn0iLCLvu79hbmd1bGFyLm1vZHVsZSgndGFyaWMuZm9vdG5vdGVzJywgW10pXHJcbiAgICAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCByb3V0ZUNvbmZpZ3VyYXRvcl0pXHJcbiAgICAuY29tcG9uZW50KCdmb290bm90ZU92ZXJ2aWV3UGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9mb290bm90ZS1vdmVydmlldy1wYWdlJykpXHJcbiAgICAuY29tcG9uZW50KCdmb290bm90ZUJ1dHRvbnMnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZm9vdG5vdGUtYnV0dG9ucycpKVxyXG4gICAgLmZhY3RvcnkoJ2Zvb3Rub3RlRGF0YVNlcnZpY2UnLCByZXF1aXJlKCcuL3NlcnZpY2VzL2Zvb3Rub3RlLWRhdGEnKSlcclxuICAgIC5mYWN0b3J5KCdmb290bm90ZU1vZGFsJywgcmVxdWlyZSgnLi9tb2RhbHMvZm9vdG5vdGUnKSlcclxuICAgIC5mYWN0b3J5KCdmb290bm90ZU1vZGFsc1NlcnZpY2UnLCByZXF1aXJlKCcuL21vZGFscy9tb2RhbHMnKSlcclxuICAgIDtcclxuXHJcbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJhdG9yKCRyb3V0ZVByb3ZpZGVyKSB7XHJcbiAgICAkcm91dGVQcm92aWRlclxyXG4gICAgICAgIC53aGVuKCcvZm9vdG5vdGVzJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxmb290bm90ZS1vdmVydmlldy1wYWdlPjwvZm9vdG5vdGUtb3ZlcnZpZXctcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICA7XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIGZvb3Rub3RlczogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogZm9vdG5vdGVCdXR0b25zQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnZm9vdG5vdGVzL2NvbXBvbmVudHMvZm9vdG5vdGUtYnV0dG9ucy5odG1sJ1xyXG59O1xyXG5cclxuZm9vdG5vdGVCdXR0b25zQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJ2NvbW1vbicsIFxyXG4gICAgJ2V6dERhdGFTZXJ2aWNlJyxcclxuICAgICdmb290bm90ZURhdGFTZXJ2aWNlJywgXHJcbiAgICAnZm9vdG5vdGVNb2RhbHNTZXJ2aWNlJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gZm9vdG5vdGVCdXR0b25zQ29udHJvbGxlcihcclxuICAgIGNvbW1vbiwgXHJcbiAgICBlenREYXRhU2VydmljZSwgXHJcbiAgICBmb290bm90ZURhdGEsIFxyXG4gICAgZm9vdG5vdGVNb2RhbHNcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgIGZvb3Rub3RlczogW10sXHJcbiAgICAgICAgZm9vdG5vdGVzQnlUeXBlOiBbXSxcclxuICAgICAgICBwcm9jZXNzRm9vdG5vdGVzOiBwcm9jZXNzRm9vdG5vdGVzLFxyXG4gICAgICAgIHNob3dGb290bm90ZTogc2hvd0Zvb3Rub3RlXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIHZtLmZvb3Rub3Rlc0J5VHlwZSA9IHByb2Nlc3NGb290bm90ZXModm0uZm9vdG5vdGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwcm9jZXNzRm9vdG5vdGVzKGZvb3Rub3Rlcykge1xyXG4gICAgICAgIGlmICghZm9vdG5vdGVzIHx8IGZvb3Rub3Rlcy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIHZhciBmb290bm90ZXNCeVR5cGUgPSBfLnJlZHVjZShmb290bm90ZXMsIGZ1bmN0aW9uIChhY2N1bXVsYXRvciwgZm9vdG5vdGUpIHtcclxuICAgICAgICAgICAgaWYgKGFjY3VtdWxhdG9yW2Zvb3Rub3RlLnR5cGVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yW2Zvb3Rub3RlLnR5cGVdID0gW2Zvb3Rub3RlLmNvZGVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWNjdW11bGF0b3JbZm9vdG5vdGUudHlwZV0ucHVzaChmb290bm90ZS5jb2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XHJcbiAgICAgICAgfSwgW10pO1xyXG5cclxuICAgICAgICBmb290bm90ZXNCeVR5cGUgPSBfLm1hcFZhbHVlcyhmb290bm90ZXNCeVR5cGUsIGZ1bmN0aW9uKGNvZGVzLCB0eXBlKSB7XHJcbiAgICAgICAgICAgIGlmIChjb2RlcyAmJiBjb2Rlcy5sZW5ndGggPj0gNSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjb2Rlcy5sZW5ndGggKyAoY29tbW9uLmxhbmd1YWdlLmdldCgpID09PSAnbmwnID8gJyB2b2V0bm90ZW4nIDogJyBmb290bm90ZXMnKV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvZGVzO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZm9vdG5vdGVzQnlUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dGb290bm90ZShmb290bm90ZSwgZm9vdG5vdGVzKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbW1vbi4kcS5hbGwoXy5tYXAoZm9vdG5vdGVzLCBmdW5jdGlvbihmbikge1xyXG4gICAgICAgICAgICBpZiAoZm4udHlwZSA9PT0gXCJUU1wiIHx8IGZuLm9yaWdpbiA9PT0gJ0lUJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmbi5vcmlnaW4gPT09ICdERScpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlenREYXRhU2VydmljZS5sb2FkRXp0Rm9vdG5vdGUoZm4udHlwZSwgZm4uY29kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9vdG5vdGVEYXRhLmdldEZvb3Rub3RlKGZuLnR5cGUsIGZuLmNvZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGZvb3Rub3Rlc1dpdGhEZXRhaWxzKSB7XHJcbiAgICAgICAgICAgICAgICBmb290bm90ZU1vZGFscy5mb290bm90ZS5zaG93KGZvb3Rub3RlLCBmb290bm90ZXNXaXRoRGV0YWlscyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogZm9vdG5vdGVPdmVydmlld0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2Zvb3Rub3Rlcy9jb21wb25lbnRzL2Zvb3Rub3RlLW92ZXJ2aWV3LXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbmZvb3Rub3RlT3ZlcnZpZXdDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyR0aW1lb3V0JyxcclxuICAgICdub3RpZmljYXRpb25zU2VydmljZScsIFxyXG4gICAgJ2Zvb3Rub3RlRGF0YVNlcnZpY2UnLCBcclxuICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZSdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGZvb3Rub3RlT3ZlcnZpZXdDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcyxcclxuICAgICR0aW1lb3V0LCBcclxuICAgIG5vdGlmaWNhdGlvbnMsIFxyXG4gICAgZm9vdG5vdGVEYXRhLCBcclxuICAgIHN0YXRlXHJcbikge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICBmaWx0ZXI6IFwiXCIsXHJcbiAgICAgICAgZmlsdGVyVHlwZTogXCJcIixcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGlzTG9hZGluZ1R5cGVzOiBmYWxzZSxcclxuICAgICAgICBmb290bm90ZXM6IFtdLFxyXG4gICAgICAgIGZpbHRlcmVkRm9vdG5vdGVzOiBbXSxcclxuICAgICAgICBmb290bm90ZVR5cGVzOiBbXSxcclxuICAgICAgICBmaWx0ZXJlZEZvb3Rub3RlVHlwZXM6IFtdLFxyXG4gICAgICAgIHNlbGVjdGVkVHlwZTogbnVsbCxcclxuICAgICAgICByZWZlcmVuY2VDb3VudHJ5OiBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSxcclxuICAgICAgICBsb2FkRm9vdG5vdGU6IGxvYWRGb290bm90ZXMsXHJcbiAgICAgICAgY2xlYXJGaWx0ZXI6IGNsZWFyRmlsdGVyLFxyXG4gICAgICAgIGNoYW5nZUZpbHRlcjogY2hhbmdlRmlsdGVyLFxyXG4gICAgICAgIGNsZWFyRmlsdGVyVHlwZTogY2xlYXJGaWx0ZXJUeXBlLFxyXG4gICAgICAgIGNoYW5nZUZpbHRlclR5cGU6IGNoYW5nZUZpbHRlclR5cGUsXHJcbiAgICAgICAgZm9jdXNJbnB1dFR5cGVGaWVsZDogZm9jdXNJbnB1dFR5cGVGaWVsZCxcclxuICAgICAgICBmb2N1c0lucHV0RmllbGQ6IGZvY3VzSW5wdXRGaWVsZFxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gZm9jdXNJbnB1dFR5cGVGaWVsZCgpIHtcclxuICAgICAgICAkdGltZW91dChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICB2YXIgaW5wdXRFTCA9IGFuZ3VsYXIuZWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaW5wdXRGaWx0ZXJUeXBlJykpO1xyXG4gICAgICAgICAgICBpZiAoaW5wdXRFTCkge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRFTFswXS5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZm9jdXNJbnB1dEZpZWxkKCkge1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHZhciBpbnB1dEVMID0gYW5ndWxhci5lbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbnB1dEZpbHRlcicpKTtcclxuICAgICAgICAgICAgaWYgKGlucHV0RUwpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0RUxbMF0uZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvcmVmZXJlbmNlL2Zvb3Rub3RlcycpO1xyXG4gICAgICAgIGxvYWRUeXBlcygpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMudW5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBkYXRlQ2hhbmdlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGF0ZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgbG9hZFR5cGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJGaWx0ZXIoKSB7XHJcbiAgICAgICAgdm0uZmlsdGVyID0gJyc7XHJcbiAgICAgICAgdm0uZmlsdGVyZWRGb290bm90ZXMgPSB2bS5mb290bm90ZXM7XHJcbiAgICAgICAgZm9jdXNJbnB1dEZpZWxkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2hhbmdlRmlsdGVyKCkge1xyXG4gICAgICAgIHZtLmZpbHRlcmVkRm9vdG5vdGVzID0gdm0uZm9vdG5vdGVzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChlbC50eXBlLnRvTG93ZXJDYXNlKCkgKyBlbC5jb2RlLnRvTG93ZXJDYXNlKCkpLmluY2x1ZGVzKHZtLmZpbHRlci50b0xvd2VyQ2FzZSgpKSB8fCBcclxuICAgICAgICAgICAgICAgIGVsLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModm0uZmlsdGVyLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyRmlsdGVyVHlwZSgpIHtcclxuICAgICAgICBjbGVhckZpbHRlcigpO1xyXG4gICAgICAgIHZtLmZpbHRlclR5cGUgPSBcIlwiO1xyXG4gICAgICAgIHZtLmZpbHRlcmVkRm9vdG5vdGVUeXBlcyA9IHZtLmZvb3Rub3RlVHlwZXM7XHJcbiAgICAgICAgdm0uZm9vdG5vdGVzID0gW107XHJcbiAgICAgICAgdm0uZmlsdGVyZWRGb290bm90ZXMgPSBbXTtcclxuICAgICAgICB2bS5zZWxlY3RlZFR5cGUgPSBudWxsO1xyXG4gICAgICAgIGZvY3VzSW5wdXRUeXBlRmllbGQoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VGaWx0ZXJUeXBlKCkge1xyXG4gICAgICAgIHZtLmZpbHRlcmVkRm9vdG5vdGVUeXBlcyA9IHZtLmZvb3Rub3RlVHlwZXMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWwuY29kZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHZtLmZpbHRlclR5cGUudG9Mb3dlckNhc2UoKSkgfHwgZWwuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2bS5maWx0ZXJUeXBlLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmKHZtLmZpbHRlcmVkRm9vdG5vdGVUeXBlcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgbG9hZEZvb3Rub3Rlcyh2bS5maWx0ZXJlZEZvb3Rub3RlVHlwZXNbMF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih2bS5maWx0ZXJlZEZvb3Rub3RlVHlwZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHZtLmZvb3Rub3RlcyA9IFtdO1xyXG4gICAgICAgICAgICB2bS5maWx0ZXJlZEZvb3Rub3RlcyA9IFtdO1xyXG4gICAgICAgICAgICB2bS5zZWxlY3RlZFR5cGUgPSBudWxsO1xyXG4gICAgICAgICAgICB2bS5maWx0ZXIgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZEZvb3Rub3Rlcyh0eXBlKSB7XHJcbiAgICAgICAgaWYgKHZtLnJlZmVyZW5jZUNvdW50cnkgPT09ICdDSCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHZtLnNlbGVjdGVkVHlwZSA9IHR5cGUuY29kZTtcclxuICAgICAgICB2bS5maWx0ZXIgPSBcIlwiO1xyXG4gICAgICAgIGZvb3Rub3RlRGF0YS5nZXRGb290bm90ZXModHlwZS5jb2RlKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdm0uZmlsdGVyZWRGb290bm90ZXMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgdm0uZm9vdG5vdGVzID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9jdXNJbnB1dEZpZWxkKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRUeXBlcygpIHtcclxuICAgICAgICBpZiAodm0ucmVmZXJlbmNlQ291bnRyeSA9PT0gJ0NIJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZtLmlzTG9hZGluZ1R5cGVzID0gdHJ1ZTtcclxuICAgICAgICB2bS5mb290bm90ZXMgPSBbXTtcclxuICAgICAgICB2bS5maWx0ZXJlZEZvb3Rub3RlVHlwZXMgPSBbXTtcclxuICAgICAgICB2bS5maWx0ZXIgPSBcIlwiO1xyXG4gICAgICAgIHZtLmZpbHRlclR5cGUgPSBcIlwiO1xyXG4gICAgICAgIHZtLnNlbGVjdGVkVHlwZSA9IG51bGw7XHJcbiAgICAgICAgZm9vdG5vdGVEYXRhLmdldFR5cGVzKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZtLmZvb3Rub3RlVHlwZXMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgdm0uZmlsdGVyZWRGb290bm90ZVR5cGVzID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZ1R5cGVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb2N1c0lucHV0VHlwZUZpZWxkKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJyRhbmFseXRpY3MnLCAnJHVpYk1vZGFsJywgZm9vdG5vdGVNb2RhbF07XHJcblxyXG5mdW5jdGlvbiBmb290bm90ZU1vZGFsKCRhbmFseXRpY3MsICR1aWJNb2RhbCkge1xyXG4gICAgdmFyIG1vZGFsID0ge1xyXG4gICAgICAgIGZvb3Rub3RlczogW10sXHJcbiAgICAgICAgc2hvdzogc2hvd01vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIGZvb3Rub3RlTW9kYWxDb250cm9sbGVyLiRpbmplY3QgPSBbJyR1aWJNb2RhbEluc3RhbmNlJywgJ2Zvb3Rub3RlJywgJ2Zvb3Rub3RlcyddO1xyXG5cclxuICAgIGZ1bmN0aW9uIGZvb3Rub3RlTW9kYWxDb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlLCBmb290bm90ZSwgZm9vdG5vdGVzKSB7XHJcblxyXG4gICAgICAgIHZhciBjdHJsRm9vdG5vdGVNb2RhbCA9IHtcclxuICAgICAgICAgICAgY2FuY2VsOiBjYW5jZWwsXHJcbiAgICAgICAgICAgIGZvb3Rub3RlOiBmb290bm90ZSxcclxuICAgICAgICAgICAgZm9vdG5vdGVzOiBmb290bm90ZXNcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbi8vICAgICAgICAgICAgJChcIi5wYWdlLWRhc2hib2FyZCwgLnRhcmljLXBhZ2UtY29udGVudFwiKS5yZW1vdmVDbGFzcyhcIm5vcHJpbnRcIik7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN0cmxGb290bm90ZU1vZGFsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChmb290bm90ZSwgZm9vdG5vdGVzKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdvcGVuLW1vZGFsLWZvb3Rub3RlcycsIHsgY2F0ZWdvcnk6ICdmb290bm90ZXMnIH0pO1xyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IGZvb3Rub3RlTW9kYWxDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsRm9vdG5vdGVNb2RhbCcsXHJcbiAgICAgICAgICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgIGZvb3Rub3RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvb3Rub3RlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGZvb3Rub3RlczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb290bm90ZXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNpemU6ICdsZycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnZm9vdG5vdGVzL21vZGFscy9mb290bm90ZS5odG1sJyxcclxuICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdtb2RhbC1mb290bm90ZSdcclxuICAgICAgICB9KS5yZXN1bHQuY2F0Y2goZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFsnZm9vdG5vdGVNb2RhbCcsIGZvb3Rub3RlTW9kYWxzU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBmb290bm90ZU1vZGFsc1NlcnZpY2UoZm9vdG5vdGVNb2RhbCkge1xyXG5cclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGZvb3Rub3RlOiBmb290bm90ZU1vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0gWydjb21tb24nLCAnZGF0YUNvbnRleHQnLCAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCBmb290bm90ZURhdGFTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIGZvb3Rub3RlRGF0YVNlcnZpY2UoY29tbW9uLCBjb250ZXh0LCBzdGF0ZSkge1xyXG5cclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGdldEZvb3Rub3RlOiBnZXRGb290bm90ZSxcclxuICAgICAgICBnZXRGb290bm90ZXM6IGdldEZvb3Rub3RlcyxcclxuICAgICAgICBnZXRUeXBlczogZ2V0VHlwZXNcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Rm9vdG5vdGUoZm9vdG5vdGVUeXBlLCBmb290bm90ZUNvZGUpIHtcclxuXHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvZm9vdG5vdGVzLycgKyBmb290bm90ZVR5cGUgKyAnLycgKyBmb290bm90ZUNvZGUgK1xyXG4gICAgICAgICAgICAnP2xhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICcmcmVmZXJlbmNlY291bnRyeT0nICsgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG5cclxuICAgICAgICByZXR1cm4gY29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRGb290bm90ZXMoZm9vdG5vdGVUeXBlKSB7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL2Zvb3Rub3RlcycgK1xyXG4gICAgICAgICAgICAnP3R5cGU9JyArIGZvb3Rub3RlVHlwZSArXHJcbiAgICAgICAgICAgICcmbGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZyZWZlcmVuY2Vjb3VudHJ5PScgKyBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcblxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFR5cGVzKCkge1xyXG5cclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0c1tjb21tb24uY29uZmlnLmN1cnJlbnRBcGldICsgJy9mb290bm90ZXMvdHlwZXMnICtcclxuICAgICAgICAgICAgJz9vcmlnaW49RVUsJyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZsYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG59XHJcbiIsIu+7v2FuZ3VsYXIubW9kdWxlKCd0YXJpYy5nZW9ncmFwaHknLCBbXSlcclxuICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIC5jb21wb25lbnQoJ3JlZ2lvbk92ZXJ2aWV3UGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9yZWdpb24tb3ZlcnZpZXctcGFnZScpKVxyXG4gICAgLmNvbXBvbmVudCgnY291bnRyeVBpY2tlcicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jb3VudHJ5LXBpY2tlcicpKVxyXG4gICAgLmNvbXBvbmVudCgncmVnaW9uRGlzcGxheScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9yZWdpb24tZGlzcGxheScpKVxyXG4gICAgLmZhY3RvcnkoJ2NvdW50cnlEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvY291bnRyeS1kYXRhJykpXHJcbiAgICAuZmFjdG9yeSgnY291bnRyeU1vZGFscycsIHJlcXVpcmUoJy4vbW9kYWxzL21vZGFscycpKVxyXG4gICAgLmZhY3RvcnkoJ3JlZ2lvbkRhdGFTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy9yZWdpb24tZGF0YScpKVxyXG4gICAgLmZhY3RvcnkoJ3JlZ2lvbk1vZGFsJywgcmVxdWlyZSgnLi9tb2RhbHMvcmVnaW9uJykpXHJcbiAgICA7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL3JlZ2lvbnMnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHJlZ2lvbi1vdmVydmlldy1wYWdlPjwvcmVnaW9uLW92ZXJ2aWV3LXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgO1xyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7ICBcclxuICAgIGJpbmRpbmdzOiB7IFxyXG4gICAgICAgIGF1dG9Gb2N1czogJzwnLFxyXG4gICAgICAgIGNvdW50cnlDb2RlOiAnPCcsXHJcbiAgICAgICAgcG9zc2libGVDb3VudHJpZXM6ICc8JyxcclxuICAgICAgICByZW1lbWJlckNvdW50cnk6ICc8JyxcclxuICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAnJicsXHJcbiAgICAgICAgc2hvd1JlbWVtYmVyQ291bnRyeVRvZ2dsZTogJzwnLCBcclxuICAgICAgICB2YWxpZGF0aW9uOiAnPCcgXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogY291bnRyeVBpY2tlckNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2dlb2dyYXBoeS9jb21wb25lbnRzL2NvdW50cnktcGlja2VyLmh0bWwnXHJcbn07XHJcblxyXG5jb3VudHJ5UGlja2VyQ29udHJvbGxlci4kaW5qZWN0ID0gWyckZWxlbWVudCcsICckdGltZW91dCddO1xyXG5cclxuZnVuY3Rpb24gY291bnRyeVBpY2tlckNvbnRyb2xsZXIoJGVsZW1lbnQsICR0aW1lb3V0KSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJHBvc3RMaW5rOiBwb3N0TGluayxcclxuICAgICAgICBjbGVhcjogY2xlYXIsXHJcbiAgICAgICAgY291bnRyeTogbnVsbCxcclxuICAgICAgICBpdGVtU2VsZWN0ZWQ6IGl0ZW1TZWxlY3RlZCxcclxuICAgICAgICBvbkJsdXI6IG9uQmx1cixcclxuICAgICAgICBvbkVudGVyOiBvbkVudGVyLFxyXG4gICAgICAgIHRvZ2dsZVJlbWVtYmVyQ291bnRyeTogdG9nZ2xlUmVtZW1iZXJDb3VudHJ5XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICBpZiAodm0uY291bnRyeUNvZGUpIHtcclxuICAgICAgICAgICAgdm0uY291bnRyeSA9IF8uZmluZCggdm0ucG9zc2libGVDb3VudHJpZXMsIGZ1bmN0aW9uKGNvdW50cnkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHJ5LmNvZGUgPT09IHZtLmNvdW50cnlDb2RlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcG9zdExpbmsoKSB7XHJcbiAgICAgICAgaWYgKHZtLmF1dG9Gb2N1cykge1xyXG4gICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHJvb3RFbCA9ICRlbGVtZW50WzBdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGlucHV0RWwgPSByb290RWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnanMtYXV0b2ZvY3VzJylbMF07XHJcbiAgICAgICAgICAgICAgICBpbnB1dEVsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhcigpIHtcclxuICAgICAgICB2bS5jb3VudHJ5ID0gbnVsbDtcclxuICAgICAgICBjbGVhclNlbGVjdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKCkge1xyXG4gICAgICAgIGlmICh2bS5zZWxlY3Rpb25DaGFuZ2VkKVxyXG4gICAgICAgICAgICB2bS5zZWxlY3Rpb25DaGFuZ2VkKHsgY291bnRyeTogbnVsbCwgcmVtZW1iZXJDb3VudHJ5OiB2bS5yZW1lbWJlckNvdW50cnkgfSk7ICAgICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25CbHVyKCkge1xyXG4gICAgICAgIGlmICghdm0uY291bnRyeSkge1xyXG4gICAgICAgICAgICBjbGVhclNlbGVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkVudGVyKCkge1xyXG4gICAgICAgIGlmICghdm0uY291bnRyeSkge1xyXG4gICAgICAgICAgICBjbGVhclNlbGVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpdGVtU2VsZWN0ZWQoaXRlbSwgbW9kZWwpIHtcclxuICAgICAgICBpZiAodm0uc2VsZWN0aW9uQ2hhbmdlZClcclxuICAgICAgICAgICAgdm0uc2VsZWN0aW9uQ2hhbmdlZCh7IGNvdW50cnk6IGl0ZW0sIHJlbWVtYmVyQ291bnRyeTogdm0ucmVtZW1iZXJDb3VudHJ5IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRvZ2dsZVJlbWVtYmVyQ291bnRyeSgpIHtcclxuICAgICAgICB2bS5yZW1lbWJlckNvdW50cnkgPSAhdm0ucmVtZW1iZXJDb3VudHJ5O1xyXG4gICAgICAgIGlmICh2bS5zZWxlY3Rpb25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdGlvbkNoYW5nZWQoeyBjb3VudHJ5OiB2bS5jb3VudHJ5LCByZW1lbWJlckNvdW50cnk6IHZtLnJlbWVtYmVyQ291bnRyeSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczogeyBcclxuICAgICAgICByZWdpb246ICc8JyBcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiByZWdpb25EaXNwbGF5Q29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnZ2VvZ3JhcGh5L2NvbXBvbmVudHMvcmVnaW9uLWRpc3BsYXkuaHRtbCdcclxufTtcclxuXHJcbnJlZ2lvbkRpc3BsYXlDb250cm9sbGVyLiRpbmplY3QgPSBbJ2NvdW50cnlNb2RhbHMnXTtcclxuXHJcbmZ1bmN0aW9uIHJlZ2lvbkRpc3BsYXlDb250cm9sbGVyKGNvdW50cnlNb2RhbHMpIHtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNob3dSZWdpb246IGZ1bmN0aW9uIChyZWdpb24pIHtcclxuICAgICAgICAgICAgY291bnRyeU1vZGFscy5yZWdpb24uc2hvdyhyZWdpb24pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogcmVnaW9uT3ZlcnZpZXdDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdnZW9ncmFwaHkvY29tcG9uZW50cy9yZWdpb24tb3ZlcnZpZXctcGFnZS5odG1sJ1xyXG59O1xyXG5cclxucmVnaW9uT3ZlcnZpZXdDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyR0aW1lb3V0JyxcclxuICAgICdub3RpZmljYXRpb25zU2VydmljZScsIFxyXG4gICAgJ3JlZ2lvbkRhdGFTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHJlZ2lvbk92ZXJ2aWV3Q29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsXHJcbiAgICAkdGltZW91dCwgXHJcbiAgICBub3RpZmljYXRpb25zLCBcclxuICAgIHJlZ2lvbkRhdGFcclxuKSB7XHJcbiAgICBcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICByZWdpb25GaWx0ZXI6ICcnLFxyXG4gICAgICAgIGNvdW50cnlGaWx0ZXI6ICcnLFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgaXNMb2FkaW5nUmVnaW9uOiBmYWxzZSxcclxuICAgICAgICBjb3VudHJpZXM6IFtdLFxyXG4gICAgICAgIHJlZ2lvbnM6IFtdLFxyXG4gICAgICAgIGZpbHRlcmVkQ291bnRyaWVzOiBbXSxcclxuICAgICAgICBmaWx0ZXJlZFJlZ2lvbnM6IFtdLFxyXG4gICAgICAgIHNlbGVjdGVkUmVnaW9uOiBudWxsLFxyXG4gICAgICAgIGxvYWRSZWdpb246IGxvYWRSZWdpb24sXHJcbiAgICAgICAgY2xlYXJSZWdpb25GaWx0ZXI6IGNsZWFyUmVnaW9uRmlsdGVyLFxyXG4gICAgICAgIGNoYW5nZVJlZ2lvbkZpbHRlcjogY2hhbmdlUmVnaW9uRmlsdGVyLFxyXG4gICAgICAgIGNsZWFyQ291bnRyeUZpbHRlcjogY2xlYXJDb3VudHJ5RmlsdGVyLFxyXG4gICAgICAgIGNoYW5nZUNvdW50cnlGaWx0ZXI6IGNoYW5nZUNvdW50cnlGaWx0ZXIsXHJcbiAgICAgICAgZm9jdXNSZWdpb25GaWx0ZXI6IGZvY3VzUmVnaW9uRmlsdGVyLFxyXG4gICAgICAgIGZvY3VzQ291bnRyeUZpbHRlcjogZm9jdXNDb3VudHJ5RmlsdGVyLFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL3JlZmVyZW5jZS9nZW9ncmFwaGljYWwtYXJlYXMnKTtcclxuICAgICAgICBsb2FkUmVnaW9ucygpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgbG9hZFJlZ2lvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMudW5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBsb2FkUmVnaW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJSZWdpb25GaWx0ZXIoKSB7XHJcbiAgICAgICAgY2xlYXJDb3VudHJ5RmlsdGVyKClcclxuICAgICAgICB2bS5yZWdpb25GaWx0ZXIgPSAnJztcclxuICAgICAgICB2bS5maWx0ZXJlZFJlZ2lvbnMgPSB2bS5yZWdpb25zO1xyXG4gICAgICAgIHZtLmNvdW50cmllcyA9IFtdO1xyXG4gICAgICAgIHZtLmZpbHRlcmVkQ291bnRyaWVzID0gW107XHJcbiAgICAgICAgZm9jdXNSZWdpb25GaWx0ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VSZWdpb25GaWx0ZXIoKSB7XHJcbiAgICAgICAgdm0uZmlsdGVyZWRSZWdpb25zID0gdm0ucmVnaW9ucy5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbC5jb2RlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModm0ucmVnaW9uRmlsdGVyLnRvTG93ZXJDYXNlKCkpIHx8IGVsLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2bS5yZWdpb25GaWx0ZXIudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYodm0uZmlsdGVyZWRSZWdpb25zLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBsb2FkUmVnaW9uKHZtLmZpbHRlcmVkUmVnaW9uc1swXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHZtLmZpbHRlcmVkUmVnaW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdm0uc2VsZWN0ZWRSZWdpb24gPSBudWxsO1xyXG4gICAgICAgICAgICB2bS5jb3VudHJpZXMgPSBbXTtcclxuICAgICAgICAgICAgdm0uZmlsdGVyZWRDb3VudHJpZXMgPSBbXTtcclxuICAgICAgICAgICAgdm0uY291bnRyeUZpbHRlciA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyQ291bnRyeUZpbHRlcigpIHtcclxuICAgICAgICB2bS5jb3VudHJ5RmlsdGVyID0gJyc7XHJcbiAgICAgICAgdm0uZmlsdGVyZWRDb3VudHJpZXMgPSB2bS5jb3VudHJpZXM7XHJcbiAgICAgICAgZm9jdXNDb3VudHJ5RmlsdGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2hhbmdlQ291bnRyeUZpbHRlcigpIHtcclxuICAgICAgICB2bS5maWx0ZXJlZENvdW50cmllcyA9IHZtLmNvdW50cmllcy5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbC5jb2RlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModm0uY291bnRyeUZpbHRlci50b0xvd2VyQ2FzZSgpKSB8fCBlbC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModm0uY291bnRyeUZpbHRlci50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkUmVnaW9ucygpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHZtLmNvdW50cmllcyA9IFtdO1xyXG4gICAgICAgIHZtLnNlbGVjdGVkUmVnaW9uID0gbnVsbDtcclxuICAgICAgICB2bS5yZWdpb25GaWx0ZXIgPSAnJztcclxuICAgICAgICByZWdpb25EYXRhLmdldCgpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5maWx0ZXJlZFJlZ2lvbnMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgdm0ucmVnaW9ucyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvY3VzUmVnaW9uRmlsdGVyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRSZWdpb24ocmVnaW9uKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nUmVnaW9uID0gdHJ1ZTtcclxuICAgICAgICB2bS5zZWxlY3RlZFJlZ2lvbiA9IHJlZ2lvbi5jb2RlO1xyXG4gICAgICAgIHZtLmNvdW50cnlGaWx0ZXIgPSBcIlwiO1xyXG4gICAgICAgIHJlZ2lvbkRhdGEuZ2V0QnlDb2RlKHJlZ2lvbi5jb2RlKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdm0uZmlsdGVyZWRDb3VudHJpZXMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgdm0uY291bnRyaWVzID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZ1JlZ2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9jdXNDb3VudHJ5RmlsdGVyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZvY3VzUmVnaW9uRmlsdGVyKCkge1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucmVnaW9uLWZpbHRlcicpLmZvY3VzKCk7XHJcbiAgICAgICAgfSwwKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmb2N1c0NvdW50cnlGaWx0ZXIoKSB7XHJcbiAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb3VudHJ5LWZpbHRlcicpLmZvY3VzKCk7XHJcbiAgICAgICAgfSwwKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJ3JlZ2lvbk1vZGFsJywgY291bnRyeU1vZGFsc1NlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gY291bnRyeU1vZGFsc1NlcnZpY2UocmVnaW9uTW9kYWwpIHtcclxuXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICByZWdpb246IHJlZ2lvbk1vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFsnJGFuYWx5dGljcycsICckdWliTW9kYWwnLCByZWdpb25Nb2RhbF07XHJcblxyXG5mdW5jdGlvbiByZWdpb25Nb2RhbCgkYW5hbHl0aWNzLCAkdWliTW9kYWwpIHtcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICByZWdpb246IG51bGwsXHJcbiAgICAgICAgc2hvdzogc2hvd01vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIHJlZ2lvbk1vZGFsQ29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICdjb3VudHJ5RGF0YVNlcnZpY2UnLCAncmVnaW9uJ107XHJcblxyXG4gICAgZnVuY3Rpb24gcmVnaW9uTW9kYWxDb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlLCBjb3VudHJ5RGF0YVNlcnZpY2UsIHJlZ2lvbikge1xyXG4gICAgICAgIHZhciB2bSA9IHtcclxuICAgICAgICAgICAgY2FuY2VsOiBjYW5jZWwsXHJcbiAgICAgICAgICAgIGNvdW50cmllczogW10sXHJcbiAgICAgICAgICAgIHJlZ2lvbjogcmVnaW9uLFxyXG4gICAgICAgICAgICBzZWFyY2hQYXJhbWV0ZXI6ICcnXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdjYW5jZWwnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjb3VudHJ5Q29kZXMgPSBjb3VudHJ5RGF0YVNlcnZpY2UucmVnaW9uc1tyZWdpb24uY29kZV07XHJcbiAgICAgICAgdm0uY291bnRyaWVzID0gXy5tYXAoY291bnRyeUNvZGVzLCBmdW5jdGlvbihjb3VudHJ5Q29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgY29kZTogY291bnRyeUNvZGUsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBjb3VudHJ5RGF0YVNlcnZpY2UuY291bnRyaWVzW2NvdW50cnlDb2RlXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2bS5jb3VudHJpZXMgPSB2bS5jb3VudHJpZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICBpZiAoYS5uYW1lID4gYi5uYW1lKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGEubmFtZSA8IGIubmFtZSlcclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB2bTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TW9kYWwocmVnaW9uKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdvcGVuLW1vZGFsLXJlZ2lvbi1tZW1iZXJzJywgeyBjYXRlZ29yeTogJ2dlb2dyYXBoeScgfSk7XHJcbiAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IHJlZ2lvbk1vZGFsQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAnY3RybFJlZ2lvbk1vZGFsJyxcclxuICAgICAgICAgICAga2V5Ym9hcmQ6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGFsRmFkZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgcmVnaW9uOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2l6ZTogJ2xnJyxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdnZW9ncmFwaHkvbW9kYWxzL3JlZ2lvbi5odG1sJyxcclxuICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdtb2RhbC1yZWdpb24nXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG1vZGFsSW5zdGFuY2UucmVuZGVyZWQudGhlbihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnRUb0ZvY3VzT25Jbk1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1vZGFsLmluIC5mb2N1cy1vbi1vcGVuLW1vZGFsJyk7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50VG9Gb2N1c09uSW5Nb2RhbCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudFRvRm9jdXNPbkluTW9kYWwuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQuY2F0Y2goZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFsnY29tbW9uJywgJ2RhdGFDb250ZXh0JywgJyRxJywgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJywgY291bnRyeURhdGFTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIGNvdW50cnlEYXRhU2VydmljZShjb21tb24sIGNvbnRleHQsICRxLCBzdGF0ZSwgbm90aWZpY2F0aW9ucykge1xyXG5cclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGNvdW50cmllczogbnVsbCxcclxuICAgICAgICBlcmdhT21uZXNDb3VudHJpZXM6IG51bGwsXHJcbiAgICAgICAgcmVnaW9uczogbnVsbCwgLy8gbGlzdCBvZiBjb3VudHJ5IGNvZGVzIHBlciByZWdpb25cclxuICAgICAgICBnZXRDb3VudHJ5OiBnZXRDb3VudHJ5LFxyXG4gICAgICAgIGdldENvdW50cmllczogZ2V0Q291bnRyaWVzLFxyXG4gICAgICAgIHByZWxvYWRDb3VudHJpZXM6IHByZWxvYWRDb3VudHJpZXMsXHJcbiAgICAgICAgZ2V0RXVDb3VudHJpZXM6IGdldEV1Q291bnRyaWVzLFxyXG4gICAgICAgIHByZWxvYWRSZWdpb25zOiBwcmVsb2FkUmVnaW9ucyxcclxuICAgICAgICBpbml0OiBpbml0XHJcbiAgICB9O1xyXG5cclxuICAgIG5vdGlmaWNhdGlvbnMuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgaW5pdCk7XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG4gICAgZnVuY3Rpb24gaW5pdCgpIHtcclxuICAgICAgICByZXR1cm4gJHEuYWxsKFsgcHJlbG9hZENvdW50cmllcygpLCBwcmVsb2FkUmVnaW9ucygpIF0pXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluaXRFcmdhT21uZXNDb3VudHJpZXMoKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRFcmdhT21uZXNSZWdpb25Db2RlKCkge1xyXG4gICAgICAgIGlmIChzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9PSAnQ0gnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnMjAwMDAwJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcxMDExJztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpbml0RXJnYU9tbmVzQ291bnRyaWVzKCkge1xyXG4gICAgICAgIHZhciBlcmdhT21uZXNSZWdpb25Db2RlID0gZ2V0RXJnYU9tbmVzUmVnaW9uQ29kZSgpO1xyXG4gICAgICAgIHNlcnZpY2UuZXJnYU9tbmVzQ291bnRyaWVzID0gXy5jaGFpbihzZXJ2aWNlLnJlZ2lvbnNbZXJnYU9tbmVzUmVnaW9uQ29kZV0pXHJcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24oY291bnRyeUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29kZTogY291bnRyeUNvZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogc2VydmljZS5jb3VudHJpZXNbY291bnRyeUNvZGVdLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaERpc3BsYXk6IGNvdW50cnlDb2RlICsgJyDigJQgJyArIHNlcnZpY2UuY291bnRyaWVzW2NvdW50cnlDb2RlXVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uKGNvdW50cnkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHJ5Lm5hbWUgIT09IHVuZGVmaW5lZCAmJiAoY291bnRyeS5jb2RlID09PSAnRVUnIHx8IGNvdW50cnkuY29kZSAhPT0gc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkpO1xyXG4gICAgICAgICAgICB9KS5zb3J0QnkoZnVuY3Rpb24oY291bnRyeSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50cnkubmFtZTtcclxuICAgICAgICAgICAgfSkudmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRDb3VudHJ5KGNvdW50cnlDb2RlKSB7XHJcbiAgICAgICAgaWYgKGNvdW50cnlDb2RlID09PSBudWxsIHx8IGNvdW50cnlDb2RlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybiBjb3VudHJ5Q29kZTtcclxuICAgICAgICBpZiAoc2VydmljZS5jb3VudHJpZXMgPT09IG51bGwpXHJcbiAgICAgICAgICAgIHNlcnZpY2UucHJlbG9hZENvdW50cmllcygpO1xyXG4gICAgICAgIHJldHVybiBzZXJ2aWNlLmNvdW50cmllc1tjb3VudHJ5Q29kZV07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0RXVDb3VudHJpZXMocSkge1xyXG4gICAgICAgIGlmIChzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9PSAnQ0gnKSB7XHJcbiAgICAgICAgICAgIHEucmVnaW9uQ29kZSA9ICcxMDAwMDEnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcS5yZWdpb25Db2RlID0gJzEwMTAnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZ2V0Q291bnRyaWVzKHEpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldENvdW50cmllcyhxKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvY291bnRyaWVzJyArXHJcbiAgICAgICAgICAgICc/cmVmZXJlbmNlQ291bnRyeT0nICsgcS5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZsYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG4gICAgICAgIGlmIChxLnJlZ2lvbkNvZGUpIHtcclxuICAgICAgICAgICAgdXJsICs9ICcmcmVnaW9uPScgKyBxLnJlZ2lvbkNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHByZWxvYWRDb3VudHJpZXMocmVnaW9uQ29kZSkge1xyXG4gICAgICAgIHZhciBxQ291bnRyaWVzTG9hZGVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL2NvdW50cmllcycgK1xyXG4gICAgICAgICAgICAnP3JlZmVyZW5jZUNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZsYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG4gICAgICAgIGlmIChyZWdpb25Db2RlKSB7XHJcbiAgICAgICAgICAgIHVybCArPSAnJnJlZ2lvbj0nICsgcmVnaW9uQ29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29udGV4dC5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHNlcnZpY2UuY291bnRyaWVzID0ge307XHJcbiAgICAgICAgICAgIF8uZm9yRWFjaChkYXRhLCBmdW5jdGlvbiAoY291bnRyeSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZXJ2aWNlLmNvdW50cmllc1tjb3VudHJ5LmNvZGVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZS5jb3VudHJpZXNbY291bnRyeS5jb2RlXSA9IGNvdW50cnkubmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHFDb3VudHJpZXNMb2FkZWQucmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcUNvdW50cmllc0xvYWRlZC5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHByZWxvYWRSZWdpb25zKCkge1xyXG4gICAgICAgIHZhciBxUmVnaW9uc0xvYWRlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG5cclxuICAgICAgICAvLyBUT0RPOiB1cGRhdGUgdGhpcyB0byBiZSByZWFkeSBmb3IgdGhlIHNpdHVhdGlvbiBhZnRlciBCcmV4aXQgc28gdGhlIFVLIHZlcnNpb24gZG9lc24ndCBhdXRvbWF0aWNhbGx5IGdldCBhbGwgRVUgcmVnaW9uc1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL3JlZ2lvbnMvbWVtYmVycycgK1xyXG4gICAgICAgICAgICAnP29yaWdpbj1FVSwnICsgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZUNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuICAgICAgICBjb250ZXh0LmdldCh1cmwpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgc2VydmljZS5yZWdpb25zID0ge307XHJcbiAgICAgICAgICAgIF8uZm9yRWFjaChkYXRhLCBmdW5jdGlvbiAocmVnaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlcnZpY2UucmVnaW9uc1tyZWdpb24uY29kZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnJlZ2lvbnNbcmVnaW9uLmNvZGVdID0gcmVnaW9uLmNvdW50cnlDb2RlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHFSZWdpb25zTG9hZGVkLnJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHFSZWdpb25zTG9hZGVkLnByb21pc2U7XHJcbiAgICB9XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJ2NvbW1vbicsICdkYXRhQ29udGV4dCcsICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIHJlZ2lvbkRhdGFTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIHJlZ2lvbkRhdGFTZXJ2aWNlKGNvbW1vbiwgY29udGV4dCwgc3RhdGUpIHtcclxuXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBnZXQ6IGdldCxcclxuICAgICAgICBnZXRCeUNvZGU6IGdldEJ5Q29kZVxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXQoKSB7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL3JlZ2lvbnMnICtcclxuICAgICAgICAgICAgJz9vcmlnaW49RVUsJyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZsYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0QnlDb2RlKGNvZGUpIHtcclxuXHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvY291bnRyaWVzJyArXHJcbiAgICAgICAgICAgICc/cmVnaW9uPScgKyBjb2RlICtcclxuICAgICAgICAgICAgJyZsYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcbn1cclxuIiwi77u/YW5ndWxhci5tb2R1bGUoJ3RhcmljLmdvb2QnLCBbXSlcclxuICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIFxyXG4gICAgLmNvbXBvbmVudCgnYW50aUR1bXBpbmdGaW5hbmNpYWxNZWFzdXJlcycsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9hbnRpLWR1bXBpbmctZmluYW5jaWFsLW1lYXN1cmVzJykpXHJcbiAgICAuY29tcG9uZW50KCdjdXN0b21zVmFsdWVDaGVja1Jlc3VsdCcsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jdXN0b21zLXZhbHVlLWNoZWNrLXJlc3VsdCcpKVxyXG4gICAgLmNvbXBvbmVudCgnZHV0eUNhbGN1bGF0aW9uUmVzdWx0JywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2R1dHktY2FsY3VsYXRpb24tcmVzdWx0JykpXHJcbiAgICAuY29tcG9uZW50KCdleHBvcnRNZWFzdXJlcycsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9leHBvcnQtbWVhc3VyZXMnKSlcclxuICAgIC5jb21wb25lbnQoJ2Zhdm9yaXRlQnV0dG9uJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2Zhdm9yaXRlLWJ1dHRvbicpKVxyXG4gICAgLmNvbXBvbmVudCgnZmluYW5jaWFsTWVhc3VyZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9maW5hbmNpYWwtbWVhc3VyZScpKVxyXG4gICAgLmNvbXBvbmVudCgnZ2VuZXJhbE1lYXN1cmUnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZ2VuZXJhbC1tZWFzdXJlJykpXHJcbiAgICAuY29tcG9uZW50KCdncm91cGVkRmluYW5jaWFsTWVhc3VyZXMnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZ3JvdXBlZC1maW5hbmNpYWwtbWVhc3VyZXMnKSlcclxuICAgIC5jb21wb25lbnQoJ2dyb3VwZWRHZW5lcmFsTWVhc3VyZXMnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZ3JvdXBlZC1nZW5lcmFsLW1lYXN1cmVzJykpXHJcbiAgICAuY29tcG9uZW50KCdncm91cGVkVmF0TWVhc3VyZXMnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZ3JvdXBlZC12YXQtbWVhc3VyZXMnKSlcclxuICAgIC5jb21wb25lbnQoJ2dlcm1hbkV4Y2lzZU1lYXN1cmVzJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2dlcm1hbi1leGNpc2UtbWVhc3VyZXMnKSlcclxuICAgIC5jb21wb25lbnQoJ2dlcm1hblZhdE1lYXN1cmVzJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2dlcm1hbi12YXQtbWVhc3VyZXMnKSlcclxuICAgIC5jb21wb25lbnQoJ2ltcG9ydE1lYXN1cmVzQ29sdW1uT25lJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2ltcG9ydC1tZWFzdXJlcy1jb2wtMScpKVxyXG4gICAgLmNvbXBvbmVudCgnaW1wb3J0TWVhc3VyZXNDb2x1bW5Ud28nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvaW1wb3J0LW1lYXN1cmVzLWNvbC0yJykpXHJcbiAgICAuY29tcG9uZW50KCdtZWFzdXJlQ29uZGl0aW9uQnV0dG9ucycsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9tZWFzdXJlLWNvbmRpdGlvbi1idXR0b25zJykpXHJcbiAgICAuY29tcG9uZW50KCdtZWFzdXJlQ29uZGl0aW9uR3JvdXBzRXhwYW5kZWQnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbWVhc3VyZS1jb25kaXRpb24tZ3JvdXBzLWV4cGFuZGVkJykpXHJcbiAgICAuY29tcG9uZW50KCdtZWFzdXJlTWFueUNvbmRpdGlvbkJ1dHRvbnMnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbWVhc3VyZS1tYW55LWNvbmRpdGlvbi1idXR0b25zJykpXHJcbiAgICAuY29tcG9uZW50KCdtZWFzdXJlUHJlZmVyZW5jZUNvZGVCdXR0b25zJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL21lYXN1cmUtcHJlZmVyZW5jZS1jb2RlLWJ1dHRvbnMnKSlcclxuICAgIC5jb21wb25lbnQoJ3JlZmVyZW5jZURhdGVBbmRDb3VudHJ5JywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3JlZmVyZW5jZS1kYXRlLWFuZC1jb3VudHJ5JykpXHJcbiAgICBcclxuICAgIC5jb250cm9sbGVyKCdnb29kQ29udHJvbGxlcicsIHJlcXVpcmUoJy4vY29udHJvbGxlcnMvZ29vZCcpKVxyXG4gICAgXHJcbiAgICAuZGlyZWN0aXZlKCdtZWFzdXJlRmlsdGVyc0V4cG9ydFNtYWxsJywgcmVxdWlyZSgnLi9kaXJlY3RpdmVzL2Zvcm0vbWVhc3VyZS1maWx0ZXJzLWV4cG9ydC1zbWFsbCcpKVxyXG4gICAgLmRpcmVjdGl2ZSgnbWVhc3VyZUZpbHRlcnNJbXBvcnQnLCByZXF1aXJlKCcuL2RpcmVjdGl2ZXMvZm9ybS9tZWFzdXJlLWZpbHRlcnMtaW1wb3J0JykpXHJcbiAgICAuZGlyZWN0aXZlKCdtZWFzdXJlRmlsdGVyc0ltcG9ydFNtYWxsJywgcmVxdWlyZSgnLi9kaXJlY3RpdmVzL2Zvcm0vbWVhc3VyZS1maWx0ZXJzLWltcG9ydC1zbWFsbCcpKVxyXG4gICAgLmRpcmVjdGl2ZSgndmFsdWVRdWFudGl0eUltcG9ydCcsIHJlcXVpcmUoJy4vZGlyZWN0aXZlcy9mb3JtL3ZhbHVlLXF1YW50aXR5LWltcG9ydCcpKVxyXG4gICAgXHJcbiAgICAuZmFjdG9yeSgnbWV1cnNpbmdNb2RhbCcsIHJlcXVpcmUoJy4vbW9kYWxzL21ldXJzaW5nLWNvZGUnKSlcclxuICAgIC5mYWN0b3J5KCd1a0NlcnRpZmljYXRlR3VpZGFuY2VNb2RhbCcsIHJlcXVpcmUoJy4vbW9kYWxzL3VrLWNlcnRpZmljYXRlLWd1aWRhbmNlJykpXHJcbiAgICAuZmFjdG9yeSgnZ29vZE1vZGFscycsIHJlcXVpcmUoJy4vbW9kYWxzL21vZGFscycpKVxyXG4gICAgLmZhY3RvcnkoJ2dvb2REYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvZ29vZC1kYXRhJykpXHJcbiAgICAuZmFjdG9yeSgnZ29vZERpc3BsYXlTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy9nb29kLWRpc3BsYXknKSlcclxuICAgIC5mYWN0b3J5KCdnb29kTW9kZWxzU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvZ29vZC1tb2RlbHMnKSlcclxuICAgIC5mYWN0b3J5KCdtZWFzdXJlR3JvdXBpbmdTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy9tZWFzdXJlLWdyb3VwaW5nJykpXHJcbiAgICA7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL2dvb2QvOmdvb2Rzbm9tJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2dvb2QvY29udHJvbGxlcnMvZ29vZC5odG1sJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgO1xyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBncm91cDogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogYW50aUR1bXBpbmdGaW5hbmNpYWxNZWFzdXJlQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9jb21wb25lbnRzL2FudGktZHVtcGluZy1maW5hbmNpYWwtbWVhc3VyZXMuaHRtbCdcclxufTtcclxuXHJcbmFudGlEdW1waW5nRmluYW5jaWFsTWVhc3VyZUNvbnRyb2xsZXIuJGluamVjdCA9IFsnZ29vZERpc3BsYXlTZXJ2aWNlJ107XHJcblxyXG5mdW5jdGlvbiBhbnRpRHVtcGluZ0ZpbmFuY2lhbE1lYXN1cmVDb250cm9sbGVyKGdvb2REaXNwbGF5U2VydmljZSkge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBncm91cDogbnVsbCxcclxuICAgICAgICBzZXRFeHBhbmRlZDogc2V0RXhwYW5kZWRcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0RXhwYW5kZWQodmFsKSB7XHJcbiAgICAgICAgaWYgKHZhbCkge1xyXG4gICAgICAgICAgICBnb29kRGlzcGxheVNlcnZpY2UuZXhwYW5kTWVhc3VyZXModm0uZ3JvdXAubWVhc3VyZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZ29vZERpc3BsYXlTZXJ2aWNlLmNvbGxhcHNlTWVhc3VyZXModm0uZ3JvdXAubWVhc3VyZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2bTtcclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICByZXN1bHQ6ICc8J1xyXG4gICAgfSxcclxuICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9jb21wb25lbnRzL2N1c3RvbXMtdmFsdWUtY2hlY2stcmVzdWx0Lmh0bWwnXHJcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIGR1dHlDYWxjdWxhdGlvblJlc3VsdDogJzwnLFxyXG4gICAgICAgIGR1dHlDYWxjdWxhdGlvbkVycm9yczogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogZHV0eUNhbGN1bGF0aW9uUmVzdWx0Q29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9jb21wb25lbnRzL2R1dHktY2FsY3VsYXRpb24tcmVzdWx0Lmh0bWwnXHJcbn07XHJcblxyXG5kdXR5Q2FsY3VsYXRpb25SZXN1bHRDb250cm9sbGVyLiRpbmplY3QgPSBbJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJ107XHJcblxyXG5mdW5jdGlvbiBkdXR5Q2FsY3VsYXRpb25SZXN1bHRDb250cm9sbGVyKHN0YXRlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc3RhdGU6IHN0YXRlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgbWVhc3VyZXM6ICc8J1xyXG4gICAgfSxcclxuICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9jb21wb25lbnRzL2V4cG9ydC1tZWFzdXJlcy5odG1sJ1xyXG59O1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgY29tbW9kaXR5Q29kZTogJzwnLFxyXG4gICAgICAgIHRyYWRlTW92ZW1lbnQ6ICc8J1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IGZhdm9yaXRlQnV0dG9uQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9jb21wb25lbnRzL2Zhdm9yaXRlLWJ1dHRvbi5odG1sJ1xyXG59O1xyXG5cclxuZmF2b3JpdGVCdXR0b25Db250cm9sbGVyLiRpbmplY3QgPSBbJ2Zhdm9yaXRlc1NlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIGZhdm9yaXRlQnV0dG9uQ29udHJvbGxlcihmYXZvcml0ZXNTZXJ2aWNlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogJG9uSW5pdCxcclxuICAgICAgICBpc0Zhdm9yaXRlOiBmYWxzZSxcclxuICAgICAgICBzZXRGYXZvcml0ZTogc2V0RmF2b3JpdGVcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gJG9uSW5pdCgpIHtcclxuICAgICAgICB2bS5pc0Zhdm9yaXRlID0gZmF2b3JpdGVzU2VydmljZS5pc0Zhdm9yaXRlKHZtLmNvbW1vZGl0eUNvZGUsIHZtLnRyYWRlTW92ZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNldEZhdm9yaXRlKCkge1xyXG4gICAgICAgIHZhciBhZGQgPSB2bS5pc0Zhdm9yaXRlID09PSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGFkZCkge1xyXG4gICAgICAgICAgICBmYXZvcml0ZXNTZXJ2aWNlLmFkZChcclxuICAgICAgICAgICAgICAgIHZtLmNvbW1vZGl0eUNvZGUsXHJcbiAgICAgICAgICAgICAgICB2bS50cmFkZU1vdmVtZW50LFxyXG4gICAgICAgICAgICAgICAgZmFsc2UsIC8vdm0uY291bnRyeUZpbHRlciAhPT0gbnVsbCA/IHZtLmNvdW50cnlGaWx0ZXIuY29kZSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAnZHR2Jy8vdGFyaWNWYXJzLmFwcGxpY2F0aW9uU2V0XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHZtLmlzRmF2b3JpdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZmF2b3JpdGVzU2VydmljZS5yZW1vdmUodm0uY29tbW9kaXR5Q29kZSwgdm0udHJhZGVNb3ZlbWVudCk7XHJcbiAgICAgICAgICAgIHZtLmlzRmF2b3JpdGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgbWVhc3VyZTogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogZmluYW5jaWFsTWVhc3VyZUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2dvb2QvY29tcG9uZW50cy9maW5hbmNpYWwtbWVhc3VyZS5odG1sJ1xyXG59O1xyXG5cclxuZmluYW5jaWFsTWVhc3VyZUNvbnRyb2xsZXIuJGluamVjdCA9IFsnJHdpbmRvdycsICdhcHBsaWNhdGlvblN0YXRlU2VydmljZSddO1xyXG5cclxuZnVuY3Rpb24gZmluYW5jaWFsTWVhc3VyZUNvbnRyb2xsZXIoJHdpbmRvdywgc3RhdGUpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBzdGF0ZTogc3RhdGUsXHJcbiAgICAgICAgdG9nZ2xlOiBmdW5jdGlvbihtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgIHZhciB0ZXh0SXNTZWxlY3RlZCA9ICR3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKS5sZW5ndGggPiAwO1xyXG4gICAgICAgICAgICBpZiAobWVhc3VyZS5pc0V4cGFuZGFibGUgJiYgIXRleHRJc1NlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICBtZWFzdXJlLmV4cGFuZGVkID0gIW1lYXN1cmUuZXhwYW5kZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgbWVhc3VyZTogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogZ2VuZXJhbE1lYXN1cmVDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdnb29kL2NvbXBvbmVudHMvZ2VuZXJhbC1tZWFzdXJlLmh0bWwnXHJcbn07XHJcblxyXG5nZW5lcmFsTWVhc3VyZUNvbnRyb2xsZXIuJGluamVjdCA9IFsnJHdpbmRvdyddO1xyXG5cclxuZnVuY3Rpb24gZ2VuZXJhbE1lYXN1cmVDb250cm9sbGVyKCR3aW5kb3cpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICB0b2dnbGU6IGZ1bmN0aW9uKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgdmFyIHRleHRJc1NlbGVjdGVkID0gJHdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgIGlmIChtZWFzdXJlLmlzRXhwYW5kYWJsZSAmJiAhdGV4dElzU2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIG1lYXN1cmUuZXhwYW5kZWQgPSAhbWVhc3VyZS5leHBhbmRlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2bTtcclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBleGNpc2VDb2RlOiAnPCcsXHJcbiAgICAgICAgZ3JvdXA6ICc8JyxcclxuICAgICAgICBtZWFzdXJldGl0bGU6ICc8J1xyXG4gICAgfSxcclxuICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9jb21wb25lbnRzL2dlcm1hbi1leGNpc2UtbWVhc3VyZXMuaHRtbCdcclxufTsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgbmF0aW9uYWxOb21lbmNsYXR1cmVJZDogJzwnLFxyXG4gICAgICAgIGdyb3VwOiAnPCdcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBnZXJtYW5WYXRNZWFzdXJlc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2dvb2QvY29tcG9uZW50cy9nZXJtYW4tdmF0LW1lYXN1cmVzLmh0bWwnXHJcbn07XHJcblxyXG5mdW5jdGlvbiBnZXJtYW5WYXRNZWFzdXJlc0NvbnRyb2xsZXIoKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uQ2hhbmdlczogJG9uQ2hhbmdlcyxcclxuICAgICAgICBmaWx0ZXJNZWFzdXJlc0J5TmF0aW9uYWxDb21tb2RpdHlDb2RlOiBmaWx0ZXJNZWFzdXJlc0J5TmF0aW9uYWxDb21tb2RpdHlDb2RlXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiAkb25DaGFuZ2VzKCkge1xyXG4gICAgICAgIHZtLmFwcGxpY2FibGVNZWFzdXJlcyA9IGZpbHRlck1lYXN1cmVzQnlOYXRpb25hbENvbW1vZGl0eUNvZGUodm0uZ3JvdXAsIHZtLm5hdGlvbmFsTm9tZW5jbGF0dXJlSWQpO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gZmlsdGVyTWVhc3VyZXNCeU5hdGlvbmFsQ29tbW9kaXR5Q29kZShncm91cCwgbmF0aW9uYWxOb21lbmNsYXR1cmVJZCkge1xyXG4gICAgdmFyIGZpbHRlcmVkTWVhc3VyZXMgPSBfLmZpbHRlcihncm91cCwgZnVuY3Rpb24gKG1lYXN1cmUpIHtcclxuICAgICAgICBpZiAoIW5hdGlvbmFsTm9tZW5jbGF0dXJlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWVhc3VyZS5nZXJtYW5fbmF0aW9uYWxfY29tbW9kaXR5X2NvZGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWVhc3VyZS5nZXJtYW5fbmF0aW9uYWxfY29tbW9kaXR5X2NvZGVzLmxlbmdodGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtZWFzdXJlLmdlcm1hbl9uYXRpb25hbF9jb21tb2RpdHlfY29kZXNbMF1bMTBdID09PSAnMCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChfLmluY2x1ZGVzKG1lYXN1cmUuZ2VybWFuX25hdGlvbmFsX2NvbW1vZGl0eV9jb2RlcywgbmF0aW9uYWxOb21lbmNsYXR1cmVJZCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZpbHRlcmVkTWVhc3VyZXNcclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBncm91cDogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogZ3JvdXBlZEZpbmFuY2lhbE1lYXN1cmVzQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9jb21wb25lbnRzL2dyb3VwZWQtZmluYW5jaWFsLW1lYXN1cmVzLmh0bWwnXHJcbn07XHJcblxyXG5ncm91cGVkRmluYW5jaWFsTWVhc3VyZXNDb250cm9sbGVyLiRpbmplY3QgPSBbJ2dvb2REaXNwbGF5U2VydmljZSddO1xyXG5cclxuZnVuY3Rpb24gZ3JvdXBlZEZpbmFuY2lhbE1lYXN1cmVzQ29udHJvbGxlcihnb29kRGlzcGxheVNlcnZpY2UpIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc2V0RXhwYW5kZWQ6IHNldEV4cGFuZGVkXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNldEV4cGFuZGVkKHZhbCkge1xyXG4gICAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICAgICAgZ29vZERpc3BsYXlTZXJ2aWNlLmV4cGFuZE1lYXN1cmVzKHZtLmdyb3VwLm1lYXN1cmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGdvb2REaXNwbGF5U2VydmljZS5jb2xsYXBzZU1lYXN1cmVzKHZtLmdyb3VwLm1lYXN1cmVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBncm91cDogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogZ3JvdXBlZEdlbmVyYWxNZWFzdXJlc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2dvb2QvY29tcG9uZW50cy9ncm91cGVkLWdlbmVyYWwtbWVhc3VyZXMuaHRtbCdcclxufTtcclxuXHJcbmdyb3VwZWRHZW5lcmFsTWVhc3VyZXNDb250cm9sbGVyLiRpbmplY3QgPSBbJ2dvb2REaXNwbGF5U2VydmljZSddO1xyXG5mdW5jdGlvbiBncm91cGVkR2VuZXJhbE1lYXN1cmVzQ29udHJvbGxlcihnb29kRGlzcGxheVNlcnZpY2UpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBzZXRFeHBhbmRlZDogc2V0RXhwYW5kZWRcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0RXhwYW5kZWQodmFsKSB7XHJcbiAgICAgICAgaWYgKHZhbCkge1xyXG4gICAgICAgICAgICBnb29kRGlzcGxheVNlcnZpY2UuZXhwYW5kTWVhc3VyZXModm0uZ3JvdXAubWVhc3VyZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZ29vZERpc3BsYXlTZXJ2aWNlLmNvbGxhcHNlTWVhc3VyZXModm0uZ3JvdXAubWVhc3VyZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgZ3JvdXA6ICc8JyxcclxuICAgICAgICBtZWFzdXJldGl0bGU6ICc8J1xyXG4gICAgfSxcclxuICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9jb21wb25lbnRzL2dyb3VwZWQtdmF0LW1lYXN1cmVzLmh0bWwnXHJcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIG1lYXN1cmVzOiAnPCcsXHJcbiAgICAgICAgc2V0dGluZ3M6ICc8JywgLy8gY29tbW9kaXR5Q29kZSwgZXp0RXhjaXNlQ29kZSwgZXp0TmF0aW9uYWxDb21tb2RpdHlDb2RlLCByZWZlcmVuY2VDb3VudHJ5XHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogaW1wb3J0TWVhc3VyZXNDb2x1bW5PbmVDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdnb29kL2NvbXBvbmVudHMvaW1wb3J0LW1lYXN1cmVzLWNvbC0xLmh0bWwnXHJcbn07XHJcblxyXG5pbXBvcnRNZWFzdXJlc0NvbHVtbk9uZUNvbnRyb2xsZXIuJGluamVjdCA9IFsnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnXTtcclxuZnVuY3Rpb24gaW1wb3J0TWVhc3VyZXNDb2x1bW5PbmVDb250cm9sbGVyKHN0YXRlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc3RhdGU6IHN0YXRlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHZtO1xyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIG1lYXN1cmVzOiAnPCdcclxuICAgIH0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2dvb2QvY29tcG9uZW50cy9pbXBvcnQtbWVhc3VyZXMtY29sLTIuaHRtbCdcclxufTsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgZ3JvdXBzOiAnPCdcclxuICAgIH0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2dvb2QvY29tcG9uZW50cy9tZWFzdXJlLWNvbmRpdGlvbi1idXR0b25zLmh0bWwnXHJcbn07XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBldmFsdWF0aW9uOiAnPCcsXHJcbiAgICAgICAgZ3JvdXBzOiAnPCdcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBtZWFzdXJlQ29uZGl0aW9uR3JvdXBzRXhwYW5kZWRDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdnb29kL2NvbXBvbmVudHMvbWVhc3VyZS1jb25kaXRpb24tZ3JvdXBzLWV4cGFuZGVkLmh0bWwnXHJcbn07XHJcblxyXG5tZWFzdXJlQ29uZGl0aW9uR3JvdXBzRXhwYW5kZWRDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLFxyXG4gICAgJ3VrQ2VydGlmaWNhdGVHdWlkYW5jZU1vZGFsJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gbWVhc3VyZUNvbmRpdGlvbkdyb3Vwc0V4cGFuZGVkQ29udHJvbGxlcihcclxuICAgIHN0YXRlLFxyXG4gICAgdWtDZXJ0aWZpY2F0ZUd1aWRhbmNlTW9kYWxcclxuKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgcmVmZXJlbmNlQ291bnRyeTogc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnksXHJcbiAgICAgICAgc2hvd1VrR3VpZGFuY2U6IHNob3dVa0d1aWRhbmNlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dVa0d1aWRhbmNlKGNvbmRpdGlvbkdyb3VwLCBjb25kaXRpb25JbmRleCkge1xyXG4gICAgICAgIHZhciBjZXJ0aWZpY2F0ZXMgPSBfLmNoYWluKGNvbmRpdGlvbkdyb3VwLmNvbmRpdGlvbnMpXHJcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbmRpdGlvbiwgaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24uY2VydGlmaWNhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24uY2VydGlmaWNhdGUuYWN0aXZlID0gKGluZGV4ID09PSBjb25kaXRpb25JbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChjb25kaXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAhIWNvbmRpdGlvbi5jZXJ0aWZpY2F0ZTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoY29uZGl0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uLmNlcnRpZmljYXRlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudmFsdWUoKTtcclxuICAgICAgICB1a0NlcnRpZmljYXRlR3VpZGFuY2VNb2RhbC5zaG93KGNlcnRpZmljYXRlcyk7XHJcbiAgICB9XHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgZ3JvdXBzOiAnPCdcclxuICAgIH0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2dvb2QvY29tcG9uZW50cy9tZWFzdXJlLW1hbnktY29uZGl0aW9uLWJ1dHRvbnMuaHRtbCdcclxufTtcclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIG1lYXN1cmU6ICc8J1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IG1lYXN1cmVQcmVmZXJlbmNlQ29kZUJ1dHRvbnNDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdnb29kL2NvbXBvbmVudHMvbWVhc3VyZS1wcmVmZXJlbmNlLWNvZGUtYnV0dG9ucy5odG1sJ1xyXG59O1xyXG5cclxubWVhc3VyZVByZWZlcmVuY2VDb2RlQnV0dG9uc0NvbnRyb2xsZXIuJGluamVjdCA9IFsnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnXVxyXG5cclxuZnVuY3Rpb24gbWVhc3VyZVByZWZlcmVuY2VDb2RlQnV0dG9uc0NvbnRyb2xsZXIoc3RhdGUpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBzdGF0ZTogc3RhdGVcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7fSxcclxuICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9jb21wb25lbnRzL3JlZmVyZW5jZS1kYXRlLWFuZC1jb3VudHJ5Lmh0bWwnLFxyXG4gICAgY29udHJvbGxlcjogcmVmZXJlbmNlRGF0ZUFuZENvdW50cnlDb250cm9sbGVyXHJcbn07XHJcblxyXG5yZWZlcmVuY2VEYXRlQW5kQ291bnRyeUNvbnRyb2xsZXIuJGluamVjdCA9IFsnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIHJlZmVyZW5jZURhdGVBbmRDb3VudHJ5Q29udHJvbGxlcihzdGF0ZSkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIHN0YXRlOiBzdGF0ZVxyXG4gICAgfTtcclxuICAgIHJldHVybiB2bTtcclxufSIsIu+7v3ZhciBtb21lbnQgPSByZXF1aXJlKCdtb21lbnQnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckbG9jYXRpb24nLCBcclxuICAgICckcScsXHJcbiAgICAnJHJvdXRlUGFyYW1zJywgXHJcbiAgICAnJHRpbWVvdXQnLCBcclxuICAgICckd2luZG93JyxcclxuICAgICdhZGRpdGlvbmFsQ29kZXNEYXRhU2VydmljZScsXHJcbiAgICAnY29tbW9uJyxcclxuICAgICdkdXR5RGF0YVNlcnZpY2UnLCBcclxuICAgICdlenREYXRhU2VydmljZScsXHJcbiAgICAnZmF2b3JpdGVzU2VydmljZScsIFxyXG4gICAgJ2dvb2REYXRhU2VydmljZScsIFxyXG4gICAgJ2dvb2REaXNwbGF5U2VydmljZScsIFxyXG4gICAgJ2dvb2RNb2RhbHMnLCBcclxuICAgICdnb29kTW9kZWxzU2VydmljZScsIFxyXG4gICAgJ3RyYW5zYWN0aW9uVmFsdWVEYXRhU2VydmljZScsIFxyXG4gICAgJ3RyYW5zYWN0aW9uVmFsdWVDYWxjdWxhdG9yTW9kYWwnLFxyXG4gICAgJ2NvdW50cnlEYXRhU2VydmljZScsXHJcbiAgICAnbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2UnLCBcclxuICAgICdwcmVmZXJlbmNlQ29kZURhdGFTZXJ2aWNlJywgXHJcbiAgICAncHJlZmVyZW5jZVNlcnZpY2UnLCBcclxuICAgICdtZWFzdXJlR3JvdXBpbmdTZXJ2aWNlJywgXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLCBcclxuICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIFxyXG4gICAgJ2VjaWNzRGF0YVNlcnZpY2UnLFxyXG4gICAgJ3RyYWRlU3RhdGlzdGljc0RhdGFTZXJ2aWNlJywgXHJcbiAgICBnb29kQ29udHJvbGxlclxyXG5dO1xyXG5cclxuZnVuY3Rpb24gZ29vZENvbnRyb2xsZXIoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICRsb2NhdGlvbiwgXHJcbiAgICAkcSwgXHJcbiAgICAkcm91dGVQYXJhbXMsIFxyXG4gICAgJHRpbWVvdXQsIFxyXG4gICAgJHdpbmRvdyxcclxuICAgIGFkZGl0aW9uYWxDb2Rlc0RhdGFTZXJ2aWNlLFxyXG4gICAgY29tbW9uLFxyXG4gICAgZHV0eURhdGFTZXJ2aWNlLCBcclxuICAgIGV6dERhdGFTZXJ2aWNlLFxyXG4gICAgZmF2b3JpdGVzU2VydmljZSwgXHJcbiAgICBnb29kRGF0YVNlcnZpY2UsIFxyXG4gICAgZ29vZERpc3BsYXlTZXJ2aWNlLCBcclxuICAgIGdvb2RNb2RhbHMsIFxyXG4gICAgZ29vZE1vZGVsc1NlcnZpY2UsIFxyXG4gICAgdHJhbnNhY3Rpb25WYWx1ZURhdGFTZXJ2aWNlLCBcclxuICAgIHRyYW5zYWN0aW9uVmFsdWVDYWxjdWxhdG9yTW9kYWwsXHJcbiAgICBjb3VudHJ5RGF0YVNlcnZpY2UsXHJcbiAgICBub21lbmNsYXR1cmVEYXRhU2VydmljZSwgXHJcbiAgICBwcmVmZXJlbmNlQ29kZURhdGFTZXJ2aWNlLCBcclxuICAgIHByZWZlcmVuY2VzLCBcclxuICAgIG1lYXN1cmVHcm91cGluZ1NlcnZpY2UsIFxyXG4gICAgbm90aWZpY2F0aW9uc1NlcnZpY2UsIFxyXG4gICAgc3RhdGUsXHJcbiAgICBlY2ljc0RhdGFTZXJ2aWNlLFxyXG4gICAgdHJhZGVTdGF0aXN0aWNzRGF0YVNlcnZpY2VcclxuKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICAgICAgY2hhcHRlcjogbnVsbCxcclxuICAgICAgICBjb2xsYXBzZU1lYXN1cmVzOiBnb29kRGlzcGxheVNlcnZpY2UuY29sbGFwc2VNZWFzdXJlcyxcclxuICAgICAgICBjdXJyZW50VGFiOiAnc2hvdy1tZWFzdXJlcycsXHJcbiAgICAgICAgZXJnYU9tbmVzQ291bnRyaWVzOiBjb3VudHJ5RGF0YVNlcnZpY2UuZXJnYU9tbmVzQ291bnRyaWVzLFxyXG4gICAgICAgIGV4cGFuZE1lYXN1cmVzOiBnb29kRGlzcGxheVNlcnZpY2UuZXhwYW5kTWVhc3VyZXMsXHJcbiAgICAgICAgZ29Ib21lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICRsb2NhdGlvbi51cmwoJycpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmFsaWRhdGlvbkVycm9yczoge1xyXG4gICAgICAgICAgICBxdWFudGl0aWVzOiB7fVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ29vZDoge1xyXG4gICAgICAgICAgICBnZW5lcmFsSW5mbzoge1xyXG4gICAgICAgICAgICAgICAgY29kZTogJydcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbWVhc3VyZXM6IG5ldyBnb29kTW9kZWxzU2VydmljZS5tZWFzdXJlc0Rpc3BsYXlNb2RlbCgpLFxyXG4gICAgICAgICAgICBub21lbmNsYXR1cmVHcm91cHM6IFtdXHJcbiAgICAgICAgfSxcclxuICAgICAgICBoYXNBdXRvbm9tb3VzVGFyaWZmU3VzcGVuc2lvbjogZmFsc2UsXHJcbiAgICAgICAgaGFzTWV1cnNpbmc6IGZhbHNlLFxyXG4gICAgICAgIGlzTG9hZGluZzoge1xyXG4gICAgICAgICAgICBnZW5lcmFsSW5mbzogdHJ1ZSxcclxuICAgICAgICAgICAgbWV1cnNpbmdIZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICBtZWFzdXJlczogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY3VzdG9tc1ZhbHVlOiB7fSxcclxuICAgICAgICBjdXN0b21zVmFsdWVDYWxjdWxhdGlvbk1ldGhvZDogJ2NhbGN1bGF0ZS12YWx1ZScsXHJcbiAgICAgICAgYXBwbGljYWJsZUFudGlEdW1waW5nQWRkaXRpb25hbENvZGVzOiBbXSxcclxuICAgICAgICBvdGhlckFwcGxpY2FibGVBZGRpdGlvbmFsVGFyaWNDb2RlczogW10sXHJcbiAgICAgICAgYXBwbGljYWJsZU5hdGlvbmFsQWRkaXRpb25hbENvZGVzOiBbXSxcclxuICAgICAgICBhbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlOiBudWxsLFxyXG4gICAgICAgIG90aGVyQWRkaXRpb25hbFRhcmljQ29kZXM6IHt9LFxyXG4gICAgICAgIG1ldXJzaW5nQWRkaXRpb25hbENvZGU6IG51bGwsXHJcbiAgICAgICAgbmF0aW9uYWxBZGRpdGlvbmFsQ29kZTogbnVsbCxcclxuICAgICAgICBjZXJ0aWZpY2F0ZUNvZGVzOiBbXSxcclxuICAgICAgICBvcmRlck51bWJlcjogbnVsbCxcclxuICAgICAgICBhcHBsaWNhYmxlT3JkZXJOdW1iZXJzOiBbXSxcclxuICAgICAgICBwcmVmZXJlbmNlQ29kZTogbnVsbCxcclxuICAgICAgICBwb3NzaWJsZVByZWZlcmVuY2VDb2RlczogW10sXHJcbiAgICAgICAgc2hvd1VjY1RvZ2dsZTogZmFsc2UsXHJcbiAgICAgICAgcXVhbnRpdGllczogW10sXHJcbiAgICAgICAgc2VjdGlvbjogbnVsbCxcclxuICAgICAgICBudW1iZXJPZkVjaWNzSXRlbXM6IDAsXHJcbiAgICAgICAgc3RhdGU6IHN0YXRlLFxyXG4gICAgICAgIGFuQWRkaXRpb25hbENvZGVIYXNCZWVuU2V0OiBhbkFkZGl0aW9uYWxDb2RlSGFzQmVlblNldCxcclxuICAgICAgICBjYWxjdWxhdGVEdXR5OiBjYWxjdWxhdGVEdXR5LFxyXG4gICAgICAgIGV2YWx1YXRlTWVhc3VyZUNvbmRpdGlvbnM6IGV2YWx1YXRlTWVhc3VyZUNvbmRpdGlvbnMsXHJcbiAgICAgICAgY291bnRyeVBpY2tlclNlbGVjdGlvbkNoYW5nZWQ6IGNvdW50cnlQaWNrZXJTZWxlY3Rpb25DaGFuZ2VkLFxyXG4gICAgICAgIGdvVG9Ob21lbmNsYXR1cmU6IGdvVG9Ob21lbmNsYXR1cmUsXHJcbiAgICAgICAgb25DaGFuZ2VDZXJ0aWZpY2F0ZUNvZGVzOiBvbkNoYW5nZUNlcnRpZmljYXRlQ29kZXMsXHJcbiAgICAgICAgb25DaGFuZ2VBbnRpZHVtcGluZ0FkZGl0aW9uYWxDb2RlOiBvbkNoYW5nZUFudGlkdW1waW5nQWRkaXRpb25hbENvZGUsXHJcbiAgICAgICAgb25DaGFuZ2VEdXR5TWVhc3VyZVR5cGU6IG9uQ2hhbmdlRHV0eU1lYXN1cmVUeXBlLFxyXG4gICAgICAgIG9uQ2hhbmdlRXp0RXhjaXNlQ29kZTogb25DaGFuZ2VFenRFeGNpc2VDb2RlLFxyXG4gICAgICAgIG9uQ2hhbmdlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZTogb25DaGFuZ2VOYXRpb25hbEFkZGl0aW9uYWxDb2RlLFxyXG4gICAgICAgIG9uQ2hhbmdlU2Vjb25kTmF0aW9uYWxBZGRpdGlvbmFsQ29kZTogb25DaGFuZ2VTZWNvbmROYXRpb25hbEFkZGl0aW9uYWxDb2RlLFxyXG4gICAgICAgIG9uQ2hhbmdlT3RoZXJBZGRpdGlvbmFsQ29kZTogb25DaGFuZ2VPdGhlckFkZGl0aW9uYWxDb2RlLFxyXG4gICAgICAgIG9uQ2hhbmdlT3JkZXJOdW1iZXI6IG9uQ2hhbmdlT3JkZXJOdW1iZXIsXHJcbiAgICAgICAgb25DaGFuZ2VPdXRwdXRDdXJyZW5jeTogb25DaGFuZ2VPdXRwdXRDdXJyZW5jeSxcclxuICAgICAgICBvbkNoYW5nZVByZWZlcmVuY2VDb2RlOiBvbkNoYW5nZVByZWZlcmVuY2VDb2RlLFxyXG4gICAgICAgIHNob3dNZXVyc2luZ0FkZGl0aW9uYWxDb2RlTW9kYWw6IHNob3dNZXVyc2luZ0FkZGl0aW9uYWxDb2RlTW9kYWwsXHJcbiAgICAgICAgc2hvd1ZlcmJydWlrc2JlbGFzdGluZ1dhcm5pbmc6IHNob3dWZXJicnVpa3NiZWxhc3RpbmdXYXJuaW5nLFxyXG4gICAgICAgIGxvYWRNZXVyc2luZ1RhcmlmZnM6IGxvYWRNZXVyc2luZ1RhcmlmZnMsXHJcbiAgICAgICAgY2hhbmdlVGFiOiBjaGFuZ2VUYWIsXHJcbiAgICAgICAgc2VsZWN0RXp0Tm9tZW5jbGF0dXJlOiBzZWxlY3RFenROb21lbmNsYXR1cmUsXHJcbiAgICAgICAgc2hvd1RyYW5zYWN0aW9uVmFsdWVDYWxjdWxhdG9yOiBzaG93VHJhbnNhY3Rpb25WYWx1ZUNhbGN1bGF0b3IsXHJcbiAgICAgICAgdmFsaWRhdGVEZWNsYXJhdGlvbjogdmFsaWRhdGVEZWNsYXJhdGlvbixcclxuICAgICAgICB1Y2NTZXR0aW5nQ2hhbmdlZDogdWNjU2V0dGluZ0NoYW5nZWRcclxuICAgIH07XHJcblxyXG5cclxuICAgIHZhciBhbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlVHlwZXMgPSBbJzgnLCAnQScsICdCJywgJ0MnXTtcclxuICAgIHZhciBvdGhlckFkZGl0aW9uYWxUYXJpY0NvZGVUeXBlcyA9IFsnMicsICczJywgJzQnLCAnNicsICc5J107XHJcbiAgICB2YXIgbmF0aW9uYWxBZGRpdGlvbmFsQ29kZVR5cGVzID0gWycwJywgJzEnLCAnNScsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJ107XHJcblxyXG4gICAgZnVuY3Rpb24gdWNjU2V0dGluZ0NoYW5nZWQodWNjTW9kZUVuYWJsZWQpIHtcclxuICAgICAgICBwcmVmZXJlbmNlcy5yZXBsYWNlKHtcclxuICAgICAgICAgICAgY2F0ZWdvcnk6ICdzZXR0aW5ncycsXHJcbiAgICAgICAgICAgIG5hbWU6ICd1Y2NNb2RlRW5hYmxlZCcsXHJcbiAgICAgICAgICAgIHZhbHVlOiB1Y2NNb2RlRW5hYmxlZCxcclxuICAgICAgICAgICAgdmFsdWVUeXBlOiAnc3RyaW5nVmFsdWUnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdm0uc3RhdGUudWNjTW9kZUVuYWJsZWQgPSB1Y2NNb2RlRW5hYmxlZDtcclxuICAgICAgICB2bS5vbkNoYW5nZVByZWZlcmVuY2VDb2RlKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvdW50cnlQaWNrZXJTZWxlY3Rpb25DaGFuZ2VkKGNvdW50cnksIHJlbWVtYmVyQ291bnRyeSkge1xyXG4gICAgICAgIGNsZWFyTWVhc3VyZUNvbmRpdGlvbkV2YWx1YXRpb24oKTtcclxuICAgICAgICB2bS5jdXN0b21zVmFsdWVDaGVja1Jlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgdmFyIGNvdW50cnlIYXNDaGFuZ2VkID0gc3RhdGUuY291bnRyeUhhc0NoYW5nZWQoY291bnRyeSk7XHJcbiAgICAgICAgc3RhdGUudXBkYXRlQ291bnRyeUZpbHRlcihjb3VudHJ5LCByZW1lbWJlckNvdW50cnkpO1xyXG4gICAgICAgIGlmIChyZW1lbWJlckNvdW50cnkgJiYgY291bnRyeSkge1xyXG4gICAgICAgICAgICBwcmVmZXJlbmNlcy5zYXZlQ291bnRyeVByZWZlcmVuY2UoY291bnRyeSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJlZmVyZW5jZXMuY2xlYXJDb3VudHJ5UHJlZmVyZW5jZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY291bnRyeUhhc0NoYW5nZWQpIHtcclxuICAgICAgICAgICAgZmlsdGVyTWVhc3VyZXNCeUNvdW50cnkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd1RyYW5zYWN0aW9uVmFsdWVDYWxjdWxhdG9yKCkge1xyXG4gICAgICAgIHRyYW5zYWN0aW9uVmFsdWVDYWxjdWxhdG9yTW9kYWxcclxuICAgICAgICAgICAgLnNob3coKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5jdXN0b21zVmFsdWUgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VUYWIodGFiSWQpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS5wdWJsaXNoKCdkZWNsYXJhYmxlLWNvZGUtY2hhbmdlLXRhYicpO1xyXG4gICAgICAgIHN3aXRjaCAodGFiSWQpIHtcclxuICAgICAgICAgICAgY2FzZSAnc2hvdy1tZWFzdXJlcyc6XHJcbiAgICAgICAgICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL3Nob3ctbWVhc3VyZXMnKTtcclxuICAgICAgICAgICAgICAgIHZtLmN1cnJlbnRUYWIgPSAnc2hvdy1tZWFzdXJlcyc7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnc2hvdy1oaW53ZWlzZSc6XHJcbiAgICAgICAgICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL3Nob3ctaGlud2Vpc2UnKTtcclxuICAgICAgICAgICAgICAgIHZtLmN1cnJlbnRUYWIgPSAnc2hvdy1oaW53ZWlzZSc7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAndmFsaWRhdGUtZGVjbGFyYXRpb24nOlxyXG4gICAgICAgICAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy92YWxpZGF0ZS1kZWNsYXJhdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgdm0uY3VycmVudFRhYiA9ICd2YWxpZGF0ZS1kZWNsYXJhdGlvbic7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnY2FsY3VsYXRlLWR1dHknOlxyXG4gICAgICAgICAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9jYWxjdWxhdGUtZHV0eScpO1xyXG4gICAgICAgICAgICAgICAgdm0uY3VycmVudFRhYiA9ICdjYWxjdWxhdGUtZHV0eSc7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25DaGFuZ2VDZXJ0aWZpY2F0ZUNvZGVzKGNlcnRpZmljYXRlQ29kZXMpIHtcclxuICAgICAgICB2bS5jZXJ0aWZpY2F0ZUNvZGVzID0gY2VydGlmaWNhdGVDb2RlcztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkNoYW5nZU91dHB1dEN1cnJlbmN5KGN1cnJlbmN5KSB7XHJcbiAgICAgICAgaWYgKGN1cnJlbmN5KSB7XHJcbiAgICAgICAgICAgIGxvYWRHb29kKHZtLmdvb2QuZ2VuZXJhbEluZm8uY29kZSwgdm0ubmF0aW9uYWxBZGRpdGlvbmFsQ29kZSwgdm0ubWV1cnNpbmdBZGRpdGlvbmFsQ29kZSwgY3VycmVuY3kpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbG9hZEdvb2Qodm0uZ29vZC5nZW5lcmFsSW5mby5jb2RlLCB2bS5uYXRpb25hbEFkZGl0aW9uYWxDb2RlLCB2bS5tZXVyc2luZ0FkZGl0aW9uYWxDb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0ub3V0cHV0Q3VycmVuY3kgPSBjdXJyZW5jeTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkNoYW5nZUFudGlkdW1waW5nQWRkaXRpb25hbENvZGUoYWRkaXRpb25hbENvZGUpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnZ29vZHNDb250cm9sbGVyOjpvbkNoYW5nZUFudGlkdW1waW5nQWRkaXRpb25hbENvZGUnLCBhZGRpdGlvbmFsQ29kZSk7XHJcbiAgICAgICAgdm0uYW50aUR1bXBpbmdBZGRpdGlvbmFsQ29kZSA9IGFkZGl0aW9uYWxDb2RlO1xyXG4gICAgICAgIGZpbHRlck1lYXN1cmVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25DaGFuZ2VPdGhlckFkZGl0aW9uYWxDb2RlKHR5cGUsIGFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2dvb2RzQ29udHJvbGxlcjo6b25DaGFuZ2VPdGhlckFkZGl0aW9uYWxDb2RlJywgdHlwZSwgYWRkaXRpb25hbENvZGUpO1xyXG4gICAgICAgIGlmIChhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICB2bS5vdGhlckFkZGl0aW9uYWxUYXJpY0NvZGVzW3R5cGVdID0gYWRkaXRpb25hbENvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGUpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHZtLm90aGVyQWRkaXRpb25hbFRhcmljQ29kZXNbdHlwZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbHRlck1lYXN1cmVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogc2F2ZSBhZGRpdGlvbmFsIGNvZGVzIGFzIG9iamVjdCAob3IgYXMgc3RyaW5nLCBidXQgY29uc2lzdGVudGx5IC0gcmlnaHQgbm93IGFudGlkdW1waW5nIGlzIHNhdmVkIGFzIG9iamVjdClcclxuICAgIGZ1bmN0aW9uIG9uQ2hhbmdlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZShhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgIHZhciBwcmV2aW91c0FkZGl0aW9uYWxDb2RlSXNPcHRpb25hbCA9IHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID09PSAnTkwnICYmXHJcbiAgICAgICAgICAgICEhdm0ubmF0aW9uYWxBZGRpdGlvbmFsQ29kZU9iamVjdCAmJlxyXG4gICAgICAgICAgICAodm0ubmF0aW9uYWxBZGRpdGlvbmFsQ29kZU9iamVjdC50eXBlLnRvVXBwZXJDYXNlKCkgPT09ICdUJyB8fFxyXG4gICAgICAgICAgICAgICAgdm0ubmF0aW9uYWxBZGRpdGlvbmFsQ29kZU9iamVjdC50eXBlLnRvVXBwZXJDYXNlKCkgPT09ICdWJyk7XHJcblxyXG4gICAgICAgIHZhciBhZGRpdGlvbmFsQ29kZUlzT3B0aW9uYWwgPSBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9PT0gJ05MJyAmJlxyXG4gICAgICAgICAgICAhIWFkZGl0aW9uYWxDb2RlICYmXHJcbiAgICAgICAgICAgIChhZGRpdGlvbmFsQ29kZS50eXBlLnRvVXBwZXJDYXNlKCkgPT09ICdUJyB8fCBhZGRpdGlvbmFsQ29kZS50eXBlLnRvVXBwZXJDYXNlKCkgPT09ICdWJyk7XHJcblxyXG4gICAgICAgIGlmIChhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICB2bS5uYXRpb25hbEFkZGl0aW9uYWxDb2RlID0gYWRkaXRpb25hbENvZGUudHlwZSArIGFkZGl0aW9uYWxDb2RlLmNvZGU7XHJcbiAgICAgICAgICAgIHZtLm5hdGlvbmFsQWRkaXRpb25hbENvZGVPYmplY3QgPSBhZGRpdGlvbmFsQ29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLm5hdGlvbmFsQWRkaXRpb25hbENvZGUgPSBudWxsO1xyXG4gICAgICAgICAgICB2bS5uYXRpb25hbEFkZGl0aW9uYWxDb2RlT2JqZWN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBzaG91bGRMb2FkT3B0aW9uYWxBZGRpdGlvbmFsQ29kZXMgPSAoYWRkaXRpb25hbENvZGVJc09wdGlvbmFsICYmICFwcmV2aW91c0FkZGl0aW9uYWxDb2RlSXNPcHRpb25hbCkgfHxcclxuICAgICAgICAgICAgKCFhZGRpdGlvbmFsQ29kZUlzT3B0aW9uYWwgJiYgcHJldmlvdXNBZGRpdGlvbmFsQ29kZUlzT3B0aW9uYWwpO1xyXG5cclxuICAgICAgICBpZiAoc2hvdWxkTG9hZE9wdGlvbmFsQWRkaXRpb25hbENvZGVzKSB7XHJcbiAgICAgICAgICAgICRxLmFsbChbXHJcbiAgICAgICAgICAgICAgICBsb2FkR29vZCh2bS5nb29kLmdlbmVyYWxJbmZvLmNvZGUsIHZtLm5hdGlvbmFsQWRkaXRpb25hbENvZGUsIHZtLm1ldXJzaW5nQWRkaXRpb25hbENvZGUsIHZtLm91dHB1dEN1cnJlbmN5KSxcclxuICAgICAgICAgICAgICAgIGxvYWRVbml0cygpXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZmlsdGVyTWVhc3VyZXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogc2F2ZSBhZGRpdGlvbmFsIGNvZGVzIGFzIG9iamVjdCAob3IgYXMgc3RyaW5nLCBidXQgY29uc2lzdGVudGx5IC0gcmlnaHQgbm93IGFudGlkdW1waW5nIGlzIHNhdmVkIGFzIG9iamVjdClcclxuICAgIGZ1bmN0aW9uIG9uQ2hhbmdlU2Vjb25kTmF0aW9uYWxBZGRpdGlvbmFsQ29kZShhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgIGlmIChhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICB2bS5zZWNvbmROYXRpb25hbEFkZGl0aW9uYWxDb2RlID0gYWRkaXRpb25hbENvZGUudHlwZSArIGFkZGl0aW9uYWxDb2RlLmNvZGU7XHJcbiAgICAgICAgICAgIHZtLnNlY29uZE5hdGlvbmFsQWRkaXRpb25hbENvZGVPYmplY3QgPSBhZGRpdGlvbmFsQ29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLnNlY29uZE5hdGlvbmFsQWRkaXRpb25hbENvZGUgPSBudWxsO1xyXG4gICAgICAgICAgICB2bS5zZWNvbmROYXRpb25hbEFkZGl0aW9uYWxDb2RlT2JqZWN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmlsdGVyTWVhc3VyZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkNoYW5nZUR1dHlNZWFzdXJlVHlwZShkdXR5TWVhc3VyZVR5cGUpIHtcclxuICAgICAgICB2YXIgbWVhc3VyZVByZWZlcmVuY2VDb2Rlc1Byb3BlcnR5ID0gdm0uc3RhdGUudWNjTW9kZUVuYWJsZWQgPT09ICd5ZXMnID8gJ3VjY19wcmVmZXJlbmNlX2NvZGVzJyA6ICdwcmVmZXJlbmNlX2NvZGVzJztcclxuICAgICAgICB2bS5kdXR5TWVhc3VyZVR5cGUgPSBkdXR5TWVhc3VyZVR5cGU7XHJcbiAgICAgICAgaWYgKCFkdXR5TWVhc3VyZVR5cGUpIHtcclxuICAgICAgICAgICAgdm0ucHJlZmVyZW5jZUNvZGUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh2bS5wcmVmZXJlbmNlQ29kZSAmJiBkdXR5TWVhc3VyZVR5cGVbbWVhc3VyZVByZWZlcmVuY2VDb2Rlc1Byb3BlcnR5XS5pbmRleE9mKHZtLnByZWZlcmVuY2VDb2RlLmNvZGUpID09PSAtMSkge1xyXG4gICAgICAgICAgICB2bS5wcmVmZXJlbmNlQ29kZSA9IG51bGxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIGxvYWRNZWFzdXJlc0NvbXBsZXRlZCwgc28gdGhhdCB3ZVxyXG4gICAgICAgIC8vIGFsc28gcGVyZm9ybSB0aGlzIGFjdGlvbiBpZiB0aGUgZHV0eSBtZWFzdXJlIHR5cGUgaXMgY2hhbmdlZCBmb3IgYW5vdGhlciByZWFzb25cclxuICAgICAgICBpZiAoZHV0eU1lYXN1cmVUeXBlICYmIGR1dHlNZWFzdXJlVHlwZVttZWFzdXJlUHJlZmVyZW5jZUNvZGVzUHJvcGVydHldICYmIGR1dHlNZWFzdXJlVHlwZVttZWFzdXJlUHJlZmVyZW5jZUNvZGVzUHJvcGVydHldLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICB2bS5wcmVmZXJlbmNlQ29kZSA9IF8uZmluZCh2bS5wcmVmZXJlbmNlQ29kZXMsIGZ1bmN0aW9uIChwcmVmZXJlbmNlQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VDb2RlLmNvZGUgPT09IGR1dHlNZWFzdXJlVHlwZVttZWFzdXJlUHJlZmVyZW5jZUNvZGVzUHJvcGVydHldWzBdO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZpbHRlck1lYXN1cmVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25DaGFuZ2VQcmVmZXJlbmNlQ29kZShwcmVmZXJlbmNlQ29kZSkge1xyXG4gICAgICAgIHZhciBtZWFzdXJlUHJlZmVyZW5jZUNvZGVzUHJvcGVydHkgPSB2bS5zdGF0ZS51Y2NNb2RlRW5hYmxlZCA9PT0gJ3llcycgPyAndWNjX3ByZWZlcmVuY2VfY29kZXMnIDogJ3ByZWZlcmVuY2VfY29kZXMnO1xyXG4gICAgICAgIHZtLnByZWZlcmVuY2VDb2RlID0gcHJlZmVyZW5jZUNvZGU7XHJcbiAgICAgICAgaWYgKCFwcmVmZXJlbmNlQ29kZSkge1xyXG4gICAgICAgICAgICB2bS5kdXR5TWVhc3VyZVR5cGUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghdm0uZHV0eU1lYXN1cmVUeXBlKSB7XHJcbiAgICAgICAgICAgIGxldCBkdXR5TWVhc3VyZVR5cGVzID0gXy5maWx0ZXIodm0uYXBwbGljYWJsZUR1dHlNZWFzdXJlVHlwZXMsIGZ1bmN0aW9uIChkdXR5TWVhc3VyZVR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkdXR5TWVhc3VyZVR5cGVbbWVhc3VyZVByZWZlcmVuY2VDb2Rlc1Byb3BlcnR5XS5pbmRleE9mKHByZWZlcmVuY2VDb2RlLmNvZGUpID4gLTE7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoZHV0eU1lYXN1cmVUeXBlcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIHZtLmR1dHlNZWFzdXJlVHlwZSA9IGR1dHlNZWFzdXJlVHlwZXNbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodm0uZHV0eU1lYXN1cmVUeXBlICYmIHZtLmR1dHlNZWFzdXJlVHlwZVttZWFzdXJlUHJlZmVyZW5jZUNvZGVzUHJvcGVydHldLmluZGV4T2YocHJlZmVyZW5jZUNvZGUuY29kZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHZtLmR1dHlNZWFzdXJlVHlwZSA9IG51bGxcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgZmlsdGVyTWVhc3VyZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkNoYW5nZU9yZGVyTnVtYmVyKG9yZGVyTnVtYmVyKSB7XHJcbiAgICAgICAgdm0ub3JkZXJOdW1iZXIgPSBvcmRlck51bWJlcjtcclxuICAgICAgICBmaWx0ZXJNZWFzdXJlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbGxlY3RBZGRpdGlvbmFsQ29kZXMoKSB7XHJcbiAgICAgICAgdmFyIGFkZGl0aW9uYWxDb2RlcyA9IF8udmFsdWVzKHZtLm90aGVyQWRkaXRpb25hbFRhcmljQ29kZXMpO1xyXG4gICAgICAgIGlmICh2bS5hbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgICAgIGFkZGl0aW9uYWxDb2Rlcy5wdXNoKHZtLmFudGlEdW1waW5nQWRkaXRpb25hbENvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodm0ubWV1cnNpbmdBZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICBhZGRpdGlvbmFsQ29kZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiB2bS5tZXVyc2luZ0FkZGl0aW9uYWxDb2RlLnN1YnN0cmluZygwLCAxKSxcclxuICAgICAgICAgICAgICAgIGNvZGU6IHZtLm1ldXJzaW5nQWRkaXRpb25hbENvZGUuc3Vic3RyaW5nKDEpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodm0ubmF0aW9uYWxBZGRpdGlvbmFsQ29kZU9iamVjdCkge1xyXG4gICAgICAgICAgICBhZGRpdGlvbmFsQ29kZXMucHVzaCh2bS5uYXRpb25hbEFkZGl0aW9uYWxDb2RlT2JqZWN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZtLnNlY29uZE5hdGlvbmFsQWRkaXRpb25hbENvZGVPYmplY3QpIHtcclxuICAgICAgICAgICAgYWRkaXRpb25hbENvZGVzLnB1c2godm0uc2Vjb25kTmF0aW9uYWxBZGRpdGlvbmFsQ29kZU9iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhZGRpdGlvbmFsQ29kZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0QW50aUR1bXBpbmdBZGRpdGlvbmFsQ29kZVRvRGVmYXVsdFZhbHVlKCkge1xyXG4gICAgICAgIHZtLmFudGlEdW1waW5nQWRkaXRpb25hbENvZGUgPSBfLmZpbmQodm0uYXBwbGljYWJsZUFudGlEdW1waW5nQWRkaXRpb25hbENvZGVzLCBmdW5jdGlvbihhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gKGFkZGl0aW9uYWxDb2RlLnR5cGUgPT09IFwiOFwiICYmIGFkZGl0aW9uYWxDb2RlLmNvZGUgPT09IFwiOTAwXCIpIHx8XHJcbiAgICAgICAgICAgICAgICAoYWRkaXRpb25hbENvZGUudHlwZSA9PT0gXCJBXCIgJiYgYWRkaXRpb25hbENvZGUuY29kZSA9PT0gXCI5OTlcIikgfHxcclxuICAgICAgICAgICAgICAgIChhZGRpdGlvbmFsQ29kZS50eXBlID09PSBcIkJcIiAmJiBhZGRpdGlvbmFsQ29kZS5jb2RlID09PSBcIjk5OVwiKSB8fFxyXG4gICAgICAgICAgICAgICAgKGFkZGl0aW9uYWxDb2RlLnR5cGUgPT09IFwiQ1wiICYmIGFkZGl0aW9uYWxDb2RlLmNvZGUgPT09IFwiOTk5XCIpXHJcbiAgICAgICAgICAgIDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldFByZWZlcmVuY2VDb2RlVG9EZWZhdWx0VmFsdWUoKSB7XHJcbiAgICAgICAgdmFyIHRoaXJkQ291bnRyeUR1dHlQcmVmZXJlbmNlQ29kZSA9IF8uZmluZCh2bS5wb3NzaWJsZVByZWZlcmVuY2VDb2RlcywgZnVuY3Rpb24ocHJlZmVyZW5jZUNvZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VDb2RlLmNvZGUgPT09ICcxMDAnO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZhciBlbmRVc2VQcmVmZXJlbmNlQ29kZSA9IF8uZmluZCh2bS5wb3NzaWJsZVByZWZlcmVuY2VDb2RlcywgZnVuY3Rpb24ocHJlZmVyZW5jZUNvZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VDb2RlLmNvZGUgPT09ICcxNDAnO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlyZENvdW50cnlEdXR5UHJlZmVyZW5jZUNvZGUpIHtcclxuICAgICAgICAgICAgdm0ucHJlZmVyZW5jZUNvZGUgPSB0aGlyZENvdW50cnlEdXR5UHJlZmVyZW5jZUNvZGU7XHJcbiAgICAgICAgICAgIGxldCBkZWZhdWx0RHV0eU1lYXN1cmVUeXBlID0gXy5maW5kKHZtLmFwcGxpY2FibGVEdXR5TWVhc3VyZVR5cGVzLCBmdW5jdGlvbiAoZHV0eU1lYXN1cmVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZHV0eU1lYXN1cmVUeXBlLmlkID09PSAnMTAzJztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChkZWZhdWx0RHV0eU1lYXN1cmVUeXBlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5kdXR5TWVhc3VyZVR5cGUgPSBkZWZhdWx0RHV0eU1lYXN1cmVUeXBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGVuZFVzZVByZWZlcmVuY2VDb2RlKSB7XHJcbiAgICAgICAgICAgIHZtLnByZWZlcmVuY2VDb2RlID0gZW5kVXNlUHJlZmVyZW5jZUNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlRGVjbGFyYXRpb24oKSB7XHJcbiAgICAgICAgdm0uY3VzdG9tc1ZhbHVlQ2hlY2tSZXN1bHQgPSBudWxsO1xyXG4gICAgICAgICRhbmFseXRpY3MuZXZlbnRUcmFjaygnc3VibWl0LXZhbGlkYXRlLWRlY2xhcmF0aW9uJyk7IFxyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnB1Ymxpc2goJ3N1Ym1pdC12YWxpZGF0ZS1kZWNsYXJhdGlvbicpO1xyXG4gICAgICAgIGNoZWNrQ3VzdG9tc1ZhbHVlKCk7XHJcbiAgICAgICAgZXZhbHVhdGVNZWFzdXJlQ29uZGl0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNoZWNrQ3VzdG9tc1ZhbHVlKCkge1xyXG4gICAgICAgIHZhciBuZXRXZWlnaHQgPSBfLmZpbmQodm0ucXVhbnRpdGllcywgZnVuY3Rpb24ocXVhbnRpdHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHF1YW50aXR5LlVuaXRUeXBlICYmIHF1YW50aXR5LlVuaXRUeXBlLlR5cGUgPT09ICdXZWlnaHQnO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChuZXRXZWlnaHQgJiYgbmV0V2VpZ2h0LkFtb3VudCAmJiB2bS5jdXN0b21zVmFsdWUuYW1vdW50ICYmIHN0YXRlLmZpbHRlci5jb3VudHJ5Q29kZSkge1xyXG4gICAgICAgICAgICB2YXIgcXVlcnkgPSB7XHJcbiAgICAgICAgICAgICAgICBjb21tb2RpdHlDb2RlOiB2bS5nb29kLmdlbmVyYWxJbmZvLmNvZGUsXHJcbiAgICAgICAgICAgICAgICBjdXN0b21zVmFsdWU6IHZtLmN1c3RvbXNWYWx1ZSxcclxuICAgICAgICAgICAgICAgIGRhdGU6IHN0YXRlLmZpbHRlci5kYXRlLFxyXG4gICAgICAgICAgICAgICAgcGFydG5lckNvdW50cnk6IHN0YXRlLmZpbHRlci5jb3VudHJ5Q29kZSxcclxuICAgICAgICAgICAgICAgIHF1YW50aXRpZXM6IHZtLnF1YW50aXRpZXMsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRpbmdDb3VudHJ5OiBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSxcclxuICAgICAgICAgICAgICAgIHRyYWRlTW92ZW1lbnQ6IHN0YXRlLmZpbHRlci5tb3ZlbWVudCwgLy8gVE9ETzogcHJvY2VzcyB0cmFkZSBtb3ZlbWVudCBpbiBBUElcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKHF1ZXJ5LnJlcG9ydGluZ0NvdW50cnkgIT09ICdFVScgJiYgcXVlcnkucmVwb3J0aW5nQ291bnRyeSAhPT0gJ0NIJyAmJiBxdWVyeS5yZXBvcnRpbmdDb3VudHJ5ICE9PSAnR0InKSB7XHJcbiAgICAgICAgICAgICAgICB0cmFkZVN0YXRpc3RpY3NEYXRhU2VydmljZS5jaGVja0N1c3RvbXNWYWx1ZShxdWVyeSlcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmN1c3RvbXNWYWx1ZUNoZWNrUmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2bS5jdXN0b21zVmFsdWVDaGVja1Jlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyTWVhc3VyZUNvbmRpdGlvbkV2YWx1YXRpb24oKSB7XHJcbiAgICAgICAgdm0ubWVhc3VyZXMgPSBfLm1hcCh2bS5tZWFzdXJlcywgZnVuY3Rpb24gKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgbWVhc3VyZS5jb25kaXRpb25FdmFsdWF0aW9uID0gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmU7XHJcbiAgICAgICAgfSlcclxuICAgICAgICB2bS5nb29kLm1lYXN1cmVzID0gbWVhc3VyZUdyb3VwaW5nU2VydmljZS5ncm91cCh2bS5tZWFzdXJlcywgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGV2YWx1YXRlTWVhc3VyZUNvbmRpdGlvbnMoKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nLmV2YWx1YXRlTWVhc3VyZUNvbmRpdGlvbnMgPSB0cnVlO1xyXG4gICAgICAgIHZhciBhZGRpdGlvbmFsQ29kZXMgPSBjb2xsZWN0QWRkaXRpb25hbENvZGVzKCk7XHJcbiAgICAgICAgaWYgKHZtLmR1dHlNZWFzdXJlVHlwZSkge1xyXG4gICAgICAgICAgICB2YXIgZHV0eU1lYXN1cmVUeXBlSWQgPSB2bS5kdXR5TWVhc3VyZVR5cGUuaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBxdWVyeSA9IHtcclxuICAgICAgICAgICAgY2VydGlmaWNhdGVDb2Rlczogdm0uY2VydGlmaWNhdGVDb2RlcyxcclxuICAgICAgICAgICAgY29tbW9kaXR5Q29kZTogdm0uZ29vZC5nZW5lcmFsSW5mby5jb2RlLFxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsQ29kZXM6IGFkZGl0aW9uYWxDb2RlcyxcclxuICAgICAgICAgICAgcHJlZmVyZW5jZUNvZGU6IHZtLnByZWZlcmVuY2VDb2RlLFxyXG4gICAgICAgICAgICB1Y2NNb2RlRW5hYmxlZDogdm0uc3RhdGUudWNjTW9kZUVuYWJsZWQsXHJcbiAgICAgICAgICAgIGN1c3RvbXNWYWx1ZTogdm0uY3VzdG9tc1ZhbHVlLFxyXG4gICAgICAgICAgICBkdXR5TWVhc3VyZVR5cGVJZDogZHV0eU1lYXN1cmVUeXBlSWQsXHJcbiAgICAgICAgICAgIG9yZGVyTnVtYmVyOiB2bS5vcmRlck51bWJlcixcclxuICAgICAgICAgICAgcXVhbnRpdGllczogdm0ucXVhbnRpdGllcyxcclxuICAgICAgICAgICAgY291bnRyeUNvZGU6IHN0YXRlLmZpbHRlci5jb3VudHJ5Q29kZSxcclxuICAgICAgICAgICAgdHJhZGVNb3ZlbWVudDogc3RhdGUuZmlsdGVyLm1vdmVtZW50LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGdvb2REYXRhU2VydmljZVxyXG4gICAgICAgICAgICAuZXZhbHVhdGVNZWFzdXJlQ29uZGl0aW9ucyhxdWVyeSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0cykge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nLmV2YWx1YXRlTWVhc3VyZUNvbmRpdGlvbnMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB2bS5tZWFzdXJlcyA9IF8ubWFwKHZtLm1lYXN1cmVzLCBmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZXN1bHRzW21lYXN1cmUuaWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS5jb25kaXRpb25FdmFsdWF0aW9uID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB2bS5nb29kLm1lYXN1cmVzID0gbWVhc3VyZUdyb3VwaW5nU2VydmljZS5ncm91cCh2bS5tZWFzdXJlcywgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRCcml0aXNoVmF0Q29kZVRvT25seVBvc3NpYmxlVmFsdWVJZk5lY2Vzc2FyeSgpIHtcclxuICAgICAgICBpZiAoc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgPT09ICdHQicpIHtcclxuICAgICAgICAgICAgaWYgKHZtLmFwcGxpY2FibGVOYXRpb25hbEFkZGl0aW9uYWxDb2RlcyAmJiB2bS5hcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZXMubGVuZ3RoID09PSAxICYmICF2bS5uYXRpb25hbEFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXBwbGljYWJsZU5hdGlvbmFsQWRkaXRpb25hbENvZGUgPSB2bS5hcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZXNbMF07XHJcbiAgICAgICAgICAgICAgICB2YXIgdmF0TWVhc3VyZXMgPSBfLmZpbHRlcih2bS5tZWFzdXJlcywgZnVuY3Rpb24gKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZS5zZXJpZXMgPT09ICdQJztcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhdE1lYXN1cmVzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YXRNZWFzdXJlID0gdmF0TWVhc3VyZXNbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhdmF0TWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUgJiYgdmF0TWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUudHlwZSA9PT0gYXBwbGljYWJsZU5hdGlvbmFsQWRkaXRpb25hbENvZGUudHlwZSAmJiB2YXRNZWFzdXJlLmFkZGl0aW9uYWxfY29kZS5jb2RlID09PSBhcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZS5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm5hdGlvbmFsQWRkaXRpb25hbENvZGVPYmplY3QgPSBhcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubmF0aW9uYWxBZGRpdGlvbmFsQ29kZSA9IGFwcGxpY2FibGVOYXRpb25hbEFkZGl0aW9uYWxDb2RlLnR5cGUgKyBhcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZS5jb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZUR1dHkoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2UucHVibGlzaCgnc3VibWl0LWNhbGN1bGF0ZS1kdXR5Jyk7XHJcbiAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdzdWJtaXQtY2FsY3VsYXRlLWR1dHknKTtcclxuICAgICAgICB2bS5kdXR5Q2FsY3VsYXRpb25SZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIHZtLmR1dHlDYWxjdWxhdGlvbkVycm9ycyA9IG51bGw7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nLmR1dHlDYWxjdWxhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgdmFyIGFkZGl0aW9uYWxDb2RlcyA9IGNvbGxlY3RBZGRpdGlvbmFsQ29kZXMoKTtcclxuICAgICAgICBpZiAodm0uZHV0eU1lYXN1cmVUeXBlKSB7XHJcbiAgICAgICAgICAgIHZhciBkdXR5TWVhc3VyZVR5cGVJZCA9IHZtLmR1dHlNZWFzdXJlVHlwZS5pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGdlcm1hbkV4Y2lzZUNvZGUgPSB2bS5lenRFeGNpc2VDb2RlID8gdm0uZXp0RXhjaXNlQ29kZS5JZCA6IG51bGw7XHJcblxyXG4gICAgICAgIGlmICghdm0ub3V0cHV0Q3VycmVuY3kpIHtcclxuICAgICAgICAgICAgdm0ub3V0cHV0Q3VycmVuY3kgPSBfLmZpbmQodm0ucG9zc2libGVVbml0c0ZvckN1cnJlbmN5Q29udmVyc2lvbiwgZnVuY3Rpb24gKGN1cnJlbmN5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVuY3kuY29kZSA9PT0gdm0ubW9uZXRhcnlVbml0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBxdWVyeSA9IHtcclxuICAgICAgICAgICAgY2VydGlmaWNhdGVDb2Rlczogdm0uY2VydGlmaWNhdGVDb2RlcyxcclxuICAgICAgICAgICAgY29tbW9kaXR5Q29kZTogdm0uZ29vZC5nZW5lcmFsSW5mby5jb2RlLFxyXG4gICAgICAgICAgICBjdXJyZW5jeUNvZGU6IHZtLm91dHB1dEN1cnJlbmN5LmNvZGUsXHJcbiAgICAgICAgICAgIGFkZGl0aW9uYWxDb2RlczogYWRkaXRpb25hbENvZGVzLFxyXG4gICAgICAgICAgICBwcmVmZXJlbmNlQ29kZTogdm0ucHJlZmVyZW5jZUNvZGUsXHJcbiAgICAgICAgICAgIHVjY01vZGVFbmFibGVkOiB2bS5zdGF0ZS51Y2NNb2RlRW5hYmxlZCxcclxuICAgICAgICAgICAgY3VzdG9tc1ZhbHVlOiB2bS5jdXN0b21zVmFsdWUsXHJcbiAgICAgICAgICAgIGR1dHlNZWFzdXJlVHlwZUlkOiBkdXR5TWVhc3VyZVR5cGVJZCxcclxuICAgICAgICAgICAgb3JkZXJOdW1iZXI6IHZtLm9yZGVyTnVtYmVyLFxyXG4gICAgICAgICAgICBxdWFudGl0aWVzOiB2bS5xdWFudGl0aWVzLFxyXG4gICAgICAgICAgICBjb3VudHJ5T2ZPcmlnaW46IHN0YXRlLmZpbHRlci5jb3VudHJ5Q29kZSxcclxuICAgICAgICAgICAgZ2VybWFuTmF0aW9uYWxDb21tb2RpdHlDb2RlOiB2bS5jdXJyZW50RXp0TmF0aW9uYWxDb21tb2RpdHlDb2RlLFxyXG4gICAgICAgICAgICBnZXJtYW5FeGNpc2VDb2RlOiBnZXJtYW5FeGNpc2VDb2RlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS52YWxpZGF0aW9uRXJyb3JzID0ge1xyXG4gICAgICAgICAgICBxdWFudGl0aWVzOiB7fVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2hlY2tDdXN0b21zVmFsdWUoKTtcclxuICAgICAgICByZXR1cm4gZHV0eURhdGFTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5jYWxjdWxhdGVEdXR5KHF1ZXJ5KVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzaG91bGRGaWx0ZXJNZWFzdXJlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nLmR1dHlDYWxjdWxhdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLmFwcGxpY2FibGVBbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2Rlcy5sZW5ndGggPiAwICYmICF2bS5hbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkRmlsdGVyTWVhc3VyZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEFudGlEdW1waW5nQWRkaXRpb25hbENvZGVUb0RlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2V0QnJpdGlzaFZhdENvZGVUb09ubHlQb3NzaWJsZVZhbHVlSWZOZWNlc3NhcnkoKTtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5wb3NzaWJsZVByZWZlcmVuY2VDb2Rlcy5sZW5ndGggPiAwICYmICF2bS5wcmVmZXJlbmNlQ29kZSAmJiAhdm0uZHV0eU1lYXN1cmVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkRmlsdGVyTWVhc3VyZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFByZWZlcmVuY2VDb2RlVG9EZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRGaWx0ZXJNZWFzdXJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlck1lYXN1cmVzKCkudGhlbihmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5kdXR5Q2FsY3VsYXRpb25SZXN1bHQgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5kdXR5Q2FsY3VsYXRpb25SZXN1bHQgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZXJyb3IuZGF0YS5FcnJvcnMsIGZ1bmN0aW9uKGVycm9yTWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLkNvZGUuaW5kZXhPZignY3VzdG9tc192YWx1ZScpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0udmFsaWRhdGlvbkVycm9ycy5jdXN0b21zVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yTWVzc2FnZS5Db2RlLmluZGV4T2YoJ2NvdW50cnlfb2Zfb3JpZ2luJykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS52YWxpZGF0aW9uRXJyb3JzLmNvdW50cnlPZk9yaWdpbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3JNZXNzYWdlLkNvZGUgPT09ICdxdWFudGl0eV9taXNzaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVuaXRQbHVzUXVhbnRpZmllciA9IGVycm9yTWVzc2FnZS5NZXNzYWdlLnNwbGl0KCcgKCcpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0udmFsaWRhdGlvbkVycm9ycy5xdWFudGl0aWVzW3VuaXRQbHVzUXVhbnRpZmllcl0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhjbHVkZSByZXRhaWwgcHJpY2UgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pdFBsdXNRdWFudGlmaWVyICE9PSAnMDAzJyAmJiB1bml0UGx1c1F1YW50aWZpZXIgIT09ICdSRVQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0udmFsaWRhdGlvbkVycm9ycy5oYXNRdWFudGl0aWVzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yTWVzc2FnZS5Db2RlID09PSAncXVhbnRpdGllc19wYXJzZV9lcnJvcicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlUGFydHMgPSBlcnJvck1lc3NhZ2UuTWVzc2FnZS5zcGxpdCgnICcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVuaXRQbHVzUXVhbnRpZmllcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlUGFydHNbbWVzc2FnZVBhcnRzLmxlbmd0aCAtIDFdLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRQbHVzUXVhbnRpZmllciA9IG1lc3NhZ2VQYXJ0c1ttZXNzYWdlUGFydHMubGVuZ3RoIC0gMl0gKyAnICcgKyBtZXNzYWdlUGFydHNbbWVzc2FnZVBhcnRzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdFBsdXNRdWFudGlmaWVyID0gbWVzc2FnZVBhcnRzW21lc3NhZ2VQYXJ0cy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLnZhbGlkYXRpb25FcnJvcnMucXVhbnRpdGllc1t1bml0UGx1c1F1YW50aWZpZXJdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgcmV0YWlsIHByaWNlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXRQbHVzUXVhbnRpZmllciAhPT0gJzAwMycgJiYgdW5pdFBsdXNRdWFudGlmaWVyICE9PSAnUkVUJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLnZhbGlkYXRpb25FcnJvcnMuaGFzUXVhbnRpdGllc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlcnJvck1lc3NhZ2UuQ29kZSA9PT0gJ2FkZGl0aW9uYWxfY29kZV92YWxpZGF0aW9uX2Vycm9yJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0udmFsaWRhdGlvbkVycm9ycy5hZGRpdGlvbmFsQ29kZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yTWVzc2FnZS5Db2RlLmluZGV4T2YoJ29yZGVyX251bWJlcicpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLnZhbGlkYXRpb25FcnJvcnMub3JkZXJOdW1iZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29kZS5pbmRleE9mKCdkdXR5X21lYXN1cmVfbm90X3VuaXF1ZV9mb3JfcHJlZmVyZW5jZWNvZGUnKSAhPT0gLTEgfHwgZXJyb3JNZXNzYWdlLkNvZGUuaW5kZXhPZignYWRkX2R1dHlfbWVhc3VyZV9pZF9mb3JfZW5kX3VzZV9jaG9pY2UnKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLnZhbGlkYXRpb25FcnJvcnMuZHV0eU1lYXN1cmVOb3RVbmlxdWVGb3JQcmVmZXJlbmNlQ29kZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db2RlLmluZGV4T2YoJ2dlcm1hbl9uYXRpb25hbF9jb21tb2RpdHlfY29kZScpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0udmFsaWRhdGlvbkVycm9ycy5nZXJtYW5OYXRpb25hbENvbW1vZGl0eUNvZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29kZS5pbmRleE9mKCdnZXJtYW5fZXhjaXNlX2NvZGUnKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLnZhbGlkYXRpb25FcnJvcnMuZ2VybWFuRXhjaXNlQ29kZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db2RlID09PSAndW5zdXBwb3J0ZWRfZHV0eV9leHByZXNzaW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZHV0eUNhbGN1bGF0aW9uRXJyb3JzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkRHV0eUV4cHJlc3Npb246IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nLmR1dHlDYWxjdWxhdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmaWx0ZXJNZWFzdXJlcygpIHtcclxuICAgICAgICB2YXIgc3RhcnQgPSBtb21lbnQoKTtcclxuICAgICAgICB2bS5pc0xvYWRpbmcubWVhc3VyZXMgPSB0cnVlO1xyXG4gICAgICAgIHZtLnZhbGlkYXRpb25FcnJvcnMgPSB7XHJcbiAgICAgICAgICAgIHF1YW50aXRpZXM6IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5kdXR5Q2FsY3VsYXRpb25SZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIHZtLmR1dHlDYWxjdWxhdGlvbkVycm9ycyA9IG51bGw7XHJcbiAgICAgICAgLy8gTkI6IHdlIGFkZCBhIHRpbWVvdXQgaGVyZSwgc28gdGhhdCB0aGUgbG9hZGluZyBpbmRpY2F0b3Igc2hvd3MgYmVmb3JlIGFuZ3VsYXJqcyBnZXRzIGJ1c3lcclxuICAgICAgICAvLyByZW5kZXJpbmcgdGhlIG1lYXN1cmVzXHJcbiAgICAgICByZXR1cm4gJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5nb29kLm1lYXN1cmVzID0gZ29vZE1vZGVsc1NlcnZpY2UubWVhc3VyZXNEaXNwbGF5TW9kZWwoKTtcclxuICAgICAgICAgICAgcmV0dXJuICRxLmFsbChbXHJcbiAgICAgICAgICAgICAgICBsb2FkTWVhc3VyZXMoc3RhdGUuZmlsdGVyLmNvdW50cnlDb2RlKSxcclxuICAgICAgICAgICAgICAgIGxvYWRVbml0cygpXHJcbiAgICAgICAgICAgIF0pLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZy5tZWFzdXJlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVuY29tbWVudCB0aGlzIHRvIHNlZSBob3cgbG9uZyBpdCB0YWtlcyB0byByZW5kZXIgbWVhc3VyZXMgd2hlbiBzd2l0Y2hpbmcgY291bnRyeVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG1vbWVudCgpLmRpZmYoc3RhcnQsICdzZWNvbmRzJywgdHJ1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdnb29kc1ZNJywgdm0pO1xyXG4gICAgICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIDApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZpbHRlck1lYXN1cmVzQnlDb3VudHJ5KCkge1xyXG4gICAgICAgIHZhciBzdGFydCA9IG1vbWVudCgpO1xyXG4gICAgICAgIHZtLmlzTG9hZGluZy5tZWFzdXJlcyA9IHRydWU7XHJcbiAgICAgICAgdm0udmFsaWRhdGlvbkVycm9ycyA9IHtcclxuICAgICAgICAgICAgcXVhbnRpdGllczoge31cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmR1dHlDYWxjdWxhdGlvblJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgLy8gTkI6IHdlIGFkZCBhIHRpbWVvdXQgaGVyZSwgc28gdGhhdCB0aGUgbG9hZGluZyBpbmRpY2F0b3Igc2hvd3MgYmVmb3JlIGFuZ3VsYXJqcyBnZXRzIGJ1c3lcclxuICAgICAgICAvLyByZW5kZXJpbmcgdGhlIG1lYXN1cmVzXHJcbiAgICAgICAgcmV0dXJuICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uZ29vZC5tZWFzdXJlcyA9IGdvb2RNb2RlbHNTZXJ2aWNlLm1lYXN1cmVzRGlzcGxheU1vZGVsKCk7XHJcbiAgICAgICAgICAgIHJldHVybiAkcS5hbGwoW1xyXG4gICAgICAgICAgICAgICAgbG9hZE1lYXN1cmVzKHN0YXRlLmZpbHRlci5jb3VudHJ5Q29kZSksXHJcbiAgICAgICAgICAgICAgICBsb2FkVW5pdHMoKVxyXG4gICAgICAgICAgICBdKS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nLm1lYXN1cmVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVuY29tbWVudCB0aGlzIHRvIHNlZSBob3cgbG9uZyBpdCB0YWtlcyB0byByZW5kZXIgbWVhc3VyZXMgd2hlbiBzd2l0Y2hpbmcgY291bnRyeVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG1vbWVudCgpLmRpZmYoc3RhcnQsICdzZWNvbmRzJywgdHJ1ZSkpO1xyXG4gICAgICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ29Ub05vbWVuY2xhdHVyZShnb29kc25vbWlkLCBpbmRlbnRhdGlvbikge1xyXG4gICAgICAgIHZhciBzZWxlY3Rpb24gPSAkd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIHZhciB0ZXh0SXNTZWxlY3RlZCA9IHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgaWYgKHRleHRJc1NlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5lbXB0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc3RhdGUuY3VycmVudENvZGUgPSBnb29kc25vbWlkO1xyXG4gICAgICAgICAgICBzdGF0ZS5jdXJyZW50SW5kZW50YXRpb24gPSBpbmRlbnRhdGlvbjtcclxuICAgICAgICAgICAgc3RhdGUubmF2aWdhdGluZ0Zyb21NZWFzdXJlc1BhZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAkbG9jYXRpb24udXJsKCcvc2VhcmNoLycgKyBnb29kc25vbWlkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGF0ZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnVybCgnL3NlYXJjaC8nICsgdm0uZ29vZC5nZW5lcmFsSW5mby5jb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkRWNpY3NDb3VudChnb29kc0NvZGUpIHtcclxuICAgICAgICByZXR1cm4gZWNpY3NEYXRhU2VydmljZS5jb3VudEZvckdvb2RzQ29kZShnb29kc0NvZGUpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKG51bWJlck9mRWNpY3NJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgdm0ubnVtYmVyT2ZFY2ljc0l0ZW1zID0gbnVtYmVyT2ZFY2ljc0l0ZW1zO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgdmVyYnJ1aWtzYmVsYXN0aW5nSGVhZGluZ3MgPSBbJzIwMDknLCAnMjEwNicsICcyMjAxJywgJzIyMDInXTtcclxuICAgIGZ1bmN0aW9uIHNob3dWZXJicnVpa3NiZWxhc3RpbmdXYXJuaW5nKCkge1xyXG4gICAgICAgIHJldHVybiBtb21lbnQoc3RhdGUuZmlsdGVyLmRhdGUpLnllYXIoKSA8PSAyMDE5ICYmXHJcbiAgICAgICAgICAgIHN0YXRlLmZpbHRlciAmJlxyXG4gICAgICAgICAgICBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9PT0gJ05MJyAmJlxyXG4gICAgICAgICAgICB2ZXJicnVpa3NiZWxhc3RpbmdIZWFkaW5ncy5pbmRleE9mKHZtLmdvb2QuZ2VuZXJhbEluZm8uY29kZS5zdWJzdHJpbmcoMCwgNCkpID4gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0TW9uZXRhcnlVbml0KCkge1xyXG4gICAgICAgIGlmIChzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9PT0gJ0dCJyAmJiBtb21lbnQoc3RhdGUuZmlsdGVyLmRhdGUpLmlzQWZ0ZXIoJzIwMjEtMDEtMDEnKSkge1xyXG4gICAgICAgICAgICB2bS5tb25ldGFyeVVuaXQgPSAnR0JQJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLm1vbmV0YXJ5VW5pdCA9ICdFVVInO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2bS5jdXN0b21zVmFsdWUudW5pdCA9IHZtLm1vbmV0YXJ5VW5pdDtcclxuICAgICAgICB2bS5jdXN0b21zVmFsdWUub3JpZ2luYWxVbml0ID0gdm0ubW9uZXRhcnlVbml0O1xyXG4gICAgICAgIHZtLmN1c3RvbXNWYWx1ZS5leGNoYW5nZVJhdGUgPSAxO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIGlmIChzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9PSAnQ0gnKSB7XHJcbiAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCcvdGFyZXMtbWVhc3VyZXMvJyArICRyb3V0ZVBhcmFtcy5nb29kc25vbSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9zaG93LW1lYXN1cmVzJyk7XHJcbiAgICAgICAgY29tbW9uLmF1dGguY2hlY2soKTtcclxuICAgICAgICBpZiAoJGxvY2F0aW9uLnNlYXJjaCgpLmNvdW50cnkpIHtcclxuICAgICAgICAgICAgdm0uc3RhdGUuZmlsdGVyLmNvdW50cnlDb2RlID0gJGxvY2F0aW9uLnNlYXJjaCgpLmNvdW50cnk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoJHJvdXRlUGFyYW1zLmdvb2Rzbm9tICE9PSBudWxsICYmICRyb3V0ZVBhcmFtcy5nb29kc25vbSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgY2xlYXJHb29kKCk7XHJcbiAgICAgICAgICAgIHZtLmdvb2QuZ2VuZXJhbEluZm8uY29kZSA9ICRyb3V0ZVBhcmFtcy5nb29kc25vbTtcclxuICAgICAgICAgICAgc3RhdGUuY3VycmVudENvZGUgPSB2bS5nb29kLmdlbmVyYWxJbmZvLmNvZGU7XHJcbiAgICAgICAgICAgIHNldE1vbmV0YXJ5VW5pdCgpO1xyXG4gICAgICAgICAgICB0cmFuc2FjdGlvblZhbHVlRGF0YVNlcnZpY2UuaW5pdFRyYW5zYWN0aW9uVmFsdWUoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdGF0ZS5maWx0ZXIubW92ZW1lbnQgPT09ICdpbXBvcnQnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGltcG9ydFByb21pc2VzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIGxvYWREZXNjcmlwdGlvbih2bS5nb29kLmdlbmVyYWxJbmZvLmNvZGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRHb29kKHZtLmdvb2QuZ2VuZXJhbEluZm8uY29kZSwgdm0ubmF0aW9uYWxBZGRpdGlvbmFsQ29kZSwgdm0ubWV1cnNpbmdBZGRpdGlvbmFsQ29kZSwgdm0ub3V0cHV0Q3VycmVuY3kpLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvYWROb21lbmNsYXR1cmVHcm91cHMoJHJvdXRlUGFyYW1zLmdvb2Rzbm9tKSxcclxuICAgICAgICAgICAgICAgICAgICBsb2FkU2VjdGlvbih2bS5nb29kLmdlbmVyYWxJbmZvLmNvZGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRPcHRpb25hbE5hdGlvbmFsQWRkaXRpb25hbENvZGVzKCksXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZEFkZGl0aW9uYWxDb2RlVHlwZXMoKSxcclxuICAgICAgICAgICAgICAgICAgICBsb2FkUHJlZmVyZW5jZUNvZGVzKCksXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZFVuaXRzKCksXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZEVjaWNzQ291bnQodm0uZ29vZC5nZW5lcmFsSW5mby5jb2RlKVxyXG4gICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5zdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9PT0gJ0RFJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydFByb21pc2VzLnB1c2gobG9hZEdlcm1hbk5hdGlvbmFsTm9tZW5jbGF0dXJlKHZtLmdvb2QuZ2VuZXJhbEluZm8uY29kZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydFByb21pc2VzLnB1c2gobG9hZEV6dEhpbndlaXNlKHZtLmdvb2QuZ2VuZXJhbEluZm8uY29kZSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICRxLmFsbChpbXBvcnRQcm9taXNlcyk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLmZpbHRlci5tb3ZlbWVudCA9PT0gJ2V4cG9ydCcpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZXhwb3J0UHJvbWlzZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZERlc2NyaXB0aW9uKHZtLmdvb2QuZ2VuZXJhbEluZm8uY29kZSksXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZEdvb2Qodm0uZ29vZC5nZW5lcmFsSW5mby5jb2RlLCB2bS5uYXRpb25hbEFkZGl0aW9uYWxDb2RlLCB2bS5tZXVyc2luZ0FkZGl0aW9uYWxDb2RlLCB2bS5vdXRwdXRDdXJyZW5jeSksXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZE5vbWVuY2xhdHVyZUdyb3Vwcygkcm91dGVQYXJhbXMuZ29vZHNub20pLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRTZWN0aW9uKHZtLmdvb2QuZ2VuZXJhbEluZm8uY29kZSksXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZEFkZGl0aW9uYWxDb2RlVHlwZXMoKSxcclxuICAgICAgICAgICAgICAgICAgICBsb2FkVW5pdHMoKSxcclxuICAgICAgICAgICAgICAgICAgICBsb2FkRWNpY3NDb3VudCh2bS5nb29kLmdlbmVyYWxJbmZvLmNvZGUpXHJcbiAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLnN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID09PSAnREUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhwb3J0UHJvbWlzZXMucHVzaChsb2FkRXp0SGlud2Vpc2Uodm0uZ29vZC5nZW5lcmFsSW5mby5jb2RlKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkcS5hbGwoZXhwb3J0UHJvbWlzZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAkbG9jYXRpb24udXJsKCcnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2Uuc3Vic2NyaWJlKCdmaWx0ZXJfbW92ZW1lbnRfY2hhbmdlZCcsIG1vdmVtZW50Q2hhbmdlZCk7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2Uuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnN1YnNjcmliZSgnbGFuZ3VhZ2VfY2hhbmdlZCcsIGxhbmd1YWdlQ2hhbmdlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZEV6dEhpbndlaXNlKGNvbW1vZGl0eUNvZGUpIHtcclxuICAgICAgICBlenREYXRhU2VydmljZS5sb2FkRXp0SGlud2Vpc2UoY29tbW9kaXR5Q29kZSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGV6dEhpbndlaXNlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5lenRIaW53ZWlzZSA9IGV6dEhpbndlaXNlO1xyXG4gICAgICAgICAgICAgICAgdm0uZXhjaXNlSGlud2Vpc2UgPSBfLmZpbHRlcih2bS5lenRIaW53ZWlzZSwgZnVuY3Rpb24gKGhpbndlaXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhpbndlaXNlLlNob3J0RGVzY3JpcHRpb24gPT09ICdWU1QnO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uZXhjaXNlSGlud2Vpc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZXhjaXNlVHlwZUlkcyA9IF8ubWFwKHZtLmV4Y2lzZUhpbndlaXNlLCBmdW5jdGlvbihoaW53ZWlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoaW53ZWlzLkhpbndlaXNlSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICBsb2FkRXp0RXhjaXNlTm9tZW5jbGF0dXJlKGV4Y2lzZVR5cGVJZHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkR2VybWFuTmF0aW9uYWxOb21lbmNsYXR1cmUoY29tbW9kaXR5Q29kZSkge1xyXG4gICAgICAgIGV6dERhdGFTZXJ2aWNlLmxvYWRFenROb21lbmNsYXR1cmUoY29tbW9kaXR5Q29kZSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGV6dE5vbWVuY2xhdHVyZSkge1xyXG4gICAgICAgICAgICAgICAgdm0uZXp0Tm9tZW5jbGF0dXJlID0gZXp0Tm9tZW5jbGF0dXJlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLmV6dE5vbWVuY2xhdHVyZSAmJiB2bS5lenROb21lbmNsYXR1cmUubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uY3VycmVudEV6dE5hdGlvbmFsQ29tbW9kaXR5Q29kZSA9IHZtLmV6dE5vbWVuY2xhdHVyZVswXS5Db21tb2RpdHlDb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWxlY3RFenROb21lbmNsYXR1cmUoY29tbW9kaXR5Q29kZSkge1xyXG4gICAgICAgIHZtLmN1cnJlbnRFenROYXRpb25hbENvbW1vZGl0eUNvZGUgPSBjb21tb2RpdHlDb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRFenRFeGNpc2VOb21lbmNsYXR1cmUoZXhjaXNlVHlwZUlkcykge1xyXG4gICAgICAgIHZtLmV6dEV4Y2lzZU5vbWVuY2xhdHVyZSA9IFtdO1xyXG4gICAgICAgIF8uZm9yRWFjaChleGNpc2VUeXBlSWRzLCBmdW5jdGlvbiAoZXhjaXNlVHlwZUlkKSB7XHJcbiAgICAgICAgICAgIGV6dERhdGFTZXJ2aWNlLmxvYWRFenRFeGNpc2VOb21lbmNsYXR1cmUoZXhjaXNlVHlwZUlkKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGV6dEV4Y2lzZU5vbWVuY2xhdHVyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmV6dEV4Y2lzZU5vbWVuY2xhdHVyZSA9IF8uY2hhaW4odm0uZXp0RXhjaXNlTm9tZW5jbGF0dXJlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGV6dEV4Y2lzZU5vbWVuY2xhdHVyZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnRCeSgnSWQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG9uQ2hhbmdlRXp0RXhjaXNlQ29kZShlenRFeGNpc2VDb2RlKSB7XHJcbiAgICAgICAgdm0uZXp0RXhjaXNlQ29kZSA9IGV6dEV4Y2lzZUNvZGU7XHJcbiAgICAgICAgbG9hZFVuaXRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZFVuaXRzKCkge1xyXG4gICAgICAgIHZtLmlzTG9hZGluZ1VuaXRzID0gdHJ1ZTtcclxuICAgICAgICB2YXIgYWRkaXRpb25hbENvZGVzID0gY29sbGVjdEFkZGl0aW9uYWxDb2RlcygpO1xyXG4gICAgICAgIHZhciBnZXJtYW5FeGNpc2VDb2RlID0gdm0uZXp0RXhjaXNlQ29kZSA/IHZtLmV6dEV4Y2lzZUNvZGUuSWQgOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gZHV0eURhdGFTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5nZXRVbml0cyh2bS5nb29kLmdlbmVyYWxJbmZvLmNvZGUsIGFkZGl0aW9uYWxDb2Rlcywgdm0ucHJlZmVyZW5jZUNvZGUsIGdlcm1hbkV4Y2lzZUNvZGUsIHZtLnN0YXRlLnVjY01vZGVFbmFibGVkKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodW5pdHMpIHtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZ1VuaXRzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV3UXVhbnRpdGllcyA9Xy5tYXAodW5pdHMsIGZ1bmN0aW9uKHVuaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb2xkUXVhbnRpdHkgPSBfLmZpbmQodm0ucXVhbnRpdGllcywgZnVuY3Rpb24gKHF1YW50aXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWFudGl0eS5Vbml0LmNvZGUgPT09IHVuaXQuVW5pdC5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXF1YW50aXR5LlF1YWxpZmllciAmJiAhdW5pdC5RdWFsaWZpZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWFudGl0eS5RdWFsaWZpZXIgJiYgdW5pdC5RdWFsaWZpZXIgJiYgcXVhbnRpdHkuUXVhbGlmaWVyLmNvZGUgPT09IHVuaXQuUXVhbGlmaWVyLmNvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFF1YW50aXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXQuQW1vdW50ID0gb2xkUXVhbnRpdHkuQW1vdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdC5BbW91bnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5pdDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdm0ucXVhbnRpdGllcyA9IG5ld1F1YW50aXRpZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRQcmVmZXJlbmNlQ29kZXMoKSB7XHJcbiAgICAgICAgdmFyIHEgPSAkcS5kZWZlcigpO1xyXG4gICAgICAgIGlmICghdm0ucHJlZmVyZW5jZUNvZGVUeXBlcyB8fCB2bS5wcmVmZXJlbmNlQ29kZVR5cGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBwcmVmZXJlbmNlQ29kZURhdGFTZXJ2aWNlLmdldERlc2NyaXB0aW9ucygpLnRoZW4gKGZ1bmN0aW9uIChwcmVmZXJlbmNlQ29kZXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHByZWxvYWRlZCBjb2RlcyBzaG91bGQgYmUgc3RvcmVkIGluIGEgc2VydmljZVxyXG4gICAgICAgICAgICAgICAgdm0ucHJlZmVyZW5jZUNvZGVzID0gXy5rZXlCeShwcmVmZXJlbmNlQ29kZXMsICdjb2RlJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh2bS5wcmVmZXJlbmNlQ29kZVR5cGVzKTtcclxuICAgICAgICAgICAgICAgIHEucmVzb2x2ZShwcmVmZXJlbmNlQ29kZXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHEucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkQWRkaXRpb25hbENvZGVUeXBlcygpIHtcclxuICAgICAgICB2YXIgcSA9ICRxLmRlZmVyKCk7XHJcbiAgICAgICAgaWYgKCF2bS5hZGRpdGlvbmFsQ29kZVR5cGVzIHx8IHZtLmFkZGl0aW9uYWxDb2RlVHlwZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGFkZGl0aW9uYWxDb2Rlc0RhdGFTZXJ2aWNlLmdldFR5cGVzKCkudGhlbiAoZnVuY3Rpb24gKGFkZGl0aW9uYWxDb2RlVHlwZXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHByZWxvYWRlZCBjb2RlcyBzaG91bGQgYmUgc3RvcmVkIGluIGEgc2VydmljZVxyXG4gICAgICAgICAgICAgICAgdm0uYWRkaXRpb25hbENvZGVUeXBlcyA9IF8ua2V5QnkoYWRkaXRpb25hbENvZGVUeXBlcywgJ2NvZGUnKTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHZtLmFkZGl0aW9uYWxDb2RlVHlwZXMpO1xyXG4gICAgICAgICAgICAgICAgcS5yZXNvbHZlKGFkZGl0aW9uYWxDb2RlVHlwZXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHEucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkT3B0aW9uYWxOYXRpb25hbEFkZGl0aW9uYWxDb2RlcygpIHtcclxuICAgICAgICB2YXIgcSA9ICRxLmRlZmVyKCk7XHJcbiAgICAgICAgaWYgKHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID09PSAnTkwnKSB7XHJcbiAgICAgICAgICAgIGlmICghdm0ub3B0aW9uYWxOYXRpb25hbEFkZGl0aW9uYWxDb2RlcyB8fCB2bS5vcHRpb25hbE5hdGlvbmFsQWRkaXRpb25hbENvZGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1vbWVudChzdGF0ZS5maWx0ZXIuZGF0ZSkuaXNCZWZvcmUoJzIwMTktMTEtMzAnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICRxLmFsbChbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxDb2Rlc0RhdGFTZXJ2aWNlLmdldEJ5VHlwZSgnVCcpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQ29kZXNEYXRhU2VydmljZS5nZXRCeVR5cGUoJ1YnKVxyXG4gICAgICAgICAgICAgICAgICAgIF0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbENvZGVzID0gXy5jb25jYXQocmVzdWx0c1swXSwgcmVzdWx0c1sxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHByZWxvYWRlZCBjb2RlcyBzaG91bGQgYmUgc3RvcmVkIGluIGEgc2VydmljZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5vcHRpb25hbE5hdGlvbmFsQWRkaXRpb25hbENvZGVzID0gYWRkaXRpb25hbENvZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxLnJlc29sdmUoYWRkaXRpb25hbENvZGVzKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbENvZGVzRGF0YVNlcnZpY2UuZ2V0QnlUeXBlKCdWJykudGhlbiAoZnVuY3Rpb24gKGFkZGl0aW9uYWxDb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBwcmVsb2FkZWQgY29kZXMgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ub3B0aW9uYWxOYXRpb25hbEFkZGl0aW9uYWxDb2RlcyA9IGFkZGl0aW9uYWxDb2RlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgcS5yZXNvbHZlKGFkZGl0aW9uYWxDb2Rlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHEucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkU2VjdGlvbihnb29kc0NvZGUpIHtcclxuICAgICAgICByZXR1cm4gbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2UuZ2V0U2VjdGlvbkZvckNvbW1vZGl0eUNvZGUoZ29vZHNDb2RlKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoc2VjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdm0uc2VjdGlvbiA9IHNlY3Rpb247XHJcbiAgICAgICAgICAgICAgICB2bS5jaGFwdGVyID0gXy5maW5kKHNlY3Rpb24uY2hhcHRlcnMsIGZ1bmN0aW9uIChjaGFwdGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXB0ZXIuY29kZSA9PT0gZ29vZHNDb2RlLnN1YnN0cmluZygwLCAyKSArICcwMDAwMDAwMCc7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZERlc2NyaXB0aW9uKGdvb2RzY29kZSkge1xyXG4gICAgICAgIHJldHVybiBub21lbmNsYXR1cmVEYXRhU2VydmljZS5sb2FkRGVzY3JpcHRpb24oZ29vZHNjb2RlKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbihkZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGVudGF0aW9uID0gZGVzY3JpcHRpb24ubGluZXNbZGVzY3JpcHRpb24ubGluZXMubGVuZ3RoIC0gMV0uaW5kZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmdvb2QuZ2VuZXJhbEluZm8uZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZy5nZW5lcmFsSW5mbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgICAgICAgIGlmICghZXJyLmlzQWJvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNlbnRyeS5jYXB0dXJlRXhjZXB0aW9uKGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VudHJ5LmNhcHR1cmVNZXNzYWdlKGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsYW5ndWFnZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgaWYgKHZtLmdvb2QuZ2VuZXJhbEluZm8uY29kZSkge1xyXG4gICAgICAgICAgICBsb2FkR29vZCh2bS5nb29kLmdlbmVyYWxJbmZvLmNvZGUsIHZtLm5hdGlvbmFsQWRkaXRpb25hbENvZGUsIHZtLm1ldXJzaW5nQWRkaXRpb25hbENvZGUsIHZtLm91dHB1dEN1cnJlbmN5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU3Vic2NyaWJlIHRvIHRoZSBsYW5ndWFnZUNoYW5nZWQgZXZlbnQgdG8gcmVsb2FkIHRoZSBkYXRhXHJcbiAgICBmdW5jdGlvbiBkZXRhY2hlZCgpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS51bnN1YnNjcmliZSgnZmlsdGVyX21vdmVtZW50X2NoYW5nZWQnLCBtb3ZlbWVudENoYW5nZWQpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnVuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnVuc3Vic2NyaWJlKCdsYW5ndWFnZV9jaGFuZ2VkJywgbGFuZ3VhZ2VDaGFuZ2VkKTtcclxuICAgICAgICBpZiAoIXN0YXRlLnJlbWVtYmVyLmNvdW50cnkgJiYgISRsb2NhdGlvbi5zZWFyY2goKS5jb3VudHJ5KSB7XHJcbiAgICAgICAgICAgIHN0YXRlLmZpbHRlci5jb3VudHJ5TmFtZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHN0YXRlLmZpbHRlci5jb3VudHJ5Q29kZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyR29vZCgpIHtcclxuICAgICAgICB2bS5nb29kID0ge1xyXG4gICAgICAgICAgICBnZW5lcmFsSW5mbzoge1xyXG4gICAgICAgICAgICAgICAgY29kZTogJydcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbWVhc3VyZXM6IG5ldyBnb29kTW9kZWxzU2VydmljZS5tZWFzdXJlc0Rpc3BsYXlNb2RlbCgpLFxyXG4gICAgICAgICAgICBub21lbmNsYXR1cmVHcm91cHM6IFtdXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5jdXN0b21zVmFsdWVDaGVja1Jlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgdm0uYW50aUR1bXBpbmdBZGRpdGlvbmFsQ29kZSA9IG51bGw7XHJcbiAgICAgICAgdm0ub3RoZXJBZGRpdGlvbmFsVGFyaWNDb2RlcyA9IHt9O1xyXG4gICAgICAgIHZtLm1ldXJzaW5nQWRkaXRpb25hbENvZGUgPSBudWxsO1xyXG4gICAgICAgIHZtLm5hdGlvbmFsQWRkaXRpb25hbENvZGUgPSBudWxsO1xyXG4gICAgICAgIHZtLm5hdGlvbmFsQWRkaXRpb25hbENvZGVPYmplY3QgPSBudWxsO1xyXG4gICAgICAgIHZtLnNlY29uZE5hdGlvbmFsQWRkaXRpb25hbENvZGVPYmplY3QgPSBudWxsO1xyXG4gICAgICAgIHZtLm9yZGVyTnVtYmVyID0gbnVsbDtcclxuICAgICAgICB2bS5wcmVmZXJlbmNlQ29kZSA9IG51bGw7XHJcbiAgICAgICAgdm0uZXp0Tm9tZW5jbGF0dXJlID0gbnVsbDtcclxuICAgICAgICB2bS5lenRIaW5XZWlzZSA9IG51bGw7XHJcbiAgICAgICAgdm0uZXp0RXhjaXNlSGlud2Vpc2UgPSBudWxsO1xyXG4gICAgICAgIHZtLmN1cnJlbnRFenROYXRpb25hbENvbW1vZGl0eUNvZGUgPSBudWxsO1xyXG4gICAgICAgIHZtLmV6dEV4Y2lzZU5vbWVuY2xhdHVyZSA9IG51bGw7XHJcbiAgICAgICAgdm0uZXp0RXhjaXNlQ29kZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYW5BZGRpdGlvbmFsQ29kZUhhc0JlZW5TZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuICEhdm0ubmF0aW9uYWxBZGRpdGlvbmFsQ29kZU9iamVjdCB8fCAhIXZtLnNlY29uZE5hdGlvbmFsQWRkaXRpb25hbENvZGVPYmplY3QgfHwgXHJcbiAgICAgICAgICAgICAgICEhdm0ubWV1cnNpbmdBZGRpdGlvbmFsQ29kZSB8fCAhIXZtLmFudGlEdW1waW5nQWRkaXRpb25hbENvZGUgfHxcclxuICAgICAgICAgICAgICAgIF8uc29tZSh2bS5vdGhlckFwcGxpY2FibGVBZGRpdGlvbmFsVGFyaWNDb2RlcywgZnVuY3Rpb24oYXBwbGljYWJsZUNvZGVzR3JvdXBlZEJ5VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXZtLm90aGVyQWRkaXRpb25hbFRhcmljQ29kZXNbYXBwbGljYWJsZUNvZGVzR3JvdXBlZEJ5VHlwZS50eXBlXTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRHb29kKGdvb2Rzbm9tLCBuYXRpb25hbEFkZGl0aW9uYWxDb2RlLCBtZXVyc2luZ0FkZGl0aW9uYWxDb2RlLCBjdXJyZW5jeSkge1xyXG4gICAgICAgIHZtLmlzTG9hZGluZy5nZW5lcmFsSW5mbyA9IHRydWU7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nLm1lYXN1cmVzID0gdHJ1ZTtcclxuICAgICAgICB2bS5nb29kLm1lYXN1cmVzID0gbmV3IGdvb2RNb2RlbHNTZXJ2aWNlLm1lYXN1cmVzRGlzcGxheU1vZGVsKCk7XHJcbiAgICAgICAgZ29vZERhdGFTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5sb2FkR29vZChnb29kc25vbSwgbmF0aW9uYWxBZGRpdGlvbmFsQ29kZSwgbWV1cnNpbmdBZGRpdGlvbmFsQ29kZSwgY3VycmVuY3ksIHZtLnN0YXRlLnVjY01vZGVFbmFibGVkKVxyXG4gICAgICAgICAgICAudGhlbihsb2FkR29vZFN1Y2Nlc3MsIGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICRsb2NhdGlvbi51cmwoJ3NlYXJjaC8nICsgZ29vZHNub20pLnJlcGxhY2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVyci5pc0Fib3J0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nOyB0aGUgdXNlciBtYXkgYWxyZWFkeSBoYXZlIG5hdmlnYXRlZCB0byBhIGRpZmZlcmVudCBwYWdlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGluZyA9IGdvb2Rzbm9tLnN1YnN0cmluZygwLCA0KTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBTZW50cnkuY2FwdHVyZU1lc3NhZ2UoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uLnVybCgnc2VhcmNoLycgKyBoZWFkaW5nKS5yZXBsYWNlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWROb21lbmNsYXR1cmVHcm91cHMoZ29vZHNub20pIHtcclxuICAgICAgICByZXR1cm4gbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2UubG9hZE5vbWVuY2xhdHVyZUdyb3Vwcyhnb29kc25vbSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24obm9tZW5jbGF0dXJlR3JvdXBzKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5nb29kLm5vbWVuY2xhdHVyZUdyb3VwcyA9IG5vbWVuY2xhdHVyZUdyb3VwcztcclxuICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWVyci5pc0Fib3J0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge31cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZEdvb2RTdWNjZXNzKGRhdGEpIHtcclxuICAgICAgICAvLyB2YXIgaW5kZW50YXRpb24gPSBkYXRhLmRlc2NyaXB0aW9uLmxpbmVzW2RhdGEuZGVzY3JpcHRpb24ubGluZXMubGVuZ3RoIC0gMV0uaW5kZW50O1xyXG4gICAgICAgIC8vIHN0YXRlLmN1cnJlbnRJbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uO1xyXG4gICAgICAgIHZtLmdvb2QuZ2VuZXJhbEluZm8uZGVzY3JpcHRpb24gPSBkYXRhLmdvb2QuZGVzY3JpcHRpb247XHJcbiAgICAgICAgdm0uZ29vZC5nZW5lcmFsSW5mby5tZWFzdXJlX3NlcmllcyA9IGRhdGEuZ29vZC5tZWFzdXJlX3NlcmllcztcclxuICAgICAgICB2bS5nb29kLmdlbmVyYWxJbmZvLnJlc3RpdHV0aW9ucyA9IGRhdGEuZ29vZC5yZXN0aXR1dGlvbnM7XHJcbiAgICAgICAgdm0uZ29vZC5nZW5lcmFsSW5mby5yZXN1bHRfdmFsaWRfb24gPSBkYXRhLmdvb2QucmVzdWx0X3ZhbGlkX29uO1xyXG4gICAgICAgIHZtLmdvb2QuZ2VuZXJhbEluZm8ubm90X3VwX3RvX2RhdGUgPSBkYXRhLmdvb2Qubm90X3VwX3RvX2RhdGU7XHJcblxyXG4gICAgICAgIHZtLmdvb2QuZ2VuZXJhbEluZm8ubm90ZXMgPSBkYXRhLmdvb2Qubm90ZXM7XHJcblxyXG4gICAgICAgIHZtLm1vbmV0YXJ5VW5pdHNVc2VkSW5NZWFzdXJlcyA9IGRhdGEubW9uZXRhcnlVbml0c1VzZWRJbk1lYXN1cmVzO1xyXG4gICAgICAgIHZtLnBvc3NpYmxlVW5pdHNGb3JDdXJyZW5jeUNvbnZlcnNpb24gPSBkYXRhLm1ldGFkYXRhLnBvc3NpYmxlVW5pdHNGb3JDdXJyZW5jeUNvbnZlcnNpb247XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nLmdlbmVyYWxJbmZvID0gZmFsc2U7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nLm1lYXN1cmVzID0gZmFsc2U7XHJcbiAgICAgICAgc2V0UmVjZW50Q29kZSgpO1xyXG5cclxuICAgICAgICB2YXIgY291bnRyaWVzV2l0aFVjY1ByZWZlcmVuY2VDb2RlcyA9IFsnTkwnLCAnQkUnLCAnU0UnXTtcclxuICAgICAgICB2YXIgbWVhc3VyZXNXaXRoVWNjUHJlZmVyZW5jZUNvZGVzID0gZGF0YS5nb29kLm1lYXN1cmVzLmZpbHRlcihtID0+ICEhbS51Y2NfcHJlZmVyZW5jZV9jb2Rlcyk7XHJcbiAgICAgICAgaWYgKG1lYXN1cmVzV2l0aFVjY1ByZWZlcmVuY2VDb2Rlcy5sZW5ndGggPT09IDAgfHwgY291bnRyaWVzV2l0aFVjY1ByZWZlcmVuY2VDb2Rlcy5pbmRleE9mKHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5KSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgaWYgKHN0YXRlLmZpbHRlci5tb3ZlbWVudCA9PT0gJ2ltcG9ydCcpIHtcclxuICAgICAgICAgICAgICAgIHVjY1NldHRpbmdDaGFuZ2VkKCdubycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZtLnNob3dVY2NUb2dnbGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLnNob3dVY2NUb2dnbGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9hZE1lYXN1cmVzKHN0YXRlLmZpbHRlci5jb3VudHJ5Q29kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0UmVjZW50Q29kZSgpIHtcclxuICAgICAgICBpZiAoIXZtLmdvb2QgfHwgIXZtLmdvb2QuZ2VuZXJhbEluZm8gfHwgIXZtLmdvb2QuZ2VuZXJhbEluZm8uY29kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBwcmVmZXJlbmNlcy5hZGQoe1xyXG4gICAgICAgICAgICBuYW1lOiB2bS5nb29kLmdlbmVyYWxJbmZvLmNvZGUgKyAnXycgKyBzdGF0ZS5maWx0ZXIubW92ZW1lbnQsXHJcbiAgICAgICAgICAgIGNhdGVnb3J5OiAncmVjZW50X2NvZGVzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICdnb29kc25vbT0nICsgdm0uZ29vZC5nZW5lcmFsSW5mby5jb2RlICsgJyZ0eXBlPScgKyBzdGF0ZS5maWx0ZXIubW92ZW1lbnQsXHJcbiAgICAgICAgICAgIHZhbHVlVHlwZTogJ3N0cmluZ1ZhbHVlJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRNZWFzdXJlcyhjb3VudHJ5Q29kZSkge1xyXG4gICAgICAgIHZtLnZhbGlkYXRpb25FcnJvcnMgPSB7XHJcbiAgICAgICAgICAgIHF1YW50aXRpZXM6IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gZ29vZERhdGFTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5sb2FkTWVhc3VyZXMoY291bnRyeUNvZGUpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChtZWFzdXJlc1Jlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgbG9hZE1lYXN1cmVzQ29tcGxldGVkKG1lYXN1cmVzUmVzdWx0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZE1lYXN1cmVzQ29tcGxldGVkKG1lYXN1cmVzUmVzdWx0KSB7XHJcblxyXG4gICAgICAgIHZtLmhhc01ldXJzaW5nID0gbWVhc3VyZXNSZXN1bHQuaGFzX21ldXJzaW5nO1xyXG5cclxuICAgICAgICB2YXIgaGFzQXV0b25vbW91c1RhcmlmZlN1c3BlbnNpb24gPSBfLnNvbWUobWVhc3VyZXNSZXN1bHQubWVhc3VyZXMsIGZ1bmN0aW9uIChtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtZWFzdXJlLnR5cGVfaWQgPT09ICcxMTInO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoaGFzQXV0b25vbW91c1RhcmlmZlN1c3BlbnNpb24pIHtcclxuICAgICAgICAgICAgdm0uaGFzQXV0b25vbW91c1RhcmlmZlN1c3BlbnNpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG1lYXN1cmVQcmVmZXJlbmNlQ29kZXNQcm9wZXJ0eSA9IHZtLnN0YXRlLnVjY01vZGVFbmFibGVkID09PSAneWVzJyA/ICd1Y2NfcHJlZmVyZW5jZV9jb2RlcycgOiAncHJlZmVyZW5jZV9jb2Rlcyc7XHJcbiAgICAgICAgLy8gVE9ETzogY29udmVydCB0byBvYmplY3RzXHJcbiAgICAgICAgdm0ucG9zc2libGVQcmVmZXJlbmNlQ29kZXMgPSBfLmNoYWluKG1lYXN1cmVzUmVzdWx0Lm1lYXN1cmVzKVxyXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChtZWFzdXJlKSB7IHJldHVybiAhIW1lYXN1cmVbbWVhc3VyZVByZWZlcmVuY2VDb2Rlc1Byb3BlcnR5XTsgfSlcclxuICAgICAgICAgICAgLmZsYXRNYXAoZnVuY3Rpb24gKG1lYXN1cmUpIHsgcmV0dXJuIG1lYXN1cmVbbWVhc3VyZVByZWZlcmVuY2VDb2Rlc1Byb3BlcnR5XSB9KVxyXG4gICAgICAgICAgICAudW5pcUJ5KGZ1bmN0aW9uIChwcmVmZXJlbmNlQ29kZSkgeyByZXR1cm4gcHJlZmVyZW5jZUNvZGUgfSlcclxuICAgICAgICAgICAgLnNvcnRCeShmdW5jdGlvbiAocHJlZmVyZW5jZUNvZGUpIHsgcmV0dXJuIHByZWZlcmVuY2VDb2RlIH0pXHJcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHByZWZlcmVuY2VDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5maW5kKHZtLnByZWZlcmVuY2VDb2RlcywgZnVuY3Rpb24ocHJlZmVyZW5jZUNvZGVPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZmVyZW5jZUNvZGVPYmplY3QuY29kZSA9PT0gcHJlZmVyZW5jZUNvZGU7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnZhbHVlKCk7XHJcblxyXG4gICAgICAgIHZhciBwb3NzaWJsZUFkZGl0aW9uYWxDb2RlcyA9IF8uY2hhaW4obWVhc3VyZXNSZXN1bHQubWVhc3VyZXMpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG1lYXN1cmUpIHsgcmV0dXJuICEhbWVhc3VyZS5hZGRpdGlvbmFsX2NvZGU7IH0pXHJcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKG1lYXN1cmUpIHsgcmV0dXJuIG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlIH0pXHJcbiAgICAgICAgICAgIC51bmlxQnkoZnVuY3Rpb24gKGFkZGl0aW9uYWxDb2RlKSB7IHJldHVybiBhZGRpdGlvbmFsQ29kZS50eXBlICsgYWRkaXRpb25hbENvZGUuY29kZSB9KVxyXG4gICAgICAgICAgICAuc29ydEJ5KGZ1bmN0aW9uIChhZGRpdGlvbmFsQ29kZSkgeyByZXR1cm4gYWRkaXRpb25hbENvZGUudHlwZSArIGFkZGl0aW9uYWxDb2RlLmNvZGUgfSlcclxuICAgICAgICAgICAgLnZhbHVlKCk7XHJcblxyXG4gICAgICAgIHZtLmFwcGxpY2FibGVBbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlcyA9IF8uZmlsdGVyKHBvc3NpYmxlQWRkaXRpb25hbENvZGVzLCBmdW5jdGlvbihhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYW50aUR1bXBpbmdBZGRpdGlvbmFsQ29kZVR5cGVzLmluZGV4T2YoYWRkaXRpb25hbENvZGUudHlwZSkgIT09IC0xO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnbG9hZE1lYXN1cmVzQ29tcGxldGVkJywgdm0pO1xyXG5cclxuICAgICAgICB2bS5vdGhlckFwcGxpY2FibGVBZGRpdGlvbmFsVGFyaWNDb2RlcyA9IF8uY2hhaW4ocG9zc2libGVBZGRpdGlvbmFsQ29kZXMpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oYWRkaXRpb25hbENvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvdGhlckFkZGl0aW9uYWxUYXJpY0NvZGVUeXBlcy5pbmRleE9mKGFkZGl0aW9uYWxDb2RlLnR5cGUpICE9PSAtMTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbihtZW1vLCBhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvZGVzT2ZUeXBlID0gXy5maW5kKG1lbW8sIGZ1bmN0aW9uKGNvZGVzR3JvdXBlZEJ5VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2Rlc0dyb3VwZWRCeVR5cGUudHlwZSA9PT0gYWRkaXRpb25hbENvZGUudHlwZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvZGVzT2ZUeXBlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW1vLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhZGRpdGlvbmFsQ29kZS50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlczogWyBhZGRpdGlvbmFsQ29kZSBdXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2Rlc09mVHlwZS5jb2Rlcy5wdXNoKGFkZGl0aW9uYWxDb2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBtZW1vO1xyXG4gICAgICAgICAgICB9LCBbXSlcclxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbihjb2RlR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIGNvZGVHcm91cC5jb2RlcyA9IF8uc29ydEJ5KGNvZGVHcm91cC5jb2RlcywgZnVuY3Rpb24oYWRkaXRpb25hbENvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkaXRpb25hbENvZGUudHlwZSArIGFkZGl0aW9uYWxDb2RlLmNvZGU7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlR3JvdXA7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC52YWx1ZSgpO1xyXG5cclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnb3RoZXJBcHBsaWNhYmxlQWRkaXRpb25hbFRhcmljQ29kZXMnLCB2bS5vdGhlckFwcGxpY2FibGVBZGRpdGlvbmFsVGFyaWNDb2Rlcyk7XHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgIHZtLmFwcGxpY2FibGVOYXRpb25hbEFkZGl0aW9uYWxDb2RlcyA9IF8uY2hhaW4ocG9zc2libGVBZGRpdGlvbmFsQ29kZXMpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oYWRkaXRpb25hbENvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlVHlwZXMuaW5kZXhPZihhZGRpdGlvbmFsQ29kZS50eXBlKSA9PT0gLTEgJiYgb3RoZXJBZGRpdGlvbmFsVGFyaWNDb2RlVHlwZXMuaW5kZXhPZihhZGRpdGlvbmFsQ29kZS50eXBlKSA9PT0gLTE7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5zb3J0QnkoZnVuY3Rpb24gKGFkZGl0aW9uYWxDb2RlKSB7IHJldHVybiBhZGRpdGlvbmFsQ29kZS50eXBlICsgYWRkaXRpb25hbENvZGUuY29kZTsgfSlcclxuICAgICAgICAgICAgLnZhbHVlKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHZtLnN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID09PSAnU0UnIHx8IHZtLnN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID09PSAnSVQnKSB7XHJcbiAgICAgICAgICAgIHZhciBhcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZVR5cGVzID0gXy5jaGFpbih2bS5hcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZXMpXHJcbiAgICAgICAgICAgICAgICAubWFwKGNvZGUgPT4gY29kZS50eXBlKVxyXG4gICAgICAgICAgICAgICAgLnVuaXEoKVxyXG4gICAgICAgICAgICAgICAgLnNvcnQoKVxyXG4gICAgICAgICAgICAgICAgLnZhbHVlKCk7XHJcbiAgICAgICAgICAgIGlmIChhcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZVR5cGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBsYXN0VHlwZSA9IGFwcGxpY2FibGVOYXRpb25hbEFkZGl0aW9uYWxDb2RlVHlwZXNbYXBwbGljYWJsZU5hdGlvbmFsQWRkaXRpb25hbENvZGVUeXBlcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgIHZtLmFwcGxpY2FibGVTZWNvbmROYXRpb25hbEFkZGl0aW9uYWxDb2RlcyA9IF8uZmlsdGVyKHZtLmFwcGxpY2FibGVOYXRpb25hbEFkZGl0aW9uYWxDb2RlcywgZnVuY3Rpb24oYWRkaXRpb25hbENvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkaXRpb25hbENvZGUudHlwZSA9PT0gbGFzdFR5cGU7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHZtLmFwcGxpY2FibGVOYXRpb25hbEFkZGl0aW9uYWxDb2RlcyA9IF8uZmlsdGVyKHZtLmFwcGxpY2FibGVOYXRpb25hbEFkZGl0aW9uYWxDb2RlcywgZnVuY3Rpb24oYWRkaXRpb25hbENvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkaXRpb25hbENvZGUudHlwZSAhPT0gbGFzdFR5cGU7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2bS5hcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHZtLm5hdGlvbmFsQWRkaXRpb25hbENvZGVJc09wdGlvbmFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgdm0uYXBwbGljYWJsZU5hdGlvbmFsQWRkaXRpb25hbENvZGVzID0gdm0ub3B0aW9uYWxOYXRpb25hbEFkZGl0aW9uYWxDb2RlcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLmhhc0FkZGl0aW9uYWxDb2RlcyA9IHZtLmhhc01ldXJzaW5nIHx8XHJcbiAgICAgICAgICAgIHZtLmFwcGxpY2FibGVBbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2Rlcy5sZW5ndGggPiAwIHx8XHJcbiAgICAgICAgICAgIF8uc2l6ZSh2bS5vdGhlckFwcGxpY2FibGVBZGRpdGlvbmFsVGFyaWNDb2RlcykgPiAwIHx8XHJcbiAgICAgICAgICAgICh2bS5zdGF0ZS5maWx0ZXIubW92ZW1lbnQgPT09ICdpbXBvcnQnICYmIHZtLmFwcGxpY2FibGVOYXRpb25hbEFkZGl0aW9uYWxDb2RlcyAmJiB2bS5hcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZXMubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdhcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZXMnLCB2bS5hcHBsaWNhYmxlTmF0aW9uYWxBZGRpdGlvbmFsQ29kZXMpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gQ2xlYXIgYWRkaXRpb25hbCBjb2RlcyB3aGljaCBhcmUgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBjb3VudHJ5XHJcblxyXG4gICAgICAgIHZhciBhbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlSXNBcHBsaWNhYmxlID0gXy5zb21lKHZtLmFwcGxpY2FibGVBbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlcywgZnVuY3Rpb24gKGFwcGxpY2FibGVDb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2bS5hbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlICYmXHJcbiAgICAgICAgICAgICAgICB2bS5hbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlLnR5cGUgPT09IGFwcGxpY2FibGVDb2RlLnR5cGUgJiZcclxuICAgICAgICAgICAgICAgIHZtLmFudGlEdW1waW5nQWRkaXRpb25hbENvZGUuY29kZSA9PT0gYXBwbGljYWJsZUNvZGUuY29kZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFhbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlSXNBcHBsaWNhYmxlKSB7XHJcbiAgICAgICAgICAgIHZtLmFudGlEdW1waW5nQWRkaXRpb25hbENvZGUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHByZWZlcmVuY2VDb2RlSXNBcHBsaWNhYmxlID0gXy5zb21lKHZtLnBvc3NpYmxlUHJlZmVyZW5jZUNvZGVzLCBmdW5jdGlvbiAocG9zc2libGVQcmVmZXJlbmNlQ29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdm0ucHJlZmVyZW5jZUNvZGUgJiYgdm0ucHJlZmVyZW5jZUNvZGUuY29kZSA9PT0gcG9zc2libGVQcmVmZXJlbmNlQ29kZS5jb2RlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoIXByZWZlcmVuY2VDb2RlSXNBcHBsaWNhYmxlKSB7XHJcbiAgICAgICAgICAgIHZtLnByZWZlcmVuY2VDb2RlID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBfLmZvckVhY2godm0ub3RoZXJBZGRpdGlvbmFsVGFyaWNDb2RlcywgZnVuY3Rpb24oYWN0dWFsQ29kZSwgdHlwZSkge1xyXG4gICAgICAgICAgICB2YXIgZ3JvdXBlZEFwcGxpY2FibGVDb2RlcyA9IF8uZmluZCh2bS5vdGhlckFwcGxpY2FibGVBZGRpdGlvbmFsVGFyaWNDb2RlcywgZnVuY3Rpb24oZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBncm91cC50eXBlID09PSB0eXBlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKGdyb3VwZWRBcHBsaWNhYmxlQ29kZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHZtLm90aGVyQWRkaXRpb25hbFRhcmljQ29kZXNbdHlwZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYWN0dWFsQ29kZUlzQXBwbGljYWJsZSA9IF8uc29tZShncm91cGVkQXBwbGljYWJsZUNvZGVzLmNvZGVzLCBmdW5jdGlvbiAoYXBwbGljYWJsZUNvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsQ29kZSAmJiBhY3R1YWxDb2RlLnR5cGUgPT09IGFwcGxpY2FibGVDb2RlLnR5cGUgJiYgYWN0dWFsQ29kZS5jb2RlID09PSBhcHBsaWNhYmxlQ29kZS5jb2RlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWFjdHVhbENvZGVJc0FwcGxpY2FibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdm0ub3RoZXJBZGRpdGlvbmFsVGFyaWNDb2Rlc1t0eXBlXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBGaWx0ZXIgbWVhc3VyZXNcclxuXHJcbiAgICAgICAgdmFyIG1lYXN1cmVzID0gXy5maWx0ZXIobWVhc3VyZXNSZXN1bHQubWVhc3VyZXMsIGZ1bmN0aW9uIChtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtZWFzdXJlSXNBcHBsaWNhYmxlRm9yQWRkaXRpb25hbENvZGUobWVhc3VyZSwgdm0uYW50aUR1bXBpbmdBZGRpdGlvbmFsQ29kZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG1lYXN1cmVzID0gXy5maWx0ZXIobWVhc3VyZXMsIGZ1bmN0aW9uIChtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5zdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9PT0gJ1NFJyB8fCB2bS5zdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9PT0gJ0lUJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVJc0FwcGxpY2FibGVGb3JBZGRpdGlvbmFsQ29kZShtZWFzdXJlLCB2bS5uYXRpb25hbEFkZGl0aW9uYWxDb2RlT2JqZWN0KSAmJlxyXG4gICAgICAgICAgICAgICAgbWVhc3VyZUlzQXBwbGljYWJsZUZvckFkZGl0aW9uYWxDb2RlKG1lYXN1cmUsIHZtLnNlY29uZE5hdGlvbmFsQWRkaXRpb25hbENvZGVPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBtZWFzdXJlSXNBcHBsaWNhYmxlRm9yQWRkaXRpb25hbENvZGUobWVhc3VyZSwgdm0ubmF0aW9uYWxBZGRpdGlvbmFsQ29kZU9iamVjdCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIF8uZm9yRWFjaCh2bS5vdGhlckFkZGl0aW9uYWxUYXJpY0NvZGVzLCBmdW5jdGlvbihhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICBtZWFzdXJlcyA9IF8uZmlsdGVyKG1lYXN1cmVzLCBmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVJc0FwcGxpY2FibGVGb3JBZGRpdGlvbmFsQ29kZShtZWFzdXJlLCBhZGRpdGlvbmFsQ29kZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2YXIgbWVhc3VyZVByZWZlcmVuY2VDb2Rlc1Byb3BlcnR5ID0gdm0uc3RhdGUudWNjTW9kZUVuYWJsZWQgPT09ICd5ZXMnID8gJ3VjY19wcmVmZXJlbmNlX2NvZGVzJyA6ICdwcmVmZXJlbmNlX2NvZGVzJztcclxuICAgICAgICBpZiAodm0ucHJlZmVyZW5jZUNvZGUgJiYgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgIT0gJ0dCJykge1xyXG4gICAgICAgICAgICBtZWFzdXJlcyA9IF8uZmlsdGVyKG1lYXN1cmVzLCBmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFtZWFzdXJlW21lYXN1cmVQcmVmZXJlbmNlQ29kZXNQcm9wZXJ0eV0gfHxcclxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlW21lYXN1cmVQcmVmZXJlbmNlQ29kZXNQcm9wZXJ0eV0ubGVuZ3RoID09PSAwIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVttZWFzdXJlUHJlZmVyZW5jZUNvZGVzUHJvcGVydHldLmluZGV4T2Yodm0ucHJlZmVyZW5jZUNvZGUuY29kZSkgPiAtMTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgYXBwbGljYWJsZUR1dHlNZWFzdXJlcyA9IF8uZmlsdGVyKG1lYXN1cmVzLCBmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbWVhc3VyZS5zZXJpZXMgPT09ICdDJztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdm0uYXBwbGljYWJsZUR1dHlNZWFzdXJlVHlwZXMgPSBfLmNoYWluKGFwcGxpY2FibGVEdXR5TWVhc3VyZXMpXHJcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IG1lYXN1cmUuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG1lYXN1cmUudHlwZV9pZCxcclxuICAgICAgICAgICAgICAgICAgICBwcmVmZXJlbmNlX2NvZGVzOiBtZWFzdXJlLnByZWZlcmVuY2VfY29kZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgdWNjX3ByZWZlcmVuY2VfY29kZXM6IG1lYXN1cmUudWNjX3ByZWZlcmVuY2VfY29kZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgdWNjX2VuZF91c2VfcHJvY2VkdXJlX2NvZGVfNDQ6IG1lYXN1cmUudWNjX2VuZF91c2VfcHJvY2VkdXJlX2NvZGVfNDQsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZ3JvdXBCeSgnaWQnKVxyXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChncm91cCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZ3JvdXBbMF0uZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGdyb3VwWzBdLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VfY29kZXM6IF8uY2hhaW4oZ3JvdXApLmZsYXRNYXAoJ3ByZWZlcmVuY2VfY29kZXMnKS51bmlxKCkuc29ydCgpLnZhbHVlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgdWNjX3ByZWZlcmVuY2VfY29kZXM6IF8uY2hhaW4oZ3JvdXApLmZsYXRNYXAoJ3VjY19wcmVmZXJlbmNlX2NvZGVzJykudW5pcSgpLnNvcnQoKS52YWx1ZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHVjY19lbmRfdXNlX3Byb2NlZHVyZV9jb2RlXzQ0OiBncm91cFswXS51Y2NfZW5kX3VzZV9wcm9jZWR1cmVfY29kZV80NFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnZhbHVlKCk7XHJcblxyXG4gICAgICAgIGlmICh2bS5kdXR5TWVhc3VyZVR5cGUpIHtcclxuICAgICAgICAgICAgdmFyIGR1dHlNZWFzdXJlVHlwZUlzQXBwbGljYWJsZSA9IF8uc29tZSh2bS5hcHBsaWNhYmxlRHV0eU1lYXN1cmVUeXBlcywgZnVuY3Rpb24gKG1lYXN1cmVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdm0uZHV0eU1lYXN1cmVUeXBlLmlkID09PSBtZWFzdXJlVHlwZS5pZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICghZHV0eU1lYXN1cmVUeXBlSXNBcHBsaWNhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5kdXR5TWVhc3VyZVR5cGUgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodm0uZHV0eU1lYXN1cmVUeXBlKSB7XHJcbiAgICAgICAgICAgIG1lYXN1cmVzID0gXy5maWx0ZXIobWVhc3VyZXMsIGZ1bmN0aW9uIChtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZS5zZXJpZXMgIT09ICdDJyB8fCBtZWFzdXJlLnR5cGVfaWQgPT09IHZtLmR1dHlNZWFzdXJlVHlwZS5pZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodm0uZHV0eU1lYXN1cmVUeXBlIHx8IHZtLnByZWZlcmVuY2VDb2RlKSB7XHJcbiAgICAgICAgICAgIHZtLmFwcGxpY2FibGVPcmRlck51bWJlcnMgPSBfLmNoYWluKG1lYXN1cmVzKVxyXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhIW1lYXN1cmUub3JkZXJudW1iZXI7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlLm9yZGVybnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC51bmlxQnkoKVxyXG4gICAgICAgICAgICAgICAgLnZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2bS5hcHBsaWNhYmxlT3JkZXJOdW1iZXJzID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgIGlmICh2bS5vcmRlck51bWJlciAmJiB2bS5hcHBsaWNhYmxlT3JkZXJOdW1iZXJzICYmIHZtLmFwcGxpY2FibGVPcmRlck51bWJlcnMuaW5kZXhPZih2bS5vcmRlck51bWJlcikgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHZtLm9yZGVyTnVtYmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2bS5hcHBsaWNhYmxlT3JkZXJOdW1iZXJzICYmIHZtLmFwcGxpY2FibGVPcmRlck51bWJlcnMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHZtLm9yZGVyTnVtYmVyID0gdm0uYXBwbGljYWJsZU9yZGVyTnVtYmVyc1swXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2bS5vcmRlck51bWJlcikge1xyXG4gICAgICAgICAgICBtZWFzdXJlcyA9IF8uZmlsdGVyKG1lYXN1cmVzLCBmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmUuc2VyaWVzICE9PSAnQycgfHwgbWVhc3VyZS5vcmRlcm51bWJlciA9PT0gdm0ub3JkZXJOdW1iZXI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0ucG9zc2libGVDZXJ0aWZpY2F0ZUNvZGVzID0gXy5jaGFpbihtZWFzdXJlcylcclxuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICEhbWVhc3VyZS5jb25kaXRpb25zO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmxhdE1hcChmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmUuY29uZGl0aW9ucztcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoY29uZGl0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gISFjb25kaXRpb24uY2VydGlmaWNhdGU7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbmRpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5jZXJ0aWZpY2F0ZTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnVuaXFCeShmdW5jdGlvbiAoY2VydGlmaWNhdGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZS50eXBlICsgY2VydGlmaWNhdGUuY29kZTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnNvcnRCeShmdW5jdGlvbiAoY2VydGlmaWNhdGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZS50eXBlICsgY2VydGlmaWNhdGUuY29kZTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnZhbHVlKCk7XHJcblxyXG4gICAgICAgIHZtLm1lYXN1cmVzID0gbWVhc3VyZXM7XHJcblxyXG4gICAgICAgIGlmICh2bS5kdXR5TWVhc3VyZVR5cGUpIHtcclxuICAgICAgICAgICAgbGV0IHBvc3NpYmxlUHJlZmVyZW5jZUNvZGVzRm9yRHV0eU1lYXN1cmVUeXBlID0gXy5jaGFpbihtZWFzdXJlcylcclxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZS50eXBlX2lkID09PSB2bS5kdXR5TWVhc3VyZVR5cGUuaWQ7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmZsYXRNYXAoZnVuY3Rpb24gKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZVttZWFzdXJlUHJlZmVyZW5jZUNvZGVzUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC51bmlxKClcclxuICAgICAgICAgICAgICAgIC52YWx1ZSgpO1xyXG4gICAgICAgICAgICBpZiAocG9zc2libGVQcmVmZXJlbmNlQ29kZXNGb3JEdXR5TWVhc3VyZVR5cGUubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5wcmVmZXJlbmNlQ29kZSA9IF8uZmluZCh2bS5wb3NzaWJsZVByZWZlcmVuY2VDb2RlcywgZnVuY3Rpb24ocCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNvZGUgPT09IHBvc3NpYmxlUHJlZmVyZW5jZUNvZGVzRm9yRHV0eU1lYXN1cmVUeXBlWzBdO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLmdvb2QubnVtYmVyT2ZNZWFzdXJlcyA9IHZtLm1lYXN1cmVzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgdm0uZ29vZC5tZWFzdXJlcyA9IG1lYXN1cmVHcm91cGluZ1NlcnZpY2UuZ3JvdXAobWVhc3VyZXMsIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtZWFzdXJlSXNBcHBsaWNhYmxlRm9yQWRkaXRpb25hbENvZGUobWVhc3VyZSwgYWRkaXRpb25hbENvZGUpIHtcclxuICAgICAgICBpZiAoIWFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW1lYXN1cmUuYWRkaXRpb25hbF9jb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUudHlwZSAhPT0gYWRkaXRpb25hbENvZGUudHlwZSkge1xyXG4gICAgICAgICAgICBpZiAoYW50aUR1bXBpbmdBZGRpdGlvbmFsQ29kZVR5cGVzLmluZGV4T2YobWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUudHlwZSkgPiAtMSAmJiBhbnRpRHVtcGluZ0FkZGl0aW9uYWxDb2RlVHlwZXMuaW5kZXhPZihhZGRpdGlvbmFsQ29kZS50eXBlKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG5hdGlvbmFsQWRkaXRpb25hbENvZGVUeXBlcy5pbmRleE9mKG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlLnR5cGUpID4gLTEgJiYgbmF0aW9uYWxBZGRpdGlvbmFsQ29kZVR5cGVzLmluZGV4T2YoYWRkaXRpb25hbENvZGUudHlwZSkgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLnN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID09PSAnU0UnIHx8IHZtLnN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID09PSAnSVQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUudHlwZSA9PT0gYWRkaXRpb25hbENvZGUudHlwZSAmJiBtZWFzdXJlLmFkZGl0aW9uYWxfY29kZS5jb2RlID09PSBhZGRpdGlvbmFsQ29kZS5jb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBtb3ZlbWVudENoYW5nZWQoKSB7XHJcbiAgICAgICAgaWYgKHN0YXRlLmZpbHRlci5tb3ZlbWVudCA9PT0gJ2ltcG9ydCcpIHtcclxuICAgICAgICAgICAgJGxvY2F0aW9uLnVybCgnL3NlYXJjaC8nICsgdm0uZ29vZC5nZW5lcmFsSW5mby5jb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLnN0YXRlLmN1cnJlbnRJbmRlbnRhdGlvbiA9IG51bGw7IC8vIHdlJ3JlIGNoYW5naW5nIHRoZSBnb29kcyBjb2RlLCBzbyB3ZSBzaG91bGQgcmVzZXQgdGhlIGluZGVudGF0aW9uLCB0b29cclxuICAgICAgICAgICAgJGxvY2F0aW9uLnVybCgnL3NlYXJjaC8nICsgdm0uZ29vZC5nZW5lcmFsSW5mby5jb2RlLnN1YnN0cigwLCA4KSArICcwMCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkTWV1cnNpbmdUYXJpZmZzKCkge1xyXG4gICAgICAgIGxvYWRHb29kKHZtLmdvb2QuZ2VuZXJhbEluZm8uY29kZSwgdm0ubmF0aW9uYWxBZGRpdGlvbmFsQ29kZSwgdm0ubWV1cnNpbmdBZGRpdGlvbmFsQ29kZSwgdm0ub3V0cHV0Q3VycmVuY3kpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNZXVyc2luZ0FkZGl0aW9uYWxDb2RlTW9kYWwgKCkge1xyXG4gICAgICAgIGdvb2RNb2RhbHMubWV1cnNpbmdcclxuICAgICAgICAgICAgLnNob3coKVxyXG4gICAgICAgICAgICAucmVzdWx0XHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0ICYmICFyZXN1bHQuY29kZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB2bS5tZXVyc2luZ0FkZGl0aW9uYWxDb2RlID0gJzcnICsgcmVzdWx0LmNvZGU7XHJcbiAgICAgICAgICAgICAgICBsb2FkTWV1cnNpbmdUYXJpZmZzKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxufSIsIm1vZHVsZS5leHBvcnRzID0gW21lYXN1cmVGaWx0ZXJzRGlyZWN0aXZlXTtcclxuXHJcbmZ1bmN0aW9uIG1lYXN1cmVGaWx0ZXJzRGlyZWN0aXZlKCkge1xyXG4gICAgdmFyIGRpcmVjdGl2ZSA9IHtcclxuICAgICAgICByZXN0cmljdDogJ0UnLFxyXG4gICAgICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9kaXJlY3RpdmVzL2Zvcm0vbWVhc3VyZS1maWx0ZXJzLWV4cG9ydC1zbWFsbC5odG1sJ1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gZGlyZWN0aXZlO1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gW21lYXN1cmVGaWx0ZXJzRGlyZWN0aXZlXTtcclxuXHJcbmZ1bmN0aW9uIG1lYXN1cmVGaWx0ZXJzRGlyZWN0aXZlKCkge1xyXG4gICAgdmFyIGRpcmVjdGl2ZSA9IHtcclxuICAgICAgICByZXN0cmljdDogJ0UnLFxyXG4gICAgICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9kaXJlY3RpdmVzL2Zvcm0vbWVhc3VyZS1maWx0ZXJzLWltcG9ydC1zbWFsbC5odG1sJ1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gZGlyZWN0aXZlO1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gW21lYXN1cmVGaWx0ZXJzRGlyZWN0aXZlXTtcclxuXHJcbmZ1bmN0aW9uIG1lYXN1cmVGaWx0ZXJzRGlyZWN0aXZlKCkge1xyXG4gICAgdmFyIGRpcmVjdGl2ZSA9IHtcclxuICAgICAgICByZXN0cmljdDogJ0UnLFxyXG4gICAgICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9kaXJlY3RpdmVzL2Zvcm0vbWVhc3VyZS1maWx0ZXJzLWltcG9ydC5odG1sJ1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gZGlyZWN0aXZlO1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gW3ZhbHVlUXVhbnRpdHlJbXBvcnREaXJlY3RpdmVdO1xyXG5cclxuZnVuY3Rpb24gdmFsdWVRdWFudGl0eUltcG9ydERpcmVjdGl2ZSgpIHtcclxuICAgIHZhciBkaXJlY3RpdmUgPSB7XHJcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcclxuICAgICAgICB0ZW1wbGF0ZVVybDogJ2dvb2QvZGlyZWN0aXZlcy9mb3JtL3ZhbHVlLXF1YW50aXR5LWltcG9ydC5odG1sJ1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gZGlyZWN0aXZlO1xyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0gWyckYW5hbHl0aWNzJywgJyR1aWJNb2RhbCcsIG1ldXJzaW5nTW9kYWxdO1xyXG5cclxuZnVuY3Rpb24gbWV1cnNpbmdNb2RhbCgkYW5hbHl0aWNzLCAkdWliTW9kYWwpIHtcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICBzaG93OiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgbWV1cnNpbmdNb2RhbENvbnRyb2xsZXIuJGluamVjdCA9IFsnJHVpYk1vZGFsSW5zdGFuY2UnLCAnY29tbW9uJywgJ2RhdGFDb250ZXh0J107XHJcblxyXG4gICAgZnVuY3Rpb24gbWV1cnNpbmdNb2RhbENvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIGNvbW1vbiwgZGF0YUNvbnRleHQpIHtcclxuICAgICAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICB1cGRhdGVGaWx0ZXJzOiB1cGRhdGVGaWx0ZXJzLFxyXG4gICAgICAgICAgICBmaWx0ZXJNZXVyc2luZ01lbGs6IGZpbHRlck1ldXJzaW5nTWVsayxcclxuICAgICAgICAgICAgZmlsdGVyTWV1cnNpbmdaZXRtZWVsOiBmaWx0ZXJNZXVyc2luZ1pldG1lZWwsXHJcbiAgICAgICAgICAgIGludmFsaWRDb21iaW5hdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzTG9hZGluZ1R5cGVzOiBmYWxzZSxcclxuICAgICAgICAgICAgbG9hZE1ldXJzaW5nSGVhZGVyczogbG9hZE1ldXJzaW5nSGVhZGVycyxcclxuICAgICAgICAgICAgbWV1cnNpbmdBZGRpdGlvbmFsQ29kZTogbnVsbCxcclxuICAgICAgICAgICAgbWV1cnNpbmdGaWx0ZXI6IHtcclxuICAgICAgICAgICAgICAgIG1lbGt2ZXQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBtZWxrcHJvdGVpbmVuOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgemV0bWVlbDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHNhY2NoYXJvc2U6IG51bGxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbWV1cnNpbmdIZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBtZWxrdmV0OiBbJ2EnLCAnYiddLFxyXG4gICAgICAgICAgICAgICAgbWVsa3Byb3RlaW5lbjogW10sXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFByb3RlaW5lbjogW10sXHJcbiAgICAgICAgICAgICAgICB6ZXRtZWVsOiBbXSxcclxuICAgICAgICAgICAgICAgIHNhY2NoYXJvc2U6IFtdLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRTYWNjaGFyb3NlOiBbXSxcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBbXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvazogb2tcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVGaWx0ZXJzKCkge1xyXG4gICAgICAgICAgICB2bS5pbnZhbGlkQ29tYmluYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdm0ubWV1cnNpbmdIZWFkZXJzLmZpbHRlcmVkUHJvdGVpbmVuID0gXy5maWx0ZXIodm0ubWV1cnNpbmdIZWFkZXJzLm1lbGtwcm90ZWluZW4sIGZpbHRlck1ldXJzaW5nTWVsayk7XHJcbiAgICAgICAgICAgIHZtLm1ldXJzaW5nSGVhZGVycy5maWx0ZXJlZFNhY2NoYXJvc2UgPSBfLmZpbHRlcih2bS5tZXVyc2luZ0hlYWRlcnMuc2FjY2hhcm9zZSwgZmlsdGVyTWV1cnNpbmdaZXRtZWVsKTtcclxuICAgICAgICAgICAgaWYgKCF2bS5tZXVyc2luZ0ZpbHRlci5tZWxrcHJvdGVpbmVuICYmIHZtLm1ldXJzaW5nSGVhZGVycy5maWx0ZXJlZFByb3RlaW5lbikge1xyXG4gICAgICAgICAgICAgICAgdm0ubWV1cnNpbmdGaWx0ZXIubWVsa3Byb3RlaW5lbiA9IHZtLm1ldXJzaW5nSGVhZGVycy5maWx0ZXJlZFByb3RlaW5lblswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXZtLm1ldXJzaW5nRmlsdGVyLnNhY2NoYXJvc2UgJiYgdm0ubWV1cnNpbmdIZWFkZXJzLmZpbHRlcmVkU2FjY2hhcm9zZSkge1xyXG4gICAgICAgICAgICAgICAgdm0ubWV1cnNpbmdGaWx0ZXIuc2FjY2hhcm9zZSA9IHZtLm1ldXJzaW5nSGVhZGVycy5maWx0ZXJlZFNhY2NoYXJvc2VbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygnY2FuY2VsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBmaWx0ZXJNZXVyc2luZ01lbGsoc2VsZWN0ZWRJdGVtKSB7XHJcbiAgICAgICAgICAgIHZhciBvcmlnaW5hbE1lbGt2ZXQgPSBfLmZpbmQodm0ubWV1cnNpbmdIZWFkZXJzLm9yaWdpbmFsLCBmdW5jdGlvbiAoaGVhZGVyKSB7IHJldHVybiBoZWFkZXIubnVtYiA9PT0gJzAxMCcgJiYgaGVhZGVyLnJvd19jb2xfaWQgPT09ICcwJzsgfSk7XHJcbiAgICAgICAgICAgIHZhciBzdWJoZWFkZXIgPSBfLmZpbHRlcihvcmlnaW5hbE1lbGt2ZXQuc3ViaGVhZGVycywgZnVuY3Rpb24gKHN1YmhlYWRlcikgeyByZXR1cm4gc3ViaGVhZGVyLm5hbWUgPT09IHZtLm1ldXJzaW5nRmlsdGVyLm1lbGt2ZXQ7IH0pO1xyXG4gICAgICAgICAgICB2YXIgc3ViaGVhZGVyU2VxTnVtYnMgPSBfLm1hcChzdWJoZWFkZXIsIGZ1bmN0aW9uIChzdWJoZWFkZXIpIHsgcmV0dXJuIHN1YmhlYWRlci5zZXFfbnVtYiB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzdWJoZWFkZXJTZXFOdW1icy5pbmRleE9mKHNlbGVjdGVkSXRlbS5zZXFfbnVtYikgPiAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGZpbHRlck1ldXJzaW5nWmV0bWVlbChzZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgICAgICAgdmFyIG9yaWdpbmFsWmV0bWVlbCA9IF8uZmluZCh2bS5tZXVyc2luZ0hlYWRlcnMub3JpZ2luYWwsIGZ1bmN0aW9uIChoZWFkZXIpIHsgcmV0dXJuIGhlYWRlci5udW1iID09PSAnMDEwJyAmJiBoZWFkZXIucm93X2NvbF9pZCA9PT0gJzEnOyB9KTtcclxuICAgICAgICAgICAgdmFyIHN1YmhlYWRlciA9IF8uZmlsdGVyKG9yaWdpbmFsWmV0bWVlbC5zdWJoZWFkZXJzLCBmdW5jdGlvbiAoc3ViaGVhZGVyKSB7IHJldHVybiBzdWJoZWFkZXIubmFtZSA9PT0gdm0ubWV1cnNpbmdGaWx0ZXIuemV0bWVlbDsgfSk7XHJcbiAgICAgICAgICAgIHZhciBzdWJoZWFkZXJTZXFOdW1icyA9IF8ubWFwKHN1YmhlYWRlciwgZnVuY3Rpb24gKHN1YmhlYWRlcikgeyByZXR1cm4gc3ViaGVhZGVyLnNlcV9udW1iIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN1YmhlYWRlclNlcU51bWJzLmluZGV4T2Yoc2VsZWN0ZWRJdGVtLnNlcV9udW1iKSA+IC0xO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbG9hZE1ldXJzaW5nQWRkaXRpb25hbENvZGUoKSB7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL21ldXJzaW5nL2FkZGl0aW9uYWxjb2RlJztcclxuICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSBfLmNsb25lRGVlcCh2bS5tZXVyc2luZ0hlYWRlcnMub3JpZ2luYWwpO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbWV1cnNpbmdIZWFkZXIgPSBoZWFkZXJzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChtZXVyc2luZ0hlYWRlci5udW1iID09PSAnMDEwJyAmJiBtZXVyc2luZ0hlYWRlci5yb3dfY29sX2lkID09PSAnMCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXVyc2luZ0hlYWRlci5zdWJoZWFkZXJzID0gW18uZmluZChtZXVyc2luZ0hlYWRlci5zdWJoZWFkZXJzLCBmdW5jdGlvbiAoc3ViaGVhZGVyKSB7IHJldHVybiBzdWJoZWFkZXIuc2VxX251bWIgPT09IHZtLm1ldXJzaW5nRmlsdGVyLm1lbGtwcm90ZWluZW4uc2VxX251bWIgfSldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWV1cnNpbmdIZWFkZXIubnVtYiA9PT0gJzAxMCcgJiYgbWV1cnNpbmdIZWFkZXIucm93X2NvbF9pZCA9PT0gJzEnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV1cnNpbmdIZWFkZXIuc3ViaGVhZGVycyA9IFtfLmZpbmQobWV1cnNpbmdIZWFkZXIuc3ViaGVhZGVycywgZnVuY3Rpb24gKHN1YmhlYWRlcikgeyByZXR1cm4gc3ViaGVhZGVyLnNlcV9udW1iID09PSB2bS5tZXVyc2luZ0ZpbHRlci5zYWNjaGFyb3NlLnNlcV9udW1iIH0pXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1ldXJzaW5nSGVhZGVyLm51bWIgPT09ICcwMjAnICYmIG1ldXJzaW5nSGVhZGVyLnJvd19jb2xfaWQgPT09ICcwJykge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldXJzaW5nSGVhZGVyLnN1YmhlYWRlcnMgPSBbXy5maW5kKG1ldXJzaW5nSGVhZGVyLnN1YmhlYWRlcnMsIGZ1bmN0aW9uIChzdWJoZWFkZXIpIHsgcmV0dXJuIHN1YmhlYWRlci5zZXFfbnVtYiA9PT0gdm0ubWV1cnNpbmdGaWx0ZXIubWVsa3Byb3RlaW5lbi5zZXFfbnVtYiB9KV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXVyc2luZ0hlYWRlci5udW1iID09PSAnMDIwJyAmJiBtZXVyc2luZ0hlYWRlci5yb3dfY29sX2lkID09PSAnMScpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXVyc2luZ0hlYWRlci5zdWJoZWFkZXJzID0gW18uZmluZChtZXVyc2luZ0hlYWRlci5zdWJoZWFkZXJzLCBmdW5jdGlvbiAoc3ViaGVhZGVyKSB7IHJldHVybiBzdWJoZWFkZXIuc2VxX251bWIgPT09IHZtLm1ldXJzaW5nRmlsdGVyLnNhY2NoYXJvc2Uuc2VxX251bWIgfSldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgYXJncyA9IHsgaGVhZGVyczogaGVhZGVycyB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LnBvc3QodXJsLCBhcmdzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGxvYWRNZXVyc2luZ0hlYWRlcnMoKSB7XHJcbiAgICAgICAgICAgIGRhdGFDb250ZXh0XHJcbiAgICAgICAgICAgICAgICAuZ2V0KGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvbWV1cnNpbmcnKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tZXVyc2luZ0hlYWRlcnMub3JpZ2luYWwgPSBkYXRhLmhlYWRlcnM7XHJcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGRhdGEuaGVhZGVycywgZnVuY3Rpb24gKG1ldXJzaW5nSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXVyc2luZ0hlYWRlci5udW1iID09PSAnMDEwJyAmJiBtZXVyc2luZ0hlYWRlci5yb3dfY29sX2lkID09PSAnMCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLm1ldXJzaW5nSGVhZGVycy5tZWxrdmV0ID0gXy51bmlxKF8ubWFwKG1ldXJzaW5nSGVhZGVyLnN1YmhlYWRlcnMsIGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5uYW1lOyB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5tZXVyc2luZ0ZpbHRlci5tZWxrdmV0ID0gdm0ubWV1cnNpbmdIZWFkZXJzLm1lbGt2ZXRbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWV1cnNpbmdIZWFkZXIubnVtYiA9PT0gJzAxMCcgJiYgbWV1cnNpbmdIZWFkZXIucm93X2NvbF9pZCA9PT0gJzEnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5tZXVyc2luZ0hlYWRlcnMuemV0bWVlbCA9IF8udW5pcShfLm1hcChtZXVyc2luZ0hlYWRlci5zdWJoZWFkZXJzLCBmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIubmFtZTsgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWV1cnNpbmdGaWx0ZXIuemV0bWVlbCA9IHZtLm1ldXJzaW5nSGVhZGVycy56ZXRtZWVsWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1ldXJzaW5nSGVhZGVyLm51bWIgPT09ICcwMjAnICYmIG1ldXJzaW5nSGVhZGVyLnJvd19jb2xfaWQgPT09ICcwJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWV1cnNpbmdIZWFkZXJzLm1lbGtwcm90ZWluZW4gPSBtZXVyc2luZ0hlYWRlci5zdWJoZWFkZXJzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWV1cnNpbmdGaWx0ZXIubWVsa3Byb3RlaW5lbiA9IHZtLm1ldXJzaW5nSGVhZGVycy5tZWxrcHJvdGVpbmVuWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1ldXJzaW5nSGVhZGVyLm51bWIgPT09ICcwMjAnICYmIG1ldXJzaW5nSGVhZGVyLnJvd19jb2xfaWQgPT09ICcxJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWV1cnNpbmdIZWFkZXJzLnNhY2NoYXJvc2UgPSBtZXVyc2luZ0hlYWRlci5zdWJoZWFkZXJzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWV1cnNpbmdGaWx0ZXIuc2FjY2hhcm9zZSA9IHZtLm1ldXJzaW5nSGVhZGVycy5zYWNjaGFyb3NlWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRmlsdGVycygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBvaygpIHtcclxuICAgICAgICAgICAgbG9hZE1ldXJzaW5nQWRkaXRpb25hbENvZGUoKS50aGVuKGZ1bmN0aW9uKG1ldXJzaW5nQWRkaXRpb25hbENvZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtZXVyc2luZ0FkZGl0aW9uYWxDb2RlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaW52YWxpZENvbWJpbmF0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKG1ldXJzaW5nQWRkaXRpb25hbENvZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvYWRNZXVyc2luZ0hlYWRlcnMoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJ29wZW4tbW9kYWwtbWV1cnNpbmcnKTtcclxuICAgICAgICByZXR1cm4gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICBhbmltYXRpb246IHRydWUsXHJcbiAgICAgICAgICAgIGJhY2tkcm9wOiB0cnVlLFxyXG4gICAgICAgICAgICBiaW5kVG9Db250cm9sbGVyOiB0cnVlLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBtZXVyc2luZ01vZGFsQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAnY3RybCcsXHJcbiAgICAgICAgICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHNpemU6ICdsZycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9tb2RhbHMvbWV1cnNpbmctY29kZS5odG1sJyxcclxuICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdtb2RhbC1tZXVyc2luZy1jb2RlJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFsnbWV1cnNpbmdNb2RhbCcsIGdvb2RNb2RhbHNTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIGdvb2RNb2RhbHNTZXJ2aWNlKG1ldXJzaW5nTW9kYWwpIHtcclxuXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBtZXVyc2luZzogbWV1cnNpbmdNb2RhbCxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gWyckYW5hbHl0aWNzJywgJyR1aWJNb2RhbCcsIHVrQ2VydGlmaWNhdGVHdWlkYW5jZU1vZGFsXTtcclxuXHJcbmZ1bmN0aW9uIHVrQ2VydGlmaWNhdGVHdWlkYW5jZU1vZGFsKCRhbmFseXRpY3MsICR1aWJNb2RhbCkge1xyXG4gICAgdmFyIG1vZGFsID0ge1xyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICB1a0NlcnRpZmljYXRlR3VpZGFuY2VNb2RhbENvbnRyb2xsZXIuJGluamVjdCA9IFsnJHVpYk1vZGFsSW5zdGFuY2UnLCAnY2VydGlmaWNhdGVzJ107XHJcblxyXG4gICAgZnVuY3Rpb24gdWtDZXJ0aWZpY2F0ZUd1aWRhbmNlTW9kYWxDb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlLCBjZXJ0aWZpY2F0ZXMpIHtcclxuICAgICAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgICAgIGNlcnRpZmljYXRlczogY2VydGlmaWNhdGVzLFxyXG4gICAgICAgICAgICBjYW5jZWw6IGNhbmNlbCxcclxuICAgICAgICAgICAgb2s6IG9rXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdjYW5jZWwnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIG9rKGNvZGUpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UoY29kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdm07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd01vZGFsKGNlcnRpZmljYXRlcykge1xyXG4gICAgICAgICRhbmFseXRpY3MuZXZlbnRUcmFjaygnb3Blbi1tb2RhbC11ay1jZXJ0aWZpY2F0ZS1ndWlkYW5jZScpO1xyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IHVrQ2VydGlmaWNhdGVHdWlkYW5jZU1vZGFsQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAnY3RybCcsXHJcbiAgICAgICAgICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNpemU6ICdsZycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnZ29vZC9tb2RhbHMvdWstY2VydGlmaWNhdGUtZ3VpZGFuY2UuaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtdWstY2VydGlmaWNhdGUtZ3VpZGFuY2UnXHJcbiAgICAgICAgfSkucmVzdWx0LmNhdGNoKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgaWYgKCEocmVzID09PSAnY2FuY2VsJyB8fCByZXMgPT09ICdlc2NhcGUga2V5IHByZXNzJyB8fCByZXMgPT09ICdiYWNrZHJvcCBjbGljaycpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyByZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbW9kYWw7XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJyRmaWx0ZXInLCAnY29tbW9uJywgJ2RhdGFDb250ZXh0JywgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgJ3NlcmlhbGl6YXRpb25TZXJ2aWNlJywgZ29vZERhdGFTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIGdvb2REYXRhU2VydmljZSgkZmlsdGVyLCBjb21tb24sIGNvbnRleHQsIHN0YXRlLCBzZXJpYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgZGF0YTogbnVsbCxcclxuICAgICAgICBsb2FkR29vZDogbG9hZEdvb2QsXHJcbiAgICAgICAgbG9hZE1lYXN1cmVzOiBsb2FkTWVhc3VyZXMsXHJcbiAgICAgICAgZXZhbHVhdGVNZWFzdXJlQ29uZGl0aW9uczogZXZhbHVhdGVNZWFzdXJlQ29uZGl0aW9uc1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBldmFsdWF0ZU1lYXN1cmVDb25kaXRpb25zKHF1ZXJ5KSB7XHJcbiAgICAgICAgdmFyIHF1YW50aXRpZXMgPSBzZXJpYWxpemF0aW9uU2VydmljZS5zZXJpYWxpemVRdWFudGl0aWVzKHF1ZXJ5LnF1YW50aXRpZXMpO1xyXG5cclxuICAgICAgICB2YXIgYWRkaXRpb25hbENvZGVzID0gXy5tYXAocXVlcnkuYWRkaXRpb25hbENvZGVzLCBmdW5jdGlvbihhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJycgKyBhZGRpdGlvbmFsQ29kZS50eXBlICsgYWRkaXRpb25hbENvZGUuY29kZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgY2VydGlmaWNhdGVDb2RlcyA9IF8ubWFwKHF1ZXJ5LmNlcnRpZmljYXRlQ29kZXMsIGZ1bmN0aW9uKGNlcnRpZmljYXRlQ29kZSkge1xyXG4gICAgICAgICAgICBpZiAoY2VydGlmaWNhdGVDb2RlLm9yaWdpbiA9PT0gJ0lUJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnICsgY2VydGlmaWNhdGVDb2RlLmNvZGUgKyBjZXJ0aWZpY2F0ZUNvZGUudHlwZTsgICAgXHJcbiAgICAgICAgICAgIH1cdFxyXG4gICAgICAgICAgICByZXR1cm4gJycgKyBjZXJ0aWZpY2F0ZUNvZGUudHlwZSArIGNlcnRpZmljYXRlQ29kZS5jb2RlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZhciBwcmVmZXJlbmNlQ29kZSA9IHF1ZXJ5LnByZWZlcmVuY2VDb2RlID8gcXVlcnkucHJlZmVyZW5jZUNvZGUuY29kZSA6IG51bGw7XHJcbiAgICAgICAgdmFyIGN1c3RvbXNWYWx1ZSA9IHNlcmlhbGl6YXRpb25TZXJ2aWNlLnNlcmlhbGl6ZUN1c3RvbXNWYWx1ZShxdWVyeS5jdXN0b21zVmFsdWUpO1xyXG5cclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0c1tjb21tb24uY29uZmlnLmN1cnJlbnRBcGldICtcclxuICAgICAgICAgICAgJy9nb29kcy8nICsgcXVlcnkuY29tbW9kaXR5Q29kZSArICcvZXZhbHVhdGVfbWVhc3VyZV9jb25kaXRpb25zJyArXHJcbiAgICAgICAgICAgICc/bGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZhZGRpdGlvbmFsY29kZXM9JyArIGFkZGl0aW9uYWxDb2Rlcy5qb2luKCcsJykgK1xyXG4gICAgICAgICAgICAnJmNlcnRpZmljYXRlY29kZXM9JyArIGNlcnRpZmljYXRlQ29kZXMuam9pbignLCcpICtcclxuICAgICAgICAgICAgJyZwcmVmZXJlbmNlY29kZT0nICsgKHByZWZlcmVuY2VDb2RlIHx8ICcnKSArXHJcbiAgICAgICAgICAgICcmY3VzdG9tc3ZhbHVlPScgKyBjdXN0b21zVmFsdWUgK1xyXG4gICAgICAgICAgICAnJmR1dHltZWFzdXJldHlwZWlkPScgKyAocXVlcnkuZHV0eU1lYXN1cmVUeXBlSWQgfHwgJycpICtcclxuICAgICAgICAgICAgJyZtb3ZlbWVudD0nICsgcXVlcnkudHJhZGVNb3ZlbWVudCArXHJcbiAgICAgICAgICAgICcmb3JkZXJudW1iZXI9JyArIChxdWVyeS5vcmRlck51bWJlciB8fCAnJykgK1xyXG4gICAgICAgICAgICAnJnF1YW50aXRpZXM9JyArIHF1YW50aXRpZXMuam9pbignLCcpICtcclxuICAgICAgICAgICAgJyZjb3VudHJ5PScgKyAocXVlcnkuY291bnRyeUNvZGUgfHwgJycpICtcclxuICAgICAgICAgICAgJyZyZWZlcmVuY2Vjb3VudHJ5PScgKyBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGUgK1xyXG4gICAgICAgICAgICAnJnVjYz0nICsgKHF1ZXJ5LnVjY01vZGVFbmFibGVkIHx8ICcnKTtcclxuICAgICAgICByZXR1cm4gY29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkR29vZChnb29kc25vbSwgbmF0aW9uYWxBZGRpdGlvbmFsQ29kZSwgbWV1cnNpbmdBZGRpdGlvbmFsQ29kZSwgY3VycmVuY3ksIHVjY01vZGVFbmFibGVkKSB7XHJcbiAgICAgICAgdmFyIGRlZmVycmVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgIGxvYWRHb29kUmF3KGdvb2Rzbm9tLCBuYXRpb25hbEFkZGl0aW9uYWxDb2RlLCBtZXVyc2luZ0FkZGl0aW9uYWxDb2RlLCBjdXJyZW5jeSwgdWNjTW9kZUVuYWJsZWQpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgc2VydmljZS5kYXRhID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmdvb2QgJiYgZGF0YS5nb29kLmNvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgPT09ICdHQicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZ29vZC5yZXN1bHRfdmFsaWRfb24gJiYgZGF0YS5nb29kLnJlc3VsdF92YWxpZF9vbi5zdWJzdHIoMCwgMTApICE9PSBzdGF0ZS5maWx0ZXIuZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nb29kLm5vdF91cF90b19kYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoZGF0YSk7XHJcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTG9hZHMgdGhlIHJhdyBkYXRhIGZvciBhIGdvb2QsIGJhc2VkIG9uIGl0cyBnb29kc25vbVxyXG4gICAgZnVuY3Rpb24gbG9hZEdvb2RSYXcoZ29vZHNub20sIG5hdGlvbmFsQWRkaXRpb25hbENvZGUsIG1ldXJzaW5nQWRkaXRpb25hbENvZGUsIGN1cnJlbmN5LCB1Y2NNb2RlRW5hYmxlZCkge1xyXG5cclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0c1tjb21tb24uY29uZmlnLmN1cnJlbnRBcGldICsgJy9nb29kcy8nICsgZ29vZHNub20gK1xyXG4gICAgICAgICAgICAnP21vdmVtZW50PScgKyBzdGF0ZS5maWx0ZXIubW92ZW1lbnQgK1xyXG4gICAgICAgICAgICAnJmxhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSAgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZ1Y2M9JyArICh1Y2NNb2RlRW5hYmxlZCB8fCAnJyk7XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5maWx0ZXIuZGF0ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB1cmwgKz0gJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1ldXJzaW5nQWRkaXRpb25hbENvZGUpIHtcclxuICAgICAgICAgICAgaWYgKG1ldXJzaW5nQWRkaXRpb25hbENvZGUubGVuZ3RoID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICBtZXVyc2luZ0FkZGl0aW9uYWxDb2RlID0gJzcnICsgbWV1cnNpbmdBZGRpdGlvbmFsQ29kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB1cmwgKz0gJyZtZXVyc2luZ2NvZGU9JyArIG1ldXJzaW5nQWRkaXRpb25hbENvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChuYXRpb25hbEFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgICAgIHVybCArPSAnJm5hYz0nICsgbmF0aW9uYWxBZGRpdGlvbmFsQ29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1cnJlbmN5KSB7XHJcbiAgICAgICAgICAgIHVybCArPSAnJmN1cnJlbmN5Y29kZT0nICsgY3VycmVuY3kuY29kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwsICdHT09EJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZE1lYXN1cmVzKGNvdW50cnlDb2RlKSB7XHJcbiAgICAgICAgdmFyIGRlZmVycmVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcbiAgICAgICAgdmFyIG1lYXN1cmVzID0gJGZpbHRlcignaGFzQ291bnRyeScpKHNlcnZpY2UuZGF0YS5nb29kLm1lYXN1cmVzLCBjb3VudHJ5Q29kZSk7XHJcbiAgICAgICAgaWYgKHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID09PSAnTkwnKSB7XHJcbiAgICAgICAgICAgIHZhciBzb21lTWVhc3VyZXNIYXZlQW5PcHRpb25hbE5hdGlvbmFsQWRkaXRpb25hbENvZGUgPSBfLnNvbWUobWVhc3VyZXMsIGZ1bmN0aW9uIChtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUgJiYgbWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUudHlwZSA9PT0gJ1YnO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKHNvbWVNZWFzdXJlc0hhdmVBbk9wdGlvbmFsTmF0aW9uYWxBZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgbWVhc3VyZXMgPSBfLmZpbHRlcihtZWFzdXJlcywgZnVuY3Rpb24gKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZS5zZXJpZXMgIT09ICdQJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlLnR5cGUgIT09ICdWJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgaGFzX21ldXJzaW5nOiBfLnNvbWUobWVhc3VyZXMsIGZ1bmN0aW9uIChtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZS5oYXNfbWV1cnNpbmc7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBtZWFzdXJlczogbWVhc3VyZXNcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0gWyckZmlsdGVyJywgJyR0cmFuc2xhdGUnLCAnY29tbW9uJywgZ29vZERpc3BsYXlTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIGdvb2REaXNwbGF5U2VydmljZSgkZmlsdGVyLCAkdHJhbnNsYXRlLCBjb21tb24pIHtcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGNvbGxhcHNlTWVhc3VyZXM6IGNvbGxhcHNlTWVhc3VyZXMsXHJcbiAgICAgICAgY29weURlc2NyaXB0aW9uOiBjb3B5RGVzY3JpcHRpb24sXHJcbiAgICAgICAgY291bnRyeUNvZGVNYXRjaGVyOiBjb3VudHJ5Q29kZU1hdGNoZXIsXHJcbiAgICAgICAgY291bnRyeU5hbWVNYXRjaGVyOiBjb3VudHJ5TmFtZU1hdGNoZXIsXHJcbiAgICAgICAgZXhwYW5kTWVhc3VyZXM6IGV4cGFuZE1lYXN1cmVzLFxyXG4gICAgICAgIGdldEZpbmFuY2lhbENvbmRpdGlvbkRlc2NyaXB0aW9uOiBnZXRGaW5hbmNpYWxDb25kaXRpb25EZXNjcmlwdGlvbixcclxuICAgICAgICBoYXNBZGRpdGlvbmFsQ29kZTogaGFzQWRkaXRpb25hbENvZGUsXHJcbiAgICAgICAgaGFzQWRkaXRpb25hbENvZGVEZXNjcmlwdGlvbjogaGFzQWRkaXRpb25hbENvZGVEZXNjcmlwdGlvbixcclxuICAgICAgICB0cmFuc2xhdGlvbnM6IFtdXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgICR0cmFuc2xhdGUoW1xyXG4gICAgICAgICAgICAnZ29vZHMuZmluYW5jaWFsQ29uZGl0aW9ucy5FLnRpdGxlJyxcclxuICAgICAgICAgICAgJ2dvb2RzLmZpbmFuY2lhbENvbmRpdGlvbnMuRS5oZWFkZXJzLmNvbDEnLFxyXG4gICAgICAgICAgICAnZ29vZHMuZmluYW5jaWFsQ29uZGl0aW9ucy5FLmhlYWRlcnMuY29sMicsXHJcbiAgICAgICAgICAgICdnb29kcy5maW5hbmNpYWxDb25kaXRpb25zLkYudGl0bGUnLFxyXG4gICAgICAgICAgICAnZ29vZHMuZmluYW5jaWFsQ29uZGl0aW9ucy5GLmhlYWRlcnMuY29sMScsXHJcbiAgICAgICAgICAgICdnb29kcy5maW5hbmNpYWxDb25kaXRpb25zLkYuaGVhZGVycy5jb2wyJyxcclxuICAgICAgICAgICAgJ2dvb2RzLmZpbmFuY2lhbENvbmRpdGlvbnMuTC50aXRsZScsXHJcbiAgICAgICAgICAgICdnb29kcy5maW5hbmNpYWxDb25kaXRpb25zLkwuaGVhZGVycy5jb2wxJyxcclxuICAgICAgICAgICAgJ2dvb2RzLmZpbmFuY2lhbENvbmRpdGlvbnMuTC5oZWFkZXJzLmNvbDInLFxyXG4gICAgICAgICAgICAnZ29vZHMuZmluYW5jaWFsQ29uZGl0aW9ucy5NLnRpdGxlJyxcclxuICAgICAgICAgICAgJ2dvb2RzLmZpbmFuY2lhbENvbmRpdGlvbnMuTS5oZWFkZXJzLmNvbDEnLFxyXG4gICAgICAgICAgICAnZ29vZHMuZmluYW5jaWFsQ29uZGl0aW9ucy5NLmhlYWRlcnMuY29sMicsXHJcbiAgICAgICAgICAgICdnb29kcy5maW5hbmNpYWxDb25kaXRpb25zLlYudGl0bGUnLFxyXG4gICAgICAgICAgICAnZ29vZHMuZmluYW5jaWFsQ29uZGl0aW9ucy5WLmhlYWRlcnMuY29sMScsXHJcbiAgICAgICAgICAgICdnb29kcy5maW5hbmNpYWxDb25kaXRpb25zLlYuaGVhZGVycy5jb2wyJyxcclxuICAgICAgICBdKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgc2VydmljZS50cmFuc2xhdGlvbnMgPSByZXN1bHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY29weURlc2NyaXB0aW9uKGxpbmVzLCBtb3ZlbWVudCkge1xyXG4gICAgICAgIHZhciBkZXNjcmlwdGlvbiA9IF8uY2hhaW4obGluZXMpXHJcbiAgICAgICAgICAgIC5kcm9wKCkgLy8gZHJvcCBjaGFwdGVyXHJcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24obGluZSwgaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbmRlbnRzID0gXy5yZXBlYXQoJy0gJywgbGluZS5pbmRlbnQpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvZGUgPSBsaW5lLmNvZGU7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGxpbmVzLmxlbmd0aCAtIDIpIHsgLy8gbWludXMgMiBiZWNhdXNlIHdlIGRyb3BwZWQgb25lXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVtZW50ID09PSAnZXhwb3J0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gJGZpbHRlcignZm9ybWF0R25Db2RlJykoY29kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gJGZpbHRlcignZm9ybWF0VGFyaWNDb2RlJykoY29kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29kZSA9ICRmaWx0ZXIoJ3N0cmlwVGFyaWNDb2RlJykoY29kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29kZSA9ICRmaWx0ZXIoJ2Zvcm1hdFRhcmljQ29kZScpKGNvZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUgKyAnXFx0JyArIGluZGVudHMgKyBsaW5lLmRlc2NyaXB0aW9uO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuam9pbihcIlxcclxcblwiKVxyXG4gICAgICAgICAgICAudmFsdWUoKTtcclxuICAgICAgICAgICAgY29tbW9uLmludGVyYWN0aW9uLmNvcHlUZXh0VG9DbGlwYm9hcmQoZGVzY3JpcHRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbGxhcHNlTWVhc3VyZXMobWVhc3VyZXMpIHtcclxuICAgICAgICBfLmZvckVhY2gobWVhc3VyZXMsIGZ1bmN0aW9uIChtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgIG1lYXN1cmUuZXhwYW5kZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKG1lYXN1cmUubWVhc3VyZXMgJiYgbWVhc3VyZS5tZWFzdXJlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBfLmZvckVhY2gobWVhc3VyZS5tZWFzdXJlcywgZnVuY3Rpb24gKHN1Ym1lYXN1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWJtZWFzdXJlLmV4cGFuZGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvdW50cnlDb2RlTWF0Y2hlcihzdHJzKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZpbmRNYXRjaGVzKHEsIGNiKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXRjaGVzLCBzdWJzdHJSZWdleDtcclxuXHJcbiAgICAgICAgICAgIC8vIGFuIGFycmF5IHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBzdWJzdHJpbmcgbWF0Y2hlc1xyXG4gICAgICAgICAgICBtYXRjaGVzID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAocS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICBxID0gcS5yZXBsYWNlKC9bXFwtXFxbXFxdXFwvXFx7XFx9XFwoXFwpXFwqXFwrXFw/XFwuXFxcXFxcXlxcJFxcfF0vZywgXCJcXFxcJCZcIik7XHJcbiAgICAgICAgICAgICAgICAvLyByZWdleCB1c2VkIHRvIGRldGVybWluZSBpZiBhIHN0cmluZyBjb250YWlucyB0aGUgc3Vic3RyaW5nIGBxYFxyXG4gICAgICAgICAgICAgICAgc3Vic3RyUmVnZXggPSBuZXcgUmVnRXhwKHEsICdpJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBwb29sIG9mIHN0cmluZ3MgYW5kIGZvciBhbnkgc3RyaW5nIHRoYXRcclxuICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5zIHRoZSBzdWJzdHJpbmcgYHFgLCBhZGQgaXQgdG8gdGhlIGBtYXRjaGVzYCBhcnJheVxyXG4gICAgICAgICAgICAgICAgXy5lYWNoKHN0cnMsIGZ1bmN0aW9uIChzdHIsIGkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic3RyUmVnZXgudGVzdChzdHIuY29kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHR5cGVhaGVhZCBqUXVlcnkgcGx1Z2luIGV4cGVjdHMgc3VnZ2VzdGlvbnMgdG8gYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBKYXZhU2NyaXB0IG9iamVjdCwgcmVmZXIgdG8gdHlwZWFoZWFkIGRvY3MgZm9yIG1vcmUgaW5mb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goeyB2YWx1ZTogc3RyLm5hbWUgKyAnICgnICsgc3RyLmNvZGUgKyAnKScgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2IobWF0Y2hlcyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjb3VudHJ5TmFtZU1hdGNoZXIoc3Rycykge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBmaW5kTWF0Y2hlcyhxLCBjYikge1xyXG4gICAgICAgICAgICB2YXIgbWF0Y2hlcywgc3Vic3RyUmVnZXg7XHJcblxyXG4gICAgICAgICAgICAvLyBhbiBhcnJheSB0aGF0IHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggc3Vic3RyaW5nIG1hdGNoZXNcclxuICAgICAgICAgICAgbWF0Y2hlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgcSA9IHEucmVwbGFjZSgvW1xcLVxcW1xcXVxcL1xce1xcfVxcKFxcKVxcKlxcK1xcP1xcLlxcXFxcXF5cXCRcXHxdL2csIFwiXFxcXCQmXCIpO1xyXG4gICAgICAgICAgICAvLyByZWdleCB1c2VkIHRvIGRldGVybWluZSBpZiBhIHN0cmluZyBjb250YWlucyB0aGUgc3Vic3RyaW5nIGBxYFxyXG4gICAgICAgICAgICBzdWJzdHJSZWdleCA9IG5ldyBSZWdFeHAocSwgJ2knKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCB0aGUgcG9vbCBvZiBzdHJpbmdzIGFuZCBmb3IgYW55IHN0cmluZyB0aGF0XHJcbiAgICAgICAgICAgIC8vIGNvbnRhaW5zIHRoZSBzdWJzdHJpbmcgYHFgLCBhZGQgaXQgdG8gdGhlIGBtYXRjaGVzYCBhcnJheVxyXG4gICAgICAgICAgICAvLyBzZWNvbmQgY2hlY2sgY291bnRyeSBuYW1lc1xyXG4gICAgICAgICAgICBfLmVhY2goc3RycywgZnVuY3Rpb24gKHN0ciwgaSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YnN0clJlZ2V4LnRlc3Qoc3RyLm5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHR5cGVhaGVhZCBqUXVlcnkgcGx1Z2luIGV4cGVjdHMgc3VnZ2VzdGlvbnMgdG8gYVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEphdmFTY3JpcHQgb2JqZWN0LCByZWZlciB0byB0eXBlYWhlYWQgZG9jcyBmb3IgbW9yZSBpbmZvXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHsgdmFsdWU6IHN0ci5uYW1lICsgJyAoJyArIHN0ci5jb2RlICsgJyknIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNiKG1hdGNoZXMpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZXhwYW5kTWVhc3VyZXMobWVhc3VyZXMpIHtcclxuICAgICAgICBfLmZvckVhY2gobWVhc3VyZXMsIGZ1bmN0aW9uIChtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgIG1lYXN1cmUuZXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAobWVhc3VyZS5tZWFzdXJlcyAmJiBtZWFzdXJlLm1lYXN1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChtZWFzdXJlLm1lYXN1cmVzLCBmdW5jdGlvbiAoc3VibWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Ym1lYXN1cmUuZXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRGaW5hbmNpYWxDb25kaXRpb25EZXNjcmlwdGlvbihjb2RlKSB7XHJcbiAgICAgICAgdmFyIG91dHB1dCA9IHtcclxuICAgICAgICAgICAgdGl0bGU6IHNlcnZpY2UudHJhbnNsYXRpb25zWydnb29kcy5maW5hbmNpYWxDb25kaXRpb25zLicgKyBjb2RlICsgJy50aXRsZSddLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBbc2VydmljZS50cmFuc2xhdGlvbnNbXHJcbiAgICAgICAgICAgICAgICAnZ29vZHMuZmluYW5jaWFsQ29uZGl0aW9ucy4nICsgY29kZSArICcuaGVhZGVycy5jb2wxJ10sIFxyXG4gICAgICAgICAgICAgICAgc2VydmljZS50cmFuc2xhdGlvbnNbJ2dvb2RzLmZpbmFuY2lhbENvbmRpdGlvbnMuJyArIGNvZGUgKyAnLmhlYWRlcnMuY29sMidcclxuICAgICAgICAgICAgXV1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGhhc0FkZGl0aW9uYWxDb2RlKG1lYXN1cmUsIGFkZGl0aW9uYWxDb2RlRmlsdGVyKSB7XHJcbiAgICAgICAgdmFyIGZpbHRlck5vcm1hbGl6ZWRUb0FkZGl0aW9uYWxDb2RlO1xyXG4gICAgICAgIGlmIChhZGRpdGlvbmFsQ29kZUZpbHRlciA9PT0gbnVsbCB8fCBhZGRpdGlvbmFsQ29kZUZpbHRlciA9PT0gdW5kZWZpbmVkIHx8IGFkZGl0aW9uYWxDb2RlRmlsdGVyID09PSAnJylcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIGZpbHRlck5vcm1hbGl6ZWRUb0FkZGl0aW9uYWxDb2RlID0gYWRkaXRpb25hbENvZGVGaWx0ZXIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFwiLVwiLCBcIlwiKS5yZXBsYWNlKC9cXHMvZywgXCJcIik7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVhc3VyZS5hZGRpdGlvbmFsX2NvZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChtZWFzdXJlLmFkZGl0aW9uYWxfY29kZXNbaV0gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlLmFkZGl0aW9uYWxfY29kZXNbaV0uZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKGFkZGl0aW9uYWxDb2RlRmlsdGVyLnRvTG93ZXJDYXNlKCkpID4gLTEpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAobWVhc3VyZS5hZGRpdGlvbmFsX2NvZGVzW2ldLnR5cGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGZpbHRlck5vcm1hbGl6ZWRUb0FkZGl0aW9uYWxDb2RlLnN1YnN0cigwLCAxKSkgPiAtMSkgeyAvLyBzZWFyY2ggcXVlcnkgc3RhcnRzIHdpdGggYWRkaXRpb25hbC1jb2RlLXR5cGVcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZS5hZGRpdGlvbmFsX2NvZGVzW2ldLmNvZGUuaW5kZXhPZihmaWx0ZXJOb3JtYWxpemVkVG9BZGRpdGlvbmFsQ29kZS5zdWJzdHIoMSkpID09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWVhc3VyZS5hZGRpdGlvbmFsX2NvZGVzW2ldLmNvZGUuaW5kZXhPZihmaWx0ZXJOb3JtYWxpemVkVG9BZGRpdGlvbmFsQ29kZSkgPT0gMCkgeyAvLyB0eXBlIG5vdCBlbnRlcmVkIGJ1dCBjb2RlIG1hdGNoZXNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaGFzQWRkaXRpb25hbENvZGVEZXNjcmlwdGlvbihhZGRpdGlvbmFsQ29kZSwgYWRkaXRpb25hbENvZGVGaWx0ZXIpIHtcclxuICAgICAgICB2YXIgZmlsdGVyTm9ybWFsaXplZFRvQWRkaXRpb25hbENvZGU7XHJcblxyXG4gICAgICAgIGlmIChhZGRpdGlvbmFsQ29kZUZpbHRlciA9PT0gbnVsbCB8fCBhZGRpdGlvbmFsQ29kZUZpbHRlciA9PT0gdW5kZWZpbmVkIHx8IGFkZGl0aW9uYWxDb2RlRmlsdGVyID09PSAnJylcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIGZpbHRlck5vcm1hbGl6ZWRUb0FkZGl0aW9uYWxDb2RlID0gYWRkaXRpb25hbENvZGVGaWx0ZXIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFwiLVwiLCBcIlwiKS5yZXBsYWNlKC9cXHMvZywgXCJcIik7XHJcblxyXG4gICAgICAgIGlmIChhZGRpdGlvbmFsQ29kZS5kZXNjcmlwdGlvbiAhPT0gbnVsbCAmJiBhZGRpdGlvbmFsQ29kZS5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkICYmIGFkZGl0aW9uYWxDb2RlLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihhZGRpdGlvbmFsQ29kZUZpbHRlci50b0xvd2VyQ2FzZSgpKSA+IC0xKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxDb2RlLnR5cGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGZpbHRlck5vcm1hbGl6ZWRUb0FkZGl0aW9uYWxDb2RlLnN1YnN0cigwLCAxKSkgPiAtMSkgeyAvLyBzZWFyY2ggcXVlcnkgc3RhcnRzIHdpdGggYWRkaXRpb25hbC1jb2RlLXR5cGVcclxuICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxDb2RlLmNvZGUuaW5kZXhPZihmaWx0ZXJOb3JtYWxpemVkVG9BZGRpdGlvbmFsQ29kZS5zdWJzdHIoMSkpID09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYWRkaXRpb25hbENvZGUuY29kZS5pbmRleE9mKGZpbHRlck5vcm1hbGl6ZWRUb0FkZGl0aW9uYWxDb2RlKSA9PSAwKSB7IC8vIHR5cGUgbm90IGVudGVyZWQgYnV0IGNvZGUgbWF0Y2hlc1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hlZCgpO1xyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbZ29vZE1vZGVsc1NlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gZ29vZE1vZGVsc1NlcnZpY2UoKSB7XHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBtZWFzdXJlc0Rpc3BsYXlNb2RlbDogbWVhc3VyZXNEaXNwbGF5TW9kZWxcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gbWVhc3VyZXNEaXNwbGF5TW9kZWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaW1wb3J0OiB7XHJcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRHV0aWVzOiBbXSxcclxuICAgICAgICAgICAgICAgIGFudGlkdW1waW5nOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluYW5jaWVlbDogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgbmlldEZpbmFuY2llZWw6IFtdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sXHJcbiAgICAgICAgICAgICAgICB0YXJpZmZzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjaWpuczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGluZ2VudGVuOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICBkcmQ6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZWZlcmVudGllczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgc2Nob3JzaW5nZW46IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIG90aGVyOiBbXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZVByaWNlczogW10sXHJcbiAgICAgICAgICAgICAgICBwcm9oaWJpdGlvbnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgc3VwcGxlbWVudGFyeUFtb3VudDogW10sXHJcbiAgICAgICAgICAgICAgICB0b2V6aWNodEFjaHRlcmFmOiBbXSxcclxuICAgICAgICAgICAgICAgIHZhdDogW10sXHJcbiAgICAgICAgICAgICAgICBvdGhlcjogW11cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXhwb3J0OiB7XHJcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRHV0aWVzOiBbXSxcclxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgcHJvaGliaXRpb25zOiBbXSxcclxuICAgICAgICAgICAgICAgIHJlc3RpdHV0aW9uczogW10sXHJcbiAgICAgICAgICAgICAgICB0b2V6aWNodEFjaHRlcmFmOiBbXSxcclxuICAgICAgICAgICAgICAgIG90aGVyOiBbXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZW5lcmFsOiB7XHJcbiAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSxcclxuICAgICAgICAgICAgICAgIG90aGVyOiBbXSxcclxuICAgICAgICAgICAgICAgIHVuaXRzOiBbXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0gWydnb29kRGlzcGxheVNlcnZpY2UnLCAnZ29vZE1vZGVsc1NlcnZpY2UnLCBtZWFzdXJlR3JvdXBpbmdTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIG1lYXN1cmVHcm91cGluZ1NlcnZpY2UoZ29vZERpc3BsYXlTZXJ2aWNlLCBnb29kTW9kZWxzU2VydmljZSkge1xyXG5cclxuICAgIC8vIFRoaXMgdmFyaWFibGUgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgZ3JvdXBpbmcgcHJvY2Vzc1xyXG4gICAgdmFyIG1lYXN1cmVHcm91cGluZ1Jlc3VsdDtcclxuXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBnZXRDZXJ0aWZpY2F0ZUdyb3Vwc0Zyb21Db25kaXRpb25Hcm91cHM6IGdldENlcnRpZmljYXRlR3JvdXBzRnJvbUNvbmRpdGlvbkdyb3VwcyxcclxuICAgICAgICBncm91cDogZ3JvdXAsXHJcbiAgICAgICAgZ3JvdXBBbnRpRHVtcGluZ01lYXN1cmVzOiBncm91cEFudGlEdW1waW5nTWVhc3VyZXMsXHJcbiAgICAgICAgZ3JvdXBDb25kaXRpb25zOiBncm91cENvbmRpdGlvbnMsXHJcbiAgICAgICAgZ3JvdXBGaW5hbmNpYWxNZWFzdXJlczogZ3JvdXBGaW5hbmNpYWxNZWFzdXJlcyxcclxuICAgICAgICBncm91cE1lYXN1cmVzOiBncm91cE1lYXN1cmVzLFxyXG4gICAgICAgIGdyb3VwTWVhc3VyZXNCeVR5cGU6IGdyb3VwTWVhc3VyZXNCeVR5cGUsXHJcbiAgICAgICAgZ3JvdXBWYXRNZWFzdXJlczogZ3JvdXBWYXRNZWFzdXJlcyxcclxuICAgICAgICBzb3J0TWVhc3VyZXNCeVJlZ2lvbjogc29ydE1lYXN1cmVzQnlSZWdpb24sXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIGdyb3VwKG1lYXN1cmVzLCByZWZlcmVuY2VDb3VudHJ5KSB7XHJcblxyXG4gICAgICAgIHZhciBtZWFzdXJlU2VyaWVzSWRzID0gXy5jaGFpbihtZWFzdXJlcylcclxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmUuc2VyaWVzO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudW5pcSgpXHJcbiAgICAgICAgICAgIC5zb3J0QnkoKVxyXG4gICAgICAgICAgICAudmFsdWUoKTtcclxuXHJcbiAgICAgICAgbWVhc3VyZUdyb3VwaW5nUmVzdWx0ID0gbmV3IGdvb2RNb2RlbHNTZXJ2aWNlLm1lYXN1cmVzRGlzcGxheU1vZGVsKCk7XHJcblxyXG4gICAgICAgIF8uZm9yRWFjaChtZWFzdXJlU2VyaWVzSWRzLCBmdW5jdGlvbiAobWVhc3VyZVNlcmllc0lkKSB7XHJcbiAgICAgICAgICAgIHZhciBtZWFzdXJlc0luTWVhc3VyZVNlcmllcyA9IF8uZmlsdGVyKG1lYXN1cmVzLCBmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmUuc2VyaWVzID09PSBtZWFzdXJlU2VyaWVzSWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBncm91cE1lYXN1cmVzRm9yTWVhc3VyZVNlcmllcyhtZWFzdXJlc0luTWVhc3VyZVNlcmllcywgbWVhc3VyZVNlcmllc0lkLCByZWZlcmVuY2VDb3VudHJ5KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1lYXN1cmVHcm91cGluZ1Jlc3VsdDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ3JvdXBNZWFzdXJlc0Zvck1lYXN1cmVTZXJpZXMobWVhc3VyZXMsIG1lYXN1cmVTZXJpZXNJZCwgcmVmZXJlbmNlQ291bnRyeSkge1xyXG5cclxuICAgICAgICBsZXQgc29ydGVkTWVhc3VyZXMgPSBzZXJ2aWNlLnNvcnRNZWFzdXJlc0J5UmVnaW9uKG1lYXN1cmVzKTtcclxuXHJcbiAgICAgICAgXy5mb3JFYWNoKHNvcnRlZE1lYXN1cmVzLCBmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICBtZWFzdXJlLmNvbmRpdGlvbkdyb3VwcyA9IHNlcnZpY2UuZ3JvdXBDb25kaXRpb25zKG1lYXN1cmUuY29uZGl0aW9ucyk7XHJcbiAgICAgICAgICAgIG1lYXN1cmUuY2VydGlmaWNhdGVHcm91cHMgPSBzZXJ2aWNlLmdldENlcnRpZmljYXRlR3JvdXBzRnJvbUNvbmRpdGlvbkdyb3VwcyhtZWFzdXJlLmNvbmRpdGlvbkdyb3Vwcyk7XHJcblxyXG4gICAgICAgICAgICBtZWFzdXJlLm51bWJlck9mQ2VydGlmaWNhdGVzID0gXy5maWx0ZXIobWVhc3VyZS5jb25kaXRpb25zLCBmdW5jdGlvbiAoY29uZGl0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gISFjb25kaXRpb24uY2VydGlmaWNhdGU7XHJcbiAgICAgICAgICAgIH0pLmxlbmd0aDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IGdyb3VwZWRNZWFzdXJlcyA9IHNlcnZpY2UuZ3JvdXBNZWFzdXJlcyhzb3J0ZWRNZWFzdXJlcyk7XHJcblxyXG4gICAgICAgIHN3aXRjaCAobWVhc3VyZVNlcmllc0lkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ0EnOiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyZXNCeVR5cGUgPSBzZXJ2aWNlLmdyb3VwTWVhc3VyZXNCeVR5cGUoZ3JvdXBlZE1lYXN1cmVzKTtcclxuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChtZWFzdXJlc0J5VHlwZSwgZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLm1vdmVtZW50ID09PSAnaW1wb3J0JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZUdyb3VwaW5nUmVzdWx0LmltcG9ydC5wcm9oaWJpdGlvbnMucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ3JvdXAubW92ZW1lbnQgPT09ICdleHBvcnQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuZXhwb3J0LnByb2hpYml0aW9ucy5wdXNoKGdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAnQic6IHtcclxuICAgICAgICAgICAgICAgIGxldCBtZWFzdXJlc0J5VHlwZSA9IHNlcnZpY2UuZ3JvdXBNZWFzdXJlc0J5VHlwZShncm91cGVkTWVhc3VyZXMpO1xyXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKG1lYXN1cmVzQnlUeXBlLCBmdW5jdGlvbiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAubW92ZW1lbnQgPT09ICdpbXBvcnQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuaW1wb3J0LmNvbmRpdGlvbnMucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ3JvdXAubW92ZW1lbnQgPT09ICdleHBvcnQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuZXhwb3J0LmNvbmRpdGlvbnMucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuZ2VuZXJhbC5jb25kaXRpb25zLnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICdDJzoge1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbmFuY2lhbE1lYXN1cmVzID0gc2VydmljZS5ncm91cE1lYXN1cmVzQnlUeXBlKHNlcnZpY2UuZ3JvdXBGaW5hbmNpYWxNZWFzdXJlcyhncm91cGVkTWVhc3VyZXMpKTtcclxuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChmaW5hbmNpYWxNZWFzdXJlcywgZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChncm91cC50eXBlX2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIxMDJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjEwNFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiMTA1XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuaW1wb3J0LnRhcmlmZnMub3RoZXIucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjEwM1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZUdyb3VwaW5nUmVzdWx0LmltcG9ydC50YXJpZmZzLmRyZC5wdXNoKGdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiMTA2XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIxNDBcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjE0MlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiMTQ1XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuaW1wb3J0LnRhcmlmZnMucHJlZmVyZW50aWVzLnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIxMTJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjExNVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiMTE5XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIxNDFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVHcm91cGluZ1Jlc3VsdC5pbXBvcnQudGFyaWZmcy5zY2hvcnNpbmdlbi5wdXNoKGdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiMTIyXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIxMjNcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjE0M1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiMTQ0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIxNDZcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjE0N1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiOTA3XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuaW1wb3J0LnRhcmlmZnMuY29udGluZ2VudGVuLnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuaW1wb3J0LnRhcmlmZnMub3RoZXIucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ0QnOiB7XHJcbiAgICAgICAgICAgICAgICBzb3J0ZWRNZWFzdXJlcyA9IF8uc29ydEJ5KHNvcnRlZE1lYXN1cmVzLCBmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlLnJlZ2lvbi5jb2RlICsgKG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlID09PSBudWxsID8gJycgOiAoMTAwMCAtIHBhcnNlSW50KG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlLmNvZGUpKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZmluYW5jaWFsTWVhc3VyZXMgPSBzZXJ2aWNlLmdyb3VwQW50aUR1bXBpbmdNZWFzdXJlcyhzb3J0ZWRNZWFzdXJlcyk7XHJcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goZmluYW5jaWFsTWVhc3VyZXMsIGZ1bmN0aW9uIChncm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXAudHlwZV9pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiNTUxXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI1NTJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjU1M1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiNTU0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI1NTVcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVHcm91cGluZ1Jlc3VsdC5pbXBvcnQuYW50aWR1bXBpbmcuZmluYW5jaWVlbC5wdXNoKGdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBtZWFzdXJlc0J5VHlwZSA9IHNlcnZpY2UuZ3JvdXBNZWFzdXJlc0J5VHlwZShncm91cGVkTWVhc3VyZXMpO1xyXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKG1lYXN1cmVzQnlUeXBlLCBmdW5jdGlvbiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoWyc1NTEnLCAnNTUyJywgJzU1MycsICc1NTQnLCAnNTU1J10uaW5kZXhPZihncm91cC50eXBlX2lkKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZUdyb3VwaW5nUmVzdWx0LmltcG9ydC5hbnRpZHVtcGluZy5uaWV0RmluYW5jaWVlbC5wdXNoKGdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ0UnOiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmluYW5jaWFsTWVhc3VyZXMgPSBzZXJ2aWNlLmdyb3VwTWVhc3VyZXNCeVR5cGUoc2VydmljZS5ncm91cEZpbmFuY2lhbE1lYXN1cmVzKGdyb3VwZWRNZWFzdXJlcykpO1xyXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGZpbmFuY2lhbE1lYXN1cmVzLCBmdW5jdGlvbiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuZXhwb3J0LnJlc3RpdHV0aW9ucy5wdXNoKGdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAnRic6XHJcbiAgICAgICAgICAgIGNhc2UgJ0onOiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmluYW5jaWFsTWVhc3VyZXMgPSBzZXJ2aWNlLmdyb3VwTWVhc3VyZXNCeVR5cGUoc2VydmljZS5ncm91cEZpbmFuY2lhbE1lYXN1cmVzKGdyb3VwZWRNZWFzdXJlcykpO1xyXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGZpbmFuY2lhbE1lYXN1cmVzLCBmdW5jdGlvbiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAubW92ZW1lbnQgPT09ICdpbXBvcnQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuaW1wb3J0LmFkZGl0aW9uYWxEdXRpZXMucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ3JvdXAubW92ZW1lbnQgPT09ICdleHBvcnQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuZXhwb3J0LmFkZGl0aW9uYWxEdXRpZXMucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ0snOlxyXG4gICAgICAgICAgICBjYXNlICdNJzoge1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbmFuY2lhbE1lYXN1cmVzID0gc2VydmljZS5ncm91cE1lYXN1cmVzQnlUeXBlKHNlcnZpY2UuZ3JvdXBGaW5hbmNpYWxNZWFzdXJlcyhncm91cGVkTWVhc3VyZXMpKTtcclxuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChmaW5hbmNpYWxNZWFzdXJlcywgZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZUdyb3VwaW5nUmVzdWx0LmltcG9ydC5yZWZlcmVuY2VQcmljZXMucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ04nOiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyZXNCeVR5cGUgPSBzZXJ2aWNlLmdyb3VwTWVhc3VyZXNCeVR5cGUoZ3JvdXBlZE1lYXN1cmVzKTtcclxuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChtZWFzdXJlc0J5VHlwZSwgZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLm1vdmVtZW50ID09PSAnaW1wb3J0JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZUdyb3VwaW5nUmVzdWx0LmltcG9ydC50b2V6aWNodEFjaHRlcmFmLnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGdyb3VwLm1vdmVtZW50ID09PSAnZXhwb3J0JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZUdyb3VwaW5nUmVzdWx0LmV4cG9ydC50b2V6aWNodEFjaHRlcmFmLnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICdPJzoge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1lYXN1cmVzQnlUeXBlID0gc2VydmljZS5ncm91cE1lYXN1cmVzQnlUeXBlKHNlcnZpY2UuZ3JvdXBGaW5hbmNpYWxNZWFzdXJlcyhncm91cGVkTWVhc3VyZXMpKTtcclxuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChtZWFzdXJlc0J5VHlwZSwgZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZUdyb3VwaW5nUmVzdWx0LmdlbmVyYWwudW5pdHMucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICc0JzogeyAvLyBUT0RPOiBCRSBvbmx5XHJcbiAgICAgICAgICAgICAgICBsZXQgZmluYW5jaWFsTWVhc3VyZXMgPSBzZXJ2aWNlLmdyb3VwTWVhc3VyZXNCeVR5cGUoc2VydmljZS5ncm91cEZpbmFuY2lhbE1lYXN1cmVzKGdyb3VwZWRNZWFzdXJlcykpO1xyXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGZpbmFuY2lhbE1lYXN1cmVzLCBmdW5jdGlvbiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuaW1wb3J0LnZhdC5wdXNoKGdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAnUCc6IC8vIFRPRE86IE5MIGFuZCBHQiBvbmx5XHJcbiAgICAgICAgICAgIGNhc2UgJ1EnOiAvLyBUT0RPOiBOTCBhbmQgR0Igb25seVxyXG4gICAgICAgICAgICBjYXNlICc1JzogeyAvLyBUT0RPOiBCRSBvbmx5XHJcbiAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlQ291bnRyeSA9PT0gJ0RFJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlU2VyaWVzSWQgPT09ICdQJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuaW1wb3J0LnZhdERFID0gc29ydGVkTWVhc3VyZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lYXN1cmVTZXJpZXNJZCA9PT0gJ1EnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVHcm91cGluZ1Jlc3VsdC5pbXBvcnQuZXhjaXNlREUgPSBzb3J0ZWRNZWFzdXJlcztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlQ291bnRyeSAhPT0gJ0dCJyAmJiBcclxuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VDb3VudHJ5ICE9PSAnU0UnICYmIFxyXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUNvdW50cnkgIT09ICdJVCcgJiYgXHJcbiAgICAgICAgICAgICAgICAgICAgXy5maWx0ZXIoc29ydGVkTWVhc3VyZXMsIGZ1bmN0aW9uIChtZWFzdXJlKSB7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1lYXN1cmUuc2VyaWVzID09PSAnUCcgJiYgbWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUgIT09IG51bGwpIHx8IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS5zZXJpZXMgPT09ICdRJyB8fCBtZWFzdXJlLnNlcmllcyA9PT0gJzUnOyBcclxuICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGggPiAwXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHNvcnRlZE1lYXN1cmVzID0gbWVhc3VyZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hZGRpdGlvbmFsX2NvZGUgPT0gbnVsbCAmJiBiLmFkZGl0aW9uYWxfY29kZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYS5hZGRpdGlvbmFsX2NvZGUgIT0gbnVsbCAmJiBiLmFkZGl0aW9uYWxfY29kZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhLmFkZGl0aW9uYWxfY29kZSA9PSBudWxsICYmIGIuYWRkaXRpb25hbF9jb2RlID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLm5vdGVzID09PSBudWxsICYmIGIubm90ZXMgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhLm5vdGVzICE9PSBudWxsICYmIGIubm90ZXMgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEubm90ZXMgPT09IG51bGwgJiYgYi5ub3RlcyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEubm90ZXMubGVuZ3RoID09PSAwICYmIGIubm90ZXMubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYS5ub3Rlcy5sZW5ndGggIT09IDAgJiYgYi5ub3Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEubm90ZXMubGVuZ3RoID09PSAwICYmIGIubm90ZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5ub3Rlc1swXS50eXBlID4gYi5ub3Rlc1swXS50eXBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYS5ub3Rlc1swXS50eXBlIDwgYi5ub3Rlc1swXS50eXBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLm5vdGVzWzBdLmNvZGUgPiBiLm5vdGVzWzBdLmNvZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhLm5vdGVzWzBdLmNvZGUgPCBiLm5vdGVzWzBdLmNvZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYWRkaXRpb25hbF9jb2RlLnR5cGUgPiBiLmFkZGl0aW9uYWxfY29kZS50eXBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEuYWRkaXRpb25hbF9jb2RlLnR5cGUgPCBiLmFkZGl0aW9uYWxfY29kZS50eXBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hZGRpdGlvbmFsX2NvZGUuY29kZSA+IGIuYWRkaXRpb25hbF9jb2RlLmNvZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYS5hZGRpdGlvbmFsX2NvZGUuY29kZSA8IGIuYWRkaXRpb25hbF9jb2RlLmNvZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VDb3VudHJ5ID09PSAnTkwnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVHcm91cGluZ1Jlc3VsdC5pbXBvcnQudmF0RXh0ZW5kZWQgPSBzZXJ2aWNlLmdyb3VwVmF0TWVhc3VyZXMoc29ydGVkTWVhc3VyZXMsIG1lYXN1cmVHcm91cGluZ1Jlc3VsdC5pbXBvcnQudmF0RXh0ZW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gaS5lLiByZWZlcmVuY2VDb3VudHJ5ID09PSAnQkUnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuaW1wb3J0LmV4Y2lzZSA9IHNlcnZpY2UuZ3JvdXBWYXRNZWFzdXJlcyhzb3J0ZWRNZWFzdXJlcywgbWVhc3VyZUdyb3VwaW5nUmVzdWx0LmltcG9ydC5leGNpc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gobWVhc3VyZUdyb3VwaW5nUmVzdWx0LmltcG9ydC52YXRFeHRlbmRlZCwgZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLm1lYXN1cmVzID0gZ3JvdXAubWVhc3VyZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuZGVzY3JpcHRpb24gPiBiLmRlc2NyaXB0aW9uID8gMSA6IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbmNpYWxNZWFzdXJlcyA9IHNlcnZpY2UuZ3JvdXBNZWFzdXJlc0J5VHlwZShzZXJ2aWNlLmdyb3VwRmluYW5jaWFsTWVhc3VyZXMoZ3JvdXBlZE1lYXN1cmVzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGZpbmFuY2lhbE1lYXN1cmVzLCBmdW5jdGlvbiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZUdyb3VwaW5nUmVzdWx0LmltcG9ydC52YXQucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICdTJzoge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1lYXN1cmVzQnlUeXBlID0gc2VydmljZS5ncm91cE1lYXN1cmVzQnlUeXBlKHNlcnZpY2UuZ3JvdXBGaW5hbmNpYWxNZWFzdXJlcyhncm91cGVkTWVhc3VyZXMpKTtcclxuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChtZWFzdXJlc0J5VHlwZSwgZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZUdyb3VwaW5nUmVzdWx0LmltcG9ydC5zdXBwbGVtZW50YXJ5QW1vdW50LnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1lYXN1cmVzQnlUeXBlID0gc2VydmljZS5ncm91cE1lYXN1cmVzQnlUeXBlKGdyb3VwZWRNZWFzdXJlcyk7XHJcbiAgICAgICAgICAgICAgICBfLmZvckVhY2gobWVhc3VyZXNCeVR5cGUsIGZ1bmN0aW9uIChncm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cC5tb3ZlbWVudCA9PT0gJ2ltcG9ydCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVHcm91cGluZ1Jlc3VsdC5pbXBvcnQub3RoZXIucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ3JvdXAubW92ZW1lbnQgPT09ICdleHBvcnQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlR3JvdXBpbmdSZXN1bHQuZXhwb3J0Lm90aGVyLnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZUdyb3VwaW5nUmVzdWx0LmdlbmVyYWwub3RoZXIucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBncm91cEFudGlEdW1waW5nTWVhc3VyZXMobWVhc3VyZXMpIHtcclxuICAgICAgICBfLmZvckVhY2gobWVhc3VyZXMsIGZ1bmN0aW9uIChtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgIGlmIChtZWFzdXJlLmR1dHkgPT09ICcnICYmIG1lYXN1cmUuY29uZGl0aW9ucyAhPT0gbnVsbCAmJiBtZWFzdXJlLmNvbmRpdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGR1dGllcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKG1lYXN1cmUuY29uZGl0aW9ucywgZnVuY3Rpb24gKGNvbmRpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGR1dGllcy5wdXNoKGNvbmRpdGlvbi5kdXR5KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgbWVhc3VyZS5kdXR5ID0gXy5jaGFpbihkdXRpZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLnVuaXEoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oZHV0eSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWR1dHk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAudmFsdWUoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCc7ICcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB2YXIgZ3JvdXBzID0gXy5yZWR1Y2UobWVhc3VyZXMsIGZ1bmN0aW9uIChtZW1vLCBtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgIHZhciBnID0gXy5maW5kKG1lbW8sIGZ1bmN0aW9uIChncm91cCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmRlc2NyaXB0aW9uID09PSBtZWFzdXJlLmRlc2NyaXB0aW9uICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAudHlwZV9pZCA9PT0gbWVhc3VyZS50eXBlX2lkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAuZHV0eSA9PT0gbWVhc3VyZS5kdXR5ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgXy5pc0VxdWFsKGdyb3VwLmNvbmRpdGlvbnMsIG1lYXN1cmUuY29uZGl0aW9ucykgJiZcclxuICAgICAgICAgICAgICAgICAgICBfLmlzRXF1YWwoZ3JvdXAucmVnaW9uLCBtZWFzdXJlLnJlZ2lvbikgJiZcclxuICAgICAgICAgICAgICAgICAgICBfLmlzRXF1YWwoZ3JvdXAuZXhjbHVkZWRfcmVnaW9ucywgbWVhc3VyZS5leGNsdWRlZF9yZWdpb25zKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIF8uaXNFcXVhbChncm91cC5ub3RlcywgbWVhc3VyZS5ub3RlcykgJiZcclxuICAgICAgICAgICAgICAgICAgICBncm91cC5tb3ZlbWVudCA9PT0gbWVhc3VyZS5tb3ZlbWVudDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIChnKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChnLmhhc0FkZGl0aW9uYWxDb2RlcyA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgZy5oYXNBZGRpdGlvbmFsQ29kZXMgPSBtZWFzdXJlLmhhc0FkZGl0aW9uYWxDb2Rlc1xyXG4gICAgICAgICAgICAgICAgaWYgKGcuaXNFeHBhbmRhYmxlID09PSB1bmRlZmluZWQgfHwgZy5pc0V4cGFuZGFibGUgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgIGcuaXNFeHBhbmRhYmxlID0gbWVhc3VyZS5jb25kaXRpb25zICE9PSBudWxsICYmIG1lYXN1cmUuY29uZGl0aW9ucy5sZW5ndGggPiAwO1xyXG4gICAgICAgICAgICAgICAgZy5hZGRpdGlvbmFsX2NvZGVzLnB1c2gobWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUpO1xyXG4gICAgICAgICAgICAgICAgZy5pZHMgKz0gJ3wnICsgbWVhc3VyZS5pZDtcclxuICAgICAgICAgICAgICAgIGcubWVhc3VyZXMucHVzaChtZWFzdXJlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG1lbW8ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRzOiAnJyArIG1lYXN1cmUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9jb2RlczogW21lYXN1cmUuYWRkaXRpb25hbF9jb2RlXSxcclxuICAgICAgICAgICAgICAgICAgICBkdXR5OiBtZWFzdXJlLmR1dHksXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzQWRkaXRpb25hbENvZGVzOiBtZWFzdXJlLmhhc0FkZGl0aW9uYWxDb2RlcyxcclxuICAgICAgICAgICAgICAgICAgICBpc0V4cGFuZGFibGU6IG1lYXN1cmUuY29uZGl0aW9ucyAhPT0gbnVsbCAmJiBtZWFzdXJlLmNvbmRpdGlvbnMubGVuZ3RoID4gMCxcclxuICAgICAgICAgICAgICAgICAgICBtb3ZlbWVudDogbWVhc3VyZS5tb3ZlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogbWVhc3VyZS5kZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBtZWFzdXJlLmNvbmRpdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uRXZhbHVhdGlvbjogbWVhc3VyZS5jb25kaXRpb25FdmFsdWF0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbkdyb3VwczogbWVhc3VyZS5jb25kaXRpb25Hcm91cHMsXHJcbiAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVHcm91cHM6IG1lYXN1cmUuY2VydGlmaWNhdGVHcm91cHMsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVnaW9uOiBtZWFzdXJlLnJlZ2lvbixcclxuICAgICAgICAgICAgICAgICAgICBleGNsdWRlZF9yZWdpb25zOiBtZWFzdXJlLmV4Y2x1ZGVkX3JlZ2lvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBtZWFzdXJlLm9yaWdpbixcclxuICAgICAgICAgICAgICAgICAgICBzZXJpZXM6IG1lYXN1cmUuc2VyaWVzLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGVfaWQ6IG1lYXN1cmUudHlwZV9pZCxcclxuICAgICAgICAgICAgICAgICAgICBub3RlczogbWVhc3VyZS5ub3RlcyxcclxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlczogW21lYXN1cmVdXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbWVtbztcclxuICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgIGdyb3VwcyA9IF8ucmVkdWNlKGdyb3VwcywgZnVuY3Rpb24gKG1lbW8sIG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgdmFyIGcgPSBfLmZpbmQobWVtbywgZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAuZGVzY3JpcHRpb24gPT09IG1lYXN1cmUuZGVzY3JpcHRpb24gJiZcclxuICAgICAgICAgICAgICAgICAgICBncm91cC50eXBlX2lkID09PSBtZWFzdXJlLnR5cGVfaWQgJiZcclxuICAgICAgICAgICAgICAgICAgICBncm91cC5tb3ZlbWVudCA9PT0gbWVhc3VyZS5tb3ZlbWVudDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIChnKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChnLmhhc0FkZGl0aW9uYWxDb2RlcyA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgZy5oYXNBZGRpdGlvbmFsQ29kZXMgPSBtZWFzdXJlLmhhc0FkZGl0aW9uYWxDb2Rlc1xyXG4gICAgICAgICAgICAgICAgaWYgKGcuaXNFeHBhbmRhYmxlID09PSB1bmRlZmluZWQgfHwgZy5pc0V4cGFuZGFibGUgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgIGcuaXNFeHBhbmRhYmxlID0gbWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUgIT09IG51bGwgfHwgKG1lYXN1cmUuY29uZGl0aW9ucyAhPT0gbnVsbCAmJiBtZWFzdXJlLmNvbmRpdGlvbnMubGVuZ3RoID4gMCk7XHJcbiAgICAgICAgICAgICAgICBnLm1lYXN1cmVzLnB1c2gobWVhc3VyZSk7XHJcbiAgICAgICAgICAgICAgICBnLmlkcyArPSAnfCcgKyBtZWFzdXJlLmlkcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG1lbW8ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRzOiBtZWFzdXJlLmlkcyxcclxuICAgICAgICAgICAgICAgICAgICBkdXR5OiBtZWFzdXJlLmR1dHksXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzQWRkaXRpb25hbENvZGVzOiBtZWFzdXJlLmhhc0FkZGl0aW9uYWxDb2RlcyxcclxuICAgICAgICAgICAgICAgICAgICBpc0V4cGFuZGFibGU6IG1lYXN1cmUuaXNFeHBhbmRhYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vdmVtZW50OiBtZWFzdXJlLm1vdmVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBtZWFzdXJlLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IG1lYXN1cmUuY29uZGl0aW9ucyxcclxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25FdmFsdWF0aW9uOiBtZWFzdXJlLmNvbmRpdGlvbkV2YWx1YXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uR3JvdXBzOiBtZWFzdXJlLmNvbmRpdGlvbkdyb3VwcyxcclxuICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZUdyb3VwczogbWVhc3VyZS5jZXJ0aWZpY2F0ZUdyb3VwcyxcclxuICAgICAgICAgICAgICAgICAgICByZWdpb246IG1lYXN1cmUucmVnaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkX3JlZ2lvbnM6IG1lYXN1cmUuZXhjbHVkZWRfcmVnaW9ucyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW46IG1lYXN1cmUub3JpZ2luLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlcmllczogbWVhc3VyZS5zZXJpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZV9pZDogbWVhc3VyZS50eXBlX2lkLFxyXG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVzOiBbbWVhc3VyZV1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBtZW1vO1xyXG4gICAgICAgIH0sIFtdKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGdyb3VwcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBHcm91cCBjb25kaXRpb25zIGJ5IGNvZGVcclxuICAgIGZ1bmN0aW9uIGdyb3VwQ29uZGl0aW9ucyhjb25kaXRpb25zKSB7XHJcbiAgICAgICAgdmFyIGdyb3VwcyA9IF8ucmVkdWNlKGNvbmRpdGlvbnMsIGZ1bmN0aW9uIChtZW1vLCBjb25kaXRpb24pIHtcclxuICAgICAgICAgICAgdmFyIGcgPSBfLmZpbmQobWVtbywgZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAuY29kZSA9PT0gY29uZGl0aW9uLmNvZGU7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZykgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZy5oYXNBbW91bnREZXNjcmlwdGlvbiA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgZy5oYXNBbW91bnREZXNjcmlwdGlvbiA9IChjb25kaXRpb24uYW1vdW50X2Rlc2NyaXB0aW9uICE9PSBudWxsICYmIGNvbmRpdGlvbi5hbW91bnRfZGVzY3JpcHRpb24gIT09ICcnKTtcclxuICAgICAgICAgICAgICAgIGlmIChnLmhhc0NlcnRpZmljYXRlcyA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgZy5oYXNDZXJ0aWZpY2F0ZXMgPSAoY29uZGl0aW9uLmNlcnRpZmljYXRlICE9PSBudWxsKTtcclxuICAgICAgICAgICAgICAgIGcuY29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBtZW1vLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGhhc0Ftb3VudERlc2NyaXB0aW9uOiBjb25kaXRpb24uYW1vdW50X2Rlc2NyaXB0aW9uICE9PSBudWxsICYmIGNvbmRpdGlvbi5hbW91bnRfZGVzY3JpcHRpb24gIT09ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhc0R1dHk6ICBjb25kaXRpb24uZHV0eSAhPT0gbnVsbCAmJiBjb25kaXRpb24uZHV0eSAhPT0gJycsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzQ2VydGlmaWNhdGVzOiBjb25kaXRpb24uY2VydGlmaWNhdGUgIT09IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgY29kZTogY29uZGl0aW9uLmNvZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbmRpdGlvbi5kZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbnM6IGdvb2REaXNwbGF5U2VydmljZS5nZXRGaW5hbmNpYWxDb25kaXRpb25EZXNjcmlwdGlvbihjb25kaXRpb24uY29kZSksXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW2NvbmRpdGlvbl1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBtZW1vO1xyXG4gICAgICAgIH0sIFtdKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGdyb3VwcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBHcm91cCBtZWFzdXJlcyBieSB0eXBlLCBtb3ZlbWVudCBhbmQgZHV0eVxyXG4gICAgZnVuY3Rpb24gZ3JvdXBGaW5hbmNpYWxNZWFzdXJlcyhtZWFzdXJlcykge1xyXG4gICAgICAgIHZhciBncm91cHMgPSBfLnJlZHVjZShtZWFzdXJlcywgZnVuY3Rpb24gKG1lbW8sIG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgdmFyIGcgPSBfLmZpbmQobWVtbywgZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAudHlwZV9pZCA9PT0gbWVhc3VyZS50eXBlX2lkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAubW92ZW1lbnQgPT09IG1lYXN1cmUubW92ZW1lbnQgJiZcclxuICAgICAgICAgICAgICAgICAgICBncm91cC5kdXR5ID09PSBtZWFzdXJlLmR1dHkgJiZcclxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlLmR1dHkgIT09IG51bGwgJiYgbWVhc3VyZS5kdXR5ICE9PSAnJztcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIChnKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChnLmlzRXhwYW5kYWJsZSA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgZy5pc0V4cGFuZGFibGUgPSBtZWFzdXJlLmlzRXhwYW5kYWJsZTtcclxuICAgICAgICAgICAgICAgIGcubWVhc3VyZXMucHVzaChtZWFzdXJlKTtcclxuICAgICAgICAgICAgICAgIGcuaWRzICs9ICd8JyArIG1lYXN1cmUuaWRzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIGdycCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBpZHM6IG1lYXN1cmUuaWRzLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBtZWFzdXJlLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzRXhwYW5kYWJsZTogbWVhc3VyZS5pc0V4cGFuZGFibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgbW92ZW1lbnQ6IG1lYXN1cmUubW92ZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgZHV0eTogbWVhc3VyZS5kdXR5ID8gbWVhc3VyZS5kdXR5LnJlcGxhY2UoXCJldWNcIiwgXCImZXVybztcIikgOiBtZWFzdXJlLmR1dHksXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBtZWFzdXJlLm9yaWdpbixcclxuICAgICAgICAgICAgICAgICAgICB0eXBlX2lkOiBtZWFzdXJlLnR5cGVfaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXM6IFttZWFzdXJlXVxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBtZW1vLnB1c2goZ3JwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbWVtbztcclxuICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgIHJldHVybiBncm91cHM7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ3JvdXBNZWFzdXJlcyhtZWFzdXJlcykge1xyXG4gICAgICAgIHZhciBncm91cHMgPSBfLnJlZHVjZShtZWFzdXJlcywgZnVuY3Rpb24gKG1lbW8sIG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgdmFyIGcgPSBfLmZpbmQobWVtbywgZnVuY3Rpb24gKGdyb3VwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwLnR5cGVfaWQgPT09IG1lYXN1cmUudHlwZV9pZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLm1vdmVtZW50ID09PSBtZWFzdXJlLm1vdmVtZW50ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAuZHV0eSA9PT0gbWVhc3VyZS5kdXR5ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAucmVnaW9uVHlwZSAhPT0gJzEnICYmIG1lYXN1cmUucmVnaW9uLnR5cGUgIT09ICcxJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLnVjY19lbmRfdXNlX3Byb2NlZHVyZV9jb2RlXzQ0ID09PSBtZWFzdXJlLnVjY19lbmRfdXNlX3Byb2NlZHVyZV9jb2RlXzQ0ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgXy5pc0VxdWFsKGdyb3VwLmNvbmRpdGlvbnMsIG1lYXN1cmUuY29uZGl0aW9ucykgJiZcclxuICAgICAgICAgICAgICAgICAgICBfLmlzRXF1YWwoZ3JvdXAubm90ZXMsIG1lYXN1cmUubm90ZXMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgXy5pc0VxdWFsKGdyb3VwLm9yZGVybnVtYmVyLCBtZWFzdXJlLm9yZGVybnVtYmVyKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIF8uaXNFcXVhbChncm91cC5wcmVmZXJlbmNlX2NvZGVzLCBtZWFzdXJlLnByZWZlcmVuY2VfY29kZXMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgXy5pc0VxdWFsKGdyb3VwLnVjY19wcmVmZXJlbmNlX2NvZGVzLCBtZWFzdXJlLnVjY19wcmVmZXJlbmNlX2NvZGVzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIF8uaXNFcXVhbChncm91cC5hZGRpdGlvbmFsX2NvZGUsIG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgIDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIChnKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChnLmhhc0FkZGl0aW9uYWxDb2RlcyA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgZy5oYXNBZGRpdGlvbmFsQ29kZXMgPSAobWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUgIT09IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGcuaXNFeHBhbmRhYmxlID09PSBmYWxzZSlcclxuICAgICAgICAgICAgICAgICAgICBnLmlzRXhwYW5kYWJsZSA9IG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlICE9PSBudWxsIHx8IG1lYXN1cmUuY29uZGl0aW9ucy5sZW5ndGggPiAwO1xyXG4gICAgICAgICAgICAgICAgZy5pZHMgKz0gJ3wnICsgbWVhc3VyZS5pZDtcclxuICAgICAgICAgICAgICAgIGcubWVhc3VyZXMucHVzaChtZWFzdXJlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciBncnAgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRzOiAnJyArIG1lYXN1cmUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IG1lYXN1cmUuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzQWRkaXRpb25hbENvZGVzOiBtZWFzdXJlLmFkZGl0aW9uYWxfY29kZSAhPT0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBpc0V4cGFuZGFibGU6IG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlICE9PSBudWxsIHx8IG1lYXN1cmUuY29uZGl0aW9ucy5sZW5ndGggPiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vdmVtZW50OiBtZWFzdXJlLm1vdmVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvblR5cGU6IG1lYXN1cmUucmVnaW9uLnR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogbWVhc3VyZS5jb25kaXRpb25zLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbkV2YWx1YXRpb246IG1lYXN1cmUuY29uZGl0aW9uRXZhbHVhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25Hcm91cHM6IG1lYXN1cmUuY29uZGl0aW9uR3JvdXBzLFxyXG4gICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlR3JvdXBzOiBtZWFzdXJlLmNlcnRpZmljYXRlR3JvdXBzLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGVzOiBtZWFzdXJlLm5vdGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZGVybnVtYmVyOiBtZWFzdXJlLm9yZGVybnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbjogbWVhc3VyZS5vcmlnaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9jb2RlOiBtZWFzdXJlLmFkZGl0aW9uYWxfY29kZSxcclxuICAgICAgICAgICAgICAgICAgICBwcmVmZXJlbmNlX2NvZGVzOiBtZWFzdXJlLnByZWZlcmVuY2VfY29kZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgdWNjX3ByZWZlcmVuY2VfY29kZXM6IG1lYXN1cmUudWNjX3ByZWZlcmVuY2VfY29kZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgdWNjX2VuZF91c2VfcHJvY2VkdXJlX2NvZGVfNDQ6IG1lYXN1cmUudWNjX2VuZF91c2VfcHJvY2VkdXJlX2NvZGVfNDQsXHJcbiAgICAgICAgICAgICAgICAgICAgZHV0eTogbWVhc3VyZS5kdXR5LFxyXG4gICAgICAgICAgICAgICAgICAgIHNlcmllczogbWVhc3VyZS5zZXJpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZV9pZDogbWVhc3VyZS50eXBlX2lkLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lvbjogbWVhc3VyZS5yZWdpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRfcmVnaW9uczogbWVhc3VyZS5leGNsdWRlZF9yZWdpb25zLFxyXG4gICAgICAgICAgICAgICAgICAgIG51bWJlck9mQ2VydGlmaWNhdGVzOiBtZWFzdXJlLm51bWJlck9mQ2VydGlmaWNhdGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIHVrX3F1b3RhX2luZm9ybWF0aW9uOiBtZWFzdXJlLnVrX3F1b3RhX2luZm9ybWF0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVzOiBbbWVhc3VyZV1cclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgbWVtby5wdXNoKGdycCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG1lbW87XHJcbiAgICAgICAgfSwgW10pO1xyXG4gICAgICAgIGdyb3VwcyA9IF8uc29ydEJ5KGdyb3VwcywgZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoZ3JvdXAucmVnaW9uID8gZ3JvdXAucmVnaW9uLmNvZGUgOiAnJykgKyAoZ3JvdXAuYWRkaXRpb25hbF9jb2RlID8gZ3JvdXAuYWRkaXRpb25hbF9jb2RlLmNvZGUgOiAnJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGdyb3VwcztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBncm91cE1lYXN1cmVzQnlUeXBlKG1lYXN1cmVzKSB7XHJcbiAgICAgICAgdmFyIGdyb3VwcyA9IF8ucmVkdWNlKG1lYXN1cmVzLCBmdW5jdGlvbiAobWVtbywgbWVhc3VyZSkge1xyXG4gICAgICAgICAgICB2YXIgZyA9IF8uZmluZChtZW1vLCBmdW5jdGlvbiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBncm91cC5kZXNjcmlwdGlvbiA9PT0gbWVhc3VyZS5kZXNjcmlwdGlvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLnR5cGVfaWQgPT09IG1lYXN1cmUudHlwZV9pZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLm1vdmVtZW50ID09PSBtZWFzdXJlLm1vdmVtZW50O1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGcpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGcuaGFzQWRkaXRpb25hbENvZGVzID09PSBmYWxzZSlcclxuICAgICAgICAgICAgICAgICAgICBnLmhhc0FkZGl0aW9uYWxDb2RlcyA9IG1lYXN1cmUuaGFzQWRkaXRpb25hbENvZGVzXHJcbiAgICAgICAgICAgICAgICBpZiAoZy5pc0V4cGFuZGFibGUgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgIGcuaXNFeHBhbmRhYmxlID0gbWVhc3VyZS5pc0V4cGFuZGFibGU7XHJcbiAgICAgICAgICAgICAgICBnLm1lYXN1cmVzLnB1c2gobWVhc3VyZSk7XHJcbiAgICAgICAgICAgICAgICBnLmlkcyArPSAnfCcgKyBtZWFzdXJlLmlkcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciBncnAgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRzOiBtZWFzdXJlLmlkcyxcclxuICAgICAgICAgICAgICAgICAgICBoYXNBZGRpdGlvbmFsQ29kZXM6IG1lYXN1cmUuaGFzQWRkaXRpb25hbENvZGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzRXhwYW5kYWJsZTogbWVhc3VyZS5pc0V4cGFuZGFibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgbW92ZW1lbnQ6IG1lYXN1cmUubW92ZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IG1lYXN1cmUuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBtZWFzdXJlLm9yaWdpbixcclxuICAgICAgICAgICAgICAgICAgICB0eXBlX2lkOiBtZWFzdXJlLnR5cGVfaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXM6IFttZWFzdXJlXVxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBtZW1vLnB1c2goZ3JwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbWVtbztcclxuICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgIHJldHVybiBncm91cHM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR3JvdXAgbWVhc3VyZXMgYnkgYWRkaXRpb25hbCBjb2RlXHJcbiAgICBmdW5jdGlvbiBncm91cFZhdE1lYXN1cmVzKG1lYXN1cmVzLCBwcmV2aW91c2x5R3JvdXBlZE1lYXN1cmVzKSB7XHJcbiAgICAgICAgaWYgKCFwcmV2aW91c2x5R3JvdXBlZE1lYXN1cmVzKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzbHlHcm91cGVkTWVhc3VyZXMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGdyb3VwcyA9IF8ucmVkdWNlKG1lYXN1cmVzLCBmdW5jdGlvbiAobWVtbywgbWVhc3VyZSkge1xyXG4gICAgICAgICAgICB2YXIgZyA9IF8uZmluZChtZW1vLCBmdW5jdGlvbiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgIGlmIChncm91cC5hZGRpdGlvbmFsX2NvZGUgPT09IG51bGwgfHwgbWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAuYWRkaXRpb25hbF9jb2RlID09PSBudWxsICYmIG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlID09PSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmFkZGl0aW9uYWxfY29kZS50eXBlID09PSBtZWFzdXJlLmFkZGl0aW9uYWxfY29kZS50eXBlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYWRkaXRpb25hbF9jb2RlLmNvZGUgPT09IG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlLmNvZGU7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZykgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICBnLm1lYXN1cmVzLnB1c2gobWVhc3VyZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBtZW1vLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfY29kZTogbWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzQWRkaXRpb25hbENvZGVzOiAhIW1lYXN1cmUuYWRkaXRpb25hbF9jb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbjogbWVhc3VyZS5vcmlnaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXM6IFttZWFzdXJlXVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG1lbW87XHJcbiAgICAgICAgfSwgcHJldmlvdXNseUdyb3VwZWRNZWFzdXJlcyk7XHJcblxyXG4gICAgICAgIHJldHVybiBncm91cHM7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc29ydE1lYXN1cmVzQnlSZWdpb24obWVhc3VyZXMpIHtcclxuICAgICAgICByZXR1cm4gbWVhc3VyZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICBpZiAoYS5yZWdpb24uY29kZSA+IGIucmVnaW9uLmNvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhLnJlZ2lvbi5jb2RlIDwgYi5yZWdpb24uY29kZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldENlcnRpZmljYXRlR3JvdXBzRnJvbUNvbmRpdGlvbkdyb3Vwcyhjb25kaXRpb25Hcm91cHMpIHtcclxuICAgICAgICByZXR1cm4gXy5jaGFpbihjb25kaXRpb25Hcm91cHMpXHJcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24oY29uZGl0aW9uR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmNoYWluKGNvbmRpdGlvbkdyb3VwLmNvbmRpdGlvbnMpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoY29uZGl0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWNvbmRpdGlvbi5jZXJ0aWZpY2F0ZTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbmRpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uLmNlcnRpZmljYXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLnZhbHVlKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNlcnRpZmljYXRlR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZUdyb3VwLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC52YWx1ZSgpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCJhbmd1bGFyLm1vZHVsZSgndGFyaWMubGlua3MnLCBbXSlcclxuICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIC5jb21wb25lbnQoJ2Nhc2VMYXdMaW5rUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jYXNlLWxhdy1saW5rLXBhZ2UnKSlcclxuICAgIC5jb21wb25lbnQoJ2V1ckxleExpbmtQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2V1ci1sZXgtbGluay1wYWdlJykpXHJcbiAgICA7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL2xpbmtzL2Nhc2UtbGF3LzpvcmlnaW4vOmlkVHlwZS86aWQnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPGNhc2UtbGF3LWxpbmstcGFnZT48L2Nhc2UtbGF3LWxpbmstcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2hlbignL2xpbmtzL2V1ci1sZXgvOmlkVHlwZS86aWQnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPGV1ci1sZXgtbGluay1wYWdlPjwvZXVyLWxleC1saW5rLXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgO1xyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBjYXNlTGF3TGlua0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2xpbmtzL2NvbXBvbmVudHMvY2FzZS1sYXctbGluay1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG5jYXNlTGF3TGlua0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckbG9jYXRpb24nLFxyXG4gICAgJyRyb3V0ZVBhcmFtcycsXHJcbiAgICAnZXVDYXNlTGF3RGF0YVNlcnZpY2UnLFxyXG4gICAgJ25sQ2FzZUxhd0RhdGFTZXJ2aWNlJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gY2FzZUxhd0xpbmtDb250cm9sbGVyKFxyXG4gICAgJGxvY2F0aW9uLFxyXG4gICAgJHJvdXRlUGFyYW1zLFxyXG4gICAgZXVDYXNlTGF3RGF0YVNlcnZpY2UsXHJcbiAgICBubENhc2VMYXdEYXRhU2VydmljZVxyXG4pIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZFxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIHN3aXRjaCAoJHJvdXRlUGFyYW1zLm9yaWdpbi50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ0VVJzpcclxuICAgICAgICAgICAgICAgIGZvbGxvd0V1Q2FzZUxhd0xpbmsoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdOTCc6XHJcbiAgICAgICAgICAgICAgICBmb2xsb3dEdXRjaENhc2VMYXdMaW5rKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZm9sbG93RXVDYXNlTGF3TGluaygpIHtcclxuICAgICAgICBzd2l0Y2ggKCRyb3V0ZVBhcmFtcy5pZFR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnY2VsZXgnOlxyXG4gICAgICAgICAgICAgICAgZXVDYXNlTGF3RGF0YVNlcnZpY2UucXVlcnkuQ2VsZXggPSAkcm91dGVQYXJhbXMuaWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnZWNsaSc6XHJcbiAgICAgICAgICAgICAgICBldUNhc2VMYXdEYXRhU2VydmljZS5xdWVyeS5FY2xpID0gJHJvdXRlUGFyYW1zLmlkO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICRsb2NhdGlvbi51cmwoJ2Nhc2UtbGF3L2V1JykucmVwbGFjZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZvbGxvd0R1dGNoQ2FzZUxhd0xpbmsoKSB7XHJcbiAgICAgICAgc3dpdGNoICgkcm91dGVQYXJhbXMuaWRUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2VjbGknOlxyXG4gICAgICAgICAgICAgICAgbmxDYXNlTGF3RGF0YVNlcnZpY2UucXVlcnkuRWNsaSA9ICRyb3V0ZVBhcmFtcy5pZDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkbG9jYXRpb24udXJsKCdjYXNlLWxhdy9ubCcpLnJlcGxhY2UoKTtcclxuICAgIH1cclxuXHJcblxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBldXJMZXhMaW5rQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnbGlua3MvY29tcG9uZW50cy9ldXItbGV4LWxpbmstcGFnZS5odG1sJ1xyXG59O1xyXG5cclxuZXVyTGV4TGlua0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckbG9jYXRpb24nLFxyXG4gICAgJyRyb3V0ZVBhcmFtcycsXHJcbl07XHJcblxyXG5mdW5jdGlvbiBldXJMZXhMaW5rQ29udHJvbGxlcihcclxuICAgICRsb2NhdGlvbixcclxuICAgICRyb3V0ZVBhcmFtc1xyXG4pIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZFxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIHN3aXRjaCAoJHJvdXRlUGFyYW1zLmlkVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlICdjZWxleCc6XHJcbiAgICAgICAgICAgICAgICAkbG9jYXRpb24udXJsKCdyZWd1bGF0aW9uLWRldGFpbHMvJyArICRyb3V0ZVBhcmFtcy5pZCkucmVwbGFjZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAkbG9jYXRpb24udXJsKCduZXdzL3JlZ3VsYXRpb25zJykucmVwbGFjZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiYW5ndWxhci5tb2R1bGUoJ3RhcmljLm1lYXN1cmVUeXBlcycsIFtdKVxyXG4gICAgLmNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgcm91dGVDb25maWd1cmF0b3JdKVxyXG4gICAgLmNvbXBvbmVudCgnbWVhc3VyZVR5cGVQaWNrZXInLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbWVhc3VyZS10eXBlLXBpY2tlcicpKVxyXG4gICAgLmZpbHRlcignbWVhc3VyZVR5cGVUeXBlYWhlYWQnLCByZXF1aXJlKCcuL2ZpbHRlcnMvbWVhc3VyZS10eXBlLXR5cGVhaGVhZC1maWx0ZXInKSlcclxuICAgIC5mYWN0b3J5KCdtZWFzdXJlVHlwZVNlbGVjdG9yTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9tZWFzdXJlLXR5cGUtc2VsZWN0b3InKSlcclxuICAgIC5mYWN0b3J5KCdtZWFzdXJlVHlwZXNEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvbWVhc3VyZS10eXBlcy1kYXRhJykpO1xyXG5cclxuZnVuY3Rpb24gcm91dGVDb25maWd1cmF0b3IoJHJvdXRlUHJvdmlkZXIpIHtcclxuICAgICRyb3V0ZVByb3ZpZGVyXHJcbiAgICAgICAgLy8gLndoZW4oJy9yZWd1bGF0aW9ucycsIHtcclxuICAgICAgICAvLyAgICAgdGVtcGxhdGVVcmw6ICdyZWd1bGF0aW9ucy9jb250cm9sbGVycy9yZWd1bGF0aW9ucy1uZXdzLmh0bWwnXHJcbiAgICAgICAgLy8gfSlcclxuICAgICAgICA7XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7IFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnPCcsIFxyXG4gICAgICAgIG1lYXN1cmVUeXBlOiAnPCcsIFxyXG4gICAgICAgIHBvc3NpYmxlTWVhc3VyZVR5cGVzOiAnPCAnLCBcclxuICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAnJicgXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogbWVhc3VyZVR5cGVQaWNrZXJDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdtZWFzdXJlLXR5cGVzL2NvbXBvbmVudHMvbWVhc3VyZS10eXBlLXBpY2tlci5odG1sJ1xyXG59O1xyXG5cclxubWVhc3VyZVR5cGVQaWNrZXJDb250cm9sbGVyLiRpbmplY3QgPSBbJ21lYXN1cmVUeXBlU2VsZWN0b3JNb2RhbCddO1xyXG5cclxuZnVuY3Rpb24gbWVhc3VyZVR5cGVQaWNrZXJDb250cm9sbGVyKG1lYXN1cmVUeXBlU2VsZWN0b3JNb2RhbCkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgIGNsZWFyOiBjbGVhcixcclxuICAgICAgICBtZWFzdXJlVHlwZTogbnVsbCxcclxuICAgICAgICB1c2VySW5wdXQ6IG51bGwsXHJcbiAgICAgICAgcG9zc2libGVNZWFzdXJlVHlwZXM6IG51bGwsXHJcbiAgICAgICAgaXRlbVNlbGVjdGVkOiBpdGVtU2VsZWN0ZWQsXHJcbiAgICAgICAgb25CbHVyOiBvbkJsdXIsXHJcbiAgICAgICAgb25FbnRlcjogb25FbnRlcixcclxuICAgICAgICBzaG93TW9kYWw6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd01vZGFsKCkge1xyXG4gICAgICAgIG1lYXN1cmVUeXBlU2VsZWN0b3JNb2RhbFxyXG4gICAgICAgICAgICAuc2hvdyh2bS5wb3NzaWJsZU1lYXN1cmVUeXBlcywgdm0ubWVhc3VyZVR5cGUpXHJcbiAgICAgICAgICAgIC5yZXN1bHRcclxuICAgICAgICAgICAgLnRoZW4oaXRlbVNlbGVjdGVkKVxyXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEocmVzID09PSAnY2FuY2VsJyB8fCByZXMgPT09ICdlc2NhcGUga2V5IHByZXNzJyB8fCByZXMgPT09ICdiYWNrZHJvcCBjbGljaycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhcihldikge1xyXG4gICAgICAgIHZtLnVzZXJJbnB1dCA9IG51bGw7XHJcbiAgICAgICAgY2xlYXJTZWxlY3Rpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpIHtcclxuICAgICAgICB2bS5tZWFzdXJlVHlwZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHZtLnNlbGVjdGlvbkNoYW5nZWQpXHJcbiAgICAgICAgICAgIHZtLnNlbGVjdGlvbkNoYW5nZWQoeyBtZWFzdXJlVHlwZTogbnVsbCB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25CbHVyKCkge1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG9uRW50ZXIoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXRlbVNlbGVjdGVkKGl0ZW0sIG1vZGVsKSB7XHJcbiAgICAgICAgdm0ubWVhc3VyZVR5cGUgPSBpdGVtO1xyXG5cclxuICAgICAgICBpZiAodm0uc2VsZWN0aW9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICB2bS5zZWxlY3Rpb25DaGFuZ2VkKHsgbWVhc3VyZVR5cGU6IGl0ZW0gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbn1cclxuXHJcbiIsIm1vZHVsZS5leHBvcnRzID0gW21lYXN1cmVUeXBlVHlwZWFoZWFkRmlsdGVyXTtcclxuXHJcbi8vIFRha2VzIGNhcmUgb2Ygb3JkZXJpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIG9yZGVyIG51bWJlciB0eXBlYWhlYWQuXHJcbi8vIEl0IHJldHVybnMgdGhlIG1hdGNoZWQgb3JkZXIgbnVtYmVycywgc29ydGVkXHJcbmZ1bmN0aW9uIG1lYXN1cmVUeXBlVHlwZWFoZWFkRmlsdGVyKCkge1xyXG5cclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1lYXN1cmVUeXBlcywgcXVlcnkpIHtcclxuICAgICAgICBpZiAocXVlcnkgPT09IG51bGwgfHwgcXVlcnkgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVUeXBlcztcclxuXHJcbiAgICAgICAgdmFyIG1lYXN1cmVUeXBlTWF0Y2hQYXJ0aXRpb24gPSBfLnBhcnRpdGlvbihtZWFzdXJlVHlwZXMsIGZ1bmN0aW9uKG1lYXN1cmVUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtZWFzdXJlVHlwZS5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkucmVwbGFjZSgnICcsICcnKS50b0xvd2VyQ2FzZSgpKSA9PT0gMDtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgc3RhcnRNYXRjaGVzID0gXy5zb3J0QnkobWVhc3VyZVR5cGVNYXRjaFBhcnRpdGlvblswXSwgZnVuY3Rpb24obWVhc3VyZVR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVUeXBlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2YXIgb3RoZXJNYXRjaGVzUGFydGl0aW9uID0gXy5wYXJ0aXRpb24obWVhc3VyZVR5cGVNYXRjaFBhcnRpdGlvblsxXSwgZnVuY3Rpb24obWVhc3VyZVR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVUeXBlLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihxdWVyeS5yZXBsYWNlKCcgJywgJycpLnRvTG93ZXJDYXNlKCkpID4gMDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIG90aGVyTWF0Y2hlcyA9IF8uc29ydEJ5KG90aGVyTWF0Y2hlc1BhcnRpdGlvblswXSwgZnVuY3Rpb24obWVhc3VyZVR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVUeXBlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IF8uY29uY2F0KHN0YXJ0TWF0Y2hlcywgb3RoZXJNYXRjaGVzKTtcclxuXHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBbJyRhbmFseXRpY3MnLCAnJHVpYk1vZGFsJywgbWVhc3VyZVR5cGVTZWxlY3Rvck1vZGFsXTtcclxuXHJcbmZ1bmN0aW9uIG1lYXN1cmVUeXBlU2VsZWN0b3JNb2RhbCgkYW5hbHl0aWNzLCAkdWliTW9kYWwpIHtcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICBzaG93OiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgbWVhc3VyZVR5cGVTZWxlY3Rvck1vZGFsQ29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICdwb3NzaWJsZU1lYXN1cmVUeXBlcycsICdtZWFzdXJlVHlwZSddO1xyXG5cclxuICAgIGZ1bmN0aW9uIG1lYXN1cmVUeXBlU2VsZWN0b3JNb2RhbENvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIHBvc3NpYmxlTWVhc3VyZVR5cGVzLCBtZWFzdXJlVHlwZSkge1xyXG4gICAgICAgIHZhciB2bSA9IHtcclxuICAgICAgICAgICAgbWVhc3VyZVR5cGU6IG1lYXN1cmVUeXBlLFxyXG4gICAgICAgICAgICBjYW5jZWw6IGNhbmNlbCxcclxuICAgICAgICAgICAgbmF0aW9uYWxNZWFzdXJlVHlwZXM6IFtdLFxyXG4gICAgICAgICAgICBwb3NzaWJsZU1lYXN1cmVUeXBlczogcG9zc2libGVNZWFzdXJlVHlwZXMsXHJcbiAgICAgICAgICAgIG9rOiBva1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygnY2FuY2VsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBvayhjb2RlKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKGNvZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChwb3NzaWJsZU1lYXN1cmVUeXBlcywgbWVhc3VyZVR5cGUpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJ29wZW4tbW9kYWwtbWVhc3VyZS10eXBlLXNlbGVjdG9yJywgeyBjYXRlZ29yeTogJ21lYXN1cmUtdHlwZXMnIH0pO1xyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IG1lYXN1cmVUeXBlU2VsZWN0b3JNb2RhbENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ2N0cmwnLFxyXG4gICAgICAgICAgICBrZXlib2FyZDogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kYWxGYWRlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICBtZWFzdXJlVHlwZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlVHlwZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU1lYXN1cmVUeXBlczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3NzaWJsZU1lYXN1cmVUeXBlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2l6ZTogJ2xnJyxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdtZWFzdXJlLXR5cGVzL21vZGFscy9tZWFzdXJlLXR5cGUtc2VsZWN0b3IuaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtbWVhc3VyZS10eXBlLXNlbGVjdG9yJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFsnY29tbW9uJywgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgJ2RhdGFDb250ZXh0JywgbWVhc3VyZVR5cGVzRGF0YVNlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gbWVhc3VyZVR5cGVzRGF0YVNlcnZpY2UoY29tbW9uLCBzdGF0ZSwgZGF0YUNvbnRleHQpIHtcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIG1lYXN1cmVUeXBlc0RpY3Rpb25hcnk6IG51bGwsXHJcbiAgICAgICAgZ2V0TWVhc3VyZVR5cGVzRGljdGlvbmFyeTogZ2V0TWVhc3VyZVR5cGVzRGljdGlvbmFyeSxcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0TWVhc3VyZVR5cGVzRGljdGlvbmFyeSgpIHtcclxuXHJcbiAgICAgICAgdmFyIGRlZmVycmVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcbiAgICAgICAgaWYgKHNlcnZpY2UubWVhc3VyZVR5cGVzRGljdGlvbmFyeSkge1xyXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHNlcnZpY2UubWVhc3VyZVR5cGVzRGljdGlvbmFyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0c1tjb21tb24uY29uZmlnLmN1cnJlbnRBcGldICtcclxuICAgICAgICAgICAgICAgICcvbWVhc3VyZV90eXBlc19kaWN0aW9uYXJ5JyArXHJcbiAgICAgICAgICAgICAgICAnP2xhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG4gICAgICAgICAgICBkYXRhQ29udGV4dC5nZXQodXJsKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24obWVhc3VyZVR5cGVzRGljdGlvbmFyeSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UubWVhc3VyZVR5cGVzRGljdGlvbmFyeSA9IG1lYXN1cmVUeXBlc0RpY3Rpb25hcnk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShtZWFzdXJlVHlwZXNEaWN0aW9uYXJ5KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbn1cclxuIiwiYW5ndWxhci5tb2R1bGUoJ3RhcmljLm5ld3MnLCBbXSlcclxuICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIC5jb21wb25lbnQoJ25ld3NPdmVydmlld1BhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbmV3cy1vdmVydmlldy1wYWdlJykpXHJcbiAgICAuY29tcG9uZW50KCduZXdzU2VjdGlvbkNhc2VMYXdOZXdzUGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jYXNlLWxhdy1uZXdzLXBhZ2UnKSlcclxuICAgIC5jb21wb25lbnQoJ25ld3NTdWJuYXYnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbmV3cy1zdWJuYXYnKSlcclxuICAgIC5jb21wb25lbnQoJ2Nhc2VMYXdMaW5rcycsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9jYXNlLWxhdy1saW5rcycpKVxyXG4gICAgLmZhY3RvcnkoJ25ld3NEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvbmV3cy1kYXRhJykpXHJcbiAgICA7XHJcblxyXG5cclxuZnVuY3Rpb24gcm91dGVDb25maWd1cmF0b3IoJHJvdXRlUHJvdmlkZXIpIHtcclxuICAgICRyb3V0ZVByb3ZpZGVyXHJcbiAgICAgICAgLndoZW4oJy9uZXdzL292ZXJ2aWV3Jywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxuZXdzLW92ZXJ2aWV3LXBhZ2U+PC9uZXdzLW92ZXJ2aWV3LXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9uZXdzL3JlZ3VsYXRpb25zJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxyZWd1bGF0aW9ucy1uZXdzLXBhZ2U+PC9yZWd1bGF0aW9ucy1uZXdzLXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy9uZXdzL2Nhc2UtbGF3Jywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxuZXdzLXNlY3Rpb24tY2FzZS1sYXctbmV3cy1wYWdlPjwvbmV3cy1zZWN0aW9uLWNhc2UtbGF3LW5ld3MtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2hlbignL25ld3MvbmlldXdzLWRvdWFuZS12b29yLWJlZHJpanZlbicsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8YmVsYXN0aW5nZGllbnN0LXBhZ2U+PC9iZWxhc3RpbmdkaWVuc3QtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2hlbignL25ld3MvY29ycmVsYXRpb24tdGFibGUvOmFjdGl2ZVN1Ym5hdicsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8Y29ycmVsYXRpb24tdGFibGUtbmV3cy1wYWdlPjwvY29ycmVsYXRpb24tdGFibGUtbmV3cy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgO1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgdGVtcGxhdGVVcmw6ICduZXdzL2NvbXBvbmVudHMvY2FzZS1sYXctbGlua3MuaHRtbCdcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGNhc2VMYXdOZXdzUGFnZUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ25ld3MvY29tcG9uZW50cy9jYXNlLWxhdy1uZXdzLXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbmNhc2VMYXdOZXdzUGFnZUNvbnRyb2xsZXIuJGluamVjdCA9IFsnJGFuYWx5dGljcyddO1xyXG5cclxuZnVuY3Rpb24gY2FzZUxhd05ld3NQYWdlQ29udHJvbGxlcigkYW5hbHl0aWNzKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWRcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9jYXNlLWxhdy1uZXdzJyk7XHJcbiAgICB9XHJcbn0iLCJ2YXIgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IG5ld3NJdGVtc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ25ld3MvY29tcG9uZW50cy9uZXdzLW92ZXJ2aWV3LXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbm5ld3NJdGVtc0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnJGxvY2F0aW9uJyxcclxuICAgICckd2luZG93JyxcclxuICAgICdjb21tb24nLFxyXG4gICAgJ25ld3NEYXRhU2VydmljZSdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIG5ld3NJdGVtc0NvbnRyb2xsZXIoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICRsb2NhdGlvbixcclxuICAgICR3aW5kb3csXHJcbiAgICBjb21tb24sXHJcbiAgICBuZXdzRGF0YVNlcnZpY2VcclxuKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgZGF0ZU9wdGlvbnM6IHt9LFxyXG4gICAgICAgIGZvcm1hdDogJ2RkLU1NLXl5eXknLFxyXG4gICAgICAgIG9wZW4xOiBvcGVuMSxcclxuICAgICAgICBvcGVuMjogb3BlbjIsXHJcbiAgICAgICAgcG9wdXAxOiB7XHJcbiAgICAgICAgICAgIG9wZW5lZDogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwb3B1cDI6IHtcclxuICAgICAgICAgICAgb3BlbmVkOiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHF1ZXJ5OiB7XHJcbiAgICAgICAgICAgIFN0YXJ0RGF0ZTogbnVsbCxcclxuICAgICAgICAgICAgRW5kRGF0ZTogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29weU5ld3NJdGVtc1RvQ2xpcGJvYXJkOiBjb3B5TmV3c0l0ZW1zVG9DbGlwYm9hcmQsXHJcbiAgICAgICAgc2VhcmNoTmV3czogc2VhcmNoTmV3c1xyXG4gICAgfTtcclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL25ld3Mtb3ZlcnZpZXcnKTtcclxuICAgICAgICB2bS5xdWVyeS5TdGFydERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdCg3LCAnZGF5JykudG9EYXRlKCk7XHJcbiAgICAgICAgdm0ucXVlcnkuRW5kRGF0ZSA9IG1vbWVudCgpLnRvRGF0ZSgpO1xyXG4gICAgICAgIHZtLmJhc2VVcmwgPSBuZXcgJHdpbmRvdy5VUkwoJGxvY2F0aW9uLmFic1VybCgpKS5vcmlnaW47XHJcbiAgICAgICAgc2VhcmNoTmV3cygpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBzZWFyY2hOZXdzKCkge1xyXG4gICAgICAgIHZtLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIG5ld3NEYXRhU2VydmljZS5nZXROZXdzT3ZlcnZpZXcodm0ucXVlcnkuU3RhcnREYXRlLCB2bS5xdWVyeS5FbmREYXRlKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAobmV3c0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5uZXdzSXRlbXMgPSBfLm1hcChuZXdzSXRlbXMsIGZ1bmN0aW9uIChuZXdzSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdzSXRlbS5DYXRlZ29yeSA9PT0gJ0VVIENhc2UgTGF3Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdzSXRlbS5UaXRsZSA9IG5ld3NJdGVtLlRpdGxlLnJlcGxhY2UoLyMoPyFcXCEpL2csICc8L3A+PHA+Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NJdGVtLlVybCA9IHZtLmJhc2VVcmwgKyAnLyMhL2xpbmtzL2Nhc2UtbGF3L2V1L2NlbGV4LycgKyBuZXdzSXRlbS5DRUxFWDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NJdGVtLlVybCA9IHZtLmJhc2VVcmwgKyAnLyMhL2xpbmtzL2V1ci1sZXgvY2VsZXgvJyArIG5ld3NJdGVtLkNFTEVYO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3c0l0ZW07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjb3B5TmV3c0l0ZW1zVG9DbGlwYm9hcmQoKSB7XHJcbiAgICAgICAgdmFyIHRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3cy1vdmVydmlldy10YWJsZScpLm91dGVySFRNTDtcclxuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88XFwhLS0oPzoufFxccykrPy0tPi9nLCAnJyk7XHJcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvY2xhc3M9XCJbXlwiXSpcIi9nLCAnJyk7XHJcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvbmctXFx3Kz1cIlteXCJdKlwiL2csICcnKTtcclxuICAgICAgICBjb21tb24uaW50ZXJhY3Rpb24uY29weVRleHRUb0NsaXBib2FyZCh0ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvcGVuMSgpIHtcclxuICAgICAgICB2bS5wb3B1cDEub3BlbmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvcGVuMigpIHtcclxuICAgICAgICB2bS5wb3B1cDIub3BlbmVkID0gdHJ1ZTtcclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBhY3RpdmU6ICdAJ1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IG5ld3NTdWJuYXZDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICduZXdzL2NvbXBvbmVudHMvbmV3cy1zdWJuYXYuaHRtbCdcclxufTtcclxuXHJcbm5ld3NTdWJuYXZDb250cm9sbGVyLiRpbmplY3QgPSBbJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJ107XHJcblxyXG5mdW5jdGlvbiBuZXdzU3VibmF2Q29udHJvbGxlcihzdGF0ZSkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIHJlZmVyZW5jZUNvdW50cnk6IHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHZtO1xyXG59IiwidmFyIG1vbWVudCA9IHJlcXVpcmUoJ21vbWVudCcpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBbXHJcbiAgICAnY29tbW9uJywgXHJcbiAgICAnZGF0YUNvbnRleHQnLCBcclxuICAgIG5ld3NEYXRhU2VydmljZVxyXG5dO1xyXG5cclxuZnVuY3Rpb24gbmV3c0RhdGFTZXJ2aWNlKFxyXG4gICAgY29tbW9uLCBcclxuICAgIGRhdGFDb250ZXh0XHJcbikge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgZ2V0TmV3c092ZXJ2aWV3OiBnZXROZXdzT3ZlcnZpZXdcclxuICAgIH07XHJcbiAgICBcclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBnZXROZXdzT3ZlcnZpZXcoc3RhcnREYXRlLCBlbmREYXRlKSB7XHJcbiAgICAgICAgdmFyIHN0YXJ0RGF0ZVN0cmluZyA9IG1vbWVudChzdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIHZhciBlbmREYXRlU3RyaW5nID0gbW9tZW50KGVuZERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArXHJcbiAgICAgICAgICAgICcvbmV3cy9vdmVydmlldy8nICtcclxuICAgICAgICAgICAgJz9sYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgK1xyXG4gICAgICAgICAgICAnJnN0YXJ0ZGF0ZT0nICsgc3RhcnREYXRlU3RyaW5nICtcclxuICAgICAgICAgICAgJyZlbmRkYXRlPScgKyBlbmREYXRlU3RyaW5nO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsImFuZ3VsYXIubW9kdWxlKCd0YXJpYy5ub21lbmNsYXR1cmUnLCBbXSlcclxuICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIC8vQ29tcG9uZW50c1xyXG4gICAgLmNvbXBvbmVudCgnY29tbW9kaXR5Q29kZURlc2NyaXB0aW9uJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2NvbW1vZGl0eS1jb2RlLWRlc2NyaXB0aW9uJykpXHJcbiAgICAuY29tcG9uZW50KCdleHBvcnRSZWZ1bmROb21lbmNsYXR1cmUnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvZXhwb3J0LXJlZnVuZC1ub21lbmNsYXR1cmUnKSlcclxuICAgIC5jb21wb25lbnQoJ25vbWVuY2xhdHVyZVNlY3Rpb24nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbm9tZW5jbGF0dXJlLXNlY3Rpb24nKSlcclxuICAgIC5jb21wb25lbnQoJ25vbWVuY2xhdHVyZUNoYXB0ZXInLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbm9tZW5jbGF0dXJlLWNoYXB0ZXInKSlcclxuICAgIC5jb21wb25lbnQoJ25vbWVuY2xhdHVyZUhlYWRpbmcnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbm9tZW5jbGF0dXJlLWhlYWRpbmcnKSlcclxuICAgIC5jb21wb25lbnQoJ25vbWVuY2xhdHVyZUdyb3VwcycsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9ub21lbmNsYXR1cmUtZ3JvdXBzJykpXHJcbiAgICAuY29tcG9uZW50KCd0YXJpY0NvZGVSb3cnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvdGFyaWMtY29kZS1yb3cnKSlcclxuICAgIC5jb21wb25lbnQoJ3RhcmVzU3RhdGlzdGljYWxLZXlSb3cnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvdGFyZXMtc3RhdGlzdGljYWwta2V5LXJvdycpKVxyXG4gICAgLy8gUGFnZXNcclxuICAgIC5jb21wb25lbnQoJ2NoYXB0ZXJQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2NoYXB0ZXItcGFnZScpKVxyXG4gICAgLmNvbXBvbmVudCgnc2VjdGlvbnNQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3NlY3Rpb25zLXBhZ2UnKSlcclxuICAgIC8vIERpcmVjdGl2ZXNcclxuICAgIC8vIC5kaXJlY3RpdmUoJ3RhcmljQ29kZVJvdycsIHJlcXVpcmUoJy4vZGlyZWN0aXZlcy90YXJpYy1jb2RlLXJvdycpKVxyXG4gICAgLy8gU2VydmljZXNcclxuICAgIC5mYWN0b3J5KCdub21lbmNsYXR1cmVEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvbm9tZW5jbGF0dXJlLWRhdGEnKSlcclxuICAgIC5mYWN0b3J5KCdub21lbmNsYXR1cmVUcmVlU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvbm9tZW5jbGF0dXJlLXRyZWUnKSlcclxuICAgIDtcclxuXHJcbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJhdG9yKCRyb3V0ZVByb3ZpZGVyKSB7XHJcbiAgICAkcm91dGVQcm92aWRlclxyXG4gICAgICAgIC53aGVuKCcvc2VjdGlvbnMnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHNlY3Rpb25zLXBhZ2U+PC9zZWN0aW9ucy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvY2hhcHRlci86Y2hhcHRlck51bWJlcicsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8Y2hhcHRlci1wYWdlPjwvY2hhcHRlci1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIDtcclxufVxyXG5cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBjaGFwdGVyQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnbm9tZW5jbGF0dXJlL2NvbXBvbmVudHMvY2hhcHRlci1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG5jaGFwdGVyQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckcm91dGVQYXJhbXMnLCBcclxuICAgICdhdHJEYXRhU2VydmljZScsXHJcbiAgICAnYnRpRGF0YVNlcnZpY2UnLFxyXG4gICAgJ2Nhc2VMYXdEYXRhU2VydmljZScsXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLCBcclxuICAgICdub21lbmNsYXR1cmVEYXRhU2VydmljZScsIFxyXG4gICAgJ25vbWVuY2xhdHVyZVRyZWVTZXJ2aWNlJyxcclxuICAgICdjb21tb24nLCBcclxuICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsXHJcbiAgICAnZWNpY3NEYXRhU2VydmljZScsXHJcbl07XHJcblxyXG5mdW5jdGlvbiBjaGFwdGVyQ29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgJHJvdXRlUGFyYW1zLCBcclxuICAgIGF0ckRhdGFTZXJ2aWNlLFxyXG4gICAgYnRpRGF0YVNlcnZpY2UsXHJcbiAgICBjYXNlTGF3RGF0YVNlcnZpY2UsXHJcbiAgICBub3RpZmljYXRpb25zLCBcclxuICAgIG5vbWVuY2xhdHVyZURhdGFTZXJ2aWNlLCBcclxuICAgIG5vbWVuY2xhdHVyZVRyZWVTZXJ2aWNlLFxyXG4gICAgY29tbW9uLCBcclxuICAgIHN0YXRlLFxyXG4gICAgZWNpY3NEYXRhU2VydmljZVxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICAgICAgY2hhcHRlcjoge30sXHJcbiAgICAgICAgY2hhcHRlck51bWJlcjogJycsXHJcbiAgICAgICAgZWNpY3NDb3VudDoge30sXHJcbiAgICAgICAgbnVtYmVyT2ZFY2ljc0l0ZW1zOiAwLFxyXG4gICAgICAgIGNsaWNrUm93OiBjbGlja1JvdyxcclxuICAgICAgICBkb3VibGVDbGlja1JvdzogZG91YmxlQ2xpY2tSb3csXHJcbiAgICAgICAgZGVzZWxlY3RMaW5lOiBkZXNlbGVjdExpbmUsXHJcbiAgICAgICAgZ29Ib21lOiBnb0hvbWUsXHJcbiAgICAgICAgaGFzQ2FzZUxhdzogaGFzQ2FzZUxhdyxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGlzQXV0aG9yaXplZDogdHJ1ZSxcclxuICAgICAgICBzdGF0ZTogc3RhdGUsXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGRhdGVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGxvYWRDaGFwdGVyKCRyb3V0ZVBhcmFtcy5jaGFwdGVyTnVtYmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL2NoYXB0ZXInKTtcclxuICAgICAgICBjb21tb24uYXV0aC5jaGVjaygpO1xyXG5cclxuICAgICAgICBpZiAoJHJvdXRlUGFyYW1zLmNoYXB0ZXJOdW1iZXIgIT09IG51bGwgJiYgc3RhdGUuZmlsdGVyLm1vdmVtZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxvYWRDaGFwdGVyKCRyb3V0ZVBhcmFtcy5jaGFwdGVyTnVtYmVyKTtcclxuICAgICAgICAgICAgbG9hZEVjaWNzQ291bnQoJHJvdXRlUGFyYW1zLmNoYXB0ZXJOdW1iZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy5zdWJzY3JpYmUoJ2ZpbHRlcl9tb3ZlbWVudF9jaGFuZ2VkJywgbW92ZW1lbnRDaGFuZ2VkKTtcclxuICAgICAgICBub3RpZmljYXRpb25zLnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGRhdGVDaGFuZ2VkKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtb3ZlbWVudENoYW5nZWQoKSB7XHJcbiAgICAgICAgbG9hZENoYXB0ZXIoJHJvdXRlUGFyYW1zLmNoYXB0ZXJOdW1iZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRFY2ljc0NvdW50KGNoYXB0ZXJOdW1iZXIpIHtcclxuICAgICAgICBlY2ljc0RhdGFTZXJ2aWNlLmNvdW50UGVySGVhZGluZyhjaGFwdGVyTnVtYmVyKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbihlY2ljc0NvdW50KSB7XHJcbiAgICAgICAgICAgICAgICB2bS5lY2ljc0NvdW50ID0gZWNpY3NDb3VudDtcclxuICAgICAgICAgICAgICAgIHZtLm51bWJlck9mRWNpY3NJdGVtcyA9IF8uY2hhaW4odm0uZWNpY3NDb3VudCkudmFsdWVzKCkuc3VtKCkudmFsdWUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy51bnN1YnNjcmliZSgnZmlsdGVyX21vdmVtZW50X2NoYW5nZWQnLCBtb3ZlbWVudENoYW5nZWQpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMudW5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBkYXRlQ2hhbmdlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogdGhpcyBleGFjdCBmdW5jdGlvbiBpcyBpbiBjb250cm9sbGVycy9zZWFyY2guanMuIENhbiB3ZSBtb3ZlIHRoaXMgKG9yIHBhcnQgb2YgaXQpIHRvIHRoZSBub21lbmNsYXR1cmUgdHJlZSBzZXJ2aWNlP1xyXG4gICAgZnVuY3Rpb24gY2xpY2tSb3coaGVhZGluZykge1xyXG4gICAgICAgIHN0YXRlLmN1cnJlbnRDb2RlID0gaGVhZGluZy52YWx1ZS5jb21tb2RpdHlDb2RlO1xyXG4gICAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnRhdGlvbiA9IGhlYWRpbmcudmFsdWUuaW5kZW50YXRpb247XHJcbiAgICAgICAgaWYgKCFoZWFkaW5nLmhhc0NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGNvbW1vbi4kbG9jYXRpb24udXJsKCdnb29kLycgKyBoZWFkaW5nLnZhbHVlLmNvbW1vZGl0eUNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaGVhZGluZy5tZXRhZGF0YS5pc0V4cGFuZGVkID0gIWhlYWRpbmcubWV0YWRhdGEuaXNFeHBhbmRlZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogdGhpcyBleGFjdCBmdW5jdGlvbiBpcyBpbiBjb250cm9sbGVycy9zZWFyY2guanMuIENhbiB3ZSBtb3ZlIHRoaXMgKG9yIHBhcnQgb2YgaXQpIHRvIHRoZSBub21lbmNsYXR1cmUgdHJlZSBzZXJ2aWNlP1xyXG4gICAgZnVuY3Rpb24gZG91YmxlQ2xpY2tSb3coaGVhZGluZykge1xyXG4gICAgICAgIHN0YXRlLmN1cnJlbnRDb2RlID0gaGVhZGluZy52YWx1ZS5jb21tb2RpdHlDb2RlO1xyXG4gICAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnRhdGlvbiA9IGhlYWRpbmcudmFsdWUuaW5kZW50YXRpb247XHJcbiAgICAgICAgaWYgKCFoZWFkaW5nLmhhc0NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGNvbW1vbi4kbG9jYXRpb24udXJsKCdnb29kLycgKyBoZWFkaW5nLnZhbHVlLmNvbW1vZGl0eUNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChoZWFkaW5nLm1ldGFkYXRhLmlzRXhwYW5kZWQpIHtcclxuICAgICAgICAgICAgbm9tZW5jbGF0dXJlVHJlZVNlcnZpY2UuY29sbGFwc2VBbGwoaGVhZGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBub21lbmNsYXR1cmVUcmVlU2VydmljZS5leHBhbmRBbGwoaGVhZGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbW1vbi5pbnRlcmFjdGlvbi5jbGVhclNlbGVjdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNjcm9sbEhlYWRpbmdJbnRvVmlldygpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgYWN0aXZlSGVhZGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50YXJpYy1ib3guYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVIZWFkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmVIZWFkaW5nLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGhhc0Nhc2VMYXcoaGVhZGluZykge1xyXG4gICAgICAgIHJldHVybiBjYXNlTGF3RGF0YVNlcnZpY2UuZXVDYXNlTGF3SXRlbXNQZXJIZWFkaW5nW2hlYWRpbmddIHx8IGNhc2VMYXdEYXRhU2VydmljZS5kdXRjaENhc2VMYXdJdGVtc1BlckhlYWRpbmdbaGVhZGluZ107XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ29Ib21lKCkge1xyXG4gICAgICAgIGNvbW1vbi4kbG9jYXRpb24udXJsKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkQ2hhcHRlcihjaGFwdGVyTnVtYmVyKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB2bS5jaGFwdGVyTnVtYmVyID0gY2hhcHRlck51bWJlcjtcclxuXHJcbiAgICAgICAgY2FzZUxhd0RhdGFTZXJ2aWNlLmdldENhc2VMYXdJbmZvKGNoYXB0ZXJOdW1iZXIpO1xyXG4gICAgICAgIGNoYXB0ZXJOdW1iZXIgPSBjb21tb24uZm9ybWF0dGluZy5wYWRMZWZ0KGNoYXB0ZXJOdW1iZXIsIDIsICcwJyk7XHJcbiAgICAgICAgY2hhcHRlck51bWJlciA9IGNvbW1vbi5mb3JtYXR0aW5nLnBhZFJpZ2h0KGNoYXB0ZXJOdW1iZXIsIDEwLCAnMCcpO1xyXG4gICAgICAgIGF0ckRhdGFTZXJ2aWNlLmNvdW50QXRyc0J5SGVhZGluZyhjaGFwdGVyTnVtYmVyKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoYXRyQ291bnQpIHtcclxuICAgICAgICAgICAgICAgIHZtLmF0ckNvdW50ID0gYXRyQ291bnQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIGJ0aURhdGFTZXJ2aWNlLmNvdW50QnRpc0J5SGVhZGluZyhjaGFwdGVyTnVtYmVyKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoYnRpQ291bnQpIHtcclxuICAgICAgICAgICAgICAgIHZtLmJ0aUNvdW50ID0gYnRpQ291bnQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBub21lbmNsYXR1cmVEYXRhU2VydmljZS5nZXRDaGFwdGVyKGNoYXB0ZXJOdW1iZXIsIHN0YXRlLmZpbHRlci5tb3ZlbWVudCwgc3RhdGUuZmlsdGVyLmRhdGUpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZtLmNoYXB0ZXJOdW1iZXIgPSBkYXRhLm1ldGFkYXRhLmNoYXB0ZXJOdW1iZXI7XHJcbiAgICAgICAgICAgICAgICB2bS5zZWN0aW9uTnVtYmVyID0gZGF0YS5tZXRhZGF0YS5zZWN0aW9uTnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgdm0uY2hhcHRlciA9IGRhdGEudHJlZTtcclxuICAgICAgICAgICAgICAgIHNjcm9sbEhlYWRpbmdJbnRvVmlldygpO1xyXG4gICAgICAgICAgICAgICAgbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAuZ2V0U2VjdGlvbihkYXRhLm1ldGFkYXRhLnNlY3Rpb25OdW1iZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHNlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc2VjdGlvbiA9IHNlY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsgXHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGVzZWxlY3RMaW5lKCkge1xyXG4gICAgICAgIHZtLnN0YXRlLmN1cnJlbnRDb2RlID0gbnVsbDtcclxuICAgICAgICB2bS5zdGF0ZS5jdXJyZW50SW5kZW50YXRpb24gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgZGVzY3JpcHRpb246ICc8JyxcclxuICAgICAgICBvbkNsaWNrRGVzY3JpcHRpb25MaW5lOiAnJidcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBjb21tb2RpdHlDb2RlRGVzY3JpcHRpb25FeHBvcnRDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdub21lbmNsYXR1cmUvY29tcG9uZW50cy9jb21tb2RpdHktY29kZS1kZXNjcmlwdGlvbi5odG1sJ1xyXG59XHJcblxyXG5jb21tb2RpdHlDb2RlRGVzY3JpcHRpb25FeHBvcnRDb250cm9sbGVyLiRpbmplY3QgPSBbJ2dvb2REaXNwbGF5U2VydmljZScsICdhcHBsaWNhdGlvblN0YXRlU2VydmljZSddO1xyXG5cclxuZnVuY3Rpb24gY29tbW9kaXR5Q29kZURlc2NyaXB0aW9uRXhwb3J0Q29udHJvbGxlcihnb29kRGlzcGxheVNlcnZpY2UsIHN0YXRlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc3RhdGU6IHN0YXRlLFxyXG4gICAgICAgIGNvcHlEZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGdvb2REaXNwbGF5U2VydmljZS5jb3B5RGVzY3JpcHRpb24odm0uZGVzY3JpcHRpb24ubGluZXMsIHN0YXRlLmZpbHRlci5tb3ZlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiB2bTtcclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBub21lbmNsYXR1cmVMaW5lczogJzwnXHJcbiAgICB9LFxyXG4gICAgdGVtcGxhdGVVcmw6ICdub21lbmNsYXR1cmUvY29tcG9uZW50cy9leHBvcnQtcmVmdW5kLW5vbWVuY2xhdHVyZS5odG1sJ1xyXG59OyIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBjaGFwdGVyOiAnPCcsXHJcbiAgICAgICAgbnVtYmVyT2ZFY2ljc0l0ZW1zOiAnPCcsXHJcbiAgICAgICAgb25DbGlja0NoYXB0ZXI6ICcmJ1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IGNoYXB0ZXJDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdub21lbmNsYXR1cmUvY29tcG9uZW50cy9ub21lbmNsYXR1cmUtY2hhcHRlci5odG1sJ1xyXG59O1xyXG5cclxuY2hhcHRlckNvbnRyb2xsZXIuJGluamVjdCA9IFsnbGFuZ3VhZ2UnXTtcclxuXHJcbmZ1bmN0aW9uIGNoYXB0ZXJDb250cm9sbGVyKGxhbmd1YWdlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc2hvd0F0ckJ1dHRvbjogbGFuZ3VhZ2UuZ2V0KCkgPT09ICdlbidcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgbm9tZW5jbGF0dXJlR3JvdXBzOiAnPCdcclxuICAgIH0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJ25vbWVuY2xhdHVyZS9jb21wb25lbnRzL25vbWVuY2xhdHVyZS1ncm91cHMuaHRtbCdcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgaGVhZGluZzogJzwnLFxyXG4gICAgICAgIGhhc0F0cnM6ICc8JyxcclxuICAgICAgICBoYXNCdGlzOiAnPCcsXHJcbiAgICAgICAgaGFzQ2FzZUxhdzogJzwnLFxyXG4gICAgICAgIGhhc0VjaWNzOiAnPCcsXHJcbiAgICAgICAgc2VhcmNoUXVlcnk6ICc8JyxcclxuICAgICAgICBvbkNsaWNrSGVhZGluZzogJyYnLFxyXG4gICAgICAgIG9uRG91YmxlQ2xpY2tIZWFkaW5nOiAnJidcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBoZWFkaW5nQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnbm9tZW5jbGF0dXJlL2NvbXBvbmVudHMvbm9tZW5jbGF0dXJlLWhlYWRpbmcuaHRtbCdcclxufTtcclxuXHJcbmhlYWRpbmdDb250cm9sbGVyLiRpbmplY3QgPSBbJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJ107XHJcblxyXG5mdW5jdGlvbiBoZWFkaW5nQ29udHJvbGxlcihzdGF0ZSkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIHN0YXRlOiBzdGF0ZSxcclxuICAgICAgICBjbGlja0hlYWRpbmc6IGNsaWNrSGVhZGluZyxcclxuICAgICAgICBkb3VibGVDbGlja0hlYWRpbmc6IGRvdWJsZUNsaWNrSGVhZGluZ1xyXG4gICAgfTtcclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBjbGlja0hlYWRpbmcoKSB7XHJcbiAgICAgICAgdm0ub25DbGlja0hlYWRpbmcoeyBoZWFkaW5nOiB2bS5oZWFkaW5nIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRvdWJsZUNsaWNrSGVhZGluZygpIHtcclxuICAgICAgICB2bS5vbkRvdWJsZUNsaWNrSGVhZGluZyh7IGhlYWRpbmc6IHZtLmhlYWRpbmcgfSk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgYWN0aXZlOiAnPCcsXHJcbiAgICAgICAgZWNpY3NDb3VudDogJzwnLFxyXG4gICAgICAgIHNlY3Rpb246ICc8JyxcclxuICAgICAgICBvbkNsaWNrQ2hhcHRlcjogJyYnLFxyXG4gICAgICAgIG9uQ2xpY2tTZWN0aW9uOiAnJidcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBzZWN0aW9uQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnbm9tZW5jbGF0dXJlL2NvbXBvbmVudHMvbm9tZW5jbGF0dXJlLXNlY3Rpb24uaHRtbCcsXHJcbn07XHJcblxyXG5mdW5jdGlvbiBzZWN0aW9uQ29udHJvbGxlcigpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBjbGlja0NoYXB0ZXI6IGNsaWNrQ2hhcHRlcixcclxuICAgICAgICBjbGlja1NlY3Rpb246IGNsaWNrU2VjdGlvblxyXG4gICAgfTtcclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBjbGlja1NlY3Rpb24oKSB7XHJcbiAgICAgICAgdm0ub25DbGlja1NlY3Rpb24oeyBzZWN0aW9uOiB2bS5zZWN0aW9uIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsaWNrQ2hhcHRlcihjaGFwdGVyKSB7XHJcbiAgICAgICAgdm0ub25DbGlja0NoYXB0ZXIoeyBjaGFwdGVyOiBjaGFwdGVyIH0pO1xyXG4gICAgfVxyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBzZWN0aW9uc1BhZ2VDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdub21lbmNsYXR1cmUvY29tcG9uZW50cy9zZWN0aW9ucy1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG5zZWN0aW9uc1BhZ2VDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsXHJcbiAgICAnJGxvY2F0aW9uJyxcclxuICAgICdjb21tb24nLFxyXG4gICAgJ2RvY3VtZW50YXRpb25TZXJ2aWNlJyxcclxuICAgICdub21lbmNsYXR1cmVEYXRhU2VydmljZScsXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLFxyXG4gICAgJ3ByZWZlcmVuY2VTZXJ2aWNlJyxcclxuICAgICdlY2ljc0RhdGFTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHNlY3Rpb25zUGFnZUNvbnRyb2xsZXIoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICRsb2NhdGlvbiwgXHJcbiAgICBjb21tb24sIFxyXG4gICAgZG9jdW1lbnRhdGlvblNlcnZpY2UsIFxyXG4gICAgbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2UsIFxyXG4gICAgbm90aWZpY2F0aW9ucywgXHJcbiAgICBwcmVmZXJlbmNlU2VydmljZSxcclxuICAgIGVjaWNzRGF0YVNlcnZpY2VcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIGFjdGl2YXRlU2VjdGlvbjogYWN0aXZhdGVTZWN0aW9uLFxyXG4gICAgICAgIGFjdGl2ZVNlY3Rpb246ICcnLFxyXG4gICAgICAgIGVjaWNzQ291bnQ6IHt9LFxyXG4gICAgICAgIGZpbGxDaGFwdGVyczogZmlsbFNlY3Rpb25zLFxyXG4gICAgICAgIGZpcnN0U2VjdGlvbnM6IFtdLFxyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgbG9hZENoYXB0ZXI6IGxvYWRDaGFwdGVyLFxyXG4gICAgICAgIGxvYWRDaGFwdGVyczogbG9hZENoYXB0ZXJzLFxyXG4gICAgICAgIGxvYWRSZWNlbnRDb2RlczogbG9hZFJlY2VudENvZGVzLFxyXG4gICAgICAgIG51bWJlck9mUmVjZW50Q29kZXM6IDEwLFxyXG4gICAgICAgIHJlY2VudENvZGVzOiBbXSxcclxuICAgICAgICBzZWNvbmRTZWN0aW9uczogW10sXHJcbiAgICB9O1xyXG5cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gYWN0aXZhdGVTZWN0aW9uKHNlY3Rpb25OdW1iZXIpIHtcclxuICAgICAgICBpZiAoc2VjdGlvbk51bWJlciA9PT0gbnVsbCB8fCBzZWN0aW9uTnVtYmVyID09PSB1bmRlZmluZWQgfHwgc2VjdGlvbk51bWJlciA9PT0gdm0uYWN0aXZlU2VjdGlvbilcclxuICAgICAgICAgICAgdm0uYWN0aXZlU2VjdGlvbiA9IDA7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB2bS5hY3RpdmVTZWN0aW9uID0gc2VjdGlvbk51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmaWxsU2VjdGlvbnMoc2VjdGlvbnNEYXRhKSB7XHJcbiAgICAgICAgdmFyIHNlY3Rpb25zID0gc2VjdGlvbnNEYXRhLmRhdGE7XHJcbiAgICAgICAgXy5mb3JFYWNoKHNlY3Rpb25zLCBmdW5jdGlvbiAoc2VjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5jaGFwdGVycyA9PT0gbnVsbCB8fCBzZWN0aW9uLmNoYXB0ZXJzLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIHNlY3Rpb24uY2hhcHRlckRlc2NyaXB0aW9uID0gY29tbW9uLmZvcm1hdHRpbmcucGFkTGVmdChzZWN0aW9uLmNoYXB0ZXJzWzBdLm51bWJlciwgMiwgJzAnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmNoYXB0ZXJzLmxlbmd0aCA+IDEpXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uLmNoYXB0ZXJEZXNjcmlwdGlvbiArPSAnIC0gJyArIGNvbW1vbi5mb3JtYXR0aW5nLnBhZExlZnQoc2VjdGlvbi5jaGFwdGVyc1tzZWN0aW9uLmNoYXB0ZXJzLmxlbmd0aCAtIDFdLm51bWJlciwgMiwgJzAnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIGhhbGYgPSBNYXRoLmZsb29yKHNlY3Rpb25zLmxlbmd0aCAvIDIpICsgMTtcclxuXHJcbiAgICAgICAgdm0uZmlyc3RTZWN0aW9ucyA9IHNlY3Rpb25zLnNsaWNlKDAsIGhhbGYpO1xyXG4gICAgICAgIHZtLnNlY29uZFNlY3Rpb25zID0gc2VjdGlvbnMuc2xpY2UoaGFsZiwgc2VjdGlvbnMubGVuZ3RoKTtcclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBkb2N1bWVudGF0aW9uU2VydmljZS5hZGRIaW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvc2VjdGlvbnMnKTtcclxuICAgICAgICBjb21tb24uYXV0aC5jaGVjaygpO1xyXG4gICAgICAgIGxvYWRSZWNlbnRDb2RlcygpO1xyXG4gICAgICAgIGxvYWRDaGFwdGVycygpO1xyXG4gICAgICAgIGxvYWRFY2ljc0NvdW50KCk7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBkYXRlQ2hhbmdlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy51bnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGRhdGVDaGFuZ2VkKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkYXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICBsb2FkQ2hhcHRlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkRWNpY3NDb3VudCgpIHtcclxuICAgICAgICBlY2ljc0RhdGFTZXJ2aWNlLmNvdW50UGVyQ2hhcHRlcigpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGVjaWNzQ291bnQpIHtcclxuICAgICAgICAgICAgICAgIHZtLmVjaWNzQ291bnQgPSBlY2ljc0NvdW50O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkUmVjZW50Q29kZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VTZXJ2aWNlLmdldENhdGVnb3J5KCdyZWNlbnRfY29kZXMnKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY29kZXMpIHtcclxuICAgICAgICAgICAgICAgIHZhciByZWNlbnRDb2RlcyA9IF8uY2hhaW4oY29kZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgLnNvcnRCeShmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gbmV3IERhdGUoY29kZS5sYXN0VXBkYXRlKS5nZXRUaW1lKCk7IH0pIC8vIHRoaXMgc29sdmVzIGEgdGltZXpvbmUgZGlmZmVyZW5jZSBpc3N1ZSBmb3IgY29kZXMgdGhhdCB3ZXJlIGp1c3QgYWRkZWRcclxuICAgICAgICAgICAgICAgICAgICAucmV2ZXJzZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgLnVuaXFCeSgnbmFtZScpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRha2Uodm0ubnVtYmVyT2ZSZWNlbnRDb2RlcylcclxuICAgICAgICAgICAgICAgICAgICAudmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIHZtLnJlY2VudENvZGVzID0gcmVjZW50Q29kZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRDaGFwdGVyKGNoYXB0ZXIpIHtcclxuICAgICAgICAkbG9jYXRpb24udXJsKCcvY2hhcHRlci8nICsgY2hhcHRlci5jb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkQ2hhcHRlcnMoKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2UuZ2V0U2VjdGlvbnMoKVxyXG4gICAgICAgICAgICAudGhlbihmaWxsU2VjdGlvbnMsIGZ1bmN0aW9uKCkge30pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIGN1cnJlbnRLZXk6ICc8JyxcclxuICAgICAgICBrZXlOb2RlOiAnPCcsXHJcbiAgICAgICAgb25DbGlja1JvdzogJyYnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogdGFyZXNTdGF0aXN0aWNhbEtleVJvd0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ25vbWVuY2xhdHVyZS9jb21wb25lbnRzL3RhcmVzLXN0YXRpc3RpY2FsLWtleS1yb3cuaHRtbCdcclxufTtcclxuXHJcbnRhcmVzU3RhdGlzdGljYWxLZXlSb3dDb250cm9sbGVyLiRpbmplY3QgPSBbXTtcclxuXHJcbmZ1bmN0aW9uIHRhcmVzU3RhdGlzdGljYWxLZXlSb3dDb250cm9sbGVyKCkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIGNsaWNrUm93OiBjbGlja1Jvd1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBjbGlja1JvdyhrZXlOb2RlKSB7XHJcbiAgICAgICAgaWYgKGtleU5vZGUudmFsdWUucHJvZGxpbiA9PT0gODAgJiYgdm0ub25DbGlja1Jvdykge1xyXG4gICAgICAgICAgICB2bS5vbkNsaWNrUm93KHsga2V5OiBrZXlOb2RlLnZhbHVlLmtleSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIGNvZGU6ICc8JyxcclxuICAgICAgICBzZWFyY2hRdWVyeTogJ0AnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogdGFyaWNDb2RlUm93Q29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnbm9tZW5jbGF0dXJlL2NvbXBvbmVudHMvdGFyaWMtY29kZS1yb3cuaHRtbCdcclxufVxyXG5cclxudGFyaWNDb2RlUm93Q29udHJvbGxlci4kaW5qZWN0ID0gWydjb21tb24nLCAnYnRpTW9kYWwnLCAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCAnbm9tZW5jbGF0dXJlVHJlZVNlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIHRhcmljQ29kZVJvd0NvbnRyb2xsZXIoY29tbW9uLCBidGlNb2RhbCwgc3RhdGUsIG5vbWVuY2xhdHVyZVRyZWVTZXJ2aWNlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgY2xpY2tSb3c6IGNsaWNrUm93LFxyXG4gICAgICAgIGRvdWJsZUNsaWNrUm93OiBkb3VibGVDbGlja1JvdyxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIHN0YXRlOiBzdGF0ZSxcclxuICAgICAgICBzaG93QnRpOiBzaG93QnRpXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGRvdWJsZUNsaWNrUm93KG5vZGUpIHtcclxuICAgICAgICBzdGF0ZS5jdXJyZW50Q29kZSA9IG5vZGUudmFsdWUuY29tbW9kaXR5Q29kZTtcclxuICAgICAgICBzdGF0ZS5jdXJyZW50SW5kZW50YXRpb24gPSBub2RlLnZhbHVlLmluZGVudGF0aW9uO1xyXG4gICAgICAgIGlmICghbm9kZS5oYXNDaGlsZHJlbikge1xyXG4gICAgICAgICAgICBjb21tb24uJGxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICAudXJsKCcvZ29vZC8nICsgbm9kZS52YWx1ZS5jb21tb2RpdHlDb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobm9kZS5tZXRhZGF0YS5pc0V4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgIG5vbWVuY2xhdHVyZVRyZWVTZXJ2aWNlLmNvbGxhcHNlQWxsKG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbm9tZW5jbGF0dXJlVHJlZVNlcnZpY2UuZXhwYW5kQWxsKG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb21tb24uaW50ZXJhY3Rpb24uY2xlYXJTZWxlY3Rpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGlja1Jvdyhub2RlKSB7XHJcbiAgICAgICAgc3RhdGUuY3VycmVudENvZGUgPSBub2RlLnZhbHVlLmNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgc3RhdGUuY3VycmVudEluZGVudGF0aW9uID0gbm9kZS52YWx1ZS5pbmRlbnRhdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKCFub2RlLmhhc0NoaWxkcmVuKVxyXG4gICAgICAgICAgICBjb21tb24uJGxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICAudXJsKCcvZ29vZC8nICsgbm9kZS52YWx1ZS5jb21tb2RpdHlDb2RlKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbm9kZS5tZXRhZGF0YS5pc0V4cGFuZGVkID0gIW5vZGUubWV0YWRhdGEuaXNFeHBhbmRlZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0J0aShjb2RlLCAkZXZlbnQpIHtcclxuICAgICAgICBidGlNb2RhbC5zaG93KGNvZGUsIHZtLnNlYXJjaFF1ZXJ5KTtcclxuXHJcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxufSIsInZhciBtb21lbnQgPSByZXF1aXJlKCdtb21lbnQnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gWydjb21tb24nLCAnZGF0YUNvbnRleHQnLCAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCAnbm9tZW5jbGF0dXJlVHJlZVNlcnZpY2UnLCBub21lbmNsYXR1cmVEYXRhU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBub21lbmNsYXR1cmVEYXRhU2VydmljZShjb21tb24sIGNvbnRleHQsIHN0YXRlLCBub21lbmNsYXR1cmVUcmVlU2VydmljZSkge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgY2hhcHRlcnM6IHt9LFxyXG4gICAgICAgIHNlY3Rpb25zOiBbXSxcclxuICAgICAgICBicm93c2VDaGFwdGVyOiBicm93c2VDaGFwdGVyLFxyXG4gICAgICAgIGJyb3dzZUhlYWRpbmc6IGJyb3dzZUhlYWRpbmcsXHJcbiAgICAgICAgZ2V0Q2hhcHRlcjogZ2V0Q2hhcHRlcixcclxuICAgICAgICBnZXRTZWN0aW9uczogZ2V0U2VjdGlvbnMsXHJcbiAgICAgICAgZ2V0U2VjdGlvbjogZ2V0U2VjdGlvbixcclxuICAgICAgICBnZXRTZWN0aW9uRm9yQ29tbW9kaXR5Q29kZTogZ2V0U2VjdGlvbkZvckNvbW1vZGl0eUNvZGUsXHJcbiAgICAgICAgZ2V0U3ViY2hhcHRlck51bWJlcjogZ2V0U3ViY2hhcHRlck51bWJlcixcclxuICAgICAgICBpc0RlY2xhcmFibGU6IGlzRGVjbGFyYWJsZSxcclxuICAgICAgICBsb2FkRGVzY3JpcHRpb246IGxvYWREZXNjcmlwdGlvbixcclxuICAgICAgICBsb2FkTm9tZW5jbGF0dXJlR3JvdXBzOiBsb2FkTm9tZW5jbGF0dXJlR3JvdXBzLFxyXG4gICAgICAgIHNlYXJjaEhlYWRpbmdzOiBzZWFyY2hIZWFkaW5ncyxcclxuICAgICAgICBzZWFyY2hUcmVlOiBzZWFyY2hUcmVlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0U2VjdGlvbnMoKSB7XHJcbiAgICAgICAgdmFyIG1heE51bWJlck9mQ2FjaGVkSXRlbXMgPSAxMDtcclxuICAgICAgICB2YXIgZGVmZXJyZWQgPSBjb21tb24uJHEuZGVmZXIoKTtcclxuXHJcbiAgICAgICAgdmFyIGxhbmd1YWdlID0gY29tbW9uLmxhbmd1YWdlLmdldCgpO1xyXG4gICAgICAgIHZhciByZWZlcmVuY2VDb3VudHJ5ID0gc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnk7XHJcbiAgICAgICAgdmFyIHJlZmVyZW5jZURhdGUgPSBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuICAgICAgICB2YXIgY2FjaGVEYXRlID0gbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcblxyXG4gICAgICAgIHZhciBjYWNoZWRTZWN0aW9ucyA9IF8uZmluZChzZXJ2aWNlLnNlY3Rpb25zLCBmdW5jdGlvbihpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmxhbmd1YWdlID09PSBsYW5ndWFnZSAmJlxyXG4gICAgICAgICAgICBpdGVtLnJlZmVyZW5jZUNvdW50cnkgPT09IHJlZmVyZW5jZUNvdW50cnkgJiZcclxuICAgICAgICAgICAgaXRlbS5yZWZlcmVuY2VEYXRlID09PSByZWZlcmVuY2VEYXRlICYmXHJcbiAgICAgICAgICAgIGl0ZW0uY2FjaGVEYXRlID09PSBjYWNoZURhdGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGNhY2hlZFNlY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGNhY2hlZFNlY3Rpb25zLmxhc3RVc2VkQXQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGNhY2hlZFNlY3Rpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxvYWRTZWN0aW9ucyhsYW5ndWFnZSwgcmVmZXJlbmNlQ291bnRyeSwgcmVmZXJlbmNlRGF0ZSlcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlY3Rpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZURhdGU6IGNhY2hlRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VDb3VudHJ5OiByZWZlcmVuY2VDb3VudHJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VEYXRlOiByZWZlcmVuY2VEYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXNlZEF0OiBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNlY3Rpb25zID0gXy5jb25jYXQoc2VydmljZS5zZWN0aW9ucywgc2VjdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLnNlY3Rpb25zLmxlbmd0aCA+IG1heE51bWJlck9mQ2FjaGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZWN0aW9ucyA9IF8uY2hhaW4oc2VydmljZS5zZWN0aW9ucylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0QnkoZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmxhc3RVc2VkQXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRyb3AoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoc2VjdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfSwgZGVmZXJyZWQucmVqZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRTZWN0aW9ucyhsYW5ndWFnZSwgcmVmZXJlbmNlQ291bnRyeSwgcmVmZXJlbmNlRGF0ZSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL3NlY3Rpb25zJyArXHJcbiAgICAgICAgICAgICc/bGFuZz0nICsgbGFuZ3VhZ2UgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHJlZmVyZW5jZUNvdW50cnkgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHJlZmVyZW5jZURhdGU7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KHVybCwgJ1NFQ1RJT05TJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0U2VjdGlvbihzZWN0aW9uTnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldFNlY3Rpb25zKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHNlY3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5maW5kKHNlY3Rpb25zLmRhdGEsIGZ1bmN0aW9uIChzZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlY3Rpb24ubnVtYmVyID09PSBzZWN0aW9uTnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0U2VjdGlvbkZvckNvbW1vZGl0eUNvZGUoZ29vZHNDb2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldFNlY3Rpb25zKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHNlY3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hhcHRlckNvZGUgPSBnb29kc0NvZGUuc3Vic3RyaW5nKDAsIDIpICsgJzAwMDAwMDAwJztcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmZpbmQoc2VjdGlvbnMuZGF0YSwgZnVuY3Rpb24gKHNlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5zb21lKHNlY3Rpb24uY2hhcHRlcnMsIGZ1bmN0aW9uIChjaGFwdGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFwdGVyLmNvZGUgPT09IGNoYXB0ZXJDb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZE5vbWVuY2xhdHVyZUdyb3Vwcyhnb29kc2NvZGUpIHtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0c1tjb21tb24uY29uZmlnLmN1cnJlbnRBcGldICsgJy9ub21lbmNsYXR1cmUvJyArIGdvb2RzY29kZSArICcvbm9tZW5jbGF0dXJlLWdyb3VwcycgK1xyXG4gICAgICAgICAgICAnP2xhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSAgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5O1xyXG5cclxuICAgICAgICBpZiAoc3RhdGUuZmlsdGVyLmRhdGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdXJsICs9ICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwsICdOT01FTkNMQVRVUkVfR1JPVVBTJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogYWRkIGEgbWV0aG9kIGZvciBnZXR0aW5nIHRoaXMgZGF0YSBmcm9tIHRoZSBjaGFwdGVyXHJcbiAgICAvLyB0cmVlIG9mIHRoZSBjaGFwdGVyIG9mIHRoZSBnb29kc2NvZGUuIFRoaXMgc2hvdWxkIGJlIHBvc3NpYmxlIGlmIHRoZSBjaGFwdGVyIGhhcyBiZWVuIGxvYWRlZCBwcmV2aW91c2x5LlxyXG4gICAgZnVuY3Rpb24gbG9hZERlc2NyaXB0aW9uKGdvb2RzY29kZSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzW2NvbW1vbi5jb25maWcuY3VycmVudEFwaV0gKyAnL25vbWVuY2xhdHVyZS8nICsgZ29vZHNjb2RlICsgJy9kZXNjcmlwdGlvbicgK1xyXG4gICAgICAgICc/bGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICArXHJcbiAgICAgICAgJyZtb3ZlbWVudD0nICsgc3RhdGUuZmlsdGVyLm1vdmVtZW50ICtcclxuICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5O1xyXG5cclxuICAgICAgICBpZiAoc3RhdGUuZmlsdGVyLmRhdGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdXJsICs9ICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGlzRGVjbGFyYWJsZShjb21tb2RpdHlDb2RlKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvbm9tZW5jbGF0dXJlLycgKyBjb21tb2RpdHlDb2RlICsgJy9pcy1kZWNsYXJhYmxlJyArXHJcbiAgICAgICAgJz9sYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgICtcclxuICAgICAgICAnJm1vdmVtZW50PScgKyBzdGF0ZS5maWx0ZXIubW92ZW1lbnQgK1xyXG4gICAgICAgICcmcmVmZXJlbmNlY291bnRyeT0nICsgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnk7XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5maWx0ZXIuZGF0ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB1cmwgKz0gJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYnJvd3NlSGVhZGluZyhxKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvbm9tZW5jbGF0dXJlL2Jyb3dzZS1oZWFkaW5nJyArIFxyXG4gICAgICAgICAgICAnP2dvb2RzY29kZT0nICsgcS5jb21tb2RpdHlDb2RlICtcclxuICAgICAgICAgICAgJyZtb3ZlbWVudD0nICsgc3RhdGUuZmlsdGVyLm1vdmVtZW50ICArXHJcbiAgICAgICAgICAgICcmcmVmZXJlbmNlY291bnRyeT0nICsgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwsICdTRUFSQ0gnKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBicm93c2VDaGFwdGVyKHEpIHtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9ub21lbmNsYXR1cmUvYnJvd3NlLWNoYXB0ZXInICsgXHJcbiAgICAgICAgICAgICc/Z29vZHNjb2RlPScgKyBxLmNvbW1vZGl0eUNvZGUgK1xyXG4gICAgICAgICAgICAnJm1vdmVtZW50PScgKyBzdGF0ZS5maWx0ZXIubW92ZW1lbnQgICtcclxuICAgICAgICAgICAgJyZyZWZlcmVuY2Vjb3VudHJ5PScgKyBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KHVybCwgJ1NFQVJDSCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlYXJjaFRyZWUocSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL25vbWVuY2xhdHVyZS9zZWFyY2gtdHJlZS1jb21iaW5lZCcgKyBcclxuICAgICAgICAgICAgJz9nb29kc2NvZGU9JyArIHEuY29tbW9kaXR5Q29kZSArXHJcbiAgICAgICAgICAgICcmcT0nICsgcS5xdWVyeSArXHJcbiAgICAgICAgICAgICcmaW5jbHVkZUJ0aXM9JyArIHEuaW5jbHVkZUJ0aXMgK1xyXG4gICAgICAgICAgICAnJmluY2x1ZGVDYXNlTGF3PScgKyBxLmluY2x1ZGVDYXNlTGF3ICtcclxuICAgICAgICAgICAgJyZpbmNsdWRlQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucz0nICsgcS5pbmNsdWRlQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucyArXHJcbiAgICAgICAgICAgICcmbW92ZW1lbnQ9JyArIHN0YXRlLmZpbHRlci5tb3ZlbWVudCAgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuICAgICAgICByZXR1cm4gY29udGV4dC5nZXQodXJsLCAnU0VBUkNIJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2VhcmNoSGVhZGluZ3MocSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL25vbWVuY2xhdHVyZS9zZWFyY2gtY29tYmluZWQnICtcclxuICAgICAgICAgICAgJz9xPScgKyBxLnF1ZXJ5ICtcclxuICAgICAgICAgICAgJyZpbmNsdWRlQnRpcz0nICsgcS5pbmNsdWRlQnRpcyArXHJcbiAgICAgICAgICAgICcmaW5jbHVkZUNhc2VMYXc9JyArIHEuaW5jbHVkZUNhc2VMYXcgK1xyXG4gICAgICAgICAgICAnJmluY2x1ZGVDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zPScgKyBxLmluY2x1ZGVDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zICtcclxuICAgICAgICAgICAgJyZtb3ZlbWVudD0nICsgc3RhdGUuZmlsdGVyLm1vdmVtZW50ICtcclxuICAgICAgICAgICAgJyZsYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgICtcclxuICAgICAgICAgICAgJyZyZWZlcmVuY2Vjb3VudHJ5PScgKyBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGUgK1xyXG4gICAgICAgICAgICAnJm9yZGVyYnk9JyArIHEub3JkZXJCeTtcclxuICAgICAgICBpZiAocS5jb21tb2RpdHlDb2RlKSB7XHJcbiAgICAgICAgICAgIHVybCArPSBcIiZnb29kc2NvZGU9XCIgKyBxLmNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwsICdTRUFSQ0gnKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRDaGFwdGVyKGNoYXB0ZXJOdW1iZXIsIG1vdmVtZW50LCBkYXRlKSB7XHJcbiAgICAgICAgdmFyIGRlZmVycmVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgIHZhciBjaGFwdGVyQ29kZSA9IGNvbW1vbi5mb3JtYXR0aW5nLnBhZFJpZ2h0KGNvbW1vbi5mb3JtYXR0aW5nLnBhZExlZnQoY2hhcHRlck51bWJlciArICcnLCAyKSwgMTApO1xyXG4gICAgICAgIHZhciBrZXkgPSBjaGFwdGVyQ29kZSArICdfJyArIG1vdmVtZW50ICsgJ18nICsgZGF0ZTtcclxuXHJcbiAgICAgICAgaWYgKHNlcnZpY2UuY2hhcHRlcnNba2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICAgICAgICBicm93c2VDaGFwdGVyKHsgY29tbW9kaXR5Q29kZTogY2hhcHRlckNvZGV9KVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBub21lbmNsYXR1cmVUcmVlU2VydmljZS5zZXRDb2RlRnJvbUFuZENvZGVUbyhkYXRhLnRyZWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuY2hhcHRlcnNba2V5XSA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShkYXRhKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoc2VydmljZS5jaGFwdGVyc1trZXldKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0U3ViY2hhcHRlck51bWJlcihjaGFwdGVyTnVtYmVyLCBzdWJjaGFwdGVyQ29kZSkge1xyXG4gICAgICAgIGlmIChzdWJjaGFwdGVyQ29kZS5sZW5ndGggPT09IDQpIHtcclxuICAgICAgICAgICAgc3ViY2hhcHRlckNvZGUgKz0gJzAwMDAwMCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBnZXRDaGFwdGVyKGNoYXB0ZXJOdW1iZXIsIHN0YXRlLmZpbHRlci5tb3ZlbWVudCwgc3RhdGUuZmlsdGVyLmRhdGUpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjaGFwdGVySW5mbykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN1YmNoYXB0ZXJzID0gc3ViY2hhcHRlciA9IF8uZmlsdGVyKGNoYXB0ZXJJbmZvLnRyZWUuY2hpbGRyZW4sIGZ1bmN0aW9uIChzdWJjaGFwdGVySW5mbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJjaGFwdGVySW5mby52YWx1ZS5pc1N1YmNoYXB0ZXI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHZhciBzdWJjaGFwdGVyID0gXy5maW5kKHN1YmNoYXB0ZXJzLCBmdW5jdGlvbiAoc3ViY2hhcHRlckluZm8pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ViY2hhcHRlckluZm8udmFsdWUuY29tbW9kaXR5Q29kZSA9PT0gc3ViY2hhcHRlckNvZGU7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGlmICghc3ViY2hhcHRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1YmNoYXB0ZXJzLmluZGV4T2Yoc3ViY2hhcHRlcikgKyAxO1xyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSBbJ2Zvcm1hdHRpbmcnLCBub21lbmNsYXR1cmVUcmVlU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBub21lbmNsYXR1cmVUcmVlU2VydmljZShmb3JtYXR0aW5nKSB7XHJcbiAgICBcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGNvbGxhcHNlQWxsOiBjb2xsYXBzZUFsbCxcclxuICAgICAgICBleHBhbmRBbGw6IGV4cGFuZEFsbCxcclxuICAgICAgICBmaW5kTm9kZUluVHJlZTogZmluZE5vZGVJblRyZWUsXHJcbiAgICAgICAgaGFzQnRpOiBoYXNCdGksXHJcbiAgICAgICAgaXNEZWNsYXJhYmxlQ29kZTogaXNEZWNsYXJhYmxlQ29kZSxcclxuICAgICAgICBzZXRDb2RlRnJvbUFuZENvZGVUbzogc2V0Q29kZUZyb21BbmRDb2RlVG9cclxuICAgICAgICBcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG4gICAgZnVuY3Rpb24gZXhwYW5kQWxsKHJvb3ROb2RlKSB7XHJcbiAgICAgICAgaWYgKHJvb3ROb2RlLmNoaWxkcmVuICYmIHJvb3ROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcm9vdE5vZGUubWV0YWRhdGEuaXNFeHBhbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIF8uZWFjaChyb290Tm9kZS5jaGlsZHJlbiwgZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGV4cGFuZEFsbChub2RlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbGxhcHNlQWxsKHJvb3ROb2RlKSB7XHJcbiAgICAgICAgaWYgKHJvb3ROb2RlLmNoaWxkcmVuICYmIHJvb3ROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcm9vdE5vZGUubWV0YWRhdGEuaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBfLmVhY2gocm9vdE5vZGUuY2hpbGRyZW4sIGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjb2xsYXBzZUFsbChub2RlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIE5COiBidGlDb3VudCBpcyBhbiBvYmplY3Qgd2l0aCBjb21tb2RpdHkgY29kZXMgYXMga2V5cyBhbmQgYnRpIGNvdW50cyBhcyB2YWx1ZXNcclxuICAgIC8vIERvZXMgdGhlIG5vZGUgb3IgYW55IG9mIGl0cyBjaGlsZGVuIGhhdmUgYnRpcz9cclxuICAgIGZ1bmN0aW9uIGhhc0J0aShub2RlLCBidGlDb3VudCkge1xyXG4gICAgICAgIGlmICghYnRpQ291bnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYnRpQ291bnRbbm9kZS52YWx1ZS5jb21tb2RpdHlDb2RlXSA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfLnNvbWUobm9kZS5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGhhc0J0aShjaGlsZCwgYnRpQ291bnQpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXNEZWNsYXJhYmxlQ29kZShjb21tb2RpdHlDb2RlLCByb290Tm9kZSkge1xyXG4gICAgICAgIHZhciBnb29kc05vbWVuY2xhdHVyZUlkID0gZm9ybWF0dGluZy5nb29kc0NvZGVUb0dvb2Rzbm9tSWQoY29tbW9kaXR5Q29kZSk7XHJcbiAgICAgICAgdmFyIGZvdW5kTm9kZSA9IGZpbmROb2RlSW5UcmVlKGdvb2RzTm9tZW5jbGF0dXJlSWQsIHJvb3ROb2RlKTtcclxuICAgICAgICBpZiAoZm91bmROb2RlID09PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgZWxzZSBpZiAoIWZvdW5kTm9kZS5oYXNDaGlsZHJlbilcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGNhbiBuYXZpZ2F0ZSB0byBpdCBpZiBpdCdzIGFuIGVuZCBub2RlIChkb2Vzbid0IGhhdmUgY2hpbGRyZW4pXHJcbiAgICAgICAgZWxzZSBpZiAoZm91bmROb2RlLmNoaWxkcmVuID09PSBudWxsIHx8IGZvdW5kTm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8vIFdlIGNhbid0IGRldGVybWluZSB0aGUgcmlnaHQgY2hpbGRyZW4gKHRoZXkgbWF5IGV4aXN0IGJ1dCBub3QgYmUgbG9hZGVkKSwgc28ganVzdCByZXR1cm4gZmFsc2VcclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIGNvbW1vZGl0eSBjb2RlIG1hdGNoZXMgYnV0IHRoZSBwcm9kbGluIG9mIHRoZSBub2RlIGlzIG5vdCA4MCxcclxuICAgICAgICAvLyB0aGVuIHRoZSBub2RlIGNhbiBoYXZlIGEgZGVzY2VuZGFudCB3aXRoIHRoZSBzYW1lIGNvbW1vZGl0eSBjb2RlIGFuZCBwcm9kbGluIDgwIFxyXG4gICAgICAgIC8vIHdoaWNoIGlzIGRlY2xhcmFibGUuIFRoaXMgaXMgd2hhdCB3ZSBjaGVjayBoZXJlLlxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm91bmROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZElzTmF2aWdhYmxlID0gaXNEZWNsYXJhYmxlQ29kZShnb29kc05vbWVuY2xhdHVyZUlkLCBmb3VuZE5vZGUuY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRJc05hdmlnYWJsZSA9PT0gdHJ1ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZmluZE5vZGVJblRyZWUoY29kZSwgcm9vdE5vZGUpIHtcclxuICAgICAgICBpZiAocm9vdE5vZGUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpLFxyXG4gICAgICAgICAgICByZXN1bHQsXHJcbiAgICAgICAgICAgIGxlbiA9IHJvb3ROb2RlLmNoaWxkcmVuLmxlbmd0aDtcclxuICAgICAgICBpZiAocm9vdE5vZGUudmFsdWUuY29tbW9kaXR5Q29kZSA9PT0gY29kZSAmJiAoIXJvb3ROb2RlLnZhbHVlLnByb2RsaW4gfHwgcm9vdE5vZGUudmFsdWUucHJvZGxpbiA9PT0gODApKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByb290Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChpIDwgbGVuIC0gMSAmJiByb290Tm9kZS5jaGlsZHJlbltpICsgMV0udmFsdWUuY29tbW9kaXR5Q29kZSA+IHJvb3ROb2RlLmNoaWxkcmVuW2ldLnZhbHVlLmNvbW1vZGl0eUNvZGUgJiYgcm9vdE5vZGUuY2hpbGRyZW5baSArIDFdLnZhbHVlLmNvbW1vZGl0eUNvZGUgPD0gY29kZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzdWx0ID0gZmluZE5vZGVJblRyZWUoY29kZSwgcm9vdE5vZGUuY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmICFyZXN1bHQudmFsdWUuaXNTdWJjaGFwdGVyICYmICghcmVzdWx0LnZhbHVlLnByb2RsaW4gfHwgcmVzdWx0LnZhbHVlLnByb2RsaW4gPT09IDgwKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRDb2RlRnJvbUFuZENvZGVUbyhyb290Tm9kZSkge1xyXG4gICAgICAgIGlmIChyb290Tm9kZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIF8uZm9yRWFjaChyb290Tm9kZS5jaGlsZHJlbiwgc2V0Q29kZUZyb21BbmRDb2RlVG8pO1xyXG4gICAgICAgIGlmIChyb290Tm9kZS52YWx1ZS5wcm9kbGluICE9PSA4MCkge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVGhpcyBjaGVjayBpcyBoZXJlIHRvIHN1cHBvcnQgb2xkZXIgVUsgY2FjaGUsIHdoZXJlIHdlIGRpZG4ndCBzdG9yZSB0aGUgcHJvZGxpblxyXG4gICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UnZCBqdXN0IG5lZWQgcm9vdE5vZGUuY29kZV9mcm9tID0gcm9vdE5vZGUuY29kZVxyXG4gICAgICAgICAgICBpZiAocm9vdE5vZGUudmFsdWUucHJvZGxpbikge1xyXG4gICAgICAgICAgICAgICAgcm9vdE5vZGUudmFsdWUuY29kZUZyb20gPSByb290Tm9kZS52YWx1ZS5jb21tb2RpdHlDb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHJvb3ROb2RlLmNoaWxkcmVuICYmIHJvb3ROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgcm9vdE5vZGUuY2hpbGRyZW5bMF0udmFsdWUuY29tbW9kaXR5Q29kZSA9PT0gcm9vdE5vZGUudmFsdWUuY29tbW9kaXR5Q29kZSkge1xyXG4gICAgICAgICAgICAgICAgcm9vdE5vZGUudmFsdWUuY29kZUZyb20gPSByb290Tm9kZS52YWx1ZS5jb21tb2RpdHlDb2RlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocm9vdE5vZGUuY2hpbGRyZW4gJiYgcm9vdE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGhpZ2hlc3RTdWJDb2RlID0gXy5tYXhCeShyb290Tm9kZS5jaGlsZHJlbiwgZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS52YWx1ZS5wcm9kbGluID09PSA4MCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZS5jb21tb2RpdHlDb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxzZSBpZiBzdGF0ZW1lbnQgaXMgbmVlZGVkIHRvIHN1cHBvcnQgdHJlZXMgd2l0aG91dCBwcm9kbGluIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vICh3aGVyZSB3ZSBjaGVjayBvbiB0aGUgb2NjdXJyZW5jZSBvZiB0aGUgc2FtZSBjb21tb2RpdHkgY29kZSBvbiBtdWx0aXBwbGUgaW5kZW50aWF0aW9ucylcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghbm9kZS52YWx1ZS5wcm9kbGluICYmICghbm9kZS5jaGlsZHJlbiB8fCBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCB8fCBub2RlLmNoaWxkcmVuWzBdLnZhbHVlLmNvbW1vZGl0eUNvZGUgIT09IG5vZGUudmFsdWUuY29tbW9kaXR5Q29kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUuY29tbW9kaXR5Q29kZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnZhbHVlLmNvZGVUbztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKGhpZ2hlc3RTdWJDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhpZ2hlc3RTdWJDb2RlLnZhbHVlLnByb2RsaW4gPT09IDgwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3ROb2RlLnZhbHVlLmNvZGVUbyA9IGhpZ2hlc3RTdWJDb2RlLnZhbHVlLmNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbHNlIGlmIHN0YXRlbWVudCBpcyBuZWVkZWQgdG8gc3VwcG9ydCB0cmVlcyB3aXRob3V0IHByb2RsaW4gXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gKHdoZXJlIHdlIGNoZWNrIG9uIHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBzYW1lIGNvbW1vZGl0eSBjb2RlIG9uIG11bHRpcHBsZSBpbmRlbnRpYXRpb25zKVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFoaWdoZXN0U3ViQ29kZS52YWx1ZS5wcm9kbGluICYmICghaGlnaGVzdFN1YkNvZGUuY2hpbGRyZW4gfHwgaGlnaGVzdFN1YkNvZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8IGhpZ2hlc3RTdWJDb2RlLmNoaWxkcmVuWzBdLnZhbHVlLmNvbW1vZGl0eUNvZGUgIT09IGhpZ2hlc3RTdWJDb2RlLnZhbHVlLmNvbW1vZGl0eUNvZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3ROb2RlLnZhbHVlLmNvZGVUbyA9IGhpZ2hlc3RTdWJDb2RlLnZhbHVlLmNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb290Tm9kZS52YWx1ZS5jb2RlVG8gPSBoaWdoZXN0U3ViQ29kZS52YWx1ZS5jb2RlVG87XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiYW5ndWxhci5tb2R1bGUoJ3RhcmljLnBhdHRlcm5zJywgW10pXHJcbiAgICAuY29tcG9uZW50KCdiYWNrZ3JvdW5kUGF0dGVybjAxJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2JhY2tncm91bmQtcGF0dGVybi0wMScpKVxyXG4gICAgLmNvbXBvbmVudCgnYmFja2dyb3VuZFBhdHRlcm4wMicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9iYWNrZ3JvdW5kLXBhdHRlcm4tMDInKSlcclxuICAgIDsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIHRlbXBsYXRlVXJsOiAncGF0dGVybnMvY29tcG9uZW50cy9iYWNrZ3JvdW5kLXBhdHRlcm4tMDEuaHRtbCdcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIHRlbXBsYXRlVXJsOiAncGF0dGVybnMvY29tcG9uZW50cy9iYWNrZ3JvdW5kLXBhdHRlcm4tMDIuaHRtbCdcclxufTsiLCJhbmd1bGFyLm1vZHVsZSgndGFyaWMucHJlZmVyZW5jZUNvZGVzJywgW10pXHJcbiAgICAuY29tcG9uZW50KCdwcmVmZXJlbmNlQ29kZUJ1dHRvbicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9wcmVmZXJlbmNlLWNvZGUtYnV0dG9uJykpXHJcbiAgICAuY29tcG9uZW50KCdwcmVmZXJlbmNlQ29kZVBpY2tlcicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9wcmVmZXJlbmNlLWNvZGUtcGlja2VyJykpXHJcbiAgICAuZmlsdGVyKCdwcmVmZXJlbmNlQ29kZVR5cGVhaGVhZCcsIHJlcXVpcmUoJy4vZmlsdGVycy9wcmVmZXJlbmNlLWNvZGUtdHlwZWFoZWFkLWZpbHRlcicpKVxyXG4gICAgLmZhY3RvcnkoJ3ByZWZlcmVuY2VDb2RlTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9wcmVmZXJlbmNlLWNvZGUnKSlcclxuICAgIC5mYWN0b3J5KCdwcmVmZXJlbmNlQ29kZVNlbGVjdG9yTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9wcmVmZXJlbmNlLWNvZGUtc2VsZWN0b3InKSlcclxuICAgIC5mYWN0b3J5KCdwcmVmZXJlbmNlQ29kZURhdGFTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy9wcmVmZXJlbmNlLWNvZGUtZGF0YScpKVxyXG4gICAgO1xyXG5cclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIHByZWZlcmVuY2VDb2RlOiAnPCcsXHJcbiAgICAgICAgdXNlVWNjRW5kVXNlUHJvY2VkdXJlQ29kZTQ0OiAnPCcsXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogcHJlZmVyZW5jZUNvZGVCdXR0b25Db250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdwcmVmZXJlbmNlLWNvZGVzL2NvbXBvbmVudHMvcHJlZmVyZW5jZS1jb2RlLWJ1dHRvbi5odG1sJ1xyXG59O1xyXG5cclxucHJlZmVyZW5jZUNvZGVCdXR0b25Db250cm9sbGVyLiRpbmplY3QgPSBbJ3ByZWZlcmVuY2VDb2RlTW9kYWwnXTtcclxuXHJcbmZ1bmN0aW9uIHByZWZlcmVuY2VDb2RlQnV0dG9uQ29udHJvbGxlcihwcmVmZXJlbmNlQ29kZU1vZGFsKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc2VsZWN0UHJlZmVyZW5jZUNvZGU6IHNlbGVjdFByZWZlcmVuY2VDb2RlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNlbGVjdFByZWZlcmVuY2VDb2RlKGNvZGUsIHVzZVVjY0VuZFVzZVByb2NlZHVyZUNvZGU0NCkge1xyXG4gICAgICAgIHByZWZlcmVuY2VDb2RlTW9kYWwuc2hvdyhjb2RlLCB1c2VVY2NFbmRVc2VQcm9jZWR1cmVDb2RlNDQpO1xyXG4gICAgfVxyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHsgXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6ICc8JywgXHJcbiAgICAgICAgcHJlZmVyZW5jZUNvZGU6ICc8JywgXHJcbiAgICAgICAgcG9zc2libGVQcmVmZXJlbmNlQ29kZXM6ICc8ICcsIFxyXG4gICAgICAgIHNlbGVjdGlvbkNoYW5nZWQ6ICcmJyBcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBwcmVmZXJlbmNlQ29kZVBpY2tlckNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3ByZWZlcmVuY2UtY29kZXMvY29tcG9uZW50cy9wcmVmZXJlbmNlLWNvZGUtcGlja2VyLmh0bWwnXHJcbn07XHJcblxyXG5wcmVmZXJlbmNlQ29kZVBpY2tlckNvbnRyb2xsZXIuJGluamVjdCA9IFsncHJlZmVyZW5jZUNvZGVTZWxlY3Rvck1vZGFsJ107XHJcblxyXG5mdW5jdGlvbiBwcmVmZXJlbmNlQ29kZVBpY2tlckNvbnRyb2xsZXIocHJlZmVyZW5jZUNvZGVTZWxlY3Rvck1vZGFsKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgY2xlYXI6IGNsZWFyLFxyXG4gICAgICAgIHByZWZlcmVuY2VDb2RlOiBudWxsLFxyXG4gICAgICAgIHVzZXJJbnB1dDogbnVsbCxcclxuICAgICAgICBwb3NzaWJsZVByZWZlcmVuY2VDb2RlczogbnVsbCxcclxuICAgICAgICBpdGVtU2VsZWN0ZWQ6IGl0ZW1TZWxlY3RlZCxcclxuICAgICAgICBvbkJsdXI6IG9uQmx1cixcclxuICAgICAgICBvbkVudGVyOiBvbkVudGVyLFxyXG4gICAgICAgIHNob3dNb2RhbDogc2hvd01vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TW9kYWwoKSB7XHJcbiAgICAgICAgcHJlZmVyZW5jZUNvZGVTZWxlY3Rvck1vZGFsXHJcbiAgICAgICAgICAgIC5zaG93KHZtLnBvc3NpYmxlUHJlZmVyZW5jZUNvZGVzLCB2bS5wcmVmZXJlbmNlQ29kZSlcclxuICAgICAgICAgICAgLnJlc3VsdFxyXG4gICAgICAgICAgICAudGhlbihpdGVtU2VsZWN0ZWQpXHJcbiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyKGV2KSB7XHJcbiAgICAgICAgdm0udXNlcklucHV0ID0gbnVsbDtcclxuICAgICAgICBjbGVhclNlbGVjdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKCkge1xyXG4gICAgICAgIHZtLnByZWZlcmVuY2VDb2RlID0gbnVsbDtcclxuICAgICAgICBpZiAodm0uc2VsZWN0aW9uQ2hhbmdlZClcclxuICAgICAgICAgICAgdm0uc2VsZWN0aW9uQ2hhbmdlZCh7IHByZWZlcmVuY2VDb2RlOiBudWxsIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkJsdXIoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25FbnRlcigpIHtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpdGVtU2VsZWN0ZWQoaXRlbSwgbW9kZWwpIHtcclxuICAgICAgICB2bS5wcmVmZXJlbmNlQ29kZSA9IGl0ZW07XHJcblxyXG4gICAgICAgIGlmICh2bS5zZWxlY3Rpb25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdGlvbkNoYW5nZWQoeyBwcmVmZXJlbmNlQ29kZTogaXRlbSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFtwcmVmZXJlbmNlQ29kZVR5cGVhaGVhZEZpbHRlcl07XHJcblxyXG4vLyBUYWtlcyBjYXJlIG9mIG9yZGVyaW5nIHRoZSByZXN1bHRzIG9mIHRoZSBwcmVmZXJlbmNlIGNvZGUgdHlwZWFoZWFkLiBUaGUgbG9naWMgaXMgYXMgZm9sbG93czpcclxuLy8gRmlyc3QsIHNob3cgdGhlIG1hdGNoZXMgb24gdGhlIHByZWZlcmVuY2UgY29kZSwgb3JkZXJlZCBieSBjb2RlXHJcbi8vIE5leHQsIHNob3cgdGhlIG1hdGNoZXMgb24gdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJlZmVyZW5jZSBjb2RlIGRlc2NyaXB0aW9uLCBvcmRlcmVkIGJ5IGRlc2NyaXB0aW9uXHJcbi8vIEZpbmFsbHksIHNob3cgdGhlIG1hdGNoZXMgYW55d2hlcmUgZWxzZSBpbiB0aGUgZGVzY3JpcHRpb24sIG9yZGVyZWQgYnkgZGVzY3JpcHRpb25cclxuZnVuY3Rpb24gcHJlZmVyZW5jZUNvZGVUeXBlYWhlYWRGaWx0ZXIoKSB7XHJcblxyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAocHJlZmVyZW5jZUNvZGVzLCBxdWVyeSkge1xyXG4gICAgICAgIGlmIChxdWVyeSA9PT0gbnVsbCB8fCBxdWVyeSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gcHJlZmVyZW5jZUNvZGVzO1xyXG5cclxuICAgICAgICB2YXIgcHJlZmVyZW5jZUNvZGVNYXRjaFBhcnRpdGlvbiA9IF8ucGFydGl0aW9uKHByZWZlcmVuY2VDb2RlcywgZnVuY3Rpb24ocHJlZmVyZW5jZUNvZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChwcmVmZXJlbmNlQ29kZS5jb2RlKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkucmVwbGFjZSgnICcsICcnKS50b0xvd2VyQ2FzZSgpKSA9PT0gMDtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgcHJlZmVyZW5jZUNvZGVNYXRjaGVzID0gXy5zb3J0QnkocHJlZmVyZW5jZUNvZGVNYXRjaFBhcnRpdGlvblswXSwgZnVuY3Rpb24ocHJlZmVyZW5jZUNvZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VDb2RlLmNvZGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdmFyIG90aGVyTWF0Y2hlcyA9IF8uc29ydEJ5KHByZWZlcmVuY2VDb2RlTWF0Y2hQYXJ0aXRpb25bMV0sICdkZXNjcmlwdGlvbicpO1xyXG5cclxuICAgICAgICB2YXIgZGVzY3JpcHRpb25TdGFydE1hdGNoUGFydGl0aW9uID0gXy5wYXJ0aXRpb24ob3RoZXJNYXRjaGVzLCBmdW5jdGlvbihwcmVmZXJlbmNlQ29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJlZmVyZW5jZUNvZGUuZGVzY3JpcHRpb24gJiYgcHJlZmVyZW5jZUNvZGUuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpID09PSAwO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2YXIgb3RoZXJEZXNjcmlwdGlvbk1hdGNoZXMgPSBfLmZpbHRlcihkZXNjcmlwdGlvblN0YXJ0TWF0Y2hQYXJ0aXRpb25bMV0sIGZ1bmN0aW9uKHByZWZlcmVuY2VDb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmVmZXJlbmNlQ29kZS5kZXNjcmlwdGlvbiAmJiBwcmVmZXJlbmNlQ29kZS5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkudG9Mb3dlckNhc2UoKSkgPiAtMTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IF8uY29uY2F0KHByZWZlcmVuY2VDb2RlTWF0Y2hlcywgZGVzY3JpcHRpb25TdGFydE1hdGNoUGFydGl0aW9uWzBdLCBvdGhlckRlc2NyaXB0aW9uTWF0Y2hlcyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFsnJGFuYWx5dGljcycsICckdWliTW9kYWwnLCBwcmVmZXJlbmNlQ29kZVNlbGVjdG9yTW9kYWxdO1xyXG5cclxuZnVuY3Rpb24gcHJlZmVyZW5jZUNvZGVTZWxlY3Rvck1vZGFsKCRhbmFseXRpY3MsICR1aWJNb2RhbCkge1xyXG4gICAgdmFyIG1vZGFsID0ge1xyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICBwcmVmZXJlbmNlQ29kZVNlbGVjdG9yTW9kYWxDb250cm9sbGVyLiRpbmplY3QgPSBbJyR1aWJNb2RhbEluc3RhbmNlJywgJ3Bvc3NpYmxlUHJlZmVyZW5jZUNvZGVzJywgJ3ByZWZlcmVuY2VDb2RlJ107XHJcblxyXG4gICAgZnVuY3Rpb24gcHJlZmVyZW5jZUNvZGVTZWxlY3Rvck1vZGFsQ29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgcG9zc2libGVQcmVmZXJlbmNlQ29kZXMsIHByZWZlcmVuY2VDb2RlKSB7XHJcbiAgICAgICAgdmFyIHZtID0ge1xyXG4gICAgICAgICAgICBwcmVmZXJlbmNlQ29kZTogcHJlZmVyZW5jZUNvZGUsXHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICBuYXRpb25hbFByZWZlcmVuY2VDb2RlczogW10sXHJcbiAgICAgICAgICAgIHBvc3NpYmxlUHJlZmVyZW5jZUNvZGVzOiBwb3NzaWJsZVByZWZlcmVuY2VDb2RlcyxcclxuICAgICAgICAgICAgb2s6IG9rXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdjYW5jZWwnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIG9rKGNvZGUpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UoY29kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdm07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd01vZGFsKHBvc3NpYmxlUHJlZmVyZW5jZUNvZGVzLCBwcmVmZXJlbmNlQ29kZSkge1xyXG4gICAgICAgICRhbmFseXRpY3MuZXZlbnRUcmFjaygnb3Blbi1tb2RhbC1wcmVmZXJlbmNlLWNvZGUtc2VsZWN0b3InLCB7IGNhdGVnb3J5OiAncHJlZmVyZW5jZS1jb2RlcycgfSk7XHJcbiAgICAgICAgcmV0dXJuICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICBiYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgYmluZFRvQ29udHJvbGxlcjogdHJ1ZSxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogcHJlZmVyZW5jZUNvZGVTZWxlY3Rvck1vZGFsQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAnY3RybCcsXHJcbiAgICAgICAgICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgIHByZWZlcmVuY2VDb2RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VDb2RlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUHJlZmVyZW5jZUNvZGVzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc3NpYmxlUHJlZmVyZW5jZUNvZGVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaXplOiAnbGcnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3ByZWZlcmVuY2UtY29kZXMvbW9kYWxzL3ByZWZlcmVuY2UtY29kZS1zZWxlY3Rvci5odG1sJyxcclxuICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdtb2RhbC1wcmVmZXJlbmNlLWNvZGUtc2VsZWN0b3InXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1vZGFsO1xyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0gWyckYW5hbHl0aWNzJywgJyR1aWJNb2RhbCcsIHByZWZlcmVuY2VDb2RlTW9kYWxdO1xyXG5cclxuZnVuY3Rpb24gcHJlZmVyZW5jZUNvZGVNb2RhbCgkYW5hbHl0aWNzLCAkdWliTW9kYWwpIHtcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICBmb290bm90ZXM6IFtdLFxyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICBwcmVmZXJlbmNlQ29kZU1vZGFsQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgICAgICckdWliTW9kYWxJbnN0YW5jZScsIFxyXG4gICAgICAgICdwcmVmZXJlbmNlQ29kZScsIFxyXG4gICAgICAgICd1c2VVY2NFbmRVc2VQcm9jZWR1cmVDb2RlNDQnLCBcclxuICAgICAgICAncHJlZmVyZW5jZUNvZGVEYXRhU2VydmljZSdcclxuICAgIF07XHJcblxyXG4gICAgZnVuY3Rpb24gcHJlZmVyZW5jZUNvZGVNb2RhbENvbnRyb2xsZXIoXHJcbiAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UsIFxyXG4gICAgICAgIHByZWZlcmVuY2VDb2RlLCBcclxuICAgICAgICB1c2VVY2NFbmRVc2VQcm9jZWR1cmVDb2RlNDQsIFxyXG4gICAgICAgIHByZWZlcmVuY2VDb2RlRGF0YVNlcnZpY2VcclxuICAgICkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICBkYXRhOiBwcmVmZXJlbmNlQ29kZURhdGFTZXJ2aWNlLmRhdGEsXHJcbiAgICAgICAgICAgIHByZWZlcmVuY2VDb2RlOiBwcmVmZXJlbmNlQ29kZSxcclxuICAgICAgICAgICAgdXNlVWNjRW5kVXNlUHJvY2VkdXJlQ29kZTQ0OiB1c2VVY2NFbmRVc2VQcm9jZWR1cmVDb2RlNDRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsb2FkKHByZWZlcmVuY2VDb2RlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbG9hZChwcmVmZXJlbmNlQ29kZSkge1xyXG4gICAgICAgICAgICBwcmVmZXJlbmNlQ29kZURhdGFTZXJ2aWNlLmdldERlc2NyaXB0aW9uKHByZWZlcmVuY2VDb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChwcmVmZXJlbmNlQ29kZSwgdXNlVWNjRW5kVXNlUHJvY2VkdXJlQ29kZTQ0KSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdvcGVuLW1vZGFsLXByZWZlcmVuY2UtY29kZS1kZXNjcmlwdGlvbicsIHsgY2F0ZWdvcnk6ICdwcmVmZXJlbmNlLWNvZGVzJyB9KTtcclxuICAgICAgICByZXR1cm4gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICBhbmltYXRpb246IHRydWUsXHJcbiAgICAgICAgICAgIGJhY2tkcm9wOiB0cnVlLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBwcmVmZXJlbmNlQ29kZU1vZGFsQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAnY3RybCcsXHJcbiAgICAgICAgICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgIHByZWZlcmVuY2VDb2RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VDb2RlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHVzZVVjY0VuZFVzZVByb2NlZHVyZUNvZGU0NDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VVY2NFbmRVc2VQcm9jZWR1cmVDb2RlNDQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNpemU6ICdsZycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAncHJlZmVyZW5jZS1jb2Rlcy9tb2RhbHMvcHJlZmVyZW5jZS1jb2RlLmh0bWwnLFxyXG4gICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLXByZWZlcmVuY2UtY29kZSdcclxuICAgICAgICB9KS5yZXN1bHQuY2F0Y2goZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFsnZGF0YUNvbnRleHQnLCAnY29uZmlnJywgcHJlZmVyZW5jZUNvZGVTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIHByZWZlcmVuY2VDb2RlU2VydmljZShkYXRhQ29udGV4dCwgY29uZmlnKSB7XHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBnZXREZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24sXHJcbiAgICAgICAgZ2V0RGVzY3JpcHRpb25zOiBnZXREZXNjcmlwdGlvbnMsXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICBjb2RlOiBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKHByZWZlcmVuY2VDb2RlKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9wcmVmZXJlbmNlLWNvZGVzLycgKyBwcmVmZXJlbmNlQ29kZTtcclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oY29kZSkge1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5kYXRhLmNvZGUgPSBjb2RlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXREZXNjcmlwdGlvbnMoKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9wcmVmZXJlbmNlLWNvZGVzJztcclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcbn1cclxuIiwi77u/YW5ndWxhci5tb2R1bGUoJ3RhcmljLnF1b3RhJywgW10pXHJcbiAgICAuY29tcG9uZW50KCdvcmRlcm51bWJlckJ1dHRvbicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9vcmRlcm51bWJlci1idXR0b24nKSlcclxuICAgIC5jb21wb25lbnQoJ3VrT3JkZXJudW1iZXJCdXR0b24nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvdWstb3JkZXJudW1iZXItYnV0dG9uJykpXHJcbiAgICAuY29tcG9uZW50KCdvcmRlck51bWJlclBpY2tlcicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9vcmRlci1udW1iZXItcGlja2VyJykpXHJcbiAgICAuZmlsdGVyKCdvcmRlck51bWJlclR5cGVhaGVhZCcsIHJlcXVpcmUoJy4vZmlsdGVycy9vcmRlci1udW1iZXItdHlwZWFoZWFkLWZpbHRlcicpKVxyXG4gICAgLmZhY3RvcnkoJ29yZGVyUXVvdGFNb2RhbCcsIHJlcXVpcmUoJy4vbW9kYWxzL29yZGVyLXF1b3RhJykpXHJcbiAgICAuZmFjdG9yeSgndWtPcmRlclF1b3RhTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy91ay1vcmRlci1xdW90YScpKVxyXG4gICAgLmZhY3RvcnkoJ3F1b3RhTW9kYWxzJywgcmVxdWlyZSgnLi9tb2RhbHMvbW9kYWxzJykpXHJcbiAgICAuZmFjdG9yeSgncXVvdGFEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvcXVvdGEtZGF0YScpKVxyXG4gICAgOyIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHsgXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6ICc8JywgXHJcbiAgICAgICAgb3JkZXJOdW1iZXI6ICc8JywgXHJcbiAgICAgICAgcG9zc2libGVPcmRlck51bWJlcnM6ICc8ICcsIFxyXG4gICAgICAgIHNlbGVjdGlvbkNoYW5nZWQ6ICcmJyBcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBvcmRlck51bWJlclBpY2tlckNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3F1b3RhL2NvbXBvbmVudHMvb3JkZXItbnVtYmVyLXBpY2tlci5odG1sJ1xyXG59O1xyXG5cclxuZnVuY3Rpb24gb3JkZXJOdW1iZXJQaWNrZXJDb250cm9sbGVyKCkge1xyXG4gICAgXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgY2xlYXI6IGNsZWFyLFxyXG4gICAgICAgIG9yZGVyTnVtYmVyOiBudWxsLFxyXG4gICAgICAgIHVzZXJJbnB1dDogbnVsbCxcclxuICAgICAgICBwb3NzaWJsZU9yZGVyTnVtYmVyczogbnVsbCxcclxuICAgICAgICBpdGVtU2VsZWN0ZWQ6IGl0ZW1TZWxlY3RlZCxcclxuICAgICAgICBvbkJsdXI6IG9uQmx1cixcclxuICAgICAgICBvbkVudGVyOiBvbkVudGVyXHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXIoZXYpIHtcclxuICAgICAgICB2bS51c2VySW5wdXQgPSBudWxsO1xyXG4gICAgICAgIGNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKCkge1xyXG4gICAgICAgIHZtLm9yZGVyTnVtYmVyID0gbnVsbDtcclxuICAgICAgICBpZiAodm0uc2VsZWN0aW9uQ2hhbmdlZClcclxuICAgICAgICAgICAgdm0uc2VsZWN0aW9uQ2hhbmdlZCh7IG9yZGVyTnVtYmVyOiBudWxsIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkJsdXIoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25FbnRlcigpIHtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpdGVtU2VsZWN0ZWQoaXRlbSwgbW9kZWwpIHtcclxuICAgICAgICB2bS5vcmRlck51bWJlciA9IGl0ZW07XHJcblxyXG4gICAgICAgIGlmICh2bS5zZWxlY3Rpb25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdGlvbkNoYW5nZWQoeyBvcmRlck51bWJlcjogaXRlbSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9ICAgXHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7IFxyXG4gICAgICAgIG9yZGVybnVtYmVyOiAnPCcgXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogb3JkZXJOdW1iZXJCdXR0b25Db250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdxdW90YS9jb21wb25lbnRzL29yZGVybnVtYmVyLWJ1dHRvbi5odG1sJ1xyXG59O1xyXG5cclxub3JkZXJOdW1iZXJCdXR0b25Db250cm9sbGVyLiRpbmplY3QgPSBbJ3F1b3RhTW9kYWxzJ107XHJcblxyXG5mdW5jdGlvbiBvcmRlck51bWJlckJ1dHRvbkNvbnRyb2xsZXIocXVvdGFNb2RhbHMpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBzaG93T3JkZXJOdW1iZXI6IHNob3dPcmRlck51bWJlclxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBzaG93T3JkZXJOdW1iZXIoKSB7XHJcbiAgICAgICAgcXVvdGFNb2RhbHMub3JkZXJRdW90YS5zaG93KHZtLm9yZGVybnVtYmVyKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczogeyBcclxuICAgICAgICB1a1F1b3RhSW5mb3JtYXRpb246ICc8JyBcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiBvcmRlck51bWJlckJ1dHRvbkNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3F1b3RhL2NvbXBvbmVudHMvdWstb3JkZXJudW1iZXItYnV0dG9uLmh0bWwnXHJcbn07XHJcblxyXG5vcmRlck51bWJlckJ1dHRvbkNvbnRyb2xsZXIuJGluamVjdCA9IFsncXVvdGFNb2RhbHMnXTtcclxuXHJcbmZ1bmN0aW9uIG9yZGVyTnVtYmVyQnV0dG9uQ29udHJvbGxlcihxdW90YU1vZGFscykge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIHNob3dPcmRlck51bWJlcjogc2hvd09yZGVyTnVtYmVyXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dPcmRlck51bWJlcigpIHtcclxuICAgICAgICBxdW90YU1vZGFscy51a09yZGVyUXVvdGEuc2hvdyh2bS51a1F1b3RhSW5mb3JtYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFtvcmRlck51bWJlclR5cGVhaGVhZEZpbHRlcl07XHJcblxyXG4vLyBUYWtlcyBjYXJlIG9mIG9yZGVyaW5nIHRoZSByZXN1bHRzIG9mIHRoZSBvcmRlciBudW1iZXIgdHlwZWFoZWFkLlxyXG4vLyBJdCByZXR1cm5zIHRoZSBtYXRjaGVkIG9yZGVyIG51bWJlcnMsIHNvcnRlZFxyXG5mdW5jdGlvbiBvcmRlck51bWJlclR5cGVhaGVhZEZpbHRlcigpIHtcclxuXHJcblxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvcmRlck51bWJlcnMsIHF1ZXJ5KSB7XHJcbiAgICAgICAgaWYgKHF1ZXJ5ID09PSBudWxsIHx8IHF1ZXJ5ID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybiBvcmRlck51bWJlcnM7XHJcblxyXG4gICAgICAgIHZhciBvcmRlck51bWJlck1hdGNoUGFydGl0aW9uID0gXy5wYXJ0aXRpb24ob3JkZXJOdW1iZXJzLCBmdW5jdGlvbihvcmRlck51bWJlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gb3JkZXJOdW1iZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5KSA9PT0gMDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIHN0YXJ0TWF0Y2hlcyA9IF8uc29ydEJ5KG9yZGVyTnVtYmVyTWF0Y2hQYXJ0aXRpb25bMF0sIGZ1bmN0aW9uKG9yZGVyTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvcmRlck51bWJlcjtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIG90aGVyTWF0Y2hlc1BhcnRpdGlvbiA9IF8ucGFydGl0aW9uKG9yZGVyTnVtYmVyTWF0Y2hQYXJ0aXRpb25bMV0sIGZ1bmN0aW9uKG9yZGVyTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvcmRlck51bWJlci50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkpID4gMDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIG90aGVyTWF0Y2hlcyA9IF8uc29ydEJ5KG90aGVyTWF0Y2hlc1BhcnRpdGlvblswXSwgZnVuY3Rpb24ob3JkZXJOdW1iZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9yZGVyTnVtYmVyO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IF8uY29uY2F0KHN0YXJ0TWF0Y2hlcywgb3RoZXJNYXRjaGVzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFsnb3JkZXJRdW90YU1vZGFsJywgJ3VrT3JkZXJRdW90YU1vZGFsJywgcXVvdGFNb2RhbHNTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIHF1b3RhTW9kYWxzU2VydmljZShvcmRlclF1b3RhTW9kYWwsIHVrT3JkZXJRdW90YU1vZGFsKSB7XHJcblxyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgb3JkZXJRdW90YTogb3JkZXJRdW90YU1vZGFsLFxyXG4gICAgICAgIHVrT3JkZXJRdW90YTogdWtPcmRlclF1b3RhTW9kYWwsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0gWyckYW5hbHl0aWNzJywgJyR1aWJNb2RhbCcsIG9yZGVyUXVvdGFNb2RhbF07XHJcblxyXG5mdW5jdGlvbiBvcmRlclF1b3RhTW9kYWwoJGFuYWx5dGljcywgJHVpYk1vZGFsKSB7XHJcbiAgICB2YXIgbW9kYWwgPSB7XHJcbiAgICAgICAgb3JkZXI6IG51bGwsXHJcbiAgICAgICAgc2hvdzogc2hvd01vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIG9yZGVyTnVtYmVyTW9kYWxDb250cm9sbGVyLiRpbmplY3QgPSBbJyR0cmFuc2xhdGUnLCAnJHVpYk1vZGFsSW5zdGFuY2UnLCAnb3JkZXJOdW1iZXInLCAncXVvdGFEYXRhU2VydmljZSddO1xyXG5cclxuICAgIGZ1bmN0aW9uIG9yZGVyTnVtYmVyTW9kYWxDb250cm9sbGVyKCR0cmFuc2xhdGUsICR1aWJNb2RhbEluc3RhbmNlLCBvcmRlck51bWJlciwgcXVvdGFEYXRhU2VydmljZSkge1xyXG5cclxuICAgICAgICB2YXIgdHJhbnNsYXRpb25zID0gW107XHJcbiAgICAgICAgJHRyYW5zbGF0ZShbJ3NoYXJlZC11aS5Mb2FkaW5nJywgJ3RhcmljLkluZm9ybWF0aW9uRm9yT3JkZXJOdW1iZXInXSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0aW9ucyA9IHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIHZtID0ge1xyXG4gICAgICAgICAgICBjYW5jZWw6IGNhbmNlbCxcclxuICAgICAgICAgICAgY2hhcnQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbG9yczogWycjQjdDREU2J10sXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgZGF0YXNldE92ZXJyaWRlOiBbe1xyXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNCN0NERTYnLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAnIzY2NzI4MCcsXHJcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDIsXHJcbiAgICAgICAgICAgICAgICAgICAgbGluZVRlbnNpb246IDAuMSxcclxuICAgICAgICAgICAgICAgICAgICBwb2ludEJvcmRlckNvbG9yOiAnI2ZmZmZmZicsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRCb3JkZXJXaWR0aDogMyxcclxuICAgICAgICAgICAgICAgICAgICBwb2ludFJhZGl1czogNixcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0JhbGFuY2UnLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50QmFja2dyb3VuZENvbG9yOiAnIzY2NzI4MCcsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmUnXHJcbiAgICAgICAgICAgICAgICB9XSxcclxuICAgICAgICAgICAgICAgIGxhYmVsczogW10sXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc2VyaWVzOiBbJ1NlcmllcyBBJ11cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb3JkZXJEYXRhOiBudWxsLFxyXG4gICAgICAgICAgICBvcmRlcm51bWJlcjogb3JkZXJOdW1iZXIsXHJcbiAgICAgICAgICAgIHRpdGxlOiB0cmFuc2xhdGlvbnNbJ3NoYXJlZC11aS5Mb2FkaW5nJ10sXHJcbiAgICAgICAgICAgIGlzTG9hZGluZzogdHJ1ZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygnY2FuY2VsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xyXG4gICAgICAgICAgICAvLyQoJyNvcmRlck51bWJlckJhbGFuY2VDaGFydCcpLnNob3coKTtcclxuICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHF1b3RhRGF0YVNlcnZpY2UuZ2V0T3JkZXJEZXRhaWxzKHZtLm9yZGVybnVtYmVyKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS50aXRsZSA9IHRyYW5zbGF0aW9uc1sndGFyaWMuSW5mb3JtYXRpb25Gb3JPcmRlck51bWJlciddICsgJyAnICsgdm0ub3JkZXJudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gJ251bGwnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB2bS5vcmRlckRhdGEgPSBkYXRhO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuYmFsYW5jZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJhbGFuY2VbaV0uc3RhcnRfb2NjdXJlbmNlX2RhdGUgPSBkYXRhLmJhbGFuY2VbaV0uc3RhcnRfb2NjdXJlbmNlX2RhdGUuc3Vic3RyaW5nKDgsIDEwKSArICctJyArIGRhdGEuYmFsYW5jZVtpXS5zdGFydF9vY2N1cmVuY2VfZGF0ZS5zdWJzdHJpbmcoNSwgNykgKyAnLScgKyBkYXRhLmJhbGFuY2VbaV0uc3RhcnRfb2NjdXJlbmNlX2RhdGUuc3Vic3RyaW5nKDAsIDQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdm0uY2hhcnQubGFiZWxzID0gXy5tYXAoZGF0YS5iYWxhbmNlLCBmdW5jdGlvbiAoYikgeyByZXR1cm4gYi5zdGFydF9vY2N1cmVuY2VfZGF0ZTsgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uY2hhcnQuZGF0YSA9IFtfLm1hcChkYXRhLmJhbGFuY2UsIGZ1bmN0aW9uIChiKSB7IHJldHVybiBiLm5ld19iYWxhbmNlOyB9KV07XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnRpdGxlID0gdHJhbnNsYXRpb25zWyd0YXJpYy5JbmZvcm1hdGlvbkZvck9yZGVyTnVtYmVyJ10gKyAnICcgKyB2bS5vcmRlcm51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGluaXQoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChvcmRlck51bWJlcikge1xyXG4gICAgICAgICRhbmFseXRpY3MuZXZlbnRUcmFjaygnb3Blbi1tb2RhbC1xdW90YS1kZXRhaWxzJywgeyBjYXRlZ29yeTogJ3F1b3RhJyB9KTtcclxuICAgICAgICByZXR1cm4gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICBiYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogb3JkZXJOdW1iZXJNb2RhbENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJyxcclxuICAgICAgICAgICAga2V5Ym9hcmQ6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGFsRmFkZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgb3JkZXJOdW1iZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXJOdW1iZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNpemU6ICdsZycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAncXVvdGEvbW9kYWxzL29yZGVyLXF1b3RhLmh0bWwnLFxyXG4gICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLW9yZGVyLW51bWJlcidcclxuICAgICAgICB9KS5yZXN1bHQuY2F0Y2goZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFsnJGFuYWx5dGljcycsICckdWliTW9kYWwnLCB1a09yZGVyUXVvdGFNb2RhbF07XHJcblxyXG5mdW5jdGlvbiB1a09yZGVyUXVvdGFNb2RhbCgkYW5hbHl0aWNzLCAkdWliTW9kYWwpIHtcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICBvcmRlcjogbnVsbCxcclxuICAgICAgICBzaG93OiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgdWtPcmRlck51bWJlck1vZGFsQ29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICd1a1F1b3RhSW5mb3JtYXRpb24nXTtcclxuXHJcbiAgICBmdW5jdGlvbiB1a09yZGVyTnVtYmVyTW9kYWxDb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlLCB1a1F1b3RhSW5mb3JtYXRpb24pIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID0ge1xyXG4gICAgICAgICAgICBjYW5jZWw6IGNhbmNlbCxcclxuICAgICAgICAgICAgdWtRdW90YUluZm9ybWF0aW9uOiB1a1F1b3RhSW5mb3JtYXRpb24sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdjYW5jZWwnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB2bTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TW9kYWwodWtRdW90YUluZm9ybWF0aW9uKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdvcGVuLW1vZGFsLXF1b3RhLWRldGFpbHMnLCB7IGNhdGVnb3J5OiAncXVvdGEnIH0pO1xyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGJhY2tkcm9wOiB0cnVlLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiB1a09yZGVyTnVtYmVyTW9kYWxDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bScsXHJcbiAgICAgICAgICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgIHVrUXVvdGFJbmZvcm1hdGlvbjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1a1F1b3RhSW5mb3JtYXRpb247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNpemU6ICdsZycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAncXVvdGEvbW9kYWxzL3VrLW9yZGVyLXF1b3RhLmh0bWwnLFxyXG4gICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLW9yZGVyLW51bWJlcidcclxuICAgICAgICB9KS5yZXN1bHQuY2F0Y2goZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFsnY29tbW9uJywgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgJ2RhdGFDb250ZXh0JywgcXVvdGFEYXRhU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBxdW90YURhdGFTZXJ2aWNlKGNvbW1vbiwgc3RhdGUsIGNvbnRleHQpIHtcclxuXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBnZXRPcmRlckRldGFpbHM6IGdldE9yZGVyRGV0YWlsc1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRPcmRlckRldGFpbHMob3JkZXJOdW1iZXIpIHtcclxuICAgICAgICB2YXIgZGVmZXJyZWQgPSBjb21tb24uJHEuZGVmZXIoKTtcclxuXHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvYWN0aW9ucy9xdW90YS9kZXRhaWxzJyArXHJcbiAgICAgICAgICAgICc/b3JkZXJudW1iZXI9JyArIG9yZGVyTnVtYmVyICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuXHJcbiAgICAgICAgY29udGV4dC5nZXQodXJsKVxyXG4gICAgICAgICAgICAudGhlbihkZWZlcnJlZC5yZXNvbHZlLCBkZWZlcnJlZC5yZWplY3QpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxufSIsImFuZ3VsYXIubW9kdWxlKCd0YXJpYy5yZWZlcmVuY2VEYXRlJywgW10pXHJcbiAgICAuY29tcG9uZW50KCdyZWZlcmVuY2VEYXRlUGlja2VyJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3JlZmVyZW5jZS1kYXRlLXBpY2tlcicpKVxyXG4gICAgLmZhY3RvcnkoJ3JlZmVyZW5jZURhdGVTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy9yZWZlcmVuY2UtZGF0ZScpKVxyXG4gICAgO1xyXG4iLCJ2YXIgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IHJlZmVyZW5jZURhdGVQaWNrZXJDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdyZWZlcmVuY2UtZGF0ZS9jb21wb25lbnRzL3JlZmVyZW5jZS1kYXRlLXBpY2tlci5odG1sJ1xyXG59O1xyXG5cclxucmVmZXJlbmNlRGF0ZVBpY2tlckNvbnRyb2xsZXIuJGluamVjdCA9IFsncmVmZXJlbmNlRGF0ZVNlcnZpY2UnLCAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIHJlZmVyZW5jZURhdGVQaWNrZXJDb250cm9sbGVyKHJlZmVyZW5jZURhdGVTZXJ2aWNlLCBzdGF0ZSkge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgIGJsdXI6IGJsdXIsXHJcbiAgICAgICAgZGF0ZUNoYW5nZWQ6IGRhdGVDaGFuZ2VkLFxyXG4gICAgICAgIGRhdGVPcHRpb25zOiB7XHJcbiAgICAgICAgICAgIG1pbkRhdGU6IG1vbWVudCgnMTk3Mi0wMS0wMScpLnRvRGF0ZSgpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBmb3JtYXQ6ICdkIS1NIS15eXl5JyxcclxuICAgICAgICBwb3B1cDoge1xyXG4gICAgICAgICAgICBvcGVuZWQ6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb3Blbjogb3BlbixcclxuICAgICAgICBxdWVyeToge1xyXG4gICAgICAgICAgICBkYXRlOiBnZXREYXRlKClcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIGlmIChzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9PT0gJ0NIJykge1xyXG4gICAgICAgICAgICB2bS5kYXRlT3B0aW9ucy5taW5EYXRlID0gbW9tZW50KCcyMDIyLTAxLTAxJykudG9EYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldERhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZURhdGVTZXJ2aWNlLmdldFJlZmVyZW5jZURhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkYXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAoc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgPT09ICdDSCcgJiYgbW9tZW50KHZtLnF1ZXJ5LmRhdGUpLmlzQmVmb3JlKCcyMDIyLTAxLTAxJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZWZlcmVuY2VEYXRlU2VydmljZS5zZXRSZWZlcmVuY2VEYXRlKHZtLnF1ZXJ5LmRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGJsdXIoKSB7XHJcbiAgICAgICAgaWYgKCF2bS5xdWVyeS5kYXRlKSB7XHJcbiAgICAgICAgICAgIHZtLnF1ZXJ5LmRhdGUgPSBnZXREYXRlKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb3BlbigpIHtcclxuICAgICAgICB2bS5wb3B1cC5vcGVuZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxufVxyXG4iLCJ2YXIgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFsnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLCByZWZlcmVuY2VEYXRlU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiByZWZlcmVuY2VEYXRlU2VydmljZShzdGF0ZSwgbm90aWZpY2F0aW9ucykge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgZ2V0UmVmZXJlbmNlRGF0ZTogZ2V0UmVmZXJlbmNlRGF0ZSxcclxuICAgICAgICBzZXRSZWZlcmVuY2VEYXRlOiBzZXRSZWZlcmVuY2VEYXRlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlRGF0ZSgpIHtcclxuICAgICAgICByZXR1cm4gbW9tZW50KHN0YXRlLmZpbHRlci5kYXRlLCAnWVlZWS1NTS1ERCcpLnRvRGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNldFJlZmVyZW5jZURhdGUobmV3RGF0ZSkge1xyXG4gICAgICAgIGlmIChuZXdEYXRlKSB7XHJcbiAgICAgICAgICAgIHZhciBzZXJpYWxpemVkRGF0ZSA9IG1vbWVudChuZXdEYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZWREYXRlICE9PSBzdGF0ZS5maWx0ZXIuZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgc3RhdGUuZmlsdGVyLmRhdGUgPSBzZXJpYWxpemVkRGF0ZTtcclxuICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVibGlzaCgnZmlsdGVyX2RhdGVfY2hhbmdlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Iiwi77u/YW5ndWxhci5tb2R1bGUoJ3RhcmljLnJlZmVyZW5jZVByaWNlcycsIFtdKVxyXG4gICAgLmNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgcm91dGVDb25maWd1cmF0b3JdKVxyXG4gICAgLmNvbXBvbmVudCgncmVmZXJlbmNlUHJpY2VzT3ZlcnZpZXdQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL292ZXJ2aWV3LXBhZ2UnKSlcclxuICAgIC5mYWN0b3J5KCdyZWZlcmVuY2VQcmljZXNEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvcmVmZXJlbmNlcHJpY2VzLWRhdGEnKSk7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL3JlZmVyZW5jZXByaWNlcycsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8cmVmZXJlbmNlLXByaWNlcy1vdmVydmlldy1wYWdlPjwvcmVmZXJlbmNlLXByaWNlcy1vdmVydmlldy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIDtcclxufVxyXG4iLCLvu792YXIgRmlsZVNhdmVyID0gcmVxdWlyZSgnZmlsZS1zYXZlcicpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiByZWZlcmVuY2VQcmljZU92ZXJ2aWV3Q29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAncmVmZXJlbmNlcHJpY2VzL2NvbXBvbmVudHMvb3ZlcnZpZXctcGFnZS5odG1sJ1xyXG59O1xyXG5cclxucmVmZXJlbmNlUHJpY2VPdmVydmlld0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnY29tbW9uJywgXHJcbiAgICAnaWRlbnRpdHknLFxyXG4gICAgJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJywgXHJcbiAgICAnY291bnRyeURhdGFTZXJ2aWNlJywgXHJcbiAgICAncmVmZXJlbmNlUHJpY2VzRGF0YVNlcnZpY2UnLCBcclxuICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZSdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHJlZmVyZW5jZVByaWNlT3ZlcnZpZXdDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICBjb21tb24sIFxyXG4gICAgaWRlbnRpdHksXHJcbiAgICBub3RpZmljYXRpb25zLCBcclxuICAgIGNvdW50cnlEYXRhU2VydmljZSwgXHJcbiAgICByZWZlcmVuY2VQcmljZXNEYXRhU2VydmljZSwgXHJcbiAgICBzdGF0ZVxyXG4pIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICBkYXRlQ2hhbmdlZDogZGF0ZUNoYW5nZWQsXHJcbiAgICAgICAgZG93bmxvYWQ6IGRvd25sb2FkLFxyXG4gICAgICAgIGRvd25sb2FkU3RyZWFtWG1sOiBkb3dubG9hZFN0cmVhbVhtbCxcclxuICAgICAgICBsb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBwcmljZXM6IHtcclxuICAgICAgICAgICAgb3JpZ2luYWw6IG51bGwsXHJcbiAgICAgICAgICAgIGltcG9ydFZhbHVlczogW10sXHJcbiAgICAgICAgICAgIHVuaXRQcmljZXM6IFtdXHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gZGF0ZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgbG9hZERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL3JlZmVyZW5jZS1wcmljZXMnKTtcclxuICAgICAgICBsb2FkRGF0YSgpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMudW5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBkYXRlQ2hhbmdlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZERhdGEoKSB7XHJcbiAgICAgICAgdmFyIGdldFJlZmVyZW5jZVByaWNlc1Byb21pc2U7XHJcbiAgICAgICAgaWYgKGlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ3JlZmVyZW5jZV9wcmljZXMnKSkge1xyXG4gICAgICAgICAgICBnZXRSZWZlcmVuY2VQcmljZXNQcm9taXNlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlUHJpY2VzRGF0YVNlcnZpY2UuZ2V0UmVmZXJlbmNlUHJpY2VzKGNvbW1vbi5sYW5ndWFnZS5nZXQoKSwgc3RhdGUuZmlsdGVyLmRhdGUpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZ2V0UmVmZXJlbmNlUHJpY2VzUHJvbWlzZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZVByaWNlc0RhdGFTZXJ2aWNlLmdldFNhbXBsZVJlZmVyZW5jZVByaWNlcyhjb21tb24ubGFuZ3VhZ2UuZ2V0KCkpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB2bS5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB2bS5wcmljZXMudW5pdFByaWNlcyA9IFtdO1xyXG4gICAgICAgIHZtLnByaWNlcy5pbXBvcnRWYWx1ZXMgPSBbXTtcclxuXHJcblxyXG4gICAgICAgIHJldHVybiBnZXRSZWZlcmVuY2VQcmljZXNQcm9taXNlKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdm0ucHJpY2VzLm9yaWdpbmFsID0gcmVzdWx0LlJlc3VsdDtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0LlJlc3VsdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnByaWNlcy5pbXBvcnRWYWx1ZXMgPSB2bS5wcmljZXMuaW1wb3J0VmFsdWVzLmNvbmNhdChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXy5tYXAocmVzdWx0LlJlc3VsdFtpXS5TdGFuZGFyZEltcG9ydFZhbHVlcywgZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLkNvdW50cnlPZk9yaWdpbiA9PT0gJzEwMTEnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uQ291bnRyeU9mT3JpZ2luICs9ICcg4oCUIEVyZ2EgT21uZXMnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvdW50cnkgPSBjb3VudHJ5RGF0YVNlcnZpY2UuZ2V0Q291bnRyeShpdGVtLkNvdW50cnlPZk9yaWdpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50cnkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uQ291bnRyeU9mT3JpZ2luICs9ICcg4oCUICcgKyBjb3VudHJ5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5Hb29kc25vbSA9IHJlc3VsdC5SZXN1bHRbaV0uR29vZHNub207XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnByaWNlcy51bml0UHJpY2VzID0gdm0ucHJpY2VzLnVuaXRQcmljZXMuY29uY2F0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLm1hcChyZXN1bHQuUmVzdWx0W2ldLlVuaXRQcmljZXMsIGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5EdXR5LmluZGV4T2YoJyBldWMnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5EdXR5ID0gJ+KCrCAnICsgaXRlbS5EdXR5LnJlcGxhY2UoJyBldWMnLCAnICcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uQ291bnRyeU9mT3JpZ2luID09PSAnMTAxMScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5Db3VudHJ5T2ZPcmlnaW4gKz0gJyDigJQgRXJnYSBPbW5lcyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeSA9IGNvdW50cnlEYXRhU2VydmljZS5nZXRDb3VudHJ5KGl0ZW0uQ291bnRyeU9mT3JpZ2luKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRyeSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5Db3VudHJ5T2ZPcmlnaW4gKz0gJyDigJQgJyArIGNvdW50cnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLkdvb2Rzbm9tID0gcmVzdWx0LlJlc3VsdFtpXS5Hb29kc25vbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZG93bmxvYWRTdHJlYW1YbWwoKSB7XHJcbiAgICAgICAgdmFyIGZpbGVOYW1lID0gJ3ZhbHVhdGlvblZhbHVlcy54bWwnO1xyXG4gICAgICAgIHJlZmVyZW5jZVByaWNlc0RhdGFTZXJ2aWNlLmdldFN0cmVhbVhtbChzdGF0ZS5maWx0ZXIuZGF0ZSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsZVRvU2F2ZSA9IG5ldyBCbG9iKFtyZXN1bHRdLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL3htbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZU5hbWVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gR2xvYmFsIGxvYWRlZCBpbiBGaWxlU2F2ZXIubWluLmpzXHJcbiAgICAgICAgICAgICAgICBGaWxlU2F2ZXIuc2F2ZUFzKGZpbGVUb1NhdmUsIGZpbGVOYW1lKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZG93bmxvYWQoKSB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgYmxvYiBvZiB0aGUgZGF0YVxyXG4gICAgICAgIHZhciBmaWxlTmFtZSA9ICdyZWZlcmVuY2UtcHJpY2VzLmpzb24nO1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICByZXN1bHQ6IHZtLnByaWNlcy5vcmlnaW5hbCxcclxuICAgICAgICAgICAgcmVmZXJlbmNlRGF0ZTogc3RhdGUuZmlsdGVyLmRhdGVcclxuICAgICAgICB9KTtcclxuICAgICAgICBqc29uID0ganNvbi5yZXBsYWNlKC8mZXVybzsvZywgJ0VVUicpLnJlcGxhY2UoL+KCrFxccz9FVVIvZywgJ0VVUicpO1xyXG4gICAgICAgIGpzb24gPSBqc29uLnJlcGxhY2UoL0dvb2Rzbm9tL2csIFwiZ29vZHNub21cIik7XHJcbiAgICAgICAganNvbiA9IGpzb24ucmVwbGFjZSgvU3RhbmRhcmRJbXBvcnRWYWx1ZXMvZywgXCJzdGFuZGFyZEltcG9ydFZhbHVlc1wiKTtcclxuICAgICAgICBqc29uID0ganNvbi5yZXBsYWNlKC9Vbml0UHJpY2VzL2csIFwidW5pdFByaWNlc1wiKTtcclxuICAgICAgICBqc29uID0ganNvbi5yZXBsYWNlKC9Db3VudHJ5T2ZPcmlnaW4vZywgXCJjb3VudHJ5T2ZPcmlnaW5cIik7XHJcbiAgICAgICAganNvbiA9IGpzb24ucmVwbGFjZSgvRHV0eS9nLCBcImR1dHlcIik7XHJcbiAgICAgICAganNvbiA9IGpzb24ucmVwbGFjZSgvU3RhcnREYXRlL2csIFwic3RhcnREYXRlXCIpO1xyXG4gICAgICAgIGpzb24gPSBqc29uLnJlcGxhY2UoL0VuZERhdGUvZywgXCJlbmREYXRlXCIpO1xyXG4gICAgICAgIGpzb24gPSBqc29uLnJlcGxhY2UoLyhcXGQrKSwoXFxkKykvZywgXCIkMS4kMlwiKTtcclxuICAgICAgICB2YXIgZmlsZVRvU2F2ZSA9IG5ldyBCbG9iKFtqc29uXSwge1xyXG4gICAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgICAgIG5hbWU6IGZpbGVOYW1lXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEdsb2JhbCBsb2FkZWQgaW4gRmlsZVNhdmVyLm1pbi5qc1xyXG4gICAgICAgIEZpbGVTYXZlci5zYXZlQXMoZmlsZVRvU2F2ZSwgZmlsZU5hbWUpO1xyXG5cclxuICAgICAgICAvLyBTYXZlIHRoZSBmaWxlXHJcbiAgICAgICAgLy8gdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgICAvLyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xyXG4gICAgICAgIC8vIGEuc3R5bGUgPSBcImRpc3BsYXk6IG5vbmVcIjtcclxuXHJcbiAgICAgICAgLy8gdmFyIHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGVUb1NhdmUpO1xyXG4gICAgICAgIC8vIGEuaHJlZiA9IHVybDtcclxuICAgICAgICAvLyBhLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICAgICAgLy8gYS5jbGljaygpO1xyXG4gICAgICAgIC8vIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxufVxyXG4iLCLvu792YXIgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFsnY29tbW9uJywgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgJ2RhdGFDb250ZXh0JywgcmVmZXJlbmNlUHJpY2VzRGF0YVNlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gcmVmZXJlbmNlUHJpY2VzRGF0YVNlcnZpY2UoY29tbW9uLCBzdGF0ZSwgZGF0YUNvbnRleHQpIHtcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGdldFJlZmVyZW5jZVByaWNlczogZ2V0UmVmZXJlbmNlUHJpY2VzLFxyXG4gICAgICAgIGdldFNhbXBsZVJlZmVyZW5jZVByaWNlczogZ2V0U2FtcGxlUmVmZXJlbmNlUHJpY2VzLFxyXG4gICAgICAgIGdldFN0cmVhbVhtbDogZ2V0U3RyZWFtWG1sXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGdldFJlZmVyZW5jZVByaWNlcyhsYW5ndWFnZSwgZGF0ZSkge1xyXG4gICAgICAgIHZhciBhcGlEYXRlID0gZGF0ZSA/IG1vbWVudChkYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG5cclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0c1tjb21tb24uY29uZmlnLmN1cnJlbnRBcGldICsgJy9yZXByZXNlbnRhdGl2ZS1wcmljZXMvanNvbj9sYW5nPScgKyBsYW5ndWFnZSArIFxyXG4gICAgICAgICAgICAnJmRhdGU9JyArIGFwaURhdGUgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZUNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5O1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0U2FtcGxlUmVmZXJlbmNlUHJpY2VzKGxhbmd1YWdlKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvcmVwcmVzZW50YXRpdmUtcHJpY2VzL3NhbXBsZT9sYW5nPScgKyBsYW5ndWFnZSArIFxyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZUNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5O1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0U3RyZWFtWG1sKGRhdGUpIHtcclxuICAgICAgICB2YXIgYXBpRGF0ZSA9IGRhdGUgPyBtb21lbnQoZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJykgOiBtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0c1tjb21tb24uY29uZmlnLmN1cnJlbnRBcGldICsgJy9yZXByZXNlbnRhdGl2ZS1wcmljZXMvc3RyZWFtJyArIFxyXG4gICAgICAgICAgICAnP2RhdGU9JyArIGFwaURhdGUgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZUNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5O1xyXG4gICAgICAgIHZhciByZXF1ZXN0SWQgPSAnUkVGRVJFTkNFX1BSSUNFU19YTUwnO1xyXG4gICAgICAgIHZhciBoZWFkZXJzID0geyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3htbCcgfTtcclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCwgcmVxdWVzdElkLCBoZWFkZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbn1cclxuIiwiYW5ndWxhci5tb2R1bGUoJ3RhcmljLnJlZ3VsYXRpb25zJywgW10pXHJcbiAgICAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCByb3V0ZUNvbmZpZ3VyYXRvcl0pXHJcbiAgICAuY29tcG9uZW50KCdyZWd1bGF0aW9uc05ld3NQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3JlZ3VsYXRpb25zLW5ld3MtcGFnZScpKVxyXG4gICAgLmNvbXBvbmVudCgncmVndWxhdGlvbkRldGFpbHNQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3JlZ3VsYXRpb24tZGV0YWlscy1wYWdlJykpXHJcbiAgICAuY29tcG9uZW50KCdyZWd1bGF0aW9uJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3JlZ3VsYXRpb24nKSlcclxuICAgIC5jb21wb25lbnQoJ3JlZ3VsYXRpb25CdXR0b24nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvcmVndWxhdGlvbi1idXR0b24nKSlcclxuICAgIC5jb21wb25lbnQoJ3JlZ3VsYXRpb25zQnV0dG9uJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3JlZ3VsYXRpb25zLWJ1dHRvbicpKVxyXG4gICAgLmNvbXBvbmVudCgncmVndWxhdGlvbnNOZXdzJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3JlZ3VsYXRpb25zLW5ld3MnKSlcclxuICAgIC5mYWN0b3J5KCdyZWd1bGF0aW9uTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9yZWd1bGF0aW9uJykpXHJcbiAgICAuZmFjdG9yeSgncmVndWxhdGlvbnNNb2RhbCcsIHJlcXVpcmUoJy4vbW9kYWxzL3JlZ3VsYXRpb25zJykpXHJcbiAgICAuZmFjdG9yeSgncmVndWxhdGlvbnNEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvcmVndWxhdGlvbnMtZGF0YScpKVxyXG4gICAgLmZpbHRlcignY2VsZXhUb1JlZ3VsYXRpb25OdW1iZXInLCByZXF1aXJlKCcuL2ZpbHRlcnMvY2VsZXgtdG8tcmVndWxhdGlvbi1udW1iZXInKSk7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL3JlZ3VsYXRpb25zL25ld3MnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHJlZ3VsYXRpb25zLW5ld3MtcGFnZT48L3JlZ3VsYXRpb25zLW5ld3MtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2hlbignL3JlZ3VsYXRpb24tZGV0YWlscy86Y2VsZXgnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHJlZ3VsYXRpb24tZGV0YWlscy1wYWdlPjwvcmVndWxhdGlvbi1kZXRhaWxzLXBhZ2U+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgO1xyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBtZWFzdXJlczogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogcmVndWxhdGlvbkJ1dHRvbkNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3JlZ3VsYXRpb25zL2NvbXBvbmVudHMvcmVndWxhdGlvbi1idXR0b24uaHRtbCdcclxufTtcclxuXHJcbnJlZ3VsYXRpb25CdXR0b25Db250cm9sbGVyLiRpbmplY3QgPSBbJyRxJywgJ3JlZ3VsYXRpb25Nb2RhbCcsICdyZWd1bGF0aW9uc0RhdGFTZXJ2aWNlJ107XHJcblxyXG5mdW5jdGlvbiByZWd1bGF0aW9uQnV0dG9uQ29udHJvbGxlcigkcSwgcmVndWxhdGlvbk1vZGFsLCByZWd1bGF0aW9uc0RhdGEpIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc2hvd1JlZ3VsYXRpb246IHNob3dSZWd1bGF0aW9uXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dSZWd1bGF0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiAkcS5hbGwoXHJcbiAgICAgICAgICAgIF8uY2hhaW4odm0ubWVhc3VyZXMpXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFtZWFzdXJlLnJlZ3VsYXRpb247XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnVuaXFCeShmdW5jdGlvbihtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmUudHlwZSArICd8JyArIG1lYXN1cmUucmVndWxhdGlvbi5pZCArICd8JyArIG1lYXN1cmUucmVnaW9uLmNvZGU7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLm9yZGVyQnkoZnVuY3Rpb24obWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlLnJlZ3VsYXRpb24ucmVnX3B1YmRhdGU7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbihtZWFzdXJlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ3VsYXRpb25zRGF0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVndWxhdGlvbihtZWFzdXJlLnJlZ3VsYXRpb24uaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlZ3VsYXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmUucmVndWxhdGlvbi5ldXJsZXhfcmVndWxhdGlvbiA9IHJlZ3VsYXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnZhbHVlKClcclxuICAgICAgICAgICAgKS50aGVuKGZ1bmN0aW9uKG1lYXN1cmVzKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG1lYXN1cmVzKTtcclxuICAgICAgICAgICAgcmVndWxhdGlvbk1vZGFsLnNob3cobWVhc3VyZXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiByZWd1bGF0aW9uRGV0YWlsc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3JlZ3VsYXRpb25zL2NvbXBvbmVudHMvcmVndWxhdGlvbi1kZXRhaWxzLXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbnJlZ3VsYXRpb25EZXRhaWxzQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckcm91dGVQYXJhbXMnLFxyXG4gICAgJ2NvbW1vbicsIFxyXG4gICAgJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJyxcclxuICAgICdyZWd1bGF0aW9uc0RhdGFTZXJ2aWNlJywgXHJcbiAgICAnbWVhc3VyZVR5cGVzRGF0YVNlcnZpY2UnLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gcmVndWxhdGlvbkRldGFpbHNDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkcm91dGVQYXJhbXMsXHJcbiAgICBjb21tb24sIFxyXG4gICAgbm90aWZpY2F0aW9uc1NlcnZpY2UsXHJcbiAgICByZWd1bGF0aW9uc0RhdGEsIFxyXG4gICAgbWVhc3VyZVR5cGVzRGF0YVxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgY2VsZXg6ICcnLFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgbGFuZ3VhZ2VJZDogY29tbW9uLmxhbmd1YWdlLmdldCgpLFxyXG4gICAgICAgIG1lYXN1cmVUeXBlczoge30sXHJcbiAgICAgICAgcmVndWxhdGlvbjoge30sXHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL3JlZ3VsYXRpb24tZGV0YWlscycpO1xyXG4gICAgICAgIGNvbW1vbi5hdXRoLmNoZWNrKCk7XHJcbiAgICAgICAgaWYgKCRyb3V0ZVBhcmFtcy5jZWxleCkge1xyXG4gICAgICAgICAgICBsb2FkUmVndWxhdGlvbkRldGFpbHMoJHJvdXRlUGFyYW1zLmNlbGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2Uuc3Vic2NyaWJlKCdsYW5ndWFnZV9jaGFuZ2VkJywgbGFuZ3VhZ2VDaGFuZ2VkKTtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBkYXRlQ2hhbmdlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGF0ZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgaWYgKCRyb3V0ZVBhcmFtcy5jZWxleCkge1xyXG4gICAgICAgICAgICBsb2FkUmVndWxhdGlvbkRldGFpbHMoJHJvdXRlUGFyYW1zLmNlbGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZE1lYXN1cmVUeXBlcygpIHtcclxuICAgICAgICByZXR1cm4gbWVhc3VyZVR5cGVzRGF0YVxyXG4gICAgICAgICAgICAuZ2V0TWVhc3VyZVR5cGVzRGljdGlvbmFyeSgpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKG1lYXN1cmVUeXBlcykge1xyXG4gICAgICAgICAgICAgICAgdm0ubWVhc3VyZVR5cGVzID0gbWVhc3VyZVR5cGVzO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsYW5ndWFnZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgdm0ubGFuZ3VhZ2VJZCA9IGNvbW1vbi5sYW5ndWFnZS5nZXQoKTtcclxuICAgICAgICBpZiAoJHJvdXRlUGFyYW1zLmNlbGV4KSB7XHJcbiAgICAgICAgICAgIGxvYWRSZWd1bGF0aW9uRGV0YWlscygkcm91dGVQYXJhbXMuY2VsZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkUmVndWxhdGlvbkRldGFpbHMoY2VsZXgpIHtcclxuICAgICAgICB2bS5jZWxleCA9ICRyb3V0ZVBhcmFtcy5jZWxleDtcclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBsb2FkTWVhc3VyZVR5cGVzKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVndWxhdGlvbnNEYXRhLmdldFJlZ3VsYXRpb25EZXRhaWxzKGNlbGV4KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVndWxhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdm0ucmVndWxhdGlvbiA9IHJlZ3VsYXRpb247XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2UudW5zdWJzY3JpYmUoJ2xhbmd1YWdlX2NoYW5nZWQnLCBsYW5ndWFnZUNoYW5nZWQpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnVuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgfVxyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICByZWd1bGF0aW9uOiAnPCcsXHJcbiAgICAgICAgaXNMaXN0SXRlbTogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogcmVndWxhdGlvbkNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3JlZ3VsYXRpb25zL2NvbXBvbmVudHMvcmVndWxhdGlvbi5odG1sJ1xyXG59O1xyXG5cclxucmVndWxhdGlvbkNvbnRyb2xsZXIuJGluamVjdCA9IFsncmVndWxhdGlvbnNEYXRhU2VydmljZScsICdtZWFzdXJlVHlwZXNEYXRhU2VydmljZScsICdjb3VudHJ5RGF0YVNlcnZpY2UnLCAnY291bnRyeU1vZGFscyddO1xyXG5cclxuZnVuY3Rpb24gcmVndWxhdGlvbkNvbnRyb2xsZXIocmVndWxhdGlvbnNEYXRhLCBtZWFzdXJlVHlwZXNEYXRhLCBjb3VudHJ5RGF0YSwgY291bnRyeU1vZGFscykge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBtZWFzdXJlT3ZlcnZpZXc6IFtdLFxyXG4gICAgICAgIG1lYXN1cmVUeXBlc0RpY3Rpb25hcnk6IHt9LFxyXG4gICAgICAgIGlzTG9hZGluZ01lYXN1cmVzOiB0cnVlLFxyXG4gICAgICAgIGluaXQ6IGluaXQsXHJcbiAgICAgICAgbG9hZE1lYXN1cmVPdmVydmlldzogbG9hZE1lYXN1cmVPdmVydmlldyxcclxuICAgICAgICBvcGVuUmVnaW9uTW9kYWw6IG9wZW5SZWdpb25Nb2RhbFxyXG4gICAgfTtcclxuICAgIGluaXQoKTtcclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBpbml0KCkge1xyXG4gICAgICAgIG1lYXN1cmVUeXBlc0RhdGEuZ2V0TWVhc3VyZVR5cGVzRGljdGlvbmFyeSgpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKG1lYXN1cmVUeXBlc0RpY3Rpb25hcnkpIHtcclxuICAgICAgICAgICAgICAgIHZtLm1lYXN1cmVUeXBlc0RpY3Rpb25hcnkgPSBtZWFzdXJlVHlwZXNEaWN0aW9uYXJ5O1xyXG4gICAgICAgICAgICAgICAgdm0uY291bnRyeU5hbWVzRGljdGlvbmFyeSA9IGNvdW50cnlEYXRhLmNvdW50cmllcztcclxuICAgICAgICAgICAgICAgIGxvYWRNZWFzdXJlT3ZlcnZpZXcodm0ucmVndWxhdGlvbi5jZWxleCwgMCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRNZWFzdXJlT3ZlcnZpZXcoY2VsZXgsIHBhZ2VOdW1iZXIpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmdNZWFzdXJlcyA9IHRydWU7XHJcbiAgICAgICAgcmVndWxhdGlvbnNEYXRhLmdldE1lYXN1cmVPdmVydmlldyhjZWxleCwgcGFnZU51bWJlcilcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24obWVhc3VyZU92ZXJ2aWV3KSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tZWFzdXJlT3ZlcnZpZXcgPSBtZWFzdXJlT3ZlcnZpZXc7XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmdNZWFzdXJlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvcGVuUmVnaW9uTW9kYWwocmVnaW9uSWQsICRldmVudCkge1xyXG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHZhciByZWdpb24gPSB7XHJcbiAgICAgICAgICAgIGNvZGU6IHJlZ2lvbklkLFxyXG4gICAgICAgICAgICB0eXBlOiAnMSdcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvdW50cnlNb2RhbHMucmVnaW9uLnNob3cocmVnaW9uKTtcclxuICAgIH1cclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgaXNMYXJnZTogJzwnLFxyXG4gICAgICAgIGdvb2RzY29kZTogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogcmVndWxhdGlvbnNCdXR0b25Db250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdyZWd1bGF0aW9ucy9jb21wb25lbnRzL3JlZ3VsYXRpb25zLWJ1dHRvbi5odG1sJ1xyXG59O1xyXG5cclxucmVndWxhdGlvbnNCdXR0b25Db250cm9sbGVyLiRpbmplY3QgPSBbJ3JlZ3VsYXRpb25zTW9kYWwnXTtcclxuXHJcbmZ1bmN0aW9uIHJlZ3VsYXRpb25zQnV0dG9uQ29udHJvbGxlcihyZWd1bGF0aW9uc01vZGFsKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIHNob3dSZWd1bGF0aW9uczogc2hvd1JlZ3VsYXRpb25zXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dSZWd1bGF0aW9ucygpIHtcclxuICAgICAgICByZWd1bGF0aW9uc01vZGFsLnNob3codm0uZ29vZHNjb2RlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogcmVndWxhdGlvbnNOZXdzQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAncmVndWxhdGlvbnMvY29tcG9uZW50cy9yZWd1bGF0aW9ucy1uZXdzLXBhZ2UuaHRtbCdcclxufTtcclxuXHJcbnJlZ3VsYXRpb25zTmV3c0NvbnRyb2xsZXIuJGluamVjdCA9IFsnJGFuYWx5dGljcyddO1xyXG5cclxuZnVuY3Rpb24gcmVndWxhdGlvbnNOZXdzQ29udHJvbGxlcigkYW5hbHl0aWNzKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWRcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9yZWd1bGF0aW9ucy1uZXdzJyk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgZ29vZHNjb2RlOiAnPCdcclxuICAgIH0sXHJcbiAgICBjb250cm9sbGVyOiByZWd1bGF0aW9uc05ld3NDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdyZWd1bGF0aW9ucy9jb21wb25lbnRzL3JlZ3VsYXRpb25zLW5ld3MuaHRtbCdcclxufTtcclxuXHJcbnJlZ3VsYXRpb25zTmV3c0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICdub3RpZmljYXRpb25zU2VydmljZScsIFxyXG4gICAgJ3JlZ3VsYXRpb25zRGF0YVNlcnZpY2UnLCBcclxuICAgICdtZWFzdXJlVHlwZXNEYXRhU2VydmljZScsXHJcbl07XHJcblxyXG5mdW5jdGlvbiByZWd1bGF0aW9uc05ld3NDb250cm9sbGVyKFxyXG4gICAgbm90aWZpY2F0aW9ucywgXHJcbiAgICByZWd1bGF0aW9uc0RhdGEsIFxyXG4gICAgbWVhc3VyZVR5cGVzRGF0YVxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICAgICAgaXNMb2FkaW5nUmVndWxhdGlvbnM6IHRydWUsXHJcbiAgICAgICAgaXNMb2FkaW5nR3JvdXBzOiBmYWxzZSxcclxuICAgICAgICBpc0xvYWRpbmdUeXBlczogZmFsc2UsXHJcbiAgICAgICAgZmlsdGVyOiB7XHJcbiAgICAgICAgICAgIGdvb2RzQ29kZTogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbWVhc3VyZVR5cGVzOiB7fSxcclxuICAgICAgICByZWd1bGF0aW9uczogW10sXHJcbiAgICAgICAgcmVndWxhdGlvblR5cGVzOiBbXSxcclxuICAgICAgICByZWd1bGF0aW9uVHlwZURlc2NyaXB0aW9uczoge30sXHJcbiAgICAgICAgcmVndWxhdGlvbkdyb3VwczogW10sXHJcbiAgICAgICAgcmVndWxhdGlvbkdyb3VwRGVzY3JpcHRpb25zOiB7fSxcclxuICAgICAgICBsb2FkTmV3czogbG9hZE5ld3NcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgdm0uZmlsdGVyLmdvb2RzQ29kZSA9IHZtLmdvb2RzY29kZTtcclxuICAgICAgICBsb2FkKCk7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBkYXRlQ2hhbmdlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy51bnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGRhdGVDaGFuZ2VkKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkYXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICBsb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZCgpIHtcclxuICAgICAgICByZXR1cm4gbG9hZE1lYXN1cmVUeXBlcygpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWROZXdzKDEpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkTWVhc3VyZVR5cGVzKCkge1xyXG4gICAgICAgIHJldHVybiBtZWFzdXJlVHlwZXNEYXRhXHJcbiAgICAgICAgICAgIC5nZXRNZWFzdXJlVHlwZXNEaWN0aW9uYXJ5KClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24obWVhc3VyZVR5cGVzKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tZWFzdXJlVHlwZXMgPSBtZWFzdXJlVHlwZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWROZXdzKHBhZ2VOdW1iZXIpIHtcclxuICAgICAgICBpZiAoIXBhZ2VOdW1iZXIpIHtcclxuICAgICAgICAgICAgcGFnZU51bWJlciA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZtLmlzTG9hZGluZ1JlZ3VsYXRpb25zID0gdHJ1ZTtcclxuICAgICAgICB2bS5yZWd1bGF0aW9ucyA9IFtdO1xyXG4gICAgICAgIHJldHVybiByZWd1bGF0aW9uc0RhdGEuZ2V0UmVndWxhdGlvbk5ld3MocGFnZU51bWJlciAtIDEsIHZtLmZpbHRlcilcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZtLnJlZ3VsYXRpb25zID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZ1JlZ3VsYXRpb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRHcm91cHMoKSB7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nR3JvdXBzID0gdHJ1ZTtcclxuICAgICAgICB2bS5yZWd1bGF0aW9uR3JvdXBzID0gW107XHJcblxyXG4gICAgICAgIHJldHVybiByZWd1bGF0aW9uc0RhdGEuZ2V0UmVndWxhdGlvbkdyb3VwcygpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5yZWd1bGF0aW9uR3JvdXBzID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLnJlZ3VsYXRpb25Hcm91cERlc2NyaXB0aW9ucyA9IF8uY2hhaW4oZGF0YSkua2V5QnkoJ2lkJykubWFwVmFsdWVzKCdkZXNjcmlwdGlvbicpLnZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmdHcm91cHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZFR5cGVzKCkge1xyXG4gICAgICAgIHZtLmlzTG9hZGluZ1R5cGVzID0gdHJ1ZTtcclxuICAgICAgICB2bS5yZWd1bGF0aW9uVHlwZXMgPSBbXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlZ3VsYXRpb25zRGF0YS5nZXRSZWd1bGF0aW9uVHlwZXMoKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdm0ucmVndWxhdGlvblR5cGVzID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLnJlZ3VsYXRpb25UeXBlRGVzY3JpcHRpb25zID0gXy5jaGFpbihkYXRhKS5rZXlCeSgnaWQnKS5tYXBWYWx1ZXMoJ2Rlc2NyaXB0aW9uJykudmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZ1R5cGVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSBbY2VsZXhUb1JlZ3VsYXRpb25OdW1iZXJGaWx0ZXJdO1xyXG5cclxuZnVuY3Rpb24gY2VsZXhUb1JlZ3VsYXRpb25OdW1iZXJGaWx0ZXIoKSB7XHJcblxyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAoY2VsZXgpIHtcclxuICAgICAgICBpZiAoY2VsZXggPT09IG51bGwgfHwgY2VsZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2VsZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB5ZWFyID0gY2VsZXguc3Vic3RyKDEsIDQpO1xyXG4gICAgICAgIGlmIChfLnN0YXJ0c1dpdGgoeWVhciwgJzE5JykpIHtcclxuICAgICAgICAgICAgeWVhciA9IHllYXIuc3Vic3RyKDIsIDIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbnVtYmVyID0gXy50cmltU3RhcnQoY2VsZXguc3Vic3RyKDYsIDQpLCAnMCcpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBudW1iZXIgKyAnLycgKyB5ZWFyO1xyXG4gICAgfTtcclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0gWyckYW5hbHl0aWNzJywgJyR1aWJNb2RhbCcsICdsYW5ndWFnZScsIHJlZ3VsYXRpb25Nb2RhbF07XHJcblxyXG5mdW5jdGlvbiByZWd1bGF0aW9uTW9kYWwoJGFuYWx5dGljcywgJHVpYk1vZGFsLCBsYW5ndWFnZSkge1xyXG4gICAgdmFyIG1vZGFsID0ge1xyXG4gICAgICAgIG1lYXN1cmVzOiBudWxsLFxyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICByZWd1bGF0aW9uTW9kYWxDb250cm9sbGVyLiRpbmplY3QgPSBbJyR1aWJNb2RhbEluc3RhbmNlJywgJ21lYXN1cmVzJywgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJ107XHJcblxyXG4gICAgZnVuY3Rpb24gcmVndWxhdGlvbk1vZGFsQ29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgbWVhc3VyZXMsIHN0YXRlKSB7XHJcbiAgICAgICAgdmFyIGN0cmxSZWd1bGF0aW9uTW9kYWwgPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICBtZWFzdXJlczogbWVhc3VyZXMsXHJcbiAgICAgICAgICAgIHJlZmVyZW5jZUNvdW50cnk6IHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xyXG4vLyAgICAgICAgICAgICQoXCIucGFnZS1kYXNoYm9hcmQsIC50YXJpYy1wYWdlLWNvbnRlbnRcIikucmVtb3ZlQ2xhc3MoXCJub3ByaW50XCIpO1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdjYW5jZWwnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdHJsUmVndWxhdGlvbk1vZGFsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChtZWFzdXJlcykge1xyXG4gICAgICAgICRhbmFseXRpY3MuZXZlbnRUcmFjaygnb3Blbi1tb2RhbC1yZWd1bGF0aW9uJywgeyBjYXRlZ29yeTogJ3JlZ3VsYXRpb24nIH0pO1xyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IHJlZ3VsYXRpb25Nb2RhbENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ2N0cmxSZWd1bGF0aW9uTW9kYWwnLFxyXG4gICAgICAgICAgICBrZXlib2FyZDogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kYWxGYWRlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICBtZWFzdXJlczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfLm1hcChtZWFzdXJlcywgZnVuY3Rpb24obWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZS5yZWd1bGF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlLnJlZ3VsYXRpb24ub2pfdXJsID0gbWVhc3VyZS5yZWd1bGF0aW9uLnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlLnJlZ3VsYXRpb24ucmVnX2pvdXJuYWxfbnVtYiAmJiBtZWFzdXJlLnJlZ3VsYXRpb24ucmVnX2pvdXJuYWxfbnVtYiAhPT0gJzEnICYmIG1lYXN1cmUucmVndWxhdGlvbi5yZWdfcHViZGF0ZSAmJiBtZWFzdXJlLnJlZ3VsYXRpb24ucmVnX2pvdXJuYWxfcGFnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmUucmVndWxhdGlvbi51cmwgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL2V1ci1sZXguZXVyb3BhLmV1L3NlYXJjaC5odG1sP3doT0o9Tk9fT0olM0QnICsgbWVhc3VyZS5yZWd1bGF0aW9uLnJlZ19qb3VybmFsX251bWIuc3Vic3RyaW5nKDIpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyxZRUFSX09KJTNEJyArIG1lYXN1cmUucmVndWxhdGlvbi5yZWdfcHViZGF0ZS5zdWJzdHJpbmcoMCwgNCkgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLFBBR0VfRklSU1QlM0QnICsgXy5wYWRTdGFydChtZWFzdXJlLnJlZ3VsYXRpb24ucmVnX2pvdXJuYWxfcGFnZSwgNCwgJzAnKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcmREJfQ09MTF9PSj1vai1sJnR5cGU9YWR2YW5jZWQmbGFuZz0nICsgbGFuZ3VhZ2UuZ2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNpemU6ICdsZycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAncmVndWxhdGlvbnMvbW9kYWxzL3JlZ3VsYXRpb24uaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtcmVndWxhdGlvbidcclxuICAgICAgICB9KS5yZXN1bHQuY2F0Y2goZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICBpZiAoIShyZXMgPT09ICdjYW5jZWwnIHx8IHJlcyA9PT0gJ2VzY2FwZSBrZXkgcHJlc3MnIHx8IHJlcyA9PT0gJ2JhY2tkcm9wIGNsaWNrJykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFsnJGFuYWx5dGljcycsICckdWliTW9kYWwnLCByZWd1bGF0aW9uc01vZGFsXTtcclxuXHJcbmZ1bmN0aW9uIHJlZ3VsYXRpb25zTW9kYWwoJGFuYWx5dGljcywgJHVpYk1vZGFsKSB7XHJcbiAgICB2YXIgbW9kYWwgPSB7XHJcbiAgICAgICAgZ29vZHNjb2RlOiBudWxsLFxyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICByZWd1bGF0aW9uc01vZGFsQ29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICdnb29kc2NvZGUnXTtcclxuXHJcbiAgICBmdW5jdGlvbiByZWd1bGF0aW9uc01vZGFsQ29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgZ29vZHNjb2RlKSB7XHJcbiAgICAgICAgdmFyIHZtID0ge1xyXG4gICAgICAgICAgICBjYW5jZWw6IGNhbmNlbCxcclxuICAgICAgICAgICAgZ29vZHNjb2RlOiBnb29kc2NvZGVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbi8vICAgICAgICAgICAgJChcIi5wYWdlLWRhc2hib2FyZCwgLnRhcmljLXBhZ2UtY29udGVudFwiKS5yZW1vdmVDbGFzcyhcIm5vcHJpbnRcIik7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChnb29kc2NvZGUpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJ29wZW4tbW9kYWwtcmVndWxhdGlvbnMnLCB7IGNhdGVnb3J5OiAncmVndWxhdGlvbnMnIH0pO1xyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IHJlZ3VsYXRpb25zTW9kYWxDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsJyxcclxuICAgICAgICAgICAga2V5Ym9hcmQ6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGFsRmFkZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgZ29vZHNjb2RlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ29vZHNjb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaXplOiAnbGcnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3JlZ3VsYXRpb25zL21vZGFscy9yZWd1bGF0aW9ucy5odG1sJyxcclxuICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdtb2RhbC13aWRlJ1xyXG4gICAgICAgIH0pLnJlc3VsdC5jYXRjaChmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgIGlmICghKHJlcyA9PT0gJ2NhbmNlbCcgfHwgcmVzID09PSAnZXNjYXBlIGtleSBwcmVzcycgfHwgcmVzID09PSAnYmFja2Ryb3AgY2xpY2snKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1vZGFsO1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gWydjb21tb24nLCAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCAnZGF0YUNvbnRleHQnLCAnbWVhc3VyZVR5cGVzRGF0YVNlcnZpY2UnLCByZWd1bGF0aW9uc0RhdGFTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIHJlZ3VsYXRpb25zRGF0YVNlcnZpY2UoY29tbW9uLCBzdGF0ZSwgZGF0YUNvbnRleHQsIG1lYXN1cmVUeXBlc0RhdGEpIHtcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGdldE1lYXN1cmVPdmVydmlldzogZ2V0TWVhc3VyZU92ZXJ2aWV3LFxyXG4gICAgICAgIGdldFJlZ3VsYXRpb246IGdldFJlZ3VsYXRpb24sXHJcbiAgICAgICAgZ2V0UmVndWxhdGlvbkRldGFpbHM6IGdldFJlZ3VsYXRpb25EZXRhaWxzLFxyXG4gICAgICAgIGdldFJlZ3VsYXRpb25OZXdzOiBnZXRSZWd1bGF0aW9uTmV3cyxcclxuICAgICAgICBnZXRSZWd1bGF0aW9uVHlwZXM6IGdldFJlZ3VsYXRpb25UeXBlcyxcclxuICAgICAgICBnZXRSZWd1bGF0aW9uR3JvdXBzOiBnZXRSZWd1bGF0aW9uR3JvdXBzXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGdldFJlZ3VsYXRpb24oZHR2UmVndWxhdGlvbklkKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArXHJcbiAgICAgICAgICAgICcvcmVndWxhdGlvbnMvYnlEdHZSZWd1bGF0aW9uSWQvJyArIGR0dlJlZ3VsYXRpb25JZCArXHJcbiAgICAgICAgICAgICc/bGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldE1lYXN1cmVPdmVydmlldyhjZWxleCwgcGFnZUluZGV4KSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArXHJcbiAgICAgICAgICAgICcvcmVndWxhdGlvbnMvJyArIGNlbGV4ICsgJy9tZWFzdXJlX292ZXJ2aWV3JyArXHJcbiAgICAgICAgICAgICc/bGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZSArXHJcbiAgICAgICAgICAgICcmcGluZGV4PScgKyBwYWdlSW5kZXggK1xyXG4gICAgICAgICAgICAnJnBzaXplPTEwJztcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRSZWd1bGF0aW9uRGV0YWlscyhjZWxleCkge1xyXG5cclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0c1tjb21tb24uY29uZmlnLmN1cnJlbnRBcGldICtcclxuICAgICAgICAgICAgJy9yZWd1bGF0aW9ucy9kZXRhaWxzQnlDZWxleC8nICsgY2VsZXggK1xyXG4gICAgICAgICAgICAnP2xhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRSZWd1bGF0aW9uTmV3cyhwYWdlTnVtYmVyLCBmaWx0ZXIpIHtcclxuXHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArXHJcbiAgICAgICAgICAgICcvcmVndWxhdGlvbnMvbmV3cycgK1xyXG4gICAgICAgICAgICAnP2xhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGUgK1xyXG4gICAgICAgICAgICAnJnBpbmRleD0nICsgcGFnZU51bWJlciArXHJcbiAgICAgICAgICAgICcmcHNpemU9MTAnO1xyXG5cclxuICAgICAgICBpZiAoZmlsdGVyICYmIGZpbHRlci5nb29kc0NvZGUpIHtcclxuICAgICAgICAgICAgdXJsICs9ICcmZ29vZHNjb2RlPScgKyBmaWx0ZXIuZ29vZHNDb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFJlZ3VsYXRpb25UeXBlcygpIHtcclxuXHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArXHJcbiAgICAgICAgICAgICcvcmVndWxhdGlvbnMvdHlwZXMnICtcclxuICAgICAgICAgICAgJz9sYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0UmVndWxhdGlvbkdyb3VwcygpIHtcclxuXHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArXHJcbiAgICAgICAgICAgICcvcmVndWxhdGlvbnMvZ3JvdXBzJyArXHJcbiAgICAgICAgICAgICc/bGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxufVxyXG4iLCLvu79hbmd1bGFyLm1vZHVsZSgndGFyaWMuc2VhcmNoJywgW10pXHJcbiAgICAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCByb3V0ZUNvbmZpZ3VyYXRvcl0pXHJcbiAgICAvLyBDb21wb25lbnRzXHJcbiAgICAuY29tcG9uZW50KCdmb3VuZFRleHRzJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2ZvdW5kLXRleHRzJykpXHJcbiAgICAuY29tcG9uZW50KCdoZWFkaW5nU2VhcmNoUmVzdWx0cycsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9oZWFkaW5nLXNlYXJjaC1yZXN1bHRzJykpXHJcbiAgICAuY29tcG9uZW50KCdoZWFkZXJTZWFyY2hCb3gnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvaGVhZGVyLXNlYXJjaC1ib3gnKSlcclxuICAgIC5jb21wb25lbnQoJ2xhcmdlU2VhcmNoQm94JywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2xhcmdlLXNlYXJjaC1ib3gnKSlcclxuICAgIC5jb21wb25lbnQoJ25vbWVuY2xhdHVyZVNlYXJjaEZvcm0nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbm9tZW5jbGF0dXJlLXNlYXJjaC1mb3JtJykpXHJcbiAgICAuY29tcG9uZW50KCdzZWFyY2hGb3JtJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3NlYXJjaC1mb3JtJykpXHJcbiAgICAuY29tcG9uZW50KCdzZWFyY2hTdWJOYXYnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvc2VhcmNoLXN1Yi1uYXYnKSlcclxuICAgIC8vIENvbnRyb2xsZXJzXHJcbiAgICAuY29udHJvbGxlcignc2VhcmNoQm94Q29udHJvbGxlcicsIHJlcXVpcmUoJy4vY29udHJvbGxlcnMvc2VhcmNoLWJveCcpKVxyXG4gICAgLy8gUGFnZXNcclxuICAgIC5jb21wb25lbnQoJ3NlYXJjaEFscGhhYmV0aWNhbEluZGV4UGFnZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9wYWdlcy9zZWFyY2gtYWxwaGFiZXRpY2FsLWluZGV4JykpXHJcbiAgICAuY29tcG9uZW50KCdzZWFyY2hDY2NDb25jbHVzaW9uc1BhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLWNjYy1jb25jbHVzaW9ucycpKVxyXG4gICAgLmNvbXBvbmVudCgnc2VhcmNoQW5ub3RhdGlvbnNQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3BhZ2VzL3NlYXJjaC1hbm5vdGF0aW9ucycpKVxyXG4gICAgLmNvbXBvbmVudCgnc2VhcmNoSGVhZGluZ1BhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLWhlYWRpbmcnKSlcclxuICAgIC5jb21wb25lbnQoJ3NlYXJjaEV1RXhwbGFuYXRvcnlOb3Rlc1BhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLWV1LWV4cGxhbmF0b3J5LW5vdGVzJykpXHJcbiAgICAuY29tcG9uZW50KCdzZWFyY2hFeHBsYW5hdG9yeU5vdGVzR2VybWFueVBhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLWV4cGxhbmF0b3J5LW5vdGVzLWdlcm1hbnknKSlcclxuICAgIC5jb21wb25lbnQoJ3NlYXJjaFRleHRzR2VybWFueVBhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLXRleHRzLWdlcm1hbnknKSlcclxuICAgIC5jb21wb25lbnQoJ3NlYXJjaFdjb0NsYXNzaWZpY2F0aW9uT3BpbmlvbnNQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3BhZ2VzL3NlYXJjaC13Y28tY2xhc3NpZmljYXRpb24tb3BpbmlvbnMnKSlcclxuICAgIC5jb21wb25lbnQoJ3NlYXJjaFdjb0V4cGxhbmF0b3J5Tm90ZXNQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3BhZ2VzL3NlYXJjaC13Y28tZXhwbGFuYXRvcnktbm90ZXMnKSlcclxuICAgIC5jb21wb25lbnQoJ3NlYXJjaFBhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoJykpXHJcbiAgICAvLyBTZXJ2aWNlc1xyXG4gICAgLmZhY3RvcnkoJ3NlYXJjaFNlcnZpY2UnLCByZXF1aXJlKCcuL3NlcnZpY2VzL3NlYXJjaCcpKVxyXG4gICAgO1xyXG5cclxuXHJcbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJhdG9yKCRyb3V0ZVByb3ZpZGVyKSB7XHJcbiAgICAkcm91dGVQcm92aWRlclxyXG4gICAgICAgIC53aGVuKCcvc2VhcmNoL2hlYWRpbmcnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHNlYXJjaC1oZWFkaW5nLXBhZ2U+PC9zZWFyY2gtaGVhZGluZy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvc2VhcmNoL3RyZWUnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHNlYXJjaC1wYWdlPjwvc2VhcmNoLXBhZ2U+J1xyXG4gICAgICAgIH0pICAgIFxyXG4gICAgICAgIC53aGVuKCcvc2VhcmNoL2Fubm90YXRpb25zJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxzZWFyY2gtYW5ub3RhdGlvbnMtcGFnZT48L3NlYXJjaC1hbm5vdGF0aW9ucy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvc2VhcmNoL2V4cGxhbmF0b3J5LW5vdGVzL2V1Jywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxzZWFyY2gtZXUtZXhwbGFuYXRvcnktbm90ZXMtcGFnZT48L3NlYXJjaC1ldS1leHBsYW5hdG9yeS1ub3Rlcy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvc2VhcmNoL2V4cGxhbmF0b3J5LW5vdGVzL2dlcm1hbnknLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHNlYXJjaC1leHBsYW5hdG9yeS1ub3Rlcy1nZXJtYW55LXBhZ2U+PC9zZWFyY2gtZXhwbGFuYXRvcnktbm90ZXMtZ2VybWFueS1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvc2VhcmNoL3RleHRzL2dlcm1hbnknLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHNlYXJjaC10ZXh0cy1nZXJtYW55LXBhZ2U+PC9zZWFyY2gtdGV4dHMtZ2VybWFueS1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvc2VhcmNoL2V4cGxhbmF0b3J5LW5vdGVzL3djbycsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8c2VhcmNoLXdjby1leHBsYW5hdG9yeS1ub3Rlcy1wYWdlPjwvc2VhcmNoLXdjby1leHBsYW5hdG9yeS1ub3Rlcy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvc2VhcmNoL2NsYXNzaWZpY2F0aW9ucy93Y28nLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHNlYXJjaC13Y28tY2xhc3NpZmljYXRpb24tb3BpbmlvbnMtcGFnZT48L3NlYXJjaC13Y28tY2xhc3NpZmljYXRpb24tb3BpbmlvbnMtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2hlbignL3NlYXJjaC9hbHBoYWJldGljYWwtaW5kZXgnLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHNlYXJjaC1hbHBoYWJldGljYWwtaW5kZXgtcGFnZT48L3NlYXJjaC1hbHBoYWJldGljYWwtaW5kZXgtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2hlbignL3NlYXJjaC9hdHItaW5kZXgucGFnZScsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8c2VhcmNoLWF0ci1pbmRleC1wYWdlPjwvc2VhcmNoLWF0ci1pbmRleC1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvc2VhcmNoL2NjYy1jb25jbHVzaW9ucycsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8c2VhcmNoLWNjYy1jb25jbHVzaW9ucy1wYWdlPjwvc2VhcmNoLWNjYy1jb25jbHVzaW9ucy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvc2VhcmNoLzpzZWFyY2hxdWVyeScsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8c2VhcmNoLXBhZ2U+PC9zZWFyY2gtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgIDtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgY29tbW9kaXR5Q29kZTogJzwnLFxyXG4gICAgICAgIGZvdW5kVGV4dHM6ICc8JyxcclxuICAgICAgICBzZWFyY2hRdWVyeTogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogZm91bmRUZXh0c0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3NlYXJjaC9jb21wb25lbnRzL2ZvdW5kLXRleHRzLmh0bWwnXHJcbn07XHJcblxyXG5mb3VuZFRleHRzQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJ2J0aU1vZGFsJywgXHJcbiAgICAnY2FzZUxhd01vZGFsJywgXHJcbiAgICAnY2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc01vZGFsJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gZm91bmRUZXh0c0NvbnRyb2xsZXIoXHJcbiAgICBidGlNb2RhbCwgXHJcbiAgICBjYXNlTGF3TW9kYWwsIFxyXG4gICAgY2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc01vZGFsXHJcbikge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIHNob3dCdGk6IHNob3dCdGksXHJcbiAgICAgICAgc2hvd0Nhc2VMYXc6IHNob3dDYXNlTGF3LFxyXG4gICAgICAgIHNob3dDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zOiBzaG93Q2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucyxcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0J0aShjb2RlLCAkZXZlbnQpIHtcclxuICAgICAgICBidGlNb2RhbC5zaG93KGNvZGUsIHZtLnNlYXJjaFF1ZXJ5KTtcclxuXHJcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zKGNvZGUsICRldmVudCkge1xyXG4gICAgICAgIGNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNNb2RhbC5zaG93KGNvZGUsIHZtLnNlYXJjaFF1ZXJ5KTtcclxuXHJcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dDYXNlTGF3KGNvZGUsICRldmVudCkge1xyXG4gICAgICAgIGNhc2VMYXdNb2RhbC5zaG93KGNvZGUsIHZtLnNlYXJjaFF1ZXJ5KTtcclxuXHJcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiAnc2VhcmNoQm94Q29udHJvbGxlcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3NlYXJjaC9jb21wb25lbnRzL2hlYWRlci1zZWFyY2gtYm94Lmh0bWwnXHJcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIHF1ZXJ5OiAnPCcsXHJcbiAgICAgICAgaGVhZGluZ1Jlc3VsdDogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogaGVhZGluZ1NlYXJjaFJlc3VsdHNDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdzZWFyY2gvY29tcG9uZW50cy9oZWFkaW5nLXNlYXJjaC1yZXN1bHRzLmh0bWwnXHJcbn07XHJcblxyXG5oZWFkaW5nU2VhcmNoUmVzdWx0c0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckbG9jYXRpb24nLCBcclxuICAgICdidGlNb2RhbCcsIFxyXG4gICAgJ2Nhc2VMYXdNb2RhbCcsIFxyXG4gICAgJ2NsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNNb2RhbCcsXHJcbiAgICAnZm9ybWF0dGluZycsICBcclxuICAgICdzZWFyY2hTZXJ2aWNlJywgXHJcbl07XHJcblxyXG5mdW5jdGlvbiBoZWFkaW5nU2VhcmNoUmVzdWx0c0NvbnRyb2xsZXIoXHJcbiAgICAkbG9jYXRpb24sIFxyXG4gICAgYnRpTW9kYWwsIFxyXG4gICAgY2FzZUxhd01vZGFsLCBcclxuICAgIGNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNNb2RhbCwgXHJcbiAgICBmb3JtYXR0aW5nLCBcclxuICAgIHNlYXJjaFNlcnZpY2VcclxuKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgc2VhcmNoQ29kZTogc2VhcmNoQ29kZSxcclxuICAgICAgICBzaG93QnRpOiBzaG93QnRpLFxyXG4gICAgICAgIHNob3dDYXNlTGF3OiBzaG93Q2FzZUxhdyxcclxuICAgICAgICBzaG93Q2xhc3NpZmljYXRpb25SZWd1bGF0aW9uczogc2hvd0NsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnMsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBzZWFyY2hDb2RlKGNvZGUpIHtcclxuICAgICAgICB2YXIgcSA9IHNlYXJjaFNlcnZpY2UuY3JlYXRlUXVlcnlGcm9tTGFzdFF1ZXJ5KHZtLnF1ZXJ5KTtcclxuICAgICAgICBxLmNvbW1vZGl0eUNvZGUgPSBmb3JtYXR0aW5nLnJlbW92ZVRyYWlsaW5nWmVyb3MoY29kZSk7XHJcbiAgICAgICAgdmFyIHF1ZXJ5U3RyaW5nID0gc2VhcmNoU2VydmljZS5zZXJpYWxpemVRdWVyeShxKTtcclxuICAgICAgICAkbG9jYXRpb24ucGF0aCgnL3NlYXJjaC90cmVlJykuc2VhcmNoKHF1ZXJ5U3RyaW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93QnRpKGNvZGUsICRldmVudCkge1xyXG4gICAgICAgIGJ0aU1vZGFsLnNob3coY29kZSwgdm0ucXVlcnkuUXVlcnlTdHJpbmcpO1xyXG5cclxuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0NsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnMoY29kZSwgJGV2ZW50KSB7XHJcbiAgICAgICAgY2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc01vZGFsLnNob3coY29kZSwgdm0ucXVlcnkuUXVlcnlTdHJpbmcpO1xyXG5cclxuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0Nhc2VMYXcoY29kZSwgJGV2ZW50KSB7XHJcbiAgICAgICAgY2FzZUxhd01vZGFsLnNob3coY29kZSwgdm0ucXVlcnkuUXVlcnlTdHJpbmcpO1xyXG5cclxuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6ICdzZWFyY2hCb3hDb250cm9sbGVyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnc2VhcmNoL2NvbXBvbmVudHMvbGFyZ2Utc2VhcmNoLWJveC5odG1sJ1xyXG59O1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgcXVlcnk6ICc8JywgXHJcbiAgICAgICAgc2VhcmNoSGFuZGxlcjogJyYnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogbm9tZW5jbGF0dXJlU2VhcmNoRm9ybUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3NlYXJjaC9jb21wb25lbnRzL25vbWVuY2xhdHVyZS1zZWFyY2gtZm9ybS5odG1sJ1xyXG59O1xyXG5cclxubm9tZW5jbGF0dXJlU2VhcmNoRm9ybUNvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckbG9jYXRpb24nLCBcclxuICAgICdub3RpZmljYXRpb25zU2VydmljZScsXHJcbl07XHJcblxyXG5mdW5jdGlvbiBub21lbmNsYXR1cmVTZWFyY2hGb3JtQ29udHJvbGxlcihcclxuICAgICRsb2NhdGlvbiwgXHJcbiAgICBub3RpZmljYXRpb25zU2VydmljZVxyXG4pIHtcclxuICAgIFxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIHF1ZXJ5OiB7fSxcclxuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0OiB7fSxcclxuICAgICAgICBzZWFyY2g6IHNlYXJjaFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS5zdWJzY3JpYmUoJ2ZpbHRlcl9tb3ZlbWVudF9jaGFuZ2VkJywgbW92ZW1lbnRDaGFuZ2VkKTtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBkYXRlQ2hhbmdlZCk7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2Uuc3Vic2NyaWJlKCdsYW5ndWFnZV9jaGFuZ2VkJywgbGFuZ3VhZ2VDaGFuZ2VkKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2UudW5zdWJzY3JpYmUoJ2ZpbHRlcl9tb3ZlbWVudF9jaGFuZ2VkJywgbW92ZW1lbnRDaGFuZ2VkKTtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS51bnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGRhdGVDaGFuZ2VkKTtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS51bnN1YnNjcmliZSgnbGFuZ3VhZ2VfY2hhbmdlZCcsIGxhbmd1YWdlQ2hhbmdlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbGFuZ3VhZ2VDaGFuZ2VkKCkge1xyXG4gICAgICAgICRsb2NhdGlvbi5zZWFyY2goJ3F1ZXJ5JywgbnVsbCkucmVwbGFjZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1vdmVtZW50Q2hhbmdlZCgpIHtcclxuICAgICAgICB2bS5zZWFyY2godm0ucXVlcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRhdGVDaGFuZ2VkKCkge1xyXG4gICAgICAgIHZtLnNlYXJjaCh2bS5xdWVyeSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGb3JtKHF1ZXJ5KSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgaXNWYWxpZDogdHJ1ZSxcclxuICAgICAgICAgICAgZXJyb3JzOiB7fVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCFxdWVyeS5xdWVyeSkge1xyXG4gICAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXN1bHQucXVlcnkgPSAnUXVlcnlJc1JlcXVpcmVkJztcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHF1ZXJ5LmNvbW1vZGl0eUNvZGUpIHtcclxuICAgICAgICAgICAgcXVlcnkuY29tbW9kaXR5Q29kZSA9IHF1ZXJ5LmNvbW1vZGl0eUNvZGUucmVwbGFjZUFsbCgvWy5cXHNdL2csICcnKTtcclxuICAgICAgICAgICAgaWYgKCEvXlswLTldezIsMTB9JC8udGVzdChxdWVyeS5jb21tb2RpdHlDb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tb2RpdHlDb2RlID0gJ0NvbW1vZGl0eUNvZGVJc0ludmFsaWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChxdWVyeS5xdWVyeSkge1xyXG4gICAgICAgICAgICBpZiAocXVlcnkucXVlcnkubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5xdWVyeSA9ICdRdWVyeUlzVG9vU2hvcnQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2VhcmNoKHF1ZXJ5KSB7XHJcbiAgICAgICAgdm0udmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlRm9ybShxdWVyeSk7XHJcbiAgICAgICAgaWYgKHZtLnZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICAgICAgICBpZiAodm0uc2VhcmNoSGFuZGxlcikge1xyXG4gICAgICAgICAgICAgICAgdm0uc2VhcmNoSGFuZGxlcih7IHF1ZXJ5OiBxdWVyeSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IHNlYXJjaEFscGhhYmV0aWNhbEluZGV4Q29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnc2VhcmNoL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLWFscGhhYmV0aWNhbC1pbmRleC5odG1sJ1xyXG59O1xyXG5cclxuc2VhcmNoQWxwaGFiZXRpY2FsSW5kZXhDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyRsb2NhdGlvbicsIFxyXG4gICAgJ2RhdGFDb250ZXh0JywgXHJcbiAgICAnbGFuZ3VhZ2UnLCBcclxuICAgICdjb25maWcnLCBcclxuICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZSdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHNlYXJjaEFscGhhYmV0aWNhbEluZGV4Q29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgJGxvY2F0aW9uLCBcclxuICAgIGRhdGFDb250ZXh0LCBcclxuICAgIGxhbmd1YWdlLCBcclxuICAgIGNvbmZpZywgXHJcbiAgICBzdGF0ZVxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UuZ2V0KCksXHJcbiAgICAgICAgcXVlcnk6IHtcclxuICAgICAgICAgICAgUXVlcnlTdHJpbmc6ICcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXN1bHRzOiBbXSxcclxuICAgICAgICBzZWFyY2g6IHNlYXJjaCxcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuICAgIFxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9hbHBoYWJldGljYWwtaW5kZXgtc2VhcmNoJyk7XHJcbiAgICAgICAgbG9hZFNlYXJjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlYXJjaChxdWVyeSkge1xyXG4gICAgICAgICRsb2NhdGlvbi5wYXRoKCcvc2VhcmNoL2FscGhhYmV0aWNhbC1pbmRleCcpLnNlYXJjaChxdWVyeSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRTZWFyY2goKSB7XHJcbiAgICAgICAgdm0ucXVlcnkuUXVlcnlTdHJpbmcgPSAkbG9jYXRpb24uc2VhcmNoKCkucXVlcnk7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9hbHBoYWJldGljYWwtaW5kZXgvc2VhcmNoJyArXHJcbiAgICAgICAgICAgICc/bGFuZz0nICsgdm0ubGFuZ3VhZ2UgK1xyXG4gICAgICAgICAgICAnJnE9JyArIHZtLnF1ZXJ5LlF1ZXJ5U3RyaW5nICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuICAgICAgICBpZiAodm0ucXVlcnkuUXVlcnlTdHJpbmcgJiYgdm0ucXVlcnkuUXVlcnlTdHJpbmcubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICB2bS5sYW5ndWFnZSA9IGxhbmd1YWdlLmdldCgpO1xyXG4gICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodm0ubGFuZ3VhZ2UgPT09ICdlbicgfHwgdm0ubGFuZ3VhZ2UgPT09ICdkZScpIHtcclxuICAgICAgICAgICAgICAgIGRhdGFDb250ZXh0LmdldCh1cmwpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnJlc3VsdHMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBzZWFyY2hBbm5vdGF0aW9uc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3NlYXJjaC9jb21wb25lbnRzL3BhZ2VzL3NlYXJjaC1hbm5vdGF0aW9ucy5odG1sJ1xyXG59O1xyXG5cclxuc2VhcmNoQW5ub3RhdGlvbnNDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyRsb2NhdGlvbicsXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLCBcclxuICAgICdhbm5vdGF0aW9uc0RhdGFTZXJ2aWNlJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gc2VhcmNoQW5ub3RhdGlvbnNDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkbG9jYXRpb24sXHJcbiAgICBub3RpZmljYXRpb25zU2VydmljZSwgXHJcbiAgICBhbm5vdGF0aW9uc0RhdGFTZXJ2aWNlXHJcbikge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIHF1ZXJ5OiB7XHJcbiAgICAgICAgICAgIFF1ZXJ5U3RyaW5nOiAnJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzdWx0czogbnVsbCxcclxuICAgICAgICBzY3JvbGxUb0RvY3VtZW50OiBzY3JvbGxUb0RvY3VtZW50LFxyXG4gICAgICAgIHNlYXJjaDogc2VhcmNoXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIHZtLnF1ZXJ5LlF1ZXJ5U3RyaW5nID0gJGxvY2F0aW9uLnNlYXJjaCgpLnF1ZXJ5O1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvc2VjdGlvbi1hbmQtY2hhcHRlci1ub3Rlcy1zZWFyY2gnKTtcclxuICAgICAgICBsb2FkU2VhcmNoKCk7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2Uuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgbG9hZFNlYXJjaCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2UudW5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBsb2FkU2VhcmNoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzY3JvbGxUb0RvY3VtZW50KHJlc3VsdCkge1xyXG4gICAgICAgIGRvY3VtZW50XHJcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuRVUtTm90ZS0nICsgcmVzdWx0Lk5vbWVuY2xhdHVyZUxldmVsICsgJy0nICsgcmVzdWx0Lkdvb2RzQ29kZU9yU2VjdGlvbk51bWJlcilcclxuICAgICAgICAgICAgLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gc2VhcmNoKHF1ZXJ5KSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9zZWFyY2gvYW5ub3RhdGlvbnMnKS5zZWFyY2gocXVlcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRTZWFyY2goKSB7XHJcbiAgICAgICAgaWYgKHZtLnF1ZXJ5LlF1ZXJ5U3RyaW5nICYmIHZtLnF1ZXJ5LlF1ZXJ5U3RyaW5nLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgYW5ub3RhdGlvbnNEYXRhU2VydmljZS5zZWFyY2hOb3Rlcyh2bS5xdWVyeS5RdWVyeVN0cmluZylcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5yZXN1bHRzID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogc2VhcmNoQ29uY2x1c2lvbkluZGV4Q29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnc2VhcmNoL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLWNjYy1jb25jbHVzaW9ucy5odG1sJ1xyXG59O1xyXG5cclxuc2VhcmNoQ29uY2x1c2lvbkluZGV4Q29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckbG9jYXRpb24nLFxyXG4gICAgJ3NlYXJjaFNlcnZpY2UnLFxyXG4gICAgJ3RleHREYXRhU2VydmljZScsICBcclxuICAgICdjb21tb24nLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gc2VhcmNoQ29uY2x1c2lvbkluZGV4Q29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgJGxvY2F0aW9uLFxyXG4gICAgc2VhcmNoU2VydmljZSxcclxuICAgIHRleHREYXRhU2VydmljZSxcclxuICAgIGNvbW1vblxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICByZXN1bHRzOiBudWxsLFxyXG4gICAgICAgIGNvbW1vZGl0eUNvZGU6ICcnLFxyXG4gICAgICAgIHF1ZXJ5OicnLFxyXG4gICAgICAgIHNlYXJjaDogc2VhcmNoLFxyXG4gICAgICAgIGNsZWFyQ29tbW9kaXR5Q29kZTogY2xlYXJDb21tb2RpdHlDb2RlLFxyXG4gICAgICAgIGNsZWFyUXVlcnk6IGNsZWFyUXVlcnksXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICB2YXIgcSA9IHNlYXJjaFNlcnZpY2UucGFyc2VMb2NhdGlvblNlYXJjaE9iamVjdCgkbG9jYXRpb24uc2VhcmNoKCkpO1xyXG4gICAgICAgIHZtLmNvbW1vZGl0eUNvZGUgPSBxLmNvbW1vZGl0eUNvZGUgfHwgJyc7XHJcbiAgICAgICAgdm0ucXVlcnkgPSBxLnF1ZXJ5IHx8ICcnO1xyXG4gICAgICAgIHNlYXJjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlYXJjaCgpIHtcclxuICAgICAgICBpZih2bS5jb21tb2RpdHlDb2RlLmxlbmd0aCA+IDAgfHwgdm0ucXVlcnkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCdxdWVyeScsIHZtLnF1ZXJ5KTtcclxuICAgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgnY29tbW9kaXR5Q29kZScsIHZtLmNvbW1vZGl0eUNvZGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGV4dERhdGFTZXJ2aWNlLmdldENjY0NvbmNsdXNpb25zKHZtLmNvbW1vZGl0eUNvZGUsIHZtLnF1ZXJ5KVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5yZXN1bHRzID0gcmVzdWx0cztcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJRdWVyeSgpIHtcclxuICAgICAgICB2bS5xdWVyeSA9ICcnO1xyXG4gICAgICAgIHZtLnJlc3VsdHMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyQ29tbW9kaXR5Q29kZSgpIHtcclxuICAgICAgICB2bS5jb21tb2RpdHlDb2RlID0gJyc7XHJcbiAgICAgICAgdm0ucmVzdWx0cyA9IG51bGw7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IHNlYXJjaEV1RXhwbGFuYXRvcnlOb3Rlc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3NlYXJjaC9jb21wb25lbnRzL3BhZ2VzL3NlYXJjaC1ldS1leHBsYW5hdG9yeS1ub3Rlcy5odG1sJ1xyXG59O1xyXG5cclxuc2VhcmNoRXVFeHBsYW5hdG9yeU5vdGVzQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckbG9jYXRpb24nLCBcclxuICAgICdub3RpZmljYXRpb25zU2VydmljZScsIFxyXG4gICAgJ2RhdGFDb250ZXh0JywgXHJcbiAgICAnbGFuZ3VhZ2UnLCBcclxuICAgICdjb25maWcnLCBcclxuICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsXHJcbl07XHJcblxyXG5mdW5jdGlvbiBzZWFyY2hFdUV4cGxhbmF0b3J5Tm90ZXNDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkbG9jYXRpb24sIFxyXG4gICAgbm90aWZpY2F0aW9uc1NlcnZpY2UsIFxyXG4gICAgZGF0YUNvbnRleHQsIFxyXG4gICAgbGFuZ3VhZ2UsIFxyXG4gICAgY29uZmlnLCBcclxuICAgIHN0YXRlXHJcbikge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIHF1ZXJ5OiB7XHJcbiAgICAgICAgICAgIFF1ZXJ5U3RyaW5nOiAnJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzdWx0czogW10sXHJcbiAgICAgICAgc2Nyb2xsVG9Eb2N1bWVudDogc2Nyb2xsVG9Eb2N1bWVudCxcclxuICAgICAgICBzZWFyY2g6IHNlYXJjaFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgdm0ucXVlcnkuUXVlcnlTdHJpbmcgPSAkbG9jYXRpb24uc2VhcmNoKCkucXVlcnk7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9ldS1leHBsYW5hdG9yeS1ub3Rlcy1zZWFyY2gnKTtcclxuICAgICAgICBsb2FkU2VhcmNoKCk7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2Uuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgbG9hZFNlYXJjaCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2UudW5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBsb2FkU2VhcmNoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWFyY2gocXVlcnkpIHtcclxuICAgICAgICAkbG9jYXRpb24ucGF0aCgnL3NlYXJjaC9leHBsYW5hdG9yeS1ub3Rlcy9ldScpLnNlYXJjaChxdWVyeSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2Nyb2xsVG9Eb2N1bWVudChleHBsYW5hdG9yeU5vdGUpIHtcclxuICAgICAgICB2YXIgc2VsZWN0b3IgPSAnLmV4cGxhbmF0b3J5LW5vdGUtRVUtJyArIGV4cGxhbmF0b3J5Tm90ZS5Ob21lbmNsYXR1cmVMZXZlbCArICctJyArIGV4cGxhbmF0b3J5Tm90ZS5Hb29kc0NvZGVPclNlY3Rpb25OdW1iZXI7XHJcbiAgICAgICAgZG9jdW1lbnRcclxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXHJcbiAgICAgICAgICAgIC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRTZWFyY2goKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9leHBsYW5hdG9yeS1ub3Rlcy9ldS9zZWFyY2gnICtcclxuICAgICAgICAgICAgJz9sYW5nPScgKyBsYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICcmcT0nICsgdm0ucXVlcnkuUXVlcnlTdHJpbmcgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG4gICAgICAgIGlmICh2bS5xdWVyeS5RdWVyeVN0cmluZyAmJiB2bS5xdWVyeS5RdWVyeVN0cmluZy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIGRhdGFDb250ZXh0LmdldCh1cmwpXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnJlc3VsdHMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBzZWFyY2hFeHBsYW5hdG9yeU5vdGVzR2VybWFueUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3NlYXJjaC9jb21wb25lbnRzL3BhZ2VzL3NlYXJjaC1leHBsYW5hdG9yeS1ub3Rlcy1nZXJtYW55Lmh0bWwnXHJcbn07XHJcblxyXG5zZWFyY2hFeHBsYW5hdG9yeU5vdGVzR2VybWFueUNvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnJGxvY2F0aW9uJywgXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLCBcclxuICAgICdkYXRhQ29udGV4dCcsIFxyXG4gICAgJ2xhbmd1YWdlJywgXHJcbiAgICAnY29uZmlnJywgXHJcbiAgICAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gc2VhcmNoRXhwbGFuYXRvcnlOb3Rlc0dlcm1hbnlDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcyxcclxuICAgICRsb2NhdGlvbiwgXHJcbiAgICBub3RpZmljYXRpb25zU2VydmljZSwgXHJcbiAgICBkYXRhQ29udGV4dCwgXHJcbiAgICBsYW5ndWFnZSwgXHJcbiAgICBjb25maWcsIFxyXG4gICAgc3RhdGVcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgcXVlcnk6IHtcclxuICAgICAgICAgICAgUXVlcnlTdHJpbmc6ICcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXN1bHRzOiBbXSxcclxuICAgICAgICBzY3JvbGxUb0RvY3VtZW50OiBzY3JvbGxUb0RvY3VtZW50LFxyXG4gICAgICAgIHNlYXJjaDogc2VhcmNoXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICB2bS5xdWVyeS5RdWVyeVN0cmluZyA9ICRsb2NhdGlvbi5zZWFyY2goKS5xdWVyeTtcclxuICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL2V4cGxhbmF0b3J5LW5vdGVzLWdlcm1hbnktc2VhcmNoJyk7XHJcbiAgICAgICAgbG9hZFNlYXJjaCgpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGxvYWRTZWFyY2gpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnVuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgbG9hZFNlYXJjaCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2VhcmNoKHF1ZXJ5KSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9zZWFyY2gvZXhwbGFuYXRvcnktbm90ZXMvZ2VybWFueScpLnNlYXJjaChxdWVyeSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2Nyb2xsVG9Eb2N1bWVudChlenREb2N1bWVudCkge1xyXG4gICAgICAgIGRvY3VtZW50XHJcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuRE9DXycgKyBlenREb2N1bWVudC5IdG1sQ2xhc3NOYW1lKVxyXG4gICAgICAgICAgICAuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRTZWFyY2goKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbmZpZy5hcGlIb3N0cy5kdHYgKyAnL2V6dC9leHBsYW5hdG9yeS1ub3Rlcy9zZWFyY2gnICtcclxuICAgICAgICAgICAgJz9sYW5nPScgKyBsYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICcmcT0nICsgdm0ucXVlcnkuUXVlcnlTdHJpbmcgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG4gICAgICAgIGlmICh2bS5xdWVyeS5RdWVyeVN0cmluZyAmJiB2bS5xdWVyeS5RdWVyeVN0cmluZy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIGRhdGFDb250ZXh0LmdldCh1cmwpXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnJlc3VsdCA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IHNlYXJjaEhlYWRpbmdDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdzZWFyY2gvY29tcG9uZW50cy9wYWdlcy9zZWFyY2gtaGVhZGluZy5odG1sJ1xyXG59O1xyXG5cclxuc2VhcmNoSGVhZGluZ0NvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnZm9ybWF0dGluZycsICBcclxuICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIFxyXG4gICAgJ3NlYXJjaFNlcnZpY2UnLCBcclxuICAgICckbG9jYXRpb24nLCBcclxuICAgICdub21lbmNsYXR1cmVEYXRhU2VydmljZScsXHJcbl07XHJcblxyXG5mdW5jdGlvbiBzZWFyY2hIZWFkaW5nQ29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgZm9ybWF0dGluZywgIFxyXG4gICAgc3RhdGUsIFxyXG4gICAgc2VhcmNoU2VydmljZSwgXHJcbiAgICAkbG9jYXRpb24sIFxyXG4gICAgbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2VcclxuKSB7XHJcblxyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICBjaGFwdGVyRmlsdGVyOiBudWxsLFxyXG4gICAgICAgIHJlc3VsdDoge30sXHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBxOiB7fSxcclxuICAgICAgICBzZWFyY2g6IHNlYXJjaCxcclxuICAgICAgICBzdGF0ZTogc3RhdGUsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9ub21lbmNsYXR1cmUtc2VhcmNoL2hlYWRpbmdzJyk7XHJcbiAgICAgICAgdm0ucSA9IHNlYXJjaFNlcnZpY2UucGFyc2VMb2NhdGlvblNlYXJjaE9iamVjdCgkbG9jYXRpb24uc2VhcmNoKCkpO1xyXG4gICAgICAgIGlmICh2bS5xLmNvbW1vZGl0eUNvZGUgfHwgdm0ucS5xdWVyeSkge1xyXG4gICAgICAgICAgICBzZWFyY2godm0ucSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlYXJjaCAocSkge1xyXG4gICAgICAgIGlmICghcS5jb21tb2RpdHlDb2RlICYmICFxLnF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBxdWVyeVN0cmluZyA9IHNlYXJjaFNlcnZpY2Uuc2VyaWFsaXplUXVlcnkocSk7XHJcbiAgICAgICAgLy8gTkI6IHRoZSBiYWNrIGJ1dHRvbiB3aWxsIG5vdCB3b3JrIHByb3Blcmx5IGlmIHdlIGRvbid0IGRvIHRoaXMgY2hlY2tcclxuICAgICAgICBpZiAocXVlcnlTdHJpbmcgIT09IHNlYXJjaFNlcnZpY2Uuc2VyaWFsaXplUXVlcnkoJGxvY2F0aW9uLnNlYXJjaCgpKSkge1xyXG4gICAgICAgICAgICAkbG9jYXRpb24ucGF0aCgnL3NlYXJjaC9oZWFkaW5nJykuc2VhcmNoKHF1ZXJ5U3RyaW5nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLnEgPSBxO1xyXG5cclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnRhdGlvbiA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICghc3RhdGUucmVtZW1iZXIuY291bnRyeSAmJiAhcS5jb3VudHJ5KSB7XHJcbiAgICAgICAgICAgIHN0YXRlLmZpbHRlci5jb3VudHJ5Q29kZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHN0YXRlLmZpbHRlci5jb3VudHJ5TmFtZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOQjogaWYgd2UnZCByZW1vdmUgdGhpcyBmaXJzdCBpZi1zdGF0ZW1lbnQsIHdlIGNvdWxkIHNob3cgcmVzdWx0cyBmb3IgYSBzaW5nbGUgaGVhZGluZyBpbiBhIGZsYXQgZm9ybWF0XHJcbiAgICAgICAgaWYgKHEuY29tbW9kaXR5Q29kZSAmJiAhZm9ybWF0dGluZy5pc0NoYXB0ZXJDb2RlKHEuY29tbW9kaXR5Q29kZSkpIHtcclxuICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9zZWFyY2gvdHJlZScpLnJlcGxhY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoIXEucXVlcnkgJiYgcS5jb21tb2RpdHlDb2RlICYmIGZvcm1hdHRpbmcuaXNDaGFwdGVyQ29kZShxLmNvbW1vZGl0eUNvZGUpKSB7XHJcbiAgICAgICAgICAgICRsb2NhdGlvbi51cmwoJy9jaGFwdGVyLycgKyBxLmNvbW1vZGl0eUNvZGUuc3Vic3RyaW5nKDAsIDIpKS5yZXBsYWNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocS5jb21tb2RpdHlDb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5jaGFwdGVyRmlsdGVyID0gZm9ybWF0dGluZy50b0NoYXB0ZXJOdW1iZXIocS5jb21tb2RpdHlDb2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2Uuc2VhcmNoSGVhZGluZ3MocSlcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ucmVzdWx0ID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogc2VhcmNoVGV4dHNHZXJtYW55Q29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnc2VhcmNoL2NvbXBvbmVudHMvcGFnZXMvc2VhcmNoLXRleHRzLWdlcm1hbnkuaHRtbCdcclxufTtcclxuXHJcbnNlYXJjaFRleHRzR2VybWFueUNvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJywgXHJcbiAgICAnJGxvY2F0aW9uJywgXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLCBcclxuICAgICdkYXRhQ29udGV4dCcsIFxyXG4gICAgJ2xhbmd1YWdlJywgXHJcbiAgICAnY29uZmlnJywgXHJcbiAgICAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gc2VhcmNoVGV4dHNHZXJtYW55Q29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgJGxvY2F0aW9uLCBcclxuICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLCBcclxuICAgIGRhdGFDb250ZXh0LCBcclxuICAgIGxhbmd1YWdlLCBcclxuICAgIGNvbmZpZywgXHJcbiAgICBzdGF0ZVxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBxdWVyeToge1xyXG4gICAgICAgICAgICBRdWVyeVN0cmluZzogJydcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlc3VsdHM6IFtdLFxyXG4gICAgICAgIHNjcm9sbFRvRG9jdW1lbnQ6IHNjcm9sbFRvRG9jdW1lbnQsXHJcbiAgICAgICAgc2VhcmNoOiBzZWFyY2hcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIHZtLnF1ZXJ5LlF1ZXJ5U3RyaW5nID0gJGxvY2F0aW9uLnNlYXJjaCgpLnF1ZXJ5O1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvdGV4dHMtZ2VybWFueS1zZWFyY2gnKTtcclxuICAgICAgICBsb2FkU2VhcmNoKCk7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2Uuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgbG9hZFNlYXJjaCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9uc1NlcnZpY2UudW5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBsb2FkU2VhcmNoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWFyY2gocXVlcnkpIHtcclxuICAgICAgICAkbG9jYXRpb24ucGF0aCgnL3NlYXJjaC90ZXh0cy9nZXJtYW55Jykuc2VhcmNoKHF1ZXJ5KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzY3JvbGxUb0RvY3VtZW50KGV6dERvY3VtZW50KSB7XHJcbiAgICAgICAgZG9jdW1lbnRcclxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy4nICsgZXp0RG9jdW1lbnQuSHRtbENsYXNzTmFtZSlcclxuICAgICAgICAgICAgLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZFNlYXJjaCgpIHtcclxuICAgICAgICB2YXIgdXJsID0gY29uZmlnLmFwaUhvc3RzLmR0diArICcvZXp0L3RleHRzL3NlYXJjaCcgK1xyXG4gICAgICAgICAgICAnP2xhbmc9JyArIGxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZxPScgKyB2bS5xdWVyeS5RdWVyeVN0cmluZyArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcbiAgICAgICAgaWYgKHZtLnF1ZXJ5LlF1ZXJ5U3RyaW5nICYmIHZtLnF1ZXJ5LlF1ZXJ5U3RyaW5nLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgZGF0YUNvbnRleHQuZ2V0KHVybClcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ucmVzdWx0ID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogc2VhcmNoV2NvQ2xhc3NpZmljYXRpb25PcGluaW9uc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3NlYXJjaC9jb21wb25lbnRzL3BhZ2VzL3NlYXJjaC13Y28tY2xhc3NpZmljYXRpb24tb3BpbmlvbnMuaHRtbCdcclxufTtcclxuXHJcbnNlYXJjaFdjb0NsYXNzaWZpY2F0aW9uT3BpbmlvbnNDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyRsb2NhdGlvbicsIFxyXG4gICAgJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJywgXHJcbiAgICAnZGF0YUNvbnRleHQnLCBcclxuICAgICdsYW5ndWFnZScsIFxyXG4gICAgJ2NvbmZpZycsIFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHNlYXJjaFdjb0NsYXNzaWZpY2F0aW9uT3BpbmlvbnNDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkbG9jYXRpb24sIFxyXG4gICAgbm90aWZpY2F0aW9uc1NlcnZpY2UsIFxyXG4gICAgZGF0YUNvbnRleHQsIFxyXG4gICAgbGFuZ3VhZ2UsIFxyXG4gICAgY29uZmlnLCBcclxuICAgIHN0YXRlXHJcbikge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZS5nZXQoKSxcclxuICAgICAgICBxdWVyeToge1xyXG4gICAgICAgICAgICBRdWVyeVN0cmluZzogJydcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlc3VsdHM6IFtdLFxyXG4gICAgICAgIHNjcm9sbFRvRG9jdW1lbnQ6IHNjcm9sbFRvRG9jdW1lbnQsXHJcbiAgICAgICAgc2VhcmNoOiBzZWFyY2hcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIHZtLnF1ZXJ5LlF1ZXJ5U3RyaW5nID0gJGxvY2F0aW9uLnNlYXJjaCgpLnF1ZXJ5O1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvd2NvLWNsYXNzaWZpY2F0aW9uLW9waW5pb25zLXNlYXJjaCcpO1xyXG4gICAgICAgIGxvYWRTZWFyY2goKTtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS5zdWJzY3JpYmUoJ2ZpbHRlcl9kYXRlX2NoYW5nZWQnLCBsb2FkU2VhcmNoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkZXRhY2hlZCgpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS51bnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGxvYWRTZWFyY2gpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlYXJjaChxdWVyeSkge1xyXG4gICAgICAgICRsb2NhdGlvbi5wYXRoKCcvc2VhcmNoL2NsYXNzaWZpY2F0aW9ucy93Y28nKS5zZWFyY2gocXVlcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvRG9jdW1lbnQocmVzdWx0KSB7XHJcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gJy5jbGFzc2lmaWNhdGlvbi1vcGluaW9uLVdDTy0nICsgcmVzdWx0LkhzQ29kZSArICctJyArIHJlc3VsdC5OdW1iZXI7XHJcbiAgICAgICAgZG9jdW1lbnRcclxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXHJcbiAgICAgICAgICAgIC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRTZWFyY2goKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jbGFzc2lmaWNhdGlvbnMvd2NvL3NlYXJjaCcgK1xyXG4gICAgICAgICAgICAnP2xhbmc9JyArIGxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZxPScgKyB2bS5xdWVyeS5RdWVyeVN0cmluZyArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcbiAgICAgICAgaWYgKHZtLnF1ZXJ5LlF1ZXJ5U3RyaW5nICYmIHZtLnF1ZXJ5LlF1ZXJ5U3RyaW5nLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgdm0ubGFuZ3VhZ2UgPSBsYW5ndWFnZS5nZXQoKTtcclxuICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHZtLmxhbmd1YWdlID09PSAnZW4nIHx8IHZtLmxhbmd1YWdlID09PSAnZnInKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhQ29udGV4dC5nZXQodXJsKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5yZXN1bHRzID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogc2VhcmNoV2NvRXhwbGFuYXRvcnlOb3Rlc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3NlYXJjaC9jb21wb25lbnRzL3BhZ2VzL3NlYXJjaC13Y28tZXhwbGFuYXRvcnktbm90ZXMuaHRtbCdcclxufTtcclxuXHJcbnNlYXJjaFdjb0V4cGxhbmF0b3J5Tm90ZXNDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJyRsb2NhdGlvbicsIFxyXG4gICAgJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJywgXHJcbiAgICAnZGF0YUNvbnRleHQnLCBcclxuICAgICdsYW5ndWFnZScsIFxyXG4gICAgJ2NvbmZpZycsIFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHNlYXJjaFdjb0V4cGxhbmF0b3J5Tm90ZXNDb250cm9sbGVyKFxyXG4gICAgJGFuYWx5dGljcywgXHJcbiAgICAkbG9jYXRpb24sIFxyXG4gICAgbm90aWZpY2F0aW9uc1NlcnZpY2UsIFxyXG4gICAgZGF0YUNvbnRleHQsIFxyXG4gICAgbGFuZ3VhZ2UsIFxyXG4gICAgY29uZmlnLCBcclxuICAgIHN0YXRlXHJcbikge1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLmdldCgpLFxyXG4gICAgICAgIHF1ZXJ5OiB7XHJcbiAgICAgICAgICAgIFF1ZXJ5U3RyaW5nOiAnJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzdWx0czogW10sXHJcbiAgICAgICAgc2Nyb2xsVG9Eb2N1bWVudDogc2Nyb2xsVG9Eb2N1bWVudCxcclxuICAgICAgICBzZWFyY2g6IHNlYXJjaFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgdm0ucXVlcnkuUXVlcnlTdHJpbmcgPSAkbG9jYXRpb24uc2VhcmNoKCkucXVlcnk7XHJcbiAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy93Y28tZXhwbGFuYXRvcnktbm90ZXMtc2VhcmNoJyk7XHJcbiAgICAgICAgbG9hZFNlYXJjaCgpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGxvYWRTZWFyY2gpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnVuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgbG9hZFNlYXJjaCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2VhcmNoKHF1ZXJ5KSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9zZWFyY2gvZXhwbGFuYXRvcnktbm90ZXMvd2NvJykuc2VhcmNoKHF1ZXJ5KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzY3JvbGxUb0RvY3VtZW50KGV4cGxhbmF0b3J5Tm90ZSkge1xyXG4gICAgICAgIHZhciBzZWxlY3RvciA9ICcuZXhwbGFuYXRvcnktbm90ZS1XQ08tJyArIGV4cGxhbmF0b3J5Tm90ZS5Ob21lbmNsYXR1cmVMZXZlbCArICctJyArIGV4cGxhbmF0b3J5Tm90ZS5Hb29kc0NvZGVPclNlY3Rpb25OdW1iZXI7XHJcbiAgICAgICAgZG9jdW1lbnRcclxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXHJcbiAgICAgICAgICAgIC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRTZWFyY2goKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9leHBsYW5hdG9yeS1ub3Rlcy93Y28vc2VhcmNoJyArXHJcbiAgICAgICAgICAgICc/bGFuZz0nICsgbGFuZ3VhZ2UuZ2V0KCkgK1xyXG4gICAgICAgICAgICAnJnE9JyArIHZtLnF1ZXJ5LlF1ZXJ5U3RyaW5nICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuICAgICAgICBpZiAodm0ucXVlcnkuUXVlcnlTdHJpbmcgJiYgdm0ucXVlcnkuUXVlcnlTdHJpbmcubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICB2bS5sYW5ndWFnZSA9IGxhbmd1YWdlLmdldCgpO1xyXG4gICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodm0ubGFuZ3VhZ2UgPT09ICdlbicgfHwgdm0ubGFuZ3VhZ2UgPT09ICdmcicpIHtcclxuICAgICAgICAgICAgICAgIGRhdGFDb250ZXh0LmdldCh1cmwpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnJlc3VsdHMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBzZWFyY2hDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdzZWFyY2gvY29tcG9uZW50cy9wYWdlcy9zZWFyY2guaHRtbCdcclxufTtcclxuXHJcbnNlYXJjaENvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJyxcclxuICAgICckcm91dGVQYXJhbXMnLCBcclxuICAgICdjb21tb24nLCBcclxuICAgICdkYXRhQ29udGV4dCcsIFxyXG4gICAgJ2Zvcm1hdHRpbmcnLFxyXG4gICAgJ2J0aURhdGFTZXJ2aWNlJywgXHJcbiAgICAnYnRpTW9kYWwnLCBcclxuICAgICdjYXNlTGF3TW9kYWwnLCBcclxuICAgICdjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zTW9kYWwnLCBcclxuICAgICdub21lbmNsYXR1cmVEYXRhU2VydmljZScsXHJcbiAgICAnbm9tZW5jbGF0dXJlVHJlZVNlcnZpY2UnLCBcclxuICAgICdub3RpZmljYXRpb25zU2VydmljZScsIFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgXHJcbiAgICAnc2VhcmNoU2VydmljZScsXHJcbiAgICAncmVmZXJlbmNlRGF0ZVNlcnZpY2UnLFxyXG4gICAgJ2VjaWNzRGF0YVNlcnZpY2UnLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gc2VhcmNoQ29udHJvbGxlcihcclxuICAgICRhbmFseXRpY3MsIFxyXG4gICAgJHJvdXRlUGFyYW1zLCBcclxuICAgIGNvbW1vbiwgXHJcbiAgICBkYXRhQ29udGV4dCwgXHJcbiAgICBmb3JtYXR0aW5nLCBcclxuICAgIGJ0aURhdGFTZXJ2aWNlLFxyXG4gICAgYnRpTW9kYWwsIFxyXG4gICAgY2FzZUxhd01vZGFsLCBcclxuICAgIGNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNNb2RhbCwgXHJcbiAgICBub21lbmNsYXR1cmVEYXRhU2VydmljZSxcclxuICAgIG5vbWVuY2xhdHVyZVRyZWVTZXJ2aWNlLCBcclxuICAgIG5vdGlmaWNhdGlvbnMsXHJcbiAgICBzdGF0ZSwgXHJcbiAgICBzZWFyY2hTZXJ2aWNlLFxyXG4gICAgcmVmZXJlbmNlRGF0ZVNlcnZpY2UsXHJcbiAgICBlY2ljc0RhdGFTZXJ2aWNlXHJcbikge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICBxOiB7fSxcclxuICAgICAgICBzZWFyY2hRdWVyeTogJycsXHJcbiAgICAgICAgY2hhcHRlcnM6IFtdLFxyXG4gICAgICAgIGVjaWNzQ291bnQ6IHt9LFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgc3RhdGU6IHN0YXRlLFxyXG4gICAgICAgIGdvSG9tZTogZ29Ib21lLFxyXG4gICAgICAgIGNsaWNrUm93OiBjbGlja1JvdyxcclxuICAgICAgICBkb3VibGVDbGlja1JvdzogZG91YmxlQ2xpY2tSb3csXHJcbiAgICAgICAgZGVzZWxlY3RMaW5lOiBkZXNlbGVjdExpbmUsXHJcbiAgICAgICAgaGFzQXRyOiBoYXNBdHIsXHJcbiAgICAgICAgaGFzQnRpOiBoYXNCdGksXHJcbiAgICAgICAgbG9hZENoYXB0ZXI6IGxvYWRDaGFwdGVyLFxyXG4gICAgICAgIG1hdGNoZWRHb29kc0NvZGU6IGZhbHNlLFxyXG4gICAgICAgIHF1ZXJ5SXNWYWxpZDogcXVlcnlJc1ZhbGlkLFxyXG4gICAgICAgIHNlYXJjaDogc2VhcmNoLFxyXG4gICAgICAgIHNob3dCdGk6IHNob3dCdGksXHJcbiAgICAgICAgc2hvd0Nhc2VMYXc6IHNob3dDYXNlTGF3LFxyXG4gICAgICAgIHNob3dDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zOiBzaG93Q2xhc3NpZmljYXRpb25SZWd1bGF0aW9uc1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICBjb21tb24uYXV0aC5jaGVjaygpO1xyXG4gICAgICAgIHZhciByZWZlcmVuY2VEYXRlID0gY29tbW9uLiRsb2NhdGlvbi5zZWFyY2goKS5kYXRlO1xyXG4gICAgICAgIGlmIChyZWZlcmVuY2VEYXRlKSB7XHJcbiAgICAgICAgICAgIHJlZmVyZW5jZURhdGVTZXJ2aWNlLnNldFJlZmVyZW5jZURhdGUocmVmZXJlbmNlRGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgb2xkZXIgc3R5bGUgbGlua3MuIFRoaXMgaXMgb25seSB1c2VkIHdpdGggc2VhcmNocXVlcnkgZXF1YWwgdG8gYSBjb21tb2RpdHkgY29kZS5cclxuICAgICAgICBpZiAoJHJvdXRlUGFyYW1zLnNlYXJjaHF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIGlmIChjb21tb24uZm9ybWF0dGluZy5pc0NvbW1vZGl0eUNvZGUoJHJvdXRlUGFyYW1zLnNlYXJjaHF1ZXJ5KSkge1xyXG4gICAgICAgICAgICAgICAgY29tbW9uLiRsb2NhdGlvbi5wYXRoKCdzZWFyY2gvdHJlZScpLnNlYXJjaCh7IFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vZGl0eUNvZGU6IGNvbW1vbi5mb3JtYXR0aW5nLmNsZWFuR29vZHNDb2RlKCRyb3V0ZVBhcmFtcy5zZWFyY2hxdWVyeSkgXHJcbiAgICAgICAgICAgICAgICB9KS5yZXBsYWNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb21tb24uJGxvY2F0aW9uLnBhdGgoJ3NlYXJjaC9oZWFkaW5ncycpLnNlYXJjaCh7IFxyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiAkcm91dGVQYXJhbXMuc2VhcmNocXVlcnkgXHJcbiAgICAgICAgICAgICAgICB9KS5yZXBsYWNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLnEgPSBzZWFyY2hTZXJ2aWNlLnBhcnNlTG9jYXRpb25TZWFyY2hPYmplY3QoY29tbW9uLiRsb2NhdGlvbi5zZWFyY2goKSk7XHJcbiAgICAgICAgICAgIGxvYWRTZWFyY2hSZXN1bHRzKHZtLnEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBub3RpZmljYXRpb25zLnN1YnNjcmliZSgnZmlsdGVyX21vdmVtZW50X2NoYW5nZWQnLCBtb3ZlbWVudENoYW5nZWQpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMudW5zdWJzY3JpYmUoJ2ZpbHRlcl9tb3ZlbWVudF9jaGFuZ2VkJywgbW92ZW1lbnRDaGFuZ2VkKTtcclxuICAgICAgICBub3RpZmljYXRpb25zLnVuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1vdmVtZW50Q2hhbmdlZCgpIHtcclxuICAgICAgICBsb2FkU2VhcmNoUmVzdWx0cyh2bS5xKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkYXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICBsb2FkU2VhcmNoUmVzdWx0cyh2bS5xKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnb0hvbWUoKSB7XHJcbiAgICAgICAgY29tbW9uLiRsb2NhdGlvbi51cmwoJycpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsaWNrUm93KGhlYWRpbmcpIHtcclxuICAgICAgICBzdGF0ZS5jdXJyZW50Q29kZSA9IGhlYWRpbmcudmFsdWUuY29tbW9kaXR5Q29kZTtcclxuICAgICAgICBzdGF0ZS5jdXJyZW50SW5kZW50YXRpb24gPSBoZWFkaW5nLnZhbHVlLmluZGVudGF0aW9uO1xyXG4gICAgICAgIGlmICghaGVhZGluZy5oYXNDaGlsZHJlbikge1xyXG4gICAgICAgICAgICBjb21tb24uJGxvY2F0aW9uLnVybCgnZ29vZC8nICsgaGVhZGluZy52YWx1ZS5jb21tb2RpdHlDb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGhlYWRpbmcubWV0YWRhdGEuaXNFeHBhbmRlZCA9ICFoZWFkaW5nLm1ldGFkYXRhLmlzRXhwYW5kZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRvdWJsZUNsaWNrUm93KGhlYWRpbmcpIHtcclxuICAgICAgICBzdGF0ZS5jdXJyZW50Q29kZSA9IGhlYWRpbmcudmFsdWUuY29tbW9kaXR5Q29kZTtcclxuICAgICAgICBzdGF0ZS5jdXJyZW50SW5kZW50YXRpb24gPSBoZWFkaW5nLnZhbHVlLmluZGVudGF0aW9uO1xyXG4gICAgICAgIGlmICghaGVhZGluZy5oYXNDaGlsZHJlbikge1xyXG4gICAgICAgICAgICBjb21tb24uJGxvY2F0aW9uLnVybCgnZ29vZC8nICsgaGVhZGluZy52YWx1ZS5jb21tb2RpdHlDb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaGVhZGluZy5tZXRhZGF0YS5pc0V4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgIG5vbWVuY2xhdHVyZVRyZWVTZXJ2aWNlLmNvbGxhcHNlQWxsKGhlYWRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbm9tZW5jbGF0dXJlVHJlZVNlcnZpY2UuZXhwYW5kQWxsKGhlYWRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb21tb24uaW50ZXJhY3Rpb24uY2xlYXJTZWxlY3Rpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRTZWN0aW9uQW5kQ2hhcHRlcihzZWN0aW9uTnVtYmVyLCBjaGFwdGVyTnVtYmVyKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG5vbWVuY2xhdHVyZURhdGFTZXJ2aWNlLmdldFNlY3Rpb25zKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24od3JhcHBlcikge1xyXG4gICAgICAgICAgICAgICAgdm0uc2VjdGlvbiA9IF8uZmluZCh3cmFwcGVyLmRhdGEsIGZ1bmN0aW9uKHNlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VjdGlvbi5udW1iZXIgPT09IHNlY3Rpb25OdW1iZXI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHZtLmNoYXB0ZXIgPSBfLmZpbmQodm0uc2VjdGlvbi5jaGFwdGVycywgZnVuY3Rpb24oY2hhcHRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFwdGVyLm51bWJlciA9PT0gY2hhcHRlck51bWJlcjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBxdWVyeUlzVmFsaWQocSkge1xyXG4gICAgICAgIGlmIChxLnF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBxLnF1ZXJ5Lmxlbmd0aCA+IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gISFxLmNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlYXJjaChxKSB7XHJcbiAgICAgICAgaWYgKHF1ZXJ5SXNWYWxpZChxKSkge1xyXG4gICAgICAgICAgICB2YXIgcXVlcnlTdHJpbmcgPSBzZWFyY2hTZXJ2aWNlLnNlcmlhbGl6ZVF1ZXJ5KHEpO1xyXG4gICAgICAgICAgICBjb21tb24uJGxvY2F0aW9uLnBhdGgoJy9zZWFyY2gvdHJlZScpLnNlYXJjaChxdWVyeVN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRTZWFyY2hSZXN1bHRzKHEpIHtcclxuICAgICAgICBpZiAoIXF1ZXJ5SXNWYWxpZChxKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcS5jb21tb2RpdHlDb2RlKSB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgcXVlcnlTdHJpbmcgPSBzZWFyY2hTZXJ2aWNlLnNlcmlhbGl6ZVF1ZXJ5KHEpO1xyXG4gICAgICAgICAgICBjb21tb24uJGxvY2F0aW9uLnBhdGgoJy9zZWFyY2gvaGVhZGluZycpLnNlYXJjaChxdWVyeVN0cmluZykucmVwbGFjZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0ucSA9IHE7XHJcbiAgICAgICAgXHJcbiAgICAgICAgZGF0YUNvbnRleHQuY2FuY2VsKCdHT09EJyk7XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBzdGF0ZS5jdXJyZW50SW5kZW50YXRpb24gPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoIXN0YXRlLnJlbWVtYmVyLmNvdW50cnkgJiYgIXEuY291bnRyeSkge1xyXG4gICAgICAgICAgICBzdGF0ZS5maWx0ZXIuY291bnRyeUNvZGUgPSBudWxsO1xyXG4gICAgICAgICAgICBzdGF0ZS5maWx0ZXIuY291bnRyeU5hbWUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXEucXVlcnkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYnJvd3NpbmcsIG5vdCBzZWFyY2hpbmcuIFdlIGNhbiBzcGxpdCB0aGlzIHVwLlxyXG5cclxuICAgICAgICAgICAgaWYgKCFxLmNvbW1vZGl0eUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbW1vbi4kbG9jYXRpb24udXJsKCcnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgY2hhcHRlckNvZGUgPSBxLmNvbW1vZGl0eUNvZGUuc3Vic3RyaW5nKDAsIDIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGZvcm1hdHRpbmcuaXNDaGFwdGVyQ29kZShxLmNvbW1vZGl0eUNvZGUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb21tb24uJGxvY2F0aW9uLnVybCgnL2NoYXB0ZXIvJyArIGNoYXB0ZXJDb2RlKS5yZXBsYWNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm0ubWF0Y2hlZEdvb2RzQ29kZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjaygnL25vbWVuY2xhdHVyZS1zZWFyY2gvYnktY29kZScpO1xyXG5cclxuICAgICAgICAgICAgbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2UuYnJvd3NlSGVhZGluZyhxKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zZWFyY2hUeXBlID0gJ2Jyb3dzZSc7IC8vIEF0IHNvbWUgcG9pbnQgd2Ugc2hvdWxkIGp1c3Qgc3BsaXQgYnJvd3NpbmcgYW5kIHNlYXJjaGluZyBpbnRvIHR3byBkaWZmZXJlbnQgdmlld3NcclxuICAgICAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLm5hdmlnYXRpbmdGcm9tTWVhc3VyZXNQYWdlICYmIG5vbWVuY2xhdHVyZVRyZWVTZXJ2aWNlLmlzRGVjbGFyYWJsZUNvZGUocS5jb21tb2RpdHlDb2RlLCBkYXRhLnRyZWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFDb250ZXh0LmNhbmNlbCgnU0VBUkNIJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi4kbG9jYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cmwoJy9nb29kLycgKyBmb3JtYXR0aW5nLmdvb2RzQ29kZVRvR29vZHNub21JZChxLmNvbW1vZGl0eUNvZGUpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlY3Rpb25BbmRDaGFwdGVyKGRhdGEubWV0YWRhdGEuc2VjdGlvbk51bWJlciwgZGF0YS5tZXRhZGF0YS5jaGFwdGVyTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9tZW5jbGF0dXJlVHJlZVNlcnZpY2Uuc2V0Q29kZUZyb21BbmRDb2RlVG8oZGF0YS50cmVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWNpY3NDb3VudChkYXRhLnRyZWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50SW5kZW50YXRpb24oZGF0YS50cmVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5oZWFkaW5nID0gZGF0YS50cmVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5sYXN0UXVlcnkgPSBkYXRhLnF1ZXJ5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5uYXZpZ2F0aW5nRnJvbU1lYXN1cmVzUGFnZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChxLmNvbW1vZGl0eUNvZGUgPT09IG51bGwgfHwgZm9ybWF0dGluZy5pc0NoYXB0ZXJDb2RlKHEuY29tbW9kaXR5Q29kZSkpIHtcclxuICAgICAgICAgICAgY29tbW9uLiRsb2NhdGlvbi5wYXRoKCcvc2VhcmNoL2hlYWRpbmcvJykucmVwbGFjZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHEuY29tbW9kaXR5Q29kZSkge1xyXG4gICAgICAgICAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJy9ub21lbmNsYXR1cmUtc2VhcmNoL2J5LXRleHQtYW5kLWNvZGUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvbm9tZW5jbGF0dXJlLXNlYXJjaC9ieS10ZXh0Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm0ubWF0Y2hlZEdvb2RzQ29kZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIG5vbWVuY2xhdHVyZURhdGFTZXJ2aWNlLnNlYXJjaFRyZWUocSlcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUubmF2aWdhdGluZ0Zyb21NZWFzdXJlc1BhZ2UgJiYgbm9tZW5jbGF0dXJlVHJlZVNlcnZpY2UuaXNEZWNsYXJhYmxlQ29kZShxLmNvbW1vZGl0eUNvZGUsIGRhdGEubm9tZW5jbGF0dXJlUmVzdWx0LnRyZWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFDb250ZXh0LmNhbmNlbCgnU0VBUkNIJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi4kbG9jYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cmwoJy9nb29kLycgKyBmb3JtYXR0aW5nLmdvb2RzQ29kZVRvR29vZHNub21JZChxLmNvbW1vZGl0eUNvZGUpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vbWVuY2xhdHVyZVRyZWVTZXJ2aWNlLnNldENvZGVGcm9tQW5kQ29kZVRvKGRhdGEubm9tZW5jbGF0dXJlUmVzdWx0LnRyZWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFY2ljc0NvdW50KGRhdGEubm9tZW5jbGF0dXJlUmVzdWx0LnRyZWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWN0aW9uQW5kQ2hhcHRlcihkYXRhLm5vbWVuY2xhdHVyZVJlc3VsdC5tZXRhZGF0YS5zZWN0aW9uTnVtYmVyLCBkYXRhLm5vbWVuY2xhdHVyZVJlc3VsdC5tZXRhZGF0YS5jaGFwdGVyTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycmVudEluZGVudGF0aW9uKGRhdGEubm9tZW5jbGF0dXJlUmVzdWx0LnRyZWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5tZXRhZGF0YSA9IGRhdGEubm9tZW5jbGF0dXJlUmVzdWx0Lm1ldGFkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5oZWFkaW5nID0gZGF0YS5ub21lbmNsYXR1cmVSZXN1bHQudHJlZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uZm91bmRUZXh0cyA9IGRhdGEuZm91bmRUZXh0cztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubGFzdFF1ZXJ5ID0gZGF0YS5xdWVyeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubGFzdFF1ZXJ5LkhlYWRpbmcgPSBkYXRhLnF1ZXJ5LlJvb3RDb21tb2RpdHlDb2RlLnN1YnN0cmluZygwLCA0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubnVtYmVyT2ZSZXN1bHRzID0gZGF0YS5ub21lbmNsYXR1cmVSZXN1bHQubnVtYmVyT2ZSZXN1bHRzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5uYXZpZ2F0aW5nRnJvbU1lYXN1cmVzUGFnZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnIuaXNBYm9ydGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7fVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRFY2ljc0NvdW50KHRyZWUpIHtcclxuICAgICAgICBpZiAoIXRyZWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlY2ljc0RhdGFTZXJ2aWNlLmNvdW50Rm9yR29vZHNDb2RlKHRyZWUudmFsdWUuY29tbW9kaXR5Q29kZSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24obnVtYmVyT2ZFY2ljc0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5lY2ljc0NvdW50ID0ge307XHJcbiAgICAgICAgICAgICAgICB2bS5lY2ljc0NvdW50W3RyZWUudmFsdWUuY29tbW9kaXR5Q29kZV0gPSBudW1iZXJPZkVjaWNzSXRlbXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRDaGFwdGVyKGNoYXB0ZXJDb2RlKSB7XHJcbiAgICAgICAgY29tbW9uLiRsb2NhdGlvbi5wYXRoKCcvY2hhcHRlci8nICsgY2hhcHRlckNvZGUpLnNlYXJjaCgnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaGFzQXRyKCkge1xyXG4gICAgICAgIHJldHVybiAhdm0uZm91bmRUZXh0cyB8fCB2bS5mb3VuZFRleHRzLmF0ckNvdW50ID4gMDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBoYXNCdGkoKSB7XHJcbiAgICAgICAgcmV0dXJuICF2bS5mb3VuZFRleHRzIHx8IHZtLmZvdW5kVGV4dHMuYnRpQ291bnQgPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNldEN1cnJlbnRJbmRlbnRhdGlvbihub2RlKSB7XHJcblxyXG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gR2V0IGN1cnJlbnRDb2RlIGZyb20gc2VhcmNoIHJlc3VsdCBmcm9tIHNlcnZlclxyXG4gICAgICAgIGlmIChub2RlLm1ldGFkYXRhLmlzQ3VycmVudENvZGUpIHtcclxuICAgICAgICAgICAgc3RhdGUuY3VycmVudENvZGUgPSBub2RlLnZhbHVlLmNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnRhdGlvbiA9IG5vZGUudmFsdWUuaW5kZW50YXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuICE9PSBudWxsICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBfLmZvckVhY2gobm9kZS5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRDdXJyZW50SW5kZW50YXRpb24oY2hpbGQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGVzZWxlY3RMaW5lKCkge1xyXG4gICAgICAgIHN0YXRlLmN1cnJlbnRDb2RlID0gbnVsbDtcclxuICAgICAgICBzdGF0ZS5jdXJyZW50SW5kZW50YXRpb24gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dCdGkoY29kZSwgJGV2ZW50KSB7XHJcbiAgICAgICAgYnRpTW9kYWwuc2hvdyhjb2RlLCB2bS5xLnF1ZXJ5KTtcclxuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0Nhc2VMYXcoY29kZSwgJGV2ZW50KSB7XHJcbiAgICAgICAgY2FzZUxhd01vZGFsLnNob3coY29kZSwgdm0ucS5xdWVyeSk7XHJcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zKGNvZGUsICRldmVudCkge1xyXG4gICAgICAgIGNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnNNb2RhbC5zaG93KGNvZGUsIHZtLnEucXVlcnkpO1xyXG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczogeyBcclxuICAgICAgICBzZWFyY2hIYW5kbGVyOiAnJicsIFxyXG4gICAgICAgIGxlZ2VuZDogJ0AnIFxyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IHNlYXJjaEZvcm1Db250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdzZWFyY2gvY29tcG9uZW50cy9zZWFyY2gtZm9ybS5odG1sJ1xyXG59O1xyXG5cclxuc2VhcmNoRm9ybUNvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckbG9jYXRpb24nLFxyXG4gICAgJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJywgXHJcbiAgICAnbGFuZ3VhZ2UnXHJcbl07XHJcblxyXG5mdW5jdGlvbiBzZWFyY2hGb3JtQ29udHJvbGxlcihcclxuICAgICRsb2NhdGlvbiwgXHJcbiAgICBub3RpZmljYXRpb25zU2VydmljZSwgXHJcbiAgICBsYW5ndWFnZVxyXG4pIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgJG9uRGVzdHJveTogZGV0YWNoZWQsXHJcbiAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLmdldCgpLFxyXG4gICAgICAgIHF1ZXJ5OiB7XHJcbiAgICAgICAgICAgIHF1ZXJ5OiAkbG9jYXRpb24uc2VhcmNoKCkucXVlcnlcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZhbGlkYXRpb25SZXN1bHQ6IHt9LFxyXG4gICAgICAgIHNlYXJjaDogc2VhcmNoXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICBub3RpZmljYXRpb25zU2VydmljZS5zdWJzY3JpYmUoJ2xhbmd1YWdlX2NoYW5nZWQnLCBsYW5ndWFnZUNoYW5nZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRldGFjaGVkKCkge1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlLnVuc3Vic2NyaWJlKCdsYW5ndWFnZV9jaGFuZ2VkJywgbGFuZ3VhZ2VDaGFuZ2VkKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsYW5ndWFnZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgncXVlcnknLCBudWxsKS5yZXBsYWNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGb3JtKHF1ZXJ5KSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgaXNWYWxpZDogdHJ1ZSxcclxuICAgICAgICAgICAgZXJyb3JzOiB7fVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCFxdWVyeS5xdWVyeSkge1xyXG4gICAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXN1bHQucXVlcnkgPSAnUXVlcnlJc1JlcXVpcmVkJztcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHF1ZXJ5LnF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIGlmIChxdWVyeS5xdWVyeS5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnF1ZXJ5ID0gJ1F1ZXJ5SXNUb29TaG9ydCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWFyY2gocXVlcnkpIHtcclxuICAgICAgICB2bS52YWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVGb3JtKHF1ZXJ5KTtcclxuICAgICAgICBpZiAodm0udmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgc2VhcmNoIGhhbmRsZXJzIGFyZSBjdXJyZW50bHkgY29uZmlndXJlZCB0byByZWNlaXZlIG9ubHkgYSBxdWVyeSBzdHJpbmdcclxuICAgICAgICAgICAgdm0uc2VhcmNoSGFuZGxlcih7IHF1ZXJ5OiBxdWVyeSB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczogeyBcclxuICAgICAgICBzZXR0aW5nczogJzwnIFxyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IHNlYXJjaFN1Yk5hdkNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3NlYXJjaC9jb21wb25lbnRzL3NlYXJjaC1zdWItbmF2Lmh0bWwnXHJcbn07XHJcblxyXG5zZWFyY2hTdWJOYXZDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJHNjb3BlJywgXHJcbiAgICAnJGxvY2F0aW9uJywgXHJcbiAgICAnY2FzZUxhd01vZGFsJywgXHJcbiAgICAnbGFuZ3VhZ2UnLCBcclxuICAgICdzZWFyY2hTZXJ2aWNlJywgXHJcbiAgICAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLCBcclxuICAgICdmb3JtYXR0aW5nJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHNlYXJjaFN1Yk5hdkNvbnRyb2xsZXIoXHJcbiAgICAkc2NvcGUsIFxyXG4gICAgJGxvY2F0aW9uLCBcclxuICAgIGNhc2VMYXdNb2RhbCwgXHJcbiAgICBsYW5ndWFnZSwgXHJcbiAgICBzZWFyY2hTZXJ2aWNlLCBcclxuICAgIHN0YXRlLCBcclxuICAgIGZvcm1hdHRpbmdcclxuKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZS5nZXQoKSxcclxuICAgICAgICByZWZlcmVuY2VDb3VudHJ5OiBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSxcclxuICAgICAgICBzZWFyY2hBbHBoYWJldGljYWxJbmRleDogc2VhcmNoQWxwaGFiZXRpY2FsSW5kZXgsXHJcbiAgICAgICAgc2VhcmNoQW5ub3RhdGlvbnM6IHNlYXJjaEFubm90YXRpb25zLFxyXG4gICAgICAgIHNlYXJjaEJ0aXM6IHNlYXJjaEJ0aXMsXHJcbiAgICAgICAgc2VhcmNoQ2hlbWljYWxzOiBzZWFyY2hDaGVtaWNhbHMsXHJcbiAgICAgICAgc2VhcmNoQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uczogc2VhcmNoQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucyxcclxuICAgICAgICBzZWFyY2hDY2NDb25jbHVzaW9uczogc2VhcmNoQ2NjQ29uY2x1c2lvbnMsXHJcbiAgICAgICAgc2VhcmNoRXVFeHBsYW5hdG9yeU5vdGVzOiBzZWFyY2hFdUV4cGxhbmF0b3J5Tm90ZXMsXHJcbiAgICAgICAgc2VhcmNoR2VybWFuRXhwbGFuYXRvcnlOb3Rlczogc2VhcmNoR2VybWFuRXhwbGFuYXRvcnlOb3RlcyxcclxuICAgICAgICBzZWFyY2hUZXh0c0dlcm1hbkN1c3RvbXM6IHNlYXJjaFRleHRzR2VybWFuQ3VzdG9tcyxcclxuICAgICAgICBzZWFyY2hIZWFkaW5nczogc2VhcmNoSGVhZGluZ3MsXHJcbiAgICAgICAgc2VhcmNoV2NvQ2xhc3NpZmljYXRpb25PcGluaW9uczogc2VhcmNoV2NvQ2xhc3NpZmljYXRpb25PcGluaW9ucyxcclxuICAgICAgICBzZWFyY2hXY29FeHBsYW5hdG9yeU5vdGVzOiBzZWFyY2hXY29FeHBsYW5hdG9yeU5vdGVzLFxyXG4gICAgICAgIHNob3dDYXNlTGF3OiBzaG93Q2FzZUxhdyxcclxuICAgICAgICBzaG93SGVhZGluZ1N1Yk5hdkl0ZW06IHNob3dIZWFkaW5nU3ViTmF2SXRlbSxcclxuICAgICAgICBzaG93U3ViSGVhZGluZ1NlYXJjaDogc2hvd1N1YkhlYWRpbmdTZWFyY2gsXHJcbiAgICAgICAgc2VhcmNoQXRyczogc2VhcmNoQXRycyxcclxuICAgIH07XHJcbiAgICBcclxuICAgIHJldHVybiB2bTtcclxuICAgIFxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgdm0ucSA9IHNlYXJjaFNlcnZpY2UucGFyc2VMb2NhdGlvblNlYXJjaE9iamVjdCgkbG9jYXRpb24uc2VhcmNoKCkpO1xyXG4gICAgXHJcbiAgICAgICAgJHNjb3BlLiRvbignJGxvY2F0aW9uQ2hhbmdlU3VjY2VzcycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ucSA9IHNlYXJjaFNlcnZpY2UucGFyc2VMb2NhdGlvblNlYXJjaE9iamVjdCgkbG9jYXRpb24uc2VhcmNoKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlYXJjaEFubm90YXRpb25zKCkge1xyXG4gICAgICAgICRsb2NhdGlvbi5wYXRoKCcvc2VhcmNoL2Fubm90YXRpb25zJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2VhcmNoRXVFeHBsYW5hdG9yeU5vdGVzKCkge1xyXG4gICAgICAgICRsb2NhdGlvbi5wYXRoKCcvc2VhcmNoL2V4cGxhbmF0b3J5LW5vdGVzL2V1Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2VhcmNoR2VybWFuRXhwbGFuYXRvcnlOb3RlcygpIHtcclxuICAgICAgICAkbG9jYXRpb24ucGF0aCgnL3NlYXJjaC9leHBsYW5hdG9yeS1ub3Rlcy9nZXJtYW55Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2VhcmNoVGV4dHNHZXJtYW5DdXN0b21zKCkge1xyXG4gICAgICAgICRsb2NhdGlvbi5wYXRoKCcvc2VhcmNoL3RleHRzL2dlcm1hbnknKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWFyY2hIZWFkaW5ncygpIHtcclxuICAgICAgICB2YXIgc2VhcmNoICA9ICRsb2NhdGlvbi5zZWFyY2goKTtcclxuICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCdjb21tb2RpdHlDb2RlJywgJycpO1xyXG4gICAgICAgIGlmIChzZWFyY2gub3JkZXJCeSAhPT0gJ2NvbW1vZGl0eWNvZGUnICYmIHNlYXJjaC5vcmRlckJ5ICE9PSAncmVsZXZhbmNlJykge1xyXG4gICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCdvcmRlckJ5JywgJ3JlbGV2YW5jZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkbG9jYXRpb24ucGF0aCgnL3NlYXJjaC9oZWFkaW5nJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGZ1bmN0aW9uIHNlYXJjaFdjb0V4cGxhbmF0b3J5Tm90ZXMoKSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9zZWFyY2gvZXhwbGFuYXRvcnktbm90ZXMvd2NvJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2VhcmNoV2NvQ2xhc3NpZmljYXRpb25PcGluaW9ucygpIHtcclxuICAgICAgICAkbG9jYXRpb24ucGF0aCgnL3NlYXJjaC9jbGFzc2lmaWNhdGlvbnMvd2NvLycpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlYXJjaEJ0aXMoKSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9idGkvc2VhcmNoJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGZ1bmN0aW9uIHNlYXJjaEFscGhhYmV0aWNhbEluZGV4KCkge1xyXG4gICAgICAgICRsb2NhdGlvbi5wYXRoKCcvc2VhcmNoL2FscGhhYmV0aWNhbC1pbmRleCcpO1xyXG4gICAgfVxyXG5cclxuICAgICAgICBcclxuICAgIGZ1bmN0aW9uIHNlYXJjaEF0cnMoKSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9hdHIvc2VhcmNoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2VhcmNoQ2hlbWljYWxzKCkge1xyXG4gICAgICAgICRsb2NhdGlvbi5wYXRoKCcvZWNpY3Mvc2VhcmNoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2VhcmNoQ2NjQ29uY2x1c2lvbnMoKSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9zZWFyY2gvY2NjLWNvbmNsdXNpb25zJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGZ1bmN0aW9uIHNlYXJjaENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnMoKSB7XHJcbiAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy8nICsgdm0ubGFuZ3VhZ2UgKyAnL3NlYXJjaCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dTdWJIZWFkaW5nU2VhcmNoKCkge1xyXG4gICAgICAgICRsb2NhdGlvbi5wYXRoKCcvc2VhcmNoL3RyZWUnKS5zZWFyY2goeyBcclxuICAgICAgICAgICAgY29tbW9kaXR5Q29kZTogZm9ybWF0dGluZy5yZW1vdmVUcmFpbGluZ1plcm9zKHZtLnEuY29tbW9kaXR5Q29kZSksXHJcbiAgICAgICAgICAgIHF1ZXJ5OiB2bS5xLnF1ZXJ5IFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dIZWFkaW5nU3ViTmF2SXRlbSgpIHtcclxuICAgICAgICByZXR1cm4gdm0ucS5jb21tb2RpdHlDb2RlICYmIGZvcm1hdHRpbmcuaXNIZWFkaW5nQ29kZSh2bS5xLmNvbW1vZGl0eUNvZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dDYXNlTGF3KCkge1xyXG4gICAgICAgIGNhc2VMYXdNb2RhbC5zaG93KHZtLnEuY29tbW9kaXR5Q29kZSwgdm0ucS5xdWVyeSk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFtcclxuICAgICckYW5hbHl0aWNzJyxcclxuICAgICckZWxlbWVudCcsXHJcbiAgICAnJGxvY2F0aW9uJyxcclxuICAgICckdGltZW91dCcsXHJcbiAgICAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLFxyXG4gICAgJ3NlYXJjaFNlcnZpY2UnLFxyXG4gICAgJ3RyYWRlTW92ZW1lbnRTZXJ2aWNlJyxcclxuICAgIHNlYXJjaEJveENvbnRyb2xsZXJdO1xyXG5cclxuZnVuY3Rpb24gc2VhcmNoQm94Q29udHJvbGxlcigkYW5hbHl0aWNzLCAkZWxlbWVudCwgJGxvY2F0aW9uLCAkdGltZW91dCwgc3RhdGUsIHNlYXJjaFNlcnZpY2UsIHRyYWRlTW92ZW1lbnQpIHtcclxuXHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJHBvc3RMaW5rOiBsaW5rLFxyXG4gICAgICAgIGZpbHRlcjogc3RhdGUuZmlsdGVyLFxyXG4gICAgICAgIHNlYXJjaDogc2VhcmNoLFxyXG4gICAgICAgIHNlYXJjaFRlcm06ICcnLFxyXG4gICAgICAgIHNldE1vdmVtZW50OiBzZXRNb3ZlbWVudFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBsaW5rKCkge1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHZhciBmb3JtRWwgPSAkZWxlbWVudFswXTtcclxuICAgICAgICAgICAgdmFyIGlucHV0RWwgPSBmb3JtRWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnanMtYXV0b2ZvY3VzJylbMF07XHJcbiAgICAgICAgICAgIGlmIChpbnB1dEVsKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dEVsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWFyY2goKSB7XHJcbiAgICAgICAgdmFyIHF1ZXJ5ID0gdm0uc2VhcmNoVGVybTtcclxuICAgICAgICB2YXIgcXVlcnlPYmplY3QgPSBzZWFyY2hTZXJ2aWNlLnBhcnNlUXVlcnkocXVlcnkpO1xyXG4gICAgICAgIHF1ZXJ5T2JqZWN0LmluY2x1ZGVCdGlzID0gdHJ1ZTtcclxuICAgICAgICBxdWVyeU9iamVjdC5pbmNsdWRlQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucyA9IHRydWU7XHJcbiAgICAgICAgaWYgKHF1ZXJ5T2JqZWN0Lm1vdmVtZW50KSB7XHJcbiAgICAgICAgICAgIHNldE1vdmVtZW50KHF1ZXJ5T2JqZWN0Lm1vdmVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHF1ZXJ5T2JqZWN0LmNvdW50cnkpIHtcclxuICAgICAgICAgICAgc3RhdGUuZmlsdGVyLmNvdW50cnlDb2RlID0gcXVlcnlPYmplY3QuY291bnRyeTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHF1ZXJ5T2JqZWN0LnF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5T2JqZWN0Lm9yZGVyQnkgPSAncmVsZXZhbmNlJztcclxuICAgICAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdzZWFyY2gtdGV4dCcsIHsgdmFsdWU6IHF1ZXJ5IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdzZWFyY2gtY29kZScsIHsgdmFsdWU6IHF1ZXJ5IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcXVlcnlTdHJpbmcgPSBzZWFyY2hTZXJ2aWNlLnNlcmlhbGl6ZVF1ZXJ5KHF1ZXJ5T2JqZWN0KTtcclxuXHJcbiAgICAgICAgdm0uc2VhcmNoVGVybSA9ICcnO1xyXG4gICAgICAgIGlmIChxdWVyeU9iamVjdC5jb21tb2RpdHlDb2RlICYmIHF1ZXJ5T2JqZWN0LmNvbW1vZGl0eUNvZGUubGVuZ3RoID49IDQpIHtcclxuICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoJ3NlYXJjaC90cmVlJykuc2VhcmNoKHF1ZXJ5U3RyaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCdzZWFyY2gvaGVhZGluZycpLnNlYXJjaChxdWVyeVN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNldE1vdmVtZW50KG1vdmVtZW50VHlwZSkge1xyXG4gICAgICAgIHRyYWRlTW92ZW1lbnQuc2V0KG1vdmVtZW50VHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0gWydjb21tb24nLCAnY291bnRyeURhdGFTZXJ2aWNlJywgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgc2VhcmNoU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBzZWFyY2hTZXJ2aWNlKGNvbW1vbiwgY291bnRyeURhdGFTZXJ2aWNlLCBzdGF0ZSkge1xyXG5cclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGNyZWF0ZVF1ZXJ5RnJvbUxhc3RRdWVyeTogY3JlYXRlUXVlcnlGcm9tTGFzdFF1ZXJ5LFxyXG4gICAgICAgIHBhcnNlUXVlcnk6IHBhcnNlUXVlcnksXHJcbiAgICAgICAgc2VyaWFsaXplUXVlcnk6IHNlcmlhbGl6ZVF1ZXJ5LFxyXG4gICAgICAgIHBhcnNlTG9jYXRpb25TZWFyY2hPYmplY3Q6IHBhcnNlTG9jYXRpb25TZWFyY2hPYmplY3RcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gcGFyc2VMb2NhdGlvblNlYXJjaE9iamVjdChsb2NhdGlvblNlYXJjaE9iamVjdCkge1xyXG4gICAgICAgIHZhciBxdWVyeU9iamVjdCA9IF8uY2xvbmUobG9jYXRpb25TZWFyY2hPYmplY3QpO1xyXG4gICAgICAgIHF1ZXJ5T2JqZWN0LmluY2x1ZGVCdGlzID0gKHF1ZXJ5T2JqZWN0LmluY2x1ZGVCdGlzID09PSAndHJ1ZScpO1xyXG4gICAgICAgIHF1ZXJ5T2JqZWN0LmluY2x1ZGVDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zID0gKHF1ZXJ5T2JqZWN0LmluY2x1ZGVDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zID09PSAndHJ1ZScpO1xyXG4gICAgICAgIHF1ZXJ5T2JqZWN0LmluY2x1ZGVDYXNlTGF3ID0gKHF1ZXJ5T2JqZWN0LmluY2x1ZGVDYXNlTGF3ID09PSAndHJ1ZScpOyAgICAgIFxyXG4gICAgICAgIHJldHVybiBxdWVyeU9iamVjdDsgXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY3JlYXRlUXVlcnlGcm9tTGFzdFF1ZXJ5KGxhc3RRdWVyeSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbW1vZGl0eUNvZGU6IGxhc3RRdWVyeS5DdXJyZW50Q29tbW9kaXR5Q29kZSxcclxuICAgICAgICAgICAgcXVlcnk6IGxhc3RRdWVyeS5RdWVyeVN0cmluZyxcclxuICAgICAgICAgICAgaW5jbHVkZUJ0aXM6IGxhc3RRdWVyeS5JbmNsdWRlQnRpcyxcclxuICAgICAgICAgICAgaW5jbHVkZUNhc2VMYXc6IGxhc3RRdWVyeS5JbmNsdWRlRHV0Y2hDYXNlTGF3IHx8IGxhc3RRdWVyeS5JbmNsdWRlRXVDYXNlTGF3LFxyXG4gICAgICAgICAgICBpbmNsdWRlQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uczogbGFzdFF1ZXJ5LkluY2x1ZGVDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXJpYWxpemVRdWVyeShxdWVyeU9iamVjdCkge1xyXG4gICAgICAgIHJldHVybiBfLmNoYWluKHF1ZXJ5T2JqZWN0KVxyXG4gICAgICAgICAgICAudG9QYWlycygpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24ocGFpcikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhaXJbMF0gIT09ICdyYXdRdWVyeScgJiYgISFwYWlyWzFdO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uKHBhaXIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQocGFpclswXSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFpclsxXSk7IFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuam9pbignJicpXHJcbiAgICAgICAgICAgIC52YWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnkocmF3UXVlcnlTdHJpbmcpIHtcclxuICAgICAgICB2YXIgcXVlcnlPYmplY3QgPSB7fTtcclxuICAgICAgICB2YXIgd29yZHMgPSBbXTtcclxuICAgICAgICB2YXIgaW1wb3J0TWF0Y2hlcyA9IFsnaW1wb3J0JywgJ2lucG9ydCcsICdpbXAnLCAnaW52b2VyJ107XHJcbiAgICAgICAgdmFyIGV4cG9ydE1hdGNoZXMgPSBbJ2V4cG9ydCcsICdleHAnLCAndWl0dm9lciddO1xyXG5cclxuICAgICAgICBjb21tb24uYXV0aC5jaGVjaygpO1xyXG5cclxuICAgICAgICBxdWVyeU9iamVjdC5yYXdRdWVyeSA9IHJhd1F1ZXJ5U3RyaW5nO1xyXG5cclxuICAgICAgICB2YXIgbnVtYmVyUGF0dGVybiA9IC9eXFxzKig/OlswLTldezJ9W1xccy5dKil7MSw1fSg/OltcXHMuXT9bMC05XSk/JC87XHJcblxyXG4gICAgICAgIGlmIChyYXdRdWVyeVN0cmluZykge1xyXG4gICAgICAgICAgICB3b3JkcyA9IHJhd1F1ZXJ5U3RyaW5nLnRvTG93ZXJDYXNlKCkuc3BsaXQoJyAnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW1wb3J0TWF0Y2hlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZm91bmRJbmRleCA9IHdvcmRzLmluZGV4T2YoaW1wb3J0TWF0Y2hlc1tpXSk7XHJcbiAgICAgICAgICAgIGlmIChmb3VuZEluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIHF1ZXJ5T2JqZWN0Lm1vdmVtZW50ID0gJ2ltcG9ydCc7XHJcbiAgICAgICAgICAgICAgICB3b3Jkcy5zcGxpY2UoZm91bmRJbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRNYXRjaGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBmb3VuZEluZGV4ID0gd29yZHMuaW5kZXhPZihleHBvcnRNYXRjaGVzW2ldKTtcclxuICAgICAgICAgICAgaWYgKGZvdW5kSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgcXVlcnlPYmplY3QubW92ZW1lbnQgPSAnZXhwb3J0JztcclxuICAgICAgICAgICAgICAgIHdvcmRzLnNwbGljZShmb3VuZEluZGV4LCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgY291bnRyeSBjb2Rlc1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGZvdW5kQ291bnRyeUNvZGVzID0gXy5maWx0ZXIoY291bnRyeURhdGFTZXJ2aWNlLmVyZ2FPbW5lc0NvdW50cmllcywgZnVuY3Rpb24gKGl0ZW0pIHsgXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5jb2RlLnRvVXBwZXJDYXNlKCkgPT09IHdvcmRzW2ldLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoZm91bmRDb3VudHJ5Q29kZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcXVlcnlPYmplY3QuY291bnRyeSA9IGZvdW5kQ291bnRyeUNvZGVzWzBdLmNvZGU7XHJcbiAgICAgICAgICAgICAgICB3b3Jkcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBjb3VudHJ5IG5hbWVzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZm91bmRDb3VudHJ5TmFtZXMgPSBfLmZpbHRlcihjb3VudHJ5RGF0YVNlcnZpY2UuZXJnYU9tbmVzQ291bnRyaWVzLCBmdW5jdGlvbiAoaXRlbSkgeyBcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gd29yZHNbaV0udG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChmb3VuZENvdW50cnlOYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBxdWVyeU9iamVjdC5jb3VudHJ5ID0gZm91bmRDb3VudHJ5TmFtZXNbMF0uY29kZTtcclxuICAgICAgICAgICAgICAgIHdvcmRzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZm91bmRDb2RlID0gJyc7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobnVtYmVyUGF0dGVybi50ZXN0KHdvcmRzW2ldKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzQWxsb3dlZENvZGUod29yZHNbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm91bmRDb2RlICs9IHdvcmRzW2ldLnJlcGxhY2VBbGwoJy4nLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgd29yZHMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGktLTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZm91bmRDb2RlID09PSAnJykge1xyXG4gICAgICAgICAgICBxdWVyeU9iamVjdC5jb21tb2RpdHlDb2RlID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChmb3VuZENvZGUubGVuZ3RoID4gMTApIHtcclxuICAgICAgICAgICAgICAgIGZvdW5kQ29kZSA9IGZvdW5kQ29kZS5zdWJzdHJpbmcoMCwgMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHF1ZXJ5T2JqZWN0LmNvbW1vZGl0eUNvZGUgPSBjb21tb24uZm9ybWF0dGluZy5yZW1vdmVUcmFpbGluZ1plcm9zKGZvdW5kQ29kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBxdWVyeU9iamVjdC5xdWVyeSA9IHdvcmRzLmpvaW4oJyAnKTtcclxuICAgICAgICByZXR1cm4gcXVlcnlPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaXNBbGxvd2VkQ29kZSh3b3JkKSB7XHJcbiAgICAgICAgaWYgKHdvcmQuaW5kZXhPZignMDAnKSA9PT0gMCB8fCB3b3JkLmluZGV4T2YoJzc3JykgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAod29yZC5pbmRleE9mKCc5OScpID09PSAwICYmIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID09PSAnR0InKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcbn0iLCJhbmd1bGFyLm1vZHVsZSgndGFyaWMudGFyZXMnLCBbXSlcclxuICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIC8vIENvbXBvbmVudHNcclxuICAgIC5jb21wb25lbnQoJ3RhcmVzTWVhc3VyZXNQYWdlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3RhcmVzLW1lYXN1cmVzLXBhZ2UnKSlcclxuICAgIC8vIFNlcnZpY2VzXHJcbiAgICAuZmFjdG9yeSgndGFyZXNTdGF0aXN0aWNhbEtleXNEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvdGFyZXMtc3RhdGlzdGljYWwta2V5cy1kYXRhJykpXHJcbiAgICAuZmFjdG9yeSgndGFyZXNUYXJpZmZEYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvdGFyZXMtdGFyaWZmLWRhdGEnKSlcclxuICAgIDtcclxuXHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL3RhcmVzLW1lYXN1cmVzLzpjb21tb2RpdHlDb2RlJywge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzx0YXJlcy1tZWFzdXJlcy1wYWdlPjwvdGFyZXMtbWVhc3VyZXMtcGFnZT4nXHJcbiAgICAgICAgfSlcclxuICAgIDtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IHRhcmVzTWVhc3VyZXNQYWdlQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAndGFyZXMvY29tcG9uZW50cy90YXJlcy1tZWFzdXJlcy1wYWdlLmh0bWwnXHJcbn07XHJcblxyXG50YXJlc01lYXN1cmVzUGFnZUNvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICckYW5hbHl0aWNzJyxcclxuICAgICckbG9jYXRpb24nLFxyXG4gICAgJyRyb3V0ZVBhcmFtcycsIFxyXG4gICAgJ2NvbW1vbicsXHJcbiAgICAnYXBwbGljYXRpb25TdGF0ZVNlcnZpY2UnLFxyXG4gICAgJ2NvdW50cnlEYXRhU2VydmljZScsXHJcbiAgICAnY291bnRyeU1vZGFscycsXHJcbiAgICAnbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2UnLFxyXG4gICAgJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJywgXHJcbiAgICAncHJlZmVyZW5jZVNlcnZpY2UnLFxyXG4gICAgJ3JlZ2lvbkRhdGFTZXJ2aWNlJyxcclxuICAgICd0YXJlc1N0YXRpc3RpY2FsS2V5c0RhdGFTZXJ2aWNlJyxcclxuICAgICd0YXJlc1RhcmlmZkRhdGFTZXJ2aWNlJywgXHJcbl07XHJcblxyXG5mdW5jdGlvbiB0YXJlc01lYXN1cmVzUGFnZUNvbnRyb2xsZXIoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICRsb2NhdGlvbixcclxuICAgICRyb3V0ZVBhcmFtcyxcclxuICAgIGNvbW1vbixcclxuICAgIHN0YXRlLFxyXG4gICAgY291bnRyeURhdGFTZXJ2aWNlLFxyXG4gICAgY291bnRyeU1vZGFscyxcclxuICAgIG5vbWVuY2xhdHVyZURhdGFTZXJ2aWNlLFxyXG4gICAgbm90aWZpY2F0aW9ucyxcclxuICAgIHByZWZlcmVuY2VzLFxyXG4gICAgcmVnaW9uRGF0YVNlcnZpY2UsXHJcbiAgICB0YXJlc1N0YXRpc3RpY2FsS2V5c0RhdGFTZXJ2aWNlLFxyXG4gICAgdGFyZXNUYXJpZmZEYXRhU2VydmljZVxyXG4pIHtcclxuICAgIFxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRvbkRlc3Ryb3k6IGRldGFjaGVkLFxyXG4gICAgICAgIGVyZ2FPbW5lc0NvdW50cmllczogY291bnRyeURhdGFTZXJ2aWNlLmVyZ2FPbW5lc0NvdW50cmllcyxcclxuICAgICAgICBvbkNsaWNrRGVzY3JpcHRpb25MaW5lOiBvbkNsaWNrRGVzY3JpcHRpb25MaW5lLFxyXG4gICAgICAgIG9uQ2xpY2tSZWdpb246IG9uQ2xpY2tSZWdpb24sXHJcbiAgICAgICAgb25TZWxlY3RDdXN0b21zUmVsaWVmQ29kZTogb25TZWxlY3RDdXN0b21zUmVsaWVmQ29kZSxcclxuICAgICAgICBvblNlbGVjdFN0YXRpc3RpY2FsS2V5OiBvblNlbGVjdFN0YXRpc3RpY2FsS2V5LFxyXG4gICAgICAgIGNvdW50cnlQaWNrZXJTZWxlY3Rpb25DaGFuZ2VkOiBjb3VudHJ5UGlja2VyU2VsZWN0aW9uQ2hhbmdlZCxcclxuICAgICAgICBpbnB1dDoge1xyXG4gICAgICAgICAgICBjb21tb2RpdHlDb2RlOiBudWxsLFxyXG4gICAgICAgICAgICBsYW5ndWFnZUlkOiBnZXRMYW5ndWFnZSgpLFxyXG4gICAgICAgICAgICBzdGF0aXN0aWNhbEtleTogMCxcclxuICAgICAgICAgICAgY3VzdG9tc1JlbGllZkNvZGU6IDBcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgc3RhdGU6IHN0YXRlLFxyXG4gICAgICAgIHRhcmlmZk1hc3RlckRhdGE6IG51bGxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIG9uU2VsZWN0Q3VzdG9tc1JlbGllZkNvZGUoY3VzdG9tc1JlbGllZkNvZGUpIHtcclxuICAgICAgICB2bS5pbnB1dC5jdXN0b21zUmVsaWVmQ29kZSA9IGN1c3RvbXNSZWxpZWZDb2RlO1xyXG4gICAgICAgIHRhcmVzVGFyaWZmRGF0YVNlcnZpY2UuZmlsdGVyVGFyaWZmRGF0YUJ5Q3VzdG9tc1JlbGllZkNvZGUodm0udGFyaWZmTWFzdGVyRGF0YSwgdm0uaW5wdXQuY3VzdG9tc1JlbGllZkNvZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG9uU2VsZWN0U3RhdGlzdGljYWxLZXkoa2V5KSB7XHJcbiAgICAgICAgdm0uaW5wdXQuc3RhdGlzdGljYWxLZXkgPSBrZXk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0TGFuZ3VhZ2UoKSB7XHJcbiAgICAgICAgdmFyIGxhbmd1YWdlID0gY29tbW9uLmxhbmd1YWdlLmdldCgpO1xyXG4gICAgICAgIGlmIChsYW5ndWFnZSAhPT0gJ2VuJyAmJiBsYW5ndWFnZSAhPT0gJ2RlJyAmJiBsYW5ndWFnZSAhPT0gJ2ZyJyAmJiBsYW5ndWFnZSAhPT0gJ2l0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ0VOJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxhbmd1YWdlLnRvVXBwZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYXR0YWNoZWQoKSB7XHJcbiAgICAgICAgaWYgKCEkcm91dGVQYXJhbXMuY29tbW9kaXR5Q29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE86IGl0IG1heSBiZSBiZXR0ZXIgdG8gY3JlYXRlIGEgY29tcG9uZW50IGZvciB0aGUgVEFSRVMgdGFyaWZmIGRhdGEsXHJcbiAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gcmUtdXNlIHRoZSBzYW1lIHVybCBhcyBmb3IgdGhlIG90aGVyIHRyYWRlIHRhcmlmZnNcclxuICAgICAgICBpZiAoc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgIT09ICdDSCcpIHtcclxuICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoJy9nb29kLycgKyAkcm91dGVQYXJhbXMuY29tbW9kaXR5Q29kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvdGFyZXMtbWVhc3VyZXMnKTtcclxuICAgICAgICB2bS5pbnB1dC5jb21tb2RpdHlDb2RlID0gJHJvdXRlUGFyYW1zLmNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgbG9hZFRhcmlmZkRhdGEoJHJvdXRlUGFyYW1zLmNvbW1vZGl0eUNvZGUpO1xyXG4gICAgICAgIGxvYWRTdGF0aXN0aWNhbEtleXMoJHJvdXRlUGFyYW1zLmNvbW1vZGl0eUNvZGUpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMuc3Vic2NyaWJlKCdmaWx0ZXJfZGF0ZV9jaGFuZ2VkJywgZGF0ZUNoYW5nZWQpO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMuc3Vic2NyaWJlKCdmaWx0ZXJfbW92ZW1lbnRfY2hhbmdlZCcsIG1vdmVtZW50Q2hhbmdlZCk7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy5zdWJzY3JpYmUoJ2xhbmd1YWdlX2NoYW5nZWQnLCBsYW5ndWFnZUNoYW5nZWQpO1xyXG5cclxuICAgICAgICAvLyBlcmdhT21uZXNDb3VudHJpZXNcclxuICAgICAgICAvLyBjb3VudHJ5UGlja2VyU2VsZWN0aW9uQ2hhbmdlZChjb3VudHJ5LCByZW1lbWJlckNvdW50cnkpXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY291bnRyeVBpY2tlclNlbGVjdGlvbkNoYW5nZWQoY291bnRyeSwgcmVtZW1iZXJDb3VudHJ5KSB7XHJcbiAgICAgICAgdmFyIGNvdW50cnlIYXNDaGFuZ2VkID0gc3RhdGUuY291bnRyeUhhc0NoYW5nZWQoY291bnRyeSk7XHJcbiAgICAgICAgc3RhdGUudXBkYXRlQ291bnRyeUZpbHRlcihjb3VudHJ5LCByZW1lbWJlckNvdW50cnkpO1xyXG4gICAgICAgIGlmIChyZW1lbWJlckNvdW50cnkgJiYgY291bnRyeSkge1xyXG4gICAgICAgICAgICBwcmVmZXJlbmNlcy5zYXZlQ291bnRyeVByZWZlcmVuY2UoY291bnRyeSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJlZmVyZW5jZXMuY2xlYXJDb3VudHJ5UHJlZmVyZW5jZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY291bnRyeUhhc0NoYW5nZWQpIHtcclxuICAgICAgICAgICAgdGFyZXNUYXJpZmZEYXRhU2VydmljZS5maWx0ZXJUYXJpZmZEYXRhQnlDb3VudHJ5KHZtLnRhcmlmZk1hc3RlckRhdGEsIGNvdW50cnkgPyBjb3VudHJ5LmNvZGUgOiBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy51bnN1YnNjcmliZSgnZmlsdGVyX2RhdGVfY2hhbmdlZCcsIGRhdGVDaGFuZ2VkKTtcclxuICAgICAgICBub3RpZmljYXRpb25zLnVuc3Vic2NyaWJlKCdmaWx0ZXJfbW92ZW1lbnRfY2hhbmdlZCcsIG1vdmVtZW50Q2hhbmdlZCk7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy51bnN1YnNjcmliZSgnbGFuZ3VhZ2VfY2hhbmdlZCcsIGxhbmd1YWdlQ2hhbmdlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGF0ZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgbG9hZFRhcmlmZkRhdGEoJHJvdXRlUGFyYW1zLmNvbW1vZGl0eUNvZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1vdmVtZW50Q2hhbmdlZCgpIHtcclxuICAgICAgICAkbG9jYXRpb24udXJsKCcvc2VhcmNoLycgKyAkcm91dGVQYXJhbXMuY29tbW9kaXR5Q29kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbGFuZ3VhZ2VDaGFuZ2VkKCkge1xyXG4gICAgICAgIGxvYWRUYXJpZmZEYXRhKCRyb3V0ZVBhcmFtcy5jb21tb2RpdHlDb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvbkNsaWNrRGVzY3JpcHRpb25MaW5lKGNvbW1vZGl0eUNvZGUsIGluZGVudGF0aW9uKSB7XHJcbiAgICAgICAgc3RhdGUuY3VycmVudENvZGUgPSBjb21tb2RpdHlDb2RlO1xyXG4gICAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uO1xyXG4gICAgICAgIHN0YXRlLm5hdmlnYXRpbmdGcm9tTWVhc3VyZXNQYWdlID0gdHJ1ZTtcclxuICAgICAgICAkbG9jYXRpb24udXJsKCdzZWFyY2gvJyArIGNvbW1vZGl0eUNvZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRTdGF0aXN0aWNhbEtleXMoY29tbW9kaXR5Q29kZSkge1xyXG4gICAgICAgIHJldHVybiB0YXJlc1N0YXRpc3RpY2FsS2V5c0RhdGFTZXJ2aWNlLmxvYWRTdGF0aXN0aWNhbEtleXMoY29tbW9kaXR5Q29kZSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHN0YXRpc3RpY2FsS2V5cykge1xyXG4gICAgICAgICAgICAgICAgdm0uc3RhdGlzdGljYWxLZXlzID0gc3RhdGlzdGljYWxLZXlzO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG9uQ2xpY2tSZWdpb24ocmVnaW9uKSB7XHJcbiAgICAgICAgY291bnRyeU1vZGFscy5yZWdpb24uc2hvdyhyZWdpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRUYXJpZmZEYXRhKGNvbW1vZGl0eUNvZGUpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBub21lbmNsYXR1cmVEYXRhU2VydmljZS5pc0RlY2xhcmFibGUoY29tbW9kaXR5Q29kZSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oaXNEZWNsYXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzRGVjbGFyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICRsb2NhdGlvbi51cmwoJ3NlYXJjaC8nICsgY29tbW9kaXR5Q29kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21tb24uJHEuYWxsKFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZXNUYXJpZmZEYXRhU2VydmljZS5sb2FkVGFyaWZmRGF0YShjb21tb2RpdHlDb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHRhcmlmZk1hc3RlckRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2godGFyaWZmTWFzdGVyRGF0YS5SZXN1bHQuQ3VzdG9tc1JlbGllZkNvZGVzLCBmdW5jdGlvbiAoY3VzdG9tc1JlbGllZkNvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1c3RvbXNSZWxpZWZDb2RlLlJlbGllZkNvZGVPblRhcmlmZkxpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmlucHV0LmN1c3RvbXNSZWxpZWZDb2RlID0gY3VzdG9tc1JlbGllZkNvZGUuUmVsaWVmQ29kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0YXJpZmZNYXN0ZXJEYXRhLlJlc3VsdC5DdXN0b21zUmVsaWVmQ29kZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHZtLmlucHV0LmN1c3RvbXNSZWxpZWZDb2RlID0gdGFyaWZmTWFzdGVyRGF0YS5SZXN1bHQuQ3VzdG9tc1JlbGllZkNvZGVzWzBdLlJlbGllZkNvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVzVGFyaWZmRGF0YVNlcnZpY2UuZmlsdGVyVGFyaWZmRGF0YUJ5VHJhZGVNb3ZlbWVudCh0YXJpZmZNYXN0ZXJEYXRhLCB2bS5zdGF0ZS5maWx0ZXIubW92ZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVzVGFyaWZmRGF0YVNlcnZpY2UuZmlsdGVyVGFyaWZmRGF0YUJ5Q3VzdG9tc1JlbGllZkNvZGUodGFyaWZmTWFzdGVyRGF0YSwgdm0uaW5wdXQuY3VzdG9tc1JlbGllZkNvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVzVGFyaWZmRGF0YVNlcnZpY2UuZmlsdGVyVGFyaWZmRGF0YUJ5Q291bnRyeSh0YXJpZmZNYXN0ZXJEYXRhLCB2bS5zdGF0ZS5maWx0ZXIuY291bnRyeUNvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLnRhcmlmZk1hc3RlckRhdGEgPSB0YXJpZmZNYXN0ZXJEYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJpZmZNYXN0ZXJEYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vbWVuY2xhdHVyZURhdGFTZXJ2aWNlLmxvYWREZXNjcmlwdGlvbihjb21tb2RpdHlDb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uRGF0YVNlcnZpY2UuZ2V0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlZ2lvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5yZWdpb25zID0gXy5rZXlCeShyZWdpb25zLCAnY29kZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICBdKS50aGVuKGZ1bmN0aW9uKHJlc3VsdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IFtcclxuICAgICdjb21tb24nLCBcclxuICAgICdkYXRhQ29udGV4dCcsIFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJyxcclxuICAgIHRhcmVzU3RhdGlzdGljYWxLZXlzRGF0YVNlcnZpY2VcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHRhcmVzU3RhdGlzdGljYWxLZXlzRGF0YVNlcnZpY2UoXHJcbiAgICBjb21tb24sIFxyXG4gICAgZGF0YUNvbnRleHQsXHJcbiAgICBzdGF0ZVxyXG4pIHtcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGxvYWRTdGF0aXN0aWNhbEtleXM6IGxvYWRTdGF0aXN0aWNhbEtleXNcclxuICAgIH07XHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkU3RhdGlzdGljYWxLZXlzKGNvbW1vZGl0eUNvZGUpIHtcclxuICAgICAgICB2YXIgZGVmZXJyZWQgPSBjb21tb24uJHEuZGVmZXIoKTtcclxuICAgICAgICBpZiAoc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgPT09ICdDSCcpIHtcclxuICAgICAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvdGFyZXMtc3RhdGlzdGljYWwta2V5cycgK1xyXG4gICAgICAgICAgICAgICAgJz9nb29kc2NvZGU9JyArIGNvbW1vZGl0eUNvZGUgK1xyXG4gICAgICAgICAgICAgICAgJyZtb3ZlbWVudD0nICsgc3RhdGUuZmlsdGVyLm1vdmVtZW50ICtcclxuICAgICAgICAgICAgICAgICcmbGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICArXHJcbiAgICAgICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcbiAgICBcclxuICAgICAgICAgICAgZGF0YUNvbnRleHQuZ2V0KHVybClcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFtcclxuICAgICdjb21tb24nLCBcclxuICAgICdkYXRhQ29udGV4dCcsIFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJyxcclxuICAgICdjb3VudHJ5RGF0YVNlcnZpY2UnLFxyXG4gICAgdGFyZXNUYXJpZmZEYXRhU2VydmljZVxyXG5dO1xyXG5cclxuZnVuY3Rpb24gdGFyZXNUYXJpZmZEYXRhU2VydmljZShcclxuICAgIGNvbW1vbiwgXHJcbiAgICBkYXRhQ29udGV4dCxcclxuICAgIHN0YXRlLFxyXG4gICAgY291bnRyeURhdGFTZXJ2aWNlXHJcbikge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgbG9hZFRhcmlmZkRhdGE6IGxvYWRUYXJpZmZEYXRhLFxyXG4gICAgICAgIGZpbHRlclRhcmlmZkRhdGFCeUN1c3RvbXNSZWxpZWZDb2RlOiBmaWx0ZXJUYXJpZmZEYXRhQnlDdXN0b21zUmVsaWVmQ29kZSxcclxuICAgICAgICBmaWx0ZXJUYXJpZmZEYXRhQnlDb3VudHJ5OiBmaWx0ZXJUYXJpZmZEYXRhQnlDb3VudHJ5LFxyXG4gICAgICAgIGZpbHRlclRhcmlmZkRhdGFCeVRyYWRlTW92ZW1lbnQ6IGZpbHRlclRhcmlmZkRhdGFCeVRyYWRlTW92ZW1lbnRcclxuICAgIH07XHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkVGFyaWZmRGF0YShjb21tb2RpdHlDb2RlKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHNbY29tbW9uLmNvbmZpZy5jdXJyZW50QXBpXSArICcvdGFyZXMtbWVhc3VyZXMvJyArIGNvbW1vZGl0eUNvZGUgK1xyXG4gICAgICAgICAgICAnP21vdmVtZW50PScgKyBzdGF0ZS5maWx0ZXIubW92ZW1lbnQgK1xyXG4gICAgICAgICAgICAnJmxhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSAgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5O1xyXG5cclxuICAgICAgICBpZiAoc3RhdGUuZmlsdGVyLmRhdGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdXJsICs9ICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZmlsdGVyVGFyaWZmRGF0YUJ5Q3VzdG9tc1JlbGllZkNvZGUodGFyaWZmTWFzdGVyRGF0YSwgY3VzdG9tc1JlbGllZkNvZGUpIHtcclxuICAgICAgICB0YXJpZmZNYXN0ZXJEYXRhLlJlc3VsdC5EdXR5UmF0ZXMgPSBfLm1hcCh0YXJpZmZNYXN0ZXJEYXRhLlJlc3VsdC5EdXR5UmF0ZXMsIGZ1bmN0aW9uKGR1dHlSYXRlKSB7XHJcbiAgICAgICAgICAgIGR1dHlSYXRlLmlzVmFsaWRGb3JDdXN0b21zUmVsaWVmQ29kZSA9IChkdXR5UmF0ZS5DdXN0b21zRmF2b3VyQ29kZSA9PT0gY3VzdG9tc1JlbGllZkNvZGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gZHV0eVJhdGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZmlsdGVyVGFyaWZmRGF0YUJ5Q291bnRyeSh0YXJpZmZNYXN0ZXJEYXRhLCBjb3VudHJ5KSB7XHJcbiAgICAgICAgaWYgKCF0YXJpZmZNYXN0ZXJEYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0YXJpZmZNYXN0ZXJEYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0YXJpZmZNYXN0ZXJEYXRhLlJlc3VsdC5EdXR5UmF0ZXMgPSBfLm1hcCh0YXJpZmZNYXN0ZXJEYXRhLlJlc3VsdC5EdXR5UmF0ZXMsIGZ1bmN0aW9uIChkdXR5UmF0ZSkge1xyXG4gICAgICAgICAgICBkdXR5UmF0ZS5pc1ZhbGlkRm9yQ291bnRyeSA9IGR1dHlSYXRlSXNWYWxpZEZvckNvdW50cnkoZHV0eVJhdGUsIGNvdW50cnkpO1xyXG4gICAgICAgICAgICByZXR1cm4gZHV0eVJhdGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGFyaWZmTWFzdGVyRGF0YS5SZXN1bHQuU3RhdGlzdGljYWxDb2RlcyA9IF8ubWFwKHRhcmlmZk1hc3RlckRhdGEuUmVzdWx0LlN0YXRpc3RpY2FsQ29kZXMsIGZ1bmN0aW9uKHN0YXRpc3RpY2FsQ29kZSkge1xyXG4gICAgICAgICAgICBzdGF0aXN0aWNhbENvZGUuQWRkaXRpb25hbFRheGVzID0gXy5tYXAoc3RhdGlzdGljYWxDb2RlLkFkZGl0aW9uYWxUYXhlcywgZnVuY3Rpb24gKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgICAgIG1lYXN1cmUuaXNWYWxpZEZvckNvdW50cnkgPSBtZWFzdXJlSXNWYWxpZEZvckNvdW50cnkobWVhc3VyZSwgY291bnRyeSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHN0YXRpc3RpY2FsQ29kZS5IYXNBZGRpdGlvbmFsVGF4ZXNGb3JDb3VudHJ5ID0gXy5zb21lKHN0YXRpc3RpY2FsQ29kZS5BZGRpdGlvbmFsVGF4ZXMsIGZ1bmN0aW9uKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlLmlzVmFsaWRGb3JDb3VudHJ5O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc3RhdGlzdGljYWxDb2RlLk5vbkN1c3RvbXNMYXdzID0gXy5tYXAoc3RhdGlzdGljYWxDb2RlLk5vbkN1c3RvbXNMYXdzLCBmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgbWVhc3VyZS5pc1ZhbGlkRm9yQ291bnRyeSA9IG1lYXN1cmVJc1ZhbGlkRm9yQ291bnRyeShtZWFzdXJlLCBjb3VudHJ5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc3RhdGlzdGljYWxDb2RlLkhhc05vbkN1c3RvbXNMYXdzRm9yQ291bnRyeSA9IF8uc29tZShzdGF0aXN0aWNhbENvZGUuTm9uQ3VzdG9tc0xhd3MsIGZ1bmN0aW9uKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlLmlzVmFsaWRGb3JDb3VudHJ5O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc3RhdGlzdGljYWxDb2RlLlBlcm1pdHMgPSBfLm1hcChzdGF0aXN0aWNhbENvZGUuUGVybWl0cywgZnVuY3Rpb24gKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgICAgIG1lYXN1cmUuaXNWYWxpZEZvckNvdW50cnkgPSBtZWFzdXJlSXNWYWxpZEZvckNvdW50cnkobWVhc3VyZSwgY291bnRyeSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHN0YXRpc3RpY2FsQ29kZS5IYXNQZXJtaXRzRm9yQ291bnRyeSA9IF8uc29tZShzdGF0aXN0aWNhbENvZGUuUGVybWl0cywgZnVuY3Rpb24obWVhc3VyZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmUuaXNWYWxpZEZvckNvdW50cnk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gc3RhdGlzdGljYWxDb2RlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZpbHRlclRhcmlmZkRhdGFCeVRyYWRlTW92ZW1lbnQodGFyaWZmTWFzdGVyRGF0YSwgdHJhZGVNb3ZlbWVudCkge1xyXG4gICAgICAgIGlmICghdGFyaWZmTWFzdGVyRGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGFyaWZmTWFzdGVyRGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRyYWRlTW92ZW1lbnQgPT09ICdpbXBvcnQnKSB7XHJcbiAgICAgICAgICAgIHRhcmlmZk1hc3RlckRhdGEuUmVzdWx0LlN0YXRpc3RpY2FsQ29kZXMgPSBfLmZpbHRlcih0YXJpZmZNYXN0ZXJEYXRhLlJlc3VsdC5TdGF0aXN0aWNhbENvZGVzLCBmdW5jdGlvbihzdGF0aXN0aWNhbENvZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aXN0aWNhbENvZGUuVmFsaWRGb3JJbXBvcnQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gdGFyaWZmTWFzdGVyRGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHJhZGVNb3ZlbWVudCA9PT0gJ2V4cG9ydCcpIHtcclxuICAgICAgICAgICAgdGFyaWZmTWFzdGVyRGF0YS5SZXN1bHQuU3RhdGlzdGljYWxDb2RlcyA9IF8uZmlsdGVyKHRhcmlmZk1hc3RlckRhdGEuUmVzdWx0LlN0YXRpc3RpY2FsQ29kZXMsIGZ1bmN0aW9uKHN0YXRpc3RpY2FsQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpc3RpY2FsQ29kZS5WYWxpZEZvckV4cG9ydDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRhcmlmZk1hc3RlckRhdGEuUmVzdWx0LlRhcmVTdXBwbGVtZW50cyA9IFtdO1xyXG4gICAgICAgICAgICB0YXJpZmZNYXN0ZXJEYXRhLlJlc3VsdC5DdXN0b21zUmVsaWVmQ29kZXMgPSBbXTtcclxuICAgICAgICAgICAgdGFyaWZmTWFzdGVyRGF0YS5SZXN1bHQuQ3VzdG9tc0Zhdm91ckhpbnRDb2RlcyA9IFtdO1xyXG4gICAgICAgICAgICB0YXJpZmZNYXN0ZXJEYXRhLlJlc3VsdC5EdXR5UmF0ZXMgPSBbXTtcclxuICAgICAgICAgICAgdGFyaWZmTWFzdGVyRGF0YS5SZXN1bHQuVmF0UmF0ZXMgPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuIHRhcmlmZk1hc3RlckRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0YXJpZmZNYXN0ZXJEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGR1dHlSYXRlSXNWYWxpZEZvckNvdW50cnkoZHV0eVJhdGUsIGNvdW50cnkpIHtcclxuICAgICAgICBpZiAoIWNvdW50cnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZHV0eVJhdGUuQ291bnRyeUdyb3VwTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXy5zb21lKGNvdW50cnlEYXRhU2VydmljZS5yZWdpb25zW2R1dHlSYXRlLkNvdW50cnlHcm91cE51bWJlcl0sIGZ1bmN0aW9uKGNvdW50cnlJblJlZ2lvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gY291bnRyeUluUmVnaW9uID09PSBjb3VudHJ5O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1lYXN1cmVJc1ZhbGlkRm9yQ291bnRyeShtZWFzdXJlLCBjb3VudHJ5KSB7XHJcbiAgICAgICAgaWYgKCFjb3VudHJ5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgSU5DTFVERSA9IDA7XHJcbiAgICAgICAgdmFyIEVYQ0xVREUgPSAxO1xyXG4gICAgICAgIHZhciBjb3VudHJ5R3JvdXBzRm9yQ291bnRyeSA9IF8uZmlsdGVyKG1lYXN1cmUuQ291bnRyeUdyb3VwQXNzaWdubWVudCwgZnVuY3Rpb24oY291bnRyeUdyb3VwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfLnNvbWUoY291bnRyeURhdGFTZXJ2aWNlLnJlZ2lvbnNbY291bnRyeUdyb3VwLkNvdW50cnlHcm91cElkXSwgZnVuY3Rpb24oY291bnRyeUluUmVnaW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyeUluUmVnaW9uID09PSBjb3VudHJ5O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgY291bnRyeUlzSW5jbHVkZWQgPSBfLnNvbWUoY291bnRyeUdyb3Vwc0ZvckNvdW50cnksIGZ1bmN0aW9uKGNvdW50cnlHcm91cCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY291bnRyeUdyb3VwLkFzc2lnbm1lbnRUeXBlID09IElOQ0xVREU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhciBjb3VudHJ5SXNFeGNsdWRlZCA9IF8uc29tZShjb3VudHJ5R3JvdXBzRm9yQ291bnRyeSwgZnVuY3Rpb24oY291bnRyeUdyb3VwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb3VudHJ5R3JvdXAuQXNzaWdubWVudFR5cGUgPT0gRVhDTFVERTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gY291bnRyeUlzSW5jbHVkZWQgJiYgIWNvdW50cnlJc0V4Y2x1ZGVkO1xyXG4gICAgfVxyXG59Iiwi77u/YW5ndWxhci5tb2R1bGUoJ3RhcmljLnRleHRzJywgW10pXHJcbiAgICAuY29tcG9uZW50KCdhbm5vdGF0aW9uQnV0dG9uJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2Fubm90YXRpb24tYnV0dG9uJykpXHJcbiAgICAuY29tcG9uZW50KCdhbm5vdGF0aW9uJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2Fubm90YXRpb24nKSlcclxuICAgIC5jb21wb25lbnQoJ2NjY0NvbmNsdXNpb24nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvY2NjLWNvbmNsdXNpb24nKSlcclxuICAgIC5jb21wb25lbnQoJ2V4cGxhbmF0b3J5Tm90ZUJ1dHRvbicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9leHBsYW5hdG9yeS1ub3RlLWJ1dHRvbicpKVxyXG4gICAgLmNvbXBvbmVudCgnbm90ZVNvdXJjZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9ub3RlLXNvdXJjZScpKVxyXG4gICAgLmNvbXBvbmVudCgnd2NvQ2xhc3NpZmljYXRpb25PcGluaW9uJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3djby1jbGFzc2lmaWNhdGlvbi1vcGluaW9uJykpXHJcbiAgICAuZmFjdG9yeSgndGV4dERhdGFTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy90ZXh0LWRhdGEnKSlcclxuICAgIC5mYWN0b3J5KCdhbm5vdGF0aW9uc0RhdGFTZXJ2aWNlJywgcmVxdWlyZSgnLi9zZXJ2aWNlcy9hbm5vdGF0aW9ucy1kYXRhJykpXHJcbiAgICAuZmFjdG9yeSgnYW5ub3RhdGlvbnNNb2RhbCcsIHJlcXVpcmUoJy4vbW9kYWxzL2Fubm90YXRpb25zJykpXHJcbiAgICAuZmFjdG9yeSgnZXhwbGFuYXRvcnlOb3RlTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9leHBsYW5hdG9yeS1ub3RlJykpXHJcbjsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgaXNMYXJnZTogJzwnLFxyXG4gICAgICAgIGl0ZW06ICc8J1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IGFubm90YXRpb25CdXR0b25Db250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICd0ZXh0cy9jb21wb25lbnRzL2Fubm90YXRpb24tYnV0dG9uLmh0bWwnXHJcbn07XHJcblxyXG5hbm5vdGF0aW9uQnV0dG9uQ29udHJvbGxlci4kaW5qZWN0ID0gWydhbm5vdGF0aW9uc01vZGFsJ107XHJcblxyXG5mdW5jdGlvbiBhbm5vdGF0aW9uQnV0dG9uQ29udHJvbGxlcihhbm5vdGF0aW9uc01vZGFsKSB7XHJcblxyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgIHNob3dBbm5vdGF0aW9uOiBzaG93QW5ub3RhdGlvblxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBzaG93QW5ub3RhdGlvbigpIHtcclxuICAgICAgICBhbm5vdGF0aW9uc01vZGFsLnNob3codm0uaXRlbS5zZWN0aW9uLCB2bS5pdGVtLmNoYXB0ZXIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIG5vdGU6ICc8J1xyXG4gICAgfSxcclxuICAgIHRlbXBsYXRlVXJsOiAndGV4dHMvY29tcG9uZW50cy9hbm5vdGF0aW9uLmh0bWwnXHJcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIGNvbmNsdXNpb246ICc8J1xyXG4gICAgfSxcclxuICAgIHRlbXBsYXRlVXJsOiAndGV4dHMvY29tcG9uZW50cy9jY2MtY29uY2x1c2lvbi5odG1sJ1xyXG59OyIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBpc0xhcmdlOiAnPCcsXHJcbiAgICAgICAgaXRlbTogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogZXhwbGFuYXRvcnlOb3RlQnV0dG9uQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAndGV4dHMvY29tcG9uZW50cy9leHBsYW5hdG9yeS1ub3RlLWJ1dHRvbi5odG1sJ1xyXG59O1xyXG5cclxuZXhwbGFuYXRvcnlOb3RlQnV0dG9uQ29udHJvbGxlci4kaW5qZWN0ID0gWydjb21tb24nLCAnZXhwbGFuYXRvcnlOb3RlTW9kYWwnXTtcclxuXHJcbmZ1bmN0aW9uIGV4cGxhbmF0b3J5Tm90ZUJ1dHRvbkNvbnRyb2xsZXIoY29tbW9uLCBleHBsYW5hdG9yeU5vdGVNb2RhbCkge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBnZXRDb2RlOiBnZXRDb2RlLFxyXG4gICAgICAgIHNob3dFeHBsYW5hdG9yeU5vdGU6IHNob3dFeHBsYW5hdG9yeU5vdGVcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q29kZSgpIHtcclxuICAgICAgICBpZiAodm0uaXRlbS50eXBlID09PSAnc2VjdGlvbicpXHJcbiAgICAgICAgICAgIHJldHVybiAnYScgKyBjb21tb24uZm9ybWF0dGluZy5wYWRMZWZ0KGNvbW1vbi5mb3JtYXR0aW5nLnJvbWFuVG9OdW1iZXIodm0uaXRlbS5udW1iZXIpLCAyLCAnMCcpO1xyXG4gICAgICAgIGVsc2UgaWYgKHZtLml0ZW0udHlwZSA9PT0gJ2NoYXB0ZXInICYmIHZtLml0ZW0uY29kZSlcclxuICAgICAgICAgICAgcmV0dXJuICdoJyArIHZtLml0ZW0uY29kZS5zdWJzdHJpbmcoMCwgMik7XHJcbiAgICAgICAgZWxzZSBpZiAodm0uaXRlbS50eXBlID09PSAnY2hhcHRlcicgJiYgdm0uaXRlbS5udW1iZXIpXHJcbiAgICAgICAgICAgIHJldHVybiAnaCcgKyBjb21tb24uZm9ybWF0dGluZy5wYWRMZWZ0KGNvbW1vbi5mb3JtYXR0aW5nLnJvbWFuVG9OdW1iZXIodm0uaXRlbS5udW1iZXIpLCAyLCAnMCcpO1xyXG4gICAgICAgIGVsc2UgaWYgKHZtLml0ZW0udHlwZSA9PT0gJ3N1YmNoYXB0ZXInKVxyXG4gICAgICAgICAgICByZXR1cm4gdm0uaXRlbS5jb2RlO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHZtLml0ZW0uY29kZS5zdWJzdHJpbmcoMCwgNCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0V4cGxhbmF0b3J5Tm90ZSgpIHtcclxuICAgICAgICBleHBsYW5hdG9yeU5vdGVNb2RhbC5zaG93KHZtLmdldENvZGUoKSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJldHVybiB2bTtcclxuXHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgbm90ZTogJzwnLFxyXG4gICAgICAgIHR5cGU6ICdAJ1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IG5vdGVTb3VyY2VDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICd0ZXh0cy9jb21wb25lbnRzL25vdGUtc291cmNlLmh0bWwnXHJcbn07XHJcblxyXG5ub3RlU291cmNlQ29udHJvbGxlci4kaW5qZWN0ID0gWydjb21tb24nXTtcclxuXHJcbmZ1bmN0aW9uIG5vdGVTb3VyY2VDb250cm9sbGVyKGNvbW1vbikge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBsYW5ndWFnZTogY29tbW9uLmxhbmd1YWdlLmdldCgpLFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIG9waW5pb246ICc8J1xyXG4gICAgfSxcclxuICAgIHRlbXBsYXRlVXJsOiAndGV4dHMvY29tcG9uZW50cy93Y28tY2xhc3NpZmljYXRpb24tb3Bpbmlvbi5odG1sJ1xyXG59OyIsIm1vZHVsZS5leHBvcnRzID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckdWliTW9kYWwnLCBcclxuICAgIGFubm90YXRpb25zTW9kYWxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGFubm90YXRpb25zTW9kYWwoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICR1aWJNb2RhbFxyXG4pIHtcclxuXHJcbiAgICB2YXIgbW9kYWwgPSB7XHJcbiAgICAgICAgY2hhcHRlcjogbnVsbCxcclxuICAgICAgICBzZWN0aW9uOiBudWxsLFxyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICBhbm5vdGF0aW9uc01vZGFsQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgICAgICckcScsIFxyXG4gICAgICAgICckdWliTW9kYWxJbnN0YW5jZScsIFxyXG4gICAgICAgICdhbm5vdGF0aW9uc0RhdGFTZXJ2aWNlJywgXHJcbiAgICAgICAgJ3NlY3Rpb24nLCBcclxuICAgICAgICAnY2hhcHRlcicsXHJcbiAgICBdO1xyXG5cclxuICAgIGZ1bmN0aW9uIGFubm90YXRpb25zTW9kYWxDb250cm9sbGVyKFxyXG4gICAgICAgICRxLCBcclxuICAgICAgICAkdWliTW9kYWxJbnN0YW5jZSwgXHJcbiAgICAgICAgYW5ub3RhdGlvbnNEYXRhU2VydmljZSwgXHJcbiAgICAgICAgc2VjdGlvbiwgXHJcbiAgICAgICAgY2hhcHRlclxyXG4gICAgKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIHZtID0ge1xyXG4gICAgICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAgICAgY2FuY2VsOiBjYW5jZWwsXHJcbiAgICAgICAgICAgIGNoYXB0ZXI6IGNoYXB0ZXIsXHJcbiAgICAgICAgICAgIHNlY3Rpb246IHNlY3Rpb25cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XHJcbiAgICAgICAgICAgIGlmIChjaGFwdGVyKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGFubm90YXRpb25zRGF0YVNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hhcHRlck5vdGUoY2hhcHRlcilcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihub3RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmNoYXB0ZXJOb3RlID0gbm90ZTtcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goYW5ub3RhdGlvbnNEYXRhU2VydmljZVxyXG4gICAgICAgICAgICAgICAgICAgIC5nZXRTZWN0aW9uTm90ZShzZWN0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKG5vdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc2VjdGlvbk5vdGUgPSBub3RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJHEuYWxsKHByb21pc2VzKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygnY2FuY2VsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdm07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd01vZGFsKHNlY3Rpb24sIGNoYXB0ZXIpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJ29wZW4tbW9kYWwtbGVnYWwtbm90ZXMnLCB7IGNhdGVnb3J5OiAnbGVnYWwtbm90ZXMnIH0pO1xyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IGFubm90YXRpb25zTW9kYWxDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsJyxcclxuICAgICAgICAgICAga2V5Ym9hcmQ6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGFsRmFkZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgY2hhcHRlcjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXB0ZXI7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlY3Rpb247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNpemU6ICdsZycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAndGV4dHMvbW9kYWxzL2Fubm90YXRpb25zLmh0bWwnLFxyXG4gICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLXdpZGUnXHJcbiAgICAgICAgfSkucmVzdWx0LmNhdGNoKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgaWYgKCEocmVzID09PSAnY2FuY2VsJyB8fCByZXMgPT09ICdlc2NhcGUga2V5IHByZXNzJyB8fCByZXMgPT09ICdiYWNrZHJvcCBjbGljaycpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyByZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbW9kYWw7XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJyRhbmFseXRpY3MnLCAnJHVpYk1vZGFsJywgZXhwbGFuYXRvcnlOb3RlTW9kYWxdO1xyXG5cclxuZnVuY3Rpb24gZXhwbGFuYXRvcnlOb3RlTW9kYWwoJGFuYWx5dGljcywgJHVpYk1vZGFsKSB7XHJcbiAgICB2YXIgbW9kYWwgPSB7XHJcbiAgICAgICAgZ29vZHNDb2RlOiBudWxsLFxyXG4gICAgICAgIGV4cGxhbmF0b3J5Tm90ZTogbnVsbCxcclxuICAgICAgICBzaG93OiBzaG93TW9kYWxcclxuICAgIH07XHJcblxyXG4gICAgbW9kYWxFeHBsYW5hdG9yeU5vdGVDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAgICAgJyRzY2UnLCBcclxuICAgICAgICAnJHVpYk1vZGFsSW5zdGFuY2UnLFxyXG4gICAgICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIFxyXG4gICAgICAgICdsYW5ndWFnZScsIFxyXG4gICAgICAgICdjb21tb24nLCBcclxuICAgICAgICAnZXhwbGFuYXRvcnlOb3RlJywgXHJcbiAgICAgICAgJ2dvb2RzQ29kZScsIFxyXG4gICAgICAgICd0ZXh0RGF0YVNlcnZpY2UnLCBcclxuICAgICAgICAnbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2UnLCBcclxuICAgICAgICAnaWRlbnRpdHknXHJcbiAgICBdO1xyXG5cclxuICAgIGZ1bmN0aW9uIG1vZGFsRXhwbGFuYXRvcnlOb3RlQ29udHJvbGxlcihcclxuICAgICAgICAkc2NlLCBcclxuICAgICAgICAkdWliTW9kYWxJbnN0YW5jZSwgXHJcbiAgICAgICAgc3RhdGUsXHJcbiAgICAgICAgbGFuZ3VhZ2UsIFxyXG4gICAgICAgIGNvbW1vbiwgXHJcbiAgICAgICAgZXhwbGFuYXRvcnlOb3RlLCBcclxuICAgICAgICBnb29kc0NvZGUsIFxyXG4gICAgICAgIHRleHREYXRhU2VydmljZSwgXHJcbiAgICAgICAgbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2UsIFxyXG4gICAgICAgIGlkZW50aXR5XHJcbiAgICApIHtcclxuICAgICAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICBjbGlja1NlY3Rpb25OYXZJdGVtOiBjbGlja1NlY3Rpb25OYXZJdGVtLFxyXG4gICAgICAgICAgICBmb3JtYXRHZXJtYW5Eb2N1bWVudERlc2NyaXB0aW9uOiBmb3JtYXRHZXJtYW5Eb2N1bWVudERlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm90ZTogbnVsbCxcclxuICAgICAgICAgICAgICAgIGNjY0NvbmNsdXNpb25zOiBbXSxcclxuICAgICAgICAgICAgICAgIGVuZ2xpc2hDbGFzc2lmaWNhdGlvbnNOZXc6IFtdLFxyXG4gICAgICAgICAgICAgICAgZW5nbGlzaENsYXNzaWZpY2F0aW9uc09sZDogW10sXHJcbiAgICAgICAgICAgICAgICBub3RlczogW10sXHJcbiAgICAgICAgICAgICAgICBvdGhlckNsYXNzaWZpY2F0aW9uczogW10sXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uczogW10sXHJcbiAgICAgICAgICAgICAgICB0YXJpZmVyaW5nZW46IFtdLFxyXG4gICAgICAgICAgICAgICAgd2NvQ2xhc3NpZmljYXRpb25PcGluaW9uczogW11cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXhwbGFuYXRvcnlOb3RlOiBleHBsYW5hdG9yeU5vdGUsXHJcbiAgICAgICAgICAgIGdvb2RzQ29kZTogZ29vZHNDb2RlLFxyXG4gICAgICAgICAgICBpZGVudGl0eTogaWRlbnRpdHksXHJcbiAgICAgICAgICAgIGlzTG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLmdldCgpLFxyXG4gICAgICAgICAgICBub3c6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgICAgIG9rOiBvayxcclxuICAgICAgICAgICAgdHJhbnNsYXRpb25zOiBbXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIGxldmVsT3JkZXIgPSBbJ3NlY3Rpb24nLCAnY2hhcHRlcicsICdzdWJjaGFwdGVyJywgJ2hlYWRpbmcnXTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdjYW5jZWwnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNsaWNrU2VjdGlvbk5hdkl0ZW0oaXRlbSkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGl0ZW0uc2VsZWN0b3IpLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGZvcm1hdEdlcm1hbkRvY3VtZW50RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgc3dpdGNoKGRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdBVic6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdBdmlzZSB6dW0gSGFybW9uaXNpZXJ0ZW4gU3lzdGVtJztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0VFJzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0VpbnplbGVudHNjaGVpZHVuZ2VuIHp1ciBLb21iaW5pZXJ0ZW4gTm9tZW5rbGF0dXInO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnR0UgLSBFdUdIJzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0dlcmljaHRsaWNoZSBFbnRzY2hlaWR1bmdlbiAtIEV1R0gnO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnR0UgLSBuYXRpb25hbCc6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdHZXJpY2h0bGljaGUgRW50c2NoZWlkdW5nZW4gLSBuYXRpb25hbCc7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdIUyc6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdFcmzDpHV0ZXJ1bmdlbiB6dW0gSGFybW9uaXNpZXJ0ZW4gU3lzdGVtJztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0tOJzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0VybMOkdXRlcnVuZ2VuIHp1ciBLb21iaW5pZXJ0ZW4gTm9tZW5rbGF0dXInO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnTkVIJzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05hdGlvbmFsZSBFbnRzY2hlaWR1bmdlbiB1bmQgSGlud2Vpc2UnO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGZvcm1hdEh0bWwobm90ZSkge1xyXG4gICAgICAgICAgICBpZiAoIW5vdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIG5vdGUgPSBub3RlLnJlcGxhY2UoLyg/OlxcXFxbcm5dKSsvZywgXCIgXCIpO1xyXG4gICAgICAgICAgICB3aGlsZSAobm90ZS5pbmRleE9mKCdcXFxcXCInKSA+IC0xKVxyXG4gICAgICAgICAgICAgICAgbm90ZSA9IG5vdGUucmVwbGFjZSgnXFxcXFwiJywgJ1wiJyk7XHJcblxyXG4gICAgICAgICAgICBub3RlID0gJHNjZS50cnVzdEFzSHRtbChub3RlKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5vdGUudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldExldmVsKGdvb2RzQ29kZSkge1xyXG4gICAgICAgICAgICB2YXIgbGV2ZWw7XHJcbiAgICAgICAgICAgIGlmIChnb29kc0NvZGVbMF0gPT09ICdhJykge1xyXG4gICAgICAgICAgICAgICAgbGV2ZWwgPSAnc2VjdGlvbic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZ29vZHNDb2RlWzBdID09PSAnaCcpIHtcclxuICAgICAgICAgICAgICAgIGxldmVsID0gJ2NoYXB0ZXInO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGdvb2RzQ29kZS5zdWJzdHJpbmcoZ29vZHNDb2RlLmxlbmd0aCAtIDMpID09PSAnc3ViJykge1xyXG4gICAgICAgICAgICAgICAgbGV2ZWwgPSAnc3ViY2hhcHRlcic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXZlbCA9ICdoZWFkaW5nJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbGV2ZWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRHb29kc0NvZGVPclNlY3Rpb25OdW1iZXIoZ29vZHNDb2RlKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XHJcbiAgICAgICAgICAgIGlmIChnb29kc0NvZGVbMF0gPT09ICdhJykge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ29vZHNDb2RlLnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChnb29kc0NvZGVbMF0gPT09ICdoJykge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ29vZHNDb2RlLnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChnb29kc0NvZGUuc3Vic3RyaW5nKGdvb2RzQ29kZS5sZW5ndGggLSAzKSA9PT0gJ3N1YicpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdvb2RzQ29kZS5zdWJzdHJpbmcoMCwgZ29vZHNDb2RlLmxlbmd0aCAtIDQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ29vZHNDb2RlLnN1YnN0cmluZygwLCA0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbG9hZFdjb0V4cGxhbmF0b3J5Tm90ZXMobGV2ZWwsIGdvb2RzQ29kZU9yU2VjdGlvbk51bWJlcikge1xyXG4gICAgICAgICAgICB2YXIgZGVmZXJyZWQgPSBjb21tb24uJHEuZGVmZXIoKTtcclxuICAgICAgICAgICAgaWYgKGlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ3RvZWxpY2h0aW5nZW5fd2NvJykpIHtcclxuICAgICAgICAgICAgICAgIHRleHREYXRhU2VydmljZS5nZXRXY29FeHBsYW5hdG9yeU5vdGVzKGxldmVsLCBnb29kc0NvZGVPclNlY3Rpb25OdW1iZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24obm90ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKG5vdGVzLCBmdW5jdGlvbihub3RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHBsYW5hdG9yeU5vdGUobm90ZSwgJ3djbycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbG9hZEV1RXhwbGFuYXRvcnlOb3RlcyhsZXZlbCwgZ29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG4gICAgICAgICAgICBpZiAoaWRlbnRpdHkuaGFzUGVybWlzc2lvbigndG9lbGljaHRpbmdlbl9ldScpKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0RGF0YVNlcnZpY2UuZ2V0RXVFeHBsYW5hdG9yeU5vdGVzKGxldmVsLCBnb29kc0NvZGVPclNlY3Rpb25OdW1iZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24obm90ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKG5vdGVzLCBmdW5jdGlvbihub3RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHBsYW5hdG9yeU5vdGUobm90ZSwgJ2V1Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBsb2FkR2VybWFuRXhwbGFuYXRvcnlOb3RlcyhsZXZlbCwgZ29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0ZXh0RGF0YVNlcnZpY2UuZ2V0R2VybWFuRXhwbGFuYXRvcnlOb3RlcyhsZXZlbCwgZ29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZ2VybWFuRXhwbGFuYXRvcnlOb3RlcyA9IHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcclxuICAgICAgICAgICAgaWYgKCF2bS5nb29kc0NvZGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB2YXIgbGV2ZWwgPSBnZXRMZXZlbCh2bS5nb29kc0NvZGUpO1xyXG4gICAgICAgICAgICB2YXIgZ29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyID0gZ2V0R29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyKHZtLmdvb2RzQ29kZSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXHJcbiAgICAgICAgICAgICAgICBsb2FkV2NvRXhwbGFuYXRvcnlOb3RlcyhsZXZlbCwgZ29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyKSxcclxuICAgICAgICAgICAgICAgIGxvYWRFdUV4cGxhbmF0b3J5Tm90ZXMobGV2ZWwsIGdvb2RzQ29kZU9yU2VjdGlvbk51bWJlciksXHJcbiAgICAgICAgICAgIF07XHJcblxyXG4gICAgICAgICAgICBpZiAoc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgPT09ICdERScpIHtcclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gobG9hZEdlcm1hbkV4cGxhbmF0b3J5Tm90ZXMobGV2ZWwsIGdvb2RzQ29kZU9yU2VjdGlvbk51bWJlcikpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgY29tbW9uLiRxLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIChpZGVudGl0eS5oYXNQZXJtaXNzaW9uKCd0b2VsaWNodGluZ2VuX3djbycpKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0ZXh0RGF0YVNlcnZpY2UuZ2V0V2NvRXhwbGFuYXRvcnlOb3RlcyhsZXZlbCwgZ29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyKVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIC50aGVuKGZ1bmN0aW9uKG5vdGVzKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIF8uZm9yRWFjaChub3RlcywgZnVuY3Rpb24obm90ZSkge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgYWRkRXhwbGFuYXRvcnlOb3RlKG5vdGUsICd3Y28nKTtcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgLy8gaWYgKGlkZW50aXR5Lmhhc1Blcm1pc3Npb24oJ3RvZWxpY2h0aW5nZW5fZXUnKSkge1xyXG4gICAgICAgICAgICAvLyAgICAgdGV4dERhdGFTZXJ2aWNlLmdldEV1RXhwbGFuYXRvcnlOb3RlcyhsZXZlbCwgZ29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyKVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIC50aGVuKGZ1bmN0aW9uKG5vdGVzKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIF8uZm9yRWFjaChub3RlcywgZnVuY3Rpb24obm90ZSkge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgYWRkRXhwbGFuYXRvcnlOb3RlKG5vdGUsICdldScpO1xyXG5cclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChsZXZlbCA9PSAnaGVhZGluZycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29tbW9uLmxhbmd1YWdlLmdldCgpID09PSAnbmwnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbmlldXdlIHRhcmlmZXJpbmdlbiB1aXQgZGF0YWJhc2VcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RGF0YVNlcnZpY2UuZ2V0VGFyaWZlcmluZ2VuKHZtLmdvb2RzQ29kZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHRhcmlmZXJpbmdlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZGF0YS50YXJpZmVyaW5nZW4gPSB0YXJpZmVyaW5nZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyaWZlcmluZ2VuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5kYXRhLnNlY3Rpb25zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ25vbWVuY2xhdHVyZS5DbGFzc2lmaWNhdGlvbnMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJy50YXJpZmVyaW5nZW4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogM1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcmlnZSBpbmRlbGluZ3N2ZXJvcmRlbmluZ2VuXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dERhdGFTZXJ2aWNlLmdldENsYXNzaWZpY2F0aW9uT3RoZXIoZ29vZHNDb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY2xhc3NpZmljYXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5kYXRhLnNlY3Rpb25zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ2NsYXNzaWZpY2F0aW9uUmVndWxhdGlvbi5DbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcuY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogNFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZGF0YS5vdGhlckNsYXNzaWZpY2F0aW9ucyA9IGNsYXNzaWZpY2F0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dERhdGFTZXJ2aWNlLmdldE9sZEVuZ2xpc2hDbGFzc2lmaWNhdGlvbnMoZ29vZHNDb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmRhdGEuc2VjdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2xhc3NpZmljYXRpb24gUmVndWxhdGlvbnMgKGJlZm9yZSAxLTEtMjAxNCknLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJy5jbGFzc2lmaWNhdGlvbi1yZWd1bGF0aW9ucy1vbGQgaDEnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogM1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZGF0YS5lbmdsaXNoQ2xhc3NpZmljYXRpb25zT2xkID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRleHREYXRhU2VydmljZS5nZXROZXdFbmdsaXNoQ2xhc3NpZmljYXRpb25zKGdvb2RzQ29kZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5kYXRhLnNlY3Rpb25zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0NsYXNzaWZpY2F0aW9uIFJlZ3VsYXRpb25zIChmcm9tIDEtMS0yMDE0KScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnLmNsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb25zLW5ldyBoMScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiA0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5kYXRhLmVuZ2xpc2hDbGFzc2lmaWNhdGlvbnNOZXcgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dERhdGFTZXJ2aWNlLmdldENjY0NvbmNsdXNpb25zKGdvb2RzQ29kZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5kYXRhLnNlY3Rpb25zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ2NvbmNsdXNpb24uQ2NjQ29uY2x1c2lvbnMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJy5jY2MtY29uY2x1c2lvbnMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogOFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZGF0YS5jY2NDb25jbHVzaW9ucyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpZGVudGl0eS5oYXNQZXJtaXNzaW9uKCd0b2VsaWNodGluZ2VuX3djbycpKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0RGF0YVNlcnZpY2UuZ2V0V2NvQ2xhc3NpZmljYXRpb25PcGluaW9ucyhnb29kc0NvZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lk9waW5pb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmRhdGEuc2VjdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdub21lbmNsYXR1cmUuV2NvQ2xhc3NpZmljYXRpb25PcGluaW9ucycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcud2NvLWNsYXNzaWZpY2F0aW9uLW9waW5pb25zJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogN1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uZGF0YS53Y29DbGFzc2lmaWNhdGlvbk9waW5pb25zID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBtYWtlU2VjdGlvblRpdGxlKHN1YmZvbGRlcikge1xyXG4gICAgICAgICAgICBzdWJmb2xkZXIgPSBzdWJmb2xkZXIudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgc3dpdGNoIChzdWJmb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3djbyc6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdub21lbmNsYXR1cmUuRXhwbGFuYXRvcnlOb3Rlc0hzJztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2V1JzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ25vbWVuY2xhdHVyZS5FeHBsYW5hdG9yeU5vdGVzQ24nO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ25vbWVuY2xhdHVyZS5FeHBsYW5hdG9yeU5vdGVzJyArICcgJyArIHN1YmZvbGRlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gb2soKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbWFrZVRpdGxlKG5vbWVuY2xhdHVyZUxldmVsLCBnb29kc0NvZGVPclNlY3Rpb25OdW1iZXIsIG51bWJlcikge1xyXG4gICAgICAgICAgICBzd2l0Y2gobm9tZW5jbGF0dXJlTGV2ZWwpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY3Rpb24nOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnbm9tZW5jbGF0dXJlLlNlY3Rpb25fR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyXyc7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdjaGFwdGVyJzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ25vbWVuY2xhdHVyZS5DaGFwdGVyX0dvb2RzQ29kZU9yU2VjdGlvbk51bWJlcl8nO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnc3ViY2hhcHRlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdub21lbmNsYXR1cmUuU3ViQ2hhcHRlcl9Hb29kc0NvZGVPclNlY3Rpb25OdW1iZXJfJztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2hlYWRpbmcnOlxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ25vbWVuY2xhdHVyZS5IZWFkaW5nX0dvb2RzQ29kZU9yU2VjdGlvbk51bWJlcl8nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRTdWJjaGFwdGVyTnVtYmVyKG5vdGUpIHtcclxuICAgICAgICAgICAgdmFyIGRlZmVycmVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcbiAgICAgICAgICAgIGlmIChub3RlLk5vbWVuY2xhdHVyZUxldmVsID09PSAnU1VCQ0hBUFRFUicpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjaGFwdGVyTnVtYmVyID0gbm90ZS5Hb29kc0NvZGVPclNlY3Rpb25OdW1iZXIuc3Vic3RyaW5nKDAsIDIpO1xyXG4gICAgICAgICAgICAgICAgbm9tZW5jbGF0dXJlRGF0YVNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAuZ2V0U3ViY2hhcHRlck51bWJlcihjaGFwdGVyTnVtYmVyLCBub3RlLkdvb2RzQ29kZU9yU2VjdGlvbk51bWJlcilcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihudW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShudW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGFkZEV4cGxhbmF0b3J5Tm90ZShub3RlLCBzdWJmb2xkZXIpIHtcclxuICAgICAgICAgICAgaWYgKCFub3RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdldFN1YmNoYXB0ZXJOdW1iZXIobm90ZSlcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHN1YmNoYXB0ZXJOdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbGV2ZWwgPSBub3RlLk5vbWVuY2xhdHVyZUxldmVsLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWN0aW9uVGl0bGUgPSBtYWtlU2VjdGlvblRpdGxlKHN1YmZvbGRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gbWFrZVRpdGxlKGxldmVsLCBub3RlLkdvb2RzQ29kZU9yU2VjdGlvbk51bWJlciwgc3ViY2hhcHRlck51bWJlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG51bWJlciA9IChsZXZlbCA9PT0gJ3N1YmNoYXB0ZXInID8gc3ViY2hhcHRlck51bWJlciA6IG5vdGUuR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4dHJhRGF0YSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ViZm9sZGVyOiBzdWJmb2xkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25UaXRsZTogc2VjdGlvblRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBsZXZlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ29vZHNDb2RlOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vdGVIdG1sOiBmb3JtYXRIdG1sKG5vdGUuTm90ZUh0bWwpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBub3RlV2l0aEV4dHJhRGF0YSA9IF8uYXNzaWduKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7fSwgbm90ZSwgZXh0cmFEYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5kYXRhLm5vdGVzLnB1c2gobm90ZVdpdGhFeHRyYURhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgc3Vic2VjdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJmb2xkZXI6IHN1YmZvbGRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ29vZHNDb2RlOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBsZXZlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IFwiLlwiICsgc3ViZm9sZGVyICsgXCItbm90ZS1cIiArIG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGxldmVsT3JkZXIuaW5kZXhPZihsZXZlbClcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWN0aW9uID0gXy5maW5kKHZtLmRhdGEuc2VjdGlvbnMsIGZ1bmN0aW9uIChzZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWN0aW9uLnRpdGxlID09PSBzZWN0aW9uVGl0bGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHNlY3Rpb25UaXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmZvbGRlcjogc3ViZm9sZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGxldmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IFwiLlwiICsgc3ViZm9sZGVyICsgXCItbm90ZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHN1YmZvbGRlci50b0xvd2VyQ2FzZSgpID09PSAnd2NvJyA/IDEgOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VjdGlvbnM6IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmRhdGEuc2VjdGlvbnMucHVzaChzZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zdWJzZWN0aW9ucy5wdXNoKHN1YnNlY3Rpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodm0uZGF0YS5ub3Rlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmRhdGEubm90ZXMgPSBfLnNvcnRCeSh2bS5kYXRhLm5vdGVzLCBzb3J0Tm90ZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5kYXRhLnNlY3Rpb25zID0gXy5zb3J0Qnkodm0uZGF0YS5zZWN0aW9ucywgc29ydE5vdGVzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHNvcnROb3Rlcyhub3RlKSB7XHJcbiAgICAgICAgICAgIHZhciBtYWluT3JkZXJMaXN0ID0gW1wid2NvXCIsIFwiZXVcIl07IC8vIFdDTyBub3RlcyBmaXJzdFxyXG4gICAgICAgICAgICB2YXIgc3ViT3JkZXJMaXN0ID0gWydzZWN0aW9uJywgJ2NoYXB0ZXInLCAnc3ViY2hhcHRlcicsICdoZWFkaW5nJ107XHJcbiAgICAgICAgICAgIHZhciBtYWluT3JkZXIgPSBub3RlLnN1YmZvbGRlciA/IG1haW5PcmRlckxpc3QuaW5kZXhPZihub3RlLnN1YmZvbGRlci50b0xvd2VyQ2FzZSgpKSA6IDEwMDA7XHJcbiAgICAgICAgICAgIGlmIChtYWluT3JkZXIgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBtYWluT3JkZXIgPSAxMDAwOyAvLyBpZiBub3RlLnN1YmZvbGRlciBpcyBub3QgZm91bmQgaW4gdGhlIGxpc3QgYWJvdmUsIHB1dCB0aG9zZSBub3RlcyBhdCB0aGUgZW5kXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHN1Yk9yZGVyID0gc3ViT3JkZXJMaXN0LmluZGV4T2Yobm90ZS5sZXZlbCk7XHJcbiAgICAgICAgICAgIHJldHVybiBtYWluT3JkZXIgKiAxMDAgKyBzdWJPcmRlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGluaXQoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZtO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChnb29kc0NvZGUsIGV4cGxhbmF0b3J5Tm90ZSkge1xyXG4gICAgICAgICRhbmFseXRpY3MuZXZlbnRUcmFjaygnb3Blbi1tb2RhbC1leHBsYW5hdG9yeS1ub3RlcycsIHsgY2F0ZWdvcnk6ICdleHBsYW5hdG9yeS1ub3RlcycgfSk7XHJcbiAgICAgICAgcmV0dXJuICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICBiYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgYmluZFRvQ29udHJvbGxlcjogdHJ1ZSxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogbW9kYWxFeHBsYW5hdG9yeU5vdGVDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsJyxcclxuICAgICAgICAgICAga2V5Ym9hcmQ6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGFsRmFkZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgZXhwbGFuYXRvcnlOb3RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cGxhbmF0b3J5Tm90ZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBnb29kc0NvZGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ29vZHNDb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaXplOiAnbGcnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3RleHRzL21vZGFscy9leHBsYW5hdG9yeS1ub3RlLmh0bWwnLFxyXG4gICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLWV4cGxhbmF0b3J5LW5vdGUnXHJcbiAgICAgICAgfSkucmVzdWx0LmNhdGNoKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgaWYgKCEocmVzID09PSAnY2FuY2VsJyB8fCByZXMgPT09ICdlc2NhcGUga2V5IHByZXNzJyB8fCByZXMgPT09ICdiYWNrZHJvcCBjbGljaycpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyByZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbW9kYWw7XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBbJ2NvbW1vbicsICdkYXRhQ29udGV4dCcsICdub21lbmNsYXR1cmVEYXRhU2VydmljZScsICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIGFubm90YXRpb25zU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiBhbm5vdGF0aW9uc1NlcnZpY2UoY29tbW9uLCBjb250ZXh0LCBub21lbmNsYXR1cmVEYXRhU2VydmljZSwgc3RhdGUpIHtcclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGdldENoYXB0ZXJOb3RlOiBnZXRDaGFwdGVyTm90ZSxcclxuICAgICAgICBnZXRTZWN0aW9uTm90ZTogZ2V0U2VjdGlvbk5vdGUsXHJcbiAgICAgICAgc2VhcmNoTm90ZXM6IHNlYXJjaE5vdGVzLFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRDaGFwdGVyTm90ZShjaGFwdGVyTnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvYW5ub3RhdGlvbnMvY2hhcHRlci8nICsgY2hhcHRlck51bWJlciArXHJcbiAgICAgICAgICAgICc/bGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZyZWZlcmVuY2Vjb3VudHJ5PScgKyBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcblxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFNlY3Rpb25Ob3RlKHNlY3Rpb25OdW1iZXIpIHtcclxuXHJcbiAgICAgICAgaWYgKHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ID09PSBcIkdCXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5vbWVuY2xhdHVyZURhdGFTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAuZ2V0U2VjdGlvbnMoKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oc2VjdGlvbnNEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlY3Rpb24gPSBfLmZpbmQoc2VjdGlvbnNEYXRhLmRhdGEsIGZ1bmN0aW9uIChzZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWN0aW9uLm51bWJlciA9PT0gc2VjdGlvbk51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBOb3RlSHRtbDogc2VjdGlvbi51a19zZWN0aW9uX25vdGVcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2Fubm90YXRpb25zL3NlY3Rpb24vJyArIHNlY3Rpb25OdW1iZXIgK1xyXG4gICAgICAgICAgICAnP2xhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICcmcmVmZXJlbmNlY291bnRyeT0nICsgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG5cclxuICAgICAgICByZXR1cm4gY29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWFyY2hOb3RlcyhxdWVyeSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL2Fubm90YXRpb25zL3NlYXJjaCcgK1xyXG4gICAgICAgICAgICAnP3E9JyArIHF1ZXJ5ICtcclxuICAgICAgICAgICAgJyZsYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCkgK1xyXG4gICAgICAgICAgICAnJnJlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5ICtcclxuICAgICAgICAgICAgJyZkYXRlPScgKyBzdGF0ZS5maWx0ZXIuZGF0ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFsnY29tbW9uJywgJ2RhdGFDb250ZXh0JywgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgJ2lkZW50aXR5JywgdGV4dERhdGFTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIHRleHREYXRhU2VydmljZShjb21tb24sIGNvbnRleHQsIHN0YXRlLCBpZGVudGl0eSkge1xyXG5cclxuICAgIHZhciBzZXJ2aWNlID0ge1xyXG4gICAgICAgIGdldENjY0NvbmNsdXNpb25zOiBnZXRDY2NDb25jbHVzaW9ucyxcclxuICAgICAgICBnZXRDbGFzc2lmaWNhdGlvbk90aGVyOiBnZXRDbGFzc2lmaWNhdGlvbk90aGVyLFxyXG4gICAgICAgIGdldFNlY3Rpb25zQW5kQ2hhcHRlcnNXaXRoRXhwbGFuYXRvcnlOb3RlczogZ2V0U2VjdGlvbnNBbmRDaGFwdGVyc1dpdGhFeHBsYW5hdG9yeU5vdGVzLFxyXG4gICAgICAgIGdldFN1YkNoYXB0ZXJzQW5kSGVhZGluZ3NXaXRoRXhwbGFuYXRvcnlOb3RlczogZ2V0U3ViQ2hhcHRlcnNBbmRIZWFkaW5nc1dpdGhFeHBsYW5hdG9yeU5vdGVzLFxyXG4gICAgICAgIGdldEV1RXhwbGFuYXRvcnlOb3RlczogZ2V0RXVFeHBsYW5hdG9yeU5vdGVzLFxyXG4gICAgICAgIGdldEdlcm1hbkV4cGxhbmF0b3J5Tm90ZXM6IGdldEdlcm1hbkV4cGxhbmF0b3J5Tm90ZXMsXHJcbiAgICAgICAgZ2V0V2NvRXhwbGFuYXRvcnlOb3RlczogZ2V0V2NvRXhwbGFuYXRvcnlOb3RlcyxcclxuICAgICAgICBnZXROZXdFbmdsaXNoQ2xhc3NpZmljYXRpb25zOiBnZXROZXdFbmdsaXNoQ2xhc3NpZmljYXRpb25zLFxyXG4gICAgICAgIGdldE9sZEVuZ2xpc2hDbGFzc2lmaWNhdGlvbnM6IGdldE9sZEVuZ2xpc2hDbGFzc2lmaWNhdGlvbnMsXHJcbiAgICAgICAgZ2V0VGFyaWZlcmluZ2VuOiBnZXRUYXJpZmVyaW5nZW4sXHJcbiAgICAgICAgZ2V0V2NvQ2xhc3NpZmljYXRpb25PcGluaW9uczogZ2V0V2NvQ2xhc3NpZmljYXRpb25PcGluaW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gZm9ybVVybChhcGksIHVybCkge1xyXG4gICAgICAgIHZhciBzZXBhcmF0b3IgPSB1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJztcclxuICAgICAgICByZXR1cm4gY29tbW9uLmNvbmZpZy5hcGlIb3N0c1thcGldICsgdXJsICsgc2VwYXJhdG9yICtcclxuICAgICAgICAgICAgJ2xhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICcmcmVmZXJlbmNlY291bnRyeT0nICsgc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnkgK1xyXG4gICAgICAgICAgICAnJmRhdGU9JyArIHN0YXRlLmZpbHRlci5kYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldENsYXNzaWZpY2F0aW9uT3RoZXIoY29kZSkge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG5cclxuICAgICAgICB2YXIgcmVxID0gY29udGV4dC5nZXQoZm9ybVVybCgnZ2VuZXJpYycsICcvY2xhc3NpZmljYXRpb25zL290aGVyLycgKyBjb2RlKSlcclxuICAgICAgICAgICAgLnRoZW4oZGVmZXJyZWQucmVzb2x2ZSwgZGVmZXJyZWQucmVqZWN0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogaWYgd2UgY2FjaGUgdGhlc2UsIGFkZCBtb3JlIG1ldGFkYXRhIChzZWUgbm9tZW5jbGF0dXJlLWRhdGEuanMpXHJcbiAgICB2YXIgaXRlbXNXaXRoRXhwbGFuYXRvcnlOb3RlcyA9IHtcclxuICAgICAgICBzZWN0aW9uc0FuZENoYXB0ZXJzOiBudWxsLFxyXG4gICAgICAgIHN1YmNoYXB0ZXJzQW5kSGVhZGluZ3M6IHt9XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGdldFdjb0V4cGxhbmF0b3J5Tm90ZXMobm9tZW5jbGF0dXJlTGV2ZWwsIGdvb2RzQ29kZU9yU2VjdGlvbk51bWJlcikge1xyXG4gICAgICAgIG5vbWVuY2xhdHVyZUxldmVsID0gbm9tZW5jbGF0dXJlTGV2ZWwudG9VcHBlckNhc2UoKTtcclxuICAgICAgICB2YXIgdXJsID0gZm9ybVVybCgnZ2VuZXJpYycsICcvd2NvLWV4cGxhbmF0b3J5LW5vdGVzLWZvci1nb29kc2NvZGUvJyArIG5vbWVuY2xhdHVyZUxldmVsICsgJy8nICsgZ29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyKTtcclxuICAgICAgICByZXR1cm4gY29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRFdUV4cGxhbmF0b3J5Tm90ZXMobm9tZW5jbGF0dXJlTGV2ZWwsIGdvb2RzQ29kZU9yU2VjdGlvbk51bWJlcikge1xyXG4gICAgICAgIG5vbWVuY2xhdHVyZUxldmVsID0gbm9tZW5jbGF0dXJlTGV2ZWwudG9VcHBlckNhc2UoKTtcclxuICAgICAgICB2YXIgdXJsID0gZm9ybVVybCgnZ2VuZXJpYycsICcvZXUtZXhwbGFuYXRvcnktbm90ZXMtZm9yLWdvb2RzY29kZS8nICsgbm9tZW5jbGF0dXJlTGV2ZWwgKyAnLycgKyBnb29kc0NvZGVPclNlY3Rpb25OdW1iZXIpO1xyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEdlcm1hbkV4cGxhbmF0b3J5Tm90ZXMobm9tZW5jbGF0dXJlTGV2ZWwsIGdvb2RzQ29kZU9yU2VjdGlvbk51bWJlcikge1xyXG4gICAgICAgIG5vbWVuY2xhdHVyZUxldmVsID0gbm9tZW5jbGF0dXJlTGV2ZWwudG9VcHBlckNhc2UoKTtcclxuICAgICAgICB2YXIgdXJsID0gZm9ybVVybCgnZHR2JywgJy9lenQvZXhwbGFuYXRvcnktbm90ZXMvJyArIG5vbWVuY2xhdHVyZUxldmVsICsgJy8nICsgZ29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyKTtcclxuICAgICAgICByZXR1cm4gY29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRTZWN0aW9uc0FuZENoYXB0ZXJzV2l0aEV4cGxhbmF0b3J5Tm90ZXMoKSB7XHJcbiAgICAgICAgdmFyIGRlZmVycmVkID0gY29tbW9uLiRxLmRlZmVyKCk7XHJcbiAgICAgICAgaWYgKGl0ZW1zV2l0aEV4cGxhbmF0b3J5Tm90ZXMuc2VjdGlvbnNBbmRDaGFwdGVycykge1xyXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGl0ZW1zV2l0aEV4cGxhbmF0b3J5Tm90ZXMuc2VjdGlvbnNBbmRDaGFwdGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gZm9ybVVybCgnZ2VuZXJpYycsICcvZXhwbGFuYXRvcnktbm90ZXMvc2VjdGlvbnMtYW5kLWNoYXB0ZXJzLXdpdGgtbm90ZXMvJyk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZ2V0KHVybCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbXNXaXRoRXhwbGFuYXRvcnlOb3Rlcy5zZWN0aW9uc0FuZENoYXB0ZXJzID0gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFN1YkNoYXB0ZXJzQW5kSGVhZGluZ3NXaXRoRXhwbGFuYXRvcnlOb3RlcyhjaGFwdGVySWQpIHtcclxuICAgICAgICB2YXIgZGVmZXJyZWQgPSBjb21tb24uJHEuZGVmZXIoKTtcclxuICAgICAgICBpZiAoaXRlbXNXaXRoRXhwbGFuYXRvcnlOb3Rlcy5zdWJjaGFwdGVyc0FuZEhlYWRpbmdzW2NoYXB0ZXJJZF0pIHtcclxuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShpdGVtc1dpdGhFeHBsYW5hdG9yeU5vdGVzLnN1YmNoYXB0ZXJzQW5kSGVhZGluZ3NbY2hhcHRlcklkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gZm9ybVVybCgnZ2VuZXJpYycsICcvZXhwbGFuYXRvcnktbm90ZXMvc3ViY2hhcHRlcnMtYW5kLWhlYWRpbmdzLXdpdGgtbm90ZXMvJyArIGNoYXB0ZXJJZCk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZ2V0KHVybCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbXNXaXRoRXhwbGFuYXRvcnlOb3Rlcy5zdWJjaGFwdGVyc0FuZEhlYWRpbmdzW2NoYXB0ZXJJZF0gPSByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0VGFyaWZlcmluZ2VuKGNvZGUpIHtcclxuICAgICAgICB2YXIgZGVmZXJyZWQgPSBjb21tb24uJHEuZGVmZXIoKTtcclxuXHJcbiAgICAgICAgdmFyIHJlcSA9IGNvbnRleHQuZ2V0KGZvcm1VcmwoJ2dlbmVyaWMnLCAnL2NsYXNzaWZpY2F0aW9ucy90YXJpZmVyaW5nZW4vJyArIGNvZGUpKVxyXG4gICAgICAgICAgICAudGhlbihkZWZlcnJlZC5yZXNvbHZlLCBkZWZlcnJlZC5yZWplY3QpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXROZXdFbmdsaXNoQ2xhc3NpZmljYXRpb25zKGNvZGUpIHtcclxuICAgICAgICB2YXIgdXJsID0gZm9ybVVybCgnZ2VuZXJpYycsICcvY2xhc3NpZmljYXRpb25zL2VuLWFmdGVyLTIwMTMvJyArIGNvZGUpO1xyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldE9sZEVuZ2xpc2hDbGFzc2lmaWNhdGlvbnMoY29kZSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBmb3JtVXJsKCdnZW5lcmljJywgJy9jbGFzc2lmaWNhdGlvbnMvZW4tYmVmb3JlLTIwMTQvJyArIGNvZGUpO1xyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFdjb0NsYXNzaWZpY2F0aW9uT3BpbmlvbnMoY29kZSkge1xyXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGNvbW1vbi4kcS5kZWZlcigpO1xyXG4gICAgICAgIGlmICghaWRlbnRpdHkuaGFzUGVybWlzc2lvbigndG9lbGljaHRpbmdlbl93Y28nKSkge1xyXG4gICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZ2V0KGZvcm1VcmwoJ2dlbmVyaWMnLCAnL2NsYXNzaWZpY2F0aW9ucy93Y28vJyArIGNvZGUpKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZGVmZXJyZWQucmVzb2x2ZSwgZGVmZXJyZWQucmVqZWN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q2NjQ29uY2x1c2lvbnMoY29tbW9kaXR5Q29kZSwgcXVlcnkpIHtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgJy9jY2MtY29uY2x1c2lvbnMvc2VhcmNoP2xhbmc9ZW4nO1xyXG4gICAgICAgIGlmKGNvbW1vZGl0eUNvZGUpIHtcclxuICAgICAgICAgICAgdXJsID0gdXJsICsgJyZnb29kc2NvZGU9JyArIGNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIHVybCA9IHVybCArICcmcT0nICsgcXVlcnk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldCh1cmwpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG59IiwiYW5ndWxhci5tb2R1bGUoJ3RhcmljLnRyYWRlTW92ZW1lbnQnLCBbXSlcclxuICAgIC5mYWN0b3J5KCd0cmFkZU1vdmVtZW50U2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvdHJhZGUtbW92ZW1lbnQnKSlcclxuOyIsIm1vZHVsZS5leHBvcnRzID0gWydhcHBsaWNhdGlvblN0YXRlU2VydmljZScsICdub3RpZmljYXRpb25zU2VydmljZScsICdwcmVmZXJlbmNlU2VydmljZScsIHRyYWRlTW92ZW1lbnRTZXJ2aWNlXTtcclxuXHJcbmZ1bmN0aW9uIHRyYWRlTW92ZW1lbnRTZXJ2aWNlKHN0YXRlLCBub3RpZmljYXRpb25zLCBwcmVmZXJlbmNlcykge1xyXG4gICAgXHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBzZXQ6IHNldFRyYWRlTW92ZW1lbnRcclxuICAgIH07XHJcbiAgICBcclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNldFRyYWRlTW92ZW1lbnQodHJhZGVNb3ZlbWVudCkge1xyXG4gICAgICAgIGlmICgodHJhZGVNb3ZlbWVudCAhPT0gJ2ltcG9ydCcgJiYgdHJhZGVNb3ZlbWVudCAhPT0gJ2V4cG9ydCcpIHx8IHRyYWRlTW92ZW1lbnQgPT09IHN0YXRlLmZpbHRlci5tb3ZlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0YXRlLmZpbHRlci5tb3ZlbWVudCA9IHRyYWRlTW92ZW1lbnQ7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy5wdWJsaXNoKCdmaWx0ZXJfbW92ZW1lbnRfY2hhbmdlZCcsIHRyYWRlTW92ZW1lbnQpO1xyXG4gICAgICAgIHByZWZlcmVuY2VzLnJlcGxhY2Uoe1xyXG4gICAgICAgICAgICBuYW1lOiAnbW92ZW1lbnQnLFxyXG4gICAgICAgICAgICBjYXRlZ29yeTogJ3VzZXJfcHJlZmVyZW5jZXMnLFxyXG4gICAgICAgICAgICB2YWx1ZTogdHJhZGVNb3ZlbWVudCxcclxuICAgICAgICAgICAgdmFsdWVUeXBlOiAnc3RyaW5nVmFsdWUnXHJcbiAgICAgICAgfSk7XHJcbn1cclxufSIsImFuZ3VsYXIubW9kdWxlKCd0YXJpYy50cmFkZVN0YXRpc3RpY3MnLCBbXSlcclxuICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIC5jb21wb25lbnQoJ3RyYWRlU3RhdGlzdGljc1RhYmxlJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3RyYWRlLXN0YXRpc3RpY3MtdGFibGUnKSlcclxuICAgIC5jb21wb25lbnQoJ3RyYWRlU3RhdGlzdGljc1BhZ2UnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvdHJhZGUtc3RhdGlzdGljcy1wYWdlJykpXHJcbiAgICAuZmFjdG9yeSgndHJhZGVTdGF0aXN0aWNzRGF0YVNlcnZpY2UnLCByZXF1aXJlKCcuL3NlcnZpY2VzL3RyYWRlLXN0YXRpc3RpY3MtZGF0YScpKTtcclxuXHJcbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJhdG9yKCRyb3V0ZVByb3ZpZGVyKSB7XHJcbiAgICAkcm91dGVQcm92aWRlclxyXG4gICAgICAgIC53aGVuKCcvdHJhZGUtc3RhdGlzdGljcycsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8dHJhZGUtc3RhdGlzdGljcy1wYWdlPjwvdHJhZGUtc3RhdGlzdGljcy1wYWdlPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIDtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IHRyYWRlU3RhdGlzdGljc0NvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3RyYWRlLXN0YXRpc3RpY3MvY29tcG9uZW50cy90cmFkZS1zdGF0aXN0aWNzLXBhZ2UuaHRtbCdcclxufTtcclxuXHJcblxyXG50cmFkZVN0YXRpc3RpY3NDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJGFuYWx5dGljcycsIFxyXG4gICAgJ2NvbW1vbicsIFxyXG4gICAgJ2NvdW50cnlEYXRhU2VydmljZScsXHJcbiAgICAnbm90aWZpY2F0aW9uc1NlcnZpY2UnLFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgXHJcbiAgICAndHJhZGVTdGF0aXN0aWNzRGF0YVNlcnZpY2UnLCBcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHRyYWRlU3RhdGlzdGljc0NvbnRyb2xsZXIoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgIGNvbW1vbiwgXHJcbiAgICBjb3VudHJ5RGF0YVNlcnZpY2UsXHJcbiAgICBub3RpZmljYXRpb25zLFxyXG4gICAgc3RhdGUsXHJcbiAgICB0cmFkZVN0YXRpc3RpY3NEYXRhU2VydmljZVxyXG4pIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGF2YWlsYWJsZVllYXJzOiBbJzIwMjAnXSxcclxuICAgICAgICBjb3VudHJ5TmFtZXM6IHt9LFxyXG4gICAgICAgIHBhcnRuZXJDb3VudHJpZXM6IFtdLFxyXG4gICAgICAgIHJlcG9ydGluZ0NvdW50cmllczogW10sXHJcbiAgICAgICAgcXVlcnk6IHtcclxuICAgICAgICAgICAgY29tbW9kaXR5Q29kZTogbnVsbCxcclxuICAgICAgICAgICAgcGFydG5lckNvdW50cnk6IG51bGwsXHJcbiAgICAgICAgICAgIHJlcG9ydGluZ0NvdW50cnk6IG51bGwsXHJcbiAgICAgICAgICAgIHllYXI6ICcyMDIwJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc29ydGluZzoge1xyXG4gICAgICAgICAgICBjb2x1bW5OYW1lOiAnY291bnRyeScsXHJcbiAgICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYydcclxuICAgICAgICB9LFxyXG4gICAgICAgIGV1QXZlcmFnZVJlc3VsdDogbnVsbCxcclxuICAgICAgICByZXN1bHQ6IG51bGwsXHJcbiAgICAgICAgdHJhZGVNb3ZlbWVudDogc3RhdGUuZmlsdGVyLm1vdmVtZW50LFxyXG4gICAgICAgIGxvYWREYXRhOiBsb2FkRGF0YSxcclxuICAgICAgICByZXBvcnRpbmdDb3VudHJ5Q2hhbmdlZDogcmVwb3J0aW5nQ291bnRyeUNoYW5nZWQsXHJcbiAgICAgICAgcGFydG5lckNvdW50cnlDaGFuZ2VkOiBwYXJ0bmVyQ291bnRyeUNoYW5nZWQsXHJcbiAgICAgICAgeWVhckNoYW5nZWQ6IHllYXJDaGFuZ2VkXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCcvdHJhZGUtc3RhdGlzdGljcycpO1xyXG4gICAgICAgIGxvYWRBdmFpbGFibGVZZWFycygpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1vbi4kcS5hbGwoW1xyXG4gICAgICAgICAgICAgICAgICAgIGxvYWREYXRhKCksXHJcbiAgICAgICAgICAgICAgICAgICAgY291bnRyeURhdGFTZXJ2aWNlLmdldEV1Q291bnRyaWVzKHsgcmVmZXJlbmNlQ291bnRyeTogJ0VVJyB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihjb3VudHJpZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLnJlcG9ydGluZ0NvdW50cmllcyA9IF8uZmlsdGVyKGNvdW50cmllcywgZnVuY3Rpb24gKGNvdW50cnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyeS5jb2RlICE9PSAnWEknO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbmNsdWRlIEdCICg/KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW5jbHVkZSBYSSAoPylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgY291bnRyeURhdGFTZXJ2aWNlLmdldENvdW50cmllcyh7IHJlZmVyZW5jZUNvdW50cnk6ICdFVScgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNvdW50cmllcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ucGFydG5lckNvdW50cmllcyA9IF8uZmlsdGVyKGNvdW50cmllcywgZnVuY3Rpb24gKGNvdW50cnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyeS5jb2RlICE9PSAnWEknO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbmNsdWRlIEdCICg/KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW5jbHVkZSBYSSAoPylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgXSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVwb3J0aW5nQ291bnRyeU5hbWVzID0gXy5jaGFpbih2bS5yZXBvcnRpbmdDb3VudHJpZXMpLmtleUJ5KCdjb2RlJykubWFwVmFsdWVzKCduYW1lJykudmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIHZhciBwYXJ0bmVyQ291bnRyeU5hbWVzID0gXy5jaGFpbih2bS5wYXJ0bmVyQ291bnRyaWVzKS5rZXlCeSgnY29kZScpLm1hcFZhbHVlcygnbmFtZScpLnZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICB2bS5jb3VudHJ5TmFtZXMgPSBfLm1lcmdlKHZtLmNvdW50cnlOYW1lcywgcmVwb3J0aW5nQ291bnRyeU5hbWVzLCBwYXJ0bmVyQ291bnRyeU5hbWVzKTtcclxuICAgICAgICAgICAgICAgIHZtLmNvdW50cnlOYW1lc1snUlMnXSA9IHZtLmNvdW50cnlOYW1lc1snWFMnXTtcclxuICAgICAgICAgICAgICAgIHNvcnRSZXN1bHRzQnkodm0uc29ydGluZy5jb2x1bW5OYW1lLCB2bS5zb3J0aW5nLnNvcnRPcmRlcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIG5vdGlmaWNhdGlvbnMuc3Vic2NyaWJlKCdmaWx0ZXJfbW92ZW1lbnRfY2hhbmdlZCcsIG1vdmVtZW50Q2hhbmdlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy51bnN1YnNjcmliZSgnZmlsdGVyX21vdmVtZW50X2NoYW5nZWQnLCBtb3ZlbWVudENoYW5nZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGxvYWRBdmFpbGFibGVZZWFycygpIHtcclxuICAgICAgICByZXR1cm4gdHJhZGVTdGF0aXN0aWNzRGF0YVNlcnZpY2UuZ2V0QXZhaWxhYmxlWWVhcnMoKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoeWVhcnMpIHtcclxuICAgICAgICAgICAgICAgIHZtLmF2YWlsYWJsZVllYXJzID0geWVhcnM7XHJcbiAgICAgICAgICAgICAgICB2bS5xdWVyeS55ZWFyID0geWVhcnNbMF07ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbW92ZW1lbnRDaGFuZ2VkKHRyYWRlTW92ZW1lbnQpIHtcclxuICAgICAgICB2bS50cmFkZU1vdmVtZW50ID0gdHJhZGVNb3ZlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzb3J0UmVzdWx0c0J5KGNvbHVtbk5hbWUsIHNvcnRPcmRlcikge1xyXG4gICAgICAgIHZhciB5ZWFyID0gdm0ucmVzdWx0LnllYXJzWzBdO1xyXG4gICAgICAgIGlmIChjb2x1bW5OYW1lID09PSAnY291bnRyeScpIHtcclxuICAgICAgICAgICAgdm0ucmVzdWx0LnJvd3MgPSBfLm9yZGVyQnkodm0ucmVzdWx0LnJvd3MsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5jb3VudHJ5TmFtZXNbcm93LmNvdW50cnlfaWRdO1xyXG4gICAgICAgICAgICB9LCBbIHNvcnRPcmRlciBdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0ucmVzdWx0LnJvd3MgPSBfLm9yZGVyQnkodm0ucmVzdWx0LnJvd3MsIGZ1bmN0aW9uKHJvdykge1xyXG4gICAgICAgICAgICByZXR1cm4gcm93LnNhbXBsZXNbeWVhcl1bY29sdW1uTmFtZV07XHJcbiAgICAgICAgfSwgWyBzb3J0T3JkZXIgXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVwb3J0aW5nQ291bnRyeUNoYW5nZWQoY291bnRyeSkge1xyXG4gICAgICAgIHZhciBwcmV2aW91c0NvdW50cnkgPSB2bS5xdWVyeS5yZXBvcnRpbmdDb3VudHJ5O1xyXG4gICAgICAgIGlmIChjb3VudHJ5KSB7XHJcbiAgICAgICAgICAgIHZtLnF1ZXJ5LnJlcG9ydGluZ0NvdW50cnkgPSBjb3VudHJ5LmNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2bS5xdWVyeS5yZXBvcnRpbmdDb3VudHJ5ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZtLnF1ZXJ5LnJlcG9ydGluZ0NvdW50cnkgIT09IHByZXZpb3VzQ291bnRyeSkge1xyXG4gICAgICAgICAgICBsb2FkRGF0YSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwYXJ0bmVyQ291bnRyeUNoYW5nZWQoY291bnRyeSkge1xyXG4gICAgICAgIHZhciBwcmV2aW91c0NvdW50cnkgPSB2bS5xdWVyeS5wYXJ0bmVyQ291bnRyeTtcclxuICAgICAgICBpZiAoY291bnRyeSkge1xyXG4gICAgICAgICAgICB2bS5xdWVyeS5wYXJ0bmVyQ291bnRyeSA9IGNvdW50cnkuY29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLnF1ZXJ5LnBhcnRuZXJDb3VudHJ5ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZtLnF1ZXJ5LnBhcnRuZXJDb3VudHJ5ICE9PSBwcmV2aW91c0NvdW50cnkpIHtcclxuICAgICAgICAgICAgbG9hZERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24geWVhckNoYW5nZWQoKSB7XHJcbiAgICAgICAgbG9hZERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkRGF0YSgpIHtcclxuICAgICAgICB2bS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGlmICh2bS5xdWVyeS5wYXJ0bmVyQ291bnRyeSkge1xyXG4gICAgICAgICAgICAvLyBMb2FkIGJvdGggdGhlIGRldGFpbGVkIHN0YXRpc3RpY3MgKGFzIGJlbG93KSBhbmQgdGhlIEVVIGF2ZXJhZ2VcclxuICAgICAgICAgICAgcmV0dXJuIGNvbW1vbi4kcS5hbGwoW3RyYWRlU3RhdGlzdGljc0RhdGFTZXJ2aWNlLmdldFRyYWRlU3RhdGlzdGljcyh2bS5xdWVyeSksIHRyYWRlU3RhdGlzdGljc0RhdGFTZXJ2aWNlLmdldEV1QXZlcmFnZVRyYWRlU3RhdGlzdGljcyh2bS5xdWVyeSldKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnJlc3VsdCA9IHJlc3VsdHNbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZXVBdmVyYWdlUmVzdWx0ID0gcmVzdWx0c1sxXTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRyYWRlU3RhdGlzdGljc0RhdGFTZXJ2aWNlLmdldFRyYWRlU3RhdGlzdGljcyh2bS5xdWVyeSlcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5yZXN1bHQgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgc29ydFJlc3VsdHNCeSh2bS5zb3J0aW5nLmNvbHVtbk5hbWUsIHZtLnNvcnRpbmcuc29ydE9yZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2bTtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgY291bnRyeU5hbWVzOiAnPCcsXHJcbiAgICAgICAgZmlyc3RDb2x1bW5MYWJlbDogJzwnLFxyXG4gICAgICAgIHJlc3VsdDogJzwnLFxyXG4gICAgICAgIHRyYWRlTW92ZW1lbnQ6ICc8J1xyXG4gICAgfSxcclxuICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICBjb250cm9sbGVyOiB0cmFkZVN0YXRpc3RpY3NUYWJsZUNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3RyYWRlLXN0YXRpc3RpY3MvY29tcG9uZW50cy90cmFkZS1zdGF0aXN0aWNzLXRhYmxlLmh0bWwnXHJcbn07XHJcblxyXG50cmFkZVN0YXRpc3RpY3NUYWJsZUNvbnRyb2xsZXIuJGluamVjdCA9IFtdO1xyXG5cclxuZnVuY3Rpb24gdHJhZGVTdGF0aXN0aWNzVGFibGVDb250cm9sbGVyKCkge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBvbkNsaWNrU29ydEJ5OiBvbkNsaWNrU29ydEJ5LFxyXG4gICAgICAgIHNvcnRpbmc6IHtcclxuICAgICAgICAgICAgY29sdW1uTmFtZTogJ2NvdW50cnknLFxyXG4gICAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gb25DbGlja1NvcnRCeShjb2x1bW5OYW1lKSB7XHJcbiAgICAgICAgdmFyIHNvcnRPcmRlcjtcclxuICAgICAgICBpZiAodm0ucmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW5OYW1lID09PSB2bS5zb3J0aW5nLmNvbHVtbk5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHNvcnRPcmRlciA9IHZtLnNvcnRpbmcuc29ydE9yZGVyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbHVtbk5hbWUgPT09ICdpbXBvcnRfdmFsdWUnIHx8IGNvbHVtbk5hbWUgPT09ICdpbXBvcnRfd2VpZ2h0JyB8fCBjb2x1bW5OYW1lID09PSAnZXhwb3J0X3ZhbHVlJyB8fCBjb2x1bW5OYW1lID09PSAnZXhwb3J0X3dlaWdodCcpIHtcclxuICAgICAgICAgICAgICAgIHNvcnRPcmRlciA9ICdkZXNjJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNvcnRPcmRlciA9ICdhc2MnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZtLnNvcnRpbmcuY29sdW1uTmFtZSA9IGNvbHVtbk5hbWU7XHJcbiAgICAgICAgICAgIHZtLnNvcnRpbmcuc29ydE9yZGVyID0gc29ydE9yZGVyO1xyXG4gICAgICAgICAgICBzb3J0UmVzdWx0c0J5KGNvbHVtbk5hbWUsIHNvcnRPcmRlcilcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc29ydFJlc3VsdHNCeShjb2x1bW5OYW1lLCBzb3J0T3JkZXIpIHtcclxuICAgICAgICB2YXIgeWVhciA9IHZtLnJlc3VsdC55ZWFyc1swXTtcclxuICAgICAgICBpZiAoY29sdW1uTmFtZSA9PT0gJ2NvdW50cnknKSB7XHJcbiAgICAgICAgICAgIHZtLnJlc3VsdC5yb3dzID0gXy5vcmRlckJ5KHZtLnJlc3VsdC5yb3dzLCBmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdm0uY291bnRyeU5hbWVzW3Jvdy5jb3VudHJ5X2lkXTtcclxuICAgICAgICAgICAgfSwgWyBzb3J0T3JkZXIgXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZtLnJlc3VsdC5yb3dzID0gXy5vcmRlckJ5KHZtLnJlc3VsdC5yb3dzLCBmdW5jdGlvbihyb3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJvdy5zYW1wbGVzW3llYXJdW2NvbHVtbk5hbWVdO1xyXG4gICAgICAgIH0sIFsgc29ydE9yZGVyIF0pO1xyXG4gICAgfVxyXG5cclxufSIsIm1vZHVsZS5leHBvcnRzID0gWyckZmlsdGVyJywgJ2NvbW1vbicsICdkYXRhQ29udGV4dCcsICdzZXJpYWxpemF0aW9uU2VydmljZScsIHJlZ3VsYXRpb25zRGF0YVNlcnZpY2VdO1xyXG5cclxuZnVuY3Rpb24gcmVndWxhdGlvbnNEYXRhU2VydmljZSgkZmlsdGVyLCBjb21tb24sIGRhdGFDb250ZXh0LCBzZXJpYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgY2hlY2tDdXN0b21zVmFsdWU6IGNoZWNrQ3VzdG9tc1ZhbHVlLFxyXG4gICAgICAgIGdldEF2YWlsYWJsZVllYXJzOiBnZXRBdmFpbGFibGVZZWFycyxcclxuICAgICAgICBnZXRUcmFkZVN0YXRpc3RpY3M6IGdldFRyYWRlU3RhdGlzdGljcyxcclxuICAgICAgICBnZXRFdUF2ZXJhZ2VUcmFkZVN0YXRpc3RpY3M6IGdldEV1QXZlcmFnZVRyYWRlU3RhdGlzdGljc1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRBdmFpbGFibGVZZWFycygpIHtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICtcclxuICAgICAgICAgICAgJy90cmFkZS1zdGF0aXN0aWNzL2F2YWlsYWJsZS15ZWFycyc7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRFdUF2ZXJhZ2VUcmFkZVN0YXRpc3RpY3ModHJhZGVTdGF0aXN0aWNzUXVlcnkpIHtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICtcclxuICAgICAgICAgICAgJy90cmFkZS1zdGF0aXN0aWNzL2V1LWF2ZXJhZ2UnICtcclxuICAgICAgICAgICAgJz9sYW5nPScgKyBjb21tb24ubGFuZ3VhZ2UuZ2V0KCk7XHJcbiAgICAgICAgaWYgKHRyYWRlU3RhdGlzdGljc1F1ZXJ5LnBhcnRuZXJDb3VudHJ5KSB7XHJcbiAgICAgICAgICAgIHVybCArPSAnJmNvdW50cnk9JyArIHRyYWRlU3RhdGlzdGljc1F1ZXJ5LnBhcnRuZXJDb3VudHJ5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHJhZGVTdGF0aXN0aWNzUXVlcnkuY29tbW9kaXR5Q29kZSkge1xyXG4gICAgICAgICAgICB1cmwgKz0gJyZnb29kc2NvZGU9JyArIHRyYWRlU3RhdGlzdGljc1F1ZXJ5LmNvbW1vZGl0eUNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0cmFkZVN0YXRpc3RpY3NRdWVyeS55ZWFyKSB7XHJcbiAgICAgICAgICAgIHVybCArPSAnJnllYXI9JyArIHRyYWRlU3RhdGlzdGljc1F1ZXJ5LnllYXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHQuZ2V0KHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0VHJhZGVTdGF0aXN0aWNzKHRyYWRlU3RhdGlzdGljc1F1ZXJ5KSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArXHJcbiAgICAgICAgICAgICcvdHJhZGUtc3RhdGlzdGljcycgK1xyXG4gICAgICAgICAgICAnP2xhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKTtcclxuICAgICAgICBpZiAodHJhZGVTdGF0aXN0aWNzUXVlcnkucmVwb3J0aW5nQ291bnRyeSkge1xyXG4gICAgICAgICAgICB1cmwgKz0gJyZyZWZlcmVuY2Vjb3VudHJ5PScgKyB0cmFkZVN0YXRpc3RpY3NRdWVyeS5yZXBvcnRpbmdDb3VudHJ5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHJhZGVTdGF0aXN0aWNzUXVlcnkucGFydG5lckNvdW50cnkpIHtcclxuICAgICAgICAgICAgdXJsICs9ICcmY291bnRyeT0nICsgdHJhZGVTdGF0aXN0aWNzUXVlcnkucGFydG5lckNvdW50cnk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0cmFkZVN0YXRpc3RpY3NRdWVyeS5jb21tb2RpdHlDb2RlKSB7XHJcbiAgICAgICAgICAgIHVybCArPSAnJmdvb2RzY29kZT0nICsgdHJhZGVTdGF0aXN0aWNzUXVlcnkuY29tbW9kaXR5Q29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRyYWRlU3RhdGlzdGljc1F1ZXJ5LnllYXIpIHtcclxuICAgICAgICAgICAgdXJsICs9ICcmeWVhcj0nICsgdHJhZGVTdGF0aXN0aWNzUXVlcnkueWVhcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjaGVja0N1c3RvbXNWYWx1ZShjaGVja0N1c3RvbXNWYWx1ZVF1ZXJ5KSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArXHJcbiAgICAgICAgICAgICcvdHJhZGUtc3RhdGlzdGljcy9jdXN0b21zLXZhbHVlLWNoZWNrJyArXHJcbiAgICAgICAgICAgICc/bGFuZz0nICsgY29tbW9uLmxhbmd1YWdlLmdldCgpICtcclxuICAgICAgICAgICAgJyZyZWZlcmVuY2Vjb3VudHJ5PScgKyBjaGVja0N1c3RvbXNWYWx1ZVF1ZXJ5LnJlcG9ydGluZ0NvdW50cnkgK1xyXG4gICAgICAgICAgICAnJmNvdW50cnk9JyArIGNoZWNrQ3VzdG9tc1ZhbHVlUXVlcnkucGFydG5lckNvdW50cnkgK1xyXG4gICAgICAgICAgICAnJmdvb2RzY29kZT0nICsgY2hlY2tDdXN0b21zVmFsdWVRdWVyeS5jb21tb2RpdHlDb2RlICtcclxuICAgICAgICAgICAgJyZjdXN0b21zdmFsdWU9JyArIHNlcmlhbGl6YXRpb25TZXJ2aWNlLnNlcmlhbGl6ZUN1c3RvbXNWYWx1ZShjaGVja0N1c3RvbXNWYWx1ZVF1ZXJ5LmN1c3RvbXNWYWx1ZSkgK1xyXG4gICAgICAgICAgICAnJnF1YW50aXRpZXM9JyArIHNlcmlhbGl6YXRpb25TZXJ2aWNlLnNlcmlhbGl6ZVF1YW50aXRpZXMoY2hlY2tDdXN0b21zVmFsdWVRdWVyeS5xdWFudGl0aWVzKSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgY2hlY2tDdXN0b21zVmFsdWVRdWVyeS5kYXRlO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YUNvbnRleHRcclxuICAgICAgICAgICAgLmdldCh1cmwpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5DdXJyZW50Q3VzdG9tc1ZhbHVlUGVyVW5pdE9mV2VpZ2h0Rm9ybWF0dGVkID0gXHJcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRm9ybWF0dGVkVmFsdWVQZXJVbml0T2ZXZWlnaHQocmVzdWx0LkN1c3RvbXNWYWx1ZVBlclVuaXRPZldlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5BdmVyYWdlQ3VzdG9tc1ZhbHVlUGVyVW5pdE9mV2VpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LkF2ZXJhZ2VDdXN0b21zVmFsdWVQZXJVbml0T2ZXZWlnaHRGb3JtYXR0ZWQgPSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRm9ybWF0dGVkVmFsdWVQZXJVbml0T2ZXZWlnaHQocmVzdWx0LkF2ZXJhZ2VDdXN0b21zVmFsdWVQZXJVbml0T2ZXZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdC5QZXJjZW50YWdlID0gJGZpbHRlcignbnVtYmVyJykocmVzdWx0LlZhbHVlQ29tcGFyZWRUb0F2ZXJhZ2UgKiAxMDAsIDIpICsgJyUnO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY3JlYXRlRm9ybWF0dGVkVmFsdWVQZXJVbml0T2ZXZWlnaHQodmFsdWVQZXJVbml0KSB7XHJcbiAgICAgICAgcmV0dXJuICRmaWx0ZXIoJ251bWJlcicpKHZhbHVlUGVyVW5pdC5WYWx1ZS5BbW91bnQsIDIpICsgJyAnICtcclxuICAgICAgICAgICAgJGZpbHRlcigndG9DdXJyZW5jeVNpZ24nKSh2YWx1ZVBlclVuaXQuVmFsdWUuTW9uZXRhcnlVbml0LmNvZGUpICsgJyAvICcgK1xyXG4gICAgICAgICAgICAodmFsdWVQZXJVbml0LlVuaXQuTWVhc3VyZW1lbnRVbml0LmNvZGUgPT09ICdLR00nID8gJ2tnJyA6IHZhbHVlUGVyVW5pdC5Vbml0Lk1lYXN1cmVtZW50VW5pdC5jb2RlKVxyXG4gICAgfVxyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYWNjb3VudDogcmVxdWlyZSgnLi9hY2NvdW50JyksXHJcbiAgICBidGk6IHJlcXVpcmUoJy4vYnRpJyksXHJcbiAgICBhdHI6IHJlcXVpcmUoJy4vYXRyJyksXHJcbiAgICBjYXNlTGF3OiByZXF1aXJlKCcuL2Nhc2UtbGF3JyksXHJcbiAgICBjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb246IHJlcXVpcmUoJy4vY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbicpLFxyXG4gICAgY29tcGxpYW5jZTogcmVxdWlyZSgnLi9jb21wbGlhbmNlJyksXHJcbiAgICBjb25jbHVzaW9uOiByZXF1aXJlKCcuL2NvbmNsdXNpb24nKSwgICAgXHJcbiAgICBjb3JyZWxhdGlvblRhYmxlOiByZXF1aXJlKCcuL2NvcnJlbGF0aW9uLXRhYmxlJyksXHJcbiAgICBjdXN0b21zVmFsdWU6IHJlcXVpcmUoJy4vY3VzdG9tcy12YWx1ZScpLFxyXG4gICAgY3VzdG9tc1ZhbHVlQ2hlY2s6IHJlcXVpcmUoJy4vY3VzdG9tcy12YWx1ZS1jaGVjaycpLFxyXG4gICAgZGFzaGJvYXJkOiByZXF1aXJlKCcuL2Rhc2hib2FyZCcpLFxyXG4gICAgZG9jdW1lbnRhdGlvbjogcmVxdWlyZSgnLi9kb2N1bWVudGF0aW9uJyksXHJcbiAgICBleGNoYW5nZVJhdGVzOiByZXF1aXJlKCcuL2V4Y2hhbmdlLXJhdGVzJyksXHJcbiAgICBlenQ6IHJlcXVpcmUoJy4vZXp0JyksXHJcbiAgICBmb3JtTGFiZWxzOiByZXF1aXJlKCcuL2Zvcm0tbGFiZWxzJyksXHJcbiAgICBlY2ljczogcmVxdWlyZSgnLi9lY2ljcycpLFxyXG4gICAgZ29vZHM6IHJlcXVpcmUoJy4vZ29vZHMnKSxcclxuICAgIG1haW5NZW51OiByZXF1aXJlKCcuL21haW4tbWVudScpLFxyXG4gICAgbmV3czogcmVxdWlyZSgnLi9uZXdzJyksXHJcbiAgICBub21lbmNsYXR1cmU6IHJlcXVpcmUoJy4vbm9tZW5jbGF0dXJlJyksXHJcbiAgICBxdW90YTogcmVxdWlyZSgnLi9xdW90YScpLFxyXG4gICAgcmVmZXJlbmNlcHJpY2VzOiByZXF1aXJlKCcuL3JlZmVyZW5jZXByaWNlcycpLFxyXG4gICAgcmVndWxhdGlvbjogcmVxdWlyZSgnLi9yZWd1bGF0aW9uJyksXHJcbiAgICBzZWFyY2g6IHJlcXVpcmUoJy4vc2VhcmNoJyksXHJcbiAgICBzaGFyZWQ6IHtcclxuICAgICAgICBtZXNzYWdlczogcmVxdWlyZSgnLi9zaGFyZWQtbWVzc2FnZXMnKSxcclxuICAgICAgICB1aTogcmVxdWlyZSgnLi9zaGFyZWQtdWknKSxcclxuICAgIH0sXHJcbiAgICBzb3J0T3B0aW9uczogcmVxdWlyZSgnLi9zb3J0LW9wdGlvbnMnKSxcclxuICAgIHN0YXR1czogcmVxdWlyZSgnLi9zdGF0dXMnKSxcclxuICAgIHRhcmVzOiByZXF1aXJlKCcuL3RhcmVzJyksXHJcbiAgICB0YXJpYzogcmVxdWlyZSgnLi90YXJpYycpLFxyXG4gICAgdHJhZGVTdGF0aXN0aWNzOiByZXF1aXJlKCcuL3RyYWRlLXN0YXRpc3RpY3MnKSxcclxuICAgIHZhbGlkYXRlQnVzaW5lc3NJbmZvOiByZXF1aXJlKCcuL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8nKSxcclxuICAgIHZhbGlkYXRpb25FcnJvcnM6IHJlcXVpcmUoJy4vdmFsaWRhdGlvbi1lcnJvcnMnKSxcclxufTtcclxuIiwi77u/Ly8gU2VlIGh0dHBzOi8vYXBwLnRhcmljc3VwcG9ydC5jb20vIyEvYWNjb3VudC9jaGFuZ2UtcGFzc3dvcmRcclxuLy8gU2VlIGh0dHBzOi8vYXBwLnRhcmljc3VwcG9ydC5jb20vIyEvYWNjb3VudC9sb2dpblxyXG4vLyBTZWUgaHR0cHM6Ly9hcHAudGFyaWNzdXBwb3J0LmNvbS8jIS9hY2NvdW50L2ZvcmdvdC1wYXNzd29yZFxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNoYW5nZVBhc3N3b3JkOiB7XHJcbiAgICAgICAgY2hhbmdlUGFzc3dvcmQ6ICdDaGFuZ2UgcGFzc3dvcmQnLFxyXG4gICAgICAgIGN1cnJlbnRQYXNzd29yZDogJ0N1cnJlbnQgcGFzc3dvcmQnLFxyXG4gICAgICAgIGVycm9yQ3VycmVudFBhc3N3b3JkOiAnVGhlIGN1cnJlbnQgcGFzc3dvcmQgd2FzIG5vdCBmaWxsZWQgaW4nLFxyXG4gICAgICAgIGVycm9yTmV3UGFzc3dvcmRFbXB0eTogJ1RoZSBuZXcgcGFzc3dvcmQgd2FzIG5vdCBmaWxsZWQgaW4nLFxyXG4gICAgICAgIGVycm9yTmV3UGFzc3dvcmRDb21wYXJlOiAnVGhlIG5ldyBwYXNzd29yZHMgZG8gbm90IG1hdGNoJyxcclxuICAgICAgICBuZXdQYXNzd29yZDE6ICdOZXcgcGFzc3dvcmQnLFxyXG4gICAgICAgIG5ld1Bhc3N3b3JkMjogJ0NvbmZpcm0gbmV3IHBhc3N3b3JkJyxcclxuICAgICAgICBwYXNzd29yZENoYW5nZWRTdWNjZXNzZnVsbHk6ICdQYXNzd29yZCBjaGFuZ2VkIHN1Y2Nlc3NmdWxseS4nLFxyXG4gICAgICAgIGVycm9yQ2hhbmdpbmdQYXNzd29yZDogJ0Vycm9yIGNoYW5naW5nIHBhc3N3b3JkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLidcclxuICAgIH0sXHJcbiAgICBmb3Jnb3RQYXNzd29yZDoge1xyXG4gICAgICAgIGJhY2tUb0xvZ2luOiAnQmFjayB0byB0aGUgbG9nIGluIHBhZ2UnLFxyXG4gICAgICAgIGRvbmVNZXNzYWdlOiAnV2VcXCd2ZSBzZW50IGFuIGVtYWlsIHdpdGggaW5zdHJ1Y3Rpb25zIHRvIHRoZSBlbWFpbCBhZGRyZXNzIGNvbm5lY3RlZCB0byB5b3VyIGFjY291bnQuIEl0IHNob3VsZCBhcnJpdmUgd2l0aGluIHRoZSBuZXh0IGZldyBtaW51dGVzLicsXHJcbiAgICAgICAgZXhwbGFuYXRpb246ICdQbGVhc2UgZmlsbCBpbiB5b3VyIHlvdXIgdXNlcm5hbWUgYW5kIHdlIHdpbGwgc2VuZCB5b3UgYW4gZW1haWwgd2l0aCBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGNyZWF0ZSBhIG5ldyBwYXNzd29yZCBmb3IgeW91ciBhY2NvdW50JyxcclxuICAgICAgICBmb3Jnb3RQYXNzd29yZDogJ0ZvcmdvdCB5b3VyIHBhc3N3b3JkPycsXHJcbiAgICAgICAgcmVzZXRQYXNzd29yZDogJ1Jlc2V0IHBhc3N3b3JkJ1xyXG4gICAgfSxcclxuICAgIGxvZ2luOiB7XHJcbiAgICAgICAgZXJyb3I6ICdVc2VybmFtZSBvciBwYXNzd29yZCBpbmNvcnJlY3QnLFxyXG4gICAgICAgIGxvZ0luOiAnTG9nIGluJyxcclxuICAgICAgICBwYXNzd29yZDogJ1Bhc3N3b3JkJyxcclxuICAgICAgICByZW1lbWJlck1lOiAnS2VlcCBtZSBsb2dnZWQgaW4nLFxyXG4gICAgICAgIHVzZXJuYW1lOiAnVXNlcm5hbWUnXHJcbiAgICB9LFxyXG4gICAgbG9nb3V0OiB7XHJcbiAgICAgICAgc2lnbmVkT3V0OiAnWW91IGhhdmUgYmVlbiBsb2dnZWQgb2ZmJyxcclxuICAgICAgICBzaWduaW5nT3V0OiAnWW91IGFyZSBiZWluZyBsb2dnZWQgb2ZmLi4uJyxcclxuICAgICAgICB0aXRsZTogJ0xvZyBvdXQnXHJcbiAgICB9LFxyXG4gICAgcmVzZXRQYXNzd29yZDoge1xyXG4gICAgICAgIGJhY2tUb0xvZ2luOiAnQmFjayB0byB0aGUgbG9naW4gcGFnZScsXHJcbiAgICAgICAgZG9uZU1lc3NhZ2U6ICdZb3UgaGF2ZSBzdWNjZXNmdWxseSBjcmVhdGVkIGEgbmV3IHBhc3N3b3JkLiBZb3UgY2FuIHVzZSBpdCB0byBsb2cgaW4gdG8geW91ciBUYXJpYyBTdXBwb3J0IGFjY291bnQuJyxcclxuICAgICAgICBlcnJvcnM6IHtcclxuICAgICAgICAgICAgJ1BBU1NXT1JEX0lOVkFMSURfVE9LRU4nOiAnWW91ciBwYXNzd29yZCByZXNldCByZXF1ZXN0IGlzIG5vdCB2YWxpZCBhbnltb3JlJyxcclxuICAgICAgICAgICAgJ1BBU1NXT1JEX0lTQ1VSUkVOVCc6ICdUaGUgcGFzc3dvcmQgeW91XFwndmUgZW50ZXJlZCBhcyBcXCdDdXJyZW50IHBhc3N3b3JkXFwnIGlzIG5vdCB5b3VyIGN1cnJlbnQgcGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAnUEFTU1dPUkRfTUlOSU1VTV9MRU5HVEgnOiAnVGhlIHBhc3N3b3JkIHNob3VsZCBiZSBhdCBsZWFzdCA4IGNoYXJhY3RlcnMgbG9uZycsXHJcbiAgICAgICAgICAgICdQQVNTV09SRF9OT19MT1dFUkNBU0UnOiAnVGhlIHBhc3N3b3JkIGRvZXNuXFwndCBoYXZlIGFueSBsb3dlcmNhc2UgY2hhcmFjdGVycycsXHJcbiAgICAgICAgICAgICdQQVNTV09SRF9OT19OT05BTFBIQSc6ICdUaGUgcGFzc3dvcmQgZG9lc25cXCd0IGhhdmUgYW55IG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycycsXHJcbiAgICAgICAgICAgICdQQVNTV09SRF9OT19OVU1CRVJTJzogJ1RoZSBwYXNzd29yZCBkb2VzblxcJ3QgaGF2ZSBhbnkgbnVtYmVycycsXHJcbiAgICAgICAgICAgICdQQVNTV09SRF9OT19VUFBFUkNBU0UnOiAnVGhlIHBhc3N3b3JkIGRvZXNuXFwndCBoYXZlIGFueSB1cHBlcmNhc2UgY2hhcmFjdGVycycsXHJcbiAgICAgICAgICAgICdQQVNTV09SRF9FTVBUWSc6ICdQbGVhc2UgZmlsbCBpbiBhIG5ldyBwYXNzd29yZCcsXHJcbiAgICAgICAgICAgICdQQVNTV09SRFNfTk9URVFVQUwnOiAnVGhlIHBhc3N3b3JkcyB5b3VcXCd2ZSBlbnRlcmVkIGFyZSBub3QgdGhlIHNhbWUnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBleHBsYW5hdGlvbjogJ1lvdSBhcmUgYWJvdXQgdG8gY3JlYXRlIGEgbmV3IHBhc3N3b3JkIGZvciB5b3VyIGFjY291bnQuIFBsZWFzZSBmaWxsIGluIHRoZSBmb3JtIGJlbG93IHRvIGNvbnRpbnVlLiBZb3VyIG5ldyBwYXNzd29yZCBzaG91bGQgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHNob3VsZCBjb250YWluIGEgY29tYmluYXRpb24gb2YgbG93ZXJjYXNlLCB1cHBlcmNhc2UgYW5kIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycycsXHJcbiAgICAgICAgaW52YWxpZFRva2VuOiAnWW91ciBsaW5rIHRvIGNyZWF0ZSBhIG5ldyBwYXNzd29yZCBoYXMgZXhwaXJlZC4gUGxlYXNlIHJlcXVlc3QgYW5vdGhlciBsaW5rIGJ5IGZpbGxpbmcgb3V0IHRoZSBcXCdmb3Jnb3QgcGFzc3dvcmRcXCcgZm9ybScsXHJcbiAgICAgICAgcGFzc3dvcmQxOiAnTmV3IHBhc3N3b3JkJyxcclxuICAgICAgICBwYXNzd29yZDI6ICdSZXBlYXQgdGhlIG5ldyBwYXNzd29yZCcsXHJcbiAgICAgICAgcmVzZXRQYXNzd29yZDogJ0NyZWF0ZSBhIG5ldyBwYXNzd29yZCcsXHJcbiAgICAgICAgc3RyZW5ndGg6IHtcclxuICAgICAgICAgICAgJ2NoYXJhY3RlcnMnOiAnOCBjaGFyYWN0ZXJzJyxcclxuICAgICAgICAgICAgJ2xvd2VyY2FzZSc6ICdBdCBsZWFzdCBvbmUgbG93ZXJjYXNlIGNoYXJhY3RlcicsXHJcbiAgICAgICAgICAgICdub25hbHBoYSc6ICdBdCBsZWFzdCBvbmUgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXInLFxyXG4gICAgICAgICAgICAnbnVtYmVyJzogJ0F0IGxlYXN0IG9uZSBudW1iZXInLFxyXG4gICAgICAgICAgICAnb25lT2ZGb3VyJzogJ01hdGNoIDMgb2YgdGhlIGZvbGxvd2luZyA0IGNvbmRpdGlvbnM6JyxcclxuICAgICAgICAgICAgJ3VwcGVyY2FzZSc6ICdBdCBsZWFzdCBvbmUgdXBwZXJjYXNlIGNoYXJhY3RlcicsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59OyIsIu+7vy8vIFNlZSBodHRwczovL2FwcC50YXJpY3N1cHBvcnQuY29tLyMhL2F0ci9ob21lXHJcbi8vIFNlZSBodHRwczovL3d3dy50YXguc2VydmljZS5nb3YudWsvc2VhcmNoLWZvci1hZHZhbmNlLXRhcmlmZi1ydWxpbmdzL3NlYXJjaD9lbmFibGVUcmFja2luZ0NvbnNlbnQ9dHJ1ZVxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIEFkdmFuY2VUYXJpZmZSdWxpbmdzOiAnQWR2YW5jZSBUYXJpZmYgUnVsaW5ncycsXHJcbiAgICBBVFJzOiAnQVRScycsXHJcbiAgICBBdHJSZWZlcmVuY2U6ICdBVFIgUmVmZXJlbmNlJyxcclxuICAgIGF0dGFjaG1lbnRzOiAnQXR0YWNobWVudHMnLFxyXG4gICAgY29tbW9kaXR5RGVzY3JpcHRpb246ICdDb21tb2RpdHkgZGVzY3JpcHRpb24nLFxyXG4gICAgY29weURlc2NyaXB0aW9uOiAnVGhpcyBpbmZvcm1hdGlvbiBpcyBhIGNvcHkgb2YgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBVSyBBVFIgZGF0YWJhc2UuJyxcclxuICAgIGRldGFpbHM6ICdBVFIgRGV0YWlscycsXHJcbiAgICBhdHJMaW5rVGV4dDogJ0NsaWNrIGhlcmUgdG8gc2VlIHRoZSB1cC10by1kYXRlIHZlcnNpb24gaW4gdGhpcyBkYXRhYmFzZS4nLFxyXG4gICAgZ29vZHNEZXNjcmlwdGlvbjogJ0dvb2RzIERlc2NyaXB0aW9uJyxcclxuICAgIGlzc3VlZFNpbmNlOiAnSXNzdWVkIFNpbmNlJyxcclxuICAgIEtleXdvcmRzOiAnS2V5d29yZHMnLFxyXG4gICAgbW90aXZhdGlvbjogJ0dyb3VuZHMgZm9yIGNsYXNzaWZpY2F0aW9uJyxcclxuICAgIE5PSU1BR0U6ICdOTyBJTUFHRScsXHJcbiAgICBub0xvbmdlclZhbGlkOiAnVGhpcyBBVFIgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW4gdGhlcmVmb3JlIG5vIGxvbmdlciBiZSBmb3VuZCBpbiB0aGUgVUsgQVRSIGRhdGFiYXNlLicsXHJcbiAgICBub3RWYWxpZE9uX3JlZmVyZW5jZURhdGVfOiAnbm90IHZhbGlkIG9uIHt7IHJlZmVyZW5jZURhdGUgfCBkYXRlOiBcXCdkZC1NTS15eVxcJyB9fScsXHJcbiAgICBwb3NzaWJseUludmFsaWQ6ICdOb3RlOiBpbiBzb21lIGNhc2VzLCBBVFJzIG1heSBiZSByZXZva2VkIGJlZm9yZSB0aGVpciBub3JtYWwgcGVyaW9kIG9mIHZhbGlkaXR5IGhhcyBleHBpcmVkLiBIZW5jZSwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIEFUUiBpcyBubyBsb25nZXIgdmFsaWQuJywgXHJcbiAgICBTZWFyY2hBZHZhbmNlVGFyaWZmUnVsaW5nczogJ1NlYXJjaCBBZHZhbmNlIFRhcmlmZiBSdWxpbmdzJyxcclxuICAgIF9TdGFydERhdGVfdW50aWxfRXhwaXJ5RGF0ZV86ICd7eyBTdGFydERhdGUgfCBkYXRlOiBcXCdkZC1NTS15eXl5XFwnIH19IHVudGlsIHt7IEV4cGlyeURhdGUgfCBkYXRlOiBcXCdkZC1NTS15eXl5XFwnIH19J1xyXG59O1xyXG4iLCLvu78vLyBTZWUgaHR0cHM6Ly9hcHAudGFyaWNzdXBwb3J0LmNvbS8jIS9idGkvaG9tZVxyXG4vLyBTZWUgaHR0cHM6Ly9lYy5ldXJvcGEuZXUvdGF4YXRpb25fY3VzdG9tcy9kZHMyL2VidGkvZWJ0aV9ob21lLmpzcD9MYW5nPWVuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgQmluZGluZ1RhcmlmZkluZm9ybWF0aW9uOiAnQmluZGluZyBUYXJpZmYgSW5mb3JtYXRpb24nLFxyXG4gICAgQnRpRmlyc3RMZXR0ZXI6ICdCJyxcclxuICAgIEJ0aXM6ICdCVElzJyxcclxuICAgIEJ0aVJlZmVyZW5jZTogJ0JUSSBSZWZlcmVuY2UnLFxyXG4gICAgY29weURlc2NyaXB0aW9uOiAnVGhpcyBpbmZvcm1hdGlvbiBpcyBhIGNvcHkgb2YgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBFVSBFQlRJLWRhdGFiYXNlLicsXHJcbiAgICBjb3VudHJ5T2ZPcmlnaW46ICdJc3N1aW5nIENvdW50cnkgLyBMYW5ndWFnZScsXHJcbiAgICBkYXRlQW5kUGxhY2VPZklzc3VlOiAnRGF0ZSBhbmQgQ291bnRyeSBvZiBJc3N1ZScsXHJcbiAgICBkZXRhaWxzOiAnQlRJIERldGFpbHMnLFxyXG4gICAgZWJ0aUxpbmtUZXh0OiAnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHVwLXRvLWRhdGUgdmVyc2lvbiBpbiB0aGlzIGRhdGFiYXNlLicsXHJcbiAgICBFdXJvcGVhbkJpbmRpbmdUYXJpZmZJbmZvcm1hdGlvbjogJ0V1cm9wZWFuIEJpbmRpbmcgVGFyaWZmIEluZm9ybWF0aW9uJyxcclxuICAgIGdvb2RzRGVzY3JpcHRpb246ICdHb29kcyBEZXNjcmlwdGlvbicsXHJcbiAgICBpc3N1ZWRTaW5jZTogJ0lzc3VlZCBTaW5jZScsXHJcbiAgICBLZXl3b3JkczogJ0tleXdvcmRzJyxcclxuICAgIG1vdGl2YXRpb246ICdHcm91bmRzIGZvciBjbGFzc2lmaWNhdGlvbicsXHJcbiAgICBuYXRpb25hbEtleXdvcmRzOiAnTmF0aW9uYWwgS2V5d29yZHMnLFxyXG4gICAgTk9JTUFHRTogJ05PIElNQUdFJywgLy8gU2hvd24gaW5zdGVhZCBvZiBhbiBpbWFnZSB3aGVuIG5vIGltYWdlIGlzIGF2YWlsYWJsZVxyXG4gICAgbm9Mb25nZXJWYWxpZDogJ1RoaXMgQlRJIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2FuIHRoZXJlZm9yZSBubyBsb25nZXIgYmUgZm91bmQgaW4gdGhlIEVVIEVCVEktZGF0YWJhc2UuJyxcclxuICAgIG5vdFZhbGlkT25fcmVmZXJlbmNlRGF0ZV86ICdub3QgdmFsaWQgb24ge3sgcmVmZXJlbmNlRGF0ZSB8IGRhdGU6IFxcJ2RkLU1NLXl5XFwnIH19JyxcclxuICAgIHBvc3NpYmx5SW52YWxpZDogJ05vdGU6IGluIHNvbWUgY2FzZXMsIHN1Y2ggYXMgdGhlIHB1YmxpY2F0aW9uIG9mIGEgY2xhc3NpZmljYXRpb24gcmVndWxhdGlvbiwgQlRJcyBtYXkgYmUgcmV2b2tlZCBiZWZvcmUgdGhlaXIgbm9ybWFsIHBlcmlvZCBvZiB2YWxpZGl0eSBoYXMgZXhwaXJlZC4gSGVuY2UsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhpcyBCVEkgaXMgbm8gbG9uZ2VyIHZhbGlkLicsXHJcbiAgICBQYWdlVGl0bGVTZWFyY2hCdGlzOiAnU2VhcmNoIEJUSXMnLFxyXG4gICAgX2J0aUNvdW50X2JpbmRpbmdUYXJpZmZJbmZvcm1hdGlvbkRlY2lzaW9uc0ZvdW5kOiAne3sgYnRpQ291bnQgfX0gYmluZGluZyB0YXJpZmYgaW5mb3JtYXRpb24gZGVjaXNpb24ocykgZm91bmQnLFxyXG4gICAgX1N0YXJ0RGF0ZV91bnRpbF9FbmREYXRlXzogJ3t7IFN0YXJ0RGF0ZSB8IGRhdGU6IFxcJ2RkLU1NLXl5eXlcXCcgfX0gdW50aWwge3sgRW5kRGF0ZSB8IGRhdGU6IFxcJ2RkLU1NLXl5eXlcXCcgfX0nXHJcbn07XHJcbiIsIi8vIFNlZSBodHRwczovL2FwcC50YXJpY3N1cHBvcnQuY29tLyMhL2Nhc2UtbGF3L25ld3NcclxuLy8gU2VlIGh0dHBzOi8vYXBwLnRhcmljc3VwcG9ydC5jb20vIyEvY2FzZS1sYXcvbmxcclxuLy8gU2VlIGh0dHBzOi8vYXBwLnRhcmljc3VwcG9ydC5jb20vIyEvY2FzZS1sYXcvZXVcclxuLy8gU2VlIGh0dHBzOi8vZXVyLWxleC5ldXJvcGEuZXUvaG9tZXBhZ2UuaHRtbFxyXG4vLyBTZWUgaHR0cHM6Ly91aXRzcHJha2VuLnJlY2h0c3ByYWFrLm5sL3Jlc3VsdGFhdD9pbmhvdWRzaW5kaWNhdGllPXp0MCZwdWJsaWNhdGllc3RhdHVzPXBzMSZzb3J0PVJlbGV2YW5jZSAoaW4gRHV0Y2gpXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYnV0dG9uczoge1xyXG4gICAgICAgIE9wZW5TdW1tYXJ5OiAnT3BlbiBTdW1tYXJ5JyxcclxuICAgIH0sXHJcbiAgICBDYXNlTGF3OiAnQ2FzZSBMYXcnLFxyXG4gICAgQ2FzZUxhd0ZpcnN0TGV0dGVyOiAnQycsXHJcbiAgICBEdXRjaENhc2VMYXc6ICdEdXRjaCBDYXNlIExhdycsXHJcbiAgICBEdXRjaENhc2VMYXdTdW1tYXJ5OiAnU3VtbWFyeScsXHJcbiAgICBFdXJvcGVhbkNhc2VMYXdTdW1tYXJ5OiAnU3VtbWFyeScsXHJcbiAgICBEdXRjaENhc2VMYXdKdWRnbWVudDogJ0p1ZGdtZW50JyxcclxuICAgIEV1cm9wZWFuQ2FzZUxhdzogJ0V1cm9wZWFuIENhc2UgTGF3JyxcclxuICAgIENhc2VOdW1iZXI6ICdDYXNlIE51bWJlcicsXHJcbiAgICBFQ0xJOiAnRUNMSScsXHJcbiAgICBFbnRlckNFTEVYTnVtYmVyOiAnRW50ZXIgQ0VMRVggTnVtYmVyJyxcclxuICAgIEVudGVyRUNMSU51bWJlcjogJ0VudGVyIEVDTEkgTnVtYmVyJyxcclxuICAgIEVudGVyQ2FzZU51bWJlcjogJ0VudGVyIENhc2UgTnVtYmVyJyxcclxuICAgIFN1YmplY3Q6ICdTdWJqZWN0JyxcclxuICAgIHN1YmplY3RzOiB7XHJcbiAgICAgICAgQWxsU3ViamVjdHM6ICdBbGwgU3ViamVjdHMnLFxyXG4gICAgICAgIGR5bmFtaWM6IHtcclxuICAgICAgICAgICAgRXhjaXNlOiAnRXhjaXNlJyxcclxuICAgICAgICAgICAgQ3VzdG9tc1ZhbHVlOiAnQ3VzdG9tcyBWYWx1ZScsXHJcbiAgICAgICAgICAgIER1bXBpbmc6ICdEdW1waW5nJyxcclxuICAgICAgICAgICAgSW1wb3J0T3JFeHBvcnRQcm9jZWR1cmVzOiAnSW1wb3J0IG9yIEV4cG9ydCBQcm9jZWR1cmVzJyxcclxuICAgICAgICAgICAgQ2xhc3NpZmljYXRpb246ICdDbGFzc2lmaWNhdGlvbicsXHJcbiAgICAgICAgICAgIEltcG9ydEV4cG9ydEFkdmFuY2VGaXhpbmdDZXJ0aWZpY2F0ZXM6ICdJbXBvcnQgYW5kIEV4cG9ydCBsaWNlbmNlcyBhbmQgQWR2YW5jZS1maXhpbmcgQ2VydGlmaWNhdGVzJyxcclxuICAgICAgICAgICAgT3JpZ2luOiAnT3JpZ2luJyxcclxuICAgICAgICAgICAgRXhwb3J0UmVmdW5kczogJ0V4cG9ydCBSZWZ1bmRzJyxcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgTW9yZUNhc2VMYXc6ICdNb3JlIENhc2UgTGF3JyxcclxuICAgIFByb2NlZHVyZVR5cGVzOiAnUHJvY2VkdXJlIFR5cGVzJyxcclxuICAgIFJlZmVyZW5jZXM6ICdSZWZlcmVuY2VzJyxcclxuICAgIEZvcm1hbFJlbGF0aW9uczogJ0Zvcm1hbCBSZWxhdGlvbnMnLFxyXG4gICAgSnVkaWNpYWxBdXRob3JpdHk6ICdKdWRpY2lhbCBBdXRob3JpdHknLFxyXG4gICAgRGF0ZU9mSnVkZ21lbnQ6ICdEYXRlIG9mIEp1ZGdtZW50JyxcclxuICAgIERhdGVPZlB1YmxpY2F0aW9uOiAnRGF0ZSBvZiBQdWJsaWNhdGlvbicsXHJcbiAgICBBcmVhc09mTGF3OiAnQXJlYXMgb2YgTGF3JyxcclxuICAgIFB1YmxpY2F0aW9uTG9jYXRpb25zOiAnUHVibGljYXRpb24gTG9jYXRpb25zJywgLy8gV2hpY2ggbGVnYWwgam91cm5hbCBoYXMgdGhlIGp1ZGdtZW50IGJlZW4gcHVibGlzaGVkIGluP1xyXG4gICAgT3Blbkp1ZGdtZW50OiAnT3BlbiBKdWRnbWVudCcsXHJcbiAgICBOb0R1dGNoSnVkZ21lbnRzOiAnTm8gRHV0Y2ggSnVkZ21lbnRzJyxcclxuICAgIE5vRXVyb3BlYW5KdWRnbWVudHM6ICdObyBFdXJvcGVhbiBKdWRnbWVudHMnLFxyXG4gICAgRHV0Y2hKdWRnbWVudHM6ICdEdXRjaCBKdWRnbWVudHMnLFxyXG4gICAgRXVyb3BlYW5KdWRnbWVudHM6ICdFdXJvcGVhbiBKdWRnbWVudHMnLFxyXG4gICAgQ2FzZUxhd0Zvcl9nb29kc2NvZGVfOiAnQ2FzZSBMYXcgZm9yIHt7IGdvb2RzY29kZSB8IHN0cmlwVGFyaWNDb2RlIHwgZm9ybWF0VGFyaWNDb2RlIH19JyxcclxuICAgIENhc2VMYXdGb3JfZ29vZHNjb2RlX2FuZF9zZWFyY2hRdWVyeV86ICdDYXNlIExhdyBmb3IgY29kZSB7eyBnb29kc2NvZGUgfCBzdHJpcFRhcmljQ29kZSB8IGZvcm1hdFRhcmljQ29kZSB9fSBhbmQgcXVlcnkgXCJ7eyBzZWFyY2hRdWVyeSB9fVwiJyxcclxuICAgIENhc2VMYXdGb3Jfc2VhcmNoUXVlcnlfOiAnQ2FzZSBMYXcgZm9yIHt7IHNlYXJjaFF1ZXJ5IH19JyxcclxuICAgIF9Ub3RhbFJlc3VsdHNfcmVzdWx0czogJ3t7IFRvdGFsUmVzdWx0cyB9fSByZXN1bHRzJyAvLyBOQjogVG90YWxSZXN1bHRzIGlzIGEgbnVtYmVyXHJcbn07IiwiLy8gU2VlIGh0dHBzOi8vYXBwLnRhcmljc3VwcG9ydC5jb20vIyEvY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbnMvZW4vc2VhcmNoP29yZGVyQnk9cmVsZXZhbmNlJmluY2x1ZGVCdGlzPXRydWUmaW5jbHVkZUNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnM9dHJ1ZSZxdWVyeT10b3kmY29tbW9kaXR5Q29kZT1cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zOiAnQ2xhc3NpZmljYXRpb24gUmVndWxhdGlvbnMnLFxyXG4gICAgTm90QXZhaWxhYmxlSW5DaG9zZW5MYW5ndWFnZTogJ0NsYXNzaWZpY2F0aW9uIFJlZ3VsYXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBFbmdsaXNoIGFuZCBEdXRjaCdcclxufTsiLCLvu78vLyBTZWUgaHR0cHM6Ly9hcHAudGFyaWNzdXBwb3J0LmNvbS8jIS9jb21wbGlhbmNlLWNoZWNrXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgZXJyb3JzOiB7XHJcbiAgICAgICAgc2VsZWN0X2ZpbGVfdG9fY2hlY2s6ICdTZWxlY3QgYSBmaWxlIHRvIGNoZWNrJyxcclxuICAgICAgICBzcGVjaWZ5X3N0YXJ0aW5nX3JvdzogJ1NwZWNpZnkgdGhlIGZpcnN0IHJvdyBjb250YWluaW5nIGRhdGEgdG8gYmUgcHJvY2Vzc2VkJyxcclxuICAgICAgICBpbnZhbGlkX3N0YXJ0aW5nX3JvdzogJ1RoZSBzdGFydGluZyByb3cgaXMgaW52YWxpZCcsXHJcbiAgICAgICAgc3BlY2lmeV9qb2J0eXBlOiAnU3BlY2lmeSB3aGF0IHR5cGUgb2YgY2hlY2sgc2hvdWxkIGJlIHBlcmZvcm1lZCdcclxuICAgIH0sXHJcbiAgICBtb2RhbDoge1xyXG4gICAgICAgIGNvZGU6ICdDb2RlJyxcclxuICAgICAgICB0aXRsZTogJ0FCQyBFcnJvcnMgYW5kIFdhcm5pbmdzJyxcclxuICAgICAgICBsaW5lTnVtYmVyOiAnTGluZScsXHJcbiAgICAgICAgbWVzc2FnZTogJ01lc3NhZ2UnLFxyXG4gICAgfSxcclxuICAgIGRldGFpbHM6IHtcclxuICAgICAgICBiYWNrVG9PdmVydmlldzogJ0JhY2sgdG8gT3ZlcnZpZXcnLFxyXG4gICAgfSxcclxuICAgIG5ld0pvYjoge1xyXG4gICAgICAgIGJyZWFkY3J1bWI6ICdQcm9jZXNzIGEgTmV3IEZpbGUnLFxyXG4gICAgICAgIGNvdW50cnlPZkRlc3RpbmF0aW9uOiAnQ291bnR5IG9mIERlc3RpbmF0aW9uJyxcclxuICAgICAgICBjb3VudHJ5T2ZPcmlnaW46ICdDb3VudHJ5IG9mIE9yaWdpbicsXHJcbiAgICAgICAgZXJyb3JNZXNzYWdlczoge1xyXG4gICAgICAgICAgICBjb2x1bW5OYW1lQ2Fubm90QmVFbXB0eTogJ0NvbHVtbiBuYW1lIGNhbm5vdCBiZSBlbXB0eScsXHJcbiAgICAgICAgICAgIGludmFsaWRDb2x1bW5OYW1lOiAnSW52YWxpZCBjb2x1bW4gbmFtZScsXHJcbiAgICAgICAgICAgIGR1cGxpY2F0ZUNvbHVtbk5hbWU6ICdEdXBsaWNhdGUgY29sdW1uIG5hbWUnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgam9iVHlwZXM6IHtcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUeXBlIG9mIGpvYidcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxhYmVsVXNlVGVtcGxhdGVPckN1c3RvbUNoZWNrOiAnQ2hvb3NlIG9uZSBvZiB0aGUgcHJlY29uZmlndXJlZCBBQkMgam9icyBiZWxvdyBvciBjcmVhdGUgYSBjdXN0b20gQUJDIGpvYicsXHJcbiAgICAgICAgb3B0aW9uQ3VzdG9tQ2hlY2s6ICdDcmVhdGUgYSBjdXN0b20gQUJDIGpvYicsXHJcbiAgICAgICAgbWVhc3VyZVR5cGVzOiAnTWVhc3VyZSBUeXBlcycsXHJcbiAgICAgICAgb3V0cHV0Rm9ybWF0czoge1xyXG4gICAgICAgICAgICBjc3Y6ICdDU1YnLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBGb3JtYXQnLFxyXG4gICAgICAgICAgICBleGNlbDogJ0V4Y2VsJyxcclxuICAgICAgICAgICAgZXhjZWxBbm5vdGF0ZWQ6ICdFeGNlbCB3aXRoIENvbG9yIEluZGljYXRvcnMnLFxyXG4gICAgICAgICAgICBwbGFpblRleHQ6ICdQbGFpbiBUZXh0J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb3V0cHV0VHlwZTogJ1BsZWFzZSBzcGVjaWZ5IHRoZSB0eXBlIG9mIG91dHB1dCB5b3Ugd2FudCB0byByZWNlaXZlJyxcclxuICAgICAgICByZWFkRmlsZTogJ1BsZWFzZSBzcGVjaWZ5IGluIHdoaWNoIHJvd3MgYW5kIGNvbHVtbnMgd2UgY2FuIGZpbmQgdGhlIHJlbGV2YW50IGRhdGEnLFxyXG4gICAgICAgIHNlbGVjdEZpbGU6ICdTZWxlY3QgYW4gRXhjZWwgZmlsZSB0byBwcm9jZXNzJyxcclxuICAgICAgICBvcGVuRmlsZTogJ09wZW4gRmlsZScsXHJcbiAgICAgICAgc2VsZWN0ZWRGaWxlOiAnU2VsZWN0ZWQgRmlsZScsXHJcbiAgICAgICAgc3RhcnRDaGVjazogJ1N0YXJ0IFZhbGlkYXRpbmcgYW5kIEVucmljaGluZyBGaWxlJyxcclxuICAgICAgICBzdGFydHNPblJvdzogJ1N0YXJ0cyBvbiBSb3cnLFxyXG4gICAgICAgIHRpdGxlOiAnQUJDIC0gVmFsaWRhdGUgYW5kIEVucmljaCBhIE5ldyBGaWxlJyxcclxuICAgICAgICB1cGxvYWRGaWxlOiAnVXBsb2FkIEZpbGUnXHJcbiAgICB9LFxyXG4gICAgb3ZlcnZpZXc6IHtcclxuICAgICAgICBicmVhZGNydW1iOiAnVGFyaWMgU3VwcG9ydCBBQkMnLFxyXG4gICAgICAgIGNvbnRhY3RVczogJzxhIGhyZWY9XCJodHRwOi8vd3d3LnRhcmljc3VwcG9ydC5jb20vY29udGFjdFwiIHRhcmdldD1cIl9ibGFua1wiPkNvbnRhY3QgdXM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IFRhcmljIFN1cHBvcnQgQUJDIGFuZCB0aGUgcG9zc2liaWxpdGllcyBmb3IgeW91ciBvcmdhbml6YXRpb24nLFxyXG4gICAgICAgIGRhdGVBZGRlZDogJ0NyZWF0ZWQgQXQnLFxyXG4gICAgICAgIGRhdGVDb21wbGV0ZWQ6ICdDb21wbGV0ZWQgQXQnLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVmFsaWRhdGUgbGFyZ2UgYW1vdW50cyBvZiBjb21tb2RpdHkgY29kZXMgcXVpY2tseSBieSBzaW1wbHkgdXBsb2FkaW5nIGFuIEV4Y2VsIGZpbGUuIEVucmljaCB0aGVzZSBmaWxlcyB3aXRoIHRyYWRlIHRhcmlmZiBkYXRhLCBsaWtlIGRlc2NyaXB0aW9ucyBvZiB0aGUgbm9tZW5jbGF0dXJlLCBhZGRpdGlvbmFsIGNvZGVzLCBpbXBvcnQgZHV0aWVzLCBWQVQgcmF0ZXMgYW5kIGNlcnRpZmljYXRlIGNvZGVzLicsXHJcbiAgICAgICAgZG9jdW1lbnRUeXBlOiAnVHlwZScsXHJcbiAgICAgICAgZG93bmxvYWRGaWxlOiAnRG93bmxvYWQgRmlsZScsXHJcbiAgICAgICAgZmlsZTogJ0ZpbGUnLFxyXG4gICAgICAgIG5vSm9iczogJ1lvdSBoYXZlblxcJ3QgY2hlY2tlZCBhbnkgZmlsZXMgeWV0LicsXHJcbiAgICAgICAgbnVtYmVyT2ZFcnJvcnM6ICcjIEVycm9ycycsXHJcbiAgICAgICAgbnVtYmVyT2ZMaW5lczogJyMgTGluZXMnLFxyXG4gICAgICAgIG51bWJlck9mTG9nczogJyMgTWVzc2FnZXMnLFxyXG4gICAgICAgIG51bWJlck9mV2FybmluZ3M6ICcjIFdhcm5pbmdzJyxcclxuICAgICAgICBzaG93RGV0YWlsczogJ1Nob3cgZGV0YWlscycsXHJcbiAgICAgICAgc3RhcnRGaXJzdDogJ1Byb2Nlc3MgeW91ciBmaXJzdCBmaWxlJyxcclxuICAgICAgICBzdGFydE5ldzogJ1Byb2Nlc3MgYSBuZXcgZmlsZScsXHJcbiAgICAgICAgc3RhdHVzOiAnU3RhdHVzJyxcclxuICAgICAgICB0aXRsZTogJ1RhcmljIFN1cHBvcnQgQUJDIC0gQXV0b21hdGVkIEJhdGNoIENvbnRyb2wnLFxyXG4gICAgfSxcclxuICAgIHN0YXR1czoge1xyXG4gICAgICAgIGNhbmNlbF90YXNrX2FyZXlvdXN1cmU6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2FuY2VsIHRoaXMgdGFzaz8nXHJcbiAgICB9XHJcbn07XHJcbiIsIi8vIFNlZSBodHRwczovL2FwcC50YXJpY3N1cHBvcnQuY29tLyMhL3NlYXJjaC9jY2MtY29uY2x1c2lvbnM/b3JkZXJCeT1yZWxldmFuY2UmaW5jbHVkZUJ0aXM9dHJ1ZSZpbmNsdWRlQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9ucz10cnVlJnF1ZXJ5PXRveSZjb21tb2RpdHlDb2RlPVxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIEFtZW5kZWRCeTogJ0FtZW5kZWQgYnknLFxyXG4gICAgQW1lbmRtZW50T2Y6ICdBbWVuZG1lbnQgb2YnLFxyXG4gICAgQ2NjQ29uY2x1c2lvbnM6ICdDQ0MgQ29uY2x1c2lvbnMnLCAvLyBDQ0MgPSBDdXN0b21zIENvZGUgQ29tbWl0dGVlXHJcbiAgICBEb2N1bWVudHM6ICdEb2N1bWVudHMnLFxyXG59IiwiLy8gU2VlIGh0dHBzOi8vYXBwLnRhcmljc3VwcG9ydC5jb20vIyEvY29ycmVsYXRpb24tdGFibGUvZXhwaXJlZC1jb2Rlcy1zZWFyY2hcclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBDb21iaW5lZE5vbWVuY2xhdHVyZUV4cG9ydEludHJhU3RhdDogJ0NvbWJpbmVkIE5vbWVuY2xhdHVyZSAmbWRhc2g7IGV4cG9ydC9pbnRyYXN0YXQnLFxyXG4gICAgQ29tbW9kaXR5Q29kZUNoYW5nZXM6ICdDb21tb2RpdHkgQ29kZSBDaGFuZ2VzJyxcclxuICAgIENvcnJlbGF0aW9uVGFibGU6ICdDb3JyZWxhdGlvbiBUYWJsZScsXHJcbiAgICBEZXJpdmVkRnJvbTogJ0Rlcml2ZWQgZnJvbScsXHJcbiAgICBFeHBpcmVkQ29kZTogJ0V4cGlyZWQgQ29kZScsXHJcbiAgICBFeHBpcmVkQ29kZXM6ICdFeHBpcmVkIENvZGVzJyxcclxuICAgIEhhcm1vbml6ZWRTeXN0ZW0yMDIyOiAnSGFybW9uaXplZCBTeXN0ZW0gMjAyMicsXHJcbiAgICBIUzIwMjJGb3J3YXJkOiAnSFMyMDE3IHRvIEhTMjAyMiBDb3JyZWxhdGlvbnMnLFxyXG4gICAgSFMyMDIyQmFja3dhcmQ6ICdIUzIwMjIgdG8gSFMyMDE3IENvcnJlbGF0aW9ucycsXHJcbiAgICBNYXhPbmVZZWFySW50ZXJ2YWw6ICdZb3UgY2Fubm90IHNwZWNpZnkgYSBwZXJpb2Qgb2YgbW9yZSB0aGFuIGEgeWVhcicsXHJcbiAgICBOZXdDb2RlOiAnTmV3IENvZGUnLFxyXG4gICAgTmV3Q29kZXM6ICdOZXcgQ29kZXMnLFxyXG4gICAgTm9tZW5jbGF0dXJlOiAnTm9tZW5jbGF0dXJlJyxcclxuICAgIFJlY2VudENoYW5nZXM6ICdSZWNlbnQgY2hhbmdlcycsXHJcbiAgICBSZWNlbnRDb21tb2RpdHlDb2RlQ2hhbmdlczogJ1JlY2VudCBjb21tb2RpdHkgY29kZSBjaGFuZ2VzJyxcclxuICAgIFJlbWFya3M6ICdSZW1hcmtzJyxcclxuICAgIFJlcGxhY2VkQnk6ICdSZXBsYWNlZCBieScsXHJcbiAgICBTZWFyY2hDb3JyZWxhdGlvblRhYmxlOiAnU2VhcmNoIGNvcnJlbGF0aW9uIHRhYmxlJyxcclxuICAgIFRhcmljSW1wb3J0OiAnVEFSSUMgJm1kYXNoOyBpbXBvcnQnLFxyXG4gICAgVXBjb21pbmdDaGFuZ2VzOiAnVXBjb21pbmcgY2hhbmdlcycsXHJcbiAgICBVcGNvbWluZ0NvbW1vZGl0eUNvZGVDaGFuZ2VzOiAnVXBjb21pbmcgY29tbW9kaXR5IGNvZGUgY2hhbmdlcydcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIEN1c3RvbXNWYWx1ZUNoZWNrOiAnQ3VzdG9tcyBWYWx1ZSBDaGVjaycsXHJcbiAgICBUaGVDdXJyZW50Q3VzdG9tc1ZhbHVlSXM6ICdUaGUgY3VycmVudCBjdXN0b21zIHZhbHVlIGlzIHt7IEN1cnJlbnRDdXN0b21zVmFsdWVQZXJVbml0T2ZXZWlnaHRGb3JtYXR0ZWQgfX0uJyxcclxuICAgIE5vRGF0YUlzQXZhaWxhYmxlUmVnYXJkaW5nVGhlQXZlcmFnZUN1c3RvbXNWYWx1ZTogJ05vIGRhdGEgaXMgYXZhaWxhYmxlIHJlZ2FyZGluZyB0aGUgYXZlcmFnZSBjdXN0b21zIHZhbHVlIHBlciB1bml0IG9mIHdlaWdodCBmb3IgY29tbW9kaXRpZXMgd2l0aCBjb21tb2RpdHkgY29kZSB7eyBDb21tb2RpdHlDb2RlIH19IGltcG9ydGVkIGZyb20ge3sgUGFydG5lckNvdW50cnkgfX0gaW50byB7eyBSZXBvcnRpbmdDb3VudHJ5IH19LicsXHJcbiAgICBJbl9UaGVBdmVyYWdlV2FzOiAnSW4ge3sgWWVhciB9fSwgdGhlIGF2ZXJhZ2UgY3VzdG9tcyB2YWx1ZSBwZXIgdW5pdCBvZiB3ZWlnaHQgZm9yIGNvbW1vZGl0aWVzIHdpdGggY29tbW9kaXR5IGNvZGUge3sgQ29tbW9kaXR5Q29kZSB9fSBpbXBvcnRlZCBmcm9tIHt7IFBhcnRuZXJDb3VudHJ5IH19IGludG8ge3sgUmVwb3J0aW5nQ291bnRyeSB9fSB3YXMge3sgQXZlcmFnZUN1c3RvbXNWYWx1ZVBlclVuaXRPZldlaWdodEZvcm1hdHRlZCB9fS4nLFxyXG4gICAgVGhlQ3VycmVudEN1c3RvbXNWYWx1ZUlzX1doaWNoSXNQZXJjZW50YWdlT2ZfOiAnVGhlIGN1cnJlbnQgY3VzdG9tcyB2YWx1ZSBpcyB7eyBDdXJyZW50Q3VzdG9tc1ZhbHVlUGVyVW5pdE9mV2VpZ2h0Rm9ybWF0dGVkIH19LCB3aGljaCBpcyB7eyBQZXJjZW50YWdlIH19IG9mIHRoaXMgYXZlcmFnZS4nXHJcbn07IiwiLy8gU2VlIGh0dHBzOi8vYXBwLnRhcmljc3VwcG9ydC5jb20vIyEvdHJhbnNhY3Rpb24tdmFsdWUtY2FsY3VsYXRvclxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIFR5cGVPZkNhbGN1bGF0b3I6ICdUeXBlIG9mIGNhbGN1bGF0b3InLCAvLyBMYWJlbCBmb3IgcmFkaW8gYnV0dG9ucyB0byBzZWxlY3QgdGhlIHR5cGUgb2YgY2FsY3VsYXRvclxyXG4gICAgQmFzaWM6ICdCYXNpYycsIC8vIEJhc2ljIGNhbGN1bGF0b3JcclxuICAgIEFkdmFuY2VkOiAnQWR2YW5jZWQnLCAvLyBBZHZhbmNlZCBjYWxjdWxhdG9yXHJcblxyXG4gICAgQWRkRmllbGQ6ICdBZGQgZmllbGQnLCAvLyBTaG93biB3aGVuIGhvdmVyaW5nIG92ZXIgYSBidXR0b24gY29udGFpbmluZyBhIHBsdXMgc2lnbi4gSWYgdGhpcyBidXR0b24gaXMgY2xpY2tlZCwgYSBuZXcgZm9ybSAoaW5wdXQpIGZpZWxkIGlzIGFkZGVkLlxyXG4gICAgUmVtb3ZlRmllbGQ6ICdSZW1vdmUgZmllbGQnLCAvLyBTaG93biB3aGVuIGhvdmVyaW5nIG92ZXIgYSBidXR0b24gY29udGFpbmluZyBhIGRlbGV0ZSAoWCkgc2lnbi4gVGhpcyBidXR0b24gaXMgbmV4dCB0byBhIGZvcm0gKGlucHV0KSBmaWVsZC4gSWYgdGhpcyBidXR0b24gaXMgY2xpY2tlZCwgdGhlIGZvcm0gZmllbGQgaXMgZGVsZXRlZC5cclxuICAgIFxyXG4gICAgQWRkaXRpb25zOiAnQWRkaXRpb25zJywgLy8gRm9ybSBIZWFkZXIuIEFkZGl0aW9ucyB0byB0aGUgcHJpY2UgcGFpZCBvciBwYXlhYmxlIHRvIGdldCB0byB0aGUgdHJhbnNhY3Rpb24gdmFsdWVcclxuXHJcbiAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBmcm9tIGFydGljbGUgNzEgb2YgdGhlIFVDQyAoUmVndWxhdGlvbiAoRVUpIE5vIDk1Mi8yMDEzKSAoMzIwMTNSMDk1MilcclxuICAgIENvbW1pc2lvbnNBbmRCcm9rZXJhZ2VFeGNlcHRCdXlpbmdDb21taXNzaW9uczogJ0NvbW1pc3Npb25zIGFuZCBicm9rZXJhZ2UsIGV4Y2VwdCBidXlpbmcgY29tbWlzaW9ucycsXHJcbiAgICBQYWNrYWdpbmdDb3N0czogJ0Nvc3RzIG9mIHBhY2tpbmcgYW5kIHBhY2thZ2luZycsXHJcbiAgICBDb3N0T2ZDb250YWluZXJzV2hpY2hBcmVPbmVXaXRoR29vZHM6ICdDb3N0IG9mIGNvbnRhaW5lcnMgd2hpY2ggYXJlIHRyZWF0ZWQgYXMgYmVpbmcgb25lLCBmb3IgY3VzdG9tcyBwdXJwb3Nlcywgd2l0aCB0aGUgZ29vZHMgaW4gcXVlc3Rpb24nLFxyXG4gICAgSGVscEZvckNvc3RPZkNvbnRhaW5lcnNXaGljaEFyZU9uZVdpdGhHb29kczogJzxwPkdlbmVyYWwgcnVsZSA1IGZvciB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIENvbWJpbmVkIE5vbWVuY2xhdHVyZTo8L3A+PG9sIHR5cGU9XCJhXCI+PGxpPmNhbWVyYSBjYXNlcywgbXVzaWNhbCBpbnN0cnVtZW50IGNhc2VzLCBndW4gY2FzZXMsIGRyYXdpbmctaW5zdHJ1bWVudCBjYXNlcywgbmVja2xhY2UgY2FzZXMgYW5kIHNpbWlsYXIgY29udGFpbmVycywgc3BlY2lhbGx5IHNoYXBlZCBvciBmaXR0ZWQgdG8gY29udGFpbiBhIHNwZWNpZmljIGFydGljbGUgb3Igc2V0IG9mIGFydGljbGVzLCBzdWl0YWJsZSBmb3IgbG9uZy10ZXJtIHVzZSBhbmQgcHJlc2VudGVkIHdpdGggdGhlIGFydGljbGVzIGZvciB3aGljaCB0aGV5IGFyZSBpbnRlbmRlZCwgc2hhbGwgYmUgY2xhc3NpZmllZCB3aXRoIHN1Y2ggYXJ0aWNsZXMgd2hlbiBvZiBhIGtpbmQgbm9ybWFsbHkgc29sZCB0aGVyZXdpdGguIFRoaXMgcnVsZSBkb2VzIG5vdCwgaG93ZXZlciwgYXBwbHkgdG8gY29udGFpbmVycyB3aGljaCBnaXZlIHRoZSB3aG9sZSBpdHMgZXNzZW50aWFsIGNoYXJhY3Rlcjs8L2xpPjxsaT5zdWJqZWN0IHRvIHRoZSBwcm92aXNpb25zIG9mIHJ1bGUgNShhKSwgcGFja2luZyBtYXRlcmlhbHMgYW5kIHBhY2tpbmcgY29udGFpbmVycyBwcmVzZW50ZWQgd2l0aCB0aGUgZ29vZHMgdGhlcmVpbiBzaGFsbCBiZSBjbGFzc2lmaWVkIHdpdGggdGhlIGdvb2RzIGlmIHRoZXkgYXJlIG9mIGEga2luZCBub3JtYWxseSB1c2VkIGZvciBwYWNraW5nIHN1Y2ggZ29vZHMuIEhvd2V2ZXIsIHRoaXMgcHJvdmlzaW9uIGlzIG5vdCBiaW5kaW5nIHdoZW4gc3VjaCBwYWNraW5nIG1hdGVyaWFscyBvciBwYWNraW5nIGNvbnRhaW5lcnMgYXJlIGNsZWFybHkgc3VpdGFibGUgZm9yIHJlcGV0aXRpdmUgdXNlLjwvbGk+PC9vbD48cD5UaGUgdGVybXMg4oCYcGFja2luZyBtYXRlcmlhbHPigJkgYW5kIOKAmHBhY2tpbmcgY29udGFpbmVyc+KAmSBtZWFuIGFueSBleHRlcm5hbCBvciBpbnRlcm5hbCBjb250YWluZXJzLCBob2xkZXJzLCB3cmFwcGluZ3Mgb3Igc3VwcG9ydHMgb3RoZXIgdGhhbiB0cmFuc3BvcnQgZGV2aWNlcyAoZm9yIGV4YW1wbGUsIHRyYW5zcG9ydCBjb250YWluZXJzKSwgdGFycGF1bGlucywgdGFja2xlIG9yIGFuY2lsbGFyeSB0cmFuc3BvcnQgZXF1aXBtZW50LiBUaGUgdGVybSDigJhwYWNraW5nIGNvbnRhaW5lcnPigJkgZG9lcyBub3QgY292ZXIgdGhlIGNvbnRhaW5lcnMgcmVmZXJyZWQgdG8gaW4gZ2VuZXJhbCBydWxlIDUoYSk8L3A+JyxcclxuICAgIENvc3RPZlBhY2tpbmc6ICdDb3N0IG9mIHBhY2tpbmcsIHdoZXRoZXIgZm9yIGxhYm91ciBvciBtYXRlcmlhbHMnLFxyXG4gICAgR29vZHNBbmRTZXJ2aWNlc1Byb3ZpZGVkQnlCdXllcjogJ0dvb2RzIGFuZCBzZXJ2aWNlcyBwcm92aWRlZCBieSBidXllcicsXHJcbiAgICBNYXRlcmlhbHNDb21wb25lbnRzQW5kUGFydHM6ICdNYXRlcmlhbHMsIGNvbXBvbmVudHMsIHBhcnRzIGFuZCBzaW1pbGFyIGl0ZW1zIGluY29ycG9yYXRlZCBpbnRvIHRoZSBpbXBvcnRlZCBnb29kcycsXHJcbiAgICBUb29sc0RpZXNBbmRNb3VsZHM6ICdUb29scywgZGllcywgbW91bGRzIGFuZCBzaW1pbGFyIGl0ZW1zIHVzZWQgaW4gdGhlIHByb2R1Y3Rpb24gb2YgdGhlIGltcG9ydGVkIGdvb2RzJyxcclxuICAgIE1hdGVyaWFsc0NvbnN1bWVkSW5Qcm9kdWN0aW9uOiAnTWF0ZXJpYWxzIGNvbnN1bWVkIGluIHRoZSBwcm9kdWN0aW9uIG9mIHRoZSBpbXBvcnRlZCBnb29kcycsXHJcbiAgICBFbmdpbmVlcmluZ0RldmVsb3BtZW50QXJ0d29ya0Rlc2lnblBsYW5zQW5kU2tldGNoZXM6ICdFbmdpbmVlcmluZywgZGV2ZWxvcG1lbnQsIGFydHdvcmssIGRlc2lnbiB3b3JrLCBhbmQgcGxhbnMgYW5kIHNrZXRjaGVzIHVuZGVydGFrZW4gZWxzZXdoZXJlIHRoYW4gaW4gdGhlIFVuaW9uIGFuZCBuZWNlc3NhcnkgZm9yIHRoZSBwcm9kdWN0aW9uIG9mIHRoZSBpbXBvcnRlZCBnb29kcycsXHJcbiAgICBSb3lhbHRpZXNBbmRMaWNlbnNlRmVlczogJ1JveWFsdGllcyBhbmQgbGljZW5jZSBmZWVzIHJlbGF0ZWQgdG8gdGhlIGdvb2RzIGJlaW5nIHZhbHVlZCB0aGF0IHRoZSBidXllciBtdXN0IHBheSwgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGFzIGEgY29uZGl0aW9uIG9mIHNhbGUgb2YgdGhlIGdvb2RzIGJlaW5nIHZhbHVlZCcsXHJcbiAgICBWYWx1ZU9mUmVzYWxlRGlzcG9zYWxPclVzZVRoYXRBY2NydWVzVG9TZWxsZXI6ICdWYWx1ZSBvZiBhbnkgcGFydCBvZiB0aGUgcHJvY2VlZHMgb2YgYW55IHN1YnNlcXVlbnQgcmVzYWxlLCBkaXNwb3NhbCBvciB1c2Ugb2YgdGhlIGltcG9ydGVkIGdvb2RzIHRoYXQgYWNjcnVlcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRvIHRoZSBzZWxsZXInLFxyXG4gICAgRGVsaXZlcnlDb3N0czogJ0RlbGl2ZXJ5IGNvc3RzJyxcclxuICAgIFRyYW5zcG9ydENvc3RzQmVmb3JlRW50cnlJbnRvQ3VzdG9tc1RlcnJpdG9yeTogJ0Nvc3Qgb2YgdHJhbnNwb3J0IG9mIHRoZSBpbXBvcnRlZCBnb29kcyBiZWZvcmUgdGhlaXIgZW50cnkgaW50byB0aGUgY3VzdG9tcyB0ZXJyaXRvcnkgb2YgdGhlIFVuaW9uJyxcclxuICAgIEluc3VyYW5jZUNvc3RzQmVmb3JlRW50cnlJbnRvQ3VzdG9tc1RlcnJpdG9yeTogJ0Nvc3Qgb2YgaW5zdXJhbmNlIG9mIHRoZSBpbXBvcnRlZCBnb29kcyBiZWZvcmUgdGhlaXIgZW50cnkgaW50byB0aGUgY3VzdG9tcyB0ZXJyaXRvcnkgb2YgdGhlIFVuaW9uJyxcclxuICAgIExvYWRpbmdBbmRIYW5kbGluZ0NoYXJnZXNCZWZvcmVFbnRyeUludG9DdXN0b21zVGVycml0b3J5OiAnTG9hZGluZyBhbmQgaGFuZGxpbmcgY2hhcmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zcG9ydCBvZiB0aGUgaW1wb3J0ZWQgZ29vZHMgYmVmb3JlIHRoZWlyIGVudHJ5IGludG8gdGhlIGN1c3RvbXMgdGVycml0b3J5IG9mIHRoZSBVbmlvbicsXHJcbiAgICBcclxuICAgIE90aGVyQWRkaXRpb25zOiAnT3RoZXIgYWRkaXRpb25zJywgLy8gRm9ybSBsYWJlbC4gT3RoZXIgYWRkaXRpb25zIHRvIHRoZSBwcmljZSBwYWlkIG9yIHBheWFibGUgdG8gZ2V0IHRvIHRoZSB0cmFuc2FjdGlvbiB2YWx1ZVxyXG5cclxuICAgIERlZHVjdGlvbnM6ICdEZWR1Y3Rpb25zJywgLy8gRm9ybSBIZWFkZXIuIERlZHVjdGlvbnMgZnJvbSB0aGUgcHJpY2UgcGFpZCBvciBwYXlhYmxlIHRvIGdldCB0byB0aGUgdHJhbnNhY3Rpb24gdmFsdWVcclxuICAgIFxyXG4gICAgLy8gVGhlIGZvbGxvd2luZyBhcmUgZnJvbSBhcnRpY2xlIDcyIG9mIHRoZSBVQ0MgKFJlZ3VsYXRpb24gKEVVKSBObyA5NTIvMjAxMykgKDMyMDEzUjA5NTIpXHJcbiAgICBUcmFuc3BvcnRDb3N0c0FmdGVyRW50cnlJbnRvQ3VzdG9tc1RlcnJpdG9yeTogJ1RoZSBjb3N0IG9mIHRyYW5zcG9ydCBvZiB0aGUgaW1wb3J0ZWQgZ29vZHMgYWZ0ZXIgdGhlaXIgZW50cnkgaW50byB0aGUgY3VzdG9tcyB0ZXJyaXRvcnkgb2YgdGhlIFVuaW9uIChOQjogdGhpcyBpbmNsdWRlcyByZWxhdGVkIGNvc3RzLCBzdWNoIGFzIGhhbmRsaW5nIGFuZCBpbnN1cmFuY2UgY29zdHMpJyxcclxuICAgIEludGVybmFsTm90ZUZvclRyYW5zcG9ydENvc3RzQWZ0ZXJFbnRyeUludG9DdXN0b21zVGVycml0b3J5OiAnVE9ETzogdGhlc2UgY29zdHMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBiYXNlIHZhbHVlIGZvciBWQVQgY2FsY3VsYXRpb24gKHNlZSBodHRwczovL3d3dy5iZWxhc3RpbmdkaWVuc3QubmwvYmlibGlvdGhlZWsvaGFuZGJvZWtlbi9odG1sL2JvZWtlbi9IRFUvZG91YW5ld2FhcmRlLWJpamxhZ2VfMV93YWFyZGVuX2VuX3ByaWp6ZW4uaHRtbCknLFxyXG4gICAgQ2hhcmdlc0ZvckNvbnN0cnVjdGlvbkVyZWN0aW9uQXNzZW1ibHlNYWludGVuYW5jZU9yVGVjaG5pY2FsQXNzaXN0YW5jZTogJ0NoYXJnZXMgZm9yIGNvbnN0cnVjdGlvbiwgZXJlY3Rpb24sIGFzc2VtYmx5LCBtYWludGVuYW5jZSBvciB0ZWNobmljYWwgYXNzaXN0YW5jZSwgdW5kZXJ0YWtlbiBhZnRlciB0aGUgZW50cnkgaW50byB0aGUgY3VzdG9tcyB0ZXJyaXRvcnkgb2YgdGhlIFVuaW9uIG9mIHRoZSBpbXBvcnRlZCBnb29kcyBzdWNoIGFzIGluZHVzdHJpYWwgcGxhbnRzLCBtYWNoaW5lcnkgb3IgZXF1aXBtZW50JyxcclxuICAgIENoYXJnZXNGb3JJbnRlcmVzdDogJ0NoYXJnZXMgZm9yIGludGVyZXN0IHVuZGVyIGEgZmluYW5jaW5nIGFycmFuZ2VtZW50IGVudGVyZWQgaW50byBieSB0aGUgYnV5ZXIgYW5kIHJlbGF0aW5nIHRvIHRoZSBwdXJjaGFzZSBvZiB0aGUgaW1wb3J0ZWQgZ29vZHMnLFxyXG4gICAgQ2hhcmdlc0ZvclJpZ2h0VG9SZXByb2R1Y2U6ICdDaGFyZ2VzIGZvciB0aGUgcmlnaHQgdG8gcmVwcm9kdWNlIHRoZSBpbXBvcnRlZCBnb29kcyBpbiB0aGUgVW5pb24nLFxyXG4gICAgQnV5aW5nQ29tbWlzaW9uczogJ0J1eWluZyBjb21taXNzaW9ucycsXHJcbiAgICBJbXBvcnREdXRpZXM6ICdJbXBvcnQgZHV0aWVzIG9yIG90aGVyIGNoYXJnZXMgcGF5YWJsZSBpbiB0aGUgVW5pb24gYnkgcmVhc29uIG9mIHRoZSBpbXBvcnQgb3Igc2FsZSBvZiB0aGUgZ29vZHMnLFxyXG4gICAgUGF5bWVudHNNYWRlRm9yUmlnaHRUb0Rpc3RyaWJ1dGVPclJlc2VsbDogJ1BheW1lbnRzIG1hZGUgYnkgdGhlIGJ1eWVyIGZvciB0aGUgcmlnaHQgdG8gZGlzdHJpYnV0ZSBvciByZXNlbGwgdGhlIGltcG9ydGVkIGdvb2RzLCBpZiBzdWNoIHBheW1lbnRzIGFyZSBub3QgYSBjb25kaXRpb24gb2YgdGhlIHNhbGUgZm9yIGV4cG9ydCB0byB0aGUgVW5pb24gb2YgdGhlIGdvb2RzJyxcclxuICAgIFxyXG4gICAgT3RoZXJEZWR1Y3Rpb25zOiAnT3RoZXIgZGVkdWN0aW9ucycsIC8vIEZvcm0gbGFiZWwuIE90aGVyIGRlZHVjdGlvbnMgZnJvbSB0aGUgcHJpY2UgcGFpZCBvciBwYXlhYmxlIHRvIGdldCB0byB0aGUgdHJhbnNhY3Rpb24gdmFsdWVcclxuXHJcbiAgICAvLyBBcnRpY2xlIDg2LjEgVUNDIChSZWd1bGF0aW9uIChFVSkgTm8gOTUyLzIwMTMpICgzMjAxM1IwOTUyKVxyXG4gICAgSGVscEZvck90aGVyRGVkdWN0aW9uczogJ0ZvciBleGFtcGxlOiBjb3N0cyBmb3Igc3RvcmFnZSBhbmQgZm9yIHVzdWFsIGZvcm1zIG9mIGhhbmRsaW5nIGluIHRoZSBVbmlvbiBkdXJpbmcgc3RvcmFnZSBpbiBhIGN1c3RvbXMgd2FyZWhvdXNlIG9mIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgZmFjaWxpdHkuJyxcclxuXHJcbiAgICBNZXRob2Q6ICdNZXRob2QnLCAvLyBMYWJlbCBmb3IgcmFkaW8gYnV0dG9ucyBmb3IgY2hvb3NpbmcgaG93IHRvIHNldCB0aGUgY3VzdG9tcyB2YWx1ZSwgYnkgY2FsY3VsYXRpbmcgaXQgb3IgYnkgZW50ZXJpbmcgaXRcclxuICAgIENhbGN1bGF0ZVZhbHVlOiAnQ2FsY3VsYXRlIHZhbHVlJywgLy8gUmFkaW8gYnV0dG9uIGZvciBjaG9vc2luZyB0byBjYWxjdWxhdGUgdGhlIGN1c3RvbXMgdmFsdWVcclxuICAgIEVudGVyVmFsdWU6ICdFbnRlciB2YWx1ZScsIC8vIFJhZGlvIGJ1dHRvbiBmb3IgY2hvb3NpbmcgdG8gZW50ZXIgdGhlIGN1c3RvbXMgdmFsdWVcclxuXHJcbiAgICBQcmljZTogJ1ByaWNlJywgLy8gRm9ybSBIZWFkZXJcclxuICAgIFByaWNlQWN0dWFsbHlQYWlkT3JQYXlhYmxlOiAnUHJpY2UgYWN0dWFsbHkgcGFpZCBvciBwYXlhYmxlJywgLy8gRm9ybSBsYWJlbFxyXG4gICAgUmVzdWx0OiAnUmVzdWx0JywgLy8gUmVzdWx0IG9mIHRoZSBjdXN0b21zIHZhbHVlIGNhbGN1bGF0aW9uXHJcbiAgICBUcmFuc2FjdGlvblZhbHVlOiAnVHJhbnNhY3Rpb24gdmFsdWUnLCAvLyBGb3JtIGxhYmVsXHJcbiAgICBUcmFuc2FjdGlvblZhbHVlQ2FsY3VsYXRvcjogJ1RyYW5zYWN0aW9uIFZhbHVlIENhbGN1bGF0b3InLCAvLyBQYWdlIHRpdGxlOyBicmVhZGNydW1iXHJcblxyXG4gICAgXHJcbn07XHJcbiIsIu+7vy8vIFNlZSBodHRwczovL2FwcC50YXJpY3N1cHBvcnQuY29tLyMhL3NlY3Rpb25zXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgZXhhbXBsZVRleHQ6ICdmb3IgZXhhbXBsZTogPGVtPjIyMDMwMDA5PC9lbT4gb3IgPGVtPjY5MTExMDAwOTAgaW1wb3J0IGNuPC9lbT4nLFxyXG4gICAgbGFuZGluZ1BhZ2U6IHtcclxuICAgICAgICBkeW5hbWljOiB7XHJcbiAgICAgICAgICAgIERFOiAnVG8gdGhlIEdlcm1hbiBDdXN0b21zIFRhcmlmZiAoRVpUKScsXHJcbiAgICAgICAgICAgIEVVOiAnVG8gdGhlIEV1cm9wZWFuIEN1c3RvbXMgVGFyaWZmIChUQVJJQyknLFxyXG4gICAgICAgICAgICBCRTogJ1RvIHRoZSBCZWxnaWFuIEN1c3RvbXMgVGFyaWZmIChUQVJCRUwpJyxcclxuICAgICAgICAgICAgTkw6ICdUbyB0aGUgRHV0Y2ggQ3VzdG9tcyBUYXJpZmYgKERUViknLFxyXG4gICAgICAgICAgICBDSDogJ1RvIHRoZSBTd2lzcyBDdXN0b21zIFRhcmlmZiAoVEFSRVMpJyxcclxuICAgICAgICAgICAgR0I6ICdUbyB0aGUgVUsgR2xvYmFsIFRhcmlmZiAoVUtHVCknLFxyXG4gICAgICAgICAgICBTRTogJ1RvIHRoZSBTd2VkaXNoIEN1c3RvbXMgVGFyaWZmJyxcclxuICAgICAgICAgICAgSVQ6ICdUbyB0aGUgSXRhbGlhbiBDdXN0b21zIFRhcmlmZidcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgUmVjZW50Q2hhbmdlczogJ1JlY2VudCBDaGFuZ2VzJywgLy8gcmVjZW50IGNoYW5nZXMgdG8gdGhlIGFwcGxpY2F0aW9uXHJcbiAgICBSZWNlbnRDb2RlczogJ1JlY2VudCBDb2RlcycgLy8gcmVjZW50IGNvbW1vZGl0eSBjb2Rlc1xyXG59O1xyXG4iLCIvLyBTZWUgdGhlIGludHJvIGJ1dHRvbnMgYXQgdGhlIHRvcCByaWdodCBvZiBtYW55IHBhZ2VzIGluIHRoZSBhcHBsaWNhdGlvblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGFiYzoge1xyXG4gICAgICAgIGludHJvOiAnV2l0aCBUYXJpYyBTdXBwb3J0IEFCQyB5b3UgY2FuIHVwbG9hZCBtYXN0ZXIgZGF0YSBmaWxlcywgb3JkZXIgbWFuaWZlc3RzIGFuZCBjdXN0b21zIGRlY2xhcmF0aW9ucyBhbmQsIHdpdGggb25lIGNsaWNrIG9mIGEgYnV0dG9uLCB2YWxpZGF0ZSB0aGVtIGFuZCBlbnJpY2ggdGhlbSB3aXRoIGRhdGEgZnJvbSB0aGUgdHJhZGUgdGFyaWZmLiBXaGF0IHVzZWQgdG8gdGFrZSBkYXlzLCBub3cgdGFrZXMgbWludXRlcy48YnI+PGJyPkhvdyBkb2VzIGl0IHdvcms/IFVwbG9hZCBhIGZpbGUsIHNlbGVjdCBhIHZhbGlkYXRpb24gYW5kIHByZXNzIHN0YXJ0LiBTZWNvbmRzIGxhdGVyLCB5b3UgY2FuIGRvd25sb2FkIGFuIEV4Y2VsIGZpbGUgY29udGFpbmluZyBhIGxvdCBvZiB1c2VmdWwgaW5mb3JtYXRpb24uIDxicj48YnI+VGFyaWMgU3VwcG9ydCBBQkMgY29tYmluZXMgdGhlIHBvd2VyIG9mIG91ciBBUEkgd2l0aCB0aGUgZmxleGliaWxpdHkgb2YgdXBsb2FkaW5nIGFuZCBkb3dubG9hZGluZyBFeGNlbCBmaWxlcydcclxuICAgIH0sXHJcbiAgICBhYmNOZXc6IHtcclxuICAgICAgICBmaWxlOiAnU2VsZWN0IGFuIEV4Y2VsIGZpbGUgdG8gYmUgdmFsaWRhdGVkIGFuZCBlbnJpY2hlZC4nLFxyXG4gICAgICAgIGlucHV0T3B0aW9uczogJ0luZGljYXRlIHdoaWNoIGNvbHVtbnMgaW4gdGhlIEV4Y2VsIGZpbGUgY29udGFpbiB3aGljaCB0eXBlIG9mIGRhdGEgYW5kIGF0IHdoYXQgcm93IHRoZSBkYXRhIHN0YXJ0cy4nLFxyXG4gICAgICAgIG91dHB1dE9wdGlvbnM6ICdDaG9vc2UgaWYgeW91IHdhbnQgdG8gZG8gYSBjaGVjayBmb3IgaW1wb3J0IG9yIGV4cG9ydCBkZWNsYXJhdGlvbnMsIHdoaWNoIHR5cGUgb2Ygam9iIHlvdSB3b3VsZCBsaWtlIHRvIHBlcmZvcm0gYW5kIGluIHdoaWNoIGZvcm1hdCB5b3Ugd291bGQgbGlrZSB0byByZWNlaXZlIHRoZSBvdXRwdXQgZGF0YS4nLFxyXG4gICAgICAgIGxldHNHbzogJ0xldFxcJ3MgZ28hJ1xyXG4gICAgfSxcclxuICAgIGNhc2VMYXc6IHtcclxuICAgICAgICBpbnRybzogJ1VuZGVyIHRoZSBoZWFkaW5nIFwiTmV3c1wiIHlvdSB3aWxsIGZpbmQgdGhlIGxhdGVzdCBEdXRjaCBhbmQgRXVyb3BlYW4gcnVsaW5ncy4gPGJyPjxicj5VbmRlciB0aGUgaGVhZGluZ3MgXCJEdXRjaCBjYXNlIGxhd1wiIGFuZCBcIkV1cm9wZWFuIGNhc2UgbGF3XCIgeW91IHdpbGwgZmluZCBhZHZhbmNlZCBzZWFyY2ggZnVuY3Rpb25zIHRvIHF1aWNrbHkgZmluZCB0aGUgcmVsZXZhbnQgY2FzZSBsYXcuJyxcclxuICAgIH0sXHJcbiAgICBjaGFwdGVyOiB7XHJcbiAgICAgICAgaW50cm86ICdPbiB0aGlzIHBhZ2UgeW91IGNhbiBicm93c2UgdGhyb3VnaCBhIGNoYXB0ZXIuIFRoZXJlIGFyZSBhIGxvdCBvZiB0b29scyB0byBoZWxwIHlvdSB3aXRoIHRoZSBjbGFzc2lmaWNhdGlvbiBwcm9jZXNzLicsXHJcbiAgICAgICAgaGVhZGluZzogJ0NsaWNrIGEgaGVhZGluZyBvciBzdWJkaXZpc2lvbiB0byBleHBhbmQvY29sbGFwc2UgaXQuPGJyPkhpbnQ6IHlvdSBjYW4gZG91YmxlLWNsaWNrIHRvIGFsc28gZXhwYW5kL2NvbGxhcHNlIGFsbCBvZiBpdHMgc3ViZGl2aXNpb25zLCcsXHJcbiAgICAgICAgY2hhcHRlckJ1dHRvbnM6IFxyXG4gICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBkYXRhIHNvdXJjZXMgYXJlIGF2YWlsYWJsZS4gWW91IHdpbGwgYWx3YXlzIHNlZSB0aGUgaW5mb3JtYXRpb24gd2hpY2ggaXMgcmVsZXZhbnQgZm9yIHRoZSBjdXJyZW50IGNoYXB0ZXIuJyArXHJcbiAgICAgICAgICAgICc8dWw+PGxpPk4gaXMgZm9yIE5vdGVzLCBsZWdhbGx5IGJpbmRpbmc8L2xpPicgK1xyXG4gICAgICAgICAgICAnPGxpPkUgaXMgZm9yIEV4cGxhbmF0b3J5IE5vdGVzICh3aGljaCBhbHNvIGluY2x1ZGUgV0NPIGNsYXNzaWZpY2F0aW9uIG9waW5pb25zIGFuZCBFVSBDbGFzc2lmaWNhdGlvbiBSZWd1bGF0aW9ucyk8L2xpPicgK1xyXG4gICAgICAgICAgICAnPGxpPkIgaXMgZm9yIEJUSXM8L2xpPicgK1xyXG4gICAgICAgICAgICAnPGxpPkMgaXMgZm9yIENhc2UgTGF3IC0gY2xhc3NpZmljYXRpb24gaXNzdWVzIGFyZSBvZnRlbiByZXNvbHZlZCBpbiBjb3VydDwvbGk+JyArXHJcbiAgICAgICAgICAgICc8bGk+TCBpcyBmb3IgTGVnaXNsYXRpb24gLSBmaW5kIG91dCBhYm91dCB0aGUgbGF0ZXN0IEVVIHJlZ3VsYXRpb25zIGFuZCBub3RpY2VzIHRvIHRyYWRlcnM8L2xpPicgK1xyXG4gICAgICAgICAgICAnPC91bD4nLFxyXG4gICAgICAgIGhlYWRpbmdCdXR0b25zOiBcclxuICAgICAgICAgICAgJ1RoZSBzYW1lIGRhdGEgc291cmNlcyBhcmUgYWxzbyBhdmFpbGFibGUgZm9yIGVhY2ggaGVhZGluZy4gJyArXHJcbiAgICAgICAgICAgICdJbiBvcmRlciB0byBzYXZlIHNwYWNlLCB0aGUgYnV0dG9ucyBhcmUgb25seSBtYXJrZWQgd2l0aCBhIHNpbmdsZSBsZXR0ZXIuICcgK1xyXG4gICAgICAgICAgICAnSWYgeW91IGhhcHBlbiB0byBmb3JnZXQsIHlvdSBjYW4gaG92ZXIgb3ZlciBhIGJ1dHRvbiB0byBzZWUgd2hhdCBpdCBkb2VzLidcclxuICAgIH0sXHJcbiAgICBjaGFwdGVyczoge1xyXG4gICAgICAgIGludHJvOiBcclxuICAgICAgICAgICAgJ1RoaXMgaXMgdGhlIHN0YXJ0IHBhZ2Ugb2YgdGhlIHRyYWRlIHRhcmlmZiBhbmQgY2xhc3NpZmljYXRpb24gbW9kdWxlLiA8YnI+PGJyPicgKyBcclxuICAgICAgICAgICAgJ1lvdSBjYW4gdXNlIHRoaXMgcGFnZSB0byBzdGFydCBicm93c2luZyB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgY2hhcHRlcnMgb2YgdGhlIG5vbWVuY2xhdHVyZSwgb3IgdXNlIHRoZSBzZWFyY2ggYm94IHRvIHF1ZXJ5IHRoZSB0YXJpZmYuJyxcclxuICAgICAgICBsYXJnZVNlYXJjaEJveDogJ1VzZSB0aGlzIHNlYXJjaCBib3ggb3IgdGhlIG9uZSBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHRvIHNlYXJjaCBieSBjb21tb2RpdHkgY29kZSBvciBrZXl3b3JkLiA8YnI+PGJyPkhpbnQ6IGluIG9yZGVyIHRvIHNwZWVkIHVwIHlvdXIgc2VhcmNoLCB5b3UgY2FuIGFkZCBcImltcG9ydFwiIG9yIFwiZXhwb3J0XCIgdG8gc3BlY2lmeSB0aGUgdHJhZGUgbW92ZW1lbnQuIFlvdSBjYW4gYWxzbyB0eXBlIHRoZSBjb3VudHJ5IG9mIG9yaWdpbiBmb3IgaW1wb3J0IG9yIHRoZSBjb3VudHJ5IG9mIGRlc3RpbmF0aW9uIGZvciBleHBvcnQuJyxcclxuICAgICAgICBzZWN0aW9uTm90ZXNBbmRFeHBsYW5hdG9yeU5vdGVzOiBcclxuICAgICAgICAgICAgJ05COiBpbiBvcmRlciB0byBkZWNpZGUgaWYgYSBjb21tb2RpdHkgbWF5IGJlIGNsYXNzaWZpZWQgdW5kZXIgYSBnaXZlbiBzZWN0aW9uIG9yIGNoYXB0ZXIsICcgKyBcclxuICAgICAgICAgICAgJ3lvdSBzaG91bGQgYWx3YXlzIHJlYWQgdGhlIChsZWdhbGx5KSBiaW5kaW5nIHNlY3Rpb24gYW5kIGNoYXB0ZXIgbm90ZXMuIFlvdSBjYW4gZmluZCB0aGVtIGJ5IGNsaWNraW5nIG9uIHRoZSBidXR0b24gbWFya2VkIGJ5IHRoZSBsZXR0ZXIgTiBmb3IgTm90ZXMuIDxicj48YnI+JyArXHJcbiAgICAgICAgICAgICdGdXJ0aGVybW9yZSwgdGhlIGV4cGxhbmF0b3J5IG5vdGVzIHB1Ymxpc2hlZCBieSB0aGUgV0NPIGFuZCB0aGUgRVUsIHdoaWxlIG5vdCBsZWdhbGx5IGJpbmRpbmcsIGFyZSBpbmRpc3BlbnNpYmxlIHRvb2xzIGZvciB1bmRlcnN0YW5kaW5nICcgK1xyXG4gICAgICAgICAgICAndGhlIHNjb3BlIG9mIHNlY3Rpb25zLCBjaGFwdGVycywgaGVhZGluZ3MgYW5kIHN1YmRpdmlzaW9ucyBpbiB0aGUgbm9tZW5jbGF0dXJlLiBZb3UgY2FuIGZpbmQgdGhlbSBieSBjbGlja2luZyBvbiB0aGUgYnV0dG9uIG1hcmtlZCBieSB0aGUgbGV0dGVyIEUgZm9yIEV4cGxhbmF0b3J5IE5vdGVzJyxcclxuICAgIH0sXHJcbiAgICBjb3JyZWxhdGlvblRhYmxlOiB7XHJcbiAgICAgICAgaW50cm86ICdGaW5kIHRoZSBvcmlnaW5hdG9ycyBvZiBuZXcgY29tbW9kaXR5IGNvZGVzIGFuZCB0aGUgc3VjY2Vzc29ycyBvZiBleHBpcmVkIGNvbW1vZGl0eSBjb2Rlcy4gPGJyPjxicj5Zb3UgY2FuIHNlYXJjaCBieSBzdGFydCBkYXRlIG9yIGVuZCBkYXRlIG9yIHlvdSBjYW4gc2VhcmNoIGJ5IGNvbW1vZGl0eSBjb2RlIChjaGFwdGVyLCBoZWFkaW5nIG9yIHN1YmhlYWRpbmcpLiA8YnI+PGJyPicsXHJcbiAgICAgICAgc2VhcmNoU3VjY2Vzc29yczogJ1ByZXNzIHRvIHZpZXcgc3VjY2Vzc29ycyBvZiBleHBpcmVkIGNvbW1vZGl0eSBjb2Rlcy4gPGJyPjxicj5Ob3RlIHRoYXQgc3VjY2Vzc29ycyB0byBleHBpcmVkIGNvZGVzIGFyZSBub3QgbmVjZXNzYXJpbHkgbmV3IGNvZGVzLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRoYXQgdGhlIHN1Y2Nlc3NvciBhbHJlYWR5IGV4aXN0ZWQgYW5kIG5ldyBjb21tb2RpdGllcyB3ZXJlIGFkZGVkIHRvIGl0LicsXHJcbiAgICAgICAgc2VhcmNoT3JpZ2luYXRvcnM6ICdQcmVzcyB0byB2aWV3IG9yaWdpbmF0b3JzIChwcmVkZWNlc3NvcnMpIG9mIG5ldyBjb21tb2RpdHkgY29kZXMuIDxicj48YnI+Tm90ZSB0aGF0IHRoZSBvcmlnaW5hdG9yIHRvIGEgbmV3IGNvbW1vZGl0eSBkb2VzIG5vdCBuZWNlc3NhcmlseSBlbmQuIEl0XFwncyBwb3NzaWJsZSB0aGF0IG9ubHkgcGFydCBvZiB0aGUgY29tbW9kaXRpZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgY2xhc3NpZmllZCB1bmRlciB0aGUgb3JpZ2luYXRvciBhcmUgbm93IHRvIGJlIGNsYXNzaWZpZWQgdW5kZXIgdGhlIG5ldyBjb2RlLidcclxuICAgIH0sXHJcbiAgICBlYnRpOiB7XHJcbiAgICAgICAgaW50cm86ICdPcmdhbml6YXRpb25zIGluIHRoZSBFVSBjYW4gc3VibWl0IGEgcmVxdWVzdCBmb3IgYSBiaW5kaW5nIG9waW5pb24gdG8gdGhlaXIgbmF0aW9uYWwgY3VzdG9tcyBhdXRob3JpdGllcy4gVGhlc2UgYXJlIGNhbGxlZCBCVElzLiBUaGV5IGFyZSBhbiBleHRyZW1lbHkgdXNlZnVsIHRvb2wgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvcnJlY3QgY2xhc3NpZmljYXRpb24gb2YgeW91ciBwcm9kdWN0LiBBZnRlciBhbGwsIGlmIHlvdSBhcmUgZmlsaW5nIGEgZGVjbGFyYXRpb24gZm9yIHRoZSBzYW1lIHByb2R1Y3QsIGl0IHdpbGwgbGlrZWx5IGhhdmUgdGhlIHNhbWUgY2xhc3NpZmljYXRpb24uIDxicj48YnI+VGFyaWMgU3VwcG9ydCBoZWxwcyB5b3Ugd2l0aCBhIHRvdGFsIG92ZXJ2aWV3IG9mIGFsbCBCVElzIGlzc3VlZCBpbiBFdXJvcGUgd2l0aCBhY2NvbXBhbnlpbmcgcGhvdG9zIGFuZCBkcmF3aW5ncywgaW5jbHVkaW5nIGEgaGlzdG9yeSBvZiBCVElzIHRoYXQgYXJlIG5vIGxvbmdlciB2YWxpZC4gVGhlc2UgQlRJcywgbGlrZSB0aGUgcmVzdCBvZiB0aGUgaW5mb3JtYXRpb24sIGFyZSBlYXN5IHRvIGZpbmQgYmFzZWQgb24gdGhlIHJlbGV2YW50IGNvbW1vZGl0eSBjb2RlLicsXHJcbiAgICAgICAgZm9ybTpcclxuICAgICAgICAgICAgJ1RoZSBCVEkgc2VhcmNoIGZvcm0gYWxsb3dzIHlvdSB0byBzZWFyY2ggYnkgY29tbW9kaXR5IGNvZGUgKGNoYXB0ZXIsIGhlYWRpbmcsIHN1YmhlYWRpbmcpIGFuZCBxdWVyeSBieSBrZXl3b3JkIGFuZCBnb29kcyBkZXNjcmlwdGlvbiwgYW1vbmcgb3RoZXIgdGhpbmdzLjxicj48YnI+JyArIFxyXG4gICAgICAgICAgICAnTkI6IHlvdSBjYW4gY2hvb3NlIHRvIGVpdGhlciBzb3J0IHRoZSBCVElzIGJ5IGNvbW1vZGl0eSBjb2RlIG9yIGJ5IGRhdGUsIGluIGVzc2VuY2UgY3JlYXRpbmcgYSBuZXdzIGZlZWQgd2l0aCB0aGUgbGF0ZXN0IEJUSXMsIG9yIHVzZSB0aGUgaXNzdWVkIHNpbmNlIGZpZWxkIHRvIG9ubHkgc2hvdyByZWNlbnQgQlRJcy4gPGJyPjxicj4nICtcclxuICAgICAgICAgICAgJ05COiB5b3UgY2FuIGFsc28gY2hvb3NlIHRvIHZpZXcgdGhlIHJlc3VsdHMgYXMgaW1hZ2VzLiBPZnRlbiwgZ29pbmcgdGhyb3VnaCBhIGxpc3Qgb2YgaW1hZ2VzIGNhbiBiZSBhIHF1aWNrIHdheSB0byBnZXQgYW4gaWRlYSBvZiAnICsgXHJcbiAgICAgICAgICAgICd3aGV0aGVyIG9yIG5vdCBhIGNlcnRhaW4gcGFydCBvZiB0aGUgbm9tZW5jbGF0dXJlIGlzIGFwcGxpY2FibGUgZm9yIHRoZSBjb21tb2RpdHkgeW91IGFyZSBjbGFzc2lmeWluZy4nXHJcbiAgICB9LFxyXG4gICAgYXRyOiB7XHJcbiAgICAgICAgaW50cm86ICdPcmdhbml6YXRpb25zIGluIHRoZSBVSyBjYW4gc3VibWl0IGEgcmVxdWVzdCBmb3IgYSBiaW5kaW5nIG9waW5pb24gdG8gdGhlaXIgbmF0aW9uYWwgY3VzdG9tcyBhdXRob3JpdGllcy4gVGhlc2UgYXJlIGNhbGxlZCBBVFJzIChBZHZhbmNlIFRhcmlmZiBSdWxpbmdzKS4gVGhleSBhcmUgYW4gZXh0cmVtZWx5IHVzZWZ1bCB0b29sIGluIGRldGVybWluaW5nIHRoZSBjb3JyZWN0IGNsYXNzaWZpY2F0aW9uIG9mIHlvdXIgcHJvZHVjdC4gQWZ0ZXIgYWxsLCBpZiB5b3UgYXJlIGZpbGluZyBhIGRlY2xhcmF0aW9uIGZvciB0aGUgc2FtZSBwcm9kdWN0LCBpdCB3aWxsIGxpa2VseSBoYXZlIHRoZSBzYW1lIGNsYXNzaWZpY2F0aW9uLiA8YnI+PGJyPlRhcmljIFN1cHBvcnQgaGVscHMgeW91IHdpdGggYSB0b3RhbCBvdmVydmlldyBvZiBhbGwgQVRScyBpc3N1ZWQgaW4gdGhlIFVLIHdpdGggYWNjb21wYW55aW5nIHBob3RvcyBhbmQgZHJhd2luZ3MsIGluY2x1ZGluZyBhIGhpc3Rvcnkgb2YgQVRScyB0aGF0IGFyZSBubyBsb25nZXIgdmFsaWQuIFRoZXNlIEFUUnMsIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIGluZm9ybWF0aW9uLCBhcmUgZWFzeSB0byBmaW5kIGJhc2VkIG9uIHRoZSByZWxldmFudCBjb21tb2RpdHkgY29kZS4nLFxyXG4gICAgICAgIGZvcm06XHJcbiAgICAgICAgICAgICdUaGUgQVRSIHNlYXJjaCBmb3JtIGFsbG93cyB5b3UgdG8gc2VhcmNoIGJ5IGNvbW1vZGl0eSBjb2RlIChjaGFwdGVyLCBoZWFkaW5nLCBzdWJoZWFkaW5nKSBhbmQgcXVlcnkgYnkga2V5d29yZCBhbmQgZ29vZHMgZGVzY3JpcHRpb24sIGFtb25nIG90aGVyIHRoaW5ncy48YnI+PGJyPicgKyBcclxuICAgICAgICAgICAgJ05COiB5b3UgY2FuIGNob29zZSB0byBlaXRoZXIgc29ydCB0aGUgQVRScyBieSBjb21tb2RpdHkgY29kZSBvciBieSBkYXRlLCBpbiBlc3NlbmNlIGNyZWF0aW5nIGEgbmV3cyBmZWVkIHdpdGggdGhlIGxhdGVzdCBBVFJzLCBvciB1c2UgdGhlIGlzc3VlZCBzaW5jZSBmaWVsZCB0byBvbmx5IHNob3cgcmVjZW50IEFUUnMuIDxicj48YnI+JyArXHJcbiAgICAgICAgICAgICdOQjogeW91IGNhbiBhbHNvIGNob29zZSB0byB2aWV3IHRoZSByZXN1bHRzIGFzIGltYWdlcy4gT2Z0ZW4sIGdvaW5nIHRocm91Z2ggYSBsaXN0IG9mIGltYWdlcyBjYW4gYmUgYSBxdWljayB3YXkgdG8gZ2V0IGFuIGlkZWEgb2YgJyArIFxyXG4gICAgICAgICAgICAnd2hldGhlciBvciBub3QgYSBjZXJ0YWluIHBhcnQgb2YgdGhlIG5vbWVuY2xhdHVyZSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgY29tbW9kaXR5IHlvdSBhcmUgY2xhc3NpZnlpbmcuJ1xyXG4gICAgfSxcclxuICAgIGhlYWRlcjoge1xyXG4gICAgICAgIHJlZmVyZW5jZURhdGVQaWNrZXI6ICdVc2UgdGhlIGRhdGUgcGlja2VyIHRvIGNoYW5nZSB0aGUgZGF0ZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gbG9vayB1cCB0YXJpZmZzIG9yIHJlZ3VsYXRpb25zLicsXHJcbiAgICAgICAgdHJhZGVNb3ZlbWVudFBpY2tlcjogJ0Nob29zZSB3aGV0aGVyIHRvIGJyb3dzZSBub21lbmNsYXR1cmUgYW5kIHRyYWRlIHRhcmlmZiBtZWFzdXJlcyBmb3IgaW1wb3J0IG9yIGV4cG9ydCcsXHJcbiAgICAgICAgbGFuZ3VhZ2VQaWNrZXI6IFxyXG4gICAgICAgICAgICAnUGljayBvbmUgb2YgMjIgRXVyb3BlYW4gbGFuZ3VhZ2VzLiAnICsgXHJcbiAgICAgICAgICAgICdOb3RlIHRoYXQgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMgZm9yIHRoZSBpbnRlcmZhY2UgYXJlIEVuZ2xpc2ggYW5kIER1dGNoLiBIb3dldmVyLCBtb3N0IG9mIHRoZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgaW4gYWxsIDIyIGxhbmd1YWdlcy4gJyArXHJcbiAgICAgICAgICAgICdUaGlzIG1heSBjb21lIGluIGhhbmR5IHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIGEgY3VzdG9tZXIsIHN1cHBsaWVyIG9yIGNvbGxlYWd1ZSB3aG8gaGFzIGEgZGlmZmVyZW50IG1vdGhlciB0b25ndWUuJyxcclxuICAgIH0sXHJcbiAgICBsYW5kaW5nUGFnZToge1xyXG4gICAgICAgIHdlbGNvbWVUaXRsZTogJ1dlbGNvbWUnLFxyXG4gICAgICAgIHdlbGNvbWVJbnRybzogXHJcbiAgICAgICAgICAgICdIZWxsbyBhbmQgd2VsY29tZSB0byBUYXJpYyBTdXBwb3J0LiBUaGFuayB5b3UgZm9yIHVzaW5nIG91ciBhcHBsaWNhdGlvbi4gUGxlYXNlIGxldCB1cyBzaG93IHlvdSBhcm91bmQuIDxicj48YnI+JyArXHJcbiAgICAgICAgICAgICdJZiB5b3VcXCdkIHByZWZlciB0byBjb250aW51ZSBpbiBhIGRpZmZlcmVudCBsYW5ndWFnZSwgcGxlYXNlIGNsaWNrIHRoZSBidXR0b24gYWJvdmUgdG8gY2hvb3NlIG9uZSBvZiAyMiBsYW5ndWFnZXMuJyxcclxuICAgICAgICByZWZlcmVuY2VDb3VudHJ5UGlja2VyOiBcclxuICAgICAgICAgICAgJ1RoZSBtYWluIGRhdGEgc291cmNlcyBmb3IgVGFyaWMgU3VwcG9ydCBhcmUgYSBudW1iZXIgb2YgdmFyaW91cyB0cmFkZSB0YXJpZmZzLiBZb3UgY2FuIHVzZSB0aGVzZSBmbGFncyB0byBjaG9vc2UgYmV0d2VlbiB0aGVtLiA8YnI+PGJyPicgKyBcclxuICAgICAgICAgICAgJ1RoaXMgY2hvaWNlIHdpbGwgYWZmZWN0IGJvdGggdGhlIG5vbWVuY2xhdHVyZSB5b3Ugd2lsbCB1c2UgZm9yIGNsYXNzaWZpY2F0aW9uIGFuZCB0aGUgaW1wb3J0IGFuZCBleHBvcnQgbWVhc3VyZXMgdGhhdCB5b3Ugd2lsbCBzZWUuICcgK1xyXG4gICAgICAgICAgICAnRm9yIGluc3RhbmNlLCB0aGUgbm9tZW5jbGF0dXJlIHVzZWQgaW4gdGhlIFVLIEdsb2JhbCBUYXJpZmYgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBub21lbmNsYXR1cmUgdXNlZCBpbiBUQVJJQywgdGhlIGludGVncmF0ZWQgY3VzdG9tcyB0YXJpZmYgb2YgdGhlIEVVLiA8YnI+PGJyPicgK1xyXG4gICAgICAgICAgICAnTkI6IG5vdGUgdGhhdCB5b3UgY2FuIGFsd2F5cyBjaGFuZ2UgdGhlIGN1cnJlbnQgdHJhZGUgdGFyaWZmIGJ5IHVzaW5nIHRoZSBmbGFncyBpbiB0aGUgaGVhZGVyIGJhci4nLFxyXG4gICAgICAgIGludHJvQnV0dG9uOlxyXG4gICAgICAgICAgICAnWW91IGNhbiBjbGljayBvbiB0aGUgaW50cm8gYnV0dG9uIHRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlIHBhZ2UgeW91IGFyZSBvbidcclxuICAgICAgICBcclxuICAgIH0sXHJcbiAgICBtYWluTWVudToge1xyXG4gICAgICAgIGludHJvOiAnVmlhIHRoZSBtYWluIG1lbnUsIHlvdSBjYW4gYWNjZXNzIHRoZSB2YXJpb3VzIG1vZHVsZXMgaW4geW91ciBzdWJzY3JpcHRpb24uIDxicj48YnI+SGludDogdXNlIHRoZSBlbnRlciBrZXkgdG8gZ28gdGhyb3VnaCB0aGlzIHRvdXIuJyxcclxuICAgICAgICBjaGFwdGVyczogJ0Jyb3dzZSB0aGUgdHJhZGUgdGFyaWZmIGFuZCBub21lbmNsYXR1cmUnLFxyXG4gICAgICAgIG5ld3M6ICdUaGUgbGF0ZXN0IGN1c3RvbXMgbmV3cycsXHJcbiAgICAgICAgZWJ0aTogJ1RoZSBlbnRpcmUgRUJUSSBkYXRhYmFzZTogaHVuZHJlZHMgb2YgdGhvdXNhbmRzIG9mIGV4YW1wbGVzIG9mIHByb2R1Y3RzIHRoYXQgaGF2ZSBiZWVuIGNsYXNzaWZpZWQgYnkgY3VzdG9tcyBhdXRob3JpdGllcycsXHJcbiAgICAgICAgYWJjOiAnVmFsaWRhdGUgYW5kIGVucmljaCBodW5kcmVkcyBvZiBjb2RlcyBwZXIgbWludXRlIHdpdGggVGFyaWMgU3VwcG9ydCBBQkMnLFxyXG4gICAgICAgIGNvcnJlbGF0aW9uVGFibGU6ICdGaW5kIHRoZSBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMgb2YgY29tbW9kaXR5IGNvZGVzJyxcclxuICAgICAgICByZWZlcmVuY2VQcmljZXM6ICdBIGNvbXBsZXRlIGxpc3Qgb2YgZGFpbHkgc3RhbmRhcmQgaW1wb3J0IHZhbHVlcyBhbmQgdW5pdCBwcmljZXMgZm9yIGZydWl0cyBhbmQgdmVnZXRhYmxlcycsXHJcbiAgICAgICAgY2FzZUxhdzogJ0R1dGNoIGFuZCBFdXJvcGVhbiBjdXN0b21zIGNhc2UgbGF3LidcclxuICAgIH0sXHJcbiAgICBtZWFzdXJlczoge1xyXG4gICAgICAgIGludHJvOiBcclxuICAgICAgICAgICAgJ1RoaXMgcGFnZSBzaG93cyBhbiBvdmVydmlldyBvZiBtZWFzdXJlcyB0aGF0IGFwcGx5IGZvciBpbXBvcnQgb3IgZXhwb3J0IG9mIGEgY29tbW9kaXR5IHdpdGggdGhpcyBjb21tb2RpdHkgY29kZS4gPGJyPjxicj4nICtcclxuICAgICAgICAgICAgJ1dlIG1ha2UgdXNlIG9mIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBjb2xvcnMgdG8gaGVscCB5b3UgdG8gcXVpY2tseSBpZGVudGlmeSB0aGUgdmFyaW91cyB0eXBlcyBvZiBjb2Rlcy4gJyArXHJcbiAgICAgICAgICAgICdJbiB0aGlzIHdheSB3ZSBjYW4gZGlzcGxheSBhIGxvdCBvZiBpbmZvcm1hdGlvbiBpbiBhIGNvbXBhY3QgZm9ybWF0LiBUaGUgY29sb3JzIGFyZSBhcyBmb2xsb3dzOiA8YnI+PGJyPicgK1xyXG4gICAgICAgICAgICAnPHVsIGNsYXNzPVwibmF2IG5hdi1waWxscyBuYXYtc3RhY2tlZFwiPicgK1xyXG4gICAgICAgICAgICAnPGxpPjxhIGNsYXNzPVwiYnRuIGJ0bi1jZXJ0aWZpY2F0ZS1jb2RlXCI+Q2VydGlmaWNhdGUgQ29kZTwvYT48L2xpPicgK1xyXG4gICAgICAgICAgICAnPGxpPjxhIGNsYXNzPVwiYnRuIGJ0bi1mb290bm90ZVwiPkZvb3Rub3RlPC9hPjwvbGk+JyArXHJcbiAgICAgICAgICAgICc8bGk+PGEgY2xhc3M9XCJidG4gYnRuLWFkZGNvZFwiPkFkZGl0aW9uYWwgQ29kZTwvYT48L2xpPicgK1xyXG4gICAgICAgICAgICAnPGxpPjxhIGNsYXNzPVwiYnRuIGJ0bi1wcmVmY29kZVwiPlByZWZlcmVuY2UgQ29kZTwvYT48L2xpPicgK1xyXG4gICAgICAgICAgICAnPC91bD4nLFxyXG4gICAgICAgIGZvcm06XHJcbiAgICAgICAgICAgICdXaXRoIHRoaXMgZm9ybSB5b3UgY2FuIGZpbHRlciB0aGUgbWVhc3VyZXMgYnkgY291bnRyeSBjb2RlLCBhcHBseSBhZGRpdGlvbmFsIGNvZGVzIGFuZCBjaG9vc2UgdGhlIHByZWZlcnJlZCBkdXR5IHRyZWF0bWVudC4gPGJyPjxicj4nICtcclxuICAgICAgICAgICAgJ0hpbnQ6IHlvdSBjYW4gYWxzbyBhZGQgdGhlIGNvdW50cnkgY29kZSBhbmQvb3IgY291bnRyeSBuYW1lIHRvIHRoZSBxdWVyeSB0aGF0IHlvdSB0eXBlIGluIHRoZSBzZWFyY2ggYm94IGluIHRoZSBoZWFkZXIgYmFyLicsXHJcbiAgICAgICAgdmFsaWRhdGVEZWNsYXJhdGlvbjpcclxuICAgICAgICAgICAgJ0luIHRoaXMgc2NyZWVuIHlvdSBjYW4gdmFsaWRhdGUgdGhlIGRhdGEgZm9yIGEgY3VzdG9tcyBkZWNsYXJhdGlvbi4gRmlyc3QgZmlsdGVyIG1lYXN1cmVzIGJ5IGNvdW50cnkgY29kZSwgYXBwbHkgYWRkaXRpb25hbCBjb2RlcyAnICtcclxuICAgICAgICAgICAgJ2FuZCBjaG9vc2UgdGhlIHByZWZlcnJlZCBkdXR5IHRyZWF0bWVudC4gTmV4dCwgZW50ZXIgdGhlIGN1c3RvbXMgdmFsdWUgYW5kIHRoZSByZWxldmFudCBxdWFudGl0aWVzLiBGaW5hbGx5IGNob29zZSB0aGUgYXBwbGljYWJsZSAnICtcclxuICAgICAgICAgICAgJ3BhcnRpY3VsYXIgcHJvdmlzaW9uIGNvZGVzIChZLWNvZGVzKSBhbmQgY2VydGlmaWNhdGUgY29kZXMgYW5kIHJ1biB0aGUgdmFsaWRhdGlvbi4nLFxyXG4gICAgICAgIGNhbGN1bGF0ZUR1dHk6XHJcbiAgICAgICAgICAgICdJbiB0aGlzIHNjcmVlbiB5b3UgY2FuIGNhbGN1bGF0ZSBpbXBvcnQgZHV0aWVzIGFuZCAoZm9yIHN1cHBvcnRlZCBjb3VudHJpZXMpIG5hdGlvbmFsIHRheGVzLiBGaXJzdCBmaWx0ZXIgbWVhc3VyZXMgYnkgY291bnRyeSBjb2RlLCBhcHBseSBhZGRpdGlvbmFsIGNvZGVzICcgK1xyXG4gICAgICAgICAgICAnYW5kIGNob29zZSB0aGUgcHJlZmVycmVkIGR1dHkgdHJlYXRtZW50LiBOZXh0LCBlbnRlciB0aGUgY3VzdG9tcyB2YWx1ZSBhbmQgdGhlIHJlbGV2YW50IHF1YW50aXRpZXMuIEZpbmFsbHkgY2hvb3NlIHRoZSBhcHBsaWNhYmxlICcgK1xyXG4gICAgICAgICAgICAncGFydGljdWxhciBwcm92aXNpb24gY29kZXMgKFktY29kZXMpIGFuZCBjZXJ0aWZpY2F0ZSBjb2RlcyBhbmQgcHJlc3MgY2FsY3VsYXRlIGR1dHkuJ1xyXG4gICAgfSxcclxuICAgIG5ld3M6IHtcclxuICAgICAgICBpbnRybzogXHJcbiAgICAgICAgICAgICdDaG9vc2UgXCJFVSBMZWdpc2xhdGlvblwiIGZvciB0aGUgbGF0ZXN0IHJlZ3VsYXRpb25zIGFuZCBhbm5vdW5jZW1lbnRzIGZyb20gRVVSLUxleC4gPGJyPjxicj4nICtcclxuICAgICAgICAgICAgJ0Nob29zZSBcIkNhc2UgTGF3XCIgZm9yIHRoZSBsYXRlc3QgcnVsaW5ncyBieSB0aGUgRVUgQ291cnQgb2YgSnVzdGljZSwgYXMgd2VsbCBhcyBEdXRjaCBuYXRpb25hbCBydWxpbmdzLiA8YnI+PGJyPicgK1xyXG4gICAgICAgICAgICAnVGhlIG1lbnUgaXRlbSBcIkR1dGNoIEN1c3RvbXMgTmV3cyBGZWVkXCIgc2hvd3MgbmV3cyBpdGVtcyBwdWJsaXNoZWQgYnkgdGhlIER1dGNoIGN1c3RvbXMgYXV0aG9yaXRpZXMgKGluIER1dGNoIG9ubHkpJ1xyXG4gICAgfSxcclxuICAgIHVpOiB7XHJcbiAgICAgICAgZG9uZTogJ0RvbmUnLFxyXG4gICAgICAgIGhlbHA6ICdIZWxwJyxcclxuICAgICAgICBuZXh0OiAnTmV4dCcsXHJcbiAgICAgICAgcHJldmlvdXM6ICdQcmV2aW91cycsXHJcbiAgICAgICAgc3RhcnRUb3VyOiAnSW50cm8nLFxyXG4gICAgfSxcclxufTsiLCIvLyBGb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSwgc2VlIHRoZSBmb2xsb3dpbmcgd2ViIHBhZ2VzOlxyXG4vLyBTZWUgaHR0cHM6Ly9lYy5ldXJvcGEuZXUvdGF4YXRpb25fY3VzdG9tcy9kZHMyL2VjaWNzL2NoZW1pY2Fsc3Vic3RhbmNlX2NvbnN1bHRhdGlvbi5qc3BcclxuLy8gU2VlIGh0dHBzOi8vZWMuZXVyb3BhLmV1L3RheGF0aW9uX2N1c3RvbXMvZGRzMi9lY2ljcy9jaGVtaWNhbHN1YnN0YW5jZV9kZXRhaWxzLmpzcD9MYW5nPWl0JkN1cz0wMDEwMDAxLTZcclxuLy8gSW4gVGFyaWMgU3VwcG9ydCwgc2VlIGh0dHBzOi8vYXBwLnRhcmljc3VwcG9ydC5jb20vIyEvZWNpY3MvaG9tZS9cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBDQVNfUk46ICdDQVMgUk4nLCAvLyBkbyBub3QgdHJhbnNsYXRlXHJcbiAgICBDaGVtaWNhbHNTZWFyY2g6ICdDaGVtaWNhbHMgU2VhcmNoJyxcclxuICAgIENoYXJhY3RlcmlzdGljOiAnQ2hhcmFjdGVyaXN0aWMnLFxyXG4gICAgQ2hhcmFjdGVyaXN0aWNzOiAnQ2hhcmFjdGVyaXN0aWNzJyxcclxuICAgIENvbW1lbnQ6ICdDb21tZW50JyxcclxuICAgIENVUzogJ0NVUycsICAvLyBkbyBub3QgdHJhbnNsYXRlXHJcbiAgICBFQ19OdW1iZXI6ICdFQyBOdW1iZXInLFxyXG4gICAgRWNpY3M6ICdFQ0lDUycsICAvLyBkbyBub3QgdHJhbnNsYXRlXHJcbiAgICBFY2ljc0RldGFpbHM6ICdFQ0lDUyBEZXRhaWxzJyxcclxuICAgIEVjaWNzTGlua1RleHQ6ICdDbGljayBoZXJlIHRvIG9wZW4gdGhpcyBpdGVtIGluIHRoZSBFQ0lDUyBkYXRhYmFzZS4nLFxyXG4gICAgSW5DaEk6ICdJbkNoSScsICAvLyBkbyBub3QgdHJhbnNsYXRlXHJcbiAgICBJbkNoSUtleTogJ0luQ2hJIEtleScsXHJcbiAgICBMYW5ndWFnZUNvZGU6ICdMYW5ndWFnZSBDb2RlJyxcclxuICAgIExldmVsOiAnTGV2ZWwnLFxyXG4gICAgTmFtZTogJ05hbWUnLFxyXG4gICAgTmFtZXM6ICdOYW1lcycsXHJcbiAgICBOb21lbmNsYXR1cmU6ICdOb21lbmNsYXR1cmUnLFxyXG4gICAgT3JkZXI6ICdPcmRlcicsIC8vIGFzIGluIHRoZSBvcmRlcmluZyBvZiBhIGxpc3RcclxuICAgIFNlYXJjaEVjaWNzRGF0YWJhc2U6ICdTZWFyY2ggRUNJQ1MgRGF0YWJhc2UnLFxyXG4gICAgVU5fTnVtYmVyOiAnVU4gTnVtYmVyJyxcclxufTsiLCIvLyBTZWUgaHR0cHM6Ly9hcHAudGFyaWNzdXBwb3J0LmNvbS8jIS9leGNoYW5nZS1yYXRlc1xyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIEN1cnJlbmN5OiAnQ3VycmVuY3knLFxyXG4gICAgQ3VycmVuY3lDb2RlOiAnQ3VycmVuY3kgQ29kZScsXHJcbiAgICBDdXJyZW5jeUNvZGVNb2RhbFRpdGxlOiAnU2VsZWN0IGEgY3VycmVuY3kgY29kZScsXHJcbiAgICBDdXJyZW5jeUNvZGVUeXBlYWhlYWRQbGFjZWhvbGRlcjogJ1NlYXJjaCBieSBjdXJyZW5jeSBjb2RlIG9yIG5hbWUnLFxyXG4gICAgQ3VycmVuY3lDb252ZXJzaW9uUmVzdWx0czogJ0N1cnJlbmN5IENvbnZlcnNpb24gUmVzdWx0cycsXHJcbiAgICBDdXJyZW5jeU5hbWU6ICdDdXJyZW5jeSBOYW1lJyxcclxuICAgIEV4Y2hhbmdlUmF0ZXM6ICdFeGNoYW5nZSBSYXRlcycsXHJcbiAgICBOdW1iZXJPZkRlY2ltYWxQbGFjZXM6ICdOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMnLFxyXG4gICAgVXNlVGhlRmllbGRzQmVsb3dUb0NvbnZlcnRCZXR3ZWVuX2FuZF86ICdVc2UgdGhlIGZpZWxkcyBiZWxvdyB0byBjb252ZXJ0IGJldHdlZW4ge3sgaW52ZXJzZU1vbmV0YXJ5VmFsdWUudW5pdCB9fSBhbmQge3sgbW9uZXRhcnlWYWx1ZS51bml0IH19JyxcclxufTtcclxuIiwiLy8gQ2hvb3NlIEdlcm1hbiB0cmFkZSB0YXJpZmYgKEVaVCAtIEVsZWt0cm9uaXNjaGVyIFpvbGx0YXJpZikuXHJcbi8vIFNlZSBodHRwczovL2FwcC50YXJpY3N1cHBvcnQuY29tLyMhL2dvb2QvMjIwMzAwMDEwMFxyXG4vLyBTZWUgaHR0cHM6Ly9hcHAudGFyaWNzdXBwb3J0LmNvbS8jIS90ZXh0cy1nZXJtYW4tY3VzdG9tc1xyXG4vLyBTZWUgaHR0cHM6Ly9hdXNrdW5mdC5lenQtb25saW5lLmRlL2V6dG8vV2VsY29tZS5kb1xyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIENob29zZU5hdGlvbmFsQ29tbW9kaXR5Q29kZVRvRmluZFZhdFJhdGU6ICdDaG9vc2UgYSBuYXRpb25hbCBjb21tb2RpdHkgY29kZSBhYm92ZSB0byBmaW5kIHRoZSBjb3JyZWN0IFZBVCByYXRlLicsXHJcbiAgICBDaG9vc2VFeGNpc2VDb2RlVG9GaW5kRXhjaXNlUmF0ZXM6ICdDaG9vc2UgYW4gZXhjaXNlIGNvZGUgYWJvdmUgdG8gZmluZCB0aGUgY29ycmVjdCBleGNpc2UgcmF0ZS4nLFxyXG4gICAgRXhjaXNlQ29kZTogJ0V4Y2lzZSBjb2RlJyxcclxuICAgIEV4cGxhbmF0b3J5Tm90ZXNQcm92aWRlZEJ5R2VybWFuQ3VzdG9tczogJ0V4cGxhbmF0b3J5IE5vdGVzIHByb3ZpZGVkIGJ5IEdlcm1hbiBDdXN0b21zJyxcclxuICAgIEV4Y2lzZUR1dHlSYXRlOiAnRXhjaXNlIGR1dHkgcmF0ZScsXHJcbiAgICBFenRFeGNpc2VDb2RlRmllbGRQbGFjZUhvbGRlcjogJ0VudGVyIG9yIHNlYXJjaCBmb3IgZXhjaXNlIGNvZGUnLFxyXG4gICAgRXp0RXhjaXNlQ29kZVNlbGVjdG9yTW9kYWxUaXRsZTogJ0V4Y2lzZSBOb21lbmNsYXR1cmUnLFxyXG4gICAgR2VybWFuRXhwbGFuYXRvcnlOb3RlczogJ0V4cGxhbmF0b3J5IE5vdGVzIEdlcm1hbnknLFxyXG4gICAgSGlud2Vpc2U6ICdIaW53ZWlzZScsXHJcbiAgICBOYXRpb25hbENvbW1vZGl0eUNvZGU6ICdOYXRpb25hbCBDb21tb2RpdHkgQ29kZScsXHJcbiAgICBOYXRpb25hbE5vbWVuY2xhdHVyZTogJ05hdGlvbmFsIE5vbWVuY2xhdHVyZScsXHJcbiAgICBUZXh0c1B1Ymxpc2hlZEJ5R2VybWFuQ3VzdG9tczogJ1RleHRzIHB1Ymxpc2hlZCBieSBHZXJtYW4gQ3VzdG9tcycsXHJcbiAgICBUZXh0c0dlcm1hbkN1c3RvbXM6ICdUZXh0cyBHZXJtYW4gQ3VzdG9tcycsXHJcblxyXG59OyIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgRXVNZW1iZXJTdGF0ZTogJ0VVIG1lbWJlciBzdGF0ZSdcclxufTsiLCLvu78vLyBUbyBiZSB0cmFuc2xhdGVkIGJ5IFRhcmljIFN1cHBvcnQgYW5kIHJldmlld2VkIGJ5IHRyYW5zbGF0aW9uIGFnZW5jeVxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIHRhYnM6IHtcclxuICAgICAgICBNZWFzdXJlczogJ01lYXN1cmVzJyxcclxuICAgICAgICBWYWxpZGF0ZURlY2xhcmF0aW9uOiAnVmFsaWRhdGUgZGVjbGFyYXRpb24nLFxyXG4gICAgICAgIENhbGN1bGF0ZUR1dHk6ICdDYWxjdWxhdGUgZHV0aWVzJ1xyXG4gICAgfSxcclxuICAgIGZvcm06IHtcclxuICAgICAgICBsZWdlbmRWYWx1ZTogJ1ZhbHVlJyxcclxuICAgICAgICByYWRpb01ldGhvZExhYmVsOiAnTWV0aG9kJyxcdFxyXG4gICAgICAgIHJhZGlvTWV0aG9kT3B0aW9uQ2FsY3VsYXRlVmFsdWU6ICdDYWxjdWxhdGUgdmFsdWUnLFxyXG4gICAgICAgIHJhZGlvTWV0aG9kT3B0b25FbnRlclZhbHVlOiAnRW50ZXIgdmFsdWUnXHJcbiAgICB9LFxyXG4gICAgZmluYW5jaWFsQ29uZGl0aW9uczoge1xyXG4gICAgICAgIEU6IHtcclxuICAgICAgICAgICAgdGl0bGU6ICdUaGUgcXVhbnRpdHkgb3IgdGhlIHByaWNlIHBlciB1bml0IGRlY2xhcmVkLCBhcyBhcHByb3ByaWF0ZSwgaXMgZXF1YWwgb3IgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgbWF4aW11bSwgb3IgcHJlc2VudGF0aW9uIG9mIHRoZSByZXF1aXJlZCBkb2N1bWVudCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIGNvbDE6ICdRdWFudGl0eSBvciBwcmljZSBwZXIgdW5pdCcsXHJcbiAgICAgICAgICAgICAgICBjb2wyOiAnVGFyaWZmJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBGOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiAnVGhlIG5ldCBmcmVlIGF0IGZyb250aWVyIHByaWNlIGJlZm9yZSBkdXR5IG11c3QgYmUgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtIHByaWNlJyxcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgY29sMTogJ05ldCBmcmVlIHByaWNlIGF0IGZyb250aWVyLCBiZWZvcmUgZHV0eScsXHJcbiAgICAgICAgICAgICAgICBjb2wyOiAnVGFyaWZmJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBMOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiAnQ0lGIHByaWNlIG11c3QgYmUgaGlnaGVyIHRoYW4gdGhlIG1pbmltdW0gcHJpY2UnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBjb2wxOiAnQ0lGIHByaWNlJyxcclxuICAgICAgICAgICAgICAgIGNvbDI6ICdUYXJpZmYnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIE06IHtcclxuICAgICAgICAgICAgdGl0bGU6ICdJbXBvcnQgcHJpY2UgbXVzdCBiZSBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gcHJpY2UvcmVmZXJlbmNlIHByaWNlJyxcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgY29sMTogJ0ltcG9ydCBwcmljZScsXHJcbiAgICAgICAgICAgICAgICBjb2wyOiAnVGFyaWZmJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBWOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiAnSW1wb3J0IHByaWNlIG11c3QgYmUgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHRoZSBlbnRyeSBwcmljZScsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIGNvbDE6ICdJbXBvcnQgcHJpY2UnLFxyXG4gICAgICAgICAgICAgICAgY29sMjogJ1RhcmlmZidcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBtZXVyc2luZzoge1xyXG4gICAgICAgIGNhbGN1bGF0ZURlc2NyaXB0aW9uOiAnRmlsbCBpbiB0aGUgaW5mb3JtYXRpb24gYmVsb3cgdG8gY2FsY3VsYXRlIHRoZSBhZGRpdGlvbmFsIGNvZGUgZm9yIHRoZSBhZ3JpY3VsdHVyYWwgZWxlbWVudC4nLFxyXG4gICAgICAgIGNhbGN1bGF0ZVRpdGxlOiAnQ2FsY3VsYXRlIGFkZGl0aW9uYWwgY29kZSBhZ3JpY3VsdHVyYWwgZWxlbWVudCcsXHJcbiAgICAgICAgaW1wb3NzaWJsZUNvbWJpbmF0aW9uOiAnSW52YWxpZCBjb21iaW5hdGlvbiBvZiBpbmdyZWRpZW50cyAodG90YWwgd2VpZ2h0IG92ZXIgMTAwJSknLFxyXG4gICAgICAgIG1pbGtmYXQ6ICdNaWxrZmF0ICglIHdlaWdodCknLFxyXG4gICAgICAgIG1pbGtwcm90ZWluczogJ01pbGtwcm90ZWlucyAoJSB3ZWlnaHQpJyxcclxuICAgICAgICBzYWNjaGFyaW46ICdTdWNyb3NlL2ludmVydCBzdWdhci9pc29nbHVjb3NlICglIHdlaWdodCknLFxyXG4gICAgICAgIHN0YXJjaEdsdWNvc2U6ICdTdGFyY2gvZ2x1Y29zZSAoJSB3ZWlnaHQpJyxcclxuICAgIH1cclxufTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBDaGFwdGVyczogJ0NoYXB0ZXJzJyxcclxuICAgIFNlYXJjaDogJ1NlYXJjaCcsXHJcbiAgICBOZXdzOiAnTmV3cycsXHJcbiAgICBCaW5kaW5nVGFyaWZmSW5mb3JtYXRpb246ICdCaW5kaW5nIFRhcmlmZiBJbmZvcm1hdGlvbicsXHRcclxuICAgIENoZW1pY2Fsc1NlYXJjaDogJ0NoZW1pY2FscyBTZWFyY2gnLFxyXG4gICAgVmFsaWRhdGVCdXNpbmVzc0luZm9ybWF0aW9uOiAnVmFsaWRhdGUgQnVzaW5lc3MgSW5mb3JtYXRpb24nLFx0XHJcbiAgICBBZHZhbmNlVGFyaWZmUnVsaW5nczogJ0FkdmFuY2UgVGFyaWZmIFJ1bGluZ3MnLFxyXG4gICAgVGFyaWNTdXBwb3J0QUJDOiAnQUJDIC0gQ2hlY2sgRmlsZScsXHJcbiAgICBDb3JyZWxhdGlvblRhYmxlOiAnQ29ycmVsYXRpb24gVGFibGUnLFxyXG4gICAgVHJhZGVTdGF0aXN0aWNzOiAnVHJhZGUgU3RhdGlzdGljcycsXHJcbiAgICBUcmFuc2FjdGlvblZhbHVlOiAnVHJhbnNhY3Rpb24gVmFsdWUnLFxyXG4gICAgUmVmZXJlbmNlUHJpY2VzOiAnRVUgUmVmZXJlbmNlIFByaWNlcycsXHJcbiAgICBDYXNlTGF3OiAnQ2FzZSBMYXcnLFxyXG4gICAgVGV4dHNCeUdlcm1hbkN1c3RvbXM6ICdUZXh0cyBieSBHZXJtYW4gQ3VzdG9tcycsXHJcbiAgICBSZWZlcmVuY2VMaXN0czogJ1JlZmVyZW5jZSBMaXN0cycsXHJcbiAgICBBZGRpdGlvbmFsQ29kZXM6ICdBZGRpdGlvbmFsIENvZGVzJyxcclxuICAgIENlcnRpZmljYXRlQ29kZXM6ICdDZXJ0aWZpY2F0ZSBDb2RlcycsXHJcbiAgICBGb290bm90ZXM6ICdGb290bm90ZXMnLFxyXG4gICAgUmVnaW9uczogJ1JlZ2lvbnMnLFxyXG4gICAgRXhjaGFuZ2VSYXRlczogJ0V4Y2hhbmdlIFJhdGVzJyxcclxuICAgIENoYW5nZVBhc3N3b3JkOiAnQ2hhbmdlIFBhc3N3b3JkJyxcclxuICAgIExvZ291dDogJ0xvZ291dCcsXHJcbiAgICBGYXZvcml0ZXM6ICdGYXZvcml0ZXMnLFx0XHJcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBEdXRjaEN1c3RvbXNOZXdzRmVlZDogJ0R1dGNoIEN1c3RvbXMgTmV3cyBGZWVkJyxcclxuICAgIE5ld3NPdmVydmlldzogJ05ld3MgT3ZlcnZpZXcnLFxyXG4gICAgT3BlbkluVGFyaWNTdXBwb3J0OiAnT3BlbiBpbiBUYXJpYyBTdXBwb3J0J1xyXG59OyIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgQW5ub3RhdGlvbnM6ICdOb3RlcycsXHJcbiAgICBBbm5vdGF0aW9uc0ZpcnN0TGV0dGVyOiAnTicsXHJcblxyXG4gICAgQ2hhcHRlcjogJ0NoYXB0ZXInLFxyXG4gICAgQ2hhcHRlcnM6ICdDaGFwdGVycycsXHJcbiAgICBDaGFwdGVyX2NvZGVfOiAnQ2hhcHRlciB7eyBjb2RlIH19JyxcclxuICAgIENoYXB0ZXJfR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyXzogJ0NoYXB0ZXIge3sgR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyIH19JyxcclxuXHJcbiAgICBDb21iaW5lZE5vbWVuY2xhdHVyZTogJ0NvbWJpbmVkIE5vbWVuY2xhdHVyZScsXHJcblxyXG4gICAgQ29tbW9kaXR5Q2xhc3NpZmljYXRpb246ICdDb21tb2RpdHkgQ2xhc3NpZmljYXRpb24nLFxyXG4gICAgQ29tbW9kaXR5Q29kZTogJ0NvbW1vZGl0eSBDb2RlJyxcclxuICAgIENvbW1vZGl0eUNvZGVzOiAnQ29tbW9kaXR5IENvZGVzJyxcclxuICAgIENvbW1vZGl0eUNvZGVzRm91bmRJblRleHQ6ICdDb21tb2RpdHkgQ29kZXMgRm91bmQgaW4gVGV4dCcsXHJcbiAgICBcclxuXHJcbiAgICBIZWFkaW5nOiAnSGVhZGluZycsXHJcbiAgICBIZWFkaW5nX2NvZGVfOiAnSGVhZGluZyB7eyBjb2RlIH19JyxcclxuICAgIEhlYWRpbmdfR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyXzogJ0hlYWRpbmcge3sgR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyIH19JyxcclxuICAgIEhlYWRpbmdzOiAnSGVhZGluZ3MnLFxyXG5cclxuICAgIFNlY3Rpb246ICdTZWN0aW9uJyxcclxuICAgIFNlY3Rpb25fbnVtYmVyXzogJ1NlY3Rpb24ge3sgbnVtYmVyIH19JyxcclxuICAgIFNlY3Rpb25fR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyXzogJ1NlY3Rpb24ge3sgR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyIH19JyxcclxuICAgIFNlY3Rpb25zOiAnU2VjdGlvbnMnLFxyXG5cclxuICAgIFN1YkNoYXB0ZXJfR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyXzogJ1N1YmNoYXB0ZXIge3sgR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyIH19JyxcclxuXHJcbiAgICBTdWJoZWFkaW5nOiAnU3ViaGVhZGluZycsXHJcblxyXG4gICAgV2NvQ2xhc3NpZmljYXRpb25PcGluaW9uczogJ1dDTyBDbGFzc2lmaWNhdGlvbiBPcGluaW9ucycsXHJcbiAgICBDbGFzc2lmaWNhdGlvbnM6ICdDbGFzc2lmaWNhdGlvbnMnLFxyXG4gICAgRXhwbGFuYXRvcnlOb3RlczogJ0V4cGxhbmF0b3J5IE5vdGVzJyxcclxuICAgIEV4cGxhbmF0b3J5Tm90ZXNGaXJzdExldHRlcjogJ0UnLFxyXG4gICAgRXhwbGFuYXRvcnlOb3Rlc0NuOiAnQ04gRXhwbGFuYXRvcnkgTm90ZXMgLSBFVScsXHJcbiAgICBFeHBsYW5hdG9yeU5vdGVzSHM6ICdIUyBFeHBsYW5hdG9yeSBOb3RlcyAtIFdDTycsXHJcbiAgICBOb21lbmNsYXR1cmU6ICdOb21lbmNsYXR1cmUnLFxyXG4gICAgTm9tZW5jbGF0dXJlR3JvdXBzOiAnTm9tZW5jbGF0dXJlIEdyb3VwcycsXHJcbiAgICBOb21lbmNsYXR1cmVIZWFkaW5nczogJ05vbWVuY2xhdHVyZSAtIEhlYWRpbmdzJyxcclxuICAgIE5vbWVuY2xhdHVyZUhlYWRpbmdfY29kZV86ICdOb21lbmNsYXR1cmUgLSBIZWFkaW5nIHt7IGNvZGUgfX0nLFxyXG5cclxuICAgIFNlY3Rpb25BbmRDaGFwdGVyTm90ZXM6ICdTZWN0aW9uIGFuZCBDaGFwdGVyIE5vdGVzJyxcclxufTsiLCLvu78vLyBTZWUgaHR0cHM6Ly9hcHAudGFyaWNzdXBwb3J0LmNvbS8jIS9nb29kLzA3MDIwMDAwMDdcclxuLy8gYW5kIHByZXNzIG9uIG9uZSBvZiB0aGUgbGlua3MgbWFya2VkIFwib3JkZXJcIlxyXG4vLyBTZWUgaHR0cHM6Ly9lYy5ldXJvcGEuZXUvdGF4YXRpb25fY3VzdG9tcy9kZHMyL3RhcmljL3F1b3RhX2NvbnN1bHRhdGlvbi5qc3A/T3JpZ2luPSZTdGF0dXM9JlllYXI9MjAyNCZTY3JlZW49MCZldXJvcGFQYXRoPWV1cm9wYSZsb2dvUGF0aD1ldXJvcGElMmZlY2wlMmZpbWFnZXMlMmZsb2dvJkV4cGFuZD10cnVlJkNyaXRpY2FsPSZMYW5nPWl0JkNvZGU9Jk9mZnNldD0wXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgb3JkZXJOdW1iZXJQcmVmaXg6ICdvcmRlcjonLFxyXG4gICAgb3JkZXJOdW1iZXI6IHtcclxuICAgICAgICBiYWxhbmNlOiAnQmFsYW5jZScsXHJcbiAgICAgICAgY2hhbmdlRGF0ZTogJ0NoYW5nZSBkYXRlJyxcclxuICAgICAgICBjcml0aWNhbDogJ0NyaXRpY2FsJyxcclxuICAgICAgICBjdXJyZW50Vm9sdW1lOiAnQXZhaWxhYmxlIHZvbHVtZScsXHJcbiAgICAgICAgZW5kRGF0ZTogJ0VuZCBkYXRlJyxcclxuICAgICAgICBpbml0aWFsVm9sdW1lOiAnSW5pdGlhbCB2b2x1bWUnLFxyXG4gICAgICAgIG1lYXN1cmVtZW50VW5pdDogJ01lYXN1cmVtZW50IHVuaXQnLFxyXG4gICAgICAgIG5vUXVvdGE6ICdObyBxdW90YSBjb3VsZCBiZSBmb3VuZCBmb3IgdGhpcyBvcmRlcm51bWJlci4nLFxyXG4gICAgICAgIG5vU3RhdHVzOiAnTm8gc3RhdHVzIGluZm9ybWF0aW9uIGF2YWlsYWJsZScsXHJcbiAgICAgICAgcGVyaW9kU3RhcnREYXRlOiAnUGVyaW9kIHN0YXJ0IGRhdGUnLFxyXG4gICAgICAgIHJlZ2lvbjogJ0dlb2dyYXBoaWNhbCBhcmVhJyxcclxuICAgICAgICBzdGFydERhdGU6ICdTdGFydCBkYXRlJyxcclxuICAgICAgICBzdGF0dXM6ICdTdGF0dXMnXHJcbiAgICB9LFxyXG4gICAgcXVvdGFTdGF0dXM6IHtcclxuICAgICAgICBibG9jazogJ0Jsb2NrZWQnLFxyXG4gICAgICAgIGNyaXRpY2FsOiAnQ3JpdGljYWwnLFxyXG4gICAgICAgIGV4aGF1c3Rpb246ICdFeGhhdXN0ZWQnLFxyXG4gICAgICAgIHJlb3BlbmluZzogJ1Jlb3BlbmVkJyxcclxuICAgICAgICByZXN1bWU6ICdSZXN1bWVkJyxcclxuICAgICAgICBzdGFydDogJ1N0YXJ0ZWQnLFxyXG4gICAgICAgIHN1c3BlbnNpb246ICdTdXNwZW5kZWQnLFxyXG4gICAgICAgIHVuYmxvY2tpbmc6ICdVbmJsb2NrZWQnLFxyXG4gICAgICAgIHVuc3VzcGVuc2lvbjogJ1Vuc3VzcGVuZGVkJ1xyXG4gICAgfVxyXG59O1xyXG4iLCLvu78vLyBTZWUgaHR0cHM6Ly9hcHAudGFyaWNzdXBwb3J0LmNvbS8jIS9yZWZlcmVuY2VwcmljZXNcclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBOb0FjY2VzczogJzxoMj5BbiBhZGRpdGlvbmFsIHN1YnNjcmlwdGlvbiBpcyByZXF1aXJlZCB0byBhY2Nlc3MgdGhpcyBkYXRhLjwvaDI+ICcgKyBcclxuICAgICAgICAnPHA+VGhpcyBtb2R1bGUgZ2l2ZXMgYSBjb21wbGV0ZSBvdmVydmlldyBvZiB0aGUgcmVmZXJlbmNlIHByaWNlcyBmb3IgYWdyaWN1bHR1cmFsIHByb2R1Y3RzLiAnICtcclxuICAgICAgICAnVGhhdCBpcywgeW91IHdpbGwgZmluZCBhbiBhbHdheXMgdXAtdG8tZGF0ZSBvdmVydmlldyBvZiBjdXJyZW50IFN0YW5kYXJkIEltcG9ydCBWYWx1ZXMgYW5kIFVuaXQgUHJpY2VzLiAnICtcclxuICAgICAgICAnWW91IGNhbiBhbHNvIGRvd25sb2FkIHRoaXMgZGF0YSBmb3IgdXNlIGluIGFuIGV4dGVybmFsIGFwcGxpY2F0aW9uLiA8L3A+ICcgK1xyXG4gICAgICAgICc8cD5UaGlzIG1vZHVsZSByZXF1aXJlcyBhbiBhZGRpdGlvbmFsIHN1YnNjcmlwdGlvbi4gUGxlYXNlIGNvbnRhY3QgVGFyaWMgU3VwcG9ydCBmb3IgYWNjZXNzLjwvcD4gJyArXHJcbiAgICAgICAgJzxwPjxlbT5CZWxvdyBpcyBhIHNhbXBsZSBvZiB0aGUgZGF0YSB0aGF0IGlzIGF2YWlsYWJsZS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHNhbXBsZSBjb25jZXJucyBoaXN0b3JpY2FsIGRhdGEuPC9lbT48L3A+ICcsXHJcbiAgICBvdmVydmlldzoge1xyXG4gICAgICAgIEVuZERhdGU6ICdTdG9wcyBvbicsXHJcbiAgICAgICAgTm9QcmljZXM6ICdObyByZWZlcmVuY2UgcHJpY2VzIGNvdWxkIGJlIGZvdW5kIGF0IHRoaXMgdGltZScsXHJcbiAgICAgICAgU3RhbmRhcmRJbXBvcnRWYWx1ZXM6ICdTdGFuZGFyZCBJbXBvcnQgVmFsdWVzJyxcclxuICAgICAgICBTdGFydERhdGU6ICdTdGFydHMgb24nLFxyXG4gICAgICAgIFRpdGxlOiAnRVUgUmVmZXJlbmNlIHByaWNlcycsXHJcbiAgICAgICAgVW5pdFByaWNlczogJ1VuaXQgUHJpY2VzJ1xyXG4gICAgfVxyXG59OyIsIu+7vy8vIFNlZSBodHRwczovL2FwcC50YXJpY3N1cHBvcnQuY29tLyMhL25ld3MvcmVndWxhdGlvbnNcclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBBY3RpdmVUYXJpY01lYXN1cmVzOiAnQWN0aXZlIFRBUklDIE1lYXN1cmVzJyxcclxuICAgIEJhc2VSZWd1bGF0aW9uOiAnQmFzZSBSZWd1bGF0aW9uJyxcclxuICAgIEJhc2VSZWd1bGF0aW9uczogJ0Jhc2UgUmVndWxhdGlvbnMnLFxyXG4gICAgQ2hhbmdlZEJ5OiAnQ2hhbmdlZCBieScsXHJcbiAgICBDbGFzc2lmaWNhdGlvblJlZmVyZW5jZTogJ1JlZmVyZW5jZSB0byBDbGFzc2lmaWNhdGlvbiBvZiBIZWFkaW5nJyxcclxuICAgIENsYXNzaWZpY2F0aW9uSW5MZWdhbEFjdHNEaXJlY3Rvcnk6ICdDbGFzc2lmaWNhdGlvbiBpbiBMZWdhbCBBY3RzIERpcmVjdG9yeScsXHJcbiAgICBDb3VudHJ5UmVnaW9uOiAnQ291bnRyeS9SZWdpb24nLFxyXG4gICAgRG9jdW1lbnROb3RGb3VuZDogJ0RvY3VtZW50IE5vdCBGb3VuZCcsXHJcbiAgICBHb0JhY2tUb1RoZU92ZXJ2aWV3OiAnR28gQmFjayB0byB0aGUgT3ZlcnZpZXcnLFxyXG4gICAgSGVyZUFyZUFGZXdUaGluZ3M6ICdIZXJlIGFyZSBhIGZldyB0aGluZ3MgeW91IG1heSB3YW50IHRvIGRvLicsXHJcbiAgICBJbkZvcmNlOiAnSW4gRm9yY2UnLFxyXG4gICAgTW9kaWZpY2F0aW9uUmVndWxhdGlvbjogJ01vZGlmaWNhdGlvbiBSZWd1bGF0aW9uJyxcclxuICAgIE1vZGlmaWNhdGlvblJlZ3VsYXRpb25zOiAnTW9kaWZpY2F0aW9uIFJlZ3VsYXRpb25zJyxcclxuICAgIE5hbWU6ICdOYW1lJyxcclxuICAgIE5vTW9kaWZpY2F0aW9uUmVndWxhdGlvbnM6ICdObyBNb2RpZmljYXRpb24gUmVndWxhdGlvbnMnLFxyXG4gICAgT2ZmaWNpYWxKb3VybmFsOiAnT2ZmaWNpYWwgSm91cm5hbCcsXHJcbiAgICBPSjogJ09KJyxcclxuICAgIE9wZW5EZXRhaWxzOiAnT3BlbiBEZXRhaWxzJyxcclxuICAgIE9wZW5Eb2N1bWVudE9uRXVyTGV4OiAnT3BlbiBkb2N1bWVudCBvbiBFVVItTGV4JyxcclxuICAgIE5vdGU6ICdOb3RlJyxcclxuICAgIE5vdGVfQ0VMRVhfOiAnTm90ZSB7eyBDRUxFWCB9fScsXHJcbiAgICBQYWdlOiAnUGFnZScsXHJcbiAgICBQdWJEYXRlOiAnUHVibC4gRGF0ZScsXHJcbiAgICBQdWJsaWNhdGlvbkRhdGU6ICdQdWJsaWNhdGlvbiBEYXRlJyxcclxuICAgIF9jb3VudF9wdWJsaWNhdGlvbnNGb3VuZDogJ3t7IGNvdW50IH19IFB1YmxpY2F0aW9ucyBGb3VuZCcsXHJcbiAgICBQdWJObzogJ1B1YiBOby4nLFxyXG4gICAgUHViUGFnZTogJ1B1Yi4gUGFnZScsXHJcbiAgICBSZWd1bGF0aW9uOiAnUmVndWxhdGlvbicsXHJcbiAgICBSZWd1bGF0aW9uX0NFTEVYXzogJ1JlZ3VsYXRpb24ge3sgQ0VMRVggfX0nLFxyXG4gICAgUmVndWxhdGlvbnM6ICdSZWd1bGF0aW9ucycsXHJcbiAgICBSZXNvdXJjZVR5cGU6ICdEb2N1bWVudCBUeXBlJyxcclxuICAgIFNlYXJjaEV1ckxleEZvcjogJ1NlYXJjaCBFVVItTGV4IGZvcicsXHJcbiAgICBUaGVyZUlzTm9Eb2N1bWVudF9jZWxleF86ICdUaGVyZSBpcyBubyBkb2N1bWVudCBpbiBvdXIgYXBwbGljYXRpb24gd2l0aCBDRUxFWCBlcXVhbCB0byB7eyBjZWxleCB9fScsXHJcbiAgICBNb2RhbFRpdGxlOiAnUmVndWxhdGlvbnMnLFxyXG4gICAgY29uc29saWRhdGVkOiAnY29uc29saWRhdGVkIGludG8gdGhlIGFib3ZlIHRleHQnLCAvLyBcImNvbnNvbGlkYXRlZFwiIG1lYW5zIFwiaW5jb3Jwb3JhdGVkIGludG8gdGhlIGFib3ZlIHRleHRcclxuICAgIHVuY29uc29saWRhdGVkOiAnbm90IGNvbnNvbGlkYXRlZCBpbnRvIHRoZSBhYm92ZSB0ZXh0JywgLy8gXCJjb25zb2xpZGF0ZWRcIiBtZWFucyBcImluY29ycG9yYXRlZCBpbnRvIHRoZSBhYm92ZSB0ZXh0XHJcbn07XHJcbiIsIu+7vy8vIFNlZSBodHRwczovL2FwcC50YXJpY3N1cHBvcnQuY29tLyMhL3NlYXJjaC9oZWFkaW5nP29yZGVyQnk9cmVsZXZhbmNlJmluY2x1ZGVCdGlzPXRydWUmaW5jbHVkZUNsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnM9dHJ1ZVxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIEFscGhhYmV0aWNhbEluZGV4OiAnQWxwaGFiZXRpY2FsIEluZGV4JyxcclxuICAgIEFsc29TZWFyY2hJbjogJ0Fsc28gc2VhcmNoIGluJyxcclxuICAgIEFscGhhYmV0aWNhbEluZGV4Tm90QXZhaWxhYmxlSW5DaG9zZW5MYW5ndWFnZTogJ0FscGhhYmV0aWNhbCBJbmRleCBTZWFyY2ggaXMgYXZhaWxhYmxlIGluIEVuZ2xpc2ggYW5kIEdlcm1hbi4gUGxlYXNlIHN3aXRjaCB0byBvbmUgb2YgdGhlc2UgbGFuZ3VhZ2VzIGluIG9yZGVyIHRvIGNvbnRpbnVlIHlvdXIgc2VhcmNoLicsXHJcbiAgICBDYXNlTGF3Tm9BY2Nlc3NNZXNzYWdlOiAnQ29udGFjdCBUYXJpYyBTdXBwb3J0IGZvciBBY2Nlc3MgdG8gdGhlIENhc2UgTGF3IE1vZHVsZScsXHJcbiAgICBDb21tb2RpdHlDb2RlRGVzY3JpcHRpb25zOiAnQ29tbW9kaXR5IGNvZGUgZGVzY3JpcHRpb25zJyxcclxuICAgIEFkZGl0aW9uYWxEYXRhU291cmNlczogJ0FkZGl0aW9uYWwgZGF0YSBzb3VyY2VzJyxcclxuICAgIFNlYXJjaENjY0NvbmNsdXNpb25zOiAnU2VhcmNoIENDQyBDb25jbHVzaW9ucycsIC8vIENDQyA9IEN1c3RvbXMgQ29kZSBDb21taXR0ZWVcclxuICAgIENvbmNsdXNpb25fTmF2OiAnQ0NDIENvbmNsdXNpb25zJyxcclxuICAgIERvY3VtZW50czogJ0RvY3VtZW50cycsXHJcbiAgICBHb1RvQ2hhcHRlcl9jb2RlXzogJ0dvIHRvIENoYXB0ZXIge3sgY29kZSB9fScsXHJcbiAgICBCcm93c2VDaGFwdGVyX2NoYXB0ZXJDb2RlXzogJ0Jyb3dzZSBjaGFwdGVyIHt7IGNoYXB0ZXJDb2RlIH19JyxcclxuICAgIE5vU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluSGVhZGluZ19IZWFkaW5nXzogJ05vIHJlc3VsdHMgZm9yIFwie3sgUXVlcnlTdHJpbmcgfX1cIiBmb3VuZCBpbiBoZWFkaW5nIHt7IEhlYWRpbmcgfX0nLFxyXG4gICAgU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluSGVhZGluZ19IZWFkaW5nXzogJ1Jlc3VsdHMgZm9yIFwie3sgUXVlcnlTdHJpbmcgfX1cIiBmb3VuZCBpbiBoZWFkaW5nIHt7IEhlYWRpbmcgfX0nLFxyXG4gICAgX2NvbW1vZGl0eUNvZGVfaXNOb3RBVmFsaWRDb21tb2RpdHlDb2RlOiAne3sgY29tbW9kaXR5Q29kZSB9fSBpcyBub3QgYSB2YWxpZCBjb21tb2RpdHkgY29kZScsXHJcbiAgICBTZWFyY2hGb3JTdWNjZXNzb3JzOiAnU2VhcmNoIGZvciBzdWNjZXNzb3JzJyxcclxuICAgIFNlYXJjaEZvck9yaWdpbmF0b3JzOiAnU2VhcmNoIGZvciBvcmlnaW5hdG9ycycsXHJcblxyXG4gICAgbm9SZXN1bHQ6ICdObyByZXN1bHRzIGZvdW5kIGZvciB5b3VyIHNlYXJjaCBxdWVyeScsXHJcbiAgICBDbG9zZXN0RXhpc3RpbmdQYXJlbnRNZXNzYWdlOiAnSG93ZXZlciwgY29tbW9kaXR5IGNvZGUge3sgY2xvc2VzdEV4aXN0aW5nUGFyZW50Q29tbW9kaXR5Q29kZSB8IHN0cmlwVGFyaWNDb2RlIHwgZm9ybWF0VGFyaWNDb2RlIH19LCBzaG93biBiZWxvdywgZG9lcyBleGlzdC4nLFxyXG4gICAgXHJcbiAgICBOb1Jlc3VsdHNGb3VuZEZvcllvdXJTZWFyY2hRdWVyeV9RdWVyeVN0cmluZ186ICdObyByZXN1bHRzIGZvdW5kIGZvciB5b3VyIHNlYXJjaCBxdWVyeSBcInt7IFF1ZXJ5U3RyaW5nIH19XCInLFxyXG4gICAgTm9SZXN1bHRzRm91bmRGb3JZb3VyU2VhcmNoUXVlcnlfUXVlcnlTdHJpbmdfRm91bmRJbkNoYXB0ZXJfQ29kZV86ICdObyByZXN1bHRzIGZvdW5kIGZvciB5b3VyIHNlYXJjaCBxdWVyeSBcInt7IFF1ZXJ5U3RyaW5nIH19XCIgZm91bmQgaW4gY2hhcHRlciB7eyBDb2RlIH19LicsXHJcbiAgICBcclxuICAgIE9waW5pb25fTnVtYmVyXzogJ09waW5pb24ge3sgTnVtYmVyIH19JywgLy8gU2hvcnQgRm9yIFdDTyBDbGFzc2lmaWNhdGlvbiBPcGluaW9uXHJcbiAgICBcclxuICAgIFNlYXJjaFJlc3VsdHNGb3JfUXVlcnlTdHJpbmdfOiAnU2VhcmNoIHJlc3VsdHMgZm9yIFwie3sgUXVlcnlTdHJpbmcgfX1cIicsXHJcbiAgICBTZWFyY2hSZXN1bHRzRm9yX1F1ZXJ5U3RyaW5nX0ZvdW5kSW5BbHBoYWJldGljYWxJbmRleDogJ1NlYXJjaCByZXN1bHRzIGZvciBcInt7IFF1ZXJ5U3RyaW5nIH19XCIgZm91bmQgaW4gdGhlIEFscGhhYmV0aWNhbCBJbmRleCcsXHJcbiAgICBTZWFyY2hSZXN1bHRzRm9yX1F1ZXJ5U3RyaW5nX0ZvdW5kSW5Db2RlOiAnU2VhcmNoIHJlc3VsdHMgZm9yIFwie3sgUXVlcnlTdHJpbmcgfX1cIiBmb3VuZCB1bmRlciBjb2RlJyxcclxuICAgIFNlYXJjaFJlc3VsdHNGb3JfUXVlcnlTdHJpbmdfRm91bmRJbkhlYWRpbmc6ICdTZWFyY2ggcmVzdWx0cyBmb3IgXCJ7eyBRdWVyeVN0cmluZyB9fVwiIGZvdW5kIGluIGhlYWRpbmcnLFxyXG4gICAgU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluSGVhZGluZ3M6ICdTZWFyY2ggcmVzdWx0cyBmb3IgXCJ7eyBRdWVyeVN0cmluZyB9fVwiIGZvdW5kIGluIHRoZSBmb2xsb3dpbmcgaGVhZGluZ3MnLFxyXG4gICAgU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluSGVhZGluZ3NJbkNoYXB0ZXJfQ29kZV86ICdTZWFyY2ggcmVzdWx0cyBmb3IgXCJ7eyBRdWVyeVN0cmluZyB9fVwiIGZvdW5kIGluIHRoZSBmb2xsb3dpbmcgaGVhZGluZ3MgaW4gY2hhcHRlciB7eyBDb2RlIH19JyxcclxuICAgIFNlYXJjaFJlc3VsdHNGb3JfUXVlcnlTdHJpbmdfRm91bmRJbkFubm90YXRpb25zOiAnU2VhcmNoIHJlc3VsdHMgZm9yIFwie3sgUXVlcnlTdHJpbmcgfX1cIiBmb3VuZCBpbiB0aGUgZm9sbG93aW5nIFNlY3Rpb24gYW5kIENoYXB0ZXIgTm90ZXMnLFxyXG4gICAgU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluRXVFeHBsYW5hdG9yeU5vdGVzOiAnU2VhcmNoIHJlc3VsdHMgZm9yIFwie3sgUXVlcnlTdHJpbmcgfX1cIiBmb3VuZCBpbiB0aGUgZm9sbG93aW5nIEV4cGxhbmF0b3J5IE5vdGVzIHRvIHRoZSBFVVxcJ3MgQ29tYmluZWQgTm9tZW5jbGF0dXJlJyxcclxuICAgIFNlYXJjaFJlc3VsdHNGb3JfUXVlcnlTdHJpbmdfRm91bmRJbkV4cGxhbmF0b3J5Tm90ZXNHZXJtYW55OiAnU2VhcmNoIHJlc3VsdHMgZm9yIFwie3sgUXVlcnlTdHJpbmcgfX1cIiBmb3VuZCBpbiB0aGUgZm9sbG93aW5nIEV4cGxhbmF0b3J5IE5vdGVzIHB1Ymxpc2hlZCBieSBHZXJtYW4gQ3VzdG9tcycsXHJcbiAgICBTZWFyY2hSZXN1bHRzRm9yX1F1ZXJ5U3RyaW5nX0ZvdW5kSW5UZXh0c0dlcm1hbkN1c3RvbXM6ICdTZWFyY2ggcmVzdWx0cyBmb3IgXCJ7eyBRdWVyeVN0cmluZyB9fVwiIGZvdW5kIGluIHRoZSBmb2xsb3dpbmcgdGV4dHMgcHVibGlzaGVkIGJ5IEdlcm1hbiBDdXN0b21zJyxcclxuICAgIFNlYXJjaFJlc3VsdHNGb3JfUXVlcnlTdHJpbmdfRm91bmRJbldjb0V4cGxhbmF0b3J5Tm90ZXM6ICdTZWFyY2ggcmVzdWx0cyBmb3IgXCJ7eyBRdWVyeVN0cmluZyB9fVwiIGZvdW5kIGluIHRoZSBmb2xsb3dpbmcgRXhwbGFuYXRvcnkgTm90ZXMgdG8gdGhlIFdDT1xcJ3MgSGFybW9uaXNlZCBTeXN0ZW0nLFxyXG4gICAgU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluV2NvQ2xhc3NpZmljYXRpb25PcGluaW9uczogJ1NlYXJjaCByZXN1bHRzIGZvciBcInt7IFF1ZXJ5U3RyaW5nIH19XCIgZm91bmQgaW4gdGhlIGZvbGxvd2luZyBXQ08gQ2xhc3NpZmljYXRpb24gT3BpbmlvbnMnLFxyXG5cclxuICAgIFNlYXJjaE5vbWVuY2xhdHVyZTogJ1NlYXJjaCBOb21lbmNsYXR1cmUnLFxyXG4gICAgU2VhcmNoQWxwaGFiZXRpY2FsSW5kZXg6ICdTZWFyY2ggQWxwaGFiZXRpY2FsIEluZGV4JyxcclxuICAgIFNlYXJjaEVVQ2xhc3NpZmljYXRpb25SZWd1bGF0aW9uczogJ1NlYXJjaCBFVSBDbGFzc2lmaWNhdGlvbiBSZWd1bGF0aW9ucycsXHJcbiAgICBTZWFyY2hFeHBsYW5hdG9yeU5vdGVzR2VybWFueTogJ1NlYXJjaCBFeHBsYW5hdG9yeSBOb3RlcyBHZXJtYW55JyxcclxuICAgIFNlYXJjaFRleHRzR2VybWFuQ3VzdG9tczogJ1NlYXJjaCBUZXh0cyBHZXJtYW4gQ3VzdG9tcycsXHJcbiAgICBTZWFyY2hTZWN0aW9uQW5kQ2hhcHRlck5vdGVzOiAnU2VhcmNoIFNlY3Rpb24gYW5kIENoYXB0ZXIgTm90ZXMnLFxyXG4gICAgU2VhcmNoRVVFeHBsYW5hdG9yeU5vdGVzOiAnU2VhcmNoIEVVIEV4cGxhbmF0b3J5IE5vdGVzJyxcclxuICAgIFNlYXJjaFdDT0V4cGxhbmF0b3J5Tm90ZXM6ICdTZWFyY2ggSFMgRXhwbGFuYXRvcnkgTm90ZXMgKFdDTyknLFxyXG4gICAgU2VhcmNoV0NPQ2xhc3NpZmljYXRpb25PcGluaW9uczogJ1NlYXJjaCBXQ08gQ2xhc3NpZmljYXRpb24gT3BpbmlvbnMnLFxyXG4gICAgVHJ5T25lT2ZUaGVGb2xsb3dpbmdBY3Rpb25zOiAnWW91IG1heSB0cnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9ucycsXHJcbiAgICBXY29FeHBsYW5hdG9yeU5vdGVzTm90QXZhaWxhYmxlSW5DaG9zZW5MYW5ndWFnZTogJ1RoZSBXQ08gRXhwbGFuYXRvcnkgTm90ZXMgYXJlIGF2YWlsYWJsZSBpbiBFbmdsaXNoIGFuZCBGcmVuY2guIFBsZWFzZSBzd2l0Y2ggdG8gb25lIG9mIHRoZXNlIGxhbmd1YWdlcyBpbiBvcmRlciB0byBjb250aW51ZSB5b3VyIHNlYXJjaC4nLFxyXG4gICAgV2NvQ2xhc3NpZmljYXRpb25PcGluaW9uc05vdEF2YWlsYWJsZUluQ2hvc2VuTGFuZ3VhZ2U6ICdUaGUgV0NPIENsYXNzaWZpY2F0aW9uIE9waW5pb25zIGFyZSBhdmFpbGFibGUgaW4gRW5nbGlzaCBhbmQgRnJlbmNoLiBQbGVhc2Ugc3dpdGNoIHRvIG9uZSBvZiB0aGVzZSBsYW5ndWFnZXMgaW4gb3JkZXIgdG8gY29udGludWUgeW91ciBzZWFyY2guJ1xyXG59O1xyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGhpc3RvcmljU2VhcmNoV2FybmluZzogJ05vdGU6IGRhdGUgaXMgbm90IHNldCB0byB0b2RheScsXHJcbiAgICBsb2dnaW5nT3V0OiAnWW91ciBhY2NvdW50IGlzIGJlaW5nIHVzZWQgYXQgYSBkaWZmZXJlbnQgbG9jYXRpb24uIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIHNhbWUgYWNjb3VudCBmcm9tIG11bHRpcGxlIGxvY2F0aW9ucy4gWW91IGFyZSBiZWluZyBsb2dnZWQgb3V0LicsXHJcbiAgICBQbGVhc2VDb250YWN0VGFyaWNTdXBwb3J0Rm9yQWNjZXNzVG9UcmFkZVRhcmlmZjogJ1BsZWFzZSBjb250YWN0IFRhcmljIFN1cHBvcnQgZm9yIGFjY2VzcyB0byB0aGlzIHRyYWRlIHRhcmlmZi4nLFxyXG4gICAgdW5hdXRob3JpemVkOiAnWW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgdGhlIHByb3BlciBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhpcyBmdW5jdGlvbmFsaXR5LicsXHJcbiAgICBwaWNrQ291bnRyeUZvclZhdFJhdGVzOiAnQ2hvb3NlIGEgY291bnRyeSB0byBzZWUgdGhlIGFwcGxpY2FibGUgVkFUIHJhdGVzJyxcclxuICAgIERhdGFOb3RBdmFpbGFibGVGb3JTd2lzc1RyYWRlVGFyaWZmOiAnVGhpcyBkYXRhIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBTd2lzcyB0cmFkZSB0YXJpZmYuJyxcclxuICAgIEV4Y2hhbmdlUmF0ZXNOb3RBdmFpbGFibGVGb3JTd2lzc1RyYWRlVGFyaWZmOiAnVGhlIGV4Y2hhbmdlIHJhdGVzIGFyZSBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdGhlIFN3aXNzIHRyYWRlIHRhcmlmZi4gSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgbW9kdWxlLCBwbGVhc2UgbGV0IHVzIGtub3cuICcsXHJcbiAgICBUcmFuc2FjdGlvblZhbHVlQ2FsY3VsYXRvck5vdEF2YWlsYWJsZUZvclN3aXNzVHJhZGVUYXJpZmY6ICdUaGUgdHJhbnNhY3Rpb24gdmFsdWUgY2FsY3VsYXRvciBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdGhlIFN3aXNzIHRyYWRlIHRhcmlmZi4nLFxyXG4gICAgdGV4dE5ld2VyVGhhblJlcXVlc3RlZF9TdGFydERhdGVfOiAnTm90ZTogdGhpcyB0ZXh0IGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBkYXRlIHlvdVxcJ3ZlIGNob3Nlbi4gVGhlIHRleHQgYmVsb3cgaXMgYSBsYXRlciB2ZXJzaW9uLiBJdCBpcyB2YWxpZCBmcm9tIHt7IFN0YXJ0RGF0ZSB8IGRhdGUgOiBcXCdkZC1NTS15eXl5XFwnIH19LicsXHJcbiAgICBOb1djb0FjY2Vzc01lc3NhZ2U6ICdGb3IgYWNjZXNzIHRvIHRoZSBXQ08gRXhwbGFuYXRvcnkgTm90ZXMgYW5kIENsYXNzaWZpY2F0aW9uIE9waW5pb25zIGEgc2VwYXJhdGUgc3Vic2NyaXB0aW9uIGlzIG5lY2Vzc2FyeS4gUGxlYXNlIGNvbnRhY3QgdXMgZm9yIG1vcmUgaW5mb3JtYXRpb24nLFxyXG59O1xyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJ1dHRvbnM6IHtcclxuICAgICAgICBDYW5jZWw6ICdDYW5jZWwnLFxyXG4gICAgICAgIENsb3NlOiAnQ2xvc2UnLFx0XHJcbiAgICAgICAgQ29sbGFwc2VBbGw6ICdDb2xsYXBzZSBBbGwnLCAvLyBBcyBpbiAnY29sbGFwc2libGUgcGFydCBvZiBhIHdlYiBwYWdlXHJcbiAgICAgICAgRGVsZXRlOiAnRGVsZXRlJyxcclxuICAgICAgICBEb3dubG9hZDogJ0Rvd25sb2FkJyxcclxuICAgICAgICBEb3dubG9hZFBERjogJ0Rvd25sb2FkIFBERicsXHJcbiAgICAgICAgRW1wdHlGb3JtOiAnRW1wdHkgRm9ybScsXHJcbiAgICAgICAgRXhwYW5kQWxsOiAnRXhwYW5kIEFsbCcsIC8vIEFzIGluICdleHBhbmQgY29sbGFwc2libGUgcGFydCBvZiBhIHdlYiBwYWdlJ1xyXG4gICAgICAgIE5vOiAnTm8nLFxyXG4gICAgICAgIE9LOiAnT0snLFxyXG4gICAgICAgIE9wZW5QREY6ICdPcGVuIFBERicsXHJcbiAgICAgICAgUHJpbnQ6ICdQcmludCcsXHRcclxuICAgICAgICBTYXZlOiAnU2F2ZScsXHJcbiAgICAgICAgU2VhcmNoOiAnU2VhcmNoJyxcclxuICAgICAgICBZZXM6ICdZZXMnXHJcbiAgICB9LFxyXG4gICAgY2FsZW5kYXI6IHtcclxuICAgICAgICBDbGVhcjogJ0NsZWFyJyxcclxuICAgICAgICBPSzogJ09LJyxcclxuICAgICAgICBUb2RheTogJ1RvZGF5J1xyXG4gICAgfSxcclxuICAgIHBsYWNlaG9sZGVyczoge1xyXG4gICAgICAgIEVudGVyQ29tbW9kaXR5Q29kZTogJ0VudGVyIENvbW1vZGl0eSBDb2RlJyxcclxuICAgICAgICBTZWFyY2g6ICdTZWFyY2gnLFxyXG4gICAgICAgIFNlYXJjaEJ5Q291bnRyeU5hbWVPckNvZGU6ICdTZWFyY2ggYnkgY291bnRyeSBuYW1lIG9yIGNvZGUnLFxyXG4gICAgICAgIFNlYXJjaEluVGV4dDogJ1NlYXJjaCBpbiBUZXh0JyxcclxuICAgIH0sXHJcbiAgICB0cmFuc2xhdGlvbjoge1xyXG4gICAgICAgIFNob3dPcmlnaW5hbDogJ1Nob3cgT3JpZ2luYWwnLFxyXG4gICAgICAgIFRyYW5zbGF0ZTogJ1RyYW5zbGF0ZScsXHJcbiAgICB9LFxyXG4gICAgYXJlWW91U3VyZU1vZGFsVGl0bGU6ICdBcmUgeW91IHN1cmU/JyxcclxuICAgIFxyXG4gICAgQXNjZW5kaW5nOiAnQXNjZW5kaW5nJywgLy8gYXMgaW4gZGlyZWN0aW9uIG9mIHNvcnQgb3JkZXJcclxuICAgIERlc2NlbmRpbmc6ICdEZXNjZW5kaW5nJywgLy8gYXMgaW4gZGlyZWN0aW9uIG9mIHNvcnQgb3JkZXJcclxuICAgIFxyXG4gICAgQ291bnRyeTogJ0NvdW50cnknLFxyXG4gICAgRGF0ZTogJ0RhdGUnLFxyXG4gICAgRGF0ZUZyb206ICdEYXRlIEZyb20nLFxyXG4gICAgRGF0ZVRvOiAnRGF0ZSBUbycsXHJcbiAgICBEZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uJyxcclxuICAgIGZhdm9yaXRlOiAnRmF2b3JpdGUnLFxyXG4gICAgZmF2b3JpdGVzOiAnRmF2b3JpdGVzJyxcclxuICAgIF9jb3VudF9mb3VuZDogJ3t7IGNvdW50IH19IGZvdW5kJywgLy8gTkI6IGNvdW50IGlzIGEgbnVtYmVyXHJcbiAgICBJbWFnZXM6ICdJbWFnZXMnLCAvLyBhcyBpbiAncGljdHVyZXMsIHNob3cgYXMgaW1hZ2VzJ1xyXG4gICAgTGlzdDogJ0xpc3QnLCAvLyBhcyBpbiAnc2hvdyBhcyBhIGxpc3QnIChhcyBvcHBvc2VkIHRvICdzaG93IGFzIGltYWdlcycpXHJcbiAgICBMb2FkaW5nOiAnTG9hZGluZycsXHJcbiAgICBNb3JlTmV3czogJ01vcmUgTmV3cycsXHJcbiAgICBOZXdzOiAnTmV3cycsXHJcbiAgICBObzogJ05vJyxcclxuICAgIE5vUmVzdWx0czogJ05vIFJlc3VsdHMnLFxyXG4gICAgTm9XY29BY2Nlc3NNZXNzYWdlOiAnRm9yIGFjY2VzcyB0byB0aGUgV0NPIEV4cGxhbmF0b3J5IE5vdGVzIGFuZCBDbGFzc2lmaWNhdGlvbiBPcGluaW9ucyBhIHNlcGFyYXRlIHN1YnNjcmlwdGlvbiBpcyBuZWNlc3NhcnkuIFBsZWFzZSBjb250YWN0IHVzIGZvciBtb3JlIGluZm9ybWF0aW9uJyxcclxuICAgIE9yZGVyQnk6ICdPcmRlciBCeScsXHJcbiAgICBPcmRlckRpcmVjdGlvbjogJ0RpcmVjdGlvbicsXHJcbiAgICBRdWVyeTogJ1F1ZXJ5JyxcclxuICAgIFJlbWVtYmVyOiAnUmVtZW1iZXInLCAvLyBhcyBpbiAncmVtZW1iZXIgbXkgY2hvaWNlJ1xyXG4gICAgU2VhcmNoVGVybTogJ1NlYXJjaCBUZXJtJyxcclxuICAgIFNob3dSZXN1bHRzQXM6ICdTaG93IFJlc3VsdHMgQXMnLCAvLyBzaG93IGFzIGltYWdlcyBvciBsaXN0XHJcbiAgICBTb3VyY2U6ICdTb3VyY2UnLCAvLyBBcyBpbiAnU291cmNlIG9mIHRoZSBpbmZvcm1hdGlvbidcclxuICAgIFRleHRTZWFyY2g6ICdTZWFyY2ggaW4gVGV4dCcsXHJcbiAgICBUb3RhbDogJ1RvdGFsJywgLy8gYXMgaW4gJ3RvdGFsIGFtb3VudCBvZiB0aGUgY2FsY3VsYXRpb24nXHJcbiAgICBcclxuICAgIFZhbGlkaXR5UGVyaW9kOiAnVmFsaWRpdHkgUGVyaW9kJyxcclxuICAgIFZhbGlkRnJvbTogJ1ZhbGlkIEZyb20nLFxyXG4gICAgVmFsaWRUbzogJ1ZhbGlkIFVudGlsJyxcclxuICAgIFZhbGlkaXR5U3RhcnREYXRlOiAnU3RhcnQgRGF0ZSBvZiBWYWxpZGl0eScsXHJcbiAgICBWYWxpZGl0eUVuZERhdGU6ICdFbmQgRGF0ZSBvZiBWYWxpZGl0eScsXHJcbiAgICBTdGFydERhdGU6ICdTdGFydCBEYXRlJyxcclxuICAgIEVuZERhdGU6ICdFbmQgRGF0ZScsXHJcbiAgICBcclxuICAgIFllczogJ1llcydcclxufTtcclxuIiwiLy8gVmFyaW91cyB3YXlzIG9mIG9yZGVyaW5nIHNlYXJjaCByZXN1bHRzXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgQ29tbW9kaXR5Q29kZV9Bc2NlbmRpbmc6ICdDb21tb2RpdHkgQ29kZSAtIEFzY2VuZGluZycsXHJcbiAgICBDb21tb2RpdHlDb2RlX0Rlc2NlbmRpbmc6ICdDb21tb2RpdHkgQ29kZSAtIERlc2NlbmRpbmcnLFxyXG4gICAgQ1VTX0FzY2VuZGluZzogJ0NVUyAtIEFzY2VuZGluZycsXHJcbiAgICBDVVNfRGVzY2VuZGluZzogJ0NVUyAtIERlc2NlbmRpbmcnLFxyXG4gICAgVmFsaWRGcm9tX0FzY2VuZGluZzogJ1ZhbGlkIEZyb20gLSBBc2NlbmRpbmcnLFxyXG4gICAgVmFsaWRGcm9tX0Rlc2NlbmRpbmc6ICdWYWxpZCBGcm9tIC0gRGVzY2VuZGluZycsXHJcbiAgICBSZWxldmFuY2VfS2V5d29yZHM6ICdSZWxldmFuY2UgLSBLZXl3b3JkcycsXHJcbiAgICBSZWxldmFuY2VfR29vZHNEZXNjcmlwdGlvbjogJ1JlbGV2YW5jZSAtIEdvb2RzIERlc2NyaXB0aW9uJyxcclxuICAgIFJlbGV2YW5jZTogJ1JlbGV2YW5jZScsXHJcbn07Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBWZXJzaW9uX3ZlcnNpb25OdW1iZXJfOiAnVmVyc2lvbiB7eyB2ZXJzaW9uTnVtYmVyIH19JywgLy8gVmVyc2lvbiBvZiBhcHBsaWNhdGlvblxyXG4gICAgRGF0YVJlYWRPbl9sYXN0U3VjY2Vzc2Z1bERhdGFiYXNlXzogJ0RhdGEgbGFzdCB1cGRhdGVkIG9uIHt7IGxhc3RTdWNjZXNzZnVsRGF0YWJhc2UgfCBkYXRlOiBcXCdkZC1NTSBISDptbVxcJyB9fSdcclxufTtcclxuIiwiLy8gU2VlIGh0dHBzOi8veHRhcmVzLmFkbWluLmNoL3RhcmVzL2xvZ2luL2xvZ2luRm9ybUZpbGxlci5kb1xyXG4vLyBDaG9vc2UgU3dpc3MgZmxhZyBpbiBUYXJpYyBTdXBwb3J0IGFwcGxpY2F0aW9uXHJcbi8vIFNlZSBodHRwczovL2FwcC50YXJpY3N1cHBvcnQuY29tLyMhL3RhcmVzLW1lYXN1cmVzLzIyMDMwMDEwMDBcclxuLy8gU2VlIGh0dHBzOi8vYXBwLnRhcmljc3VwcG9ydC5jb20vIyEvdGFyZXMtbWVhc3VyZXMvMzAwMjUxMDAwMFxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIENvZGU6ICdDb2RlJyxcclxuICAgIEN1c3RvbXNGYXZvdXJIaW50Q29kZXM6ICdDdXN0b21zIEZhdm91ciBIaW50IENvZGVzJyxcclxuICAgIEN1c3RvbXNSZWxpZWZDb2RlOiAnQ3VzdG9tcyByZWxpZWYgY29kZScsXHJcbiAgICBDdXN0b21zUmVsaWVmQ29kZXM6ICdDdXN0b21zIHJlbGllZiBjb2RlcycsXHJcbiAgICBEZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uJyxcclxuICAgIER1dHlSYXRlczogJ0R1dHkgUmF0ZXMnLFxyXG4gICAgTm9DdXN0b21zUmVsaWVmQ29kZTogJ05vIEN1c3RvbXMgcmVsaWVmIGNvZGUnLFxyXG4gICAgTm9ybWFsRHV0eVJhdGU6ICdOb3JtYWwgZHV0eSByYXRlJyxcclxuICAgIFJlbGllZkNvZGVPblRhcmlmZkxpbmU6ICdSZWxpZWYgY29kZSBvbiB0YXJpZmYgbGluZScsXHJcbiAgICBTdGF0aXN0aWNhbEtleXM6ICdTdGF0aXN0aWNhbCBLZXlzJyxcclxuICAgIFR5cGU6ICdUeXBlJywgLy8gVHlwZSBvZiBjb2RlXHJcbiAgICBWYWxpZEZvckN1c3RvbXNSZWxpZWZDb2RlOiAnVmFsaWQgZm9yIGN1c3RvbXMgcmVsaWVmIGNvZGUnLFxyXG4gICAgQXNzZXNzbWVudENvZGU6ICdBc3Nlc3NtZW50IGNvZGUnLFxyXG4gICAgQ291bnRyeUdyb3VwOiAnQ291bnRyeSBncm91cCcsXHJcbiAgICBDb3VudHJ5R3JvdXBzOiAnQ291bnRyeSBncm91cHMnLFxyXG4gICAgVmFsaWRGb3JDb3VudHJ5OiAnVmFsaWQgZm9yIGNvdW50cnknLFxyXG4gICAgQ291bnRyeUdyb3VwRGVzY3JpcHRpb246ICdDb3VudHJ5IGdyb3VwIGRlc2NyaXB0aW9uJyxcclxuICAgIFZhbHVlOiAnVmFsdWUnLFx0XHJcbiAgICBEdXR5RXhwcmVzc2lvbjogJ0R1dHkgZXhwcmVzc2lvbicsXHJcbiAgICBUZXh0OiAnVGV4dCcsIC8vIER1dHkgUmF0ZSBUZXh0c1xyXG4gICAgRHVyaW5nRnVsbFN1cHBseVBlcmlvZDogJ2R1cmluZyBmdWxsIHN1cHBseSBwZXJpb2QgKGNmLiBcIlJlbWFya3NcIiwgXCJUYXJpZmYgcXVvdGFzXCIsIFwicmVkdWNlZCBvdXQtcXVvdGEgcmF0ZVwiKScsXHJcbiAgICBWYXRSYXRlczogJ1ZBVCBSYXRlcycsXHJcbiAgICBBZGRpdGlvbmFsVGFyZTogJ0FkZGl0aW9uYWwgdGFyZScsXHJcbiAgICBPZlRoZU5ldFdlaWdodDogJ29mIHRoZSBuZXQgd2VpZ2h0JyxcclxuICAgIENob29zZVN0YXRpc3RpY2FsS2V5OiAnQ2hvb3NlIGEgc3RhdGlzdGljYWwga2V5IHRvIHNlZSBtb3JlIGluZm9ybWF0aW9uJyxcclxuICAgIFN0YXRpc3RpY2FsS2V5OiAnU3RhdGlzdGljYWwga2V5JyxcclxuICAgIEFkZGl0aW9uYWxDaGFyZ2VzOiAnQWRkaXRpb25hbCBjaGFyZ2VzJyxcclxuICAgIE1pbmltdW06ICdNaW5pbXVtJyxcdFxyXG4gICAgTWF4aW11bTogJ01heGltdW0nLFxyXG4gICAgZXhjbHVkaW5nOiAnZXhjbHVkaW5nJywgLy8ge3sgcmVnaW9uIH19IGV4Y2x1ZGluZyB7eyBleGNsdWRlZFJlZ2lvbiB9fVxyXG4gICAgS2V5OiAnS2V5JywgLy8gQWRkaXRpb25hbFRheC5LZXlcclxuICAgIFR5cGVEZXNjcmlwdGlvbjogJ1R5cGUgZGVzY3JpcHRpb24nLFxyXG4gICAgS2V5RGVzY3JpcHRpb246ICdLZXkgZGVzY3JpcHRpb24nLFxyXG4gICAgQXNzaWdubWVudFRleHQ6ICdBc3NpZ25tZW50IHRleHQnLCAvLyBBZGRpdGlvbmFsVGF4LkFzc2lnbm1lbnRUZXh0XHJcbiAgICBSYXRlOiAnUmF0ZScsXHJcbiAgICBPcHRpb25hbDogJ09wdGlvbmFsJywgLy8gSXMgb3B0aW9uYWwgKHllcy9ubylcclxuICAgIE5vbkN1c3RvbXNMYXdzOiAnTm9uLWN1c3RvbXMgbGF3cycsXHJcbiAgICBQZXJtaXRzOiAnUGVybWl0cycsXHJcbiAgICBUb2xlcmFuY2U6ICdUb2xlcmFuY2UnLCAvLyBwZXJtaXQgdG9sZXJhbmNlIC0gbm8gcGVybWl0IGFsbG93ZWQgYmVsb3cgdGhpcyB3ZWlnaHRcclxuICAgIFRvbGVyYW5jZUNvZGU6ICdUb2xlcmFuY2UgY29kZScsXHJcbiAgICBQZXJtaXRBdXRob3JpdHk6ICdQZXJtaXQgYXV0aG9yaXR5JyxcclxuICAgIFBlcm1pdEF1dGhvcml0eURlc2NyaXB0aW9uOiAnUGVybWl0IGF1dGhvcml0eSBkZXNjcmlwdGlvbicsXHJcbiAgICBSZXF1aXJlZFF1YW50aXRpZXNBbmRMaW1pdHM6ICdSZXF1aXJlZCBxdWFudGl0aWVzIGFuZCBsaW1pdHMnLFxyXG4gICAgUmVxdWlyZWRRdWFudGl0aWVzOiAnUmVxdWlyZWQgcXVhbnRpdGllcycsXHJcbiAgICBOZXRXZWlnaHQ6ICdOZXQgd2VpZ2h0JyxcclxuICAgIEluS2dXaXRoVGhyZWVEZWNpbWFsczogJ2luIGtnIHdpdGggMyBkZWNpbWFscycsXHJcbiAgICBTdXBwbGVtZW50YXJ5VW5pdDogJ1N1cHBsZW1lbnRhcnkgdW5pdCcsXHJcbiAgICBNZWFuVmFsdWVMaW1pdHM6ICdNZWFuIHZhbHVlIGxpbWl0cycsXHJcbiAgICBNaW5pbXVtVmFsdWVQZXJLZ05ldFdlaWdodDogJ01pbmltdW0gdmFsdWUgcGVyIGtnIChuZXQgd2VpZ2h0KScsXHJcbiAgICBNYXhpbXVtVmFsdWVQZXJLZ05ldFdlaWdodDogJ01heGltdW0gdmFsdWUgcGVyIGtnIChuZXQgd2VpZ2h0KScsXHJcbiAgICBNaW5pbXVtVmFsdWVQZXJTdXBwbGVtZW50YXJ5VW5pdDogJ01pbmltdW0gdmFsdWUgcGVyIHN1cHBsZW1lbnRhcnkgdW5pdCcsXHJcbiAgICBNYXhpbXVtVmFsdWVQZXJTdXBwbGVtZW50YXJ5VW5pdDogJ01heGltdW0gdmFsdWUgcGVyIHN1cHBsZW1lbnRhcnkgdW5pdCcsXHJcbiAgICBXZWlnaHRMaW1pdHM6ICdXZWlnaHQgbGltaXRzJyxcclxuICAgIE1pbmltdW1XZWlnaHQ6ICdNaW5pbXVtIHdlaWdodCcsXHJcbiAgICBNYXhpbXVtV2VpZ2h0OiAnTWF4aW11bSB3ZWlnaHQnLFxyXG4gICAgTWluaW11bVdlaWdodFBlclN1cHBsZW1lbnRhcnlVbml0OiAnTWluaW11bSB3ZWlnaHQgcGVyIHN1cHBsZW1lbnRhcnkgdW5pdCcsXHJcbiAgICBNYXhpbXVtV2VpZ2h0UGVyU3VwcGxlbWVudGFyeVVuaXQ6ICdNYXhpbXVtIHdlaWdodCBwZXIgc3VwcGxlbWVudGFyeSB1bml0JyxcclxuICAgIFByb2Nlc3NpbmdDb2RlczogJ1Byb2Nlc3NpbmcgY29kZXMnLFxyXG59OyIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgZXJyb3JNZXNzYWdlczoge1xyXG4gICAgICAgIEVycm9yRXZhbHVhdGluZ0NvbmRpdGlvbjogJ0Vycm9yIGV2YWx1YXRpbmcgbWVhc3VyZSBjb25kaXRpb24nXHJcbiAgICB9LFxyXG4gICAgbWVhc3VyZUNvbmRpdGlvbnM6IHtcclxuICAgICAgICBBY3Rpb246ICdBY3Rpb24nLFxyXG4gICAgICAgIEFtb3VudDogJ0Ftb3VudCcsXHJcbiAgICAgICAgQ29uZGl0aW9uOiAnQ29uZGl0aW9uJywgLy8gQXMgaW4gbWVhc3VyZSBjb25kaXRpb24gLSBjb25kaXRpb25zIHRoYXQgbXVzdCBiZSBtZXQgZm9yIGEgbWVhc3VyZSB0byBiZSBhcHBsaWNhYmxlIGFuZC9vciBpbXBvcnQvZXhwb3J0IHRvIGJlIGFsbG93ZWRcclxuICAgICAgICBEZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uJyxcclxuICAgICAgICBEdXR5UmF0ZTogJ0R1dHkgUmF0ZScsXHJcbiAgICAgICAgbm9BY3Rpb246ICdub25lL3Bvc2l0aXZlJyxcclxuICAgICAgICBub0NlcnRpZmljYXRlOiAnbm9uZSdcclxuICAgIH0sXHJcbiAgICBtZWFzdXJlU2VyaWVzOiB7XHJcbiAgICAgICAgQWRkaXRpb25hbER1dGllczogJ0FkZGl0aW9uYWwgRHV0aWVzJyxcclxuICAgICAgICBBbnRpRHVtcGluZ01lYXN1cmVzOiAnQW50aS1EdW1waW5nIE1lYXN1cmVzJyxcclxuICAgICAgICBEdXRpZXM6ICdEdXRpZXMnLFxyXG4gICAgICAgIE5hdGlvbmFsVGF4ZXM6ICdOYXRpb25hbCBUYXhlcycsXHJcbiAgICAgICAgT3RoZXJNZWFzdXJlczogJ090aGVyIE1lYXN1cmVzJyxcclxuICAgICAgICBQcm9oaWJpdGlvbnM6ICdQcm9oaWJpdGlvbnMnLFxyXG4gICAgICAgIFJlZmVyZW5jZVByaWNlczogJ1JlZmVyZW5jZSBQcmljZXMnLFxyXG4gICAgICAgIFJlc3RpdHV0aW9uczogJ1Jlc3RpdHV0aW9ucycsXHJcbiAgICAgICAgUmVzdHJpY3Rpb25zQW5kQ29udHJvbHM6ICdSZXN0cmljdGlvbnMgYW5kIENvbnRyb2xzJyxcclxuICAgICAgICBTdXBwbGVtZW50YXJ5QW1vdW50czogJ1N1cHBsZW1lbnRhcnkgQW1vdW50cycsXHJcbiAgICAgICAgU3VwcGxlbWVudGFyeVVuaXQ6ICdTdXBwbGVtZW50YXJ5IFVuaXQnLFxyXG4gICAgICAgIFZhdFJhdGVzOiAnVkFUIFJhdGVzJyxcclxuICAgIH0sXHJcbiAgICByZWZlcmVuY2VDb3VudHJpZXM6IHtcclxuICAgICAgICBCRTogJ0JlbGdpdW0nLFxyXG4gICAgICAgIENIOiAnU3dpdHplcmxhbmQnLFxyXG4gICAgICAgIERFOiAnR2VybWFueScsXHJcbiAgICAgICAgRVU6ICdFdXJvcGVhbiBVbmlvbicsXHJcbiAgICAgICAgR0I6ICdHcmVhdC1Ccml0YWluJyxcclxuICAgICAgICBJVDogJ0l0YWx5JyxcclxuICAgICAgICBOTDogJ1RoZSBOZXRoZXJsYW5kcydcclxuICAgIH0sXHJcbiAgICB0cmFkZU1vdmVtZW50czoge1xyXG4gICAgICAgIEFsbDogJ0FsbCcsXHJcbiAgICAgICAgRXhwb3J0OiAnRXhwb3J0JyxcclxuICAgICAgICBJbXBvcnQ6ICdJbXBvcnQnXHJcbiAgICB9LFxyXG4gICAgdW5pdFR5cGVzOiB7XHJcbiAgICAgICAgQXJlYTogJ0FyZWEnLFxyXG4gICAgICAgIEVuZXJneTogJ0VuZXJneScsXHJcbiAgICAgICAgR3Jvc3NXZWlnaHQ6ICdHcm9zcyBXZWlnaHQnLFxyXG4gICAgICAgIEl0ZW1zOiAnTnVtYmVyIG9mIEl0ZW1zJyxcclxuICAgICAgICBMZW5ndGg6ICdMZW5ndGgnLFxyXG4gICAgICAgIE5ldFdlaWdodDogJ05ldCBXZWlnaHQnLFxyXG4gICAgICAgIFBhaXJzOiAnTnVtYmVyIG9mIFBhaXJzJyxcclxuICAgICAgICBQb3dlcjogJ1Bvd2VyJywgLy8gQXMgaW4gZWxlY3RyaWNhbCBwb3dlclxyXG4gICAgICAgIFZvbHVtZTogJ1ZvbHVtZScsXHJcbiAgICAgICAgV2VpZ2h0OiAnV2VpZ2h0J1xyXG4gICAgfSxcclxuICAgIEFkZENlcnRpZmljYXRlQ29kZTogJ0FkZCBDZXJ0aWZpY2F0ZSBDb2RlJyxcclxuICAgIEFkZGl0aW9uYWxDb2RlOiAnQWRkaXRpb25hbCBDb2RlJyxcclxuICAgIEFkZGl0aW9uYWxDb2Rlc1ZhbGlkYXRpb25FcnJvcjogJ0Vycm9yIGluIGFkZGl0aW9uYWwgY29kZXMnLFxyXG4gICAgQWRkaXRpb25hbENvZGVUeXBlYWhlYWRQbGFjZWhvbGRlcjogJ1NlYXJjaCBieSBhZGRpdGlvbmFsIGNvZGUgb3IgZGVzY3JpcHRpb24nLFxyXG4gICAgQWRkaXRpb25hbENvZGVNb2RhbFRpdGxlOiAnU2VsZWN0IGFuIGFkZGl0aW9uYWwgY29kZScsXHJcbiAgICBBZGRpdGlvbmFsQ29kZXM6ICdBZGRpdGlvbmFsIENvZGVzJyxcclxuICAgIEFkZGl0aW9uYWxDb2RlVHlwZXM6ICdBZGRpdGlvbmFsIENvZGUgVHlwZXMnLFxyXG4gICAgTm9BZGRpdGlvbmFsQ29kZTogJ05vIEFkZGl0aW9uYWwgQ29kZScsXHJcbiAgICBOb0FkZGl0aW9uYWxDb2Rlc0ZvdW5kOiAnTm8gQWRkaXRpb25hbCBDb2RlcyBGb3VuZCcsXHJcbiAgICBBZ3JpY3VsdHVyYWxDb21wb25lbnRzOiAnQWdyaWN1bHR1cmFsIENvbXBvbmVudHMnLFxyXG4gICAgTWV1cnNpbmdBZGRpdGlvbmFsQ29kZVBsYWNlSG9sZGVyOiAnU2VhcmNoIGZvciBhZGRpdGlvbmFsIGNvZGUnLFxyXG4gICAgQXV0b25vbW91c1RhcmlmZlN1c3BlbnNpb25zTWVzc2FnZTogJ1JlY29tbWVuZGF0aW9uOiBtYWtlIHVzZSBvZiB0aGUgQXV0b25vbW91cyBUYXJpZmYgU3VzcGVuc2lvbiB0aGF0IGFwcGxpZXMgZm9yIHRoaXMgY29tbW9kaXR5IGNvZGUnLFxyXG4gICAgQ2FsY3VsYXRlRHV0eTogJ0NhbGN1bGF0ZSBEdXR5JyxcclxuICAgIENhbGN1bGF0ZUR1dHlBbmRUYXhlczogJ0NhbGN1bGF0ZSBEdXR5IGFuZCBUYXhlcycsXHJcbiAgICBDZXJ0aWZpY2F0ZTogJ0NlcnRpZmljYXRlJyxcclxuICAgIENlcnRpZmljYXRlQ29kZVR5cGVhaGVhZFBsYWNlaG9sZGVyOiAnU2VhcmNoIGJ5IGNlcnRpZmljYXRlIGNvZGUgb3IgZGVzY3JpcHRpb24nLFxyXG4gICAgQ2VydGlmaWNhdGVDb2RlTW9kYWxUaXRsZTogJ1NlbGVjdCBhIGNlcnRpZmljYXRlIGNvZGUnLFxyXG4gICAgQ2VydGlmaWNhdGVDb2RlczogJ0NlcnRpZmljYXRlIENvZGVzJyxcclxuICAgIENlcnRpZmljYXRlQ29kZVR5cGVzOiAnQ2VydGlmaWNhdGUgQ29kZSBUeXBlcycsXHJcbiAgICBDaGVja01lYXN1cmVDb25kaXRpb25zOiAnQ2hlY2sgTWVhc3VyZSBDb25kaXRpb25zJywgLy8gY2hlY2sgYXMgaW4gdmVyaWZ5IGlmIGFsbCBvZiB0aGUgY29uZGl0aW9ucyBoYXZlIGJlZW4gbWV0XHJcbiAgICBjb25zdW1wdGlvblRheFdhcm5pbmc6ICdDb25zdW1wdGlvbiBUYXggKFZlcmJydWlrc2JlbGFzdGluZykgbWF5IGFwcGx5LCBpbiB3aGljaCBjYXNlIGEgTmF0aW9uYWwgQWRkaXRpb25hbCBDb2RlIGlzIHJlcXVpcmVkLiBCZWxvdyB5b3UgY2FuIHNlYXJjaCBmb3IgTmF0aW9uYWwgQWRkaXRpb25hbCBDb2Rlcy4nLFxyXG4gICAgQ291bnRyaWVzOiAnQ291bnRyaWVzJyxcclxuICAgIENvdW50cnlPZkRlc3RpbmF0aW9uOiAnQ291bnRyeSBvZiBEZXN0aW5hdGlvbicsXHJcbiAgICBDb3VudHJ5T2ZPcmlnaW46ICdDb3VudHJ5IG9mIE9yaWdpbicsXHJcbiAgICBDb3VudHJ5T3JSZWdpb246ICdDb3VudHJ5IG9yIFJlZ2lvbicsXHJcbiAgICBDdXN0b21zVmFsdWU6ICdDdXN0b21zIFZhbHVlJyxcclxuICAgIERlY2xhcmF0aW9uOiAnRGVjbGFyYXRpb24nLCAvLyBBcyBpbiAnQ3VzdG9tcyBEZWNsYXJhdGlvbidcclxuICAgIERlY2xhcmF0aW9uQ291bnRyeTogJ0RlY2xhcmF0aW9uIENvdW50cnknLCAvLyBBcyBpbiAnQ291bnRyeSB3aGVyZSB0aGUgY3VzdG9tcyBkZWNsYXJhdGlvbiBpcyBkb25lJ1xyXG4gICAgRGVjbGFyYXRpb25EYXRlOiAnRGVjbGFyYXRpb24gRGF0ZScsIC8vIEFzIGluICdEYXRlIG9mIGN1c3RvbXMgZGVjbGFyYXRpb24nXHJcbiAgICBEZXN0aW5hdGlvbjogJ0Rlc3RpbmF0aW9uJywgLy8gQXMgaW4gJ0Rlc3RpbmF0aW9uIGNvdW50cnknXHJcbiAgICBEdXR5Q2FsY3VsYXRvcjogJ0R1dHkgQ2FsY3VsYXRvcicsXHJcbiAgICBEdXR5Q2FsY3VsYXRpb25FcnJvcnM6IHtcclxuICAgICAgICBEdXR5TWVhc3VyZU5vdFVuaXF1ZUZvclByZWZlcmVuY2VDb2RlOiAnVGhlIGR1dHkgbWVhc3VyZSBpcyBub3QgdW5pcXVlIGZvciB0aGUgcHJlZmVyZW5jZSBjb2RlLiBTZWxlY3QgZHV0eSBtZWFzdXJlIHdpdGggb3Igd2l0aG91dCBlbmQtdXNlLicsXHJcbiAgICAgICAgSGVhZGVyOiAnRHV0eSBDYWxjdWxhdGlvbiBFcnJvcicsXHJcbiAgICAgICAgSW52YWxpZE9yTWlzc2luZ1F1YW50aXR5OiAnSW52YWxpZCBvciBtaXNzaW5nIHF1YW50aXR5JyxcclxuICAgICAgICBVbnN1cHBvcnRlZER1dHlFeHByZXNzaW9uOiAnT25lIG9mIHRoZSBtZWFzdXJlcyBmb3IgdGhpcyBkdXR5IGNhbGN1bGF0aW9uIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIGR1dHkgZXhwcmVzc2lvbi4nXHJcbiAgICB9LFxyXG4gICAgRHV0eUNhbGN1bGF0aW9uUmVzdWx0OiAnRHV0eSBDYWxjdWxhdGlvbiBSZXN1bHQnLFxyXG4gICAgRHV0eU1lYXN1cmVUeXBlOiAnRHV0eSBNZWFzdXJlIFR5cGUnLFxyXG4gICAgRXVMZWdpc2xhdGlvbjogJ0VVIExlZ2lzbGF0aW9uJyxcclxuICAgIGV4Y2w6ICdleGNsdWRpbmcnLCAvLyBBcyBpbiAnbWVhc3VyZSBpcyB2YWxpZCBmb3IgYWxsIGNvdW50cmllcyBleGNsLiBjb3VudHJ5MSwgY291bnRyeTIuLi4nXHJcbiAgICBFeGNpc2VzOiAnRXhjaXNlcycsXHJcbiAgICBFeHBvcnRNZWFzdXJlczogJ0V4cG9ydCBNZWFzdXJlcycsXHJcbiAgICBleHBvcnRSZWZ1bmROb21lbmNsYXR1cmU6ICdFeHBvcnQgUmVmdW5kIE5vbWVuY2xhdHVyZScsXHJcbiAgICBGb290bm90ZTogJ0Zvb3Rub3RlJyxcclxuICAgIEZvb3Rub3RlczogJ0Zvb3Rub3RlcycsXHJcbiAgICBGb290bm90ZVR5cGVzOiAnRm9vdG5vdGUgVHlwZXMnLFxyXG4gICAgR2VvZ3JhcGhpY2FsQXJlYTogJ0dlb2dyYXBoaWNhbCBBcmVhJyxcclxuICAgIEdlb2dyYXBoaWNhbEFyZWFzOiAnR2VvZ3JhcGhpY2FsIEFyZWFzJyxcclxuICAgIEltcG9ydE1lYXN1cmVzOiAnSW1wb3J0IE1lYXN1cmVzJyxcclxuICAgIEluZm9ybWF0aW9uRm9yT3JkZXJOdW1iZXI6ICdJbmZvcm1hdGlvbiBmb3IgT3JkZXIgTnVtYmVyJywgLy8gT3JkZXIgTnVtYmVyIG9mIFRhcmlmZiBRdW90YVxyXG4gICAgTGVnaXNsYXRpb246ICdMZWdpc2xhdGlvbicsXHJcbiAgICBMZWdpc2xhdGlvbkZpcnN0TGV0dGVyOiAnTCcsXHJcbiAgICBNZWFzdXJlOiAnTWVhc3VyZScsXHJcbiAgICBNZWFzdXJlczogJ01lYXN1cmVzJyxcclxuICAgIE1lYXN1cmVzRm9yRXhwb3J0RnJvbTogJ01lYXN1cmVzIGZvciBleHBvcnQgZnJvbScsXHJcbiAgICBNZWFzdXJlc0ZvckltcG9ydEludG86ICdNZWFzdXJlcyBmb3IgaW1wb3J0IGludG8nLFxyXG4gICAgTWVhc3VyZXNWYWxpZE9uOiAnTWVhc3VyZXMgdmFsaWQgb24nLFxyXG4gICAgTWVhc3VyZVR5cGVUeXBlYWhlYWRQbGFjZWhvbGRlcjogJ1NlbGVjdCBtZWFzdXJlIHR5cGUnLFxyXG4gICAgTWVhc3VyZVR5cGVNb2RhbFRpdGxlOiAnU2VsZWN0IG1lYXN1cmUgdHlwZScsXHJcbiAgICBOYXRpb25hbEFkZGl0aW9uYWxDb2RlOiAnTmF0aW9uYWwgYWRkaXRpb25hbCBjb2RlJyxcclxuICAgIG5vQ2VydGlmaWNhdGVzRm91bmQ6ICdObyBjZXJ0aWZpY2F0ZSBjb2RlcyBmb3VuZCcsXHJcbiAgICBub0Zvb3Rub3Rlc0ZvdW5kOiAnTm8gRm9vdG5vdGVzIEZvdW5kJyxcclxuICAgIG5vTWVhc3VyZXNGb3VuZDogJ05vIE1lYXN1cmVzIEZvdW5kJyxcclxuICAgIG5vUmVzdWx0c0ZvckNvbW1vZGl0eUNvZGVzSW5QZXJpb2Q6ICdObyBSZXN1bHRzIGZvciB0aGUgY2hvc2VuIGNvbW1vZGl0eSBjb2RlcyBpbiB0aGUgY2hvc2VuIHBlcmlvZCcsXHJcbiAgICBPcHRpb25hbE5hdGlvbmFsQWRkaXRpb25hbENvZGU6ICdPcHRpb25hbCBuYXRpb25hbCBhZGRpdGlvbmFsIGNvZGUnLFxyXG4gICAgT3JpZ2luOiAnT3JpZ2luJywgLy8gQXMgaW4gJ0NvdW50cnkgb2YgT3JpZ2luJ1xyXG4gICAgT3RoZXJDaG9pY2VzOiAnT3RoZXIgQ2hvaWNlcycsIC8vIEhlYWRlciBmb3IgcHJpbnQgdmVyc2lvbiwgc2hvd2luZyBvdGhlciBjaG9pY2VzIHRoZSB1c2VyIGhhcyBtYWRlIHRvIGZpbHRlciBtZWFzdXJlcyAoZS5nLiByZWZlcmVuY2UgZGF0ZSBhbmQgcmVmZXJlbmNlIGNvdW50cnkpXHJcbiAgICBQcmVmZXJlbmNlQ29kZTogJ1ByZWZlcmVuY2UgY29kZScsXHJcbiAgICBQcmVmZXJlbmNlQ29kZURpc3BsYXlMYWJlbDogJ1ByZWZlcmVuY2UgY29kZXMgZGlzcGxheScsIC8vIGRpc3BsYXkgcHJlZmVyZW5jZSBjb2RlcyB0aGF0IGFyZSB2YWxpZCBmb3IgZGVjbGFyYXRpb25zIHVuZGVyIFVDQyBvciBmb3IgZGVjbGFyYXRpb25zIGluIHRoZSBzaXR1YXRpb24gYmVmb3JlIFVDQz9cclxuICAgIFByZWZlcmVuY2VDb2RlRGlzcGxheUxhYmVsUHJlVWNjOiAnUHJlLVVDQycsIC8vIFVDQyBhcyBpbiBVbmlvbiBDdXN0b21zIENvZGVcclxuICAgIFByZWZlcmVuY2VDb2RlRGlzcGxheUxhYmVsVWNjOiAnRE1TIC8gVUNDJywgLy8gVUNDIGFzIGluIFVuaW9uIEN1c3RvbXMgQ29kZVxyXG4gICAgUHJlZmVyZW5jZUNvZGVUeXBlYWhlYWRQbGFjZWhvbGRlcjogJ1NlYXJjaCBieSBwcmVmZXJlbmNlIGNvZGUgb3IgZGVzY3JpcHRpb24nLFxyXG4gICAgUHJlZmVyZW5jZUNvZGVNb2RhbFRpdGxlOiAnU2VsZWN0IGEgcHJlZmVyZW5jZSBjb2RlJyxcclxuICAgIEVuZFVzZU1lYXN1cmVJc0FsbG93ZWRXaXRoUHJvY2VkdXJlQ29kZTQ0OiAnVGhlIGVuZC11c2UgbWVhc3VyZSBpcyBhbGxvd2VkIHdpdGggY3VzdG9tcyBwcm9jZWR1cmUgNDQgXCJFbmQtdXNlXCInLFxyXG4gICAgUHJlZmVycmVkRHV0eVRyZWF0bWVudDogJ1ByZWZlcnJlZCBEdXR5IFRyZWF0bWVudCcsXHJcbiAgICBRdWFudGl0eTogJ1F1YW50aXR5JyxcclxuICAgIFF1b3RhT3JkZXJOdW1iZXI6ICdRdW90YSBPcmRlciBOdW1iZXInLFxyXG4gICAgUXVvdGFPcmRlck51bWJlclR5cGVhaGVhZFBsYWNlaG9sZGVyOiAnRW50ZXIgcXVvdGEgb3JkZXIgbnVtYmVyJyxcclxuICAgIFJlZmVyZW5jZUxpc3RzOiAnUmVmZXJlbmNlIGxpc3RzJyxcclxuICAgIFJlZ2lvbjogJ1JlZ2lvbicsXHJcbiAgICBSZWdpb25zOiAnUmVnaW9ucycsXHJcbiAgICBSZXRhaWxQcmljZTogJ1JldGFpbCBQcmljZScsXHJcbiAgICBTZWFyY2hCeUNvZGVPckRlc2NyaXB0aW9uOiAnU2VhcmNoIGJ5IGNvZGUgb3IgZGVzY3JpcHRpb24nLFxyXG4gICAgU2hvd1F1b3RhSW5mb3JtYXRpb246ICdTaG93IFF1b3RhIEluZm9ybWF0aW9uJyxcclxuICAgIFRheGVzOiAnVGF4ZXMnLFxyXG4gICAgVmFsdWU6ICdWYWx1ZScsXHJcbiAgICBWYWxpZGF0ZURlY2xhcmF0aW9uOiAnVmFsaWRhdGUgRGVjbGFyYXRpb24nLFxyXG4gICAgVmF0QW5kRXhjaXNlRXRjZXRlcmE6ICdWQVQsIEV4Y2lzZSwgU3RvcmFnZSBhbmQgQ29uc3VtcHRpb24gVGF4JyxcclxuICAgIFZBVDogJ1ZBVCdcclxufTtcclxuIiwiLy8gU2VlIGh0dHBzOi8vYXBwLnRhcmljc3VwcG9ydC5jb20vIyEvdHJhZGUtc3RhdGlzdGljc1xyXG4vLyBTZWUgaHR0cHM6Ly90cmFkZS5lYy5ldXJvcGEuZXUvYWNjZXNzLXRvLW1hcmtldHMvZW4vc3RhdGlzdGljc1xyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIEV4cG9ydFZhbHVlOiAnRXhwb3J0IHZhbHVlJyxcclxuICAgIEV4cG9ydFdlaWdodDogJ0V4cG9ydCB3ZWlnaHQnLFxyXG4gICAgRXhwb3J0VmFsdWVQZXJLZzogJ0V4cG9ydCB2YWx1ZSBwZXIga2cnLFxyXG4gICAgSW1wb3J0VmFsdWU6ICdJbXBvcnQgdmFsdWUnLFxyXG4gICAgSW1wb3J0V2VpZ2h0OiAnSW1wb3J0IHdlaWdodCcsXHJcbiAgICBJbXBvcnRWYWx1ZVBlcktnOiAnSW1wb3J0IHZhbHVlIHBlciBrZycsXHJcbiAgICBNb3JlWWVhcnNDb21pbmdTb29uOiAnTW9yZSB5ZWFycyBjb21pbmcgc29vbicsXHJcbiAgICBOb0RhdGFBdmFpbGFibGU6ICdObyBkYXRhIGF2YWlsYWJsZScsXHJcbiAgICBSZXBvcnRpbmdDb3VudHJ5OiAnUmVwb3J0aW5nIGNvdW50cnknLFxyXG4gICAgU3RhdGlzdGljc0ZvckltcG9ydEZyb206ICdTdGF0aXN0aWNzIGZvciBpbXBvcnQgZnJvbScsXHJcbiAgICBTdGF0aXN0aWNzRm9ySW1wb3J0SW50bzogJ1N0YXRpc3RpY3MgZm9yIGltcG9ydCBpbnRvJyxcclxuICAgIFxyXG4gICAgU3RhdGlzdGljc0ZvckltcG9ydEZyb21fQ291bnRyeU5hbWVfSW5fWWVhcl86ICdTdGF0aXN0aWNzIGZvciBpbXBvcnQgZnJvbSB7eyBDb3VudHJ5TmFtZSB9fSBpbiB7eyBZZWFyIH19JyxcclxuICAgIFN0YXRpc3RpY3NGb3JJbXBvcnRJbnRvX0NvdW50cnlOYW1lX0luX1llYXJfOiAnU3RhdGlzdGljcyBmb3IgaW1wb3J0IGludG8ge3sgQ291bnRyeU5hbWUgfX0gaW4ge3sgWWVhciB9fScsXHJcbiAgICBTdGF0aXN0aWNzRm9ySW1wb3J0SW50b1RoZUVVX0luX1llYXJfOiAnU3RhdGlzdGljcyBmb3IgaW1wb3J0IGludG8gdGhlIEVVIGluIHt7IFllYXIgfX0nLFxyXG5cclxuICAgIHRoZUVVOiAndGhlIEVVJyxcclxuICAgIFRyYWRlUGFydG5lcjogJ1RyYWRlIHBhcnRuZXInLFxyXG4gICAgVHJhZGVTdGF0aXN0aWNzOiAnVHJhZGUgc3RhdGlzdGljcycsXHJcbiAgICBZZWFyOiAnWWVhcidcclxufTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICB2YXROdW1iZXI6ICdWQVQgbnVtYmVyJyxcclxuICAgIGNkTnVtYmVyOiAnQ0QgbnVtYmVyJyxcclxuICAgIGVvcmlOdW1iZXI6ICdFT1JJIG51bWJlcicsXHJcbiAgICByZXhOdW1iZXI6ICdSRVggbnVtYmVyJyxcclxuICAgIHRpbk51bWJlcjogJ1RJTiBudW1iZXInLFxyXG4gICAgY2RDaGVja2luZzogJ1F1ZXJ5IEVVIEN1c3RvbXMgRGVjaXNpb24gU3lzdGVtJyxcclxuICAgIGNoZWNrRU9SSU51bWJlcjogJ0NoZWNrIEVPUkkgbnVtYmVyJyxcclxuICAgIGNoZWNrUmV4TnVtYmVyOiAnQ2hlY2sgUkVYIG51bWJlcicsXHJcbiAgICBjaGVja1ZpZXNSZWdpc3RyYXRpb25Gb3JWYXROdW1iZXI6ICdDaGVjayBWSUVTIHJlZ2lzdHJhdGlvbiBmb3IgVkFUIG51bWJlcicsXHJcbiAgICB2YXRDaGVjazogJ0NoZWNrIFZBVCBudW1iZXIgKFZJRVMpJyxcclxuICAgIGVvcmlDaGVjazogJ0NoZWNrIEVPUkkgbnVtYmVyJyxcclxuICAgIHJleENoZWNrOiAnQ2hlY2sgUkVYIG51bWJlcicsXHJcbiAgICBjZENoZWNrOiAnUXVlcnkgQ3VzdG9tcyBEZWNpc2lvbiBTeXN0ZW0nLFxyXG4gICAgZW9yaUNoZWNrUmVzdWx0VmFsaWQ6ICdUaGUgY2hlY2tlZCBFT1JJIG51bWJlciBpcyB2YWxpZCcsXHJcbiAgICBlb3JpQ2hlY2tSZXN1bHRJbnZhbGlkOiAnVGhlIGNoZWNrZWQgRU9SSSBudW1iZXIgaXMgaW52YWxpZCcsXHJcbiAgICByZXhDaGVja1Jlc3VsdEludmFsaWQ6ICdUaGUgY2hlY2tlZCBSRVgtbnVtbWVyIGlzIGludmFsaWQnLFxyXG4gICAgY2l0eTogJ0NpdHknLFxyXG4gICAgY29tcGFueU5hbWU6ICdDb21wYW55IG5hbWUnLFxyXG4gICAgY29tcGFueUFkZHJlc3M6ICdDb21wYW55IGFkZHJlc3MnLFxyXG4gICAgY291bnRyeUNvZGU6ICdDb3VudHJ5IGNvZGUnLFxyXG4gICAgcG9zdGFsQ29kZTogJ1Bvc3RhbCBDb2RlJyxcclxuICAgIHNlYXJjaFJlc3VsdHM6ICdTZWFyY2ggcmVzdWx0cycsXHJcbiAgICBzZXJ2ZXJFcnJvcjogJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgeW91ciByZXF1ZXN0JywgXHJcbiAgICBhY3Rpdml0eW5hbWVGaWVsZDogJ0FjdGl2aXR5JyxcclxuICAgIGFjdGl2aXR5ZmxhZ0ZpZWxkOiAnRmxhZycsXHJcbiAgICBsaXN0T2ZHb29kczogJ0xpc3Qgb2YgZ29vZHMnLFxyXG4gICAgY29tbW9kaXR5Q29kZTogJ0NvbW1vZGl0eSBjb2RlJyxcclxuICAgIHJleEZpZWxkRXJyb3I6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBSRVggbnVtYmVyJyxcclxuICAgIGVvcmlGaWVsZEVycm9yOiAnUGxlYXNlIGVudGVyIGFuIHZhbGlkIEVPUkkgbnVtYmVyJyxcclxuICAgIFZhbGlkYXRlQnVzaW5lc3NJbmZvcm1hdGlvbjogJ1ZhbGlkYXRlIEJ1c2luZXNzIEluZm9ybWF0aW9uJyxcclxuICAgIFZpZXNXZWJTaXRlSW50cm9UZXh0OiAnWW91IGNhbiB1c2UgdGhlIEVVXFwncyBWSUVTIHdlYnNpdGUgdG8gY2hlY2sgaWYgVkFUIG51bWJlcnMgYXJlIHZhbGlkIGZvciBpbnRyYS1jb21tdW5pdHkgc3VwcGx5IG9mIGdvb2RzIG9yIHNlcnZpY2VzLicsXHJcbiAgICBHb1RvVmllc1dlYnNpdGU6ICdHbyBUbyBWSUVTIFdlYnNpdGUgKG9wZW5zIGluIG5ldyB3aW5kb3cpJyxcclxuICAgIFBST0RVQ1RJT046ICdQcm9kdWN0aW9uJyxcclxuICAgIFRSQURJTkc6ICdUcmFkaW5nJyxcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGR5bmFtaWM6IHtcclxuICAgICAgICBDb21tb2RpdHlDb2RlSXNJbnZhbGlkOiAnQ29tbW9kaXR5IGNvZGUgaXMgaW52YWxpZCcsXHJcbiAgICAgICAgQ29tbW9kaXR5Q29kZU9yUXVlcnlJc1JlcXVpcmVkOiAnQ29tbW9kaXR5IGNvZGUgb3Igc2VhcmNoIHF1ZXJ5IGlzIHJlcXVpcmVkJyxcclxuICAgICAgICBRdWVyeUlzVG9vU2hvcnQ6ICdTZWFyY2ggcXVlcnkgaXMgdG9vIHNob3J0JyxcclxuICAgICAgICBRdWVyeUlzUmVxdWlyZWQ6ICdTZWFyY2ggcXVlcnkgaXMgcmVxdWlyZWQnLFxyXG4gICAgfVxyXG59OyIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgLy8gYWNjb3VudDogcmVxdWlyZSgnLi9hY2NvdW50JyksXHJcbiAgICBidGk6IHJlcXVpcmUoJy4vYnRpJyksXHJcbiAgICAvLyBhdHI6IHJlcXVpcmUoJy4vYXRyJyksXHJcbiAgICAvLyBjYXNlTGF3OiByZXF1aXJlKCcuL2Nhc2UtbGF3JyksXHJcbiAgICBjbGFzc2lmaWNhdGlvblJlZ3VsYXRpb246IHJlcXVpcmUoJy4vY2xhc3NpZmljYXRpb24tcmVndWxhdGlvbicpLCAvLyBmdWxseSB0cmFuc2xhdGVkXHJcbiAgICAvLyBjb21wbGlhbmNlOiByZXF1aXJlKCcuL2NvbXBsaWFuY2UnKSxcclxuICAgIC8vIGNvbmNsdXNpb246IHJlcXVpcmUoJy4vY29uY2x1c2lvbicpLFxyXG4gICAgLy8gY29ycmVsYXRpb25UYWJsZTogcmVxdWlyZSgnLi9jb3JyZWxhdGlvbi10YWJsZScpLFxyXG4gICAgLy8gY3VzdG9tc1ZhbHVlOiByZXF1aXJlKCcuL2N1c3RvbXMtdmFsdWUnKSxcclxuICAgIC8vIGN1c3RvbXNWYWx1ZUNoZWNrOiByZXF1aXJlKCcuL2N1c3RvbXMtdmFsdWUtY2hlY2snKSxcclxuICAgIGRhc2hib2FyZDogcmVxdWlyZSgnLi9kYXNoYm9hcmQnKSwgLy8gcGFydGlhbGx5IHRyYW5zbGF0ZWRcclxuICAgIC8vIGRvY3VtZW50YXRpb246IHJlcXVpcmUoJy4vZG9jdW1lbnRhdGlvbicpLFxyXG4gICAgZXhjaGFuZ2VSYXRlczogcmVxdWlyZSgnLi9leGNoYW5nZS1yYXRlcycpLFxyXG4gICAgLy8gZXp0OiByZXF1aXJlKCcuL2V6dCcpLFxyXG4gICAgLy8gZm9ybUxhYmVsczogcmVxdWlyZSgnLi9mb3JtLWxhYmVscycpLFxyXG4gICAgLy8gZWNpY3M6IHJlcXVpcmUoJy4vZWNpY3MnKSxcclxuICAgIGdvb2RzOiByZXF1aXJlKCcuL2dvb2RzJyksIC8vIHBhcnRpYWxseSB0cmFuc2xhdGVkLCB0YWJzIG5lZWQgdHJhbnNsYXRpb25cclxuICAgIC8vIG1haW5NZW51OiByZXF1aXJlKCcuL21haW4tbWVudScpLFxyXG4gICAgLy8gbmV3czogcmVxdWlyZSgnLi9uZXdzJyksXHJcbiAgICBub21lbmNsYXR1cmU6IHJlcXVpcmUoJy4vbm9tZW5jbGF0dXJlJyksIC8vIGZ1bGx5IHRyYW5zbGF0ZWQsIGNvdWxkIHVzZSByZXZpZXdcclxuICAgIC8vIHF1b3RhOiByZXF1aXJlKCcuL3F1b3RhJyksXHJcbiAgICAvLyByZWZlcmVuY2VwcmljZXM6IHJlcXVpcmUoJy4vcmVmZXJlbmNlcHJpY2VzJyksXHJcbiAgICAvLyByZWd1bGF0aW9uOiByZXF1aXJlKCcuL3JlZ3VsYXRpb24nKSxcclxuICAgIC8vIHNlYXJjaDogcmVxdWlyZSgnLi9zZWFyY2gnKSxcclxuICAgIHNoYXJlZDoge1xyXG4gICAgLy8gICAgIG1lc3NhZ2VzOiByZXF1aXJlKCcuL3NoYXJlZC1tZXNzYWdlcycpLFxyXG4gICAgICAgIHVpOiByZXF1aXJlKCcuL3NoYXJlZC11aScpLFxyXG4gICAgfSxcclxuICAgIC8vIHNvcnRPcHRpb25zOiByZXF1aXJlKCcuL3NvcnQtb3B0aW9ucycpLFxyXG4gICAgLy8gc3RhdHVzOiByZXF1aXJlKCcuL3N0YXR1cycpLFxyXG4gICAgdGFyaWM6IHJlcXVpcmUoJy4vdGFyaWMnKSwgLy8gcGFydGlhbGx5IHRyYW5zbGF0ZWRcclxuICAgIC8vIHRyYWRlU3RhdGlzdGljczogcmVxdWlyZSgnLi90cmFkZS1zdGF0aXN0aWNzJyksXHJcbiAgICAvLyB2YWxpZGF0ZUJ1c2luZXNzSW5mbzogcmVxdWlyZSgnLi92YWxpZGF0ZS1idXNpbmVzcy1pbmZvJyksICAgIFxyXG4gICAgLy8gdmFsaWRhdGlvbkVycm9yczogcmVxdWlyZSgnLi92YWxpZGF0aW9uLWVycm9ycycpLFxyXG59OyIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgQmluZGluZ1RhcmlmZkluZm9ybWF0aW9uOiAnSW5mb3JtYXppb25pIFRhcmlmZmFyaWUgVmluY29sYW50aScsXHJcbiAgICBCdGlGaXJzdExldHRlcjogJ0knLFxyXG4gICAgQnRpczogJ0lUVicsXHJcbiAgICBCdGlSZWZlcmVuY2U6ICdSaWZlcmltZW50byBJVFYnLFxyXG4gICAgLy8gY29weURlc2NyaXB0aW9uOiAnVGhpcyBpbmZvcm1hdGlvbiBpcyBhIGNvcHkgb2YgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBFVSBFQlRJLWRhdGFiYXNlLicsXHJcbiAgICBjb3VudHJ5T2ZPcmlnaW46ICdQYWVzZSBjaGUgaGEgZm9ybml0byBsXFwnSVRWIC8gTGluZ3VhJyxcclxuICAgIGRhdGVBbmRQbGFjZU9mSXNzdWU6ICdMdW9nbyBlIGRhdGEgZGkgcmlsYXNjaW8nLFxyXG4gICAgZGV0YWlsczogJ0RldHRhZ2xpIGRlbGxcXCdJVFYnLFxyXG4gICAgLy8gZWJ0aUxpbmtUZXh0OiAnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHVwLXRvLWRhdGUgdmVyc2lvbiBpbiB0aGlzIGRhdGFiYXNlLicsXHJcbiAgICBFdXJvcGVhbkJpbmRpbmdUYXJpZmZJbmZvcm1hdGlvbjogJ0luZm9ybWF6aW9uaSBUYXJpZmZhcmllIFZpbmNvbGFudGkgRXVyb3BlZScsXHJcbiAgICBnb29kc0Rlc2NyaXB0aW9uOiAnRGVzY3JpemlvbmUgZGVsbGEgbWVyY2UnLFxyXG4gICAgaXNzdWVkU2luY2U6ICdSaWxhc2NpYXRlIGEgcGFydGlyZSBkYWwnLFxyXG4gICAgS2V5d29yZHM6ICdQYXJvbGUgY2hpYXZlIG5hemlvbmFsaScsXHJcbiAgICBtb3RpdmF0aW9uOiAnTW90aXZhemlvbmUgZGVsbGEgY2xhc3NpZmljYXppb25lJyxcclxuICAgIG5hdGlvbmFsS2V5d29yZHM6ICdQYXJvbGUgY2hpYXZlIG5hemlvbmFsaScsXHJcbiAgICAvLyBOT0lNQUdFOiAnTk8gSU1BR0UnLCAvLyBTaG93biBpbnN0ZWFkIG9mIGFuIGltYWdlIHdoZW4gbm8gaW1hZ2UgaXMgYXZhaWxhYmxlXHJcbiAgICAvLyBub0xvbmdlclZhbGlkOiAnVGhpcyBCVEkgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW4gdGhlcmVmb3JlIG5vIGxvbmdlciBiZSBmb3VuZCBpbiB0aGUgRVUgRUJUSS1kYXRhYmFzZS4nLFxyXG4gICAgLy8gbm90VmFsaWRPbl9yZWZlcmVuY2VEYXRlXzogJ25vdCB2YWxpZCBvbiB7eyByZWZlcmVuY2VEYXRlIHwgZGF0ZTogXFwnZGQtTU0teXlcXCcgfX0nLFxyXG4gICAgLy8gcG9zc2libHlJbnZhbGlkOiAnTm90ZTogaW4gc29tZSBjYXNlcywgc3VjaCBhcyB0aGUgcHVibGljYXRpb24gb2YgYSBjbGFzc2lmaWNhdGlvbiByZWd1bGF0aW9uLCBCVElzIG1heSBiZSByZXZva2VkIGJlZm9yZSB0aGVpciBub3JtYWwgcGVyaW9kIG9mIHZhbGlkaXR5IGhhcyBleHBpcmVkLiBIZW5jZSwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIEJUSSBpcyBubyBsb25nZXIgdmFsaWQuJyxcclxuICAgIFBhZ2VUaXRsZVNlYXJjaEJ0aXM6ICdSaWNlcmNhIElUVicsXHJcbiAgICAvLyBfYnRpQ291bnRfYmluZGluZ1RhcmlmZkluZm9ybWF0aW9uRGVjaXNpb25zRm91bmQ6ICd7eyBidGlDb3VudCB9fSBiaW5kaW5nIHRhcmlmZiBpbmZvcm1hdGlvbiBkZWNpc2lvbihzKSBmb3VuZCcsXHJcbiAgICAvLyBfU3RhcnREYXRlX3VudGlsX0VuZERhdGVfOiAne3sgU3RhcnREYXRlIHwgZGF0ZTogXFwnZGQtTU0teXl5eVxcJyB9fSB1bnRpbCB7eyBFbmREYXRlIHwgZGF0ZTogXFwnZGQtTU0teXl5eVxcJyB9fSdcclxufTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zOiAnUmVnb2xhbWVudGkgZGkgY2xhc3NpZmljYXppb25lJyxcclxuICAgIE5vdEF2YWlsYWJsZUluQ2hvc2VuTGFuZ3VhZ2U6ICdJIHJlZ29sYW1lbnRpIGRpIGNsYXNzaWZpY2F6aW9uZSBzb25vIGRpc3BvbmliaWxpIHNvbG8gaW4gaW5nbGVzZSBlIG9sYW5kZXNlJ1xyXG59OyIsIu+7vy8vIFNlZSBodHRwczovL2FwcC50YXJpY3N1cHBvcnQuY29tLyMhL3NlY3Rpb25zXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgZXhhbXBsZVRleHQ6ICdwZXIgZXNlbXBpbzogPGVtPjIyMDMwMDA5PC9lbT4gbyA8ZW0+NjkxMTEwMDA5MCBpbXBvcnQgY248L2VtPicsXHJcbiAgICAvLyBsYW5kaW5nUGFnZToge1xyXG4gICAgLy8gICAgIGR5bmFtaWM6IHtcclxuICAgIC8vICAgICAgICAgREU6ICdUbyB0aGUgR2VybWFuIEN1c3RvbXMgVGFyaWZmIChFWlQpJyxcclxuICAgIC8vICAgICAgICAgRVU6ICdUbyB0aGUgRXVyb3BlYW4gQ3VzdG9tcyBUYXJpZmYgKFRBUklDKScsXHJcbiAgICAvLyAgICAgICAgIEJFOiAnVG8gdGhlIEJlbGdpYW4gQ3VzdG9tcyBUYXJpZmYgKFRBUkJFTCknLFxyXG4gICAgLy8gICAgICAgICBOTDogJ1RvIHRoZSBEdXRjaCBDdXN0b21zIFRhcmlmZiAoRFRWKScsXHJcbiAgICAvLyAgICAgICAgIENIOiAnVG8gdGhlIFN3aXNzIEN1c3RvbXMgVGFyaWZmIChUQVJFUyknLFxyXG4gICAgLy8gICAgICAgICBHQjogJ1RvIHRoZSBVSyBHbG9iYWwgVGFyaWZmIChVS0dUKScsXHJcbiAgICAvLyAgICAgICAgIFNFOiAnVG8gdGhlIFN3ZWRpc2ggQ3VzdG9tcyBUYXJpZmYnLFxyXG4gICAgLy8gICAgICAgICBJVDogJ1RvIHRoZSBJdGFsaWFuIEN1c3RvbXMgVGFyaWZmJ1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH0sXHJcbiAgICAvLyBSZWNlbnRDaGFuZ2VzOiAnUmVjZW50IENoYW5nZXMnLCAvLyByZWNlbnQgY2hhbmdlcyB0byB0aGUgYXBwbGljYXRpb25cclxuICAgIFJlY2VudENvZGVzOiAnQ29kaWNpIHJlY2VudGknIC8vIHJlY2VudCBjb21tb2RpdHkgY29kZXNcclxufTtcclxuIiwiLy8gU2VlIGh0dHBzOi8vYXBwLnRhcmljc3VwcG9ydC5jb20vIyEvZXhjaGFuZ2UtcmF0ZXNcclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBDdXJyZW5jeTogJ1ZhbHV0YScsXHJcbiAgICBDdXJyZW5jeUNvZGU6ICdDb2RpY2UgdmFsdXRhJyxcclxuICAgIEN1cnJlbmN5Q29kZU1vZGFsVGl0bGU6ICdTY2VnbGkgY29kaWNlIHZhbHV0YScsXHJcbiAgICBDdXJyZW5jeUNvZGVUeXBlYWhlYWRQbGFjZWhvbGRlcjogJ0NlcmNhIHBlciBjb2RpY2UgbyBub21lIGRpIHZhbHV0YScsXHJcbiAgICBDdXJyZW5jeUNvbnZlcnNpb25SZXN1bHRzOiAnUmlzdWx0YXRpIGRlbGxhIGNvbnZlcnNpb25lIGRpIHZhbHV0YScsXHJcbiAgICBDdXJyZW5jeU5hbWU6ICdOb21lIHZhbHV0YScsXHJcbiAgICBFeGNoYW5nZVJhdGVzOiAnVGFzc2kgZGkgY2FtYmlvJyxcclxuICAgIE51bWJlck9mRGVjaW1hbFBsYWNlczogJ051bWVybyBkaSBkZWNpbWFsaScsXHJcbiAgICBVc2VUaGVGaWVsZHNCZWxvd1RvQ29udmVydEJldHdlZW5fYW5kXzogJ1V0aWxpenphIGkgY2FtcGkgc290dG9zdGFudGkgcGVyIGNvbnZlcnRpcmUgdHJhIHt7IGludmVyc2VNb25ldGFyeVZhbHVlLnVuaXQgfX0gZSB7eyBtb25ldGFyeVZhbHVlLnVuaXQgfX0uJyxcclxufTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICAvLyB0YWJzOiB7XHJcbiAgICAvLyAgICAgTWVhc3VyZXM6ICdNZWFzdXJlcycsXHJcbiAgICAvLyAgICAgVmFsaWRhdGVEZWNsYXJhdGlvbjogJ1ZhbGlkYXRlIGRlY2xhcmF0aW9uJyxcclxuICAgIC8vICAgICBDYWxjdWxhdGVEdXR5OiAnQ2FsY3VsYXRlIGR1dGllcydcclxuICAgIC8vIH0sXHJcbiAgICBmb3JtOiB7XHJcbiAgICAgICAgbGVnZW5kVmFsdWU6ICdWYWxvcmUnLFxyXG4gICAgICAgIHJhZGlvTWV0aG9kTGFiZWw6ICdNZXRvZG8nLFx0XHJcbiAgICAgICAgcmFkaW9NZXRob2RPcHRpb25DYWxjdWxhdGVWYWx1ZTogJ0NhbGNvbGFyZSBpbCB2YWxvcmUnLFxyXG4gICAgICAgIHJhZGlvTWV0aG9kT3B0b25FbnRlclZhbHVlOiAnSW5zZXJpcmUgaWwgdmFsb3JlJ1xyXG4gICAgfSxcclxuICAgIGZpbmFuY2lhbENvbmRpdGlvbnM6IHtcclxuICAgICAgICBFOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiAnTGEgcXVhbnRpdMOgIGUgaWwgcHJlenpvIHVuaXRhcmlvIGRpY2hpYXJhdG8sIHNlY29uZG8gaSBjYXNpLCDDqCB1Z3VhbGUgb2QgaW5mZXJpb3JlICBhbGxhIHF1YW50aXTDoCBtYXNzaW1hIGluZGljYXRhLCBvIHByZXNlbnRhemlvbmUgZGVsIGRvY3VtZW50byByaWNoaWVzdG8nLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBjb2wxOiAnUXVhbnRpdMOgIG8gcHJlenpvIHVuaXRhcmlvIGRpY2hpYXJhdG8nLFxyXG4gICAgICAgICAgICAgICAgY29sMjogJ0ltcG9ydG8nXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIEY6IHtcclxuICAgICAgICAgICAgdGl0bGU6ICdQcmV6em8gbmV0dG8gZnJhbmNvIGZyb250aWVyYSwgcHJpbWEgZGVsbG8gc2RvZ2FuYW1lbnRvLCBkZXZlIGVzc2VyZSB1Z3VhbGUgbyBzdXBlcmlvcmUgYWwgcHJlenpvIG1pbmltbycsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIGNvbDE6ICdQcmV6em8gbmV0dG8gZnJhbmNvIGZyb250aWVyYSwgcHJpbWEgZGVsbG8gc2RvZ2FuYW1lbnRvJyxcclxuICAgICAgICAgICAgICAgIGNvbDI6ICdJbXBvcnRvJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBMOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiAnSWwgcHJlenpvIENJRiBkZXZlIGVzc2VyZSBzdXBlcmlvcmUgYWwgcHJlenpvIG1pbmltbycsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIGNvbDE6ICdQcmV6em8gQ0lGJyxcclxuICAgICAgICAgICAgICAgIGNvbDI6ICdJbXBvcnRvJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBNOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiAnSWwgcHJlenpvIGRpY2hpYXJhdG8gZGV2ZSBlc3NlcmUgdWd1YWxlIG8gc3VwZXJpb3JlIGFsIHByZXp6byBtaW5pbW8vIHByZXp6byBkaSByaWZlcmltZW50bycsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIGNvbDE6ICdQcmV6em8gZGljaGlhcmF0bycsXHJcbiAgICAgICAgICAgICAgICBjb2wyOiAnSW1wb3J0bydcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgVjoge1xyXG4gICAgICAgICAgICB0aXRsZTogJ0lsIHByZXp6byBhbGxcXCdpbXBvcnRhemlvbmUgZGV2ZSBlc3NlcmUgdWd1YWxlIG8gc3VwZXJpb3JlIGFsIHByZXp6byBkXFwnZW50cmF0YScsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIGNvbDE6ICdQcmV6em8gYWxsXFwnaW1wb3J0YXppb25lJyxcclxuICAgICAgICAgICAgICAgIGNvbDI6ICdJbXBvcnRvJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIG1ldXJzaW5nOiB7XHJcbiAgICAgICAgY2FsY3VsYXRlRGVzY3JpcHRpb246ICcnLFxyXG4gICAgICAgIGNhbGN1bGF0ZVRpdGxlOiAnUmljZXJjYSBlbGVtZW50aSBhZ3JpY29saScsXHJcbiAgICAgICAgaW1wb3NzaWJsZUNvbWJpbmF0aW9uOiAnQ29tYmluYXppb25lIGRpIGluZ3JlZGllbnRpIG5vbiB2YWxpZGEgKHBlc28gdG90YWxlIHN1cGVyaW9yZSBhbCAxMDAlKScsXHJcbiAgICAgICAgbWlsa2ZhdDogJ01hdGVyaWUgZ3Jhc3NlIHByb3ZlbmllbnRpIGRhbCBsYXR0ZSAoJSBpbiBwZXNvKScsXHJcbiAgICAgICAgbWlsa3Byb3RlaW5zOiAnUHJvdGVpbmUgZGVsIGxhdHRlICglIGluIHBlc28pJyxcclxuICAgICAgICBzYWNjaGFyaW46ICdTYWNjYXJvc2lvL1p1Y2NoZXJvIGludmVydGl0by9Jc29nbHVjb3NpbyAoJSBpbiBwZXNvKScsXHJcbiAgICAgICAgc3RhcmNoR2x1Y29zZTogJ0FtaWRvLUZlY29sYS9HbHVjb3NpbyAoJSBpbiBwZXNvKScsXHJcbiAgICB9XHJcbn07XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgQW5ub3RhdGlvbnM6ICdOb3RlJyxcclxuICAgIEFubm90YXRpb25zRmlyc3RMZXR0ZXI6ICdOJyxcclxuXHJcbiAgICBDaGFwdGVyOiAnQ2FwaXRvbG8nLFxyXG4gICAgQ2hhcHRlcnM6ICdDYXBpdG9saScsXHJcbiAgICBDaGFwdGVyX2NvZGVfOiAnQ2FwaXRvbG8ge3sgY29kZSB9fScsXHJcbiAgICBDaGFwdGVyX0dvb2RzQ29kZU9yU2VjdGlvbk51bWJlcl86ICdDYXBpdG9sbyB7eyBHb29kc0NvZGVPclNlY3Rpb25OdW1iZXIgfX0nLFxyXG5cclxuICAgIENvbWJpbmVkTm9tZW5jbGF0dXJlOiAnTm9tZW5jbGF0dXJhIGNvbWJpbmF0YScsXHJcblxyXG4gICAgQ29tbW9kaXR5Q2xhc3NpZmljYXRpb246ICdDbGFzc2lmaWNhemlvbmUgZGVsbGUgbWVyY2knLCAvLyBDaGVjayBpZiB0aGlzIGlzIGNvcnJlY3RcclxuICAgIENvbW1vZGl0eUNvZGU6ICdDb2RpY2Ugbm9tZW5jbGF0dXJhJywgLy8gQ2hlY2sgaWYgdGhpcyBpcyBjb3JyZWN0LCBJIGhhdmUgYWxzbyBzZWVuIGNvZGljZSBkZWxsZSBtZXJjaSwgY29kaWNlIG1lcmNlb2xvZ2ljbywgY29kaWNlIGRvZ2FuYWxlIGFuZCBjb2RpZGUgbm9tZW5jbGF0dXJhXHJcbiAgICBDb21tb2RpdHlDb2RlczogJ0NvZGljaSBub21lbmNsYXR1cmEnLCAvLyBDaGVjayBpZiB0aGlzIGlzIGNvcnJlY3RcclxuICAgIENvbW1vZGl0eUNvZGVzRm91bmRJblRleHQ6ICdDb2RpY2kgbm9tZW5jbGF0dXJhIHRyb3ZhdGkgbmVsIHRlc3RvJywgLy8gQ2hlY2sgaWYgdGhpcyBpcyBjb3JyZWN0ICh0cm92YXRpL3ByZXNlbnRpLCBub3Qgc3VyZSB3aGljaCBvbmUgaXMgYmV0dGVyKVxyXG5cclxuICAgIEhlYWRpbmc6ICdWb2NlJyxcclxuICAgIEhlYWRpbmdfY29kZV86ICdWb2NlIHt7IGNvZGUgfX0nLFxyXG4gICAgSGVhZGluZ19Hb29kc0NvZGVPclNlY3Rpb25OdW1iZXJfOiAnVm9jZSB7eyBHb29kc0NvZGVPclNlY3Rpb25OdW1iZXIgfX0nLFxyXG4gICAgSGVhZGluZ3M6ICdWb2NpJyxcclxuXHJcbiAgICBTZWN0aW9uOiAnU2V6aW9uZScsXHJcbiAgICBTZWN0aW9uX251bWJlcl86ICdTZXppb25lIHt7IG51bWJlciB9fScsXHJcbiAgICBTZWN0aW9uX0dvb2RzQ29kZU9yU2VjdGlvbk51bWJlcl86ICdTZXppb25lIHt7IEdvb2RzQ29kZU9yU2VjdGlvbk51bWJlciB9fScsXHJcbiAgICBTZWN0aW9uczogJ1NlemlvbmknLFxyXG5cclxuICAgIFN1YkNoYXB0ZXJfR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyXzogJ1NvdHRvY2FwaXRvbG8ge3sgR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyIH19JyxcclxuICAgIFxyXG4gICAgU3ViaGVhZGluZzogJ1NvdHRvdm9jZScsXHJcblxyXG4gICAgV2NvQ2xhc3NpZmljYXRpb25PcGluaW9uczogJ1BhcmVyaSBkaSBjbGFzc2lmaWNhIGRlbGxcXCdPTUQnLFxyXG4gICAgQ2xhc3NpZmljYXRpb25zOiAnQ2xhc3NpZmljYXppb25pJyxcclxuICAgIEV4cGxhbmF0b3J5Tm90ZXNGaXJzdExldHRlcjogJ0UnLFxyXG4gICAgRXhwbGFuYXRvcnlOb3RlczogJ05vdGUgRXNwbGljYXRpdmUnLFxyXG4gICAgRXhwbGFuYXRvcnlOb3Rlc0NuOiAnTm90ZSBFc3BsaWNhdGl2ZSBkZWxsYSBOQyBkZWxsXFwnVUUnLFxyXG4gICAgRXhwbGFuYXRvcnlOb3Rlc0hzOiAnTm90ZSBFc3BsaWNhdGl2ZSBkZWwgU0EgZGVsbFxcJ09NRCcsXHJcbiAgICBOb21lbmNsYXR1cmU6ICdOb21lbmNsYXR1cmEnLFxyXG4gICAgTm9tZW5jbGF0dXJlR3JvdXBzOiAnR3J1cHBpIGRpIG5vbWVuY2xhdHVyYScsXHJcbiAgICBOb21lbmNsYXR1cmVIZWFkaW5nczogJ05vbWVuY2xhdHVyYSAtIFZvY2knLFxyXG4gICAgTm9tZW5jbGF0dXJlSGVhZGluZ19jb2RlXzogJ05vbWVuY2xhdHVyYSAtIFZvY2Uge3sgY29kZSB9fScsXHJcblxyXG4gICAgU2VjdGlvbkFuZENoYXB0ZXJOb3RlczogJ05vdGUgZGkgc2V6aW9uaSBlIGRpIGNhcGl0b2xpJyxcclxufTsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJ1dHRvbnM6IHtcclxuICAgICAgICBDYW5jZWw6ICdDYW5jZWxsYScsXHJcbiAgICAgICAgQ2xvc2U6ICdDaGl1ZGknLFxyXG4gICAgICAgIENvbGxhcHNlQWxsOiAnUmlkdWNpIHR1dHRpJyxcclxuICAgICAgICBEZWxldGU6ICdFbGltaW5hJyxcclxuICAgICAgICBEb3dubG9hZDogJ1NjYXJpY2EnLFxyXG4gICAgICAgIERvd25sb2FkUERGOiAnU2NhcmljYSBQREYnLFxyXG4gICAgICAgIEVtcHR5Rm9ybTogJ1N2dW90YSBtb2R1bG8nLFxyXG4gICAgICAgIEV4cGFuZEFsbDogJ0VzcGFuZGkgdHV0dGknLFxyXG4gICAgICAgIE5vOiAnTm8nLFxyXG4gICAgICAgIE9LOiAnT0snLFxyXG4gICAgICAgIE9wZW5QREY6ICdBcHJpIFBERicsXHJcbiAgICAgICAgUHJpbnQ6ICdTdGFtcGEnLFx0XHJcbiAgICAgICAgU2F2ZTogJ1NhbHZhJyxcclxuICAgICAgICBTZWFyY2g6ICdDZXJjYScsXHJcbiAgICAgICAgWWVzOiAnU8OsJyxcclxuICAgIH0sXHJcbiAgICBjYWxlbmRhcjoge1xyXG4gICAgICAgIENsZWFyOiAnU3Z1b3RhJyxcclxuICAgICAgICBPSzogJ09LJyxcclxuICAgICAgICBUb2RheTogJ09nZ2knXHJcbiAgICB9LFxyXG4gICAgcGxhY2Vob2xkZXJzOiB7XHJcbiAgICAgICAgRW50ZXJDb21tb2RpdHlDb2RlOiAnSW5zZXJpc2NpIGlsIGNvZGljZSBub21lbmNsYXR1cmEnLFxyXG4gICAgICAgIFNlYXJjaDogJ0NlcmNhJyxcclxuICAgICAgICBTZWFyY2hCeUNvdW50cnlOYW1lT3JDb2RlOiAnQ2VyY2EgcGVyIG5vbWUgbyBjb2RpY2UgZGVsIHBhZXNlJyxcclxuICAgICAgICBTZWFyY2hJblRleHQ6ICdDZXJjYSBuZWwgdGVzdG8nLFxyXG4gICAgfSxcclxuICAgIHRyYW5zbGF0aW9uOiB7XHJcbiAgICAgICAgU2hvd09yaWdpbmFsOiAnTW9zdHJhIG9yaWdpbmFsZScsXHJcbiAgICAgICAgVHJhbnNsYXRlOiAnVHJhZHVjaScsXHJcbiAgICB9LFxyXG5cclxuICAgIEFzY2VuZGluZzogJ0NyZXNjZW50ZScsIC8vIGFzIGluIGRpcmVjdGlvbiBvZiBzb3J0IG9yZGVyXHJcbiAgICBEZXNjZW5kaW5nOiAnRGVzY3Jlc2NlbnRlJywgLy8gYXMgaW4gZGlyZWN0aW9uIG9mIHNvcnQgb3JkZXJcclxuICAgIFxyXG4gICAgQ291bnRyeTogJ1BhZXNlJyxcclxuICAgIERhdGU6ICdEYXRhJyxcclxuICAgIERhdGVGcm9tOiAnRGF0YSBkYScsXHJcbiAgICBEYXRlVG86ICdEYXRhIGEnLFxyXG4gICAgRGVzY3JpcHRpb246ICdEZXNjcml6aW9uZScsXHJcbiAgICBcclxuICAgIGZhdm9yaXRlOiAnUHJlZmVyaXRvJyxcclxuICAgIGZhdm9yaXRlczogJ1ByZWZlcml0aScsXHJcbiAgICBcclxuICAgIF9jb3VudF9mb3VuZDogJ3t7IGNvdW50IH19IHJpc3VsdGF0aSB0cm92YXRpJywgLy8gTkI6IGNvdW50IGlzIGEgbnVtYmVyXHJcbiAgICBMb2FkaW5nOiAnQ2FyaWNhbmRvJyxcclxuICAgIE1vcmVOZXdzOiAnQWx0cmUgbm90aXppZScsXHJcbiAgICBOZXdzOiAnTm90aXppZScsXHJcbiAgICBOb1Jlc3VsdHM6ICdOZXNzdW4gcmlzdWx0YXRvJyxcclxuICAgIFxyXG4gICAgTm86ICdObycsIC8vIGFzIGluICdmYWxzZSdcclxuICAgIFllczogJ1PDrCcsIC8vIGFzIGluICd0cnVlJ1xyXG5cclxuICAgIFF1ZXJ5OiAnUXVlcnknLFxyXG4gICAgUmVtZW1iZXI6ICdSaWNvcmRhJywgLy8gYXMgaW4gJ3JlbWVtYmVyIG15IGNob2ljZSdcclxuICAgIFRleHRTZWFyY2g6ICdSaWNlcmNhIHRlc3RvJyxcclxuICAgIFNlYXJjaFRlcm06ICdSaWNlcmNhJyxcclxuICAgIFxyXG4gICAgT3JkZXJCeTogJ09yZGluYSBwZXInLFxyXG4gICAgT3JkZXJEaXJlY3Rpb246ICdEaXJlemlvbmUnLFxyXG4gICAgU2hvd1Jlc3VsdHNBczogJ01vc3RyYSBjb21lJywgLy8gc2hvdyBhcyBpbWFnZXMgb3IgbGlzdFxyXG4gICAgTGlzdDogJ0xpc3RhJywgLy8gYXMgaW4gJ3Nob3cgYXMgYSBsaXN0JyAoYXMgb3Bwb3NlZCB0byAnc2hvdyBhcyBpbWFnZXMnKVxyXG4gICAgSW1hZ2VzOiAnSW1tYWdpbmknLCAvLyBhcyBpbiAncGljdHVyZXMsIHNob3cgYXMgaW1hZ2VzJ1xyXG4gICAgU291cmNlOiAnRm9udGUnLCAvLyBBcyBpbiAnU291cmNlIG9mIHRoZSBpbmZvcm1hdGlvbidcclxuICAgIFRvdGFsOiAnVG90YWxlJywgLy8gYXMgaW4gJ3RvdGFsIGFtb3VudCBvZiB0aGUgY2FsY3VsYXRpb24nXHJcbiAgICBWYWxpZGl0eVBlcmlvZDogJ1BlcmlvZG8gZGkgdmFsaWRpdMOgJyxcclxuICAgIFZhbGlkRnJvbTogJ1ZhbGlkbyBkYScsXHJcbiAgICBWYWxpZFRvOiAnVmFsaWRvIGEnLFxyXG4gICAgVmFsaWRpdHlTdGFydERhdGU6ICdEYXRhIGluaXppbyB2YWxpZGl0w6AnLFxyXG4gICAgVmFsaWRpdHlFbmREYXRlOiAnRGF0YSBmaW5lIHZhbGlkaXTDoCcsXHJcbiAgICBTdGFydERhdGU6ICdEYXRhIGRpIGluaXppbycsXHJcbiAgICBFbmREYXRlOiAnRGF0YSBkaSBmaW5lJyxcclxuXHJcbn07XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgLy8gZXJyb3JNZXNzYWdlczoge1xyXG4gICAgLy8gICAgIEVycm9yRXZhbHVhdGluZ0NvbmRpdGlvbjogJ0Vycm9yIGV2YWx1YXRpbmcgbWVhc3VyZSBjb25kaXRpb24nXHJcbiAgICAvLyB9LFxyXG4gICAgbWVhc3VyZUNvbmRpdGlvbnM6IHtcclxuICAgICAgICBBY3Rpb246ICdBemlvbmUnLFxyXG4gICAgICAgIEFtb3VudDogJ1F1YW50aXTDoCcsXHJcbiAgICAgICAgQ29uZGl0aW9uOiAnQ29uZGl6aW9uZScsIC8vIEFzIGluIG1lYXN1cmUgY29uZGl0aW9uIC0gY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGZvciBhIG1lYXN1cmUgdG8gYmUgYXBwbGljYWJsZSBhbmQvb3IgaW1wb3J0L2V4cG9ydCB0byBiZSBhbGxvd2VkXHJcbiAgICAgICAgRGVzY3JpcHRpb246ICdEZXNjcml6aW9uZScsXHJcbiAgICAgICAgRHV0eVJhdGU6ICdJbXBvcnRvJyxcclxuICAgICAgICBub0FjdGlvbjogJy0nLCAvLyAnbm9uZS9wb3NpdGl2ZScsXHJcbiAgICAgICAgbm9DZXJ0aWZpY2F0ZTogJy0nIC8vICdub25lJ1xyXG4gICAgfSxcclxuICAgIG1lYXN1cmVTZXJpZXM6IHtcclxuICAgICAgICBBZGRpdGlvbmFsRHV0aWVzOiAnRGF6aSBhZGRpemlvbmFsaScsXHJcbiAgICAgICAgQW50aUR1bXBpbmdNZWFzdXJlczogJ0RhemkgYW50aWR1bXBpbmcgbyBjb21wZW5zYXRpdmknLFxyXG4gICAgICAgIER1dGllczogJ0RhemkgYXBwbGljYWJpbGknLFxyXG4gICAgICAgIE5hdGlvbmFsVGF4ZXM6ICdJbXBvc3RlIG5hemlvbmFsaScsXHJcbiAgICAgICAgT3RoZXJNZWFzdXJlczogJ0FsdHJlIG1pc3VyZScsXHJcbiAgICAgICAgUHJvaGliaXRpb25zOiAnUHJvaGliaXppb25pJyxcclxuICAgICAgICBSZWZlcmVuY2VQcmljZXM6ICdQcmV6em8gdW5pdGFyaW8sIHZhbG9yZSBmb3JmZXR0YXJpbywgcHJlenpvIHJhcHByZXNlbnRhdGl2bycsXHJcbiAgICAgICAgUmVzdGl0dXRpb25zOiAnUmVzdGl0dXppb25pJyxcclxuICAgICAgICBSZXN0cmljdGlvbnNBbmRDb250cm9sczogJ1Jlc3RyaXppb25pIGUgY29udHJvbGxpJyxcclxuICAgICAgICBTdXBwbGVtZW50YXJ5QW1vdW50czogJ0ltcG9ydG8gc3VwcGxlbWVudGFyZScsXHJcbiAgICAgICAgU3VwcGxlbWVudGFyeVVuaXQ6ICdVbml0w6Agc3VwcGxlbWVudGFyaScsXHJcbiAgICAgICAgVmF0UmF0ZXM6ICdJVkEnLFxyXG4gICAgfSxcclxuICAgIHJlZmVyZW5jZUNvdW50cmllczoge1xyXG4gICAgICAgIEJFOiAnQmVsZ2lvJyxcclxuICAgICAgICBDSDogJ1N2aXp6ZXJhJyxcclxuICAgICAgICBERTogJ0dlcm1hbmlhJyxcclxuICAgICAgICBFVTogJ1VuaW9uZSBFdXJvcGVhJyxcclxuICAgICAgICBHQjogJ1JlZ25vIFVuaXRvJyxcclxuICAgICAgICBJVDogJ0l0YWxpYScsXHJcbiAgICAgICAgTkw6ICdQYWVzaSBCYXNzaSdcclxuICAgIH0sXHJcbiAgICB0cmFkZU1vdmVtZW50czoge1xyXG4gICAgICAgIEFsbDogJ1R1dHRpJyxcclxuICAgICAgICBFeHBvcnQ6ICdFc3BvcnRhemlvbmUnLFxyXG4gICAgICAgIEltcG9ydDogJ0ltcG9ydGF6aW9uZSdcclxuICAgIH0sXHJcbiAgICB1bml0VHlwZXM6IHtcclxuICAgICAgICBBcmVhOiAnQXJlYScsXHJcbiAgICAgICAgRW5lcmd5OiAnRW5lcmdpYScsXHJcbiAgICAgICAgR3Jvc3NXZWlnaHQ6ICdQZXNvIGxvcmRvJyxcclxuICAgICAgICBJdGVtczogJ051bWVybyBkaSBwZXp6aScsXHJcbiAgICAgICAgTGVuZ3RoOiAnTHVuZ2hlenphJyxcclxuICAgICAgICBOZXRXZWlnaHQ6ICdQZXNvIG5ldHRvJyxcclxuICAgICAgICBQYWlyczogJ051bWVybyBkaSBwYWlhJyxcclxuICAgICAgICBQb3dlcjogJ1BvdGVuemEnLCAvLyBBcyBpbiBlbGVjdHJpY2FsIHBvd2VyXHJcbiAgICAgICAgVm9sdW1lOiAnVm9sdW1lJyxcclxuICAgICAgICBXZWlnaHQ6ICdQZXNvJ1xyXG4gICAgfSxcclxuICAgIEFkZENlcnRpZmljYXRlQ29kZTogJ0FnZ2l1bmdpIGNvZGljZSBkaSBjZXJ0aWZpY2F0bycsXHJcbiAgICBBZGRpdGlvbmFsQ29kZTogJ0NvZGljZSBhZGRpemlvbmFsZScsXHJcbiAgICBBZGRpdGlvbmFsQ29kZXNWYWxpZGF0aW9uRXJyb3I6ICdFcnJvcmUgaW4gY29kaWNpIGFkZGl6aW9uYWxpJyxcclxuICAgIEFkZGl0aW9uYWxDb2RlVHlwZWFoZWFkUGxhY2Vob2xkZXI6ICdDZXJjYSBwZXIgY29kaWNlIGFkZGl6aW9uYWxlIG8gZGVzY3JpemlvbmUnLFxyXG4gICAgQWRkaXRpb25hbENvZGVNb2RhbFRpdGxlOiAnU2NlZ2xpIGNvZGljZSBhZGRpemlvbmFsZScsXHJcbiAgICBBZGRpdGlvbmFsQ29kZXM6ICdDb2RpY2kgYWRkaXppb25hbGknLFxyXG4gICAgLy8gTm9BZGRpdGlvbmFsQ29kZTogJ05vIEFkZGl0aW9uYWwgQ29kZScsXHJcbiAgICBOb0FkZGl0aW9uYWxDb2Rlc0ZvdW5kOiAnTmVzc3VuIGNvZGljZSBhZGRpemlvbmFsZSB0cm92YXRvJyxcclxuICAgIEFncmljdWx0dXJhbENvbXBvbmVudHM6ICdFbGVtZW50aSBhZ3JpY29saScsXHJcbiAgICBNZXVyc2luZ0FkZGl0aW9uYWxDb2RlUGxhY2VIb2xkZXI6ICdSaWNlcmNhIGNvZGljZSBhZGRpemlvbmFsZScsXHJcbiAgICAvLyBBdXRvbm9tb3VzVGFyaWZmU3VzcGVuc2lvbnNNZXNzYWdlOiAnUmVjb21tZW5kYXRpb246IG1ha2UgdXNlIG9mIHRoZSBBdXRvbm9tb3VzIFRhcmlmZiBTdXNwZW5zaW9uIHRoYXQgYXBwbGllcyBmb3IgdGhpcyBjb21tb2RpdHkgY29kZScsXHJcbiAgICBDYWxjdWxhdGVEdXR5OiAnQ2FsY29sYSBkYXppJyxcclxuICAgIENhbGN1bGF0ZUR1dHlBbmRUYXhlczogJ0NhbGNvbGEgZGF6aSBlIHRhc3NlJyxcclxuICAgIENlcnRpZmljYXRlOiAnQ2VydGlmaWNhdG8nLFxyXG4gICAgQ2VydGlmaWNhdGVDb2RlVHlwZWFoZWFkUGxhY2Vob2xkZXI6ICdDZXJjYSBwZXIgY29kaWNlIGRpIGNlcnRpZmljYXRvIG8gZGVzY3JpemlvbmUnLFxyXG4gICAgQ2VydGlmaWNhdGVDb2RlTW9kYWxUaXRsZTogJ1NjZWdsaSBjb2RpY2UgZGkgY2VydGlmaWNhdG8nLFxyXG4gICAgQ2VydGlmaWNhdGVDb2RlczogJ0NvZGljaSBkaSBjZXJ0aWZpY2F0bycsXHJcbiAgICAvLyBDaGVja01lYXN1cmVDb25kaXRpb25zOiAnQ2hlY2sgTWVhc3VyZSBDb25kaXRpb25zJywgLy8gY2hlY2sgYXMgaW4gdmVyaWZ5IGlmIGFsbCBvZiB0aGUgY29uZGl0aW9ucyBoYXZlIGJlZW4gbWV0XHJcbiAgICAvLyBjb25zdW1wdGlvblRheFdhcm5pbmc6ICdDb25zdW1wdGlvbiBUYXggKFZlcmJydWlrc2JlbGFzdGluZykgbWF5IGFwcGx5LCBpbiB3aGljaCBjYXNlIGEgTmF0aW9uYWwgQWRkaXRpb25hbCBDb2RlIGlzIHJlcXVpcmVkLiBCZWxvdyB5b3UgY2FuIHNlYXJjaCBmb3IgTmF0aW9uYWwgQWRkaXRpb25hbCBDb2Rlcy4nLFxyXG4gICAgQ291bnRyeU9mRGVzdGluYXRpb246ICdQYWVzZSBkaSBkZXN0aW5hemlvbmUnLFxyXG4gICAgQ291bnRyeU9mT3JpZ2luOiAnUGFlc2UgZGkgb3JpZ2luZScsXHJcbiAgICBDb3VudHJ5T3JSZWdpb246ICdQYWVzZSBvIHJlZ2lvbmUnLFxyXG4gICAgQ3VzdG9tc1ZhbHVlOiAnVmFsb3JlIGRvZ2FuYWxlJyxcclxuICAgIERlY2xhcmF0aW9uOiAnRGljaGlhcmF6aW9uZScsIC8vIEFzIGluICdDdXN0b21zIERlY2xhcmF0aW9uJ1xyXG4gICAgRGVjbGFyYXRpb25Db3VudHJ5OiAnUGFlc2UgZGkgZGljaGlhcmF6aW9uZScsIC8vIEFzIGluICdDb3VudHJ5IHdoZXJlIHRoZSBjdXN0b21zIGRlY2xhcmF0aW9uIGlzIGRvbmUnXHJcbiAgICBEZWNsYXJhdGlvbkRhdGU6ICdEYXRhIGRpIGRpY2hpYXJhemlvbmUnLCAvLyBBcyBpbiAnRGF0ZSBvZiBjdXN0b21zIGRlY2xhcmF0aW9uJ1xyXG4gICAgRGVzdGluYXRpb246ICdEZXN0aW5hemlvbmUnLCAvLyBBcyBpbiAnRGVzdGluYXRpb24gY291bnRyeSdcclxuICAgIC8vIER1dHlDYWxjdWxhdG9yOiAnRHV0eSBDYWxjdWxhdG9yJyxcclxuICAgIC8vIER1dHlDYWxjdWxhdGlvbkVycm9yczoge1xyXG4gICAgLy8gICAgIER1dHlNZWFzdXJlTm90VW5pcXVlRm9yUHJlZmVyZW5jZUNvZGU6ICdUaGUgZHV0eSBtZWFzdXJlIGlzIG5vdCB1bmlxdWUgZm9yIHRoZSBwcmVmZXJlbmNlIGNvZGUuIFNlbGVjdCBkdXR5IG1lYXN1cmUgd2l0aCBvciB3aXRob3V0IGVuZC11c2UuJyxcclxuICAgIC8vICAgICBIZWFkZXI6ICdEdXR5IENhbGN1bGF0aW9uIEVycm9yJyxcclxuICAgIC8vICAgICBJbnZhbGlkT3JNaXNzaW5nUXVhbnRpdHk6ICdJbnZhbGlkIG9yIG1pc3NpbmcgcXVhbnRpdHknLFxyXG4gICAgLy8gICAgIFVuc3VwcG9ydGVkRHV0eUV4cHJlc3Npb246ICdPbmUgb2YgdGhlIG1lYXN1cmVzIGZvciB0aGlzIGR1dHkgY2FsY3VsYXRpb24gY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgZHV0eSBleHByZXNzaW9uLidcclxuICAgIC8vIH0sXHJcbiAgICAvLyBEdXR5Q2FsY3VsYXRpb25SZXN1bHQ6ICdEdXR5IENhbGN1bGF0aW9uIFJlc3VsdCcsXHJcbiAgICBEdXR5TWVhc3VyZVR5cGU6ICdUaXBvIGRpIG1pc3VyYSBkZWwgZGF6aW8nLFxyXG4gICAgLy8gRXVMZWdpc2xhdGlvbjogJ0VVIExlZ2lzbGF0aW9uJyxcclxuICAgIGV4Y2w6ICdlc2NsdXNvJywgLy8gQXMgaW4gJ21lYXN1cmUgaXMgdmFsaWQgZm9yIGFsbCBjb3VudHJpZXMgZXhjbC4gY291bnRyeTEsIGNvdW50cnkyLi4uJ1xyXG4gICAgRXhjaXNlczogJ0FjY2lzZScsXHJcbiAgICAvLyBFeHBvcnRNZWFzdXJlczogJ0V4cG9ydCBNZWFzdXJlcycsXHJcbiAgICAvLyBleHBvcnRSZWZ1bmROb21lbmNsYXR1cmU6ICdFeHBvcnQgUmVmdW5kIE5vbWVuY2xhdHVyZScsXHJcbiAgICBGb290bm90ZTogJ05vdGEnLFxyXG4gICAgRm9vdG5vdGVzOiAnTm90ZScsXHJcbiAgICBHZW9ncmFwaGljYWxBcmVhOiAnQXJlYSBnZW9ncmFnaWNhJyxcclxuICAgIEdlb2dyYXBoaWNhbEFyZWFzOiAnQXJlZSBHZW9ncmFmaWNoZScsXHJcbiAgICAvLyBJbXBvcnRNZWFzdXJlczogJ0ltcG9ydCBNZWFzdXJlcycsXHJcbiAgICAvLyBJbmZvcm1hdGlvbkZvck9yZGVyTnVtYmVyOiAnSW5mb3JtYXRpb24gZm9yIE9yZGVyIE51bWJlcicsIC8vIE9yZGVyIE51bWJlciBvZiBUYXJpZmYgUXVvdGFcclxuICAgIC8vIExlZ2lzbGF0aW9uOiAnTGVnaXNsYXRpb24nLFxyXG4gICAgLy8gTGVnaXNsYXRpb25GaXJzdExldHRlcjogJ0wnLFxyXG4gICAgTWVhc3VyZTogJ01pc3VyYScsXHJcbiAgICBNZWFzdXJlczogJ01pc3VyZScsXHJcbiAgICAvLyBNZWFzdXJlc0ZvckV4cG9ydEZyb206ICdNZWFzdXJlcyBmb3IgZXhwb3J0IGZyb20nLFxyXG4gICAgLy8gTWVhc3VyZXNGb3JJbXBvcnRJbnRvOiAnTWVhc3VyZXMgZm9yIGltcG9ydCBpbnRvJyxcclxuICAgIC8vIE1lYXN1cmVzVmFsaWRPbjogJ01lYXN1cmVzIHZhbGlkIG9uJyxcclxuICAgIE1lYXN1cmVUeXBlVHlwZWFoZWFkUGxhY2Vob2xkZXI6ICdDZXJjYSB0aXBvIGRpIG1pc3VyYScsXHJcbiAgICBNZWFzdXJlVHlwZU1vZGFsVGl0bGU6ICdTY2VnbGkgdGlwbyBkaSBtaXN1cmEnLFxyXG4gICAgTmF0aW9uYWxBZGRpdGlvbmFsQ29kZTogJ0NvZGljZSBhZGRpemlvbmFsZSBuYXppb25hbGUnLFxyXG4gICAgbm9DZXJ0aWZpY2F0ZXNGb3VuZDogJ05lc3N1biBjb2RpY2UgZGkgY2VydGlmaWNhdG8gdHJvdmF0bycsXHJcbiAgICBub0Zvb3Rub3Rlc0ZvdW5kOiAnTmVzc3VuYSBub3RhIHRyb3ZhdGEnLFxyXG4gICAgbm9NZWFzdXJlc0ZvdW5kOiAnTmVzc3VuYSBtaXN1cmEgdHJvdmF0YScsXHJcbiAgICAvLyBub1Jlc3VsdHNGb3JDb21tb2RpdHlDb2Rlc0luUGVyaW9kOiAnTm8gUmVzdWx0cyBmb3IgdGhlIGNob3NlbiBjb21tb2RpdHkgY29kZXMgaW4gdGhlIGNob3NlbiBwZXJpb2QnLFxyXG4gICAgLy8gT3B0aW9uYWxOYXRpb25hbEFkZGl0aW9uYWxDb2RlOiAnT3B0aW9uYWwgbmF0aW9uYWwgYWRkaXRpb25hbCBjb2RlJyxcclxuICAgIE9yaWdpbjogJ09yaWdpbmUnLCAvLyBBcyBpbiAnQ291bnRyeSBvZiBPcmlnaW4nXHJcbiAgICAvLyBPdGhlckNob2ljZXM6ICdPdGhlciBDaG9pY2VzJywgLy8gSGVhZGVyIGZvciBwcmludCB2ZXJzaW9uLCBzaG93aW5nIG90aGVyIGNob2ljZXMgdGhlIHVzZXIgaGFzIG1hZGUgdG8gZmlsdGVyIG1lYXN1cmVzIChlLmcuIHJlZmVyZW5jZSBkYXRlIGFuZCByZWZlcmVuY2UgY291bnRyeSlcclxuICAgIFByZWZlcmVuY2VDb2RlOiAnQ29kaWNlIHByZWZlcmVuemEnLFxyXG4gICAgLy8gUHJlZmVyZW5jZUNvZGVEaXNwbGF5TGFiZWw6ICdQcmVmZXJlbmNlIGNvZGVzIGRpc3BsYXknLCAvLyBkaXNwbGF5IHByZWZlcmVuY2UgY29kZXMgdGhhdCBhcmUgdmFsaWQgZm9yIGRlY2xhcmF0aW9ucyB1bmRlciBVQ0Mgb3IgZm9yIGRlY2xhcmF0aW9ucyBpbiB0aGUgc2l0dWF0aW9uIGJlZm9yZSBVQ0M/XHJcbiAgICBQcmVmZXJlbmNlQ29kZURpc3BsYXlMYWJlbFByZVVjYzogJ1ByZS1DRFUnLCAvLyBVQ0MgYXMgaW4gVW5pb24gQ3VzdG9tcyBDb2RlXHJcbiAgICBQcmVmZXJlbmNlQ29kZURpc3BsYXlMYWJlbFVjYzogJ0NEVScsIC8vIFVDQyBhcyBpbiBVbmlvbiBDdXN0b21zIENvZGVcclxuICAgIFByZWZlcmVuY2VDb2RlVHlwZWFoZWFkUGxhY2Vob2xkZXI6ICdDZXJjYSBwZXIgY29kaWNlIG8gZGVzY3JpemlvbmUnLFxyXG4gICAgUHJlZmVyZW5jZUNvZGVNb2RhbFRpdGxlOiAnU2NlZ2xpIGNvZGljZSBwcmVmZXJlbnphJyxcclxuICAgIC8vIEVuZFVzZU1lYXN1cmVJc0FsbG93ZWRXaXRoUHJvY2VkdXJlQ29kZTQ0OiAnVGhlIGVuZC11c2UgbWVhc3VyZSBpcyBhbGxvd2VkIHdpdGggY3VzdG9tcyBwcm9jZWR1cmUgNDQgXCJFbmQtdXNlXCInLFxyXG4gICAgUHJlZmVycmVkRHV0eVRyZWF0bWVudDogJ1RyYXR0YW1lbnRvIGRvZ2FuYWxlJyxcclxuICAgIFF1YW50aXR5OiAnUXVhbnRpdMOgJyxcclxuICAgIC8vIFF1b3RhT3JkZXJOdW1iZXI6ICdRdW90YSBPcmRlciBOdW1iZXInLFxyXG4gICAgLy8gUXVvdGFPcmRlck51bWJlclR5cGVhaGVhZFBsYWNlaG9sZGVyOiAnRW50ZXIgcXVvdGEgb3JkZXIgbnVtYmVyJyxcclxuICAgIC8vIFJlZmVyZW5jZUxpc3RzOiAnUmVmZXJlbmNlIGxpc3RzJyxcclxuICAgIFJlZ2lvbnM6ICdSZWdpb25pJyxcclxuICAgIC8vIFJldGFpbFByaWNlOiAnUmV0YWlsIFByaWNlJyxcclxuICAgIC8vIFNlYXJjaEJ5Q29kZU9yRGVzY3JpcHRpb246ICdTZWFyY2ggYnkgY29kZSBvciBkZXNjcmlwdGlvbicsXHJcbiAgICAvLyBTaG93UXVvdGFJbmZvcm1hdGlvbjogJ1Nob3cgUXVvdGEgSW5mb3JtYXRpb24nLFxyXG4gICAgLy8gVGF4ZXM6ICdUYXhlcycsXHJcbiAgICBWYWx1ZTogJ1ZhbG9yZScsXHJcbiAgICAvLyBWYWxpZGF0ZURlY2xhcmF0aW9uOiAnVmFsaWRhdGUgRGVjbGFyYXRpb24nLFxyXG4gICAgLy8gVmF0QW5kRXhjaXNlRXRjZXRlcmE6ICdWQVQsIEV4Y2lzZSwgU3RvcmFnZSBhbmQgQ29uc3VtcHRpb24gVGF4JyxcclxuICAgIFZBVDogJ0lWQSdcclxufTsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGFjY291bnQ6IHJlcXVpcmUoJy4vYWNjb3VudCcpLFxyXG4gICAgYnRpOiByZXF1aXJlKCcuL2J0aScpLFxyXG4gICAgYXRyOiByZXF1aXJlKCcuL2F0cicpLFxyXG4gICAgY2FzZUxhdzogcmVxdWlyZSgnLi9jYXNlLWxhdycpLFxyXG4gICAgY2xhc3NpZmljYXRpb25SZWd1bGF0aW9uOiByZXF1aXJlKCcuL2NsYXNzaWZpY2F0aW9uLXJlZ3VsYXRpb24nKSxcclxuICAgIGNvbXBsaWFuY2U6IHJlcXVpcmUoJy4vY29tcGxpYW5jZScpLFxyXG4gICAgY29uY2x1c2lvbjogcmVxdWlyZSgnLi9jb25jbHVzaW9uJyksXHJcbiAgICBjb3JyZWxhdGlvblRhYmxlOiByZXF1aXJlKCcuL2NvcnJlbGF0aW9uLXRhYmxlJyksXHJcbiAgICBjdXN0b21zVmFsdWU6IHJlcXVpcmUoJy4vY3VzdG9tcy12YWx1ZScpLFxyXG4gICAgY3VzdG9tc1ZhbHVlQ2hlY2s6IHJlcXVpcmUoJy4vY3VzdG9tcy12YWx1ZS1jaGVjaycpLFxyXG4gICAgZGFzaGJvYXJkOiByZXF1aXJlKCcuL2Rhc2hib2FyZCcpLFxyXG4gICAgZG9jdW1lbnRhdGlvbjogcmVxdWlyZSgnLi9kb2N1bWVudGF0aW9uJyksXHJcbiAgICBleGNoYW5nZVJhdGVzOiByZXF1aXJlKCcuL2V4Y2hhbmdlLXJhdGVzJyksXHJcbiAgICBlenQ6IHJlcXVpcmUoJy4vZXp0JyksXHJcbiAgICBmb3JtTGFiZWxzOiByZXF1aXJlKCcuL2Zvcm0tbGFiZWxzJyksXHJcbiAgICBlY2ljczogcmVxdWlyZSgnLi9lY2ljcycpLFxyXG4gICAgZ29vZHM6IHJlcXVpcmUoJy4vZ29vZHMnKSxcclxuICAgIG1haW5NZW51OiByZXF1aXJlKCcuL21haW4tbWVudScpLFxyXG4gICAgbmV3czogcmVxdWlyZSgnLi9uZXdzJyksXHJcbiAgICBub21lbmNsYXR1cmU6IHJlcXVpcmUoJy4vbm9tZW5jbGF0dXJlJyksXHJcbiAgICBxdW90YTogcmVxdWlyZSgnLi9xdW90YScpLFxyXG4gICAgcmVmZXJlbmNlcHJpY2VzOiByZXF1aXJlKCcuL3JlZmVyZW5jZXByaWNlcycpLFxyXG4gICAgcmVndWxhdGlvbjogcmVxdWlyZSgnLi9yZWd1bGF0aW9uJyksXHJcbiAgICBzZWFyY2g6IHJlcXVpcmUoJy4vc2VhcmNoJyksXHJcbiAgICBzaGFyZWQ6IHtcclxuICAgICAgICBtZXNzYWdlczogcmVxdWlyZSgnLi9zaGFyZWQtbWVzc2FnZXMnKSxcclxuICAgICAgICB1aTogcmVxdWlyZSgnLi9zaGFyZWQtdWknKSxcclxuICAgIH0sXHJcbiAgICBzb3J0T3B0aW9uczogcmVxdWlyZSgnLi9zb3J0LW9wdGlvbnMnKSxcclxuICAgIHN0YXR1czogcmVxdWlyZSgnLi9zdGF0dXMnKSxcclxuICAgIHRhcmljOiByZXF1aXJlKCcuL3RhcmljJyksXHJcbiAgICB0cmFkZVN0YXRpc3RpY3M6IHJlcXVpcmUoJy4vdHJhZGUtc3RhdGlzdGljcycpLFxyXG4gICAgdmFsaWRhdGVCdXNpbmVzc0luZm86IHJlcXVpcmUoJy4vdmFsaWRhdGUtYnVzaW5lc3MtaW5mbycpLCAgICBcclxuICAgIHZhbGlkYXRpb25FcnJvcnM6IHJlcXVpcmUoJy4vdmFsaWRhdGlvbi1lcnJvcnMnKSxcclxufTtcclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjaGFuZ2VQYXNzd29yZDoge1xyXG4gICAgICAgIGNoYW5nZVBhc3N3b3JkOiAnV2FjaHR3b29yZCB2ZXJhbmRlcmVuJyxcclxuICAgICAgICBjdXJyZW50UGFzc3dvcmQ6ICdIdWlkaWcgd2FjaHR3b29yZCcsXHJcbiAgICAgICAgZXJyb3JDdXJyZW50UGFzc3dvcmQ6ICdIZXQgaHVpZGlnZSB3YWNodHdvb3JkIGlzIG5pZXQgaW5nZXZ1bGQnLFxyXG4gICAgICAgIGVycm9yTmV3UGFzc3dvcmRFbXB0eTogJ0hldCBuaWV1d2Ugd2FjaHR3b29yZCBpcyBuaWV0IGluZ2V2dWxkJyxcclxuICAgICAgICBlcnJvck5ld1Bhc3N3b3JkQ29tcGFyZTogJ0RlIG5pZXV3ZSB3YWNodHdvb3JkZW4ga29tZW4gbmlldCBvdmVyZWVuJyxcclxuICAgICAgICBuZXdQYXNzd29yZDE6ICdOaWV1dyB3YWNodHdvb3JkJyxcclxuICAgICAgICBuZXdQYXNzd29yZDI6ICdOaWV1dyB3YWNodHdvb3JkIGJldmVzdGlnZW4nLFxyXG4gICAgICAgIHBhc3N3b3JkQ2hhbmdlZFN1Y2Nlc3NmdWxseTogJ1dhY2h0d29vcmQgdmVyYW5kZXJkLicsXHJcbiAgICAgICAgZXJyb3JDaGFuZ2luZ1Bhc3N3b3JkOiAnRm91dCBiaWogaGV0IHZlcmFuZGVyZW4gdmFuIGhldCB3YWNodHdvb3JkLidcclxuICAgIH0sXHJcbiAgICBmb3Jnb3RQYXNzd29yZDoge1xyXG4gICAgICAgIGJhY2tUb0xvZ2luOiAnVGVydWcgbmFhciBkZSBsb2dpbnBhZ2luYScsXHJcbiAgICAgICAgZG9uZU1lc3NhZ2U6ICdXZSBoZWJiZW4gZWVuIGUtbWFpbCB2ZXJzdHV1cmQgbWV0IGluc3RydWN0aWVzIHZlcnN0dXVyZCBuYWFyIGhldCBhZHJlcyBkYXQgdmVyYm9uZGVuIGlzIGFhbiB1dyBhY2NvdW50LiBEZSBtYWlsIHpvdSBiaW5uZW4gZWVuIGFhbnRhbCBtaW51dGVuIG9udHZhbmdlbiBtb2V0ZW4gemlqbi4nLFxyXG4gICAgICAgIGV4cGxhbmF0aW9uOiAnVnVsIGFsc3R1YmxpZWZ0IHV3IGdlYnJ1aWtlcnNuYWFtIGluIGVuIHdpaiBzdHVyZW4gdSBlZW4gZS1tYWlsIG1ldCBkZSBpbnN0cnVjdGllcyBvbSBlZW4gbmlldXcgd2FjaHR3b29yZCBhYW4gdGUgbWFrZW4gdm9vciB1dyBhY2NvdW50JyxcclxuICAgICAgICBmb3Jnb3RQYXNzd29yZDogJ1dhY2h0d29vcmQgdmVyZ2V0ZW4/JyxcclxuICAgICAgICByZXNldFBhc3N3b3JkOiAnV2FjaHR3b29yZCByZXNldHRlbidcclxuICAgIH0sXHJcbiAgICBsb2dpbjoge1xyXG4gICAgICAgIGVycm9yOiAnR2VicnVpa2Vyc25hYW0gb2Ygd2FjaHR3b29yZCBvbmp1aXN0JyxcclxuICAgICAgICBsb2dJbjogJ0lubG9nZ2VuJyxcclxuICAgICAgICBwYXNzd29yZDogJ1dhY2h0d29vcmQnLFxyXG4gICAgICAgIHJlbWVtYmVyTWU6ICdIb3VkdCBtaWogaW5nZWxvZ2QnLFxyXG4gICAgICAgIHVzZXJuYW1lOiAnR2VicnVpa2Vyc25hYW0nXHJcbiAgICB9LFxyXG4gICAgbG9nb3V0OiB7XHJcbiAgICAgICAgc2lnbmVkT3V0OiAnVSBiZW50IHVpdGdlbG9nZCcsXHJcbiAgICAgICAgc2lnbmluZ091dDogJ1Ugd29yZHQgdWl0Z2Vsb2dkLi4uJyxcclxuICAgICAgICB0aXRsZTogJ1VpdGxvZ2dlbidcclxuICAgIH0sXHJcbiAgICByZXNldFBhc3N3b3JkOiB7XHJcbiAgICAgICAgYmFja1RvTG9naW46ICdUZXJ1ZyBuYWFyIGRlIGlubG9ncGFnaW5hJyxcclxuICAgICAgICBkb25lTWVzc2FnZTogJ1UgaGVidCBlZW4gbmlldXcgd2FjaHR3b29yZCBhYW5nZW1hYWt0LiBVIGt1bnQgZGl0IHdhY2h0d29vcmQgbnUgZ2VicnVpa2VuIG9tIGluIHRlIGxvZ2dlbiBvcCB1dyBUYXJpYyBTdXBwb3J0IGFjY291bnQuJyxcclxuICAgICAgICBlcnJvcnM6IHtcclxuICAgICAgICAgICAgZHluYW1pYzoge1xyXG4gICAgICAgICAgICAgICAgJ1BBU1NXT1JEX0lOVkFMSURfVE9LRU4nOiAnSGV0IHZlcnpvZWsgb20gZWVuIG5pZXV3IHdhY2h0d29vcmQgYWFuIHRlIG1ha2VuIGlzIHZlcmxvcGVuJyxcclxuICAgICAgICAgICAgICAgICdQQVNTV09SRF9JU0NVUlJFTlQnOiAnSGV0IHdhY2h0d29vcmQgZGF0IHUgaGVlZnQgaW5nZXZvZXJkIGJpaiBcXCdIdWlkaWcgd2FjaHR3b29yZFxcJyBpcyBuaWV0IHV3IGh1aWRpZ2Ugd2FjaHR3b29yZCcsXHJcbiAgICAgICAgICAgICAgICAnUEFTU1dPUkRfTUlOSU1VTV9MRU5HVEgnOiAnSGV0IHdhY2h0d29vcmQgbW9ldCBtaW5pbWFhbCA4IGthcmFrdGVycyBsYW5nIHppam4nLFxyXG4gICAgICAgICAgICAgICAgJ1BBU1NXT1JEX05PX0xPV0VSQ0FTRSc6ICdIZXQgd2FjaHR3b29yZCBiZXZhdCBnZWVuIGtsZWluZSBsZXR0ZXJzJyxcclxuICAgICAgICAgICAgICAgICdQQVNTV09SRF9OT19OT05BTFBIQSc6ICdIZXQgd2FjaHR3b29yZCBiZXZhdCBnZWVuIG5vbi1hbGZhbnVtZXJpZWtlIGthcmFrdGVycycsXHJcbiAgICAgICAgICAgICAgICAnUEFTU1dPUkRfTk9fTlVNQkVSUyc6ICdIZXQgd2FjaHR3b29yZCBiZXZhdCBnZWVuIG51bW1lcnMnLFxyXG4gICAgICAgICAgICAgICAgJ1BBU1NXT1JEX05PX1VQUEVSQ0FTRSc6ICdIZXQgd2FjaHR3b29yZCBoZWVmdCBnZWVuIGhvb2ZkbGV0dGVycycsXHJcbiAgICAgICAgICAgICAgICAnUEFTU1dPUkRfRU1QVFknOiAnVnVsIGFsc3R1YmxpZWZ0IGVlbiB3YWNodHdvb3JkIGluJyxcclxuICAgICAgICAgICAgICAgICdQQVNTV09SRFNfTk9URVFVQUwnOiAnRGUgd2FjaHR3b29yZGVuIGRpZSB1IGhlZWZ0IGluZ2V2dWxkIGtvbWVuIG5pZXQgb3ZlcmVlbidcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXhwbGFuYXRpb246ICdVIHN0YWF0IG9wIGhldCBwdW50IG9tIGVlbiBuaWV1dyB3YWNodHdvb3JkIGFhbiB0ZSBtYWtlbiB2b29yIHV3IGFjY291bnQuIFV3IG5pZXV3ZSB3YWNodHdvb3JkIG1vZXQgbWluaW1hYWwgOCBrYXJha3RlcnMgbGFuZyB6aWpuIGVuIG1vZXQgZWVuIGNvbWJpbmF0aWUgdmFuIGhvb2ZkLSBlbiBrbGVpbmUgbGV0dGVycywgbnVtbWVycyBlbiBub24tYWxmYW51bWVyaWVrZSBrYXJha3RlcnMgYmV2YXR0ZW4nLFxyXG4gICAgICAgIGludmFsaWRUb2tlbjogJ1V3IGxpbmsgb20gZWVuIG5pZXV3IHdhY2h0d29vcmQgYWFuIHRlIG1ha2VuIGlzIHZlcmxvcGVuLiBHZW5lcmVlciBlZW4gbmlldXdlIGxpbmsgZG9vciBoZXQgXFwnd2FjaHR3b29yZCB2ZXJnZXRlblxcJyBmb3JtdWxpZXIgb3BuaWV1dyBpbiB0ZSB2dWxsZW4nLFxyXG4gICAgICAgIHBhc3N3b3JkMTogJ05pZXV3IHdhY2h0d29vcmQnLFxyXG4gICAgICAgIHBhc3N3b3JkMjogJ05vZ21hYWxzIGhldCBuaWV1d2Ugd2FjaHR3b29yZCcsXHJcbiAgICAgICAgcmVzZXRQYXNzd29yZDogJ01hYWsgZWVuIG5pZXV3IHdhY2h0d29vcmQnLFxyXG4gICAgICAgIHN0cmVuZ3RoOiB7XHJcbiAgICAgICAgICAgICdjaGFyYWN0ZXJzJzogJzgga2FyYWt0ZXJzJyxcclxuICAgICAgICAgICAgJ2xvd2VyY2FzZSc6ICdNaW5pbWFhbCBlZW4ga2xlaW5lIGxldHRlcicsXHJcbiAgICAgICAgICAgICdub25hbHBoYSc6ICdNaW5pbWFhbCBlZW4gbm9uLWFsZmFudW1lcmllayBrYXJha3RlcicsXHJcbiAgICAgICAgICAgICdudW1iZXInOiAnTWluaW1hYWwgZWVuIGdldGFsJyxcclxuICAgICAgICAgICAgJ29uZU9mRm91cic6ICdWb2xkb2UgYWFuIDMgdmFuIGRlIHZvbGdlbmRlIDQgdm9vcndhYXJkZW46JyxcclxuICAgICAgICAgICAgJ3VwcGVyY2FzZSc6ICdNaW5pbWFhbCBlZW4gaG9vZmRsZXR0ZXInLFxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIEFUUnM6ICdBVFJcXCdzJyxcclxuICAgIEF0clJlZmVyZW5jZTogJ051bW1lciBBVFInLFxyXG4gICAgYXR0YWNobWVudHM6ICdCaWpsYWdlbicsXHJcbiAgICBjb21tb2RpdHlEZXNjcmlwdGlvbjogJ09tc2NocmlqdmluZyBnb2VkZXJlbicsXHJcbiAgICBjb3B5RGVzY3JpcHRpb246ICdEZXplIGluZm9ybWF0aWUgaXMgZWVuIGtvcGllIHZhbiBkZSBpbmZvcm1hdGllIGluIGRlIEFUUi1kYXRhYmFzZS4nLFxyXG4gICAgZGV0YWlsczogJ0RldGFpbHMgQVRSJyxcclxuICAgIGF0ckxpbmtUZXh0OiAnS2xpayBoaWVyIG9tIGRlIG1lZXN0IHVwLXRvLWRhdGUgdmVyc2llIHRlIGJla2lqa2VuIGluIGRlemUgZGF0YWJhc2UuJyxcclxuICAgIEFkdmFuY2VUYXJpZmZSdWxpbmdzOiAnQWR2YW5jZSBUYXJpZmYgUnVsaW5ncycsXHJcbiAgICBnb29kc0Rlc2NyaXB0aW9uOiAnT21zY2hyaWp2aW5nIHZhbiBkZSBnb2VkZXJlbicsXHJcbiAgICBpc3N1ZWRTaW5jZTogJ0FmZ2VnZXZlbiBzaW5kcycsXHJcbiAgICBLZXl3b3JkczogJ1NsZXV0ZWx3b29yZGVuJyxcclxuICAgIG1vdGl2YXRpb246ICdNb3RpdmVyaW5nIHZvb3IgZGUgaW5kZWxpbmcnLFxyXG4gICAgTk9JTUFHRTogJ0dFRU4gQUZCRUVMRElOR0VOJyxcclxuICAgIG5vTG9uZ2VyVmFsaWQ6ICdEZXplIEFUUiBpcyBuaWV0IG1lZXIgZ2VsZGlnIGVuIGlzIGRhYXJvbSBuaWV0IGxhbmdlciBiZXNjaGlrYmFhciBpbiBkZSBBVFItZGF0YWJhc2UuJyxcclxuICAgIG5vdFZhbGlkT25fcmVmZXJlbmNlRGF0ZV86ICduaWV0IGdlbGRpZyBvcCB7eyByZWZlcmVuY2VEYXRlIHwgZGF0ZTogXFwnZGQtTU0teXlcXCcgfX0nLFxyXG4gICAgcG9zc2libHlJbnZhbGlkOiAnTkI6IGluIHNvbW1pZ2UgZ2V2YWxsZW4ga2FuIGVlbiBBVFIgdm9vciBoZXQgYWZsb3BlbiB2YW4gZGUgbm9ybWFsZSBnZWxkaWdoZWlkc2R1dXIgaW5nZXRyb2trZW4gd29yZGVuLiBIZXQgaXMgZGFhcm9tIG1vZ2VsaWprIGRhdCBkZXplIEFUUiBvbmRlcnR1c3NlbiBuaWV0IG1lZXIgZ2VsZGlnIGlzLicsXHJcbiAgICBTZWFyY2hBZHZhbmNlVGFyaWZmUnVsaW5nczogJ1pvZWsgQWR2YW5jZSBUYXJpZmYgUnVsaW5ncycsXHJcbiAgICBfU3RhcnREYXRlX3VudGlsX0V4cGlyeURhdGVfOiAne3sgU3RhcnREYXRlIHwgZGF0ZTogXFwnZGQtTU0teXl5eVxcJyB9fSB0L20ge3sgRXhwaXJ5RGF0ZSB8IGRhdGU6IFxcJ2RkLU1NLXl5eXlcXCcgfX0nXHJcbn07XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgQmluZGluZ1RhcmlmZkluZm9ybWF0aW9uOiAnQmluZGVuZGUgVGFyaWVmaW5saWNodGluZ2VuJyxcclxuICAgIEJ0aUZpcnN0TGV0dGVyOiAnQicsXHJcbiAgICBCdGlzOiAnQlRJXFwncycsXHJcbiAgICBCdGlSZWZlcmVuY2U6ICdCVEktcmVmZXJlbnRpZScsXHJcbiAgICBjb3B5RGVzY3JpcHRpb246ICdEZXplIGluZm9ybWF0aWUgaXMgZWVuIGtvcGllIHZhbiBkZSBpbmZvcm1hdGllIGluIGRlIEVCVEktZGF0YWJhc2UgdmFuIGRlIEVVLicsXHJcbiAgICBjb3VudHJ5T2ZPcmlnaW46ICdMYW5kIHZhbiBhZmdpZnRlIC8gVGFhbCcsXHJcbiAgICBkYXRlQW5kUGxhY2VPZklzc3VlOiAnRGF0dW0gZW4gcGxhYXRzIHZhbiBhZmdpZnRlJyxcclxuICAgIGRldGFpbHM6ICdEZXRhaWxzIEJUSScsXHJcbiAgICBlYnRpTGlua1RleHQ6ICdLbGlrIGhpZXIgb20gZGUgbWVlc3QgdXAtdG8tZGF0ZSB2ZXJzaWUgdGUgYmVraWprZW4gaW4gZGV6ZSBkYXRhYmFzZS4nLFxyXG4gICAgRXVyb3BlYW5CaW5kaW5nVGFyaWZmSW5mb3JtYXRpb246ICdFdXJvcGVzZSBCaW5kZW5kZSBUYXJpZWZpbmxpY2h0aW5nZW4nLFxyXG4gICAgZ29vZHNEZXNjcmlwdGlvbjogJ09tc2NocmlqdmluZyB2YW4gZGUgZ29lZGVyZW4nLFxyXG4gICAgaXNzdWVkU2luY2U6ICdBZmdlZ2V2ZW4gc2luZHMnLFxyXG4gICAgS2V5d29yZHM6ICdTbGV1dGVsd29vcmRlbicsXHJcbiAgICBtb3RpdmF0aW9uOiAnTW90aXZlcmluZyB2b29yIGRlIGluZGVsaW5nJyxcclxuICAgIG5hdGlvbmFsS2V5d29yZHM6ICdOYXRpb25hbGUgc2xldXRlbHdvb3JkZW4nLFxyXG4gICAgTk9JTUFHRTogJ0dFRU4gQUZCRUVMRElORycsXHJcbiAgICBub0xvbmdlclZhbGlkOiAnRGV6ZSBCVEkgaXMgbmlldCBtZWVyIGdlbGRpZyBlbiBpcyBkYWFyb20gbmlldCBsYW5nZXIgYmVzY2hpa2JhYXIgaW4gZGUgRUJUSS1kYXRhYmFzZSB2YW4gZGUgRVUuJyxcclxuICAgIG5vdFZhbGlkT25fcmVmZXJlbmNlRGF0ZV86ICduaWV0IGdlbGRpZyBvcCB7eyByZWZlcmVuY2VEYXRlIHwgZGF0ZTogXFwnZGQtTU0teXlcXCcgfX0nLFxyXG4gICAgcG9zc2libHlJbnZhbGlkOiAnTkI6IGluIHNvbW1pZ2UgZ2V2YWxsZW4sIHpvYWxzIGRlIHB1YmxpY2F0aWUgdmFuIGVlbiBpbmRlbGluZ3N2ZXJvcmRlbmluZywga2FuIGVlbiBCVEkgdm9vciBoZXQgYWZsb3BlbiB2YW4gZGUgbm9ybWFsZSBnZWxkaWdoZWlkc2R1dXIgaW5nZXRyb2trZW4gd29yZGVuLiBIZXQgaXMgZGFhcm9tIG1vZ2VsaWprIGRhdCBkZXplIEVCVEkgb25kZXJ0dXNzZW4gbmlldCBtZWVyIGdlbGRpZyBpcy4nLFxyXG4gICAgUGFnZVRpdGxlU2VhcmNoQnRpczogJ1pvZWsgQlRJXFwncycsXHJcbiAgICBfYnRpQ291bnRfYmluZGluZ1RhcmlmZkluZm9ybWF0aW9uRGVjaXNpb25zRm91bmQ6ICd7eyBidGlDb3VudCB9fSBiaW5kZW5kZSB0YXJpZWZzaW5saWNodGluZyhlbikgZ2V2b25kZW4gaW4gZGV6ZSBwb3N0JyxcclxuICAgIF9TdGFydERhdGVfdW50aWxfRW5kRGF0ZV86ICd7eyBTdGFydERhdGUgfCBkYXRlOiBcXCdkZC1NTS15eXl5XFwnIH19IHQvbSB7eyBFbmREYXRlIHwgZGF0ZTogXFwnZGQtTU0teXl5eVxcJyB9fSdcclxufTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBidXR0aW9uczoge1xyXG4gICAgICAgIE9wZW5TdW1tYXJ5OiAnT3BlbiBzYW1lbnZhdHRpbmcnLFxyXG4gICAgfSxcclxuICAgIENhc2VMYXc6ICdSZWNodHNwcmFhaycsXHJcbiAgICBDYXNlTGF3Rmlyc3RMZXR0ZXI6ICdSJyxcclxuICAgIER1dGNoQ2FzZUxhdzogJ05lZGVybGFuZHNlIHJlY2h0c3ByYWFrJyxcclxuICAgIER1dGNoQ2FzZUxhd0p1ZGdtZW50OiAnVWl0c3ByYWFrIC8gQ29uY2x1c2llJyxcclxuICAgIER1dGNoQ2FzZUxhd1N1bW1hcnk6ICdJbmhvdWRzaW5kaWNhdGllJyxcclxuICAgIEV1cm9wZWFuQ2FzZUxhdzogJ0V1cm9wZXNlIHJlY2h0c3ByYWFrJyxcclxuICAgIEV1cm9wZWFuQ2FzZUxhd1N1bW1hcnk6ICdTYW1lbnZhdHRpbmcnLFxyXG4gICAgQ2FzZU51bWJlcjogJ1phYWtudW1tZXInLFxyXG4gICAgRUNMSTogJ0VDTEknLFxyXG4gICAgRW50ZXJDRUxFWE51bWJlcjogJ1ZvZXIgZWVuIENFTEVYLW51bW1lciBpbicsXHJcbiAgICBFbnRlckVDTElOdW1iZXI6ICdWb2VyIGVlbiBFQ0xJLW51bW1lciBpbicsXHJcbiAgICBFbnRlckNhc2VOdW1iZXI6ICdWb2VyIGVlbiB6YWFrbnVtbWVyIGluJyxcclxuICAgIFN1YmplY3Q6ICdPbmRlcndlcnAnLFxyXG4gICAgc3ViamVjdHM6IHtcclxuICAgICAgICBBbGxTdWJqZWN0czogJ0FsbGUgb25kZXJ3ZXJwZW4nLFxyXG4gICAgICAgIGR5bmFtaWM6IHtcclxuICAgICAgICAgICAgRXhjaXNlOiAnQWNjaWpucycsXHJcbiAgICAgICAgICAgIEN1c3RvbXNWYWx1ZTogJ0RvdWFuZXdhYXJkZScsXHJcbiAgICAgICAgICAgIER1bXBpbmc6ICdEdW1waW5nJyxcclxuICAgICAgICAgICAgRXhwb3J0UmVmdW5kczogJ1Jlc3RpdHV0aWVzIGJpaiB1aXR2b2VyJyxcclxuICAgICAgICAgICAgSW1wb3J0T3JFeHBvcnRQcm9jZWR1cmVzOiAnSW4tIGVuIHVpdHZvZXJwcm9jZWR1cmVzJyxcclxuICAgICAgICAgICAgQ2xhc3NpZmljYXRpb246ICdJbmRlbGluZycsXHJcbiAgICAgICAgICAgIEltcG9ydEV4cG9ydEFkdmFuY2VGaXhpbmdDZXJ0aWZpY2F0ZXM6ICdJbnZvZXItLCB1aXR2b2VyLSBlbiBwcmVmaXhhdGllY2VydGlmaWNhdGVuJyxcclxuICAgICAgICAgICAgT3JpZ2luOiAnT29yc3Byb25nJyxcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgTW9yZUNhc2VMYXc6ICdNZWVyIHJlY2h0c3ByYWFrJyxcclxuICAgIFByb2NlZHVyZVR5cGVzOiAnQmlqem9uZGVyZSBrZW5tZXJrZW4nLFxyXG4gICAgUmVmZXJlbmNlczogJ1dldHN2ZXJ3aWp6aW5nZW4nLFxyXG4gICAgRm9ybWFsUmVsYXRpb25zOiAnRm9ybWVsZSByZWxhdGllcycsXHJcbiAgICBKdWRpY2lhbEF1dGhvcml0eTogJ0luc3RhbnRpZScsXHJcbiAgICBEYXRlT2ZKdWRnbWVudDogJ0RhdHVtIHVpdHNwcmFhaycsXHJcbiAgICBEYXRlT2ZQdWJsaWNhdGlvbjogJ0RhdHVtIHB1YmxpY2F0aWUnLFxyXG4gICAgQXJlYXNPZkxhdzogJ1JlY2h0c2dlYmllZGVuJyxcclxuICAgIE9wZW5KdWRnbWVudDogJ09wZW4gdm9sbGVkaWdlIHVpdHNwcmFhaycsXHJcbiAgICBQdWJsaWNhdGlvbkxvY2F0aW9uczogJ1ZpbmRwbGFhdHNlbicsXHJcbiAgICBOb0R1dGNoSnVkZ21lbnRzOiAnR2VlbiBOZWRlcmxhbmRzZSB1aXRzcHJha2VuJyxcclxuICAgIE5vRXVyb3BlYW5KdWRnbWVudHM6ICdHZWVuIEV1cm9wZXNlIHVpdHNwcmFrZW4nLFxyXG4gICAgRHV0Y2hKdWRnbWVudHM6ICdOZWRlcmxhbmRzZSB1aXRzcHJha2VuJyxcclxuICAgIEV1cm9wZWFuSnVkZ21lbnRzOiAnRXVyb3Blc2UgdWl0c3ByYWtlbicsXHJcbiAgICBDYXNlTGF3Rm9yX2dvb2RzY29kZV86ICdSZWNodHNwcmFhayB2b29yIHt7IGdvb2RzY29kZSB8IHN0cmlwVGFyaWNDb2RlIHwgZm9ybWF0VGFyaWNDb2RlIH19JyxcclxuICAgIENhc2VMYXdGb3JfZ29vZHNjb2RlX2FuZF9zZWFyY2hRdWVyeV86ICdSZWNodHNwcmFhayB2b29yIGNvZGUge3sgZ29vZHNjb2RlIHwgc3RyaXBUYXJpY0NvZGUgfCBmb3JtYXRUYXJpY0NvZGUgfX0gZW4gem9la29wZHJhY2h0IFwie3sgc2VhcmNoUXVlcnkgfX1cIicsXHJcbiAgICBDYXNlTGF3Rm9yX3NlYXJjaFF1ZXJ5XzogJ1JlY2h0c3ByYWFrIHZvb3Ige3sgc2VhcmNoUXVlcnkgfX0nLFxyXG4gICAgX1RvdGFsUmVzdWx0c19yZXN1bHRzOiAne3sgVG90YWxSZXN1bHRzIH19IHJlc3VsdGF0ZW4nIC8vIE5COiBUb3RhbFJlc3VsdHMgaXMgYSBudW1iZXJcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIENsYXNzaWZpY2F0aW9uUmVndWxhdGlvbnM6ICdJbmRlbGluZ3N2ZXJvcmRlbmluZ2VuJyxcclxuICAgIEV1Q2xhc3NpZmljYXRpb25SZWd1bGF0aW9uczogJ0luZGVsaW5nc3Zlcm9yZGVuaW5nZW4gRVUnLFxyXG4gICAgTm90QXZhaWxhYmxlSW5DaG9zZW5MYW5ndWFnZTogJ0RlIEVVLWluZGVsaW5nc3Zlcm9yZGVuaW5nZW4gemlqbiBhbGxlZW4gaW4gaGV0IEVuZ2VscyBlbiBoZXQgTmVkZXJsYW5kcyBiZXNjaGlrYmFhcidcclxufTsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGVycm9yczoge1xyXG4gICAgICAgIHNlbGVjdF9maWxlX3RvX2NoZWNrOiAnU2VsZWN0ZWVyIGVlbiBiZXN0YW5kIG9tIHRlIGNvbnRyb2xlcmVuJyxcclxuICAgICAgICBzcGVjaWZ5X3N0YXJ0aW5nX3JvdzogJ0dlZWYgYWFuIG9wIHdlbGtlIHJpaiBkZSBkYXRhIGJlZ2ludCcsXHJcbiAgICAgICAgaW52YWxpZF9zdGFydGluZ19yb3c6ICdEZSByaWogd2Fhcm9wIGRlIGRhdGEgYmVnaW50LCBpcyBvbmdlbGRpZycsXHJcbiAgICAgICAgc3BlY2lmeV9qb2J0eXBlOiAnR2VlZiBhYW4gd2Vsa2UgY29udHJvbGUgbW9ldCB3b3JkZW4gdWl0Z2V2b2VyZCdcclxuICAgIH0sXHJcbiAgICBtb2RhbDoge1xyXG4gICAgICAgIGNvZGU6ICdDb2RlJyxcclxuICAgICAgICBsaW5lTnVtYmVyOiAnUmVnZWwnLFxyXG4gICAgICAgIG1lc3NhZ2U6ICdCZXJpY2h0JyxcclxuICAgICAgICB0aXRsZTogJ0FCQyBmb3V0ZW4gZW4gd2FhcnNjaHV3aW5nZW4nLFxyXG4gICAgfSxcclxuICAgIGRldGFpbHM6IHtcclxuICAgICAgICBiYWNrVG9PdmVydmlldzogJ1RlcnVnIG5hYXIgb3ZlcnppY2h0JyxcclxuICAgIH0sXHJcbiAgICBuZXdKb2I6IHtcclxuICAgICAgICBicmVhZGNydW1iOiAnU3RhcnQgbmlldXdlIGNvbnRyb2xlJyxcclxuICAgICAgICBjb3VudHJ5T2ZEZXN0aW5hdGlvbjogJ0xhbmQgdmFuIGJlc3RlbW1pbmcnLFxyXG4gICAgICAgIGNvdW50cnlPZk9yaWdpbjogJ0xhbmQgdmFuIG9vcnNwcm9uZycsXHJcbiAgICAgICAgZXJyb3JNZXNzYWdlczoge1xyXG4gICAgICAgICAgICBjb2x1bW5OYW1lQ2Fubm90QmVFbXB0eTogJ0tvbG9tbmFhbSBtYWcgbmlldCBsZWVnIHppam4nLFxyXG4gICAgICAgICAgICBpbnZhbGlkQ29sdW1uTmFtZTogJ09uZ2VsZGlnZSBrb2xvbW5hYW0nLFxyXG4gICAgICAgICAgICBkdXBsaWNhdGVDb2x1bW5OYW1lOiAnRHViYmVsZSBrb2xvbW5hYW0nLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgam9iVHlwZXM6IHtcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTb29ydCBjb250cm9sZSdcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxhYmVsVXNlVGVtcGxhdGVPckN1c3RvbUNoZWNrOiAnS2llcyBlZW4gQUJDLWNvbnRyb2xlIHVpdCBkZSBsaWpzdCBvZiBzdGVsIGVlbiBlaWdlbiBjb250cm9sZSBzYW1lbicsXHJcbiAgICAgICAgb3B0aW9uQ3VzdG9tQ2hlY2s6ICdaZWxmIHNhbWVuc3RlbGxlbicsXHJcbiAgICAgICAgbWVhc3VyZVR5cGVzOiAnVHlwZSBtYWF0cmVnZWxlbicsXHJcbiAgICAgICAgb3V0cHV0Rm9ybWF0czoge1xyXG4gICAgICAgICAgICBjc3Y6ICdDU1YnLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hYXQgdWl0dm9lcicsXHJcbiAgICAgICAgICAgIGV4Y2VsOiAnRXhjZWwnLFxyXG4gICAgICAgICAgICBleGNlbEFubm90YXRlZDogJ0V4Y2VsIG1ldCBrbGV1ci1pbmRpY2F0b3JzJyxcclxuICAgICAgICAgICAgcGxhaW5UZXh0OiAnUGxhaW4gdGV4dCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG91dHB1dFR5cGU6ICdHZWVmIGFhbiB3YXQgdSBpbiBkZSBvdXRwdXQgd2lsIG9udHZhbmdlbicsXHJcbiAgICAgICAgcmVhZEZpbGU6ICdHZWVmIGFhbiBpbiB3ZWxrZSByaWplbiBlbiBrb2xvbW1lbiB3ZSBkZSByZWxldmFudGUgZGF0YSBrdW5uZW4gdmluZGVuJyxcclxuICAgICAgICBzZWxlY3RGaWxlOiAnU2VsZWN0ZWVyIGVlbiBFeGNlbC1iZXN0YW5kIG9tIHRlIHZlcndlcmtlbicsXHJcbiAgICAgICAgb3BlbkZpbGU6ICdPcGVuIGJlc3RhbmQnLFxyXG4gICAgICAgIHNlbGVjdGVkRmlsZTogJ0dlc2VsZWN0ZWVyZGUgYmVzdGFuZCcsXHJcbiAgICAgICAgc3RhcnRDaGVjazogJ1N0YXJ0IGNvbnRyb2xlJyxcclxuICAgICAgICBzdGFydHNPblJvdzogJ0JlZ2ludCBvcCByaWonLFxyXG4gICAgICAgIHRpdGxlOiAnQUJDIC0gTmlldXdlIGJlc3RhbmRzY29udHJvbGUgc3RhcnRlbicsXHJcbiAgICAgICAgdXBsb2FkRmlsZTogJ0Jlc3RhbmQgdXBsb2FkZW4nXHJcbiAgICB9LFxyXG4gICAgb3ZlcnZpZXc6IHtcclxuICAgICAgICBicmVhZGNydW1iOiAnVGFyaWMgU3VwcG9ydCBBQkMnLFxyXG4gICAgICAgIGNvbnRhY3RVczogJzxhIGhyZWY9XCJodHRwOi8vd3d3LnRhcmljc3VwcG9ydC5ubC9jb250YWN0XCIgdGFyZ2V0PVwiX2JsYW5rXCI+TmVlbSBjb250YWN0IG1ldCBvbnMgb3A8L2E+IHZvb3IgbWVlciBpbmZvcm1hdGllIG92ZXIgVGFyaWMgU3VwcG9ydCBBQkMgZW4gZGUgbW9nZWxpamtoZWRlbiB2b29yIHV3IG9yZ2FuaXNhdGllJyxcclxuICAgICAgICBkYXRlQWRkZWQ6ICdUb2VnZXZvZWdkIG9wJyxcclxuICAgICAgICBkYXRlQ29tcGxldGVkOiAnQWZnZXJvbmQgb3AnLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVmFsaWRlZXIgc25lbCBncm90ZSBhYW50YWxsZW4gZ29lZGVyZW5jb2Rlcy4gVXBsb2FkIGVlbiBFeGNlbC1iZXN0YW5kIGVuIHZlcnJpamsgaGV0IGJlc3RhbmQgbWV0IGluZm9ybWF0aWUgdWl0IGhldCBkb3VhbmV0YXJpZWYsIHpvYWxzIG9tc2NocmlqdmluZ2VuIHZhbiBkZSBub21lbmNsYXR1dXIsIGFhbnZ1bGxlbmRlIGNvZGVzLCBpbnZvZXJyZWNodGVuLCBidHctdGFyaWV2ZW4gZW4gYmVzY2hlaWRjb2Rlcy4nLFxyXG4gICAgICAgIGRvY3VtZW50VHlwZTogJ1R5cGUnLFxyXG4gICAgICAgIGRvd25sb2FkRmlsZTogJ0Rvd25sb2FkIGJlc3RhbmQnLFxyXG4gICAgICAgIGZpbGU6ICdCZXN0YW5kJyxcclxuICAgICAgICBub0pvYnM6ICdVIGhlZWZ0IG5vZyBnZWVuIGJlc3RhbmRlbiBnZWNvbnRyb2xlZXJkLicsXHJcbiAgICAgICAgbnVtYmVyT2ZFcnJvcnM6ICcjIEZvdXRlbicsXHJcbiAgICAgICAgbnVtYmVyT2ZMaW5lczogJyMgUmVnZWxzJyxcclxuICAgICAgICBudW1iZXJPZkxvZ3M6ICcjIEJlcmljaHRlbicsXHJcbiAgICAgICAgbnVtYmVyT2ZXYXJuaW5nczogJyMgV2FhcnNjaHV3aW5nZW4nLFxyXG4gICAgICAgIHNob3dEZXRhaWxzOiAnRGV0YWlscyBiZWtpamtlbicsXHJcbiAgICAgICAgc3RhcnRGaXJzdDogJ1N0YXJ0IHV3IGVlcnN0ZSBjb250cm9sZScsXHJcbiAgICAgICAgc3RhcnROZXc6ICdTdGFydCBlZW4gbmlldXdlIGNvbnRyb2xlJyxcclxuICAgICAgICBzdGF0dXM6ICdTdGF0dXMnLFxyXG4gICAgICAgIHRpdGxlOiAnVGFyaWMgU3VwcG9ydCBBQkMgLSBBdXRvbWF0aXNjaGUgYmVzdGFuZHNjb250cm9sZScsXHJcbiAgICB9LFxyXG4gICAgc3RhdHVzOiB7XHJcbiAgICAgICAgY2FuY2VsX3Rhc2tfYXJleW91c3VyZTogJ1dlZXQgdSB6ZWtlciBkYXQgdSBkZXplIHRhYWsgd2lsIGFubnVsZXJlbj8nXHJcbiAgICB9XHJcbn07XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgQW1lbmRlZEJ5OiAnR2V3aWp6aWdkIGRvb3InLFxyXG4gICAgQW1lbmRtZW50T2Y6ICdXaWp6aWdpbmcgdmFuJyxcclxuICAgIENjY0NvbmNsdXNpb25zOiAnQ29uY2x1c2llcyBDRFcnLFxyXG4gICAgRG9jdW1lbnRzOiAnRG9jdW1lbnRlbicsXHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIENvbWJpbmVkTm9tZW5jbGF0dXJlRXhwb3J0SW50cmFTdGF0OiAnR2Vjb21iaW5lZXJkZSBOb21lbmNsYXR1dXIgJm1kYXNoOyBleHBvcnQvaW50cmFzdGF0JyxcclxuICAgIENvbW1vZGl0eUNvZGVDaGFuZ2VzOiAnVmVyYW5kZXJpbmdlbiBnb2VkZXJlbmNvZGVzJyxcclxuICAgIENvcnJlbGF0aW9uVGFibGU6ICdUcmFuc3BvbmVyaW5nc3RhYmVsJyxcclxuICAgIERlcml2ZWRGcm9tOiAnQWZnZWxlaWQgdmFuJyxcclxuICAgIEV4cGlyZWRDb2RlOiAnVmVybG9wZW4gY29kZScsXHJcbiAgICBFeHBpcmVkQ29kZXM6ICdWZXJsb3BlbiBjb2RlcycsXHJcbiAgICBIYXJtb25pemVkU3lzdGVtMjAyMjogJ0dlaGFybW9uaXNlZXJkIFN5c3RlZW0gMjAyMicsXHJcbiAgICBIUzIwMjJGb3J3YXJkOiAnVHJhbnNwb25lcmluZyBIUzIwMTcgbmFhciBIUzIwMjInLFxyXG4gICAgSFMyMDIyQmFja3dhcmQ6ICdUcmFuc3BvbmVyaW5nIEhTMjAyMiBuYWFyIEhTMjAxNycsXHJcbiAgICBNYXhPbmVZZWFySW50ZXJ2YWw6ICdIZXQgdmVyc2NoaWwgdHVzc2VuIHN0YXJ0LSBlbiBlaW5kZGF0dW0ga2FuIG5pZXQgbWVlciBkYW4gZWVuIGphYXIgemlqbicsXHJcbiAgICBOZXdDb2RlOiAnTmlldXdlIGNvZGUnLFxyXG4gICAgTmV3Q29kZXM6ICdOaWV1d2UgY29kZXMnLFxyXG4gICAgTm9tZW5jbGF0dXJlOiAnTm9tZW5jbGF0dXVyJyxcclxuICAgIFJlY2VudENoYW5nZXM6ICdSZWNlbnRlIHZlcmFuZGVyaW5nZW4nLFxyXG4gICAgUmVjZW50Q29tbW9kaXR5Q29kZUNoYW5nZXM6ICdSZWNlbnRlIHZlcmFuZGVyaW5nZW4gZ29lZGVyZW5jb2RlcycsXHJcbiAgICBSZXBsYWNlZEJ5OiAnVmVydmFuZ2VuIGRvb3InLFxyXG4gICAgUmVtYXJrczogJ09wbWVya2luZ2VuJyxcclxuICAgIFNlYXJjaENvcnJlbGF0aW9uVGFibGU6ICdab2VrZW4gaW4gdHJhbnNwb25lcmluZ3N0YWJlbCcsXHJcbiAgICBUYXJpY0ltcG9ydDogJ1RBUklDICZtZGFzaDsgaW1wb3J0JyxcclxuICAgIFVwY29taW5nQ2hhbmdlczogJ0FhbmtvbWVuZGUgdmVyYW5kZXJpbmdlbicsXHJcbiAgICBVcGNvbWluZ0NvbW1vZGl0eUNvZGVDaGFuZ2VzOiAnQWFua29tZW5kZSB2ZXJhbmRlcmluZ2VuIGdvZWRlcmVuY29kZXMnXHJcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBDdXN0b21zVmFsdWVDaGVjazogJ0NvbnRyb2xlIGRvdWFuZXdhYXJkZScsXHJcbiAgICBUaGVDdXJyZW50Q3VzdG9tc1ZhbHVlSXM6ICdEZSBkb3VhbmV3YWFyZGUgaXMge3sgQ3VycmVudEN1c3RvbXNWYWx1ZVBlclVuaXRPZldlaWdodEZvcm1hdHRlZCB9fS4nLFxyXG4gICAgTm9EYXRhSXNBdmFpbGFibGVSZWdhcmRpbmdUaGVBdmVyYWdlQ3VzdG9tc1ZhbHVlOiAnRXIgemlqbiBnZWVuIGdlZ2V2ZW5zIGJlc2NoaWtiYWFyIHZvb3IgZGUgZ2VtaWRkZWxkZSBkb3VhbmV3YWFyZGUgcGVyIGVlbmhlaWQgdmFuIGdld2ljaHQgdm9vciBnb2VkZXJlbiBtZXQgZ29lZGVyZW5jb2RlIHt7IENvbW1vZGl0eUNvZGUgfX0gZ2XDr21wb3J0ZWVyZCB2YW51aXQge3sgUGFydG5lckNvdW50cnkgfX0gbmFhciB7eyBSZXBvcnRpbmdDb3VudHJ5IH19LicsXHJcbiAgICBJbl9UaGVBdmVyYWdlV2FzOiAnSW4ge3sgWWVhciB9fSB3YXMgZGUgZ2VtaWRkZWxkZSBkb3VhbmV3YWFyZGUgcGVyIGVlbmhlaWQgdmFuIGdld2ljaHQgdm9vciBnb2VkZXJlbiBtZXQgZ29lZGVyZW5jb2RlIHt7IENvbW1vZGl0eUNvZGUgfX0gZ2XDr21wb3J0ZWVyZCB2YW51aXQge3sgUGFydG5lckNvdW50cnkgfX0gbmFhciB7eyBSZXBvcnRpbmdDb3VudHJ5IH19IGdlbGlqayBhYW4ge3sgQXZlcmFnZUN1c3RvbXNWYWx1ZVBlclVuaXRPZldlaWdodEZvcm1hdHRlZCB9fS4nLFxyXG4gICAgVGhlQ3VycmVudEN1c3RvbXNWYWx1ZUlzX1doaWNoSXNQZXJjZW50YWdlT2ZfOiAnRGUgb3BnZWdldmVuIGRvdWFuZXdhYXJkZSBpcyB7eyBDdXJyZW50Q3VzdG9tc1ZhbHVlUGVyVW5pdE9mV2VpZ2h0Rm9ybWF0dGVkIH19LCB3YXQge3sgUGVyY2VudGFnZSB9fSB2YW4gZGl0IGdlbWlkZGVsZGUgaXMuJ1xyXG59OyIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgVHlwZU9mQ2FsY3VsYXRvcjogJ1R5cGUgY2FsY3VsYXRvcicsXHJcbiAgICBCYXNpYzogJ0VlbnZvdWRpZycsXHJcbiAgICBBZHZhbmNlZDogJ1VpdGdlYnJlaWQnLFxyXG4gICAgQWRkRmllbGQ6ICdWZWxkIHRvZXZvZWdlbicsXHJcbiAgICBSZW1vdmVGaWVsZDogJ1ZlbGQgdmVyd2lqZGVyZW4nLFxyXG4gICAgXHJcbiAgICBBZGRpdGlvbnM6ICdWZXJob2dpbmdlbicsXHJcbiAgICBcclxuICAgIENvbW1pc2lvbnNBbmRCcm9rZXJhZ2VFeGNlcHRCdXlpbmdDb21taXNzaW9uczogJ0NvbW1pc3NpZXMgZW4gY291cnRhZ2UsIG1ldCB1aXR6b25kZXJpbmcgdmFuIGlua29vcGNvbW1pc3NpZXMnLFxyXG4gICAgUGFja2FnaW5nQ29zdHM6ICdLb3N0ZW4gdmVycGFra2luZycsXHJcbiAgICBDb3N0T2ZDb250YWluZXJzV2hpY2hBcmVPbmVXaXRoR29vZHM6ICdLb3N0ZW4gdmFuIHZlcnBha2tpbmdzbWlkZGVsZW4gZGllIHZvb3IgZG91YW5lZG9lbGVpbmRlbiB3b3JkZW4gZ2VhY2h0IG1ldCBkZSBnb2VkZXJlbiDDqcOpbiBnZWhlZWwgdGUgdm9ybWVuJyxcclxuICAgIEhlbHBGb3JDb3N0T2ZDb250YWluZXJzV2hpY2hBcmVPbmVXaXRoR29vZHM6ICc8cD5BbGdlbWVuZSByZWdlbCA1IHZvb3IgZGUgaW50ZXJwcmV0YXRpZSB2YW4gZGUgZ2Vjb21iaW5lZXJkZSBub21lbmNsYXR1dXI6PC9wPjxvbCB0eXBlPVwiYVwiPjxsaT5ldHVpcywgZm9lZHJhbGVuIGVuIGtvZmZlcnMgdm9vciBjYW1lcmFcXCdzLCB2b29yIG11emlla2luc3RydW1lbnRlbiBvZiB2b29yIHdhcGVucywgZG96ZW4gdm9vciB0ZWtlbmluc3RydW1lbnRlbiwganV3ZWxlbmtpc3RqZXMgZW4gZGVyZ2VsaWprZSBiZXJnaW5nc21pZGRlbGVuLCBzcGVjaWFhbCBnZXZvcm1kIG9mIGluZ2VyaWNodCB2b29yIGhldCBvcGJlcmdlbiB2YW4gZWVuIGJlcGFhbGQgYXJ0aWtlbCBvZiB2YW4gZWVuIHN0ZWwgb2YgYXNzb3J0aW1lbnQgdmFuIGFydGlrZWxlbiwgZ2VzY2hpa3Qgdm9vciBoZXJoYWFsZCBnZWJydWlrIGVuIGFhbmdlYm9kZW4gbWV0IGRlIGFydGlrZWxlbiB3YWFydm9vciB6ZSBiZXN0ZW1kIHppam4sIHdvcmRlbiBpbmdlZGVlbGQgb25kZXIgZGV6ZWxmZGUgcG9zdCBhbHMgZGllIGFydGlrZWxlbiBpbmRpZW4gemlqIHZhbiBkZSBzb29ydCB6aWpuIGRpZSBub3JtYWFsIGRhYXJtZWUgd29yZHQgdmVya29jaHQuIERlemUgcmVnZWwgZ2VsZHQgZWNodGVyIG5pZXQgdm9vciBiZXJnaW5nc21pZGRlbGVuIGRpZSBhYW4gaGV0IGdlaGVlbCBoZXQgd2V6ZW5saWprIGthcmFrdGVyIHZlcmxlbmVuOzwvbGk+PGxpPmJlaG91ZGVucyBoZXQgYmVwYWFsZGUgb25kZXIgNSBhKSB3b3JkZW4gZ2V2dWxkZSB2ZXJwYWtraW5nc21pZGRlbGVuIGluZ2VkZWVsZCBtZXQgZGUgdmVycGFrdGUgZ29lZGVyZW4gaW5kaWVuIHppaiB2YW4gZGUgc29vcnQgemlqbiBkaWUgbm9ybWFhbCBhbHMgdmVycGFra2luZyB2b29yIGRpZSBnb2VkZXJlbiB3b3JkdCBnZWJydWlrdC4gRGV6ZSByZWdlbCBpcyBlY2h0ZXIgbmlldCB2ZXJwbGljaHRlbmQgdm9vciB2ZXJwYWtraW5nc21pZGRlbGVuIGRpZSBrbGFhcmJsaWprZWxpamsgZ2VzY2hpa3QgemlqbiB2b29yIGhlcmhhYWxkIGdlYnJ1aWsuPC9saT48L29sPjxwPk9uZGVyIOKAnnZlcnBha2tpbmdzbWlkZGVsZW7igJ0gd29yZGVuIHZlcnN0YWFuLCBhbGxlIHVpdHdlbmRpZ2UgZW4gaW53ZW5kaWdlIGJlcmdpbmdzbWlkZGVsZW4sIG9taHVsc2Vscywgb3B3aW5kbWlkZGVsZW4gZW4gZGVyZ2VsaWprZSB2b29yemllbmluZ2VuLCBtZXQgdWl0c2x1aXRpbmcgdmFuIHZlcnZvZXJtaWRkZWxlbiDigJQgbWV0IG5hbWUgY29udGFpbmVycyDigJQsIGRla2tsZWRlbiBlbiBoZXQgc3R1dy0gZW4gaHVscG1hdGVyaWFhbC4gSGllcm9uZGVyIHdvcmRlbiBlY2h0ZXIgbmlldCBkZSBpbiBhbGdlbWVuZSByZWdlbCA1LCBvbmRlciBhKSwgYmVkb2VsZGUgYmVyZ2luZ3NtaWRkZWxlbiB2ZXJzdGFhbi48L3A+JyxcclxuICAgIENvc3RPZlBhY2tpbmc6ICdLb3N0ZW4gdmFuIGhldCB2ZXJwYWtrZW4sIHdhYXJvbmRlciB6b3dlbCBoZXQgYXJiZWlkc2xvb24gYWxzIGhldCBtYXRlcmlhYWwgaXMgYmVncmVwZW4nLFxyXG4gICAgR29vZHNBbmRTZXJ2aWNlc1Byb3ZpZGVkQnlCdXllcjogJ0dvZWRlcmVuIGVuIGRpZW5zdGVuIGdlbGV2ZXJkIGRvb3Iga29wZXInLFxyXG4gICAgTWF0ZXJpYWxzQ29tcG9uZW50c0FuZFBhcnRzOiAnTWF0ZXJpYWxlbiwgc2FtZW5zdGVsbGVuZGUgZGVsZW4sIG9uZGVyZGVsZW4gZW4gZGVyZ2VsaWprZSBkaWUgaW4gZGUgaW5nZXZvZXJkZSBnb2VkZXJlbiB3b3JkZW4gdmVyd2Vya3QnLFxyXG4gICAgVG9vbHNEaWVzQW5kTW91bGRzOiAnV2Vya3R1aWdlbiwgbWF0cmlqemVuLCBnaWV0dm9ybWVuIGVuIGRlcmdlbGlqa2Ugdm9vcndlcnBlbiBkaWUgYmlqIGRlIHZvb3J0YnJlbmdpbmcgdmFuIGRlIGluZ2V2b2VyZGUgZ29lZGVyZW4gd29yZGVuIGdlYnJ1aWt0JyxcclxuICAgIE1hdGVyaWFsc0NvbnN1bWVkSW5Qcm9kdWN0aW9uOiAnTWF0ZXJpYWxlbiBkaWUgYmlqIGRlIHZvb3J0YnJlbmdpbmcgdmFuIGRlIGluZ2V2b2VyZGUgZ29lZGVyZW4gd29yZGVuIHZlcmJydWlrdCcsXHJcbiAgICBFbmdpbmVlcmluZ0RldmVsb3BtZW50QXJ0d29ya0Rlc2lnblBsYW5zQW5kU2tldGNoZXM6ICdFbmdpbmVlcmluZywgb250d2lra2VsaW5nLCB3ZXJrZW4gdmFuIGt1bnN0LCBvbnR3ZXJwZW4sIGVuIHRla2VuaW5nZW4gZW4gc2NoZXRzZW4gZGllIGJ1aXRlbiBkZSBVbmllIHppam4gdmVycmljaHQgb2YgdmVydmFhcmRpZ2QgZW4gZGllIG5vb2R6YWtlbGlqayB6aWpuIHZvb3IgZGUgcHJvZHVjdGllIHZhbiBkZSBpbmdldm9lcmRlIGdvZWRlcmVuJyxcclxuICAgIFJveWFsdGllc0FuZExpY2Vuc2VGZWVzOiAnUm95YWx0eVxcJ3MgZW4gbGljZW50aWVyZWNodGVuIG1ldCBiZXRyZWtraW5nIHRvdCBkZSBnb2VkZXJlbiB3YWFydmFuIGRlIHdhYXJkZSB3b3JkdCBiZXBhYWxkLCBkaWUgZGUga29wZXIgYWxzIHZvb3J3YWFyZGUgdm9vciBkZSB2ZXJrb29wIHZhbiBkZXplIGdvZWRlcmVuIGRpcmVjdCBvZiBpbmRpcmVjdCBtb2V0IGJldGFsZW4nLFxyXG4gICAgRGVsaXZlcnlDb3N0czogJ0xldmVyaW5nc2tvc3RlbicsXHJcbiAgICBWYWx1ZU9mUmVzYWxlRGlzcG9zYWxPclVzZVRoYXRBY2NydWVzVG9TZWxsZXI6ICdXYWFyZGUgdmFuIGVsayBkZWVsIHZhbiBkZSBvcGJyZW5nc3QgdmFuIGVsa2UgbGF0ZXJlIHdlZGVydmVya29vcCwgb3ZlcmRyYWNodCBvZiBnZWJydWlrIHZhbiBkZSBpbmdldm9lcmRlIGdvZWRlcmVuIGRhdCBkZSB2ZXJrb3BlciBkaXJlY3Qgb2YgaW5kaXJlY3QgdGVuIGdvZWRlIGtvbXQnLFxyXG4gICAgVHJhbnNwb3J0Q29zdHNCZWZvcmVFbnRyeUludG9DdXN0b21zVGVycml0b3J5OiAnVmVydm9lcnNrb3N0ZW4gdsOzw7NyIGJpbm5lbmtvbXN0IGluIGRvdWFuZWdlYmllZCB2YW4gZGUgVW5pZScsXHJcbiAgICBJbnN1cmFuY2VDb3N0c0JlZm9yZUVudHJ5SW50b0N1c3RvbXNUZXJyaXRvcnk6ICdWZXJ6ZWtlcmluZ3Nrb3N0ZW4gdsOzw7NyIGJpbm5lbmtvbXN0IGluIGRvdWFuZWdlYmllZCB2YW4gZGUgVW5pZScsXHJcbiAgICBMb2FkaW5nQW5kSGFuZGxpbmdDaGFyZ2VzQmVmb3JlRW50cnlJbnRvQ3VzdG9tc1RlcnJpdG9yeTogJ0tvc3RlbiB2YW4gaGV0IGxhZGVuIGVuIGJlaGFuZGVsZW4gdmFuIGRlIGluZ2V2b2VyZGUgZ29lZGVyZW4gZGllIHZlcmJhbmQgaG91ZGVuIG1ldCBoZXQgdmVydm9lciB2w7PDs3IgYmlubmVua29tc3QgaW4gZG91YW5lZ2ViaWVkIHZhbiBkZSBVbmllJyxcclxuICAgIE90aGVyQWRkaXRpb25zOiAnT3ZlcmlnZSB2ZXJob2dpbmdlbicsXHJcbiAgICBcclxuICAgIERlZHVjdGlvbnM6ICdWZXJsYWdpbmdlbicsXHJcbiAgICBcclxuICAgIFRyYW5zcG9ydENvc3RzQWZ0ZXJFbnRyeUludG9DdXN0b21zVGVycml0b3J5OiAnVmVydm9lcnNrb3N0ZW4gbmEgYmlubmVua29tc3QgaW4gZG91YW5lZ2ViaWVkIHZhbiBkZSBVbmllIGVuIGFhbnZlcndhbnRlIGtvc3Rlbiwgem9hbHMgZGUgYnVpdGVuYm9vcmRsb3NzaW5nc2tvc3RlbiwgdmVyemVrZXJpbmdza29zdGVuLCBrb3N0ZW4gdm9vciBoZXQgbGFkZW4sIGtvc3RlbiB2b29yIGhhbmRsaW5nIGVuIGRlIGtvc3RlbiB2b29yIGhldCBicmVuZ2VuIGluIGhldCB2cmlqZSB2ZXJrZWVyIChkb2N1bWVudGtvc3RlbiknLFxyXG4gICAgQ2hhcmdlc0ZvckNvbnN0cnVjdGlvbkVyZWN0aW9uQXNzZW1ibHlNYWludGVuYW5jZU9yVGVjaG5pY2FsQXNzaXN0YW5jZTogJ0tvc3RlbiB2YW4gY29uc3RydWN0aWV3ZXJremFhbWhlZGVuLCBpbnN0YWxsYXRpZSwgbW9udGFnZSwgb25kZXJob3VkIG9mIHRlY2huaXNjaGUgYmlqc3RhbmQgd2Vsa2UgbWV0IGJldHJla2tpbmcgdG90IGluZ2V2b2VyZGUgZ29lZGVyZW4sIHpvYWxzIGluZHVzdHJpw6tsZSBpbnN0YWxsYXRpZXMsIG1hY2hpbmVzIG9mIG1hdGVyaWVlbCwgbmEgZGUgYmlubmVua29tc3QgZXJ2YW4gaW4gaGV0IGRvdWFuZWdlYmllZCB2YW4gZGUgVW5pZSB6aWpuIHZlcnJpY2h0JyxcclxuICAgIENoYXJnZXNGb3JJbnRlcmVzdDogJ1RlIGJldGFsZW4gcmVudGUgdWl0IGhvb2ZkZSB2YW4gZWVuIGRvb3IgZGUga29wZXIgaW4gdmVyYmFuZCBtZXQgZGUgYWFua29vcCB2YW4gaW5nZXZvZXJkZSBnb2VkZXJlbiBnZXNsb3RlbiBmaW5hbmNpZXJpbmdzb3ZlcmVlbmtvbXN0JyxcclxuICAgIENoYXJnZXNGb3JSaWdodFRvUmVwcm9kdWNlOiAnS29zdGVuIHRlciB2ZXJrcmlqZ2luZyB2YW4gaGV0IHJlY2h0IHRvdCB2ZXJ2ZWVsdm91ZGlnaW5nIHZhbiBkZSBpbiBkZSBVbmllIGluZ2V2b2VyZGUgZ29lZGVyZW4nLFxyXG4gICAgQnV5aW5nQ29tbWlzaW9uczogJ0lua29vcGNvbW1pc3NpZXMnLFxyXG4gICAgSW1wb3J0RHV0aWVzOiAnUmVjaHRlbiBiaWogaW52b2VyIGVuIGFuZGVyZSBiZWxhc3RpbmdlbiBkaWUgaW4gZGUgVW5pZSB2YW53ZWdlIGRlIGludm9lciBvZiBkZSB2ZXJrb29wIHZhbiBkZSBnb2VkZXJlbiBkaWVuZW4gdGUgd29yZGVuIHZvbGRhYW4nLFxyXG4gICAgUGF5bWVudHNNYWRlRm9yUmlnaHRUb0Rpc3RyaWJ1dGVPclJlc2VsbDogJ0Rvb3IgZGUga29wZXIgdmVycmljaHRlIGJldGFsaW5nZW4gdGVyIHZlcmtyaWpnaW5nIHZhbiBoZXQgcmVjaHQgdG90IGRpc3RyaWJ1dGllIG9mIHdlZGVydmVya29vcCB2YW4gZGUgaW5nZXZvZXJkZSBnb2VkZXJlbiwgaW5kaWVuIGRlemUgYmV0YWxpbmdlbiBnZWVuIHZvb3J3YWFyZGUgemlqbiB2b29yIGRlIHZlcmtvb3AgdmFuIGRlIGdvZWRlcmVuIHZvb3IgdWl0dm9lciBuYWFyIGRlIFVuaWUnLFxyXG4gICAgT3RoZXJEZWR1Y3Rpb25zOiAnT3ZlcmlnZSB2ZXJsYWdpbmdlbicsXHJcblxyXG4gICAgLy8gQXJ0aWNsZSA4Ni4xIFVDQ1xyXG4gICAgSGVscEZvck90aGVyRGVkdWN0aW9uczogJ0JpanZvb3JiZWVsZDoga29zdGVuIHZvb3Igb3BzbGFnIGVuIHZvb3IgZ2VicnVpa2VsaWprZSBiZWhhbmRlbGluZ2VuIGluIGRlIFVuaWUgZ2VkdXJlbmRlIGRlIG9wc2xhZyBpbiBlZW4gZG91YW5lLWVudHJlcG90IG9mIGVlbiBydWltdGUgdm9vciB0aWpkZWxpamtlIG9wc2xhZy4nLFxyXG5cclxuICAgIE1ldGhvZDogJ01ldGhvZGUnLFxyXG4gICAgQ2FsY3VsYXRlVmFsdWU6ICdXYWFyZGUgYmVyZWtlbmVuJyxcclxuICAgIEVudGVyVmFsdWU6ICdXYWFyZGUgaW52b2VyZW4nLFxyXG5cclxuICAgIFByaWNlOiAnUHJpanMnLFxyXG4gICAgUHJpY2VBY3R1YWxseVBhaWRPclBheWFibGU6ICdXZXJrZWxpamsgYmV0YWFsZGUgb2YgdGUgYmV0YWxlbiBwcmlqcycsXHJcbiAgICBSZXN1bHQ6ICdSZXN1bHRhYXQnLFxyXG4gICAgVHJhbnNhY3Rpb25WYWx1ZTogJ1RyYW5zYWN0aWV3YWFyZGUnLFxyXG4gICAgVHJhbnNhY3Rpb25WYWx1ZUNhbGN1bGF0b3I6ICdDYWxjdWxhdG9yIHRyYW5zYWN0aWV3YWFyZGUnXHJcbn07XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgZXhhbXBsZVRleHQ6ICdiaWp2b29yYmVlbGQ6IDxlbT4yMjAzMDAwOTwvZW0+IG9mIDxlbT42OTExMTAwMDkwIGltcG9ydCBjbjwvZW0+JyxcclxuICAgIGxhbmRpbmdQYWdlOiB7XHJcbiAgICAgICAgZHluYW1pYzoge1xyXG4gICAgICAgICAgICBERTogJ05hYXIgaGV0IER1aXRzZSBkb3VhbmV0YXJpZWYgKEVaVCknLFxyXG4gICAgICAgICAgICBFVTogJ05hYXIgaGV0IEV1cm9wZXNlIGRvdWFuZXRhcmllZiAoVEFSSUMpJyxcclxuICAgICAgICAgICAgQkU6ICdOYWFyIGhldCBCZWxnaXNjaGUgZG91YW5ldGFyaWVmIChUQVJCRUwpJyxcclxuICAgICAgICAgICAgTkw6ICdOYWFyIGhldCBOZWRlcmxhbmRzZSBkb3VhbmV0YXJpZWYgKERUViknLFxyXG4gICAgICAgICAgICBDSDogJ05hYXIgaGV0IFp3aXRzZXJzZSBkb3VhbmV0YXJpZWYgKFRBUkVTKScsXHJcbiAgICAgICAgICAgIEdCOiAnTmFhciBoZXQgVUsgR2xvYmFsIFRhcmlmZiAoVUtHVCknLFxyXG4gICAgICAgICAgICBTRTogJ05hYXIgaGV0IFp3ZWVkc2UgZG91YW5ldGFyaWVmJyxcclxuICAgICAgICAgICAgSVQ6ICdOYWFyIGhldCBJdGFsaWFhbnNlIGRvdWFuZXRhcmllZidcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgUmVjZW50Q2hhbmdlczogJ1JlY2VudGUgd2lqemlnaW5nZW4nLFxyXG4gICAgUmVjZW50Q29kZXM6ICdSZWNlbnRlIGNvZGVzJ1xyXG59O1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGFiYzoge1xyXG4gICAgICAgIGludHJvOiAnTWV0IFRhcmljIFN1cHBvcnQgQUJDIGt1bnQgdSBtZXQgw6nDqW4gZHJ1ayBvcCBkZSBrbm9wIGFydGlrZWxzdGFtYmVzdGFuZGVuLCBvcmRlci1tYW5pZmVzdGVuIGVuIGFhbmdpZnRlcyBjb250cm9sZXJlbiBlbiBhYW52dWxsZW4gbWV0IGRhdGEgdWl0IGhldCBkb3VhbmV0YXJpZWYuIFdhdCBkYWdlbiBrb3N0dGUsIGtvc3QgbnUgbWludXRlbi4gPGJyPjxicj5Ib2UgaGV0IHdlcmt0PyBVcGxvYWQgZWVuIGJlc3RhbmQsIGtpZXMgZWVuIGNvbnRyb2xlIGVuIGRydWsgb3Agc3RhcnQuIFNlY29uZGVuIGxhdGVyIGt1bnQgdSBlZW4gYmVzdGFuZCBkb3dubG9hZGVuIG1ldCBhbGxlcmxlaSBudXR0aWdlIGRhdGEuICA8YnI+PGJyPlRhcmljIFN1cHBvcnQgQUJDIGNvbWJpbmVlcnQgZGUga3JhY2h0IHZhbiBvbnplIEFQSSBtZXQgZGUgZmxleGliaWxpdGVpdCB2YW4gaGV0IHVwLSBlbiBkb3dubG9hZGVuIHZhbiBFeGNlbC1iZXN0YW5kZW4nXHJcbiAgICB9LFxyXG4gICAgYWJjTmV3OiB7XHJcbiAgICAgICAgZmlsZTogJ0tpZXMgZWVuIEV4Y2VsLWJlc3RhbmQgb20gdGUgY29udHJvbGVyZW4gZW4gdGUgdmVycmlqa2VuJyxcclxuICAgICAgICBpbnB1dE9wdGlvbnM6ICdHZWVmIGFhbiBpbiB3ZWxrZSBrb2xvbW1lbiB2YW4gaGV0IEV4Y2VsLWJlc3RhbmQgd2VsayB0eXBlIGRhdGEgZ2V2b25kZW4ga2FuIHdvcmRlbiBlbiBvcCB3ZWxrZSByaWogZGUgZGF0YSBiZWdpbnQuJyxcclxuICAgICAgICBvdXRwdXRPcHRpb25zOiAnS2llcyBvZiB1IGVlbiBjb250cm9sZSB3aWx0IGRvZW4gdm9vciBpbnZvZXItIG9mIHVpdHZvZXJhYW5naWZ0ZXMsIHdhdCB2b29yIHR5cGUgY29udHJvbGUgdSB3aWx0IGRvZW4gZW4gaW4gd2VsayBiZXN0YW5kc2Zvcm1hYXQgdSBoZXQgcmVzdWx0YWF0IHdpbHQgaGViYmVuLicsXHJcbiAgICAgICAgbGV0c0dvOiAnU3RhcnRlbiBtYWFyIScsXHJcbiAgICB9LFxyXG4gICAgY2FzZUxhdzoge1xyXG4gICAgICAgIGludHJvOiAnT25kZXIgaGV0IGtvcGplIFwiTmlldXdzXCIgdmluZHQgdSBkZSBsYWF0c3RlIE5lZGVybGFuZHNlIGVuIEV1cm9wZXNlIHVpdHNwcmFrZW4uIDxicj48YnI+T25kZXIgZGUga29wamVzIFwiTmVkZXJsYW5kc2UgcmVjaHRzcHJhYWtcIiBlbiBcIkV1cm9wZXNlIHJlY2h0c3ByYWFrXCIgdmluZHQgdSBlZW4gZ2VhdmFuY2VlcmRlIHpvZWtmdW5jdGllIG9tIHNuZWwgZGUgcmVsZXZhbnRlIGp1cmlzcHJ1ZGVudGllIHRlIHZpbmRlbi4nLFxyXG4gICAgfSxcclxuICAgIGNoYXB0ZXI6IHtcclxuICAgICAgICBpbnRybzogJ09wIGRlemUgcGFnaW5hIGt1bnQgdSBkb29yIGVlbiBob29mZHN0dWsgYmxhZGVyZW4uIERhYXJuYWFzdCB6aWpuIGVyIGVlbiBob29wIGJyb25uZW4gb20gdSB0ZSBoZWxwZW4gYmlqIGhldCBpbmRlbGluZ3Nwcm9jZXMuJyxcclxuICAgICAgICBoZWFkaW5nOiAnS2xpayBvcCBlZW4gcG9zdCBvZiBvbmRlcnZlcmRlbGluZyBvbSBkZXplIGluL3VpdCB0ZSBrbGFwcGVuLjxicj5IaW50OiBkdWJiZWwta2xpayBvbSBvb2sgYWxsZSBvbmRlcnZlcmRlbGluZ2VuIGluL3VpdCB0ZSBrbGFwcGVuLicsXHJcbiAgICAgICAgY2hhcHRlckJ1dHRvbnM6IFxyXG4gICAgICAgICAgICAnRGUgdm9sZ2VuZGUgYnJvbm5lbiB6aWpuIGJlc2NoaWtiYWFyIC0gdSB6aWV0IHN0ZWVkcyBkZSBpbmZvcm1hdGllIGRlIGJldHJla2tpbmcgaGVlZnQgb3AgaGV0IGh1aWRpZ2UgaG9vZmRzdHVrJyArXHJcbiAgICAgICAgICAgICc8dWw+PGxpPkEgc3RhYXQgdm9vciBBYW50ZWtlbmluZ2VuLCB3ZXR0ZWxpamsgYmluZGVuZDwvbGk+JyArXHJcbiAgICAgICAgICAgICc8bGk+VCBzdGFhdCB2b29yIFRvZWxpY2h0aW5nZW4gKGhpZXIgdmluZHQgdSBvb2sgZGUgaW5kZWxpbmdzYWR2aWV6ZW4gdmFuIGRlIFdDTyBlbiBkZSBpbmRlbGluZ3N2ZXJvcmRlbmluZ2VuIHZhbiBkZSBFVSk8L2xpPicgK1xyXG4gICAgICAgICAgICAnPGxpPkIgc3RhYXQgdm9vciBCVElzPC9saT4nICtcclxuICAgICAgICAgICAgJzxsaT5SIHN0YWF0IHZvb3IgUmVjaHRzcHJhYWsgLSBpbmRlbGluZ3N2cmFhZ3N0dWtrZW4gd29yZGVuIHZhYWsgaW4gZGUgcmVjaHRiYW5rIG9wZ2Vsb3N0PC9saT4nICtcclxuICAgICAgICAgICAgJzxsaT5XIHN0YWF0IHZvb3IgV2V0Z2V2aW5nIC0gaGllciB2aW5kdCB1IGRlIGxhYXRzdGUgd2V0Z2V2aW5nIGVuIGJlcmljaHRlbiB2YW51aXQgZGUgRVU8L2xpPicgK1xyXG4gICAgICAgICAgICAnPC91bD4nLFxyXG4gICAgICAgIGhlYWRpbmdCdXR0b25zOiBcclxuICAgICAgICAgICAgJ0RlemUgYnJvbm5lbiB6aWpuIG9vayBiZXNjaGlrYmFhciB2b29yIGVsa2UgcG9zdCAtIGVuIGVsZGVycyBpbiBkZSBhcHBsaWNhdGllLiAnICsgXHJcbiAgICAgICAgICAgICdPbSBydWltdGUgdGUgYmVzcGFyZW4sIGdlYnJ1aWtlbiB3ZSBzdGVlZHMgYWxsZWVuIGRlIGVlcnN0ZSBsZXR0ZXIgdm9vciBlZW4ga25vcC4gJyArXHJcbiAgICAgICAgICAgICdIZXQgd2VudCBzbmVsIG1hYXIgbW9jaHQgdSB2ZXJnZXRlbiB6aWpuIHdhYXIgem9cXCduIGxldHRlciB2b29yIHN0YWF0OiBhbHMgdSBtZXQgdXcgbXVpcyBib3ZlbiBlZW4ga25vcCBoYW5ndCwgZGFuIHppZXQgdSB3YXQgZGUga25vcCBkb2V0LidcclxuICAgIH0sXHJcbiAgICBjaGFwdGVyczoge1xyXG4gICAgICAgIGludHJvOiBcclxuICAgICAgICAgICAgJ0RpdCBpcyBkZSBzdGFydHBhZ2luYSB2YW4gZGUgbW9kdWxlIGNsYXNzaWZpY2F0aWUgZW4gdGFyaWVmLiAnICsgXHJcbiAgICAgICAgICAgICdPcCBkZXplIHBhZ2luYSBrdW50IHUgZG9vciBkZSBhZmRlbGluZ2VuIGVuIGhvb2Zkc3R1a2tlbiB2YW4gZGUgbm9tZW5jbGF0dXVyIGJsYWRlcmVuLCBvZiBoZXQgdGFyaWVmIGRvb3J6b2VrZW4gdmlhIGRlIHpvZWtib3guJyxcclxuICAgICAgICBsYXJnZVNlYXJjaEJveDogJ1pvZWsgb3AgZ29lZGVyZW5jb2RlIG9mIHpvZWt3b29yZCB2aWEgZGV6ZSB6b2VrYm94IG9mIGRpZSBib3ZlbmFhbiBkZSBwYWdpbmEuIDxicj48YnI+SGludDogb20gc25lbGxlciB0ZSB6b2VrZW4sIGt1bnQgdSBkZSB3b29yZGVuIFwiaW1wb3J0XCIgZW4gXCJleHBvcnRcIiBnZWJydWlrZW4gb20gbWV0ZWVuIGFhbiB0ZSBnZXZlbiBvZiB1IGVlbiB6b2Vrb3BkcmFjaHQgZG9ldCB2b29yIGludm9lciBvZiB1aXR2b2VyLiBVIGt1bnQgb29rIG1ldGVlbiBlZW4gbGFuZGNvZGUgb2YgbGFuZG5hYW0gaW52dWxsZW4uJyxcclxuICAgICAgICBzZWN0aW9uTm90ZXNBbmRFeHBsYW5hdG9yeU5vdGVzOiAnTkI6IG9tIHRlIGJlcGFsZW4gb2YgZWVuIGdvZWQgaW5nZWRlZWxkIGthbiB3b3JkZW4gaW4gZWVuIGJlcGFhbGRlIGFmZGVsaW5nIG9mIGVlbiBiZXBhYWxkIGhvb2Zkc3R1aywgJyArIFxyXG4gICAgICAgICdtb2V0IHUgYWx0aWpkIGRlICh3ZXR0ZWxpamsgYmluZGVuZGUpIGFhbnRla2VuaW5nZW4gYmlqIGRlIGFmZGVsaW5nZW4gZW4gaG9vZmRzdHVra2VuIGxlemVuLiBVIHZpbmR0IGRlemUgZG9vciB0ZSBrbGlra2VuIG9wIGRlIGtub3AgZ2VtYXJrZWVyZCBtZXQgZGUgbGV0dGVyIEEgdm9vciBBYW50ZWtlbmluZ2VuLiA8YnI+PGJyPicgK1xyXG4gICAgICAgICdEYWFybmFhc3QgemlqbiBkZSB0b2VsaWNodGluZ2VuIGRpZSBnZXB1YmxpY2VlcmQgd29yZGVuIGRvb3IgZGUgV0NPIGVuIGRlIEVVLCBob2V3ZWwgbmlldCB3ZXR0ZWxpamsgYmluZGVuZCwgb25taXNiYXJlIGh1bHBtaWRkZWxlbiBvbSB0ZSBiZXBhbGVuIHdlbGtlIGdvZWRlcmVuIG51IHdlbCBvZiBuaWV0IG9uZGVyICcgK1xyXG4gICAgICAgICdlZW4gYmVwYWFsZGUgYWZkZWxpbmcsIGhvb2Zkc3R1aywgcG9zdCBvZiBvbmRlcnZlcmRlbGluZyB2YWxsZW4uIFUga3VudCB6ZSB2aW5kZW4gZG9vciB0ZSBrbGlra2VuIG9wIGRlIGtub3AgZ2VtYXJrZWVyZCBtZXQgZGUgbGV0dGVyIFQgdm9vciBUb2VsaWNodGluZ2VuLicsXHJcbiAgICB9LFxyXG4gICAgY29ycmVsYXRpb25UYWJsZToge1xyXG4gICAgICAgIGludHJvOiAnWm9layBkZSB2b29ybG9wZXJzIHZhbiBuaWV1d2UgZ29lZGVyZW5jb2RlcyBlbiBkZSBvcHZvbGdlcnMgdmFuIHZlcmxvcGVuIGdvZWRlcmVuY29kZXMuIDxicj48YnI+VSBrdW50IHpvZWtlbiBvcCBiYXNpcyB2YW4gc3RhcnQtIG9mIGVpbmRkYXR1bSBvZiBvcCBiYXNpcyB2YW4gZ29lZGVyZW5jb2RlICh1IGt1bnQgaGllciBvb2sga2llemVuIHZvb3IgZWVuIGhvb2Zkc3R1aywgcG9zdCBvZiBvbmRlcnZlcmRlbGluZykuJyxcclxuICAgICAgICBzZWFyY2hTdWNjZXNzb3JzOiAnS2xpayBoaWVyIG9tIG9wdm9sZ2VycyB2YW4gdmVybG9wZW4gZ29lZGVyZW5jb2RlcyB0ZSBiZWtpamtlbi4gPGJyPjxicj5OQjogZWVuIG9wdm9sZ2VyIHZhbiBlZW4gdmVybG9wZW4gY29kZSBpcyBuaWV0IG5vb2R6YWtlbGlqayBlZW4gbmlldXdlIGNvZGUuIEhldCBrYW4gb29rIGVlbiBhbCBsYW5nZXIgYmVzdGFhbmRlIGNvZGUgemlqbiwgd2FhciBnb2VkZXJlbiBhYW4gd29yZGVuIHRvZWdldm9lZ2QuJyxcclxuICAgICAgICBzZWFyY2hPcmlnaW5hdG9yczogJ0tsaWsgaGllciBvbSB2b29ybG9wZXJzIHZhbiBuaWV1d2UgZ29lZGVyZW5jb2RlcyB0ZSBiZWtpamtlbi4gPGJyPjxicj5OQjogZWVuIHZvb3Jsb3BlciB2YW4gZWVuIG5pZXV3ZSBjb2RlIGVpbmRpZ3QgbmlldCBub29kemFrZWxpamsuIEhldCBrYW4gb29rIGRhdCBlZW4gZGVlbCB2YW4gZGUgZ29lZGVyZW4gb25kZXIgZGUgbmlldXdlIGNvZGUgdmFsdCBlbiBlZW4gZGVlbCBub2cgc3RlZWRzIG9uZGVyIGRlIG91ZGUgY29kZS4nXHJcbiAgICB9LFxyXG4gICAgZWJ0aToge1xyXG4gICAgICAgIGludHJvOiAnT3JnYW5pc2F0aWVzIGluIGRlIEVVIGt1bm5lbiBlZW4gdmVyem9layBvbSBlZW4gYmluZGVuZCBpbmRlbGluZ3NhZHZpZXMgaW5kaWVuZW4gYmlqIGh1biBuYXRpb25hbGUgZG91YW5lYXV0b3JpdGVpdGVuLiBEaXQgd29yZGVuIEJUSVxcJ3MgZ2Vub2VtZC4gWmUgemlqbiBlZW4gdWl0ZXJtYXRlIGhhbmRpZyBodWxwbWlkZGVsIGJpaiBoZXQgYmVwYWxlbiB2YW4gZGUganVpc3RlIGNsYXNzaWZpY2F0aWUgdmFuIHV3IHByb2R1Y3QuIEFscyB1IHZvb3IgaGV0emVsZmRlIHByb2R1Y3QgYWFuZ2lmdGUgZG9ldCwgaGVlZnQgaGV0IGltbWVycyB3YWFyc2NoaWpubGlqayBkZXplbGZkZSBjbGFzc2lmaWNhdGllLiA8YnI+PGJyPlRhcmljIFN1cHBvcnQgaGVscHQgdSBtZXQgZWVuIHRvdGFhbG92ZXJ6aWNodCB2YW4gYWxsZSBhZmdlZ2V2ZW4gQlRJXFwncyBpbiBFdXJvcGEgbWV0IGJpamJlaG9yZW5kZSBmb3RvXFwncyBlbiB0ZWtlbmluZ2VuLCBpbmNsdXNpZWYgZWVuIGhpc3RvcmllIHZhbiBCVElcXCdzIGRpZSBuaWV0IG1lZXIgZ2VsZGlnIHppam4uIERlemUgQlRJXFwncyB6aWpuLCBuZXQgYWxzIGRlIHJlc3QgdmFuIGRlIGluZm9ybWF0aWUsIGdlbWFra2VsaWprIHRlIHZpbmRlbiBvcCBiYXNpcyB2YW4gZGUgcmVsZXZhbnRlIGdvZWRlcmVuY29kZS4nLFxyXG4gICAgICAgIGZvcm06XHJcbiAgICAgICAgICAgICdNZXQgaGV0IHpvZWtmb3JtdWxpZXIgdm9vciBCVElcXCdzIGt1bnQgdSB6b2VrZW4gb3AgZ29lZGVyZW5jb2RlIChob29mZHN0dWssIHBvc3QsIG9uZGVydmVyZGVsaW5nKSwgbWFhciBvb2sgb3Agem9la3dvb3JkIG9mIG9tc2NocmlqdmluZyB2YW4gZGUgZ29lZGVyZW4sIGJpanZvb3JiZWVsZC4gPGJyPjxicj4nICsgXHJcbiAgICAgICAgICAgICdOQjogdSBrdW50IEJUSXMgc29ydGVyZW4gb3AgZ29lZGVyZW5jb2RlLCBtYWFyIGJpanZvb3JiZWVsZCBvb2sgb3AgZGF0dW0sIHdhYXJkb29yIHUgZWVuIG5pZXV3c292ZXJ6aWNodCBrcmlqZ3QgbWV0IGRlIGxhYXRzdGUgQlRJcywgb2YgaGV0IHZlbGQgXCJBZmdlZ2V2ZW4gc2luZHNcIiBnZWJydWlrZW4gb20gYWxsZWVuIHJlY2VudGUgQlRJXFwncyB0ZSB0b25lbi4gPGJyPjxicj4nICtcclxuICAgICAgICAgICAgJ05COiB1IGt1bnQgZGUgcmVzdWx0YXRlbiBvb2sgYmVraWprZW4gYWxzIGFmYmVlbGRpbmdlbi4gVmFhayBrYW4gaGV0IGJla2lqa2VuIHZhbiBlZW4gbGlqc3QgdmFuIHBsYWF0amVzIGVlbiBzbmVsbGUgbWFuaWVyIHppam4gb20gdGUgemllbiBvZiBlZW4gYmVwYWFsZCBzdHVrIHZhbiBkZSBub21lbmNsYXR1dXIgdG9lcGFzc2VsaWprIGlzIHZvb3IgaGV0IGdvZWQgZGF0IHUgYWFuIGhldCBpbmRlbGVuIGJlbnQnXHJcbiAgICB9LFxyXG4gICAgYXRyOiB7XHJcbiAgICAgICAgaW50cm86ICdPcmdhbmlzYXRpZXMgaW4gaGV0IFZlcmVuaWdkIEtvbmlua3Jpamsga3VubmVuIGVlbiB2ZXJ6b2VrIG9tIGVlbiBiaW5kZW5kIGluZGVsaW5nc2FkdmllcyBpbmRpZW5lbiBiaWogaHVuIG5hdGlvbmFsZSBkb3VhbmVhdXRvcml0ZWl0ZW4uIERpdCB3b3JkZW4gQVRSXFwncyAoQWR2YW5jZSBUYXJpZmYgUnVsaW5ncykgZ2Vub2VtZC4gWmUgemlqbiBlZW4gdWl0ZXJtYXRlIGhhbmRpZyBodWxwbWlkZGVsIGJpaiBoZXQgYmVwYWxlbiB2YW4gZGUganVpc3RlIGNsYXNzaWZpY2F0aWUgdmFuIHV3IHByb2R1Y3QuIEFscyB1IHZvb3IgaGV0emVsZmRlIHByb2R1Y3QgYWFuZ2lmdGUgZG9ldCwgaGVlZnQgaGV0IGltbWVycyB3YWFyc2NoaWpubGlqayBkZXplbGZkZSBjbGFzc2lmaWNhdGllLiA8YnI+PGJyPlRhcmljIFN1cHBvcnQgaGVscHQgdSBtZXQgZWVuIHRvdGFhbG92ZXJ6aWNodCB2YW4gYWxsZSBhZmdlZ2V2ZW4gQVRSXFwncyBpbiBoZXQgVmVyZW5pZ2QgS29uaW5rcmlqayBtZXQgYmlqYmVob3JlbmRlIGZvdG9cXCdzIGVuIHRla2VuaW5nZW4sIGluY2x1c2llZiBlZW4gaGlzdG9yaWUgdmFuIEFUUlxcJ3MgZGllIG5pZXQgbWVlciBnZWxkaWcgemlqbi4gRGV6ZSBBVFJcXCdzIHppam4sIG5ldCBhbHMgZGUgcmVzdCB2YW4gZGUgaW5mb3JtYXRpZSwgZ2VtYWtrZWxpamsgdGUgdmluZGVuIG9wIGJhc2lzIHZhbiBkZSByZWxldmFudGUgZ29lZGVyZW5jb2RlLicsXHJcbiAgICAgICAgZm9ybTpcclxuICAgICAgICAgICAgJ01ldCBoZXQgem9la2Zvcm11bGllciB2b29yIEFUUlxcJ3Mga3VudCB1IHpvZWtlbiBvcCBnb2VkZXJlbmNvZGUgKGhvb2Zkc3R1aywgcG9zdCwgb25kZXJ2ZXJkZWxpbmcpLCBtYWFyIG9vayBvcCB6b2Vrd29vcmQgb2Ygb21zY2hyaWp2aW5nIHZhbiBkZSBnb2VkZXJlbiwgYmlqdm9vcmJlZWxkLiA8YnI+PGJyPicgKyBcclxuICAgICAgICAgICAgJ05COiB1IGt1bnQgQVRSXFwncyBzb3J0ZXJlbiBvcCBnb2VkZXJlbmNvZGUsIG1hYXIgYmlqdm9vcmJlZWxkIG9vayBvcCBkYXR1bSwgd2FhcmRvb3IgdSBlZW4gbmlldXdzb3ZlcnppY2h0IGtyaWpndCBtZXQgZGUgbGFhdHN0ZSBBVFJcXCdzLCBvZiBoZXQgdmVsZCBcIkFmZ2VnZXZlbiBzaW5kc1wiIGdlYnJ1aWtlbiBvbSBhbGxlZW4gcmVjZW50ZSBBVFJcXCdzIHRlIHRvbmVuLiA8YnI+PGJyPicgK1xyXG4gICAgICAgICAgICAnTkI6IHUga3VudCBkZSByZXN1bHRhdGVuIG9vayBiZWtpamtlbiBhbHMgYWZiZWVsZGluZ2VuLiBWYWFrIGthbiBoZXQgYmVraWprZW4gdmFuIGVlbiBsaWpzdCB2YW4gcGxhYXRqZXMgZWVuIHNuZWxsZSBtYW5pZXIgemlqbiBvbSB0ZSB6aWVuIG9mIGVlbiBiZXBhYWxkIHN0dWsgdmFuIGRlIG5vbWVuY2xhdHV1ciB0b2VwYXNzZWxpamsgaXMgdm9vciBoZXQgZ29lZCBkYXQgdSBhYW4gaGV0IGluZGVsZW4gYmVudCdcclxuICAgIH0sXHJcbiAgICBoZWFkZXI6IHtcclxuICAgICAgICByZWZlcmVuY2VEYXRlUGlja2VyOiAnR2VicnVpayBkZSBkYXR1bWtpZXplciBvbSBpbiB0ZSBzdGVsbGVuIHZvb3Igd2Vsa2UgZGF0dW0gdSBub21lbmNsYXR1dXIsIHRhcmlldmVuIGVuIG1hYXRyZWdlbGVuIHdpbHQgYmVraWprZW4uJyxcclxuICAgICAgICB0cmFkZU1vdmVtZW50UGlja2VyOiAnS2llcyBpbXBvcnQgb2YgZXhwb3J0IG9tIG5vbWVuY2xhdHV1ciBlbiBtYWF0cmVnZWxlbiB0ZSBiZWtpamtlbiB2b29yIGludm9lciBvZiB1aXR2b2VyLicsXHJcbiAgICAgICAgbGFuZ3VhZ2VQaWNrZXI6IFxyXG4gICAgICAgICAgICAnS2llcyDDqcOpbiB2YW4gMjIgRXVyb3Blc2UgdGFsZW4uICcrIFxyXG4gICAgICAgICAgICAnTkI6IGRlIG9uZGVyc3RldW5kZSB0YWxlbiB2b29yIGRlIGludGVyZmFjZSB6aWpuIE5lZGVybGFuZHMgZW4gRW5nZWxzLCBtYWFyIGhldCBncm9vdHN0ZSBkZWVsIHZhbiBkZSBpbmZvcm1hdGllIGlzIGluIGFsbGUgMjIgdGFsZW4gYmVzY2hpa2JhYXIuICcgK1xyXG4gICAgICAgICAgICAnSGFuZGlnIHZvb3IgYWxzIGVlbiBrbGFudCwgbGV2ZXJhbmNpZXIgb2YgY29sbGVnYSBlZW4gYW5kZXJlIG1vZWRlcnRhYWwgaGVlZnQuJyxcclxuICAgIH0sXHJcbiAgICBsYW5kaW5nUGFnZToge1xyXG4gICAgICAgIHdlbGNvbWVUaXRsZTogJ1dlbGtvbSAvIFdlbGNvbWUnLFxyXG4gICAgICAgIHdlbGNvbWVJbnRybzogXHJcbiAgICAgICAgICAgICdIYWxsbyEgV2Vsa29tIGJpaiBUYXJpYyBTdXBwb3J0LiBCZWRhbmt0IHZvb3IgaGV0IGdlYnJ1aWtlbiB2YW4gb256ZSBhcHBsaWNhdGllLiBMYXRlbiB3ZSBldmVuIHJvbmRraWprZW4uIDxicj48YnI+JyArIFxyXG4gICAgICAgICAgICAnQWxzIHUgbGlldmVyIGluIGVlbiBhbmRlcmUgdGFhbCBkb29yZ2FhdCwga2xpayBkYW4gb3AgZGUga25vcCBoaWVyYm92ZW4gb20gw6nDqW4gdmFuIGRlIDIyIG1vZ2VsaWprZSB0YWxlbiB0ZSBraWV6ZW4uIDxicj48aHI+PGJyPicgK1xyXG4gICAgICAgICAgICAnSGVsbG8gYW5kIHdlbGNvbWUgdG8gVGFyaWMgU3VwcG9ydC4gVGhhbmsgeW91IGZvciB1c2luZyBvdXIgYXBwbGljYXRpb24uIFBsZWFzZSBsZXQgdXMgc2hvdyB5b3UgYXJvdW5kLiA8YnI+PGJyPicgK1xyXG4gICAgICAgICAgICAnSWYgeW91XFwnZCBwcmVmZXIgdG8gY29udGludWUgaW4gYSBkaWZmZXJlbnQgbGFuZ3VhZ2UsIHBsZWFzZSBjbGljayB0aGUgYnV0dG9uIGFib3ZlIHRvIGNob29zZSBvbmUgb2YgMjIgcG9zc2libGUgbGFuZ3VhZ2VzLicsXHJcbiAgICAgICAgcmVmZXJlbmNlQ291bnRyeVBpY2tlcjpcclxuICAgICAgICAgICAgJ0RlIGJlbGFuZ3JpamtzdGUgZGF0YWJyb25uZW4gdm9vciBUYXJpYyBTdXBwb3J0IHppam4gZWVuIGFhbnRhbCB2ZXJzY2hpbGxlbmRlIGRvdWFuZXRhcmlldmVuLiBEb29yIG9wIMOpw6luIHZhbiBkZSB2bGFnZ2VuIHRlIGtsaWtrZW4ga3VudCB1IHdpc3NlbGVuIHZhbiBkb3VhbmV0YXJpZWYuIDxicj48YnI+JyArIFxyXG4gICAgICAgICAgICAnRGV6ZSBrZXV6ZSBiZcOvbnZsb2VkdCB6b3dlbCBkZSBub21lbmNsYXR1dXIgZGllIHUgZ2VicnVpa3Qgdm9vciBoZXQgY2xhc3NpZmljZXJlbiBhbHMgZGUgbWFhdHJlZ2VsZW4gdm9vciBpbi0gZW4gdWl0dm9lciBkaWUgdSB0ZSB6aWVuIGtyaWpndC4gJyArXHJcbiAgICAgICAgICAgICdEZSBub21lbmNsYXR1dXIgdm9vciBoZXQgVUsgR2xvYmFsIFRhcmlmZiBpcyBiaWp2b29yYmVlbGQgbmlldCBoZXR6ZWxmZGUgYWxzIGRlIG5vbWVuY2xhdHV1ciB2b29yIFRBUklDLCBoZXQgZG91YW5ldGFyaWVmIHZhbiBkZSBFVS4gPGJyPjxicj4nICtcclxuICAgICAgICAgICAgJ05COiB1IGt1bnQgb3AgZWxrIG1vbWVudCB3aXNzZWxlbiB2YW4gZG91YW5ldGFyaWVmIGRvb3IgdGUga2xpa2tlbiBvcCBkZSB2bGFnZ2VuIGluIGRlIG1lbnViYWxrLicsXHJcbiAgICAgICAgaW50cm9CdXR0b246XHJcbiAgICAgICAgICAgICdPbSBtZWVyIGluZm9ybWF0aWUgdGUga3JpamdlbiBvdmVyIGVlbiBiZXBhYWxkZSBwYWdpbmEsIGt1bnQgdSBrbGlra2VuIG9wIGRlIGludHJva25vcCdcclxuICAgIH0sXHJcbiAgICBtYWluTWVudToge1xyXG4gICAgICAgIGludHJvOiAnVmlhIGhldCBtZW51IGtyaWpndCB1IHRvZWdhbmcgdG90IGRlIHZlcnNjaGlsbGVuZGUgbW9kdWxlcyBiaW5uZW4gdXcgYWJvbm5lbWVudC4gPGJyPjxicj5UaXA6IGdlYnJ1aWsgZGUgRW50ZXItdG9ldHMgb20gZG9vciBkZXplIGludHJvZHVjdGllIHRlIGdhYW4uJyxcclxuICAgICAgICBjaGFwdGVyczogJ0JsYWRlciBkb29yIGRlIG5vbWVuY2xhdHV1ciBlbiBoZXQgZG91YW5ldGFyaWVmLiBVIGt1bnQgaGllciBvb2sgZGlyZWN0IGluIHpvZWtlbiB2aWEgZGUgem9la2JveCBpbiBkZSBtZW51YmFsay4nLFxyXG4gICAgICAgIG5ld3M6ICdIZXQgbGFhdHN0ZSBkb3VhbmVuaWV1d3MnLFxyXG4gICAgICAgIGVidGk6ICdEZSB2b2xsZWRpZ2UgRUJUSS1kYXRhYmFzZTogaG9uZGVyZGR1aXplbmRlbiB2b29yYmVlbGRlbiB2YW4gcHJvZHVjdGVuIGRpZSBkb29yIGRlIGRvdWFuZSB6aWpuIGdlY2xhc3NpZmljZWVyZCcsXHJcbiAgICAgICAgYWJjOiAnQ29udHJvbGVlciBlbiB2ZXJyaWprIGhvbmRlcmRlbiBjb2RlcyBwZXIgbWludXV0IG1ldCBUYXJpYyBTdXBwb3J0IEFCQycsXHJcbiAgICAgICAgY29ycmVsYXRpb25UYWJsZTogJ1ZpbmQgZGUgdm9vcmxvcGVycyBlbiBvcHZvbGdlcnMgdmFuIGdvZWRlcmVuY29kZXMnLFxyXG4gICAgICAgIHJlZmVyZW5jZVByaWNlczogJ0VlbiBjb21wbGV0ZSBsaWpzdCB2YW4gZGUgZGFnZWxpamtzZSBmb3JmYWl0YWlyZSBpbnZvZXJ3YWFyZGVzIGVuIGVlbmhlaWRzcHJpanplbiB2b29yIGdyb2VudGVuIGVuIGZydWl0JyxcclxuICAgICAgICBjYXNlTGF3OiAnTmVkZXJsYW5kc2UgZW4gRXVyb3Blc2UgZG91YW5lcmVjaHRzcHJhYWsuJ1xyXG4gICAgfSxcclxuICAgIG1lYXN1cmVzOiB7XHJcbiAgICAgICAgaW50cm86IFxyXG4gICAgICAgICAgICAnSGllciB6aWV0IHUgZGUgbWFhdHJlZ2VsZW4gZGllIGdlbGRlbiBiaWogaW4tIG9mIHVpdHZvZXIgdmFuIGVlbiBnb2VkIG1ldCBkZXplIGdvZWRlcmVuY29kZS4gPGJyPjxicj4nICtcclxuICAgICAgICAgICAgJ0hpZXJiaWogbWFrZW4gd2UgZ2VicnVpayB2YW4gZWVuIGFhbnRhbCB2ZXJzY2hpbGxlbmRlIGtsZXVyZW4gb20gdSB0ZSBoZWxwZW4gc25lbCBkZSB2ZXJzY2hpbGxlbmRlIHR5cGVzIGNvZGVzIHRlIGhlcmtlbm5lbi4gJyArXHJcbiAgICAgICAgICAgICdPcCBkZXplIG1hbmllciBrdW5uZW4gd2UgZWVuIHZlZWxoZWlkIGFhbiBpbmZvcm1hdGllIG9wIGVlbiBjb21wYWN0ZSBtYW5pZXIgd2VlcmdldmVuLiBEZSBrbGV1cmVuIHppam4gYWxzIHZvbGd0OiA8YnI+PGJyPicgK1xyXG4gICAgICAgICAgICAnPHVsIGNsYXNzPVwibmF2IG5hdi1waWxscyBuYXYtc3RhY2tlZFwiPicgK1xyXG4gICAgICAgICAgICAnPGxpPjxhIGNsYXNzPVwiYnRuIGJ0bi1jZXJ0aWZpY2F0ZS1jb2RlXCI+QmVzY2hlaWRjb2RlPC9hPjwvbGk+JyArXHJcbiAgICAgICAgICAgICc8bGk+PGEgY2xhc3M9XCJidG4gYnRuLWZvb3Rub3RlXCI+Vm9ldG5vb3Q8L2E+PC9saT4nICtcclxuICAgICAgICAgICAgJzxsaT48YSBjbGFzcz1cImJ0biBidG4tYWRkY29kXCI+QWFudnVsbGVuZGUgY29kZTwvYT48L2xpPicgK1xyXG4gICAgICAgICAgICAnPGxpPjxhIGNsYXNzPVwiYnRuIGJ0bi1wcmVmY29kZVwiPlByZWZlcmVudGllY29kZTwvYT48L2xpPicgK1xyXG4gICAgICAgICAgICAnPC91bD4nLFxyXG4gICAgICAgIGZvcm06XHJcbiAgICAgICAgICAgICdNZXQgYmVodWxwIHZhbiBkZXplIHZlbGRlbiBrdW50IHUgZGUgbWFhdHJlZ2VsZW4gZmlsdGVyZW4gb3AgbGFuZGNvZGUsIGFhbnZ1bGxlbmRlIGNvZGVzIHRvZXBhc3NlbiBlbiBlZW4ga2V1emUgbWFrZW4gd2F0IGJldHJlZnQgaGV0IHRvZSB0ZSBwYXNzZW4gaW52b2VycmVjaHQuIDxicj48YnI+JyArXHJcbiAgICAgICAgICAgICdIaW50OiBoZXQgaXMgb29rIG1vZ2VsaWprIG9tIGRlIGNvZGUgb2YgbmFhbSB2YW4gaGV0IGxhbmQgbWV0ZWVuIGluIGRlIHpvZWtib3ggaW4gZGUgYm92ZW5iYWxrIHRlIHR5cGVuLicsXHJcbiAgICAgICAgdmFsaWRhdGVEZWNsYXJhdGlvbjpcclxuICAgICAgICAgICAgJ0luIGRpdCBzY2hlcm0ga3VudCB1IGRlIGdlZ2V2ZW5zIHZvb3IgZWVuIGRvdWFuZS1hYW5naWZ0ZXJlZ2VsIGNvbnRyb2xlcmVuLiBGaWx0ZXIgZWVyc3Qgb3AgbGFuZGNvZGUsIHBhcyBhYW52dWxsZW5kZSBjb2RlcyB0b2UgJyArXHJcbiAgICAgICAgICAgICdlbiBtYWFrIGVlbiBrZXV6ZSB2b29yIHdhdCBiZXRyZWZ0IGhldCB0b2UgdGUgcGFzc2VuIGludm9lcnJlY2h0LiBWdWwgZGFhcm5hIGRlIGRvdWFuZXdhYXJkZSBlbiBkZSByZWxldmFudGUgaG9ldmVlbGhlZGVuIGluLiBLaWVzIHRvdCBzbG90IGRlIHRvZXBhc2JhcmUgJyArXHJcbiAgICAgICAgICAgICdjb2RlcyB2b29yIGJpanpvbmRlcmUgYmVwYWxpbmdlbiAoWS1jb2RlcykgZW4gb3ZlcmlnZSBiZXNjaGVpZGNvZGVzIGVuIHN0YXJ0IGRlIGNvbnRyb2xlLicsXHJcbiAgICAgICAgY2FsY3VsYXRlRHV0eTpcclxuICAgICAgICAgICAgJ0luIGRpdCBzY2hlcm0ga3VudCB1IGRlIGludm9lcnJlY2h0ZW4gZW4gKHZvb3IgYmVwYWFsZGUgbGFuZGVuKSBkZSBuYXRpb25hbGUgYmVsYXN0aW5nZW4gYmVyZWtlbmVuLiBGaWx0ZXIgZWVyc3Qgb3AgbGFuZGNvZGUsIHBhcyBhYW52dWxsZW5kZSBjb2RlcyB0b2UgJyArXHJcbiAgICAgICAgICAgICdlbiBtYWFrIGVlbiBrZXV6ZSB2b29yIHdhdCBiZXRyZWZ0IGhldCB0b2UgdGUgcGFzc2VuIGludm9lcnJlY2h0LiBWdWwgZGFhcm5hIGRlIGRvdWFuZXdhYXJkZSBlbiBkZSByZWxldmFudGUgaG9ldmVlbGhlZGVuIGluLiBLaWVzIHRvdCBzbG90IGRlIHRvZXBhc2JhcmUgJyArXHJcbiAgICAgICAgICAgICdjb2RlcyB2b29yIGJpanpvbmRlcmUgYmVwYWxpbmdlbiAoWS1jb2RlcykgZW4gb3ZlcmlnZSBiZXNjaGVpZGNvZGVzIGVuIGRydWsgb3AgZGUga25vcCBcIkJlcmVrZW4gcmVjaHRlblwiLicsXHJcbiAgICB9LFxyXG4gICAgbmV3czoge1xyXG4gICAgICAgIGludHJvOiBcclxuICAgICAgICAgICAgJ09uZGVyIFwiV2V0Z2V2aW5nIEVVXCIgdmluZHQgdSBkZSBsYWF0c3RlIHJlZ2VsZ2V2aW5nIGVuIGFhbmtvbmRpZ2luZ2VuIHZhbiBFVVItTGV4LiAnICtcclxuICAgICAgICAgICAgJ09uZGVyIFwiUmVjaHRzcHJhYWtcIiB2aW5kdCB1IGRlIGxhYXRzdGUgTmVkZXJsYW5kc2UgZW4gRXVyb3Blc2UgdWl0c3ByYWtlbi4gPGJyPjxicj4nICsgXHJcbiAgICAgICAgICAgICdPbmRlciBcIkRvdWFuZSB2b29yIGJlZHJpanZlblwiIHZpbmR0IHUgbmlldXdzYmVyaWNodGVuIHZhbiBkZSBOZWRlcmxhbmRzZSBkb3VhbmUnXHJcbiAgICB9LFxyXG4gICAgdWk6IHtcclxuICAgICAgICBkb25lOiAnRWluZGUnLFxyXG4gICAgICAgIGhlbHA6ICdIZWxwJyxcclxuICAgICAgICBuZXh0OiAnVm9sZ2VuZGUnLFxyXG4gICAgICAgIHByZXZpb3VzOiAnVm9yaWdlJyxcclxuICAgICAgICBzdGFydFRvdXI6ICdJbnRybydcclxuICAgIH0sXHJcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBDQVNfUk46ICdDQVMgUk4nLFxyXG4gICAgQ2hlbWljYWxzU2VhcmNoOiAnWm9layBjaGVtaXNjaGUgc3RvZmZlbicsXHJcbiAgICBDaGFyYWN0ZXJpc3RpYzogJ0tlbm1lcmsnLFxyXG4gICAgQ2hhcmFjdGVyaXN0aWNzOiAnS2VubWVya2VuJyxcclxuICAgIENvbW1lbnQ6ICdPcG1lcmtpbmcnLFxyXG4gICAgQ1VTOiAnQ1VTJyxcclxuICAgIEVDX051bWJlcjogJ0VDLW51bW1lcicsXHJcbiAgICBFY2ljczogJ0VDSUNTJyxcclxuICAgIEVjaWNzRGV0YWlsczogJ0VDSUNTLWRldGFpbHMnLFxyXG4gICAgRWNpY3NMaW5rVGV4dDogJ0tsaWsgaGllciBvbSBkaXQgaXRlbSB0ZSBvcGVuZW4gaW4gZGUgRUNJQ1MtZGF0YWJhc2UuJyxcclxuICAgIEluQ2hJOiAnSW5DaEknLFxyXG4gICAgSW5DaElLZXk6ICdJbkNoSS1zbGV1dGVsJyxcclxuICAgIExhbmd1YWdlQ29kZTogJ1RhYWxjb2RlJyxcclxuICAgIExldmVsOiAnTml2ZWF1JyxcclxuICAgIE5hbWU6ICdOYWFtJyxcclxuICAgIE5hbWVzOiAnTmFtZW4nLFxyXG4gICAgTm9tZW5jbGF0dXJlOiAnTm9tZW5jbGF0dXVyJyxcclxuICAgIE9yZGVyOiAnVm9sZ29yZGUnLFxyXG4gICAgU2VhcmNoRWNpY3NEYXRhYmFzZTogJ1pvZWsgaW4gRUNJQ1MtZGF0YWJhc2UnLFxyXG4gICAgVU5fTnVtYmVyOiAnVU4tTnVtbWVyJyxcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIEN1cnJlbmN5OiAnTXVudGVlbmhlaWQnLFxyXG4gICAgQ3VycmVuY3lDb2RlOiAnQ29kZSBtdW50ZWVuaGVpZCcsXHJcbiAgICBDdXJyZW5jeUNvZGVNb2RhbFRpdGxlOiAnS2llcyBlZW4gbXVudGVlbmhlaWQnLFxyXG4gICAgQ3VycmVuY3lDb2RlVHlwZWFoZWFkUGxhY2Vob2xkZXI6ICdab2VrIG9wIGNvZGUgb2YgbmFhbSBtdW50ZWVuaGVpZCcsXHJcbiAgICBDdXJyZW5jeUNvbnZlcnNpb25SZXN1bHRzOiAnUmVzdWx0YWF0IHZhbiBvbXJla2VuaW5nIHZhbHV0YScsXHJcbiAgICBDdXJyZW5jeU5hbWU6ICdOYWFtIG11bnRlZW5oZWlkJyxcclxuICAgIEV4Y2hhbmdlUmF0ZXM6ICdXaXNzZWxrb2Vyc2VuJyxcclxuICAgIE51bWJlck9mRGVjaW1hbFBsYWNlczogJ0FhbnRhbCBjaWpmZXJzIGFjaHRlciBkZSBrb21tYScsXHJcbiAgICBVc2VUaGVGaWVsZHNCZWxvd1RvQ29udmVydEJldHdlZW5fYW5kXzogJ0dlYnJ1aWsgZGUgdmVsZGVuIGhpZXJvbmRlciBvbSBiZWRyYWdlbiBvbSB0ZSByZWtlbmVuIHR1c3NlbiB7eyBpbnZlcnNlTW9uZXRhcnlWYWx1ZS51bml0IH19IGVuIHt7IG1vbmV0YXJ5VmFsdWUudW5pdCB9fScsXHJcbn07XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgQ2hvb3NlTmF0aW9uYWxDb21tb2RpdHlDb2RlVG9GaW5kVmF0UmF0ZTogJ0tpZXMgaGllcmJvdmVuIGVlbiBuYXRpb25hbGUgZ29lZGVyZW5jb2RlIG9tIGRlIGhldCBqdWlzdGUgYnR3LXRhcmllZiB0ZSB2aW5kZW4uJyxcclxuICAgIENob29zZUV4Y2lzZUNvZGVUb0ZpbmRFeGNpc2VSYXRlczogJ0tpZXMgaGllcmJvdmVuIGVlbiBhY2Npam5zY29kZSBvbSBoZXQganVpc3RlIGFjY2lqbnN0YXJpZWYgdGUgdmluZGVuLicsXHJcbiAgICBFeGNpc2VDb2RlOiAnQWNjaWpuc2NvZGUnLFxyXG4gICAgRXhwbGFuYXRvcnlOb3Rlc1Byb3ZpZGVkQnlHZXJtYW5DdXN0b21zOiAnVG9lbGljaHRpbmdlbiBiZXNjaGlrYmFhciBnZXN0ZWxkIGRvb3IgZGUgRHVpdHNlIGRvdWFuZScsXHJcbiAgICBFeGNpc2VEdXR5UmF0ZTogJ1RhcmllZiBhY2Npam5zJyxcclxuICAgIEV6dEV4Y2lzZUNvZGVGaWVsZFBsYWNlSG9sZGVyOiAnVnVsIGFjY2lqbnNjb2RlIGluIG9mIHpvZWsnLFxyXG4gICAgRXp0RXhjaXNlQ29kZVNlbGVjdG9yTW9kYWxUaXRsZTogJ05vbWVuY2xhdHV1ciBhY2Npam5zJyxcclxuICAgIEdlcm1hbkV4cGxhbmF0b3J5Tm90ZXM6ICdUb2VsaWNodGluZ2VuIER1aXRzbGFuZCcsXHJcbiAgICBIaW53ZWlzZTogJ0hpbndlaXNlJyxcclxuICAgIE5hdGlvbmFsQ29tbW9kaXR5Q29kZTogJ05hdGlvbmFsZSBnb2VkZXJlbmNvZGUnLFxyXG4gICAgTmF0aW9uYWxOb21lbmNsYXR1cmU6ICdOYXRpb25hbGUgbm9tZW5jbGF0dXVyJyxcclxuICAgIFRleHRzUHVibGlzaGVkQnlHZXJtYW5DdXN0b21zOiAnVGVrc3RlbiBnZXB1YmxpY2VlcmQgZG9vciBEdWl0c2UgZG91YW5lJyxcclxuICAgIFRleHRzR2VybWFuQ3VzdG9tczogJ1Rla3N0ZW4gRHVpdHNlIGRvdWFuZSdcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIEV1TWVtYmVyU3RhdGU6ICdFVS1saWRzdGFhdCdcclxufTsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIHRhYnM6IHtcclxuICAgICAgICBNZWFzdXJlczogJ01hYXRyZWdlbGVuJyxcclxuICAgICAgICBWYWxpZGF0ZURlY2xhcmF0aW9uOiAnVmFsaWRlZXIgYWFuZ2lmdGUnLFxyXG4gICAgICAgIENhbGN1bGF0ZUR1dHk6ICdCZXJla2VuIHJlY2h0ZW4nXHJcbiAgICB9LFxyXG4gICAgZm9ybToge1xyXG4gICAgICAgIGxlZ2VuZFZhbHVlOiAnV2FhcmRlJyxcclxuICAgICAgICByYWRpb01ldGhvZExhYmVsOiAnTWV0aG9kZScsXHRcclxuICAgICAgICByYWRpb01ldGhvZE9wdGlvbkNhbGN1bGF0ZVZhbHVlOiAnV2FhcmRlIGJlcmVrZW5lbicsXHJcbiAgICAgICAgcmFkaW9NZXRob2RPcHRvbkVudGVyVmFsdWU6ICdXYWFyZGUgaW52b2VyZW4nXHJcbiAgICB9LFxyXG4gICAgZmluYW5jaWFsQ29uZGl0aW9uczoge1xyXG4gICAgICAgIEU6IHtcclxuICAgICAgICAgICAgdGl0bGU6ICdEZSBhYW5nZWdldmVuIGhvZXZlZWxoZWlkIG9mIHByaWpzIHBlciBlZW5oZWlkLCBuYWFyIGdlbGFuZyBoZXQgZ2V2YWwsIGlzIGdlbGlqayBhYW4gb2YgbWluZGVyIGRhbiBoZXQgYWFuZ2VkdWlkZSBtYXhpbXVtLCBhbmRlcnMgb3ZlcmxlZ2dpbmcgdmFuIGhldCB2ZXJlaXN0ZSBkb2N1bWVudCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIGNvbDE6ICdIb2V2ZWVsaGVpZCBvZiBwcmlqcyBwZXIgZWVuaGVpZCcsXHJcbiAgICAgICAgICAgICAgICBjb2wyOiAnVGFyaWVmJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBGOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiAnVGFyaWVmIG9wIGJhc2lzIHZhbiBuZXR0byBwcmlqcyBmcmFuY28gZ3JlbnMsIHbDs8OzciBpbmtsYXJpbmcnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBjb2wxOiAnTmV0dG8gcHJpanMgZnJhbmNvIGdyZW5zLCB2w7PDs3IgaW5rbGFyaW5nJyxcclxuICAgICAgICAgICAgICAgIGNvbDI6ICdUYXJpZWYnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIEw6IHtcclxuICAgICAgICAgICAgdGl0bGU6ICdEZSBDSUYtcHJpanMgbW9ldCBob2dlciB6aWpuIGRhbiBkZSBtaW5pbXVtcHJpanMnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBjb2wxOiAnQ0lGLXByaWpzJyxcclxuICAgICAgICAgICAgICAgIGNvbDI6ICdUYXJpZWYnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIE06IHtcclxuICAgICAgICAgICAgdGl0bGU6ICdEZSBpbnZvZXJwcmlqcyBtb2V0IGdlbGlqayB6aWpuIGFhbiBvZiBob2dlciBkYW4gZGUgbWluaW11bXByaWpzL3JlZmVyZW50aWVwcmlqcycsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIGNvbDE6ICdJbnZvZXJwcmlqcycsXHJcbiAgICAgICAgICAgICAgICBjb2wyOiAnVGFyaWVmJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBWOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiAnRGUgaW52b2VycHJpanMgZGllbnQgZ2VsaWprIHRlIHppam4gb2YgaG9nZXIgZGFuIGRlIGluZ2FuZ3ByaWpzJyxcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgY29sMTogJ0ludm9lcnByaWpzJyxcclxuICAgICAgICAgICAgICAgIGNvbDI6ICdUYXJpZWYnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgbWV1cnNpbmc6IHtcclxuICAgICAgICBjYWxjdWxhdGVEZXNjcmlwdGlvbjogJ1Z1bCBvbmRlcnN0YWFuZGUgZ2VnZXZlbnMgaW4gb20gZGUgYWFudnVsbGVuZGUgY29kZSB2b29yIGhldCBiZXJla2VuZW4gdmFuIGhldCBhZ3JhcmlzY2ggZWxlbWVudCBvcCB0ZSB2cmFnZW4uJyxcclxuICAgICAgICBjYWxjdWxhdGVUaXRsZTogJ0FhbnZ1bGxlbmRlIGNvZGUgYWdyYXJpc2NoIGVsZW1lbnQgYmVyZWtlbmVuJyxcclxuICAgICAgICBpbXBvc3NpYmxlQ29tYmluYXRpb246ICdPbm1vZ2VsaWprZSBjb21iaW5hdGllIHZhbiBpbmdyZWRpZW50ZW4gKHRvdGFhbCBnZXdpY2h0IGJvdmVuIDEwMCUpJyxcclxuICAgICAgICBtaWxrZmF0OiAnTWVsa3ZldCAoJSBnZXdpY2h0KScsXHJcbiAgICAgICAgbWlsa3Byb3RlaW5zOiAnTWVsa3Byb3Rlw69uZW4gKCUgZ2V3aWNodCknLFxyXG4gICAgICAgIHNhY2NoYXJpbjogJ1NhY2NoYXJvc2UvaW52ZXJ0c3Vpa2VyL2lzb2dsdWNvc2UgKCUgZ2V3aWNodCknLFxyXG4gICAgICAgIHN0YXJjaEdsdWNvc2U6ICdaZXRtZWVsL2dsdWNvc2UgKCUgZ2V3aWNodCknLFxyXG4gICAgfVxyXG59O1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIENoYXB0ZXJzOiAnSG9vZmRzdHVra2VuJyxcclxuICAgIFNlYXJjaDogJ1pvZWtlbicsXHJcbiAgICBOZXdzOiAnTmlldXdzJyxcclxuICAgIEJpbmRpbmdUYXJpZmZJbmZvcm1hdGlvbjogJ0JpbmRlbmRlIHRhcmllZmlubGljaHRpbmdlbicsXHRcclxuICAgIENoZW1pY2Fsc1NlYXJjaDogJ1pvZWsgY2hlbWlzY2hlIHN0b2ZmZW4nLFxyXG4gICAgVmFsaWRhdGVCdXNpbmVzc0luZm9ybWF0aW9uOiAnVmFsaWRlZXIgYmVkcmlqZnNpbmZvcm1hdGllJyxcdFxyXG4gICAgQWR2YW5jZVRhcmlmZlJ1bGluZ3M6ICdBZHZhbmNlIFRhcmlmZiBSdWxpbmdzJyxcclxuICAgIFRhcmljU3VwcG9ydEFCQzogJ0FCQyAtIEJlc3RhbmRzY29udHJvbGUnLFxyXG4gICAgQ29ycmVsYXRpb25UYWJsZTogJ1RyYW5zcG9uZXJpbmdzdGFiZWwnLFxyXG4gICAgVHJhZGVTdGF0aXN0aWNzOiAnSGFuZGVsc3N0YXRpc3RpZWtlbicsXHJcbiAgICBUcmFuc2FjdGlvblZhbHVlOiAnVHJhbnNhY3RpZXdhYXJkZScsXHJcbiAgICBSZWZlcmVuY2VQcmljZXM6ICdSZWZlcmVudGllcHJpanplbiBFVScsXHJcbiAgICBDYXNlTGF3OiAnUmVjaHRzcHJhYWsnLFxyXG4gICAgVGV4dHNCeUdlcm1hbkN1c3RvbXM6ICdUZWtzdGVuIER1aXRzZSBkb3VhbmUnLFxyXG4gICAgUmVmZXJlbmNlTGlzdHM6ICdSZWZlcmVudGllbGlqc3RlbicsXHJcbiAgICBBZGRpdGlvbmFsQ29kZXM6ICdBYW52dWxsZW5kZSBjb2RlcycsXHJcbiAgICBDZXJ0aWZpY2F0ZUNvZGVzOiAnQmVzY2hlaWRjb2RlcycsXHJcbiAgICBGb290bm90ZXM6ICdWb2V0bm90ZW4nLFxyXG4gICAgUmVnaW9uczogJ1JlZ2lvXFwncycsXHJcbiAgICBFeGNoYW5nZVJhdGVzOiAnV2lzc2Vsa29lcnNlbicsXHJcbiAgICBDaGFuZ2VQYXNzd29yZDogJ1dhY2h0d29vcmQgd2lqemlnZW4nLFxyXG4gICAgTG9nb3V0OiAnVWl0bG9nZ2VuJyxcclxuICAgIEZhdm9yaXRlczogJ0Zhdm9yaWV0ZW4nLFx0XHJcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBEdXRjaEN1c3RvbXNOZXdzRmVlZDogJ0RvdWFuZSB2b29yIGJlZHJpanZlbicsXHJcbiAgICBOZXdzT3ZlcnZpZXc6ICdOaWV1d3NvdmVyemljaHQnLFxyXG4gICAgT3BlbkluVGFyaWNTdXBwb3J0OiAnT3BlbiBpbiBUYXJpYyBTdXBwb3J0J1xyXG59OyIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgQW5ub3RhdGlvbnM6ICdBYW50ZWtlbmluZ2VuJyxcclxuICAgIEFubm90YXRpb25zRmlyc3RMZXR0ZXI6ICdBJyxcclxuXHJcbiAgICBDaGFwdGVyOiAnSG9vZmRzdHVrJyxcclxuICAgIENoYXB0ZXJzOiAnSG9vZmRzdHVra2VuJyxcclxuICAgIENoYXB0ZXJfY29kZV86ICdIb29mZHN0dWsge3sgY29kZSB9fScsXHJcbiAgICBDaGFwdGVyX0dvb2RzQ29kZU9yU2VjdGlvbk51bWJlcl86ICdIb29mZHN0dWsge3sgR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyIH19JyxcclxuICAgIFxyXG4gICAgQ29tYmluZWROb21lbmNsYXR1cmU6ICdHZWNvbWJpbmVlcmRlIG5vbWVuY2xhdHV1cicsXHJcblxyXG4gICAgQ29tbW9kaXR5Q2xhc3NpZmljYXRpb246ICdDbGFzc2lmaWNhdGllIGdvZWRlcmVuJyxcclxuICAgIENvbW1vZGl0eUNvZGU6ICdHb2VkZXJlbmNvZGUnLFxyXG4gICAgQ29tbW9kaXR5Q29kZXM6ICdHb2VkZXJlbmNvZGVzJyxcclxuICAgIENvbW1vZGl0eUNvZGVzRm91bmRJblRleHQ6ICdHb2VkZXJlbmNvZGVzIGdldm9uZGVuIGluIHRla3N0JyxcclxuXHJcbiAgICBIZWFkaW5nOiAnUG9zdCcsXHJcbiAgICBIZWFkaW5nX2NvZGVfOiAnUG9zdCB7eyBjb2RlIH19JyxcclxuICAgIEhlYWRpbmdfR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyXzogJ1Bvc3Qge3sgR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyIH19JyxcclxuICAgIEhlYWRpbmdzOiAnUG9zdGVuJyxcclxuXHJcbiAgICBTZWN0aW9uOiAnQWZkZWxpbmcnLFxyXG4gICAgU2VjdGlvbl9udW1iZXJfOiAnQWZkZWxpbmcge3sgbnVtYmVyIH19JyxcdFxyXG4gICAgU2VjdGlvbl9Hb29kc0NvZGVPclNlY3Rpb25OdW1iZXJfOiAnQWZkZWxpbmcge3sgR29vZHNDb2RlT3JTZWN0aW9uTnVtYmVyIH19JyxcdFxyXG4gICAgU2VjdGlvbnM6ICdBZmRlbGluZ2VuJyxcclxuXHJcbiAgICBTdWJDaGFwdGVyX0dvb2RzQ29kZU9yU2VjdGlvbk51bWJlcl86ICdTdWItaG9vZmRzdHVrIHt7IEdvb2RzQ29kZU9yU2VjdGlvbk51bWJlciB9fScsXHJcblxyXG4gICAgU3ViaGVhZGluZzogJ09uZGVydmVyZGVsaW5nJyxcclxuXHJcbiAgICBXY29DbGFzc2lmaWNhdGlvbk9waW5pb25zOiAnV0NPIENsYXNzaWZpY2F0aW9uIE9waW5pb25zJyxcclxuICAgIENsYXNzaWZpY2F0aW9uczogJ1RhcmlmZXJpbmdlbicsXHJcbiAgICBFeHBsYW5hdG9yeU5vdGVzRmlyc3RMZXR0ZXI6ICdUJyxcclxuICAgIEV4cGxhbmF0b3J5Tm90ZXM6ICdUb2VsaWNodGluZ2VuJyxcclxuICAgIEV4cGxhbmF0b3J5Tm90ZXNDbjogJ0dOLXRvZWxpY2h0aW5nZW4gLSBFVScsXHJcbiAgICBFeHBsYW5hdG9yeU5vdGVzSHM6ICdHUy10b2VsaWNodGluZ2VuIC0gV0NPJyxcclxuICAgIE5vbWVuY2xhdHVyZTogJ05vbWVuY2xhdHV1cicsXHJcbiAgICBOb21lbmNsYXR1cmVHcm91cHM6ICdOb21lbmNsYXR1dXJncm9lcGVuJyxcclxuICAgIE5vbWVuY2xhdHVyZUhlYWRpbmdzOiAnTm9tZW5jbGF0dXVyIC0gUG9zdGVuJyxcclxuICAgIE5vbWVuY2xhdHVyZUhlYWRpbmdfY29kZV86ICdOb21lbmNsYXR1dXIgLSBQb3N0IHt7IGNvZGUgfX0nLFxyXG5cclxuICAgIFNlY3Rpb25BbmRDaGFwdGVyTm90ZXM6ICdBYW50ZWtlbmluZ2VuIG5vbWVuY2xhdHV1cicsXHJcbn07Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBvcmRlck51bWJlclByZWZpeDogJ29yZGVyOicsXHJcbiAgICBvcmRlck51bWJlcjoge1xyXG4gICAgICAgIGJhbGFuY2U6ICdTYWxkbycsXHJcbiAgICAgICAgY2hhbmdlRGF0ZTogJ0RhdHVtIHdpanppZ2luZycsXHJcbiAgICAgICAgY3JpdGljYWw6ICdLcml0aWVrJyxcclxuICAgICAgICBjdXJyZW50Vm9sdW1lOiAnQmVzY2hpa2JhcmUgaG9ldmVlbGhlaWQnLFxyXG4gICAgICAgIGVuZERhdGU6ICdFaW5kZGF0dW0nLFxyXG4gICAgICAgIGluaXRpYWxWb2x1bWU6ICdPb3JzcHJvbmtlbGlqa2UgaG9ldmVlbGhlaWQnLFxyXG4gICAgICAgIG1lYXN1cmVtZW50VW5pdDogJ01hYXRzdGFmJyxcclxuICAgICAgICBub1F1b3RhOiAnRXIgaXMgZ2VlbiBjb250aW5nZW50IGdldm9uZGVuIHZvb3IgZGl0IG9yZGVybnVtbWVyLicsXHJcbiAgICAgICAgbm9TdGF0dXM6ICdFciBpcyBnZWVuIHN0YXR1cy1pbmZvcm1hdGllIGJlc2NoaWtiYWFyJyxcclxuICAgICAgICBwZXJpb2RTdGFydERhdGU6ICdCZWdpbmRhdHVtIHBlcmlvZGUnLFxyXG4gICAgICAgIHJlZ2lvbjogJ0dlb2dyYWZpc2NoIGdlYmllZCcsXHJcbiAgICAgICAgc3RhcnREYXRlOiAnSW5nYW5nc2RhdHVtJyxcclxuICAgICAgICBzdGF0dXM6ICdTdGF0dXMnLFxyXG4gICAgfSxcclxuICAgIHF1b3RhU3RhdHVzOiB7XHJcbiAgICAgICAgYmxvY2s6ICdHZWJsb2trZWVyZCcsXHJcbiAgICAgICAgY3JpdGljYWw6ICdLcml0aWVrJyxcclxuICAgICAgICBleGhhdXN0aW9uOiAnVWl0Z2VwdXQnLFxyXG4gICAgICAgIHJlb3BlbmluZzogJ0hlcm9wZW5kJyxcclxuICAgICAgICByZXN1bWU6ICdIZXJ2YXQnLFxyXG4gICAgICAgIHN0YXJ0OiAnR2VvcGVuZCcsXHJcbiAgICAgICAgc3VzcGVuc2lvbjogJ0dlc2Nob3JzdCcsXHJcbiAgICAgICAgdW5ibG9ja2luZzogJ0Jsb2trZXJpbmcgb3BnZWhldmVuJyxcclxuICAgICAgICB1bnN1c3BlbnNpb246ICdTY2hvcnNpbmcgb3BnZWhldmVuJ1xyXG4gICAgfVxyXG59O1xyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIE5vQWNjZXNzOiAnPGgyPlZvb3IgdG9lZ2FuZyB0b3QgZGV6ZSBkYXRhIGlzIGVlbiBleHRyYSBhYm9ubmVtZW50IHZlcmVpc3QuPC9oMj4gJyArXHJcbiAgICAnPHA+SW4gZGV6ZSBtb2R1bGUgdmluZHQgdSBlZW4gY29tcGxlZXQgb3ZlcnppY2h0IHZhbiBkZSByZWZlcmVudGllcHJpanplbiB2b29yIGxhbmRib3V3cHJvZHVjdGVuLiAnICtcclxuICAgICdVIHZpbmQgaGllciBlbGtlIGRhZyBkZSBsYWF0c3RlIGRhZ3dhYXJkZXMsIGZvcmZhaXRhaXJlIGludm9lcndhYXJkZW4gZW4gZWVuaGVpZHNwcmlqemVuLiA8L3A+JyArXHJcbiAgICAnPHA+Vm9vciB0b2VnYW5nIGlzIGVlbiBhcGFydCBhYm9ubmVtZW50IHZlcmVpc3QuIE5lZW0gY29udGFjdCBvcCBtZXQgVGFyaWMgU3VwcG9ydCBhbHMgdSBpbnRlcmVzc2UgaGVlZnQuPC9wPiAnICtcclxuICAgICc8cD48ZW0+SGllcm9uZGVyIHZpbmR0IHUgZWVuIHZvb3JiZWVsZCB2YW4gZGUgZGF0YSBkaWUgYmVzY2hpa2JhYXIgaXMuIE5COiBkaXQgdm9vcmJlZWxkIGlzIGdlZW4gYWN0dWVsZSBkYXRhLjwvZW0+PC9wPicsXHJcbiAgICBvdmVydmlldzoge1xyXG4gICAgICAgIEVuZERhdGU6ICdTdG9wdCBvcCcsXHJcbiAgICAgICAgTm9QcmljZXM6ICdFciBrb25kZW4gb3AgZGl0IG1vbWVudCBnZWVuIHJlZmVyZW50aWVwcmlqemVuIGdldm9uZGVuIHdvcmRlbicsXHJcbiAgICAgICAgU3RhbmRhcmRJbXBvcnRWYWx1ZXM6ICdGb3JmYWl0YWlyZSBpbnZvZXJ3YWFyZGVzJyxcclxuICAgICAgICBTdGFydERhdGU6ICdTdGFydCBvcCcsXHJcbiAgICAgICAgVGl0bGU6ICdSZWZlcmVudGllcHJpanplbiBFVScsXHJcbiAgICAgICAgVW5pdFByaWNlczogJ0VlbmhlaWRzd2FhcmRlcydcclxuICAgIH1cclxufTsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIEFjdGl2ZVRhcmljTWVhc3VyZXM6ICdBY3RpZXZlIFRBUklDLW1hYXRyZWdlbGVuJyxcclxuICAgIEJhc2VSZWd1bGF0aW9uOiAnQmFzaXN2ZXJvcmRlbmluZycsXHJcbiAgICBCYXNlUmVndWxhdGlvbnM6ICdCYXNpc3Zlcm9yZGVuaW5nZW4nLFxyXG4gICAgQ2hhbmdlZEJ5OiAnR2V3aWp6aWdkIGRvb3InLFxyXG4gICAgQ2xhc3NpZmljYXRpb25SZWZlcmVuY2U6ICdSZWZlcmVudGllIG5hYXIgdGFyaWZlcmluZyB2YW4gcG9zdCcsXHJcbiAgICBDbGFzc2lmaWNhdGlvbkluTGVnYWxBY3RzRGlyZWN0b3J5OiAnSW5kZWxpbmcgaW4gaGV0IHJlcGVydG9yaXVtJyxcclxuICAgIENvdW50cnlSZWdpb246ICdMYW5kL1JlZ2lvJyxcclxuICAgIERvY3VtZW50Tm90Rm91bmQ6ICdEb2N1bWVudCBuaWV0IGdldm9uZGVuJyxcclxuICAgIEdvQmFja1RvVGhlT3ZlcnZpZXc6ICdHYSB0ZXJ1ZyBuYWFyIGhldCBvdmVyemljaHQnLFxyXG4gICAgSGVyZUFyZUFGZXdUaGluZ3M6ICdIaWVyIHppam4gZWVuIGFhbnRhbCBtb2dlbGlqa2UgdmVydm9sZ3N0YXBwZW4uJyxcclxuICAgIEluRm9yY2U6ICdWYW4ga3JhY2h0JyxcclxuICAgIE1vZGlmaWNhdGlvblJlZ3VsYXRpb246ICdXaWp6aWdpbmdzdmVyb3JkZW5pbmcnLFxyXG4gICAgTW9kaWZpY2F0aW9uUmVndWxhdGlvbnM6ICdXaWp6aWdpbmdzdmVyb3JkZW5pbmdlbicsXHJcbiAgICBOYW1lOiAnTmFhbScsXHJcbiAgICBOb01vZGlmaWNhdGlvblJlZ3VsYXRpb25zOiAnR2VlbiB3aWp6aWdpbmdzdmVyb3JkZW5pbmdlbicsXHJcbiAgICBOb3RlOiAnTm90YScsXHJcbiAgICBOb3RlX0NFTEVYXzogJ05vdGEge3sgQ0VMRVggfX0nLFxyXG4gICAgT2ZmaWNpYWxKb3VybmFsOiAnUHVibGljYXRpZWJsYWQnLFxyXG4gICAgT0o6ICdQYicsXHJcbiAgICBPcGVuRGV0YWlsczogJ09wZW4gZGV0YWlscycsXHJcbiAgICBPcGVuRG9jdW1lbnRPbkV1ckxleDogJ09wZW4gZG9jdW1lbnQgb3AgRVVSLUxleCcsXHJcbiAgICBQYWdlOiAnUGFnLicsXHJcbiAgICBQdWJObzogJ1BiIG5yLicsXHJcbiAgICBQdWJEYXRlOiAnUHVibC4gZGF0dW0nLFxyXG4gICAgUHVibGljYXRpb25EYXRlOiAnUHVibGljYXRpZWRhdHVtJyxcclxuICAgIFB1YlBhZ2U6ICdQdWJsLiBibGFkJyxcclxuICAgIF9jb3VudF9wdWJsaWNhdGlvbnNGb3VuZDogJ3t7IGNvdW50IH19IHB1YmxpY2F0aWVzIGdldm9uZGVuJyxcclxuICAgIFJlZ3VsYXRpb246ICdWZXJvcmRlbmluZycsXHJcbiAgICBSZWd1bGF0aW9uX0NFTEVYXzogJ1Zlcm9yZGVuaW5nIHt7IENFTEVYIH19JyxcclxuICAgIFJlZ3VsYXRpb25zOiAnVmVyb3JkZW5pbmdlbicsXHJcbiAgICBSZXNvdXJjZVR5cGU6ICdUeXBlIGRvY3VtZW50JyxcclxuICAgIFNlYXJjaEV1ckxleEZvcjogJ1pvZWsgb3AgRVVSLUxleCBuYWFyJyxcclxuICAgIFRoZXJlSXNOb0RvY3VtZW50X2NlbGV4XzogJ0VyIGlzIGdlZW4gZG9jdW1lbnQgaW4gb256ZSBhcHBsaWNhdGlvbiBtZXQgQ0VMRVggZ2VsaWprIGFhbiB7eyBjZWxleCB9fScsXHJcbiAgICBNb2RhbFRpdGxlOiAnV2V0LSBlbiByZWdlbGdldmluZycsXHJcbiAgICBjb25zb2xpZGF0ZWQ6ICd2ZXJ3ZXJrdCBpbiBib3ZlbnN0YWFuZGUgdGVrc3QnLFxyXG4gICAgdW5jb25zb2xpZGF0ZWQ6ICduaWV0IHZlcndlcmt0IGluIGJvdmVuc3RhYW5kZSB0ZWtzdCcsXHJcbn07XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgQWxzb1NlYXJjaEluOiAnWm9layBvb2sgaW4nLFxyXG4gICAgQWxwaGFiZXRpY2FsSW5kZXg6ICdBbGZhYmV0aXNjaGUgSW5kZXgnLFxyXG4gICAgQWxwaGFiZXRpY2FsSW5kZXhOb3RBdmFpbGFibGVJbkNob3Nlbkxhbmd1YWdlOiAnWm9la2VuIGluIGRlIGFsZmFiZXRpc2NoZSBpbmRleCBpcyBtb2dlbGlqayBpbiBoZXQgRW5nZWxzIGVuIGluIGhldCBEdWl0cy4gS2llcyDDqcOpbiB2YW4gZGV6ZSB0YWxlbiBvbSBkZXplIHRlIGRvb3J6b2VrZW4uJyxcclxuICAgIENhc2VMYXdOb0FjY2Vzc01lc3NhZ2U6ICdOZWVtIGNvbnRhY3Qgb3AgbWV0IFRhcmljIFN1cHBvcnQgdm9vciB0b2VnYW5nIHRvdCBkZSBtb2R1bGUgcmVjaHRzcHJhYWsnLFxyXG4gICAgQ29tbW9kaXR5Q29kZURlc2NyaXB0aW9uczogJ09tc2NocmlqdmluZ2VuIGdvZWRlcmVuY29kZXMnLFxyXG4gICAgQWRkaXRpb25hbERhdGFTb3VyY2VzOiAnQWRkaXRpb25lbGUgZGF0YWJyb25uZW4nLFxyXG4gICAgU2VhcmNoQ2NjQ29uY2x1c2lvbnM6ICdab2VrIGNvbmNsdXNpZXMgQ0RXJyxcclxuICAgIENvbmNsdXNpb25fTmF2OiAnQ29uY2x1c2llcyBDRFcnLFxyXG4gICAgRG9jdW1lbnRzOiAnRG9jdW1lbnRlbicsXHJcbiAgICBCcm93c2VDaGFwdGVyX2NoYXB0ZXJDb2RlXzogJ0JsYWRlciBpbiBob29mZHN0dWsge3sgY2hhcHRlckNvZGUgfX0nLFxyXG4gICAgR29Ub0NoYXB0ZXJfY29kZV86ICdHYSBuYWFyIGhvb2Zkc3R1ayB7eyBjb2RlIH19JyxcclxuICAgIE5vU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluSGVhZGluZ19IZWFkaW5nXzogJ0dlZW4gem9la3Jlc3VsdGF0ZW4gdm9vciBcInt7IFF1ZXJ5U3RyaW5nIH19XCIgZ2V2b25kZW4gaW4gcG9zdCB7eyBIZWFkaW5nIH19JyxcclxuICAgIFNlYXJjaFJlc3VsdHNGb3JfUXVlcnlTdHJpbmdfRm91bmRJbkhlYWRpbmdfSGVhZGluZ186ICdab2VrcmVzdWx0YXRlbiB2b29yIFwie3sgUXVlcnlTdHJpbmcgfX1cIiBnZXZvbmRlbiBpbiBwb3N0IHt7IEhlYWRpbmcgfX0nLFxyXG4gICAgX2NvbW1vZGl0eUNvZGVfaXNOb3RBVmFsaWRDb21tb2RpdHlDb2RlOiAne3sgY29tbW9kaXR5Q29kZSB9fSBpcyBnZWVuIGdlbGRpZ2UgZ29lZGVyZW5jb2RlJyxcclxuICAgIFNlYXJjaEZvclN1Y2Nlc3NvcnM6ICdab2VrIG9wdm9sZ2VycycsXHJcbiAgICBTZWFyY2hGb3JPcmlnaW5hdG9yczogJ1pvZWsgdm9vcmxvcGVycycsXHJcbiAgICBcclxuICAgIG5vUmVzdWx0OiAnRXIgaXMgZ2VlbiByZXN1bHRhYXQgZ2V2b25kZW4gdm9vciB1dyB6b2Vrb3BkcmFjaHQnLFxyXG4gICAgQ2xvc2VzdEV4aXN0aW5nUGFyZW50TWVzc2FnZTogJ0dvZWRlcmVuY29kZSB7eyBjbG9zZXN0RXhpc3RpbmdQYXJlbnRDb21tb2RpdHlDb2RlIHwgc3RyaXBUYXJpY0NvZGUgfCBmb3JtYXRUYXJpY0NvZGUgfX0gJm5kYXNoOyB6aWUgb25kZXIgJm5kYXNoOyBiZXN0YWF0IHdlbC4nLFxyXG4gICAgXHJcbiAgICBOb1Jlc3VsdHNGb3VuZEZvcllvdXJTZWFyY2hRdWVyeV9RdWVyeVN0cmluZ186ICdFciBpcyBnZWVuIHJlc3VsdGFhdCBnZXZvbmRlbiB2b29yIHV3IHpvZWtvcGRyYWNodCBcInt7IFF1ZXJ5U3RyaW5nIH19XCInLFxyXG4gICAgTm9SZXN1bHRzRm91bmRGb3JZb3VyU2VhcmNoUXVlcnlfUXVlcnlTdHJpbmdfRm91bmRJbkNoYXB0ZXJfQ29kZV86ICdFciBpcyBnZWVuIHJlc3VsdGFhdCBnZXZvbmRlbiB2b29yIHV3IHpvZWtvcGRyYWNodCBcInt7IFF1ZXJ5U3RyaW5nIH19XCIgaW4gaG9vZmRzdHVrIHt7IENvZGUgfX0uJyxcclxuXHJcbiAgICBPcGluaW9uX051bWJlcl86ICdBZHZpZXMge3sgTnVtYmVyIH19JywgLy8gU2hvcnQgRm9yIFdDTyBDbGFzc2lmaWNhdGlvbiBPcGluaW9uXHJcbiAgICBcclxuICAgIFNlYXJjaFJlc3VsdHNGb3JfUXVlcnlTdHJpbmdfOiAnWm9la3Jlc3VsdGF0ZW4gdm9vciBcInt7IFF1ZXJ5U3RyaW5nIH19XCInLFxyXG4gICAgU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluQWxwaGFiZXRpY2FsSW5kZXg6ICdab2VrcmVzdWx0YXRlbiB2b29yIFwie3sgUXVlcnlTdHJpbmcgfX1cIiBnZXZvbmRlbiBpbiBkZSBhbGZhYmV0aXNjaGUgaW5kZXgnLFxyXG4gICAgU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluQ29kZTogJ1pvZWtyZXN1bHRhdGVuIHZvb3IgXCJ7eyBRdWVyeVN0cmluZyB9fVwiIGdldm9uZGVuIG9uZGVyIGNvZGUnLFxyXG4gICAgU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluSGVhZGluZzogJ1pvZWtyZXN1bHRhdGVuIHZvb3IgXCJ7eyBRdWVyeVN0cmluZyB9fVwiIGdldm9uZGVuIGluIHBvc3QnLFxyXG4gICAgU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluSGVhZGluZ3M6ICdab2VrcmVzdWx0YXRlbiB2b29yIFwie3sgUXVlcnlTdHJpbmcgfX1cIiBnZXZvbmRlbiBpbiBkZSB2b2xnZW5kZSBwb3N0ZW4nLFxyXG4gICAgU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluSGVhZGluZ3NJbkNoYXB0ZXJfQ29kZV86ICdab2VrcmVzdWx0YXRlbiB2b29yIFwie3sgUXVlcnlTdHJpbmcgfX1cIiBnZXZvbmRlbiBpbiBkZSB2b2xnZW5kZSBwb3N0ZW4gaW4gaG9vZmRzdHVrIHt7IENvZGUgfX0nLFxyXG4gICAgU2VhcmNoUmVzdWx0c0Zvcl9RdWVyeVN0cmluZ19Gb3VuZEluQW5ub3RhdGlvbnM6ICdab2VrcmVzdWx0YXRlbiB2b29yIFwie3sgUXVlcnlTdHJpbmcgfX1cIiBnZXZvbmRlbiBpbiBkZSB2b2xnZW5kZSBhYW50ZWtlbmluZ2VuJyxcclxuICAgIFNlYXJjaFJlc3VsdHNGb3JfUXVlcnlTdHJpbmdfRm91bmRJbkV1RXhwbGFuYXRvcnlOb3RlczogJ1pvZWtyZXN1bHRhdGVuIHZvb3IgXCJ7eyBRdWVyeVN0cmluZyB9fVwiIGdldm9uZGVuIGluIGRlIHZvbGdlbmRlIHRvZWxpY2h0aW5nZW4gdmFuIGRlIEVVJyxcclxuICAgIFNlYXJjaFJlc3VsdHNGb3JfUXVlcnlTdHJpbmdfRm91bmRJbkV4cGxhbmF0b3J5Tm90ZXNHZXJtYW55OiAnWm9la3Jlc3VsdGF0ZW4gdm9vciBcInt7IFF1ZXJ5U3RyaW5nIH19XCIgZ2V2b25kZW4gaW4gZGUgdm9sZ2VuZGUgdG9lbGljaHRpbmdlbiBnZXB1YmxpY2VlcmQgZG9vciBkZSBEdWl0c2UgZG91YW5lJyxcclxuICAgIFNlYXJjaFJlc3VsdHNGb3JfUXVlcnlTdHJpbmdfRm91bmRJblRleHRzR2VybWFuQ3VzdG9tczogJ1pvZWtyZXN1bHRhdGVuIHZvb3IgXCJ7eyBRdWVyeVN0cmluZyB9fVwiIGdldm9uZGVuIGluIGRlIHZvbGdlbmRlIHRla3N0ZW4gZ2VwdWJsaWNlZXJkIGRvb3IgZGUgRHVpdHNlIGRvdWFuZScsXHJcbiAgICBTZWFyY2hSZXN1bHRzRm9yX1F1ZXJ5U3RyaW5nX0ZvdW5kSW5XY29FeHBsYW5hdG9yeU5vdGVzOiAnWm9la3Jlc3VsdGF0ZW4gdm9vciBcInt7IFF1ZXJ5U3RyaW5nIH19XCIgZ2V2b25kZW4gaW4gZGUgdm9sZ2VuZGUgdG9lbGljaHRpbmdlbiBiaWogaGV0IEdlaGFybW9uaXNlZXJkIFN5c3RlZW0gdmFuIGRlIFdETycsXHJcbiAgICBTZWFyY2hSZXN1bHRzRm9yX1F1ZXJ5U3RyaW5nX0ZvdW5kSW5XY29DbGFzc2lmaWNhdGlvbk9waW5pb25zOiAnWm9la3Jlc3VsdGF0ZW4gdm9vciBcInt7IFF1ZXJ5U3RyaW5nIH19XCIgZ2V2b25kZW4gaW4gZGUgdm9sZ2VuZGUgY2xhc3NpZmljYXRpb24gb3BpbmlvbnMgdmFuIGRlIFdETycsXHJcbiAgICBcclxuICAgIFNlYXJjaE5vbWVuY2xhdHVyZTogJ1pvZWsgaW4gbm9tZW5jbGF0dXVyJyxcclxuICAgIFNlYXJjaEFscGhhYmV0aWNhbEluZGV4OiAnWm9layBpbiBhbGZhYmV0aXNjaGUgaW5kZXgnLFxyXG4gICAgU2VhcmNoRVVDbGFzc2lmaWNhdGlvblJlZ3VsYXRpb25zOiAnWm9layBpbiBpbmRlbGluZ3N2ZXJvcmRlbmluZ2VuIEVVJyxcclxuICAgIFNlYXJjaFNlY3Rpb25BbmRDaGFwdGVyTm90ZXM6ICdab2VrIGluIGFhbnRla2VuaW5nZW4gYmlqIGFmZGVsaW5nZW4gZW4gaG9vZmRzdHVra2VuJyxcclxuICAgIFNlYXJjaEVVRXhwbGFuYXRvcnlOb3RlczogJ1pvZWsgaW4gdG9lbGljaHRpbmdlbiBFVScsXHJcbiAgICBTZWFyY2hFeHBsYW5hdG9yeU5vdGVzR2VybWFueTogJ1pvZWsgaW4gdG9lbGljaHRpbmdlbiBEdWl0c2xhbmQnLFxyXG4gICAgU2VhcmNoVGV4dHNHZXJtYW5DdXN0b21zOiAnWm9layBpbiB0ZWtzdGVuIGdlcHVibGljZWVyZCBkb29yIGRlIER1aXRzZSBkb3VhbmUnLFxyXG4gICAgU2VhcmNoV0NPRXhwbGFuYXRvcnlOb3RlczogJ1pvZWsgaW4gSFMtdG9lbGljaHRpbmdlbiBXQ08nLFxyXG4gICAgU2VhcmNoV0NPQ2xhc3NpZmljYXRpb25PcGluaW9uczogJ1pvZWsgaW4gaW5kZWxpbmdzYWR2aWV6ZW4gV0NPJyxcclxuICAgIFRyeU9uZU9mVGhlRm9sbG93aW5nQWN0aW9uczogJ1Uga3VudCDDqcOpbiB2YW4gZGUgdm9sZ2VuZGUgYWN0aWVzIHByb2JlcmVuJyxcclxuICAgIFdjb0V4cGxhbmF0b3J5Tm90ZXNOb3RBdmFpbGFibGVJbkNob3Nlbkxhbmd1YWdlOiAnRGUgSFMtdG9lbGljaHRpbmdlbiB2YW4gZGUgV0RPIChXZXJlbGRkb3VhbmVvcmdhbmlzYXRpZSkgemlqbiBiZXNjaGlrYmFhciBpbiBoZXQgRW5nZWxzIGVuIGhldCBGcmFucy4gS2llcyDDqcOpbiB2YW4gZGV6ZSB0YWxlbiBvbSB6ZSB0ZSBkb29yem9la2VuLicsXHJcbiAgICBXY29DbGFzc2lmaWNhdGlvbk9waW5pb25zTm90QXZhaWxhYmxlSW5DaG9zZW5MYW5ndWFnZTogJ0RlIGNsYXNzaWZpY2F0aW9uIG9waW5pb25zIHZhbiBkZSBXRE8gKFdlcmVsZGRvdWFuZW9yZ2FuaXNhdGllKSB6aWpuIGJlc2NoaWtiYWFyIGluIGhldCBFbmdlbHMgZW4gaGV0IEZyYW5zLiBLaWVzIMOpw6luIHZhbiBkZXplIHRhbGVuIG9tIHplIHRlIGRvb3J6b2VrZW4uJ1xyXG59O1xyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGhpc3RvcmljU2VhcmNoV2FybmluZzogJ0xldCBvcDogZGUgZGF0dW0gaXMgbmlldCBpbmdlc3RlbGQgb3AgdmFuZGFhZycsXHJcbiAgICBsb2dnaW5nT3V0OiAnVXcgYWNjb3VudCB3b3JkdCBvcCBlZW4gYW5kZXJlIGxvY2F0aWUgZ2VicnVpa3QuIEhldCBpcyBuaWV0IG1vZ2VsaWprIG9tIGhldHplbGZkZSBhY2NvdW50IHZhbmFmIG1lZXJkZXJlIGxvY2F0aWVzIHRlIGdlYnJ1aWtlbi4gVSB3b3JkdCB1aXRnZWxvZ2QuJyxcclxuICAgIFBsZWFzZUNvbnRhY3RUYXJpY1N1cHBvcnRGb3JBY2Nlc3NUb1RyYWRlVGFyaWZmOiAnTmVlbSBjb250YWN0IG9wIG1ldCBUYXJpYyBTdXBwb3J0IHZvb3IgdG9lZ2FuZyB0b3QgaGV0IGRvdWFuZXRhcmllZiB2YW4gZGl0IGxhbmQuJyxcclxuICAgIHVuYXV0aG9yaXplZDogJ1V3IGFjY291bnQgYmVzY2hpa3QgbmlldCBvdmVyIGRlIGp1aXN0ZSByZWNodGVuIG9tIGRlemUgZnVuY3Rpb25hbGl0ZWl0IHRlIGdlYnJ1aWtlbi4nLFxyXG4gICAgcGlja0NvdW50cnlGb3JWYXRSYXRlczogJ0tpZXMgZWVuIGxhbmQgb20gZGUgYnR3LXRhcmlldmVuIHRlIHppZW4nLFxyXG4gICAgRGF0YU5vdEF2YWlsYWJsZUZvclN3aXNzVHJhZGVUYXJpZmY6ICdEZXplIGdlZ2V2ZW5zIHppam4gbmlldCBiZXNjaGliYWFyIHZvb3IgaGV0IFp3aXRzZXJzZSBkb3VhbmV0YXJpZWYuJyxcclxuICAgIEV4Y2hhbmdlUmF0ZXNOb3RBdmFpbGFibGVGb3JTd2lzc1RyYWRlVGFyaWZmOiAnRGUgd2lzc2Vsa29lcnNlbiB6aWpuIG9wIGhldCBtb21lbnQgbmlldCBiZXNjaGlrYmFhciB2b29yIGhldCBad2l0c2Vyc2UgZG91YW5ldGFyaWVmLiBBbHMgdSBpbnRlcmVzc2UgaGVlZnQgaW4gZGV6ZSBtb2R1bGUsIG5lZW0gZGFuIGNvbnRhY3QgbWV0IG9ucyBvcC4nLFxyXG4gICAgVHJhbnNhY3Rpb25WYWx1ZUNhbGN1bGF0b3JOb3RBdmFpbGFibGVGb3JTd2lzc1RyYWRlVGFyaWZmOiAnRGUgdHJhbnNhY3RpZXdhYXJkZWNhbGN1bGF0b3IgaXMgb3AgaGV0IG1vbWVudCBuaWV0IGJlc2NoaWtiYWFyIHZvb3IgaGV0IFp3aXRzZXJzZSBkb3VhbmV0YXJpZWYuJyxcclxuICAgIHRleHROZXdlclRoYW5SZXF1ZXN0ZWRfU3RhcnREYXRlXzogJ05COiBkZXplIHRla3N0IGlzIG5pZXQgYmVzY2hpa2JhYXIgdm9vciBkZSBkb29yIHUgZ2Vrb3plbiBkYXR1bS4gRGUgb25kZXJzdGFhbmRlIHRla3N0IGlzIGVlbiBsYXRlcmUgdmVyc2llLCBnZWxkaWcgdmFuYWYge3sgU3RhcnREYXRlIHwgZGF0ZSA6IFxcJ2RkLU1NLXl5eXlcXCcgfX0uJyxcclxuICAgIE5vV2NvQWNjZXNzTWVzc2FnZTogJ1Zvb3IgdG9lZ2FuZyB0b3QgZGUgVG9lbGljaHRpbmdlbiBlbiBJbmRlbGluZ3NhZHZpZXplbiB2YW4gZGUgV0NPIGlzIGVlbiBhcGFydCBhYm9ubmVtZW50IG5vZGlnLiBOZWVtIGNvbnRhY3QgbWV0IG9ucyBvcCB2b29yIG1lZXIgaW5mb3JtYXRpZS4nLFxyXG59O1xyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJ1dHRvbnM6IHtcclxuICAgICAgICBDYW5jZWw6ICdBbm51bGVyZW4nLFxyXG4gICAgICAgIENsb3NlOiAnU2x1aXRlbicsXHJcbiAgICAgICAgQ29sbGFwc2VBbGw6ICdhbGxlcyBpbnZvdXdlbicsXHJcbiAgICAgICAgRGVsZXRlOiAnVmVyd2lqZGVyZW4nLFxyXG4gICAgICAgIERvd25sb2FkOiAnRG93bmxvYWQnLFx0XHJcbiAgICAgICAgRG93bmxvYWRQREY6ICdEb3dubG9hZCBQREYnLFxyXG4gICAgICAgIEVtcHR5Rm9ybTogJ0Zvcm11bGllciBsZWVnbWFrZW4nLFxyXG4gICAgICAgIEV4cGFuZEFsbDogJ2FsbGVzIHVpdHZvdXdlbicsXHJcbiAgICAgICAgTm86ICdOZWUnLFx0XHJcbiAgICAgICAgT0s6ICdPSycsXHRcclxuICAgICAgICBPcGVuUERGOiAnT3BlbiBQREYnLFxyXG4gICAgICAgIFByaW50OiAnQWZkcnVra2VuJyxcdFxyXG4gICAgICAgIFNhdmU6ICdPcHNsYWFuJyxcclxuICAgICAgICBTZWFyY2g6ICdab2VrZW4nLFxyXG4gICAgICAgIFllczogJ0phJ1xyXG4gICAgfSxcclxuICAgIGNhbGVuZGFyOiB7XHJcbiAgICAgICAgQ2xlYXI6ICdXaXNzZW4nLFxyXG4gICAgICAgIE9LOiAnT0snLFxyXG4gICAgICAgIFRvZGF5OiAnVmFuZGFhZydcclxuICAgIH0sXHJcbiAgICBwbGFjZWhvbGRlcnM6IHtcclxuICAgICAgICBFbnRlckNvbW1vZGl0eUNvZGU6ICdWb2VyIGVlbiBnb2VkZXJlbmNvZGUgaW4nLFxyXG4gICAgICAgIFNlYXJjaDogJ1pvZWtlbi4uLicsXHJcbiAgICAgICAgU2VhcmNoQnlDb3VudHJ5TmFtZU9yQ29kZTogJ1pvZWsgb3AgbmFhbSBvZiBjb2RlIGxhbmQnLFxyXG4gICAgICAgIFNlYXJjaEluVGV4dDogJ1pvZWsgaW4gdGVrc3QnLFxyXG4gICAgfSxcclxuICAgIHRyYW5zbGF0aW9uOiB7XHJcbiAgICAgICAgU2hvd09yaWdpbmFsOiAnVG9vbiBvcmlnaW5lZWwnLFxyXG4gICAgICAgIFRyYW5zbGF0ZTogJ1ZlcnRhYWwnLFxyXG4gICAgfSxcclxuICAgIGFyZVlvdVN1cmVNb2RhbFRpdGxlOiAnV2VldCB1IGhldCB6ZWtlcj8nLFxyXG4gICAgXHJcbiAgICBBc2NlbmRpbmc6ICdPcGxvcGVuZCcsXHJcbiAgICBEZXNjZW5kaW5nOiAnQWZsb3BlbmQnLFxyXG4gICAgXHJcbiAgICBcclxuICAgIENvdW50cnk6ICdMYW5kJyxcclxuICAgIERhdGU6ICdEYXR1bScsXHJcbiAgICBEYXRlRnJvbTogJ0RhdHVtIHZhbicsXHJcbiAgICBEYXRlVG86ICdEYXR1bSB0b3QnLFxyXG4gICAgRGVzY3JpcHRpb246ICdPbXNjaHJpanZpbmcnLFxyXG4gICAgZmF2b3JpdGU6ICdmYXZvcmlldCcsXHJcbiAgICBmYXZvcml0ZXM6ICdGYXZvcmlldGVuJyxcclxuICAgIF9jb3VudF9mb3VuZDogJ3t7IGNvdW50IH19IGdldm9uZGVuJywgLy8gTkI6IGNvdW50IGlzIGEgbnVtYmVyXHJcbiAgICBJbWFnZXM6ICdBZmJlZWxkaW5nZW4nLFxyXG4gICAgTGlzdDogJ0xpanN0JyxcclxuICAgIE1vcmVOZXdzOiAnTWVlciBuaWV1d3MnLFxyXG4gICAgTmV3czogJ05pZXV3cycsXHJcbiAgICBObzogJ05lZScsXHJcbiAgICBOb1Jlc3VsdHM6ICdHZWVuIHJlc3VsdGF0ZW4nLFxyXG4gICAgT3JkZXJCeTogJ1NvcnRlcmVuIG9wJyxcclxuICAgIE9yZGVyRGlyZWN0aW9uOiAnU29ydGVlcnZvbGdvcmRlJyxcclxuICAgIFF1ZXJ5OiAnWm9la29wZHJhY2h0JyxcclxuICAgIFJlbWVtYmVyOiAnT250aG91ZGVuJyxcclxuICAgIFNlYXJjaFRlcm06ICdab2VrdGVybScsXHJcbiAgICBTaG93UmVzdWx0c0FzOiAnVG9vbiByZXN1bHRhdGVuIGFscycsIC8vIHNob3cgYXMgaW1hZ2VzIG9yIGxpc3RcclxuICAgIFNvdXJjZTogJ0Jyb24nLCAvLyBBcyBpbiAnU291cmNlIG9mIHRoZSBpbmZvcm1hdGlvbidcclxuICAgIFRleHRTZWFyY2g6ICdab2VrZW4gaW4gdGVrc3QnLFxyXG4gICAgVG90YWw6ICdUb3RhYWwnLFxyXG4gICAgVmFsaWRpdHlQZXJpb2Q6ICdQZXJpb2RlIGdlbGRpZ2hlaWQnLFxyXG4gICAgVmFsaWRGcm9tOiAnR2VsZGlnIHZhbmFmJyxcclxuICAgIFZhbGlkVG86ICdHZWxkaWcgdG90JyxcclxuICAgIFZhbGlkaXR5U3RhcnREYXRlOiAnU3RhcnRkYXR1bSBnZWxkaWdoZWlkJyxcclxuICAgIFZhbGlkaXR5RW5kRGF0ZTogJ0VpbmRkYXR1bSBnZWxkaWdoZWlkJyxcclxuICAgIFN0YXJ0RGF0ZTogJ1N0YXJ0IERhdGUnLFxyXG4gICAgRW5kRGF0ZTogJ0VpbmRkYXR1bScsXHJcbiAgICBZZXM6ICdKYSdcclxufTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBDb21tb2RpdHlDb2RlX0FzY2VuZGluZzogJ0dvZWRlcmVuY29kZSAtIG9wbG9wZW5kJyxcclxuICAgIENvbW1vZGl0eUNvZGVfRGVzY2VuZGluZzogJ0dvZWRlcmVuY29kZSAtIGFmbG9wZW5kJyxcclxuICAgIENVU19Bc2NlbmRpbmc6ICdDVVMgLSBvcGxvcGVuZCcsXHJcbiAgICBDVVNfRGVzY2VuZGluZzogJ0NVUyAtIGFmbG9wZW5kJyxcclxuICAgIFZhbGlkRnJvbV9Bc2NlbmRpbmc6ICdHZWxkaWcgdmFuYWYgLSBvcGxvcGVuZCcsXHJcbiAgICBWYWxpZEZyb21fRGVzY2VuZGluZzogJ0dlbGRpZyB2YW5hZiAtIGFmbG9wZW5kJyxcclxuICAgIFJlbGV2YW5jZV9LZXl3b3JkczogJ1JlbGV2YW50aWUgLSBTbGV1dGVsd29vcmRlbicsXHJcbiAgICBSZWxldmFuY2VfR29vZHNEZXNjcmlwdGlvbjogJ1JlbGV2YW50aWUgLSBHb2VkZXJlbm9tc2NocmlqdmluZycsXHJcbiAgICBSZWxldmFuY2U6ICdSZWxldmFudGllJyxcclxufTsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIFZlcnNpb25fdmVyc2lvbk51bWJlcl86ICdWZXJzaWUge3sgdmVyc2lvbk51bWJlciB9fScsXHJcbiAgICBEYXRhUmVhZE9uX2xhc3RTdWNjZXNzZnVsRGF0YWJhc2VfOiAnRGF0YSB2ZXJuaWV1d2Qgb3Age3sgbGFzdFN1Y2Nlc3NmdWxEYXRhYmFzZSB8IGRhdGU6IFxcJ2RkLU1NIEhIOm1tXFwnIH19J1xyXG59O1xyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGVycm9yTWVzc2FnZXM6IHtcclxuICAgICAgICBFcnJvckV2YWx1YXRpbmdDb25kaXRpb246ICdGb3V0IGJpaiBjb250cm9sZXJlbiBtYWF0cmVnZWx2b29yd2FhcmRlJ1xyXG4gICAgfSxcclxuICAgIG1lYXN1cmVDb25kaXRpb25zOiB7XHJcbiAgICAgICAgQWN0aW9uOiAnQWN0aWUgZG91YW5lJyxcclxuICAgICAgICBBbW91bnQ6ICdIb2V2ZWVsaGVpZCcsXHJcbiAgICAgICAgQ29uZGl0aW9uOiAnVm9vcndhYXJkZScsIC8vIEFzIGluIG1lYXN1cmUgY29uZGl0aW9uIC0gY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGZvciBhIG1lYXN1cmUgdG8gYmUgYXBwbGljYWJsZSBhbmQvb3IgaW1wb3J0L2V4cG9ydCB0byBiZSBhbGxvd2VkXHJcbiAgICAgICAgRGVzY3JpcHRpb246ICdPbXNjaHJpanZpbmcnLFxyXG4gICAgICAgIER1dHlSYXRlOiAnVGFyaWVmJyxcclxuICAgICAgICBub0FjdGlvbjogJ2dlZW4vcG9zaXRpZWYnLFxyXG4gICAgICAgIG5vQ2VydGlmaWNhdGU6ICdnZWVuJ1xyXG4gICAgfSxcclxuICAgIG1lYXN1cmVTZXJpZXM6IHtcclxuICAgICAgICBBZGRpdGlvbmFsRHV0aWVzOiAnQWFudnVsbGVuZGUgaW52b2VycmVjaHRlbicsXHJcbiAgICAgICAgQW50aUR1bXBpbmdNZWFzdXJlczogJ0FudGktZHVtcGluZ21hYXRyZWdlbGVuJyxcclxuICAgICAgICBEdXRpZXM6ICdJbnZvZXJyZWNodGVuJyxcclxuICAgICAgICBOYXRpb25hbFRheGVzOiAnTmF0aW9uYWxlIGJlbGFzdGluZ2VuJyxcclxuICAgICAgICBPdGhlck1lYXN1cmVzOiAnQW5kZXJlIG1hYXRyZWdlbGVuJyxcclxuICAgICAgICBQcm9oaWJpdGlvbnM6ICdWZXJib2RlbicsXHJcbiAgICAgICAgUmVmZXJlbmNlUHJpY2VzOiAnUmVmZXJlbnRpZXByaWp6ZW4nLFxyXG4gICAgICAgIFJlc3RpdHV0aW9uczogJ1Jlc3RpdHV0aWVzJyxcclxuICAgICAgICBSZXN0cmljdGlvbnNBbmRDb250cm9sczogJ1Jlc3RyaWN0aWVzIGVuIGNvbnRyb2xlcycsXHJcbiAgICAgICAgU3VwcGxlbWVudGFyeUFtb3VudHM6ICdBYW52dWxsZW5kZSBiZWRyYWdlbicsXHJcbiAgICAgICAgU3VwcGxlbWVudGFyeVVuaXQ6ICdBYW52dWxsZW5kZSBlZW5oZWlkJyxcclxuICAgICAgICBWYXRSYXRlczogJ0J0dy10YXJpZXZlbicsXHJcbiAgICB9LFxyXG4gICAgcmVmZXJlbmNlQ291bnRyaWVzOiB7XHJcbiAgICAgICAgQkU6ICdCZWxnacOrJyxcclxuICAgICAgICBDSDogJ1p3aXRzZXJsYW5kJyxcclxuICAgICAgICBERTogJ0R1aXRzbGFuZCcsXHJcbiAgICAgICAgRVU6ICdFdXJvcGVzZSBVbmllJyxcclxuICAgICAgICBHQjogJ0dyb290LUJyaXR0YW5uacOrJyxcclxuICAgICAgICBJVDogJ0l0YWxpw6snLFxyXG4gICAgICAgIE5MOiAnTmVkZXJsYW5kJ1xyXG4gICAgfSxcclxuICAgIHRyYWRlTW92ZW1lbnRzOiB7XHJcbiAgICAgICAgQWxsOiAnQWxsZScsXHJcbiAgICAgICAgRXhwb3J0OiAnRXhwb3J0JyxcclxuICAgICAgICBJbXBvcnQ6ICdJbXBvcnQnXHJcbiAgICB9LFxyXG4gICAgdW5pdFR5cGVzOiB7XHJcbiAgICAgICAgQXJlYTogJ09wcGVydmxha3RlJyxcclxuICAgICAgICBFbmVyZ3k6ICdFbmVyZ2llJyxcclxuICAgICAgICBHcm9zc1dlaWdodDogJ0JydXRvZ2V3aWNodCcsXHJcbiAgICAgICAgSXRlbXM6ICdBYW50YWwnLFxyXG4gICAgICAgIExlbmd0aDogJ0xlbmd0ZScsXHJcbiAgICAgICAgTmV0V2VpZ2h0OiAnTmV0dG9nZXdpY2h0JyxcclxuICAgICAgICBQYWlyczogJ0FhbnRhbCBwYXJlbicsXHJcbiAgICAgICAgUG93ZXI6ICdWZXJtb2dlbicsXHJcbiAgICAgICAgVm9sdW1lOiAnVm9sdW1lJyxcclxuICAgICAgICBXZWlnaHQ6ICdHZXdpY2h0J1xyXG4gICAgfSxcclxuICAgIEFkZENlcnRpZmljYXRlQ29kZTogJ0Jlc2NoZWlkY29kZSB0b2V2b2VnZW4nLFxyXG4gICAgQWRkaXRpb25hbENvZGU6ICdBYW52dWxsZW5kZSBjb2RlJyxcclxuICAgIEFkZGl0aW9uYWxDb2Rlc1ZhbGlkYXRpb25FcnJvcjogJ0ZvdXQgaW4gYWFudnVsbGVuZGUgY29kZXMnLFxyXG4gICAgQWRkaXRpb25hbENvZGVUeXBlYWhlYWRQbGFjZWhvbGRlcjogJ1pvZWsgb3AgYWFudnVsbGVuZGUgY29kZSBvZiBvbXNjaHJpanZpbmcnLFxyXG4gICAgQWRkaXRpb25hbENvZGVNb2RhbFRpdGxlOiAnS2llcyBlZW4gYWFudnVsbGVuZGUgY29kZScsXHJcbiAgICBBZGRpdGlvbmFsQ29kZXM6ICdBYW52dWxsZW5kZSBjb2RlcycsXHJcbiAgICBBZGRpdGlvbmFsQ29kZVR5cGVzOiAnU29vcnRlbiBhYW52dWxsZW5kZSBjb2RlcycsXHJcbiAgICBOb0FkZGl0aW9uYWxDb2RlOiAnR2VlbiBhYW52dWxsZW5kZSBjb2RlJyxcclxuICAgIE5vQWRkaXRpb25hbENvZGVzRm91bmQ6ICdHZWVuIGFhbnZ1bGxlbmRlIGNvZGVzIGdldm9uZGVuJyxcclxuICAgIEFncmljdWx0dXJhbENvbXBvbmVudHM6ICdBZ3JhcmlzY2ggZWxlbWVudCcsXHJcbiAgICBNZXVyc2luZ0FkZGl0aW9uYWxDb2RlUGxhY2VIb2xkZXI6ICdab2VrIGFhbnZ1bGxlbmRlIGNvZGUnLFxyXG4gICAgQXV0b25vbW91c1RhcmlmZlN1c3BlbnNpb25zTWVzc2FnZTogJ1RpcDogbWFhayBnZWJydWlrIHZhbiBkZSBhdXRvbm9tZSB0YXJpZWZzY2hvcnNpbmcgZGllIHZvb3IgZGV6ZSBnb2VkZXJlbmNvZGUgZ2VsZHQnLFxyXG4gICAgQ2FsY3VsYXRlRHV0eTogJ0JlcmVrZW4gcmVjaHRlbicsXHJcbiAgICBDYWxjdWxhdGVEdXR5QW5kVGF4ZXM6ICdCZXJla2VuIHJlY2h0ZW4nLFxyXG4gICAgQ2VydGlmaWNhdGU6ICdCZXNjaGVpZCcsXHJcbiAgICBDZXJ0aWZpY2F0ZUNvZGVUeXBlYWhlYWRQbGFjZWhvbGRlcjogJ1pvZWsgb3AgYmVzY2hlaWRjb2RlIG9mIG9tc2NocmlqdmluZycsXHJcbiAgICBDZXJ0aWZpY2F0ZUNvZGVNb2RhbFRpdGxlOiAnS2llcyBlZW4gYmVzY2hlaWRjb2RlJyxcclxuICAgIENlcnRpZmljYXRlQ29kZXM6ICdCZXNjaGVpZGNvZGVzJyxcclxuICAgIENlcnRpZmljYXRlQ29kZVR5cGVzOiAnU29vcnRlbiBiZXNjaGVpZGNvZGVzJyxcclxuICAgIENoZWNrTWVhc3VyZUNvbmRpdGlvbnM6ICdDb250cm9sZWVyIG1hYXRyZWdlbHZvb3J3YWFyZGVuJyxcclxuICAgIENvbmRpdGlvbjogJ1Zvb3J3YWFyZGUnLFxyXG4gICAgY29uc3VtcHRpb25UYXhXYXJuaW5nOiAnV2FhcnNjaHV3aW5nOiB2ZXJicnVpa3NiZWxhc3Rpbmcga2FuIHZhbiB0b2VwYXNzaW5nIHppam4uIFUgbW9ldCBkYW4gZWVuIG5hdGlvbmFsZSBhYW52dWxsZW5kZSBjb2RlIGludnVsbGVuLiBIaWVyb25kZXIga3VudCB1IHpvZWtlbiBvcCBuYXRpb25hbGUgYWFudnVsbGVuZGUgY29kZS4nLFxyXG4gICAgQ291bnRyaWVzOiAnTGFuZGVuJyxcclxuICAgIENvdW50cnlPZkRlc3RpbmF0aW9uOiAnTGFuZCB2YW4gYmVzdGVtbWluZycsXHJcbiAgICBDb3VudHJ5T2ZPcmlnaW46ICdMYW5kIHZhbiBvb3JzcHJvbmcnLFxyXG4gICAgQ291bnRyeU9yUmVnaW9uOiAnTGFuZCBvZiByZWdpbycsXHJcbiAgICBDdXN0b21zVmFsdWU6ICdEb3VhbmV3YWFyZGUnLFxyXG4gICAgRGVjbGFyYXRpb246ICdBYW5naWZ0ZScsXHJcbiAgICBEZWNsYXJhdGlvbkNvdW50cnk6ICdMYW5kIGFhbmdpZnRlJyxcclxuICAgIERlY2xhcmF0aW9uRGF0ZTogJ0RhdHVtIGFhbmdpZnRlJyxcclxuICAgIERlc3RpbmF0aW9uOiAnQmVzdGVtbWluZycsIC8vIEFzIGluICdEZXN0aW5hdGlvbiBjb3VudHJ5J1xyXG4gICAgRHV0eUNhbGN1bGF0b3I6ICdCZXJla2VuIHJlY2h0ZW4nLFxyXG4gICAgRHV0eUNhbGN1bGF0aW9uRXJyb3JzOiB7XHJcbiAgICAgICAgRHV0eU1lYXN1cmVOb3RVbmlxdWVGb3JQcmVmZXJlbmNlQ29kZTogJ01lZXJkZXJlIG1hYXRyZWdlbGVuIGdldm9uZGVuIHZvb3IgcHJlZmVyZW50aWVjb2RlLiBLaWVzIHZvb3IgYmlqem9uZGVyZSBiZXN0ZW1taW5nIG9mIG5pZXQuJyxcclxuICAgICAgICBIZWFkZXI6ICdGb3V0IGJpaiBiZXJla2VuZW4gdmFuIHJlY2h0ZW4gZW4gYmVsYXN0aW5nZW4nLFxyXG4gICAgICAgIEludmFsaWRPck1pc3NpbmdRdWFudGl0eTogJ0ZvdXRlIG9mIG1pc3NlbmRlIGhvZXZlZWxoZWlkJyxcclxuICAgICAgICBVbnN1cHBvcnRlZER1dHlFeHByZXNzaW9uOiAnRcOpbiB2YW4gZGUgbWFhdHJlZ2VsZW4gdm9vciBkZXplIGJlcmVrZW5pbmcgYmV2YXQgZWVuIHRhcmllZnN1aXRkcnVra2luZyBkaWUgbmlldCBvbmRlcnN0ZXVuZCB3b3JkdC4nXHJcbiAgICB9LFxyXG4gICAgRHV0eUNhbGN1bGF0aW9uUmVzdWx0OiAnUmVzdWx0YWF0IGJlcmVrZW5pbmcgcmVjaHRlbiBlbiBiZWxhc3RpbmdlbicsXHJcbiAgICBEdXR5TWVhc3VyZVR5cGU6ICdUeXBlIGludm9lcnJlY2h0JyxcclxuICAgIEV1TGVnaXNsYXRpb246ICdXZXRnZXZpbmcgRVUnLFxyXG4gICAgZXhjbDogJ2JlaGFsdmUnLFxyXG4gICAgRXhjaXNlczogJ0FjY2lqbnplbicsXHJcbiAgICBleHBvcnRSZWZ1bmROb21lbmNsYXR1cmU6ICdSZXN0aXR1dGllLW5vbWVuY2xhdHV1cicsXHJcbiAgICBFeHBvcnRNZWFzdXJlczogJ01hYXRyZWdlbGVuIHVpdHZvZXInLFxyXG4gICAgRm9vdG5vdGU6ICdWb2V0bm9vdCcsXHJcbiAgICBGb290bm90ZXM6ICdWb2V0bm90ZW4nLFxyXG4gICAgRm9vdG5vdGVUeXBlczogJ1Nvb3J0ZW4gdm9ldG5vdGVuJyxcclxuICAgIEdlb2dyYXBoaWNhbEFyZWE6ICdHZW9ncmFmaXNjaGUgcmVnaW8nLFxyXG4gICAgR2VvZ3JhcGhpY2FsQXJlYXM6ICdHZW9ncmFmaXNjaGUgcmVnaW9cXCdzJyxcclxuICAgIEltcG9ydE1lYXN1cmVzOiAnTWFhdHJlZ2VsZW4gaW52b2VyJyxcclxuICAgIEluZm9ybWF0aW9uRm9yT3JkZXJOdW1iZXI6ICdJbmZvcm1hdGllIHZvb3Igb3JkZXJudW1tZXInLFxyXG4gICAgTGVnaXNsYXRpb246ICdXZXRnZXZpbmcnLFxyXG4gICAgTGVnaXNsYXRpb25GaXJzdExldHRlcjogJ1cnLFxyXG4gICAgTWVhc3VyZTogJ01hYXRyZWdlbCcsXHJcbiAgICBNZWFzdXJlczogJ01hYXRyZWdlbGVuJyxcclxuICAgIE1lYXN1cmVzRm9yRXhwb3J0RnJvbTogJ01hYXRyZWdlbGVuIHZvb3IgdWl0dm9lciB2YW51aXQnLFxyXG4gICAgTWVhc3VyZXNGb3JJbXBvcnRJbnRvOiAnTWFhdHJlZ2VsZW4gdm9vciBpbnZvZXIgbmFhcicsXHJcbiAgICBNZWFzdXJlc1ZhbGlkT246ICdNYWF0cmVnZWxlbiBnZWxkaWcgb3AnLFxyXG4gICAgTWVhc3VyZVR5cGVUeXBlYWhlYWRQbGFjZWhvbGRlcjogJ0tpZXMgbWFhdHJlZ2VsdHlwZScsXHJcbiAgICBNZWFzdXJlVHlwZU1vZGFsVGl0bGU6ICdLaWVzIG1hYXRyZWdlbHR5cGUnLFxyXG4gICAgTmF0aW9uYWxBZGRpdGlvbmFsQ29kZTogJ05hdGlvbmFsZSBhYW52dWxsZW5kZSBjb2RlJyxcclxuICAgIG5vQ2VydGlmaWNhdGVzRm91bmQ6ICdHZWVuIGJlc2NoZWlkY29kZXMgZ2V2b25kZW4nLFxyXG4gICAgbm9Gb290bm90ZXNGb3VuZDogJ0dlZW4gdm9ldG5vdGVuIGdldm9uZGVuJyxcclxuICAgIG5vTWVhc3VyZXNGb3VuZDogJ0dlZW4gbWFhdHJlZ2VsZW4gZ2V2b25kZW4nLFxyXG4gICAgbm9SZXN1bHRzRm9yQ29tbW9kaXR5Q29kZXNJblBlcmlvZDogJ0dlZW4gcmVzdWx0YXRlbiB2b29yIGRlIGdla296ZW4gZ29lZGVyZW5jb2RlcyBpbiBoZXQgZ2Vrb3plbiB0aWpkdmFrJyxcclxuICAgIE9wdGlvbmFsTmF0aW9uYWxBZGRpdGlvbmFsQ29kZTogJ09wdGlvbmVsZSBuYXRpb25hbGUgYWFudnVsbGVuZGUgY29kZScsXHJcbiAgICBPcmlnaW46ICdPb3JzcHJvbmcnLCAvLyBBcyBpbiAnQ291bnRyeSBvZiBPcmlnaW4nXHJcbiAgICBPdGhlckNob2ljZXM6ICdPdmVyaWdlIGtldXplcycsXHJcbiAgICBQcmVmZXJlbmNlQ29kZTogJ1ByZWZlcmVudGllY29kZScsXHJcbiAgICBQcmVmZXJlbmNlQ29kZURpc3BsYXlMYWJlbDogJ1dlZXJnYXZlIHByZWZlcmVudGllY29kZXMnLFxyXG4gICAgUHJlZmVyZW5jZUNvZGVEaXNwbGF5TGFiZWxQcmVVY2M6ICdWw7PDs3IgVUNDJyxcclxuICAgIFByZWZlcmVuY2VDb2RlRGlzcGxheUxhYmVsVWNjOiAnRE1TIC0gVUNDJyxcclxuICAgIFByZWZlcmVuY2VDb2RlVHlwZWFoZWFkUGxhY2Vob2xkZXI6ICdab2VrIG9wIHByZWZlcmVudGllY29kZSBvZiBvcCBvbXNjaHJpanZpbmcnLFxyXG4gICAgUHJlZmVyZW5jZUNvZGVNb2RhbFRpdGxlOiAnS2llcyBlZW4gcHJlZmVyZW50aWVjb2RlJyxcclxuICAgIEVuZFVzZU1lYXN1cmVJc0FsbG93ZWRXaXRoUHJvY2VkdXJlQ29kZTQ0OiAnRGUgbWFhdHJlZ2VsIGJpanpvbmRlcmUgYmVzdGVtbWluZyBpcyB0b2VnZXN0YWFuIG1ldCBkb3VhbmVyZWdlbGluZyA0NCBcIkJpanpvbmRlcmUgYmVzdGVtbWluZ1wiJyxcclxuICAgIFByZWZlcnJlZER1dHlUcmVhdG1lbnQ6ICdLZXV6ZSBpbnZvZXJyZWNodCcsXHJcbiAgICBRdWFudGl0eTogJ0hvZXZlZWxoZWlkJyxcclxuICAgIFF1b3RhT3JkZXJOdW1iZXI6ICdPcmRlcm51bW1lciBjb250aW5nZW50JyxcclxuICAgIFF1b3RhT3JkZXJOdW1iZXJUeXBlYWhlYWRQbGFjZWhvbGRlcjogJ1Z1bCBvcmRlcm51bW1lciB0YXJpZWZjb250aW5nZW50IGluJyxcclxuICAgIFJlZmVyZW5jZUxpc3RzOiAnUmVmZXJlbnRpZWxpanN0ZW4nLFxyXG4gICAgUmVnaW9uOiAnUmVnaW8nLFxyXG4gICAgUmVnaW9uczogJ1JlZ2lvXFwncycsXHJcbiAgICBSZXRhaWxQcmljZTogJ0tsZWluaGFuZGVsc3ByaWpzJyxcclxuICAgIFNlYXJjaEJ5Q29kZU9yRGVzY3JpcHRpb246ICdab2VrIG9wIGNvZGUgb2Ygb21zY2hyaWp2aW5nJywgICAgICAgIFxyXG4gICAgU2hvd1F1b3RhSW5mb3JtYXRpb246ICdUb29uIGluZm9ybWF0aWUgb3ZlciB0YXJpZWZjb250aW5nZW50JyxcclxuICAgIFRheGVzOiAnQmVsYXN0aW5nZW4nLFxyXG4gICAgVmFsaWRhdGVEZWNsYXJhdGlvbjogJ1ZhbGlkZWVyIGFhbmdpZnRlJyxcclxuICAgIFZhbHVlOiAnV2FhcmRlJyxcclxuICAgIFZhdEFuZEV4Y2lzZUV0Y2V0ZXJhOiAnT216ZXRiZWxhc3RpbmcsIGFjY2lqbnplbiwgdm9vcnJhYWRoZWZmaW5nIGVuIHZlcmJydWlrc2JlbGFzdGluZycsXHJcbiAgICBWQVQ6ICdPbXpldGJlbGFzdGluZydcclxufTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBFeHBvcnRWYWx1ZTogJ1dhYXJkZSBleHBvcnQnLFxyXG4gICAgRXhwb3J0V2VpZ2h0OiAnR2V3aWNodCBleHBvcnQnLFxyXG4gICAgRXhwb3J0VmFsdWVQZXJLZzogJ1dhYXJkZSBleHBvcnQgcGVyIGtnJyxcclxuICAgIEltcG9ydFZhbHVlOiAnV2FhcmRlIGltcG9ydCcsXHJcbiAgICBJbXBvcnRXZWlnaHQ6ICdHZXdpY2h0IGltcG9ydCcsXHJcbiAgICBJbXBvcnRWYWx1ZVBlcktnOiAnV2FhcmRlIGltcG9ydCBwZXIga2cnLFxyXG4gICAgTW9yZVllYXJzQ29taW5nU29vbjogJ01lZXIgamFyZW4gdm9sZ2VuIGJpbm5lbmtvcnQnLFxyXG4gICAgTm9EYXRhQXZhaWxhYmxlOiAnR2VlbiBkYXRhIGJlc2NoaWtiYWFyJyxcclxuICAgIFJlcG9ydGluZ0NvdW50cnk6ICdSYXBwb3J0ZXJlbmQgbGFuZCcsXHJcbiAgICBTdGF0aXN0aWNzRm9ySW1wb3J0RnJvbTogJ1N0YXRpc3RpZWtlbiB2b29yIGltcG9ydCB1aXQnLFxyXG4gICAgU3RhdGlzdGljc0ZvckltcG9ydEludG86ICdTdGF0aXN0aWVrZW4gdm9vciBpbXBvcnQgaW4nLFxyXG5cclxuICAgIFN0YXRpc3RpY3NGb3JJbXBvcnRGcm9tX0NvdW50cnlOYW1lX0luX1llYXJfOiAnU3RhdGlzdGlla2VuIHZvb3IgaW1wb3J0IHVpdCB7eyBDb3VudHJ5TmFtZSB9fSBpbiB7eyBZZWFyIH19JyxcclxuICAgIFN0YXRpc3RpY3NGb3JJbXBvcnRJbnRvX0NvdW50cnlOYW1lX0luX1llYXJfOiAnU3RhdGlzdGlla2VuIHZvb3IgaW1wb3J0IGluIHt7IENvdW50cnlOYW1lIH19IGluIHt7IFllYXIgfX0nLFxyXG4gICAgU3RhdGlzdGljc0ZvckltcG9ydEludG9UaGVFVV9Jbl9ZZWFyXzogJ1N0YXRpc3RpZWtlbiB2b29yIGltcG9ydCBpbiBkZSBFVSBpbiB7eyBZZWFyIH19JyxcclxuXHJcbiAgICB0aGVFVTogJ2RlIEVVJyxcclxuICAgIFRyYWRlUGFydG5lcjogJ0hhbmRlbHNwYXJ0bmVyJyxcclxuICAgIFRyYWRlU3RhdGlzdGljczogJ0hhbmRlbHNzdGF0aXN0aWVrZW4nLFxyXG4gICAgWWVhcjogJ0phYXInXHJcbn07XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgdmF0TnVtYmVyOiAnQlRXLW51bW1lcicsXHJcbiAgICBjZE51bWJlcjogJ0NELW51bW1lcicsXHJcbiAgICBlb3JpTnVtYmVyOiAnRU9SSS1udW1tZXInLFxyXG4gICAgcmV4TnVtYmVyOiAnUkVYLW51bW1lcicsXHJcbiAgICB0aW5OdW1iZXI6ICdUSU4tbnVtbWVyJyxcclxuICAgIGNkQ2hlY2tpbmc6ICdRdWVyeSBFVSBDdXN0b21zIERlY2lzaW9uIFN5c3RlbScsXHJcbiAgICBjaGVja0VPUklOdW1iZXI6ICdDb250cm9sZWVyIEVPUkktbnVtbWVyJyxcclxuICAgIGNoZWNrUmV4TnVtYmVyOiAnQ29udHJvbGVlciBSRVgtbnVtbWVyJyxcclxuICAgIGNoZWNrVmllc1JlZ2lzdHJhdGlvbkZvclZhdE51bWJlcjogJ0NvbnRyb2xlZXIgVklFUy1yZWdpc3RyYXRpZSB2b29yIGJ0dy1udW1tZXInLFxyXG4gICAgdmF0Q2hlY2s6ICdDb250cm9sZWVyIGJ0dy1udW1tZXIgKFZJRVMpJyxcclxuICAgIGVvcmlDaGVjazogJ0NvbnRyb2xlZXIgRU9SSS1udW1tZXInLFxyXG4gICAgcmV4Q2hlY2s6ICdDb250cm9sZWVyIFJFWC1udW1tZXInLFxyXG4gICAgY2RDaGVjazogJ1F1ZXJ5IEN1c3RvbXMgRGVjaXNpb24gU3lzdGVtJyxcclxuICAgIGVvcmlDaGVja1Jlc3VsdFZhbGlkOiAnSGV0IGdlY29udHJvbGVlcmRlIEVPUkktbnVtbWVyIGlzIGdlbGRpZycsXHJcbiAgICBlb3JpQ2hlY2tSZXN1bHRJbnZhbGlkOiAnSGV0IGdlY29udHJvbGVlcmRlIEVPUkktbnVtbWVyIGlzIG9uZ2VsZGlnJyxcclxuICAgIHJleENoZWNrUmVzdWx0SW52YWxpZDogJ0hldCBnZWNvbnRyb2xlZXJkZSBSRVgtbnVtbWVyIGlzIG9uZ2VsZGlnJyxcclxuICAgIGNpdHk6ICdTdGFkJyxcclxuICAgIGNvbXBhbnlOYW1lOiAnQmVkcmlqZnNuYWFtJyxcclxuICAgIGNvbXBhbnlBZGRyZXNzOiAnQmVkcmlqZnNhZHJlcycsXHJcbiAgICBjb3VudHJ5Q29kZTogJ0xhbmRjb2RlJyxcclxuICAgIHBvc3RhbENvZGU6ICdQb3N0Y29kZScsXHJcbiAgICBzZWFyY2hSZXN1bHRzOiAnWm9la3Jlc3VsdGF0ZW4nLFxyXG4gICAgc2VydmVyRXJyb3I6ICdFciBpcyBlZW4gZm91dCBvcGdldHJlZGVuIGJpaiBoZXQgdmVyd2Vya2VuIHZhbiB1dyB2ZXJ6b2VrLicsIFxyXG4gICAgYWN0aXZpdHluYW1lRmllbGQ6ICdBY3Rpdml0ZWl0JyxcclxuICAgIGFjdGl2aXR5ZmxhZ0ZpZWxkOiAnSmEvTmVlJyxcclxuICAgIGxpc3RPZkdvb2RzOiAnTGlqc3QgdmFuIGdvZWRlcmVuJyxcclxuICAgIGNvbW1vZGl0eUNvZGU6ICdHb2VkZXJlbmNvZGUnLFxyXG4gICAgcmV4RmllbGRFcnJvcjogJ1Z1bCBlZW4gZ2VsZGlnIFJFWC1udW1tZXIgaW4nLFxyXG4gICAgZW9yaUZpZWxkRXJyb3I6ICdWdWwgZWVuIGdlbGRpZyBFT1JJLW51bW1lciBpbicsXHJcbiAgICBWYWxpZGF0ZUJ1c2luZXNzSW5mb3JtYXRpb246ICdWYWxpZGVlciBiZWRyaWpmc2luZm9ybWF0aWUnLFxyXG4gICAgVmllc1dlYlNpdGVJbnRyb1RleHQ6ICdKZSBrdW50IGRlIFZJRVMtd2Vic2l0ZSBnZWJydWlrZW4gb20gdGUgY29udHJvbGVyZW4gb2YgZWVuIGJ0dy1udW1tZXIgZ2VsZGlnIGlzIHZvb3IgaW50cmEtY29tbXVuYXV0YWlyZSBsZXZlcmluZyB2YW4gZ29lZGVyZW4gb2YgZGllbnN0ZW4uJyxcclxuICAgIEdvVG9WaWVzV2Vic2l0ZTogJ0dhIG5hYXIgZGUgVklFUy13ZWJzaXRlIChvcGVudCBpbiBlZW4gbmlldXcgdmVuc3RlciknLFxyXG4gICAgUFJPRFVDVElPTjogJ1Byb2R1Y3RpZScsXHJcbiAgICBUUkFESU5HOiAnSGFuZGVsJyxcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGR5bmFtaWM6IHtcclxuICAgICAgICBDb21tb2RpdHlDb2RlSXNJbnZhbGlkOiAnR29lZGVyZW5jb2RlIGlzIG9uanVpc3QnLFxyXG4gICAgICAgIENvbW1vZGl0eUNvZGVPclF1ZXJ5SXNSZXF1aXJlZDogJ0dvZWRlcmVuY29kZSBvZiB6b2VrdGVrc3QgaXMgdmVycGxpY2h0JyxcclxuICAgICAgICBRdWVyeUlzVG9vU2hvcnQ6ICdab2VrdGVrc3QgaXMgdGUga29ydCcsXHJcbiAgICAgICAgUXVlcnlJc1JlcXVpcmVkOiAnWm9la3Rla3N0IGlzIHZlcnBsaWNodCcsXHJcbiAgICB9XHJcbn07IiwiYW5ndWxhci5tb2R1bGUoJ3RhcmljLnVuaXRzJywgW10pXHJcbiAgICAvLyBGaWx0ZXJzXHJcbiAgICAuZmlsdGVyKCdpc1JldGFpbFByaWNlJywgcmVxdWlyZSgnLi9maWx0ZXJzL2lzLXJldGFpbC1wcmljZScpKVxyXG4gICAgLmZpbHRlcignaXNOb3RSZXRhaWxQcmljZScsIHJlcXVpcmUoJy4vZmlsdGVycy9pcy1ub3QtcmV0YWlsLXByaWNlJykpXHJcbiAgICA7XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0gW2lzTm90UmV0YWlsUHJpY2VGaWx0ZXJdO1xyXG5cclxuZnVuY3Rpb24gaXNOb3RSZXRhaWxQcmljZUZpbHRlcigpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodW5pdHMpIHtcclxuICAgICAgICByZXR1cm4gXy5maWx0ZXIodW5pdHMsIGZ1bmN0aW9uKHVuaXQpIHsgXHJcbiAgICAgICAgICAgIHJldHVybiB1bml0LlVuaXQuY29kZSAhPT0gJ1JFVCcgJiYgLyogR0IgKi9cclxuICAgICAgICAgICAgdW5pdC5Vbml0LmNvZGUgIT09ICcwMDMnICYmIC8qIE5MICovXHJcbiAgICAgICAgICAgIHVuaXQuVW5pdC5jb2RlICE9PSAnMDYyJyAmJiAvKiBERSAqL1xyXG4gICAgICAgICAgICB1bml0LlVuaXQuY29kZSAhPT0gJzA2MycgLyogREUgKi9cclxuICAgICAgICAgICAgOyBcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbaXNSZXRhaWxQcmljZUZpbHRlcl07XHJcblxyXG5mdW5jdGlvbiBpc1JldGFpbFByaWNlRmlsdGVyKCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh1bml0cykge1xyXG4gICAgICAgIHJldHVybiBfLmZpbHRlcih1bml0cywgZnVuY3Rpb24odW5pdCkgeyBcclxuICAgICAgICAgICAgcmV0dXJuIHVuaXQuVW5pdC5jb2RlID09PSAnUkVUJyB8fCAvKiBHQiAqLyBcclxuICAgICAgICAgICAgICAgIHVuaXQuVW5pdC5jb2RlID09PSAnMDAzJyB8fCAvKiBOTCAqL1xyXG4gICAgICAgICAgICAgICAgdW5pdC5Vbml0LmNvZGUgPT09ICcwNjInIHx8IC8qIERFICovXHJcbiAgICAgICAgICAgICAgICB1bml0LlVuaXQuY29kZSA9PT0gJzA2Myc7IC8qIERFICovXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG59XHJcbiIsImFuZ3VsYXIubW9kdWxlKCd0YXJpYy52YWxpZGF0ZUJ1c2luZXNzSW5mbycsIFtdKVxyXG4gICAgLmNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgcm91dGVDb25maWd1cmF0b3JdKVxyXG4gICAgLy8gQ29tcG9uZW50c1xyXG4gICAgLmNvbXBvbmVudCgndmFsaWRhdGVCdXNpbmVzc0luZm9TdWJuYXYnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvdmFsaWRhdGUtYnVzaW5lc3MtaW5mby1zdWJuYXYnKSlcclxuICAgIC5jb21wb25lbnQoJ3ZhbGlkYXRlQnVzaW5lc3NJbmZvQ2RGb3JtJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8tY2QtZm9ybScpKVxyXG4gICAgLmNvbXBvbmVudCgndmFsaWRhdGVCdXNpbmVzc0luZm9Fb3JpRm9ybScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy92YWxpZGF0ZS1idXNpbmVzcy1pbmZvLWVvcmktZm9ybScpKVxyXG4gICAgLmNvbXBvbmVudCgndmFsaWRhdGVCdXNpbmVzc0luZm9SZXhGb3JtJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8tcmV4LWZvcm0nKSlcclxuICAgIC5jb21wb25lbnQoJ3ZhbGlkYXRlQnVzaW5lc3NJbmZvVmF0Rm9ybScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy92YWxpZGF0ZS1idXNpbmVzcy1pbmZvLXZhdC1mb3JtJykpXHJcbiAgICAvLyBNb2RhbHNcclxuICAgIC5mYWN0b3J5KCd2YWxpZGF0ZUJ1c2luZXNzSW5mb1JleE1vZGFsJywgcmVxdWlyZSgnLi9tb2RhbHMvdmFsaWRhdGUtYnVzaW5lc3MtaW5mby1yZXgtbW9kYWwnKSlcclxuICAgIC8vIFNlcnZpY2VzXHJcbiAgICAuZmFjdG9yeSgndmFsaWRhdGVCdXNpbmVzc0luZm9EYXRhU2VydmljZScsIHJlcXVpcmUoJy4vc2VydmljZXMvdmFsaWRhdGUtYnVzaW5lc3MtaW5mby1kYXRhJykpXHJcbiAgICA7XHJcblxyXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyYXRvcigkcm91dGVQcm92aWRlcikge1xyXG4gICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbignL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8vaG9tZScsIHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8dmFsaWRhdGUtYnVzaW5lc3MtaW5mby1lb3JpLWZvcm0+PC92YWxpZGF0ZS1idXNpbmVzcy1pbmZvLWVvcmktZm9ybT4nLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy92YWxpZGF0ZS1idXNpbmVzcy1pbmZvL2NoZWNrLWN1c3RvbXMtZGVjaXNpb24nLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHZhbGlkYXRlLWJ1c2luZXNzLWluZm8tY2QtZm9ybT48L3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8tY2QtZm9ybT4nXHJcbiAgICAgICAgfSlcclxuICAgICAgICAud2hlbignL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8vY2hlY2stZW9yaS1udW1iZXInLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHZhbGlkYXRlLWJ1c2luZXNzLWluZm8tZW9yaS1mb3JtPjwvdmFsaWRhdGUtYnVzaW5lc3MtaW5mby1lb3JpLWZvcm0+J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLndoZW4oJy92YWxpZGF0ZS1idXNpbmVzcy1pbmZvL2NoZWNrLXJleC1udW1iZXInLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHZhbGlkYXRlLWJ1c2luZXNzLWluZm8tcmV4LWZvcm0+PC92YWxpZGF0ZS1idXNpbmVzcy1pbmZvLXJleC1mb3JtPidcclxuICAgICAgICB9KVxyXG4gICAgICAgIC53aGVuKCcvdmFsaWRhdGUtYnVzaW5lc3MtaW5mby92aWVzLWNoZWNrLXZhdC1udW1iZXInLCB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnPHZhbGlkYXRlLWJ1c2luZXNzLWluZm8tdmF0LWZvcm0+PC92YWxpZGF0ZS1idXNpbmVzcy1pbmZvLXZhdC1mb3JtPidcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICA7XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGV1Q2RWYXRGb3JtQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAndmFsaWRhdGUtYnVzaW5lc3MtaW5mby9jb21wb25lbnRzL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8tY2QtZm9ybS5odG1sJ1xyXG59XHJcblxyXG5ldUNkVmF0Rm9ybUNvbnRyb2xsZXIuJGluamVjdCA9IFtcclxuICAgICd2YWxpZGF0ZUJ1c2luZXNzSW5mb0RhdGFTZXJ2aWNlJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGV1Q2RWYXRGb3JtQ29udHJvbGxlcihcclxuICAgIHZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2VcclxuKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBzZXJ2aWNlIDogdmFsaWRhdGVCdXNpbmVzc0luZm9EYXRhU2VydmljZSxcclxuICAgICAgICBjZENoZWNrOiB2YWxpZGF0ZUJ1c2luZXNzSW5mb0RhdGFTZXJ2aWNlLmNkQ2hlY2tcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiB2YWxpZGF0ZUJ1c2luZXNzSW5mb0VvcmlGb3JtQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAndmFsaWRhdGUtYnVzaW5lc3MtaW5mby9jb21wb25lbnRzL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8tZW9yaS1mb3JtLmh0bWwnXHJcbn1cclxuXHJcbnZhbGlkYXRlQnVzaW5lc3NJbmZvRW9yaUZvcm1Db250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAnJHRpbWVvdXQnLFxyXG4gICAgJ3ZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2UnLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVCdXNpbmVzc0luZm9Fb3JpRm9ybUNvbnRyb2xsZXIoXHJcbiAgICAkdGltZW91dCxcclxuICAgIHZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2VcclxuKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBub1Jlc3VsdDogZmFsc2UsXHJcbiAgICAgICAgc2hvd1dhcm5pbmc6IGZhbHNlLFxyXG4gICAgICAgIHNob3dFcnJvcjogZmFsc2UsXHJcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBudWxsLFxyXG4gICAgICAgIHNlcnZpY2UgOiB2YWxpZGF0ZUJ1c2luZXNzSW5mb0RhdGFTZXJ2aWNlLFxyXG4gICAgICAgIGVvcmlDaGVjazogdmFsaWRhdGVCdXNpbmVzc0luZm9EYXRhU2VydmljZS5lb3JpQ2hlY2ssXHJcbiAgICAgICAgY2hlY2tFb3JpTnVtYmVyOiBjaGVja0VvcmlOdW1iZXIsXHJcbiAgICAgICAgY2xlYXJFb3JpTnVtYmVyOiBjbGVhckVvcmlOdW1iZXIsXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyRW9yaU51bWJlcigpIHtcclxuICAgICAgICB2YWxpZGF0ZUJ1c2luZXNzSW5mb0RhdGFTZXJ2aWNlLmNsZWFyRW9yaU51bWJlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNoZWNrRW9yaU51bWJlcigpIHtcclxuICAgICAgICB2bS5lb3JpQ2hlY2sucmVzdWx0ID0gbnVsbDtcclxuICAgICAgICB2YXIgZW9yaVJlZ2V4ID0gL1tBLVphLXpdW0EtWmEtel0/WzAtOV17MSwxNX0kLztcclxuICAgICAgICBpZighdmFsaWRhdGVCdXNpbmVzc0luZm9EYXRhU2VydmljZS5lb3JpQ2hlY2suZW9yaU51bWJlcikge1xyXG4gICAgICAgICAgICB2bS5zaG93V2FybmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiAkdGltZW91dChmdW5jdGlvbigpIHsgXHJcbiAgICAgICAgICAgICAgICB2bS5zaG93V2FybmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCFlb3JpUmVnZXgudGVzdCh2YWxpZGF0ZUJ1c2luZXNzSW5mb0RhdGFTZXJ2aWNlLmVvcmlDaGVjay5lb3JpTnVtYmVyKSkge1xyXG4gICAgICAgICAgICB2bS5zaG93V2FybmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiAkdGltZW91dChmdW5jdGlvbigpIHsgXHJcbiAgICAgICAgICAgICAgICB2bS5zaG93V2FybmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdm0uZXJyb3JNZXNzYWdlID0gbnVsbDtcclxuICAgICAgICAgICAgfSwgNTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZtLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2UuY2hlY2tFb3JpTnVtYmVyKClcclxuICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZih2YWxpZGF0ZUJ1c2luZXNzSW5mb0RhdGFTZXJ2aWNlLmVvcmlDaGVjay5tZXNzYWdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5zaG93RXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICR0aW1lb3V0KGZ1bmN0aW9uKCkgeyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc2hvd0Vycm9yID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnJvcikge1xyXG4gICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYodmFsaWRhdGVCdXNpbmVzc0luZm9EYXRhU2VydmljZS5lb3JpQ2hlY2subWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdm0uc2hvd0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAkdGltZW91dChmdW5jdGlvbigpIHsgXHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc2hvd0Vycm9yID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2bTtcclxufSIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogdmFsaWRhdGVCdXNpbmVzc0luZm9SZXhGb3JtQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAndmFsaWRhdGUtYnVzaW5lc3MtaW5mby9jb21wb25lbnRzL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8tcmV4LWZvcm0uaHRtbCdcclxufVxyXG5cclxudmFsaWRhdGVCdXNpbmVzc0luZm9SZXhGb3JtQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyR0aW1lb3V0JyxcclxuICAgICckc2NlJyxcclxuICAgICd2YWxpZGF0ZUJ1c2luZXNzSW5mb0RhdGFTZXJ2aWNlJyxcclxuICAgICd2YWxpZGF0ZUJ1c2luZXNzSW5mb1JleE1vZGFsJyxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHZhbGlkYXRlQnVzaW5lc3NJbmZvUmV4Rm9ybUNvbnRyb2xsZXIoXHJcbiAgICAkdGltZW91dCxcclxuICAgICRzY2UsXHJcbiAgICB2YWxpZGF0ZUJ1c2luZXNzSW5mb0RhdGFTZXJ2aWNlLFxyXG4gICAgdmFsaWRhdGVCdXNpbmVzc0luZm9SZXhNb2RhbFxyXG4pIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIHNob3dFcnJvcjogZmFsc2UsXHJcbiAgICAgICAgc2hvd1dhcm5pbmc6IGZhbHNlLFxyXG4gICAgICAgIGVycm9yTWVzc2FnZTogbnVsbCxcclxuICAgICAgICBpbml0OiB0cnVlLFxyXG4gICAgICAgIHNlcnZpY2UgOiB2YWxpZGF0ZUJ1c2luZXNzSW5mb0RhdGFTZXJ2aWNlLFxyXG4gICAgICAgIHJleENoZWNrOiB2YWxpZGF0ZUJ1c2luZXNzSW5mb0RhdGFTZXJ2aWNlLnJleENoZWNrLFxyXG4gICAgICAgIGNoZWNrUmV4TnVtYmVyOiBjaGVja1JleE51bWJlcixcclxuICAgICAgICBjbGVhclJleE51bWJlcjogY2xlYXJSZXhOdW1iZXIsXHJcbiAgICAgICAgY2xlYXJFb3JpTnVtYmVyOiBjbGVhckVvcmlOdW1iZXIsXHJcbiAgICAgICAgY2xlYXJUaW5OdW1iZXI6IGNsZWFyVGluTnVtYmVyLFxyXG4gICAgICAgIHNob3dNb2RhbEdvb2RzQWN0aXZpdGllczogc2hvd01vZGFsR29vZHNBY3Rpdml0aWVzLFxyXG4gICAgICAgIHNob3dJY29uOiBzaG93SWNvbixcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0ljb24oZmllbGQpIHtcclxuICAgICAgICBpZihmaWVsZCkge1xyXG4gICAgICAgICAgICBzdHIgPSBcIjxpIGNsYXNzPSdmYSBmYS1jaGVjay1zcXVhcmUnIHN0eWxlPSdjb2xvcjogZ3JlZW47Jz48L2k+XCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3RyID0gIFwiPGkgY2xhc3M9J2ZhIGZhLXdpbmRvdy1jbG9zZScgc3R5bGU9J2NvbG9yOnJlZDsnPjwvaT5cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICRzY2UudHJ1c3RBc0h0bWwoc3RyKTtcclxuICAgIH0gXHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd01vZGFsR29vZHNBY3Rpdml0aWVzKGRhdGEpIHtcclxuICAgICAgICB2YWxpZGF0ZUJ1c2luZXNzSW5mb1JleE1vZGFsLnNob3coZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJSZXhOdW1iZXIoKSB7XHJcbiAgICAgICAgdmFsaWRhdGVCdXNpbmVzc0luZm9EYXRhU2VydmljZS5jbGVhclJleE51bWJlcigpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhckVvcmlOdW1iZXIoKSB7XHJcbiAgICAgICAgdmFsaWRhdGVCdXNpbmVzc0luZm9EYXRhU2VydmljZS5jbGVhclJleEVvcmlOdW1iZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhclRpbk51bWJlcigpIHtcclxuICAgICAgICB2YWxpZGF0ZUJ1c2luZXNzSW5mb0RhdGFTZXJ2aWNlLmNsZWFyUmV4VGluTnVtYmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2hlY2tSZXhOdW1iZXIoKSB7XHJcbiAgICAgICAgaWYoIXZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2UucmV4Q2hlY2suZW9yaU51bWJlclxyXG4gICAgICAgICAgICAmJiAhdmFsaWRhdGVCdXNpbmVzc0luZm9EYXRhU2VydmljZS5yZXhDaGVjay5yZXhOdW1iZXJcclxuICAgICAgICAgICAgJiYgIXZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2UucmV4Q2hlY2sudGluTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHZtLnNob3dXYXJuaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuICR0aW1lb3V0KGZ1bmN0aW9uKCkgeyBcclxuICAgICAgICAgICAgICAgIHZtLnNob3dXYXJuaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sIDUwMDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYoIXZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2UucmV4Q2hlY2sucmV4TnVtYmVyKSB7XHJcbiAgICAgICAgLy8gICAgIHZtLnNob3dXYXJuaW5nID0gdHJ1ZTtcclxuICAgICAgICAvLyAgICAgcmV0dXJuICR0aW1lb3V0KGZ1bmN0aW9uKCkgeyBcclxuICAgICAgICAvLyAgICAgICAgIHZtLnNob3dXYXJuaW5nID0gZmFsc2U7XHJcbiAgICAgICAgLy8gICAgICAgICB2bS5lcnJvck1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICAgIC8vICAgICB9LCA1MDAwKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIHZhciByZXhSZWdleCA9IC9bQS1aYS16XVtBLVphLXpdUkVYP1tBLVowLTldezEsNTB9JC87XHJcbiAgICAgICAgaWYodmFsaWRhdGVCdXNpbmVzc0luZm9EYXRhU2VydmljZS5yZXhDaGVjay5yZXhOdW1iZXIgJiYgIXJleFJlZ2V4LnRlc3QodmFsaWRhdGVCdXNpbmVzc0luZm9EYXRhU2VydmljZS5yZXhDaGVjay5yZXhOdW1iZXIpKSB7XHJcbiAgICAgICAgICAgIHZtLnNob3dXYXJuaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuICR0aW1lb3V0KGZ1bmN0aW9uKCkgeyBcclxuICAgICAgICAgICAgICAgIHZtLnNob3dXYXJuaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2bS5lcnJvck1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB2bS5ub1Jlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIHZtLmluaXQgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdmFsaWRhdGVCdXNpbmVzc0luZm9EYXRhU2VydmljZS5jaGVja1JleE51bWJlcigpXHJcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYoIXZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2UucmV4Q2hlY2sucmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICB2bS5ub1Jlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJHRpbWVvdXQoZnVuY3Rpb24oKSB7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5ub1Jlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDgwMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2UucmV4Q2hlY2subWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdm0uc2hvd0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAkdGltZW91dChmdW5jdGlvbigpIHsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNob3dFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcclxuICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmKHZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2UucmV4Q2hlY2subWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdm0uc2hvd0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAkdGltZW91dChmdW5jdGlvbigpIHsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNob3dFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIGFjdGl2ZTogJ0AnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogdmFsaWRhdGVCdXNpbmVzc0luZm9TdWJuYXZDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICd2YWxpZGF0ZS1idXNpbmVzcy1pbmZvL2NvbXBvbmVudHMvdmFsaWRhdGUtYnVzaW5lc3MtaW5mby1zdWJuYXYuaHRtbCdcclxufTtcclxuXHJcbnZhbGlkYXRlQnVzaW5lc3NJbmZvU3VibmF2Q29udHJvbGxlci4kaW5qZWN0ID0gWydhcHBsaWNhdGlvblN0YXRlU2VydmljZSddO1xyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVCdXNpbmVzc0luZm9TdWJuYXZDb250cm9sbGVyKHN0YXRlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgcmVmZXJlbmNlQ291bnRyeTogc3RhdGUuZmlsdGVyLnJlZmVyZW5jZUNvdW50cnlcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIHRlbXBsYXRlVXJsOiAndmFsaWRhdGUtYnVzaW5lc3MtaW5mby9jb21wb25lbnRzL3ZhbGlkYXRlLWJ1c2luZXNzLWluZm8tdmF0LWZvcm0uaHRtbCdcclxufSIsIm1vZHVsZS5leHBvcnRzID0gW1xyXG4gICAgJyRhbmFseXRpY3MnLCBcclxuICAgICckdWliTW9kYWwnLCBcclxuICAgIHZhbGlkYXRlQnVzaW5lc3NJbmZvUmV4TW9kYWxcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHZhbGlkYXRlQnVzaW5lc3NJbmZvUmV4TW9kYWwoXHJcbiAgICAkYW5hbHl0aWNzLCBcclxuICAgICR1aWJNb2RhbFxyXG4pIHtcclxuICAgIHZhciBtb2RhbCA9IHtcclxuICAgICAgICB0YWJsZURhdGE6IG51bGwsXHJcbiAgICAgICAgc2hvdzogc2hvd01vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIHZhbGlkYXRlQnVzaW5lc3NJbmZvUmV4TW9kYWxDb250cm9sbGVyLiRpbmplY3QgPSBbXHJcbiAgICAgICAgJyR1aWJNb2RhbEluc3RhbmNlJywgXHJcbiAgICAgICAgJ3RhYmxlRGF0YScsXHJcbiAgICBdO1xyXG5cclxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlQnVzaW5lc3NJbmZvUmV4TW9kYWxDb250cm9sbGVyKFxyXG4gICAgICAgICR1aWJNb2RhbEluc3RhbmNlLCBcclxuICAgICAgICB0YWJsZURhdGFcclxuICAgICkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICAgICAkb25EZXN0cm95OiBkZXRhY2hlZCxcclxuICAgICAgICAgICAgY2FuY2VsOiBjYW5jZWwsXHJcbiAgICAgICAgICAgIHRhYmxlRGF0YTogdGFibGVEYXRhXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIHJlZnJlc2g7XHJcbiAgICAgICAgdmFyIG9wYWNpdHkgPSAxO1xyXG5cclxuICAgICAgICByZXR1cm4gdm07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZGV0YWNoZWQoKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3BhY2l0eSA9IDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbCh0YWJsZURhdGEpIHtcclxuICAgICAgICAkYW5hbHl0aWNzLmV2ZW50VHJhY2soJ29wZW4tbW9kYWwtcmV4JywgeyBjYXRlZ29yeTogJ3JleCcgfSk7XHJcbiAgICAgICAgaWYgKHRhYmxlRGF0YSlcclxuICAgICAgICAgICAgbW9kYWwudGFibGVEYXRhID0gdGFibGVEYXRhO1xyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZhbGlkYXRlQnVzaW5lc3NJbmZvUmV4TW9kYWxDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICdjdHJsZXVSZXhNb2RhbCcsXHJcbiAgICAgICAgICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgIHRhYmxlRGF0YTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RhbC50YWJsZURhdGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAndmFsaWRhdGUtYnVzaW5lc3MtaW5mby9tb2RhbHMvdmFsaWRhdGUtYnVzaW5lc3MtaW5mby1yZXgtbW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtcmV4J1xyXG4gICAgICAgIH0pLnJlc3VsdC5jYXRjaChmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgIGlmICghKHJlcyA9PT0gJ2NhbmNlbCcgfHwgcmVzID09PSAnZXNjYXBlIGtleSBwcmVzcycgfHwgcmVzID09PSAnYmFja2Ryb3AgY2xpY2snKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2RhbDtcclxuXHJcbn0iLCJtb2R1bGUuZXhwb3J0cyAgPSBbXHJcbiAgICAnZGF0YUNvbnRleHQnLCBcclxuICAgICdjb21tb24nLCBcclxuICAgIHZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2VcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHZhbGlkYXRlQnVzaW5lc3NJbmZvRGF0YVNlcnZpY2UoXHJcbiAgICBkYXRhQ29udGV4dCwgXHJcbiAgICBjb21tb25cclxuKSB7XHJcblxyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgcmVzcG9uc2U6IHt9LFxyXG4gICAgICAgIGlzTG9hZGluZzpmYWxzZSxcclxuICAgICAgICBlb3JpQ2hlY2s6IHtcclxuICAgICAgICAgICAgZW9yaU51bWJlcjogbnVsbCxcclxuICAgICAgICAgICAgcmVzdWx0OiBudWxsLFxyXG4gICAgICAgICAgICBtZXNzYWdlcyA6IG51bGwgLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmV4Q2hlY2s6IHtcclxuICAgICAgICAgICAgZW9yaU51bWJlcjogbnVsbCxcclxuICAgICAgICAgICAgcmV4TnVtYmVyOiBudWxsLFxyXG4gICAgICAgICAgICB0aW5OdW1iZXI6IG51bGwsXHJcbiAgICAgICAgICAgIHJlc3VsdDogbnVsbCxcclxuICAgICAgICAgICAgbWVzc2FnZXMgOiBudWxsICxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNkQ2hlY2s6IHtcclxuICAgICAgICAgICAgZW9yaU51bWJlcjogbnVsbCxcclxuICAgICAgICAgICAgY2ROdW1iZXI6IG51bGwsXHJcbiAgICAgICAgICAgIHJlc3VsdDogbnVsbCxcclxuICAgICAgICAgICAgbWVzc2FnZXMgOiBudWxsICxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRpc3BsYXk6ICdsaXN0JyxcclxuICAgICAgICBjaGVja0VvcmlOdW1iZXI6IGNoZWNrRW9yaU51bWJlcixcclxuICAgICAgICBjbGVhckVvcmlOdW1iZXI6IGNsZWFyRW9yaU51bWJlcixcclxuICAgICAgICBjaGVja1JleE51bWJlcjogY2hlY2tSZXhOdW1iZXIsXHJcbiAgICAgICAgY2xlYXJSZXhOdW1iZXI6IGNsZWFyUmV4TnVtYmVyLFxyXG4gICAgICAgIGNsZWFyUmV4RW9yaU51bWJlcjogY2xlYXJSZXhFb3JpTnVtYmVyLFxyXG4gICAgICAgIGNsZWFyUmV4VGluTnVtYmVyOiBjbGVhclJleFRpbk51bWJlcixcclxuICAgIH07XHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhckVvcmlOdW1iZXIoKSB7XHJcbiAgICAgICAgc2VydmljZS5lb3JpQ2hlY2suZW9yaU51bWJlciA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5lb3JpQ2hlY2sucmVzdWx0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhclJleE51bWJlcigpIHtcclxuICAgICAgICBzZXJ2aWNlLnJleENoZWNrLnJleE51bWJlciA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5yZXhDaGVjay5yZXN1bHQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyUmV4RW9yaU51bWJlcigpIHtcclxuICAgICAgICBzZXJ2aWNlLnJleENoZWNrLmVvcmlOdW1iZXIgPSBudWxsO1xyXG4gICAgICAgIHNlcnZpY2UucmV4Q2hlY2sucmVzdWx0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhclJleFRpbk51bWJlcigpIHtcclxuICAgICAgICBzZXJ2aWNlLnJleENoZWNrLnRpbk51bWJlciA9IG51bGw7XHJcbiAgICAgICAgc2VydmljZS5yZXhDaGVjay5yZXN1bHQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNoZWNrUmV4TnVtYmVyKCkge1xyXG4gICAgICAgIHNlcnZpY2UucmV4Q2hlY2sucmVzdWx0ID0gbnVsbDtcclxuICAgICAgICB2YXIgdXJsID0gY29tbW9uLmNvbmZpZy5hcGlIb3N0cy5nZW5lcmljICsgXHJcbiAgICAgICAgJy9yZXgtbnVtYmVycy9jaGVjay8nICsgXHJcbiAgICAgICAgJz9yZXg9JyArIChzZXJ2aWNlLnJleENoZWNrLnJleE51bWJlciB8fCAnJykgK1xyXG4gICAgICAgICcmZW9yaT0nICsgKHNlcnZpY2UucmV4Q2hlY2suZW9yaU51bWJlciB8fCAnJykgK1xyXG4gICAgICAgICcmdGluPScgKyAoc2VydmljZS5yZXhDaGVjay50aW5OdW1iZXIgfHwgJycpO1xyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgc2VydmljZS5yZXhDaGVjay5tZXNzYWdlcyA9IHJlc3VsdC5NZXNzYWdlcztcclxuICAgICAgICAgICAgc2VydmljZS5yZXhDaGVjay5yZXN1bHQgPSByZXN1bHQuUmVzdWx0LnJlc3VsdEZpZWxkO1xyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNoZWNrRW9yaU51bWJlcigpIHtcclxuICAgICAgICBzZXJ2aWNlLmVvcmlDaGVjay5yZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyBcclxuICAgICAgICAnL2VvcmktbnVtYmVycy9jaGVjaz9lb3JpPScgKyBcclxuICAgICAgICAoc2VydmljZS5lb3JpQ2hlY2suZW9yaU51bWJlciB8fCAnJyk7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhQ29udGV4dC5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgc2VydmljZS5lb3JpQ2hlY2sucmVzdWx0ID0gcmVzdWx0LlJlc3VsdDtcclxuICAgICAgICAgICAgc2VydmljZS5lb3JpQ2hlY2subWVzc2FnZXMgPSByZXN1bHQuTWVzc2FnZXM7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJhbmd1bGFyLm1vZHVsZSgndGFyaWMudmF0UmF0ZXMnLCBbXSlcclxuICAgIC8vIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsIHJvdXRlQ29uZmlndXJhdG9yXSlcclxuICAgIC5jb21wb25lbnQoJ3ZhdE1lYXN1cmUnLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvdmF0LW1lYXN1cmUnKSlcclxuICAgIC5jb21wb25lbnQoJ3ZhdFJhdGVzJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3ZhdC1yYXRlcycpKVxyXG4gICAgLmZhY3RvcnkoJ3ZhdFJhdGVzRGF0YVNlcnZpY2UnLCByZXF1aXJlKCcuL3NlcnZpY2VzL3ZhdC1yYXRlcy1kYXRhJykpO1xyXG5cclxuLy8gZnVuY3Rpb24gcm91dGVDb25maWd1cmF0b3IoJHJvdXRlUHJvdmlkZXIpIHtcclxuLy8gICAgICRyb3V0ZVByb3ZpZGVyXHJcbi8vICAgICAgICAgLndoZW4oJy90cmFkZS1zdGF0aXN0aWNzJywge1xyXG4vLyAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3RyYWRlLXN0YXRpc3RpY3MvY29udHJvbGxlcnMvdHJhZGUtc3RhdGlzdGljcy5odG1sJ1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgO1xyXG4vLyB9XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYmluZGluZ3M6IHtcclxuICAgICAgICBtZWFzdXJlOiAnPCdcclxuICAgIH0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3ZhdC1yYXRlcy9jb21wb25lbnRzL3ZhdC1tZWFzdXJlLmh0bWwnXHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgY29tbW9kaXR5Q29kZTogJzwnXHJcbiAgICB9LFxyXG4gICAgY29udHJvbGxlcjogdmF0UmF0ZXNDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICd2YXQtcmF0ZXMvY29tcG9uZW50cy92YXQtcmF0ZXMuaHRtbCdcclxufTtcclxuXHJcbnZhdFJhdGVzQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJ3ByZWZlcmVuY2VTZXJ2aWNlJywgXHJcbiAgICAndmF0UmF0ZXNEYXRhU2VydmljZSdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIHZhdFJhdGVzQ29udHJvbGxlcihcclxuICAgIHByZWZlcmVuY2VTZXJ2aWNlLFxyXG4gICAgdmF0UmF0ZXNEYXRhU2VydmljZVxyXG4pIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIHZhdFJhdGVDb3VudHJ5Q29kZTogbnVsbCxcclxuICAgICAgICBtZWFzdXJlczogW10sXHJcbiAgICAgICAgcG9zc2libGVWYXRSYXRlQ291bnRyaWVzOiBbXSxcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICB2YXRSYXRlQ291bnRyeUNoYW5nZWQ6IHZhdFJhdGVDb3VudHJ5Q2hhbmdlZFxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hlZCgpIHtcclxuICAgICAgICB2YXRSYXRlc0RhdGFTZXJ2aWNlLmdldFZhdFJhdGVzQ291bnRyaWVzKClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHZhdFJhdGVzQ291bnRyaWVzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmF0UmF0ZUNvdW50cnlDb2RlUHJlZmVyZW5jZSA9IHByZWZlcmVuY2VTZXJ2aWNlLmdldCgndmF0LXJhdGUtY291bnRyeScpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHByZWZlcnJlZFZhdFJhdGVDb3VudHJ5Q29kZSA9IHZhdFJhdGVDb3VudHJ5Q29kZVByZWZlcmVuY2UgPyB2YXRSYXRlQ291bnRyeUNvZGVQcmVmZXJlbmNlLnZhbHVlIDogbnVsbDtcclxuICAgICAgICAgICAgICAgIHZhciBwcmVmZXJyZWRWYXRSYXRlQ291bnRyeSA9IF8uZmluZCh2YXRSYXRlc0NvdW50cmllcywgZnVuY3Rpb24gKGNvdW50cnkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyeS5jb2RlID09IHByZWZlcnJlZFZhdFJhdGVDb3VudHJ5Q29kZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZWZlcnJlZFZhdFJhdGVDb3VudHJ5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0udmF0UmF0ZUNvdW50cnlDb2RlID0gcHJlZmVycmVkVmF0UmF0ZUNvdW50cnkuY29kZTtcclxuICAgICAgICAgICAgICAgICAgICB2YXRSYXRlQ291bnRyeUNoYW5nZWQocHJlZmVycmVkVmF0UmF0ZUNvdW50cnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdm0ucG9zc2libGVWYXRSYXRlQ291bnRyaWVzID0gdmF0UmF0ZXNDb3VudHJpZXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdmF0UmF0ZUNvdW50cnlDaGFuZ2VkKGNvdW50cnkpIHtcclxuICAgICAgICB2bS5tZWFzdXJlcyA9IFtdO1xyXG4gICAgICAgIGlmIChjb3VudHJ5KSB7XHJcbiAgICAgICAgICAgIHZtLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhdFJhdGVzRGF0YVNlcnZpY2UuZ2V0VmF0UmF0ZXModm0uY29tbW9kaXR5Q29kZSwgY291bnRyeS5jb2RlKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHZhdE1lYXN1cmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubWVhc3VyZXMgPSB2YXRNZWFzdXJlcztcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2bS52YXRSYXRlQ291bnRyeUNvZGUgPSBjb3VudHJ5ID8gY291bnRyeS5jb2RlIDogbnVsbDtcclxuICAgICAgICBwcmVmZXJlbmNlU2VydmljZS5yZXBsYWNlKHtcclxuICAgICAgICAgICAgbmFtZTogJ3ZhdC1yYXRlLWNvdW50cnknLFxyXG4gICAgICAgICAgICBjYXRlZ29yeTogJ3VzZXJfcHJlZmVyZW5jZXMnLFxyXG4gICAgICAgICAgICB2YWx1ZTogdm0udmF0UmF0ZUNvdW50cnlDb2RlLFxyXG4gICAgICAgICAgICB2YWx1ZVR5cGU6ICdzdHJpbmdWYWx1ZSdcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2bTtcclxufSIsIm1vZHVsZS5leHBvcnRzID0gW1xyXG4gICAgJ2NvbW1vbicsXHJcbiAgICAnY291bnRyeURhdGFTZXJ2aWNlJywgXHJcbiAgICAnZGF0YUNvbnRleHQnLCBcclxuICAgICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsXHJcbiAgICB2YXRSYXRlc0RhdGFTZXJ2aWNlXHJcbl07XHJcblxyXG5mdW5jdGlvbiB2YXRSYXRlc0RhdGFTZXJ2aWNlKFxyXG4gICAgY29tbW9uLCBcclxuICAgIGNvdW50cnlEYXRhU2VydmljZSxcclxuICAgIGRhdGFDb250ZXh0LFxyXG4gICAgc3RhdGVcclxuKSB7XHJcbiAgICB2YXIgc2VydmljZSA9IHtcclxuICAgICAgICBnZXRWYXRSYXRlc0NvdW50cmllczogZ2V0VmF0UmF0ZXNDb3VudHJpZXMsXHJcbiAgICAgICAgZ2V0VmF0UmF0ZXM6IGdldFZhdFJhdGVzXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHNlcnZpY2U7XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0VmF0UmF0ZXNDb3VudHJpZXMoKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGNvbW1vbi5jb25maWcuYXBpSG9zdHMuZ2VuZXJpYyArICcvdmF0LXJhdGVzLWNvdW50cmllcyc7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjb3VudHJ5Q29kZXMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLm1hcChjb3VudHJ5Q29kZXMsIGZ1bmN0aW9uIChjb3VudHJ5Q29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5Q29kZSA9PT0gJ0VMJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogY291bnRyeUNvZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb3VudHJ5RGF0YVNlcnZpY2UuY291bnRyaWVzWydHUiddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogY291bnRyeUNvZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvdW50cnlEYXRhU2VydmljZS5jb3VudHJpZXNbY291bnRyeUNvZGVdXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRWYXRSYXRlcyhjb21tb2RpdHlDb2RlLCBtZW1iZXJTdGF0ZSkge1xyXG4gICAgICAgIHZhciB1cmwgPSBjb21tb24uY29uZmlnLmFwaUhvc3RzLmdlbmVyaWMgKyAnL3ZhdC1yYXRlcy8nICsgY29tbW9kaXR5Q29kZSArXHJcbiAgICAgICAgICAgICc/cmVmZXJlbmNlQ291bnRyeT0nICsgbWVtYmVyU3RhdGUgK1xyXG4gICAgICAgICAgICAnJmxhbmc9JyArIGNvbW1vbi5sYW5ndWFnZS5nZXQoKSArXHJcbiAgICAgICAgICAgICcmZGF0ZT0nICsgc3RhdGUuZmlsdGVyLmRhdGU7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFDb250ZXh0LmdldCh1cmwpO1xyXG4gICAgfVxyXG59Iiwi77u/YW5ndWxhci5tb2R1bGUoJ3RhcmljLndpZGdldHMnLCBbXSlcclxuICAgIC8vIENvbnRyb2xsZXJzXHJcbiAgICAvLyBDb21wb25lbnRzXHJcbiAgICAuY29tcG9uZW50KCdmZWVkYmFja0J1dHRvbicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9mZWVkYmFjay1idXR0b24nKSlcclxuICAgIC5jb21wb25lbnQoJ2dvb2RzY29kZVNjcm9sbGVyJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL2dvb2RzY29kZS1zY3JvbGxlcicpKVxyXG4gICAgLmNvbXBvbmVudCgnbG9hZGluZ0luZGljYXRvcicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9sb2FkaW5nLWluZGljYXRvci9sb2FkaW5nLWluZGljYXRvci1ibG9jaycpKVxyXG4gICAgLmNvbXBvbmVudCgnbG9hZGluZ0luZGljYXRvcklubGluZScsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9sb2FkaW5nLWluZGljYXRvci9sb2FkaW5nLWluZGljYXRvci1pbmxpbmUnKSlcclxuICAgIC5jb21wb25lbnQoJ2xvYWRpbmdJbmRpY2F0b3JTbWFsbCcsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9sb2FkaW5nLWluZGljYXRvci9sb2FkaW5nLWluZGljYXRvci1zbWFsbCcpKVxyXG4gICAgLmNvbXBvbmVudCgnbW9kYWxQcmludEJ1dHRvbicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9tb2RhbC1wcmludC1idXR0b24nKSlcclxuICAgIC5jb21wb25lbnQoJ25hdmJhckxhbmd1YWdlRHJvcGRvd24nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbmF2YmFyLWxhbmd1YWdlLWRyb3Bkb3duJykpXHJcbiAgICAuY29tcG9uZW50KCdwcmludEJ1dHRvbicsIHJlcXVpcmUoJy4vY29tcG9uZW50cy9wcmludC1idXR0b24nKSlcclxuICAgIC5jb21wb25lbnQoJ3JlY2VudENvZGVCdXR0b24nLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvcmVjZW50LWNvZGUtYnV0dG9uJykpXHJcbiAgICAuY29tcG9uZW50KCdyZWZlcmVuY2VDb3VudHJ5UGlja2VyJywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3JlZmVyZW5jZS1jb3VudHJ5LXBpY2tlcicpKVxyXG4gICAgLmNvbXBvbmVudCgndGFyaWNOYXZiYXInLCByZXF1aXJlKCcuL2NvbXBvbmVudHMvbmF2YmFyJykpXHJcbiAgICAuY29tcG9uZW50KCd0YXJpY1N0YXR1cycsIHJlcXVpcmUoJy4vY29tcG9uZW50cy90YXJpYy1zdGF0dXMnKSlcclxuICAgIC5jb21wb25lbnQoJ3RyYW5zbGF0ZWRUZXh0JywgcmVxdWlyZSgnLi9jb21wb25lbnRzL3RyYW5zbGF0ZWQtdGV4dCcpKVxyXG4gICAgLy8gRmlsdGVyc1xyXG4gICAgLmZpbHRlcignYWRkSHlwZXJsaW5rcycsIHJlcXVpcmUoJy4vZmlsdGVycy9hZGQtaHlwZXJsaW5rcycpKVxyXG4gICAgLmZpbHRlcignY291bnRyeVR5cGVhaGVhZCcsIHJlcXVpcmUoJy4vZmlsdGVycy9jb3VudHJ5LXR5cGVhaGVhZC1maWx0ZXInKSlcclxuICAgIC5maWx0ZXIoJ2Zvcm1hdERlc2NyaXB0aW9uJywgcmVxdWlyZSgnLi9maWx0ZXJzL2Zvcm1hdC1kZXNjcmlwdGlvbicpKVxyXG4gICAgLmZpbHRlcignZm9ybWF0RHV0eScsIHJlcXVpcmUoJy4vZmlsdGVycy9mb3JtYXQtZHV0eScpKVxyXG4gICAgLmZpbHRlcignZm9ybWF0R25Db2RlJywgcmVxdWlyZSgnLi9maWx0ZXJzL2Zvcm1hdC1nbi1jb2RlJykpXHJcbiAgICAuZmlsdGVyKCdmb3JtYXRUYXJpY0NvZGUnLCByZXF1aXJlKCcuL2ZpbHRlcnMvZm9ybWF0LXRhcmljLWNvZGUnKSlcclxuICAgIC5maWx0ZXIoJ2Zvcm1hdEV6dENvZGUnLCByZXF1aXJlKCcuL2ZpbHRlcnMvZm9ybWF0LWV6dC1jb2RlJykpXHJcbiAgICAuZmlsdGVyKCdoYXNBZGRpdGlvbmFsQ29kZScsIHJlcXVpcmUoJy4vZmlsdGVycy9oYXMtYWRkaXRpb25hbC1jb2RlJykpXHJcbiAgICAuZmlsdGVyKCdoYXNDb3VudHJ5JywgcmVxdWlyZSgnLi9maWx0ZXJzL2hhcy1jb3VudHJ5JykpXHJcbiAgICAuZmlsdGVyKCd0YXJpY0NvZGVUb0NoYXB0ZXJOdW1iZXInLCByZXF1aXJlKCcuL2ZpbHRlcnMvdGFyaWMtY29kZS10by1jaGFwdGVyLW51bWJlcicpKVxyXG4gICAgLmZpbHRlcignaGlnaGxpZ2h0JywgcmVxdWlyZSgnLi9maWx0ZXJzL2hpZ2hsaWdodCcpKVxyXG4gICAgLmZpbHRlcigndHJ1c3QnLCByZXF1aXJlKCcuL2ZpbHRlcnMvdHJ1c3QnKSlcclxuICAgIC5maWx0ZXIoJ3N0cmlwVGFyaWNDb2RlJywgcmVxdWlyZSgnLi9maWx0ZXJzL3N0cmlwLXRhcmljLWNvZGUnKSlcclxuICAgIC5maWx0ZXIoJ3RhcmljRGFzaGVzJywgcmVxdWlyZSgnLi9maWx0ZXJzL3RhcmljLWRhc2hlcycpKVxyXG4gICAgLmZpbHRlcigndG9DdXJyZW5jeVNpZ24nLCByZXF1aXJlKCcuL2ZpbHRlcnMvdG8tY3VycmVuY3ktc2lnbicpKVxyXG4gICAgLmZpbHRlcigndHJpbScsIHJlcXVpcmUoJy4vZmlsdGVycy90cmltJykpXHJcbiAgICAuZmlsdGVyKCd0b0ZpeGVkJywgcmVxdWlyZSgnLi9maWx0ZXJzL3RvLWZpeGVkJykpXHJcbiAgICAvLyBNb2RhbHNcclxuICAgIC5mYWN0b3J5KCdhcmVZb3VTdXJlTW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9hcmUteW91LXN1cmUnKSlcclxuICAgIC5mYWN0b3J5KCdsb2dnaW5nT3V0TW9kYWwnLCByZXF1aXJlKCcuL21vZGFscy9sb2dnaW5nLW91dCcpKVxyXG4gICAgLmZhY3RvcnkoJ3dpZGdldE1vZGFscycsIHJlcXVpcmUoJy4vbW9kYWxzL21vZGFscycpKVxyXG4gICAgLy8gU2VydmljZXNcclxuICAgIC5mYWN0b3J5KCd0YXJpY1N0YXR1c1NlcnZpY2UnLCByZXF1aXJlKCcuL3NlcnZpY2VzL3RhcmljLXN0YXR1cycpKVxyXG4gICAgO1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IGZlZWRiYWNrQnV0dG9uQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnd2lkZ2V0cy9jb21wb25lbnRzL2ZlZWRiYWNrLWJ1dHRvbi5odG1sJ1xyXG59O1xyXG5cclxuZmVlZGJhY2tCdXR0b25Db250cm9sbGVyLiRpbmplY3QgPSBbJ2xhbmd1YWdlJ107XHJcblxyXG5mdW5jdGlvbiBmZWVkYmFja0J1dHRvbkNvbnRyb2xsZXIobGFuZ3VhZ2UpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgZ29vZHNjb2RlczogJzwnXHJcbiAgICB9LFx0XHJcbiAgICBjb250cm9sbGVyOiBnb29kc2NvZGVTY3JvbGxlckNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3dpZGdldHMvY29tcG9uZW50cy9nb29kc2NvZGUtc2Nyb2xsZXIuaHRtbCdcclxufTtcclxuXHJcbmdvb2RzY29kZVNjcm9sbGVyQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRlbGVtZW50JywgXHJcbl07XHJcblxyXG5mdW5jdGlvbiBnb29kc2NvZGVTY3JvbGxlckNvbnRyb2xsZXIoXHJcbiAgICAkZWxlbWVudFxyXG4pIHtcclxuXHJcbiAgICB2YXIgY2hhcHRlckxpc3QsIGhlYWRpbmdMaXN0LCBnb29kc0NvZGVMaXN0O1xyXG4gICAgdmFyIHZtID0ge1xyXG4gICAgICAgICRvbkluaXQ6IGF0dGFjaGVkLFxyXG4gICAgICAgICRwb3N0TGluazogbGluayxcclxuICAgICAgICBzZXRDdXJyZW50Q2hhcHRlcjogc2V0Q3VycmVudENoYXB0ZXIsXHJcbiAgICAgICAgc2V0Q3VycmVudEhlYWRpbmc6IHNldEN1cnJlbnRIZWFkaW5nXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIFxyXG4gICAgICAgIHZtLmhlYWRpbmdzID0gXy5jaGFpbih2bS5nb29kc2NvZGVzKVxyXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGdvb2RzY29kZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdvb2RzY29kZS5zdWJzdHJpbmcoMCwgNCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC51bmlxKClcclxuICAgICAgICAgICAgLnZhbHVlKCk7XHJcbiAgICAgICAgdm0uY2hhcHRlcnMgPSBfLmNoYWluKHZtLmhlYWRpbmdzKVxyXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGhlYWRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBoZWFkaW5nLnN1YnN0cmluZygwLCAyKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnVuaXEoKVxyXG4gICAgICAgICAgICAudmFsdWUoKTtcclxuXHJcbiAgICAgICAgdm0uY3VycmVudENoYXB0ZXIgPSB2bS5jaGFwdGVyc1swXTtcclxuICAgICAgICB2bS5jdXJyZW50SGVhZGluZyA9IHZtLmhlYWRpbmdzWzBdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBsaW5rKCkge1xyXG4gICAgICAgIGNoYXB0ZXJMaXN0ID0gJGVsZW1lbnRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZ29vZHNjb2RlLXNjcm9sbGVyLWNoYXB0ZXItbGlzdCcpWzBdO1xyXG4gICAgICAgIGhlYWRpbmdMaXN0ID0gJGVsZW1lbnRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZ29vZHNjb2RlLXNjcm9sbGVyLWhlYWRpbmctbGlzdCcpWzBdO1xyXG4gICAgICAgIGdvb2RzQ29kZUxpc3QgPSAkZWxlbWVudFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdnb29kc2NvZGUtc2Nyb2xsZXItZ29vZHNjb2RlLWxpc3QnKVswXTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRDdXJyZW50Q2hhcHRlcihjaGFwdGVyLCAkZXZlbnQpIHtcclxuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgdm0uY3VycmVudENoYXB0ZXIgPSBjaGFwdGVyO1xyXG4gICAgICAgIHZtLmN1cnJlbnRIZWFkaW5nID0gXy5maW5kKHZtLmhlYWRpbmdzLCBmdW5jdGlvbihoZWFkaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBoZWFkaW5nLnN1YnN0cmluZygwLCAyKSA9PT0gY2hhcHRlcjtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIGhlYWRpbmdMaXN0SXRlbSA9IGhlYWRpbmdMaXN0LnF1ZXJ5U2VsZWN0b3IoJ2xpW2RhdGEtY2hhcHRlcj1cIicgKyBjaGFwdGVyICsgJ1wiXScpO1xyXG4gICAgICAgIGhlYWRpbmdMaXN0LnNjcm9sbFRvcCA9IGhlYWRpbmdMaXN0SXRlbS5vZmZzZXRUb3AgLSA0MDtcclxuXHJcbiAgICAgICAgdmFyIGdvb2RzQ29kZUxpc3RJdGVtID0gZ29vZHNDb2RlTGlzdC5xdWVyeVNlbGVjdG9yKCdsaVtkYXRhLWNoYXB0ZXI9XCInICsgY2hhcHRlciArICdcIl0nKTtcclxuICAgICAgICBnb29kc0NvZGVMaXN0LnNjcm9sbFRvcCA9IGdvb2RzQ29kZUxpc3RJdGVtLm9mZnNldFRvcCAtIDQwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRDdXJyZW50SGVhZGluZyhoZWFkaW5nLCAkZXZlbnQpIHtcclxuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgdm0uY3VycmVudEhlYWRpbmcgPSBoZWFkaW5nO1xyXG4gICAgICAgIHZhciBnb29kc0NvZGVMaXN0SXRlbSA9IGdvb2RzQ29kZUxpc3QucXVlcnlTZWxlY3RvcignbGlbZGF0YS1oZWFkaW5nPVwiJyArIGhlYWRpbmcgKyAnXCJdJyk7XHJcbiAgICAgICAgZ29vZHNDb2RlTGlzdC5zY3JvbGxUb3AgPSBnb29kc0NvZGVMaXN0SXRlbS5vZmZzZXRUb3AgLSA0MDtcclxuICAgIH1cclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgdGVtcGxhdGVVcmw6ICd3aWRnZXRzL2NvbXBvbmVudHMvbG9hZGluZy1pbmRpY2F0b3IvbG9hZGluZy1pbmRpY2F0b3ItYmxvY2suaHRtbCdcclxufTsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIHRlbXBsYXRlVXJsOiAnd2lkZ2V0cy9jb21wb25lbnRzL2xvYWRpbmctaW5kaWNhdG9yL2xvYWRpbmctaW5kaWNhdG9yLWlubGluZS5odG1sJ1xyXG59OyIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgdGVtcGxhdGVVcmw6ICd3aWRnZXRzL2NvbXBvbmVudHMvbG9hZGluZy1pbmRpY2F0b3IvbG9hZGluZy1pbmRpY2F0b3Itc21hbGwuaHRtbCdcclxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IG1vZGFsUHJpbnRCdXR0b25Db250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICd3aWRnZXRzL2NvbXBvbmVudHMvbW9kYWwtcHJpbnQtYnV0dG9uLmh0bWwnXHJcbn07XHJcblxyXG5mdW5jdGlvbiBtb2RhbFByaW50QnV0dG9uQ29udHJvbGxlcigpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBwcmludFBhZ2U6IHByaW50UGFnZSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gcHJpbnRQYWdlKCkge1xyXG4gICAgICAgIHdpbmRvdy5wcmludCgpO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBsYW5ndWFnZURyb3Bkb3duQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnd2lkZ2V0cy9jb21wb25lbnRzL25hdmJhci1sYW5ndWFnZS1kcm9wZG93bi5odG1sJ1xyXG59O1xyXG5cclxubGFuZ3VhZ2VEcm9wZG93bkNvbnRyb2xsZXIuJGluamVjdCA9IFsnJHRpbWVvdXQnLCAnJHdpbmRvdycsICdjb21tb24nLCAnZG9jdW1lbnRhdGlvblNlcnZpY2UnLCAncHJlZmVyZW5jZVNlcnZpY2UnXTtcclxuXHJcbmZ1bmN0aW9uIGxhbmd1YWdlRHJvcGRvd25Db250cm9sbGVyKCR0aW1lb3V0LCAkd2luZG93LCBjb21tb24sIGRvY3VtZW50YXRpb25TZXJ2aWNlLCBwcmVmZXJlbmNlcykge1xyXG5cclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBvbkNsaWNrOiBvbkNsaWNrLFxyXG4gICAgICAgIGdldExhbmd1YWdlOiBjb21tb24ubGFuZ3VhZ2UuZ2V0LFxyXG4gICAgICAgIHNldExhbmd1YWdlOiBzZXRMYW5ndWFnZSxcclxuICAgICAgICBsYW5ndWFnZVNlcnZpY2U6IGNvbW1vbi5sYW5ndWFnZVxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBvbkNsaWNrKCkge1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBkb2N1bWVudGF0aW9uU2VydmljZS5leGl0KCk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcclxuXHJcbiAgICAgICAgcHJlZmVyZW5jZXMuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpLnRoZW4oZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIC8vIFdlIHNldCBhIHRpbWVvdXQgaW4gb3JkZXIgdG8gZ2l2ZSBsaXN0ZW5lcnNcclxuICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBsYW5ndWFnZSBjaGFuZ2VkIGV2ZW50IGEgY2hhbmNlIHRvIHJlYWN0XHJcbiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgcmVsb2FkaW5nLiBGb3IgZXhhbXBsZSwgdGhlIHF1ZXJ5IHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIHNlYXJjaCBmdW5jdGlvbiBpcyBjbGVhcmVkLlxyXG4gICAgICAgICAgICAgICAgJHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgICAgfSwgMSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxufSIsIu+7v3ZhciBtb21lbnQgPSByZXF1aXJlKCdtb21lbnQnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogbmF2YmFyQ29udHJvbGxlcixcclxuICAgIHRlbXBsYXRlVXJsOiAnd2lkZ2V0cy9jb21wb25lbnRzL25hdmJhci5odG1sJ1xyXG59O1xyXG5cclxubmF2YmFyQ29udHJvbGxlci4kaW5qZWN0ID0gWyckYW5hbHl0aWNzJywgJyRsb2NhdGlvbicsICdjb21tb24nLCAnZG9jdW1lbnRhdGlvblNlcnZpY2UnLCAnZmF2b3JpdGVzU2VydmljZScsICdwcmVmZXJlbmNlU2VydmljZScsICdhcHBsaWNhdGlvblN0YXRlU2VydmljZSddO1xyXG5cclxuZnVuY3Rpb24gbmF2YmFyQ29udHJvbGxlcigkYW5hbHl0aWNzLCAkbG9jYXRpb24sIGNvbW1vbiwgZG9jdW1lbnRhdGlvblNlcnZpY2UsIGZhdm9yaXRlU2VydmljZSwgcHJlZmVyZW5jZXMsIHN0YXRlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgY29uZmlnOiBjb21tb24uY29uZmlnLFxyXG4gICAgICAgIGlkZW50aXR5OiBjb21tb24uaWRlbnRpdHksXHJcbiAgICAgICAgZmF2b3JpdGVTZXJ2aWNlOiBmYXZvcml0ZVNlcnZpY2UsXHJcbiAgICAgICAgbGFuZ3VhZ2U6IGNvbW1vbi5sYW5ndWFnZSxcclxuICAgICAgICBvcGVuRmF2b3JpdGU6IG9wZW5GYXZvcml0ZSxcclxuICAgICAgICByZW1vdmVGYXZvcml0ZTogcmVtb3ZlRmF2b3JpdGUsXHJcbiAgICAgICAgc2V0TGFuZ3VhZ2U6IHNldExhbmd1YWdlLFxyXG4gICAgICAgIHNob3dSZWZlcmVuY2VEYXRlUGlja2VyOiBzaG93UmVmZXJlbmNlRGF0ZVBpY2tlcixcclxuICAgICAgICBzaG93UmVmZXJlbmNlRGF0ZU5vdGlmaWNhdGlvbjogc2hvd1JlZmVyZW5jZURhdGVOb3RpZmljYXRpb24sXHJcbiAgICAgICAgc2hvd1NpZGViYXI6IGZhbHNlLFxyXG4gICAgICAgIHN1cHBvcnRlZExhbmd1YWdlczogY29tbW9uLmxhbmd1YWdlLnN1cHBvcnRlZExhbmd1YWdlcyxcclxuICAgICAgICB0b2dnbGU6IHRvZ2dsZSxcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIHRvZ2dsZSgpIHtcclxuICAgICAgICB2bS5zaG93U2lkZWJhciA9ICF2bS5zaG93U2lkZWJhcjtcclxuICAgICAgICBpZiAodm0uc2hvd1NpZGViYXIpIHtcclxuICAgICAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKCdvcGVuLW1haW4tbmF2JywgeyBjYXRlZ29yeTogJ25hdmlnYXRpb24nIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRvY3VtZW50YXRpb25TZXJ2aWNlLmluaXRpYWxpemUoJ21lbnUnKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93UmVmZXJlbmNlRGF0ZU5vdGlmaWNhdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gc2hvd1JlZmVyZW5jZURhdGVQaWNrZXIoKSAmJiBzdGF0ZS5maWx0ZXIuZGF0ZSAhPT0gbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd1JlZmVyZW5jZURhdGVQaWNrZXIoKSB7XHJcbiAgICAgICAgaWYgKCRsb2NhdGlvbi5wYXRoKCkuaW5kZXhPZignL2Nhc2UtbGF3JykgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoJGxvY2F0aW9uLnBhdGgoKS5pbmRleE9mKCcvY29tcGxpYW5jZS1jaGVjaycpID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCRsb2NhdGlvbi5wYXRoKCkuaW5kZXhPZignL2FjY291bnQnKSA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgkbG9jYXRpb24ucGF0aCgpLmluZGV4T2YoJy9jb3JyZWxhdGlvbi10YWJsZScpID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb3BlbkZhdm9yaXRlKGdvb2RzY29kZSwgbW92ZW1lbnQsICRldmVudCkge1xyXG4gICAgICAgIGlmICghbW92ZW1lbnQpIHtcclxuICAgICAgICAgICAgbW92ZW1lbnQgPSAnaW1wb3J0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgc3RhdGUuZmlsdGVyLm1vdmVtZW50ID0gbW92ZW1lbnQ7XHJcbiAgICAgICAgcHJlZmVyZW5jZXMucmVwbGFjZSh7XHJcbiAgICAgICAgICAgIG5hbWU6ICdtb3ZlbWVudCcsXHJcbiAgICAgICAgICAgIGNhdGVnb3J5OiAndXNlcl9wcmVmZXJlbmNlcycsXHJcbiAgICAgICAgICAgIHZhbHVlOiBtb3ZlbWVudCxcclxuICAgICAgICAgICAgdmFsdWVUeXBlOiAnc3RyaW5nVmFsdWUnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdm0uc2hvd1NpZGViYXIgPSBmYWxzZTtcclxuICAgICAgICAkbG9jYXRpb24udXJsKCcvc2VhcmNoLycgKyBnb29kc2NvZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlbW92ZUZhdm9yaXRlKGdvb2RzY29kZSwgbW92ZW1lbnQsICRldmVudCkge1xyXG4gICAgICAgIGZhdm9yaXRlU2VydmljZS5yZW1vdmUoZ29vZHNjb2RlLCBtb3ZlbWVudCk7XHJcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNldExhbmd1YWdlKGxhbmcpIHtcclxuICAgICAgICBwcmVmZXJlbmNlcy5zZXRMYW5ndWFnZShsYW5nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBjb250cm9sbGVyOiBwcmludEJ1dHRvbkNvbnRyb2xsZXIsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3dpZGdldHMvY29tcG9uZW50cy9wcmludC1idXR0b24uaHRtbCdcclxufTtcclxuXHJcbmZ1bmN0aW9uIHByaW50QnV0dG9uQ29udHJvbGxlcigpIHtcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBwcmludFBhZ2U6IHByaW50UGFnZSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gdm07XHJcblxyXG4gICAgZnVuY3Rpb24gcHJpbnRQYWdlKCkge1xyXG4gICAgICAgIHdpbmRvdy5wcmludCgpO1xyXG4gICAgfVxyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIHJlY2VudENvZGU6ICc8J1xyXG4gICAgfSxcclxuICAgIGNvbnRyb2xsZXI6IHJlY2VudENvZGVCdXR0b25Db250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICd3aWRnZXRzL2NvbXBvbmVudHMvcmVjZW50LWNvZGUtYnV0dG9uLmh0bWwnXHJcbn07XHJcblxyXG5yZWNlbnRDb2RlQnV0dG9uQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyRsb2NhdGlvbicsIFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJywgXHJcbiAgICAncHJlZmVyZW5jZVNlcnZpY2UnLFxyXG5dO1xyXG5cclxuZnVuY3Rpb24gcmVjZW50Q29kZUJ1dHRvbkNvbnRyb2xsZXIoXHJcbiAgICAkbG9jYXRpb24sIFxyXG4gICAgc3RhdGUsIFxyXG4gICAgcHJlZmVyZW5jZXNcclxuKSB7XHJcbiAgICBcclxuICAgIHZhciB2bSA9IHtcclxuICAgICAgICBhbGxEb25lOiBmYWxzZSxcclxuICAgICAgICAkb25Jbml0OiBhdHRhY2hlZCxcclxuICAgICAgICBjb3VudHJ5OiBudWxsLFxyXG4gICAgICAgIGZvcm1EaXNwbGF5OiBmb3JtRGlzcGxheSxcclxuICAgICAgICBnb29kc25vbTogbnVsbCxcclxuICAgICAgICBzaG93UmVjZW50Q29kZTogc2hvd1JlY2VudENvZGUsXHJcbiAgICAgICAgc291cmNlOiBudWxsXHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIGZvcm1EaXNwbGF5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd1JlY2VudENvZGUoKSB7XHJcbiAgICAgICAgdmFyIG1vdmVtZW50ID0gdm0uc291cmNlIHx8ICdpbXBvcnQnO1xyXG4gICAgICAgIHN0YXRlLmZpbHRlci5tb3ZlbWVudCA9IG1vdmVtZW50O1xyXG4gICAgICAgIHByZWZlcmVuY2VzLnJlcGxhY2Uoe1xyXG4gICAgICAgICAgICBuYW1lOiAnbW92ZW1lbnQnLFxyXG4gICAgICAgICAgICBjYXRlZ29yeTogJ3VzZXJfcHJlZmVyZW5jZXMnLFxyXG4gICAgICAgICAgICB2YWx1ZTogbW92ZW1lbnQsXHJcbiAgICAgICAgICAgIHZhbHVlVHlwZTogJ3N0cmluZ1ZhbHVlJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICRsb2NhdGlvbi51cmwoJy9nb29kLycgKyB2bS5nb29kc25vbSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZm9ybURpc3BsYXkoKSB7XHJcbiAgICAgICAgaWYgKHZtLnJlY2VudENvZGUgPT09IHVuZGVmaW5lZCB8fCB2bS5yZWNlbnRDb2RlID09PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgdmFyIGRpc3BsYXlWYWx1ZXMgPSB2bS5yZWNlbnRDb2RlLm5hbWUuc3BsaXQoJ18nKTtcclxuICAgICAgICB2bS5nb29kc25vbSA9IGRpc3BsYXlWYWx1ZXNbMF07XHJcbiAgICAgICAgaWYgKGRpc3BsYXlWYWx1ZXMubGVuZ3RoID4gMSlcclxuICAgICAgICAgICAgdm0uc291cmNlID0gZGlzcGxheVZhbHVlc1sxXTtcclxuICAgICAgICBpZiAoZGlzcGxheVZhbHVlcy5sZW5ndGggPiAyKVxyXG4gICAgICAgICAgICB2bS5jb3VudHJ5ID0gZGlzcGxheVZhbHVlc1syXTtcclxuICAgICAgICB2bS5hbGxEb25lID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdm07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGNvbnRyb2xsZXI6IHJlZmVyZW5jZUNvdW50cnlQaWNrZXJDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICd3aWRnZXRzL2NvbXBvbmVudHMvcmVmZXJlbmNlLWNvdW50cnktcGlja2VyLmh0bWwnXHJcbn07XHJcblxyXG5yZWZlcmVuY2VDb3VudHJ5UGlja2VyQ29udHJvbGxlci4kaW5qZWN0ID0gW1xyXG4gICAgJyR3aW5kb3cnLCBcclxuICAgICdjb3VudHJ5RGF0YVNlcnZpY2UnLFxyXG4gICAgJ2lkZW50aXR5JyxcclxuICAgICdwcmVmZXJlbmNlU2VydmljZScsIFxyXG4gICAgJ2FwcGxpY2F0aW9uU3RhdGVTZXJ2aWNlJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gcmVmZXJlbmNlQ291bnRyeVBpY2tlckNvbnRyb2xsZXIoXHJcbiAgICAkd2luZG93LFxyXG4gICAgY291bnRyeURhdGFTZXJ2aWNlLFxyXG4gICAgaWRlbnRpdHksIFxyXG4gICAgcHJlZmVyZW5jZXMsIFxyXG4gICAgc3RhdGVcclxuKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgc2VhcmNoRmlsdGVyOiBzdGF0ZS5maWx0ZXIsXHJcbiAgICAgICAgY291bnRyeU5hbWVzOiBjb3VudHJ5RGF0YVNlcnZpY2UuY291bnRyaWVzLFxyXG4gICAgICAgIHJlZmVyZW5jZUNvdW50cmllczogW10sXHJcbiAgICAgICAgc2V0UmVmZXJlbmNlQ291bnRyeTogc2V0UmVmZXJlbmNlQ291bnRyeVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIHZtLnJlZmVyZW5jZUNvdW50cmllcyA9IGlkZW50aXR5LmdldEFsbG93ZWRUcmFkZVRhcmlmZnMoKTtcclxuICAgICAgICB2bS5kaXNhbGxvd2VkUmVmZXJlbmNlQ291bnRyaWVzID0gaWRlbnRpdHkuZ2V0RGlzYWxsb3dlZFRyYWRlVGFyaWZmcygpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBzZXRSZWZlcmVuY2VDb3VudHJ5KHJlZmVyZW5jZUNvdW50cnkpIHtcclxuICAgICAgICBzdGF0ZS5maWx0ZXIucmVmZXJlbmNlQ291bnRyeSA9IHJlZmVyZW5jZUNvdW50cnk7XHJcbiAgICAgICAgcHJlZmVyZW5jZXMuc2V0UmVmZXJlbmNlQ291bnRyeShyZWZlcmVuY2VDb3VudHJ5KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgY29udHJvbGxlcjogdGFyaWNTdGF0dXNDb250cm9sbGVyLFxyXG4gICAgdGVtcGxhdGVVcmw6ICd3aWRnZXRzL2NvbXBvbmVudHMvdGFyaWMtc3RhdHVzLmh0bWwnXHJcbn07XHJcblxyXG50YXJpY1N0YXR1c0NvbnRyb2xsZXIuJGluamVjdCA9IFsndGFyaWNTdGF0dXNTZXJ2aWNlJ107XHJcblxyXG5mdW5jdGlvbiB0YXJpY1N0YXR1c0NvbnRyb2xsZXIodGFyaWNTdGF0dXNTZXJ2aWNlKSB7XHJcbiAgICB2YXIgdm0gPSB7XHJcbiAgICAgICAgJG9uSW5pdDogYXR0YWNoZWQsXHJcbiAgICAgICAgc2VydmljZTogdGFyaWNTdGF0dXNTZXJ2aWNlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHZtO1xyXG5cclxuICAgIGZ1bmN0aW9uIGF0dGFjaGVkKCkge1xyXG4gICAgICAgIHRhcmljU3RhdHVzU2VydmljZS5sb2FkTGFzdFN1Y2Nlc3NmdWxEYXRhYmFzZSgpO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBiaW5kaW5nczoge1xyXG4gICAgICAgIHRyYW5zbGF0aW9uOiAnPCdcclxuICAgIH0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3dpZGdldHMvY29tcG9uZW50cy90cmFuc2xhdGVkLXRleHQuaHRtbCdcclxufTsiLCLvu79tb2R1bGUuZXhwb3J0cyA9IFthZGRIeXBlcmxpbmtzRmlsdGVyXTtcclxuXHJcbmZ1bmN0aW9uIGFkZEh5cGVybGlua3NGaWx0ZXIoKSB7XHJcbiAgICBmdW5jdGlvbiBtYWtlUmVwbGFjZW1lbnRGdW5jdGlvbihyZXBsYWNlUmVnZXgsIHJlcGxhY2VUZW1wbGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3RyLCBzZWFyY2hSZWdleCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2Uoc2VhcmNoUmVnZXgsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBtYXRjaGVkU3RyaW5nID0gYXJndW1lbnRzWzBdOyAvLyBFZy4gcG9zdGVuIHh4eHggZW4geHh4eFxyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG1hdGNoZWRTdHJpbmcucmVwbGFjZShyZXBsYWNlUmVnZXgsIHJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBvcHRpb25zID0ge1xyXG4gICAgICAgICdoZWFkaW5nJzoge1xyXG4gICAgICAgICAgICAnc2VhcmNoUmVnZXgnOiAvKCg/Oig/OltIfGhdZWFkaW5nKD86cyk/KXwoPzpbU3xzXXViaGVhZGluZyg/OnMpPyl8KD86Q04oPzpcXHN8LSljb2Rlcz8pKSg/Olxcc3xcXG58PGJyXFwvPz58Jm5ic3A7KSopKD86KD86ZXgpPyg/Olxcc3xcXG58PGJyXFwvPz58Jm5ic3A7KSopPyhcXGR7Mn0oPzooPzpbLlxcc118Jm5ic3A7KT9cXGR7Mn0pKykoPzooPzooPzpcXHN8XFxufDxiclxcLz8+KSooPzo7fCx8YW5kfG9yfHRvKSg/Olxcc3xcXG58PGJyXFwvPz58Jm5ic3A7KSooXFxkezJ9KD86KD86Wy5cXHNdfCZuYnNwOyk/XFxkezJ9KSspKSkqL2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlUmVnZXgnOiAvKFxcZHsyfSg/Oig/OlsuXFxzXXwmbmJzcDspP1xcZHsyfSkrKS9nLFxyXG4gICAgICAgICAgICAncmVwbGFjZVRlbXBsYXRlJzogJzxhIGNsYXNzPVwibGluay1jb21tb2RpdHktY29kZVwiIGhyZWY9XCIvIyEvc2VhcmNoLyQxXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+JyxcclxuICAgICAgICB9LFxyXG4gICAgICAgICdoZWFkaW5nX0ZSJzoge1xyXG4gICAgICAgICAgICAnc2VhcmNoUmVnZXgnOiAvKCg/Oig/OltOfG5dPHN1cD5vKD86PFxcL3N1cD48c3VwPik/cz88XFwvc3VwPlxcJD8pfCg/OltTfHNdb3VzLXBvc2l0aW9uKD86cyk/KXxuwrApKD86XFxzfFxcbnw8YnJcXC8/PnwmbmJzcDspKikoXFxkezJ9KD86Wy5cXHNdP1xcZHsyfSkrKSg/Oig/Oig/Olxcc3xcXG58PGJyXFwvPz58Jm5ic3A7KSooPzo7fCx8ZXR8b3V8w6ApKD86XFxzfFxcbnw8YnJcXC8/PnwmbmJzcDspKihcXGR7Mn0oPzpbLlxcc10/XFxkezJ9KSspKSkqL2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlUmVnZXgnOiAvKFxcZHsyfSg/OlsuXFxzXT9cXGR7Mn0pKykvZyxcclxuICAgICAgICAgICAgJ3JlcGxhY2VUZW1wbGF0ZSc6ICc8YSBjbGFzcz1cImxpbmstY29tbW9kaXR5LWNvZGVcIiBocmVmPVwiLyMhL3NlYXJjaC8kMVwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAnaGVhZGluZ19ERSc6IHtcclxuICAgICAgICAgICAgJ3NlYXJjaFJlZ2V4JzogLygoPzooPzpQb3MoPzpcXC58aXRpb258aXRpb25lbik/KXwoPzpVbnRlcnBvcyg/OlxcLnxpdGlvbnxpdGlvbmVuKT8pfEtOLUNvZGVzPykoPzpcXHN8XFxufDxiclxcLz8+fCZuYnNwOykqKShcXGR7Mn0oPzooPzpcXHN8XFxufDxiclxcLz8+fCZuYnNwOykqXFxkezJ9KSspKD86KD86KD86XFxzfFxcbnw8YnJcXC8/PnwmbmJzcDspKig/Ojt8LHx1bmR8b2RlcnxiaXN8Ynp3XFwuKSg/Olxcc3xcXG58PGJyXFwvPz58Jm5ic3A7KSooXFxkezJ9KD86KD86XFxzfFxcbnw8YnJcXC8/PnwmbmJzcDspKlxcZHsyfSkrKSkpKi9nLFxyXG4gICAgICAgICAgICAncmVwbGFjZVJlZ2V4JzogLyhcXGR7Mn0oPzooPzpcXHN8XFxufDxiclxcLz8+fCZuYnNwOykqXFxkezJ9KSspL2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlVGVtcGxhdGUnOiAnPGEgY2xhc3M9XCJsaW5rLWNvbW1vZGl0eS1jb2RlXCIgaHJlZj1cIi8jIS9zZWFyY2gvJDFcIiB0YXJnZXQ9XCJfYmxhbmtcIj4kMTwvYT4nLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ3Bvc3QnOiB7XHJcbiAgICAgICAgICAgICdzZWFyY2hSZWdleCc6IC8oKD86KD86W1B8cF1vc3QoPzplbik/KXwoPzpbT3xvXW5kZXJ2ZXJkZWxpbmcoPzplbik/KXwoPzpHTlxccz8tXFxzP2NvZGVzPykpKD86XFxzfFxcbnw8YnJcXC8/PnwmbmJzcDspKikoXFxkezJ9KD86Wy5cXHNdP1xcZHsyfSkrKSg/Oig/Oig/Olxcc3xcXG58PGJyXFwvPz58Jm5ic3A7KSooPzo7fCx8ZW58b2Z8dFxcL218dG90IGVuIG1ldCkoPzpcXHN8XFxufDxiclxcLz8+fCZuYnNwOykqKFxcZHsyfSg/OlsuXFxzXT9cXGR7Mn0pKykpKSovZyxcclxuICAgICAgICAgICAgJ3JlcGxhY2VSZWdleCc6IC8oXFxkezJ9KD86Wy5cXHNdP1xcZHsyfSkrKS9nLFxyXG4gICAgICAgICAgICAncmVwbGFjZVRlbXBsYXRlJzogJzxhIGNsYXNzPVwibGluay1jb21tb2RpdHktY29kZVwiIGhyZWY9XCIvIyEvc2VhcmNoLyQxXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+JyxcclxuICAgICAgICB9LFxyXG4gICAgICAgICdwb3N0Mic6IHsgLy8gaW4gZXhwbGFuYXRvcnkgbm90ZXMgKHZlcnNpZSAyMDE1KVxyXG4gICAgICAgICAgICAnc2VhcmNoUmVnZXgnOiAvPHNwYW4gY2xhc3M9WydcIl1ib2xkWydcIl0+XFxzKlxcbj9cXGR7Mn0oPzooPzpbLlxcc118Jm5ic3A7KT9cXGR7Mn0pKyg/Oig/Olxccyg/Ojt8LHxlbnxvZnx0XFwvbXx0b3QgZW4gbWV0fGFuZHxvcnx0b3x1bmR8b2RlcnxiaXN8Ynp3XFwufGV0fG91fMOgKVxcc1xcZHsyfSg/Oig/OlsuXFxzXXwmbmJzcDspP1xcZHsyfSkrKSkqXFxzKjxcXC9zcGFuPi9nLFxyXG4gICAgICAgICAgICAncmVwbGFjZVJlZ2V4JzogLyhcXGR7Mn0oPzooPzpbLlxcc118Jm5ic3A7KT9cXGR7Mn0pKykvZyxcclxuICAgICAgICAgICAgJ3JlcGxhY2VUZW1wbGF0ZSc6ICc8YSBjbGFzcz1cImxpbmstY29tbW9kaXR5LWNvZGVcIiBocmVmPVwiLyMhL3NlYXJjaC8kMVwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAnY29kZV90YXJpZmVyaW5nJzogeyAvLyBpbiB0YXJpZmVyaW5nZW5cclxuICAgICAgICAgICAgJ3NlYXJjaFJlZ2V4JzogL1xcZHs0fSg/OlsuXFxzXT9cXGR7Mn0pezAsM308XFwvaDU+L2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlUmVnZXgnOiAvKFxcZHs0fSg/OlsuXFxzXT9cXGR7Mn0pKykvZyxcclxuICAgICAgICAgICAgJ3JlcGxhY2VUZW1wbGF0ZSc6ICc8YSBjbGFzcz1cImxpbmstY29tbW9kaXR5LWNvZGVcIiBocmVmPVwiLyMhL3NlYXJjaC8kMVwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAnaG9vZmRzdHVrJzoge1xyXG4gICAgICAgICAgICAnc2VhcmNoUmVnZXgnOiAvKCg/OltIfGhdb29mZHN0dWsoPzprZW4pPykoPzpcXHN8XFxufDxiclxcLz8+KSopKFxcZHsxLDJ9KSg/Oig/OigoPzpcXHN8XFxufDxiclxcLz8+fCZuYnNwOykqKD86O3wsfGVufG9mfHRcXC9tfHRvdCBlbiBtZXQpKD86XFxzfFxcbnw8YnJcXC8/PnwmbmJzcDspKikoXFxkezEsMn0pKSkqL2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlUmVnZXgnOiAvKFxcZHsxLDJ9KS9nLFxyXG4gICAgICAgICAgICAncmVwbGFjZVRlbXBsYXRlJzogJzxhIGNsYXNzPVwibGluay1jb21tb2RpdHktY29kZVwiIGhyZWY9XCIvIyEvY2hhcHRlci8kMVwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPidcclxuICAgICAgICB9LFxyXG4gICAgICAgICdjaGFwdGVyJzoge1xyXG4gICAgICAgICAgICAnc2VhcmNoUmVnZXgnOiAvKCg/OltDfGNdaGFwdGVyKD86cyk/KSg/Olxcc3xcXG58PGJyXFwvPz58Jm5ic3A7KSopKFxcZHsxLDJ9KSg/Oig/OigoPzpcXHN8XFxufDxiclxcLz8+fCZuYnNwOykqKD86O3wsfGFuZHxvcnx0bykoPzpcXHN8XFxufDxiclxcLz8+fCZuYnNwOykqKShcXGR7MSwyfSkpKSovZyxcclxuICAgICAgICAgICAgJ3JlcGxhY2VSZWdleCc6IC8oXFxkezEsMn0pL2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlVGVtcGxhdGUnOiAnPGEgY2xhc3M9XCJsaW5rLWNvbW1vZGl0eS1jb2RlXCIgaHJlZj1cIi8jIS9jaGFwdGVyLyQxXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2thcGl0ZWwnOiB7XHJcbiAgICAgICAgICAgICdzZWFyY2hSZWdleCc6IC8oKD86S1tBYV1bUHBdKD86XFwufGl0ZWwpKD86c3xuKT8pKD86XFxzfFxcbnw8YnJcXC8/PnwmbmJzcDspKikoXFxkezEsMn0pKD86KD86KCg/Olxcc3xcXG58PGJyXFwvPz58Jm5ic3A7KSooPzo7fCx8dW5kfG9kZXJ8YmlzfGJ6d1xcLikoPzpcXHN8XFxufDxiclxcLz8+fCZuYnNwOykqKShcXGR7MSwyfSkpKSovZyxcclxuICAgICAgICAgICAgJ3JlcGxhY2VSZWdleCc6IC8oXFxkezEsMn0pL2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlVGVtcGxhdGUnOiAnPGEgY2xhc3M9XCJsaW5rLWNvbW1vZGl0eS1jb2RlXCIgaHJlZj1cIi8jIS9jaGFwdGVyLyQxXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2NoYXBpdHJlJzoge1xyXG4gICAgICAgICAgICAnc2VhcmNoUmVnZXgnOiAvKCg/OltDfGNdaGFwaXRyZSg/OnMpPykoPzpcXHN8XFxufDxiclxcLz8+fCZuYnNwOykqKShcXGR7MSwyfSkoPzooPzooKD86XFxzfFxcbnw8YnJcXC8/PnwmbmJzcDspKig/Ojt8LHxldHxvdXzDoCkoPzpcXHN8XFxufDxiclxcLz8+fCZuYnNwOykqKShcXGR7MSwyfSkpKSovZyxcclxuICAgICAgICAgICAgJ3JlcGxhY2VSZWdleCc6IC8oXFxkezEsMn0pL2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlVGVtcGxhdGUnOiAnPGEgY2xhc3M9XCJsaW5rLWNvbW1vZGl0eS1jb2RlXCIgaHJlZj1cIi8jIS9jaGFwdGVyLyQxXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2FmZGVsaW5nJzoge1xyXG4gICAgICAgICAgICAnc2VhcmNoUmVnZXgnOiAvKFtBfGFdZmRlbGluZyg/OmVuKT8pIChbSVZYXXsxLDV9KSg/OiAoO3xlbnxvZnx0XFwvbXx0b3QgZW4gbWV0fCwpIChbSVZYXXsxLDV9KSk/L2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlUmVnZXgnOiAvKFtJVlhdezEsNX0pL2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlVGVtcGxhdGUnOiAnPGEgY2xhc3M9XCJsaW5rLWNvbW1vZGl0eS1jb2RlXCIgaHJlZj1cIi8jIS9zZWN0aW9uc1wiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPidcclxuICAgICAgICB9LFxyXG4gICAgICAgICdhYnNjaG5pdHQnOiB7XHJcbiAgICAgICAgICAgICdzZWFyY2hSZWdleCc6IC8oQVtCYl1bU3NdKD86XFwufGNobml0dCkoPzpzKT8pIChbSVZYXXsxLDV9KSg/OiAoO3x1bmR8b2RlcnxiaXN8LHxiendcXC4pIChbSVZYXXsxLDV9KSk/L2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlUmVnZXgnOiAvKFtJVlhdezEsNX0pL2csXHJcbiAgICAgICAgICAgICdyZXBsYWNlVGVtcGxhdGUnOiAnPGEgY2xhc3M9XCJsaW5rLWNvbW1vZGl0eS1jb2RlXCIgaHJlZj1cIi8jIS9zZWN0aW9uc1wiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPidcclxuICAgICAgICB9LFxyXG4gICAgICAgICdzZWN0aW9uJzoge1xyXG4gICAgICAgICAgICAnc2VhcmNoUmVnZXgnOiAvKFtTfHNdZWN0aW9ucz8pKD86XFxzfCZuYnNwOykoW0lWWF17MSw1fSkoPzooPzpcXHN8Jm5ic3A7KSg7fCx8YW5kfG9yfHRvfGV0fG91fMOgKSg/Olxcc3wmbmJzcDspKFtJVlhdezEsNX0pKT8vZyxcclxuICAgICAgICAgICAgJ3JlcGxhY2VSZWdleCc6IC8oW0lWWF17MSw1fSkvZyxcclxuICAgICAgICAgICAgJ3JlcGxhY2VUZW1wbGF0ZSc6ICc8YSBjbGFzcz1cImxpbmstY29tbW9kaXR5LWNvZGVcIiBocmVmPVwiLyMhL3NlY3Rpb25zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2h5cGVybGluayc6IHtcclxuICAgICAgICAgICAgJ3NlYXJjaFJlZ2V4JzogLyhodHRwOlxcL1xcLy4qPyg/OlxcLmh0bWw/fDpQREYpKS9nLFxyXG4gICAgICAgICAgICAncmVwbGFjZVJlZ2V4JzogLyhodHRwOlxcL1xcLy4qPyg/OlxcLmh0bWw/fDpQREYpKS9nLFxyXG4gICAgICAgICAgICAncmVwbGFjZVRlbXBsYXRlJzogJzxhIGNsYXNzPVwibGluay1jb21tb2RpdHktY29kZVwiIGhyZWY9XCIkMVwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPidcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBvcHRpb25zLmhvb2Zkc3R1ay5maWx0ZXIgPSBtYWtlUmVwbGFjZW1lbnRGdW5jdGlvbihvcHRpb25zLmhvb2Zkc3R1ay5yZXBsYWNlUmVnZXgsIG9wdGlvbnMuaG9vZmRzdHVrLnJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICBvcHRpb25zLmthcGl0ZWwuZmlsdGVyID0gbWFrZVJlcGxhY2VtZW50RnVuY3Rpb24ob3B0aW9ucy5rYXBpdGVsLnJlcGxhY2VSZWdleCwgb3B0aW9ucy5rYXBpdGVsLnJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICBvcHRpb25zLmNoYXB0ZXIuZmlsdGVyID0gbWFrZVJlcGxhY2VtZW50RnVuY3Rpb24ob3B0aW9ucy5jaGFwdGVyLnJlcGxhY2VSZWdleCwgb3B0aW9ucy5jaGFwdGVyLnJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICBvcHRpb25zLmNoYXBpdHJlLmZpbHRlciA9IG1ha2VSZXBsYWNlbWVudEZ1bmN0aW9uKG9wdGlvbnMuY2hhcGl0cmUucmVwbGFjZVJlZ2V4LCBvcHRpb25zLmNoYXBpdHJlLnJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICBvcHRpb25zLmFic2Nobml0dC5maWx0ZXIgPSBtYWtlUmVwbGFjZW1lbnRGdW5jdGlvbihvcHRpb25zLmFic2Nobml0dC5yZXBsYWNlUmVnZXgsIG9wdGlvbnMuYWJzY2huaXR0LnJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICBvcHRpb25zLmFmZGVsaW5nLmZpbHRlciA9IG1ha2VSZXBsYWNlbWVudEZ1bmN0aW9uKG9wdGlvbnMuYWZkZWxpbmcucmVwbGFjZVJlZ2V4LCBvcHRpb25zLmFmZGVsaW5nLnJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICBvcHRpb25zLnNlY3Rpb24uZmlsdGVyID0gbWFrZVJlcGxhY2VtZW50RnVuY3Rpb24ob3B0aW9ucy5zZWN0aW9uLnJlcGxhY2VSZWdleCwgb3B0aW9ucy5zZWN0aW9uLnJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICBvcHRpb25zLmh5cGVybGluay5maWx0ZXIgPSBtYWtlUmVwbGFjZW1lbnRGdW5jdGlvbihvcHRpb25zLmh5cGVybGluay5yZXBsYWNlUmVnZXgsIG9wdGlvbnMuaHlwZXJsaW5rLnJlcGxhY2VUZW1wbGF0ZSk7XHJcblxyXG4gICAgb3B0aW9ucy5wb3N0LmZpbHRlciA9IGZ1bmN0aW9uIChzdHIsIHJlZ2V4KSB7XHJcblxyXG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZShyZWdleCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbWF0Y2hlZFN0cmluZyA9IGFyZ3VtZW50c1swXTtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG1hdGNoZWRTdHJpbmcucmVwbGFjZSgvKFxcZHsyfSg/Oig/OlsuXFxzXXwmbmJzcDspKlxcZHsyfSkrKS9nLCBmdW5jdGlvbiAocG9zdFN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvc3QgPSBwb3N0U3RyaW5nLnJlcGxhY2UoL1tcXHMuXS9nLCAnJyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJldHR5UG9zdCA9IHBvc3Quc3Vic3RyaW5nKDAsIDQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvc3QubGVuZ3RoID4gNCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXR0eVBvc3QgKz0gJyZuYnNwOycgKyBwb3N0LnN1YnN0cmluZyg0LCA2KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwb3N0Lmxlbmd0aCA+IDYpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcmV0dHlQb3N0ICs9ICcmbmJzcDsnICsgcG9zdC5zdWJzdHJpbmcoNiwgOCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zdC5sZW5ndGggPiA4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJldHR5UG9zdCArPSAnJm5ic3A7JyArIHBvc3Quc3Vic3RyaW5nKDgsIDEwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiAnPGEgY2xhc3M9XCJsaW5rLWNvbW1vZGl0eS1jb2RlXCIgaHJlZj1cIi8jIS9zZWFyY2gvJyArIHBvc3QgKyAnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JyArIHByZXR0eVBvc3QgKyAnPC9hPic7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBvcHRpb25zLnBvc3QyLmZpbHRlciA9IG1ha2VSZXBsYWNlbWVudEZ1bmN0aW9uKG9wdGlvbnMucG9zdDIucmVwbGFjZVJlZ2V4LCBvcHRpb25zLnBvc3QyLnJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICBvcHRpb25zLmhlYWRpbmcuZmlsdGVyID0gbWFrZVJlcGxhY2VtZW50RnVuY3Rpb24ob3B0aW9ucy5oZWFkaW5nLnJlcGxhY2VSZWdleCwgb3B0aW9ucy5oZWFkaW5nLnJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICBvcHRpb25zLmhlYWRpbmdfREUuZmlsdGVyID0gbWFrZVJlcGxhY2VtZW50RnVuY3Rpb24ob3B0aW9ucy5oZWFkaW5nX0RFLnJlcGxhY2VSZWdleCwgb3B0aW9ucy5oZWFkaW5nX0RFLnJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICBvcHRpb25zLmhlYWRpbmdfRlIuZmlsdGVyID0gbWFrZVJlcGxhY2VtZW50RnVuY3Rpb24ob3B0aW9ucy5oZWFkaW5nX0ZSLnJlcGxhY2VSZWdleCwgb3B0aW9ucy5oZWFkaW5nX0ZSLnJlcGxhY2VUZW1wbGF0ZSk7XHJcbiAgICBvcHRpb25zLmNvZGVfdGFyaWZlcmluZy5maWx0ZXIgPSBtYWtlUmVwbGFjZW1lbnRGdW5jdGlvbihvcHRpb25zLmNvZGVfdGFyaWZlcmluZy5yZXBsYWNlUmVnZXgsIG9wdGlvbnMuY29kZV90YXJpZmVyaW5nLnJlcGxhY2VUZW1wbGF0ZSk7XHJcblxyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAoc3RyKSB7XHJcblxyXG4gICAgICAgIGlmICghc3RyKVxyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcblxyXG4gICAgICAgIF8uZWFjaChfLnZhbHVlcyhvcHRpb25zKSwgZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgICAgICAgICBzdHIgPSBvcHRpb24uZmlsdGVyKHN0ciwgb3B0aW9uLnNlYXJjaFJlZ2V4KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH07XHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFtjb3VudHJ5VHlwZWFoZWFkRmlsdGVyXTtcclxuXHJcbi8vIFRha2VzIGNhcmUgb2Ygb3JkZXJpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIGNvdW50cnkgdHlwZWFoZWQuIFRoZSBsb2dpYyBpcyBhcyBmb2xsb3dzOlxyXG4vLyBGaXJzdCwgc2hvdyB0aGUgbWF0Y2hlcyBvbiB0aGUgY291bnRyeSBjb2RlIChmaXJzdCBsZXR0ZXIgb3IgYm90aCksIG9yZGVyZWQgYnkgY29kZVxyXG4vLyBOZXh0LCBzaG93IHRoZSBtYXRjaGVzIG9uIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvdW50cnkgbmFtZSwgb3JkZXJlZCBieSBuYW1lXHJcbi8vIEZpbmFsbHksIHNob3cgdGhlIG1hdGNoZXMgYW55d2hlcmUgZWxzZSBpbiB0aGUgbmFtZSwgb3JkZXJlZCBieSBuYW1lXHJcbi8vIE5COiB0aGlzIG5lZWRzIHRvIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBhIHJlZ3VsYXIgZmlsdGVyLCBzaW5jZSBpdCBkb2VzIG5vdCB0YWtlXHJcbi8vIGNhcmUgb2YgcmVtb3ZpbmcgcmVzdWx0cyB3aGljaCBkb24ndCBtYXRjaCB0aGUgcXVlcnkgYXQgYWxsXHJcbmZ1bmN0aW9uIGNvdW50cnlUeXBlYWhlYWRGaWx0ZXIoKSB7XHJcblxyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAoY291bnRyaWVzLCBxdWVyeSkge1xyXG4gICAgICAgIGlmIChxdWVyeSA9PT0gbnVsbCB8fCBxdWVyeSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gY291bnRyaWVzO1xyXG5cclxuICAgICAgICB2YXIgY291bnRyeUNvZGVNYXRjaFBhcnRpdGlvbiA9IF8ucGFydGl0aW9uKGNvdW50cmllcywgZnVuY3Rpb24oY291bnRyeSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY291bnRyeS5jb2RlICYmIGNvdW50cnkuY29kZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkudG9Mb3dlckNhc2UoKSkgPT09IDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdmFyIGNvdW50cnlDb2RlTWF0Y2hlcyA9IF8uc29ydEJ5KGNvdW50cnlDb2RlTWF0Y2hQYXJ0aXRpb25bMF0sICdjb2RlJyk7XHJcbiAgICAgICAgdmFyIG90aGVyTWF0Y2hlcyA9IF8uc29ydEJ5KGNvdW50cnlDb2RlTWF0Y2hQYXJ0aXRpb25bMV0sICduYW1lJyk7XHJcblxyXG4gICAgICAgIHZhciBuYW1lTWF0Y2hQYXJ0aXRpb24gPSBfLnBhcnRpdGlvbihvdGhlck1hdGNoZXMsIGZ1bmN0aW9uKGNvdW50cnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvdW50cnkubmFtZSAmJiBjb3VudHJ5Lm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpID09PSAwO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2YXIgcmVzdWx0ID0gXy5jb25jYXQoY291bnRyeUNvZGVNYXRjaGVzLCBuYW1lTWF0Y2hQYXJ0aXRpb25bMF0sIG5hbWVNYXRjaFBhcnRpdGlvblsxXSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFtmb3JtYXREZXNjcmlwdGlvbkZpbHRlcl07XHJcblxyXG5mdW5jdGlvbiBmb3JtYXREZXNjcmlwdGlvbkZpbHRlcigpIHtcclxuICAgIHZhciByZXBsYWNlbWVudHMgPSBbXHJcbiAgICAgICAgWy9cXCQoLikvZywgJzxzdXA+JDE8L3N1cD4nXSxcclxuICAgICAgICBbL0AoLikvZywgJzxzdWI+JDE8L3N1Yj4nXSxcclxuICAgICAgICBbL1xcfC9nLCAnJm5ic3A7J10sXHJcbiAgICAgICAgWy8hWCEvZywgJyZ0aW1lczsnXSxcclxuICAgICAgICBbLyF4IS9nLCAnJnRpbWVzOyddLFxyXG4gICAgICAgIFsvIU8hL2csICcmZGVnOyddLFxyXG4gICAgICAgIFsvIW8hL2csICcmZGVnOyddLFxyXG4gICAgICAgIFsvIT49IS9nLCAnJmdlOyddLFxyXG4gICAgICAgIFsvITw9IS9nLCAnJmxlOyddLFxyXG4gICAgXTtcclxuIFxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpbnB1dCkge1xyXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UocmVwbGFjZW1lbnRzW2ldWzBdLCByZXBsYWNlbWVudHNbaV1bMV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICB9O1xyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbZm9ybWF0RHV0eUZpbHRlcl07XHJcblxyXG5mdW5jdGlvbiBmb3JtYXREdXR5RmlsdGVyKCkge1xyXG4gICAgdmFyIGk7XHJcbiAgICB2YXIgcmVwbGFjZW1lbnRzID0gW1xyXG4gICAgICAgIFsndmFuIGRlIHdhYXJkZSBvbXpldGJlbGFzdGluZycsICcnXVxyXG4gICAgXTtcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGlucHV0KSB7XHJcbiAgICAgICAgaWYgKGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlcGxhY2VtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB3aGlsZSAoaW5wdXQuaW5kZXhPZihyZXBsYWNlbWVudHNbaV1bMF0pID4gLTEpXHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UocmVwbGFjZW1lbnRzW2ldWzBdLCByZXBsYWNlbWVudHNbaV1bMV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGJyZWFrTGVuZ3RoID0gMzA7XHJcblxyXG4gICAgICAgIGlmIChpbnB1dC5sZW5ndGggPiBicmVha0xlbmd0aCkge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgaW5wdXQubGVuZ3RoIC8gYnJlYWtMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJyZWFrSW5kZXggPSBpbnB1dC5pbmRleE9mKCcgJywgaSAqIGJyZWFrTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGlmIChicmVha0luZGV4IDw9IDApXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cigwLCBicmVha0luZGV4KSArICc8YnIvPicgKyBpbnB1dC5zdWJzdHIoYnJlYWtJbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH07XHJcbn0iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFtmb3JtYXRFenRDb2RlRmlsdGVyXTtcclxuXHJcbmZ1bmN0aW9uIGZvcm1hdEV6dENvZGVGaWx0ZXIoKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGlucHV0KSB7XHJcbiAgICAgICAgaWYgKCFpbnB1dClcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gJ3VuZGVmaW5lZCcgfHwgaW5wdXQubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XHJcblxyXG4gICAgICAgIGlmIChpbnB1dC5sZW5ndGggPiAxMClcclxuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoMCwgNCkgKyAnICcgKyBpbnB1dC5zdWJzdHJpbmcoNCwgNikgKyAnICcgKyBpbnB1dC5zdWJzdHJpbmcoNiwgOCkgKyAnICcgKyBpbnB1dC5zdWJzdHJpbmcoOCwgMTApICsgJyAnICsgaW5wdXQuc3Vic3RyaW5nKDEwKTtcclxuICAgICAgICBlbHNlIGlmIChpbnB1dC5sZW5ndGggPiA4KVxyXG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cmluZygwLCA0KSArICcgJyArIGlucHV0LnN1YnN0cmluZyg0LCA2KSArICcgJyArIGlucHV0LnN1YnN0cmluZyg2LCA4KSArICcgJyArIGlucHV0LnN1YnN0cmluZyg4KTtcclxuICAgICAgICBlbHNlIGlmIChpbnB1dC5sZW5ndGggPiA2KVxyXG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cmluZygwLCA0KSArICcgJyArIGlucHV0LnN1YnN0cmluZyg0LCA2KSArICcgJyArIGlucHV0LnN1YnN0cmluZyg2KTtcclxuICAgICAgICBlbHNlIGlmIChpbnB1dC5sZW5ndGggPiA0KVxyXG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cmluZygwLCA0KSArICcgJyArIGlucHV0LnN1YnN0cmluZyg0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfTt9Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbZm9ybWF0R25Db2RlRmlsdGVyXTtcclxuXHJcbmZ1bmN0aW9uIGZvcm1hdEduQ29kZUZpbHRlcigpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICBpZiAoIWlucHV0KVxyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICAgICAgaWYgKGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSAndW5kZWZpbmVkJyB8fCBpbnB1dC5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcclxuXHJcbiAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDgpIHtcclxuICAgICAgICAgICAgaWYgKGlucHV0LnN1YnN0cmluZyg4KSA9PT0gXCIwMFwiKVxyXG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoMCwgNCkgKyAnICcgKyBpbnB1dC5zdWJzdHJpbmcoNCwgNikgKyAnICcgKyBpbnB1dC5zdWJzdHJpbmcoNiwgOCk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyaW5nKDAsIDQpICsgJyAnICsgaW5wdXQuc3Vic3RyaW5nKDQsIDYpICsgJyAnICsgaW5wdXQuc3Vic3RyaW5nKDYsIDgpICsgJyAnICsgaW5wdXQuc3Vic3RyaW5nKDgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpbnB1dC5sZW5ndGggPiA2KVxyXG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cmluZygwLCA0KSArICcgJyArIGlucHV0LnN1YnN0cmluZyg0LCA2KSArICcgJyArIGlucHV0LnN1YnN0cmluZyg2KTtcclxuICAgICAgICBlbHNlIGlmIChpbnB1dC5sZW5ndGggPiA0KVxyXG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cmluZygwLCA0KSArICcgJyArIGlucHV0LnN1YnN0cmluZyg0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfTtcclxufVxyXG4iLCLvu79tb2R1bGUuZXhwb3J0cyA9IFtmb3JtYXRUYXJpY0NvZGVGaWx0ZXJdO1xyXG5cclxuZnVuY3Rpb24gZm9ybWF0VGFyaWNDb2RlRmlsdGVyKCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpbnB1dCkge1xyXG4gICAgICAgIGlmICghaW5wdXQpXHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09ICd1bmRlZmluZWQnIHx8IGlucHV0Lmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xyXG5cclxuICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gOClcclxuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoMCwgNCkgKyAnICcgKyBpbnB1dC5zdWJzdHJpbmcoNCwgNikgKyAnICcgKyBpbnB1dC5zdWJzdHJpbmcoNiwgOCkgKyAnICcgKyBpbnB1dC5zdWJzdHJpbmcoOCk7XHJcbiAgICAgICAgZWxzZSBpZiAoaW5wdXQubGVuZ3RoID4gNilcclxuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoMCwgNCkgKyAnICcgKyBpbnB1dC5zdWJzdHJpbmcoNCwgNikgKyAnICcgKyBpbnB1dC5zdWJzdHJpbmcoNik7XHJcbiAgICAgICAgZWxzZSBpZiAoaW5wdXQubGVuZ3RoID4gNClcclxuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoMCwgNCkgKyAnICcgKyBpbnB1dC5zdWJzdHJpbmcoNCk7XHJcblxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH07fSIsIu+7v21vZHVsZS5leHBvcnRzID0gW2hhc0FkZGl0aW9uYWxDb2RlRmlsdGVyXTtcclxuXHJcbmZ1bmN0aW9uIGhhc0FkZGl0aW9uYWxDb2RlRmlsdGVyKCkge1xyXG4gICAgZnVuY3Rpb24gbWVhc3VyZUhhc0FkZGl0aW9uYWxDb2RlKG1lYXN1cmUsIGFkZGl0aW9uYWxDb2RlKSB7XHJcbiAgICAgICAgdmFyIGFkZENvZGVUeXBlID0gYWRkaXRpb25hbENvZGUuc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgdmFyIGFkZENvZGUgPSBhZGRpdGlvbmFsQ29kZS5zdWJzdHIoMSk7XHJcblxyXG4gICAgICAgIHJldHVybiBtZWFzdXJlLmFkZGl0aW9uYWxfY29kZSAmJlxyXG4gICAgICAgICAgICBtZWFzdXJlLmFkZGl0aW9uYWxfY29kZS5jb2RlICYmIChcclxuICAgICAgICAgICAgICAgIG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlLnR5cGUgIT09IGFkZENvZGVUeXBlIHx8XHJcbiAgICAgICAgICAgICAgICAobWVhc3VyZS5hZGRpdGlvbmFsX2NvZGUuY29kZSA9PT0gYWRkQ29kZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmUuYWRkaXRpb25hbF9jb2RlLnR5cGUgPT09IGFkZENvZGVUeXBlKVxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1lYXN1cmVzLCBhZGRpdGlvbmFsQ29kZSkge1xyXG4gICAgICAgIGlmICghbWVhc3VyZXMgfHwgIWFkZGl0aW9uYWxDb2RlIHx8IGFkZGl0aW9uYWxDb2RlLmxlbmd0aCAhPT0gNClcclxuICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVzO1xyXG4gICAgICAgIHJldHVybiBfLmZpbHRlcihtZWFzdXJlcywgZnVuY3Rpb24gKG1lYXN1cmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVIYXNBZGRpdGlvbmFsQ29kZShtZWFzdXJlLCBhZGRpdGlvbmFsQ29kZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0gWydjb3VudHJ5RGF0YVNlcnZpY2UnLCBoYXNDb3VudHJ5RmlsdGVyXTtcclxuXHJcbmZ1bmN0aW9uIGhhc0NvdW50cnlGaWx0ZXIoY291bnRyeURhdGEpIHtcclxuICAgIGZ1bmN0aW9uIG1lYXN1cmVIYXNDb3VudHJ5KG1lYXN1cmUsIGNvdW50cnlDb2RlKSB7XHJcbiAgICAgICAgaWYgKChtZWFzdXJlLnJlZ2lvbiA9PT0gbnVsbCB8fCBtZWFzdXJlLnJlZ2lvbiA9PT0gdW5kZWZpbmVkKSAmJiBtZWFzdXJlLm1lYXN1cmVzICE9PSB1bmRlZmluZWQgJiYgbWVhc3VyZS5tZWFzdXJlcy5sZW5ndGggPiAwKSB7IC8vIG1lYXN1cmUgd2l0aG91dCByZWdpb25zXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVhc3VyZS5tZWFzdXJlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVIYXNDb3VudHJ5KG1lYXN1cmUubWVhc3VyZXNbaV0sIGNvdW50cnlDb2RlKSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG1lYXN1cmUucmVnaW9uLnR5cGUgPT09IFwiMVwiKSB7IC8vIG1lYXN1cmVzIGZvciBjb3VudHJ5IGdyb3Vwc1xyXG4gICAgICAgICAgICBpZiAobWVhc3VyZS5leGNsdWRlZF9yZWdpb25zICE9PSBudWxsICYmIG1lYXN1cmUuZXhjbHVkZWRfcmVnaW9ucyAhPT0gdW5kZWZpbmVkICYmIG1lYXN1cmUuZXhjbHVkZWRfcmVnaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1lYXN1cmUuZXhjbHVkZWRfcmVnaW9ucy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlLmV4Y2x1ZGVkX3JlZ2lvbnNbal0uY29kZS50b0xvd2VyQ2FzZSgpID09PSBjb3VudHJ5Q29kZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb3VudHJ5RGF0YS5yZWdpb25zW21lYXN1cmUucmVnaW9uLmNvZGVdLmluZGV4T2YoY291bnRyeUNvZGUpID4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgeyAvLyBtZWFzdXJlcyBmb3IgY291bnRyaWVzXHJcbiAgICAgICAgICAgIHJldHVybiBtZWFzdXJlLnJlZ2lvbi5jb2RlLnRvTG93ZXJDYXNlKCkgPT09IGNvdW50cnlDb2RlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAobWVhc3VyZXMsIGNvdW50cnlDb2RlKSB7XHJcbiAgICAgICAgaWYgKGNvdW50cnlDb2RlID09PSBudWxsIHx8IGNvdW50cnlDb2RlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHJldHVybiBtZWFzdXJlcztcclxuXHJcbiAgICAgICAgcmV0dXJuIF8uZmlsdGVyKG1lYXN1cmVzLCBmdW5jdGlvbiAobWVhc3VyZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbWVhc3VyZUhhc0NvdW50cnkobWVhc3VyZSwgY291bnRyeUNvZGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0gW2hpZ2hsaWdodEZpbHRlcl07XHJcblxyXG5mdW5jdGlvbiBoaWdobGlnaHRGaWx0ZXIoKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRleHQsIGZpbHRlclBocmFzZSwgc3BsaXRXb3Jkcykge1xyXG4gICAgICAgIGlmICh0ZXh0ICYmIGZpbHRlclBocmFzZSkge1xyXG4gICAgICAgICAgICB2YXIgdGFnX3JlID0gLyg8XFwvP1tePl0rPikvZztcclxuICAgICAgICAgICAgdGV4dCA9IHRleHQuc3BsaXQodGFnX3JlKS5tYXAoZnVuY3Rpb24gKHN1YnN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHN1YnN0cmluZztcclxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0IHx8IHJlc3VsdC5tYXRjaCh0YWdfcmUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcmRzID0gc3BsaXRXb3JkcyA/IGZpbHRlclBocmFzZS5zcGxpdCgnICcpIDogW2ZpbHRlclBocmFzZV07XHJcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHdvcmRzLCBmdW5jdGlvbiAod29yZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsdGVyX3JlID0gbmV3IFJlZ0V4cChfLmVzY2FwZVJlZ0V4cCh3b3JkKSwgJ2dpJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKGZpbHRlcl9yZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuICc8bWFyaz4nICsgc3RyICsgJzwvbWFyaz4nOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5qb2luKCcnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICB9O1xyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbc3RyaXBUYXJpY0NvZGVGaWx0ZXJdO1xyXG5cclxuZnVuY3Rpb24gc3RyaXBUYXJpY0NvZGVGaWx0ZXIoKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGlucHV0KSB7XHJcbiAgICAgICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQgfHwgaW5wdXQgPT09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaW5wdXQubGVuZ3RoIDw9IDIpXHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGlucHV0LnN1YnN0cmluZyhpbnB1dC5sZW5ndGggLSAyKSA9PT0gJzAwJyAmJiBpbnB1dC5sZW5ndGggPiA0KSB7XHJcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyaW5nKDAsIGlucHV0Lmxlbmd0aCAtIDIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfTtcclxufSIsIm1vZHVsZS5leHBvcnRzID0gW3RhcmljQ29kZVRvQ2hhcHRlck51bWJlcl07XHJcblxyXG5mdW5jdGlvbiB0YXJpY0NvZGVUb0NoYXB0ZXJOdW1iZXIoKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGlucHV0KSB7XHJcbiAgICAgICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQgfHwgaW5wdXQgPT09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgICAgICBpZiAoaW5wdXQubGVuZ3RoIDw9IDIpXHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGlucHV0LnN1YnN0cmluZyhpbnB1dC5sZW5ndGggLSAyKSA9PT0gJzAwJyAmJiBpbnB1dC5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyaW5nKDAsIGlucHV0Lmxlbmd0aCAtIDIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cmluZygwLCAxKSA9PT0gJzAnKVxyXG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cmluZygxKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfTtcclxufSIsIu+7v21vZHVsZS5leHBvcnRzID0gW3RhcmljRGFzaGVzRmlsdGVyXTtcclxuXHJcbmZ1bmN0aW9uIHRhcmljRGFzaGVzRmlsdGVyKCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpbnB1dCkge1xyXG4gICAgICAgIGlmICghaW5wdXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbnVtZXJpYyA9IHBhcnNlSW50KGlucHV0KTtcclxuICAgICAgICByZXR1cm4gQXJyYXkobnVtZXJpYyArIDEpLmpvaW4oJyZuZGFzaDsmbmJzcDsnKTtcclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0gW3RvQ3VycmVuY3lTaWduRmlsdGVyXTtcclxuXHJcbmZ1bmN0aW9uIHRvQ3VycmVuY3lTaWduRmlsdGVyKCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpbnB1dCkge1xyXG4gICAgICAgIHN3aXRjaCAoaW5wdXQpIHtcclxuICAgICAgICAgICAgY2FzZSAnRVVSJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAn4oKsJztcclxuICAgICAgICAgICAgY2FzZSAnR0JQJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnwqMnO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFt0b0ZpeGVkRmlsdGVyXTtcclxuXHJcbmZ1bmN0aW9uIHRvRml4ZWRGaWx0ZXIoKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGlucHV0LCBkZWNpbWFscykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC50b0ZpeGVkKGRlY2ltYWxzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbdHJpbUZpbHRlcl07XHJcblxyXG5mdW5jdGlvbiB0cmltRmlsdGVyKCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpbnB1dCkge1xyXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XHJcblxyXG4gICAgICAgIHJldHVybiBpbnB1dC50cmltKCk7XHJcbiAgICB9O1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gWyckc2NlJywgdHJ1c3RGaWx0ZXJdO1xyXG5cclxuZnVuY3Rpb24gdHJ1c3RGaWx0ZXIoJHNjZSkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSwgdHlwZSkge1xyXG4gICAgICAgIC8vIERlZmF1bHRzIHRvIHRyZWF0aW5nIHRydXN0ZWQgdGV4dCBhcyBgaHRtbGBcclxuICAgICAgICByZXR1cm4gJHNjZS50cnVzdEFzKHR5cGUgfHwgJ2h0bWwnLCB2YWx1ZSk7XHJcbiAgICB9O1xyXG59Iiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJyR1aWJNb2RhbCcsIGFyZVlvdVN1cmVNb2RhbF07XHJcblxyXG5mdW5jdGlvbiBhcmVZb3VTdXJlTW9kYWwoJHVpYk1vZGFsKSB7XHJcbiAgICB2YXIgbW9kYWwgPSB7XHJcbiAgICAgICAgc2hvdzogc2hvd01vZGFsXHJcbiAgICB9O1xyXG5cclxuICAgIGFyZVlvdVN1cmVNb2RhbC4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICdtb2RhbEJvZHknXTtcclxuXHJcbiAgICBmdW5jdGlvbiBhcmVZb3VTdXJlTW9kYWxDb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlLCBtb2RhbEJvZHkpIHtcclxuXHJcbiAgICAgICAgdmFyIGN0cmxBcmVZb3VTdXJlTW9kYWwgPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogY2FuY2VsLFxyXG4gICAgICAgICAgICBjb25maXJtOiBjb25maXJtLFxyXG4gICAgICAgICAgICBib2R5OiBtb2RhbEJvZHlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgJChcIi5wYWdlLWRhc2hib2FyZCwgLnRhcmljLXBhZ2UtY29udGVudFwiKS5yZW1vdmVDbGFzcyhcIm5vcHJpbnRcIik7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoJ2NhbmNlbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY29uZmlybSgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcyh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdHJsQXJlWW91U3VyZU1vZGFsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dNb2RhbChtb2RhbEJvZHkpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICBiYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogYXJlWW91U3VyZU1vZGFsQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAnY3RybEFyZVlvdVN1cmVNb2RhbCcsXHJcbiAgICAgICAgICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RhbEZhZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgIG1vZGFsQm9keTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RhbEJvZHk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnd2lkZ2V0cy9tb2RhbHMvYXJlLXlvdS1zdXJlLmh0bWwnLFxyXG4gICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLWFyZS15b3Utc3VyZSdcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbW9kYWw7XHJcbn1cclxuIiwi77u/bW9kdWxlLmV4cG9ydHMgPSBbJyR1aWJNb2RhbCcsIGxvZ2dpbmdPdXRNb2RhbF07XHJcblxyXG5mdW5jdGlvbiBsb2dnaW5nT3V0TW9kYWwoJHVpYk1vZGFsKSB7XHJcbiAgICB2YXIgbW9kYWwgPSB7XHJcbiAgICAgICAgZGlzbWlzczogZGlzbWlzc01vZGFsLFxyXG4gICAgICAgIG1vZGFsUmVmOiBudWxsLFxyXG4gICAgICAgIHNob3c6IHNob3dNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICBsb2dnaW5nT3V0TW9kYWwuJGluamVjdCA9IFsnJHVpYk1vZGFsSW5zdGFuY2UnXTtcclxuXHJcbiAgICBmdW5jdGlvbiBsb2dnaW5nT3V0TW9kYWxDb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlKSB7XHJcblxyXG4gICAgICAgIHZhciBjdHJsTG9nZ2luZ091dE1vZGFsID0ge1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAkKFwiLnBhZ2UtZGFzaGJvYXJkLCAudGFyaWMtcGFnZS1jb250ZW50XCIpLnJlbW92ZUNsYXNzKFwibm9wcmludFwiKTtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygnY2FuY2VsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjb25maXJtKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN0cmxMb2dnaW5nT3V0TW9kYWw7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGlzbWlzc01vZGFsKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TW9kYWwoKSB7XHJcblxyXG4gICAgICAgIHJldHVybiAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IGxvZ2dpbmdPdXRNb2RhbENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ2N0cmxMb2dnaW5nT3V0TW9kYWwnLFxyXG4gICAgICAgICAgICBrZXlib2FyZDogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kYWxGYWRlOiB0cnVlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3dpZGdldHMvbW9kYWxzL2xvZ2dpbmctb3V0Lmh0bWwnXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1vZGFsO1xyXG59XHJcbiIsIu+7v21vZHVsZS5leHBvcnRzID0gWydhcmVZb3VTdXJlTW9kYWwnLCAnbG9nZ2luZ091dE1vZGFsJywgd2lkZ2V0TW9kYWxzU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiB3aWRnZXRNb2RhbHNTZXJ2aWNlKGFyZVlvdVN1cmVNb2RhbCwgbG9nZ2luZ091dE1vZGFsKSB7XHJcblxyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgYXJlWW91U3VyZTogYXJlWW91U3VyZU1vZGFsLFxyXG4gICAgICAgIGxvZ2dpbmdPdXQ6IGxvZ2dpbmdPdXRNb2RhbFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gc2VydmljZTtcclxuXHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBbJ2NvbmZpZycsICdkYXRhQ29udGV4dCcsICdhcHBsaWNhdGlvblN0YXRlU2VydmljZScsIHRhcmljU3RhdHVzU2VydmljZV07XHJcblxyXG5mdW5jdGlvbiB0YXJpY1N0YXR1c1NlcnZpY2UoY29uZmlnLCBjb250ZXh0LCBzdGF0ZSkge1xyXG4gICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgbG9hZExhc3RTdWNjZXNzZnVsRGF0YWJhc2U6IGxvYWRMYXN0U3VjY2Vzc2Z1bERhdGFiYXNlLFxyXG4gICAgICAgIHN0YXR1czogbnVsbCxcclxuICAgICAgICB2ZXJzaW9uTnVtYmVyOiBjb25maWcudmVyc2lvblxyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBsb2FkTGFzdFN1Y2Nlc3NmdWxEYXRhYmFzZSgpIHtcclxuICAgICAgICByZXR1cm4gY29udGV4dC5nZXQoY29uZmlnLmFwaUhvc3RzW2NvbmZpZy5jdXJyZW50QXBpXSArICcvc3RhdHVzP3JlZmVyZW5jZWNvdW50cnk9JyArIHN0YXRlLmZpbHRlci5yZWZlcmVuY2VDb3VudHJ5KVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLmxhc3RTdWNjZXNzZnVsRGF0YWJhc2UgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlO1xyXG59XHJcblxyXG4iXX0="}