{"version":3,"sources":["../../.yarn/cache/browser-pack-npm-6.1.0-67557e011b-9e5993d3ee.zip/node_modules/browser-pack/_prelude.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/AsYouType.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/AsYouTypeFormatter.PatternMatcher.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/AsYouTypeFormatter.PatternParser.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/AsYouTypeFormatter.complete.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/AsYouTypeFormatter.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/AsYouTypeFormatter.util.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/AsYouTypeParser.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/AsYouTypeState.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/ParseError.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/PhoneNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/PhoneNumberMatcher.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/constants.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/findNumbers/LRUCache.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/findNumbers/Leniency.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/findNumbers/RegExpCache.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/findNumbers/isValidCandidate.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/findNumbers/isValidPreCandidate.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/findNumbers/matchPhoneNumberStringAgainstPhoneNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/findNumbers/parsePreCandidate.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/findNumbers/utf-8.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/findNumbers/util.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/findPhoneNumbersInText.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/format.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/formatIncompletePhoneNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/getCountries.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/getCountryCallingCode.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/getExampleNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/RFC3966.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/applyInternationalSeparatorStyle.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/checkNumberLength.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/extension/createExtensionPattern.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/extension/extractExtension.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/extractCountryCallingCode.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/extractFormattedPhoneNumberFromPossibleRfc3966NumberUri.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/extractNationalNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/extractNationalNumberFromPossiblyIncompleteNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/extractPhoneContext.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/formatNationalNumberUsingFormat.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/getCountryByCallingCode.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/getCountryByNationalNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/getIddPrefix.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/getNumberType.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/getPossibleCountriesForNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/isViablePhoneNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/matchesEntirely.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/mergeArrays.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/parseDigits.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/helpers/stripIddPrefix.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/isPossible.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/isPossiblePhoneNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/isValid.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/isValidPhoneNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/legacy/findNumbers.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/legacy/findPhoneNumbers.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/legacy/findPhoneNumbersInitialImplementation.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/legacy/format.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/legacy/getNumberType.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/legacy/isPossibleNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/legacy/isValidNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/legacy/isValidNumberForRegion.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/legacy/isValidNumberForRegion_.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/legacy/parse.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/legacy/searchNumbers.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/metadata.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/normalizeArguments.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/parse.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/parseIncompletePhoneNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/parsePhoneNumber.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/parsePhoneNumberWithError.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/parsePhoneNumberWithError_.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/parsePhoneNumber_.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/searchPhoneNumbersInText.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/tools/semver-compare.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/build/validatePhoneNumberLength.js","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/core/index.cjs","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/index.cjs","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/metadata.min.json","../../.yarn/cache/libphonenumber-js-npm-1.10.26-d53d956578-125cbe60ea.zip/node_modules/libphonenumber-js/min/index.cjs","public/ecmascript/components/common/AutoCompleteInput.js","public/ecmascript/components/common/FloatingLabelInput.js","public/ecmascript/components/common/PhoneNumberInput.js","public/ecmascript/components/common/VerificationCodeInput.js","public/ecmascript/components/common/modal.js","public/ecmascript/components/common/templates/modal.html.js","public/ecmascript/components/idc_signup_success_modal/SignUpSuccessModal.html.js","public/ecmascript/components/idc_signup_success_modal/SignUpSuccessModal.js","public/ecmascript/components/sign_in/SignIn.js","public/ecmascript/pages/sign_in_page.js","public/ecmascript/util/keycodes.js"],"names":[],"mappings":"AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3gBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;IChHqB,iB;;;;;uCACgB;AAAA,gBAAvB,SAAuB,QAAvB,SAAuB;AAAA,gBAAZ,EAAY,QAAZ,EAAY;AAAA,gBAAR,KAAQ,QAAR,KAAQ;;AAC7B,yEACyC,SADzC,uCAEqB,EAFrB,sBAEwC,KAFxC,uFAGyC,EAHzC,iBAGuD,KAHvD,UAGiE,KAHjE;AAOH;;;AAED,sCAA8E;AAAA,YAAhE,SAAgE,SAAhE,SAAgE;AAAA,YAArD,EAAqD,SAArD,EAAqD;AAAA,YAAj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","file":"sign_in_page.bundle.min.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 arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false;\n\nvar AsYouType = /*#__PURE__*/function () {\n /**\r\n * @param {(string|object)?} [optionsOrDefaultCountry] - The default country used for parsing non-international phone numbers. Can also be an `options` object.\r\n * @param {Object} metadata\r\n */\n function AsYouType(optionsOrDefaultCountry, metadata) {\n _classCallCheck(this, AsYouType);\n\n this.metadata = new _metadata[\"default\"](metadata);\n\n var _this$getCountryAndCa = this.getCountryAndCallingCode(optionsOrDefaultCountry),\n _this$getCountryAndCa2 = _slicedToArray(_this$getCountryAndCa, 2),\n defaultCountry = _this$getCountryAndCa2[0],\n defaultCallingCode = _this$getCountryAndCa2[1];\n\n this.defaultCountry = defaultCountry;\n this.defaultCallingCode = defaultCallingCode;\n this.reset();\n }\n\n _createClass(AsYouType, [{\n key: \"getCountryAndCallingCode\",\n value: function getCountryAndCallingCode(optionsOrDefaultCountry) {\n // Set `defaultCountry` and `defaultCallingCode` options.\n var defaultCountry;\n var defaultCallingCode; // Turns out `null` also has type \"object\". Weird.\n\n if (optionsOrDefaultCountry) {\n if (_typeof(optionsOrDefaultCountry) === 'object') {\n defaultCountry = optionsOrDefaultCountry.defaultCountry;\n defaultCallingCode = optionsOrDefaultCountry.defaultCallingCode;\n } else {\n defaultCountry = optionsOrDefaultCountry;\n }\n }\n\n if (defaultCountry && !this.metadata.hasCountry(defaultCountry)) {\n defaultCountry = undefined;\n }\n\n if (defaultCallingCode) {\n /* istanbul ignore if */\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (this.metadata.isNonGeographicCallingCode(defaultCallingCode)) {\n defaultCountry = '001';\n }\n }\n }\n\n return [defaultCountry, defaultCallingCode];\n }\n /**\r\n * Inputs \"next\" phone number characters.\r\n * @param {string} text\r\n * @return {string} Formatted phone number characters that have been input so far.\r\n */\n\n }, {\n key: \"input\",\n value: function input(text) {\n var _this$parser$input = this.parser.input(text, this.state),\n digits = _this$parser$input.digits,\n justLeadingPlus = _this$parser$input.justLeadingPlus;\n\n if (justLeadingPlus) {\n this.formattedOutput = '+';\n } else if (digits) {\n this.determineTheCountryIfNeeded(); // Match the available formats by the currently available leading digits.\n\n if (this.state.nationalSignificantNumber) {\n this.formatter.narrowDownMatchingFormats(this.state);\n }\n\n var formattedNationalNumber;\n\n if (this.metadata.hasSelectedNumberingPlan()) {\n formattedNationalNumber = this.formatter.format(digits, this.state);\n }\n\n if (formattedNationalNumber === undefined) {\n // See if another national (significant) number could be re-extracted.\n if (this.parser.reExtractNationalSignificantNumber(this.state)) {\n this.determineTheCountryIfNeeded(); // If it could, then re-try formatting the new national (significant) number.\n\n var nationalDigits = this.state.getNationalDigits();\n\n if (nationalDigits) {\n formattedNationalNumber = this.formatter.format(nationalDigits, this.state);\n }\n }\n }\n\n this.formattedOutput = formattedNationalNumber ? this.getFullNumber(formattedNationalNumber) : this.getNonFormattedNumber();\n }\n\n return this.formattedOutput;\n }\n }, {\n key: \"reset\",\n value: function reset() {\n var _this = this;\n\n this.state = new _AsYouTypeState[\"default\"]({\n onCountryChange: function onCountryChange(country) {\n // Before version `1.6.0`, the official `AsYouType` formatter API\n // included the `.country` property of an `AsYouType` instance.\n // Since that property (along with the others) have been moved to\n // `this.state`, `this.country` property is emulated for compatibility\n // with the old versions.\n _this.country = country;\n },\n onCallingCodeChange: function onCallingCodeChange(callingCode, country) {\n _this.metadata.selectNumberingPlan(country, callingCode);\n\n _this.formatter.reset(_this.metadata.numberingPlan, _this.state);\n\n _this.parser.reset(_this.metadata.numberingPlan);\n }\n });\n this.formatter = new _AsYouTypeFormatter[\"default\"]({\n state: this.state,\n metadata: this.metadata\n });\n this.parser = new _AsYouTypeParser[\"default\"]({\n defaultCountry: this.defaultCountry,\n defaultCallingCode: this.defaultCallingCode,\n metadata: this.metadata,\n state: this.state,\n onNationalSignificantNumberChange: function onNationalSignificantNumberChange() {\n _this.determineTheCountryIfNeeded();\n\n _this.formatter.reset(_this.metadata.numberingPlan, _this.state);\n }\n });\n this.state.reset({\n country: this.defaultCountry,\n callingCode: this.defaultCallingCode\n });\n this.formattedOutput = '';\n return this;\n }\n /**\r\n * Returns `true` if the phone number is being input in international format.\r\n * In other words, returns `true` if and only if the parsed phone number starts with a `\"+\"`.\r\n * @return {boolean}\r\n */\n\n }, {\n key: \"isInternational\",\n value: function isInternational() {\n return this.state.international;\n }\n /**\r\n * Returns the \"calling code\" part of the phone number when it's being input\r\n * in an international format.\r\n * If no valid calling code has been entered so far, returns `undefined`.\r\n * @return {string} [callingCode]\r\n */\n\n }, {\n key: \"getCallingCode\",\n value: function getCallingCode() {\n // If the number is being input in national format and some \"default calling code\"\n // has been passed to `AsYouType` constructor, then `this.state.callingCode`\n // is equal to that \"default calling code\".\n //\n // If the number is being input in national format and no \"default calling code\"\n // has been passed to `AsYouType` constructor, then returns `undefined`,\n // even if a \"default country\" has been passed to `AsYouType` constructor.\n //\n if (this.isInternational()) {\n return this.state.callingCode;\n }\n } // A legacy alias.\n\n }, {\n key: \"getCountryCallingCode\",\n value: function getCountryCallingCode() {\n return this.getCallingCode();\n }\n /**\r\n * Returns a two-letter country code of the phone number.\r\n * Returns `undefined` for \"non-geographic\" phone numbering plans.\r\n * Returns `undefined` if no phone number has been input yet.\r\n * @return {string} [country]\r\n */\n\n }, {\n key: \"getCountry\",\n value: function getCountry() {\n var digits = this.state.digits; // Return `undefined` if no digits have been input yet.\n\n if (digits) {\n return this._getCountry();\n }\n }\n /**\r\n * Returns a two-letter country code of the phone number.\r\n * Returns `undefined` for \"non-geographic\" phone numbering plans.\r\n * @return {string} [country]\r\n */\n\n }, {\n key: \"_getCountry\",\n value: function _getCountry() {\n var country = this.state.country;\n /* istanbul ignore if */\n\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n // `AsYouType.getCountry()` returns `undefined`\n // for \"non-geographic\" phone numbering plans.\n if (country === '001') {\n return;\n }\n }\n\n return country;\n }\n }, {\n key: \"determineTheCountryIfNeeded\",\n value: function determineTheCountryIfNeeded() {\n // Suppose a user enters a phone number in international format,\n // and there're several countries corresponding to that country calling code,\n // and a country has been derived from the number, and then\n // a user enters one more digit and the number is no longer\n // valid for the derived country, so the country should be re-derived\n // on every new digit in those cases.\n //\n // If the phone number is being input in national format,\n // then it could be a case when `defaultCountry` wasn't specified\n // when creating `AsYouType` instance, and just `defaultCallingCode` was specified,\n // and that \"calling code\" could correspond to a \"non-geographic entity\",\n // or there could be several countries corresponding to that country calling code.\n // In those cases, `this.country` is `undefined` and should be derived\n // from the number. Again, if country calling code is ambiguous, then\n // `this.country` should be re-derived with each new digit.\n //\n if (!this.state.country || this.isCountryCallingCodeAmbiguous()) {\n this.determineTheCountry();\n }\n } // Prepends `+CountryCode ` in case of an international phone number\n\n }, {\n key: \"getFullNumber\",\n value: function getFullNumber(formattedNationalNumber) {\n var _this2 = this;\n\n if (this.isInternational()) {\n var prefix = function prefix(text) {\n return _this2.formatter.getInternationalPrefixBeforeCountryCallingCode(_this2.state, {\n spacing: text ? true : false\n }) + text;\n };\n\n var callingCode = this.state.callingCode;\n\n if (!callingCode) {\n return prefix(\"\".concat(this.state.getDigitsWithoutInternationalPrefix()));\n }\n\n if (!formattedNationalNumber) {\n return prefix(callingCode);\n }\n\n return prefix(\"\".concat(callingCode, \" \").concat(formattedNationalNumber));\n }\n\n return formattedNationalNumber;\n }\n }, {\n key: \"getNonFormattedNationalNumberWithPrefix\",\n value: function getNonFormattedNationalNumberWithPrefix() {\n var _this$state = this.state,\n nationalSignificantNumber = _this$state.nationalSignificantNumber,\n complexPrefixBeforeNationalSignificantNumber = _this$state.complexPrefixBeforeNationalSignificantNumber,\n nationalPrefix = _this$state.nationalPrefix;\n var number = nationalSignificantNumber;\n var prefix = complexPrefixBeforeNationalSignificantNumber || nationalPrefix;\n\n if (prefix) {\n number = prefix + number;\n }\n\n return number;\n }\n }, {\n key: \"getNonFormattedNumber\",\n value: function getNonFormattedNumber() {\n var nationalSignificantNumberMatchesInput = this.state.nationalSignificantNumberMatchesInput;\n return this.getFullNumber(nationalSignificantNumberMatchesInput ? this.getNonFormattedNationalNumberWithPrefix() : this.state.getNationalDigits());\n }\n }, {\n key: \"getNonFormattedTemplate\",\n value: function getNonFormattedTemplate() {\n var number = this.getNonFormattedNumber();\n\n if (number) {\n return number.replace(/[\\+\\d]/g, _AsYouTypeFormatter.DIGIT_PLACEHOLDER);\n }\n }\n }, {\n key: \"isCountryCallingCodeAmbiguous\",\n value: function isCountryCallingCodeAmbiguous() {\n var callingCode = this.state.callingCode;\n var countryCodes = this.metadata.getCountryCodesForCallingCode(callingCode);\n return countryCodes && countryCodes.length > 1;\n } // Determines the country of the phone number\n // entered so far based on the country phone code\n // and the national phone number.\n\n }, {\n key: \"determineTheCountry\",\n value: function determineTheCountry() {\n this.state.setCountry((0, _getCountryByCallingCode[\"default\"])(this.isInternational() ? this.state.callingCode : this.defaultCallingCode, this.state.nationalSignificantNumber, this.metadata));\n }\n /**\r\n * Returns a E.164 phone number value for the user's input.\r\n *\r\n * For example, for country `\"US\"` and input `\"(222) 333-4444\"`\r\n * it will return `\"+12223334444\"`.\r\n *\r\n * For international phone number input, it will also auto-correct\r\n * some minor errors such as using a national prefix when writing\r\n * an international phone number. For example, if the user inputs\r\n * `\"+44 0 7400 000000\"` then it will return an auto-corrected\r\n * `\"+447400000000\"` phone number value.\r\n *\r\n * Will return `undefined` if no digits have been input,\r\n * or when inputting a phone number in national format and no\r\n * default country or default \"country calling code\" have been set.\r\n *\r\n * @return {string} [value]\r\n */\n\n }, {\n key: \"getNumberValue\",\n value: function getNumberValue() {\n var _this$state2 = this.state,\n digits = _this$state2.digits,\n callingCode = _this$state2.callingCode,\n country = _this$state2.country,\n nationalSignificantNumber = _this$state2.nationalSignificantNumber; // Will return `undefined` if no digits have been input.\n\n if (!digits) {\n return;\n }\n\n if (this.isInternational()) {\n if (callingCode) {\n return '+' + callingCode + nationalSignificantNumber;\n } else {\n return '+' + digits;\n }\n } else {\n if (country || callingCode) {\n var callingCode_ = country ? this.metadata.countryCallingCode() : callingCode;\n return '+' + callingCode_ + nationalSignificantNumber;\n }\n }\n }\n /**\r\n * Returns an instance of `PhoneNumber` class.\r\n * Will return `undefined` if no national (significant) number\r\n * digits have been entered so far, or if no `defaultCountry` has been\r\n * set and the user enters a phone number not in international format.\r\n */\n\n }, {\n key: \"getNumber\",\n value: function getNumber() {\n var _this$state3 = this.state,\n nationalSignificantNumber = _this$state3.nationalSignificantNumber,\n carrierCode = _this$state3.carrierCode,\n callingCode = _this$state3.callingCode; // `this._getCountry()` is basically same as `this.state.country`\n // with the only change that it return `undefined` in case of a\n // \"non-geographic\" numbering plan instead of `\"001\"` \"internal use\" value.\n\n var country = this._getCountry();\n\n if (!nationalSignificantNumber) {\n return;\n }\n\n if (!country && !callingCode) {\n return;\n }\n\n var phoneNumber = new _PhoneNumber[\"default\"](country || callingCode, nationalSignificantNumber, this.metadata.metadata);\n\n if (carrierCode) {\n phoneNumber.carrierCode = carrierCode;\n } // Phone number extensions are not supported by \"As You Type\" formatter.\n\n\n return phoneNumber;\n }\n /**\r\n * Returns `true` if the phone number is \"possible\".\r\n * Is just a shortcut for `PhoneNumber.isPossible()`.\r\n * @return {boolean}\r\n */\n\n }, {\n key: \"isPossible\",\n value: function isPossible() {\n var phoneNumber = this.getNumber();\n\n if (!phoneNumber) {\n return false;\n }\n\n return phoneNumber.isPossible();\n }\n /**\r\n * Returns `true` if the phone number is \"valid\".\r\n * Is just a shortcut for `PhoneNumber.isValid()`.\r\n * @return {boolean}\r\n */\n\n }, {\n key: \"isValid\",\n value: function isValid() {\n var phoneNumber = this.getNumber();\n\n if (!phoneNumber) {\n return false;\n }\n\n return phoneNumber.isValid();\n }\n /**\r\n * @deprecated\r\n * This method is used in `react-phone-number-input/source/input-control.js`\r\n * in versions before `3.0.16`.\r\n */\n\n }, {\n key: \"getNationalNumber\",\n value: function getNationalNumber() {\n return this.state.nationalSignificantNumber;\n }\n /**\r\n * Returns the phone number characters entered by the user.\r\n * @return {string}\r\n */\n\n }, {\n key: \"getChars\",\n value: function getChars() {\n return (this.state.international ? '+' : '') + this.state.digits;\n }\n /**\r\n * Returns the template for the formatted phone number.\r\n * @return {string}\r\n */\n\n }, {\n key: \"getTemplate\",\n value: function getTemplate() {\n return this.formatter.getTemplate(this.state) || this.getNonFormattedTemplate() || '';\n }\n }]);\n\n return AsYouType;\n}();\n\nexports[\"default\"] = AsYouType;\n//# sourceMappingURL=AsYouType.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _AsYouTypeFormatterPatternParser = _interopRequireDefault(require(\"./AsYouTypeFormatter.PatternParser.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar PatternMatcher = /*#__PURE__*/function () {\n function PatternMatcher(pattern) {\n _classCallCheck(this, PatternMatcher);\n\n this.matchTree = new _AsYouTypeFormatterPatternParser[\"default\"]().parse(pattern);\n }\n\n _createClass(PatternMatcher, [{\n key: \"match\",\n value: function match(string) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n allowOverflow = _ref.allowOverflow;\n\n if (!string) {\n throw new Error('String is required');\n }\n\n var result = _match(string.split(''), this.matchTree, true);\n\n if (result && result.match) {\n delete result.matchedChars;\n }\n\n if (result && result.overflow) {\n if (!allowOverflow) {\n return;\n }\n }\n\n return result;\n }\n }]);\n\n return PatternMatcher;\n}();\n/**\r\n * Matches `characters` against a pattern compiled into a `tree`.\r\n * @param {string[]} characters\r\n * @param {Tree} tree — A pattern compiled into a `tree`. See the `*.d.ts` file for the description of the `tree` structure.\r\n * @param {boolean} last — Whether it's the last (rightmost) subtree on its level of the match tree.\r\n * @return {object} See the `*.d.ts` file for the description of the result object.\r\n */\n\n\nexports[\"default\"] = PatternMatcher;\n\nfunction _match(characters, tree, last) {\n // If `tree` is a string, then `tree` is a single character.\n // That's because when a pattern is parsed, multi-character-string parts\n // of a pattern are compiled into arrays of single characters.\n // I still wrote this piece of code for a \"general\" hypothetical case\n // when `tree` could be a string of several characters, even though\n // such case is not possible with the current implementation.\n if (typeof tree === 'string') {\n var characterString = characters.join('');\n\n if (tree.indexOf(characterString) === 0) {\n // `tree` is always a single character.\n // If `tree.indexOf(characterString) === 0`\n // then `characters.length === tree.length`.\n\n /* istanbul ignore else */\n if (characters.length === tree.length) {\n return {\n match: true,\n matchedChars: characters\n };\n } // `tree` is always a single character.\n // If `tree.indexOf(characterString) === 0`\n // then `characters.length === tree.length`.\n\n /* istanbul ignore next */\n\n\n return {\n partialMatch: true // matchedChars: characters\n\n };\n }\n\n if (characterString.indexOf(tree) === 0) {\n if (last) {\n // The `else` path is not possible because `tree` is always a single character.\n // The `else` case for `characters.length > tree.length` would be\n // `characters.length <= tree.length` which means `characters.length <= 1`.\n // `characters` array can't be empty, so that means `characters === [tree]`,\n // which would also mean `tree.indexOf(characterString) === 0` and that'd mean\n // that the `if (tree.indexOf(characterString) === 0)` condition before this\n // `if` condition would be entered, and returned from there, not reaching this code.\n\n /* istanbul ignore else */\n if (characters.length > tree.length) {\n return {\n overflow: true\n };\n }\n }\n\n return {\n match: true,\n matchedChars: characters.slice(0, tree.length)\n };\n }\n\n return;\n }\n\n if (Array.isArray(tree)) {\n var restCharacters = characters.slice();\n var i = 0;\n\n while (i < tree.length) {\n var subtree = tree[i];\n\n var result = _match(restCharacters, subtree, last && i === tree.length - 1);\n\n if (!result) {\n return;\n } else if (result.overflow) {\n return result;\n } else if (result.match) {\n // Continue with the next subtree with the rest of the characters.\n restCharacters = restCharacters.slice(result.matchedChars.length);\n\n if (restCharacters.length === 0) {\n if (i === tree.length - 1) {\n return {\n match: true,\n matchedChars: characters\n };\n } else {\n return {\n partialMatch: true // matchedChars: characters\n\n };\n }\n }\n } else {\n /* istanbul ignore else */\n if (result.partialMatch) {\n return {\n partialMatch: true // matchedChars: characters\n\n };\n } else {\n throw new Error(\"Unsupported match result:\\n\".concat(JSON.stringify(result, null, 2)));\n }\n }\n\n i++;\n } // If `last` then overflow has already been checked\n // by the last element of the `tree` array.\n\n /* istanbul ignore if */\n\n\n if (last) {\n return {\n overflow: true\n };\n }\n\n return {\n match: true,\n matchedChars: characters.slice(0, characters.length - restCharacters.length)\n };\n }\n\n switch (tree.op) {\n case '|':\n var partialMatch;\n\n for (var _iterator = _createForOfIteratorHelperLoose(tree.args), _step; !(_step = _iterator()).done;) {\n var branch = _step.value;\n\n var _result = _match(characters, branch, last);\n\n if (_result) {\n if (_result.overflow) {\n return _result;\n } else if (_result.match) {\n return {\n match: true,\n matchedChars: _result.matchedChars\n };\n } else {\n /* istanbul ignore else */\n if (_result.partialMatch) {\n partialMatch = true;\n } else {\n throw new Error(\"Unsupported match result:\\n\".concat(JSON.stringify(_result, null, 2)));\n }\n }\n }\n }\n\n if (partialMatch) {\n return {\n partialMatch: true // matchedChars: ...\n\n };\n } // Not even a partial match.\n\n\n return;\n\n case '[]':\n for (var _iterator2 = _createForOfIteratorHelperLoose(tree.args), _step2; !(_step2 = _iterator2()).done;) {\n var _char = _step2.value;\n\n if (characters[0] === _char) {\n if (characters.length === 1) {\n return {\n match: true,\n matchedChars: characters\n };\n }\n\n if (last) {\n return {\n overflow: true\n };\n }\n\n return {\n match: true,\n matchedChars: [_char]\n };\n }\n } // No character matches.\n\n\n return;\n\n /* istanbul ignore next */\n\n default:\n throw new Error(\"Unsupported instruction tree: \".concat(tree));\n }\n}\n//# sourceMappingURL=AsYouTypeFormatter.PatternMatcher.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar PatternParser = /*#__PURE__*/function () {\n function PatternParser() {\n _classCallCheck(this, PatternParser);\n }\n\n _createClass(PatternParser, [{\n key: \"parse\",\n value: function parse(pattern) {\n this.context = [{\n or: true,\n instructions: []\n }];\n this.parsePattern(pattern);\n\n if (this.context.length !== 1) {\n throw new Error('Non-finalized contexts left when pattern parse ended');\n }\n\n var _this$context$ = this.context[0],\n branches = _this$context$.branches,\n instructions = _this$context$.instructions;\n\n if (branches) {\n return {\n op: '|',\n args: branches.concat([expandSingleElementArray(instructions)])\n };\n }\n /* istanbul ignore if */\n\n\n if (instructions.length === 0) {\n throw new Error('Pattern is required');\n }\n\n if (instructions.length === 1) {\n return instructions[0];\n }\n\n return instructions;\n }\n }, {\n key: \"startContext\",\n value: function startContext(context) {\n this.context.push(context);\n }\n }, {\n key: \"endContext\",\n value: function endContext() {\n this.context.pop();\n }\n }, {\n key: \"getContext\",\n value: function getContext() {\n return this.context[this.context.length - 1];\n }\n }, {\n key: \"parsePattern\",\n value: function parsePattern(pattern) {\n if (!pattern) {\n throw new Error('Pattern is required');\n }\n\n var match = pattern.match(OPERATOR);\n\n if (!match) {\n if (ILLEGAL_CHARACTER_REGEXP.test(pattern)) {\n throw new Error(\"Illegal characters found in a pattern: \".concat(pattern));\n }\n\n this.getContext().instructions = this.getContext().instructions.concat(pattern.split(''));\n return;\n }\n\n var operator = match[1];\n var before = pattern.slice(0, match.index);\n var rightPart = pattern.slice(match.index + operator.length);\n\n switch (operator) {\n case '(?:':\n if (before) {\n this.parsePattern(before);\n }\n\n this.startContext({\n or: true,\n instructions: [],\n branches: []\n });\n break;\n\n case ')':\n if (!this.getContext().or) {\n throw new Error('\")\" operator must be preceded by \"(?:\" operator');\n }\n\n if (before) {\n this.parsePattern(before);\n }\n\n if (this.getContext().instructions.length === 0) {\n throw new Error('No instructions found after \"|\" operator in an \"or\" group');\n }\n\n var _this$getContext = this.getContext(),\n branches = _this$getContext.branches;\n\n branches.push(expandSingleElementArray(this.getContext().instructions));\n this.endContext();\n this.getContext().instructions.push({\n op: '|',\n args: branches\n });\n break;\n\n case '|':\n if (!this.getContext().or) {\n throw new Error('\"|\" operator can only be used inside \"or\" groups');\n }\n\n if (before) {\n this.parsePattern(before);\n } // The top-level is an implicit \"or\" group, if required.\n\n\n if (!this.getContext().branches) {\n // `branches` are not defined only for the root implicit \"or\" operator.\n\n /* istanbul ignore else */\n if (this.context.length === 1) {\n this.getContext().branches = [];\n } else {\n throw new Error('\"branches\" not found in an \"or\" group context');\n }\n }\n\n this.getContext().branches.push(expandSingleElementArray(this.getContext().instructions));\n this.getContext().instructions = [];\n break;\n\n case '[':\n if (before) {\n this.parsePattern(before);\n }\n\n this.startContext({\n oneOfSet: true\n });\n break;\n\n case ']':\n if (!this.getContext().oneOfSet) {\n throw new Error('\"]\" operator must be preceded by \"[\" operator');\n }\n\n this.endContext();\n this.getContext().instructions.push({\n op: '[]',\n args: parseOneOfSet(before)\n });\n break;\n\n /* istanbul ignore next */\n\n default:\n throw new Error(\"Unknown operator: \".concat(operator));\n }\n\n if (rightPart) {\n this.parsePattern(rightPart);\n }\n }\n }]);\n\n return PatternParser;\n}();\n\nexports[\"default\"] = PatternParser;\n\nfunction parseOneOfSet(pattern) {\n var values = [];\n var i = 0;\n\n while (i < pattern.length) {\n if (pattern[i] === '-') {\n if (i === 0 || i === pattern.length - 1) {\n throw new Error(\"Couldn't parse a one-of set pattern: \".concat(pattern));\n }\n\n var prevValue = pattern[i - 1].charCodeAt(0) + 1;\n var nextValue = pattern[i + 1].charCodeAt(0) - 1;\n var value = prevValue;\n\n while (value <= nextValue) {\n values.push(String.fromCharCode(value));\n value++;\n }\n } else {\n values.push(pattern[i]);\n }\n\n i++;\n }\n\n return values;\n}\n\nvar ILLEGAL_CHARACTER_REGEXP = /[\\(\\)\\[\\]\\?\\:\\|]/;\nvar OPERATOR = new RegExp( // any of:\n'(' + // or operator\n'\\\\|' + // or\n'|' + // or group start\n'\\\\(\\\\?\\\\:' + // or\n'|' + // or group end\n'\\\\)' + // or\n'|' + // one-of set start\n'\\\\[' + // or\n'|' + // one-of set end\n'\\\\]' + ')');\n\nfunction expandSingleElementArray(array) {\n if (array.length === 1) {\n return array[0];\n }\n\n return array;\n}\n//# sourceMappingURL=AsYouTypeFormatter.PatternParser.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.canFormatCompleteNumber = canFormatCompleteNumber;\nexports[\"default\"] = formatCompleteNumber;\n\nvar _checkNumberLength = _interopRequireDefault(require(\"./helpers/checkNumberLength.js\"));\n\nvar _parseDigits = _interopRequireDefault(require(\"./helpers/parseDigits.js\"));\n\nvar _formatNationalNumberUsingFormat = _interopRequireDefault(require(\"./helpers/formatNationalNumberUsingFormat.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction formatCompleteNumber(state, format, _ref) {\n var metadata = _ref.metadata,\n shouldTryNationalPrefixFormattingRule = _ref.shouldTryNationalPrefixFormattingRule,\n getSeparatorAfterNationalPrefix = _ref.getSeparatorAfterNationalPrefix;\n var matcher = new RegExp(\"^(?:\".concat(format.pattern(), \")$\"));\n\n if (matcher.test(state.nationalSignificantNumber)) {\n return formatNationalNumberWithAndWithoutNationalPrefixFormattingRule(state, format, {\n metadata: metadata,\n shouldTryNationalPrefixFormattingRule: shouldTryNationalPrefixFormattingRule,\n getSeparatorAfterNationalPrefix: getSeparatorAfterNationalPrefix\n });\n }\n}\n\nfunction canFormatCompleteNumber(nationalSignificantNumber, metadata) {\n return (0, _checkNumberLength[\"default\"])(nationalSignificantNumber, metadata) === 'IS_POSSIBLE';\n}\n\nfunction formatNationalNumberWithAndWithoutNationalPrefixFormattingRule(state, format, _ref2) {\n var metadata = _ref2.metadata,\n shouldTryNationalPrefixFormattingRule = _ref2.shouldTryNationalPrefixFormattingRule,\n getSeparatorAfterNationalPrefix = _ref2.getSeparatorAfterNationalPrefix;\n // `format` has already been checked for `nationalPrefix` requirement.\n var nationalSignificantNumber = state.nationalSignificantNumber,\n international = state.international,\n nationalPrefix = state.nationalPrefix,\n carrierCode = state.carrierCode; // Format the number with using `national_prefix_formatting_rule`.\n // If the resulting formatted number is a valid formatted number, then return it.\n //\n // Google's AsYouType formatter is different in a way that it doesn't try\n // to format using the \"national prefix formatting rule\", and instead it\n // simply prepends a national prefix followed by a \" \" character.\n // This code does that too, but as a fallback.\n // The reason is that \"national prefix formatting rule\" may use parentheses,\n // which wouldn't be included has it used the simpler Google's way.\n //\n\n if (shouldTryNationalPrefixFormattingRule(format)) {\n var formattedNumber = formatNationalNumber(state, format, {\n useNationalPrefixFormattingRule: true,\n getSeparatorAfterNationalPrefix: getSeparatorAfterNationalPrefix,\n metadata: metadata\n });\n\n if (formattedNumber) {\n return formattedNumber;\n }\n } // Format the number without using `national_prefix_formatting_rule`.\n\n\n return formatNationalNumber(state, format, {\n useNationalPrefixFormattingRule: false,\n getSeparatorAfterNationalPrefix: getSeparatorAfterNationalPrefix,\n metadata: metadata\n });\n}\n\nfunction formatNationalNumber(state, format, _ref3) {\n var metadata = _ref3.metadata,\n useNationalPrefixFormattingRule = _ref3.useNationalPrefixFormattingRule,\n getSeparatorAfterNationalPrefix = _ref3.getSeparatorAfterNationalPrefix;\n var formattedNationalNumber = (0, _formatNationalNumberUsingFormat[\"default\"])(state.nationalSignificantNumber, format, {\n carrierCode: state.carrierCode,\n useInternationalFormat: state.international,\n withNationalPrefix: useNationalPrefixFormattingRule,\n metadata: metadata\n });\n\n if (!useNationalPrefixFormattingRule) {\n if (state.nationalPrefix) {\n // If a national prefix was extracted, then just prepend it,\n // followed by a \" \" character.\n formattedNationalNumber = state.nationalPrefix + getSeparatorAfterNationalPrefix(format) + formattedNationalNumber;\n } else if (state.complexPrefixBeforeNationalSignificantNumber) {\n formattedNationalNumber = state.complexPrefixBeforeNationalSignificantNumber + ' ' + formattedNationalNumber;\n }\n }\n\n if (isValidFormattedNationalNumber(formattedNationalNumber, state)) {\n return formattedNationalNumber;\n }\n} // Check that the formatted phone number contains exactly\n// the same digits that have been input by the user.\n// For example, when \"0111523456789\" is input for `AR` country,\n// the extracted `this.nationalSignificantNumber` is \"91123456789\",\n// which means that the national part of `this.digits` isn't simply equal to\n// `this.nationalPrefix` + `this.nationalSignificantNumber`.\n//\n// Also, a `format` can add extra digits to the `this.nationalSignificantNumber`\n// being formatted via `metadata[country].national_prefix_transform_rule`.\n// For example, for `VI` country, it prepends `340` to the national number,\n// and if this check hasn't been implemented, then there would be a bug\n// when `340` \"area coude\" is \"duplicated\" during input for `VI` country:\n// https://github.com/catamphetamine/libphonenumber-js/issues/318\n//\n// So, all these \"gotchas\" are filtered out.\n//\n// In the original Google's code, the comments say:\n// \"Check that we didn't remove nor add any extra digits when we matched\n// this formatting pattern. This usually happens after we entered the last\n// digit during AYTF. Eg: In case of MX, we swallow mobile token (1) when\n// formatted but AYTF should retain all the number entered and not change\n// in order to match a format (of same leading digits and length) display\n// in that way.\"\n// \"If it's the same (i.e entered number and format is same), then it's\n// safe to return this in formatted number as nothing is lost / added.\"\n// Otherwise, don't use this format.\n// https://github.com/google/libphonenumber/commit/3e7c1f04f5e7200f87fb131e6f85c6e99d60f510#diff-9149457fa9f5d608a11bb975c6ef4bc5\n// https://github.com/google/libphonenumber/commit/3ac88c7106e7dcb553bcc794b15f19185928a1c6#diff-2dcb77e833422ee304da348b905cde0b\n//\n\n\nfunction isValidFormattedNationalNumber(formattedNationalNumber, state) {\n return (0, _parseDigits[\"default\"])(formattedNationalNumber) === state.getNationalDigits();\n}\n//# sourceMappingURL=AsYouTypeFormatter.complete.js.map","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"DIGIT_PLACEHOLDER\", {\n enumerable: true,\n get: function get() {\n return _AsYouTypeFormatterUtil.DIGIT_PLACEHOLDER;\n }\n});\nexports[\"default\"] = void 0;\n\nvar _AsYouTypeFormatterUtil = require(\"./AsYouTypeFormatter.util.js\");\n\nvar _AsYouTypeFormatterComplete = _interopRequireWildcard(require(\"./AsYouTypeFormatter.complete.js\"));\n\nvar _AsYouTypeFormatterPatternMatcher = _interopRequireDefault(require(\"./AsYouTypeFormatter.PatternMatcher.js\"));\n\nvar _parseDigits = _interopRequireDefault(require(\"./helpers/parseDigits.js\"));\n\nvar _formatNationalNumberUsingFormat = require(\"./helpers/formatNationalNumberUsingFormat.js\");\n\nvar _constants = require(\"./constants.js\");\n\nvar _applyInternationalSeparatorStyle = _interopRequireDefault(require(\"./helpers/applyInternationalSeparatorStyle.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n// Used in phone number format template creation.\n// Could be any digit, I guess.\nvar DUMMY_DIGIT = '9'; // I don't know why is it exactly `15`\n\nvar LONGEST_NATIONAL_PHONE_NUMBER_LENGTH = 15; // Create a phone number consisting only of the digit 9 that matches the\n// `number_pattern` by applying the pattern to the \"longest phone number\" string.\n\nvar LONGEST_DUMMY_PHONE_NUMBER = (0, _AsYouTypeFormatterUtil.repeat)(DUMMY_DIGIT, LONGEST_NATIONAL_PHONE_NUMBER_LENGTH); // A set of characters that, if found in a national prefix formatting rules, are an indicator to\n// us that we should separate the national prefix from the number when formatting.\n\nvar NATIONAL_PREFIX_SEPARATORS_PATTERN = /[- ]/; // Deprecated: Google has removed some formatting pattern related code from their repo.\n// https://github.com/googlei18n/libphonenumber/commit/a395b4fef3caf57c4bc5f082e1152a4d2bd0ba4c\n// \"We no longer have numbers in formatting matching patterns, only \\d.\"\n// Because this library supports generating custom metadata\n// some users may still be using old metadata so the relevant\n// code seems to stay until some next major version update.\n\nvar SUPPORT_LEGACY_FORMATTING_PATTERNS = true; // A pattern that is used to match character classes in regular expressions.\n// An example of a character class is \"[1-4]\".\n\nvar CREATE_CHARACTER_CLASS_PATTERN = SUPPORT_LEGACY_FORMATTING_PATTERNS && function () {\n return /\\[([^\\[\\]])*\\]/g;\n}; // Any digit in a regular expression that actually denotes a digit. For\n// example, in the regular expression \"80[0-2]\\d{6,10}\", the first 2 digits\n// (8 and 0) are standalone digits, but the rest are not.\n// Two look-aheads are needed because the number following \\\\d could be a\n// two-digit number, since the phone number can be as long as 15 digits.\n\n\nvar CREATE_STANDALONE_DIGIT_PATTERN = SUPPORT_LEGACY_FORMATTING_PATTERNS && function () {\n return /\\d(?=[^,}][^,}])/g;\n}; // A regular expression that is used to determine if a `format` is\n// suitable to be used in the \"as you type formatter\".\n// A `format` is suitable when the resulting formatted number has\n// the same digits as the user has entered.\n//\n// In the simplest case, that would mean that the format\n// doesn't add any additional digits when formatting a number.\n// Google says that it also shouldn't add \"star\" (`*`) characters,\n// like it does in some Israeli formats.\n// Such basic format would only contain \"valid punctuation\"\n// and \"captured group\" identifiers ($1, $2, etc).\n//\n// An example of a format that adds additional digits:\n//\n// Country: `AR` (Argentina).\n// Format:\n// {\n// \"pattern\": \"(\\\\d)(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\n// \"leading_digits_patterns\": [\"91\"],\n// \"national_prefix_formatting_rule\": \"0$1\",\n// \"format\": \"$2 15-$3-$4\",\n// \"international_format\": \"$1 $2 $3-$4\"\n// }\n//\n// In the format above, the `format` adds `15` to the digits when formatting a number.\n// A sidenote: this format actually is suitable because `national_prefix_for_parsing`\n// has previously removed `15` from a national number, so re-adding `15` in `format`\n// doesn't actually result in any extra digits added to user's input.\n// But verifying that would be a complex procedure, so the code chooses a simpler path:\n// it simply filters out all `format`s that contain anything but \"captured group\" ids.\n//\n// This regular expression is called `ELIGIBLE_FORMAT_PATTERN` in Google's\n// `libphonenumber` code.\n//\n\n\nvar NON_ALTERING_FORMAT_REG_EXP = new RegExp('[' + _constants.VALID_PUNCTUATION + ']*' + // Google developers say:\n// \"We require that the first matching group is present in the\n// output pattern to ensure no data is lost while formatting.\"\n'\\\\$1' + '[' + _constants.VALID_PUNCTUATION + ']*' + '(\\\\$\\\\d[' + _constants.VALID_PUNCTUATION + ']*)*' + '$'); // This is the minimum length of the leading digits of a phone number\n// to guarantee the first \"leading digits pattern\" for a phone number format\n// to be preemptive.\n\nvar MIN_LEADING_DIGITS_LENGTH = 3;\n\nvar AsYouTypeFormatter = /*#__PURE__*/function () {\n function AsYouTypeFormatter(_ref) {\n var state = _ref.state,\n metadata = _ref.metadata;\n\n _classCallCheck(this, AsYouTypeFormatter);\n\n this.metadata = metadata;\n this.resetFormat();\n }\n\n _createClass(AsYouTypeFormatter, [{\n key: \"resetFormat\",\n value: function resetFormat() {\n this.chosenFormat = undefined;\n this.template = undefined;\n this.nationalNumberTemplate = undefined;\n this.populatedNationalNumberTemplate = undefined;\n this.populatedNationalNumberTemplatePosition = -1;\n }\n }, {\n key: \"reset\",\n value: function reset(numberingPlan, state) {\n this.resetFormat();\n\n if (numberingPlan) {\n this.isNANP = numberingPlan.callingCode() === '1';\n this.matchingFormats = numberingPlan.formats();\n\n if (state.nationalSignificantNumber) {\n this.narrowDownMatchingFormats(state);\n }\n } else {\n this.isNANP = undefined;\n this.matchingFormats = [];\n }\n }\n /**\r\n * Formats an updated phone number.\r\n * @param {string} nextDigits — Additional phone number digits.\r\n * @param {object} state — `AsYouType` state.\r\n * @return {[string]} Returns undefined if the updated phone number can't be formatted using any of the available formats.\r\n */\n\n }, {\n key: \"format\",\n value: function format(nextDigits, state) {\n var _this = this;\n\n // See if the phone number digits can be formatted as a complete phone number.\n // If not, use the results from `formatNationalNumberWithNextDigits()`,\n // which formats based on the chosen formatting pattern.\n //\n // Attempting to format complete phone number first is how it's done\n // in Google's `libphonenumber`, so this library just follows it.\n // Google's `libphonenumber` code doesn't explain in detail why does it\n // attempt to format digits as a complete phone number\n // instead of just going with a previoulsy (or newly) chosen `format`:\n //\n // \"Checks to see if there is an exact pattern match for these digits.\n // If so, we should use this instead of any other formatting template\n // whose leadingDigitsPattern also matches the input.\"\n //\n if ((0, _AsYouTypeFormatterComplete.canFormatCompleteNumber)(state.nationalSignificantNumber, this.metadata)) {\n for (var _iterator = _createForOfIteratorHelperLoose(this.matchingFormats), _step; !(_step = _iterator()).done;) {\n var format = _step.value;\n var formattedCompleteNumber = (0, _AsYouTypeFormatterComplete[\"default\"])(state, format, {\n metadata: this.metadata,\n shouldTryNationalPrefixFormattingRule: function shouldTryNationalPrefixFormattingRule(format) {\n return _this.shouldTryNationalPrefixFormattingRule(format, {\n international: state.international,\n nationalPrefix: state.nationalPrefix\n });\n },\n getSeparatorAfterNationalPrefix: function getSeparatorAfterNationalPrefix(format) {\n return _this.getSeparatorAfterNationalPrefix(format);\n }\n });\n\n if (formattedCompleteNumber) {\n this.resetFormat();\n this.chosenFormat = format;\n this.setNationalNumberTemplate(formattedCompleteNumber.replace(/\\d/g, _AsYouTypeFormatterUtil.DIGIT_PLACEHOLDER), state);\n this.populatedNationalNumberTemplate = formattedCompleteNumber; // With a new formatting template, the matched position\n // using the old template needs to be reset.\n\n this.populatedNationalNumberTemplatePosition = this.template.lastIndexOf(_AsYouTypeFormatterUtil.DIGIT_PLACEHOLDER);\n return formattedCompleteNumber;\n }\n }\n } // Format the digits as a partial (incomplete) phone number\n // using the previously chosen formatting pattern (or a newly chosen one).\n\n\n return this.formatNationalNumberWithNextDigits(nextDigits, state);\n } // Formats the next phone number digits.\n\n }, {\n key: \"formatNationalNumberWithNextDigits\",\n value: function formatNationalNumberWithNextDigits(nextDigits, state) {\n var previouslyChosenFormat = this.chosenFormat; // Choose a format from the list of matching ones.\n\n var newlyChosenFormat = this.chooseFormat(state);\n\n if (newlyChosenFormat) {\n if (newlyChosenFormat === previouslyChosenFormat) {\n // If it can format the next (current) digits\n // using the previously chosen phone number format\n // then return the updated formatted number.\n return this.formatNextNationalNumberDigits(nextDigits);\n } else {\n // If a more appropriate phone number format\n // has been chosen for these \"leading digits\",\n // then re-format the national phone number part\n // using the newly selected format.\n return this.formatNextNationalNumberDigits(state.getNationalDigits());\n }\n }\n }\n }, {\n key: \"narrowDownMatchingFormats\",\n value: function narrowDownMatchingFormats(_ref2) {\n var _this2 = this;\n\n var nationalSignificantNumber = _ref2.nationalSignificantNumber,\n nationalPrefix = _ref2.nationalPrefix,\n international = _ref2.international;\n var leadingDigits = nationalSignificantNumber; // \"leading digits\" pattern list starts with a\n // \"leading digits\" pattern fitting a maximum of 3 leading digits.\n // So, after a user inputs 3 digits of a national (significant) phone number\n // this national (significant) number can already be formatted.\n // The next \"leading digits\" pattern is for 4 leading digits max,\n // and the \"leading digits\" pattern after it is for 5 leading digits max, etc.\n // This implementation is different from Google's\n // in that it searches for a fitting format\n // even if the user has entered less than\n // `MIN_LEADING_DIGITS_LENGTH` digits of a national number.\n // Because some leading digit patterns already match for a single first digit.\n\n var leadingDigitsPatternIndex = leadingDigits.length - MIN_LEADING_DIGITS_LENGTH;\n\n if (leadingDigitsPatternIndex < 0) {\n leadingDigitsPatternIndex = 0;\n }\n\n this.matchingFormats = this.matchingFormats.filter(function (format) {\n return _this2.formatSuits(format, international, nationalPrefix) && _this2.formatMatches(format, leadingDigits, leadingDigitsPatternIndex);\n }); // If there was a phone number format chosen\n // and it no longer holds given the new leading digits then reset it.\n // The test for this `if` condition is marked as:\n // \"Reset a chosen format when it no longer holds given the new leading digits\".\n // To construct a valid test case for this one can find a country\n // in `PhoneNumberMetadata.xml` yielding one format for 3 ``\n // and yielding another format for 4 `` (Australia in this case).\n\n if (this.chosenFormat && this.matchingFormats.indexOf(this.chosenFormat) === -1) {\n this.resetFormat();\n }\n }\n }, {\n key: \"formatSuits\",\n value: function formatSuits(format, international, nationalPrefix) {\n // When a prefix before a national (significant) number is\n // simply a national prefix, then it's parsed as `this.nationalPrefix`.\n // In more complex cases, a prefix before national (significant) number\n // could include a national prefix as well as some \"capturing groups\",\n // and in that case there's no info whether a national prefix has been parsed.\n // If national prefix is not used when formatting a phone number\n // using this format, but a national prefix has been entered by the user,\n // and was extracted, then discard such phone number format.\n // In Google's \"AsYouType\" formatter code, the equivalent would be this part:\n // https://github.com/google/libphonenumber/blob/0a45cfd96e71cad8edb0e162a70fcc8bd9728933/java/libphonenumber/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java#L175-L184\n if (nationalPrefix && !format.usesNationalPrefix() && // !format.domesticCarrierCodeFormattingRule() &&\n !format.nationalPrefixIsOptionalWhenFormattingInNationalFormat()) {\n return false;\n } // If national prefix is mandatory for this phone number format\n // and there're no guarantees that a national prefix is present in user input\n // then discard this phone number format as not suitable.\n // In Google's \"AsYouType\" formatter code, the equivalent would be this part:\n // https://github.com/google/libphonenumber/blob/0a45cfd96e71cad8edb0e162a70fcc8bd9728933/java/libphonenumber/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java#L185-L193\n\n\n if (!international && !nationalPrefix && format.nationalPrefixIsMandatoryWhenFormattingInNationalFormat()) {\n return false;\n }\n\n return true;\n }\n }, {\n key: \"formatMatches\",\n value: function formatMatches(format, leadingDigits, leadingDigitsPatternIndex) {\n var leadingDigitsPatternsCount = format.leadingDigitsPatterns().length; // If this format is not restricted to a certain\n // leading digits pattern then it fits.\n // The test case could be found by searching for \"leadingDigitsPatternsCount === 0\".\n\n if (leadingDigitsPatternsCount === 0) {\n return true;\n } // Start narrowing down the list of possible formats based on the leading digits.\n // (only previously matched formats take part in the narrowing down process)\n // `leading_digits_patterns` start with 3 digits min\n // and then go up from there one digit at a time.\n\n\n leadingDigitsPatternIndex = Math.min(leadingDigitsPatternIndex, leadingDigitsPatternsCount - 1);\n var leadingDigitsPattern = format.leadingDigitsPatterns()[leadingDigitsPatternIndex]; // Google imposes a requirement on the leading digits\n // to be minimum 3 digits long in order to be eligible\n // for checking those with a leading digits pattern.\n //\n // Since `leading_digits_patterns` start with 3 digits min,\n // Google's original `libphonenumber` library only starts\n // excluding any non-matching formats only when the\n // national number entered so far is at least 3 digits long,\n // otherwise format matching would give false negatives.\n //\n // For example, when the digits entered so far are `2`\n // and the leading digits pattern is `21` –\n // it's quite obvious in this case that the format could be the one\n // but due to the absence of further digits it would give false negative.\n //\n // Also, `leading_digits_patterns` doesn't always correspond to a single\n // digits count. For example, `60|8` pattern would already match `8`\n // but the `60` part would require having at least two leading digits,\n // so the whole pattern would require inputting two digits first in order to\n // decide on whether it matches the input, even when the input is \"80\".\n //\n // This library — `libphonenumber-js` — allows filtering by `leading_digits_patterns`\n // even when there's only 1 or 2 digits of the national (significant) number.\n // To do that, it uses a non-strict pattern matcher written specifically for that.\n //\n\n if (leadingDigits.length < MIN_LEADING_DIGITS_LENGTH) {\n // Before leading digits < 3 matching was implemented:\n // return true\n //\n // After leading digits < 3 matching was implemented:\n try {\n return new _AsYouTypeFormatterPatternMatcher[\"default\"](leadingDigitsPattern).match(leadingDigits, {\n allowOverflow: true\n }) !== undefined;\n } catch (error)\n /* istanbul ignore next */\n {\n // There's a slight possibility that there could be some undiscovered bug\n // in the pattern matcher code. Since the \"leading digits < 3 matching\"\n // feature is not \"essential\" for operation, it can fall back to the old way\n // in case of any issues rather than halting the application's execution.\n console.error(error);\n return true;\n }\n } // If at least `MIN_LEADING_DIGITS_LENGTH` digits of a national number are\n // available then use the usual regular expression matching.\n //\n // The whole pattern is wrapped in round brackets (`()`) because\n // the pattern can use \"or\" operator (`|`) at the top level of the pattern.\n //\n\n\n return new RegExp(\"^(\".concat(leadingDigitsPattern, \")\")).test(leadingDigits);\n }\n }, {\n key: \"getFormatFormat\",\n value: function getFormatFormat(format, international) {\n return international ? format.internationalFormat() : format.format();\n }\n }, {\n key: \"chooseFormat\",\n value: function chooseFormat(state) {\n var _this3 = this;\n\n var _loop = function _loop() {\n var format = _step2.value;\n\n // If this format is currently being used\n // and is still suitable, then stick to it.\n if (_this3.chosenFormat === format) {\n return \"break\";\n } // Sometimes, a formatting rule inserts additional digits in a phone number,\n // and \"as you type\" formatter can't do that: it should only use the digits\n // that the user has input.\n //\n // For example, in Argentina, there's a format for mobile phone numbers:\n //\n // {\n // \"pattern\": \"(\\\\d)(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\n // \"leading_digits_patterns\": [\"91\"],\n // \"national_prefix_formatting_rule\": \"0$1\",\n // \"format\": \"$2 15-$3-$4\",\n // \"international_format\": \"$1 $2 $3-$4\"\n // }\n //\n // In that format, `international_format` is used instead of `format`\n // because `format` inserts `15` in the formatted number,\n // and `AsYouType` formatter should only use the digits\n // the user has actually input, without adding any extra digits.\n // In this case, it wouldn't make a difference, because the `15`\n // is first stripped when applying `national_prefix_for_parsing`\n // and then re-added when using `format`, so in reality it doesn't\n // add any new digits to the number, but to detect that, the code\n // would have to be more complex: it would have to try formatting\n // the digits using the format and then see if any digits have\n // actually been added or removed, and then, every time a new digit\n // is input, it should re-check whether the chosen format doesn't\n // alter the digits.\n //\n // Google's code doesn't go that far, and so does this library:\n // it simply requires that a `format` doesn't add any additonal\n // digits to user's input.\n //\n // Also, people in general should move from inputting phone numbers\n // in national format (possibly with national prefixes)\n // and use international phone number format instead:\n // it's a logical thing in the modern age of mobile phones,\n // globalization and the internet.\n //\n\n /* istanbul ignore if */\n\n\n if (!NON_ALTERING_FORMAT_REG_EXP.test(_this3.getFormatFormat(format, state.international))) {\n return \"continue\";\n }\n\n if (!_this3.createTemplateForFormat(format, state)) {\n // Remove the format if it can't generate a template.\n _this3.matchingFormats = _this3.matchingFormats.filter(function (_) {\n return _ !== format;\n });\n return \"continue\";\n }\n\n _this3.chosenFormat = format;\n return \"break\";\n };\n\n // When there are multiple available formats, the formatter uses the first\n // format where a formatting template could be created.\n //\n // For some weird reason, `istanbul` says \"else path not taken\"\n // for the `for of` line below. Supposedly that means that\n // the loop doesn't ever go over the last element in the list.\n // That's true because there always is `this.chosenFormat`\n // when `this.matchingFormats` is non-empty.\n // And, for some weird reason, it doesn't think that the case\n // with empty `this.matchingFormats` qualifies for a valid \"else\" path.\n // So simply muting this `istanbul` warning.\n // It doesn't skip the contents of the `for of` loop,\n // it just skips the `for of` line.\n //\n\n /* istanbul ignore next */\n for (var _iterator2 = _createForOfIteratorHelperLoose(this.matchingFormats.slice()), _step2; !(_step2 = _iterator2()).done;) {\n var _ret = _loop();\n\n if (_ret === \"break\") break;\n if (_ret === \"continue\") continue;\n }\n\n if (!this.chosenFormat) {\n // No format matches the national (significant) phone number.\n this.resetFormat();\n }\n\n return this.chosenFormat;\n }\n }, {\n key: \"createTemplateForFormat\",\n value: function createTemplateForFormat(format, state) {\n // The formatter doesn't format numbers when numberPattern contains '|', e.g.\n // (20|3)\\d{4}. In those cases we quickly return.\n // (Though there's no such format in current metadata)\n\n /* istanbul ignore if */\n if (SUPPORT_LEGACY_FORMATTING_PATTERNS && format.pattern().indexOf('|') >= 0) {\n return;\n } // Get formatting template for this phone number format\n\n\n var template = this.getTemplateForFormat(format, state); // If the national number entered is too long\n // for any phone number format, then abort.\n\n if (template) {\n this.setNationalNumberTemplate(template, state);\n return true;\n }\n }\n }, {\n key: \"getSeparatorAfterNationalPrefix\",\n value: function getSeparatorAfterNationalPrefix(format) {\n // `US` metadata doesn't have a `national_prefix_formatting_rule`,\n // so the `if` condition below doesn't apply to `US`,\n // but in reality there shoudl be a separator\n // between a national prefix and a national (significant) number.\n // So `US` national prefix separator is a \"special\" \"hardcoded\" case.\n if (this.isNANP) {\n return ' ';\n } // If a `format` has a `national_prefix_formatting_rule`\n // and that rule has a separator after a national prefix,\n // then it means that there should be a separator\n // between a national prefix and a national (significant) number.\n\n\n if (format && format.nationalPrefixFormattingRule() && NATIONAL_PREFIX_SEPARATORS_PATTERN.test(format.nationalPrefixFormattingRule())) {\n return ' ';\n } // At this point, there seems to be no clear evidence that\n // there should be a separator between a national prefix\n // and a national (significant) number. So don't insert one.\n\n\n return '';\n }\n }, {\n key: \"getInternationalPrefixBeforeCountryCallingCode\",\n value: function getInternationalPrefixBeforeCountryCallingCode(_ref3, options) {\n var IDDPrefix = _ref3.IDDPrefix,\n missingPlus = _ref3.missingPlus;\n\n if (IDDPrefix) {\n return options && options.spacing === false ? IDDPrefix : IDDPrefix + ' ';\n }\n\n if (missingPlus) {\n return '';\n }\n\n return '+';\n }\n }, {\n key: \"getTemplate\",\n value: function getTemplate(state) {\n if (!this.template) {\n return;\n } // `this.template` holds the template for a \"complete\" phone number.\n // The currently entered phone number is most likely not \"complete\",\n // so trim all non-populated digits.\n\n\n var index = -1;\n var i = 0;\n var internationalPrefix = state.international ? this.getInternationalPrefixBeforeCountryCallingCode(state, {\n spacing: false\n }) : '';\n\n while (i < internationalPrefix.length + state.getDigitsWithoutInternationalPrefix().length) {\n index = this.template.indexOf(_AsYouTypeFormatterUtil.DIGIT_PLACEHOLDER, index + 1);\n i++;\n }\n\n return (0, _AsYouTypeFormatterUtil.cutAndStripNonPairedParens)(this.template, index + 1);\n }\n }, {\n key: \"setNationalNumberTemplate\",\n value: function setNationalNumberTemplate(template, state) {\n this.nationalNumberTemplate = template;\n this.populatedNationalNumberTemplate = template; // With a new formatting template, the matched position\n // using the old template needs to be reset.\n\n this.populatedNationalNumberTemplatePosition = -1; // For convenience, the public `.template` property\n // contains the whole international number\n // if the phone number being input is international:\n // 'x' for the '+' sign, 'x'es for the country phone code,\n // a spacebar and then the template for the formatted national number.\n\n if (state.international) {\n this.template = this.getInternationalPrefixBeforeCountryCallingCode(state).replace(/[\\d\\+]/g, _AsYouTypeFormatterUtil.DIGIT_PLACEHOLDER) + (0, _AsYouTypeFormatterUtil.repeat)(_AsYouTypeFormatterUtil.DIGIT_PLACEHOLDER, state.callingCode.length) + ' ' + template;\n } else {\n this.template = template;\n }\n }\n /**\r\n * Generates formatting template for a national phone number,\r\n * optionally containing a national prefix, for a format.\r\n * @param {Format} format\r\n * @param {string} nationalPrefix\r\n * @return {string}\r\n */\n\n }, {\n key: \"getTemplateForFormat\",\n value: function getTemplateForFormat(format, _ref4) {\n var nationalSignificantNumber = _ref4.nationalSignificantNumber,\n international = _ref4.international,\n nationalPrefix = _ref4.nationalPrefix,\n complexPrefixBeforeNationalSignificantNumber = _ref4.complexPrefixBeforeNationalSignificantNumber;\n var pattern = format.pattern();\n /* istanbul ignore else */\n\n if (SUPPORT_LEGACY_FORMATTING_PATTERNS) {\n pattern = pattern // Replace anything in the form of [..] with \\d\n .replace(CREATE_CHARACTER_CLASS_PATTERN(), '\\\\d') // Replace any standalone digit (not the one in `{}`) with \\d\n .replace(CREATE_STANDALONE_DIGIT_PATTERN(), '\\\\d');\n } // Generate a dummy national number (consisting of `9`s)\n // that fits this format's `pattern`.\n //\n // This match will always succeed,\n // because the \"longest dummy phone number\"\n // has enough length to accomodate any possible\n // national phone number format pattern.\n //\n\n\n var digits = LONGEST_DUMMY_PHONE_NUMBER.match(pattern)[0]; // If the national number entered is too long\n // for any phone number format, then abort.\n\n if (nationalSignificantNumber.length > digits.length) {\n return;\n } // Get a formatting template which can be used to efficiently format\n // a partial number where digits are added one by one.\n // Below `strictPattern` is used for the\n // regular expression (with `^` and `$`).\n // This wasn't originally in Google's `libphonenumber`\n // and I guess they don't really need it\n // because they're not using \"templates\" to format phone numbers\n // but I added `strictPattern` after encountering\n // South Korean phone number formatting bug.\n //\n // Non-strict regular expression bug demonstration:\n //\n // this.nationalSignificantNumber : `111111111` (9 digits)\n //\n // pattern : (\\d{2})(\\d{3,4})(\\d{4})\n // format : `$1 $2 $3`\n // digits : `9999999999` (10 digits)\n //\n // '9999999999'.replace(new RegExp(/(\\d{2})(\\d{3,4})(\\d{4})/g), '$1 $2 $3') = \"99 9999 9999\"\n //\n // template : xx xxxx xxxx\n //\n // But the correct template in this case is `xx xxx xxxx`.\n // The template was generated incorrectly because of the\n // `{3,4}` variability in the `pattern`.\n //\n // The fix is, if `this.nationalSignificantNumber` has already sufficient length\n // to satisfy the `pattern` completely then `this.nationalSignificantNumber`\n // is used instead of `digits`.\n\n\n var strictPattern = new RegExp('^' + pattern + '$');\n var nationalNumberDummyDigits = nationalSignificantNumber.replace(/\\d/g, DUMMY_DIGIT); // If `this.nationalSignificantNumber` has already sufficient length\n // to satisfy the `pattern` completely then use it\n // instead of `digits`.\n\n if (strictPattern.test(nationalNumberDummyDigits)) {\n digits = nationalNumberDummyDigits;\n }\n\n var numberFormat = this.getFormatFormat(format, international);\n var nationalPrefixIncludedInTemplate; // If a user did input a national prefix (and that's guaranteed),\n // and if a `format` does have a national prefix formatting rule,\n // then see if that national prefix formatting rule\n // prepends exactly the same national prefix the user has input.\n // If that's the case, then use the `format` with the national prefix formatting rule.\n // Otherwise, use the `format` without the national prefix formatting rule,\n // and prepend a national prefix manually to it.\n\n if (this.shouldTryNationalPrefixFormattingRule(format, {\n international: international,\n nationalPrefix: nationalPrefix\n })) {\n var numberFormatWithNationalPrefix = numberFormat.replace(_formatNationalNumberUsingFormat.FIRST_GROUP_PATTERN, format.nationalPrefixFormattingRule()); // If `national_prefix_formatting_rule` of a `format` simply prepends\n // national prefix at the start of a national (significant) number,\n // then such formatting can be used with `AsYouType` formatter.\n // There seems to be no `else` case: everywhere in metadata,\n // national prefix formatting rule is national prefix + $1,\n // or `($1)`, in which case such format isn't even considered\n // when the user has input a national prefix.\n\n /* istanbul ignore else */\n\n if ((0, _parseDigits[\"default\"])(format.nationalPrefixFormattingRule()) === (nationalPrefix || '') + (0, _parseDigits[\"default\"])('$1')) {\n numberFormat = numberFormatWithNationalPrefix;\n nationalPrefixIncludedInTemplate = true; // Replace all digits of the national prefix in the formatting template\n // with `DIGIT_PLACEHOLDER`s.\n\n if (nationalPrefix) {\n var i = nationalPrefix.length;\n\n while (i > 0) {\n numberFormat = numberFormat.replace(/\\d/, _AsYouTypeFormatterUtil.DIGIT_PLACEHOLDER);\n i--;\n }\n }\n }\n } // Generate formatting template for this phone number format.\n\n\n var template = digits // Format the dummy phone number according to the format.\n .replace(new RegExp(pattern), numberFormat) // Replace each dummy digit with a DIGIT_PLACEHOLDER.\n .replace(new RegExp(DUMMY_DIGIT, 'g'), _AsYouTypeFormatterUtil.DIGIT_PLACEHOLDER); // If a prefix of a national (significant) number is not as simple\n // as just a basic national prefix, then just prepend such prefix\n // before the national (significant) number, optionally spacing\n // the two with a whitespace.\n\n if (!nationalPrefixIncludedInTemplate) {\n if (complexPrefixBeforeNationalSignificantNumber) {\n // Prepend the prefix to the template manually.\n template = (0, _AsYouTypeFormatterUtil.repeat)(_AsYouTypeFormatterUtil.DIGIT_PLACEHOLDER, complexPrefixBeforeNationalSignificantNumber.length) + ' ' + template;\n } else if (nationalPrefix) {\n // Prepend national prefix to the template manually.\n template = (0, _AsYouTypeFormatterUtil.repeat)(_AsYouTypeFormatterUtil.DIGIT_PLACEHOLDER, nationalPrefix.length) + this.getSeparatorAfterNationalPrefix(format) + template;\n }\n }\n\n if (international) {\n template = (0, _applyInternationalSeparatorStyle[\"default\"])(template);\n }\n\n return template;\n }\n }, {\n key: \"formatNextNationalNumberDigits\",\n value: function formatNextNationalNumberDigits(digits) {\n var result = (0, _AsYouTypeFormatterUtil.populateTemplateWithDigits)(this.populatedNationalNumberTemplate, this.populatedNationalNumberTemplatePosition, digits);\n\n if (!result) {\n // Reset the format.\n this.resetFormat();\n return;\n }\n\n this.populatedNationalNumberTemplate = result[0];\n this.populatedNationalNumberTemplatePosition = result[1]; // Return the formatted phone number so far.\n\n return (0, _AsYouTypeFormatterUtil.cutAndStripNonPairedParens)(this.populatedNationalNumberTemplate, this.populatedNationalNumberTemplatePosition + 1); // The old way which was good for `input-format` but is not so good\n // for `react-phone-number-input`'s default input (`InputBasic`).\n // return closeNonPairedParens(this.populatedNationalNumberTemplate, this.populatedNationalNumberTemplatePosition + 1)\n // \t.replace(new RegExp(DIGIT_PLACEHOLDER, 'g'), ' ')\n }\n }, {\n key: \"shouldTryNationalPrefixFormattingRule\",\n value: function shouldTryNationalPrefixFormattingRule(format, _ref5) {\n var international = _ref5.international,\n nationalPrefix = _ref5.nationalPrefix;\n\n if (format.nationalPrefixFormattingRule()) {\n // In some countries, `national_prefix_formatting_rule` is `($1)`,\n // so it applies even if the user hasn't input a national prefix.\n // `format.usesNationalPrefix()` detects such cases.\n var usesNationalPrefix = format.usesNationalPrefix();\n\n if (usesNationalPrefix && nationalPrefix || !usesNationalPrefix && !international) {\n return true;\n }\n }\n }\n }]);\n\n return AsYouTypeFormatter;\n}();\n\nexports[\"default\"] = AsYouTypeFormatter;\n//# sourceMappingURL=AsYouTypeFormatter.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.DIGIT_PLACEHOLDER = void 0;\nexports.closeNonPairedParens = closeNonPairedParens;\nexports.countOccurences = countOccurences;\nexports.cutAndStripNonPairedParens = cutAndStripNonPairedParens;\nexports.populateTemplateWithDigits = populateTemplateWithDigits;\nexports.repeat = repeat;\nexports.stripNonPairedParens = stripNonPairedParens;\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n// Should be the same as `DIGIT_PLACEHOLDER` in `libphonenumber-metadata-generator`.\nvar DIGIT_PLACEHOLDER = 'x'; // '\\u2008' (punctuation space)\n\nexports.DIGIT_PLACEHOLDER = DIGIT_PLACEHOLDER;\nvar DIGIT_PLACEHOLDER_MATCHER = new RegExp(DIGIT_PLACEHOLDER); // Counts all occurences of a symbol in a string.\n// Unicode-unsafe (because using `.split()`).\n\nfunction countOccurences(symbol, string) {\n var count = 0; // Using `.split('')` to iterate through a string here\n // to avoid requiring `Symbol.iterator` polyfill.\n // `.split('')` is generally not safe for Unicode,\n // but in this particular case for counting brackets it is safe.\n // for (const character of string)\n\n for (var _iterator = _createForOfIteratorHelperLoose(string.split('')), _step; !(_step = _iterator()).done;) {\n var character = _step.value;\n\n if (character === symbol) {\n count++;\n }\n }\n\n return count;\n} // Repeats a string (or a symbol) N times.\n// http://stackoverflow.com/questions/202605/repeat-string-javascript\n\n\nfunction repeat(string, times) {\n if (times < 1) {\n return '';\n }\n\n var result = '';\n\n while (times > 1) {\n if (times & 1) {\n result += string;\n }\n\n times >>= 1;\n string += string;\n }\n\n return result + string;\n}\n\nfunction cutAndStripNonPairedParens(string, cutBeforeIndex) {\n if (string[cutBeforeIndex] === ')') {\n cutBeforeIndex++;\n }\n\n return stripNonPairedParens(string.slice(0, cutBeforeIndex));\n}\n\nfunction closeNonPairedParens(template, cut_before) {\n var retained_template = template.slice(0, cut_before);\n var opening_braces = countOccurences('(', retained_template);\n var closing_braces = countOccurences(')', retained_template);\n var dangling_braces = opening_braces - closing_braces;\n\n while (dangling_braces > 0 && cut_before < template.length) {\n if (template[cut_before] === ')') {\n dangling_braces--;\n }\n\n cut_before++;\n }\n\n return template.slice(0, cut_before);\n}\n\nfunction stripNonPairedParens(string) {\n var dangling_braces = [];\n var i = 0;\n\n while (i < string.length) {\n if (string[i] === '(') {\n dangling_braces.push(i);\n } else if (string[i] === ')') {\n dangling_braces.pop();\n }\n\n i++;\n }\n\n var start = 0;\n var cleared_string = '';\n dangling_braces.push(string.length);\n\n for (var _i = 0, _dangling_braces = dangling_braces; _i < _dangling_braces.length; _i++) {\n var index = _dangling_braces[_i];\n cleared_string += string.slice(start, index);\n start = index + 1;\n }\n\n return cleared_string;\n}\n\nfunction populateTemplateWithDigits(template, position, digits) {\n // Using `.split('')` to iterate through a string here\n // to avoid requiring `Symbol.iterator` polyfill.\n // `.split('')` is generally not safe for Unicode,\n // but in this particular case for `digits` it is safe.\n // for (const digit of digits)\n for (var _iterator2 = _createForOfIteratorHelperLoose(digits.split('')), _step2; !(_step2 = _iterator2()).done;) {\n var digit = _step2.value;\n\n // If there is room for more digits in current `template`,\n // then set the next digit in the `template`,\n // and return the formatted digits so far.\n // If more digits are entered than the current format could handle.\n if (template.slice(position + 1).search(DIGIT_PLACEHOLDER_MATCHER) < 0) {\n return;\n }\n\n position = template.search(DIGIT_PLACEHOLDER_MATCHER);\n template = template.replace(DIGIT_PLACEHOLDER_MATCHER, digit);\n }\n\n return [template, position];\n}\n//# sourceMappingURL=AsYouTypeFormatter.util.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\nexports.extractFormattedDigitsAndPlus = extractFormattedDigitsAndPlus;\n\nvar _extractCountryCallingCode2 = _interopRequireDefault(require(\"./helpers/extractCountryCallingCode.js\"));\n\nvar _extractCountryCallingCodeFromInternationalNumberWithoutPlusSign = _interopRequireDefault(require(\"./helpers/extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js\"));\n\nvar _extractNationalNumberFromPossiblyIncompleteNumber = _interopRequireDefault(require(\"./helpers/extractNationalNumberFromPossiblyIncompleteNumber.js\"));\n\nvar _stripIddPrefix = _interopRequireDefault(require(\"./helpers/stripIddPrefix.js\"));\n\nvar _parseDigits = _interopRequireDefault(require(\"./helpers/parseDigits.js\"));\n\nvar _constants = require(\"./constants.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar VALID_FORMATTED_PHONE_NUMBER_DIGITS_PART = '[' + _constants.VALID_PUNCTUATION + _constants.VALID_DIGITS + ']+';\nvar VALID_FORMATTED_PHONE_NUMBER_DIGITS_PART_PATTERN = new RegExp('^' + VALID_FORMATTED_PHONE_NUMBER_DIGITS_PART + '$', 'i');\nvar VALID_FORMATTED_PHONE_NUMBER_PART = '(?:' + '[' + _constants.PLUS_CHARS + ']' + '[' + _constants.VALID_PUNCTUATION + _constants.VALID_DIGITS + ']*' + '|' + '[' + _constants.VALID_PUNCTUATION + _constants.VALID_DIGITS + ']+' + ')';\nvar AFTER_PHONE_NUMBER_DIGITS_END_PATTERN = new RegExp('[^' + _constants.VALID_PUNCTUATION + _constants.VALID_DIGITS + ']+' + '.*' + '$'); // Tests whether `national_prefix_for_parsing` could match\n// different national prefixes.\n// Matches anything that's not a digit or a square bracket.\n\nvar COMPLEX_NATIONAL_PREFIX = /[^\\d\\[\\]]/;\n\nvar AsYouTypeParser = /*#__PURE__*/function () {\n function AsYouTypeParser(_ref) {\n var defaultCountry = _ref.defaultCountry,\n defaultCallingCode = _ref.defaultCallingCode,\n metadata = _ref.metadata,\n onNationalSignificantNumberChange = _ref.onNationalSignificantNumberChange;\n\n _classCallCheck(this, AsYouTypeParser);\n\n this.defaultCountry = defaultCountry;\n this.defaultCallingCode = defaultCallingCode;\n this.metadata = metadata;\n this.onNationalSignificantNumberChange = onNationalSignificantNumberChange;\n }\n\n _createClass(AsYouTypeParser, [{\n key: \"input\",\n value: function input(text, state) {\n var _extractFormattedDigi = extractFormattedDigitsAndPlus(text),\n _extractFormattedDigi2 = _slicedToArray(_extractFormattedDigi, 2),\n formattedDigits = _extractFormattedDigi2[0],\n hasPlus = _extractFormattedDigi2[1];\n\n var digits = (0, _parseDigits[\"default\"])(formattedDigits); // Checks for a special case: just a leading `+` has been entered.\n\n var justLeadingPlus;\n\n if (hasPlus) {\n if (!state.digits) {\n state.startInternationalNumber();\n\n if (!digits) {\n justLeadingPlus = true;\n }\n }\n }\n\n if (digits) {\n this.inputDigits(digits, state);\n }\n\n return {\n digits: digits,\n justLeadingPlus: justLeadingPlus\n };\n }\n /**\r\n * Inputs \"next\" phone number digits.\r\n * @param {string} digits\r\n * @return {string} [formattedNumber] Formatted national phone number (if it can be formatted at this stage). Returning `undefined` means \"don't format the national phone number at this stage\".\r\n */\n\n }, {\n key: \"inputDigits\",\n value: function inputDigits(nextDigits, state) {\n var digits = state.digits;\n var hasReceivedThreeLeadingDigits = digits.length < 3 && digits.length + nextDigits.length >= 3; // Append phone number digits.\n\n state.appendDigits(nextDigits); // Attempt to extract IDD prefix:\n // Some users input their phone number in international format,\n // but in an \"out-of-country\" dialing format instead of using the leading `+`.\n // https://github.com/catamphetamine/libphonenumber-js/issues/185\n // Detect such numbers as soon as there're at least 3 digits.\n // Google's library attempts to extract IDD prefix at 3 digits,\n // so this library just copies that behavior.\n // I guess that's because the most commot IDD prefixes are\n // `00` (Europe) and `011` (US).\n // There exist really long IDD prefixes too:\n // for example, in Australia the default IDD prefix is `0011`,\n // and it could even be as long as `14880011`.\n // An IDD prefix is extracted here, and then every time when\n // there's a new digit and the number couldn't be formatted.\n\n if (hasReceivedThreeLeadingDigits) {\n this.extractIddPrefix(state);\n }\n\n if (this.isWaitingForCountryCallingCode(state)) {\n if (!this.extractCountryCallingCode(state)) {\n return;\n }\n } else {\n state.appendNationalSignificantNumberDigits(nextDigits);\n } // If a phone number is being input in international format,\n // then it's not valid for it to have a national prefix.\n // Still, some people incorrectly input such numbers with a national prefix.\n // In such cases, only attempt to strip a national prefix if the number becomes too long.\n // (but that is done later, not here)\n\n\n if (!state.international) {\n if (!this.hasExtractedNationalSignificantNumber) {\n this.extractNationalSignificantNumber(state.getNationalDigits(), function (stateUpdate) {\n return state.update(stateUpdate);\n });\n }\n }\n }\n }, {\n key: \"isWaitingForCountryCallingCode\",\n value: function isWaitingForCountryCallingCode(_ref2) {\n var international = _ref2.international,\n callingCode = _ref2.callingCode;\n return international && !callingCode;\n } // Extracts a country calling code from a number\n // being entered in internatonal format.\n\n }, {\n key: \"extractCountryCallingCode\",\n value: function extractCountryCallingCode(state) {\n var _extractCountryCallin = (0, _extractCountryCallingCode2[\"default\"])('+' + state.getDigitsWithoutInternationalPrefix(), this.defaultCountry, this.defaultCallingCode, this.metadata.metadata),\n countryCallingCode = _extractCountryCallin.countryCallingCode,\n number = _extractCountryCallin.number;\n\n if (countryCallingCode) {\n state.setCallingCode(countryCallingCode);\n state.update({\n nationalSignificantNumber: number\n });\n return true;\n }\n }\n }, {\n key: \"reset\",\n value: function reset(numberingPlan) {\n if (numberingPlan) {\n this.hasSelectedNumberingPlan = true;\n\n var nationalPrefixForParsing = numberingPlan._nationalPrefixForParsing();\n\n this.couldPossiblyExtractAnotherNationalSignificantNumber = nationalPrefixForParsing && COMPLEX_NATIONAL_PREFIX.test(nationalPrefixForParsing);\n } else {\n this.hasSelectedNumberingPlan = undefined;\n this.couldPossiblyExtractAnotherNationalSignificantNumber = undefined;\n }\n }\n /**\r\n * Extracts a national (significant) number from user input.\r\n * Google's library is different in that it only applies `national_prefix_for_parsing`\r\n * and doesn't apply `national_prefix_transform_rule` after that.\r\n * https://github.com/google/libphonenumber/blob/a3d70b0487875475e6ad659af404943211d26456/java/libphonenumber/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java#L539\r\n * @return {boolean} [extracted]\r\n */\n\n }, {\n key: \"extractNationalSignificantNumber\",\n value: function extractNationalSignificantNumber(nationalDigits, setState) {\n if (!this.hasSelectedNumberingPlan) {\n return;\n }\n\n var _extractNationalNumbe = (0, _extractNationalNumberFromPossiblyIncompleteNumber[\"default\"])(nationalDigits, this.metadata),\n nationalPrefix = _extractNationalNumbe.nationalPrefix,\n nationalNumber = _extractNationalNumbe.nationalNumber,\n carrierCode = _extractNationalNumbe.carrierCode;\n\n if (nationalNumber === nationalDigits) {\n return;\n }\n\n this.onExtractedNationalNumber(nationalPrefix, carrierCode, nationalNumber, nationalDigits, setState);\n return true;\n }\n /**\r\n * In Google's code this function is called \"attempt to extract longer NDD\".\r\n * \"Some national prefixes are a substring of others\", they say.\r\n * @return {boolean} [result] — Returns `true` if extracting a national prefix produced different results from what they were.\r\n */\n\n }, {\n key: \"extractAnotherNationalSignificantNumber\",\n value: function extractAnotherNationalSignificantNumber(nationalDigits, prevNationalSignificantNumber, setState) {\n if (!this.hasExtractedNationalSignificantNumber) {\n return this.extractNationalSignificantNumber(nationalDigits, setState);\n }\n\n if (!this.couldPossiblyExtractAnotherNationalSignificantNumber) {\n return;\n }\n\n var _extractNationalNumbe2 = (0, _extractNationalNumberFromPossiblyIncompleteNumber[\"default\"])(nationalDigits, this.metadata),\n nationalPrefix = _extractNationalNumbe2.nationalPrefix,\n nationalNumber = _extractNationalNumbe2.nationalNumber,\n carrierCode = _extractNationalNumbe2.carrierCode; // If a national prefix has been extracted previously,\n // then it's always extracted as additional digits are added.\n // That's assuming `extractNationalNumberFromPossiblyIncompleteNumber()`\n // doesn't do anything different from what it currently does.\n // So, just in case, here's this check, though it doesn't occur.\n\n /* istanbul ignore if */\n\n\n if (nationalNumber === prevNationalSignificantNumber) {\n return;\n }\n\n this.onExtractedNationalNumber(nationalPrefix, carrierCode, nationalNumber, nationalDigits, setState);\n return true;\n }\n }, {\n key: \"onExtractedNationalNumber\",\n value: function onExtractedNationalNumber(nationalPrefix, carrierCode, nationalSignificantNumber, nationalDigits, setState) {\n var complexPrefixBeforeNationalSignificantNumber;\n var nationalSignificantNumberMatchesInput; // This check also works with empty `this.nationalSignificantNumber`.\n\n var nationalSignificantNumberIndex = nationalDigits.lastIndexOf(nationalSignificantNumber); // If the extracted national (significant) number is the\n // last substring of the `digits`, then it means that it hasn't been altered:\n // no digits have been removed from the national (significant) number\n // while applying `national_prefix_transform_rule`.\n // https://gitlab.com/catamphetamine/libphonenumber-js/-/blob/master/METADATA.md#national_prefix_for_parsing--national_prefix_transform_rule\n\n if (nationalSignificantNumberIndex >= 0 && nationalSignificantNumberIndex === nationalDigits.length - nationalSignificantNumber.length) {\n nationalSignificantNumberMatchesInput = true; // If a prefix of a national (significant) number is not as simple\n // as just a basic national prefix, then such prefix is stored in\n // `this.complexPrefixBeforeNationalSignificantNumber` property and will be\n // prepended \"as is\" to the national (significant) number to produce\n // a formatted result.\n\n var prefixBeforeNationalNumber = nationalDigits.slice(0, nationalSignificantNumberIndex); // `prefixBeforeNationalNumber` is always non-empty,\n // because `onExtractedNationalNumber()` isn't called\n // when a national (significant) number hasn't been actually \"extracted\":\n // when a national (significant) number is equal to the national part of `digits`,\n // then `onExtractedNationalNumber()` doesn't get called.\n\n if (prefixBeforeNationalNumber !== nationalPrefix) {\n complexPrefixBeforeNationalSignificantNumber = prefixBeforeNationalNumber;\n }\n }\n\n setState({\n nationalPrefix: nationalPrefix,\n carrierCode: carrierCode,\n nationalSignificantNumber: nationalSignificantNumber,\n nationalSignificantNumberMatchesInput: nationalSignificantNumberMatchesInput,\n complexPrefixBeforeNationalSignificantNumber: complexPrefixBeforeNationalSignificantNumber\n }); // `onExtractedNationalNumber()` is only called when\n // the national (significant) number actually did change.\n\n this.hasExtractedNationalSignificantNumber = true;\n this.onNationalSignificantNumberChange();\n }\n }, {\n key: \"reExtractNationalSignificantNumber\",\n value: function reExtractNationalSignificantNumber(state) {\n // Attempt to extract a national prefix.\n //\n // Some people incorrectly input national prefix\n // in an international phone number.\n // For example, some people write British phone numbers as `+44(0)...`.\n //\n // Also, in some rare cases, it is valid for a national prefix\n // to be a part of an international phone number.\n // For example, mobile phone numbers in Mexico are supposed to be\n // dialled internationally using a `1` national prefix,\n // so the national prefix will be part of an international number.\n //\n // Quote from:\n // https://www.mexperience.com/dialing-cell-phones-in-mexico/\n //\n // \"Dialing a Mexican cell phone from abroad\n // When you are calling a cell phone number in Mexico from outside Mexico,\n // it’s necessary to dial an additional “1” after Mexico’s country code\n // (which is “52”) and before the area code.\n // You also ignore the 045, and simply dial the area code and the\n // cell phone’s number.\n //\n // If you don’t add the “1”, you’ll receive a recorded announcement\n // asking you to redial using it.\n //\n // For example, if you are calling from the USA to a cell phone\n // in Mexico City, you would dial +52 – 1 – 55 – 1234 5678.\n // (Note that this is different to calling a land line in Mexico City\n // from abroad, where the number dialed would be +52 – 55 – 1234 5678)\".\n //\n // Google's demo output:\n // https://libphonenumber.appspot.com/phonenumberparser?number=%2b5215512345678&country=MX\n //\n if (this.extractAnotherNationalSignificantNumber(state.getNationalDigits(), state.nationalSignificantNumber, function (stateUpdate) {\n return state.update(stateUpdate);\n })) {\n return true;\n } // If no format matches the phone number, then it could be\n // \"a really long IDD\" (quote from a comment in Google's library).\n // An IDD prefix is first extracted when the user has entered at least 3 digits,\n // and then here — every time when there's a new digit and the number\n // couldn't be formatted.\n // For example, in Australia the default IDD prefix is `0011`,\n // and it could even be as long as `14880011`.\n //\n // Could also check `!hasReceivedThreeLeadingDigits` here\n // to filter out the case when this check duplicates the one\n // already performed when there're 3 leading digits,\n // but it's not a big deal, and in most cases there\n // will be a suitable `format` when there're 3 leading digits.\n //\n\n\n if (this.extractIddPrefix(state)) {\n this.extractCallingCodeAndNationalSignificantNumber(state);\n return true;\n } // Google's AsYouType formatter supports sort of an \"autocorrection\" feature\n // when it \"autocorrects\" numbers that have been input for a country\n // with that country's calling code.\n // Such \"autocorrection\" feature looks weird, but different people have been requesting it:\n // https://github.com/catamphetamine/libphonenumber-js/issues/376\n // https://github.com/catamphetamine/libphonenumber-js/issues/375\n // https://github.com/catamphetamine/libphonenumber-js/issues/316\n\n\n if (this.fixMissingPlus(state)) {\n this.extractCallingCodeAndNationalSignificantNumber(state);\n return true;\n }\n }\n }, {\n key: \"extractIddPrefix\",\n value: function extractIddPrefix(state) {\n // An IDD prefix can't be present in a number written with a `+`.\n // Also, don't re-extract an IDD prefix if has already been extracted.\n var international = state.international,\n IDDPrefix = state.IDDPrefix,\n digits = state.digits,\n nationalSignificantNumber = state.nationalSignificantNumber;\n\n if (international || IDDPrefix) {\n return;\n } // Some users input their phone number in \"out-of-country\"\n // dialing format instead of using the leading `+`.\n // https://github.com/catamphetamine/libphonenumber-js/issues/185\n // Detect such numbers.\n\n\n var numberWithoutIDD = (0, _stripIddPrefix[\"default\"])(digits, this.defaultCountry, this.defaultCallingCode, this.metadata.metadata);\n\n if (numberWithoutIDD !== undefined && numberWithoutIDD !== digits) {\n // If an IDD prefix was stripped then convert the IDD-prefixed number\n // to international number for subsequent parsing.\n state.update({\n IDDPrefix: digits.slice(0, digits.length - numberWithoutIDD.length)\n });\n this.startInternationalNumber(state, {\n country: undefined,\n callingCode: undefined\n });\n return true;\n }\n }\n }, {\n key: \"fixMissingPlus\",\n value: function fixMissingPlus(state) {\n if (!state.international) {\n var _extractCountryCallin2 = (0, _extractCountryCallingCodeFromInternationalNumberWithoutPlusSign[\"default\"])(state.digits, this.defaultCountry, this.defaultCallingCode, this.metadata.metadata),\n newCallingCode = _extractCountryCallin2.countryCallingCode,\n number = _extractCountryCallin2.number;\n\n if (newCallingCode) {\n state.update({\n missingPlus: true\n });\n this.startInternationalNumber(state, {\n country: state.country,\n callingCode: newCallingCode\n });\n return true;\n }\n }\n }\n }, {\n key: \"startInternationalNumber\",\n value: function startInternationalNumber(state, _ref3) {\n var country = _ref3.country,\n callingCode = _ref3.callingCode;\n state.startInternationalNumber(country, callingCode); // If a national (significant) number has been extracted before, reset it.\n\n if (state.nationalSignificantNumber) {\n state.resetNationalSignificantNumber();\n this.onNationalSignificantNumberChange();\n this.hasExtractedNationalSignificantNumber = undefined;\n }\n }\n }, {\n key: \"extractCallingCodeAndNationalSignificantNumber\",\n value: function extractCallingCodeAndNationalSignificantNumber(state) {\n if (this.extractCountryCallingCode(state)) {\n // `this.extractCallingCode()` is currently called when the number\n // couldn't be formatted during the standard procedure.\n // Normally, the national prefix would be re-extracted\n // for an international number if such number couldn't be formatted,\n // but since it's already not able to be formatted,\n // there won't be yet another retry, so also extract national prefix here.\n this.extractNationalSignificantNumber(state.getNationalDigits(), function (stateUpdate) {\n return state.update(stateUpdate);\n });\n }\n }\n }]);\n\n return AsYouTypeParser;\n}();\n/**\r\n * Extracts formatted phone number from text (if there's any).\r\n * @param {string} text\r\n * @return {string} [formattedPhoneNumber]\r\n */\n\n\nexports[\"default\"] = AsYouTypeParser;\n\nfunction extractFormattedPhoneNumber(text) {\n // Attempt to extract a possible number from the string passed in.\n var startsAt = text.search(VALID_FORMATTED_PHONE_NUMBER_PART);\n\n if (startsAt < 0) {\n return;\n } // Trim everything to the left of the phone number.\n\n\n text = text.slice(startsAt); // Trim the `+`.\n\n var hasPlus;\n\n if (text[0] === '+') {\n hasPlus = true;\n text = text.slice('+'.length);\n } // Trim everything to the right of the phone number.\n\n\n text = text.replace(AFTER_PHONE_NUMBER_DIGITS_END_PATTERN, ''); // Re-add the previously trimmed `+`.\n\n if (hasPlus) {\n text = '+' + text;\n }\n\n return text;\n}\n/**\r\n * Extracts formatted phone number digits (and a `+`) from text (if there're any).\r\n * @param {string} text\r\n * @return {any[]}\r\n */\n\n\nfunction _extractFormattedDigitsAndPlus(text) {\n // Extract a formatted phone number part from text.\n var extractedNumber = extractFormattedPhoneNumber(text) || ''; // Trim a `+`.\n\n if (extractedNumber[0] === '+') {\n return [extractedNumber.slice('+'.length), true];\n }\n\n return [extractedNumber];\n}\n/**\r\n * Extracts formatted phone number digits (and a `+`) from text (if there're any).\r\n * @param {string} text\r\n * @return {any[]}\r\n */\n\n\nfunction extractFormattedDigitsAndPlus(text) {\n var _extractFormattedDigi3 = _extractFormattedDigitsAndPlus(text),\n _extractFormattedDigi4 = _slicedToArray(_extractFormattedDigi3, 2),\n formattedDigits = _extractFormattedDigi4[0],\n hasPlus = _extractFormattedDigi4[1]; // If the extracted phone number part\n // can possibly be a part of some valid phone number\n // then parse phone number characters from a formatted phone number.\n\n\n if (!VALID_FORMATTED_PHONE_NUMBER_DIGITS_PART_PATTERN.test(formattedDigits)) {\n formattedDigits = '';\n }\n\n return [formattedDigits, hasPlus];\n}\n//# sourceMappingURL=AsYouTypeParser.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar AsYouTypeState = /*#__PURE__*/function () {\n function AsYouTypeState(_ref) {\n var onCountryChange = _ref.onCountryChange,\n onCallingCodeChange = _ref.onCallingCodeChange;\n\n _classCallCheck(this, AsYouTypeState);\n\n this.onCountryChange = onCountryChange;\n this.onCallingCodeChange = onCallingCodeChange;\n }\n\n _createClass(AsYouTypeState, [{\n key: \"reset\",\n value: function reset(_ref2) {\n var country = _ref2.country,\n callingCode = _ref2.callingCode;\n this.international = false;\n this.IDDPrefix = undefined;\n this.missingPlus = undefined;\n this.callingCode = undefined;\n this.digits = '';\n this.resetNationalSignificantNumber();\n this.initCountryAndCallingCode(country, callingCode);\n }\n }, {\n key: \"resetNationalSignificantNumber\",\n value: function resetNationalSignificantNumber() {\n this.nationalSignificantNumber = this.getNationalDigits();\n this.nationalSignificantNumberMatchesInput = true;\n this.nationalPrefix = undefined;\n this.carrierCode = undefined;\n this.complexPrefixBeforeNationalSignificantNumber = undefined;\n }\n }, {\n key: \"update\",\n value: function update(properties) {\n for (var _i = 0, _Object$keys = Object.keys(properties); _i < _Object$keys.length; _i++) {\n var key = _Object$keys[_i];\n this[key] = properties[key];\n }\n }\n }, {\n key: \"initCountryAndCallingCode\",\n value: function initCountryAndCallingCode(country, callingCode) {\n this.setCountry(country);\n this.setCallingCode(callingCode);\n }\n }, {\n key: \"setCountry\",\n value: function setCountry(country) {\n this.country = country;\n this.onCountryChange(country);\n }\n }, {\n key: \"setCallingCode\",\n value: function setCallingCode(callingCode) {\n this.callingCode = callingCode;\n this.onCallingCodeChange(callingCode, this.country);\n }\n }, {\n key: \"startInternationalNumber\",\n value: function startInternationalNumber(country, callingCode) {\n // Prepend the `+` to parsed input.\n this.international = true; // If a default country was set then reset it\n // because an explicitly international phone\n // number is being entered.\n\n this.initCountryAndCallingCode(country, callingCode);\n }\n }, {\n key: \"appendDigits\",\n value: function appendDigits(nextDigits) {\n this.digits += nextDigits;\n }\n }, {\n key: \"appendNationalSignificantNumberDigits\",\n value: function appendNationalSignificantNumberDigits(nextDigits) {\n this.nationalSignificantNumber += nextDigits;\n }\n /**\r\n * Returns the part of `this.digits` that corresponds to the national number.\r\n * Basically, all digits that have been input by the user, except for the\r\n * international prefix and the country calling code part\r\n * (if the number is an international one).\r\n * @return {string}\r\n */\n\n }, {\n key: \"getNationalDigits\",\n value: function getNationalDigits() {\n if (this.international) {\n return this.digits.slice((this.IDDPrefix ? this.IDDPrefix.length : 0) + (this.callingCode ? this.callingCode.length : 0));\n }\n\n return this.digits;\n }\n }, {\n key: \"getDigitsWithoutInternationalPrefix\",\n value: function getDigitsWithoutInternationalPrefix() {\n if (this.international) {\n if (this.IDDPrefix) {\n return this.digits.slice(this.IDDPrefix.length);\n }\n }\n\n return this.digits;\n }\n }]);\n\n return AsYouTypeState;\n}();\n\nexports[\"default\"] = AsYouTypeState;\n//# sourceMappingURL=AsYouTypeState.js.map","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _wrapNativeSuper(Class) { var _cache = typeof Map === \"function\" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== \"function\") { throw new TypeError(\"Super expression must either be null or a function\"); } if (typeof _cache !== \"undefined\") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }\n\nfunction _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _isNativeFunction(fn) { return Function.toString.call(fn).indexOf(\"[native code]\") !== -1; }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n// https://stackoverflow.com/a/46971044/970769\n// \"Breaking changes in Typescript 2.1\"\n// \"Extending built-ins like Error, Array, and Map may no longer work.\"\n// \"As a recommendation, you can manually adjust the prototype immediately after any super(...) calls.\"\n// https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\nvar ParseError = /*#__PURE__*/function (_Error) {\n _inherits(ParseError, _Error);\n\n var _super = _createSuper(ParseError);\n\n function ParseError(code) {\n var _this;\n\n _classCallCheck(this, ParseError);\n\n _this = _super.call(this, code); // Set the prototype explicitly.\n // Any subclass of FooError will have to manually set the prototype as well.\n\n Object.setPrototypeOf(_assertThisInitialized(_this), ParseError.prototype);\n _this.name = _this.constructor.name;\n return _this;\n }\n\n return _createClass(ParseError);\n}( /*#__PURE__*/_wrapNativeSuper(Error));\n\nexports[\"default\"] = ParseError;\n//# sourceMappingURL=ParseError.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _metadata = _interopRequireDefault(require(\"./metadata.js\"));\n\nvar _isPossible = _interopRequireDefault(require(\"./isPossible.js\"));\n\nvar _isValid = _interopRequireDefault(require(\"./isValid.js\"));\n\nvar _getNumberType = _interopRequireDefault(require(\"./helpers/getNumberType.js\"));\n\nvar _getPossibleCountriesForNumber = _interopRequireDefault(require(\"./helpers/getPossibleCountriesForNumber.js\"));\n\nvar _format2 = _interopRequireDefault(require(\"./format.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false;\n\nvar PhoneNumber = /*#__PURE__*/function () {\n /**\r\n * @param {string} countryOrCountryCallingCode\r\n * @param {string} nationalNumber\r\n * @param {object} metadata — Metadata JSON\r\n * @return {PhoneNumber}\r\n */\n function PhoneNumber(countryOrCountryCallingCode, nationalNumber, metadata) {\n _classCallCheck(this, PhoneNumber);\n\n if (!countryOrCountryCallingCode) {\n throw new TypeError('`country` or `countryCallingCode` not passed');\n }\n\n if (!nationalNumber) {\n throw new TypeError('`nationalNumber` not passed');\n }\n\n if (!metadata) {\n throw new TypeError('`metadata` not passed');\n }\n\n var _getCountryAndCountry = getCountryAndCountryCallingCode(countryOrCountryCallingCode, metadata),\n country = _getCountryAndCountry.country,\n countryCallingCode = _getCountryAndCountry.countryCallingCode;\n\n this.country = country;\n this.countryCallingCode = countryCallingCode;\n this.nationalNumber = nationalNumber;\n this.number = '+' + this.countryCallingCode + this.nationalNumber;\n this.metadata = metadata;\n }\n\n _createClass(PhoneNumber, [{\n key: \"setExt\",\n value: function setExt(ext) {\n this.ext = ext;\n }\n }, {\n key: \"getPossibleCountries\",\n value: function getPossibleCountries() {\n if (this.country) {\n return [this.country];\n }\n\n return (0, _getPossibleCountriesForNumber[\"default\"])(this.countryCallingCode, this.nationalNumber, this.metadata);\n }\n }, {\n key: \"isPossible\",\n value: function isPossible() {\n return (0, _isPossible[\"default\"])(this, {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"isValid\",\n value: function isValid() {\n return (0, _isValid[\"default\"])(this, {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"isNonGeographic\",\n value: function isNonGeographic() {\n var metadata = new _metadata[\"default\"](this.metadata);\n return metadata.isNonGeographicCallingCode(this.countryCallingCode);\n }\n }, {\n key: \"isEqual\",\n value: function isEqual(phoneNumber) {\n return this.number === phoneNumber.number && this.ext === phoneNumber.ext;\n } // This function was originally meant to be an equivalent for `validatePhoneNumberLength()`,\n // but later it was found out that it doesn't include the possible `TOO_SHORT` result\n // returned from `parsePhoneNumberWithError()` in the original `validatePhoneNumberLength()`,\n // so eventually I simply commented out this method from the `PhoneNumber` class\n // and just left the `validatePhoneNumberLength()` function, even though that one would require\n // and additional step to also validate the actual country / calling code of the phone number.\n // validateLength() {\n // \tconst metadata = new Metadata(this.metadata)\n // \tmetadata.selectNumberingPlan(this.countryCallingCode)\n // \tconst result = checkNumberLength(this.nationalNumber, metadata)\n // \tif (result !== 'IS_POSSIBLE') {\n // \t\treturn result\n // \t}\n // }\n\n }, {\n key: \"getType\",\n value: function getType() {\n return (0, _getNumberType[\"default\"])(this, {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"format\",\n value: function format(_format, options) {\n return (0, _format2[\"default\"])(this, _format, options ? _objectSpread(_objectSpread({}, options), {}, {\n v2: true\n }) : {\n v2: true\n }, this.metadata);\n }\n }, {\n key: \"formatNational\",\n value: function formatNational(options) {\n return this.format('NATIONAL', options);\n }\n }, {\n key: \"formatInternational\",\n value: function formatInternational(options) {\n return this.format('INTERNATIONAL', options);\n }\n }, {\n key: \"getURI\",\n value: function getURI(options) {\n return this.format('RFC3966', options);\n }\n }]);\n\n return PhoneNumber;\n}();\n\nexports[\"default\"] = PhoneNumber;\n\nvar isCountryCode = function isCountryCode(value) {\n return /^[A-Z]{2}$/.test(value);\n};\n\nfunction getCountryAndCountryCallingCode(countryOrCountryCallingCode, metadataJson) {\n var country;\n var countryCallingCode;\n var metadata = new _metadata[\"default\"](metadataJson); // If country code is passed then derive `countryCallingCode` from it.\n // Also store the country code as `.country`.\n\n if (isCountryCode(countryOrCountryCallingCode)) {\n country = countryOrCountryCallingCode;\n metadata.selectNumberingPlan(country);\n countryCallingCode = metadata.countryCallingCode();\n } else {\n countryCallingCode = countryOrCountryCallingCode;\n /* istanbul ignore if */\n\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (metadata.isNonGeographicCallingCode(countryCallingCode)) {\n country = '001';\n }\n }\n }\n\n return {\n country: country,\n countryCallingCode: countryCallingCode\n };\n}\n//# sourceMappingURL=PhoneNumber.js.map","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _PhoneNumber = _interopRequireDefault(require(\"./PhoneNumber.js\"));\n\nvar _constants = require(\"./constants.js\");\n\nvar _createExtensionPattern = _interopRequireDefault(require(\"./helpers/extension/createExtensionPattern.js\"));\n\nvar _RegExpCache = _interopRequireDefault(require(\"./findNumbers/RegExpCache.js\"));\n\nvar _util = require(\"./findNumbers/util.js\");\n\nvar _utf = require(\"./findNumbers/utf-8.js\");\n\nvar _Leniency = _interopRequireDefault(require(\"./findNumbers/Leniency.js\"));\n\nvar _parsePreCandidate = _interopRequireDefault(require(\"./findNumbers/parsePreCandidate.js\"));\n\nvar _isValidPreCandidate = _interopRequireDefault(require(\"./findNumbers/isValidPreCandidate.js\"));\n\nvar _isValidCandidate = _interopRequireWildcard(require(\"./findNumbers/isValidCandidate.js\"));\n\nvar _metadata = require(\"./metadata.js\");\n\nvar _parsePhoneNumber = _interopRequireDefault(require(\"./parsePhoneNumber.js\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false;\nvar EXTN_PATTERNS_FOR_MATCHING = (0, _createExtensionPattern[\"default\"])('matching');\n/**\r\n * Patterns used to extract phone numbers from a larger phone-number-like pattern. These are\r\n * ordered according to specificity. For example, white-space is last since that is frequently\r\n * used in numbers, not just to separate two numbers. We have separate patterns since we don't\r\n * want to break up the phone-number-like text on more than one different kind of symbol at one\r\n * time, although symbols of the same type (e.g. space) can be safely grouped together.\r\n *\r\n * Note that if there is a match, we will always check any text found up to the first match as\r\n * well.\r\n */\n\nvar INNER_MATCHES = [// Breaks on the slash - e.g. \"651-234-2345/332-445-1234\"\n'\\\\/+(.*)/', // Note that the bracket here is inside the capturing group, since we consider it part of the\n// phone number. Will match a pattern like \"(650) 223 3345 (754) 223 3321\".\n'(\\\\([^(]*)', // Breaks on a hyphen - e.g. \"12345 - 332-445-1234 is my number.\"\n// We require a space on either side of the hyphen for it to be considered a separator.\n\"(?:\".concat(_utf.pZ, \"-|-\").concat(_utf.pZ, \")\").concat(_utf.pZ, \"*(.+)\"), // Various types of wide hyphens. Note we have decided not to enforce a space here, since it's\n// possible that it's supposed to be used to break two numbers without spaces, and we haven't\n// seen many instances of it used within a number.\n\"[\\u2012-\\u2015\\uFF0D]\".concat(_utf.pZ, \"*(.+)\"), // Breaks on a full stop - e.g. \"12345. 332-445-1234 is my number.\"\n\"\\\\.+\".concat(_utf.pZ, \"*([^.]+)\"), // Breaks on space - e.g. \"3324451234 8002341234\"\n\"\".concat(_utf.pZ, \"+(\").concat(_utf.PZ, \"+)\")]; // Limit on the number of leading (plus) characters.\n\nvar leadLimit = (0, _util.limit)(0, 2); // Limit on the number of consecutive punctuation characters.\n\nvar punctuationLimit = (0, _util.limit)(0, 4);\n/* The maximum number of digits allowed in a digit-separated block. As we allow all digits in a\r\n * single block, set high enough to accommodate the entire national number and the international\r\n * country code. */\n\nvar digitBlockLimit = _constants.MAX_LENGTH_FOR_NSN + _constants.MAX_LENGTH_COUNTRY_CODE; // Limit on the number of blocks separated by punctuation.\n// Uses digitBlockLimit since some formats use spaces to separate each digit.\n\nvar blockLimit = (0, _util.limit)(0, digitBlockLimit);\n/* A punctuation sequence allowing white space. */\n\nvar punctuation = \"[\".concat(_constants.VALID_PUNCTUATION, \"]\") + punctuationLimit; // A digits block without punctuation.\n\nvar digitSequence = _utf.pNd + (0, _util.limit)(1, digitBlockLimit);\n/**\r\n * Phone number pattern allowing optional punctuation.\r\n * The phone number pattern used by `find()`, similar to\r\n * VALID_PHONE_NUMBER, but with the following differences:\r\n *
    \r\n *
  • All captures are limited in order to place an upper bound to the text matched by the\r\n * pattern.\r\n *
      \r\n *
    • Leading punctuation / plus signs are limited.\r\n *
    • Consecutive occurrences of punctuation are limited.\r\n *
    • Number of digits is limited.\r\n *
    \r\n *
  • No whitespace is allowed at the start or end.\r\n *
  • No alpha digits (vanity numbers such as 1-800-SIX-FLAGS) are currently supported.\r\n *
\r\n */\n\nvar PATTERN = '(?:' + _isValidCandidate.LEAD_CLASS + punctuation + ')' + leadLimit + digitSequence + '(?:' + punctuation + digitSequence + ')' + blockLimit + '(?:' + EXTN_PATTERNS_FOR_MATCHING + ')?'; // Regular expression of trailing characters that we want to remove.\n// We remove all characters that are not alpha or numerical characters.\n// The hash character is retained here, as it may signify\n// the previous block was an extension.\n//\n// // Don't know what does '&&' mean here.\n// const UNWANTED_END_CHAR_PATTERN = new RegExp(`[[\\\\P{N}&&\\\\P{L}]&&[^#]]+$`)\n//\n\nvar UNWANTED_END_CHAR_PATTERN = new RegExp(\"[^\".concat(_utf._pN).concat(_utf._pL, \"#]+$\"));\nvar NON_DIGITS_PATTERN = /(\\D+)/;\nvar MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;\n/**\r\n * A stateful class that finds and extracts telephone numbers from {@linkplain CharSequence text}.\r\n * Instances can be created using the {@linkplain PhoneNumberUtil#findNumbers factory methods} in\r\n * {@link PhoneNumberUtil}.\r\n *\r\n *

Vanity numbers (phone numbers using alphabetic digits such as 1-800-SIX-FLAGS are\r\n * not found.\r\n *\r\n *

This class is not thread-safe.\r\n */\n\nvar PhoneNumberMatcher = /*#__PURE__*/function () {\n /**\r\n * @param {string} text — the character sequence that we will search, null for no text.\r\n * @param {'POSSIBLE'|'VALID'|'STRICT_GROUPING'|'EXACT_GROUPING'} [options.leniency] — The leniency to use when evaluating candidate phone numbers. See `source/findNumbers/Leniency.js` for more details.\r\n * @param {number} [options.maxTries] — The maximum number of invalid numbers to try before giving up on the text. This is to cover degenerate cases where the text has a lot of false positives in it. Must be >= 0.\r\n */\n function PhoneNumberMatcher() {\n var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var metadata = arguments.length > 2 ? arguments[2] : undefined;\n\n _classCallCheck(this, PhoneNumberMatcher);\n\n options = {\n v2: options.v2,\n defaultCallingCode: options.defaultCallingCode,\n defaultCountry: options.defaultCountry && (0, _metadata.isSupportedCountry)(options.defaultCountry, metadata) ? options.defaultCountry : undefined,\n leniency: options.leniency || (options.extended ? 'POSSIBLE' : 'VALID'),\n maxTries: options.maxTries || MAX_SAFE_INTEGER\n }; // Validate `leniency`.\n\n if (!options.leniency) {\n throw new TypeError('`leniency` is required');\n }\n\n if (options.leniency !== 'POSSIBLE' && options.leniency !== 'VALID') {\n throw new TypeError(\"Invalid `leniency`: \\\"\".concat(options.leniency, \"\\\". Supported values: \\\"POSSIBLE\\\", \\\"VALID\\\".\"));\n } // Validate `maxTries`.\n\n\n if (options.maxTries < 0) {\n throw new TypeError('`maxTries` must be `>= 0`');\n }\n\n this.text = text;\n this.options = options;\n this.metadata = metadata; // The degree of phone number validation.\n\n this.leniency = _Leniency[\"default\"][options.leniency];\n\n if (!this.leniency) {\n throw new TypeError(\"Unknown leniency: \\\"\".concat(options.leniency, \"\\\"\"));\n }\n /** The maximum number of retries after matching an invalid number. */\n\n\n this.maxTries = options.maxTries;\n this.PATTERN = new RegExp(PATTERN, 'ig');\n /** The iteration tristate. */\n\n this.state = 'NOT_READY';\n /** The next index to start searching at. Undefined in {@link State#DONE}. */\n\n this.searchIndex = 0; // A cache for frequently used country-specific regular expressions. Set to 32 to cover ~2-3\n // countries being used for the same doc with ~10 patterns for each country. Some pages will have\n // a lot more countries in use, but typically fewer numbers for each so expanding the cache for\n // that use-case won't have a lot of benefit.\n\n this.regExpCache = new _RegExpCache[\"default\"](32);\n }\n /**\r\n * Attempts to find the next subsequence in the searched sequence on or after {@code searchIndex}\r\n * that represents a phone number. Returns the next match, null if none was found.\r\n *\r\n * @param index the search index to start searching at\r\n * @return the phone number match found, null if none can be found\r\n */\n\n\n _createClass(PhoneNumberMatcher, [{\n key: \"find\",\n value: function find() {\n // // Reset the regular expression.\n // this.PATTERN.lastIndex = index\n var matches;\n\n while (this.maxTries > 0 && (matches = this.PATTERN.exec(this.text)) !== null) {\n var candidate = matches[0];\n var offset = matches.index;\n candidate = (0, _parsePreCandidate[\"default\"])(candidate);\n\n if ((0, _isValidPreCandidate[\"default\"])(candidate, offset, this.text)) {\n var match = // Try to come up with a valid match given the entire candidate.\n this.parseAndVerify(candidate, offset, this.text) // If that failed, try to find an \"inner match\" -\n // there might be a phone number within this candidate.\n || this.extractInnerMatch(candidate, offset, this.text);\n\n if (match) {\n if (this.options.v2) {\n return {\n startsAt: match.startsAt,\n endsAt: match.endsAt,\n number: match.phoneNumber\n };\n } else {\n var phoneNumber = match.phoneNumber;\n var result = {\n startsAt: match.startsAt,\n endsAt: match.endsAt,\n phone: phoneNumber.nationalNumber\n };\n\n if (phoneNumber.country) {\n /* istanbul ignore if */\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE && country === '001') {\n result.countryCallingCode = phoneNumber.countryCallingCode;\n } else {\n result.country = phoneNumber.country;\n }\n } else {\n result.countryCallingCode = phoneNumber.countryCallingCode;\n }\n\n if (phoneNumber.ext) {\n result.ext = phoneNumber.ext;\n }\n\n return result;\n }\n }\n }\n\n this.maxTries--;\n }\n }\n /**\r\n * Attempts to extract a match from `substring`\r\n * if the substring itself does not qualify as a match.\r\n */\n\n }, {\n key: \"extractInnerMatch\",\n value: function extractInnerMatch(substring, offset, text) {\n for (var _iterator = _createForOfIteratorHelperLoose(INNER_MATCHES), _step; !(_step = _iterator()).done;) {\n var innerMatchPattern = _step.value;\n var isFirstMatch = true;\n var candidateMatch = void 0;\n var innerMatchRegExp = new RegExp(innerMatchPattern, 'g');\n\n while (this.maxTries > 0 && (candidateMatch = innerMatchRegExp.exec(substring)) !== null) {\n if (isFirstMatch) {\n // We should handle any group before this one too.\n var _candidate = (0, _util.trimAfterFirstMatch)(UNWANTED_END_CHAR_PATTERN, substring.slice(0, candidateMatch.index));\n\n var _match = this.parseAndVerify(_candidate, offset, text);\n\n if (_match) {\n return _match;\n }\n\n this.maxTries--;\n isFirstMatch = false;\n }\n\n var candidate = (0, _util.trimAfterFirstMatch)(UNWANTED_END_CHAR_PATTERN, candidateMatch[1]); // Java code does `groupMatcher.start(1)` here,\n // but there's no way in javascript to get a `candidate` start index,\n // therefore resort to using this kind of an approximation.\n // (`groupMatcher` is called `candidateInSubstringMatch` in this javascript port)\n // https://stackoverflow.com/questions/15934353/get-index-of-each-capture-in-a-javascript-regex\n\n var candidateIndexGuess = substring.indexOf(candidate, candidateMatch.index);\n var match = this.parseAndVerify(candidate, offset + candidateIndexGuess, text);\n\n if (match) {\n return match;\n }\n\n this.maxTries--;\n }\n }\n }\n /**\r\n * Parses a phone number from the `candidate` using `parse` and\r\n * verifies it matches the requested `leniency`. If parsing and verification succeed,\r\n * a corresponding `PhoneNumberMatch` is returned, otherwise this method returns `null`.\r\n *\r\n * @param candidate the candidate match\r\n * @param offset the offset of {@code candidate} within {@link #text}\r\n * @return the parsed and validated phone number match, or null\r\n */\n\n }, {\n key: \"parseAndVerify\",\n value: function parseAndVerify(candidate, offset, text) {\n if (!(0, _isValidCandidate[\"default\"])(candidate, offset, text, this.options.leniency)) {\n return;\n }\n\n var phoneNumber = (0, _parsePhoneNumber[\"default\"])(candidate, {\n extended: true,\n defaultCountry: this.options.defaultCountry,\n defaultCallingCode: this.options.defaultCallingCode\n }, this.metadata);\n\n if (!phoneNumber) {\n return;\n }\n\n if (!phoneNumber.isPossible()) {\n return;\n }\n\n if (this.leniency(phoneNumber, candidate, this.metadata, this.regExpCache)) {\n return {\n startsAt: offset,\n endsAt: offset + candidate.length,\n phoneNumber: phoneNumber\n };\n }\n }\n }, {\n key: \"hasNext\",\n value: function hasNext() {\n if (this.state === 'NOT_READY') {\n this.lastMatch = this.find(); // (this.searchIndex)\n\n if (this.lastMatch) {\n // this.searchIndex = this.lastMatch.endsAt\n this.state = 'READY';\n } else {\n this.state = 'DONE';\n }\n }\n\n return this.state === 'READY';\n }\n }, {\n key: \"next\",\n value: function next() {\n // Check the state and find the next match as a side-effect if necessary.\n if (!this.hasNext()) {\n throw new Error('No next element');\n } // Don't retain that memory any longer than necessary.\n\n\n var result = this.lastMatch;\n this.lastMatch = null;\n this.state = 'NOT_READY';\n return result;\n }\n }]);\n\n return PhoneNumberMatcher;\n}();\n\nexports[\"default\"] = PhoneNumberMatcher;\n//# sourceMappingURL=PhoneNumberMatcher.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.WHITESPACE = exports.VALID_PUNCTUATION = exports.VALID_DIGITS = exports.PLUS_CHARS = exports.MIN_LENGTH_FOR_NSN = exports.MAX_LENGTH_FOR_NSN = exports.MAX_LENGTH_COUNTRY_CODE = void 0;\n// The minimum length of the national significant number.\nvar MIN_LENGTH_FOR_NSN = 2; // The ITU says the maximum length should be 15,\n// but one can find longer numbers in Germany.\n\nexports.MIN_LENGTH_FOR_NSN = MIN_LENGTH_FOR_NSN;\nvar MAX_LENGTH_FOR_NSN = 17; // The maximum length of the country calling code.\n\nexports.MAX_LENGTH_FOR_NSN = MAX_LENGTH_FOR_NSN;\nvar MAX_LENGTH_COUNTRY_CODE = 3; // Digits accepted in phone numbers\n// (ascii, fullwidth, arabic-indic, and eastern arabic digits).\n\nexports.MAX_LENGTH_COUNTRY_CODE = MAX_LENGTH_COUNTRY_CODE;\nvar VALID_DIGITS = \"0-9\\uFF10-\\uFF19\\u0660-\\u0669\\u06F0-\\u06F9\"; // `DASHES` will be right after the opening square bracket of the \"character class\"\n\nexports.VALID_DIGITS = VALID_DIGITS;\nvar DASHES = \"-\\u2010-\\u2015\\u2212\\u30FC\\uFF0D\";\nvar SLASHES = \"\\uFF0F/\";\nvar DOTS = \"\\uFF0E.\";\nvar WHITESPACE = \" \\xA0\\xAD\\u200B\\u2060\\u3000\";\nexports.WHITESPACE = WHITESPACE;\nvar BRACKETS = \"()\\uFF08\\uFF09\\uFF3B\\uFF3D\\\\[\\\\]\"; // export const OPENING_BRACKETS = '(\\uFF08\\uFF3B\\\\\\['\n\nvar TILDES = \"~\\u2053\\u223C\\uFF5E\"; // Regular expression of acceptable punctuation found in phone numbers. This\n// excludes punctuation found as a leading character only. This consists of dash\n// characters, white space characters, full stops, slashes, square brackets,\n// parentheses and tildes. Full-width variants are also present.\n\nvar VALID_PUNCTUATION = \"\".concat(DASHES).concat(SLASHES).concat(DOTS).concat(WHITESPACE).concat(BRACKETS).concat(TILDES);\nexports.VALID_PUNCTUATION = VALID_PUNCTUATION;\nvar PLUS_CHARS = \"+\\uFF0B\"; // const LEADING_PLUS_CHARS_PATTERN = new RegExp('^[' + PLUS_CHARS + ']+')\n\nexports.PLUS_CHARS = PLUS_CHARS;\n//# sourceMappingURL=constants.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// https://medium.com/dsinjs/implementing-lru-cache-in-javascript-94ba6755cda9\nvar Node = /*#__PURE__*/_createClass(function Node(key, value) {\n var next = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var prev = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n _classCallCheck(this, Node);\n\n this.key = key;\n this.value = value;\n this.next = next;\n this.prev = prev;\n});\n\nvar LRUCache = /*#__PURE__*/function () {\n //set default limit of 10 if limit is not passed.\n function LRUCache() {\n var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;\n\n _classCallCheck(this, LRUCache);\n\n this.size = 0;\n this.limit = limit;\n this.head = null;\n this.tail = null;\n this.cache = {};\n } // Write Node to head of LinkedList\n // update cache with Node key and Node reference\n\n\n _createClass(LRUCache, [{\n key: \"put\",\n value: function put(key, value) {\n this.ensureLimit();\n\n if (!this.head) {\n this.head = this.tail = new Node(key, value);\n } else {\n var node = new Node(key, value, this.head);\n this.head.prev = node;\n this.head = node;\n } //Update the cache map\n\n\n this.cache[key] = this.head;\n this.size++;\n } // Read from cache map and make that node as new Head of LinkedList\n\n }, {\n key: \"get\",\n value: function get(key) {\n if (this.cache[key]) {\n var value = this.cache[key].value; // node removed from it's position and cache\n\n this.remove(key); // write node again to the head of LinkedList to make it most recently used\n\n this.put(key, value);\n return value;\n }\n\n console.log(\"Item not available in cache for key \".concat(key));\n }\n }, {\n key: \"ensureLimit\",\n value: function ensureLimit() {\n if (this.size === this.limit) {\n this.remove(this.tail.key);\n }\n }\n }, {\n key: \"remove\",\n value: function remove(key) {\n var node = this.cache[key];\n\n if (node.prev !== null) {\n node.prev.next = node.next;\n } else {\n this.head = node.next;\n }\n\n if (node.next !== null) {\n node.next.prev = node.prev;\n } else {\n this.tail = node.prev;\n }\n\n delete this.cache[key];\n this.size--;\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.head = null;\n this.tail = null;\n this.size = 0;\n this.cache = {};\n } // // Invokes the callback function with every node of the chain and the index of the node.\n // forEach(fn) {\n // let node = this.head;\n // let counter = 0;\n // while (node) {\n // fn(node, counter);\n // node = node.next;\n // counter++;\n // }\n // }\n // // To iterate over LRU with a 'for...of' loop\n // *[Symbol.iterator]() {\n // let node = this.head;\n // while (node) {\n // yield node;\n // node = node.next;\n // }\n // }\n\n }]);\n\n return LRUCache;\n}();\n\nexports[\"default\"] = LRUCache;\n//# sourceMappingURL=LRUCache.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.containsMoreThanOneSlashInNationalNumber = containsMoreThanOneSlashInNationalNumber;\nexports[\"default\"] = void 0;\n\nvar _isValid = _interopRequireDefault(require(\"../isValid.js\"));\n\nvar _parseDigits = _interopRequireDefault(require(\"../helpers/parseDigits.js\"));\n\nvar _matchPhoneNumberStringAgainstPhoneNumber = _interopRequireDefault(require(\"./matchPhoneNumberStringAgainstPhoneNumber.js\"));\n\nvar _metadata2 = _interopRequireDefault(require(\"../metadata.js\"));\n\nvar _getCountryByCallingCode = _interopRequireDefault(require(\"../helpers/getCountryByCallingCode.js\"));\n\nvar _format = require(\"../format.js\");\n\nvar _util = require(\"./util.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/**\r\n * Leniency when finding potential phone numbers in text segments\r\n * The levels here are ordered in increasing strictness.\r\n */\nvar _default = {\n /**\r\n * Phone numbers accepted are \"possible\", but not necessarily \"valid\".\r\n */\n POSSIBLE: function POSSIBLE(phoneNumber, candidate, metadata) {\n return true;\n },\n\n /**\r\n * Phone numbers accepted are \"possible\" and \"valid\".\r\n * Numbers written in national format must have their national-prefix\r\n * present if it is usually written for a number of this type.\r\n */\n VALID: function VALID(phoneNumber, candidate, metadata) {\n if (!phoneNumber.isValid() || !containsOnlyValidXChars(phoneNumber, candidate, metadata)) {\n return false;\n } // Skipped for simplicity.\n // return isNationalPrefixPresentIfRequired(phoneNumber, metadata)\n\n\n return true;\n },\n\n /**\r\n * Phone numbers accepted are \"valid\" and\r\n * are grouped in a possible way for this locale. For example, a US number written as\r\n * \"65 02 53 00 00\" and \"650253 0000\" are not accepted at this leniency level, whereas\r\n * \"650 253 0000\", \"650 2530000\" or \"6502530000\" are.\r\n * Numbers with more than one '/' symbol in the national significant number\r\n * are also dropped at this level.\r\n *\r\n * Warning: This level might result in lower coverage especially for regions outside of\r\n * country code \"+1\". If you are not sure about which level to use,\r\n * email the discussion group libphonenumber-discuss@googlegroups.com.\r\n */\n STRICT_GROUPING: function STRICT_GROUPING(phoneNumber, candidate, metadata, regExpCache) {\n if (!phoneNumber.isValid() || !containsOnlyValidXChars(phoneNumber, candidate, metadata) || containsMoreThanOneSlashInNationalNumber(phoneNumber, candidate) || !isNationalPrefixPresentIfRequired(phoneNumber, metadata)) {\n return false;\n }\n\n return checkNumberGroupingIsValid(phoneNumber, candidate, metadata, allNumberGroupsRemainGrouped, regExpCache);\n },\n\n /**\r\n * Phone numbers accepted are \"valid\" and are grouped in the same way\r\n * that we would have formatted it, or as a single block.\r\n * For example, a US number written as \"650 2530000\" is not accepted\r\n * at this leniency level, whereas \"650 253 0000\" or \"6502530000\" are.\r\n * Numbers with more than one '/' symbol are also dropped at this level.\r\n *\r\n * Warning: This level might result in lower coverage especially for regions outside of\r\n * country code \"+1\". If you are not sure about which level to use, email the discussion group\r\n * libphonenumber-discuss@googlegroups.com.\r\n */\n EXACT_GROUPING: function EXACT_GROUPING(phoneNumber, candidate, metadata, regExpCache) {\n if (!phoneNumber.isValid() || !containsOnlyValidXChars(phoneNumber, candidate, metadata) || containsMoreThanOneSlashInNationalNumber(phoneNumber, candidate) || !isNationalPrefixPresentIfRequired(phoneNumber, metadata)) {\n return false;\n }\n\n return checkNumberGroupingIsValid(phoneNumber, candidate, metadata, allNumberGroupsAreExactlyPresent, regExpCache);\n }\n};\nexports[\"default\"] = _default;\n\nfunction containsOnlyValidXChars(phoneNumber, candidate, metadata) {\n // The characters 'x' and 'X' can be (1) a carrier code, in which case they always precede the\n // national significant number or (2) an extension sign, in which case they always precede the\n // extension number. We assume a carrier code is more than 1 digit, so the first case has to\n // have more than 1 consecutive 'x' or 'X', whereas the second case can only have exactly 1 'x'\n // or 'X'. We ignore the character if it appears as the last character of the string.\n for (var index = 0; index < candidate.length - 1; index++) {\n var charAtIndex = candidate.charAt(index);\n\n if (charAtIndex === 'x' || charAtIndex === 'X') {\n var charAtNextIndex = candidate.charAt(index + 1);\n\n if (charAtNextIndex === 'x' || charAtNextIndex === 'X') {\n // This is the carrier code case, in which the 'X's always precede the national\n // significant number.\n index++;\n\n if ((0, _matchPhoneNumberStringAgainstPhoneNumber[\"default\"])(candidate.substring(index), phoneNumber, metadata) !== 'NSN_MATCH') {\n return false;\n } // This is the extension sign case, in which the 'x' or 'X' should always precede the\n // extension number.\n\n } else {\n var ext = (0, _parseDigits[\"default\"])(candidate.substring(index));\n\n if (ext) {\n if (phoneNumber.ext !== ext) {\n return false;\n }\n } else {\n if (phoneNumber.ext) {\n return false;\n }\n }\n }\n }\n }\n\n return true;\n}\n\nfunction isNationalPrefixPresentIfRequired(phoneNumber, _metadata) {\n // First, check how we deduced the country code. If it was written in international format, then\n // the national prefix is not required.\n if (phoneNumber.__countryCallingCodeSource !== 'FROM_DEFAULT_COUNTRY') {\n return true;\n }\n\n var metadata = new _metadata2[\"default\"](_metadata);\n metadata.selectNumberingPlan(phoneNumber.countryCallingCode);\n var phoneNumberRegion = phoneNumber.country || (0, _getCountryByCallingCode[\"default\"])(phoneNumber.countryCallingCode, phoneNumber.nationalNumber, metadata); // Check if a national prefix should be present when formatting this number.\n\n var nationalNumber = phoneNumber.nationalNumber;\n var format = (0, _format.chooseFormatForNumber)(metadata.numberingPlan.formats(), nationalNumber); // To do this, we check that a national prefix formatting rule was present\n // and that it wasn't just the first-group symbol ($1) with punctuation.\n\n if (format.nationalPrefixFormattingRule()) {\n if (metadata.numberingPlan.nationalPrefixIsOptionalWhenFormattingInNationalFormat()) {\n // The national-prefix is optional in these cases, so we don't need to check if it was present.\n return true;\n }\n\n if (!format.usesNationalPrefix()) {\n // National Prefix not needed for this number.\n return true;\n }\n\n return Boolean(phoneNumber.nationalPrefix);\n }\n\n return true;\n}\n\nfunction containsMoreThanOneSlashInNationalNumber(phoneNumber, candidate) {\n var firstSlashInBodyIndex = candidate.indexOf('/');\n\n if (firstSlashInBodyIndex < 0) {\n // No slashes, this is okay.\n return false;\n } // Now look for a second one.\n\n\n var secondSlashInBodyIndex = candidate.indexOf('/', firstSlashInBodyIndex + 1);\n\n if (secondSlashInBodyIndex < 0) {\n // Only one slash, this is okay.\n return false;\n } // If the first slash is after the country calling code, this is permitted.\n\n\n var candidateHasCountryCode = phoneNumber.__countryCallingCodeSource === 'FROM_NUMBER_WITH_PLUS_SIGN' || phoneNumber.__countryCallingCodeSource === 'FROM_NUMBER_WITHOUT_PLUS_SIGN';\n\n if (candidateHasCountryCode && (0, _parseDigits[\"default\"])(candidate.substring(0, firstSlashInBodyIndex)) === phoneNumber.countryCallingCode) {\n // Any more slashes and this is illegal.\n return candidate.slice(secondSlashInBodyIndex + 1).indexOf('/') >= 0;\n }\n\n return true;\n}\n\nfunction checkNumberGroupingIsValid(number, candidate, metadata, checkGroups, regExpCache) {\n throw new Error('This part of code hasn\\'t been ported');\n var normalizedCandidate = normalizeDigits(candidate, true\n /* keep non-digits */\n );\n var formattedNumberGroups = getNationalNumberGroups(metadata, number, null);\n\n if (checkGroups(metadata, number, normalizedCandidate, formattedNumberGroups)) {\n return true;\n } // If this didn't pass, see if there are any alternate formats that match, and try them instead.\n\n\n var alternateFormats = MetadataManager.getAlternateFormatsForCountry(number.getCountryCode());\n var nationalSignificantNumber = util.getNationalSignificantNumber(number);\n\n if (alternateFormats) {\n for (var _iterator = _createForOfIteratorHelperLoose(alternateFormats.numberFormats()), _step; !(_step = _iterator()).done;) {\n var alternateFormat = _step.value;\n\n if (alternateFormat.leadingDigitsPatterns().length > 0) {\n // There is only one leading digits pattern for alternate formats.\n var leadingDigitsRegExp = regExpCache.getPatternForRegExp('^' + alternateFormat.leadingDigitsPatterns()[0]);\n\n if (!leadingDigitsRegExp.test(nationalSignificantNumber)) {\n // Leading digits don't match; try another one.\n continue;\n }\n }\n\n formattedNumberGroups = getNationalNumberGroups(metadata, number, alternateFormat);\n\n if (checkGroups(metadata, number, normalizedCandidate, formattedNumberGroups)) {\n return true;\n }\n }\n }\n\n return false;\n}\n/**\r\n * Helper method to get the national-number part of a number, formatted without any national\r\n * prefix, and return it as a set of digit blocks that would be formatted together following\r\n * standard formatting rules.\r\n */\n\n\nfunction getNationalNumberGroups(metadata, number, formattingPattern) {\n throw new Error('This part of code hasn\\'t been ported');\n\n if (formattingPattern) {\n // We format the NSN only, and split that according to the separator.\n var nationalSignificantNumber = util.getNationalSignificantNumber(number);\n return util.formatNsnUsingPattern(nationalSignificantNumber, formattingPattern, 'RFC3966', metadata).split('-');\n } // This will be in the format +CC-DG1-DG2-DGX;ext=EXT where DG1..DGX represents groups of digits.\n\n\n var rfc3966Format = formatNumber(number, 'RFC3966', metadata); // We remove the extension part from the formatted string before splitting it into different\n // groups.\n\n var endIndex = rfc3966Format.indexOf(';');\n\n if (endIndex < 0) {\n endIndex = rfc3966Format.length;\n } // The country-code will have a '-' following it.\n\n\n var startIndex = rfc3966Format.indexOf('-') + 1;\n return rfc3966Format.slice(startIndex, endIndex).split('-');\n}\n\nfunction allNumberGroupsAreExactlyPresent(metadata, number, normalizedCandidate, formattedNumberGroups) {\n throw new Error('This part of code hasn\\'t been ported');\n var candidateGroups = normalizedCandidate.split(NON_DIGITS_PATTERN); // Set this to the last group, skipping it if the number has an extension.\n\n var candidateNumberGroupIndex = number.hasExtension() ? candidateGroups.length - 2 : candidateGroups.length - 1; // First we check if the national significant number is formatted as a block.\n // We use contains and not equals, since the national significant number may be present with\n // a prefix such as a national number prefix, or the country code itself.\n\n if (candidateGroups.length == 1 || candidateGroups[candidateNumberGroupIndex].contains(util.getNationalSignificantNumber(number))) {\n return true;\n } // Starting from the end, go through in reverse, excluding the first group, and check the\n // candidate and number groups are the same.\n\n\n var formattedNumberGroupIndex = formattedNumberGroups.length - 1;\n\n while (formattedNumberGroupIndex > 0 && candidateNumberGroupIndex >= 0) {\n if (candidateGroups[candidateNumberGroupIndex] !== formattedNumberGroups[formattedNumberGroupIndex]) {\n return false;\n }\n\n formattedNumberGroupIndex--;\n candidateNumberGroupIndex--;\n } // Now check the first group. There may be a national prefix at the start, so we only check\n // that the candidate group ends with the formatted number group.\n\n\n return candidateNumberGroupIndex >= 0 && (0, _util.endsWith)(candidateGroups[candidateNumberGroupIndex], formattedNumberGroups[0]);\n}\n\nfunction allNumberGroupsRemainGrouped(metadata, number, normalizedCandidate, formattedNumberGroups) {\n throw new Error('This part of code hasn\\'t been ported');\n var fromIndex = 0;\n\n if (number.getCountryCodeSource() !== CountryCodeSource.FROM_DEFAULT_COUNTRY) {\n // First skip the country code if the normalized candidate contained it.\n var countryCode = String(number.getCountryCode());\n fromIndex = normalizedCandidate.indexOf(countryCode) + countryCode.length();\n } // Check each group of consecutive digits are not broken into separate groupings in the\n // {@code normalizedCandidate} string.\n\n\n for (var i = 0; i < formattedNumberGroups.length; i++) {\n // Fails if the substring of {@code normalizedCandidate} starting from {@code fromIndex}\n // doesn't contain the consecutive digits in formattedNumberGroups[i].\n fromIndex = normalizedCandidate.indexOf(formattedNumberGroups[i], fromIndex);\n\n if (fromIndex < 0) {\n return false;\n } // Moves {@code fromIndex} forward.\n\n\n fromIndex += formattedNumberGroups[i].length();\n\n if (i == 0 && fromIndex < normalizedCandidate.length()) {\n // We are at the position right after the NDC. We get the region used for formatting\n // information based on the country code in the phone number, rather than the number itself,\n // as we do not need to distinguish between different countries with the same country\n // calling code and this is faster.\n var region = util.getRegionCodeForCountryCode(number.getCountryCode());\n\n if (util.getNddPrefixForRegion(region, true) != null && Character.isDigit(normalizedCandidate.charAt(fromIndex))) {\n // This means there is no formatting symbol after the NDC. In this case, we only\n // accept the number if there is no formatting symbol at all in the number, except\n // for extensions. This is only important for countries with national prefixes.\n var nationalSignificantNumber = util.getNationalSignificantNumber(number);\n return (0, _util.startsWith)(normalizedCandidate.slice(fromIndex - formattedNumberGroups[i].length), nationalSignificantNumber);\n }\n }\n } // The check here makes sure that we haven't mistakenly already used the extension to\n // match the last group of the subscriber number. Note the extension cannot have\n // formatting in-between digits.\n\n\n return normalizedCandidate.slice(fromIndex).contains(number.getExtension());\n}\n//# sourceMappingURL=Leniency.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _LRUCache = _interopRequireDefault(require(\"./LRUCache.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n// A cache for frequently used country-specific regular expressions. Set to 32 to cover ~2-3\n// countries being used for the same doc with ~10 patterns for each country. Some pages will have\n// a lot more countries in use, but typically fewer numbers for each so expanding the cache for\n// that use-case won't have a lot of benefit.\nvar RegExpCache = /*#__PURE__*/function () {\n function RegExpCache(size) {\n _classCallCheck(this, RegExpCache);\n\n this.cache = new _LRUCache[\"default\"](size);\n }\n\n _createClass(RegExpCache, [{\n key: \"getPatternForRegExp\",\n value: function getPatternForRegExp(pattern) {\n var regExp = this.cache.get(pattern);\n\n if (!regExp) {\n regExp = new RegExp('^' + pattern);\n this.cache.put(pattern, regExp);\n }\n\n return regExp;\n }\n }]);\n\n return RegExpCache;\n}();\n\nexports[\"default\"] = RegExpCache;\n//# sourceMappingURL=RegExpCache.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.LEAD_CLASS = void 0;\nexports[\"default\"] = isValidCandidate;\n\nvar _constants = require(\"../constants.js\");\n\nvar _util = require(\"./util.js\");\n\nvar _utf = require(\"./utf-8.js\");\n\n// Copy-pasted from `PhoneNumberMatcher.js`.\nvar OPENING_PARENS = \"(\\\\[\\uFF08\\uFF3B\";\nvar CLOSING_PARENS = \")\\\\]\\uFF09\\uFF3D\";\nvar NON_PARENS = \"[^\".concat(OPENING_PARENS).concat(CLOSING_PARENS, \"]\");\nvar LEAD_CLASS = \"[\".concat(OPENING_PARENS).concat(_constants.PLUS_CHARS, \"]\"); // Punctuation that may be at the start of a phone number - brackets and plus signs.\n\nexports.LEAD_CLASS = LEAD_CLASS;\nvar LEAD_CLASS_LEADING = new RegExp('^' + LEAD_CLASS); // Limit on the number of pairs of brackets in a phone number.\n\nvar BRACKET_PAIR_LIMIT = (0, _util.limit)(0, 3);\n/**\r\n * Pattern to check that brackets match. Opening brackets should be closed within a phone number.\r\n * This also checks that there is something inside the brackets. Having no brackets at all is also\r\n * fine.\r\n *\r\n * An opening bracket at the beginning may not be closed, but subsequent ones should be. It's\r\n * also possible that the leading bracket was dropped, so we shouldn't be surprised if we see a\r\n * closing bracket first. We limit the sets of brackets in a phone number to four.\r\n */\n\nvar MATCHING_BRACKETS_ENTIRE = new RegExp('^' + \"(?:[\" + OPENING_PARENS + \"])?\" + \"(?:\" + NON_PARENS + \"+\" + \"[\" + CLOSING_PARENS + \"])?\" + NON_PARENS + \"+\" + \"(?:[\" + OPENING_PARENS + \"]\" + NON_PARENS + \"+[\" + CLOSING_PARENS + \"])\" + BRACKET_PAIR_LIMIT + NON_PARENS + \"*\" + '$');\n/**\r\n * Matches strings that look like publication pages. Example:\r\n *

Computing Complete Answers to Queries in the Presence of Limited Access Patterns.\r\n * Chen Li. VLDB J. 12(3): 211-227 (2003).
\r\n *\r\n * The string \"211-227 (2003)\" is not a telephone number.\r\n */\n\nvar PUB_PAGES = /\\d{1,5}-+\\d{1,5}\\s{0,4}\\(\\d{1,4}/;\n\nfunction isValidCandidate(candidate, offset, text, leniency) {\n // Check the candidate doesn't contain any formatting\n // which would indicate that it really isn't a phone number.\n if (!MATCHING_BRACKETS_ENTIRE.test(candidate) || PUB_PAGES.test(candidate)) {\n return;\n } // If leniency is set to VALID or stricter, we also want to skip numbers that are surrounded\n // by Latin alphabetic characters, to skip cases like abc8005001234 or 8005001234def.\n\n\n if (leniency !== 'POSSIBLE') {\n // If the candidate is not at the start of the text,\n // and does not start with phone-number punctuation,\n // check the previous character.\n if (offset > 0 && !LEAD_CLASS_LEADING.test(candidate)) {\n var previousChar = text[offset - 1]; // We return null if it is a latin letter or an invalid punctuation symbol.\n\n if ((0, _utf.isInvalidPunctuationSymbol)(previousChar) || (0, _utf.isLatinLetter)(previousChar)) {\n return false;\n }\n }\n\n var lastCharIndex = offset + candidate.length;\n\n if (lastCharIndex < text.length) {\n var nextChar = text[lastCharIndex];\n\n if ((0, _utf.isInvalidPunctuationSymbol)(nextChar) || (0, _utf.isLatinLetter)(nextChar)) {\n return false;\n }\n }\n }\n\n return true;\n}\n//# sourceMappingURL=isValidCandidate.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = isValidPreCandidate;\n// Matches strings that look like dates using \"/\" as a separator.\n// Examples: 3/10/2011, 31/10/96 or 08/31/95.\nvar SLASH_SEPARATED_DATES = /(?:(?:[0-3]?\\d\\/[01]?\\d)|(?:[01]?\\d\\/[0-3]?\\d))\\/(?:[12]\\d)?\\d{2}/; // Matches timestamps.\n// Examples: \"2012-01-02 08:00\".\n// Note that the reg-ex does not include the\n// trailing \":\\d\\d\" -- that is covered by TIME_STAMPS_SUFFIX.\n\nvar TIME_STAMPS = /[12]\\d{3}[-/]?[01]\\d[-/]?[0-3]\\d +[0-2]\\d$/;\nvar TIME_STAMPS_SUFFIX_LEADING = /^:[0-5]\\d/;\n\nfunction isValidPreCandidate(candidate, offset, text) {\n // Skip a match that is more likely to be a date.\n if (SLASH_SEPARATED_DATES.test(candidate)) {\n return false;\n } // Skip potential time-stamps.\n\n\n if (TIME_STAMPS.test(candidate)) {\n var followingText = text.slice(offset + candidate.length);\n\n if (TIME_STAMPS_SUFFIX_LEADING.test(followingText)) {\n return false;\n }\n }\n\n return true;\n}\n//# sourceMappingURL=isValidPreCandidate.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = matchPhoneNumberStringAgainstPhoneNumber;\n\nvar _parsePhoneNumber = _interopRequireDefault(require(\"../parsePhoneNumber.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\r\n * Matches a phone number object against a phone number string.\r\n * @param {string} phoneNumberString\r\n * @param {PhoneNumber} phoneNumber\r\n * @param {object} metadata — Metadata JSON\r\n * @return {'INVALID_NUMBER'|'NO_MATCH'|'SHORT_NSN_MATCH'|'NSN_MATCH'|'EXACT_MATCH'}\r\n */\nfunction matchPhoneNumberStringAgainstPhoneNumber(phoneNumberString, phoneNumber, metadata) {\n // Parse `phoneNumberString`.\n var phoneNumberStringContainsCallingCode = true;\n var parsedPhoneNumber = (0, _parsePhoneNumber[\"default\"])(phoneNumberString, metadata);\n\n if (!parsedPhoneNumber) {\n // If `phoneNumberString` didn't contain a country calling code\n // then substitute it with the `phoneNumber`'s country calling code.\n phoneNumberStringContainsCallingCode = false;\n parsedPhoneNumber = (0, _parsePhoneNumber[\"default\"])(phoneNumberString, {\n defaultCallingCode: phoneNumber.countryCallingCode\n }, metadata);\n }\n\n if (!parsedPhoneNumber) {\n return 'INVALID_NUMBER';\n } // Check that the extensions match.\n\n\n if (phoneNumber.ext) {\n if (parsedPhoneNumber.ext !== phoneNumber.ext) {\n return 'NO_MATCH';\n }\n } else {\n if (parsedPhoneNumber.ext) {\n return 'NO_MATCH';\n }\n } // Check that country calling codes match.\n\n\n if (phoneNumberStringContainsCallingCode) {\n if (phoneNumber.countryCallingCode !== parsedPhoneNumber.countryCallingCode) {\n return 'NO_MATCH';\n }\n } // Check if the whole numbers match.\n\n\n if (phoneNumber.number === parsedPhoneNumber.number) {\n if (phoneNumberStringContainsCallingCode) {\n return 'EXACT_MATCH';\n } else {\n return 'NSN_MATCH';\n }\n } // Check if one national number is a \"suffix\" of the other.\n\n\n if (phoneNumber.nationalNumber.indexOf(parsedPhoneNumber.nationalNumber) === 0 || parsedPhoneNumber.nationalNumber.indexOf(phoneNumber.nationalNumber) === 0) {\n // \"A SHORT_NSN_MATCH occurs if there is a difference because of the\n // presence or absence of an 'Italian leading zero', the presence or\n // absence of an extension, or one NSN being a shorter variant of the\n // other.\"\n return 'SHORT_NSN_MATCH';\n }\n\n return 'NO_MATCH';\n}\n//# sourceMappingURL=matchPhoneNumberStringAgainstPhoneNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = parsePreCandidate;\n\nvar _util = require(\"./util.js\");\n\n// Regular expression of characters typically used to start a second phone number for the purposes\n// of parsing. This allows us to strip off parts of the number that are actually the start of\n// another number, such as for: (530) 583-6985 x302/x2303 -> the second extension here makes this\n// actually two phone numbers, (530) 583-6985 x302 and (530) 583-6985 x2303. We remove the second\n// extension so that the first number is parsed correctly.\n//\n// Matches a slash (\\ or /) followed by a space followed by an `x`.\n//\nvar SECOND_NUMBER_START_PATTERN = /[\\\\/] *x/;\n\nfunction parsePreCandidate(candidate) {\n // Check for extra numbers at the end.\n // TODO: This is the place to start when trying to support extraction of multiple phone number\n // from split notations (+41 79 123 45 67 / 68).\n return (0, _util.trimAfterFirstMatch)(SECOND_NUMBER_START_PATTERN, candidate);\n}\n//# sourceMappingURL=parsePreCandidate.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports._pN = exports._pL = exports.PZ = void 0;\nexports.isInvalidPunctuationSymbol = isInvalidPunctuationSymbol;\nexports.isLatinLetter = isLatinLetter;\nexports.pZ = exports.pNd = void 0;\n// Javascript doesn't support UTF-8 regular expressions.\n// So mimicking them here.\n// Copy-pasted from `PhoneNumberMatcher.js`.\n\n/**\r\n * \"\\p{Z}\" is any kind of whitespace or invisible separator (\"Separator\").\r\n * http://www.regular-expressions.info/unicode.html\r\n * \"\\P{Z}\" is the reverse of \"\\p{Z}\".\r\n * \"\\p{N}\" is any kind of numeric character in any script (\"Number\").\r\n * \"\\p{Nd}\" is a digit zero through nine in any script except \"ideographic scripts\" (\"Decimal_Digit_Number\").\r\n * \"\\p{Sc}\" is a currency symbol (\"Currency_Symbol\").\r\n * \"\\p{L}\" is any kind of letter from any language (\"Letter\").\r\n * \"\\p{Mn}\" is \"non-spacing mark\".\r\n *\r\n * Javascript doesn't support Unicode Regular Expressions\r\n * so substituting it with this explicit set of characters.\r\n *\r\n * https://stackoverflow.com/questions/13210194/javascript-regex-equivalent-of-a-za-z-using-pl\r\n * https://github.com/danielberndt/babel-plugin-utf-8-regex/blob/master/src/transformer.js\r\n */\nvar _pZ = \" \\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000\";\nvar pZ = \"[\".concat(_pZ, \"]\");\nexports.pZ = pZ;\nvar PZ = \"[^\".concat(_pZ, \"]\");\nexports.PZ = PZ;\nvar _pN = \"0-9\\xB2\\xB3\\xB9\\xBC-\\xBE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D66-\\u0D75\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19\"; // const pN = `[${_pN}]`\n\nexports._pN = _pN;\nvar _pNd = \"0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19\";\nvar pNd = \"[\".concat(_pNd, \"]\");\nexports.pNd = pNd;\nvar _pL = \"A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC\";\nexports._pL = _pL;\nvar pL = \"[\".concat(_pL, \"]\");\nvar pL_regexp = new RegExp(pL);\nvar _pSc = \"$\\xA2-\\xA5\\u058F\\u060B\\u09F2\\u09F3\\u09FB\\u0AF1\\u0BF9\\u0E3F\\u17DB\\u20A0-\\u20B9\\uA838\\uFDFC\\uFE69\\uFF04\\uFFE0\\uFFE1\\uFFE5\\uFFE6\";\nvar pSc = \"[\".concat(_pSc, \"]\");\nvar pSc_regexp = new RegExp(pSc);\nvar _pMn = \"\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08E4-\\u08FE\\u0900-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1BAB\\u1BE6\\u1BE8\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1DC0-\\u1DE6\\u1DFC-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302D\\u3099\\u309A\\uA66F\\uA674-\\uA67D\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEC\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26\";\nvar pMn = \"[\".concat(_pMn, \"]\");\nvar pMn_regexp = new RegExp(pMn);\nvar _InBasic_Latin = \"\\0-\\x7F\";\nvar _InLatin_1_Supplement = \"\\x80-\\xFF\";\nvar _InLatin_Extended_A = \"\\u0100-\\u017F\";\nvar _InLatin_Extended_Additional = \"\\u1E00-\\u1EFF\";\nvar _InLatin_Extended_B = \"\\u0180-\\u024F\";\nvar _InCombining_Diacritical_Marks = \"\\u0300-\\u036F\";\nvar latinLetterRegexp = new RegExp('[' + _InBasic_Latin + _InLatin_1_Supplement + _InLatin_Extended_A + _InLatin_Extended_Additional + _InLatin_Extended_B + _InCombining_Diacritical_Marks + ']');\n/**\r\n * Helper method to determine if a character is a Latin-script letter or not.\r\n * For our purposes, combining marks should also return true since we assume\r\n * they have been added to a preceding Latin character.\r\n */\n\nfunction isLatinLetter(letter) {\n // Combining marks are a subset of non-spacing-mark.\n if (!pL_regexp.test(letter) && !pMn_regexp.test(letter)) {\n return false;\n }\n\n return latinLetterRegexp.test(letter);\n}\n\nfunction isInvalidPunctuationSymbol(character) {\n return character === '%' || pSc_regexp.test(character);\n}\n//# sourceMappingURL=utf-8.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.endsWith = endsWith;\nexports.limit = limit;\nexports.startsWith = startsWith;\nexports.trimAfterFirstMatch = trimAfterFirstMatch;\n\n/** Returns a regular expression quantifier with an upper and lower limit. */\nfunction limit(lower, upper) {\n if (lower < 0 || upper <= 0 || upper < lower) {\n throw new TypeError();\n }\n\n return \"{\".concat(lower, \",\").concat(upper, \"}\");\n}\n/**\r\n * Trims away any characters after the first match of {@code pattern} in {@code candidate},\r\n * returning the trimmed version.\r\n */\n\n\nfunction trimAfterFirstMatch(regexp, string) {\n var index = string.search(regexp);\n\n if (index >= 0) {\n return string.slice(0, index);\n }\n\n return string;\n}\n\nfunction startsWith(string, substring) {\n return string.indexOf(substring) === 0;\n}\n\nfunction endsWith(string, substring) {\n return string.indexOf(substring, string.length - substring.length) === string.length - substring.length;\n}\n//# sourceMappingURL=util.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = findPhoneNumbersInText;\n\nvar _PhoneNumberMatcher = _interopRequireDefault(require(\"./PhoneNumberMatcher.js\"));\n\nvar _normalizeArguments2 = _interopRequireDefault(require(\"./normalizeArguments.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction findPhoneNumbersInText() {\n var _normalizeArguments = (0, _normalizeArguments2[\"default\"])(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n var matcher = new _PhoneNumberMatcher[\"default\"](text, _objectSpread(_objectSpread({}, options), {}, {\n v2: true\n }), metadata);\n var results = [];\n\n while (matcher.hasNext()) {\n results.push(matcher.next());\n }\n\n return results;\n}\n//# sourceMappingURL=findPhoneNumbersInText.js.map","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.chooseFormatForNumber = chooseFormatForNumber;\nexports[\"default\"] = formatNumber;\n\nvar _matchesEntirely = _interopRequireDefault(require(\"./helpers/matchesEntirely.js\"));\n\nvar _formatNationalNumberUsingFormat = _interopRequireDefault(require(\"./helpers/formatNationalNumberUsingFormat.js\"));\n\nvar _metadata = _interopRequireWildcard(require(\"./metadata.js\"));\n\nvar _getIddPrefix = _interopRequireDefault(require(\"./helpers/getIddPrefix.js\"));\n\nvar _RFC = require(\"./helpers/RFC3966.js\");\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar DEFAULT_OPTIONS = {\n formatExtension: function formatExtension(formattedNumber, extension, metadata) {\n return \"\".concat(formattedNumber).concat(metadata.ext()).concat(extension);\n }\n};\n/**\r\n * Formats a phone number.\r\n *\r\n * format(phoneNumberInstance, 'INTERNATIONAL', { ..., v2: true }, metadata)\r\n * format(phoneNumberInstance, 'NATIONAL', { ..., v2: true }, metadata)\r\n *\r\n * format({ phone: '8005553535', country: 'RU' }, 'INTERNATIONAL', { ... }, metadata)\r\n * format({ phone: '8005553535', country: 'RU' }, 'NATIONAL', undefined, metadata)\r\n *\r\n * @param {object|PhoneNumber} input — If `options.v2: true` flag is passed, the `input` should be a `PhoneNumber` instance. Otherwise, it should be an object of shape `{ phone: '...', country: '...' }`.\r\n * @param {string} format\r\n * @param {object} [options]\r\n * @param {object} metadata\r\n * @return {string}\r\n */\n\nfunction formatNumber(input, format, options, metadata) {\n // Apply default options.\n if (options) {\n options = _objectSpread(_objectSpread({}, DEFAULT_OPTIONS), options);\n } else {\n options = DEFAULT_OPTIONS;\n }\n\n metadata = new _metadata[\"default\"](metadata);\n\n if (input.country && input.country !== '001') {\n // Validate `input.country`.\n if (!metadata.hasCountry(input.country)) {\n throw new Error(\"Unknown country: \".concat(input.country));\n }\n\n metadata.country(input.country);\n } else if (input.countryCallingCode) {\n metadata.selectNumberingPlan(input.countryCallingCode);\n } else return input.phone || '';\n\n var countryCallingCode = metadata.countryCallingCode();\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone; // This variable should have been declared inside `case`s\n // but Babel has a bug and it says \"duplicate variable declaration\".\n\n var number;\n\n switch (format) {\n case 'NATIONAL':\n // Legacy argument support.\n // (`{ country: ..., phone: '' }`)\n if (!nationalNumber) {\n return '';\n }\n\n number = formatNationalNumber(nationalNumber, input.carrierCode, 'NATIONAL', metadata, options);\n return addExtension(number, input.ext, metadata, options.formatExtension);\n\n case 'INTERNATIONAL':\n // Legacy argument support.\n // (`{ country: ..., phone: '' }`)\n if (!nationalNumber) {\n return \"+\".concat(countryCallingCode);\n }\n\n number = formatNationalNumber(nationalNumber, null, 'INTERNATIONAL', metadata, options);\n number = \"+\".concat(countryCallingCode, \" \").concat(number);\n return addExtension(number, input.ext, metadata, options.formatExtension);\n\n case 'E.164':\n // `E.164` doesn't define \"phone number extensions\".\n return \"+\".concat(countryCallingCode).concat(nationalNumber);\n\n case 'RFC3966':\n return (0, _RFC.formatRFC3966)({\n number: \"+\".concat(countryCallingCode).concat(nationalNumber),\n ext: input.ext\n });\n // For reference, here's Google's IDD formatter:\n // https://github.com/google/libphonenumber/blob/32719cf74e68796788d1ca45abc85dcdc63ba5b9/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L1546\n // Not saying that this IDD formatter replicates it 1:1, but it seems to work.\n // Who would even need to format phone numbers in IDD format anyway?\n\n case 'IDD':\n if (!options.fromCountry) {\n return; // throw new Error('`fromCountry` option not passed for IDD-prefixed formatting.')\n }\n\n var formattedNumber = formatIDD(nationalNumber, input.carrierCode, countryCallingCode, options.fromCountry, metadata);\n return addExtension(formattedNumber, input.ext, metadata, options.formatExtension);\n\n default:\n throw new Error(\"Unknown \\\"format\\\" argument passed to \\\"formatNumber()\\\": \\\"\".concat(format, \"\\\"\"));\n }\n}\n\nfunction formatNationalNumber(number, carrierCode, formatAs, metadata, options) {\n var format = chooseFormatForNumber(metadata.formats(), number);\n\n if (!format) {\n return number;\n }\n\n return (0, _formatNationalNumberUsingFormat[\"default\"])(number, format, {\n useInternationalFormat: formatAs === 'INTERNATIONAL',\n withNationalPrefix: format.nationalPrefixIsOptionalWhenFormattingInNationalFormat() && options && options.nationalPrefix === false ? false : true,\n carrierCode: carrierCode,\n metadata: metadata\n });\n}\n\nfunction chooseFormatForNumber(availableFormats, nationalNnumber) {\n for (var _iterator = _createForOfIteratorHelperLoose(availableFormats), _step; !(_step = _iterator()).done;) {\n var format = _step.value;\n\n // Validate leading digits.\n // The test case for \"else path\" could be found by searching for\n // \"format.leadingDigitsPatterns().length === 0\".\n if (format.leadingDigitsPatterns().length > 0) {\n // The last leading_digits_pattern is used here, as it is the most detailed\n var lastLeadingDigitsPattern = format.leadingDigitsPatterns()[format.leadingDigitsPatterns().length - 1]; // If leading digits don't match then move on to the next phone number format\n\n if (nationalNnumber.search(lastLeadingDigitsPattern) !== 0) {\n continue;\n }\n } // Check that the national number matches the phone number format regular expression\n\n\n if ((0, _matchesEntirely[\"default\"])(nationalNnumber, format.pattern())) {\n return format;\n }\n }\n}\n\nfunction addExtension(formattedNumber, ext, metadata, formatExtension) {\n return ext ? formatExtension(formattedNumber, ext, metadata) : formattedNumber;\n}\n\nfunction formatIDD(nationalNumber, carrierCode, countryCallingCode, fromCountry, metadata) {\n var fromCountryCallingCode = (0, _metadata.getCountryCallingCode)(fromCountry, metadata.metadata); // When calling within the same country calling code.\n\n if (fromCountryCallingCode === countryCallingCode) {\n var formattedNumber = formatNationalNumber(nationalNumber, carrierCode, 'NATIONAL', metadata); // For NANPA regions, return the national format for these regions\n // but prefix it with the country calling code.\n\n if (countryCallingCode === '1') {\n return countryCallingCode + ' ' + formattedNumber;\n } // If regions share a country calling code, the country calling code need\n // not be dialled. This also applies when dialling within a region, so this\n // if clause covers both these cases. Technically this is the case for\n // dialling from La Reunion to other overseas departments of France (French\n // Guiana, Martinique, Guadeloupe), but not vice versa - so we don't cover\n // this edge case for now and for those cases return the version including\n // country calling code. Details here:\n // http://www.petitfute.com/voyage/225-info-pratiques-reunion\n //\n\n\n return formattedNumber;\n }\n\n var iddPrefix = (0, _getIddPrefix[\"default\"])(fromCountry, undefined, metadata.metadata);\n\n if (iddPrefix) {\n return \"\".concat(iddPrefix, \" \").concat(countryCallingCode, \" \").concat(formatNationalNumber(nationalNumber, null, 'INTERNATIONAL', metadata));\n }\n}\n//# sourceMappingURL=format.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = formatIncompletePhoneNumber;\n\nvar _AsYouType = _interopRequireDefault(require(\"./AsYouType.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\r\n * Formats a (possibly incomplete) phone number.\r\n * The phone number can be either in E.164 format\r\n * or in a form of national number digits.\r\n * @param {string} value - A possibly incomplete phone number. Either in E.164 format or in a form of national number digits.\r\n * @param {string?} country - Two-letter (\"ISO 3166-1 alpha-2\") country code.\r\n * @return {string} Formatted (possibly incomplete) phone number.\r\n */\nfunction formatIncompletePhoneNumber(value, country, metadata) {\n if (!metadata) {\n metadata = country;\n country = undefined;\n }\n\n return new _AsYouType[\"default\"](country, metadata).input(value);\n}\n//# sourceMappingURL=formatIncompletePhoneNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = getCountries;\n\nvar _metadata = _interopRequireDefault(require(\"./metadata.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction getCountries(metadata) {\n return new _metadata[\"default\"](metadata).getCountries();\n}\n//# sourceMappingURL=getCountries.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _metadata.getCountryCallingCode;\n }\n});\n\nvar _metadata = require(\"./metadata.js\");\n//# sourceMappingURL=getCountryCallingCode.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = getExampleNumber;\n\nvar _PhoneNumber = _interopRequireDefault(require(\"./PhoneNumber.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction getExampleNumber(country, examples, metadata) {\n if (examples[country]) {\n return new _PhoneNumber[\"default\"](country, examples[country], metadata);\n }\n}\n//# sourceMappingURL=getExampleNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.formatRFC3966 = formatRFC3966;\nexports.parseRFC3966 = parseRFC3966;\n\nvar _isViablePhoneNumber = _interopRequireDefault(require(\"./isViablePhoneNumber.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n// https://www.ietf.org/rfc/rfc3966.txt\n\n/**\r\n * @param {string} text - Phone URI (RFC 3966).\r\n * @return {object} `{ ?number, ?ext }`.\r\n */\nfunction parseRFC3966(text) {\n var number;\n var ext; // Replace \"tel:\" with \"tel=\" for parsing convenience.\n\n text = text.replace(/^tel:/, 'tel=');\n\n for (var _iterator = _createForOfIteratorHelperLoose(text.split(';')), _step; !(_step = _iterator()).done;) {\n var part = _step.value;\n\n var _part$split = part.split('='),\n _part$split2 = _slicedToArray(_part$split, 2),\n name = _part$split2[0],\n value = _part$split2[1];\n\n switch (name) {\n case 'tel':\n number = value;\n break;\n\n case 'ext':\n ext = value;\n break;\n\n case 'phone-context':\n // Only \"country contexts\" are supported.\n // \"Domain contexts\" are ignored.\n if (value[0] === '+') {\n number = value + number;\n }\n\n break;\n }\n } // If the phone number is not viable, then abort.\n\n\n if (!(0, _isViablePhoneNumber[\"default\"])(number)) {\n return {};\n }\n\n var result = {\n number: number\n };\n\n if (ext) {\n result.ext = ext;\n }\n\n return result;\n}\n/**\r\n * @param {object} - `{ ?number, ?extension }`.\r\n * @return {string} Phone URI (RFC 3966).\r\n */\n\n\nfunction formatRFC3966(_ref) {\n var number = _ref.number,\n ext = _ref.ext;\n\n if (!number) {\n return '';\n }\n\n if (number[0] !== '+') {\n throw new Error(\"\\\"formatRFC3966()\\\" expects \\\"number\\\" to be in E.164 format.\");\n }\n\n return \"tel:\".concat(number).concat(ext ? ';ext=' + ext : '');\n}\n//# sourceMappingURL=RFC3966.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = applyInternationalSeparatorStyle;\n\nvar _constants = require(\"../constants.js\");\n\n// Removes brackets and replaces dashes with spaces.\n//\n// E.g. \"(999) 111-22-33\" -> \"999 111 22 33\"\n//\n// For some reason Google's metadata contains ``s with brackets and dashes.\n// Meanwhile, there's no single opinion about using punctuation in international phone numbers.\n//\n// For example, Google's `` for USA is `+1 213-373-4253`.\n// And here's a quote from WikiPedia's \"North American Numbering Plan\" page:\n// https://en.wikipedia.org/wiki/North_American_Numbering_Plan\n//\n// \"The country calling code for all countries participating in the NANP is 1.\n// In international format, an NANP number should be listed as +1 301 555 01 00,\n// where 301 is an area code (Maryland).\"\n//\n// I personally prefer the international format without any punctuation.\n// For example, brackets are remnants of the old age, meaning that the\n// phone number part in brackets (so called \"area code\") can be omitted\n// if dialing within the same \"area\".\n// And hyphens were clearly introduced for splitting local numbers into memorizable groups.\n// For example, remembering \"5553535\" is difficult but \"555-35-35\" is much simpler.\n// Imagine a man taking a bus from home to work and seeing an ad with a phone number.\n// He has a couple of seconds to memorize that number until it passes by.\n// If it were spaces instead of hyphens the man wouldn't necessarily get it,\n// but with hyphens instead of spaces the grouping is more explicit.\n// I personally think that hyphens introduce visual clutter,\n// so I prefer replacing them with spaces in international numbers.\n// In the modern age all output is done on displays where spaces are clearly distinguishable\n// so hyphens can be safely replaced with spaces without losing any legibility.\n//\nfunction applyInternationalSeparatorStyle(formattedNumber) {\n return formattedNumber.replace(new RegExp(\"[\".concat(_constants.VALID_PUNCTUATION, \"]+\"), 'g'), ' ').trim();\n}\n//# sourceMappingURL=applyInternationalSeparatorStyle.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.checkNumberLengthForType = checkNumberLengthForType;\nexports[\"default\"] = checkNumberLength;\n\nvar _mergeArrays = _interopRequireDefault(require(\"./mergeArrays.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction checkNumberLength(nationalNumber, metadata) {\n return checkNumberLengthForType(nationalNumber, undefined, metadata);\n} // Checks whether a number is possible for the country based on its length.\n// Should only be called for the \"new\" metadata which has \"possible lengths\".\n\n\nfunction checkNumberLengthForType(nationalNumber, type, metadata) {\n var type_info = metadata.type(type); // There should always be \"\" set for every type element.\n // This is declared in the XML schema.\n // For size efficiency, where a sub-description (e.g. fixed-line)\n // has the same \"\" as the \"general description\", this is missing,\n // so we fall back to the \"general description\". Where no numbers of the type\n // exist at all, there is one possible length (-1) which is guaranteed\n // not to match the length of any real phone number.\n\n var possible_lengths = type_info && type_info.possibleLengths() || metadata.possibleLengths(); // let local_lengths = type_info && type.possibleLengthsLocal() || metadata.possibleLengthsLocal()\n // Metadata before version `1.0.18` didn't contain `possible_lengths`.\n\n if (!possible_lengths) {\n return 'IS_POSSIBLE';\n }\n\n if (type === 'FIXED_LINE_OR_MOBILE') {\n // No such country in metadata.\n\n /* istanbul ignore next */\n if (!metadata.type('FIXED_LINE')) {\n // The rare case has been encountered where no fixedLine data is available\n // (true for some non-geographic entities), so we just check mobile.\n return checkNumberLengthForType(nationalNumber, 'MOBILE', metadata);\n }\n\n var mobile_type = metadata.type('MOBILE');\n\n if (mobile_type) {\n // Merge the mobile data in if there was any. \"Concat\" creates a new\n // array, it doesn't edit possible_lengths in place, so we don't need a copy.\n // Note that when adding the possible lengths from mobile, we have\n // to again check they aren't empty since if they are this indicates\n // they are the same as the general desc and should be obtained from there.\n possible_lengths = (0, _mergeArrays[\"default\"])(possible_lengths, mobile_type.possibleLengths()); // The current list is sorted; we need to merge in the new list and\n // re-sort (duplicates are okay). Sorting isn't so expensive because\n // the lists are very small.\n // if (local_lengths) {\n // \tlocal_lengths = mergeArrays(local_lengths, mobile_type.possibleLengthsLocal())\n // } else {\n // \tlocal_lengths = mobile_type.possibleLengthsLocal()\n // }\n }\n } // If the type doesn't exist then return 'INVALID_LENGTH'.\n else if (type && !type_info) {\n return 'INVALID_LENGTH';\n }\n\n var actual_length = nationalNumber.length; // In `libphonenumber-js` all \"local-only\" formats are dropped for simplicity.\n // // This is safe because there is never an overlap beween the possible lengths\n // // and the local-only lengths; this is checked at build time.\n // if (local_lengths && local_lengths.indexOf(nationalNumber.length) >= 0)\n // {\n // \treturn 'IS_POSSIBLE_LOCAL_ONLY'\n // }\n\n var minimum_length = possible_lengths[0];\n\n if (minimum_length === actual_length) {\n return 'IS_POSSIBLE';\n }\n\n if (minimum_length > actual_length) {\n return 'TOO_SHORT';\n }\n\n if (possible_lengths[possible_lengths.length - 1] < actual_length) {\n return 'TOO_LONG';\n } // We skip the first element since we've already checked it.\n\n\n return possible_lengths.indexOf(actual_length, 1) >= 0 ? 'IS_POSSIBLE' : 'INVALID_LENGTH';\n}\n//# sourceMappingURL=checkNumberLength.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = createExtensionPattern;\n\nvar _constants = require(\"../../constants.js\");\n\n// The RFC 3966 format for extensions.\nvar RFC3966_EXTN_PREFIX = ';ext=';\n/**\r\n * Helper method for constructing regular expressions for parsing. Creates\r\n * an expression that captures up to max_length digits.\r\n * @return {string} RegEx pattern to capture extension digits.\r\n */\n\nvar getExtensionDigitsPattern = function getExtensionDigitsPattern(maxLength) {\n return \"([\".concat(_constants.VALID_DIGITS, \"]{1,\").concat(maxLength, \"})\");\n};\n/**\r\n * Helper initialiser method to create the regular-expression pattern to match\r\n * extensions.\r\n * Copy-pasted from Google's `libphonenumber`:\r\n * https://github.com/google/libphonenumber/blob/55b2646ec9393f4d3d6661b9c82ef9e258e8b829/javascript/i18n/phonenumbers/phonenumberutil.js#L759-L766\r\n * @return {string} RegEx pattern to capture extensions.\r\n */\n\n\nfunction createExtensionPattern(purpose) {\n // We cap the maximum length of an extension based on the ambiguity of the way\n // the extension is prefixed. As per ITU, the officially allowed length for\n // extensions is actually 40, but we don't support this since we haven't seen real\n // examples and this introduces many false interpretations as the extension labels\n // are not standardized.\n\n /** @type {string} */\n var extLimitAfterExplicitLabel = '20';\n /** @type {string} */\n\n var extLimitAfterLikelyLabel = '15';\n /** @type {string} */\n\n var extLimitAfterAmbiguousChar = '9';\n /** @type {string} */\n\n var extLimitWhenNotSure = '6';\n /** @type {string} */\n\n var possibleSeparatorsBetweenNumberAndExtLabel = \"[ \\xA0\\\\t,]*\"; // Optional full stop (.) or colon, followed by zero or more spaces/tabs/commas.\n\n /** @type {string} */\n\n var possibleCharsAfterExtLabel = \"[:\\\\.\\uFF0E]?[ \\xA0\\\\t,-]*\";\n /** @type {string} */\n\n var optionalExtnSuffix = \"#?\"; // Here the extension is called out in more explicit way, i.e mentioning it obvious\n // patterns like \"ext.\".\n\n /** @type {string} */\n\n var explicitExtLabels = \"(?:e?xt(?:ensi(?:o\\u0301?|\\xF3))?n?|\\uFF45?\\uFF58\\uFF54\\uFF4E?|\\u0434\\u043E\\u0431|anexo)\"; // One-character symbols that can be used to indicate an extension, and less\n // commonly used or more ambiguous extension labels.\n\n /** @type {string} */\n\n var ambiguousExtLabels = \"(?:[x\\uFF58#\\uFF03~\\uFF5E]|int|\\uFF49\\uFF4E\\uFF54)\"; // When extension is not separated clearly.\n\n /** @type {string} */\n\n var ambiguousSeparator = \"[- ]+\"; // This is the same as possibleSeparatorsBetweenNumberAndExtLabel, but not matching\n // comma as extension label may have it.\n\n /** @type {string} */\n\n var possibleSeparatorsNumberExtLabelNoComma = \"[ \\xA0\\\\t]*\"; // \",,\" is commonly used for auto dialling the extension when connected. First\n // comma is matched through possibleSeparatorsBetweenNumberAndExtLabel, so we do\n // not repeat it here. Semi-colon works in Iphone and Android also to pop up a\n // button with the extension number following.\n\n /** @type {string} */\n\n var autoDiallingAndExtLabelsFound = \"(?:,{2}|;)\";\n /** @type {string} */\n\n var rfcExtn = RFC3966_EXTN_PREFIX + getExtensionDigitsPattern(extLimitAfterExplicitLabel);\n /** @type {string} */\n\n var explicitExtn = possibleSeparatorsBetweenNumberAndExtLabel + explicitExtLabels + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterExplicitLabel) + optionalExtnSuffix;\n /** @type {string} */\n\n var ambiguousExtn = possibleSeparatorsBetweenNumberAndExtLabel + ambiguousExtLabels + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterAmbiguousChar) + optionalExtnSuffix;\n /** @type {string} */\n\n var americanStyleExtnWithSuffix = ambiguousSeparator + getExtensionDigitsPattern(extLimitWhenNotSure) + \"#\";\n /** @type {string} */\n\n var autoDiallingExtn = possibleSeparatorsNumberExtLabelNoComma + autoDiallingAndExtLabelsFound + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterLikelyLabel) + optionalExtnSuffix;\n /** @type {string} */\n\n var onlyCommasExtn = possibleSeparatorsNumberExtLabelNoComma + \"(?:,)+\" + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterAmbiguousChar) + optionalExtnSuffix; // The first regular expression covers RFC 3966 format, where the extension is added\n // using \";ext=\". The second more generic where extension is mentioned with explicit\n // labels like \"ext:\". In both the above cases we allow more numbers in extension than\n // any other extension labels. The third one captures when single character extension\n // labels or less commonly used labels are used. In such cases we capture fewer\n // extension digits in order to reduce the chance of falsely interpreting two\n // numbers beside each other as a number + extension. The fourth one covers the\n // special case of American numbers where the extension is written with a hash\n // at the end, such as \"- 503#\". The fifth one is exclusively for extension\n // autodialling formats which are used when dialling and in this case we accept longer\n // extensions. The last one is more liberal on the number of commas that acts as\n // extension labels, so we have a strict cap on the number of digits in such extensions.\n\n return rfcExtn + \"|\" + explicitExtn + \"|\" + ambiguousExtn + \"|\" + americanStyleExtnWithSuffix + \"|\" + autoDiallingExtn + \"|\" + onlyCommasExtn;\n}\n//# sourceMappingURL=createExtensionPattern.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = extractExtension;\n\nvar _createExtensionPattern = _interopRequireDefault(require(\"./createExtensionPattern.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// Regexp of all known extension prefixes used by different regions followed by\n// 1 or more valid digits, for use when parsing.\nvar EXTN_PATTERN = new RegExp('(?:' + (0, _createExtensionPattern[\"default\"])() + ')$', 'i'); // Strips any extension (as in, the part of the number dialled after the call is\n// connected, usually indicated with extn, ext, x or similar) from the end of\n// the number, and returns it.\n\nfunction extractExtension(number) {\n var start = number.search(EXTN_PATTERN);\n\n if (start < 0) {\n return {};\n } // If we find a potential extension, and the number preceding this is a viable\n // number, we assume it is an extension.\n\n\n var numberWithoutExtension = number.slice(0, start);\n var matches = number.match(EXTN_PATTERN);\n var i = 1;\n\n while (i < matches.length) {\n if (matches[i]) {\n return {\n number: numberWithoutExtension,\n ext: matches[i]\n };\n }\n\n i++;\n }\n}\n//# sourceMappingURL=extractExtension.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = extractCountryCallingCode;\n\nvar _stripIddPrefix = _interopRequireDefault(require(\"./stripIddPrefix.js\"));\n\nvar _extractCountryCallingCodeFromInternationalNumberWithoutPlusSign = _interopRequireDefault(require(\"./extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js\"));\n\nvar _metadata = _interopRequireDefault(require(\"../metadata.js\"));\n\nvar _constants = require(\"../constants.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\r\n * Converts a phone number digits (possibly with a `+`)\r\n * into a calling code and the rest phone number digits.\r\n * The \"rest phone number digits\" could include\r\n * a national prefix, carrier code, and national\r\n * (significant) number.\r\n * @param {string} number — Phone number digits (possibly with a `+`).\r\n * @param {string} [country] — Default country.\r\n * @param {string} [callingCode] — Default calling code (some phone numbering plans are non-geographic).\r\n * @param {object} metadata\r\n * @return {object} `{ countryCallingCodeSource: string?, countryCallingCode: string?, number: string }`\r\n * @example\r\n * // Returns `{ countryCallingCode: \"1\", number: \"2133734253\" }`.\r\n * extractCountryCallingCode('2133734253', 'US', null, metadata)\r\n * extractCountryCallingCode('2133734253', null, '1', metadata)\r\n * extractCountryCallingCode('+12133734253', null, null, metadata)\r\n * extractCountryCallingCode('+12133734253', 'RU', null, metadata)\r\n */\nfunction extractCountryCallingCode(number, country, callingCode, metadata) {\n if (!number) {\n return {};\n }\n\n var isNumberWithIddPrefix; // If this is not an international phone number,\n // then either extract an \"IDD\" prefix, or extract a\n // country calling code from a number by autocorrecting it\n // by prepending a leading `+` in cases when it starts\n // with the country calling code.\n // https://wikitravel.org/en/International_dialling_prefix\n // https://github.com/catamphetamine/libphonenumber-js/issues/376\n\n if (number[0] !== '+') {\n // Convert an \"out-of-country\" dialing phone number\n // to a proper international phone number.\n var numberWithoutIDD = (0, _stripIddPrefix[\"default\"])(number, country, callingCode, metadata); // If an IDD prefix was stripped then\n // convert the number to international one\n // for subsequent parsing.\n\n if (numberWithoutIDD && numberWithoutIDD !== number) {\n isNumberWithIddPrefix = true;\n number = '+' + numberWithoutIDD;\n } else {\n // Check to see if the number starts with the country calling code\n // for the default country. If so, we remove the country calling code,\n // and do some checks on the validity of the number before and after.\n // https://github.com/catamphetamine/libphonenumber-js/issues/376\n if (country || callingCode) {\n var _extractCountryCallin = (0, _extractCountryCallingCodeFromInternationalNumberWithoutPlusSign[\"default\"])(number, country, callingCode, metadata),\n countryCallingCode = _extractCountryCallin.countryCallingCode,\n shorterNumber = _extractCountryCallin.number;\n\n if (countryCallingCode) {\n return {\n countryCallingCodeSource: 'FROM_NUMBER_WITHOUT_PLUS_SIGN',\n countryCallingCode: countryCallingCode,\n number: shorterNumber\n };\n }\n }\n\n return {\n // No need to set it to `UNSPECIFIED`. It can be just `undefined`.\n // countryCallingCodeSource: 'UNSPECIFIED',\n number: number\n };\n }\n } // Fast abortion: country codes do not begin with a '0'\n\n\n if (number[1] === '0') {\n return {};\n }\n\n metadata = new _metadata[\"default\"](metadata); // The thing with country phone codes\n // is that they are orthogonal to each other\n // i.e. there's no such country phone code A\n // for which country phone code B exists\n // where B starts with A.\n // Therefore, while scanning digits,\n // if a valid country code is found,\n // that means that it is the country code.\n //\n\n var i = 2;\n\n while (i - 1 <= _constants.MAX_LENGTH_COUNTRY_CODE && i <= number.length) {\n var _countryCallingCode = number.slice(1, i);\n\n if (metadata.hasCallingCode(_countryCallingCode)) {\n metadata.selectNumberingPlan(_countryCallingCode);\n return {\n countryCallingCodeSource: isNumberWithIddPrefix ? 'FROM_NUMBER_WITH_IDD' : 'FROM_NUMBER_WITH_PLUS_SIGN',\n countryCallingCode: _countryCallingCode,\n number: number.slice(i)\n };\n }\n\n i++;\n }\n\n return {};\n} // The possible values for the returned `countryCallingCodeSource` are:\n//\n// Copy-pasted from:\n// https://github.com/google/libphonenumber/blob/master/resources/phonenumber.proto\n//\n// // The source from which the country_code is derived. This is not set in the\n// // general parsing method, but in the method that parses and keeps raw_input.\n// // New fields could be added upon request.\n// enum CountryCodeSource {\n// // Default value returned if this is not set, because the phone number was\n// // created using parse, not parseAndKeepRawInput. hasCountryCodeSource will\n// // return false if this is the case.\n// UNSPECIFIED = 0;\n//\n// // The country_code is derived based on a phone number with a leading \"+\",\n// // e.g. the French number \"+33 1 42 68 53 00\".\n// FROM_NUMBER_WITH_PLUS_SIGN = 1;\n//\n// // The country_code is derived based on a phone number with a leading IDD,\n// // e.g. the French number \"011 33 1 42 68 53 00\", as it is dialled from US.\n// FROM_NUMBER_WITH_IDD = 5;\n//\n// // The country_code is derived based on a phone number without a leading\n// // \"+\", e.g. the French number \"33 1 42 68 53 00\" when defaultCountry is\n// // supplied as France.\n// FROM_NUMBER_WITHOUT_PLUS_SIGN = 10;\n//\n// // The country_code is derived NOT based on the phone number itself, but\n// // from the defaultCountry parameter provided in the parsing function by the\n// // clients. This happens mostly for numbers written in the national format\n// // (without country code). For example, this would be set when parsing the\n// // French number \"01 42 68 53 00\", when defaultCountry is supplied as\n// // France.\n// FROM_DEFAULT_COUNTRY = 20;\n// }\n//# sourceMappingURL=extractCountryCallingCode.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = extractCountryCallingCodeFromInternationalNumberWithoutPlusSign;\n\nvar _metadata = _interopRequireDefault(require(\"../metadata.js\"));\n\nvar _matchesEntirely = _interopRequireDefault(require(\"./matchesEntirely.js\"));\n\nvar _extractNationalNumber = _interopRequireDefault(require(\"./extractNationalNumber.js\"));\n\nvar _checkNumberLength = _interopRequireDefault(require(\"./checkNumberLength.js\"));\n\nvar _getCountryCallingCode = _interopRequireDefault(require(\"../getCountryCallingCode.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\r\n * Sometimes some people incorrectly input international phone numbers\r\n * without the leading `+`. This function corrects such input.\r\n * @param {string} number — Phone number digits.\r\n * @param {string?} country\r\n * @param {string?} callingCode\r\n * @param {object} metadata\r\n * @return {object} `{ countryCallingCode: string?, number: string }`.\r\n */\nfunction extractCountryCallingCodeFromInternationalNumberWithoutPlusSign(number, country, callingCode, metadata) {\n var countryCallingCode = country ? (0, _getCountryCallingCode[\"default\"])(country, metadata) : callingCode;\n\n if (number.indexOf(countryCallingCode) === 0) {\n metadata = new _metadata[\"default\"](metadata);\n metadata.selectNumberingPlan(country, callingCode);\n var possibleShorterNumber = number.slice(countryCallingCode.length);\n\n var _extractNationalNumbe = (0, _extractNationalNumber[\"default\"])(possibleShorterNumber, metadata),\n possibleShorterNationalNumber = _extractNationalNumbe.nationalNumber;\n\n var _extractNationalNumbe2 = (0, _extractNationalNumber[\"default\"])(number, metadata),\n nationalNumber = _extractNationalNumbe2.nationalNumber; // If the number was not valid before but is valid now,\n // or if it was too long before, we consider the number\n // with the country calling code stripped to be a better result\n // and keep that instead.\n // For example, in Germany (+49), `49` is a valid area code,\n // so if a number starts with `49`, it could be both a valid\n // national German number or an international number without\n // a leading `+`.\n\n\n if (!(0, _matchesEntirely[\"default\"])(nationalNumber, metadata.nationalNumberPattern()) && (0, _matchesEntirely[\"default\"])(possibleShorterNationalNumber, metadata.nationalNumberPattern()) || (0, _checkNumberLength[\"default\"])(nationalNumber, metadata) === 'TOO_LONG') {\n return {\n countryCallingCode: countryCallingCode,\n number: possibleShorterNumber\n };\n }\n }\n\n return {\n number: number\n };\n}\n//# sourceMappingURL=extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js.map","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = extractFormattedPhoneNumberFromPossibleRfc3966NumberUri;\n\nvar _extractPhoneContext = _interopRequireWildcard(require(\"./extractPhoneContext.js\"));\n\nvar _ParseError = _interopRequireDefault(require(\"../ParseError.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\r\n * @param {string} numberToParse\r\n * @param {string} nationalNumber\r\n * @return {}\r\n */\nfunction extractFormattedPhoneNumberFromPossibleRfc3966NumberUri(numberToParse, _ref) {\n var extractFormattedPhoneNumber = _ref.extractFormattedPhoneNumber;\n var phoneContext = (0, _extractPhoneContext[\"default\"])(numberToParse);\n\n if (!(0, _extractPhoneContext.isPhoneContextValid)(phoneContext)) {\n throw new _ParseError[\"default\"]('NOT_A_NUMBER');\n }\n\n var phoneNumberString;\n\n if (phoneContext === null) {\n // Extract a possible number from the string passed in.\n // (this strips leading characters that could not be the start of a phone number)\n phoneNumberString = extractFormattedPhoneNumber(numberToParse) || '';\n } else {\n phoneNumberString = ''; // If the phone context contains a phone number prefix, we need to capture\n // it, whereas domains will be ignored.\n\n if (phoneContext.charAt(0) === _extractPhoneContext.PLUS_SIGN) {\n phoneNumberString += phoneContext;\n } // Now append everything between the \"tel:\" prefix and the phone-context.\n // This should include the national number, an optional extension or\n // isdn-subaddress component. Note we also handle the case when \"tel:\" is\n // missing, as we have seen in some of the phone number inputs.\n // In that case, we append everything from the beginning.\n\n\n var indexOfRfc3966Prefix = numberToParse.indexOf(_extractPhoneContext.RFC3966_PREFIX_);\n var indexOfNationalNumber; // RFC 3966 \"tel:\" prefix is preset at this stage because\n // `isPhoneContextValid()` requires it to be present.\n\n /* istanbul ignore else */\n\n if (indexOfRfc3966Prefix >= 0) {\n indexOfNationalNumber = indexOfRfc3966Prefix + _extractPhoneContext.RFC3966_PREFIX_.length;\n } else {\n indexOfNationalNumber = 0;\n }\n\n var indexOfPhoneContext = numberToParse.indexOf(_extractPhoneContext.RFC3966_PHONE_CONTEXT_);\n phoneNumberString += numberToParse.substring(indexOfNationalNumber, indexOfPhoneContext);\n } // Delete the isdn-subaddress and everything after it if it is present.\n // Note extension won't appear at the same time with isdn-subaddress\n // according to paragraph 5.3 of the RFC3966 spec.\n\n\n var indexOfIsdn = phoneNumberString.indexOf(_extractPhoneContext.RFC3966_ISDN_SUBADDRESS_);\n\n if (indexOfIsdn > 0) {\n phoneNumberString = phoneNumberString.substring(0, indexOfIsdn);\n } // If both phone context and isdn-subaddress are absent but other\n // parameters are present, the parameters are left in nationalNumber.\n // This is because we are concerned about deleting content from a potential\n // number string when there is no strong evidence that the number is\n // actually written in RFC3966.\n\n\n if (phoneNumberString !== '') {\n return phoneNumberString;\n }\n}\n//# sourceMappingURL=extractFormattedPhoneNumberFromPossibleRfc3966NumberUri.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = extractNationalNumber;\n\nvar _extractNationalNumberFromPossiblyIncompleteNumber = _interopRequireDefault(require(\"./extractNationalNumberFromPossiblyIncompleteNumber.js\"));\n\nvar _matchesEntirely = _interopRequireDefault(require(\"./matchesEntirely.js\"));\n\nvar _checkNumberLength = _interopRequireDefault(require(\"./checkNumberLength.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\r\n * Strips national prefix and carrier code from a complete phone number.\r\n * The difference from the non-\"FromCompleteNumber\" function is that\r\n * it won't extract national prefix if the resultant number is too short\r\n * to be a complete number for the selected phone numbering plan.\r\n * @param {string} number — Complete phone number digits.\r\n * @param {Metadata} metadata — Metadata with a phone numbering plan selected.\r\n * @return {object} `{ nationalNumber: string, carrierCode: string? }`.\r\n */\nfunction extractNationalNumber(number, metadata) {\n // Parsing national prefixes and carrier codes\n // is only required for local phone numbers\n // but some people don't understand that\n // and sometimes write international phone numbers\n // with national prefixes (or maybe even carrier codes).\n // http://ucken.blogspot.ru/2016/03/trunk-prefixes-in-skype4b.html\n // Google's original library forgives such mistakes\n // and so does this library, because it has been requested:\n // https://github.com/catamphetamine/libphonenumber-js/issues/127\n var _extractNationalNumbe = (0, _extractNationalNumberFromPossiblyIncompleteNumber[\"default\"])(number, metadata),\n carrierCode = _extractNationalNumbe.carrierCode,\n nationalNumber = _extractNationalNumbe.nationalNumber;\n\n if (nationalNumber !== number) {\n if (!shouldHaveExtractedNationalPrefix(number, nationalNumber, metadata)) {\n // Don't strip the national prefix.\n return {\n nationalNumber: number\n };\n } // Check the national (significant) number length after extracting national prefix and carrier code.\n // Legacy generated metadata (before `1.0.18`) didn't support the \"possible lengths\" feature.\n\n\n if (metadata.possibleLengths()) {\n // The number remaining after stripping the national prefix and carrier code\n // should be long enough to have a possible length for the country.\n // Otherwise, don't strip the national prefix and carrier code,\n // since the original number could be a valid number.\n // This check has been copy-pasted \"as is\" from Google's original library:\n // https://github.com/google/libphonenumber/blob/876268eb1ad6cdc1b7b5bef17fc5e43052702d57/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L3236-L3250\n // It doesn't check for the \"possibility\" of the original `number`.\n // I guess it's fine not checking that one. It works as is anyway.\n if (!isPossibleIncompleteNationalNumber(nationalNumber, metadata)) {\n // Don't strip the national prefix.\n return {\n nationalNumber: number\n };\n }\n }\n }\n\n return {\n nationalNumber: nationalNumber,\n carrierCode: carrierCode\n };\n} // In some countries, the same digit could be a national prefix\n// or a leading digit of a valid phone number.\n// For example, in Russia, national prefix is `8`,\n// and also `800 555 35 35` is a valid number\n// in which `8` is not a national prefix, but the first digit\n// of a national (significant) number.\n// Same's with Belarus:\n// `82004910060` is a valid national (significant) number,\n// but `2004910060` is not.\n// To support such cases (to prevent the code from always stripping\n// national prefix), a condition is imposed: a national prefix\n// is not extracted when the original number is \"viable\" and the\n// resultant number is not, a \"viable\" national number being the one\n// that matches `national_number_pattern`.\n\n\nfunction shouldHaveExtractedNationalPrefix(nationalNumberBefore, nationalNumberAfter, metadata) {\n // The equivalent in Google's code is:\n // https://github.com/google/libphonenumber/blob/e326fa1fc4283bb05eb35cb3c15c18f98a31af33/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L2969-L3004\n if ((0, _matchesEntirely[\"default\"])(nationalNumberBefore, metadata.nationalNumberPattern()) && !(0, _matchesEntirely[\"default\"])(nationalNumberAfter, metadata.nationalNumberPattern())) {\n return false;\n } // This \"is possible\" national number (length) check has been commented out\n // because it's superceded by the (effectively) same check done in the\n // `extractNationalNumber()` function after it calls `shouldHaveExtractedNationalPrefix()`.\n // In other words, why run the same check twice if it could only be run once.\n // // Check the national (significant) number length after extracting national prefix and carrier code.\n // // Fixes a minor \"weird behavior\" bug: https://gitlab.com/catamphetamine/libphonenumber-js/-/issues/57\n // // (Legacy generated metadata (before `1.0.18`) didn't support the \"possible lengths\" feature).\n // if (metadata.possibleLengths()) {\n // \tif (isPossibleIncompleteNationalNumber(nationalNumberBefore, metadata) &&\n // \t\t!isPossibleIncompleteNationalNumber(nationalNumberAfter, metadata)) {\n // \t\treturn false\n // \t}\n // }\n\n\n return true;\n}\n\nfunction isPossibleIncompleteNationalNumber(nationalNumber, metadata) {\n switch ((0, _checkNumberLength[\"default\"])(nationalNumber, metadata)) {\n case 'TOO_SHORT':\n case 'INVALID_LENGTH':\n // This library ignores \"local-only\" phone numbers (for simplicity).\n // See the readme for more info on what are \"local-only\" phone numbers.\n // case 'IS_POSSIBLE_LOCAL_ONLY':\n return false;\n\n default:\n return true;\n }\n}\n//# sourceMappingURL=extractNationalNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = extractNationalNumberFromPossiblyIncompleteNumber;\n\n/**\r\n * Strips any national prefix (such as 0, 1) present in a\r\n * (possibly incomplete) number provided.\r\n * \"Carrier codes\" are only used in Colombia and Brazil,\r\n * and only when dialing within those countries from a mobile phone to a fixed line number.\r\n * Sometimes it won't actually strip national prefix\r\n * and will instead prepend some digits to the `number`:\r\n * for example, when number `2345678` is passed with `VI` country selected,\r\n * it will return `{ number: \"3402345678\" }`, because `340` area code is prepended.\r\n * @param {string} number — National number digits.\r\n * @param {object} metadata — Metadata with country selected.\r\n * @return {object} `{ nationalNumber: string, nationalPrefix: string? carrierCode: string? }`. Even if a national prefix was extracted, it's not necessarily present in the returned object, so don't rely on its presence in the returned object in order to find out whether a national prefix has been extracted or not.\r\n */\nfunction extractNationalNumberFromPossiblyIncompleteNumber(number, metadata) {\n if (number && metadata.numberingPlan.nationalPrefixForParsing()) {\n // See METADATA.md for the description of\n // `national_prefix_for_parsing` and `national_prefix_transform_rule`.\n // Attempt to parse the first digits as a national prefix.\n var prefixPattern = new RegExp('^(?:' + metadata.numberingPlan.nationalPrefixForParsing() + ')');\n var prefixMatch = prefixPattern.exec(number);\n\n if (prefixMatch) {\n var nationalNumber;\n var carrierCode; // https://gitlab.com/catamphetamine/libphonenumber-js/-/blob/master/METADATA.md#national_prefix_for_parsing--national_prefix_transform_rule\n // If a `national_prefix_for_parsing` has any \"capturing groups\"\n // then it means that the national (significant) number is equal to\n // those \"capturing groups\" transformed via `national_prefix_transform_rule`,\n // and nothing could be said about the actual national prefix:\n // what is it and was it even there.\n // If a `national_prefix_for_parsing` doesn't have any \"capturing groups\",\n // then everything it matches is a national prefix.\n // To determine whether `national_prefix_for_parsing` matched any\n // \"capturing groups\", the value of the result of calling `.exec()`\n // is looked at, and if it has non-undefined values where there're\n // \"capturing groups\" in the regular expression, then it means\n // that \"capturing groups\" have been matched.\n // It's not possible to tell whether there'll be any \"capturing gropus\"\n // before the matching process, because a `national_prefix_for_parsing`\n // could exhibit both behaviors.\n\n var capturedGroupsCount = prefixMatch.length - 1;\n var hasCapturedGroups = capturedGroupsCount > 0 && prefixMatch[capturedGroupsCount];\n\n if (metadata.nationalPrefixTransformRule() && hasCapturedGroups) {\n nationalNumber = number.replace(prefixPattern, metadata.nationalPrefixTransformRule()); // If there's more than one captured group,\n // then carrier code is the second one.\n\n if (capturedGroupsCount > 1) {\n carrierCode = prefixMatch[1];\n }\n } // If there're no \"capturing groups\",\n // or if there're \"capturing groups\" but no\n // `national_prefix_transform_rule`,\n // then just strip the national prefix from the number,\n // and possibly a carrier code.\n // Seems like there could be more.\n else {\n // `prefixBeforeNationalNumber` is the whole substring matched by\n // the `national_prefix_for_parsing` regular expression.\n // There seem to be no guarantees that it's just a national prefix.\n // For example, if there's a carrier code, it's gonna be a\n // part of `prefixBeforeNationalNumber` too.\n var prefixBeforeNationalNumber = prefixMatch[0];\n nationalNumber = number.slice(prefixBeforeNationalNumber.length); // If there's at least one captured group,\n // then carrier code is the first one.\n\n if (hasCapturedGroups) {\n carrierCode = prefixMatch[1];\n }\n } // Tries to guess whether a national prefix was present in the input.\n // This is not something copy-pasted from Google's library:\n // they don't seem to have an equivalent for that.\n // So this isn't an \"officially approved\" way of doing something like that.\n // But since there seems no other existing method, this library uses it.\n\n\n var nationalPrefix;\n\n if (hasCapturedGroups) {\n var possiblePositionOfTheFirstCapturedGroup = number.indexOf(prefixMatch[1]);\n var possibleNationalPrefix = number.slice(0, possiblePositionOfTheFirstCapturedGroup); // Example: an Argentinian (AR) phone number `0111523456789`.\n // `prefixMatch[0]` is `01115`, and `$1` is `11`,\n // and the rest of the phone number is `23456789`.\n // The national number is transformed via `9$1` to `91123456789`.\n // National prefix `0` is detected being present at the start.\n // if (possibleNationalPrefix.indexOf(metadata.numberingPlan.nationalPrefix()) === 0) {\n\n if (possibleNationalPrefix === metadata.numberingPlan.nationalPrefix()) {\n nationalPrefix = metadata.numberingPlan.nationalPrefix();\n }\n } else {\n nationalPrefix = prefixMatch[0];\n }\n\n return {\n nationalNumber: nationalNumber,\n nationalPrefix: nationalPrefix,\n carrierCode: carrierCode\n };\n }\n }\n\n return {\n nationalNumber: number\n };\n}\n//# sourceMappingURL=extractNationalNumberFromPossiblyIncompleteNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.RFC3966_PREFIX_ = exports.RFC3966_PHONE_CONTEXT_ = exports.RFC3966_ISDN_SUBADDRESS_ = exports.PLUS_SIGN = void 0;\nexports[\"default\"] = extractPhoneContext;\nexports.isPhoneContextValid = isPhoneContextValid;\n\nvar _constants = require(\"../constants.js\");\n\n// When phone numbers are written in `RFC3966` format — `\"tel:+12133734253\"` —\n// they can have their \"calling code\" part written separately in a `phone-context` parameter.\n// Example: `\"tel:12133734253;phone-context=+1\"`.\n// This function parses the full phone number from the local number and the `phone-context`\n// when the `phone-context` contains a `+` sign.\nvar PLUS_SIGN = '+';\nexports.PLUS_SIGN = PLUS_SIGN;\nvar RFC3966_VISUAL_SEPARATOR_ = '[\\\\-\\\\.\\\\(\\\\)]?';\nvar RFC3966_PHONE_DIGIT_ = '(' + '[' + _constants.VALID_DIGITS + ']' + '|' + RFC3966_VISUAL_SEPARATOR_ + ')';\nvar RFC3966_GLOBAL_NUMBER_DIGITS_ = '^' + '\\\\' + PLUS_SIGN + RFC3966_PHONE_DIGIT_ + '*' + '[' + _constants.VALID_DIGITS + ']' + RFC3966_PHONE_DIGIT_ + '*' + '$';\n/**\r\n * Regular expression of valid global-number-digits for the phone-context\r\n * parameter, following the syntax defined in RFC3966.\r\n */\n\nvar RFC3966_GLOBAL_NUMBER_DIGITS_PATTERN_ = new RegExp(RFC3966_GLOBAL_NUMBER_DIGITS_, 'g'); // In this port of Google's library, we don't accept alpha characters in phone numbers.\n// const ALPHANUM_ = VALID_ALPHA_ + VALID_DIGITS\n\nvar ALPHANUM_ = _constants.VALID_DIGITS;\nvar RFC3966_DOMAINLABEL_ = '[' + ALPHANUM_ + ']+((\\\\-)*[' + ALPHANUM_ + '])*';\nvar VALID_ALPHA_ = 'a-zA-Z';\nvar RFC3966_TOPLABEL_ = '[' + VALID_ALPHA_ + ']+((\\\\-)*[' + ALPHANUM_ + '])*';\nvar RFC3966_DOMAINNAME_ = '^(' + RFC3966_DOMAINLABEL_ + '\\\\.)*' + RFC3966_TOPLABEL_ + '\\\\.?$';\n/**\r\n * Regular expression of valid domainname for the phone-context parameter,\r\n * following the syntax defined in RFC3966.\r\n */\n\nvar RFC3966_DOMAINNAME_PATTERN_ = new RegExp(RFC3966_DOMAINNAME_, 'g');\nvar RFC3966_PREFIX_ = 'tel:';\nexports.RFC3966_PREFIX_ = RFC3966_PREFIX_;\nvar RFC3966_PHONE_CONTEXT_ = ';phone-context=';\nexports.RFC3966_PHONE_CONTEXT_ = RFC3966_PHONE_CONTEXT_;\nvar RFC3966_ISDN_SUBADDRESS_ = ';isub=';\n/**\r\n * Extracts the value of the phone-context parameter of `numberToExtractFrom`,\r\n * following the syntax defined in RFC3966.\r\n *\r\n * @param {string} numberToExtractFrom\r\n * @return {string|null} the extracted string (possibly empty), or `null` if no phone-context parameter is found.\r\n */\n\nexports.RFC3966_ISDN_SUBADDRESS_ = RFC3966_ISDN_SUBADDRESS_;\n\nfunction extractPhoneContext(numberToExtractFrom) {\n var indexOfPhoneContext = numberToExtractFrom.indexOf(RFC3966_PHONE_CONTEXT_); // If no phone-context parameter is present\n\n if (indexOfPhoneContext < 0) {\n return null;\n }\n\n var phoneContextStart = indexOfPhoneContext + RFC3966_PHONE_CONTEXT_.length; // If phone-context parameter is empty\n\n if (phoneContextStart >= numberToExtractFrom.length) {\n return '';\n }\n\n var phoneContextEnd = numberToExtractFrom.indexOf(';', phoneContextStart); // If phone-context is not the last parameter\n\n if (phoneContextEnd >= 0) {\n return numberToExtractFrom.substring(phoneContextStart, phoneContextEnd);\n } else {\n return numberToExtractFrom.substring(phoneContextStart);\n }\n}\n/**\r\n * Returns whether the value of phoneContext follows the syntax defined in RFC3966.\r\n *\r\n * @param {string|null} phoneContext\r\n * @return {boolean}\r\n */\n\n\nfunction isPhoneContextValid(phoneContext) {\n if (phoneContext === null) {\n return true;\n }\n\n if (phoneContext.length === 0) {\n return false;\n } // Does phone-context value match pattern of global-number-digits or domainname.\n\n\n return RFC3966_GLOBAL_NUMBER_DIGITS_PATTERN_.test(phoneContext) || RFC3966_DOMAINNAME_PATTERN_.test(phoneContext);\n}\n//# sourceMappingURL=extractPhoneContext.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.FIRST_GROUP_PATTERN = void 0;\nexports[\"default\"] = formatNationalNumberUsingFormat;\n\nvar _applyInternationalSeparatorStyle = _interopRequireDefault(require(\"./applyInternationalSeparatorStyle.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// This was originally set to $1 but there are some countries for which the\n// first group is not used in the national pattern (e.g. Argentina) so the $1\n// group does not match correctly. Therefore, we use `\\d`, so that the first\n// group actually used in the pattern will be matched.\nvar FIRST_GROUP_PATTERN = /(\\$\\d)/;\nexports.FIRST_GROUP_PATTERN = FIRST_GROUP_PATTERN;\n\nfunction formatNationalNumberUsingFormat(number, format, _ref) {\n var useInternationalFormat = _ref.useInternationalFormat,\n withNationalPrefix = _ref.withNationalPrefix,\n carrierCode = _ref.carrierCode,\n metadata = _ref.metadata;\n var formattedNumber = number.replace(new RegExp(format.pattern()), useInternationalFormat ? format.internationalFormat() : // This library doesn't use `domestic_carrier_code_formatting_rule`,\n // because that one is only used when formatting phone numbers\n // for dialing from a mobile phone, and this is not a dialing library.\n // carrierCode && format.domesticCarrierCodeFormattingRule()\n // \t// First, replace the $CC in the formatting rule with the desired carrier code.\n // \t// Then, replace the $FG in the formatting rule with the first group\n // \t// and the carrier code combined in the appropriate way.\n // \t? format.format().replace(FIRST_GROUP_PATTERN, format.domesticCarrierCodeFormattingRule().replace('$CC', carrierCode))\n // \t: (\n // \t\twithNationalPrefix && format.nationalPrefixFormattingRule()\n // \t\t\t? format.format().replace(FIRST_GROUP_PATTERN, format.nationalPrefixFormattingRule())\n // \t\t\t: format.format()\n // \t)\n withNationalPrefix && format.nationalPrefixFormattingRule() ? format.format().replace(FIRST_GROUP_PATTERN, format.nationalPrefixFormattingRule()) : format.format());\n\n if (useInternationalFormat) {\n return (0, _applyInternationalSeparatorStyle[\"default\"])(formattedNumber);\n }\n\n return formattedNumber;\n}\n//# sourceMappingURL=formatNationalNumberUsingFormat.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = getCountryByCallingCode;\n\nvar _getCountryByNationalNumber = _interopRequireDefault(require(\"./getCountryByNationalNumber.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false;\n\nfunction getCountryByCallingCode(callingCode, nationalPhoneNumber, metadata) {\n /* istanbul ignore if */\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (metadata.isNonGeographicCallingCode(callingCode)) {\n return '001';\n }\n }\n\n var possibleCountries = metadata.getCountryCodesForCallingCode(callingCode);\n\n if (!possibleCountries) {\n return;\n } // If there's just one country corresponding to the country code,\n // then just return it, without further phone number digits validation.\n\n\n if (possibleCountries.length === 1) {\n return possibleCountries[0];\n }\n\n return (0, _getCountryByNationalNumber[\"default\"])(possibleCountries, nationalPhoneNumber, metadata.metadata);\n}\n//# sourceMappingURL=getCountryByCallingCode.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = getCountryByNationalNumber;\n\nvar _metadata = _interopRequireDefault(require(\"../metadata.js\"));\n\nvar _getNumberType = _interopRequireDefault(require(\"./getNumberType.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction getCountryByNationalNumber(possibleCountries, nationalPhoneNumber, metadata) {\n // Re-create `metadata` because it will be selecting a `country`.\n metadata = new _metadata[\"default\"](metadata);\n\n for (var _iterator = _createForOfIteratorHelperLoose(possibleCountries), _step; !(_step = _iterator()).done;) {\n var country = _step.value;\n metadata.country(country); // \"Leading digits\" patterns are only defined for about 20% of all countries.\n // By definition, matching \"leading digits\" is a sufficient but not a necessary\n // condition for a phone number to belong to a country.\n // The point of \"leading digits\" check is that it's the fastest one to get a match.\n // https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/METADATA.md#leading_digits\n\n if (metadata.leadingDigits()) {\n if (nationalPhoneNumber && nationalPhoneNumber.search(metadata.leadingDigits()) === 0) {\n return country;\n }\n } // Else perform full validation with all of those\n // fixed-line/mobile/etc regular expressions.\n else if ((0, _getNumberType[\"default\"])({\n phone: nationalPhoneNumber,\n country: country\n }, undefined, metadata.metadata)) {\n return country;\n }\n }\n}\n//# sourceMappingURL=getCountryByNationalNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = getIddPrefix;\n\nvar _metadata = _interopRequireDefault(require(\"../metadata.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\r\n * Pattern that makes it easy to distinguish whether a region has a single\r\n * international dialing prefix or not. If a region has a single international\r\n * prefix (e.g. 011 in USA), it will be represented as a string that contains\r\n * a sequence of ASCII digits, and possibly a tilde, which signals waiting for\r\n * the tone. If there are multiple available international prefixes in a\r\n * region, they will be represented as a regex string that always contains one\r\n * or more characters that are not ASCII digits or a tilde.\r\n */\nvar SINGLE_IDD_PREFIX_REG_EXP = /^[\\d]+(?:[~\\u2053\\u223C\\uFF5E][\\d]+)?$/; // For regions that have multiple IDD prefixes\n// a preferred IDD prefix is returned.\n\nfunction getIddPrefix(country, callingCode, metadata) {\n var countryMetadata = new _metadata[\"default\"](metadata);\n countryMetadata.selectNumberingPlan(country, callingCode);\n\n if (countryMetadata.defaultIDDPrefix()) {\n return countryMetadata.defaultIDDPrefix();\n }\n\n if (SINGLE_IDD_PREFIX_REG_EXP.test(countryMetadata.IDDPrefix())) {\n return countryMetadata.IDDPrefix();\n }\n}\n//# sourceMappingURL=getIddPrefix.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = getNumberType;\nexports.isNumberTypeEqualTo = isNumberTypeEqualTo;\n\nvar _metadata = _interopRequireDefault(require(\"../metadata.js\"));\n\nvar _matchesEntirely = _interopRequireDefault(require(\"./matchesEntirely.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nvar NON_FIXED_LINE_PHONE_TYPES = ['MOBILE', 'PREMIUM_RATE', 'TOLL_FREE', 'SHARED_COST', 'VOIP', 'PERSONAL_NUMBER', 'PAGER', 'UAN', 'VOICEMAIL']; // Finds out national phone number type (fixed line, mobile, etc)\n\nfunction getNumberType(input, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {}; // When `parse()` returned `{}`\n // meaning that the phone number is not a valid one.\n\n if (!input.country) {\n return;\n }\n\n metadata = new _metadata[\"default\"](metadata);\n metadata.selectNumberingPlan(input.country, input.countryCallingCode);\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone; // The following is copy-pasted from the original function:\n // https://github.com/googlei18n/libphonenumber/blob/3ea547d4fbaa2d0b67588904dfa5d3f2557c27ff/javascript/i18n/phonenumbers/phonenumberutil.js#L2835\n // Is this national number even valid for this country\n\n if (!(0, _matchesEntirely[\"default\"])(nationalNumber, metadata.nationalNumberPattern())) {\n return;\n } // Is it fixed line number\n\n\n if (isNumberTypeEqualTo(nationalNumber, 'FIXED_LINE', metadata)) {\n // Because duplicate regular expressions are removed\n // to reduce metadata size, if \"mobile\" pattern is \"\"\n // then it means it was removed due to being a duplicate of the fixed-line pattern.\n //\n if (metadata.type('MOBILE') && metadata.type('MOBILE').pattern() === '') {\n return 'FIXED_LINE_OR_MOBILE';\n } // `MOBILE` type pattern isn't included if it matched `FIXED_LINE` one.\n // For example, for \"US\" country.\n // Old metadata (< `1.0.18`) had a specific \"types\" data structure\n // that happened to be `undefined` for `MOBILE` in that case.\n // Newer metadata (>= `1.0.18`) has another data structure that is\n // not `undefined` for `MOBILE` in that case (it's just an empty array).\n // So this `if` is just for backwards compatibility with old metadata.\n\n\n if (!metadata.type('MOBILE')) {\n return 'FIXED_LINE_OR_MOBILE';\n } // Check if the number happens to qualify as both fixed line and mobile.\n // (no such country in the minimal metadata set)\n\n /* istanbul ignore if */\n\n\n if (isNumberTypeEqualTo(nationalNumber, 'MOBILE', metadata)) {\n return 'FIXED_LINE_OR_MOBILE';\n }\n\n return 'FIXED_LINE';\n }\n\n for (var _iterator = _createForOfIteratorHelperLoose(NON_FIXED_LINE_PHONE_TYPES), _step; !(_step = _iterator()).done;) {\n var type = _step.value;\n\n if (isNumberTypeEqualTo(nationalNumber, type, metadata)) {\n return type;\n }\n }\n}\n\nfunction isNumberTypeEqualTo(nationalNumber, type, metadata) {\n type = metadata.type(type);\n\n if (!type || !type.pattern()) {\n return false;\n } // Check if any possible number lengths are present;\n // if so, we use them to avoid checking\n // the validation pattern if they don't match.\n // If they are absent, this means they match\n // the general description, which we have\n // already checked before a specific number type.\n\n\n if (type.possibleLengths() && type.possibleLengths().indexOf(nationalNumber.length) < 0) {\n return false;\n }\n\n return (0, _matchesEntirely[\"default\"])(nationalNumber, type.pattern());\n}\n//# sourceMappingURL=getNumberType.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = getPossibleCountriesForNumber;\n\nvar _metadata2 = _interopRequireDefault(require(\"../metadata.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\r\n * Returns a list of countries that the phone number could potentially belong to.\r\n * @param {string} callingCode — Calling code.\r\n * @param {string} nationalNumber — National (significant) number.\r\n * @param {object} metadata — Metadata.\r\n * @return {string[]} A list of possible countries.\r\n */\nfunction getPossibleCountriesForNumber(callingCode, nationalNumber, metadata) {\n var _metadata = new _metadata2[\"default\"](metadata);\n\n var possibleCountries = _metadata.getCountryCodesForCallingCode(callingCode);\n\n if (!possibleCountries) {\n return [];\n }\n\n return possibleCountries.filter(function (country) {\n return couldNationalNumberBelongToCountry(nationalNumber, country, metadata);\n });\n}\n\nfunction couldNationalNumberBelongToCountry(nationalNumber, country, metadata) {\n var _metadata = new _metadata2[\"default\"](metadata);\n\n _metadata.selectNumberingPlan(country);\n\n if (_metadata.numberingPlan.possibleLengths().indexOf(nationalNumber.length) >= 0) {\n return true;\n }\n\n return false;\n}\n//# sourceMappingURL=getPossibleCountriesForNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.VALID_PHONE_NUMBER_WITH_EXTENSION = exports.VALID_PHONE_NUMBER = void 0;\nexports[\"default\"] = isViablePhoneNumber;\nexports.isViablePhoneNumberStart = isViablePhoneNumberStart;\n\nvar _constants = require(\"../constants.js\");\n\nvar _createExtensionPattern = _interopRequireDefault(require(\"./extension/createExtensionPattern.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// Regular expression of viable phone numbers. This is location independent.\n// Checks we have at least three leading digits, and only valid punctuation,\n// alpha characters and digits in the phone number. Does not include extension\n// data. The symbol 'x' is allowed here as valid punctuation since it is often\n// used as a placeholder for carrier codes, for example in Brazilian phone\n// numbers. We also allow multiple '+' characters at the start.\n//\n// Corresponds to the following:\n// [digits]{minLengthNsn}|\n// plus_sign*\n// (([punctuation]|[star])*[digits]){3,}([punctuation]|[star]|[digits]|[alpha])*\n//\n// The first reg-ex is to allow short numbers (two digits long) to be parsed if\n// they are entered as \"15\" etc, but only if there is no punctuation in them.\n// The second expression restricts the number of digits to three or more, but\n// then allows them to be in international form, and to have alpha-characters\n// and punctuation. We split up the two reg-exes here and combine them when\n// creating the reg-ex VALID_PHONE_NUMBER_PATTERN itself so we can prefix it\n// with ^ and append $ to each branch.\n//\n// \"Note VALID_PUNCTUATION starts with a -,\n// so must be the first in the range\" (c) Google devs.\n// (wtf did they mean by saying that; probably nothing)\n//\nvar MIN_LENGTH_PHONE_NUMBER_PATTERN = '[' + _constants.VALID_DIGITS + ']{' + _constants.MIN_LENGTH_FOR_NSN + '}'; //\n// And this is the second reg-exp:\n// (see MIN_LENGTH_PHONE_NUMBER_PATTERN for a full description of this reg-exp)\n//\n\nvar VALID_PHONE_NUMBER = '[' + _constants.PLUS_CHARS + ']{0,1}' + '(?:' + '[' + _constants.VALID_PUNCTUATION + ']*' + '[' + _constants.VALID_DIGITS + ']' + '){3,}' + '[' + _constants.VALID_PUNCTUATION + _constants.VALID_DIGITS + ']*'; // This regular expression isn't present in Google's `libphonenumber`\n// and is only used to determine whether the phone number being input\n// is too short for it to even consider it a \"valid\" number.\n// This is just a way to differentiate between a really invalid phone\n// number like \"abcde\" and a valid phone number that a user has just\n// started inputting, like \"+1\" or \"1\": both these cases would be\n// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this\n// library can provide a more detailed error message — whether it's\n// really \"not a number\", or is it just a start of a valid phone number.\n\nexports.VALID_PHONE_NUMBER = VALID_PHONE_NUMBER;\nvar VALID_PHONE_NUMBER_START_REG_EXP = new RegExp('^' + '[' + _constants.PLUS_CHARS + ']{0,1}' + '(?:' + '[' + _constants.VALID_PUNCTUATION + ']*' + '[' + _constants.VALID_DIGITS + ']' + '){1,2}' + '$', 'i');\nvar VALID_PHONE_NUMBER_WITH_EXTENSION = VALID_PHONE_NUMBER + // Phone number extensions\n'(?:' + (0, _createExtensionPattern[\"default\"])() + ')?'; // The combined regular expression for valid phone numbers:\n//\n\nexports.VALID_PHONE_NUMBER_WITH_EXTENSION = VALID_PHONE_NUMBER_WITH_EXTENSION;\nvar VALID_PHONE_NUMBER_PATTERN = new RegExp( // Either a short two-digit-only phone number\n'^' + MIN_LENGTH_PHONE_NUMBER_PATTERN + '$' + '|' + // Or a longer fully parsed phone number (min 3 characters)\n'^' + VALID_PHONE_NUMBER_WITH_EXTENSION + '$', 'i'); // Checks to see if the string of characters could possibly be a phone number at\n// all. At the moment, checks to see that the string begins with at least 2\n// digits, ignoring any punctuation commonly found in phone numbers. This method\n// does not require the number to be normalized in advance - but does assume\n// that leading non-number symbols have been removed, such as by the method\n// `extract_possible_number`.\n//\n\nfunction isViablePhoneNumber(number) {\n return number.length >= _constants.MIN_LENGTH_FOR_NSN && VALID_PHONE_NUMBER_PATTERN.test(number);\n} // This is just a way to differentiate between a really invalid phone\n// number like \"abcde\" and a valid phone number that a user has just\n// started inputting, like \"+1\" or \"1\": both these cases would be\n// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this\n// library can provide a more detailed error message — whether it's\n// really \"not a number\", or is it just a start of a valid phone number.\n\n\nfunction isViablePhoneNumberStart(number) {\n return VALID_PHONE_NUMBER_START_REG_EXP.test(number);\n}\n//# sourceMappingURL=isViablePhoneNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = matchesEntirely;\n\n/**\r\n * Checks whether the entire input sequence can be matched\r\n * against the regular expression.\r\n * @return {boolean}\r\n */\nfunction matchesEntirely(text, regular_expression) {\n // If assigning the `''` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n text = text || '';\n return new RegExp('^(?:' + regular_expression + ')$').test(text);\n}\n//# sourceMappingURL=matchesEntirely.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = mergeArrays;\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/**\r\n * Merges two arrays.\r\n * @param {*} a\r\n * @param {*} b\r\n * @return {*}\r\n */\nfunction mergeArrays(a, b) {\n var merged = a.slice();\n\n for (var _iterator = _createForOfIteratorHelperLoose(b), _step; !(_step = _iterator()).done;) {\n var element = _step.value;\n\n if (a.indexOf(element) < 0) {\n merged.push(element);\n }\n }\n\n return merged.sort(function (a, b) {\n return a - b;\n }); // ES6 version, requires Set polyfill.\n // let merged = new Set(a)\n // for (const element of b) {\n // \tmerged.add(i)\n // }\n // return Array.from(merged).sort((a, b) => a - b)\n}\n//# sourceMappingURL=mergeArrays.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.DIGITS = void 0;\nexports[\"default\"] = parseDigits;\nexports.parseDigit = parseDigit;\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n// These mappings map a character (key) to a specific digit that should\n// replace it for normalization purposes. Non-European digits that\n// may be used in phone numbers are mapped to a European equivalent.\n//\n// E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.\n//\nvar DIGITS = {\n '0': '0',\n '1': '1',\n '2': '2',\n '3': '3',\n '4': '4',\n '5': '5',\n '6': '6',\n '7': '7',\n '8': '8',\n '9': '9',\n \"\\uFF10\": '0',\n // Fullwidth digit 0\n \"\\uFF11\": '1',\n // Fullwidth digit 1\n \"\\uFF12\": '2',\n // Fullwidth digit 2\n \"\\uFF13\": '3',\n // Fullwidth digit 3\n \"\\uFF14\": '4',\n // Fullwidth digit 4\n \"\\uFF15\": '5',\n // Fullwidth digit 5\n \"\\uFF16\": '6',\n // Fullwidth digit 6\n \"\\uFF17\": '7',\n // Fullwidth digit 7\n \"\\uFF18\": '8',\n // Fullwidth digit 8\n \"\\uFF19\": '9',\n // Fullwidth digit 9\n \"\\u0660\": '0',\n // Arabic-indic digit 0\n \"\\u0661\": '1',\n // Arabic-indic digit 1\n \"\\u0662\": '2',\n // Arabic-indic digit 2\n \"\\u0663\": '3',\n // Arabic-indic digit 3\n \"\\u0664\": '4',\n // Arabic-indic digit 4\n \"\\u0665\": '5',\n // Arabic-indic digit 5\n \"\\u0666\": '6',\n // Arabic-indic digit 6\n \"\\u0667\": '7',\n // Arabic-indic digit 7\n \"\\u0668\": '8',\n // Arabic-indic digit 8\n \"\\u0669\": '9',\n // Arabic-indic digit 9\n \"\\u06F0\": '0',\n // Eastern-Arabic digit 0\n \"\\u06F1\": '1',\n // Eastern-Arabic digit 1\n \"\\u06F2\": '2',\n // Eastern-Arabic digit 2\n \"\\u06F3\": '3',\n // Eastern-Arabic digit 3\n \"\\u06F4\": '4',\n // Eastern-Arabic digit 4\n \"\\u06F5\": '5',\n // Eastern-Arabic digit 5\n \"\\u06F6\": '6',\n // Eastern-Arabic digit 6\n \"\\u06F7\": '7',\n // Eastern-Arabic digit 7\n \"\\u06F8\": '8',\n // Eastern-Arabic digit 8\n \"\\u06F9\": '9' // Eastern-Arabic digit 9\n\n};\nexports.DIGITS = DIGITS;\n\nfunction parseDigit(character) {\n return DIGITS[character];\n}\n/**\r\n * Parses phone number digits from a string.\r\n * Drops all punctuation leaving only digits.\r\n * Also converts wide-ascii and arabic-indic numerals to conventional numerals.\r\n * E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.\r\n * @param {string} string\r\n * @return {string}\r\n * @example\r\n * ```js\r\n * parseDigits('8 (800) 555')\r\n * // Outputs '8800555'.\r\n * ```\r\n */\n\n\nfunction parseDigits(string) {\n var result = ''; // Using `.split('')` here instead of normal `for ... of`\n // because the importing application doesn't neccessarily include an ES6 polyfill.\n // The `.split('')` approach discards \"exotic\" UTF-8 characters\n // (the ones consisting of four bytes) but digits\n // (including non-European ones) don't fall into that range\n // so such \"exotic\" characters would be discarded anyway.\n\n for (var _iterator = _createForOfIteratorHelperLoose(string.split('')), _step; !(_step = _iterator()).done;) {\n var character = _step.value;\n var digit = parseDigit(character);\n\n if (digit) {\n result += digit;\n }\n }\n\n return result;\n}\n//# sourceMappingURL=parseDigits.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = stripIddPrefix;\n\nvar _metadata = _interopRequireDefault(require(\"../metadata.js\"));\n\nvar _constants = require(\"../constants.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar CAPTURING_DIGIT_PATTERN = new RegExp('([' + _constants.VALID_DIGITS + '])');\n\nfunction stripIddPrefix(number, country, callingCode, metadata) {\n if (!country) {\n return;\n } // Check if the number is IDD-prefixed.\n\n\n var countryMetadata = new _metadata[\"default\"](metadata);\n countryMetadata.selectNumberingPlan(country, callingCode);\n var IDDPrefixPattern = new RegExp(countryMetadata.IDDPrefix());\n\n if (number.search(IDDPrefixPattern) !== 0) {\n return;\n } // Strip IDD prefix.\n\n\n number = number.slice(number.match(IDDPrefixPattern)[0].length); // If there're any digits after an IDD prefix,\n // then those digits are a country calling code.\n // Since no country code starts with a `0`,\n // the code below validates that the next digit (if present) is not `0`.\n\n var matchedGroups = number.match(CAPTURING_DIGIT_PATTERN);\n\n if (matchedGroups && matchedGroups[1] != null && matchedGroups[1].length > 0) {\n if (matchedGroups[1] === '0') {\n return;\n }\n }\n\n return number;\n}\n//# sourceMappingURL=stripIddPrefix.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = isPossiblePhoneNumber;\nexports.isPossibleNumber = isPossibleNumber;\n\nvar _metadata = _interopRequireDefault(require(\"./metadata.js\"));\n\nvar _checkNumberLength = _interopRequireDefault(require(\"./helpers/checkNumberLength.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\r\n * Checks if a phone number is \"possible\" (basically just checks its length).\r\n *\r\n * isPossible(phoneNumberInstance, { ..., v2: true }, metadata)\r\n *\r\n * isPossible({ phone: '8005553535', country: 'RU' }, { ... }, metadata)\r\n * isPossible({ phone: '8005553535', country: 'RU' }, undefined, metadata)\r\n *\r\n * @param {object|PhoneNumber} input — If `options.v2: true` flag is passed, the `input` should be a `PhoneNumber` instance. Otherwise, it should be an object of shape `{ phone: '...', country: '...' }`.\r\n * @param {object} [options]\r\n * @param {object} metadata\r\n * @return {string}\r\n */\nfunction isPossiblePhoneNumber(input, options, metadata) {\n /* istanbul ignore if */\n if (options === undefined) {\n options = {};\n }\n\n metadata = new _metadata[\"default\"](metadata);\n\n if (options.v2) {\n if (!input.countryCallingCode) {\n throw new Error('Invalid phone number object passed');\n }\n\n metadata.selectNumberingPlan(input.countryCallingCode);\n } else {\n if (!input.phone) {\n return false;\n }\n\n if (input.country) {\n if (!metadata.hasCountry(input.country)) {\n throw new Error(\"Unknown country: \".concat(input.country));\n }\n\n metadata.country(input.country);\n } else {\n if (!input.countryCallingCode) {\n throw new Error('Invalid phone number object passed');\n }\n\n metadata.selectNumberingPlan(input.countryCallingCode);\n }\n } // Old metadata (< 1.0.18) had no \"possible length\" data.\n\n\n if (metadata.possibleLengths()) {\n return isPossibleNumber(input.phone || input.nationalNumber, metadata);\n } else {\n // There was a bug between `1.7.35` and `1.7.37` where \"possible_lengths\"\n // were missing for \"non-geographical\" numbering plans.\n // Just assume the number is possible in such cases:\n // it's unlikely that anyone generated their custom metadata\n // in that short period of time (one day).\n // This code can be removed in some future major version update.\n if (input.countryCallingCode && metadata.isNonGeographicCallingCode(input.countryCallingCode)) {\n // \"Non-geographic entities\" did't have `possibleLengths`\n // due to a bug in metadata generation process.\n return true;\n } else {\n throw new Error('Missing \"possibleLengths\" in metadata. Perhaps the metadata has been generated before v1.0.18.');\n }\n }\n}\n\nfunction isPossibleNumber(nationalNumber, metadata) {\n //, isInternational) {\n switch ((0, _checkNumberLength[\"default\"])(nationalNumber, metadata)) {\n case 'IS_POSSIBLE':\n return true;\n // This library ignores \"local-only\" phone numbers (for simplicity).\n // See the readme for more info on what are \"local-only\" phone numbers.\n // case 'IS_POSSIBLE_LOCAL_ONLY':\n // \treturn !isInternational\n\n default:\n return false;\n }\n}\n//# sourceMappingURL=isPossible.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = isPossiblePhoneNumber;\n\nvar _normalizeArguments2 = _interopRequireDefault(require(\"./normalizeArguments.js\"));\n\nvar _parsePhoneNumber_ = _interopRequireDefault(require(\"./parsePhoneNumber_.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction isPossiblePhoneNumber() {\n var _normalizeArguments = (0, _normalizeArguments2[\"default\"])(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n options = _objectSpread(_objectSpread({}, options), {}, {\n extract: false\n });\n var phoneNumber = (0, _parsePhoneNumber_[\"default\"])(text, options, metadata);\n return phoneNumber && phoneNumber.isPossible() || false;\n}\n//# sourceMappingURL=isPossiblePhoneNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = isValidNumber;\n\nvar _metadata = _interopRequireDefault(require(\"./metadata.js\"));\n\nvar _matchesEntirely = _interopRequireDefault(require(\"./helpers/matchesEntirely.js\"));\n\nvar _getNumberType = _interopRequireDefault(require(\"./helpers/getNumberType.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\r\n * Checks if a given phone number is valid.\r\n *\r\n * isValid(phoneNumberInstance, { ..., v2: true }, metadata)\r\n *\r\n * isPossible({ phone: '8005553535', country: 'RU' }, { ... }, metadata)\r\n * isPossible({ phone: '8005553535', country: 'RU' }, undefined, metadata)\r\n *\r\n * If the `number` is a string, it will be parsed to an object,\r\n * but only if it contains only valid phone number characters (including punctuation).\r\n * If the `number` is an object, it is used as is.\r\n *\r\n * The optional `defaultCountry` argument is the default country.\r\n * I.e. it does not restrict to just that country,\r\n * e.g. in those cases where several countries share\r\n * the same phone numbering rules (NANPA, Britain, etc).\r\n * For example, even though the number `07624 369230`\r\n * belongs to the Isle of Man (\"IM\" country code)\r\n * calling `isValidNumber('07624369230', 'GB', metadata)`\r\n * still returns `true` because the country is not restricted to `GB`,\r\n * it's just that `GB` is the default one for the phone numbering rules.\r\n * For restricting the country see `isValidNumberForRegion()`\r\n * though restricting a country might not be a good idea.\r\n * https://github.com/googlei18n/libphonenumber/blob/master/FAQ.md#when-should-i-use-isvalidnumberforregion\r\n *\r\n * Examples:\r\n *\r\n * ```js\r\n * isValidNumber('+78005553535', metadata)\r\n * isValidNumber('8005553535', 'RU', metadata)\r\n * isValidNumber('88005553535', 'RU', metadata)\r\n * isValidNumber({ phone: '8005553535', country: 'RU' }, metadata)\r\n * ```\r\n */\nfunction isValidNumber(input, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {};\n metadata = new _metadata[\"default\"](metadata);\n /**\r\n * Checks if a phone number is \"possible\" (basically just checks its length).\r\n *\r\n * @param {object|PhoneNumber} input — If `options.v2: true` flag is passed, the `input` should be a `PhoneNumber` instance. Otherwise, it should be an object of shape `{ phone: '...', country: '...' }`.\r\n * @param {object} [options]\r\n * @param {object} metadata\r\n * @return {string}\r\n */\n\n metadata.selectNumberingPlan(input.country, input.countryCallingCode); // By default, countries only have type regexps when it's required for\n // distinguishing different countries having the same `countryCallingCode`.\n\n if (metadata.hasTypes()) {\n return (0, _getNumberType[\"default\"])(input, options, metadata.metadata) !== undefined;\n } // If there are no type regexps for this country in metadata then use\n // `nationalNumberPattern` as a \"better than nothing\" replacement.\n\n\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone;\n return (0, _matchesEntirely[\"default\"])(nationalNumber, metadata.nationalNumberPattern());\n}\n//# sourceMappingURL=isValid.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = isValidPhoneNumber;\n\nvar _normalizeArguments2 = _interopRequireDefault(require(\"./normalizeArguments.js\"));\n\nvar _parsePhoneNumber_ = _interopRequireDefault(require(\"./parsePhoneNumber_.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction isValidPhoneNumber() {\n var _normalizeArguments = (0, _normalizeArguments2[\"default\"])(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n options = _objectSpread(_objectSpread({}, options), {}, {\n extract: false\n });\n var phoneNumber = (0, _parsePhoneNumber_[\"default\"])(text, options, metadata);\n return phoneNumber && phoneNumber.isValid() || false;\n}\n//# sourceMappingURL=isValidPhoneNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = findNumbers;\n\nvar _PhoneNumberMatcher = _interopRequireDefault(require(\"../PhoneNumberMatcher.js\"));\n\nvar _normalizeArguments2 = _interopRequireDefault(require(\"../normalizeArguments.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction findNumbers() {\n var _normalizeArguments = (0, _normalizeArguments2[\"default\"])(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n var matcher = new _PhoneNumberMatcher[\"default\"](text, options, metadata);\n var results = [];\n\n while (matcher.hasNext()) {\n results.push(matcher.next());\n }\n\n return results;\n}\n//# sourceMappingURL=findNumbers.js.map","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = findPhoneNumbers;\nexports.searchPhoneNumbers = searchPhoneNumbers;\n\nvar _findPhoneNumbersInitialImplementation = _interopRequireWildcard(require(\"./findPhoneNumbersInitialImplementation.js\"));\n\nvar _normalizeArguments3 = _interopRequireDefault(require(\"../normalizeArguments.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// This is a legacy function.\n// Use `findNumbers()` instead.\nfunction findPhoneNumbers() {\n var _normalizeArguments = (0, _normalizeArguments3[\"default\"])(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n return (0, _findPhoneNumbersInitialImplementation[\"default\"])(text, options, metadata);\n}\n/**\r\n * @return ES6 `for ... of` iterator.\r\n */\n\n\nfunction searchPhoneNumbers() {\n var _normalizeArguments2 = (0, _normalizeArguments3[\"default\"])(arguments),\n text = _normalizeArguments2.text,\n options = _normalizeArguments2.options,\n metadata = _normalizeArguments2.metadata;\n\n return (0, _findPhoneNumbersInitialImplementation.searchPhoneNumbers)(text, options, metadata);\n}\n//# sourceMappingURL=findPhoneNumbers.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.PhoneNumberSearch = exports.EXTN_PATTERNS_FOR_PARSING = void 0;\nexports[\"default\"] = findPhoneNumbers;\nexports.searchPhoneNumbers = searchPhoneNumbers;\n\nvar _constants = require(\"../constants.js\");\n\nvar _parse = _interopRequireDefault(require(\"../parse.js\"));\n\nvar _isViablePhoneNumber = require(\"../helpers/isViablePhoneNumber.js\");\n\nvar _createExtensionPattern = _interopRequireDefault(require(\"../helpers/extension/createExtensionPattern.js\"));\n\nvar _parsePreCandidate = _interopRequireDefault(require(\"../findNumbers/parsePreCandidate.js\"));\n\nvar _isValidPreCandidate = _interopRequireDefault(require(\"../findNumbers/isValidPreCandidate.js\"));\n\nvar _isValidCandidate = _interopRequireDefault(require(\"../findNumbers/isValidCandidate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**\r\n * Regexp of all possible ways to write extensions, for use when parsing. This\r\n * will be run as a case-insensitive regexp match. Wide character versions are\r\n * also provided after each ASCII version. There are three regular expressions\r\n * here. The first covers RFC 3966 format, where the extension is added using\r\n * ';ext='. The second more generic one starts with optional white space and\r\n * ends with an optional full stop (.), followed by zero or more spaces/tabs\r\n * /commas and then the numbers themselves. The other one covers the special\r\n * case of American numbers where the extension is written with a hash at the\r\n * end, such as '- 503#'. Note that the only capturing groups should be around\r\n * the digits that you want to capture as part of the extension, or else parsing\r\n * will fail! We allow two options for representing the accented o - the\r\n * character itself, and one in the unicode decomposed form with the combining\r\n * acute accent.\r\n */\nvar EXTN_PATTERNS_FOR_PARSING = (0, _createExtensionPattern[\"default\"])('parsing');\nexports.EXTN_PATTERNS_FOR_PARSING = EXTN_PATTERNS_FOR_PARSING;\nvar WHITESPACE_IN_THE_BEGINNING_PATTERN = new RegExp('^[' + _constants.WHITESPACE + ']+');\nvar PUNCTUATION_IN_THE_END_PATTERN = new RegExp('[' + _constants.VALID_PUNCTUATION + ']+$'); // // Regular expression for getting opening brackets for a valid number\n// // found using `PHONE_NUMBER_START_PATTERN` for prepending those brackets to the number.\n// const BEFORE_NUMBER_DIGITS_PUNCTUATION = new RegExp('[' + OPENING_BRACKETS + ']+' + '[' + WHITESPACE + ']*' + '$')\n\nvar VALID_PRECEDING_CHARACTER_PATTERN = /[^a-zA-Z0-9]/;\n\nfunction findPhoneNumbers(text, options, metadata) {\n /* istanbul ignore if */\n if (options === undefined) {\n options = {};\n }\n\n var search = new PhoneNumberSearch(text, options, metadata);\n var phones = [];\n\n while (search.hasNext()) {\n phones.push(search.next());\n }\n\n return phones;\n}\n/**\r\n * @return ES6 `for ... of` iterator.\r\n */\n\n\nfunction searchPhoneNumbers(text, options, metadata) {\n /* istanbul ignore if */\n if (options === undefined) {\n options = {};\n }\n\n var search = new PhoneNumberSearch(text, options, metadata);\n return _defineProperty({}, Symbol.iterator, function () {\n return {\n next: function next() {\n if (search.hasNext()) {\n return {\n done: false,\n value: search.next()\n };\n }\n\n return {\n done: true\n };\n }\n };\n });\n}\n/**\r\n * Extracts a parseable phone number including any opening brackets, etc.\r\n * @param {string} text - Input.\r\n * @return {object} `{ ?number, ?startsAt, ?endsAt }`.\r\n */\n\n\nvar PhoneNumberSearch = /*#__PURE__*/function () {\n function PhoneNumberSearch(text, options, metadata) {\n _classCallCheck(this, PhoneNumberSearch);\n\n this.text = text; // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n\n this.options = options || {};\n this.metadata = metadata; // Iteration tristate.\n\n this.state = 'NOT_READY';\n this.regexp = new RegExp(_isViablePhoneNumber.VALID_PHONE_NUMBER_WITH_EXTENSION, 'ig');\n }\n\n _createClass(PhoneNumberSearch, [{\n key: \"find\",\n value: function find() {\n var matches = this.regexp.exec(this.text);\n\n if (!matches) {\n return;\n }\n\n var number = matches[0];\n var startsAt = matches.index;\n number = number.replace(WHITESPACE_IN_THE_BEGINNING_PATTERN, '');\n startsAt += matches[0].length - number.length; // Fixes not parsing numbers with whitespace in the end.\n // Also fixes not parsing numbers with opening parentheses in the end.\n // https://github.com/catamphetamine/libphonenumber-js/issues/252\n\n number = number.replace(PUNCTUATION_IN_THE_END_PATTERN, '');\n number = (0, _parsePreCandidate[\"default\"])(number);\n var result = this.parseCandidate(number, startsAt);\n\n if (result) {\n return result;\n } // Tail recursion.\n // Try the next one if this one is not a valid phone number.\n\n\n return this.find();\n }\n }, {\n key: \"parseCandidate\",\n value: function parseCandidate(number, startsAt) {\n if (!(0, _isValidPreCandidate[\"default\"])(number, startsAt, this.text)) {\n return;\n } // Don't parse phone numbers which are non-phone numbers\n // due to being part of something else (e.g. a UUID).\n // https://github.com/catamphetamine/libphonenumber-js/issues/213\n // Copy-pasted from Google's `PhoneNumberMatcher.js` (`.parseAndValidate()`).\n\n\n if (!(0, _isValidCandidate[\"default\"])(number, startsAt, this.text, this.options.extended ? 'POSSIBLE' : 'VALID')) {\n return;\n } // // Prepend any opening brackets left behind by the\n // // `PHONE_NUMBER_START_PATTERN` regexp.\n // const text_before_number = text.slice(this.searching_from, startsAt)\n // const full_number_starts_at = text_before_number.search(BEFORE_NUMBER_DIGITS_PUNCTUATION)\n // if (full_number_starts_at >= 0)\n // {\n // \tnumber = text_before_number.slice(full_number_starts_at) + number\n // \tstartsAt = full_number_starts_at\n // }\n //\n // this.searching_from = matches.lastIndex\n\n\n var result = (0, _parse[\"default\"])(number, this.options, this.metadata);\n\n if (!result.phone) {\n return;\n }\n\n result.startsAt = startsAt;\n result.endsAt = startsAt + number.length;\n return result;\n }\n }, {\n key: \"hasNext\",\n value: function hasNext() {\n if (this.state === 'NOT_READY') {\n this.last_match = this.find();\n\n if (this.last_match) {\n this.state = 'READY';\n } else {\n this.state = 'DONE';\n }\n }\n\n return this.state === 'READY';\n }\n }, {\n key: \"next\",\n value: function next() {\n // Check the state and find the next match as a side-effect if necessary.\n if (!this.hasNext()) {\n throw new Error('No next element');\n } // Don't retain that memory any longer than necessary.\n\n\n var result = this.last_match;\n this.last_match = null;\n this.state = 'NOT_READY';\n return result;\n }\n }]);\n\n return PhoneNumberSearch;\n}();\n\nexports.PhoneNumberSearch = PhoneNumberSearch;\n//# sourceMappingURL=findPhoneNumbersInitialImplementation.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = formatNumber;\n\nvar _format = _interopRequireDefault(require(\"../format.js\"));\n\nvar _parse = _interopRequireDefault(require(\"../parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction formatNumber() {\n var _normalizeArguments = normalizeArguments(arguments),\n input = _normalizeArguments.input,\n format = _normalizeArguments.format,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n return (0, _format[\"default\"])(input, format, options, metadata);\n} // Sort out arguments\n\n\nfunction normalizeArguments(args) {\n var _Array$prototype$slic = Array.prototype.slice.call(args),\n _Array$prototype$slic2 = _slicedToArray(_Array$prototype$slic, 5),\n arg_1 = _Array$prototype$slic2[0],\n arg_2 = _Array$prototype$slic2[1],\n arg_3 = _Array$prototype$slic2[2],\n arg_4 = _Array$prototype$slic2[3],\n arg_5 = _Array$prototype$slic2[4];\n\n var input;\n var format;\n var options;\n var metadata; // Sort out arguments.\n // If the phone number is passed as a string.\n // `format('8005553535', ...)`.\n\n if (typeof arg_1 === 'string') {\n // If country code is supplied.\n // `format('8005553535', 'RU', 'NATIONAL', [options], metadata)`.\n if (typeof arg_3 === 'string') {\n format = arg_3;\n\n if (arg_5) {\n options = arg_4;\n metadata = arg_5;\n } else {\n metadata = arg_4;\n }\n\n input = (0, _parse[\"default\"])(arg_1, {\n defaultCountry: arg_2,\n extended: true\n }, metadata);\n } // Just an international phone number is supplied\n // `format('+78005553535', 'NATIONAL', [options], metadata)`.\n else {\n if (typeof arg_2 !== 'string') {\n throw new Error('`format` argument not passed to `formatNumber(number, format)`');\n }\n\n format = arg_2;\n\n if (arg_4) {\n options = arg_3;\n metadata = arg_4;\n } else {\n metadata = arg_3;\n }\n\n input = (0, _parse[\"default\"])(arg_1, {\n extended: true\n }, metadata);\n }\n } // If the phone number is passed as a parsed number object.\n // `format({ phone: '8005553535', country: 'RU' }, 'NATIONAL', [options], metadata)`.\n else if (is_object(arg_1)) {\n input = arg_1;\n format = arg_2;\n\n if (arg_4) {\n options = arg_3;\n metadata = arg_4;\n } else {\n metadata = arg_3;\n }\n } else throw new TypeError('A phone number must either be a string or an object of shape { phone, [country] }.'); // Legacy lowercase formats.\n\n\n if (format === 'International') {\n format = 'INTERNATIONAL';\n } else if (format === 'National') {\n format = 'NATIONAL';\n }\n\n return {\n input: input,\n format: format,\n options: options,\n metadata: metadata\n };\n} // Babel transforms `typeof` into some \"branches\"\n// so istanbul will show this as \"branch not covered\".\n\n/* istanbul ignore next */\n\n\nvar is_object = function is_object(_) {\n return _typeof(_) === 'object';\n};\n//# sourceMappingURL=format.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = getNumberType;\nexports.normalizeArguments = normalizeArguments;\n\nvar _isViablePhoneNumber = _interopRequireDefault(require(\"../helpers/isViablePhoneNumber.js\"));\n\nvar _getNumberType2 = _interopRequireDefault(require(\"../helpers/getNumberType.js\"));\n\nvar _parse = _interopRequireDefault(require(\"../parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n// Finds out national phone number type (fixed line, mobile, etc)\nfunction getNumberType() {\n var _normalizeArguments = normalizeArguments(arguments),\n input = _normalizeArguments.input,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata; // `parseNumber()` would return `{}` when no phone number could be parsed from the input.\n\n\n if (!input.phone) {\n return;\n }\n\n return (0, _getNumberType2[\"default\"])(input, options, metadata);\n} // Sort out arguments\n\n\nfunction normalizeArguments(args) {\n var _Array$prototype$slic = Array.prototype.slice.call(args),\n _Array$prototype$slic2 = _slicedToArray(_Array$prototype$slic, 4),\n arg_1 = _Array$prototype$slic2[0],\n arg_2 = _Array$prototype$slic2[1],\n arg_3 = _Array$prototype$slic2[2],\n arg_4 = _Array$prototype$slic2[3];\n\n var input;\n var options = {};\n var metadata; // If the phone number is passed as a string.\n // `getNumberType('88005553535', ...)`.\n\n if (typeof arg_1 === 'string') {\n // If \"default country\" argument is being passed\n // then convert it to an `options` object.\n // `getNumberType('88005553535', 'RU', metadata)`.\n if (_typeof(arg_2) !== 'object') {\n if (arg_4) {\n options = arg_3;\n metadata = arg_4;\n } else {\n metadata = arg_3;\n } // `parse` extracts phone numbers from raw text,\n // therefore it will cut off all \"garbage\" characters,\n // while this `validate` function needs to verify\n // that the phone number contains no \"garbage\"\n // therefore the explicit `isViablePhoneNumber` check.\n\n\n if ((0, _isViablePhoneNumber[\"default\"])(arg_1)) {\n input = (0, _parse[\"default\"])(arg_1, {\n defaultCountry: arg_2\n }, metadata);\n } else {\n input = {};\n }\n } // No \"resrict country\" argument is being passed.\n // International phone number is passed.\n // `getNumberType('+78005553535', metadata)`.\n else {\n if (arg_3) {\n options = arg_2;\n metadata = arg_3;\n } else {\n metadata = arg_2;\n } // `parse` extracts phone numbers from raw text,\n // therefore it will cut off all \"garbage\" characters,\n // while this `validate` function needs to verify\n // that the phone number contains no \"garbage\"\n // therefore the explicit `isViablePhoneNumber` check.\n\n\n if ((0, _isViablePhoneNumber[\"default\"])(arg_1)) {\n input = (0, _parse[\"default\"])(arg_1, undefined, metadata);\n } else {\n input = {};\n }\n }\n } // If the phone number is passed as a parsed phone number.\n // `getNumberType({ phone: '88005553535', country: 'RU' }, ...)`.\n else if (is_object(arg_1)) {\n input = arg_1;\n\n if (arg_3) {\n options = arg_2;\n metadata = arg_3;\n } else {\n metadata = arg_2;\n }\n } else throw new TypeError('A phone number must either be a string or an object of shape { phone, [country] }.');\n\n return {\n input: input,\n options: options,\n metadata: metadata\n };\n} // Babel transforms `typeof` into some \"branches\"\n// so istanbul will show this as \"branch not covered\".\n\n/* istanbul ignore next */\n\n\nvar is_object = function is_object(_) {\n return _typeof(_) === 'object';\n};\n//# sourceMappingURL=getNumberType.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = isPossibleNumber;\n\nvar _getNumberType = require(\"./getNumberType.js\");\n\nvar _isPossible = _interopRequireDefault(require(\"../isPossible.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\r\n * Checks if a given phone number is possible.\r\n * Which means it only checks phone number length\r\n * and doesn't test any regular expressions.\r\n *\r\n * Examples:\r\n *\r\n * ```js\r\n * isPossibleNumber('+78005553535', metadata)\r\n * isPossibleNumber('8005553535', 'RU', metadata)\r\n * isPossibleNumber('88005553535', 'RU', metadata)\r\n * isPossibleNumber({ phone: '8005553535', country: 'RU' }, metadata)\r\n * ```\r\n */\nfunction isPossibleNumber() {\n var _normalizeArguments = (0, _getNumberType.normalizeArguments)(arguments),\n input = _normalizeArguments.input,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata; // `parseNumber()` would return `{}` when no phone number could be parsed from the input.\n\n\n if (!input.phone && !(options && options.v2)) {\n return false;\n }\n\n return (0, _isPossible[\"default\"])(input, options, metadata);\n}\n//# sourceMappingURL=isPossibleNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = isValidNumber;\n\nvar _isValid = _interopRequireDefault(require(\"../isValid.js\"));\n\nvar _getNumberType = require(\"./getNumberType.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// Finds out national phone number type (fixed line, mobile, etc)\nfunction isValidNumber() {\n var _normalizeArguments = (0, _getNumberType.normalizeArguments)(arguments),\n input = _normalizeArguments.input,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata; // `parseNumber()` would return `{}` when no phone number could be parsed from the input.\n\n\n if (!input.phone) {\n return false;\n }\n\n return (0, _isValid[\"default\"])(input, options, metadata);\n}\n//# sourceMappingURL=isValidNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = isValidNumberForRegion;\n\nvar _isViablePhoneNumber = _interopRequireDefault(require(\"../helpers/isViablePhoneNumber.js\"));\n\nvar _parse = _interopRequireDefault(require(\"../parse.js\"));\n\nvar _isValidNumberForRegion_ = _interopRequireDefault(require(\"./isValidNumberForRegion_.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// This function has been deprecated and is not exported as\n// `isValidPhoneNumberForCountry()` or `isValidPhoneNumberForRegion()`.\n//\n// The rationale is:\n//\n// * We don't use the \"region\" word, so \"country\" would be better.\n//\n// * It could be substituted with:\n//\n// ```js\n// export default function isValidPhoneNumberForCountry(phoneNumberString, country) {\n// \tconst phoneNumber = parsePhoneNumber(phoneNumberString, {\n// \t\tdefaultCountry: country,\n// \t\t// Demand that the entire input string must be a phone number.\n// \t\t// Otherwise, it would \"extract\" a phone number from an input string.\n// \t\textract: false\n// \t})\n// \tif (!phoneNumber) {\n// \t\treturn false\n// \t}\n// \tif (phoneNumber.country !== country) {\n// \t\treturn false\n// \t}\n// \treturn phoneNumber.isValid()\n// }\n// ```\n//\n// * Same function could be used for `isPossiblePhoneNumberForCountry()`\n// by replacing `isValid()` with `isPossible()`.\n//\n// * The reason why this function is not exported is because its result is ambiguous.\n// Suppose `false` is returned. It could mean any of:\n// * Not a phone number.\n// * The phone number is valid but belongs to another country or another calling code.\n// * The phone number belongs to the correct country but is not valid digit-wise.\n// All those three cases should be handled separately from a \"User Experience\" standpoint.\n// Simply showing \"Invalid phone number\" error in all of those cases would be lazy UX.\nfunction isValidNumberForRegion(number, country, metadata) {\n if (typeof number !== 'string') {\n throw new TypeError('number must be a string');\n }\n\n if (typeof country !== 'string') {\n throw new TypeError('country must be a string');\n } // `parse` extracts phone numbers from raw text,\n // therefore it will cut off all \"garbage\" characters,\n // while this `validate` function needs to verify\n // that the phone number contains no \"garbage\"\n // therefore the explicit `isViablePhoneNumber` check.\n\n\n var input;\n\n if ((0, _isViablePhoneNumber[\"default\"])(number)) {\n input = (0, _parse[\"default\"])(number, {\n defaultCountry: country\n }, metadata);\n } else {\n input = {};\n }\n\n return (0, _isValidNumberForRegion_[\"default\"])(input, country, undefined, metadata);\n}\n//# sourceMappingURL=isValidNumberForRegion.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = isValidNumberForRegion;\n\nvar _isValid = _interopRequireDefault(require(\"../isValid.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/**\r\n * Checks if a given phone number is valid within a given region.\r\n * Is just an alias for `phoneNumber.isValid() && phoneNumber.country === country`.\r\n * https://github.com/googlei18n/libphonenumber/blob/master/FAQ.md#when-should-i-use-isvalidnumberforregion\r\n */\nfunction isValidNumberForRegion(input, country, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {};\n return input.country === country && (0, _isValid[\"default\"])(input, options, metadata);\n}\n//# sourceMappingURL=isValidNumberForRegion_.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = parseNumber;\n\nvar _parse = _interopRequireDefault(require(\"../parse.js\"));\n\nvar _normalizeArguments2 = _interopRequireDefault(require(\"../normalizeArguments.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction parseNumber() {\n var _normalizeArguments = (0, _normalizeArguments2[\"default\"])(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n return (0, _parse[\"default\"])(text, options, metadata);\n}\n//# sourceMappingURL=parse.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = searchNumbers;\n\nvar _normalizeArguments2 = _interopRequireDefault(require(\"../normalizeArguments.js\"));\n\nvar _PhoneNumberMatcher = _interopRequireDefault(require(\"../PhoneNumberMatcher.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**\r\n * @return ES6 `for ... of` iterator.\r\n */\nfunction searchNumbers() {\n var _normalizeArguments = (0, _normalizeArguments2[\"default\"])(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n var matcher = new _PhoneNumberMatcher[\"default\"](text, options, metadata);\n return _defineProperty({}, Symbol.iterator, function () {\n return {\n next: function next() {\n if (matcher.hasNext()) {\n return {\n done: false,\n value: matcher.next()\n };\n }\n\n return {\n done: true\n };\n }\n };\n });\n}\n//# sourceMappingURL=searchNumbers.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\nexports.getCountryCallingCode = getCountryCallingCode;\nexports.getExtPrefix = getExtPrefix;\nexports.isSupportedCountry = isSupportedCountry;\nexports.validateMetadata = validateMetadata;\n\nvar _semverCompare = _interopRequireDefault(require(\"./tools/semver-compare.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n// Added \"possibleLengths\" and renamed\n// \"country_phone_code_to_countries\" to \"country_calling_codes\".\nvar V2 = '1.0.18'; // Added \"idd_prefix\" and \"default_idd_prefix\".\n\nvar V3 = '1.2.0'; // Moved `001` country code to \"nonGeographic\" section of metadata.\n\nvar V4 = '1.7.35';\nvar DEFAULT_EXT_PREFIX = ' ext. ';\nvar CALLING_CODE_REG_EXP = /^\\d+$/;\n/**\r\n * See: https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/METADATA.md\r\n */\n\nvar Metadata = /*#__PURE__*/function () {\n function Metadata(metadata) {\n _classCallCheck(this, Metadata);\n\n validateMetadata(metadata);\n this.metadata = metadata;\n setVersion.call(this, metadata);\n }\n\n _createClass(Metadata, [{\n key: \"getCountries\",\n value: function getCountries() {\n return Object.keys(this.metadata.countries).filter(function (_) {\n return _ !== '001';\n });\n }\n }, {\n key: \"getCountryMetadata\",\n value: function getCountryMetadata(countryCode) {\n return this.metadata.countries[countryCode];\n }\n }, {\n key: \"nonGeographic\",\n value: function nonGeographic() {\n if (this.v1 || this.v2 || this.v3) return; // `nonGeographical` was a typo.\n // It's present in metadata generated from `1.7.35` to `1.7.37`.\n // The test case could be found by searching for \"nonGeographical\".\n\n return this.metadata.nonGeographic || this.metadata.nonGeographical;\n }\n }, {\n key: \"hasCountry\",\n value: function hasCountry(country) {\n return this.getCountryMetadata(country) !== undefined;\n }\n }, {\n key: \"hasCallingCode\",\n value: function hasCallingCode(callingCode) {\n if (this.getCountryCodesForCallingCode(callingCode)) {\n return true;\n }\n\n if (this.nonGeographic()) {\n if (this.nonGeographic()[callingCode]) {\n return true;\n }\n } else {\n // A hacky workaround for old custom metadata (generated before V4).\n var countryCodes = this.countryCallingCodes()[callingCode];\n\n if (countryCodes && countryCodes.length === 1 && countryCodes[0] === '001') {\n return true;\n }\n }\n }\n }, {\n key: \"isNonGeographicCallingCode\",\n value: function isNonGeographicCallingCode(callingCode) {\n if (this.nonGeographic()) {\n return this.nonGeographic()[callingCode] ? true : false;\n } else {\n return this.getCountryCodesForCallingCode(callingCode) ? false : true;\n }\n } // Deprecated.\n\n }, {\n key: \"country\",\n value: function country(countryCode) {\n return this.selectNumberingPlan(countryCode);\n }\n }, {\n key: \"selectNumberingPlan\",\n value: function selectNumberingPlan(countryCode, callingCode) {\n // Supports just passing `callingCode` as the first argument.\n if (countryCode && CALLING_CODE_REG_EXP.test(countryCode)) {\n callingCode = countryCode;\n countryCode = null;\n }\n\n if (countryCode && countryCode !== '001') {\n if (!this.hasCountry(countryCode)) {\n throw new Error(\"Unknown country: \".concat(countryCode));\n }\n\n this.numberingPlan = new NumberingPlan(this.getCountryMetadata(countryCode), this);\n } else if (callingCode) {\n if (!this.hasCallingCode(callingCode)) {\n throw new Error(\"Unknown calling code: \".concat(callingCode));\n }\n\n this.numberingPlan = new NumberingPlan(this.getNumberingPlanMetadata(callingCode), this);\n } else {\n this.numberingPlan = undefined;\n }\n\n return this;\n }\n }, {\n key: \"getCountryCodesForCallingCode\",\n value: function getCountryCodesForCallingCode(callingCode) {\n var countryCodes = this.countryCallingCodes()[callingCode];\n\n if (countryCodes) {\n // Metadata before V4 included \"non-geographic entity\" calling codes\n // inside `country_calling_codes` (for example, `\"881\":[\"001\"]`).\n // Now the semantics of `country_calling_codes` has changed:\n // it's specifically for \"countries\" now.\n // Older versions of custom metadata will simply skip parsing\n // \"non-geographic entity\" phone numbers with new versions\n // of this library: it's not considered a bug,\n // because such numbers are extremely rare,\n // and developers extremely rarely use custom metadata.\n if (countryCodes.length === 1 && countryCodes[0].length === 3) {\n return;\n }\n\n return countryCodes;\n }\n }\n }, {\n key: \"getCountryCodeForCallingCode\",\n value: function getCountryCodeForCallingCode(callingCode) {\n var countryCodes = this.getCountryCodesForCallingCode(callingCode);\n\n if (countryCodes) {\n return countryCodes[0];\n }\n }\n }, {\n key: \"getNumberingPlanMetadata\",\n value: function getNumberingPlanMetadata(callingCode) {\n var countryCode = this.getCountryCodeForCallingCode(callingCode);\n\n if (countryCode) {\n return this.getCountryMetadata(countryCode);\n }\n\n if (this.nonGeographic()) {\n var metadata = this.nonGeographic()[callingCode];\n\n if (metadata) {\n return metadata;\n }\n } else {\n // A hacky workaround for old custom metadata (generated before V4).\n // In that metadata, there was no concept of \"non-geographic\" metadata\n // so metadata for `001` country code was stored along with other countries.\n // The test case can be found by searching for:\n // \"should work around `nonGeographic` metadata not existing\".\n var countryCodes = this.countryCallingCodes()[callingCode];\n\n if (countryCodes && countryCodes.length === 1 && countryCodes[0] === '001') {\n return this.metadata.countries['001'];\n }\n }\n } // Deprecated.\n\n }, {\n key: \"countryCallingCode\",\n value: function countryCallingCode() {\n return this.numberingPlan.callingCode();\n } // Deprecated.\n\n }, {\n key: \"IDDPrefix\",\n value: function IDDPrefix() {\n return this.numberingPlan.IDDPrefix();\n } // Deprecated.\n\n }, {\n key: \"defaultIDDPrefix\",\n value: function defaultIDDPrefix() {\n return this.numberingPlan.defaultIDDPrefix();\n } // Deprecated.\n\n }, {\n key: \"nationalNumberPattern\",\n value: function nationalNumberPattern() {\n return this.numberingPlan.nationalNumberPattern();\n } // Deprecated.\n\n }, {\n key: \"possibleLengths\",\n value: function possibleLengths() {\n return this.numberingPlan.possibleLengths();\n } // Deprecated.\n\n }, {\n key: \"formats\",\n value: function formats() {\n return this.numberingPlan.formats();\n } // Deprecated.\n\n }, {\n key: \"nationalPrefixForParsing\",\n value: function nationalPrefixForParsing() {\n return this.numberingPlan.nationalPrefixForParsing();\n } // Deprecated.\n\n }, {\n key: \"nationalPrefixTransformRule\",\n value: function nationalPrefixTransformRule() {\n return this.numberingPlan.nationalPrefixTransformRule();\n } // Deprecated.\n\n }, {\n key: \"leadingDigits\",\n value: function leadingDigits() {\n return this.numberingPlan.leadingDigits();\n } // Deprecated.\n\n }, {\n key: \"hasTypes\",\n value: function hasTypes() {\n return this.numberingPlan.hasTypes();\n } // Deprecated.\n\n }, {\n key: \"type\",\n value: function type(_type) {\n return this.numberingPlan.type(_type);\n } // Deprecated.\n\n }, {\n key: \"ext\",\n value: function ext() {\n return this.numberingPlan.ext();\n }\n }, {\n key: \"countryCallingCodes\",\n value: function countryCallingCodes() {\n if (this.v1) return this.metadata.country_phone_code_to_countries;\n return this.metadata.country_calling_codes;\n } // Deprecated.\n\n }, {\n key: \"chooseCountryByCountryCallingCode\",\n value: function chooseCountryByCountryCallingCode(callingCode) {\n return this.selectNumberingPlan(callingCode);\n }\n }, {\n key: \"hasSelectedNumberingPlan\",\n value: function hasSelectedNumberingPlan() {\n return this.numberingPlan !== undefined;\n }\n }]);\n\n return Metadata;\n}();\n\nexports[\"default\"] = Metadata;\n\nvar NumberingPlan = /*#__PURE__*/function () {\n function NumberingPlan(metadata, globalMetadataObject) {\n _classCallCheck(this, NumberingPlan);\n\n this.globalMetadataObject = globalMetadataObject;\n this.metadata = metadata;\n setVersion.call(this, globalMetadataObject.metadata);\n }\n\n _createClass(NumberingPlan, [{\n key: \"callingCode\",\n value: function callingCode() {\n return this.metadata[0];\n } // Formatting information for regions which share\n // a country calling code is contained by only one region\n // for performance reasons. For example, for NANPA region\n // (\"North American Numbering Plan Administration\",\n // which includes USA, Canada, Cayman Islands, Bahamas, etc)\n // it will be contained in the metadata for `US`.\n\n }, {\n key: \"getDefaultCountryMetadataForRegion\",\n value: function getDefaultCountryMetadataForRegion() {\n return this.globalMetadataObject.getNumberingPlanMetadata(this.callingCode());\n } // Is always present.\n\n }, {\n key: \"IDDPrefix\",\n value: function IDDPrefix() {\n if (this.v1 || this.v2) return;\n return this.metadata[1];\n } // Is only present when a country supports multiple IDD prefixes.\n\n }, {\n key: \"defaultIDDPrefix\",\n value: function defaultIDDPrefix() {\n if (this.v1 || this.v2) return;\n return this.metadata[12];\n }\n }, {\n key: \"nationalNumberPattern\",\n value: function nationalNumberPattern() {\n if (this.v1 || this.v2) return this.metadata[1];\n return this.metadata[2];\n } // \"possible length\" data is always present in Google's metadata.\n\n }, {\n key: \"possibleLengths\",\n value: function possibleLengths() {\n if (this.v1) return;\n return this.metadata[this.v2 ? 2 : 3];\n }\n }, {\n key: \"_getFormats\",\n value: function _getFormats(metadata) {\n return metadata[this.v1 ? 2 : this.v2 ? 3 : 4];\n } // For countries of the same region (e.g. NANPA)\n // formats are all stored in the \"main\" country for that region.\n // E.g. \"RU\" and \"KZ\", \"US\" and \"CA\".\n\n }, {\n key: \"formats\",\n value: function formats() {\n var _this = this;\n\n var formats = this._getFormats(this.metadata) || this._getFormats(this.getDefaultCountryMetadataForRegion()) || [];\n return formats.map(function (_) {\n return new Format(_, _this);\n });\n }\n }, {\n key: \"nationalPrefix\",\n value: function nationalPrefix() {\n return this.metadata[this.v1 ? 3 : this.v2 ? 4 : 5];\n }\n }, {\n key: \"_getNationalPrefixFormattingRule\",\n value: function _getNationalPrefixFormattingRule(metadata) {\n return metadata[this.v1 ? 4 : this.v2 ? 5 : 6];\n } // For countries of the same region (e.g. NANPA)\n // national prefix formatting rule is stored in the \"main\" country for that region.\n // E.g. \"RU\" and \"KZ\", \"US\" and \"CA\".\n\n }, {\n key: \"nationalPrefixFormattingRule\",\n value: function nationalPrefixFormattingRule() {\n return this._getNationalPrefixFormattingRule(this.metadata) || this._getNationalPrefixFormattingRule(this.getDefaultCountryMetadataForRegion());\n }\n }, {\n key: \"_nationalPrefixForParsing\",\n value: function _nationalPrefixForParsing() {\n return this.metadata[this.v1 ? 5 : this.v2 ? 6 : 7];\n }\n }, {\n key: \"nationalPrefixForParsing\",\n value: function nationalPrefixForParsing() {\n // If `national_prefix_for_parsing` is not set explicitly,\n // then infer it from `national_prefix` (if any)\n return this._nationalPrefixForParsing() || this.nationalPrefix();\n }\n }, {\n key: \"nationalPrefixTransformRule\",\n value: function nationalPrefixTransformRule() {\n return this.metadata[this.v1 ? 6 : this.v2 ? 7 : 8];\n }\n }, {\n key: \"_getNationalPrefixIsOptionalWhenFormatting\",\n value: function _getNationalPrefixIsOptionalWhenFormatting() {\n return !!this.metadata[this.v1 ? 7 : this.v2 ? 8 : 9];\n } // For countries of the same region (e.g. NANPA)\n // \"national prefix is optional when formatting\" flag is\n // stored in the \"main\" country for that region.\n // E.g. \"RU\" and \"KZ\", \"US\" and \"CA\".\n\n }, {\n key: \"nationalPrefixIsOptionalWhenFormattingInNationalFormat\",\n value: function nationalPrefixIsOptionalWhenFormattingInNationalFormat() {\n return this._getNationalPrefixIsOptionalWhenFormatting(this.metadata) || this._getNationalPrefixIsOptionalWhenFormatting(this.getDefaultCountryMetadataForRegion());\n }\n }, {\n key: \"leadingDigits\",\n value: function leadingDigits() {\n return this.metadata[this.v1 ? 8 : this.v2 ? 9 : 10];\n }\n }, {\n key: \"types\",\n value: function types() {\n return this.metadata[this.v1 ? 9 : this.v2 ? 10 : 11];\n }\n }, {\n key: \"hasTypes\",\n value: function hasTypes() {\n // Versions 1.2.0 - 1.2.4: can be `[]`.\n\n /* istanbul ignore next */\n if (this.types() && this.types().length === 0) {\n return false;\n } // Versions <= 1.2.4: can be `undefined`.\n // Version >= 1.2.5: can be `0`.\n\n\n return !!this.types();\n }\n }, {\n key: \"type\",\n value: function type(_type2) {\n if (this.hasTypes() && getType(this.types(), _type2)) {\n return new Type(getType(this.types(), _type2), this);\n }\n }\n }, {\n key: \"ext\",\n value: function ext() {\n if (this.v1 || this.v2) return DEFAULT_EXT_PREFIX;\n return this.metadata[13] || DEFAULT_EXT_PREFIX;\n }\n }]);\n\n return NumberingPlan;\n}();\n\nvar Format = /*#__PURE__*/function () {\n function Format(format, metadata) {\n _classCallCheck(this, Format);\n\n this._format = format;\n this.metadata = metadata;\n }\n\n _createClass(Format, [{\n key: \"pattern\",\n value: function pattern() {\n return this._format[0];\n }\n }, {\n key: \"format\",\n value: function format() {\n return this._format[1];\n }\n }, {\n key: \"leadingDigitsPatterns\",\n value: function leadingDigitsPatterns() {\n return this._format[2] || [];\n }\n }, {\n key: \"nationalPrefixFormattingRule\",\n value: function nationalPrefixFormattingRule() {\n return this._format[3] || this.metadata.nationalPrefixFormattingRule();\n }\n }, {\n key: \"nationalPrefixIsOptionalWhenFormattingInNationalFormat\",\n value: function nationalPrefixIsOptionalWhenFormattingInNationalFormat() {\n return !!this._format[4] || this.metadata.nationalPrefixIsOptionalWhenFormattingInNationalFormat();\n }\n }, {\n key: \"nationalPrefixIsMandatoryWhenFormattingInNationalFormat\",\n value: function nationalPrefixIsMandatoryWhenFormattingInNationalFormat() {\n // National prefix is omitted if there's no national prefix formatting rule\n // set for this country, or when the national prefix formatting rule\n // contains no national prefix itself, or when this rule is set but\n // national prefix is optional for this phone number format\n // (and it is not enforced explicitly)\n return this.usesNationalPrefix() && !this.nationalPrefixIsOptionalWhenFormattingInNationalFormat();\n } // Checks whether national prefix formatting rule contains national prefix.\n\n }, {\n key: \"usesNationalPrefix\",\n value: function usesNationalPrefix() {\n return this.nationalPrefixFormattingRule() && // Check that national prefix formatting rule is not a \"dummy\" one.\n !FIRST_GROUP_ONLY_PREFIX_PATTERN.test(this.nationalPrefixFormattingRule()) // In compressed metadata, `this.nationalPrefixFormattingRule()` is `0`\n // when `national_prefix_formatting_rule` is not present.\n // So, `true` or `false` are returned explicitly here, so that\n // `0` number isn't returned.\n ? true : false;\n }\n }, {\n key: \"internationalFormat\",\n value: function internationalFormat() {\n return this._format[5] || this.format();\n }\n }]);\n\n return Format;\n}();\n/**\r\n * A pattern that is used to determine if the national prefix formatting rule\r\n * has the first group only, i.e., does not start with the national prefix.\r\n * Note that the pattern explicitly allows for unbalanced parentheses.\r\n */\n\n\nvar FIRST_GROUP_ONLY_PREFIX_PATTERN = /^\\(?\\$1\\)?$/;\n\nvar Type = /*#__PURE__*/function () {\n function Type(type, metadata) {\n _classCallCheck(this, Type);\n\n this.type = type;\n this.metadata = metadata;\n }\n\n _createClass(Type, [{\n key: \"pattern\",\n value: function pattern() {\n if (this.metadata.v1) return this.type;\n return this.type[0];\n }\n }, {\n key: \"possibleLengths\",\n value: function possibleLengths() {\n if (this.metadata.v1) return;\n return this.type[1] || this.metadata.possibleLengths();\n }\n }]);\n\n return Type;\n}();\n\nfunction getType(types, type) {\n switch (type) {\n case 'FIXED_LINE':\n return types[0];\n\n case 'MOBILE':\n return types[1];\n\n case 'TOLL_FREE':\n return types[2];\n\n case 'PREMIUM_RATE':\n return types[3];\n\n case 'PERSONAL_NUMBER':\n return types[4];\n\n case 'VOICEMAIL':\n return types[5];\n\n case 'UAN':\n return types[6];\n\n case 'PAGER':\n return types[7];\n\n case 'VOIP':\n return types[8];\n\n case 'SHARED_COST':\n return types[9];\n }\n}\n\nfunction validateMetadata(metadata) {\n if (!metadata) {\n throw new Error('[libphonenumber-js] `metadata` argument not passed. Check your arguments.');\n } // `country_phone_code_to_countries` was renamed to\n // `country_calling_codes` in `1.0.18`.\n\n\n if (!is_object(metadata) || !is_object(metadata.countries)) {\n throw new Error(\"[libphonenumber-js] `metadata` argument was passed but it's not a valid metadata. Must be an object having `.countries` child object property. Got \".concat(is_object(metadata) ? 'an object of shape: { ' + Object.keys(metadata).join(', ') + ' }' : 'a ' + type_of(metadata) + ': ' + metadata, \".\"));\n }\n} // Babel transforms `typeof` into some \"branches\"\n// so istanbul will show this as \"branch not covered\".\n\n/* istanbul ignore next */\n\n\nvar is_object = function is_object(_) {\n return _typeof(_) === 'object';\n}; // Babel transforms `typeof` into some \"branches\"\n// so istanbul will show this as \"branch not covered\".\n\n/* istanbul ignore next */\n\n\nvar type_of = function type_of(_) {\n return _typeof(_);\n};\n/**\r\n * Returns extension prefix for a country.\r\n * @param {string} country\r\n * @param {object} metadata\r\n * @return {string?}\r\n * @example\r\n * // Returns \" ext. \"\r\n * getExtPrefix(\"US\")\r\n */\n\n\nfunction getExtPrefix(country, metadata) {\n metadata = new Metadata(metadata);\n\n if (metadata.hasCountry(country)) {\n return metadata.country(country).ext();\n }\n\n return DEFAULT_EXT_PREFIX;\n}\n/**\r\n * Returns \"country calling code\" for a country.\r\n * Throws an error if the country doesn't exist or isn't supported by this library.\r\n * @param {string} country\r\n * @param {object} metadata\r\n * @return {string}\r\n * @example\r\n * // Returns \"44\"\r\n * getCountryCallingCode(\"GB\")\r\n */\n\n\nfunction getCountryCallingCode(country, metadata) {\n metadata = new Metadata(metadata);\n\n if (metadata.hasCountry(country)) {\n return metadata.country(country).countryCallingCode();\n }\n\n throw new Error(\"Unknown country: \".concat(country));\n}\n\nfunction isSupportedCountry(country, metadata) {\n // metadata = new Metadata(metadata)\n // return metadata.hasCountry(country)\n return metadata.countries[country] !== undefined;\n}\n\nfunction setVersion(metadata) {\n var version = metadata.version;\n\n if (typeof version === 'number') {\n this.v1 = version === 1;\n this.v2 = version === 2;\n this.v3 = version === 3;\n this.v4 = version === 4;\n } else {\n if (!version) {\n this.v1 = true;\n } else if ((0, _semverCompare[\"default\"])(version, V3) === -1) {\n this.v2 = true;\n } else if ((0, _semverCompare[\"default\"])(version, V4) === -1) {\n this.v3 = true;\n } else {\n this.v4 = true;\n }\n }\n} // const ISO_COUNTRY_CODE = /^[A-Z]{2}$/\n// function isCountryCode(countryCode) {\n// \treturn ISO_COUNTRY_CODE.test(countryCodeOrCountryCallingCode)\n// }\n//# sourceMappingURL=metadata.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = normalizeArguments;\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n// Extracts the following properties from function arguments:\n// * input `text`\n// * `options` object\n// * `metadata` JSON\nfunction normalizeArguments(args) {\n var _Array$prototype$slic = Array.prototype.slice.call(args),\n _Array$prototype$slic2 = _slicedToArray(_Array$prototype$slic, 4),\n arg_1 = _Array$prototype$slic2[0],\n arg_2 = _Array$prototype$slic2[1],\n arg_3 = _Array$prototype$slic2[2],\n arg_4 = _Array$prototype$slic2[3];\n\n var text;\n var options;\n var metadata; // If the phone number is passed as a string.\n // `parsePhoneNumber('88005553535', ...)`.\n\n if (typeof arg_1 === 'string') {\n text = arg_1;\n } else throw new TypeError('A text for parsing must be a string.'); // If \"default country\" argument is being passed then move it to `options`.\n // `parsePhoneNumber('88005553535', 'RU', [options], metadata)`.\n\n\n if (!arg_2 || typeof arg_2 === 'string') {\n if (arg_4) {\n options = arg_3;\n metadata = arg_4;\n } else {\n options = undefined;\n metadata = arg_3;\n }\n\n if (arg_2) {\n options = _objectSpread({\n defaultCountry: arg_2\n }, options);\n }\n } // `defaultCountry` is not passed.\n // Example: `parsePhoneNumber('+78005553535', [options], metadata)`.\n else if (isObject(arg_2)) {\n if (arg_3) {\n options = arg_2;\n metadata = arg_3;\n } else {\n metadata = arg_2;\n }\n } else throw new Error(\"Invalid second argument: \".concat(arg_2));\n\n return {\n text: text,\n options: options,\n metadata: metadata\n };\n} // Otherwise istanbul would show this as \"branch not covered\".\n\n/* istanbul ignore next */\n\n\nvar isObject = function isObject(_) {\n return _typeof(_) === 'object';\n};\n//# sourceMappingURL=normalizeArguments.js.map","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = parse;\n\nvar _constants = require(\"./constants.js\");\n\nvar _ParseError = _interopRequireDefault(require(\"./ParseError.js\"));\n\nvar _metadata = _interopRequireDefault(require(\"./metadata.js\"));\n\nvar _isViablePhoneNumber = _interopRequireWildcard(require(\"./helpers/isViablePhoneNumber.js\"));\n\nvar _extractExtension = _interopRequireDefault(require(\"./helpers/extension/extractExtension.js\"));\n\nvar _parseIncompletePhoneNumber = _interopRequireDefault(require(\"./parseIncompletePhoneNumber.js\"));\n\nvar _getCountryCallingCode = _interopRequireDefault(require(\"./getCountryCallingCode.js\"));\n\nvar _isPossible = require(\"./isPossible.js\");\n\nvar _PhoneNumber = _interopRequireDefault(require(\"./PhoneNumber.js\"));\n\nvar _matchesEntirely = _interopRequireDefault(require(\"./helpers/matchesEntirely.js\"));\n\nvar _extractCountryCallingCode = _interopRequireDefault(require(\"./helpers/extractCountryCallingCode.js\"));\n\nvar _extractNationalNumber = _interopRequireDefault(require(\"./helpers/extractNationalNumber.js\"));\n\nvar _stripIddPrefix = _interopRequireDefault(require(\"./helpers/stripIddPrefix.js\"));\n\nvar _getCountryByCallingCode = _interopRequireDefault(require(\"./helpers/getCountryByCallingCode.js\"));\n\nvar _extractFormattedPhoneNumberFromPossibleRfc3966NumberUri = _interopRequireDefault(require(\"./helpers/extractFormattedPhoneNumberFromPossibleRfc3966NumberUri.js\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n// This is a port of Google Android `libphonenumber`'s\n// `phonenumberutil.js` of December 31th, 2018.\n//\n// https://github.com/googlei18n/libphonenumber/commits/master/javascript/i18n/phonenumbers/phonenumberutil.js\n// import { parseRFC3966 } from './helpers/RFC3966.js'\n// We don't allow input strings for parsing to be longer than 250 chars.\n// This prevents malicious input from consuming CPU.\nvar MAX_INPUT_STRING_LENGTH = 250; // This consists of the plus symbol, digits, and arabic-indic digits.\n\nvar PHONE_NUMBER_START_PATTERN = new RegExp('[' + _constants.PLUS_CHARS + _constants.VALID_DIGITS + ']'); // Regular expression of trailing characters that we want to remove.\n// A trailing `#` is sometimes used when writing phone numbers with extensions in US.\n// Example: \"+1 (645) 123 1234-910#\" number has extension \"910\".\n\nvar AFTER_PHONE_NUMBER_END_PATTERN = new RegExp('[^' + _constants.VALID_DIGITS + '#' + ']+$');\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false; // Examples:\n//\n// ```js\n// parse('8 (800) 555-35-35', 'RU')\n// parse('8 (800) 555-35-35', 'RU', metadata)\n// parse('8 (800) 555-35-35', { country: { default: 'RU' } })\n// parse('8 (800) 555-35-35', { country: { default: 'RU' } }, metadata)\n// parse('+7 800 555 35 35')\n// parse('+7 800 555 35 35', metadata)\n// ```\n//\n\n/**\r\n * Parses a phone number.\r\n *\r\n * parse('123456789', { defaultCountry: 'RU', v2: true }, metadata)\r\n * parse('123456789', { defaultCountry: 'RU' }, metadata)\r\n * parse('123456789', undefined, metadata)\r\n *\r\n * @param {string} input\r\n * @param {object} [options]\r\n * @param {object} metadata\r\n * @return {object|PhoneNumber?} If `options.v2: true` flag is passed, it returns a `PhoneNumber?` instance. Otherwise, returns an object of shape `{ phone: '...', country: '...' }` (or just `{}` if no phone number was parsed).\r\n */\n\nfunction parse(text, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {};\n metadata = new _metadata[\"default\"](metadata); // Validate `defaultCountry`.\n\n if (options.defaultCountry && !metadata.hasCountry(options.defaultCountry)) {\n if (options.v2) {\n throw new _ParseError[\"default\"]('INVALID_COUNTRY');\n }\n\n throw new Error(\"Unknown country: \".concat(options.defaultCountry));\n } // Parse the phone number.\n\n\n var _parseInput = parseInput(text, options.v2, options.extract),\n formattedPhoneNumber = _parseInput.number,\n ext = _parseInput.ext,\n error = _parseInput.error; // If the phone number is not viable then return nothing.\n\n\n if (!formattedPhoneNumber) {\n if (options.v2) {\n if (error === 'TOO_SHORT') {\n throw new _ParseError[\"default\"]('TOO_SHORT');\n }\n\n throw new _ParseError[\"default\"]('NOT_A_NUMBER');\n }\n\n return {};\n }\n\n var _parsePhoneNumber = parsePhoneNumber(formattedPhoneNumber, options.defaultCountry, options.defaultCallingCode, metadata),\n country = _parsePhoneNumber.country,\n nationalNumber = _parsePhoneNumber.nationalNumber,\n countryCallingCode = _parsePhoneNumber.countryCallingCode,\n countryCallingCodeSource = _parsePhoneNumber.countryCallingCodeSource,\n carrierCode = _parsePhoneNumber.carrierCode;\n\n if (!metadata.hasSelectedNumberingPlan()) {\n if (options.v2) {\n throw new _ParseError[\"default\"]('INVALID_COUNTRY');\n }\n\n return {};\n } // Validate national (significant) number length.\n\n\n if (!nationalNumber || nationalNumber.length < _constants.MIN_LENGTH_FOR_NSN) {\n // Won't throw here because the regexp already demands length > 1.\n\n /* istanbul ignore if */\n if (options.v2) {\n throw new _ParseError[\"default\"]('TOO_SHORT');\n } // Google's demo just throws an error in this case.\n\n\n return {};\n } // Validate national (significant) number length.\n //\n // A sidenote:\n //\n // They say that sometimes national (significant) numbers\n // can be longer than `MAX_LENGTH_FOR_NSN` (e.g. in Germany).\n // https://github.com/googlei18n/libphonenumber/blob/7e1748645552da39c4e1ba731e47969d97bdb539/resources/phonenumber.proto#L36\n // Such numbers will just be discarded.\n //\n\n\n if (nationalNumber.length > _constants.MAX_LENGTH_FOR_NSN) {\n if (options.v2) {\n throw new _ParseError[\"default\"]('TOO_LONG');\n } // Google's demo just throws an error in this case.\n\n\n return {};\n }\n\n if (options.v2) {\n var phoneNumber = new _PhoneNumber[\"default\"](countryCallingCode, nationalNumber, metadata.metadata);\n\n if (country) {\n phoneNumber.country = country;\n }\n\n if (carrierCode) {\n phoneNumber.carrierCode = carrierCode;\n }\n\n if (ext) {\n phoneNumber.ext = ext;\n }\n\n phoneNumber.__countryCallingCodeSource = countryCallingCodeSource;\n return phoneNumber;\n } // Check if national phone number pattern matches the number.\n // National number pattern is different for each country,\n // even for those ones which are part of the \"NANPA\" group.\n\n\n var valid = (options.extended ? metadata.hasSelectedNumberingPlan() : country) ? (0, _matchesEntirely[\"default\"])(nationalNumber, metadata.nationalNumberPattern()) : false;\n\n if (!options.extended) {\n return valid ? result(country, nationalNumber, ext) : {};\n } // isInternational: countryCallingCode !== undefined\n\n\n return {\n country: country,\n countryCallingCode: countryCallingCode,\n carrierCode: carrierCode,\n valid: valid,\n possible: valid ? true : options.extended === true && metadata.possibleLengths() && (0, _isPossible.isPossibleNumber)(nationalNumber, metadata) ? true : false,\n phone: nationalNumber,\n ext: ext\n };\n}\n/**\r\n * Extracts a formatted phone number from text.\r\n * Doesn't guarantee that the extracted phone number\r\n * is a valid phone number (for example, doesn't validate its length).\r\n * @param {string} text\r\n * @param {boolean} [extract] — If `false`, then will parse the entire `text` as a phone number.\r\n * @param {boolean} [throwOnError] — By default, it won't throw if the text is too long.\r\n * @return {string}\r\n * @example\r\n * // Returns \"(213) 373-4253\".\r\n * extractFormattedPhoneNumber(\"Call (213) 373-4253 for assistance.\")\r\n */\n\n\nfunction _extractFormattedPhoneNumber(text, extract, throwOnError) {\n if (!text) {\n return;\n }\n\n if (text.length > MAX_INPUT_STRING_LENGTH) {\n if (throwOnError) {\n throw new _ParseError[\"default\"]('TOO_LONG');\n }\n\n return;\n }\n\n if (extract === false) {\n return text;\n } // Attempt to extract a possible number from the string passed in\n\n\n var startsAt = text.search(PHONE_NUMBER_START_PATTERN);\n\n if (startsAt < 0) {\n return;\n }\n\n return text // Trim everything to the left of the phone number\n .slice(startsAt) // Remove trailing non-numerical characters\n .replace(AFTER_PHONE_NUMBER_END_PATTERN, '');\n}\n/**\r\n * @param {string} text - Input.\r\n * @param {boolean} v2 - Legacy API functions don't pass `v2: true` flag.\r\n * @param {boolean} [extract] - Whether to extract a phone number from `text`, or attempt to parse the entire text as a phone number.\r\n * @return {object} `{ ?number, ?ext }`.\r\n */\n\n\nfunction parseInput(text, v2, extract) {\n // // Parse RFC 3966 phone number URI.\n // if (text && text.indexOf('tel:') === 0) {\n // \treturn parseRFC3966(text)\n // }\n // let number = extractFormattedPhoneNumber(text, extract, v2)\n var number = (0, _extractFormattedPhoneNumberFromPossibleRfc3966NumberUri[\"default\"])(text, {\n extractFormattedPhoneNumber: function extractFormattedPhoneNumber(text) {\n return _extractFormattedPhoneNumber(text, extract, v2);\n }\n }); // If the phone number is not viable, then abort.\n\n if (!number) {\n return {};\n }\n\n if (!(0, _isViablePhoneNumber[\"default\"])(number)) {\n if ((0, _isViablePhoneNumber.isViablePhoneNumberStart)(number)) {\n return {\n error: 'TOO_SHORT'\n };\n }\n\n return {};\n } // Attempt to parse extension first, since it doesn't require region-specific\n // data and we want to have the non-normalised number here.\n\n\n var withExtensionStripped = (0, _extractExtension[\"default\"])(number);\n\n if (withExtensionStripped.ext) {\n return withExtensionStripped;\n }\n\n return {\n number: number\n };\n}\n/**\r\n * Creates `parse()` result object.\r\n */\n\n\nfunction result(country, nationalNumber, ext) {\n var result = {\n country: country,\n phone: nationalNumber\n };\n\n if (ext) {\n result.ext = ext;\n }\n\n return result;\n}\n/**\r\n * Parses a viable phone number.\r\n * @param {string} formattedPhoneNumber — Example: \"(213) 373-4253\".\r\n * @param {string} [defaultCountry]\r\n * @param {string} [defaultCallingCode]\r\n * @param {Metadata} metadata\r\n * @return {object} Returns `{ country: string?, countryCallingCode: string?, nationalNumber: string? }`.\r\n */\n\n\nfunction parsePhoneNumber(formattedPhoneNumber, defaultCountry, defaultCallingCode, metadata) {\n // Extract calling code from phone number.\n var _extractCountryCallin = (0, _extractCountryCallingCode[\"default\"])((0, _parseIncompletePhoneNumber[\"default\"])(formattedPhoneNumber), defaultCountry, defaultCallingCode, metadata.metadata),\n countryCallingCodeSource = _extractCountryCallin.countryCallingCodeSource,\n countryCallingCode = _extractCountryCallin.countryCallingCode,\n number = _extractCountryCallin.number; // Choose a country by `countryCallingCode`.\n\n\n var country;\n\n if (countryCallingCode) {\n metadata.selectNumberingPlan(countryCallingCode);\n } // If `formattedPhoneNumber` is passed in \"national\" format\n // then `number` is defined and `countryCallingCode` is `undefined`.\n else if (number && (defaultCountry || defaultCallingCode)) {\n metadata.selectNumberingPlan(defaultCountry, defaultCallingCode);\n\n if (defaultCountry) {\n country = defaultCountry;\n } else {\n /* istanbul ignore if */\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (metadata.isNonGeographicCallingCode(defaultCallingCode)) {\n country = '001';\n }\n }\n }\n\n countryCallingCode = defaultCallingCode || (0, _getCountryCallingCode[\"default\"])(defaultCountry, metadata.metadata);\n } else return {};\n\n if (!number) {\n return {\n countryCallingCodeSource: countryCallingCodeSource,\n countryCallingCode: countryCallingCode\n };\n }\n\n var _extractNationalNumbe = (0, _extractNationalNumber[\"default\"])((0, _parseIncompletePhoneNumber[\"default\"])(number), metadata),\n nationalNumber = _extractNationalNumbe.nationalNumber,\n carrierCode = _extractNationalNumbe.carrierCode; // Sometimes there are several countries\n // corresponding to the same country phone code\n // (e.g. NANPA countries all having `1` country phone code).\n // Therefore, to reliably determine the exact country,\n // national (significant) number should have been parsed first.\n //\n // When `metadata.json` is generated, all \"ambiguous\" country phone codes\n // get their countries populated with the full set of\n // \"phone number type\" regular expressions.\n //\n\n\n var exactCountry = (0, _getCountryByCallingCode[\"default\"])(countryCallingCode, nationalNumber, metadata);\n\n if (exactCountry) {\n country = exactCountry;\n /* istanbul ignore if */\n\n if (exactCountry === '001') {// Can't happen with `USE_NON_GEOGRAPHIC_COUNTRY_CODE` being `false`.\n // If `USE_NON_GEOGRAPHIC_COUNTRY_CODE` is set to `true` for some reason,\n // then remove the \"istanbul ignore if\".\n } else {\n metadata.country(country);\n }\n }\n\n return {\n country: country,\n countryCallingCode: countryCallingCode,\n countryCallingCodeSource: countryCallingCodeSource,\n nationalNumber: nationalNumber,\n carrierCode: carrierCode\n };\n}\n//# sourceMappingURL=parse.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = parseIncompletePhoneNumber;\nexports.parsePhoneNumberCharacter = parsePhoneNumberCharacter;\n\nvar _parseDigits = require(\"./helpers/parseDigits.js\");\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/**\r\n * Parses phone number characters from a string.\r\n * Drops all punctuation leaving only digits and the leading `+` sign (if any).\r\n * Also converts wide-ascii and arabic-indic numerals to conventional numerals.\r\n * E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.\r\n * @param {string} string\r\n * @return {string}\r\n * @example\r\n * ```js\r\n * // Outputs '8800555'.\r\n * parseIncompletePhoneNumber('8 (800) 555')\r\n * // Outputs '+7800555'.\r\n * parseIncompletePhoneNumber('+7 800 555')\r\n * ```\r\n */\nfunction parseIncompletePhoneNumber(string) {\n var result = ''; // Using `.split('')` here instead of normal `for ... of`\n // because the importing application doesn't neccessarily include an ES6 polyfill.\n // The `.split('')` approach discards \"exotic\" UTF-8 characters\n // (the ones consisting of four bytes) but digits\n // (including non-European ones) don't fall into that range\n // so such \"exotic\" characters would be discarded anyway.\n\n for (var _iterator = _createForOfIteratorHelperLoose(string.split('')), _step; !(_step = _iterator()).done;) {\n var character = _step.value;\n result += parsePhoneNumberCharacter(character, result) || '';\n }\n\n return result;\n}\n/**\r\n * Parses next character while parsing phone number digits (including a `+`)\r\n * from text: discards everything except `+` and digits, and `+` is only allowed\r\n * at the start of a phone number.\r\n * For example, is used in `react-phone-number-input` where it uses\r\n * [`input-format`](https://gitlab.com/catamphetamine/input-format).\r\n * @param {string} character - Yet another character from raw input string.\r\n * @param {string?} prevParsedCharacters - Previous parsed characters.\r\n * @param {object} meta - Optional custom use-case-specific metadata.\r\n * @return {string?} The parsed character.\r\n */\n\n\nfunction parsePhoneNumberCharacter(character, prevParsedCharacters) {\n // Only allow a leading `+`.\n if (character === '+') {\n // If this `+` is not the first parsed character\n // then discard it.\n if (prevParsedCharacters) {\n return;\n }\n\n return '+';\n } // Allow digits.\n\n\n return (0, _parseDigits.parseDigit)(character);\n}\n//# sourceMappingURL=parseIncompletePhoneNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = parsePhoneNumber;\n\nvar _normalizeArguments2 = _interopRequireDefault(require(\"./normalizeArguments.js\"));\n\nvar _parsePhoneNumber_ = _interopRequireDefault(require(\"./parsePhoneNumber_.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction parsePhoneNumber() {\n var _normalizeArguments = (0, _normalizeArguments2[\"default\"])(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n return (0, _parsePhoneNumber_[\"default\"])(text, options, metadata);\n}\n//# sourceMappingURL=parsePhoneNumber.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = parsePhoneNumberWithError;\n\nvar _parsePhoneNumberWithError_ = _interopRequireDefault(require(\"./parsePhoneNumberWithError_.js\"));\n\nvar _normalizeArguments2 = _interopRequireDefault(require(\"./normalizeArguments.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction parsePhoneNumberWithError() {\n var _normalizeArguments = (0, _normalizeArguments2[\"default\"])(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n return (0, _parsePhoneNumberWithError_[\"default\"])(text, options, metadata);\n}\n//# sourceMappingURL=parsePhoneNumberWithError.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = parsePhoneNumberWithError;\n\nvar _parse = _interopRequireDefault(require(\"./parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction parsePhoneNumberWithError(text, options, metadata) {\n return (0, _parse[\"default\"])(text, _objectSpread(_objectSpread({}, options), {}, {\n v2: true\n }), metadata);\n}\n//# sourceMappingURL=parsePhoneNumberWithError_.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = parsePhoneNumber;\n\nvar _parsePhoneNumberWithError_ = _interopRequireDefault(require(\"./parsePhoneNumberWithError_.js\"));\n\nvar _ParseError = _interopRequireDefault(require(\"./ParseError.js\"));\n\nvar _metadata = require(\"./metadata.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction parsePhoneNumber(text, options, metadata) {\n // Validate `defaultCountry`.\n if (options && options.defaultCountry && !(0, _metadata.isSupportedCountry)(options.defaultCountry, metadata)) {\n options = _objectSpread(_objectSpread({}, options), {}, {\n defaultCountry: undefined\n });\n } // Parse phone number.\n\n\n try {\n return (0, _parsePhoneNumberWithError_[\"default\"])(text, options, metadata);\n } catch (error) {\n /* istanbul ignore else */\n if (error instanceof _ParseError[\"default\"]) {//\n } else {\n throw error;\n }\n }\n}\n//# sourceMappingURL=parsePhoneNumber_.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = searchPhoneNumbersInText;\n\nvar _PhoneNumberMatcher = _interopRequireDefault(require(\"./PhoneNumberMatcher.js\"));\n\nvar _normalizeArguments2 = _interopRequireDefault(require(\"./normalizeArguments.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction searchPhoneNumbersInText() {\n var _normalizeArguments = (0, _normalizeArguments2[\"default\"])(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n var matcher = new _PhoneNumberMatcher[\"default\"](text, _objectSpread(_objectSpread({}, options), {}, {\n v2: true\n }), metadata);\n return _defineProperty({}, Symbol.iterator, function () {\n return {\n next: function next() {\n if (matcher.hasNext()) {\n return {\n done: false,\n value: matcher.next()\n };\n }\n\n return {\n done: true\n };\n }\n };\n });\n}\n//# sourceMappingURL=searchPhoneNumbersInText.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = _default;\n\n// Copy-pasted from:\n// https://github.com/substack/semver-compare/blob/master/index.js\n//\n// Inlining this function because some users reported issues with\n// importing from `semver-compare` in a browser with ES6 \"native\" modules.\n//\n// Fixes `semver-compare` not being able to compare versions with alpha/beta/etc \"tags\".\n// https://github.com/catamphetamine/libphonenumber-js/issues/381\nfunction _default(a, b) {\n a = a.split('-');\n b = b.split('-');\n var pa = a[0].split('.');\n var pb = b[0].split('.');\n\n for (var i = 0; i < 3; i++) {\n var na = Number(pa[i]);\n var nb = Number(pb[i]);\n if (na > nb) return 1;\n if (nb > na) return -1;\n if (!isNaN(na) && isNaN(nb)) return 1;\n if (isNaN(na) && !isNaN(nb)) return -1;\n }\n\n if (a[1] && b[1]) {\n return a[1] > b[1] ? 1 : a[1] < b[1] ? -1 : 0;\n }\n\n return !a[1] && b[1] ? 1 : a[1] && !b[1] ? -1 : 0;\n}\n//# sourceMappingURL=semver-compare.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = validatePhoneNumberLength;\n\nvar _normalizeArguments2 = _interopRequireDefault(require(\"./normalizeArguments.js\"));\n\nvar _parsePhoneNumberWithError_ = _interopRequireDefault(require(\"./parsePhoneNumberWithError_.js\"));\n\nvar _ParseError = _interopRequireDefault(require(\"./ParseError.js\"));\n\nvar _metadata = _interopRequireDefault(require(\"./metadata.js\"));\n\nvar _checkNumberLength = _interopRequireDefault(require(\"./helpers/checkNumberLength.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction validatePhoneNumberLength() {\n var _normalizeArguments = (0, _normalizeArguments2[\"default\"])(arguments),\n text = _normalizeArguments.text,\n options = _normalizeArguments.options,\n metadata = _normalizeArguments.metadata;\n\n options = _objectSpread(_objectSpread({}, options), {}, {\n extract: false\n }); // Parse phone number.\n\n try {\n var phoneNumber = (0, _parsePhoneNumberWithError_[\"default\"])(text, options, metadata);\n metadata = new _metadata[\"default\"](metadata);\n metadata.selectNumberingPlan(phoneNumber.countryCallingCode);\n var result = (0, _checkNumberLength[\"default\"])(phoneNumber.nationalNumber, metadata);\n\n if (result !== 'IS_POSSIBLE') {\n return result;\n }\n } catch (error) {\n /* istanbul ignore else */\n if (error instanceof _ParseError[\"default\"]) {\n return error.message;\n } else {\n throw error;\n }\n }\n}\n//# sourceMappingURL=validatePhoneNumberLength.js.map","'use strict'\r\n\r\nvar parsePhoneNumberFromString = require('../build/parsePhoneNumber.js').default\r\n\r\n// ES5 `require()` \"default\" \"interoperability\" hack.\r\n// https://github.com/babel/babel/issues/2212#issuecomment-131827986\r\n// An alternative approach:\r\n// https://www.npmjs.com/package/babel-plugin-add-module-exports\r\nexports = module.exports = parsePhoneNumberFromString\r\nexports['default'] = parsePhoneNumberFromString\r\n\r\nexports.ParseError = require('../build/ParseError.js').default\r\nvar parsePhoneNumberWithError = require('../build/parsePhoneNumberWithError.js').default\r\n// `parsePhoneNumber()` named export has been renamed to `parsePhoneNumberWithError()`.\r\nexports.parsePhoneNumberWithError = parsePhoneNumberWithError\r\nexports.parsePhoneNumber = parsePhoneNumberWithError\r\n\r\n// `parsePhoneNumberFromString()` named export is now considered legacy:\r\n// it has been promoted to a default export due to being too verbose.\r\nexports.parsePhoneNumberFromString = parsePhoneNumberFromString\r\n\r\nexports.isValidPhoneNumber = require('../build/isValidPhoneNumber.js').default\r\nexports.isPossiblePhoneNumber = require('../build/isPossiblePhoneNumber.js').default\r\nexports.validatePhoneNumberLength = require('../build/validatePhoneNumberLength.js').default\r\n\r\nexports.findNumbers = require('../build/legacy/findNumbers.js').default\r\nexports.searchNumbers = require('../build/legacy/searchNumbers.js').default\r\n\r\nexports.findPhoneNumbersInText = require('../build/findPhoneNumbersInText.js').default\r\nexports.searchPhoneNumbersInText = require('../build/searchPhoneNumbersInText.js').default\r\nexports.PhoneNumberMatcher = require('../build/PhoneNumberMatcher.js').default\r\n\r\nexports.AsYouType = require('../build/AsYouType.js').default\r\n\r\nexports.Metadata = require('../build/metadata.js').default\r\nexports.isSupportedCountry = require('../build/metadata.js').isSupportedCountry\r\nexports.getCountries = require('../build/getCountries.js').default\r\nexports.getCountryCallingCode = require('../build/metadata.js').getCountryCallingCode\r\nexports.getExtPrefix = require('../build/metadata.js').getExtPrefix\r\n\r\nexports.getExampleNumber = require('../build/getExampleNumber.js').default\r\n\r\nexports.formatIncompletePhoneNumber = require('../build/formatIncompletePhoneNumber.js').default\r\n\r\nexports.parseIncompletePhoneNumber = require('../build/parseIncompletePhoneNumber.js').default\r\nexports.parsePhoneNumberCharacter = require('../build/parseIncompletePhoneNumber.js').parsePhoneNumberCharacter\r\nexports.parseDigits = require('../build/helpers/parseDigits.js').default\r\nexports.DIGIT_PLACEHOLDER = require('../build/AsYouTypeFormatter.js').DIGIT_PLACEHOLDER\r\n\r\nexports.parseRFC3966 = require('../build/helpers/RFC3966.js').parseRFC3966\r\nexports.formatRFC3966 = require('../build/helpers/RFC3966.js').formatRFC3966","'use strict'\r\n\r\nvar min = require('./min/index.cjs')\r\nvar metadata = require('./metadata.min.json')\r\n\r\nfunction withMetadataArgument(func, _arguments) {\r\n\tvar args = Array.prototype.slice.call(_arguments)\r\n\targs.push(metadata)\r\n\treturn func.apply(this, args)\r\n}\r\n\r\n// ES5 `require()` \"default\" \"interoperability\" hack.\r\n// https://github.com/babel/babel/issues/2212#issuecomment-131827986\r\n// An alternative approach:\r\n// https://www.npmjs.com/package/babel-plugin-add-module-exports\r\nexports = module.exports = min.parsePhoneNumberFromString\r\nexports['default'] = min.parsePhoneNumberFromString\r\n\r\n// `parsePhoneNumberFromString()` named export is now considered legacy:\r\n// it has been promoted to a default export due to being too verbose.\r\nexports.parsePhoneNumberFromString = min.parsePhoneNumberFromString\r\n\r\nexports.ParseError = min.ParseError\r\n\r\n// `parsePhoneNumber()` named export has been renamed to `parsePhoneNumberWithError()`.\r\nexports.parsePhoneNumber = min.parsePhoneNumberWithError\r\nexports.parsePhoneNumberWithError = min.parsePhoneNumberWithError\r\n\r\nexports.isValidPhoneNumber = min.isValidPhoneNumber\r\nexports.isPossiblePhoneNumber = min.isPossiblePhoneNumber\r\nexports.validatePhoneNumberLength = min.validatePhoneNumberLength\r\n\r\n// `parse()` and `parseNumber()` functions are deprecated.\r\nvar parse_ = require('./build/legacy/parse.js').default\r\nexports.parse = function parse() {\r\n\treturn withMetadataArgument(parse_, arguments)\r\n}\r\nexports.parseNumber = exports.parse\r\n\r\n// `format()` and `formatNumber()` functions are deprecated.\r\nvar format_ = require('./build/legacy/format.js').default\r\nexports.format = function format() {\r\n\treturn withMetadataArgument(format_, arguments)\r\n}\r\nexports.formatNumber = exports.format\r\n\r\n// Deprecated.\r\nvar getNumberType_ = require('./build/legacy/getNumberType.js').default\r\nexports.getNumberType = function getNumberType() {\r\n\treturn withMetadataArgument(getNumberType_, arguments)\r\n}\r\n\r\n// Deprecated.\r\nvar isPossibleNumber_ = require('./build/legacy/isPossibleNumber.js').default\r\nexports.isPossibleNumber = function isPossibleNumber() {\r\n\treturn withMetadataArgument(isPossibleNumber_, arguments)\r\n}\r\n\r\n// Deprecated.\r\nvar isValidNumber_ = require('./build/legacy/isValidNumber.js').default\r\nexports.isValidNumber = function isValidNumber() {\r\n\treturn withMetadataArgument(isValidNumber_, arguments)\r\n}\r\n\r\n// Deprecated.\r\nvar isValidNumberForRegion_ = require('./build/legacy/isValidNumberForRegion.js').default\r\nexports.isValidNumberForRegion = function isValidNumberForRegion() {\r\n\treturn withMetadataArgument(isValidNumberForRegion_, arguments)\r\n}\r\n\r\nexports.getExampleNumber = min.getExampleNumber\r\nexports.Metadata = min.Metadata\r\n\r\n// Deprecated.\r\nvar findPhoneNumbers_ = require('./build/legacy/findPhoneNumbers.js').default\r\nexports.findPhoneNumbers = function findPhoneNumbers() {\r\n\treturn withMetadataArgument(findPhoneNumbers_, arguments)\r\n}\r\n\r\n// Deprecated.\r\nvar searchPhoneNumbers_ = require('./build/legacy/findPhoneNumbers.js').searchPhoneNumbers\r\nexports.searchPhoneNumbers = function searchPhoneNumbers() {\r\n\treturn withMetadataArgument(searchPhoneNumbers_, arguments)\r\n}\r\n\r\n// Deprecated.\r\nvar PhoneNumberSearch_ = require('./build/legacy/findPhoneNumbersInitialImplementation.js').PhoneNumberSearch\r\nexports.PhoneNumberSearch = function PhoneNumberSearch(text, options) {\r\n\treturn PhoneNumberSearch_.call(this, text, options, metadata)\r\n}\r\nexports.PhoneNumberSearch.prototype = Object.create(PhoneNumberSearch_.prototype, {})\r\nexports.PhoneNumberSearch.prototype.constructor = exports.PhoneNumberSearch\r\n\r\n// Deprecated.\r\nexports.findNumbers = min.findNumbers\r\n// Deprecated.\r\nexports.searchNumbers = min.searchNumbers\r\n\r\nexports.findPhoneNumbersInText = min.findPhoneNumbersInText\r\nexports.searchPhoneNumbersInText = min.searchPhoneNumbersInText\r\nexports.PhoneNumberMatcher = min.PhoneNumberMatcher\r\n\r\nexports.AsYouType = min.AsYouType\r\n\r\nexports.getCountries = min.getCountries\r\nexports.getCountryCallingCode = min.getCountryCallingCode\r\nexports.isSupportedCountry = min.isSupportedCountry\r\nexports.getExtPrefix = min.getExtPrefix\r\n\r\nexports.parseRFC3966 = min.parseRFC3966\r\nexports.formatRFC3966 = min.formatRFC3966\r\n\r\n// Deprecated: `DIGITS` were used by `react-phone-number-input`.\r\n// Replaced by `parseDigits()`.\r\nexports.DIGITS = require('./build/helpers/parseDigits.js').DIGITS\r\nexports.DIGIT_PLACEHOLDER = min.DIGIT_PLACEHOLDER\r\n\r\n// `getPhoneCode` name is deprecated\r\nexports.getPhoneCode = min.getCountryCallingCode\r\n\r\nexports.formatIncompletePhoneNumber = min.formatIncompletePhoneNumber\r\nexports.parseIncompletePhoneNumber = min.parseIncompletePhoneNumber\r\nexports.parsePhoneNumberCharacter = min.parsePhoneNumberCharacter\r\nexports.parseDigits = min.parseDigits","module.exports={\"version\":4,\"country_calling_codes\":{\"1\":[\"US\",\"AG\",\"AI\",\"AS\",\"BB\",\"BM\",\"BS\",\"CA\",\"DM\",\"DO\",\"GD\",\"GU\",\"JM\",\"KN\",\"KY\",\"LC\",\"MP\",\"MS\",\"PR\",\"SX\",\"TC\",\"TT\",\"VC\",\"VG\",\"VI\"],\"7\":[\"RU\",\"KZ\"],\"20\":[\"EG\"],\"27\":[\"ZA\"],\"30\":[\"GR\"],\"31\":[\"NL\"],\"32\":[\"BE\"],\"33\":[\"FR\"],\"34\":[\"ES\"],\"36\":[\"HU\"],\"39\":[\"IT\",\"VA\"],\"40\":[\"RO\"],\"41\":[\"CH\"],\"43\":[\"AT\"],\"44\":[\"GB\",\"GG\",\"IM\",\"JE\"],\"45\":[\"DK\"],\"46\":[\"SE\"],\"47\":[\"NO\",\"SJ\"],\"48\":[\"PL\"],\"49\":[\"DE\"],\"51\":[\"PE\"],\"52\":[\"MX\"],\"53\":[\"CU\"],\"54\":[\"AR\"],\"55\":[\"BR\"],\"56\":[\"CL\"],\"57\":[\"CO\"],\"58\":[\"VE\"],\"60\":[\"MY\"],\"61\":[\"AU\",\"CC\",\"CX\"],\"62\":[\"ID\"],\"63\":[\"PH\"],\"64\":[\"NZ\"],\"65\":[\"SG\"],\"66\":[\"TH\"],\"81\":[\"JP\"],\"82\":[\"KR\"],\"84\":[\"VN\"],\"86\":[\"CN\"],\"90\":[\"TR\"],\"91\":[\"IN\"],\"92\":[\"PK\"],\"93\":[\"AF\"],\"94\":[\"LK\"],\"95\":[\"MM\"],\"98\":[\"IR\"],\"211\":[\"SS\"],\"212\":[\"MA\",\"EH\"],\"213\":[\"DZ\"],\"216\":[\"TN\"],\"218\":[\"LY\"],\"220\":[\"GM\"],\"221\":[\"SN\"],\"222\":[\"MR\"],\"223\":[\"ML\"],\"224\":[\"GN\"],\"225\":[\"CI\"],\"226\":[\"BF\"],\"227\":[\"NE\"],\"228\":[\"TG\"],\"229\":[\"BJ\"],\"230\":[\"MU\"],\"231\":[\"LR\"],\"232\":[\"SL\"],\"233\":[\"GH\"],\"234\":[\"NG\"],\"235\":[\"TD\"],\"236\":[\"CF\"],\"237\":[\"CM\"],\"238\":[\"CV\"],\"239\":[\"ST\"],\"240\":[\"GQ\"],\"241\":[\"GA\"],\"242\":[\"CG\"],\"243\":[\"CD\"],\"244\":[\"AO\"],\"245\":[\"GW\"],\"246\":[\"IO\"],\"247\":[\"AC\"],\"248\":[\"SC\"],\"249\":[\"SD\"],\"250\":[\"RW\"],\"251\":[\"ET\"],\"252\":[\"SO\"],\"253\":[\"DJ\"],\"254\":[\"KE\"],\"255\":[\"TZ\"],\"256\":[\"UG\"],\"257\":[\"BI\"],\"258\":[\"MZ\"],\"260\":[\"ZM\"],\"261\":[\"MG\"],\"262\":[\"RE\",\"YT\"],\"263\":[\"ZW\"],\"264\":[\"NA\"],\"265\":[\"MW\"],\"266\":[\"LS\"],\"267\":[\"BW\"],\"268\":[\"SZ\"],\"269\":[\"KM\"],\"290\":[\"SH\",\"TA\"],\"291\":[\"ER\"],\"297\":[\"AW\"],\"298\":[\"FO\"],\"299\":[\"GL\"],\"350\":[\"GI\"],\"351\":[\"PT\"],\"352\":[\"LU\"],\"353\":[\"IE\"],\"354\":[\"IS\"],\"355\":[\"AL\"],\"356\":[\"MT\"],\"357\":[\"CY\"],\"358\":[\"FI\",\"AX\"],\"359\":[\"BG\"],\"370\":[\"LT\"],\"371\":[\"LV\"],\"372\":[\"EE\"],\"373\":[\"MD\"],\"374\":[\"AM\"],\"375\":[\"BY\"],\"376\":[\"AD\"],\"377\":[\"MC\"],\"378\":[\"SM\"],\"380\":[\"UA\"],\"381\":[\"RS\"],\"382\":[\"ME\"],\"383\":[\"XK\"],\"385\":[\"HR\"],\"386\":[\"SI\"],\"387\":[\"BA\"],\"389\":[\"MK\"],\"420\":[\"CZ\"],\"421\":[\"SK\"],\"423\":[\"LI\"],\"500\":[\"FK\"],\"501\":[\"BZ\"],\"502\":[\"GT\"],\"503\":[\"SV\"],\"504\":[\"HN\"],\"505\":[\"NI\"],\"506\":[\"CR\"],\"507\":[\"PA\"],\"508\":[\"PM\"],\"509\":[\"HT\"],\"590\":[\"GP\",\"BL\",\"MF\"],\"591\":[\"BO\"],\"592\":[\"GY\"],\"593\":[\"EC\"],\"594\":[\"GF\"],\"595\":[\"PY\"],\"596\":[\"MQ\"],\"597\":[\"SR\"],\"598\":[\"UY\"],\"599\":[\"CW\",\"BQ\"],\"670\":[\"TL\"],\"672\":[\"NF\"],\"673\":[\"BN\"],\"674\":[\"NR\"],\"675\":[\"PG\"],\"676\":[\"TO\"],\"677\":[\"SB\"],\"678\":[\"VU\"],\"679\":[\"FJ\"],\"680\":[\"PW\"],\"681\":[\"WF\"],\"682\":[\"CK\"],\"683\":[\"NU\"],\"685\":[\"WS\"],\"686\":[\"KI\"],\"687\":[\"NC\"],\"688\":[\"TV\"],\"689\":[\"PF\"],\"690\":[\"TK\"],\"691\":[\"FM\"],\"692\":[\"MH\"],\"850\":[\"KP\"],\"852\":[\"HK\"],\"853\":[\"MO\"],\"855\":[\"KH\"],\"856\":[\"LA\"],\"880\":[\"BD\"],\"886\":[\"TW\"],\"960\":[\"MV\"],\"961\":[\"LB\"],\"962\":[\"JO\"],\"963\":[\"SY\"],\"964\":[\"IQ\"],\"965\":[\"KW\"],\"966\":[\"SA\"],\"967\":[\"YE\"],\"968\":[\"OM\"],\"970\":[\"PS\"],\"971\":[\"AE\"],\"972\":[\"IL\"],\"973\":[\"BH\"],\"974\":[\"QA\"],\"975\":[\"BT\"],\"976\":[\"MN\"],\"977\":[\"NP\"],\"992\":[\"TJ\"],\"993\":[\"TM\"],\"994\":[\"AZ\"],\"995\":[\"GE\"],\"996\":[\"KG\"],\"998\":[\"UZ\"]},\"countries\":{\"AC\":[\"247\",\"00\",\"(?:[01589]\\\\d|[46])\\\\d{4}\",[5,6]],\"AD\":[\"376\",\"00\",\"(?:1|6\\\\d)\\\\d{7}|[135-9]\\\\d{5}\",[6,8,9],[[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"[135-9]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"1\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6\"]]]],\"AE\":[\"971\",\"00\",\"(?:[4-7]\\\\d|9[0-689])\\\\d{7}|800\\\\d{2,9}|[2-4679]\\\\d{7}\",[5,6,7,8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{2,9})\",\"$1 $2\",[\"60|8\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[236]|[479][2-8]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{5})\",\"$1 $2 $3\",[\"[479]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"5\"],\"0$1\"]],\"0\"],\"AF\":[\"93\",\"00\",\"[2-7]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-7]\"],\"0$1\"]],\"0\"],\"AG\":[\"1\",\"011\",\"(?:268|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"([457]\\\\d{6})$|1\",\"268$1\",0,\"268\"],\"AI\":[\"1\",\"011\",\"(?:264|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"([2457]\\\\d{6})$|1\",\"264$1\",0,\"264\"],\"AL\":[\"355\",\"00\",\"(?:700\\\\d\\\\d|900)\\\\d{3}|8\\\\d{5,7}|(?:[2-5]|6\\\\d)\\\\d{7}\",[6,7,8,9],[[\"(\\\\d{3})(\\\\d{3,4})\",\"$1 $2\",[\"80|9\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"4[2-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2358][2-5]|4\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[23578]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"6\"],\"0$1\"]],\"0\"],\"AM\":[\"374\",\"00\",\"(?:[1-489]\\\\d|55|60|77)\\\\d{6}\",[8],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[89]0\"],\"0 $1\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"2|3[12]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"1|47\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[3-9]\"],\"0$1\"]],\"0\"],\"AO\":[\"244\",\"00\",\"[29]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[29]\"]]]],\"AR\":[\"54\",\"00\",\"(?:11|[89]\\\\d\\\\d)\\\\d{8}|[2368]\\\\d{9}\",[10,11],[[\"(\\\\d{4})(\\\\d{2})(\\\\d{4})\",\"$1 $2-$3\",[\"2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9])\",\"2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8]))|2(?:2[24-9]|3[1-59]|47)\",\"2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5[56][46]|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]\",\"2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|58|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|54(?:4|5[13-7]|6[89])|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:454|85[56])[46]|3(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]\"],\"0$1\",1],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2-$3\",[\"1\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[68]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2-$3\",[\"[23]\"],\"0$1\",1],[\"(\\\\d)(\\\\d{4})(\\\\d{2})(\\\\d{4})\",\"$2 15-$3-$4\",[\"9(?:2[2-469]|3[3-578])\",\"9(?:2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9]))\",\"9(?:2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8])))|92(?:2[24-9]|3[1-59]|47)\",\"9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5(?:[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]\",\"9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|5(?:4(?:4|5[13-7]|6[89])|[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]\"],\"0$1\",0,\"$1 $2 $3-$4\"],[\"(\\\\d)(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$2 15-$3-$4\",[\"91\"],\"0$1\",0,\"$1 $2 $3-$4\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{5})\",\"$1-$2-$3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$2 15-$3-$4\",[\"9\"],\"0$1\",0,\"$1 $2 $3-$4\"]],\"0\",0,\"0?(?:(11|2(?:2(?:02?|[13]|2[13-79]|4[1-6]|5[2457]|6[124-8]|7[1-4]|8[13-6]|9[1267])|3(?:02?|1[467]|2[03-6]|3[13-8]|[49][2-6]|5[2-8]|[67])|4(?:7[3-578]|9)|6(?:[0136]|2[24-6]|4[6-8]?|5[15-8])|80|9(?:0[1-3]|[19]|2\\\\d|3[1-6]|4[02568]?|5[2-4]|6[2-46]|72?|8[23]?))|3(?:3(?:2[79]|6|8[2578])|4(?:0[0-24-9]|[12]|3[5-8]?|4[24-7]|5[4-68]?|6[02-9]|7[126]|8[2379]?|9[1-36-8])|5(?:1|2[1245]|3[237]?|4[1-46-9]|6[2-4]|7[1-6]|8[2-5]?)|6[24]|7(?:[069]|1[1568]|2[15]|3[145]|4[13]|5[14-8]|7[2-57]|8[126])|8(?:[01]|2[15-7]|3[2578]?|4[13-6]|5[4-8]?|6[1-357-9]|7[36-8]?|8[5-8]?|9[124])))15)?\",\"9$1\"],\"AS\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|684|900)\\\\d{7}\",[10],0,\"1\",0,\"([267]\\\\d{6})$|1\",\"684$1\",0,\"684\"],\"AT\":[\"43\",\"00\",\"1\\\\d{3,12}|2\\\\d{6,12}|43(?:(?:0\\\\d|5[02-9])\\\\d{3,9}|2\\\\d{4,5}|[3467]\\\\d{4}|8\\\\d{4,6}|9\\\\d{4,7})|5\\\\d{4,12}|8\\\\d{7,12}|9\\\\d{8,12}|(?:[367]\\\\d|4[0-24-9])\\\\d{4,11}\",[4,5,6,7,8,9,10,11,12,13],[[\"(\\\\d)(\\\\d{3,12})\",\"$1 $2\",[\"1(?:11|[2-9])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})\",\"$1 $2\",[\"517\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,5})\",\"$1 $2\",[\"5[079]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,10})\",\"$1 $2\",[\"(?:31|4)6|51|6(?:5[0-3579]|[6-9])|7(?:20|32|8)|[89]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3,9})\",\"$1 $2\",[\"[2-467]|5[2-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"5\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4,7})\",\"$1 $2 $3\",[\"5\"],\"0$1\"]],\"0\"],\"AU\":[\"61\",\"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011\",\"1(?:[0-79]\\\\d{7}(?:\\\\d(?:\\\\d{2})?)?|8[0-24-9]\\\\d{7})|[2-478]\\\\d{8}|1\\\\d{4,7}\",[5,6,7,8,9,10,12],[[\"(\\\\d{2})(\\\\d{3,4})\",\"$1 $2\",[\"16\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,4})\",\"$1 $2 $3\",[\"16\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"14|4\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[2378]\"],\"(0$1)\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1(?:30|[89])\"]]],\"0\",0,\"(183[12])|0\",0,0,0,[[\"(?:(?:2(?:[0-26-9]\\\\d|3[0-8]|4[02-9]|5[0135-9])|3(?:[0-3589]\\\\d|4[0-578]|6[1-9]|7[0-35-9])|7(?:[013-57-9]\\\\d|2[0-8]))\\\\d{3}|8(?:51(?:0(?:0[03-9]|[12479]\\\\d|3[2-9]|5[0-8]|6[1-9]|8[0-7])|1(?:[0235689]\\\\d|1[0-69]|4[0-589]|7[0-47-9])|2(?:0[0-79]|[18][13579]|2[14-9]|3[0-46-9]|[4-6]\\\\d|7[89]|9[0-4]))|(?:6[0-8]|[78]\\\\d)\\\\d{3}|9(?:[02-9]\\\\d{3}|1(?:(?:[0-58]\\\\d|6[0135-9])\\\\d|7(?:0[0-24-9]|[1-9]\\\\d)|9(?:[0-46-9]\\\\d|5[0-79])))))\\\\d{3}\",[9]],[\"4(?:79[01]|83[0-389]|93[0-6])\\\\d{5}|4(?:[0-3]\\\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-8]|8[0-24-9]|9[0-27-9])\\\\d{6}\",[9]],[\"180(?:0\\\\d{3}|2)\\\\d{3}\",[7,10]],[\"190[0-26]\\\\d{6}\",[10]],0,0,0,[\"163\\\\d{2,6}\",[5,6,7,8,9]],[\"14(?:5(?:1[0458]|[23][458])|71\\\\d)\\\\d{4}\",[9]],[\"13(?:00\\\\d{6}(?:\\\\d{2})?|45[0-4]\\\\d{3})|13\\\\d{4}\",[6,8,10,12]]],\"0011\"],\"AW\":[\"297\",\"00\",\"(?:[25-79]\\\\d\\\\d|800)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[25-9]\"]]]],\"AX\":[\"358\",\"00|99(?:[01469]|5(?:[14]1|3[23]|5[59]|77|88|9[09]))\",\"2\\\\d{4,9}|35\\\\d{4,5}|(?:60\\\\d\\\\d|800)\\\\d{4,6}|7\\\\d{5,11}|(?:[14]\\\\d|3[0-46-9]|50)\\\\d{4,8}\",[5,6,7,8,9,10,11,12],0,\"0\",0,0,0,0,\"18\",0,\"00\"],\"AZ\":[\"994\",\"00\",\"365\\\\d{6}|(?:[124579]\\\\d|60|88)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"90\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"1[28]|2|365|46\",\"1[28]|2|365[45]|46\",\"1[28]|2|365(?:4|5[02])|46\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[13-9]\"],\"0$1\"]],\"0\"],\"BA\":[\"387\",\"00\",\"6\\\\d{8}|(?:[35689]\\\\d|49|70)\\\\d{6}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6[1-3]|[7-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2-$3\",[\"[3-5]|6[56]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"6\"],\"0$1\"]],\"0\"],\"BB\":[\"1\",\"011\",\"(?:246|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"([2-9]\\\\d{6})$|1\",\"246$1\",0,\"246\"],\"BD\":[\"880\",\"00\",\"[1-469]\\\\d{9}|8[0-79]\\\\d{7,8}|[2-79]\\\\d{8}|[2-9]\\\\d{7}|[3-9]\\\\d{6}|[57-9]\\\\d{5}\",[6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{4,6})\",\"$1-$2\",[\"31[5-8]|[459]1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,7})\",\"$1-$2\",[\"3(?:[67]|8[013-9])|4(?:6[168]|7|[89][18])|5(?:6[128]|9)|6(?:28|4[14]|5)|7[2-589]|8(?:0[014-9]|[12])|9[358]|(?:3[2-5]|4[235]|5[2-578]|6[0389]|76|8[3-7]|9[24])1|(?:44|66)[01346-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3,6})\",\"$1-$2\",[\"[13-9]|22\"],\"0$1\"],[\"(\\\\d)(\\\\d{7,8})\",\"$1-$2\",[\"2\"],\"0$1\"]],\"0\"],\"BE\":[\"32\",\"00\",\"4\\\\d{8}|[1-9]\\\\d{7}\",[8,9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"(?:80|9)0\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[239]|4[23]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[15-8]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"4\"],\"0$1\"]],\"0\"],\"BF\":[\"226\",\"00\",\"[025-7]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[025-7]\"]]]],\"BG\":[\"359\",\"00\",\"00800\\\\d{7}|[2-7]\\\\d{6,7}|[89]\\\\d{6,8}|2\\\\d{5}\",[6,7,8,9,12],[[\"(\\\\d)(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"43[1-6]|70[1-9]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,3})\",\"$1 $2 $3\",[\"[356]|4[124-7]|7[1-9]|8[1-6]|9[1-7]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"(?:70|8)0\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1 $2 $3\",[\"43[1-7]|7\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[48]|9[08]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"],\"0$1\"]],\"0\"],\"BH\":[\"973\",\"00\",\"[136-9]\\\\d{7}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[13679]|8[047]\"]]]],\"BI\":[\"257\",\"00\",\"(?:[267]\\\\d|31)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2367]\"]]]],\"BJ\":[\"229\",\"00\",\"[24-689]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[24-689]\"]]]],\"BL\":[\"590\",\"00\",\"590\\\\d{6}|(?:69|80|9\\\\d)\\\\d{7}\",[9],0,\"0\",0,0,0,0,0,[[\"590(?:2[7-9]|5[12]|87)\\\\d{4}\"],[\"69(?:0\\\\d\\\\d|1(?:2[2-9]|3[0-5]))\\\\d{4}\"],[\"80[0-5]\\\\d{6}\"],0,0,0,0,0,[\"9(?:(?:395|76[018])\\\\d|475[01])\\\\d{4}\"]]],\"BM\":[\"1\",\"011\",\"(?:441|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"([2-9]\\\\d{6})$|1\",\"441$1\",0,\"441\"],\"BN\":[\"673\",\"00\",\"[2-578]\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-578]\"]]]],\"BO\":[\"591\",\"00(?:1\\\\d)?\",\"(?:[2-467]\\\\d\\\\d|8001)\\\\d{5}\",[8,9],[[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"[23]|4[46]\"]],[\"(\\\\d{8})\",\"$1\",[\"[67]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]]],\"0\",0,\"0(1\\\\d)?\"],\"BQ\":[\"599\",\"00\",\"(?:[34]1|7\\\\d)\\\\d{5}\",[7],0,0,0,0,0,0,\"[347]\"],\"BR\":[\"55\",\"00(?:1[245]|2[1-35]|31|4[13]|[56]5|99)\",\"(?:[1-46-9]\\\\d\\\\d|5(?:[0-46-9]\\\\d|5[0-46-9]))\\\\d{8}|[1-9]\\\\d{9}|[3589]\\\\d{8}|[34]\\\\d{7}\",[8,9,10,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"300|4(?:0[02]|37)\",\"4(?:02|37)0|[34]00\"]],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{4})\",\"$1 $2 $3\",[\"(?:[358]|90)0\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2-$3\",[\"(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])[2-57]\"],\"($1)\"],[\"(\\\\d{2})(\\\\d{5})(\\\\d{4})\",\"$1 $2-$3\",[\"[16][1-9]|[2-57-9]\"],\"($1)\"]],\"0\",0,\"(?:0|90)(?:(1[245]|2[1-35]|31|4[13]|[56]5|99)(\\\\d{10,11}))?\",\"$2\"],\"BS\":[\"1\",\"011\",\"(?:242|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"([3-8]\\\\d{6})$|1\",\"242$1\",0,\"242\"],\"BT\":[\"975\",\"00\",\"[17]\\\\d{7}|[2-8]\\\\d{6}\",[7,8],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-68]|7[246]\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"1[67]|7\"]]]],\"BW\":[\"267\",\"00\",\"(?:0800|(?:[37]|800)\\\\d)\\\\d{6}|(?:[2-6]\\\\d|90)\\\\d{5}\",[7,8,10],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"90\"]],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[24-6]|3[15-79]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[37]\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"0\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]]]],\"BY\":[\"375\",\"810\",\"(?:[12]\\\\d|33|44|902)\\\\d{7}|8(?:0[0-79]\\\\d{5,7}|[1-7]\\\\d{9})|8(?:1[0-489]|[5-79]\\\\d)\\\\d{7}|8[1-79]\\\\d{6,7}|8[0-79]\\\\d{5}|8\\\\d{5}\",[6,7,8,9,10,11],[[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"800\"],\"8 $1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,4})\",\"$1 $2 $3\",[\"800\"],\"8 $1\"],[\"(\\\\d{4})(\\\\d{2})(\\\\d{3})\",\"$1 $2-$3\",[\"1(?:5[169]|6[3-5]|7[179])|2(?:1[35]|2[34]|3[3-5])\",\"1(?:5[169]|6(?:3[1-3]|4|5[125])|7(?:1[3-9]|7[0-24-6]|9[2-7]))|2(?:1[35]|2[34]|3[3-5])\"],\"8 0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"1(?:[56]|7[467])|2[1-3]\"],\"8 0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"[1-4]\"],\"8 0$1\"],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"],\"8 $1\"]],\"8\",0,\"0|80?\",0,0,0,0,\"8~10\"],\"BZ\":[\"501\",\"00\",\"(?:0800\\\\d|[2-8])\\\\d{6}\",[7,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[2-8]\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})(\\\\d{3})\",\"$1-$2-$3-$4\",[\"0\"]]]],\"CA\":[\"1\",\"011\",\"(?:[2-8]\\\\d|90)\\\\d{8}|3\\\\d{6}\",[7,10],0,\"1\",0,0,0,0,0,[[\"(?:2(?:04|[23]6|[48]9|50|63)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|3[178]|50|68|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|73)|90[25])[2-9]\\\\d{6}\",[10]],[\"\",[10]],[\"8(?:00|33|44|55|66|77|88)[2-9]\\\\d{6}\",[10]],[\"900[2-9]\\\\d{6}\",[10]],[\"52(?:3(?:[2-46-9][02-9]\\\\d|5(?:[02-46-9]\\\\d|5[0-46-9]))|4(?:[2-478][02-9]\\\\d|5(?:[034]\\\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\\\d)|9(?:[05-9]\\\\d|2[0-5]|49)))\\\\d{4}|52[34][2-9]1[02-9]\\\\d{4}|(?:5(?:00|2[125-9]|33|44|66|77|88)|622)[2-9]\\\\d{6}\",[10]],0,[\"310\\\\d{4}\",[7]],0,[\"600[2-9]\\\\d{6}\",[10]]]],\"CC\":[\"61\",\"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011\",\"1(?:[0-79]\\\\d{8}(?:\\\\d{2})?|8[0-24-9]\\\\d{7})|[148]\\\\d{8}|1\\\\d{5,7}\",[6,7,8,9,10,12],0,\"0\",0,\"([59]\\\\d{7})$|0\",\"8$1\",0,0,[[\"8(?:51(?:0(?:02|31|60|89)|1(?:18|76)|223)|91(?:0(?:1[0-2]|29)|1(?:[28]2|50|79)|2(?:10|64)|3(?:[06]8|22)|4[29]8|62\\\\d|70[23]|959))\\\\d{3}\",[9]],[\"4(?:79[01]|83[0-389]|93[0-6])\\\\d{5}|4(?:[0-3]\\\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-8]|8[0-24-9]|9[0-27-9])\\\\d{6}\",[9]],[\"180(?:0\\\\d{3}|2)\\\\d{3}\",[7,10]],[\"190[0-26]\\\\d{6}\",[10]],0,0,0,0,[\"14(?:5(?:1[0458]|[23][458])|71\\\\d)\\\\d{4}\",[9]],[\"13(?:00\\\\d{6}(?:\\\\d{2})?|45[0-4]\\\\d{3})|13\\\\d{4}\",[6,8,10,12]]],\"0011\"],\"CD\":[\"243\",\"00\",\"[189]\\\\d{8}|[1-68]\\\\d{6}\",[7,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"88\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"[1-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"]],\"0\"],\"CF\":[\"236\",\"00\",\"(?:[27]\\\\d{3}|8776)\\\\d{4}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[278]\"]]]],\"CG\":[\"242\",\"00\",\"222\\\\d{6}|(?:0\\\\d|80)\\\\d{7}\",[9],[[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[02]\"]]]],\"CH\":[\"41\",\"00\",\"8\\\\d{11}|[2-9]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8[047]|90\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-79]|81\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"8\"],\"0$1\"]],\"0\"],\"CI\":[\"225\",\"00\",\"[02]\\\\d{9}\",[10],[[\"(\\\\d{2})(\\\\d{2})(\\\\d)(\\\\d{5})\",\"$1 $2 $3 $4\",[\"2\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"0\"]]]],\"CK\":[\"682\",\"00\",\"[2-578]\\\\d{4}\",[5],[[\"(\\\\d{2})(\\\\d{3})\",\"$1 $2\",[\"[2-578]\"]]]],\"CL\":[\"56\",\"(?:0|1(?:1[0-69]|2[02-5]|5[13-58]|69|7[0167]|8[018]))0\",\"12300\\\\d{6}|6\\\\d{9,10}|[2-9]\\\\d{8}\",[9,10,11],[[\"(\\\\d{5})(\\\\d{4})\",\"$1 $2\",[\"219\",\"2196\"],\"($1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"44\"]],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2[1-36]\"],\"($1)\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"9[2-9]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"3[2-5]|[47]|5[1-3578]|6[13-57]|8(?:0[1-9]|[1-9])\"],\"($1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"60|8\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"60\"]]]],\"CM\":[\"237\",\"00\",\"[26]\\\\d{8}|88\\\\d{6,7}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"88\"]],[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"[26]|88\"]]]],\"CN\":[\"86\",\"00|1(?:[12]\\\\d|79)\\\\d\\\\d00\",\"1[127]\\\\d{8,9}|2\\\\d{9}(?:\\\\d{2})?|[12]\\\\d{6,7}|86\\\\d{6}|(?:1[03-689]\\\\d|6)\\\\d{7,9}|(?:[3-579]\\\\d|8[0-57-9])\\\\d{6,9}\",[7,8,9,10,11,12],[[\"(\\\\d{2})(\\\\d{5,6})\",\"$1 $2\",[\"(?:10|2[0-57-9])[19]\",\"(?:10|2[0-57-9])(?:10|9[56])\",\"10(?:10|9[56])|2[0-57-9](?:100|9[56])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5,6})\",\"$1 $2\",[\"3(?:[157]|35|49|9[1-68])|4(?:[17]|2[179]|6[47-9]|8[23])|5(?:[1357]|2[37]|4[36]|6[1-46]|80)|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]|4[13]|5[1-5])|(?:4[35]|59|85)[1-9]\",\"(?:3(?:[157]\\\\d|35|49|9[1-68])|4(?:[17]\\\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\\\d|4[13]|5[1-5]))[19]\",\"85[23](?:10|95)|(?:3(?:[157]\\\\d|35|49|9[1-68])|4(?:[17]\\\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\\\d|4[13]|5[1-5]))(?:10|9[56])\",\"85[23](?:100|95)|(?:3(?:[157]\\\\d|35|49|9[1-68])|4(?:[17]\\\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\\\d|4[13]|5[1-5]))(?:100|9[56])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"(?:4|80)0\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"10|2(?:[02-57-9]|1[1-9])\",\"10|2(?:[02-57-9]|1[1-9])\",\"10[0-79]|2(?:[02-57-9]|1[1-79])|(?:10|21)8(?:0[1-9]|[1-9])\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"3(?:[3-59]|7[02-68])|4(?:[26-8]|3[3-9]|5[2-9])|5(?:3[03-9]|[468]|7[028]|9[2-46-9])|6|7(?:[0-247]|3[04-9]|5[0-4689]|6[2368])|8(?:[1-358]|9[1-7])|9(?:[013479]|5[1-5])|(?:[34]1|55|79|87)[02-9]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{7,8})\",\"$1 $2\",[\"9\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"80\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[3-578]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"1[3-9]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"[12]\"],\"0$1\",1]],\"0\",0,\"(1(?:[12]\\\\d|79)\\\\d\\\\d)|0\",0,0,0,0,\"00\"],\"CO\":[\"57\",\"00(?:4(?:[14]4|56)|[579])\",\"(?:60\\\\d\\\\d|9101)\\\\d{6}|(?:1\\\\d|3)\\\\d{9}\",[10,11],[[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"6\"],\"($1)\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"3[0-357]|91\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{7})\",\"$1-$2-$3\",[\"1\"],\"0$1\",0,\"$1 $2 $3\"]],\"0\",0,\"0(4(?:[14]4|56)|[579])?\"],\"CR\":[\"506\",\"00\",\"(?:8\\\\d|90)\\\\d{8}|(?:[24-8]\\\\d{3}|3005)\\\\d{4}\",[8,10],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2-7]|8[3-9]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[89]\"]]],0,0,\"(19(?:0[0-2468]|1[09]|20|66|77|99))\"],\"CU\":[\"53\",\"119\",\"[27]\\\\d{6,7}|[34]\\\\d{5,7}|(?:5|8\\\\d\\\\d)\\\\d{7}\",[6,7,8,10],[[\"(\\\\d{2})(\\\\d{4,6})\",\"$1 $2\",[\"2[1-4]|[34]\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{6,7})\",\"$1 $2\",[\"7\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"5\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"8\"],\"0$1\"]],\"0\"],\"CV\":[\"238\",\"0\",\"(?:[2-59]\\\\d\\\\d|800)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[2-589]\"]]]],\"CW\":[\"599\",\"00\",\"(?:[34]1|60|(?:7|9\\\\d)\\\\d)\\\\d{5}\",[7,8],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[3467]\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"9[4-8]\"]]],0,0,0,0,0,\"[69]\"],\"CX\":[\"61\",\"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011\",\"1(?:[0-79]\\\\d{8}(?:\\\\d{2})?|8[0-24-9]\\\\d{7})|[148]\\\\d{8}|1\\\\d{5,7}\",[6,7,8,9,10,12],0,\"0\",0,\"([59]\\\\d{7})$|0\",\"8$1\",0,0,[[\"8(?:51(?:0(?:01|30|59|88)|1(?:17|46|75)|2(?:22|35))|91(?:00[6-9]|1(?:[28]1|49|78)|2(?:09|63)|3(?:12|26|75)|4(?:56|97)|64\\\\d|7(?:0[01]|1[0-2])|958))\\\\d{3}\",[9]],[\"4(?:79[01]|83[0-389]|93[0-6])\\\\d{5}|4(?:[0-3]\\\\d|4[047-9]|5[0-25-9]|6[016-9]|7[02-8]|8[0-24-9]|9[0-27-9])\\\\d{6}\",[9]],[\"180(?:0\\\\d{3}|2)\\\\d{3}\",[7,10]],[\"190[0-26]\\\\d{6}\",[10]],0,0,0,0,[\"14(?:5(?:1[0458]|[23][458])|71\\\\d)\\\\d{4}\",[9]],[\"13(?:00\\\\d{6}(?:\\\\d{2})?|45[0-4]\\\\d{3})|13\\\\d{4}\",[6,8,10,12]]],\"0011\"],\"CY\":[\"357\",\"00\",\"(?:[279]\\\\d|[58]0)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[257-9]\"]]]],\"CZ\":[\"420\",\"00\",\"(?:[2-578]\\\\d|60)\\\\d{7}|9\\\\d{8,11}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-8]|9[015-7]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"96\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"9\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"9\"]]]],\"DE\":[\"49\",\"00\",\"[2579]\\\\d{5,14}|49(?:[34]0|69|8\\\\d)\\\\d\\\\d?|49(?:37|49|60|7[089]|9\\\\d)\\\\d{1,3}|49(?:2[024-9]|3[2-689]|7[1-7])\\\\d{1,8}|(?:1|[368]\\\\d|4[0-8])\\\\d{3,13}|49(?:[015]\\\\d|2[13]|31|[46][1-8])\\\\d{1,9}\",[4,5,6,7,8,9,10,11,12,13,14,15],[[\"(\\\\d{2})(\\\\d{3,13})\",\"$1 $2\",[\"3[02]|40|[68]9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,12})\",\"$1 $2\",[\"2(?:0[1-389]|1[124]|2[18]|3[14])|3(?:[35-9][15]|4[015])|906|(?:2[4-9]|4[2-9]|[579][1-9]|[68][1-8])1\",\"2(?:0[1-389]|12[0-8])|3(?:[35-9][15]|4[015])|906|2(?:[13][14]|2[18])|(?:2[4-9]|4[2-9]|[579][1-9]|[68][1-8])1\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{2,11})\",\"$1 $2\",[\"[24-6]|3(?:[3569][02-46-9]|4[2-4679]|7[2-467]|8[2-46-8])|70[2-8]|8(?:0[2-9]|[1-8])|90[7-9]|[79][1-9]\",\"[24-6]|3(?:3(?:0[1-467]|2[127-9]|3[124578]|7[1257-9]|8[1256]|9[145])|4(?:2[135]|4[13578]|9[1346])|5(?:0[14]|2[1-3589]|6[1-4]|7[13468]|8[13568])|6(?:2[1-489]|3[124-6]|6[13]|7[12579]|8[1-356]|9[135])|7(?:2[1-7]|4[145]|6[1-5]|7[1-4])|8(?:21|3[1468]|6|7[1467]|8[136])|9(?:0[12479]|2[1358]|4[134679]|6[1-9]|7[136]|8[147]|9[1468]))|70[2-8]|8(?:0[2-9]|[1-8])|90[7-9]|[79][1-9]|3[68]4[1347]|3(?:47|60)[1356]|3(?:3[46]|46|5[49])[1246]|3[4579]3[1357]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"138\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{2,10})\",\"$1 $2\",[\"3\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5,11})\",\"$1 $2\",[\"181\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{4,10})\",\"$1 $2 $3\",[\"1(?:3|80)|9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7,8})\",\"$1 $2\",[\"1[67]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7,12})\",\"$1 $2\",[\"8\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{6})\",\"$1 $2\",[\"185\",\"1850\",\"18500\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{7})\",\"$1 $2\",[\"18[68]\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{6})\",\"$1 $2\",[\"15[0568]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{7})\",\"$1 $2\",[\"15[1279]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{8})\",\"$1 $2\",[\"18\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{7,8})\",\"$1 $2 $3\",[\"1(?:6[023]|7)\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{2})(\\\\d{7})\",\"$1 $2 $3\",[\"15[279]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{8})\",\"$1 $2 $3\",[\"15\"],\"0$1\"]],\"0\"],\"DJ\":[\"253\",\"00\",\"(?:2\\\\d|77)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[27]\"]]]],\"DK\":[\"45\",\"00\",\"[2-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-9]\"]]]],\"DM\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|767|900)\\\\d{7}\",[10],0,\"1\",0,\"([2-7]\\\\d{6})$|1\",\"767$1\",0,\"767\"],\"DO\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,0,0,0,\"8001|8[024]9\"],\"DZ\":[\"213\",\"00\",\"(?:[1-4]|[5-79]\\\\d|80)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[1-4]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[5-8]\"],\"0$1\"]],\"0\"],\"EC\":[\"593\",\"00\",\"1\\\\d{9,10}|(?:[2-7]|9\\\\d)\\\\d{7}\",[8,9,10,11],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2-$3\",[\"[2-7]\"],\"(0$1)\",0,\"$1-$2-$3\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"1\"]]],\"0\"],\"EE\":[\"372\",\"00\",\"8\\\\d{9}|[4578]\\\\d{7}|(?:[3-8]\\\\d|90)\\\\d{5}\",[7,8,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[369]|4[3-8]|5(?:[0-2]|5[0-478]|6[45])|7[1-9]|88\",\"[369]|4[3-8]|5(?:[02]|1(?:[0-8]|95)|5[0-478]|6(?:4[0-4]|5[1-589]))|7[1-9]|88\"]],[\"(\\\\d{4})(\\\\d{3,4})\",\"$1 $2\",[\"[45]|8(?:00|[1-49])\",\"[45]|8(?:00[1-9]|[1-49])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]]]],\"EG\":[\"20\",\"00\",\"[189]\\\\d{8,9}|[24-6]\\\\d{8}|[135]\\\\d{7}\",[8,9,10],[[\"(\\\\d)(\\\\d{7,8})\",\"$1 $2\",[\"[23]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{6,7})\",\"$1 $2\",[\"1[35]|[4-6]|8[2468]|9[235-7]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[189]\"],\"0$1\"]],\"0\"],\"EH\":[\"212\",\"00\",\"[5-8]\\\\d{8}\",[9],0,\"0\",0,0,0,0,\"528[89]\"],\"ER\":[\"291\",\"00\",\"[178]\\\\d{6}\",[7],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[178]\"],\"0$1\"]],\"0\"],\"ES\":[\"34\",\"00\",\"[5-9]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[89]00\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[5-9]\"]]]],\"ET\":[\"251\",\"00\",\"(?:11|[2-579]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-579]\"],\"0$1\"]],\"0\"],\"FI\":[\"358\",\"00|99(?:[01469]|5(?:[14]1|3[23]|5[59]|77|88|9[09]))\",\"[1-35689]\\\\d{4}|7\\\\d{10,11}|(?:[124-7]\\\\d|3[0-46-9])\\\\d{8}|[1-9]\\\\d{5,8}\",[5,6,7,8,9,10,11,12],[[\"(\\\\d)(\\\\d{4,9})\",\"$1 $2\",[\"[2568][1-8]|3(?:0[1-9]|[1-9])|9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3,7})\",\"$1 $2\",[\"[12]00|[368]|70[07-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4,8})\",\"$1 $2\",[\"[1245]|7[135]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{6,10})\",\"$1 $2\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,\"1[03-79]|[2-9]\",0,\"00\"],\"FJ\":[\"679\",\"0(?:0|52)\",\"45\\\\d{5}|(?:0800\\\\d|[235-9])\\\\d{6}\",[7,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[235-9]|45\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"0\"]]],0,0,0,0,0,0,0,\"00\"],\"FK\":[\"500\",\"00\",\"[2-7]\\\\d{4}\",[5]],\"FM\":[\"691\",\"00\",\"(?:[39]\\\\d\\\\d|820)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[389]\"]]]],\"FO\":[\"298\",\"00\",\"[2-9]\\\\d{5}\",[6],[[\"(\\\\d{6})\",\"$1\",[\"[2-9]\"]]],0,0,\"(10(?:01|[12]0|88))\"],\"FR\":[\"33\",\"00\",\"[1-9]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0 $1\"],[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"[1-79]\"],\"0$1\"]],\"0\"],\"GA\":[\"241\",\"00\",\"(?:[067]\\\\d|11)\\\\d{6}|[2-7]\\\\d{6}\",[7,8],[[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-7]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"0\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"11|[67]\"],\"0$1\"]],0,0,\"0(11\\\\d{6}|60\\\\d{6}|61\\\\d{6}|6[256]\\\\d{6}|7[467]\\\\d{6})\",\"$1\"],\"GB\":[\"44\",\"00\",\"[1-357-9]\\\\d{9}|[18]\\\\d{8}|8\\\\d{6}\",[7,9,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"800\",\"8001\",\"80011\",\"800111\",\"8001111\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"845\",\"8454\",\"84546\",\"845464\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"800\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{4,5})\",\"$1 $2\",[\"1(?:38|5[23]|69|76|94)\",\"1(?:(?:38|69)7|5(?:24|39)|768|946)\",\"1(?:3873|5(?:242|39[4-6])|(?:697|768)[347]|9467)\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5,6})\",\"$1 $2\",[\"1(?:[2-69][02-9]|[78])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[25]|7(?:0|6[02-9])\",\"[25]|7(?:0|6(?:[03-9]|2[356]))\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"7\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1389]\"],\"0$1\"]],\"0\",0,0,0,0,0,[[\"(?:1(?:1(?:3(?:[0-58]\\\\d\\\\d|73[0235])|4(?:[0-5]\\\\d\\\\d|69[7-9]|70[0-579])|(?:(?:5[0-26-9]|[78][0-49])\\\\d|6(?:[0-4]\\\\d|50))\\\\d)|2(?:(?:0[024-9]|2[3-9]|3[3-79]|4[1-689]|[58][02-9]|6[0-47-9]|7[013-9]|9\\\\d)\\\\d\\\\d|1(?:[0-7]\\\\d\\\\d|8(?:[02]\\\\d|1[0-246-9])))|(?:3(?:0\\\\d|1[0-8]|[25][02-9]|3[02-579]|[468][0-46-9]|7[1-35-79]|9[2-578])|4(?:0[03-9]|[137]\\\\d|[28][02-57-9]|4[02-69]|5[0-8]|[69][0-79])|5(?:0[1-35-9]|[16]\\\\d|2[024-9]|3[015689]|4[02-9]|5[03-9]|7[0-35-9]|8[0-468]|9[0-57-9])|6(?:0[034689]|1\\\\d|2[0-35689]|[38][013-9]|4[1-467]|5[0-69]|6[13-9]|7[0-8]|9[0-24578])|7(?:0[0246-9]|2\\\\d|3[0236-8]|4[03-9]|5[0-46-9]|6[013-9]|7[0-35-9]|8[024-9]|9[02-9])|8(?:0[35-9]|2[1-57-9]|3[02-578]|4[0-578]|5[124-9]|6[2-69]|7\\\\d|8[02-9]|9[02569])|9(?:0[02-589]|[18]\\\\d|2[02-689]|3[1-57-9]|4[2-9]|5[0-579]|6[2-47-9]|7[0-24578]|9[2-57]))\\\\d\\\\d)|2(?:0[013478]|3[0189]|4[017]|8[0-46-9]|9[0-2])\\\\d{3})\\\\d{4}|1(?:2(?:0(?:46[1-4]|87[2-9])|545[1-79]|76(?:2\\\\d|3[1-8]|6[1-6])|9(?:7(?:2[0-4]|3[2-5])|8(?:2[2-8]|7[0-47-9]|8[3-5])))|3(?:6(?:38[2-5]|47[23])|8(?:47[04-9]|64[0157-9]))|4(?:044[1-7]|20(?:2[23]|8\\\\d)|6(?:0(?:30|5[2-57]|6[1-8]|7[2-8])|140)|8(?:052|87[1-3]))|5(?:2(?:4(?:3[2-79]|6\\\\d)|76\\\\d)|6(?:26[06-9]|686))|6(?:06(?:4\\\\d|7[4-79])|295[5-7]|35[34]\\\\d|47(?:24|61)|59(?:5[08]|6[67]|74)|9(?:55[0-4]|77[23]))|7(?:26(?:6[13-9]|7[0-7])|(?:442|688)\\\\d|50(?:2[0-3]|[3-68]2|76))|8(?:27[56]\\\\d|37(?:5[2-5]|8[239])|843[2-58])|9(?:0(?:0(?:6[1-8]|85)|52\\\\d)|3583|4(?:66[1-8]|9(?:2[01]|81))|63(?:23|3[1-4])|9561))\\\\d{3}\",[9,10]],[\"7(?:457[0-57-9]|700[01]|911[028])\\\\d{5}|7(?:[1-3]\\\\d\\\\d|4(?:[0-46-9]\\\\d|5[0-689])|5(?:0[0-8]|[13-9]\\\\d|2[0-35-9])|7(?:0[1-9]|[1-7]\\\\d|8[02-9]|9[0-689])|8(?:[014-9]\\\\d|[23][0-8])|9(?:[024-9]\\\\d|1[02-9]|3[0-689]))\\\\d{6}\",[10]],[\"80[08]\\\\d{7}|800\\\\d{6}|8001111\"],[\"(?:8(?:4[2-5]|7[0-3])|9(?:[01]\\\\d|8[2-49]))\\\\d{7}|845464\\\\d\",[7,10]],[\"70\\\\d{8}\",[10]],0,[\"(?:3[0347]|55)\\\\d{8}\",[10]],[\"76(?:464|652)\\\\d{5}|76(?:0[0-28]|2[356]|34|4[01347]|5[49]|6[0-369]|77|8[14]|9[139])\\\\d{6}\",[10]],[\"56\\\\d{8}\",[10]]],0,\" x\"],\"GD\":[\"1\",\"011\",\"(?:473|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"([2-9]\\\\d{6})$|1\",\"473$1\",0,\"473\"],\"GE\":[\"995\",\"00\",\"(?:[3-57]\\\\d\\\\d|800)\\\\d{6}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"70\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"32\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[57]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[348]\"],\"0$1\"]],\"0\"],\"GF\":[\"594\",\"00\",\"[56]94\\\\d{6}|(?:80|9\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[56]|9[47]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[89]\"],\"0$1\"]],\"0\"],\"GG\":[\"44\",\"00\",\"(?:1481|[357-9]\\\\d{3})\\\\d{6}|8\\\\d{6}(?:\\\\d{2})?\",[7,9,10],0,\"0\",0,\"([25-9]\\\\d{5})$|0\",\"1481$1\",0,0,[[\"1481[25-9]\\\\d{5}\",[10]],[\"7(?:(?:781|839)\\\\d|911[17])\\\\d{5}\",[10]],[\"80[08]\\\\d{7}|800\\\\d{6}|8001111\"],[\"(?:8(?:4[2-5]|7[0-3])|9(?:[01]\\\\d|8[0-3]))\\\\d{7}|845464\\\\d\",[7,10]],[\"70\\\\d{8}\",[10]],0,[\"(?:3[0347]|55)\\\\d{8}\",[10]],[\"76(?:464|652)\\\\d{5}|76(?:0[0-28]|2[356]|34|4[01347]|5[49]|6[0-369]|77|8[14]|9[139])\\\\d{6}\",[10]],[\"56\\\\d{8}\",[10]]]],\"GH\":[\"233\",\"00\",\"(?:[235]\\\\d{3}|800)\\\\d{5}\",[8,9],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[235]\"],\"0$1\"]],\"0\"],\"GI\":[\"350\",\"00\",\"(?:[25]\\\\d|60)\\\\d{6}\",[8],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"2\"]]]],\"GL\":[\"299\",\"00\",\"(?:19|[2-689]\\\\d|70)\\\\d{4}\",[6],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"19|[2-9]\"]]]],\"GM\":[\"220\",\"00\",\"[2-9]\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-9]\"]]]],\"GN\":[\"224\",\"00\",\"722\\\\d{6}|(?:3|6\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"3\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[67]\"]]]],\"GP\":[\"590\",\"00\",\"590\\\\d{6}|(?:69|80|9\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[569]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\",0,0,0,0,0,[[\"590(?:0[1-68]|[14][0-24-9]|2[0-68]|3[1289]|5[3-579]|[68][0-689]|7[08]|9\\\\d)\\\\d{4}\"],[\"69(?:0\\\\d\\\\d|1(?:2[2-9]|3[0-5]))\\\\d{4}\"],[\"80[0-5]\\\\d{6}\"],0,0,0,0,0,[\"9(?:(?:395|76[018])\\\\d|475[01])\\\\d{4}\"]]],\"GQ\":[\"240\",\"00\",\"222\\\\d{6}|(?:3\\\\d|55|[89]0)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[235]\"]],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"[89]\"]]]],\"GR\":[\"30\",\"00\",\"5005000\\\\d{3}|8\\\\d{9,11}|(?:[269]\\\\d|70)\\\\d{8}\",[10,11,12],[[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"21|7\"]],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"2(?:2|3[2-57-9]|4[2-469]|5[2-59]|6[2-9]|7[2-69]|8[2-49])|5\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2689]\"]],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{5})\",\"$1 $2 $3\",[\"8\"]]]],\"GT\":[\"502\",\"00\",\"(?:1\\\\d{3}|[2-7])\\\\d{7}\",[8,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2-7]\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]]]],\"GU\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|671|900)\\\\d{7}\",[10],0,\"1\",0,\"([3-9]\\\\d{6})$|1\",\"671$1\",0,\"671\"],\"GW\":[\"245\",\"00\",\"[49]\\\\d{8}|4\\\\d{6}\",[7,9],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"40\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[49]\"]]]],\"GY\":[\"592\",\"001\",\"9008\\\\d{3}|(?:[2-467]\\\\d\\\\d|862)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-46-9]\"]]]],\"HK\":[\"852\",\"00(?:30|5[09]|[126-9]?)\",\"8[0-46-9]\\\\d{6,7}|9\\\\d{4,7}|(?:[2-7]|9\\\\d{3})\\\\d{7}\",[5,6,7,8,9,11],[[\"(\\\\d{3})(\\\\d{2,5})\",\"$1 $2\",[\"900\",\"9003\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2-7]|8[1-4]|9(?:0[1-9]|[1-8])\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"9\"]]],0,0,0,0,0,0,0,\"00\"],\"HN\":[\"504\",\"00\",\"8\\\\d{10}|[237-9]\\\\d{7}\",[8,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"[237-9]\"]]]],\"HR\":[\"385\",\"00\",\"(?:[24-69]\\\\d|3[0-79])\\\\d{7}|80\\\\d{5,7}|[1-79]\\\\d{7}|6\\\\d{5,6}\",[6,7,8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"6[01]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[67]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-5]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"],\"0$1\"]],\"0\"],\"HT\":[\"509\",\"00\",\"(?:[2-489]\\\\d|55)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-589]\"]]]],\"HU\":[\"36\",\"00\",\"[235-7]\\\\d{8}|[1-9]\\\\d{7}\",[8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"(06 $1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[27][2-9]|3[2-7]|4[24-9]|5[2-79]|6|8[2-57-9]|9[2-69]\"],\"(06 $1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-9]\"],\"06 $1\"]],\"06\"],\"ID\":[\"62\",\"00[89]\",\"(?:(?:00[1-9]|8\\\\d)\\\\d{4}|[1-36])\\\\d{6}|00\\\\d{10}|[1-9]\\\\d{8,10}|[2-9]\\\\d{7}\",[7,8,9,10,11,12,13],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"15\"]],[\"(\\\\d{2})(\\\\d{5,9})\",\"$1 $2\",[\"2[124]|[36]1\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{5,7})\",\"$1 $2\",[\"800\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5,8})\",\"$1 $2\",[\"[2-79]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{3})\",\"$1-$2-$3\",[\"8[1-35-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6,8})\",\"$1 $2\",[\"1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"804\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"80\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4,5})\",\"$1-$2-$3\",[\"8\"],\"0$1\"]],\"0\"],\"IE\":[\"353\",\"00\",\"(?:1\\\\d|[2569])\\\\d{6,8}|4\\\\d{6,9}|7\\\\d{8}|8\\\\d{8,9}\",[7,8,9,10],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"2[24-9]|47|58|6[237-9]|9[35-9]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[45]0\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2569]|4[1-69]|7[14]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"70\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"81\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[78]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"4\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\"],\"IL\":[\"972\",\"0(?:0|1[2-9])\",\"1\\\\d{6}(?:\\\\d{3,5})?|[57]\\\\d{8}|[1-489]\\\\d{7}\",[7,8,9,10,11,12],[[\"(\\\\d{4})(\\\\d{3})\",\"$1-$2\",[\"125\"]],[\"(\\\\d{4})(\\\\d{2})(\\\\d{2})\",\"$1-$2-$3\",[\"121\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[2-489]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"[57]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1-$2-$3\",[\"12\"]],[\"(\\\\d{4})(\\\\d{6})\",\"$1-$2\",[\"159\"]],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1-$2-$3-$4\",[\"1[7-9]\"]],[\"(\\\\d{3})(\\\\d{1,2})(\\\\d{3})(\\\\d{4})\",\"$1-$2 $3-$4\",[\"15\"]]],\"0\"],\"IM\":[\"44\",\"00\",\"1624\\\\d{6}|(?:[3578]\\\\d|90)\\\\d{8}\",[10],0,\"0\",0,\"([25-8]\\\\d{5})$|0\",\"1624$1\",0,\"74576|(?:16|7[56])24\"],\"IN\":[\"91\",\"00\",\"(?:000800|[2-9]\\\\d\\\\d)\\\\d{7}|1\\\\d{7,12}\",[8,9,10,11,12,13],[[\"(\\\\d{8})\",\"$1\",[\"5(?:0|2[23]|3[03]|[67]1|88)\",\"5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|888)\",\"5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|8888)\"],0,1],[\"(\\\\d{4})(\\\\d{4,5})\",\"$1 $2\",[\"180\",\"1800\"],0,1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"140\"],0,1],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"11|2[02]|33|4[04]|79[1-7]|80[2-46]\",\"11|2[02]|33|4[04]|79(?:[1-6]|7[19])|80(?:[2-4]|6[0-589])\",\"11|2[02]|33|4[04]|79(?:[124-6]|3(?:[02-9]|1[0-24-9])|7(?:1|9[1-6]))|80(?:[2-4]|6[0-589])\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1(?:2[0-249]|3[0-25]|4[145]|[68]|7[1257])|2(?:1[257]|3[013]|4[01]|5[0137]|6[0158]|78|8[1568])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|5[12]|[78]1)|6(?:12|[2-4]1|5[17]|6[13]|80)|7(?:12|3[134]|4[47]|61|88)|8(?:16|2[014]|3[126]|6[136]|7[078]|8[34]|91)|(?:43|59|75)[15]|(?:1[59]|29|67|72)[14]\",\"1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|674|7(?:(?:2[14]|3[34]|5[15])[2-6]|61[346]|88[0-8])|8(?:70[2-6]|84[235-7]|91[3-7])|(?:1(?:29|60|8[06])|261|552|6(?:12|[2-47]1|5[17]|6[13]|80)|7(?:12|31|4[47])|8(?:16|2[014]|3[126]|6[136]|7[78]|83))[2-7]\",\"1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|6(?:12(?:[2-6]|7[0-8])|74[2-7])|7(?:(?:2[14]|5[15])[2-6]|3171|61[346]|88(?:[2-7]|82))|8(?:70[2-6]|84(?:[2356]|7[19])|91(?:[3-6]|7[19]))|73[134][2-6]|(?:74[47]|8(?:16|2[014]|3[126]|6[136]|7[78]|83))(?:[2-6]|7[19])|(?:1(?:29|60|8[06])|261|552|6(?:[2-4]1|5[17]|6[13]|7(?:1|4[0189])|80)|7(?:12|88[01]))[2-7]\"],\"0$1\",1],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2[2457-9]|3[2-5]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1[013-9]|28|3[129]|4[1-35689]|5[29]|6[02-5]|70)|807\",\"1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2(?:[2457]|84|95)|3(?:[2-4]|55)|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1(?:[013-8]|9[6-9])|28[6-8]|3(?:17|2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4|5[0-367])|70[13-7])|807[19]\",\"1(?:[2-479]|5(?:[0236-9]|5[013-9]))|[2-5]|6(?:2(?:84|95)|355|83)|73179|807(?:1|9[1-3])|(?:1552|6(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[124-6])\\\\d|7(?:1(?:[013-8]\\\\d|9[6-9])|28[6-8]|3(?:2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]\\\\d|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\\\d|5[0-367])|70[13-7]))[2-7]\"],\"0$1\",1],[\"(\\\\d{5})(\\\\d{5})\",\"$1 $2\",[\"[6-9]\"],\"0$1\",1],[\"(\\\\d{4})(\\\\d{2,4})(\\\\d{4})\",\"$1 $2 $3\",[\"1(?:6|8[06])\",\"1(?:6|8[06]0)\"],0,1],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"18\"],0,1]],\"0\"],\"IO\":[\"246\",\"00\",\"3\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"3\"]]]],\"IQ\":[\"964\",\"00\",\"(?:1|7\\\\d\\\\d)\\\\d{7}|[2-6]\\\\d{7,8}\",[8,9,10],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-6]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\"],\"IR\":[\"98\",\"00\",\"[1-9]\\\\d{9}|(?:[1-8]\\\\d\\\\d|9)\\\\d{3,4}\",[4,5,6,7,10],[[\"(\\\\d{4,5})\",\"$1\",[\"96\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4,5})\",\"$1 $2\",[\"(?:1[137]|2[13-68]|3[1458]|4[145]|5[1468]|6[16]|7[1467]|8[13467])[12689]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-8]\"],\"0$1\"]],\"0\"],\"IS\":[\"354\",\"00|1(?:0(?:01|[12]0)|100)\",\"(?:38\\\\d|[4-9])\\\\d{6}\",[7,9],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[4-9]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"3\"]]],0,0,0,0,0,0,0,\"00\"],\"IT\":[\"39\",\"00\",\"0\\\\d{5,10}|1\\\\d{8,10}|3(?:[0-8]\\\\d{7,10}|9\\\\d{7,8})|(?:55|70)\\\\d{8}|8\\\\d{5}(?:\\\\d{2,4})?\",[6,7,8,9,10,11],[[\"(\\\\d{2})(\\\\d{4,6})\",\"$1 $2\",[\"0[26]\"]],[\"(\\\\d{3})(\\\\d{3,6})\",\"$1 $2\",[\"0[13-57-9][0159]|8(?:03|4[17]|9[2-5])\",\"0[13-57-9][0159]|8(?:03|4[17]|9(?:2|3[04]|[45][0-4]))\"]],[\"(\\\\d{4})(\\\\d{2,6})\",\"$1 $2\",[\"0(?:[13-579][2-46-8]|8[236-8])\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"894\"]],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"0[26]|5\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"1(?:44|[679])|[378]\"]],[\"(\\\\d{3})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"0[13-57-9][0159]|14\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{5})\",\"$1 $2 $3\",[\"0[26]\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"0\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4,5})\",\"$1 $2 $3\",[\"3\"]]],0,0,0,0,0,0,[[\"0669[0-79]\\\\d{1,6}|0(?:1(?:[0159]\\\\d|[27][1-5]|31|4[1-4]|6[1356]|8[2-57])|2\\\\d\\\\d|3(?:[0159]\\\\d|2[1-4]|3[12]|[48][1-6]|6[2-59]|7[1-7])|4(?:[0159]\\\\d|[23][1-9]|4[245]|6[1-5]|7[1-4]|81)|5(?:[0159]\\\\d|2[1-5]|3[2-6]|4[1-79]|6[4-6]|7[1-578]|8[3-8])|6(?:[0-57-9]\\\\d|6[0-8])|7(?:[0159]\\\\d|2[12]|3[1-7]|4[2-46]|6[13569]|7[13-6]|8[1-59])|8(?:[0159]\\\\d|2[3-578]|3[1-356]|[6-8][1-5])|9(?:[0159]\\\\d|[238][1-5]|4[12]|6[1-8]|7[1-6]))\\\\d{2,7}\"],[\"3[1-9]\\\\d{8}|3[2-9]\\\\d{7}\",[9,10]],[\"80(?:0\\\\d{3}|3)\\\\d{3}\",[6,9]],[\"(?:0878\\\\d{3}|89(?:2\\\\d|3[04]|4(?:[0-4]|[5-9]\\\\d\\\\d)|5[0-4]))\\\\d\\\\d|(?:1(?:44|6[346])|89(?:38|5[5-9]|9))\\\\d{6}\",[6,8,9,10]],[\"1(?:78\\\\d|99)\\\\d{6}\",[9,10]],0,0,0,[\"55\\\\d{8}\",[10]],[\"84(?:[08]\\\\d{3}|[17])\\\\d{3}\",[6,9]]]],\"JE\":[\"44\",\"00\",\"1534\\\\d{6}|(?:[3578]\\\\d|90)\\\\d{8}\",[10],0,\"0\",0,\"([0-24-8]\\\\d{5})$|0\",\"1534$1\",0,0,[[\"1534[0-24-8]\\\\d{5}\"],[\"7(?:(?:(?:50|82)9|937)\\\\d|7(?:00[378]|97[7-9]))\\\\d{5}\"],[\"80(?:07(?:35|81)|8901)\\\\d{4}\"],[\"(?:8(?:4(?:4(?:4(?:05|42|69)|703)|5(?:041|800))|7(?:0002|1206))|90(?:066[59]|1810|71(?:07|55)))\\\\d{4}\"],[\"701511\\\\d{4}\"],0,[\"(?:3(?:0(?:07(?:35|81)|8901)|3\\\\d{4}|4(?:4(?:4(?:05|42|69)|703)|5(?:041|800))|7(?:0002|1206))|55\\\\d{4})\\\\d{4}\"],[\"76(?:464|652)\\\\d{5}|76(?:0[0-28]|2[356]|34|4[01347]|5[49]|6[0-369]|77|8[14]|9[139])\\\\d{6}\"],[\"56\\\\d{8}\"]]],\"JM\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|658|900)\\\\d{7}\",[10],0,\"1\",0,0,0,0,\"658|876\"],\"JO\":[\"962\",\"00\",\"(?:(?:[2689]|7\\\\d)\\\\d|32|53)\\\\d{6}\",[8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2356]|87\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{5,6})\",\"$1 $2\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"70\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\"],\"JP\":[\"81\",\"010\",\"00[1-9]\\\\d{6,14}|[257-9]\\\\d{9}|(?:00|[1-9]\\\\d\\\\d)\\\\d{6}\",[8,9,10,11,12,13,14,15,16,17],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1-$2-$3\",[\"(?:12|57|99)0\"],\"0$1\"],[\"(\\\\d{4})(\\\\d)(\\\\d{4})\",\"$1-$2-$3\",[\"1(?:26|3[79]|4[56]|5[4-68]|6[3-5])|499|5(?:76|97)|746|8(?:3[89]|47|51|63)|9(?:80|9[16])\",\"1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:76|97)9|7468|8(?:3(?:8[7-9]|96)|477|51[2-9]|636)|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]\",\"1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:769|979[2-69])|7468|8(?:3(?:8[7-9]|96[2457-9])|477|51[2-9]|636[457-9])|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"60\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1-$2-$3\",[\"[36]|4(?:2[09]|7[01])\",\"[36]|4(?:2(?:0|9[02-69])|7(?:0[019]|1))\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"1(?:1|5[45]|77|88|9[69])|2(?:2[1-37]|3[0-269]|4[59]|5|6[24]|7[1-358]|8[1369]|9[0-38])|4(?:[28][1-9]|3[0-57]|[45]|6[248]|7[2-579]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-389])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9[2-6])|8(?:2[124589]|3[27-9]|49|51|6|7[0-468]|8[68]|9[019])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9[1-489])\",\"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2(?:[127]|3[014-9])|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9[19])|62|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|8[1-9])|5(?:2|3[045]|4[0-369]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0-2469])|49|51|6(?:[0-24]|36|5[0-3589]|72|9[01459])|7[0-468]|8[68])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9(?:[1289]|3[34]|4[0178]))|(?:49|55|83)[29]|(?:264|837)[016-9]|2(?:57|93)[015-9]|(?:25[0468]|422|838)[01]|(?:47[59]|59[89]|8(?:6[68]|9))[019]\",\"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2[127]|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9(?:17|99))|6(?:2|4[016-9])|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0169])|3(?:[29]|7(?:[017-9]|6[6-8]))|49|51|6(?:[0-24]|36[23]|5(?:[0-389]|5[23])|6(?:[01]|9[178])|72|9[0145])|7[0-468]|8[68])|9(?:4[15]|5[138]|7[156]|8[189]|9(?:[1289]|3(?:31|4[357])|4[0178]))|(?:8294|96)[1-3]|2(?:57|93)[015-9]|(?:223|8699)[014-9]|(?:25[0468]|422|838)[01]|(?:48|8292|9[23])[1-9]|(?:47[59]|59[89]|8(?:68|9))[019]\",\"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2[127]|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|7[015-9]|9(?:17|99))|6(?:2|4[016-9])|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17|3[015-9]))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|9[29])|5(?:2|3[045]|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9(?:[019]|4[1-3]|6(?:[0-47-9]|5[01346-9])))|3(?:[29]|7(?:[017-9]|6[6-8]))|49|51|6(?:[0-24]|36[23]|5(?:[0-389]|5[23])|6(?:[01]|9[178])|72|9[0145])|7[0-468]|8[68])|9(?:4[15]|5[138]|6[1-3]|7[156]|8[189]|9(?:[1289]|3(?:31|4[357])|4[0178]))|(?:223|8699)[014-9]|(?:25[0468]|422|838)[01]|(?:48|829(?:2|66)|9[23])[1-9]|(?:47[59]|59[89]|8(?:68|9))[019]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1-$2-$3\",[\"[14]|[289][2-9]|5[3-9]|7[2-4679]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"800\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1-$2-$3\",[\"[257-9]\"],\"0$1\"]],\"0\"],\"KE\":[\"254\",\"000\",\"(?:[17]\\\\d\\\\d|900)\\\\d{6}|(?:2|80)0\\\\d{6,7}|[4-6]\\\\d{6,8}\",[7,8,9,10],[[\"(\\\\d{2})(\\\\d{5,7})\",\"$1 $2\",[\"[24-6]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"[17]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"]],\"0\"],\"KG\":[\"996\",\"00\",\"8\\\\d{9}|(?:[235-8]\\\\d|99)\\\\d{7}\",[9,10],[[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"3(?:1[346]|[24-79])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[235-79]|88\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d)(\\\\d{2,3})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\"],\"KH\":[\"855\",\"00[14-9]\",\"1\\\\d{9}|[1-9]\\\\d{7,8}\",[8,9,10],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[1-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]]],\"0\"],\"KI\":[\"686\",\"00\",\"(?:[37]\\\\d|6[0-79])\\\\d{6}|(?:[2-48]\\\\d|50)\\\\d{3}\",[5,8],0,\"0\"],\"KM\":[\"269\",\"00\",\"[3478]\\\\d{6}\",[7],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[3478]\"]]]],\"KN\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"([2-7]\\\\d{6})$|1\",\"869$1\",0,\"869\"],\"KP\":[\"850\",\"00|99\",\"85\\\\d{6}|(?:19\\\\d|[2-7])\\\\d{7}\",[8,10],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-7]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"]],\"0\"],\"KR\":[\"82\",\"00(?:[125689]|3(?:[46]5|91)|7(?:00|27|3|55|6[126]))\",\"00[1-9]\\\\d{8,11}|(?:[12]|5\\\\d{3})\\\\d{7}|[13-6]\\\\d{9}|(?:[1-6]\\\\d|80)\\\\d{7}|[3-6]\\\\d{4,5}|(?:00|7)0\\\\d{8}\",[5,6,8,9,10,11,12,13,14],[[\"(\\\\d{2})(\\\\d{3,4})\",\"$1-$2\",[\"(?:3[1-3]|[46][1-4]|5[1-5])1\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"1\"]],[\"(\\\\d)(\\\\d{3,4})(\\\\d{4})\",\"$1-$2-$3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1-$2-$3\",[\"60|8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1-$2-$3\",[\"[1346]|5[1-5]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1-$2-$3\",[\"[57]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5})(\\\\d{4})\",\"$1-$2-$3\",[\"5\"],\"0$1\"]],\"0\",0,\"0(8(?:[1-46-8]|5\\\\d\\\\d))?\"],\"KW\":[\"965\",\"00\",\"18\\\\d{5}|(?:[2569]\\\\d|41)\\\\d{6}\",[7,8],[[\"(\\\\d{4})(\\\\d{3,4})\",\"$1 $2\",[\"[169]|2(?:[235]|4[1-35-9])|52\"]],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[245]\"]]]],\"KY\":[\"1\",\"011\",\"(?:345|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"([2-9]\\\\d{6})$|1\",\"345$1\",0,\"345\"],\"KZ\":[\"7\",\"810\",\"(?:33622|8\\\\d{8})\\\\d{5}|[78]\\\\d{9}\",[10,14],0,\"8\",0,0,0,0,\"33|7\",0,\"8~10\"],\"LA\":[\"856\",\"00\",\"[23]\\\\d{9}|3\\\\d{8}|(?:[235-8]\\\\d|41)\\\\d{6}\",[8,9,10],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2[13]|3[14]|[4-8]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"30[013-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"[23]\"],\"0$1\"]],\"0\"],\"LB\":[\"961\",\"00\",\"[27-9]\\\\d{7}|[13-9]\\\\d{6}\",[7,8],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[13-69]|7(?:[2-57]|62|8[0-7]|9[04-9])|8[02-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[27-9]\"]]],\"0\"],\"LC\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|758|900)\\\\d{7}\",[10],0,\"1\",0,\"([2-8]\\\\d{6})$|1\",\"758$1\",0,\"758\"],\"LI\":[\"423\",\"00\",\"[68]\\\\d{8}|(?:[2378]\\\\d|90)\\\\d{5}\",[7,9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[2379]|8(?:0[09]|7)\",\"[2379]|8(?:0(?:02|9)|7)\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"69\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6\"]]],\"0\",0,\"(1001)|0\"],\"LK\":[\"94\",\"00\",\"[1-9]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[1-689]\"],\"0$1\"]],\"0\"],\"LR\":[\"231\",\"00\",\"(?:[25]\\\\d|33|77|88)\\\\d{7}|(?:2\\\\d|[4-6])\\\\d{6}\",[7,8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[4-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[23578]\"],\"0$1\"]],\"0\"],\"LS\":[\"266\",\"00\",\"(?:[256]\\\\d\\\\d|800)\\\\d{5}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2568]\"]]]],\"LT\":[\"370\",\"00\",\"(?:[3469]\\\\d|52|[78]0)\\\\d{6}\",[8],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"52[0-7]\"],\"(8-$1)\",1],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[7-9]\"],\"8 $1\",1],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"37|4(?:[15]|6[1-8])\"],\"(8-$1)\",1],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[3-6]\"],\"(8-$1)\",1]],\"8\",0,\"[08]\"],\"LU\":[\"352\",\"00\",\"35[013-9]\\\\d{4,8}|6\\\\d{8}|35\\\\d{2,4}|(?:[2457-9]\\\\d|3[0-46-9])\\\\d{2,9}\",[4,5,6,7,8,9,10,11],[[\"(\\\\d{2})(\\\\d{3})\",\"$1 $2\",[\"2(?:0[2-689]|[2-9])|[3-57]|8(?:0[2-9]|[13-9])|9(?:0[89]|[2-579])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"2(?:0[2-689]|[2-9])|[3-57]|8(?:0[2-9]|[13-9])|9(?:0[89]|[2-579])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"20[2-689]\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{1,2})\",\"$1 $2 $3 $4\",[\"2(?:[0367]|4[3-8])\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"80[01]|90[015]\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"20\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{1,2})\",\"$1 $2 $3 $4 $5\",[\"2(?:[0367]|4[3-8])\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{1,5})\",\"$1 $2 $3 $4\",[\"[3-57]|8[13-9]|9(?:0[89]|[2-579])|(?:2|80)[2-9]\"]]],0,0,\"(15(?:0[06]|1[12]|[35]5|4[04]|6[26]|77|88|99)\\\\d)\"],\"LV\":[\"371\",\"00\",\"(?:[268]\\\\d|90)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[269]|8[01]\"]]]],\"LY\":[\"218\",\"00\",\"[2-9]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{7})\",\"$1-$2\",[\"[2-9]\"],\"0$1\"]],\"0\"],\"MA\":[\"212\",\"00\",\"[5-8]\\\\d{8}\",[9],[[\"(\\\\d{5})(\\\\d{4})\",\"$1-$2\",[\"5(?:29|38)\",\"5(?:29[1289]|389)\",\"529(?:1[1-46-9]|2[013-8]|90)|5(?:298|389)[0-46-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"5[45]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5})\",\"$1-$2\",[\"5(?:2[2-489]|3[5-9]|9)|892\",\"5(?:2(?:[2-49]|8[235-9])|3[5-9]|9)|892\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1-$2\",[\"8\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1-$2\",[\"[5-7]\"],\"0$1\"]],\"0\",0,0,0,0,0,[[\"5293[01]\\\\d{4}|5(?:2(?:[0-25-7]\\\\d|3[1-578]|4[02-46-8]|8[0235-7]|9[0-289])|3(?:[0-47]\\\\d|5[02-9]|6[02-8]|8[0189]|9[3-9])|(?:4[067]|5[03])\\\\d)\\\\d{5}\"],[\"(?:6(?:[0-79]\\\\d|8[0-247-9])|7(?:[017]\\\\d|2[0-2]|6[0-8]|8[0-3]))\\\\d{6}\"],[\"80\\\\d{7}\"],[\"89\\\\d{7}\"],0,0,0,0,[\"592(?:4[0-2]|93)\\\\d{4}\"]]],\"MC\":[\"377\",\"00\",\"(?:[3489]|6\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"4\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[389]\"]],[\"(\\\\d)(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4 $5\",[\"6\"],\"0$1\"]],\"0\"],\"MD\":[\"373\",\"00\",\"(?:[235-7]\\\\d|[89]0)\\\\d{6}\",[8],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"22|3\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[25-7]\"],\"0$1\"]],\"0\"],\"ME\":[\"382\",\"00\",\"(?:20|[3-79]\\\\d)\\\\d{6}|80\\\\d{6,7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[2-9]\"],\"0$1\"]],\"0\"],\"MF\":[\"590\",\"00\",\"590\\\\d{6}|(?:69|80|9\\\\d)\\\\d{7}\",[9],0,\"0\",0,0,0,0,0,[[\"590(?:0[079]|[14]3|[27][79]|30|5[0-268]|87)\\\\d{4}\"],[\"69(?:0\\\\d\\\\d|1(?:2[2-9]|3[0-5]))\\\\d{4}\"],[\"80[0-5]\\\\d{6}\"],0,0,0,0,0,[\"9(?:(?:395|76[018])\\\\d|475[01])\\\\d{4}\"]]],\"MG\":[\"261\",\"00\",\"[23]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[23]\"],\"0$1\"]],\"0\",0,\"([24-9]\\\\d{6})$|0\",\"20$1\"],\"MH\":[\"692\",\"011\",\"329\\\\d{4}|(?:[256]\\\\d|45)\\\\d{5}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[2-6]\"]]],\"1\"],\"MK\":[\"389\",\"00\",\"[2-578]\\\\d{7}\",[8],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"2|34[47]|4(?:[37]7|5[47]|64)\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[347]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[58]\"],\"0$1\"]],\"0\"],\"ML\":[\"223\",\"00\",\"[24-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[24-9]\"]]]],\"MM\":[\"95\",\"00\",\"1\\\\d{5,7}|95\\\\d{6}|(?:[4-7]|9[0-46-9])\\\\d{6,8}|(?:2|8\\\\d)\\\\d{5,8}\",[6,7,8,9,10],[[\"(\\\\d)(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"16|2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[45]|6(?:0[23]|[1-689]|7[235-7])|7(?:[0-4]|5[2-7])|8[1-6]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[12]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[4-7]|8[1-35]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4,6})\",\"$1 $2 $3\",[\"9(?:2[0-4]|[35-9]|4[137-9])\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"92\"],\"0$1\"],[\"(\\\\d)(\\\\d{5})(\\\\d{4})\",\"$1 $2 $3\",[\"9\"],\"0$1\"]],\"0\"],\"MN\":[\"976\",\"001\",\"[12]\\\\d{7,9}|[5-9]\\\\d{7}\",[8,9,10],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[12]1\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[5-9]\"]],[\"(\\\\d{3})(\\\\d{5,6})\",\"$1 $2\",[\"[12]2[1-3]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5,6})\",\"$1 $2\",[\"[12](?:27|3[2-8]|4[2-68]|5[1-4689])\",\"[12](?:27|3[2-8]|4[2-68]|5[1-4689])[0-3]\"],\"0$1\"],[\"(\\\\d{5})(\\\\d{4,5})\",\"$1 $2\",[\"[12]\"],\"0$1\"]],\"0\"],\"MO\":[\"853\",\"00\",\"0800\\\\d{3}|(?:28|[68]\\\\d)\\\\d{6}\",[7,8],[[\"(\\\\d{4})(\\\\d{3})\",\"$1 $2\",[\"0\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[268]\"]]]],\"MP\":[\"1\",\"011\",\"[58]\\\\d{9}|(?:67|90)0\\\\d{7}\",[10],0,\"1\",0,\"([2-9]\\\\d{6})$|1\",\"670$1\",0,\"670\"],\"MQ\":[\"596\",\"00\",\"596\\\\d{6}|(?:69|80|9\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[569]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\"],\"MR\":[\"222\",\"00\",\"(?:[2-4]\\\\d\\\\d|800)\\\\d{5}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2-48]\"]]]],\"MS\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|664|900)\\\\d{7}\",[10],0,\"1\",0,\"([34]\\\\d{6})$|1\",\"664$1\",0,\"664\"],\"MT\":[\"356\",\"00\",\"3550\\\\d{4}|(?:[2579]\\\\d\\\\d|800)\\\\d{5}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[2357-9]\"]]]],\"MU\":[\"230\",\"0(?:0|[24-7]0|3[03])\",\"(?:[57]|8\\\\d\\\\d)\\\\d{7}|[2-468]\\\\d{6}\",[7,8,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-46]|8[013]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[57]\"]],[\"(\\\\d{5})(\\\\d{5})\",\"$1 $2\",[\"8\"]]],0,0,0,0,0,0,0,\"020\"],\"MV\":[\"960\",\"0(?:0|19)\",\"(?:800|9[0-57-9]\\\\d)\\\\d{7}|[34679]\\\\d{6}\",[7,10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[34679]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"]]],0,0,0,0,0,0,0,\"00\"],\"MW\":[\"265\",\"00\",\"(?:[1289]\\\\d|31|77)\\\\d{7}|1\\\\d{6}\",[7,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1[2-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[137-9]\"],\"0$1\"]],\"0\"],\"MX\":[\"52\",\"0[09]\",\"1(?:(?:[27]2|44|99)[1-9]|65[0-689])\\\\d{7}|(?:1(?:[01]\\\\d|2[13-9]|[35][1-9]|4[0-35-9]|6[0-46-9]|7[013-9]|8[1-79]|9[1-8])|[2-9]\\\\d)\\\\d{8}\",[10,11],[[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"33|5[56]|81\"],0,1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2-9]\"],0,1],[\"(\\\\d)(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$2 $3 $4\",[\"1(?:33|5[56]|81)\"],0,1],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$2 $3 $4\",[\"1\"],0,1]],\"01\",0,\"0(?:[12]|4[45])|1\",0,0,0,0,\"00\"],\"MY\":[\"60\",\"00\",\"1\\\\d{8,9}|(?:3\\\\d|[4-9])\\\\d{7}\",[8,9,10],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1-$2 $3\",[\"[4-79]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1-$2 $3\",[\"1(?:[02469]|[378][1-9]|53)|8\",\"1(?:[02469]|[37][1-9]|53|8(?:[1-46-9]|5[7-9]))|8\"],\"0$1\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1-$2 $3\",[\"3\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1-$2-$3-$4\",[\"1(?:[367]|80)\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1-$2 $3\",[\"15\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1-$2 $3\",[\"1\"],\"0$1\"]],\"0\"],\"MZ\":[\"258\",\"00\",\"(?:2|8\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2|8[2-79]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"8\"]]]],\"NA\":[\"264\",\"00\",\"[68]\\\\d{7,8}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"88\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"6\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"87\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"],\"0$1\"]],\"0\"],\"NC\":[\"687\",\"00\",\"(?:050|[2-57-9]\\\\d\\\\d)\\\\d{3}\",[6],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1.$2.$3\",[\"[02-57-9]\"]]]],\"NE\":[\"227\",\"00\",\"[027-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"08\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[089]|2[013]|7[04]\"]]]],\"NF\":[\"672\",\"00\",\"[13]\\\\d{5}\",[6],[[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"1[0-3]\"]],[\"(\\\\d)(\\\\d{5})\",\"$1 $2\",[\"[13]\"]]],0,0,\"([0-258]\\\\d{4})$\",\"3$1\"],\"NG\":[\"234\",\"009\",\"(?:[124-7]|9\\\\d{3})\\\\d{6}|[1-9]\\\\d{7}|[78]\\\\d{9,13}\",[7,8,10,11,12,13,14],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"78\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[12]|9(?:0[3-9]|[1-9])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,3})\",\"$1 $2 $3\",[\"[3-7]|8[2-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[7-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4,5})\",\"$1 $2 $3\",[\"[78]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5})(\\\\d{5,6})\",\"$1 $2 $3\",[\"[78]\"],\"0$1\"]],\"0\"],\"NI\":[\"505\",\"00\",\"(?:1800|[25-8]\\\\d{3})\\\\d{4}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[125-8]\"]]]],\"NL\":[\"31\",\"00\",\"(?:[124-7]\\\\d\\\\d|3(?:[02-9]\\\\d|1[0-8]))\\\\d{6}|8\\\\d{6,9}|9\\\\d{6,10}|1\\\\d{4,5}\",[5,6,7,8,9,10,11],[[\"(\\\\d{3})(\\\\d{4,7})\",\"$1 $2\",[\"[89]0\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"66\"],\"0$1\"],[\"(\\\\d)(\\\\d{8})\",\"$1 $2\",[\"6\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1[16-8]|2[259]|3[124]|4[17-9]|5[124679]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-578]|91\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{5})\",\"$1 $2 $3\",[\"9\"],\"0$1\"]],\"0\"],\"NO\":[\"47\",\"00\",\"(?:0|[2-9]\\\\d{3})\\\\d{4}\",[5,8],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"[489]|59\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[235-7]\"]]],0,0,0,0,0,\"[02-689]|7[0-8]\"],\"NP\":[\"977\",\"00\",\"(?:1\\\\d|9)\\\\d{9}|[1-9]\\\\d{7}\",[8,10,11],[[\"(\\\\d)(\\\\d{7})\",\"$1-$2\",[\"1[2-6]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1-$2\",[\"1[01]|[2-8]|9(?:[1-59]|[67][2-6])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1-$2\",[\"9\"]]],\"0\"],\"NR\":[\"674\",\"00\",\"(?:444|(?:55|8\\\\d)\\\\d|666)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[4-68]\"]]]],\"NU\":[\"683\",\"00\",\"(?:[47]|888\\\\d)\\\\d{3}\",[4,7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"8\"]]]],\"NZ\":[\"64\",\"0(?:0|161)\",\"[29]\\\\d{7,9}|50\\\\d{5}(?:\\\\d{2,3})?|6[0-35-9]\\\\d{6}|7\\\\d{7,8}|8\\\\d{4,9}|(?:11\\\\d|[34])\\\\d{7}\",[5,6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{3,8})\",\"$1 $2\",[\"8[1-579]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"50[036-8]|[89]0\",\"50(?:[0367]|88)|[89]0\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"24|[346]|7[2-57-9]|9[2-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2(?:10|74)|[59]|80\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"1|2[028]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,5})\",\"$1 $2 $3\",[\"2(?:[169]|7[0-35-9])|7|86\"],\"0$1\"]],\"0\",0,0,0,0,0,0,\"00\"],\"OM\":[\"968\",\"00\",\"(?:1505|[279]\\\\d{3}|500)\\\\d{4}|800\\\\d{5,6}\",[7,8,9],[[\"(\\\\d{3})(\\\\d{4,6})\",\"$1 $2\",[\"[58]\"]],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"2\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[179]\"]]]],\"PA\":[\"507\",\"00\",\"(?:00800|8\\\\d{3})\\\\d{6}|[68]\\\\d{7}|[1-57-9]\\\\d{6}\",[7,8,10,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[1-57-9]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1-$2\",[\"[68]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]]]],\"PE\":[\"51\",\"00|19(?:1[124]|77|90)00\",\"(?:[14-8]|9\\\\d)\\\\d{7}\",[8,9],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"80\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"1\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[4-8]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"]]],\"0\",0,0,0,0,0,0,\"00\",\" Anexo \"],\"PF\":[\"689\",\"00\",\"4\\\\d{5}(?:\\\\d{2})?|8\\\\d{7,8}\",[6,8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"44\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"4|8[7-9]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"]]]],\"PG\":[\"675\",\"00|140[1-3]\",\"(?:180|[78]\\\\d{3})\\\\d{4}|(?:[2-589]\\\\d|64)\\\\d{5}\",[7,8],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"18|[2-69]|85\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[78]\"]]],0,0,0,0,0,0,0,\"00\"],\"PH\":[\"63\",\"00\",\"(?:[2-7]|9\\\\d)\\\\d{8}|2\\\\d{5}|(?:1800|8)\\\\d{7,9}\",[6,8,9,10,11,12,13],[[\"(\\\\d)(\\\\d{5})\",\"$1 $2\",[\"2\"],\"(0$1)\"],[\"(\\\\d{4})(\\\\d{4,6})\",\"$1 $2\",[\"3(?:23|39|46)|4(?:2[3-6]|[35]9|4[26]|76)|544|88[245]|(?:52|64|86)2\",\"3(?:230|397|461)|4(?:2(?:35|[46]4|51)|396|4(?:22|63)|59[347]|76[15])|5(?:221|446)|642[23]|8(?:622|8(?:[24]2|5[13]))\"],\"(0$1)\"],[\"(\\\\d{5})(\\\\d{4})\",\"$1 $2\",[\"346|4(?:27|9[35])|883\",\"3469|4(?:279|9(?:30|56))|8834\"],\"(0$1)\"],[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[3-7]|8[2-8]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]],[\"(\\\\d{4})(\\\\d{1,2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"1\"]]],\"0\"],\"PK\":[\"92\",\"00\",\"122\\\\d{6}|[24-8]\\\\d{10,11}|9(?:[013-9]\\\\d{8,10}|2(?:[01]\\\\d\\\\d|2(?:[06-8]\\\\d|1[01]))\\\\d{7})|(?:[2-8]\\\\d{3}|92(?:[0-7]\\\\d|8[1-9]))\\\\d{6}|[24-9]\\\\d{8}|[89]\\\\d{7}\",[8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{2,7})\",\"$1 $2 $3\",[\"[89]0\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"1\"]],[\"(\\\\d{3})(\\\\d{6,7})\",\"$1 $2\",[\"2(?:3[2358]|4[2-4]|9[2-8])|45[3479]|54[2-467]|60[468]|72[236]|8(?:2[2-689]|3[23578]|4[3478]|5[2356])|9(?:2[2-8]|3[27-9]|4[2-6]|6[3569]|9[25-8])\",\"9(?:2[3-8]|98)|(?:2(?:3[2358]|4[2-4]|9[2-8])|45[3479]|54[2-467]|60[468]|72[236]|8(?:2[2-689]|3[23578]|4[3478]|5[2356])|9(?:22|3[27-9]|4[2-6]|6[3569]|9[25-7]))[2-9]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{7,8})\",\"$1 $2\",[\"(?:2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91)[2-9]\"],\"(0$1)\"],[\"(\\\\d{5})(\\\\d{5})\",\"$1 $2\",[\"58\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{7})\",\"$1 $2\",[\"3\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"[24-9]\"],\"(0$1)\"]],\"0\"],\"PL\":[\"48\",\"00\",\"(?:6|8\\\\d\\\\d)\\\\d{7}|[1-9]\\\\d{6}(?:\\\\d{2})?|[26]\\\\d{5}\",[6,7,8,9,10],[[\"(\\\\d{5})\",\"$1\",[\"19\"]],[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"11|20|64\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1 $2 $3\",[\"(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])1\",\"(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])19\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"64\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"21|39|45|5[0137]|6[0469]|7[02389]|8(?:0[14]|8)\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"1[2-8]|[2-7]|8[1-79]|9[145]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"8\"]]]],\"PM\":[\"508\",\"00\",\"[45]\\\\d{5}|(?:708|80\\\\d)\\\\d{6}\",[6,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[45]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"7\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"],\"0$1\"]],\"0\"],\"PR\":[\"1\",\"011\",\"(?:[589]\\\\d\\\\d|787)\\\\d{7}\",[10],0,\"1\",0,0,0,0,\"787|939\"],\"PS\":[\"970\",\"00\",\"[2489]2\\\\d{6}|(?:1\\\\d|5)\\\\d{8}\",[8,9,10],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[2489]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"5\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]]],\"0\"],\"PT\":[\"351\",\"00\",\"1693\\\\d{5}|(?:[26-9]\\\\d|30)\\\\d{7}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"2[12]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"16|[236-9]\"]]]],\"PW\":[\"680\",\"01[12]\",\"(?:[24-8]\\\\d\\\\d|345|900)\\\\d{4}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-9]\"]]]],\"PY\":[\"595\",\"00\",\"59\\\\d{4,6}|9\\\\d{5,10}|(?:[2-46-8]\\\\d|5[0-8])\\\\d{4,7}\",[6,7,8,9,10,11],[[\"(\\\\d{3})(\\\\d{3,6})\",\"$1 $2\",[\"[2-9]0\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"[26]1|3[289]|4[1246-8]|7[1-3]|8[1-36]\"],\"(0$1)\"],[\"(\\\\d{3})(\\\\d{4,5})\",\"$1 $2\",[\"2[279]|3[13-5]|4[359]|5|6(?:[34]|7[1-46-8])|7[46-8]|85\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2[14-68]|3[26-9]|4[1246-8]|6(?:1|75)|7[1-35]|8[1-36]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"87\"]],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"9(?:[5-79]|8[1-6])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-8]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"9\"]]],\"0\"],\"QA\":[\"974\",\"00\",\"800\\\\d{4}|(?:2|800)\\\\d{6}|(?:0080|[3-7])\\\\d{7}\",[7,8,9,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"2[16]|8\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[3-7]\"]]]],\"RE\":[\"262\",\"00\",\"(?:26|[689]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2689]\"],\"0$1\"]],\"0\",0,0,0,0,0,[[\"26(?:2\\\\d\\\\d|3(?:0\\\\d|1[0-3]))\\\\d{4}\"],[\"(?:69(?:2\\\\d\\\\d|3(?:0[0-46]|1[013]|2[0-2]|3[0-39]|4\\\\d|5[0-5]|6[0-6]|7[0-27]|8[0-8]|9[0-479]))|9(?:399[0-2]|4790|76(?:2[27]|3[0-37]|9\\\\d)))\\\\d{4}\"],[\"80\\\\d{7}\"],[\"89[1-37-9]\\\\d{6}\"],0,0,0,0,0,[\"8(?:1[019]|2[0156]|84|90)\\\\d{6}\"]]],\"RO\":[\"40\",\"00\",\"(?:[2378]\\\\d|90)\\\\d{7}|[23]\\\\d{5}\",[6,9],[[\"(\\\\d{3})(\\\\d{3})\",\"$1 $2\",[\"2[3-6]\",\"2[3-6]\\\\d9\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"219|31\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[23]1\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[237-9]\"],\"0$1\"]],\"0\",0,0,0,0,0,0,0,\" int \"],\"RS\":[\"381\",\"00\",\"38[02-9]\\\\d{6,9}|6\\\\d{7,9}|90\\\\d{4,8}|38\\\\d{5,6}|(?:7\\\\d\\\\d|800)\\\\d{3,9}|(?:[12]\\\\d|3[0-79])\\\\d{5,10}\",[6,7,8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{3,9})\",\"$1 $2\",[\"(?:2[389]|39)0|[7-9]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{5,10})\",\"$1 $2\",[\"[1-36]\"],\"0$1\"]],\"0\"],\"RU\":[\"7\",\"810\",\"8\\\\d{13}|[347-9]\\\\d{9}\",[10,14],[[\"(\\\\d{4})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"7(?:1[0-8]|2[1-9])\",\"7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:1[23]|[2-9]2))\",\"7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:13[03-69]|62[013-9]))|72[1-57-9]2\"],\"8 ($1)\",1],[\"(\\\\d{5})(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"7(?:1[0-68]|2[1-9])\",\"7(?:1(?:[06][3-6]|[18]|2[35]|[3-5][3-5])|2(?:[13][3-5]|[24-689]|7[457]))\",\"7(?:1(?:0(?:[356]|4[023])|[18]|2(?:3[013-9]|5)|3[45]|43[013-79]|5(?:3[1-8]|4[1-7]|5)|6(?:3[0-35-9]|[4-6]))|2(?:1(?:3[178]|[45])|[24-689]|3[35]|7[457]))|7(?:14|23)4[0-8]|71(?:33|45)[1-79]\"],\"8 ($1)\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"8 ($1)\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"[349]|8(?:[02-7]|1[1-8])\"],\"8 ($1)\",1],[\"(\\\\d{4})(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"8\"],\"8 ($1)\"]],\"8\",0,0,0,0,\"3[04-689]|[489]\",0,\"8~10\"],\"RW\":[\"250\",\"00\",\"(?:06|[27]\\\\d\\\\d|[89]00)\\\\d{6}\",[8,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"0\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[7-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"]]],\"0\"],\"SA\":[\"966\",\"00\",\"92\\\\d{7}|(?:[15]|8\\\\d)\\\\d{8}\",[9,10],[[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"9\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"5\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"81\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]]],\"0\"],\"SB\":[\"677\",\"0[01]\",\"(?:[1-6]|[7-9]\\\\d\\\\d)\\\\d{4}\",[5,7],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"7|8[4-9]|9(?:[1-8]|9[0-8])\"]]]],\"SC\":[\"248\",\"010|0[0-2]\",\"800\\\\d{4}|(?:[249]\\\\d|64)\\\\d{5}\",[7],[[\"(\\\\d)(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[246]|9[57]\"]]],0,0,0,0,0,0,0,\"00\"],\"SD\":[\"249\",\"00\",\"[19]\\\\d{8}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[19]\"],\"0$1\"]],\"0\"],\"SE\":[\"46\",\"00\",\"(?:[26]\\\\d\\\\d|9)\\\\d{9}|[1-9]\\\\d{8}|[1-689]\\\\d{7}|[1-4689]\\\\d{6}|2\\\\d{5}\",[6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{2,3})(\\\\d{2})\",\"$1-$2 $3\",[\"20\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"9(?:00|39|44|9)\"],\"0$1\",0,\"$1 $2\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})\",\"$1-$2 $3\",[\"[12][136]|3[356]|4[0246]|6[03]|90[1-9]\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d)(\\\\d{2,3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"8\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{2})\",\"$1-$2 $3\",[\"1[2457]|2(?:[247-9]|5[0138])|3[0247-9]|4[1357-9]|5[0-35-9]|6(?:[125689]|4[02-57]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{3})(\\\\d{2,3})(\\\\d{3})\",\"$1-$2 $3\",[\"9(?:00|39|44)\"],\"0$1\",0,\"$1 $2 $3\"],[\"(\\\\d{2})(\\\\d{2,3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"1[13689]|2[0136]|3[1356]|4[0246]|54|6[03]|90[1-9]\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"10|7\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"8\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4\",[\"[13-5]|2(?:[247-9]|5[0138])|6(?:[124-689]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{3})\",\"$1-$2 $3 $4\",[\"9\"],\"0$1\",0,\"$1 $2 $3 $4\"],[\"(\\\\d{3})(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1-$2 $3 $4 $5\",[\"[26]\"],\"0$1\",0,\"$1 $2 $3 $4 $5\"]],\"0\"],\"SG\":[\"65\",\"0[0-3]\\\\d\",\"(?:(?:1\\\\d|8)\\\\d\\\\d|7000)\\\\d{7}|[3689]\\\\d{7}\",[8,10,11],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[369]|8(?:0[1-6]|[1-9])\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"]],[\"(\\\\d{4})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"7\"]],[\"(\\\\d{4})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"1\"]]]],\"SH\":[\"290\",\"00\",\"(?:[256]\\\\d|8)\\\\d{3}\",[4,5],0,0,0,0,0,0,\"[256]\"],\"SI\":[\"386\",\"00|10(?:22|66|88|99)\",\"[1-7]\\\\d{7}|8\\\\d{4,7}|90\\\\d{4,6}\",[5,6,7,8],[[\"(\\\\d{2})(\\\\d{3,6})\",\"$1 $2\",[\"8[09]|9\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"59|8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[37][01]|4[0139]|51|6\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[1-57]\"],\"(0$1)\"]],\"0\",0,0,0,0,0,0,\"00\"],\"SJ\":[\"47\",\"00\",\"0\\\\d{4}|(?:[489]\\\\d|[57]9)\\\\d{6}\",[5,8],0,0,0,0,0,0,\"79\"],\"SK\":[\"421\",\"00\",\"[2-689]\\\\d{8}|[2-59]\\\\d{6}|[2-5]\\\\d{5}\",[6,7,9],[[\"(\\\\d)(\\\\d{2})(\\\\d{3,4})\",\"$1 $2 $3\",[\"21\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{2})(\\\\d{2,3})\",\"$1 $2 $3\",[\"[3-5][1-8]1\",\"[3-5][1-8]1[67]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{3})(\\\\d{2})\",\"$1/$2 $3 $4\",[\"2\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[689]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1/$2 $3 $4\",[\"[3-5]\"],\"0$1\"]],\"0\"],\"SL\":[\"232\",\"00\",\"(?:[237-9]\\\\d|66)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"[236-9]\"],\"(0$1)\"]],\"0\"],\"SM\":[\"378\",\"00\",\"(?:0549|[5-7]\\\\d)\\\\d{6}\",[8,10],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[5-7]\"]],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"0\"]]],0,0,\"([89]\\\\d{5})$\",\"0549$1\"],\"SN\":[\"221\",\"00\",\"(?:[378]\\\\d|93)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[379]\"]]]],\"SO\":[\"252\",\"00\",\"[346-9]\\\\d{8}|[12679]\\\\d{7}|[1-5]\\\\d{6}|[1348]\\\\d{5}\",[6,7,8,9],[[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"8[125]\"]],[\"(\\\\d{6})\",\"$1\",[\"[134]\"]],[\"(\\\\d)(\\\\d{6})\",\"$1 $2\",[\"[15]|2[0-79]|3[0-46-8]|4[0-7]\"]],[\"(\\\\d)(\\\\d{7})\",\"$1 $2\",[\"(?:2|90)4|[67]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[3478]|64|90\"]],[\"(\\\\d{2})(\\\\d{5,7})\",\"$1 $2\",[\"1|28|6(?:0[5-7]|[1-35-9])|9[2-9]\"]]],\"0\"],\"SR\":[\"597\",\"00\",\"(?:[2-5]|68|[78]\\\\d)\\\\d{5}\",[6,7],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1-$2-$3\",[\"56\"]],[\"(\\\\d{3})(\\\\d{3})\",\"$1-$2\",[\"[2-5]\"]],[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"[6-8]\"]]]],\"SS\":[\"211\",\"00\",\"[19]\\\\d{8}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[19]\"],\"0$1\"]],\"0\"],\"ST\":[\"239\",\"00\",\"(?:22|9\\\\d)\\\\d{5}\",[7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[29]\"]]]],\"SV\":[\"503\",\"00\",\"[267]\\\\d{7}|[89]00\\\\d{4}(?:\\\\d{4})?\",[7,8,11],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[89]\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[267]\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"]]]],\"SX\":[\"1\",\"011\",\"7215\\\\d{6}|(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"(5\\\\d{6})$|1\",\"721$1\",0,\"721\"],\"SY\":[\"963\",\"00\",\"[1-39]\\\\d{8}|[1-5]\\\\d{7}\",[8,9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[1-5]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"],\"0$1\",1]],\"0\"],\"SZ\":[\"268\",\"00\",\"0800\\\\d{4}|(?:[237]\\\\d|900)\\\\d{6}\",[8,9],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[0237]\"]],[\"(\\\\d{5})(\\\\d{4})\",\"$1 $2\",[\"9\"]]]],\"TA\":[\"290\",\"00\",\"8\\\\d{3}\",[4],0,0,0,0,0,0,\"8\"],\"TC\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|649|900)\\\\d{7}\",[10],0,\"1\",0,\"([2-479]\\\\d{6})$|1\",\"649$1\",0,\"649\"],\"TD\":[\"235\",\"00|16\",\"(?:22|[69]\\\\d|77)\\\\d{6}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[2679]\"]]],0,0,0,0,0,0,0,\"00\"],\"TG\":[\"228\",\"00\",\"[279]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[279]\"]]]],\"TH\":[\"66\",\"00[1-9]\",\"(?:001800|[2-57]|[689]\\\\d)\\\\d{7}|1\\\\d{7,9}\",[8,9,10,13],[[\"(\\\\d)(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"2\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[13-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"1\"]]],\"0\"],\"TJ\":[\"992\",\"810\",\"(?:00|[1-57-9]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{6})(\\\\d)(\\\\d{2})\",\"$1 $2 $3\",[\"331\",\"3317\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[34]7|91[78]\"]],[\"(\\\\d{4})(\\\\d)(\\\\d{4})\",\"$1 $2 $3\",[\"3[1-5]\"]],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[0-57-9]\"]]],0,0,0,0,0,0,0,\"8~10\"],\"TK\":[\"690\",\"00\",\"[2-47]\\\\d{3,6}\",[4,5,6,7]],\"TL\":[\"670\",\"00\",\"7\\\\d{7}|(?:[2-47]\\\\d|[89]0)\\\\d{5}\",[7,8],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[2-489]|70\"]],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"7\"]]]],\"TM\":[\"993\",\"810\",\"[1-6]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"12\"],\"(8 $1)\"],[\"(\\\\d{3})(\\\\d)(\\\\d{2})(\\\\d{2})\",\"$1 $2-$3-$4\",[\"[1-5]\"],\"(8 $1)\"],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"6\"],\"8 $1\"]],\"8\",0,0,0,0,0,0,\"8~10\"],\"TN\":[\"216\",\"00\",\"[2-57-9]\\\\d{7}\",[8],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-57-9]\"]]]],\"TO\":[\"676\",\"00\",\"(?:0800|(?:[5-8]\\\\d\\\\d|999)\\\\d)\\\\d{3}|[2-8]\\\\d{4}\",[5,7],[[\"(\\\\d{2})(\\\\d{3})\",\"$1-$2\",[\"[2-4]|50|6[09]|7[0-24-69]|8[05]\"]],[\"(\\\\d{4})(\\\\d{3})\",\"$1 $2\",[\"0\"]],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[5-9]\"]]]],\"TR\":[\"90\",\"00\",\"4\\\\d{6}|8\\\\d{11,12}|(?:[2-58]\\\\d\\\\d|900)\\\\d{7}\",[7,10,12,13],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"512|8[01589]|90\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"5(?:[0-59]|61)\",\"5(?:[0-59]|616)\",\"5(?:[0-59]|6161)\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[24][1-8]|3[1-9]\"],\"(0$1)\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{6,7})\",\"$1 $2 $3\",[\"80\"],\"0$1\",1]],\"0\"],\"TT\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"([2-46-8]\\\\d{6})$|1\",\"868$1\",0,\"868\"],\"TV\":[\"688\",\"00\",\"(?:2|7\\\\d\\\\d|90)\\\\d{4}\",[5,6,7],[[\"(\\\\d{2})(\\\\d{3})\",\"$1 $2\",[\"2\"]],[\"(\\\\d{2})(\\\\d{4})\",\"$1 $2\",[\"90\"]],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"7\"]]]],\"TW\":[\"886\",\"0(?:0[25-79]|19)\",\"[2-689]\\\\d{8}|7\\\\d{9,10}|[2-8]\\\\d{7}|2\\\\d{6}\",[7,8,9,10,11],[[\"(\\\\d{2})(\\\\d)(\\\\d{4})\",\"$1 $2 $3\",[\"202\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[258]0\"],\"0$1\"],[\"(\\\\d)(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"[23568]|4(?:0[02-48]|[1-47-9])|7[1-9]\",\"[23568]|4(?:0[2-48]|[1-47-9])|(?:400|7)[1-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[49]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4,5})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\",0,0,0,0,0,0,0,\"#\"],\"TZ\":[\"255\",\"00[056]\",\"(?:[25-8]\\\\d|41|90)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[24]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"5\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[67]\"],\"0$1\"]],\"0\"],\"UA\":[\"380\",\"00\",\"[89]\\\\d{9}|[3-9]\\\\d{8}\",[9,10],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"6[12][29]|(?:3[1-8]|4[136-8]|5[12457]|6[49])2|(?:56|65)[24]\",\"6[12][29]|(?:35|4[1378]|5[12457]|6[49])2|(?:56|65)[24]|(?:3[1-46-8]|46)2[013-9]\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"3[1-8]|4(?:[1367]|[45][6-9]|8[4-6])|5(?:[1-5]|6[0135689]|7[4-6])|6(?:[12][3-7]|[459])\",\"3[1-8]|4(?:[1367]|[45][6-9]|8[4-6])|5(?:[1-5]|6(?:[015689]|3[02389])|7[4-6])|6(?:[12][3-7]|[459])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[3-7]|89|9[1-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[89]\"],\"0$1\"]],\"0\",0,0,0,0,0,0,\"0~0\"],\"UG\":[\"256\",\"00[057]\",\"800\\\\d{6}|(?:[29]0|[347]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{4})(\\\\d{5})\",\"$1 $2\",[\"202\",\"2024\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{6})\",\"$1 $2\",[\"[27-9]|4(?:6[45]|[7-9])\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"[34]\"],\"0$1\"]],\"0\"],\"US\":[\"1\",\"011\",\"[2-9]\\\\d{9}|3\\\\d{6}\",[10],[[\"(\\\\d{3})(\\\\d{4})\",\"$1-$2\",[\"310\"],0,1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"($1) $2-$3\",[\"[2-9]\"],0,1,\"$1-$2-$3\"]],\"1\",0,0,0,0,0,[[\"(?:47220[01]|5(?:05(?:[2-57-9]\\\\d\\\\d|6(?:[0-35-9]\\\\d|4[46]))|57200))\\\\d{4}|(?:2(?:0[1-35-9]|1[02-9]|2[03-589]|3[149]|4[08]|5[1-46]|6[0279]|7[0269]|8[13])|3(?:0[1-57-9]|1[02-9]|2[01356]|3[0-24679]|4[167]|5[0-2]|6[014]|8[056])|4(?:0[124-9]|1[02-579]|2[3-5]|3[0245]|4[023578]|58|6[349]|7[0589]|8[04])|5(?:0[1-47-9]|1[0235-8]|20|3[0149]|4[01]|5[19]|6[1-47]|7[0-5]|8[0256])|6(?:0[1-35-9]|1[024-9]|2[03689]|[34][016]|5[01679]|6[0-279]|78|8[0-29])|7(?:0[1-46-8]|1[2-9]|2[04-7]|3[1247]|4[037]|5[47]|6[02359]|7[0-59]|8[156])|8(?:0[1-68]|1[02-8]|2[068]|3[0-2589]|4[03578]|5[046-9]|6[02-5]|7[028])|9(?:0[1346-9]|1[02-9]|2[0589]|3[0146-8]|4[01357-9]|5[12469]|7[0-389]|8[04-69]))[2-9]\\\\d{6}\"],[\"\"],[\"8(?:00|33|44|55|66|77|88)[2-9]\\\\d{6}\"],[\"900[2-9]\\\\d{6}\"],[\"52(?:3(?:[2-46-9][02-9]\\\\d|5(?:[02-46-9]\\\\d|5[0-46-9]))|4(?:[2-478][02-9]\\\\d|5(?:[034]\\\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\\\d)|9(?:[05-9]\\\\d|2[0-5]|49)))\\\\d{4}|52[34][2-9]1[02-9]\\\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\\\d{6}\"]]],\"UY\":[\"598\",\"0(?:0|1[3-9]\\\\d)\",\"(?:0004|4)\\\\d{9}|[1249]\\\\d{7}|(?:[49]\\\\d|80)\\\\d{5}\",[7,8,10,13],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"405|8|90\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"9\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[124]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"4\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3 $4\",[\"0\"]]],\"0\",0,0,0,0,0,0,\"00\",\" int. \"],\"UZ\":[\"998\",\"810\",\"(?:33|[5-79]\\\\d|88)\\\\d{7}\",[9],[[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[35-9]\"],\"8 $1\"]],\"8\",0,0,0,0,0,0,\"8~10\"],\"VA\":[\"39\",\"00\",\"0\\\\d{5,10}|3[0-8]\\\\d{7,10}|55\\\\d{8}|8\\\\d{5}(?:\\\\d{2,4})?|(?:1\\\\d|39)\\\\d{7,8}\",[6,7,8,9,10,11],0,0,0,0,0,0,\"06698\"],\"VC\":[\"1\",\"011\",\"(?:[58]\\\\d\\\\d|784|900)\\\\d{7}\",[10],0,\"1\",0,\"([2-7]\\\\d{6})$|1\",\"784$1\",0,\"784\"],\"VE\":[\"58\",\"00\",\"[68]00\\\\d{7}|(?:[24]\\\\d|[59]0)\\\\d{8}\",[10],[[\"(\\\\d{3})(\\\\d{7})\",\"$1-$2\",[\"[24-689]\"],\"0$1\"]],\"0\"],\"VG\":[\"1\",\"011\",\"(?:284|[58]\\\\d\\\\d|900)\\\\d{7}\",[10],0,\"1\",0,\"([2-578]\\\\d{6})$|1\",\"284$1\",0,\"284\"],\"VI\":[\"1\",\"011\",\"[58]\\\\d{9}|(?:34|90)0\\\\d{7}\",[10],0,\"1\",0,\"([2-9]\\\\d{6})$|1\",\"340$1\",0,\"340\"],\"VN\":[\"84\",\"00\",\"[12]\\\\d{9}|[135-9]\\\\d{8}|[16]\\\\d{7}|[16-8]\\\\d{6}\",[7,8,9,10],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"80\"],\"0$1\",1],[\"(\\\\d{4})(\\\\d{4,6})\",\"$1 $2\",[\"1\"],0,1],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"[69]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[3578]\"],\"0$1\",1],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"2[48]\"],\"0$1\",1],[\"(\\\\d{3})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"2\"],\"0$1\",1]],\"0\"],\"VU\":[\"678\",\"00\",\"[57-9]\\\\d{6}|(?:[238]\\\\d|48)\\\\d{3}\",[5,7],[[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"[57-9]\"]]]],\"WF\":[\"681\",\"00\",\"(?:40|72)\\\\d{4}|8\\\\d{5}(?:\\\\d{3})?\",[6,9],[[\"(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3\",[\"[478]\"]],[\"(\\\\d{3})(\\\\d{2})(\\\\d{2})(\\\\d{2})\",\"$1 $2 $3 $4\",[\"8\"]]]],\"WS\":[\"685\",\"0\",\"(?:[2-6]|8\\\\d{5})\\\\d{4}|[78]\\\\d{6}|[68]\\\\d{5}\",[5,6,7,10],[[\"(\\\\d{5})\",\"$1\",[\"[2-5]|6[1-9]\"]],[\"(\\\\d{3})(\\\\d{3,7})\",\"$1 $2\",[\"[68]\"]],[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"7\"]]]],\"XK\":[\"383\",\"00\",\"[23]\\\\d{7,8}|(?:4\\\\d\\\\d|[89]00)\\\\d{5}\",[8,9],[[\"(\\\\d{3})(\\\\d{5})\",\"$1 $2\",[\"[89]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[2-4]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[23]\"],\"0$1\"]],\"0\"],\"YE\":[\"967\",\"00\",\"(?:1|7\\\\d)\\\\d{7}|[1-7]\\\\d{6}\",[7,8,9],[[\"(\\\\d)(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"[1-6]|7(?:[24-6]|8[0-7])\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"7\"],\"0$1\"]],\"0\"],\"YT\":[\"262\",\"00\",\"(?:(?:(?:26|63)9|80\\\\d)\\\\d\\\\d|93980)\\\\d{4}\",[9],0,\"0\",0,0,0,0,\"269|63|9398\"],\"ZA\":[\"27\",\"00\",\"[1-79]\\\\d{8}|8\\\\d{4,9}\",[5,6,7,8,9,10],[[\"(\\\\d{2})(\\\\d{3,4})\",\"$1 $2\",[\"8[1-4]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{2,3})\",\"$1 $2 $3\",[\"8[1-4]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"860\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"[1-9]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"8\"],\"0$1\"]],\"0\"],\"ZM\":[\"260\",\"00\",\"800\\\\d{6}|(?:21|63|[79]\\\\d)\\\\d{7}\",[9],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[28]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"[79]\"],\"0$1\"]],\"0\"],\"ZW\":[\"263\",\"00\",\"2(?:[0-57-9]\\\\d{6,8}|6[0-24-9]\\\\d{6,7})|[38]\\\\d{9}|[35-8]\\\\d{8}|[3-6]\\\\d{7}|[1-689]\\\\d{6}|[1-3569]\\\\d{5}|[1356]\\\\d{4}\",[5,6,7,8,9,10],[[\"(\\\\d{3})(\\\\d{3,5})\",\"$1 $2\",[\"2(?:0[45]|2[278]|[49]8)|3(?:[09]8|17)|6(?:[29]8|37|75)|[23][78]|(?:33|5[15]|6[68])[78]\"],\"0$1\"],[\"(\\\\d)(\\\\d{3})(\\\\d{2,4})\",\"$1 $2 $3\",[\"[49]\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{4})\",\"$1 $2\",[\"80\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{7})\",\"$1 $2\",[\"24|8[13-59]|(?:2[05-79]|39|5[45]|6[15-8])2\",\"2(?:02[014]|4|[56]20|[79]2)|392|5(?:42|525)|6(?:[16-8]21|52[013])|8[13-59]\"],\"(0$1)\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"7\"],\"0$1\"],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"2(?:1[39]|2[0157]|[378]|[56][14])|3(?:12|29)\",\"2(?:1[39]|2[0157]|[378]|[56][14])|3(?:123|29)\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{6})\",\"$1 $2\",[\"8\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3,5})\",\"$1 $2\",[\"1|2(?:0[0-36-9]|12|29|[56])|3(?:1[0-689]|[24-6])|5(?:[0236-9]|1[2-4])|6(?:[013-59]|7[0-46-9])|(?:33|55|6[68])[0-69]|(?:29|3[09]|62)[0-79]\"],\"0$1\"],[\"(\\\\d{2})(\\\\d{3})(\\\\d{3,4})\",\"$1 $2 $3\",[\"29[013-9]|39|54\"],\"0$1\"],[\"(\\\\d{4})(\\\\d{3,5})\",\"$1 $2\",[\"(?:25|54)8\",\"258|5483\"],\"0$1\"]],\"0\"]},\"nonGeographic\":{\"800\":[\"800\",0,\"(?:00|[1-9]\\\\d)\\\\d{6}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"\\\\d\"]]],0,0,0,0,0,0,[0,0,[\"(?:00|[1-9]\\\\d)\\\\d{6}\"]]],\"808\":[\"808\",0,\"[1-9]\\\\d{7}\",[8],[[\"(\\\\d{4})(\\\\d{4})\",\"$1 $2\",[\"[1-9]\"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,0,[\"[1-9]\\\\d{7}\"]]],\"870\":[\"870\",0,\"7\\\\d{11}|[35-7]\\\\d{8}\",[9,12],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"[35-7]\"]]],0,0,0,0,0,0,[0,[\"(?:[356]|774[45])\\\\d{8}|7[6-8]\\\\d{7}\"]]],\"878\":[\"878\",0,\"10\\\\d{10}\",[12],[[\"(\\\\d{2})(\\\\d{5})(\\\\d{5})\",\"$1 $2 $3\",[\"1\"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,[\"10\\\\d{10}\"]]],\"881\":[\"881\",0,\"[0-36-9]\\\\d{8}\",[9],[[\"(\\\\d)(\\\\d{3})(\\\\d{5})\",\"$1 $2 $3\",[\"[0-36-9]\"]]],0,0,0,0,0,0,[0,[\"[0-36-9]\\\\d{8}\"]]],\"882\":[\"882\",0,\"[13]\\\\d{6}(?:\\\\d{2,5})?|[19]\\\\d{7}|(?:[25]\\\\d\\\\d|4)\\\\d{7}(?:\\\\d{2})?\",[7,8,9,10,11,12],[[\"(\\\\d{2})(\\\\d{5})\",\"$1 $2\",[\"16|342\"]],[\"(\\\\d{2})(\\\\d{6})\",\"$1 $2\",[\"49\"]],[\"(\\\\d{2})(\\\\d{2})(\\\\d{4})\",\"$1 $2 $3\",[\"1[36]|9\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{3})\",\"$1 $2 $3\",[\"3[23]\"]],[\"(\\\\d{2})(\\\\d{3,4})(\\\\d{4})\",\"$1 $2 $3\",[\"16\"]],[\"(\\\\d{2})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"10|23|3(?:[15]|4[57])|4|51\"]],[\"(\\\\d{3})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"34\"]],[\"(\\\\d{2})(\\\\d{4,5})(\\\\d{5})\",\"$1 $2 $3\",[\"[1-35]\"]]],0,0,0,0,0,0,[0,[\"342\\\\d{4}|(?:337|49)\\\\d{6}|(?:3(?:2|47|7\\\\d{3})|50\\\\d{3})\\\\d{7}\",[7,8,9,10,12]],0,0,0,0,0,0,[\"1(?:3(?:0[0347]|[13][0139]|2[035]|4[013568]|6[0459]|7[06]|8[15-8]|9[0689])\\\\d{4}|6\\\\d{5,10})|(?:345\\\\d|9[89])\\\\d{6}|(?:10|2(?:3|85\\\\d)|3(?:[15]|[69]\\\\d\\\\d)|4[15-8]|51)\\\\d{8}\"]]],\"883\":[\"883\",0,\"(?:[1-4]\\\\d|51)\\\\d{6,10}\",[8,9,10,11,12],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{2,8})\",\"$1 $2 $3\",[\"[14]|2[24-689]|3[02-689]|51[24-9]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3\",[\"510\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{4})\",\"$1 $2 $3\",[\"21\"]],[\"(\\\\d{4})(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"51[13]\"]],[\"(\\\\d{3})(\\\\d{3})(\\\\d{3})(\\\\d{3})\",\"$1 $2 $3 $4\",[\"[235]\"]]],0,0,0,0,0,0,[0,0,0,0,0,0,0,0,[\"(?:2(?:00\\\\d\\\\d|10)|(?:370[1-9]|51\\\\d0)\\\\d)\\\\d{7}|51(?:00\\\\d{5}|[24-9]0\\\\d{4,7})|(?:1[013-79]|2[24-689]|3[02-689]|4[0-4])0\\\\d{5,9}\"]]],\"888\":[\"888\",0,\"\\\\d{11}\",[11],[[\"(\\\\d{3})(\\\\d{3})(\\\\d{5})\",\"$1 $2 $3\"]],0,0,0,0,0,0,[0,0,0,0,0,0,[\"\\\\d{11}\"]]],\"979\":[\"979\",0,\"[1359]\\\\d{8}\",[9],[[\"(\\\\d)(\\\\d{4})(\\\\d{4})\",\"$1 $2 $3\",[\"[1359]\"]]],0,0,0,0,0,0,[0,0,0,[\"[1359]\\\\d{8}\"]]]}}","'use strict'\r\n\r\nvar metadata = require('../metadata.min.json')\r\nvar core = require('../core/index.cjs')\r\n\r\nfunction call(func, _arguments) {\r\n\tvar args = Array.prototype.slice.call(_arguments)\r\n\targs.push(metadata)\r\n\treturn func.apply(this, args)\r\n}\r\n\r\nfunction parsePhoneNumberFromString() {\r\n\treturn call(core.parsePhoneNumberFromString, arguments)\r\n}\r\n\r\n// ES5 `require()` \"default\" \"interoperability\" hack.\r\n// https://github.com/babel/babel/issues/2212#issuecomment-131827986\r\n// An alternative approach:\r\n// https://www.npmjs.com/package/babel-plugin-add-module-exports\r\nexports = module.exports = parsePhoneNumberFromString\r\nexports['default'] = parsePhoneNumberFromString\r\n\r\nexports.ParseError = core.ParseError\r\n\r\nfunction parsePhoneNumberWithError() {\r\n\treturn call(core.parsePhoneNumberWithError, arguments)\r\n}\r\n\r\n// `parsePhoneNumber()` named export has been renamed to `parsePhoneNumberWithError()`.\r\nexports.parsePhoneNumber = parsePhoneNumberWithError\r\nexports.parsePhoneNumberWithError = parsePhoneNumberWithError\r\n\r\n// `parsePhoneNumberFromString()` named export is now considered legacy:\r\n// it has been promoted to a default export due to being too verbose.\r\nexports.parsePhoneNumberFromString = parsePhoneNumberFromString\r\n\r\nexports.isValidPhoneNumber = function isValidPhoneNumber() {\r\n\treturn call(core.isValidPhoneNumber, arguments)\r\n}\r\n\r\nexports.isPossiblePhoneNumber = function isPossiblePhoneNumber() {\r\n\treturn call(core.isPossiblePhoneNumber, arguments)\r\n}\r\n\r\nexports.validatePhoneNumberLength = function validatePhoneNumberLength() {\r\n\treturn call(core.validatePhoneNumberLength, arguments)\r\n}\r\n\r\nexports.findNumbers = function findNumbers() {\r\n\treturn call(core.findNumbers, arguments)\r\n}\r\n\r\nexports.searchNumbers = function searchNumbers() {\r\n\treturn call(core.searchNumbers, arguments)\r\n}\r\n\r\nexports.findPhoneNumbersInText = function findPhoneNumbersInText() {\r\n\treturn call(core.findPhoneNumbersInText, arguments)\r\n}\r\n\r\nexports.searchPhoneNumbersInText = function searchPhoneNumbersInText() {\r\n\treturn call(core.searchPhoneNumbersInText, arguments)\r\n}\r\n\r\nexports.PhoneNumberMatcher = function PhoneNumberMatcher(text, options) {\r\n\treturn core.PhoneNumberMatcher.call(this, text, options, metadata)\r\n}\r\nexports.PhoneNumberMatcher.prototype = Object.create(core.PhoneNumberMatcher.prototype, {})\r\nexports.PhoneNumberMatcher.prototype.constructor = exports.PhoneNumberMatcher\r\n\r\nexports.AsYouType = function AsYouType(country) {\r\n\treturn core.AsYouType.call(this, country, metadata)\r\n}\r\nexports.AsYouType.prototype = Object.create(core.AsYouType.prototype, {})\r\nexports.AsYouType.prototype.constructor = exports.AsYouType\r\n\r\nexports.isSupportedCountry = function isSupportedCountry(country) {\r\n\treturn call(core.isSupportedCountry, arguments)\r\n}\r\n\r\nexports.getCountries = function getCountries() {\r\n\treturn call(core.getCountries, arguments)\r\n}\r\n\r\nexports.getCountryCallingCode = function getCountryCallingCode() {\r\n\treturn call(core.getCountryCallingCode, arguments)\r\n}\r\n\r\nexports.getExtPrefix = function getExtPrefix(country) {\r\n\treturn call(core.getExtPrefix, arguments)\r\n}\r\n\r\nexports.getExampleNumber = function getExampleNumber() {\r\n\treturn call(core.getExampleNumber, arguments)\r\n}\r\n\r\nexports.Metadata = function Metadata() {\r\n\treturn core.Metadata.call(this, metadata)\r\n}\r\nexports.Metadata.prototype = Object.create(core.Metadata.prototype, {})\r\nexports.Metadata.prototype.constructor = exports.Metadata\r\n\r\nexports.formatIncompletePhoneNumber = function formatIncompletePhoneNumber() {\r\n\treturn call(core.formatIncompletePhoneNumber, arguments)\r\n}\r\n\r\nexports.parseIncompletePhoneNumber = core.parseIncompletePhoneNumber\r\nexports.parsePhoneNumberCharacter = core.parsePhoneNumberCharacter\r\nexports.parseDigits = core.parseDigits\r\nexports.DIGIT_PLACEHOLDER = core.DIGIT_PLACEHOLDER\r\n\r\nexports.parseRFC3966 = core.parseRFC3966\r\nexports.formatRFC3966 = core.formatRFC3966","export default class AutoCompleteInput extends Backbone.View {\n template({className, id, label}) {\n return `\n
\n \n \n \n
\n
`;\n }\n\n constructor({ className, id, label, fieldList, defaultField, selectedEvent }) {\n super(...arguments);\n\n _.extend(this, arguments[0]);\n\n this.defaultField = defaultField || '';\n this.selectedEvent = selectedEvent || (() => {});\n }\n\n render() {\n this.$el.empty().append(this.template(this));\n\n this.$input = this.$el.find('input');\n\n if (this.defaultField) {\n this.lastSelected = this.defaultField;\n this.$input.val(this.defaultField);\n this.$el.find('.inputLabel').addClass('secondary-color');\n this.$el.find('.autoComplete').addClass('focused');\n }\n\n this.$input.autocomplete({\n source: this.fieldList,\n appendTo: this.$el.find('.results'),\n minLength: 0\n }).autocomplete('widget').addClass('fixed-height');\n\n this._attachEvents();\n\n return this;\n }\n\n _attachEvents() {\n this.$input.on('focus click', () =>\n {\n this.$input.val('');\n this.$input.autocomplete('search', '');\n });\n\n this.$input.on('autocompleteselect', (event, target) => {\n this.$input.val(target.item.label);\n this.selectedEvent(target.item.label);\n this.lastSelected = target.item.label;\n });\n\n this.$el.find('.icon-down-arrow').on('click', () => {\n this.$input.click().focus();\n });\n\n this.$input.on('focus', () => {\n this.$el.find('.autoComplete').find('.inputLabel').addClass('secondary-color');\n this.$el.find('.autoComplete').addClass('focused');\n });\n\n this.$input.on('blur', () => {\n if (this.lastSelected) {\n this.$input.val(this.lastSelected);\n }\n\n if (!this.$input.val()){\n this.$el.find('.inputLabel').removeClass('secondary-color');\n this.$el.find('.autoComplete').removeClass('focused');\n }\n });\n }\n}\n","import { toStaticUrl } from '../../../../lib/assetMapper';\n\nexport default class FloatingLabelInput extends Backbone.View {\n template({ className, id, label, type }) {\n return this.adjustForSafari\n ? `\n \n \n ${\n type === 'password'\n ? `\n ${window.text(\n                    \n ${window.text(\n                    \n `\n : ''\n }\n

${window.text('signInPage.invalidField', {\n fieldName: label,\n })}

`\n : `\n
\n \n \n ${\n type === 'password'\n ? `\n ${window.text(\n                        \n ${window.text(\n                        \n `\n : ''\n }\n

${window.text(\n 'signInPage.invalidField',\n { fieldName: label }\n )}

\n
`;\n }\n\n constructor({ className, id, label, type, autocompleteHint }) {\n super(...arguments);\n\n this.type = type || 'text';\n this.floated = false;\n this.floatPollIntervalMS = 100;\n this.adjustForSafari =\n window.featureManager.isEnabled('safari-autocomplete-adjustment') &&\n type != 'tel';\n\n _.extend(this, arguments[0]);\n }\n\n render() {\n this.eventsAttached = false;\n this.$el.empty().append(this.template(this));\n this.$input = this.$el.find('input');\n this.$invalidLabel = this.$el.find('p.invalidLabel');\n this._attachEvents();\n return this;\n }\n\n _attachEvents() {\n if (!this.eventsAttached) {\n this.$input.on('focus input change', () => {\n this.floatLabel();\n });\n\n this.$input.on('blur', () => {\n if (!this.$input.val()) {\n this.sinkLabel();\n }\n });\n\n if (window.featureManager.isEnabled('pollForAutofill')) {\n if (\n !window.featureManager.isEnabled('idcDuplicateHandlerFix')\n ) {\n console.log('start polling');\n }\n\n setTimeout(\n () => this.checkForWebkitAutofill(),\n this.floatPollIntervalMS\n );\n }\n\n if (this.type === 'password') {\n this.$input.css('padding-right', '3rem');\n this.$el.find('.showPasswordIcon').on('click', () => {\n this.$el.find('.showPasswordIcon').toggle();\n this.$input.focus();\n if (this.$input.attr('type') === 'password') {\n this.$input.attr('type', 'text');\n } else {\n this.$input.attr('type', 'password');\n }\n });\n this.$el.find('.showPasswordIcon').on('keydown', (e) => {\n // enter and space\n if (e.which === 13 || e.which === 32) {\n e.preventDefault();\n $(e.target).trigger('click');\n }\n });\n }\n this.eventsAttached = true;\n }\n }\n\n // poll for autofill by webkit. Webkit browsers\n // do not trigger any event on autofill until the user\n // interacts with the page in some way. The autofilled\n // value is also not available on the element until that time.\n // However, the browser-specific pseudo class is applied.\n checkForWebkitAutofill() {\n try {\n if (this.$input.is(':-webkit-autofill') && !this.floated) {\n this.floatLabel();\n }\n\n if (!this.floated) {\n setTimeout(\n () => this.checkForWebkitAutofill(),\n this.floatPollIntervalMS\n );\n }\n } catch (er) {\n // This will simply fail in some browsers where the -webkit-autofill pseudo-selector is not supported. Not much we can do in that case, but we also don't want the error to show up as noise in NR\n }\n }\n\n floatLabel() {\n if (\n window.featureManager.isEnabled('pollForAutofill') &&\n this.floated\n ) {\n return;\n }\n\n this.$el.find('.inputLabel').addClass('secondary-color');\n this.adjustForSafari\n ? this.$el.addClass('focused')\n : this.$el.find('.floatingLabelInput').addClass('focused');\n this.floated = true;\n }\n\n sinkLabel() {\n if (\n window.featureManager.isEnabled('pollForAutofill') &&\n !this.floated\n ) {\n return;\n }\n\n this.$el.find('.inputLabel').removeClass('secondary-color');\n this.adjustForSafari\n ? this.$el.removeClass('focused')\n : this.$el.find('.floatingLabelInput').removeClass('focused');\n this.floated = false;\n }\n\n validateNonEmpty() {\n if (this.$input.val()) {\n return true;\n }\n this.displayInvalid();\n return false;\n }\n\n displayInvalid() {\n if (!this.invalid) {\n this.adjustForSafari\n ? this.$el.addClass('invalid')\n : this.$el.find('.floatingLabelInput').addClass('invalid');\n\n this.$input.on('focus', () => {\n this.clearInvalid();\n });\n this.invalid = true;\n }\n }\n\n clearInvalid() {\n if (this.invalid) {\n this.adjustForSafari\n ? this.$el.removeClass('invalid')\n : this.$el.find('.floatingLabelInput').removeClass('invalid');\n this.invalid = false;\n }\n }\n}\n","import FloatingLabelInput from './FloatingLabelInput';\nimport { AsYouType, parsePhoneNumberFromString, getCountryCallingCode, isSupportedCountry } from 'libphonenumber-js';\nimport { toStaticUrl } from '../../../../lib/assetMapper';\nconst {text} = window;\n\nexport default class PhoneNumberInput extends FloatingLabelInput {\n\n constructor({ className, id, label, type, allowAllCountries, allowedCountries}) {\n super(...arguments);\n\n if (!allowAllCountries && !allowedCountries){\n throw new Error('no allowed countries specified');\n }\n\n if (allowAllCountries){\n this.allowedCountries = this.allCountries;\n } else {\n this.allowedCountries = allowedCountries;\n }\n\n if (this.allowedCountries){\n this.selectedCountry = this.allowedCountries[0];\n }\n this.setupMenuWidget();\n }\n\n render(){\n super.render();\n\n this.$el.addClass('phoneNumberInput ui-front');\n if (this.showCountrySelector){\n this.$el.prepend(`\n `);\n this.$countrySelect = this.$el.find('.phoneCountrySelector');\n this.$countrySelect.countrySelectMenu({\n change: (evt, item) => {\n this.country = item.item.value;\n },\n icons: {button: 'icon-down-arrow'}\n });\n }\n\n this._attachPhoneNumberEvents();\n return this;\n }\n\n setupMenuWidget() {\n $.widget('custom.countrySelectMenu', $.ui.selectmenu, {\n _renderItem: (ul, item) => {\n let val = item.element.val();\n let listItem = $(`
  • \n
    \n \n ${text(`countryNames.${val.toUpperCase()}`)}\n +${getCountryCallingCode(val)}\n
  • `);\n\n ul.append(listItem);\n return listItem;\n },\n _renderButtonItem(item){\n //\n let buttonItem = $(`\n
    `);\n return buttonItem;\n }\n });\n }\n\n set country(countryCode){\n this.selectedCountry = countryCode;\n this._formatNumber();\n this.clearInvalid();\n }\n\n get showCountrySelector(){\n return this.allowAllCountries || (this.allowedCountries.length > 1);\n }\n\n _formatNumber(){\n let current = this.$input.val();\n if (current){\n let formatted = new AsYouType(this.selectedCountry).input(current);\n this.$input.val(formatted);\n }\n }\n\n _attachPhoneNumberEvents(){\n this.$input.on('input', () => this._formatNumber());\n if (this.$countrySelect){\n this.$countrySelect.on('change', () => {\n this.country = this.$countrySelect.val();\n });\n }\n this.$input.on('keydown', (e) => this.onKeydown(e));\n }\n\n onKeydown(e){\n // We need special handing for backspace and delete because of the auto-formatting\n // behavior. Without this, it's impossible to backspace/delete past certain formatting characters\n // because the formatting keeps reinserting them. User selected text can be handled normally.\n let noSelection = e.target.selectionStart === e.target.selectionEnd;\n if (noSelection && (e.keyCode === 8 || e.keyCode === 46)) {\n\n let digitsBeforeCursor = this.countPrecedingDigits(e.target.selectionStart);\n let digitsOnly = this.unformattedValue;\n let updated, newCursorPosition;\n if (e.keyCode === 8){ // BACKSPACE\n updated = digitsOnly.slice(0, digitsBeforeCursor - 1) + digitsOnly.slice(digitsBeforeCursor);\n newCursorPosition = digitsBeforeCursor;\n } else if (e.keyCode === 46){ // DELETE\n updated = digitsOnly.slice(0, digitsBeforeCursor) + digitsOnly.slice(digitsBeforeCursor + 1);\n newCursorPosition = digitsBeforeCursor + 1;\n }\n\n this.$input.val(updated);\n this._formatNumber();\n this.repositionCursor(newCursorPosition);\n e.preventDefault();\n }\n }\n\n // Reposition the cursor following the nth numeric character in the formatted string\n repositionCursor(digitIndex){\n let val = this.$input.val();\n let i = 0;\n let digitsFound = 0;\n for (; i < val.length; ++i) {\n if (digitsFound === digitIndex - 1){\n break;\n }\n let char = val.charAt(i);\n if (this.isDigit(char)){\n digitsFound++;\n }\n }\n this.$input[0].setSelectionRange(i,i);\n }\n\n isDigit(c){\n return (/^\\d$/).test(c);\n }\n\n countPrecedingDigits(index){\n return this.$input.val().slice(0, index).split('').filter((c) => this.isDigit(c)).length;\n }\n\n countFollowingDigits(index){\n return this.$input.val().slice(index).split('').filter((c) => this.isDigit(c)).length;\n }\n\n get unformattedValue(){\n return this.$input.val().split('').filter((c) => this.isDigit(c)).join('');\n }\n\n resetInvalidText() {\n this.$invalidLabel.text(window.text('signInPage.invalidField', {fieldName: this.label}));\n }\n\n setInvalidText(text) {\n this.$invalidLabel.text(text);\n }\n\n validate(){\n let number = parsePhoneNumberFromString(this.$input.val(), this.selectedCountry);\n if (!number || !number.isValid()){\n this.displayInvalid();\n return false;\n }\n return true;\n }\n\n displayInvalid() {\n if (!this.invalid){\n super.displayInvalid();\n this.$el.addClass('invalid');\n this.invalid = true;\n }\n }\n\n clearInvalid(){\n if (this.invalid){\n super.clearInvalid();\n this.$el.removeClass('invalid');\n this.invalid = false;\n }\n }\n\n\n floatLabel(){\n super.floatLabel();\n this.$el.addClass('focused');\n\n }\n\n sinkLabel(){\n super.sinkLabel();\n this.$el.removeClass('focused');\n }\n\n get E164(){\n let parsed = parsePhoneNumberFromString(this.$input.val(), this.selectedCountry);\n return parsed ? parsed.number : parsed;\n }\n\n get displayValue(){\n return this.$input.val();\n }\n\n get allCountries() {\n return ['AF','AX','AL','DZ','AS','AD','AO','AI','AG','AR','AM','AW','AU','AT','AZ','BS','BH','BD','BB','BY','BE','BZ','BJ','BM','BT','BO','BA','BW','BR','IO','VG','BN','BG','BF','BI','KH','CM','CA','IC','CV','BQ','KY','CF','EA','TD','CL','CN','CX','CC','CO','KM','CG','CD','CK','CR','CI','HR','CU','CW','CY','CZ','DK','DG','DJ','DM','DO','EC','EG','SV','GQ','ER','EE','SZ','ET','FK','FO','FJ','FI','FR','GF','PF','TF','GA','GM','GE','DE','GH','GI','GR','GL','GD','GP','GU','GT','GG','GN','GW','GY','HT','HN','HK','HU','IS','IN','ID','IR','IQ','IE','IM','IL','IT','JM','JP','JE','JO','KZ','KE','KI','XK','KW','KG','LA','LV','LB','LS','LR','LY','LI','LT','LU','MO','MG','MW','MY','MV','ML','MT','MH','MQ','MR','MU','YT','MX','FM','MD','MC','MN','ME','MS','MA','MZ','MM','NA','NR','NP','NL','NC','NZ','NI','NE','NG','NU','NF','KP','MK','MP','NO','OM','PK','PW','PS','PA','PG','PY','PE','PH','PN','PL','PT','XA','XB','PR','QA','RE','RO','RU','RW','WS','SM','ST','SA','SN','RS','SC','SL','SG','SX','SK','SI','SB','SO','ZA','GS','KR','SS','ES','LK','BL','SH','KN','LC','MF','PM','VC','SD','SR','SJ','SE','CH','SY','TW','TJ','TZ','TH','TL','TG','TK','TO','TT','TN','TR','TM','TC','TV','UM','VI','UG','UA','AE','GB','US','UY','UZ','VU','VA','VE','VN','WF','EH','YE','ZM','ZW']\n .filter((x) => isSupportedCountry(x));\n }\n}\n","export default class VerificationCodeInput extends Backbone.View {\n template({className, id, codeLength, label}) {\n let inputLabelBoxes = $('
    ');\n inputLabelBoxes.append('
    ');\n\n for (let i = 0; i < codeLength; i++) {\n inputLabelBoxes.find('.inputLabelBoxes').append(`\n
    \n `);\n }\n\n return `\n
    \n \n ${inputLabelBoxes.html()}\n
    `;\n }\n\n constructor({ className, id, codeLength, label }) {\n super(...arguments);\n\n _.extend(this, arguments[0]);\n\n this.codeLength = codeLength || 6;\n }\n\n render() {\n this.boxWidthPercentage = Math.floor(100 / this.codeLength - 1);\n this.containerHeightPercentage = Math.round(this.boxWidthPercentage * 4 / 3);\n\n this.$el.empty().append(this.template(this));\n\n this.$input = this.$el.find('input');\n\n this._attachEvents();\n\n return this;\n }\n\n _attachEvents() {\n this.$input.on('input change', () => {\n let inputCode = this.$input.val().replace(/\\D/g, '');\n if (inputCode.length > this.codeLength) {\n inputCode = inputCode.slice(0, this.codeLength);\n }\n this.$input.val(inputCode);\n\n for (let i = 0; i < this.codeLength; i++) {\n let box = this.$el.find(`.inputLabelBox#${i}`);\n box.empty().append(`
    ${inputCode.charAt(i)}
    `);\n if (i < inputCode.length) {\n box.removeClass('focused');\n }\n else if (i === inputCode.length) {\n box.addClass('filled').addClass('focused');\n }\n else {\n box.removeClass('filled').removeClass('focused');\n }\n }\n if (inputCode.length === this.codeLength) {\n this.$el.find(`.inputLabelBox#${inputCode.length - 1}`).addClass('focused');\n }\n });\n\n this.$el.find('.inputLabelBox').on('click', () => {\n this.$input.focus();\n });\n\n this.$input.on('focus', () => {\n let index = this.$input.val().length;\n if (index === this.codeLength) {\n index--;\n }\n this.$el.find(`.inputLabelBox#${index}`).addClass('focused').addClass('filled');\n });\n\n this.$input.on('blur', () => {\n let index = this.$input.val().length;\n if (index === this.codeLength) {\n this.$el.find(`.inputLabelBox#${index - 1}`).removeClass('focused');\n }\n else {\n this.$el.find(`.inputLabelBox#${index}`).removeClass('focused').removeClass('filled');\n }\n });\n }\n\n focus(){\n this.$input.focus();\n }\n\n validate() {\n if (this.$input.val().length === this.codeLength) {\n return true;\n }\n this.$el.find('.verificationCodeInput').addClass('invalid');\n this.$input.on('focus', () => {\n this.$el.find('.verificationCodeInput').removeClass('invalid');\n });\n }\n}\n","import keys from '../../util/keycodes';\nimport ModalTemplate from './templates/modal.html';\n\nclass Modal extends Backbone.View {\n get defaults() {\n // When the flag is enabled, closeOnEsc must always be FALSE\n // to ensure that the ESC key behavior defined in _bindEvents() executes properly.\n // Do not modify this value when calling a new modal.\n var closeModalOnEsc = window.featureManager.isEnabled(\n 'close-dropdowns-on-esc'\n )\n ? false\n : true;\n\n return {\n autoShow: true,\n autoRender: true,\n closeOnEsc: closeModalOnEsc,\n closeOnBlur: true,\n\n id: '',\n classes: ['small'],\n buttonAlign: 'right',\n title: 'Title',\n hiddenTitle: false,\n content: 'Some Content',\n submitText: html('ok'),\n cancelText: html('cancel'),\n attachToDocument: true,\n defaultButtonBehaviour: true,\n showCloseButton: true,\n };\n }\n\n initialize(options) {\n _.extend(this, this.defaults, options);\n\n this.tpl = ModalTemplate;\n this.setElement(this.tpl(this));\n\n if (this.id.length) {\n this.$el.attr('id', this.id);\n }\n\n this.$content = this.$el.find('.modal-container');\n\n this.$content.empty().append(this.content);\n\n this.$el.addClass(this.classes.join(' '));\n\n this.$title = this.$el.find('.modal-title');\n\n if (this.hiddenTitle) {\n this.$title.css('display', 'none');\n this.$title.attr('aria-hidden', 'true');\n }\n\n if (this.autoRender) {\n this._render();\n }\n\n this._bindEvents();\n }\n\n _render() {\n if (this.attachToDocument) {\n // For Foundation to work as expected we need to have the element attached to the DOM before calling .foundation('reveal', 'open')\n $('body').append(this.el);\n }\n\n if (this.autoShow) {\n this.show();\n }\n\n return this;\n }\n\n isSelectEvent = (e) =>\n (e.type === 'click' || e.which === 13 || e.which === 32) &&\n (e.preventDefault() || true);\n\n // We dont actually want to use the Foundation modal events since they get weird fast...\n // lets use our own so consumers dont have to know its foundation\n _bindEvents() {\n this.$el.on('click keydown', '.js-close', (e) => {\n this.isSelectEvent(e) && this.trigger('cancel', this);\n });\n\n if (this.defaultButtonBehaviour) {\n this.on('close cancel', () => {\n this.close();\n });\n }\n\n this.$el.on('keypress', '*', (e) => {\n if (e.which === keys.TAB) {\n this._keepFocus(e);\n }\n });\n\n if (window.featureManager.isEnabled('close-dropdowns-on-esc')) {\n // Prevent ESC from closing modal when \n \n \n ${inputs.html()}\n ${\n this.ozoneCaptcha\n ? `\n
    \n `\n : ''\n }\n
    \n \n
    \n \n `);\n\n container.append(template);\n\n this.username = undefined;\n this.password = undefined;\n if (\n selectedForm.type === 'Local' &&\n selectedForm.local.username.enabled\n ) {\n this.username = new FloatingLabelInput({\n el: template.find('.usernameContainer'),\n className: 'signInInput',\n id: 'username',\n // replace spaces with non-breaking spaces to prevent Safari from interpreting the \"card number\" field as a credit card input\n label: text(\n `signInPage.usernameKeys.${\n selectedForm.local.username.key || 'CardNumber'\n }`\n ).replace('\\x20', '\\xa0'),\n autocompleteHint: 'username',\n }).render();\n }\n\n if (\n selectedForm.type === 'Local' &&\n selectedForm.local.password.enabled\n ) {\n this.password = new FloatingLabelInput({\n el: template.find('.passwordContainer'),\n className: 'signInInput',\n id: 'password',\n label: text(\n `signInPage.pinKeys.${\n selectedForm.local.password.key || 'PIN'\n }`\n ),\n type: 'password',\n autocompleteHint: 'current-password',\n }).render();\n }\n\n template.find('.signInInput input').on('keypress', (e) => {\n if (e.which === 13) {\n e.preventDefault();\n this._submit();\n }\n });\n\n template.find('.signin-button').on('click', (e) => {\n e.preventDefault();\n if (selectedForm.type === 'External') {\n window.globalEvents.trigger(\n 'signIn:external',\n selectedForm.displayName\n );\n } else {\n window.globalEvents.trigger(\n 'signIn:library',\n selectedForm.displayName\n );\n }\n\n this._submit();\n });\n\n // Prevent rendering the mobileNumber form if movedSiteMessage is enabled AND the form is of type \"Moved\"\n if (\n this.ozoneData.getACard &&\n !(\n window.featureManager.isEnabled('movedSiteMessage') &&\n selectedForm &&\n selectedForm.type === 'Moved'\n )\n ) {\n this._addSecondarySignIn('mobileNumber');\n }\n }\n\n _submit() {\n let validUsername = !this.username || this.username.validateNonEmpty();\n let validPassword = !this.password || this.password.validateNonEmpty();\n\n if (validUsername && validPassword) {\n const libraryName = this.el.find('#signin-options').val();\n this.el.find('[name=libraryName]').val(libraryName);\n\n this.el\n .find('.signin-button')\n .empty()\n .addClass('waiting')\n .append('
    ');\n this.el.find('#login-form').submit();\n }\n }\n\n _renderIdcCaptcha(id = 'idc-captcha-container') {\n if (!this.idcCaptcha) {\n return '';\n }\n return `\n
    \n `;\n }\n\n _renderMovedAccountMessage(account, container) {\n container.empty();\n this.signInHeader.hide();\n this.bottomSignInOptionsDiv.empty();\n\n let messageLink = `\n ${text('signInPage.accountMovedLink')}\n `;\n let message = text('signInPage.accountMoved', {\n accountLink: messageLink,\n });\n let accessMessage = text('signInPage.accountMovedAccess');\n\n let template = $(`\n

    ${message}

    \n

    ${accessMessage}

    \n `);\n container.append(template);\n }\n\n _renderMobileNumberForm() {\n this.inputContainer.empty();\n this.el.find('.errorMessage').remove();\n this.el.empty().append(this._mainFormHtml('mobileNumber'));\n this.signInHeader = this.el.find('.signInHeader');\n this.inputContainer = this.el.find('.inputContainer');\n this.bottomSignInOptionsDiv = this.el.find(\n '.bottomSignInOptionsContainer'\n );\n\n const captchaElementId = 'idc-mobile-number-form-captcha';\n let template = $(`\n
    \n
    \n
    \n

    ${text('signInPage.mobile.textVerificationCode')}

    \n

    ${text('signInPage.mobile.ratesMayApply')}

    \n ${text(\n 'signInPage.idc.privacyPolicy'\n )}\n
    \n
    \n ${this._renderIdcCaptcha(captchaElementId)}\n \n
    \n
    \n `);\n\n let numberInput = new PhoneNumberInput({\n el: template.find('.mobileNumberContainer'),\n className: 'signInInput',\n id: 'mobileNumber',\n label: text('signInPage.mobile.mobileNumber'),\n type: 'tel',\n allowAllCountries: !this.idcOptions.primary.phoneCountryCodes,\n allowedCountries: this.idcOptions.primary.phoneCountryCodes,\n }).render();\n\n this.inputContainer.append(template);\n this._addSecondarySignIn('libraryCard');\n\n this.idcOnly\n ? this._updateGetOneInstantlyButton(true)\n : this._updateGetOneInstantlyButton(false);\n\n this.el.focus();\n\n if (this.idcCaptcha) {\n window.__recaptchaDataCallback = (captchaCode) => {\n this._sendCode(numberInput, captchaCode);\n };\n this._renderRecaptcha(captchaElementId);\n }\n\n template.find('.signin-button').on('click', () => {\n this._validateAndSendCode(numberInput);\n });\n\n template\n .find('.signInInput input')\n .on('keypress', this._getMobileNumberKeypressHandler(numberInput));\n }\n\n _addSecondarySignIn(type) {\n this.bottomSignInOptionsDiv.empty();\n\n if (this.idcOnly) {\n return;\n }\n\n let mainTemplate = $(`\n
    ${text('signInPage.or')}
    \n
    \n \n
    \n `);\n\n this.bottomSignInOptionsDiv.append(mainTemplate);\n\n this.bottomSignInOptionsDiv.find('.optionButton').click(() => {\n if (type === 'mobileNumber') {\n this._renderMobileNumberForm();\n } else {\n this._renderLibraryCardForm();\n }\n });\n }\n\n _updateGetOneInstantlyButton(isDefault) {\n let container = $('.getACardPromoHeader');\n let label = container.find('p');\n let button = $('.getOneInstantly');\n\n if (window.featureManager.isEnabled('idcDuplicateHandlerFix')) {\n button.unbind('click');\n }\n\n if (isDefault) {\n label.html(text('signInPage.memberYet'));\n $('.button.getOneInstantly').html(\n `${text('signInPage.getACardButton')}`\n );\n\n button.on('click', () => {\n this._renderIdcSignup();\n });\n } else {\n label.html(text('signInPage.alreadyMember'));\n $('.button.getOneInstantly').html(`${text('signIn')}`);\n\n button.on('click', () => {\n this._render();\n });\n }\n }\n\n _renderVerificationCodeInput(\n displayPhoneNumber,\n e164PhoneNumber,\n idcResponse\n ) {\n this.el.empty();\n\n const captchaElementId = 'idc-mobile-number-form-captcha';\n let template = $(`\n
    \n

    ${text(\n 'signInPage.verifyYourNumber'\n )}

    \n

    ${text('signInPage.enterTheCode', {\n location: displayPhoneNumber,\n })}

    \n
    \n

    ${text('signInPage.noCodeHtml', {\n resend: `${text(\n 'signInPage.resendNow'\n )}`,\n })}

    \n

    ${text('signInPage.mobile.ratesMayApply')}

    \n ${this._renderIdcCaptcha(captchaElementId)}\n \n
    \n `);\n\n let codeInput = new VerificationCodeInput({\n el: template.find('.verificationInputContainer'),\n className: 'verificationCode',\n id: 'verificationCode',\n label: text('signInPage.enterTheCode', {\n location: displayPhoneNumber,\n }),\n }).render();\n\n this.el.append(template);\n codeInput.focus();\n\n if (this.idcCaptcha) {\n window.__recaptchaDataCallback = (captchaCode) => {\n this._resendCode(e164PhoneNumber, captchaCode);\n };\n this._renderRecaptcha(captchaElementId);\n }\n\n template.find('.resendNow').on('click', () => {\n this._validateAndResendCode(e164PhoneNumber);\n });\n\n template.find('.signin-button').on('click', () => {\n this._verifyCode(codeInput, idcResponse);\n });\n\n template.find('.verificationCode input').on('keypress', (e) => {\n if (e.which === 13) {\n e.preventDefault();\n this._verifyCode(codeInput, idcResponse);\n }\n });\n }\n\n _renderEmailVerificationCodeInput(email, idcResponse, ilsName) {\n this.el.empty();\n\n let template = $(`\n
    \n

    ${text(\n 'signInPage.verifyYourEmail'\n )}

    \n

    ${text('signInPage.enterTheCode', {\n location: email,\n })}

    \n
    \n

    ${text('signInPage.noCodeHtml', {\n resend: `${text(\n 'signInPage.resendNow'\n )}`,\n })}

    \n \n
    \n `);\n\n let codeInput = new VerificationCodeInput({\n el: template.find('.verificationInputContainer'),\n className: 'verificationCode',\n id: 'verificationCode',\n label: text('signInPage.enterTheCode', { location: email }),\n }).render();\n\n this.el.append(template);\n codeInput.focus();\n\n template.find('.resendNow').on('click', () => {\n this._resendEmailCode(email, ilsName);\n });\n\n template.find('.signin-button').on('click', () => {\n this._emailVerifyCode(codeInput, idcResponse, ilsName);\n });\n\n template.find('.verificationCode input').on('keypress', (e) => {\n if (e.which === 13) {\n e.preventDefault();\n this._emailVerifyCode(codeInput, idcResponse, ilsName);\n }\n });\n }\n\n _getMobileNumberKeypressHandler(mobileNumberInput) {\n if (!mobileNumberInput) {\n throw new Error('you must pass \"mobileNumberInput\"');\n }\n return (e) => {\n if (e.which === 13) {\n e.preventDefault();\n this._validateAndSendCode(mobileNumberInput);\n }\n };\n }\n\n _renderGeoSignup() {\n this.el.empty();\n\n window.globalEvents.trigger('geo:register:view');\n\n const captchaElementId = 'idc-signup-captcha';\n\n let terms = `${text(\n 'signInPage.geo.termsAndConditions'\n )}`;\n let policy = `${text(\n 'signInPage.geo.privacyPolicy'\n )}`;\n\n let template = $(`\n
    \n

    ${text(\n 'signInPage.geo.instantDigitalAccess'\n )}

    \n

    ${text(\n 'signInPage.geo.bySelectingAcceptAndContinue'\n )}

    \n
      \n
    • ${text('signInPage.idc.13OrOlder')}
    • \n
    • ${text('signInPage.geo.weHavePermission')}
    • \n
    \n

    ${text(\n 'signInPage.geo.doNotSell',\n {\n terms,\n policy,\n }\n )}

    \n
    \n ${this._renderIdcCaptcha(captchaElementId)}\n \n
    \n
    \n \n

    ${text(\n 'signInPage.idc.weRespectPrivacy'\n )}

    \n
    \n
    \n `);\n\n this.el.append(template);\n\n this.el.focus();\n\n if (this.idcCaptcha) {\n window.__recaptchaDataCallback = (captchaCode) => {\n this._verifyGeolocation(captchaCode);\n };\n this._renderRecaptcha(captchaElementId);\n }\n\n template.find('.signin-button').on('click', () => {\n this._validateAndVerifyGeolocation();\n });\n }\n\n _verifyGeolocation(captchaCode = undefined) {\n this.el\n .find('.signin-button')\n .empty()\n .addClass('waiting')\n .append('
    ');\n this._hideErrorMessage();\n\n window.globalEvents.trigger('geo:register:accept:start');\n\n $.post(window.url(window.routes.rest.idc.geo.authorize), {\n ilsName: this.ozoneData.geolocation.options[0].ilsName,\n captchaCode,\n })\n .done((response) => {\n window.globalEvents.trigger('geo:register:accept:success');\n window.globalEvents.trigger(\n 'signIn:geo',\n window.OverDrive.libraryName\n );\n this._idcSignIn(response);\n })\n .fail(() => {\n setTimeout(() => {\n this._showErrorMessage(\n text('signInPage.geo.errorServiceArea')\n );\n this.el\n .find('.signin-button')\n .empty()\n .removeClass('waiting')\n .append(text('signInPage.geo.acceptAndContinue'));\n\n window.globalEvents.trigger('geo:register:accept:fail');\n }, 300);\n });\n }\n\n _validateAndVerifyGeolocation() {\n if (this.idcCaptcha) {\n window.grecaptcha.reset();\n window.grecaptcha.execute();\n } else {\n this._verifyGeolocation();\n }\n }\n\n _renderIdcSignup() {\n this.el.empty();\n\n const signInLink = window.routes.accountSignIn;\n const captchaElementId = 'idc-signup-captcha';\n let template = $(`\n
    \n

    ${text(\n 'getCard.noLibraryCard'\n )}

    \n

    ${text('getCard.takesAFewSec')}

    \n ${text('getCard.whyDoYouNeed')}\n

    \n ${text('signInPage.idc.alreadyHaveCardHtml', { signInLink })}\n

    \n
    \n
    \n
    \n

    ${text('signInPage.mobile.textVerificationCode')}

    \n

    ${text('signInPage.mobile.ratesMayApply')}

    \n ${text(\n 'signInPage.idc.privacyPolicy'\n )}\n
    \n
    \n ${this._renderIdcCaptcha(captchaElementId)}\n \n
    \n
    \n
    \n `);\n\n let numberInput = new PhoneNumberInput({\n el: template.find('.mobileNumberContainer'),\n className: 'signInInput',\n id: 'mobileNumber',\n label: text('signInPage.mobile.mobileNumber'),\n type: 'tel',\n allowAllCountries: !this.idcOptions.primary.phoneCountryCodes,\n allowedCountries: this.idcOptions.primary.phoneCountryCodes,\n }).render();\n\n this.el.append(template);\n\n this._updateGetOneInstantlyButton(false);\n\n this.el.focus();\n\n if (this.idcCaptcha) {\n window.__recaptchaDataCallback = (captchaCode) => {\n this._sendCode(numberInput, captchaCode);\n };\n this._renderRecaptcha(captchaElementId);\n }\n\n template.find('.signin-button').on('click', () => {\n this._validateAndSendCode(numberInput);\n });\n\n template\n .find('.signInInput input')\n .on('keypress', this._getMobileNumberKeypressHandler(numberInput));\n }\n\n _renderIdcAdditionalInfo(idcResponse) {\n this.el.empty();\n\n let signUpOptions = idcResponse.signUpOptions[0];\n let requiredFields = signUpOptions.requiredFields.filter(\n (field) =>\n field !== 'PhoneToken' &&\n field !== 'AuthToken' &&\n field !== 'IpAddress'\n );\n let optionalFields = signUpOptions.optionalFields || [];\n\n let fields = $('
    ');\n\n requiredFields.forEach((field) => {\n fields.append(\n `
    `\n );\n });\n\n optionalFields.forEach((field) => {\n fields.append(\n `
    `\n );\n });\n\n let terms = `${text(\n 'signInPage.idc.termsAndConditions'\n )}`;\n let policy = `${text(\n 'signInPage.idc.privacyPolicy'\n )}`;\n\n const captchaElementId = 'idc-additional-info-captcha';\n let template = $(`\n
    \n

    ${text(\n 'signInPage.idc.completeVerification'\n )}

    \n

    ${text(\n 'signInPage.idc.fewMoreThings'\n )}

    \n
    \n ${fields.html()}\n
    \n

    ${text(\n 'signInPage.idc.bySelectingContinue'\n )}

    \n
      \n
    • ${text('signInPage.idc.13OrOlder')}
    • \n
    • ${text('signInPage.idc.youAgreeHtml', {\n terms,\n policy,\n })}
    • \n
    \n
    \n ${this._renderIdcCaptcha(captchaElementId)}\n \n
    \n
    \n \n

    ${text(\n 'signInPage.idc.weRespectPrivacy'\n )}

    \n
    \n
    \n `);\n\n let requiredFieldInputs = [];\n requiredFields.forEach((field) => {\n requiredFieldInputs.push(\n new FloatingLabelInput({\n el: template.find(`.${field}Container`),\n className: 'signInInput requiredField',\n id: field,\n label: text(`signInPage.idc.${field}`),\n type: 'text',\n }).render()\n );\n });\n\n let optionalFieldInputs = [];\n optionalFields.forEach((field) => {\n optionalFieldInputs.push(\n new FloatingLabelInput({\n el: template.find(`.${field}Container`),\n className: 'signInInput',\n id: field,\n label: text('signInPage.optionalField', {\n fieldName: text(`signInPage.idc.${field}`),\n }),\n type: 'text',\n }).render()\n );\n });\n\n this.el.append(template);\n this.el.focus();\n\n if (this.idcCaptcha) {\n window.__recaptchaDataCallback = (captchaCode) => {\n this._signUp(\n requiredFieldInputs,\n optionalFieldInputs,\n idcResponse,\n captchaCode\n );\n };\n this._renderRecaptcha(captchaElementId);\n }\n\n template.find('.signin-button').on('click', () => {\n this._validateAndSignUp(\n requiredFieldInputs,\n optionalFieldInputs,\n idcResponse\n );\n });\n\n template.find('.signInInput input').on('keypress', (e) => {\n if (e.which === 13) {\n e.preventDefault();\n this._validateAndSignUp(\n requiredFieldInputs,\n optionalFieldInputs,\n idcResponse\n );\n }\n });\n }\n\n _renderIdcDenied() {\n this.el.empty();\n\n let template = $(`\n
    \n

    ${text(\n 'signInPage.idc.unableToConfirm'\n )}

    \n

    ${text(\n 'signInPage.idc.weCouldntGrant'\n )}

    \n

    ${text(\n 'signInPage.idc.youMayBeEligible'\n )}\n ${\n !!window.OverDrive.cardSignUpLink\n ? `\n ${text(\n 'signInPage.idc.learnMore'\n )}\n `\n : ''\n }\n

    \n
    \n \n
    \n
    \n `);\n\n this.el.append(template);\n this.el.focus();\n\n template.find('.signin-button').on('click', () => {\n this._render();\n });\n }\n\n _renderEmailRegistration(selectedForm, container) {\n this.el.find('.errorMessage').remove();\n\n let template = $(`\n
    \n
    \n
    \n

    ${text('signInPage.emailVerificationCode')}

    \n
    \n
    \n \n
    \n
    \n `);\n\n let emailInput = new FloatingLabelInput({\n el: template.find('.emailContainer'),\n className: 'signInInput',\n id: 'email',\n label: text('signInPage.idc.Email'),\n type: 'text',\n }).render();\n\n container.append(template);\n if (this.ozoneData.forms.length > 1) {\n this._addSecondarySignIn('libraryCard');\n }\n\n this.el.focus();\n\n template.find('.signin-button').on('click', () => {\n this._checkValidEmail(emailInput, selectedForm.ilsName);\n });\n\n template.find('.signInInput input').on('keypress', (e) => {\n if (e.which === 13) {\n e.preventDefault();\n this._checkValidEmail(emailInput, selectedForm.ilsName);\n }\n });\n }\n\n _validateAndSignUp(requiredFieldInputs, optionalFieldInputs, idcResponse) {\n let valid = true;\n requiredFieldInputs.forEach((input) => {\n if (!input.validateNonEmpty()) {\n valid = false;\n }\n });\n\n if (!valid) {\n return;\n }\n\n this.el\n .find('.signin-button')\n .empty()\n .addClass('waiting')\n .append('
    ');\n\n if (this.idcCaptcha) {\n window.grecaptcha.execute();\n } else {\n this._signUp(requiredFieldInputs, optionalFieldInputs, idcResponse);\n }\n }\n\n _signUp(\n requiredFieldInputs,\n optionalFieldInputs,\n idcResponse,\n captchaCode = undefined\n ) {\n let userData = {};\n requiredFieldInputs.forEach((input) => {\n userData[input.$input.attr('id')] = input.$input.val();\n });\n\n optionalFieldInputs.forEach((input) => {\n userData[input.$input.attr('id')] = input.$input.val();\n });\n\n userData.PhoneToken = idcResponse.token;\n\n $.post(window.url(window.routes.rest.idc.phone.signUp), {\n userData: JSON.stringify(userData),\n ilsName: this.ozoneData.getACard.primary.ilsName,\n captchaCode,\n })\n .done((response) => {\n let successModal = new SignUpSuccessModal();\n window.globalEvents.trigger(\n 'signIn:mobileNum',\n window.OverDrive.libraryName\n );\n successModal.on('close', () => {\n this._idcSignIn(response);\n });\n })\n .fail((err) => {\n this.el\n .find('.signin-button')\n .empty()\n .removeClass('waiting')\n .append(text('signInPage.mobile.sendCode'));\n\n if (\n err.responseJSON.error.statusCode &&\n err.responseJSON.error.statusCode === 'Denied'\n ) {\n Logger.log('error', 'IDC sign-up step, user was denied', {\n message: err.responseText,\n });\n this._renderIdcDenied();\n } else {\n Logger.log('error', 'IDC sign-up step failed', {\n message: err.responseText,\n });\n this._showErrorMessage(\n text('signInPage.idc.signUpError', {\n link: `${text('signInPage.idc.contactLibrary')}`,\n })\n );\n }\n });\n }\n\n _validateAndSendCode(phoneNumberInput) {\n if (!phoneNumberInput.validate()) {\n return;\n }\n\n this.el\n .find('.signin-button')\n .empty()\n .addClass('waiting')\n .append('
    ');\n\n if (this.idcCaptcha) {\n window.grecaptcha.execute();\n } else {\n this._sendCode(phoneNumberInput);\n }\n }\n\n _validateAndResendCode(phoneNumber) {\n if (this.idcCaptcha) {\n window.grecaptcha.execute();\n } else {\n this._resendCode(phoneNumber);\n }\n }\n\n _sendCode(phoneNumberInput, captchaCode = undefined) {\n $.post(window.url(window.routes.rest.idc.phone.sendCode), {\n phoneNumber: phoneNumberInput.E164,\n captchaCode,\n })\n .done((response) => {\n window.globalEvents.trigger('mobile:register:code:sent');\n window.globalEvents.trigger(\n 'mobile:code:sent',\n window.OverDrive.libraryName\n );\n this._renderVerificationCodeInput(\n phoneNumberInput.displayValue,\n phoneNumberInput.E164,\n response\n );\n })\n .fail((err) => {\n this.el\n .find('.signin-button')\n .empty()\n .removeClass('waiting')\n .append(text('signInPage.mobile.sendCode'));\n Logger.log('error', 'Send IDC code to phone failed', {\n message: err.responseText,\n });\n this._showErrorMessage(text('signInPage.idc.errorSendingCode'));\n });\n }\n\n _resendCode(phoneNumber, captchaCode = undefined) {\n $.post(window.url(window.routes.rest.idc.phone.sendCode), {\n phoneNumber,\n captchaCode,\n })\n .done((response) => {\n window.globalEvents.trigger(\n 'mobile:code:resent',\n window.OverDrive.libraryName\n );\n window.globalEvents.trigger('mobile:register:code:resent');\n this._showCodeResentMessage();\n })\n .fail((err) => {\n Logger.log('error', 'Send IDC code to phone failed', {\n message: err.responseText,\n });\n this._showErrorMessage(text('signInPage.idc.errorSendingCode'));\n });\n }\n\n _verifyCode(codeInput, idcResponse) {\n if (!codeInput.validate()) {\n return;\n }\n window.globalEvents.trigger(\n 'mobile:code:verified',\n window.OverDrive.libraryName\n );\n window.globalEvents.trigger('mobile:register:code:verified');\n this.el\n .find('.signin-button')\n .empty()\n .addClass('waiting')\n .append('
    ');\n $.post(window.url(window.routes.rest.idc.phone.verifyCode), {\n code: codeInput.$input.val(),\n phoneE164: idcResponse.phoneE164,\n ilsName: this.ozoneData.getACard.primary.ilsName,\n })\n .done((response) => {\n if (response.status === 'SignInAvailable') {\n window.globalEvents.trigger('mobile:register:submit');\n this._idcSignIn(response);\n } else if (response.status === 'SignUpAvailable') {\n this._renderIdcAdditionalInfo(response);\n } else {\n console.log(response);\n }\n })\n .fail((err) => {\n if (\n window.featureManager.isEnabled('declineNewIdcLogin') &&\n !this.ozoneData.getACard.primary.signUp &&\n err.status === 400 &&\n err.responseJSON.error.status === 'Unavailable'\n ) {\n this._render();\n this._renderMobileNumberForm();\n this._showErrorMessage(\n text('signInPage.idc.numberNotKnown')\n );\n } else {\n this.el\n .find('.signin-button')\n .empty()\n .removeClass('waiting')\n .append(text('signInPage.mobile.sendCode'));\n Logger.log('error', 'Failed to verify IDC code', {\n message: err.responseText,\n });\n this._showErrorMessage(\n text('signInPage.idc.errorSendingCode')\n );\n }\n });\n }\n\n _checkValidEmail(emailInput, ilsName) {\n if (emailInput.validateNonEmpty()) {\n this.el\n .find('.signin-button')\n .empty()\n .addClass('waiting')\n .append('
    ');\n\n let userData = {\n Email: emailInput.$input.val(),\n };\n\n $.post(window.url(window.routes.rest.idc.signUp), {\n userData: JSON.stringify(userData),\n ilsName,\n })\n .done((response) => {\n window.globalEvents.trigger('signIn.email', ilsName);\n this._idcSignIn(response);\n })\n .fail((err) => {\n this.el\n .find('.signin-button')\n .empty()\n .removeClass('waiting')\n .append(text('signInPage.mobile.sendCode'));\n\n if (\n err.responseJSON.error.statusCode &&\n err.responseJSON.error.statusCode === 'Denied'\n ) {\n Logger.log('error', 'IDC email was not valid', {\n message: err.responseText,\n });\n this._showErrorMessage(\n text('signInPage.emailIneligible')\n );\n } else if (\n err.responseJSON.error.requiredFields &&\n err.responseJSON.error.requiredFields.includes(\n 'EmailToken'\n )\n ) {\n this._emailSendCode(emailInput, ilsName);\n } else {\n Logger.log(\n 'error',\n 'IDC check valid email step failed',\n { message: err.responseText }\n );\n this._showErrorMessage(\n text('signInPage.email.validationError')\n );\n }\n });\n }\n }\n\n _emailSignUp(ilsName, idcResponse) {\n this.el\n .find('.signin-button')\n .empty()\n .addClass('waiting')\n .append('
    ');\n\n let userData = {\n Email: idcResponse.email,\n EmailToken: idcResponse.emailToken,\n };\n\n $.post(window.url(window.routes.rest.idc.signUp), {\n userData: JSON.stringify(userData),\n ilsName,\n })\n .done((response) => {\n this._idcSignIn(response);\n })\n .fail((err) => {\n this.el\n .find('.signin-button')\n .empty()\n .removeClass('waiting')\n .append(text('signInPage.mobile.sendCode'));\n Logger.log('error', 'IDC email sign-up failed', {\n message: err.responseText,\n });\n this._showErrorMessage(\n text('signInPage.idc.signUpError', {\n link: `${text('signInPage.idc.contactLibrary')}`,\n })\n );\n });\n }\n\n _emailSendCode(emailInput, ilsName) {\n $.post(window.url(window.routes.rest.idc.email.sendCode), {\n emailAddress: emailInput.$input.val(),\n })\n .done((response) => {\n window.globalEvents.trigger('email:code:sent', ilsName);\n this._renderEmailVerificationCodeInput(\n emailInput.$input.val(),\n response,\n ilsName\n );\n })\n .fail((err) => {\n this.el\n .find('.signin-button')\n .empty()\n .removeClass('waiting')\n .append(text('signInPage.mobile.sendCode'));\n Logger.log('error', 'Send IDC code to email failed', {\n message: err.responseText,\n });\n this._showErrorMessage(text('signInPage.idc.errorSendingCode'));\n });\n }\n\n _resendEmailCode(emailAddress) {\n $.post(window.url(window.routes.rest.idc.email.sendCode), {\n emailAddress,\n })\n .done((response) => {\n window.globalEvents.trigger(\n 'email:code:resent',\n window.OverDrive.libraryName\n );\n this._showCodeResentMessage();\n })\n .fail((err) => {\n Logger.log('error', 'Send IDC code to email failed', {\n message: err.responseText,\n });\n this._showErrorMessage(text('signInPage.idc.errorSendingCode'));\n });\n }\n\n _emailVerifyCode(codeInput, idcResponse, ilsName) {\n if (codeInput.validate()) {\n window.globalEvents.trigger('email:code:verified', ilsName);\n this.el\n .find('.signin-button')\n .empty()\n .addClass('waiting')\n .append('
    ');\n $.post(window.url(window.routes.rest.idc.email.verifyCode), {\n code: codeInput.$input.val(),\n emailAddress: idcResponse.email,\n ilsName,\n })\n .done((response) => {\n this._emailSignUp(ilsName, response);\n })\n .fail((err) => {\n this.el\n .find('.signin-button')\n .empty()\n .removeClass('waiting')\n .append(text('signInPage.mobile.sendCode'));\n Logger.log('error', 'Failed to verify IDC email code', {\n message: err.responseText,\n });\n this._showErrorMessage(\n text('signInPage.idc.invalidVerify')\n );\n });\n }\n }\n\n _idcSignIn(idcResponse) {\n const $form = $(`\n
    \n \n \n \n \n
    \n `);\n\n this.el.append($form);\n\n $form.submit();\n }\n\n _showErrorMessage(message) {\n let template = $(`\n
    \n
    !
    \n

    ${message}

    \n
    \n `);\n\n this.el.find('.errorMessage').remove();\n this.el.find('.inputContainer').before(template);\n }\n\n _hideErrorMessage() {\n this.el.find('.errorMessage').remove();\n }\n\n _showCodeResentMessage() {\n let template = $(`\n
    \n

    ${text('signInPage.idc.newCodeSent')}\n \n \n \n \n \n \n \n \n

    \n
    \n `);\n this.el.find('.errorMessage').remove();\n this.el.find('.codeResent').remove();\n this.el.find('.inputContainer').before(template);\n }\n\n _renderRecaptcha(captchaElementId) {\n // There are some instances where recaptcha hasn't loaded yet. Once it loads, it'll automatically\n // render when it finds an element with the g-recaptcha class.\n if (\n typeof window.grecaptcha !== 'undefined' &&\n typeof window.grecaptcha.render !== 'undefined'\n ) {\n window.grecaptcha.render(captchaElementId, undefined, true);\n }\n }\n}\n","import SignInView from '../components/sign_in/SignIn';\n\n$(() => {\n const el = $('.SignInMainBody');\n let signInView = new SignInView(el, window.OverDrive.loginForms, window.OverDrive.forwardUrl,\n window.OverDrive.formKey, window.OverDrive.errorMessage,\n window.OverDrive.captchaRequired, window.OverDrive.showIdcSignUp,\n window.OverDrive.previousUsername, window.OverDrive.previousLibraryName,\n window.OverDrive.idcCaptchaRequired, window.OverDrive.idcCaptcha);\n signInView._render();\n});\n","const keys = Object.freeze({\n TAB: 9,\n ENTER: 13,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n SPACE: 32,\n ESC: 27\n});\nexport default keys;\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy55YXJuL2NhY2hlL2Jyb3dzZXItcGFjay1ucG0tNi4xLjAtNjc1NTdlMDExYi05ZTU5OTNkM2VlLnppcC9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvQXNZb3VUeXBlLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvQXNZb3VUeXBlRm9ybWF0dGVyLlBhdHRlcm5NYXRjaGVyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvQXNZb3VUeXBlRm9ybWF0dGVyLlBhdHRlcm5QYXJzZXIuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9Bc1lvdVR5cGVGb3JtYXR0ZXIuY29tcGxldGUuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9Bc1lvdVR5cGVGb3JtYXR0ZXIuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9Bc1lvdVR5cGVGb3JtYXR0ZXIudXRpbC5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL0FzWW91VHlwZVBhcnNlci5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL0FzWW91VHlwZVN0YXRlLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvUGFyc2VFcnJvci5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL1Bob25lTnVtYmVyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvUGhvbmVOdW1iZXJNYXRjaGVyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvY29uc3RhbnRzLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvZmluZE51bWJlcnMvTFJVQ2FjaGUuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9maW5kTnVtYmVycy9MZW5pZW5jeS5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2ZpbmROdW1iZXJzL1JlZ0V4cENhY2hlLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvZmluZE51bWJlcnMvaXNWYWxpZENhbmRpZGF0ZS5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2ZpbmROdW1iZXJzL2lzVmFsaWRQcmVDYW5kaWRhdGUuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9maW5kTnVtYmVycy9tYXRjaFBob25lTnVtYmVyU3RyaW5nQWdhaW5zdFBob25lTnVtYmVyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvZmluZE51bWJlcnMvcGFyc2VQcmVDYW5kaWRhdGUuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9maW5kTnVtYmVycy91dGYtOC5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2ZpbmROdW1iZXJzL3V0aWwuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9maW5kUGhvbmVOdW1iZXJzSW5UZXh0LmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvZm9ybWF0LmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvZm9ybWF0SW5jb21wbGV0ZVBob25lTnVtYmVyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvZ2V0Q291bnRyaWVzLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvZ2V0Q291bnRyeUNhbGxpbmdDb2RlLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvZ2V0RXhhbXBsZU51bWJlci5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2hlbHBlcnMvUkZDMzk2Ni5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2hlbHBlcnMvYXBwbHlJbnRlcm5hdGlvbmFsU2VwYXJhdG9yU3R5bGUuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9oZWxwZXJzL2NoZWNrTnVtYmVyTGVuZ3RoLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvaGVscGVycy9leHRlbnNpb24vY3JlYXRlRXh0ZW5zaW9uUGF0dGVybi5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2hlbHBlcnMvZXh0ZW5zaW9uL2V4dHJhY3RFeHRlbnNpb24uanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9oZWxwZXJzL2V4dHJhY3RDb3VudHJ5Q2FsbGluZ0NvZGUuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9oZWxwZXJzL2V4dHJhY3RDb3VudHJ5Q2FsbGluZ0NvZGVGcm9tSW50ZXJuYXRpb25hbE51bWJlcldpdGhvdXRQbHVzU2lnbi5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2hlbHBlcnMvZXh0cmFjdEZvcm1hdHRlZFBob25lTnVtYmVyRnJvbVBvc3NpYmxlUmZjMzk2Nk51bWJlclVyaS5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2hlbHBlcnMvZXh0cmFjdE5hdGlvbmFsTnVtYmVyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvaGVscGVycy9leHRyYWN0TmF0aW9uYWxOdW1iZXJGcm9tUG9zc2libHlJbmNvbXBsZXRlTnVtYmVyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvaGVscGVycy9leHRyYWN0UGhvbmVDb250ZXh0LmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvaGVscGVycy9mb3JtYXROYXRpb25hbE51bWJlclVzaW5nRm9ybWF0LmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvaGVscGVycy9nZXRDb3VudHJ5QnlDYWxsaW5nQ29kZS5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2hlbHBlcnMvZ2V0Q291bnRyeUJ5TmF0aW9uYWxOdW1iZXIuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9oZWxwZXJzL2dldElkZFByZWZpeC5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2hlbHBlcnMvZ2V0TnVtYmVyVHlwZS5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2hlbHBlcnMvZ2V0UG9zc2libGVDb3VudHJpZXNGb3JOdW1iZXIuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9oZWxwZXJzL2lzVmlhYmxlUGhvbmVOdW1iZXIuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9oZWxwZXJzL21hdGNoZXNFbnRpcmVseS5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2hlbHBlcnMvbWVyZ2VBcnJheXMuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9oZWxwZXJzL3BhcnNlRGlnaXRzLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvaGVscGVycy9zdHJpcElkZFByZWZpeC5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2lzUG9zc2libGUuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9pc1Bvc3NpYmxlUGhvbmVOdW1iZXIuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9pc1ZhbGlkLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvaXNWYWxpZFBob25lTnVtYmVyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvbGVnYWN5L2ZpbmROdW1iZXJzLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvbGVnYWN5L2ZpbmRQaG9uZU51bWJlcnMuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9sZWdhY3kvZmluZFBob25lTnVtYmVyc0luaXRpYWxJbXBsZW1lbnRhdGlvbi5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2xlZ2FjeS9mb3JtYXQuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9sZWdhY3kvZ2V0TnVtYmVyVHlwZS5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2xlZ2FjeS9pc1Bvc3NpYmxlTnVtYmVyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvbGVnYWN5L2lzVmFsaWROdW1iZXIuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9sZWdhY3kvaXNWYWxpZE51bWJlckZvclJlZ2lvbi5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2xlZ2FjeS9pc1ZhbGlkTnVtYmVyRm9yUmVnaW9uXy5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2xlZ2FjeS9wYXJzZS5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL2xlZ2FjeS9zZWFyY2hOdW1iZXJzLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvbWV0YWRhdGEuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9ub3JtYWxpemVBcmd1bWVudHMuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9wYXJzZS5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL3BhcnNlSW5jb21wbGV0ZVBob25lTnVtYmVyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvcGFyc2VQaG9uZU51bWJlci5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL3BhcnNlUGhvbmVOdW1iZXJXaXRoRXJyb3IuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC9wYXJzZVBob25lTnVtYmVyV2l0aEVycm9yXy5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2J1aWxkL3BhcnNlUGhvbmVOdW1iZXJfLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvc2VhcmNoUGhvbmVOdW1iZXJzSW5UZXh0LmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvYnVpbGQvdG9vbHMvc2VtdmVyLWNvbXBhcmUuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9idWlsZC92YWxpZGF0ZVBob25lTnVtYmVyTGVuZ3RoLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbGlicGhvbmVudW1iZXItanMtbnBtLTEuMTAuMjYtZDUzZDk1NjU3OC0xMjVjYmU2MGVhLnppcC9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvY29yZS9pbmRleC5janMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9pbmRleC5janMiLCIuLi8uLi8ueWFybi9jYWNoZS9saWJwaG9uZW51bWJlci1qcy1ucG0tMS4xMC4yNi1kNTNkOTU2NTc4LTEyNWNiZTYwZWEuemlwL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9tZXRhZGF0YS5taW4uanNvbiIsIi4uLy4uLy55YXJuL2NhY2hlL2xpYnBob25lbnVtYmVyLWpzLW5wbS0xLjEwLjI2LWQ1M2Q5NTY1NzgtMTI1Y2JlNjBlYS56aXAvbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL21pbi9pbmRleC5janMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2NvbW1vbi9BdXRvQ29tcGxldGVJbnB1dC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvY29tbW9uL0Zsb2F0aW5nTGFiZWxJbnB1dC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvY29tbW9uL1Bob25lTnVtYmVySW5wdXQuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2NvbW1vbi9WZXJpZmljYXRpb25Db2RlSW5wdXQuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2NvbW1vbi9tb2RhbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvY29tbW9uL3RlbXBsYXRlcy9tb2RhbC5odG1sLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9pZGNfc2lnbnVwX3N1Y2Nlc3NfbW9kYWwvU2lnblVwU3VjY2Vzc01vZGFsLmh0bWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2lkY19zaWdudXBfc3VjY2Vzc19tb2RhbC9TaWduVXBTdWNjZXNzTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL3NpZ25faW4vU2lnbkluLmpzIiwicHVibGljL2VjbWFzY3JpcHQvcGFnZXMvc2lnbl9pbl9wYWdlLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9rZXljb2Rlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3J3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdHFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0hBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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RUFBZixFQUFtQixPQUFPLFNBQVAsQ0FBaUIsVUFBcEMsRUFBZ0QsT0FBTyxTQUFQLENBQWlCLFVBQWpFLEVBQ2UsT0FBTyxTQUFQLENBQWlCLE9BRGhDLEVBQ3lDLE9BQU8sU0FBUCxDQUFpQixZQUQxRCxFQUVlLE9BQU8sU0FBUCxDQUFpQixlQUZoQyxFQUVpRCxPQUFPLFNBQVAsQ0FBaUIsYUFGbEUsRUFHZSxPQUFPLFNBQVAsQ0FBaUIsZ0JBSGhDLEVBR2tELE9BQU8sU0FBUCxDQUFpQixtQkFIbkUsRUFJZSxPQUFPLFNBQVAsQ0FBaUIsa0JBSmhDLEVBSW9ELE9BQU8sU0FBUCxDQUFpQixVQUpyRSxDQUFqQjtBQUtBLDJDQUFXLE9BQVg7QUFDSCxDQVJEOzs7Ozs7OztBQ0ZBLElBQU0sT0FBTyxPQUFPLE1BQVAsQ0FBYztBQUN2QixTQUFLLENBRGtCO0FBRXZCLFdBQU8sRUFGZ0I7QUFHdkIsVUFBTSxFQUhpQjtBQUl2QixRQUFJLEVBSm1CO0FBS3ZCLFdBQU8sRUFMZ0I7QUFNdkIsVUFBTSxFQU5pQjtBQU92QixXQUFPLEVBUGdCO0FBUXZCLFNBQUs7QUFSa0IsQ0FBZCxDQUFiO3FCQVVlLEkiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX21ldGFkYXRhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9tZXRhZGF0YS5qc1wiKSk7XG5cbnZhciBfUGhvbmVOdW1iZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1Bob25lTnVtYmVyLmpzXCIpKTtcblxudmFyIF9Bc1lvdVR5cGVTdGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQXNZb3VUeXBlU3RhdGUuanNcIikpO1xuXG52YXIgX0FzWW91VHlwZUZvcm1hdHRlciA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL0FzWW91VHlwZUZvcm1hdHRlci5qc1wiKSk7XG5cbnZhciBfQXNZb3VUeXBlUGFyc2VyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vQXNZb3VUeXBlUGFyc2VyLmpzXCIpKTtcblxudmFyIF9nZXRDb3VudHJ5QnlDYWxsaW5nQ29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaGVscGVycy9nZXRDb3VudHJ5QnlDYWxsaW5nQ29kZS5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkgeyBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBcImRlZmF1bHRcIjogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9LCBfdHlwZW9mKG9iaik7IH1cblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9pID0gYXJyID09IG51bGwgPyBudWxsIDogdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAoX2kgPT0gbnVsbCkgcmV0dXJuOyB2YXIgX2FyciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9zLCBfZTsgdHJ5IHsgZm9yIChfaSA9IF9pLmNhbGwoYXJyKTsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciBVU0VfTk9OX0dFT0dSQVBISUNfQ09VTlRSWV9DT0RFID0gZmFsc2U7XG5cbnZhciBBc1lvdVR5cGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAcGFyYW0geyhzdHJpbmd8b2JqZWN0KT99IFtvcHRpb25zT3JEZWZhdWx0Q291bnRyeV0gLSBUaGUgZGVmYXVsdCBjb3VudHJ5IHVzZWQgZm9yIHBhcnNpbmcgbm9uLWludGVybmF0aW9uYWwgcGhvbmUgbnVtYmVycy4gQ2FuIGFsc28gYmUgYW4gYG9wdGlvbnNgIG9iamVjdC5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gbWV0YWRhdGFcclxuICAgKi9cbiAgZnVuY3Rpb24gQXNZb3VUeXBlKG9wdGlvbnNPckRlZmF1bHRDb3VudHJ5LCBtZXRhZGF0YSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBc1lvdVR5cGUpO1xuXG4gICAgdGhpcy5tZXRhZGF0YSA9IG5ldyBfbWV0YWRhdGFbXCJkZWZhdWx0XCJdKG1ldGFkYXRhKTtcblxuICAgIHZhciBfdGhpcyRnZXRDb3VudHJ5QW5kQ2EgPSB0aGlzLmdldENvdW50cnlBbmRDYWxsaW5nQ29kZShvcHRpb25zT3JEZWZhdWx0Q291bnRyeSksXG4gICAgICAgIF90aGlzJGdldENvdW50cnlBbmRDYTIgPSBfc2xpY2VkVG9BcnJheShfdGhpcyRnZXRDb3VudHJ5QW5kQ2EsIDIpLFxuICAgICAgICBkZWZhdWx0Q291bnRyeSA9IF90aGlzJGdldENvdW50cnlBbmRDYTJbMF0sXG4gICAgICAgIGRlZmF1bHRDYWxsaW5nQ29kZSA9IF90aGlzJGdldENvdW50cnlBbmRDYTJbMV07XG5cbiAgICB0aGlzLmRlZmF1bHRDb3VudHJ5ID0gZGVmYXVsdENvdW50cnk7XG4gICAgdGhpcy5kZWZhdWx0Q2FsbGluZ0NvZGUgPSBkZWZhdWx0Q2FsbGluZ0NvZGU7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFzWW91VHlwZSwgW3tcbiAgICBrZXk6IFwiZ2V0Q291bnRyeUFuZENhbGxpbmdDb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvdW50cnlBbmRDYWxsaW5nQ29kZShvcHRpb25zT3JEZWZhdWx0Q291bnRyeSkge1xuICAgICAgLy8gU2V0IGBkZWZhdWx0Q291bnRyeWAgYW5kIGBkZWZhdWx0Q2FsbGluZ0NvZGVgIG9wdGlvbnMuXG4gICAgICB2YXIgZGVmYXVsdENvdW50cnk7XG4gICAgICB2YXIgZGVmYXVsdENhbGxpbmdDb2RlOyAvLyBUdXJucyBvdXQgYG51bGxgIGFsc28gaGFzIHR5cGUgXCJvYmplY3RcIi4gV2VpcmQuXG5cbiAgICAgIGlmIChvcHRpb25zT3JEZWZhdWx0Q291bnRyeSkge1xuICAgICAgICBpZiAoX3R5cGVvZihvcHRpb25zT3JEZWZhdWx0Q291bnRyeSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZGVmYXVsdENvdW50cnkgPSBvcHRpb25zT3JEZWZhdWx0Q291bnRyeS5kZWZhdWx0Q291bnRyeTtcbiAgICAgICAgICBkZWZhdWx0Q2FsbGluZ0NvZGUgPSBvcHRpb25zT3JEZWZhdWx0Q291bnRyeS5kZWZhdWx0Q2FsbGluZ0NvZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVmYXVsdENvdW50cnkgPSBvcHRpb25zT3JEZWZhdWx0Q291bnRyeTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZGVmYXVsdENvdW50cnkgJiYgIXRoaXMubWV0YWRhdGEuaGFzQ291bnRyeShkZWZhdWx0Q291bnRyeSkpIHtcbiAgICAgICAgZGVmYXVsdENvdW50cnkgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWZhdWx0Q2FsbGluZ0NvZGUpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChVU0VfTk9OX0dFT0dSQVBISUNfQ09VTlRSWV9DT0RFKSB7XG4gICAgICAgICAgaWYgKHRoaXMubWV0YWRhdGEuaXNOb25HZW9ncmFwaGljQ2FsbGluZ0NvZGUoZGVmYXVsdENhbGxpbmdDb2RlKSkge1xuICAgICAgICAgICAgZGVmYXVsdENvdW50cnkgPSAnMDAxJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtkZWZhdWx0Q291bnRyeSwgZGVmYXVsdENhbGxpbmdDb2RlXTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJbnB1dHMgXCJuZXh0XCIgcGhvbmUgbnVtYmVyIGNoYXJhY3RlcnMuXHJcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHRleHRcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIHBob25lIG51bWJlciBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBiZWVuIGlucHV0IHNvIGZhci5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5wdXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5wdXQodGV4dCkge1xuICAgICAgdmFyIF90aGlzJHBhcnNlciRpbnB1dCA9IHRoaXMucGFyc2VyLmlucHV0KHRleHQsIHRoaXMuc3RhdGUpLFxuICAgICAgICAgIGRpZ2l0cyA9IF90aGlzJHBhcnNlciRpbnB1dC5kaWdpdHMsXG4gICAgICAgICAganVzdExlYWRpbmdQbHVzID0gX3RoaXMkcGFyc2VyJGlucHV0Lmp1c3RMZWFkaW5nUGx1cztcblxuICAgICAgaWYgKGp1c3RMZWFkaW5nUGx1cykge1xuICAgICAgICB0aGlzLmZvcm1hdHRlZE91dHB1dCA9ICcrJztcbiAgICAgIH0gZWxzZSBpZiAoZGlnaXRzKSB7XG4gICAgICAgIHRoaXMuZGV0ZXJtaW5lVGhlQ291bnRyeUlmTmVlZGVkKCk7IC8vIE1hdGNoIHRoZSBhdmFpbGFibGUgZm9ybWF0cyBieSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBsZWFkaW5nIGRpZ2l0cy5cblxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKSB7XG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZXIubmFycm93RG93bk1hdGNoaW5nRm9ybWF0cyh0aGlzLnN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmb3JtYXR0ZWROYXRpb25hbE51bWJlcjtcblxuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YS5oYXNTZWxlY3RlZE51bWJlcmluZ1BsYW4oKSkge1xuICAgICAgICAgIGZvcm1hdHRlZE5hdGlvbmFsTnVtYmVyID0gdGhpcy5mb3JtYXR0ZXIuZm9ybWF0KGRpZ2l0cywgdGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9ybWF0dGVkTmF0aW9uYWxOdW1iZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFNlZSBpZiBhbm90aGVyIG5hdGlvbmFsIChzaWduaWZpY2FudCkgbnVtYmVyIGNvdWxkIGJlIHJlLWV4dHJhY3RlZC5cbiAgICAgICAgICBpZiAodGhpcy5wYXJzZXIucmVFeHRyYWN0TmF0aW9uYWxTaWduaWZpY2FudE51bWJlcih0aGlzLnN0YXRlKSkge1xuICAgICAgICAgICAgdGhpcy5kZXRlcm1pbmVUaGVDb3VudHJ5SWZOZWVkZWQoKTsgLy8gSWYgaXQgY291bGQsIHRoZW4gcmUtdHJ5IGZvcm1hdHRpbmcgdGhlIG5ldyBuYXRpb25hbCAoc2lnbmlmaWNhbnQpIG51bWJlci5cblxuICAgICAgICAgICAgdmFyIG5hdGlvbmFsRGlnaXRzID0gdGhpcy5zdGF0ZS5nZXROYXRpb25hbERpZ2l0cygpO1xuXG4gICAgICAgICAgICBpZiAobmF0aW9uYWxEaWdpdHMpIHtcbiAgICAgICAgICAgICAgZm9ybWF0dGVkTmF0aW9uYWxOdW1iZXIgPSB0aGlzLmZvcm1hdHRlci5mb3JtYXQobmF0aW9uYWxEaWdpdHMsIHRoaXMuc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybWF0dGVkT3V0cHV0ID0gZm9ybWF0dGVkTmF0aW9uYWxOdW1iZXIgPyB0aGlzLmdldEZ1bGxOdW1iZXIoZm9ybWF0dGVkTmF0aW9uYWxOdW1iZXIpIDogdGhpcy5nZXROb25Gb3JtYXR0ZWROdW1iZXIoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkT3V0cHV0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuc3RhdGUgPSBuZXcgX0FzWW91VHlwZVN0YXRlW1wiZGVmYXVsdFwiXSh7XG4gICAgICAgIG9uQ291bnRyeUNoYW5nZTogZnVuY3Rpb24gb25Db3VudHJ5Q2hhbmdlKGNvdW50cnkpIHtcbiAgICAgICAgICAvLyBCZWZvcmUgdmVyc2lvbiBgMS42LjBgLCB0aGUgb2ZmaWNpYWwgYEFzWW91VHlwZWAgZm9ybWF0dGVyIEFQSVxuICAgICAgICAgIC8vIGluY2x1ZGVkIHRoZSBgLmNvdW50cnlgIHByb3BlcnR5IG9mIGFuIGBBc1lvdVR5cGVgIGluc3RhbmNlLlxuICAgICAgICAgIC8vIFNpbmNlIHRoYXQgcHJvcGVydHkgKGFsb25nIHdpdGggdGhlIG90aGVycykgaGF2ZSBiZWVuIG1vdmVkIHRvXG4gICAgICAgICAgLy8gYHRoaXMuc3RhdGVgLCBgdGhpcy5jb3VudHJ5YCBwcm9wZXJ0eSBpcyBlbXVsYXRlZCBmb3IgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIC8vIHdpdGggdGhlIG9sZCB2ZXJzaW9ucy5cbiAgICAgICAgICBfdGhpcy5jb3VudHJ5ID0gY291bnRyeTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DYWxsaW5nQ29kZUNoYW5nZTogZnVuY3Rpb24gb25DYWxsaW5nQ29kZUNoYW5nZShjYWxsaW5nQ29kZSwgY291bnRyeSkge1xuICAgICAgICAgIF90aGlzLm1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oY291bnRyeSwgY2FsbGluZ0NvZGUpO1xuXG4gICAgICAgICAgX3RoaXMuZm9ybWF0dGVyLnJlc2V0KF90aGlzLm1ldGFkYXRhLm51bWJlcmluZ1BsYW4sIF90aGlzLnN0YXRlKTtcblxuICAgICAgICAgIF90aGlzLnBhcnNlci5yZXNldChfdGhpcy5tZXRhZGF0YS5udW1iZXJpbmdQbGFuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvcm1hdHRlciA9IG5ldyBfQXNZb3VUeXBlRm9ybWF0dGVyW1wiZGVmYXVsdFwiXSh7XG4gICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YVxuICAgICAgfSk7XG4gICAgICB0aGlzLnBhcnNlciA9IG5ldyBfQXNZb3VUeXBlUGFyc2VyW1wiZGVmYXVsdFwiXSh7XG4gICAgICAgIGRlZmF1bHRDb3VudHJ5OiB0aGlzLmRlZmF1bHRDb3VudHJ5LFxuICAgICAgICBkZWZhdWx0Q2FsbGluZ0NvZGU6IHRoaXMuZGVmYXVsdENhbGxpbmdDb2RlLFxuICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgIG9uTmF0aW9uYWxTaWduaWZpY2FudE51bWJlckNoYW5nZTogZnVuY3Rpb24gb25OYXRpb25hbFNpZ25pZmljYW50TnVtYmVyQ2hhbmdlKCkge1xuICAgICAgICAgIF90aGlzLmRldGVybWluZVRoZUNvdW50cnlJZk5lZWRlZCgpO1xuXG4gICAgICAgICAgX3RoaXMuZm9ybWF0dGVyLnJlc2V0KF90aGlzLm1ldGFkYXRhLm51bWJlcmluZ1BsYW4sIF90aGlzLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnN0YXRlLnJlc2V0KHtcbiAgICAgICAgY291bnRyeTogdGhpcy5kZWZhdWx0Q291bnRyeSxcbiAgICAgICAgY2FsbGluZ0NvZGU6IHRoaXMuZGVmYXVsdENhbGxpbmdDb2RlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZm9ybWF0dGVkT3V0cHV0ID0gJyc7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGhvbmUgbnVtYmVyIGlzIGJlaW5nIGlucHV0IGluIGludGVybmF0aW9uYWwgZm9ybWF0LlxyXG4gICAgICogSW4gb3RoZXIgd29yZHMsIHJldHVybnMgYHRydWVgIGlmIGFuZCBvbmx5IGlmIHRoZSBwYXJzZWQgcGhvbmUgbnVtYmVyIHN0YXJ0cyB3aXRoIGEgYFwiK1wiYC5cclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzSW50ZXJuYXRpb25hbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0ludGVybmF0aW9uYWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pbnRlcm5hdGlvbmFsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIFwiY2FsbGluZyBjb2RlXCIgcGFydCBvZiB0aGUgcGhvbmUgbnVtYmVyIHdoZW4gaXQncyBiZWluZyBpbnB1dFxyXG4gICAgICogaW4gYW4gaW50ZXJuYXRpb25hbCBmb3JtYXQuXHJcbiAgICAgKiBJZiBubyB2YWxpZCBjYWxsaW5nIGNvZGUgaGFzIGJlZW4gZW50ZXJlZCBzbyBmYXIsIHJldHVybnMgYHVuZGVmaW5lZGAuXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFtjYWxsaW5nQ29kZV1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2FsbGluZ0NvZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2FsbGluZ0NvZGUoKSB7XG4gICAgICAvLyBJZiB0aGUgbnVtYmVyIGlzIGJlaW5nIGlucHV0IGluIG5hdGlvbmFsIGZvcm1hdCBhbmQgc29tZSBcImRlZmF1bHQgY2FsbGluZyBjb2RlXCJcbiAgICAgIC8vIGhhcyBiZWVuIHBhc3NlZCB0byBgQXNZb3VUeXBlYCBjb25zdHJ1Y3RvciwgdGhlbiBgdGhpcy5zdGF0ZS5jYWxsaW5nQ29kZWBcbiAgICAgIC8vIGlzIGVxdWFsIHRvIHRoYXQgXCJkZWZhdWx0IGNhbGxpbmcgY29kZVwiLlxuICAgICAgLy9cbiAgICAgIC8vIElmIHRoZSBudW1iZXIgaXMgYmVpbmcgaW5wdXQgaW4gbmF0aW9uYWwgZm9ybWF0IGFuZCBubyBcImRlZmF1bHQgY2FsbGluZyBjb2RlXCJcbiAgICAgIC8vIGhhcyBiZWVuIHBhc3NlZCB0byBgQXNZb3VUeXBlYCBjb25zdHJ1Y3RvciwgdGhlbiByZXR1cm5zIGB1bmRlZmluZWRgLFxuICAgICAgLy8gZXZlbiBpZiBhIFwiZGVmYXVsdCBjb3VudHJ5XCIgaGFzIGJlZW4gcGFzc2VkIHRvIGBBc1lvdVR5cGVgIGNvbnN0cnVjdG9yLlxuICAgICAgLy9cbiAgICAgIGlmICh0aGlzLmlzSW50ZXJuYXRpb25hbCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmNhbGxpbmdDb2RlO1xuICAgICAgfVxuICAgIH0gLy8gQSBsZWdhY3kgYWxpYXMuXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRDb3VudHJ5Q2FsbGluZ0NvZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q291bnRyeUNhbGxpbmdDb2RlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FsbGluZ0NvZGUoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUgb2YgdGhlIHBob25lIG51bWJlci5cclxuICAgICAqIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIFwibm9uLWdlb2dyYXBoaWNcIiBwaG9uZSBudW1iZXJpbmcgcGxhbnMuXHJcbiAgICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIG5vIHBob25lIG51bWJlciBoYXMgYmVlbiBpbnB1dCB5ZXQuXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFtjb3VudHJ5XVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRDb3VudHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvdW50cnkoKSB7XG4gICAgICB2YXIgZGlnaXRzID0gdGhpcy5zdGF0ZS5kaWdpdHM7IC8vIFJldHVybiBgdW5kZWZpbmVkYCBpZiBubyBkaWdpdHMgaGF2ZSBiZWVuIGlucHV0IHlldC5cblxuICAgICAgaWYgKGRpZ2l0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q291bnRyeSgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSBvZiB0aGUgcGhvbmUgbnVtYmVyLlxyXG4gICAgICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgXCJub24tZ2VvZ3JhcGhpY1wiIHBob25lIG51bWJlcmluZyBwbGFucy5cclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gW2NvdW50cnldXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRDb3VudHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRDb3VudHJ5KCkge1xuICAgICAgdmFyIGNvdW50cnkgPSB0aGlzLnN0YXRlLmNvdW50cnk7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cblxuICAgICAgaWYgKFVTRV9OT05fR0VPR1JBUEhJQ19DT1VOVFJZX0NPREUpIHtcbiAgICAgICAgLy8gYEFzWW91VHlwZS5nZXRDb3VudHJ5KClgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgICAgLy8gZm9yIFwibm9uLWdlb2dyYXBoaWNcIiBwaG9uZSBudW1iZXJpbmcgcGxhbnMuXG4gICAgICAgIGlmIChjb3VudHJ5ID09PSAnMDAxJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY291bnRyeTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGV0ZXJtaW5lVGhlQ291bnRyeUlmTmVlZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGVybWluZVRoZUNvdW50cnlJZk5lZWRlZCgpIHtcbiAgICAgIC8vIFN1cHBvc2UgYSB1c2VyIGVudGVycyBhIHBob25lIG51bWJlciBpbiBpbnRlcm5hdGlvbmFsIGZvcm1hdCxcbiAgICAgIC8vIGFuZCB0aGVyZSdyZSBzZXZlcmFsIGNvdW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHRoYXQgY291bnRyeSBjYWxsaW5nIGNvZGUsXG4gICAgICAvLyBhbmQgYSBjb3VudHJ5IGhhcyBiZWVuIGRlcml2ZWQgZnJvbSB0aGUgbnVtYmVyLCBhbmQgdGhlblxuICAgICAgLy8gYSB1c2VyIGVudGVycyBvbmUgbW9yZSBkaWdpdCBhbmQgdGhlIG51bWJlciBpcyBubyBsb25nZXJcbiAgICAgIC8vIHZhbGlkIGZvciB0aGUgZGVyaXZlZCBjb3VudHJ5LCBzbyB0aGUgY291bnRyeSBzaG91bGQgYmUgcmUtZGVyaXZlZFxuICAgICAgLy8gb24gZXZlcnkgbmV3IGRpZ2l0IGluIHRob3NlIGNhc2VzLlxuICAgICAgLy9cbiAgICAgIC8vIElmIHRoZSBwaG9uZSBudW1iZXIgaXMgYmVpbmcgaW5wdXQgaW4gbmF0aW9uYWwgZm9ybWF0LFxuICAgICAgLy8gdGhlbiBpdCBjb3VsZCBiZSBhIGNhc2Ugd2hlbiBgZGVmYXVsdENvdW50cnlgIHdhc24ndCBzcGVjaWZpZWRcbiAgICAgIC8vIHdoZW4gY3JlYXRpbmcgYEFzWW91VHlwZWAgaW5zdGFuY2UsIGFuZCBqdXN0IGBkZWZhdWx0Q2FsbGluZ0NvZGVgIHdhcyBzcGVjaWZpZWQsXG4gICAgICAvLyBhbmQgdGhhdCBcImNhbGxpbmcgY29kZVwiIGNvdWxkIGNvcnJlc3BvbmQgdG8gYSBcIm5vbi1nZW9ncmFwaGljIGVudGl0eVwiLFxuICAgICAgLy8gb3IgdGhlcmUgY291bGQgYmUgc2V2ZXJhbCBjb3VudHJpZXMgY29ycmVzcG9uZGluZyB0byB0aGF0IGNvdW50cnkgY2FsbGluZyBjb2RlLlxuICAgICAgLy8gSW4gdGhvc2UgY2FzZXMsIGB0aGlzLmNvdW50cnlgIGlzIGB1bmRlZmluZWRgIGFuZCBzaG91bGQgYmUgZGVyaXZlZFxuICAgICAgLy8gZnJvbSB0aGUgbnVtYmVyLiBBZ2FpbiwgaWYgY291bnRyeSBjYWxsaW5nIGNvZGUgaXMgYW1iaWd1b3VzLCB0aGVuXG4gICAgICAvLyBgdGhpcy5jb3VudHJ5YCBzaG91bGQgYmUgcmUtZGVyaXZlZCB3aXRoIGVhY2ggbmV3IGRpZ2l0LlxuICAgICAgLy9cbiAgICAgIGlmICghdGhpcy5zdGF0ZS5jb3VudHJ5IHx8IHRoaXMuaXNDb3VudHJ5Q2FsbGluZ0NvZGVBbWJpZ3VvdXMoKSkge1xuICAgICAgICB0aGlzLmRldGVybWluZVRoZUNvdW50cnkoKTtcbiAgICAgIH1cbiAgICB9IC8vIFByZXBlbmRzIGArQ291bnRyeUNvZGUgYCBpbiBjYXNlIG9mIGFuIGludGVybmF0aW9uYWwgcGhvbmUgbnVtYmVyXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRGdWxsTnVtYmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZ1bGxOdW1iZXIoZm9ybWF0dGVkTmF0aW9uYWxOdW1iZXIpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5pc0ludGVybmF0aW9uYWwoKSkge1xuICAgICAgICB2YXIgcHJlZml4ID0gZnVuY3Rpb24gcHJlZml4KHRleHQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLmZvcm1hdHRlci5nZXRJbnRlcm5hdGlvbmFsUHJlZml4QmVmb3JlQ291bnRyeUNhbGxpbmdDb2RlKF90aGlzMi5zdGF0ZSwge1xuICAgICAgICAgICAgc3BhY2luZzogdGV4dCA/IHRydWUgOiBmYWxzZVxuICAgICAgICAgIH0pICsgdGV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgY2FsbGluZ0NvZGUgPSB0aGlzLnN0YXRlLmNhbGxpbmdDb2RlO1xuXG4gICAgICAgIGlmICghY2FsbGluZ0NvZGUpIHtcbiAgICAgICAgICByZXR1cm4gcHJlZml4KFwiXCIuY29uY2F0KHRoaXMuc3RhdGUuZ2V0RGlnaXRzV2l0aG91dEludGVybmF0aW9uYWxQcmVmaXgoKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmb3JtYXR0ZWROYXRpb25hbE51bWJlcikge1xuICAgICAgICAgIHJldHVybiBwcmVmaXgoY2FsbGluZ0NvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZWZpeChcIlwiLmNvbmNhdChjYWxsaW5nQ29kZSwgXCIgXCIpLmNvbmNhdChmb3JtYXR0ZWROYXRpb25hbE51bWJlcikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybWF0dGVkTmF0aW9uYWxOdW1iZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE5vbkZvcm1hdHRlZE5hdGlvbmFsTnVtYmVyV2l0aFByZWZpeFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROb25Gb3JtYXR0ZWROYXRpb25hbE51bWJlcldpdGhQcmVmaXgoKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICAgIG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIgPSBfdGhpcyRzdGF0ZS5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyLFxuICAgICAgICAgIGNvbXBsZXhQcmVmaXhCZWZvcmVOYXRpb25hbFNpZ25pZmljYW50TnVtYmVyID0gX3RoaXMkc3RhdGUuY29tcGxleFByZWZpeEJlZm9yZU5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIsXG4gICAgICAgICAgbmF0aW9uYWxQcmVmaXggPSBfdGhpcyRzdGF0ZS5uYXRpb25hbFByZWZpeDtcbiAgICAgIHZhciBudW1iZXIgPSBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyO1xuICAgICAgdmFyIHByZWZpeCA9IGNvbXBsZXhQcmVmaXhCZWZvcmVOYXRpb25hbFNpZ25pZmljYW50TnVtYmVyIHx8IG5hdGlvbmFsUHJlZml4O1xuXG4gICAgICBpZiAocHJlZml4KSB7XG4gICAgICAgIG51bWJlciA9IHByZWZpeCArIG51bWJlcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Tm9uRm9ybWF0dGVkTnVtYmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5vbkZvcm1hdHRlZE51bWJlcigpIHtcbiAgICAgIHZhciBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyTWF0Y2hlc0lucHV0ID0gdGhpcy5zdGF0ZS5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyTWF0Y2hlc0lucHV0O1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RnVsbE51bWJlcihuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyTWF0Y2hlc0lucHV0ID8gdGhpcy5nZXROb25Gb3JtYXR0ZWROYXRpb25hbE51bWJlcldpdGhQcmVmaXgoKSA6IHRoaXMuc3RhdGUuZ2V0TmF0aW9uYWxEaWdpdHMoKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE5vbkZvcm1hdHRlZFRlbXBsYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5vbkZvcm1hdHRlZFRlbXBsYXRlKCkge1xuICAgICAgdmFyIG51bWJlciA9IHRoaXMuZ2V0Tm9uRm9ybWF0dGVkTnVtYmVyKCk7XG5cbiAgICAgIGlmIChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlci5yZXBsYWNlKC9bXFwrXFxkXS9nLCBfQXNZb3VUeXBlRm9ybWF0dGVyLkRJR0lUX1BMQUNFSE9MREVSKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNDb3VudHJ5Q2FsbGluZ0NvZGVBbWJpZ3VvdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNDb3VudHJ5Q2FsbGluZ0NvZGVBbWJpZ3VvdXMoKSB7XG4gICAgICB2YXIgY2FsbGluZ0NvZGUgPSB0aGlzLnN0YXRlLmNhbGxpbmdDb2RlO1xuICAgICAgdmFyIGNvdW50cnlDb2RlcyA9IHRoaXMubWV0YWRhdGEuZ2V0Q291bnRyeUNvZGVzRm9yQ2FsbGluZ0NvZGUoY2FsbGluZ0NvZGUpO1xuICAgICAgcmV0dXJuIGNvdW50cnlDb2RlcyAmJiBjb3VudHJ5Q29kZXMubGVuZ3RoID4gMTtcbiAgICB9IC8vIERldGVybWluZXMgdGhlIGNvdW50cnkgb2YgdGhlIHBob25lIG51bWJlclxuICAgIC8vIGVudGVyZWQgc28gZmFyIGJhc2VkIG9uIHRoZSBjb3VudHJ5IHBob25lIGNvZGVcbiAgICAvLyBhbmQgdGhlIG5hdGlvbmFsIHBob25lIG51bWJlci5cblxuICB9LCB7XG4gICAga2V5OiBcImRldGVybWluZVRoZUNvdW50cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGV0ZXJtaW5lVGhlQ291bnRyeSgpIHtcbiAgICAgIHRoaXMuc3RhdGUuc2V0Q291bnRyeSgoMCwgX2dldENvdW50cnlCeUNhbGxpbmdDb2RlW1wiZGVmYXVsdFwiXSkodGhpcy5pc0ludGVybmF0aW9uYWwoKSA/IHRoaXMuc3RhdGUuY2FsbGluZ0NvZGUgOiB0aGlzLmRlZmF1bHRDYWxsaW5nQ29kZSwgdGhpcy5zdGF0ZS5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyLCB0aGlzLm1ldGFkYXRhKSk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIEUuMTY0IHBob25lIG51bWJlciB2YWx1ZSBmb3IgdGhlIHVzZXIncyBpbnB1dC5cclxuICAgICAqXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgZm9yIGNvdW50cnkgYFwiVVNcImAgYW5kIGlucHV0IGBcIigyMjIpIDMzMy00NDQ0XCJgXHJcbiAgICAgKiBpdCB3aWxsIHJldHVybiBgXCIrMTIyMjMzMzQ0NDRcImAuXHJcbiAgICAgKlxyXG4gICAgICogRm9yIGludGVybmF0aW9uYWwgcGhvbmUgbnVtYmVyIGlucHV0LCBpdCB3aWxsIGFsc28gYXV0by1jb3JyZWN0XHJcbiAgICAgKiBzb21lIG1pbm9yIGVycm9ycyBzdWNoIGFzIHVzaW5nIGEgbmF0aW9uYWwgcHJlZml4IHdoZW4gd3JpdGluZ1xyXG4gICAgICogYW4gaW50ZXJuYXRpb25hbCBwaG9uZSBudW1iZXIuIEZvciBleGFtcGxlLCBpZiB0aGUgdXNlciBpbnB1dHNcclxuICAgICAqIGBcIis0NCAwIDc0MDAgMDAwMDAwXCJgIHRoZW4gaXQgd2lsbCByZXR1cm4gYW4gYXV0by1jb3JyZWN0ZWRcclxuICAgICAqIGBcIis0NDc0MDAwMDAwMDBcImAgcGhvbmUgbnVtYmVyIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIFdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIGlmIG5vIGRpZ2l0cyBoYXZlIGJlZW4gaW5wdXQsXHJcbiAgICAgKiBvciB3aGVuIGlucHV0dGluZyBhIHBob25lIG51bWJlciBpbiBuYXRpb25hbCBmb3JtYXQgYW5kIG5vXHJcbiAgICAgKiBkZWZhdWx0IGNvdW50cnkgb3IgZGVmYXVsdCBcImNvdW50cnkgY2FsbGluZyBjb2RlXCIgaGF2ZSBiZWVuIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFt2YWx1ZV1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TnVtYmVyVmFsdWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TnVtYmVyVmFsdWUoKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUyID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBkaWdpdHMgPSBfdGhpcyRzdGF0ZTIuZGlnaXRzLFxuICAgICAgICAgIGNhbGxpbmdDb2RlID0gX3RoaXMkc3RhdGUyLmNhbGxpbmdDb2RlLFxuICAgICAgICAgIGNvdW50cnkgPSBfdGhpcyRzdGF0ZTIuY291bnRyeSxcbiAgICAgICAgICBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyID0gX3RoaXMkc3RhdGUyLm5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXI7IC8vIFdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIGlmIG5vIGRpZ2l0cyBoYXZlIGJlZW4gaW5wdXQuXG5cbiAgICAgIGlmICghZGlnaXRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNJbnRlcm5hdGlvbmFsKCkpIHtcbiAgICAgICAgaWYgKGNhbGxpbmdDb2RlKSB7XG4gICAgICAgICAgcmV0dXJuICcrJyArIGNhbGxpbmdDb2RlICsgbmF0aW9uYWxTaWduaWZpY2FudE51bWJlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJysnICsgZGlnaXRzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY291bnRyeSB8fCBjYWxsaW5nQ29kZSkge1xuICAgICAgICAgIHZhciBjYWxsaW5nQ29kZV8gPSBjb3VudHJ5ID8gdGhpcy5tZXRhZGF0YS5jb3VudHJ5Q2FsbGluZ0NvZGUoKSA6IGNhbGxpbmdDb2RlO1xuICAgICAgICAgIHJldHVybiAnKycgKyBjYWxsaW5nQ29kZV8gKyBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBgUGhvbmVOdW1iZXJgIGNsYXNzLlxyXG4gICAgICogV2lsbCByZXR1cm4gYHVuZGVmaW5lZGAgaWYgbm8gbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXJcclxuICAgICAqIGRpZ2l0cyBoYXZlIGJlZW4gZW50ZXJlZCBzbyBmYXIsIG9yIGlmIG5vIGBkZWZhdWx0Q291bnRyeWAgaGFzIGJlZW5cclxuICAgICAqIHNldCBhbmQgdGhlIHVzZXIgZW50ZXJzIGEgcGhvbmUgbnVtYmVyIG5vdCBpbiBpbnRlcm5hdGlvbmFsIGZvcm1hdC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TnVtYmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE51bWJlcigpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTMgPSB0aGlzLnN0YXRlLFxuICAgICAgICAgIG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIgPSBfdGhpcyRzdGF0ZTMubmF0aW9uYWxTaWduaWZpY2FudE51bWJlcixcbiAgICAgICAgICBjYXJyaWVyQ29kZSA9IF90aGlzJHN0YXRlMy5jYXJyaWVyQ29kZSxcbiAgICAgICAgICBjYWxsaW5nQ29kZSA9IF90aGlzJHN0YXRlMy5jYWxsaW5nQ29kZTsgLy8gYHRoaXMuX2dldENvdW50cnkoKWAgaXMgYmFzaWNhbGx5IHNhbWUgYXMgYHRoaXMuc3RhdGUuY291bnRyeWBcbiAgICAgIC8vIHdpdGggdGhlIG9ubHkgY2hhbmdlIHRoYXQgaXQgcmV0dXJuIGB1bmRlZmluZWRgIGluIGNhc2Ugb2YgYVxuICAgICAgLy8gXCJub24tZ2VvZ3JhcGhpY1wiIG51bWJlcmluZyBwbGFuIGluc3RlYWQgb2YgYFwiMDAxXCJgIFwiaW50ZXJuYWwgdXNlXCIgdmFsdWUuXG5cbiAgICAgIHZhciBjb3VudHJ5ID0gdGhpcy5fZ2V0Q291bnRyeSgpO1xuXG4gICAgICBpZiAoIW5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWNvdW50cnkgJiYgIWNhbGxpbmdDb2RlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBob25lTnVtYmVyID0gbmV3IF9QaG9uZU51bWJlcltcImRlZmF1bHRcIl0oY291bnRyeSB8fCBjYWxsaW5nQ29kZSwgbmF0aW9uYWxTaWduaWZpY2FudE51bWJlciwgdGhpcy5tZXRhZGF0YS5tZXRhZGF0YSk7XG5cbiAgICAgIGlmIChjYXJyaWVyQ29kZSkge1xuICAgICAgICBwaG9uZU51bWJlci5jYXJyaWVyQ29kZSA9IGNhcnJpZXJDb2RlO1xuICAgICAgfSAvLyBQaG9uZSBudW1iZXIgZXh0ZW5zaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSBcIkFzIFlvdSBUeXBlXCIgZm9ybWF0dGVyLlxuXG5cbiAgICAgIHJldHVybiBwaG9uZU51bWJlcjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGhvbmUgbnVtYmVyIGlzIFwicG9zc2libGVcIi5cclxuICAgICAqIElzIGp1c3QgYSBzaG9ydGN1dCBmb3IgYFBob25lTnVtYmVyLmlzUG9zc2libGUoKWAuXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc1Bvc3NpYmxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzUG9zc2libGUoKSB7XG4gICAgICB2YXIgcGhvbmVOdW1iZXIgPSB0aGlzLmdldE51bWJlcigpO1xuXG4gICAgICBpZiAoIXBob25lTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBob25lTnVtYmVyLmlzUG9zc2libGUoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGhvbmUgbnVtYmVyIGlzIFwidmFsaWRcIi5cclxuICAgICAqIElzIGp1c3QgYSBzaG9ydGN1dCBmb3IgYFBob25lTnVtYmVyLmlzVmFsaWQoKWAuXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc1ZhbGlkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzVmFsaWQoKSB7XG4gICAgICB2YXIgcGhvbmVOdW1iZXIgPSB0aGlzLmdldE51bWJlcigpO1xuXG4gICAgICBpZiAoIXBob25lTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBob25lTnVtYmVyLmlzVmFsaWQoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZFxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiBgcmVhY3QtcGhvbmUtbnVtYmVyLWlucHV0L3NvdXJjZS9pbnB1dC1jb250cm9sLmpzYFxyXG4gICAgICogaW4gdmVyc2lvbnMgYmVmb3JlIGAzLjAuMTZgLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXROYXRpb25hbE51bWJlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROYXRpb25hbE51bWJlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLm5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXI7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcGhvbmUgbnVtYmVyIGNoYXJhY3RlcnMgZW50ZXJlZCBieSB0aGUgdXNlci5cclxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2hhcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2hhcnMoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuc3RhdGUuaW50ZXJuYXRpb25hbCA/ICcrJyA6ICcnKSArIHRoaXMuc3RhdGUuZGlnaXRzO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGZvciB0aGUgZm9ybWF0dGVkIHBob25lIG51bWJlci5cclxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VGVtcGxhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGVtcGxhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZXIuZ2V0VGVtcGxhdGUodGhpcy5zdGF0ZSkgfHwgdGhpcy5nZXROb25Gb3JtYXR0ZWRUZW1wbGF0ZSgpIHx8ICcnO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBc1lvdVR5cGU7XG59KCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQXNZb3VUeXBlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNZb3VUeXBlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfQXNZb3VUeXBlRm9ybWF0dGVyUGF0dGVyblBhcnNlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQXNZb3VUeXBlRm9ybWF0dGVyLlBhdHRlcm5QYXJzZXIuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKGl0KSByZXR1cm4gKGl0ID0gaXQuY2FsbChvKSkubmV4dC5iaW5kKGl0KTsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxudmFyIFBhdHRlcm5NYXRjaGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUGF0dGVybk1hdGNoZXIocGF0dGVybikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYXR0ZXJuTWF0Y2hlcik7XG5cbiAgICB0aGlzLm1hdGNoVHJlZSA9IG5ldyBfQXNZb3VUeXBlRm9ybWF0dGVyUGF0dGVyblBhcnNlcltcImRlZmF1bHRcIl0oKS5wYXJzZShwYXR0ZXJuKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQYXR0ZXJuTWF0Y2hlciwgW3tcbiAgICBrZXk6IFwibWF0Y2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWF0Y2goc3RyaW5nKSB7XG4gICAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgICAgYWxsb3dPdmVyZmxvdyA9IF9yZWYuYWxsb3dPdmVyZmxvdztcblxuICAgICAgaWYgKCFzdHJpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHJpbmcgaXMgcmVxdWlyZWQnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3VsdCA9IF9tYXRjaChzdHJpbmcuc3BsaXQoJycpLCB0aGlzLm1hdGNoVHJlZSwgdHJ1ZSk7XG5cbiAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lm1hdGNoKSB7XG4gICAgICAgIGRlbGV0ZSByZXN1bHQubWF0Y2hlZENoYXJzO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5vdmVyZmxvdykge1xuICAgICAgICBpZiAoIWFsbG93T3ZlcmZsb3cpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGF0dGVybk1hdGNoZXI7XG59KCk7XG4vKipcclxuICogTWF0Y2hlcyBgY2hhcmFjdGVyc2AgYWdhaW5zdCBhIHBhdHRlcm4gY29tcGlsZWQgaW50byBhIGB0cmVlYC5cclxuICogQHBhcmFtICB7c3RyaW5nW119IGNoYXJhY3RlcnNcclxuICogQHBhcmFtICB7VHJlZX0gdHJlZSDigJQgQSBwYXR0ZXJuIGNvbXBpbGVkIGludG8gYSBgdHJlZWAuIFNlZSB0aGUgYCouZC50c2AgZmlsZSBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgdHJlZWAgc3RydWN0dXJlLlxyXG4gKiBAcGFyYW0gIHtib29sZWFufSBsYXN0IOKAlCBXaGV0aGVyIGl0J3MgdGhlIGxhc3QgKHJpZ2h0bW9zdCkgc3VidHJlZSBvbiBpdHMgbGV2ZWwgb2YgdGhlIG1hdGNoIHRyZWUuXHJcbiAqIEByZXR1cm4ge29iamVjdH0gU2VlIHRoZSBgKi5kLnRzYCBmaWxlIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlc3VsdCBvYmplY3QuXHJcbiAqL1xuXG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gUGF0dGVybk1hdGNoZXI7XG5cbmZ1bmN0aW9uIF9tYXRjaChjaGFyYWN0ZXJzLCB0cmVlLCBsYXN0KSB7XG4gIC8vIElmIGB0cmVlYCBpcyBhIHN0cmluZywgdGhlbiBgdHJlZWAgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLlxuICAvLyBUaGF0J3MgYmVjYXVzZSB3aGVuIGEgcGF0dGVybiBpcyBwYXJzZWQsIG11bHRpLWNoYXJhY3Rlci1zdHJpbmcgcGFydHNcbiAgLy8gb2YgYSBwYXR0ZXJuIGFyZSBjb21waWxlZCBpbnRvIGFycmF5cyBvZiBzaW5nbGUgY2hhcmFjdGVycy5cbiAgLy8gSSBzdGlsbCB3cm90ZSB0aGlzIHBpZWNlIG9mIGNvZGUgZm9yIGEgXCJnZW5lcmFsXCIgaHlwb3RoZXRpY2FsIGNhc2VcbiAgLy8gd2hlbiBgdHJlZWAgY291bGQgYmUgYSBzdHJpbmcgb2Ygc2V2ZXJhbCBjaGFyYWN0ZXJzLCBldmVuIHRob3VnaFxuICAvLyBzdWNoIGNhc2UgaXMgbm90IHBvc3NpYmxlIHdpdGggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uXG4gIGlmICh0eXBlb2YgdHJlZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgY2hhcmFjdGVyU3RyaW5nID0gY2hhcmFjdGVycy5qb2luKCcnKTtcblxuICAgIGlmICh0cmVlLmluZGV4T2YoY2hhcmFjdGVyU3RyaW5nKSA9PT0gMCkge1xuICAgICAgLy8gYHRyZWVgIGlzIGFsd2F5cyBhIHNpbmdsZSBjaGFyYWN0ZXIuXG4gICAgICAvLyBJZiBgdHJlZS5pbmRleE9mKGNoYXJhY3RlclN0cmluZykgPT09IDBgXG4gICAgICAvLyB0aGVuIGBjaGFyYWN0ZXJzLmxlbmd0aCA9PT0gdHJlZS5sZW5ndGhgLlxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGNoYXJhY3RlcnMubGVuZ3RoID09PSB0cmVlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1hdGNoOiB0cnVlLFxuICAgICAgICAgIG1hdGNoZWRDaGFyczogY2hhcmFjdGVyc1xuICAgICAgICB9O1xuICAgICAgfSAvLyBgdHJlZWAgaXMgYWx3YXlzIGEgc2luZ2xlIGNoYXJhY3Rlci5cbiAgICAgIC8vIElmIGB0cmVlLmluZGV4T2YoY2hhcmFjdGVyU3RyaW5nKSA9PT0gMGBcbiAgICAgIC8vIHRoZW4gYGNoYXJhY3RlcnMubGVuZ3RoID09PSB0cmVlLmxlbmd0aGAuXG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlIC8vIG1hdGNoZWRDaGFyczogY2hhcmFjdGVyc1xuXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChjaGFyYWN0ZXJTdHJpbmcuaW5kZXhPZih0cmVlKSA9PT0gMCkge1xuICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgLy8gVGhlIGBlbHNlYCBwYXRoIGlzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIGB0cmVlYCBpcyBhbHdheXMgYSBzaW5nbGUgY2hhcmFjdGVyLlxuICAgICAgICAvLyBUaGUgYGVsc2VgIGNhc2UgZm9yIGBjaGFyYWN0ZXJzLmxlbmd0aCA+IHRyZWUubGVuZ3RoYCB3b3VsZCBiZVxuICAgICAgICAvLyBgY2hhcmFjdGVycy5sZW5ndGggPD0gdHJlZS5sZW5ndGhgIHdoaWNoIG1lYW5zIGBjaGFyYWN0ZXJzLmxlbmd0aCA8PSAxYC5cbiAgICAgICAgLy8gYGNoYXJhY3RlcnNgIGFycmF5IGNhbid0IGJlIGVtcHR5LCBzbyB0aGF0IG1lYW5zIGBjaGFyYWN0ZXJzID09PSBbdHJlZV1gLFxuICAgICAgICAvLyB3aGljaCB3b3VsZCBhbHNvIG1lYW4gYHRyZWUuaW5kZXhPZihjaGFyYWN0ZXJTdHJpbmcpID09PSAwYCBhbmQgdGhhdCdkIG1lYW5cbiAgICAgICAgLy8gdGhhdCB0aGUgYGlmICh0cmVlLmluZGV4T2YoY2hhcmFjdGVyU3RyaW5nKSA9PT0gMClgIGNvbmRpdGlvbiBiZWZvcmUgdGhpc1xuICAgICAgICAvLyBgaWZgIGNvbmRpdGlvbiB3b3VsZCBiZSBlbnRlcmVkLCBhbmQgcmV0dXJuZWQgZnJvbSB0aGVyZSwgbm90IHJlYWNoaW5nIHRoaXMgY29kZS5cblxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoY2hhcmFjdGVycy5sZW5ndGggPiB0cmVlLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvdmVyZmxvdzogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWF0Y2g6IHRydWUsXG4gICAgICAgIG1hdGNoZWRDaGFyczogY2hhcmFjdGVycy5zbGljZSgwLCB0cmVlLmxlbmd0aClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodHJlZSkpIHtcbiAgICB2YXIgcmVzdENoYXJhY3RlcnMgPSBjaGFyYWN0ZXJzLnNsaWNlKCk7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCB0cmVlLmxlbmd0aCkge1xuICAgICAgdmFyIHN1YnRyZWUgPSB0cmVlW2ldO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gX21hdGNoKHJlc3RDaGFyYWN0ZXJzLCBzdWJ0cmVlLCBsYXN0ICYmIGkgPT09IHRyZWUubGVuZ3RoIC0gMSk7XG5cbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lm92ZXJmbG93KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5tYXRjaCkge1xuICAgICAgICAvLyBDb250aW51ZSB3aXRoIHRoZSBuZXh0IHN1YnRyZWUgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY2hhcmFjdGVycy5cbiAgICAgICAgcmVzdENoYXJhY3RlcnMgPSByZXN0Q2hhcmFjdGVycy5zbGljZShyZXN1bHQubWF0Y2hlZENoYXJzLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHJlc3RDaGFyYWN0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGlmIChpID09PSB0cmVlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgICBtYXRjaGVkQ2hhcnM6IGNoYXJhY3RlcnNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHBhcnRpYWxNYXRjaDogdHJ1ZSAvLyBtYXRjaGVkQ2hhcnM6IGNoYXJhY3RlcnNcblxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChyZXN1bHQucGFydGlhbE1hdGNoKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhcnRpYWxNYXRjaDogdHJ1ZSAvLyBtYXRjaGVkQ2hhcnM6IGNoYXJhY3RlcnNcblxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgbWF0Y2ggcmVzdWx0OlxcblwiLmNvbmNhdChKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH0gLy8gSWYgYGxhc3RgIHRoZW4gb3ZlcmZsb3cgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkXG4gICAgLy8gYnkgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgYHRyZWVgIGFycmF5LlxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cblxuICAgIGlmIChsYXN0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvdmVyZmxvdzogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWF0Y2g6IHRydWUsXG4gICAgICBtYXRjaGVkQ2hhcnM6IGNoYXJhY3RlcnMuc2xpY2UoMCwgY2hhcmFjdGVycy5sZW5ndGggLSByZXN0Q2hhcmFjdGVycy5sZW5ndGgpXG4gICAgfTtcbiAgfVxuXG4gIHN3aXRjaCAodHJlZS5vcCkge1xuICAgIGNhc2UgJ3wnOlxuICAgICAgdmFyIHBhcnRpYWxNYXRjaDtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSh0cmVlLmFyZ3MpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgICB2YXIgYnJhbmNoID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgdmFyIF9yZXN1bHQgPSBfbWF0Y2goY2hhcmFjdGVycywgYnJhbmNoLCBsYXN0KTtcblxuICAgICAgICBpZiAoX3Jlc3VsdCkge1xuICAgICAgICAgIGlmIChfcmVzdWx0Lm92ZXJmbG93KSB7XG4gICAgICAgICAgICByZXR1cm4gX3Jlc3VsdDtcbiAgICAgICAgICB9IGVsc2UgaWYgKF9yZXN1bHQubWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgICBtYXRjaGVkQ2hhcnM6IF9yZXN1bHQubWF0Y2hlZENoYXJzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgICAgaWYgKF9yZXN1bHQucGFydGlhbE1hdGNoKSB7XG4gICAgICAgICAgICAgIHBhcnRpYWxNYXRjaCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBtYXRjaCByZXN1bHQ6XFxuXCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KF9yZXN1bHQsIG51bGwsIDIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJ0aWFsTWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXJ0aWFsTWF0Y2g6IHRydWUgLy8gbWF0Y2hlZENoYXJzOiAuLi5cblxuICAgICAgICB9O1xuICAgICAgfSAvLyBOb3QgZXZlbiBhIHBhcnRpYWwgbWF0Y2guXG5cblxuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAnW10nOlxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UodHJlZS5hcmdzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIF9jaGFyID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXJzWzBdID09PSBfY2hhcikge1xuICAgICAgICAgIGlmIChjaGFyYWN0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWF0Y2g6IHRydWUsXG4gICAgICAgICAgICAgIG1hdGNoZWRDaGFyczogY2hhcmFjdGVyc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobGFzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgb3ZlcmZsb3c6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgbWF0Y2hlZENoYXJzOiBbX2NoYXJdXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBObyBjaGFyYWN0ZXIgbWF0Y2hlcy5cblxuXG4gICAgICByZXR1cm47XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGluc3RydWN0aW9uIHRyZWU6IFwiLmNvbmNhdCh0cmVlKSk7XG4gIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzWW91VHlwZUZvcm1hdHRlci5QYXR0ZXJuTWF0Y2hlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciBQYXR0ZXJuUGFyc2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUGF0dGVyblBhcnNlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGF0dGVyblBhcnNlcik7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUGF0dGVyblBhcnNlciwgW3tcbiAgICBrZXk6IFwicGFyc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2UocGF0dGVybikge1xuICAgICAgdGhpcy5jb250ZXh0ID0gW3tcbiAgICAgICAgb3I6IHRydWUsXG4gICAgICAgIGluc3RydWN0aW9uczogW11cbiAgICAgIH1dO1xuICAgICAgdGhpcy5wYXJzZVBhdHRlcm4ocGF0dGVybik7XG5cbiAgICAgIGlmICh0aGlzLmNvbnRleHQubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm9uLWZpbmFsaXplZCBjb250ZXh0cyBsZWZ0IHdoZW4gcGF0dGVybiBwYXJzZSBlbmRlZCcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3RoaXMkY29udGV4dCQgPSB0aGlzLmNvbnRleHRbMF0sXG4gICAgICAgICAgYnJhbmNoZXMgPSBfdGhpcyRjb250ZXh0JC5icmFuY2hlcyxcbiAgICAgICAgICBpbnN0cnVjdGlvbnMgPSBfdGhpcyRjb250ZXh0JC5pbnN0cnVjdGlvbnM7XG5cbiAgICAgIGlmIChicmFuY2hlcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9wOiAnfCcsXG4gICAgICAgICAgYXJnczogYnJhbmNoZXMuY29uY2F0KFtleHBhbmRTaW5nbGVFbGVtZW50QXJyYXkoaW5zdHJ1Y3Rpb25zKV0pXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cblxuXG4gICAgICBpZiAoaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdHRlcm4gaXMgcmVxdWlyZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uc1swXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRDb250ZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0Q29udGV4dChjb250ZXh0KSB7XG4gICAgICB0aGlzLmNvbnRleHQucHVzaChjb250ZXh0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5kQ29udGV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmRDb250ZXh0KCkge1xuICAgICAgdGhpcy5jb250ZXh0LnBvcCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDb250ZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZXh0W3RoaXMuY29udGV4dC5sZW5ndGggLSAxXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFyc2VQYXR0ZXJuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlUGF0dGVybihwYXR0ZXJuKSB7XG4gICAgICBpZiAoIXBhdHRlcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXR0ZXJuIGlzIHJlcXVpcmVkJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBtYXRjaCA9IHBhdHRlcm4ubWF0Y2goT1BFUkFUT1IpO1xuXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGlmIChJTExFR0FMX0NIQVJBQ1RFUl9SRUdFWFAudGVzdChwYXR0ZXJuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgY2hhcmFjdGVycyBmb3VuZCBpbiBhIHBhdHRlcm46IFwiLmNvbmNhdChwYXR0ZXJuKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldENvbnRleHQoKS5pbnN0cnVjdGlvbnMgPSB0aGlzLmdldENvbnRleHQoKS5pbnN0cnVjdGlvbnMuY29uY2F0KHBhdHRlcm4uc3BsaXQoJycpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3BlcmF0b3IgPSBtYXRjaFsxXTtcbiAgICAgIHZhciBiZWZvcmUgPSBwYXR0ZXJuLnNsaWNlKDAsIG1hdGNoLmluZGV4KTtcbiAgICAgIHZhciByaWdodFBhcnQgPSBwYXR0ZXJuLnNsaWNlKG1hdGNoLmluZGV4ICsgb3BlcmF0b3IubGVuZ3RoKTtcblxuICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICBjYXNlICcoPzonOlxuICAgICAgICAgIGlmIChiZWZvcmUpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VQYXR0ZXJuKGJlZm9yZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5zdGFydENvbnRleHQoe1xuICAgICAgICAgICAgb3I6IHRydWUsXG4gICAgICAgICAgICBpbnN0cnVjdGlvbnM6IFtdLFxuICAgICAgICAgICAgYnJhbmNoZXM6IFtdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnKSc6XG4gICAgICAgICAgaWYgKCF0aGlzLmdldENvbnRleHQoKS5vcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIilcIiBvcGVyYXRvciBtdXN0IGJlIHByZWNlZGVkIGJ5IFwiKD86XCIgb3BlcmF0b3InKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlUGF0dGVybihiZWZvcmUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLmdldENvbnRleHQoKS5pbnN0cnVjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGluc3RydWN0aW9ucyBmb3VuZCBhZnRlciBcInxcIiBvcGVyYXRvciBpbiBhbiBcIm9yXCIgZ3JvdXAnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3RoaXMkZ2V0Q29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpLFxuICAgICAgICAgICAgICBicmFuY2hlcyA9IF90aGlzJGdldENvbnRleHQuYnJhbmNoZXM7XG5cbiAgICAgICAgICBicmFuY2hlcy5wdXNoKGV4cGFuZFNpbmdsZUVsZW1lbnRBcnJheSh0aGlzLmdldENvbnRleHQoKS5pbnN0cnVjdGlvbnMpKTtcbiAgICAgICAgICB0aGlzLmVuZENvbnRleHQoKTtcbiAgICAgICAgICB0aGlzLmdldENvbnRleHQoKS5pbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcDogJ3wnLFxuICAgICAgICAgICAgYXJnczogYnJhbmNoZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgICBpZiAoIXRoaXMuZ2V0Q29udGV4dCgpLm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wifFwiIG9wZXJhdG9yIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIFwib3JcIiBncm91cHMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlUGF0dGVybihiZWZvcmUpO1xuICAgICAgICAgIH0gLy8gVGhlIHRvcC1sZXZlbCBpcyBhbiBpbXBsaWNpdCBcIm9yXCIgZ3JvdXAsIGlmIHJlcXVpcmVkLlxuXG5cbiAgICAgICAgICBpZiAoIXRoaXMuZ2V0Q29udGV4dCgpLmJyYW5jaGVzKSB7XG4gICAgICAgICAgICAvLyBgYnJhbmNoZXNgIGFyZSBub3QgZGVmaW5lZCBvbmx5IGZvciB0aGUgcm9vdCBpbXBsaWNpdCBcIm9yXCIgb3BlcmF0b3IuXG5cbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICB0aGlzLmdldENvbnRleHQoKS5icmFuY2hlcyA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcImJyYW5jaGVzXCIgbm90IGZvdW5kIGluIGFuIFwib3JcIiBncm91cCBjb250ZXh0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5nZXRDb250ZXh0KCkuYnJhbmNoZXMucHVzaChleHBhbmRTaW5nbGVFbGVtZW50QXJyYXkodGhpcy5nZXRDb250ZXh0KCkuaW5zdHJ1Y3Rpb25zKSk7XG4gICAgICAgICAgdGhpcy5nZXRDb250ZXh0KCkuaW5zdHJ1Y3Rpb25zID0gW107XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgaWYgKGJlZm9yZSkge1xuICAgICAgICAgICAgdGhpcy5wYXJzZVBhdHRlcm4oYmVmb3JlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0Q29udGV4dCh7XG4gICAgICAgICAgICBvbmVPZlNldDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ10nOlxuICAgICAgICAgIGlmICghdGhpcy5nZXRDb250ZXh0KCkub25lT2ZTZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignXCJdXCIgb3BlcmF0b3IgbXVzdCBiZSBwcmVjZWRlZCBieSBcIltcIiBvcGVyYXRvcicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZW5kQ29udGV4dCgpO1xuICAgICAgICAgIHRoaXMuZ2V0Q29udGV4dCgpLmluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiAnW10nLFxuICAgICAgICAgICAgYXJnczogcGFyc2VPbmVPZlNldChiZWZvcmUpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3BlcmF0b3I6IFwiLmNvbmNhdChvcGVyYXRvcikpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmlnaHRQYXJ0KSB7XG4gICAgICAgIHRoaXMucGFyc2VQYXR0ZXJuKHJpZ2h0UGFydCk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBhdHRlcm5QYXJzZXI7XG59KCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gUGF0dGVyblBhcnNlcjtcblxuZnVuY3Rpb24gcGFyc2VPbmVPZlNldChwYXR0ZXJuKSB7XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgdmFyIGkgPSAwO1xuXG4gIHdoaWxlIChpIDwgcGF0dGVybi5sZW5ndGgpIHtcbiAgICBpZiAocGF0dGVybltpXSA9PT0gJy0nKSB7XG4gICAgICBpZiAoaSA9PT0gMCB8fCBpID09PSBwYXR0ZXJuLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgcGFyc2UgYSBvbmUtb2Ygc2V0IHBhdHRlcm46IFwiLmNvbmNhdChwYXR0ZXJuKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcmV2VmFsdWUgPSBwYXR0ZXJuW2kgLSAxXS5jaGFyQ29kZUF0KDApICsgMTtcbiAgICAgIHZhciBuZXh0VmFsdWUgPSBwYXR0ZXJuW2kgKyAxXS5jaGFyQ29kZUF0KDApIC0gMTtcbiAgICAgIHZhciB2YWx1ZSA9IHByZXZWYWx1ZTtcblxuICAgICAgd2hpbGUgKHZhbHVlIDw9IG5leHRWYWx1ZSkge1xuICAgICAgICB2YWx1ZXMucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlKSk7XG4gICAgICAgIHZhbHVlKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlcy5wdXNoKHBhdHRlcm5baV0pO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbnZhciBJTExFR0FMX0NIQVJBQ1RFUl9SRUdFWFAgPSAvW1xcKFxcKVxcW1xcXVxcP1xcOlxcfF0vO1xudmFyIE9QRVJBVE9SID0gbmV3IFJlZ0V4cCggLy8gYW55IG9mOlxuJygnICsgLy8gb3Igb3BlcmF0b3JcbidcXFxcfCcgKyAvLyBvclxuJ3wnICsgLy8gb3IgZ3JvdXAgc3RhcnRcbidcXFxcKFxcXFw/XFxcXDonICsgLy8gb3Jcbid8JyArIC8vIG9yIGdyb3VwIGVuZFxuJ1xcXFwpJyArIC8vIG9yXG4nfCcgKyAvLyBvbmUtb2Ygc2V0IHN0YXJ0XG4nXFxcXFsnICsgLy8gb3Jcbid8JyArIC8vIG9uZS1vZiBzZXQgZW5kXG4nXFxcXF0nICsgJyknKTtcblxuZnVuY3Rpb24gZXhwYW5kU2luZ2xlRWxlbWVudEFycmF5KGFycmF5KSB7XG4gIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYXJyYXlbMF07XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc1lvdVR5cGVGb3JtYXR0ZXIuUGF0dGVyblBhcnNlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2FuRm9ybWF0Q29tcGxldGVOdW1iZXIgPSBjYW5Gb3JtYXRDb21wbGV0ZU51bWJlcjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZm9ybWF0Q29tcGxldGVOdW1iZXI7XG5cbnZhciBfY2hlY2tOdW1iZXJMZW5ndGggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvY2hlY2tOdW1iZXJMZW5ndGguanNcIikpO1xuXG52YXIgX3BhcnNlRGlnaXRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9oZWxwZXJzL3BhcnNlRGlnaXRzLmpzXCIpKTtcblxudmFyIF9mb3JtYXROYXRpb25hbE51bWJlclVzaW5nRm9ybWF0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9oZWxwZXJzL2Zvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gZm9ybWF0Q29tcGxldGVOdW1iZXIoc3RhdGUsIGZvcm1hdCwgX3JlZikge1xuICB2YXIgbWV0YWRhdGEgPSBfcmVmLm1ldGFkYXRhLFxuICAgICAgc2hvdWxkVHJ5TmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSA9IF9yZWYuc2hvdWxkVHJ5TmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSxcbiAgICAgIGdldFNlcGFyYXRvckFmdGVyTmF0aW9uYWxQcmVmaXggPSBfcmVmLmdldFNlcGFyYXRvckFmdGVyTmF0aW9uYWxQcmVmaXg7XG4gIHZhciBtYXRjaGVyID0gbmV3IFJlZ0V4cChcIl4oPzpcIi5jb25jYXQoZm9ybWF0LnBhdHRlcm4oKSwgXCIpJFwiKSk7XG5cbiAgaWYgKG1hdGNoZXIudGVzdChzdGF0ZS5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKSkge1xuICAgIHJldHVybiBmb3JtYXROYXRpb25hbE51bWJlcldpdGhBbmRXaXRob3V0TmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZShzdGF0ZSwgZm9ybWF0LCB7XG4gICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICBzaG91bGRUcnlOYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlOiBzaG91bGRUcnlOYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlLFxuICAgICAgZ2V0U2VwYXJhdG9yQWZ0ZXJOYXRpb25hbFByZWZpeDogZ2V0U2VwYXJhdG9yQWZ0ZXJOYXRpb25hbFByZWZpeFxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbkZvcm1hdENvbXBsZXRlTnVtYmVyKG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIsIG1ldGFkYXRhKSB7XG4gIHJldHVybiAoMCwgX2NoZWNrTnVtYmVyTGVuZ3RoW1wiZGVmYXVsdFwiXSkobmF0aW9uYWxTaWduaWZpY2FudE51bWJlciwgbWV0YWRhdGEpID09PSAnSVNfUE9TU0lCTEUnO1xufVxuXG5mdW5jdGlvbiBmb3JtYXROYXRpb25hbE51bWJlcldpdGhBbmRXaXRob3V0TmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZShzdGF0ZSwgZm9ybWF0LCBfcmVmMikge1xuICB2YXIgbWV0YWRhdGEgPSBfcmVmMi5tZXRhZGF0YSxcbiAgICAgIHNob3VsZFRyeU5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUgPSBfcmVmMi5zaG91bGRUcnlOYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlLFxuICAgICAgZ2V0U2VwYXJhdG9yQWZ0ZXJOYXRpb25hbFByZWZpeCA9IF9yZWYyLmdldFNlcGFyYXRvckFmdGVyTmF0aW9uYWxQcmVmaXg7XG4gIC8vIGBmb3JtYXRgIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBmb3IgYG5hdGlvbmFsUHJlZml4YCByZXF1aXJlbWVudC5cbiAgdmFyIG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIgPSBzdGF0ZS5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyLFxuICAgICAgaW50ZXJuYXRpb25hbCA9IHN0YXRlLmludGVybmF0aW9uYWwsXG4gICAgICBuYXRpb25hbFByZWZpeCA9IHN0YXRlLm5hdGlvbmFsUHJlZml4LFxuICAgICAgY2FycmllckNvZGUgPSBzdGF0ZS5jYXJyaWVyQ29kZTsgLy8gRm9ybWF0IHRoZSBudW1iZXIgd2l0aCB1c2luZyBgbmF0aW9uYWxfcHJlZml4X2Zvcm1hdHRpbmdfcnVsZWAuXG4gIC8vIElmIHRoZSByZXN1bHRpbmcgZm9ybWF0dGVkIG51bWJlciBpcyBhIHZhbGlkIGZvcm1hdHRlZCBudW1iZXIsIHRoZW4gcmV0dXJuIGl0LlxuICAvL1xuICAvLyBHb29nbGUncyBBc1lvdVR5cGUgZm9ybWF0dGVyIGlzIGRpZmZlcmVudCBpbiBhIHdheSB0aGF0IGl0IGRvZXNuJ3QgdHJ5XG4gIC8vIHRvIGZvcm1hdCB1c2luZyB0aGUgXCJuYXRpb25hbCBwcmVmaXggZm9ybWF0dGluZyBydWxlXCIsIGFuZCBpbnN0ZWFkIGl0XG4gIC8vIHNpbXBseSBwcmVwZW5kcyBhIG5hdGlvbmFsIHByZWZpeCBmb2xsb3dlZCBieSBhIFwiIFwiIGNoYXJhY3Rlci5cbiAgLy8gVGhpcyBjb2RlIGRvZXMgdGhhdCB0b28sIGJ1dCBhcyBhIGZhbGxiYWNrLlxuICAvLyBUaGUgcmVhc29uIGlzIHRoYXQgXCJuYXRpb25hbCBwcmVmaXggZm9ybWF0dGluZyBydWxlXCIgbWF5IHVzZSBwYXJlbnRoZXNlcyxcbiAgLy8gd2hpY2ggd291bGRuJ3QgYmUgaW5jbHVkZWQgaGFzIGl0IHVzZWQgdGhlIHNpbXBsZXIgR29vZ2xlJ3Mgd2F5LlxuICAvL1xuXG4gIGlmIChzaG91bGRUcnlOYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlKGZvcm1hdCkpIHtcbiAgICB2YXIgZm9ybWF0dGVkTnVtYmVyID0gZm9ybWF0TmF0aW9uYWxOdW1iZXIoc3RhdGUsIGZvcm1hdCwge1xuICAgICAgdXNlTmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZTogdHJ1ZSxcbiAgICAgIGdldFNlcGFyYXRvckFmdGVyTmF0aW9uYWxQcmVmaXg6IGdldFNlcGFyYXRvckFmdGVyTmF0aW9uYWxQcmVmaXgsXG4gICAgICBtZXRhZGF0YTogbWV0YWRhdGFcbiAgICB9KTtcblxuICAgIGlmIChmb3JtYXR0ZWROdW1iZXIpIHtcbiAgICAgIHJldHVybiBmb3JtYXR0ZWROdW1iZXI7XG4gICAgfVxuICB9IC8vIEZvcm1hdCB0aGUgbnVtYmVyIHdpdGhvdXQgdXNpbmcgYG5hdGlvbmFsX3ByZWZpeF9mb3JtYXR0aW5nX3J1bGVgLlxuXG5cbiAgcmV0dXJuIGZvcm1hdE5hdGlvbmFsTnVtYmVyKHN0YXRlLCBmb3JtYXQsIHtcbiAgICB1c2VOYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlOiBmYWxzZSxcbiAgICBnZXRTZXBhcmF0b3JBZnRlck5hdGlvbmFsUHJlZml4OiBnZXRTZXBhcmF0b3JBZnRlck5hdGlvbmFsUHJlZml4LFxuICAgIG1ldGFkYXRhOiBtZXRhZGF0YVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TmF0aW9uYWxOdW1iZXIoc3RhdGUsIGZvcm1hdCwgX3JlZjMpIHtcbiAgdmFyIG1ldGFkYXRhID0gX3JlZjMubWV0YWRhdGEsXG4gICAgICB1c2VOYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlID0gX3JlZjMudXNlTmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSxcbiAgICAgIGdldFNlcGFyYXRvckFmdGVyTmF0aW9uYWxQcmVmaXggPSBfcmVmMy5nZXRTZXBhcmF0b3JBZnRlck5hdGlvbmFsUHJlZml4O1xuICB2YXIgZm9ybWF0dGVkTmF0aW9uYWxOdW1iZXIgPSAoMCwgX2Zvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXRbXCJkZWZhdWx0XCJdKShzdGF0ZS5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyLCBmb3JtYXQsIHtcbiAgICBjYXJyaWVyQ29kZTogc3RhdGUuY2FycmllckNvZGUsXG4gICAgdXNlSW50ZXJuYXRpb25hbEZvcm1hdDogc3RhdGUuaW50ZXJuYXRpb25hbCxcbiAgICB3aXRoTmF0aW9uYWxQcmVmaXg6IHVzZU5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUsXG4gICAgbWV0YWRhdGE6IG1ldGFkYXRhXG4gIH0pO1xuXG4gIGlmICghdXNlTmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSkge1xuICAgIGlmIChzdGF0ZS5uYXRpb25hbFByZWZpeCkge1xuICAgICAgLy8gSWYgYSBuYXRpb25hbCBwcmVmaXggd2FzIGV4dHJhY3RlZCwgdGhlbiBqdXN0IHByZXBlbmQgaXQsXG4gICAgICAvLyBmb2xsb3dlZCBieSBhIFwiIFwiIGNoYXJhY3Rlci5cbiAgICAgIGZvcm1hdHRlZE5hdGlvbmFsTnVtYmVyID0gc3RhdGUubmF0aW9uYWxQcmVmaXggKyBnZXRTZXBhcmF0b3JBZnRlck5hdGlvbmFsUHJlZml4KGZvcm1hdCkgKyBmb3JtYXR0ZWROYXRpb25hbE51bWJlcjtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmNvbXBsZXhQcmVmaXhCZWZvcmVOYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKSB7XG4gICAgICBmb3JtYXR0ZWROYXRpb25hbE51bWJlciA9IHN0YXRlLmNvbXBsZXhQcmVmaXhCZWZvcmVOYXRpb25hbFNpZ25pZmljYW50TnVtYmVyICsgJyAnICsgZm9ybWF0dGVkTmF0aW9uYWxOdW1iZXI7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzVmFsaWRGb3JtYXR0ZWROYXRpb25hbE51bWJlcihmb3JtYXR0ZWROYXRpb25hbE51bWJlciwgc3RhdGUpKSB7XG4gICAgcmV0dXJuIGZvcm1hdHRlZE5hdGlvbmFsTnVtYmVyO1xuICB9XG59IC8vIENoZWNrIHRoYXQgdGhlIGZvcm1hdHRlZCBwaG9uZSBudW1iZXIgY29udGFpbnMgZXhhY3RseVxuLy8gdGhlIHNhbWUgZGlnaXRzIHRoYXQgaGF2ZSBiZWVuIGlucHV0IGJ5IHRoZSB1c2VyLlxuLy8gRm9yIGV4YW1wbGUsIHdoZW4gXCIwMTExNTIzNDU2Nzg5XCIgaXMgaW5wdXQgZm9yIGBBUmAgY291bnRyeSxcbi8vIHRoZSBleHRyYWN0ZWQgYHRoaXMubmF0aW9uYWxTaWduaWZpY2FudE51bWJlcmAgaXMgXCI5MTEyMzQ1Njc4OVwiLFxuLy8gd2hpY2ggbWVhbnMgdGhhdCB0aGUgbmF0aW9uYWwgcGFydCBvZiBgdGhpcy5kaWdpdHNgIGlzbid0IHNpbXBseSBlcXVhbCB0b1xuLy8gYHRoaXMubmF0aW9uYWxQcmVmaXhgICsgYHRoaXMubmF0aW9uYWxTaWduaWZpY2FudE51bWJlcmAuXG4vL1xuLy8gQWxzbywgYSBgZm9ybWF0YCBjYW4gYWRkIGV4dHJhIGRpZ2l0cyB0byB0aGUgYHRoaXMubmF0aW9uYWxTaWduaWZpY2FudE51bWJlcmBcbi8vIGJlaW5nIGZvcm1hdHRlZCB2aWEgYG1ldGFkYXRhW2NvdW50cnldLm5hdGlvbmFsX3ByZWZpeF90cmFuc2Zvcm1fcnVsZWAuXG4vLyBGb3IgZXhhbXBsZSwgZm9yIGBWSWAgY291bnRyeSwgaXQgcHJlcGVuZHMgYDM0MGAgdG8gdGhlIG5hdGlvbmFsIG51bWJlcixcbi8vIGFuZCBpZiB0aGlzIGNoZWNrIGhhc24ndCBiZWVuIGltcGxlbWVudGVkLCB0aGVuIHRoZXJlIHdvdWxkIGJlIGEgYnVnXG4vLyB3aGVuIGAzNDBgIFwiYXJlYSBjb3VkZVwiIGlzIFwiZHVwbGljYXRlZFwiIGR1cmluZyBpbnB1dCBmb3IgYFZJYCBjb3VudHJ5OlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2NhdGFtcGhldGFtaW5lL2xpYnBob25lbnVtYmVyLWpzL2lzc3Vlcy8zMThcbi8vXG4vLyBTbywgYWxsIHRoZXNlIFwiZ290Y2hhc1wiIGFyZSBmaWx0ZXJlZCBvdXQuXG4vL1xuLy8gSW4gdGhlIG9yaWdpbmFsIEdvb2dsZSdzIGNvZGUsIHRoZSBjb21tZW50cyBzYXk6XG4vLyBcIkNoZWNrIHRoYXQgd2UgZGlkbid0IHJlbW92ZSBub3IgYWRkIGFueSBleHRyYSBkaWdpdHMgd2hlbiB3ZSBtYXRjaGVkXG4vLyB0aGlzIGZvcm1hdHRpbmcgcGF0dGVybi4gVGhpcyB1c3VhbGx5IGhhcHBlbnMgYWZ0ZXIgd2UgZW50ZXJlZCB0aGUgbGFzdFxuLy8gZGlnaXQgZHVyaW5nIEFZVEYuIEVnOiBJbiBjYXNlIG9mIE1YLCB3ZSBzd2FsbG93IG1vYmlsZSB0b2tlbiAoMSkgd2hlblxuLy8gZm9ybWF0dGVkIGJ1dCBBWVRGIHNob3VsZCByZXRhaW4gYWxsIHRoZSBudW1iZXIgZW50ZXJlZCBhbmQgbm90IGNoYW5nZVxuLy8gaW4gb3JkZXIgdG8gbWF0Y2ggYSBmb3JtYXQgKG9mIHNhbWUgbGVhZGluZyBkaWdpdHMgYW5kIGxlbmd0aCkgZGlzcGxheVxuLy8gaW4gdGhhdCB3YXkuXCJcbi8vIFwiSWYgaXQncyB0aGUgc2FtZSAoaS5lIGVudGVyZWQgbnVtYmVyIGFuZCBmb3JtYXQgaXMgc2FtZSksIHRoZW4gaXQnc1xuLy8gc2FmZSB0byByZXR1cm4gdGhpcyBpbiBmb3JtYXR0ZWQgbnVtYmVyIGFzIG5vdGhpbmcgaXMgbG9zdCAvIGFkZGVkLlwiXG4vLyBPdGhlcndpc2UsIGRvbid0IHVzZSB0aGlzIGZvcm1hdC5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvbGlicGhvbmVudW1iZXIvY29tbWl0LzNlN2MxZjA0ZjVlNzIwMGY4N2ZiMTMxZTZmODVjNmU5OWQ2MGY1MTAjZGlmZi05MTQ5NDU3ZmE5ZjVkNjA4YTExYmI5NzVjNmVmNGJjNVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9saWJwaG9uZW51bWJlci9jb21taXQvM2FjODhjNzEwNmU3ZGNiNTUzYmNjNzk0YjE1ZjE5MTg1OTI4YTFjNiNkaWZmLTJkY2I3N2U4MzM0MjJlZTMwNGRhMzQ4YjkwNWNkZTBiXG4vL1xuXG5cbmZ1bmN0aW9uIGlzVmFsaWRGb3JtYXR0ZWROYXRpb25hbE51bWJlcihmb3JtYXR0ZWROYXRpb25hbE51bWJlciwgc3RhdGUpIHtcbiAgcmV0dXJuICgwLCBfcGFyc2VEaWdpdHNbXCJkZWZhdWx0XCJdKShmb3JtYXR0ZWROYXRpb25hbE51bWJlcikgPT09IHN0YXRlLmdldE5hdGlvbmFsRGlnaXRzKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc1lvdVR5cGVGb3JtYXR0ZXIuY29tcGxldGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9LCBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRJR0lUX1BMQUNFSE9MREVSXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9Bc1lvdVR5cGVGb3JtYXR0ZXJVdGlsLkRJR0lUX1BMQUNFSE9MREVSO1xuICB9XG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX0FzWW91VHlwZUZvcm1hdHRlclV0aWwgPSByZXF1aXJlKFwiLi9Bc1lvdVR5cGVGb3JtYXR0ZXIudXRpbC5qc1wiKTtcblxudmFyIF9Bc1lvdVR5cGVGb3JtYXR0ZXJDb21wbGV0ZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL0FzWW91VHlwZUZvcm1hdHRlci5jb21wbGV0ZS5qc1wiKSk7XG5cbnZhciBfQXNZb3VUeXBlRm9ybWF0dGVyUGF0dGVybk1hdGNoZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0FzWW91VHlwZUZvcm1hdHRlci5QYXR0ZXJuTWF0Y2hlci5qc1wiKSk7XG5cbnZhciBfcGFyc2VEaWdpdHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvcGFyc2VEaWdpdHMuanNcIikpO1xuXG52YXIgX2Zvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQgPSByZXF1aXJlKFwiLi9oZWxwZXJzL2Zvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQuanNcIik7XG5cbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4vY29uc3RhbnRzLmpzXCIpO1xuXG52YXIgX2FwcGx5SW50ZXJuYXRpb25hbFNlcGFyYXRvclN0eWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9oZWxwZXJzL2FwcGx5SW50ZXJuYXRpb25hbFNlcGFyYXRvclN0eWxlLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkgeyBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBcImRlZmF1bHRcIjogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKGl0KSByZXR1cm4gKGl0ID0gaXQuY2FsbChvKSkubmV4dC5iaW5kKGl0KTsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuLy8gVXNlZCBpbiBwaG9uZSBudW1iZXIgZm9ybWF0IHRlbXBsYXRlIGNyZWF0aW9uLlxuLy8gQ291bGQgYmUgYW55IGRpZ2l0LCBJIGd1ZXNzLlxudmFyIERVTU1ZX0RJR0lUID0gJzknOyAvLyBJIGRvbid0IGtub3cgd2h5IGlzIGl0IGV4YWN0bHkgYDE1YFxuXG52YXIgTE9OR0VTVF9OQVRJT05BTF9QSE9ORV9OVU1CRVJfTEVOR1RIID0gMTU7IC8vIENyZWF0ZSBhIHBob25lIG51bWJlciBjb25zaXN0aW5nIG9ubHkgb2YgdGhlIGRpZ2l0IDkgdGhhdCBtYXRjaGVzIHRoZVxuLy8gYG51bWJlcl9wYXR0ZXJuYCBieSBhcHBseWluZyB0aGUgcGF0dGVybiB0byB0aGUgXCJsb25nZXN0IHBob25lIG51bWJlclwiIHN0cmluZy5cblxudmFyIExPTkdFU1RfRFVNTVlfUEhPTkVfTlVNQkVSID0gKDAsIF9Bc1lvdVR5cGVGb3JtYXR0ZXJVdGlsLnJlcGVhdCkoRFVNTVlfRElHSVQsIExPTkdFU1RfTkFUSU9OQUxfUEhPTkVfTlVNQkVSX0xFTkdUSCk7IC8vIEEgc2V0IG9mIGNoYXJhY3RlcnMgdGhhdCwgaWYgZm91bmQgaW4gYSBuYXRpb25hbCBwcmVmaXggZm9ybWF0dGluZyBydWxlcywgYXJlIGFuIGluZGljYXRvciB0b1xuLy8gdXMgdGhhdCB3ZSBzaG91bGQgc2VwYXJhdGUgdGhlIG5hdGlvbmFsIHByZWZpeCBmcm9tIHRoZSBudW1iZXIgd2hlbiBmb3JtYXR0aW5nLlxuXG52YXIgTkFUSU9OQUxfUFJFRklYX1NFUEFSQVRPUlNfUEFUVEVSTiA9IC9bLSBdLzsgLy8gRGVwcmVjYXRlZDogR29vZ2xlIGhhcyByZW1vdmVkIHNvbWUgZm9ybWF0dGluZyBwYXR0ZXJuIHJlbGF0ZWQgY29kZSBmcm9tIHRoZWlyIHJlcG8uXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlaTE4bi9saWJwaG9uZW51bWJlci9jb21taXQvYTM5NWI0ZmVmM2NhZjU3YzRiYzVmMDgyZTExNTJhNGQyYmQwYmE0Y1xuLy8gXCJXZSBubyBsb25nZXIgaGF2ZSBudW1iZXJzIGluIGZvcm1hdHRpbmcgbWF0Y2hpbmcgcGF0dGVybnMsIG9ubHkgXFxkLlwiXG4vLyBCZWNhdXNlIHRoaXMgbGlicmFyeSBzdXBwb3J0cyBnZW5lcmF0aW5nIGN1c3RvbSBtZXRhZGF0YVxuLy8gc29tZSB1c2VycyBtYXkgc3RpbGwgYmUgdXNpbmcgb2xkIG1ldGFkYXRhIHNvIHRoZSByZWxldmFudFxuLy8gY29kZSBzZWVtcyB0byBzdGF5IHVudGlsIHNvbWUgbmV4dCBtYWpvciB2ZXJzaW9uIHVwZGF0ZS5cblxudmFyIFNVUFBPUlRfTEVHQUNZX0ZPUk1BVFRJTkdfUEFUVEVSTlMgPSB0cnVlOyAvLyBBIHBhdHRlcm4gdGhhdCBpcyB1c2VkIHRvIG1hdGNoIGNoYXJhY3RlciBjbGFzc2VzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4vLyBBbiBleGFtcGxlIG9mIGEgY2hhcmFjdGVyIGNsYXNzIGlzIFwiWzEtNF1cIi5cblxudmFyIENSRUFURV9DSEFSQUNURVJfQ0xBU1NfUEFUVEVSTiA9IFNVUFBPUlRfTEVHQUNZX0ZPUk1BVFRJTkdfUEFUVEVSTlMgJiYgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gL1xcWyhbXlxcW1xcXV0pKlxcXS9nO1xufTsgLy8gQW55IGRpZ2l0IGluIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgYWN0dWFsbHkgZGVub3RlcyBhIGRpZ2l0LiBGb3Jcbi8vIGV4YW1wbGUsIGluIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gXCI4MFswLTJdXFxkezYsMTB9XCIsIHRoZSBmaXJzdCAyIGRpZ2l0c1xuLy8gKDggYW5kIDApIGFyZSBzdGFuZGFsb25lIGRpZ2l0cywgYnV0IHRoZSByZXN0IGFyZSBub3QuXG4vLyBUd28gbG9vay1haGVhZHMgYXJlIG5lZWRlZCBiZWNhdXNlIHRoZSBudW1iZXIgZm9sbG93aW5nIFxcXFxkIGNvdWxkIGJlIGFcbi8vIHR3by1kaWdpdCBudW1iZXIsIHNpbmNlIHRoZSBwaG9uZSBudW1iZXIgY2FuIGJlIGFzIGxvbmcgYXMgMTUgZGlnaXRzLlxuXG5cbnZhciBDUkVBVEVfU1RBTkRBTE9ORV9ESUdJVF9QQVRURVJOID0gU1VQUE9SVF9MRUdBQ1lfRk9STUFUVElOR19QQVRURVJOUyAmJiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAvXFxkKD89W14sfV1bXix9XSkvZztcbn07IC8vIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBgZm9ybWF0YCBpc1xuLy8gc3VpdGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgXCJhcyB5b3UgdHlwZSBmb3JtYXR0ZXJcIi5cbi8vIEEgYGZvcm1hdGAgaXMgc3VpdGFibGUgd2hlbiB0aGUgcmVzdWx0aW5nIGZvcm1hdHRlZCBudW1iZXIgaGFzXG4vLyB0aGUgc2FtZSBkaWdpdHMgYXMgdGhlIHVzZXIgaGFzIGVudGVyZWQuXG4vL1xuLy8gSW4gdGhlIHNpbXBsZXN0IGNhc2UsIHRoYXQgd291bGQgbWVhbiB0aGF0IHRoZSBmb3JtYXRcbi8vIGRvZXNuJ3QgYWRkIGFueSBhZGRpdGlvbmFsIGRpZ2l0cyB3aGVuIGZvcm1hdHRpbmcgYSBudW1iZXIuXG4vLyBHb29nbGUgc2F5cyB0aGF0IGl0IGFsc28gc2hvdWxkbid0IGFkZCBcInN0YXJcIiAoYCpgKSBjaGFyYWN0ZXJzLFxuLy8gbGlrZSBpdCBkb2VzIGluIHNvbWUgSXNyYWVsaSBmb3JtYXRzLlxuLy8gU3VjaCBiYXNpYyBmb3JtYXQgd291bGQgb25seSBjb250YWluIFwidmFsaWQgcHVuY3R1YXRpb25cIlxuLy8gYW5kIFwiY2FwdHVyZWQgZ3JvdXBcIiBpZGVudGlmaWVycyAoJDEsICQyLCBldGMpLlxuLy9cbi8vIEFuIGV4YW1wbGUgb2YgYSBmb3JtYXQgdGhhdCBhZGRzIGFkZGl0aW9uYWwgZGlnaXRzOlxuLy9cbi8vIENvdW50cnk6IGBBUmAgKEFyZ2VudGluYSkuXG4vLyBGb3JtYXQ6XG4vLyB7XG4vLyAgICBcInBhdHRlcm5cIjogXCIoXFxcXGQpKFxcXFxkezJ9KShcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXG4vLyAgICBcImxlYWRpbmdfZGlnaXRzX3BhdHRlcm5zXCI6IFtcIjkxXCJdLFxuLy8gICAgXCJuYXRpb25hbF9wcmVmaXhfZm9ybWF0dGluZ19ydWxlXCI6IFwiMCQxXCIsXG4vLyAgICBcImZvcm1hdFwiOiBcIiQyIDE1LSQzLSQ0XCIsXG4vLyAgICBcImludGVybmF0aW9uYWxfZm9ybWF0XCI6IFwiJDEgJDIgJDMtJDRcIlxuLy8gfVxuLy9cbi8vIEluIHRoZSBmb3JtYXQgYWJvdmUsIHRoZSBgZm9ybWF0YCBhZGRzIGAxNWAgdG8gdGhlIGRpZ2l0cyB3aGVuIGZvcm1hdHRpbmcgYSBudW1iZXIuXG4vLyBBIHNpZGVub3RlOiB0aGlzIGZvcm1hdCBhY3R1YWxseSBpcyBzdWl0YWJsZSBiZWNhdXNlIGBuYXRpb25hbF9wcmVmaXhfZm9yX3BhcnNpbmdgXG4vLyBoYXMgcHJldmlvdXNseSByZW1vdmVkIGAxNWAgZnJvbSBhIG5hdGlvbmFsIG51bWJlciwgc28gcmUtYWRkaW5nIGAxNWAgaW4gYGZvcm1hdGBcbi8vIGRvZXNuJ3QgYWN0dWFsbHkgcmVzdWx0IGluIGFueSBleHRyYSBkaWdpdHMgYWRkZWQgdG8gdXNlcidzIGlucHV0LlxuLy8gQnV0IHZlcmlmeWluZyB0aGF0IHdvdWxkIGJlIGEgY29tcGxleCBwcm9jZWR1cmUsIHNvIHRoZSBjb2RlIGNob29zZXMgYSBzaW1wbGVyIHBhdGg6XG4vLyBpdCBzaW1wbHkgZmlsdGVycyBvdXQgYWxsIGBmb3JtYXRgcyB0aGF0IGNvbnRhaW4gYW55dGhpbmcgYnV0IFwiY2FwdHVyZWQgZ3JvdXBcIiBpZHMuXG4vL1xuLy8gVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMgY2FsbGVkIGBFTElHSUJMRV9GT1JNQVRfUEFUVEVSTmAgaW4gR29vZ2xlJ3Ncbi8vIGBsaWJwaG9uZW51bWJlcmAgY29kZS5cbi8vXG5cblxudmFyIE5PTl9BTFRFUklOR19GT1JNQVRfUkVHX0VYUCA9IG5ldyBSZWdFeHAoJ1snICsgX2NvbnN0YW50cy5WQUxJRF9QVU5DVFVBVElPTiArICddKicgKyAvLyBHb29nbGUgZGV2ZWxvcGVycyBzYXk6XG4vLyBcIldlIHJlcXVpcmUgdGhhdCB0aGUgZmlyc3QgbWF0Y2hpbmcgZ3JvdXAgaXMgcHJlc2VudCBpbiB0aGVcbi8vICBvdXRwdXQgcGF0dGVybiB0byBlbnN1cmUgbm8gZGF0YSBpcyBsb3N0IHdoaWxlIGZvcm1hdHRpbmcuXCJcbidcXFxcJDEnICsgJ1snICsgX2NvbnN0YW50cy5WQUxJRF9QVU5DVFVBVElPTiArICddKicgKyAnKFxcXFwkXFxcXGRbJyArIF9jb25zdGFudHMuVkFMSURfUFVOQ1RVQVRJT04gKyAnXSopKicgKyAnJCcpOyAvLyBUaGlzIGlzIHRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgbGVhZGluZyBkaWdpdHMgb2YgYSBwaG9uZSBudW1iZXJcbi8vIHRvIGd1YXJhbnRlZSB0aGUgZmlyc3QgXCJsZWFkaW5nIGRpZ2l0cyBwYXR0ZXJuXCIgZm9yIGEgcGhvbmUgbnVtYmVyIGZvcm1hdFxuLy8gdG8gYmUgcHJlZW1wdGl2ZS5cblxudmFyIE1JTl9MRUFESU5HX0RJR0lUU19MRU5HVEggPSAzO1xuXG52YXIgQXNZb3VUeXBlRm9ybWF0dGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQXNZb3VUeXBlRm9ybWF0dGVyKF9yZWYpIHtcbiAgICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgICBtZXRhZGF0YSA9IF9yZWYubWV0YWRhdGE7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXNZb3VUeXBlRm9ybWF0dGVyKTtcblxuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB0aGlzLnJlc2V0Rm9ybWF0KCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQXNZb3VUeXBlRm9ybWF0dGVyLCBbe1xuICAgIGtleTogXCJyZXNldEZvcm1hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldEZvcm1hdCgpIHtcbiAgICAgIHRoaXMuY2hvc2VuRm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMubmF0aW9uYWxOdW1iZXJUZW1wbGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMucG9wdWxhdGVkTmF0aW9uYWxOdW1iZXJUZW1wbGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMucG9wdWxhdGVkTmF0aW9uYWxOdW1iZXJUZW1wbGF0ZVBvc2l0aW9uID0gLTE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KG51bWJlcmluZ1BsYW4sIHN0YXRlKSB7XG4gICAgICB0aGlzLnJlc2V0Rm9ybWF0KCk7XG5cbiAgICAgIGlmIChudW1iZXJpbmdQbGFuKSB7XG4gICAgICAgIHRoaXMuaXNOQU5QID0gbnVtYmVyaW5nUGxhbi5jYWxsaW5nQ29kZSgpID09PSAnMSc7XG4gICAgICAgIHRoaXMubWF0Y2hpbmdGb3JtYXRzID0gbnVtYmVyaW5nUGxhbi5mb3JtYXRzKCk7XG5cbiAgICAgICAgaWYgKHN0YXRlLm5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIpIHtcbiAgICAgICAgICB0aGlzLm5hcnJvd0Rvd25NYXRjaGluZ0Zvcm1hdHMoc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzTkFOUCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5tYXRjaGluZ0Zvcm1hdHMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBGb3JtYXRzIGFuIHVwZGF0ZWQgcGhvbmUgbnVtYmVyLlxyXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBuZXh0RGlnaXRzIOKAlCBBZGRpdGlvbmFsIHBob25lIG51bWJlciBkaWdpdHMuXHJcbiAgICAgKiBAcGFyYW0gIHtvYmplY3R9IHN0YXRlIOKAlMKgYEFzWW91VHlwZWAgc3RhdGUuXHJcbiAgICAgKiBAcmV0dXJuIHtbc3RyaW5nXX0gUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIHVwZGF0ZWQgcGhvbmUgbnVtYmVyIGNhbid0IGJlIGZvcm1hdHRlZCB1c2luZyBhbnkgb2YgdGhlIGF2YWlsYWJsZSBmb3JtYXRzLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJmb3JtYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0KG5leHREaWdpdHMsIHN0YXRlKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAvLyBTZWUgaWYgdGhlIHBob25lIG51bWJlciBkaWdpdHMgY2FuIGJlIGZvcm1hdHRlZCBhcyBhIGNvbXBsZXRlIHBob25lIG51bWJlci5cbiAgICAgIC8vIElmIG5vdCwgdXNlIHRoZSByZXN1bHRzIGZyb20gYGZvcm1hdE5hdGlvbmFsTnVtYmVyV2l0aE5leHREaWdpdHMoKWAsXG4gICAgICAvLyB3aGljaCBmb3JtYXRzIGJhc2VkIG9uIHRoZSBjaG9zZW4gZm9ybWF0dGluZyBwYXR0ZXJuLlxuICAgICAgLy9cbiAgICAgIC8vIEF0dGVtcHRpbmcgdG8gZm9ybWF0IGNvbXBsZXRlIHBob25lIG51bWJlciBmaXJzdCBpcyBob3cgaXQncyBkb25lXG4gICAgICAvLyBpbiBHb29nbGUncyBgbGlicGhvbmVudW1iZXJgLCBzbyB0aGlzIGxpYnJhcnkganVzdCBmb2xsb3dzIGl0LlxuICAgICAgLy8gR29vZ2xlJ3MgYGxpYnBob25lbnVtYmVyYCBjb2RlIGRvZXNuJ3QgZXhwbGFpbiBpbiBkZXRhaWwgd2h5IGRvZXMgaXRcbiAgICAgIC8vIGF0dGVtcHQgdG8gZm9ybWF0IGRpZ2l0cyBhcyBhIGNvbXBsZXRlIHBob25lIG51bWJlclxuICAgICAgLy8gaW5zdGVhZCBvZiBqdXN0IGdvaW5nIHdpdGggYSBwcmV2aW91bHN5IChvciBuZXdseSkgY2hvc2VuIGBmb3JtYXRgOlxuICAgICAgLy9cbiAgICAgIC8vIFwiQ2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBpcyBhbiBleGFjdCBwYXR0ZXJuIG1hdGNoIGZvciB0aGVzZSBkaWdpdHMuXG4gICAgICAvLyAgSWYgc28sIHdlIHNob3VsZCB1c2UgdGhpcyBpbnN0ZWFkIG9mIGFueSBvdGhlciBmb3JtYXR0aW5nIHRlbXBsYXRlXG4gICAgICAvLyAgd2hvc2UgbGVhZGluZ0RpZ2l0c1BhdHRlcm4gYWxzbyBtYXRjaGVzIHRoZSBpbnB1dC5cIlxuICAgICAgLy9cbiAgICAgIGlmICgoMCwgX0FzWW91VHlwZUZvcm1hdHRlckNvbXBsZXRlLmNhbkZvcm1hdENvbXBsZXRlTnVtYmVyKShzdGF0ZS5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyLCB0aGlzLm1ldGFkYXRhKSkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKHRoaXMubWF0Y2hpbmdGb3JtYXRzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgZm9ybWF0ID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgdmFyIGZvcm1hdHRlZENvbXBsZXRlTnVtYmVyID0gKDAsIF9Bc1lvdVR5cGVGb3JtYXR0ZXJDb21wbGV0ZVtcImRlZmF1bHRcIl0pKHN0YXRlLCBmb3JtYXQsIHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgc2hvdWxkVHJ5TmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZTogZnVuY3Rpb24gc2hvdWxkVHJ5TmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZShmb3JtYXQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnNob3VsZFRyeU5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUoZm9ybWF0LCB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYXRpb25hbDogc3RhdGUuaW50ZXJuYXRpb25hbCxcbiAgICAgICAgICAgICAgICBuYXRpb25hbFByZWZpeDogc3RhdGUubmF0aW9uYWxQcmVmaXhcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0U2VwYXJhdG9yQWZ0ZXJOYXRpb25hbFByZWZpeDogZnVuY3Rpb24gZ2V0U2VwYXJhdG9yQWZ0ZXJOYXRpb25hbFByZWZpeChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmdldFNlcGFyYXRvckFmdGVyTmF0aW9uYWxQcmVmaXgoZm9ybWF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChmb3JtYXR0ZWRDb21wbGV0ZU51bWJlcikge1xuICAgICAgICAgICAgdGhpcy5yZXNldEZvcm1hdCgpO1xuICAgICAgICAgICAgdGhpcy5jaG9zZW5Gb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgICAgICB0aGlzLnNldE5hdGlvbmFsTnVtYmVyVGVtcGxhdGUoZm9ybWF0dGVkQ29tcGxldGVOdW1iZXIucmVwbGFjZSgvXFxkL2csIF9Bc1lvdVR5cGVGb3JtYXR0ZXJVdGlsLkRJR0lUX1BMQUNFSE9MREVSKSwgc3RhdGUpO1xuICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZWROYXRpb25hbE51bWJlclRlbXBsYXRlID0gZm9ybWF0dGVkQ29tcGxldGVOdW1iZXI7IC8vIFdpdGggYSBuZXcgZm9ybWF0dGluZyB0ZW1wbGF0ZSwgdGhlIG1hdGNoZWQgcG9zaXRpb25cbiAgICAgICAgICAgIC8vIHVzaW5nIHRoZSBvbGQgdGVtcGxhdGUgbmVlZHMgdG8gYmUgcmVzZXQuXG5cbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVkTmF0aW9uYWxOdW1iZXJUZW1wbGF0ZVBvc2l0aW9uID0gdGhpcy50ZW1wbGF0ZS5sYXN0SW5kZXhPZihfQXNZb3VUeXBlRm9ybWF0dGVyVXRpbC5ESUdJVF9QTEFDRUhPTERFUik7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVkQ29tcGxldGVOdW1iZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIEZvcm1hdCB0aGUgZGlnaXRzIGFzIGEgcGFydGlhbCAoaW5jb21wbGV0ZSkgcGhvbmUgbnVtYmVyXG4gICAgICAvLyB1c2luZyB0aGUgcHJldmlvdXNseSBjaG9zZW4gZm9ybWF0dGluZyBwYXR0ZXJuIChvciBhIG5ld2x5IGNob3NlbiBvbmUpLlxuXG5cbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdE5hdGlvbmFsTnVtYmVyV2l0aE5leHREaWdpdHMobmV4dERpZ2l0cywgc3RhdGUpO1xuICAgIH0gLy8gRm9ybWF0cyB0aGUgbmV4dCBwaG9uZSBudW1iZXIgZGlnaXRzLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZm9ybWF0TmF0aW9uYWxOdW1iZXJXaXRoTmV4dERpZ2l0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JtYXROYXRpb25hbE51bWJlcldpdGhOZXh0RGlnaXRzKG5leHREaWdpdHMsIHN0YXRlKSB7XG4gICAgICB2YXIgcHJldmlvdXNseUNob3NlbkZvcm1hdCA9IHRoaXMuY2hvc2VuRm9ybWF0OyAvLyBDaG9vc2UgYSBmb3JtYXQgZnJvbSB0aGUgbGlzdCBvZiBtYXRjaGluZyBvbmVzLlxuXG4gICAgICB2YXIgbmV3bHlDaG9zZW5Gb3JtYXQgPSB0aGlzLmNob29zZUZvcm1hdChzdGF0ZSk7XG5cbiAgICAgIGlmIChuZXdseUNob3NlbkZvcm1hdCkge1xuICAgICAgICBpZiAobmV3bHlDaG9zZW5Gb3JtYXQgPT09IHByZXZpb3VzbHlDaG9zZW5Gb3JtYXQpIHtcbiAgICAgICAgICAvLyBJZiBpdCBjYW4gZm9ybWF0IHRoZSBuZXh0IChjdXJyZW50KSBkaWdpdHNcbiAgICAgICAgICAvLyB1c2luZyB0aGUgcHJldmlvdXNseSBjaG9zZW4gcGhvbmUgbnVtYmVyIGZvcm1hdFxuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSB1cGRhdGVkIGZvcm1hdHRlZCBudW1iZXIuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0TmV4dE5hdGlvbmFsTnVtYmVyRGlnaXRzKG5leHREaWdpdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIGEgbW9yZSBhcHByb3ByaWF0ZSBwaG9uZSBudW1iZXIgZm9ybWF0XG4gICAgICAgICAgLy8gaGFzIGJlZW4gY2hvc2VuIGZvciB0aGVzZSBcImxlYWRpbmcgZGlnaXRzXCIsXG4gICAgICAgICAgLy8gdGhlbiByZS1mb3JtYXQgdGhlIG5hdGlvbmFsIHBob25lIG51bWJlciBwYXJ0XG4gICAgICAgICAgLy8gdXNpbmcgdGhlIG5ld2x5IHNlbGVjdGVkIGZvcm1hdC5cbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXROZXh0TmF0aW9uYWxOdW1iZXJEaWdpdHMoc3RhdGUuZ2V0TmF0aW9uYWxEaWdpdHMoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmFycm93RG93bk1hdGNoaW5nRm9ybWF0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuYXJyb3dEb3duTWF0Y2hpbmdGb3JtYXRzKF9yZWYyKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIgPSBfcmVmMi5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyLFxuICAgICAgICAgIG5hdGlvbmFsUHJlZml4ID0gX3JlZjIubmF0aW9uYWxQcmVmaXgsXG4gICAgICAgICAgaW50ZXJuYXRpb25hbCA9IF9yZWYyLmludGVybmF0aW9uYWw7XG4gICAgICB2YXIgbGVhZGluZ0RpZ2l0cyA9IG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXI7IC8vIFwibGVhZGluZyBkaWdpdHNcIiBwYXR0ZXJuIGxpc3Qgc3RhcnRzIHdpdGggYVxuICAgICAgLy8gXCJsZWFkaW5nIGRpZ2l0c1wiIHBhdHRlcm4gZml0dGluZyBhIG1heGltdW0gb2YgMyBsZWFkaW5nIGRpZ2l0cy5cbiAgICAgIC8vIFNvLCBhZnRlciBhIHVzZXIgaW5wdXRzIDMgZGlnaXRzIG9mIGEgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBwaG9uZSBudW1iZXJcbiAgICAgIC8vIHRoaXMgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIgY2FuIGFscmVhZHkgYmUgZm9ybWF0dGVkLlxuICAgICAgLy8gVGhlIG5leHQgXCJsZWFkaW5nIGRpZ2l0c1wiIHBhdHRlcm4gaXMgZm9yIDQgbGVhZGluZyBkaWdpdHMgbWF4LFxuICAgICAgLy8gYW5kIHRoZSBcImxlYWRpbmcgZGlnaXRzXCIgcGF0dGVybiBhZnRlciBpdCBpcyBmb3IgNSBsZWFkaW5nIGRpZ2l0cyBtYXgsIGV0Yy5cbiAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgZGlmZmVyZW50IGZyb20gR29vZ2xlJ3NcbiAgICAgIC8vIGluIHRoYXQgaXQgc2VhcmNoZXMgZm9yIGEgZml0dGluZyBmb3JtYXRcbiAgICAgIC8vIGV2ZW4gaWYgdGhlIHVzZXIgaGFzIGVudGVyZWQgbGVzcyB0aGFuXG4gICAgICAvLyBgTUlOX0xFQURJTkdfRElHSVRTX0xFTkdUSGAgZGlnaXRzIG9mIGEgbmF0aW9uYWwgbnVtYmVyLlxuICAgICAgLy8gQmVjYXVzZSBzb21lIGxlYWRpbmcgZGlnaXQgcGF0dGVybnMgYWxyZWFkeSBtYXRjaCBmb3IgYSBzaW5nbGUgZmlyc3QgZGlnaXQuXG5cbiAgICAgIHZhciBsZWFkaW5nRGlnaXRzUGF0dGVybkluZGV4ID0gbGVhZGluZ0RpZ2l0cy5sZW5ndGggLSBNSU5fTEVBRElOR19ESUdJVFNfTEVOR1RIO1xuXG4gICAgICBpZiAobGVhZGluZ0RpZ2l0c1BhdHRlcm5JbmRleCA8IDApIHtcbiAgICAgICAgbGVhZGluZ0RpZ2l0c1BhdHRlcm5JbmRleCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWF0Y2hpbmdGb3JtYXRzID0gdGhpcy5tYXRjaGluZ0Zvcm1hdHMuZmlsdGVyKGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5mb3JtYXRTdWl0cyhmb3JtYXQsIGludGVybmF0aW9uYWwsIG5hdGlvbmFsUHJlZml4KSAmJiBfdGhpczIuZm9ybWF0TWF0Y2hlcyhmb3JtYXQsIGxlYWRpbmdEaWdpdHMsIGxlYWRpbmdEaWdpdHNQYXR0ZXJuSW5kZXgpO1xuICAgICAgfSk7IC8vIElmIHRoZXJlIHdhcyBhIHBob25lIG51bWJlciBmb3JtYXQgY2hvc2VuXG4gICAgICAvLyBhbmQgaXQgbm8gbG9uZ2VyIGhvbGRzIGdpdmVuIHRoZSBuZXcgbGVhZGluZyBkaWdpdHMgdGhlbiByZXNldCBpdC5cbiAgICAgIC8vIFRoZSB0ZXN0IGZvciB0aGlzIGBpZmAgY29uZGl0aW9uIGlzIG1hcmtlZCBhczpcbiAgICAgIC8vIFwiUmVzZXQgYSBjaG9zZW4gZm9ybWF0IHdoZW4gaXQgbm8gbG9uZ2VyIGhvbGRzIGdpdmVuIHRoZSBuZXcgbGVhZGluZyBkaWdpdHNcIi5cbiAgICAgIC8vIFRvIGNvbnN0cnVjdCBhIHZhbGlkIHRlc3QgY2FzZSBmb3IgdGhpcyBvbmUgY2FuIGZpbmQgYSBjb3VudHJ5XG4gICAgICAvLyBpbiBgUGhvbmVOdW1iZXJNZXRhZGF0YS54bWxgIHlpZWxkaW5nIG9uZSBmb3JtYXQgZm9yIDMgYDxsZWFkaW5nRGlnaXRzPmBcbiAgICAgIC8vIGFuZCB5aWVsZGluZyBhbm90aGVyIGZvcm1hdCBmb3IgNCBgPGxlYWRpbmdEaWdpdHM+YCAoQXVzdHJhbGlhIGluIHRoaXMgY2FzZSkuXG5cbiAgICAgIGlmICh0aGlzLmNob3NlbkZvcm1hdCAmJiB0aGlzLm1hdGNoaW5nRm9ybWF0cy5pbmRleE9mKHRoaXMuY2hvc2VuRm9ybWF0KSA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1hdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JtYXRTdWl0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JtYXRTdWl0cyhmb3JtYXQsIGludGVybmF0aW9uYWwsIG5hdGlvbmFsUHJlZml4KSB7XG4gICAgICAvLyBXaGVuIGEgcHJlZml4IGJlZm9yZSBhIG5hdGlvbmFsIChzaWduaWZpY2FudCkgbnVtYmVyIGlzXG4gICAgICAvLyBzaW1wbHkgYSBuYXRpb25hbCBwcmVmaXgsIHRoZW4gaXQncyBwYXJzZWQgYXMgYHRoaXMubmF0aW9uYWxQcmVmaXhgLlxuICAgICAgLy8gSW4gbW9yZSBjb21wbGV4IGNhc2VzLCBhIHByZWZpeCBiZWZvcmUgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXJcbiAgICAgIC8vIGNvdWxkIGluY2x1ZGUgYSBuYXRpb25hbCBwcmVmaXggYXMgd2VsbCBhcyBzb21lIFwiY2FwdHVyaW5nIGdyb3Vwc1wiLFxuICAgICAgLy8gYW5kIGluIHRoYXQgY2FzZSB0aGVyZSdzIG5vIGluZm8gd2hldGhlciBhIG5hdGlvbmFsIHByZWZpeCBoYXMgYmVlbiBwYXJzZWQuXG4gICAgICAvLyBJZiBuYXRpb25hbCBwcmVmaXggaXMgbm90IHVzZWQgd2hlbiBmb3JtYXR0aW5nIGEgcGhvbmUgbnVtYmVyXG4gICAgICAvLyB1c2luZyB0aGlzIGZvcm1hdCwgYnV0IGEgbmF0aW9uYWwgcHJlZml4IGhhcyBiZWVuIGVudGVyZWQgYnkgdGhlIHVzZXIsXG4gICAgICAvLyBhbmQgd2FzIGV4dHJhY3RlZCwgdGhlbiBkaXNjYXJkIHN1Y2ggcGhvbmUgbnVtYmVyIGZvcm1hdC5cbiAgICAgIC8vIEluIEdvb2dsZSdzIFwiQXNZb3VUeXBlXCIgZm9ybWF0dGVyIGNvZGUsIHRoZSBlcXVpdmFsZW50IHdvdWxkIGJlIHRoaXMgcGFydDpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvbGlicGhvbmVudW1iZXIvYmxvYi8wYTQ1Y2ZkOTZlNzFjYWQ4ZWRiMGUxNjJhNzBmY2M4YmQ5NzI4OTMzL2phdmEvbGlicGhvbmVudW1iZXIvc3JjL2NvbS9nb29nbGUvaTE4bi9waG9uZW51bWJlcnMvQXNZb3VUeXBlRm9ybWF0dGVyLmphdmEjTDE3NS1MMTg0XG4gICAgICBpZiAobmF0aW9uYWxQcmVmaXggJiYgIWZvcm1hdC51c2VzTmF0aW9uYWxQcmVmaXgoKSAmJiAvLyAhZm9ybWF0LmRvbWVzdGljQ2FycmllckNvZGVGb3JtYXR0aW5nUnVsZSgpICYmXG4gICAgICAhZm9ybWF0Lm5hdGlvbmFsUHJlZml4SXNPcHRpb25hbFdoZW5Gb3JtYXR0aW5nSW5OYXRpb25hbEZvcm1hdCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gSWYgbmF0aW9uYWwgcHJlZml4IGlzIG1hbmRhdG9yeSBmb3IgdGhpcyBwaG9uZSBudW1iZXIgZm9ybWF0XG4gICAgICAvLyBhbmQgdGhlcmUncmUgbm8gZ3VhcmFudGVlcyB0aGF0IGEgbmF0aW9uYWwgcHJlZml4IGlzIHByZXNlbnQgaW4gdXNlciBpbnB1dFxuICAgICAgLy8gdGhlbiBkaXNjYXJkIHRoaXMgcGhvbmUgbnVtYmVyIGZvcm1hdCBhcyBub3Qgc3VpdGFibGUuXG4gICAgICAvLyBJbiBHb29nbGUncyBcIkFzWW91VHlwZVwiIGZvcm1hdHRlciBjb2RlLCB0aGUgZXF1aXZhbGVudCB3b3VsZCBiZSB0aGlzIHBhcnQ6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2xpYnBob25lbnVtYmVyL2Jsb2IvMGE0NWNmZDk2ZTcxY2FkOGVkYjBlMTYyYTcwZmNjOGJkOTcyODkzMy9qYXZhL2xpYnBob25lbnVtYmVyL3NyYy9jb20vZ29vZ2xlL2kxOG4vcGhvbmVudW1iZXJzL0FzWW91VHlwZUZvcm1hdHRlci5qYXZhI0wxODUtTDE5M1xuXG5cbiAgICAgIGlmICghaW50ZXJuYXRpb25hbCAmJiAhbmF0aW9uYWxQcmVmaXggJiYgZm9ybWF0Lm5hdGlvbmFsUHJlZml4SXNNYW5kYXRvcnlXaGVuRm9ybWF0dGluZ0luTmF0aW9uYWxGb3JtYXQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JtYXRNYXRjaGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdE1hdGNoZXMoZm9ybWF0LCBsZWFkaW5nRGlnaXRzLCBsZWFkaW5nRGlnaXRzUGF0dGVybkluZGV4KSB7XG4gICAgICB2YXIgbGVhZGluZ0RpZ2l0c1BhdHRlcm5zQ291bnQgPSBmb3JtYXQubGVhZGluZ0RpZ2l0c1BhdHRlcm5zKCkubGVuZ3RoOyAvLyBJZiB0aGlzIGZvcm1hdCBpcyBub3QgcmVzdHJpY3RlZCB0byBhIGNlcnRhaW5cbiAgICAgIC8vIGxlYWRpbmcgZGlnaXRzIHBhdHRlcm4gdGhlbiBpdCBmaXRzLlxuICAgICAgLy8gVGhlIHRlc3QgY2FzZSBjb3VsZCBiZSBmb3VuZCBieSBzZWFyY2hpbmcgZm9yIFwibGVhZGluZ0RpZ2l0c1BhdHRlcm5zQ291bnQgPT09IDBcIi5cblxuICAgICAgaWYgKGxlYWRpbmdEaWdpdHNQYXR0ZXJuc0NvdW50ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBTdGFydCBuYXJyb3dpbmcgZG93biB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmb3JtYXRzIGJhc2VkIG9uIHRoZSBsZWFkaW5nIGRpZ2l0cy5cbiAgICAgIC8vIChvbmx5IHByZXZpb3VzbHkgbWF0Y2hlZCBmb3JtYXRzIHRha2UgcGFydCBpbiB0aGUgbmFycm93aW5nIGRvd24gcHJvY2VzcylcbiAgICAgIC8vIGBsZWFkaW5nX2RpZ2l0c19wYXR0ZXJuc2Agc3RhcnQgd2l0aCAzIGRpZ2l0cyBtaW5cbiAgICAgIC8vIGFuZCB0aGVuIGdvIHVwIGZyb20gdGhlcmUgb25lIGRpZ2l0IGF0IGEgdGltZS5cblxuXG4gICAgICBsZWFkaW5nRGlnaXRzUGF0dGVybkluZGV4ID0gTWF0aC5taW4obGVhZGluZ0RpZ2l0c1BhdHRlcm5JbmRleCwgbGVhZGluZ0RpZ2l0c1BhdHRlcm5zQ291bnQgLSAxKTtcbiAgICAgIHZhciBsZWFkaW5nRGlnaXRzUGF0dGVybiA9IGZvcm1hdC5sZWFkaW5nRGlnaXRzUGF0dGVybnMoKVtsZWFkaW5nRGlnaXRzUGF0dGVybkluZGV4XTsgLy8gR29vZ2xlIGltcG9zZXMgYSByZXF1aXJlbWVudCBvbiB0aGUgbGVhZGluZyBkaWdpdHNcbiAgICAgIC8vIHRvIGJlIG1pbmltdW0gMyBkaWdpdHMgbG9uZyBpbiBvcmRlciB0byBiZSBlbGlnaWJsZVxuICAgICAgLy8gZm9yIGNoZWNraW5nIHRob3NlIHdpdGggYSBsZWFkaW5nIGRpZ2l0cyBwYXR0ZXJuLlxuICAgICAgLy9cbiAgICAgIC8vIFNpbmNlIGBsZWFkaW5nX2RpZ2l0c19wYXR0ZXJuc2Agc3RhcnQgd2l0aCAzIGRpZ2l0cyBtaW4sXG4gICAgICAvLyBHb29nbGUncyBvcmlnaW5hbCBgbGlicGhvbmVudW1iZXJgIGxpYnJhcnkgb25seSBzdGFydHNcbiAgICAgIC8vIGV4Y2x1ZGluZyBhbnkgbm9uLW1hdGNoaW5nIGZvcm1hdHMgb25seSB3aGVuIHRoZVxuICAgICAgLy8gbmF0aW9uYWwgbnVtYmVyIGVudGVyZWQgc28gZmFyIGlzIGF0IGxlYXN0IDMgZGlnaXRzIGxvbmcsXG4gICAgICAvLyBvdGhlcndpc2UgZm9ybWF0IG1hdGNoaW5nIHdvdWxkIGdpdmUgZmFsc2UgbmVnYXRpdmVzLlxuICAgICAgLy9cbiAgICAgIC8vIEZvciBleGFtcGxlLCB3aGVuIHRoZSBkaWdpdHMgZW50ZXJlZCBzbyBmYXIgYXJlIGAyYFxuICAgICAgLy8gYW5kIHRoZSBsZWFkaW5nIGRpZ2l0cyBwYXR0ZXJuIGlzIGAyMWAg4oCTXG4gICAgICAvLyBpdCdzIHF1aXRlIG9idmlvdXMgaW4gdGhpcyBjYXNlIHRoYXQgdGhlIGZvcm1hdCBjb3VsZCBiZSB0aGUgb25lXG4gICAgICAvLyBidXQgZHVlIHRvIHRoZSBhYnNlbmNlIG9mIGZ1cnRoZXIgZGlnaXRzIGl0IHdvdWxkIGdpdmUgZmFsc2UgbmVnYXRpdmUuXG4gICAgICAvL1xuICAgICAgLy8gQWxzbywgYGxlYWRpbmdfZGlnaXRzX3BhdHRlcm5zYCBkb2Vzbid0IGFsd2F5cyBjb3JyZXNwb25kIHRvIGEgc2luZ2xlXG4gICAgICAvLyBkaWdpdHMgY291bnQuIEZvciBleGFtcGxlLCBgNjB8OGAgcGF0dGVybiB3b3VsZCBhbHJlYWR5IG1hdGNoIGA4YFxuICAgICAgLy8gYnV0IHRoZSBgNjBgIHBhcnQgd291bGQgcmVxdWlyZSBoYXZpbmcgYXQgbGVhc3QgdHdvIGxlYWRpbmcgZGlnaXRzLFxuICAgICAgLy8gc28gdGhlIHdob2xlIHBhdHRlcm4gd291bGQgcmVxdWlyZSBpbnB1dHRpbmcgdHdvIGRpZ2l0cyBmaXJzdCBpbiBvcmRlciB0b1xuICAgICAgLy8gZGVjaWRlIG9uIHdoZXRoZXIgaXQgbWF0Y2hlcyB0aGUgaW5wdXQsIGV2ZW4gd2hlbiB0aGUgaW5wdXQgaXMgXCI4MFwiLlxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgbGlicmFyeSDigJQgYGxpYnBob25lbnVtYmVyLWpzYCDigJQgYWxsb3dzIGZpbHRlcmluZyBieSBgbGVhZGluZ19kaWdpdHNfcGF0dGVybnNgXG4gICAgICAvLyBldmVuIHdoZW4gdGhlcmUncyBvbmx5IDEgb3IgMiBkaWdpdHMgb2YgdGhlIG5hdGlvbmFsIChzaWduaWZpY2FudCkgbnVtYmVyLlxuICAgICAgLy8gVG8gZG8gdGhhdCwgaXQgdXNlcyBhIG5vbi1zdHJpY3QgcGF0dGVybiBtYXRjaGVyIHdyaXR0ZW4gc3BlY2lmaWNhbGx5IGZvciB0aGF0LlxuICAgICAgLy9cblxuICAgICAgaWYgKGxlYWRpbmdEaWdpdHMubGVuZ3RoIDwgTUlOX0xFQURJTkdfRElHSVRTX0xFTkdUSCkge1xuICAgICAgICAvLyBCZWZvcmUgbGVhZGluZyBkaWdpdHMgPCAzIG1hdGNoaW5nIHdhcyBpbXBsZW1lbnRlZDpcbiAgICAgICAgLy8gcmV0dXJuIHRydWVcbiAgICAgICAgLy9cbiAgICAgICAgLy8gQWZ0ZXIgbGVhZGluZyBkaWdpdHMgPCAzIG1hdGNoaW5nIHdhcyBpbXBsZW1lbnRlZDpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbmV3IF9Bc1lvdVR5cGVGb3JtYXR0ZXJQYXR0ZXJuTWF0Y2hlcltcImRlZmF1bHRcIl0obGVhZGluZ0RpZ2l0c1BhdHRlcm4pLm1hdGNoKGxlYWRpbmdEaWdpdHMsIHtcbiAgICAgICAgICAgIGFsbG93T3ZlcmZsb3c6IHRydWVcbiAgICAgICAgICB9KSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB9IGNhdGNoIChlcnJvcilcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZXJlJ3MgYSBzbGlnaHQgcG9zc2liaWxpdHkgdGhhdCB0aGVyZSBjb3VsZCBiZSBzb21lIHVuZGlzY292ZXJlZCBidWdcbiAgICAgICAgICAvLyBpbiB0aGUgcGF0dGVybiBtYXRjaGVyIGNvZGUuIFNpbmNlIHRoZSBcImxlYWRpbmcgZGlnaXRzIDwgMyBtYXRjaGluZ1wiXG4gICAgICAgICAgLy8gZmVhdHVyZSBpcyBub3QgXCJlc3NlbnRpYWxcIiBmb3Igb3BlcmF0aW9uLCBpdCBjYW4gZmFsbCBiYWNrIHRvIHRoZSBvbGQgd2F5XG4gICAgICAgICAgLy8gaW4gY2FzZSBvZiBhbnkgaXNzdWVzIHJhdGhlciB0aGFuIGhhbHRpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgZXhlY3V0aW9uLlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIElmIGF0IGxlYXN0IGBNSU5fTEVBRElOR19ESUdJVFNfTEVOR1RIYCBkaWdpdHMgb2YgYSBuYXRpb25hbCBudW1iZXIgYXJlXG4gICAgICAvLyBhdmFpbGFibGUgdGhlbiB1c2UgdGhlIHVzdWFsIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgd2hvbGUgcGF0dGVybiBpcyB3cmFwcGVkIGluIHJvdW5kIGJyYWNrZXRzIChgKClgKSBiZWNhdXNlXG4gICAgICAvLyB0aGUgcGF0dGVybiBjYW4gdXNlIFwib3JcIiBvcGVyYXRvciAoYHxgKSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBwYXR0ZXJuLlxuICAgICAgLy9cblxuXG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIl4oXCIuY29uY2F0KGxlYWRpbmdEaWdpdHNQYXR0ZXJuLCBcIilcIikpLnRlc3QobGVhZGluZ0RpZ2l0cyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEZvcm1hdEZvcm1hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGb3JtYXRGb3JtYXQoZm9ybWF0LCBpbnRlcm5hdGlvbmFsKSB7XG4gICAgICByZXR1cm4gaW50ZXJuYXRpb25hbCA/IGZvcm1hdC5pbnRlcm5hdGlvbmFsRm9ybWF0KCkgOiBmb3JtYXQuZm9ybWF0KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNob29zZUZvcm1hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaG9vc2VGb3JtYXQoc3RhdGUpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAvLyBJZiB0aGlzIGZvcm1hdCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZFxuICAgICAgICAvLyBhbmQgaXMgc3RpbGwgc3VpdGFibGUsIHRoZW4gc3RpY2sgdG8gaXQuXG4gICAgICAgIGlmIChfdGhpczMuY2hvc2VuRm9ybWF0ID09PSBmb3JtYXQpIHtcbiAgICAgICAgICByZXR1cm4gXCJicmVha1wiO1xuICAgICAgICB9IC8vIFNvbWV0aW1lcywgYSBmb3JtYXR0aW5nIHJ1bGUgaW5zZXJ0cyBhZGRpdGlvbmFsIGRpZ2l0cyBpbiBhIHBob25lIG51bWJlcixcbiAgICAgICAgLy8gYW5kIFwiYXMgeW91IHR5cGVcIiBmb3JtYXR0ZXIgY2FuJ3QgZG8gdGhhdDogaXQgc2hvdWxkIG9ubHkgdXNlIHRoZSBkaWdpdHNcbiAgICAgICAgLy8gdGhhdCB0aGUgdXNlciBoYXMgaW5wdXQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEZvciBleGFtcGxlLCBpbiBBcmdlbnRpbmEsIHRoZXJlJ3MgYSBmb3JtYXQgZm9yIG1vYmlsZSBwaG9uZSBudW1iZXJzOlxuICAgICAgICAvL1xuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgIFwicGF0dGVyblwiOiBcIihcXFxcZCkoXFxcXGR7Mn0pKFxcXFxkezR9KShcXFxcZHs0fSlcIixcbiAgICAgICAgLy8gICAgXCJsZWFkaW5nX2RpZ2l0c19wYXR0ZXJuc1wiOiBbXCI5MVwiXSxcbiAgICAgICAgLy8gICAgXCJuYXRpb25hbF9wcmVmaXhfZm9ybWF0dGluZ19ydWxlXCI6IFwiMCQxXCIsXG4gICAgICAgIC8vICAgIFwiZm9ybWF0XCI6IFwiJDIgMTUtJDMtJDRcIixcbiAgICAgICAgLy8gICAgXCJpbnRlcm5hdGlvbmFsX2Zvcm1hdFwiOiBcIiQxICQyICQzLSQ0XCJcbiAgICAgICAgLy8gfVxuICAgICAgICAvL1xuICAgICAgICAvLyBJbiB0aGF0IGZvcm1hdCwgYGludGVybmF0aW9uYWxfZm9ybWF0YCBpcyB1c2VkIGluc3RlYWQgb2YgYGZvcm1hdGBcbiAgICAgICAgLy8gYmVjYXVzZSBgZm9ybWF0YCBpbnNlcnRzIGAxNWAgaW4gdGhlIGZvcm1hdHRlZCBudW1iZXIsXG4gICAgICAgIC8vIGFuZCBgQXNZb3VUeXBlYCBmb3JtYXR0ZXIgc2hvdWxkIG9ubHkgdXNlIHRoZSBkaWdpdHNcbiAgICAgICAgLy8gdGhlIHVzZXIgaGFzIGFjdHVhbGx5IGlucHV0LCB3aXRob3V0IGFkZGluZyBhbnkgZXh0cmEgZGlnaXRzLlxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGl0IHdvdWxkbid0IG1ha2UgYSBkaWZmZXJlbmNlLCBiZWNhdXNlIHRoZSBgMTVgXG4gICAgICAgIC8vIGlzIGZpcnN0IHN0cmlwcGVkIHdoZW4gYXBwbHlpbmcgYG5hdGlvbmFsX3ByZWZpeF9mb3JfcGFyc2luZ2BcbiAgICAgICAgLy8gYW5kIHRoZW4gcmUtYWRkZWQgd2hlbiB1c2luZyBgZm9ybWF0YCwgc28gaW4gcmVhbGl0eSBpdCBkb2Vzbid0XG4gICAgICAgIC8vIGFkZCBhbnkgbmV3IGRpZ2l0cyB0byB0aGUgbnVtYmVyLCBidXQgdG8gZGV0ZWN0IHRoYXQsIHRoZSBjb2RlXG4gICAgICAgIC8vIHdvdWxkIGhhdmUgdG8gYmUgbW9yZSBjb21wbGV4OiBpdCB3b3VsZCBoYXZlIHRvIHRyeSBmb3JtYXR0aW5nXG4gICAgICAgIC8vIHRoZSBkaWdpdHMgdXNpbmcgdGhlIGZvcm1hdCBhbmQgdGhlbiBzZWUgaWYgYW55IGRpZ2l0cyBoYXZlXG4gICAgICAgIC8vIGFjdHVhbGx5IGJlZW4gYWRkZWQgb3IgcmVtb3ZlZCwgYW5kIHRoZW4sIGV2ZXJ5IHRpbWUgYSBuZXcgZGlnaXRcbiAgICAgICAgLy8gaXMgaW5wdXQsIGl0IHNob3VsZCByZS1jaGVjayB3aGV0aGVyIHRoZSBjaG9zZW4gZm9ybWF0IGRvZXNuJ3RcbiAgICAgICAgLy8gYWx0ZXIgdGhlIGRpZ2l0cy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gR29vZ2xlJ3MgY29kZSBkb2Vzbid0IGdvIHRoYXQgZmFyLCBhbmQgc28gZG9lcyB0aGlzIGxpYnJhcnk6XG4gICAgICAgIC8vIGl0IHNpbXBseSByZXF1aXJlcyB0aGF0IGEgYGZvcm1hdGAgZG9lc24ndCBhZGQgYW55IGFkZGl0b25hbFxuICAgICAgICAvLyBkaWdpdHMgdG8gdXNlcidzIGlucHV0LlxuICAgICAgICAvL1xuICAgICAgICAvLyBBbHNvLCBwZW9wbGUgaW4gZ2VuZXJhbCBzaG91bGQgbW92ZSBmcm9tIGlucHV0dGluZyBwaG9uZSBudW1iZXJzXG4gICAgICAgIC8vIGluIG5hdGlvbmFsIGZvcm1hdCAocG9zc2libHkgd2l0aCBuYXRpb25hbCBwcmVmaXhlcylcbiAgICAgICAgLy8gYW5kIHVzZSBpbnRlcm5hdGlvbmFsIHBob25lIG51bWJlciBmb3JtYXQgaW5zdGVhZDpcbiAgICAgICAgLy8gaXQncyBhIGxvZ2ljYWwgdGhpbmcgaW4gdGhlIG1vZGVybiBhZ2Ugb2YgbW9iaWxlIHBob25lcyxcbiAgICAgICAgLy8gZ2xvYmFsaXphdGlvbiBhbmQgdGhlIGludGVybmV0LlxuICAgICAgICAvL1xuXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuXG5cbiAgICAgICAgaWYgKCFOT05fQUxURVJJTkdfRk9STUFUX1JFR19FWFAudGVzdChfdGhpczMuZ2V0Rm9ybWF0Rm9ybWF0KGZvcm1hdCwgc3RhdGUuaW50ZXJuYXRpb25hbCkpKSB7XG4gICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghX3RoaXMzLmNyZWF0ZVRlbXBsYXRlRm9yRm9ybWF0KGZvcm1hdCwgc3RhdGUpKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIHRoZSBmb3JtYXQgaWYgaXQgY2FuJ3QgZ2VuZXJhdGUgYSB0ZW1wbGF0ZS5cbiAgICAgICAgICBfdGhpczMubWF0Y2hpbmdGb3JtYXRzID0gX3RoaXMzLm1hdGNoaW5nRm9ybWF0cy5maWx0ZXIoZnVuY3Rpb24gKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBfICE9PSBmb3JtYXQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMy5jaG9zZW5Gb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9O1xuXG4gICAgICAvLyBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBhdmFpbGFibGUgZm9ybWF0cywgdGhlIGZvcm1hdHRlciB1c2VzIHRoZSBmaXJzdFxuICAgICAgLy8gZm9ybWF0IHdoZXJlIGEgZm9ybWF0dGluZyB0ZW1wbGF0ZSBjb3VsZCBiZSBjcmVhdGVkLlxuICAgICAgLy9cbiAgICAgIC8vIEZvciBzb21lIHdlaXJkIHJlYXNvbiwgYGlzdGFuYnVsYCBzYXlzIFwiZWxzZSBwYXRoIG5vdCB0YWtlblwiXG4gICAgICAvLyBmb3IgdGhlIGBmb3Igb2ZgIGxpbmUgYmVsb3cuIFN1cHBvc2VkbHkgdGhhdCBtZWFucyB0aGF0XG4gICAgICAvLyB0aGUgbG9vcCBkb2Vzbid0IGV2ZXIgZ28gb3ZlciB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBsaXN0LlxuICAgICAgLy8gVGhhdCdzIHRydWUgYmVjYXVzZSB0aGVyZSBhbHdheXMgaXMgYHRoaXMuY2hvc2VuRm9ybWF0YFxuICAgICAgLy8gd2hlbiBgdGhpcy5tYXRjaGluZ0Zvcm1hdHNgIGlzIG5vbi1lbXB0eS5cbiAgICAgIC8vIEFuZCwgZm9yIHNvbWUgd2VpcmQgcmVhc29uLCBpdCBkb2Vzbid0IHRoaW5rIHRoYXQgdGhlIGNhc2VcbiAgICAgIC8vIHdpdGggZW1wdHkgYHRoaXMubWF0Y2hpbmdGb3JtYXRzYCBxdWFsaWZpZXMgZm9yIGEgdmFsaWQgXCJlbHNlXCIgcGF0aC5cbiAgICAgIC8vIFNvIHNpbXBseSBtdXRpbmcgdGhpcyBgaXN0YW5idWxgIHdhcm5pbmcuXG4gICAgICAvLyBJdCBkb2Vzbid0IHNraXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBgZm9yIG9mYCBsb29wLFxuICAgICAgLy8gaXQganVzdCBza2lwcyB0aGUgYGZvciBvZmAgbGluZS5cbiAgICAgIC8vXG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSh0aGlzLm1hdGNoaW5nRm9ybWF0cy5zbGljZSgpKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIF9yZXQgPSBfbG9vcCgpO1xuXG4gICAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgICAgICBpZiAoX3JldCA9PT0gXCJjb250aW51ZVwiKSBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmNob3NlbkZvcm1hdCkge1xuICAgICAgICAvLyBObyBmb3JtYXQgbWF0Y2hlcyB0aGUgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBwaG9uZSBudW1iZXIuXG4gICAgICAgIHRoaXMucmVzZXRGb3JtYXQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2hvc2VuRm9ybWF0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVUZW1wbGF0ZUZvckZvcm1hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVUZW1wbGF0ZUZvckZvcm1hdChmb3JtYXQsIHN0YXRlKSB7XG4gICAgICAvLyBUaGUgZm9ybWF0dGVyIGRvZXNuJ3QgZm9ybWF0IG51bWJlcnMgd2hlbiBudW1iZXJQYXR0ZXJuIGNvbnRhaW5zICd8JywgZS5nLlxuICAgICAgLy8gKDIwfDMpXFxkezR9LiBJbiB0aG9zZSBjYXNlcyB3ZSBxdWlja2x5IHJldHVybi5cbiAgICAgIC8vIChUaG91Z2ggdGhlcmUncyBubyBzdWNoIGZvcm1hdCBpbiBjdXJyZW50IG1ldGFkYXRhKVxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChTVVBQT1JUX0xFR0FDWV9GT1JNQVRUSU5HX1BBVFRFUk5TICYmIGZvcm1hdC5wYXR0ZXJuKCkuaW5kZXhPZignfCcpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBHZXQgZm9ybWF0dGluZyB0ZW1wbGF0ZSBmb3IgdGhpcyBwaG9uZSBudW1iZXIgZm9ybWF0XG5cblxuICAgICAgdmFyIHRlbXBsYXRlID0gdGhpcy5nZXRUZW1wbGF0ZUZvckZvcm1hdChmb3JtYXQsIHN0YXRlKTsgLy8gSWYgdGhlIG5hdGlvbmFsIG51bWJlciBlbnRlcmVkIGlzIHRvbyBsb25nXG4gICAgICAvLyBmb3IgYW55IHBob25lIG51bWJlciBmb3JtYXQsIHRoZW4gYWJvcnQuXG5cbiAgICAgIGlmICh0ZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLnNldE5hdGlvbmFsTnVtYmVyVGVtcGxhdGUodGVtcGxhdGUsIHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFNlcGFyYXRvckFmdGVyTmF0aW9uYWxQcmVmaXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2VwYXJhdG9yQWZ0ZXJOYXRpb25hbFByZWZpeChmb3JtYXQpIHtcbiAgICAgIC8vIGBVU2AgbWV0YWRhdGEgZG9lc24ndCBoYXZlIGEgYG5hdGlvbmFsX3ByZWZpeF9mb3JtYXR0aW5nX3J1bGVgLFxuICAgICAgLy8gc28gdGhlIGBpZmAgY29uZGl0aW9uIGJlbG93IGRvZXNuJ3QgYXBwbHkgdG8gYFVTYCxcbiAgICAgIC8vIGJ1dCBpbiByZWFsaXR5IHRoZXJlIHNob3VkbCBiZSBhIHNlcGFyYXRvclxuICAgICAgLy8gYmV0d2VlbiBhIG5hdGlvbmFsIHByZWZpeCBhbmQgYSBuYXRpb25hbCAoc2lnbmlmaWNhbnQpIG51bWJlci5cbiAgICAgIC8vIFNvIGBVU2AgbmF0aW9uYWwgcHJlZml4IHNlcGFyYXRvciBpcyBhIFwic3BlY2lhbFwiIFwiaGFyZGNvZGVkXCIgY2FzZS5cbiAgICAgIGlmICh0aGlzLmlzTkFOUCkge1xuICAgICAgICByZXR1cm4gJyAnO1xuICAgICAgfSAvLyBJZiBhIGBmb3JtYXRgIGhhcyBhIGBuYXRpb25hbF9wcmVmaXhfZm9ybWF0dGluZ19ydWxlYFxuICAgICAgLy8gYW5kIHRoYXQgcnVsZSBoYXMgYSBzZXBhcmF0b3IgYWZ0ZXIgYSBuYXRpb25hbCBwcmVmaXgsXG4gICAgICAvLyB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlcmUgc2hvdWxkIGJlIGEgc2VwYXJhdG9yXG4gICAgICAvLyBiZXR3ZWVuIGEgbmF0aW9uYWwgcHJlZml4IGFuZCBhIG5hdGlvbmFsIChzaWduaWZpY2FudCkgbnVtYmVyLlxuXG5cbiAgICAgIGlmIChmb3JtYXQgJiYgZm9ybWF0Lm5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUoKSAmJiBOQVRJT05BTF9QUkVGSVhfU0VQQVJBVE9SU19QQVRURVJOLnRlc3QoZm9ybWF0Lm5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUoKSkpIHtcbiAgICAgICAgcmV0dXJuICcgJztcbiAgICAgIH0gLy8gQXQgdGhpcyBwb2ludCwgdGhlcmUgc2VlbXMgdG8gYmUgbm8gY2xlYXIgZXZpZGVuY2UgdGhhdFxuICAgICAgLy8gdGhlcmUgc2hvdWxkIGJlIGEgc2VwYXJhdG9yIGJldHdlZW4gYSBuYXRpb25hbCBwcmVmaXhcbiAgICAgIC8vIGFuZCBhIG5hdGlvbmFsIChzaWduaWZpY2FudCkgbnVtYmVyLiBTbyBkb24ndCBpbnNlcnQgb25lLlxuXG5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0SW50ZXJuYXRpb25hbFByZWZpeEJlZm9yZUNvdW50cnlDYWxsaW5nQ29kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRJbnRlcm5hdGlvbmFsUHJlZml4QmVmb3JlQ291bnRyeUNhbGxpbmdDb2RlKF9yZWYzLCBvcHRpb25zKSB7XG4gICAgICB2YXIgSUREUHJlZml4ID0gX3JlZjMuSUREUHJlZml4LFxuICAgICAgICAgIG1pc3NpbmdQbHVzID0gX3JlZjMubWlzc2luZ1BsdXM7XG5cbiAgICAgIGlmIChJRERQcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5zcGFjaW5nID09PSBmYWxzZSA/IElERFByZWZpeCA6IElERFByZWZpeCArICcgJztcbiAgICAgIH1cblxuICAgICAgaWYgKG1pc3NpbmdQbHVzKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICcrJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VGVtcGxhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGVtcGxhdGUoc3RhdGUpIHtcbiAgICAgIGlmICghdGhpcy50ZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIGB0aGlzLnRlbXBsYXRlYCBob2xkcyB0aGUgdGVtcGxhdGUgZm9yIGEgXCJjb21wbGV0ZVwiIHBob25lIG51bWJlci5cbiAgICAgIC8vIFRoZSBjdXJyZW50bHkgZW50ZXJlZCBwaG9uZSBudW1iZXIgaXMgbW9zdCBsaWtlbHkgbm90IFwiY29tcGxldGVcIixcbiAgICAgIC8vIHNvIHRyaW0gYWxsIG5vbi1wb3B1bGF0ZWQgZGlnaXRzLlxuXG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgdmFyIGludGVybmF0aW9uYWxQcmVmaXggPSBzdGF0ZS5pbnRlcm5hdGlvbmFsID8gdGhpcy5nZXRJbnRlcm5hdGlvbmFsUHJlZml4QmVmb3JlQ291bnRyeUNhbGxpbmdDb2RlKHN0YXRlLCB7XG4gICAgICAgIHNwYWNpbmc6IGZhbHNlXG4gICAgICB9KSA6ICcnO1xuXG4gICAgICB3aGlsZSAoaSA8IGludGVybmF0aW9uYWxQcmVmaXgubGVuZ3RoICsgc3RhdGUuZ2V0RGlnaXRzV2l0aG91dEludGVybmF0aW9uYWxQcmVmaXgoKS5sZW5ndGgpIHtcbiAgICAgICAgaW5kZXggPSB0aGlzLnRlbXBsYXRlLmluZGV4T2YoX0FzWW91VHlwZUZvcm1hdHRlclV0aWwuRElHSVRfUExBQ0VIT0xERVIsIGluZGV4ICsgMSk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgwLCBfQXNZb3VUeXBlRm9ybWF0dGVyVXRpbC5jdXRBbmRTdHJpcE5vblBhaXJlZFBhcmVucykodGhpcy50ZW1wbGF0ZSwgaW5kZXggKyAxKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0TmF0aW9uYWxOdW1iZXJUZW1wbGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXROYXRpb25hbE51bWJlclRlbXBsYXRlKHRlbXBsYXRlLCBzdGF0ZSkge1xuICAgICAgdGhpcy5uYXRpb25hbE51bWJlclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICB0aGlzLnBvcHVsYXRlZE5hdGlvbmFsTnVtYmVyVGVtcGxhdGUgPSB0ZW1wbGF0ZTsgLy8gV2l0aCBhIG5ldyBmb3JtYXR0aW5nIHRlbXBsYXRlLCB0aGUgbWF0Y2hlZCBwb3NpdGlvblxuICAgICAgLy8gdXNpbmcgdGhlIG9sZCB0ZW1wbGF0ZSBuZWVkcyB0byBiZSByZXNldC5cblxuICAgICAgdGhpcy5wb3B1bGF0ZWROYXRpb25hbE51bWJlclRlbXBsYXRlUG9zaXRpb24gPSAtMTsgLy8gRm9yIGNvbnZlbmllbmNlLCB0aGUgcHVibGljIGAudGVtcGxhdGVgIHByb3BlcnR5XG4gICAgICAvLyBjb250YWlucyB0aGUgd2hvbGUgaW50ZXJuYXRpb25hbCBudW1iZXJcbiAgICAgIC8vIGlmIHRoZSBwaG9uZSBudW1iZXIgYmVpbmcgaW5wdXQgaXMgaW50ZXJuYXRpb25hbDpcbiAgICAgIC8vICd4JyBmb3IgdGhlICcrJyBzaWduLCAneCdlcyBmb3IgdGhlIGNvdW50cnkgcGhvbmUgY29kZSxcbiAgICAgIC8vIGEgc3BhY2ViYXIgYW5kIHRoZW4gdGhlIHRlbXBsYXRlIGZvciB0aGUgZm9ybWF0dGVkIG5hdGlvbmFsIG51bWJlci5cblxuICAgICAgaWYgKHN0YXRlLmludGVybmF0aW9uYWwpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMuZ2V0SW50ZXJuYXRpb25hbFByZWZpeEJlZm9yZUNvdW50cnlDYWxsaW5nQ29kZShzdGF0ZSkucmVwbGFjZSgvW1xcZFxcK10vZywgX0FzWW91VHlwZUZvcm1hdHRlclV0aWwuRElHSVRfUExBQ0VIT0xERVIpICsgKDAsIF9Bc1lvdVR5cGVGb3JtYXR0ZXJVdGlsLnJlcGVhdCkoX0FzWW91VHlwZUZvcm1hdHRlclV0aWwuRElHSVRfUExBQ0VIT0xERVIsIHN0YXRlLmNhbGxpbmdDb2RlLmxlbmd0aCkgKyAnICcgKyB0ZW1wbGF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgZm9ybWF0dGluZyB0ZW1wbGF0ZSBmb3IgYSBuYXRpb25hbCBwaG9uZSBudW1iZXIsXHJcbiAgICAgKiBvcHRpb25hbGx5IGNvbnRhaW5pbmcgYSBuYXRpb25hbCBwcmVmaXgsIGZvciBhIGZvcm1hdC5cclxuICAgICAqIEBwYXJhbSAge0Zvcm1hdH0gZm9ybWF0XHJcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hdGlvbmFsUHJlZml4XHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFRlbXBsYXRlRm9yRm9ybWF0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRlbXBsYXRlRm9yRm9ybWF0KGZvcm1hdCwgX3JlZjQpIHtcbiAgICAgIHZhciBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyID0gX3JlZjQubmF0aW9uYWxTaWduaWZpY2FudE51bWJlcixcbiAgICAgICAgICBpbnRlcm5hdGlvbmFsID0gX3JlZjQuaW50ZXJuYXRpb25hbCxcbiAgICAgICAgICBuYXRpb25hbFByZWZpeCA9IF9yZWY0Lm5hdGlvbmFsUHJlZml4LFxuICAgICAgICAgIGNvbXBsZXhQcmVmaXhCZWZvcmVOYXRpb25hbFNpZ25pZmljYW50TnVtYmVyID0gX3JlZjQuY29tcGxleFByZWZpeEJlZm9yZU5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXI7XG4gICAgICB2YXIgcGF0dGVybiA9IGZvcm1hdC5wYXR0ZXJuKCk7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXG4gICAgICBpZiAoU1VQUE9SVF9MRUdBQ1lfRk9STUFUVElOR19QQVRURVJOUykge1xuICAgICAgICBwYXR0ZXJuID0gcGF0dGVybiAvLyBSZXBsYWNlIGFueXRoaW5nIGluIHRoZSBmb3JtIG9mIFsuLl0gd2l0aCBcXGRcbiAgICAgICAgLnJlcGxhY2UoQ1JFQVRFX0NIQVJBQ1RFUl9DTEFTU19QQVRURVJOKCksICdcXFxcZCcpIC8vIFJlcGxhY2UgYW55IHN0YW5kYWxvbmUgZGlnaXQgKG5vdCB0aGUgb25lIGluIGB7fWApIHdpdGggXFxkXG4gICAgICAgIC5yZXBsYWNlKENSRUFURV9TVEFOREFMT05FX0RJR0lUX1BBVFRFUk4oKSwgJ1xcXFxkJyk7XG4gICAgICB9IC8vIEdlbmVyYXRlIGEgZHVtbXkgbmF0aW9uYWwgbnVtYmVyIChjb25zaXN0aW5nIG9mIGA5YHMpXG4gICAgICAvLyB0aGF0IGZpdHMgdGhpcyBmb3JtYXQncyBgcGF0dGVybmAuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBtYXRjaCB3aWxsIGFsd2F5cyBzdWNjZWVkLFxuICAgICAgLy8gYmVjYXVzZSB0aGUgXCJsb25nZXN0IGR1bW15IHBob25lIG51bWJlclwiXG4gICAgICAvLyBoYXMgZW5vdWdoIGxlbmd0aCB0byBhY2NvbW9kYXRlIGFueSBwb3NzaWJsZVxuICAgICAgLy8gbmF0aW9uYWwgcGhvbmUgbnVtYmVyIGZvcm1hdCBwYXR0ZXJuLlxuICAgICAgLy9cblxuXG4gICAgICB2YXIgZGlnaXRzID0gTE9OR0VTVF9EVU1NWV9QSE9ORV9OVU1CRVIubWF0Y2gocGF0dGVybilbMF07IC8vIElmIHRoZSBuYXRpb25hbCBudW1iZXIgZW50ZXJlZCBpcyB0b28gbG9uZ1xuICAgICAgLy8gZm9yIGFueSBwaG9uZSBudW1iZXIgZm9ybWF0LCB0aGVuIGFib3J0LlxuXG4gICAgICBpZiAobmF0aW9uYWxTaWduaWZpY2FudE51bWJlci5sZW5ndGggPiBkaWdpdHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gR2V0IGEgZm9ybWF0dGluZyB0ZW1wbGF0ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBlZmZpY2llbnRseSBmb3JtYXRcbiAgICAgIC8vIGEgcGFydGlhbCBudW1iZXIgd2hlcmUgZGlnaXRzIGFyZSBhZGRlZCBvbmUgYnkgb25lLlxuICAgICAgLy8gQmVsb3cgYHN0cmljdFBhdHRlcm5gIGlzIHVzZWQgZm9yIHRoZVxuICAgICAgLy8gcmVndWxhciBleHByZXNzaW9uICh3aXRoIGBeYCBhbmQgYCRgKS5cbiAgICAgIC8vIFRoaXMgd2Fzbid0IG9yaWdpbmFsbHkgaW4gR29vZ2xlJ3MgYGxpYnBob25lbnVtYmVyYFxuICAgICAgLy8gYW5kIEkgZ3Vlc3MgdGhleSBkb24ndCByZWFsbHkgbmVlZCBpdFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG5vdCB1c2luZyBcInRlbXBsYXRlc1wiIHRvIGZvcm1hdCBwaG9uZSBudW1iZXJzXG4gICAgICAvLyBidXQgSSBhZGRlZCBgc3RyaWN0UGF0dGVybmAgYWZ0ZXIgZW5jb3VudGVyaW5nXG4gICAgICAvLyBTb3V0aCBLb3JlYW4gcGhvbmUgbnVtYmVyIGZvcm1hdHRpbmcgYnVnLlxuICAgICAgLy9cbiAgICAgIC8vIE5vbi1zdHJpY3QgcmVndWxhciBleHByZXNzaW9uIGJ1ZyBkZW1vbnN0cmF0aW9uOlxuICAgICAgLy9cbiAgICAgIC8vIHRoaXMubmF0aW9uYWxTaWduaWZpY2FudE51bWJlciA6IGAxMTExMTExMTFgICg5IGRpZ2l0cylcbiAgICAgIC8vXG4gICAgICAvLyBwYXR0ZXJuIDogKFxcZHsyfSkoXFxkezMsNH0pKFxcZHs0fSlcbiAgICAgIC8vIGZvcm1hdCA6IGAkMSAkMiAkM2BcbiAgICAgIC8vIGRpZ2l0cyA6IGA5OTk5OTk5OTk5YCAoMTAgZGlnaXRzKVxuICAgICAgLy9cbiAgICAgIC8vICc5OTk5OTk5OTk5Jy5yZXBsYWNlKG5ldyBSZWdFeHAoLyhcXGR7Mn0pKFxcZHszLDR9KShcXGR7NH0pL2cpLCAnJDEgJDIgJDMnKSA9IFwiOTkgOTk5OSA5OTk5XCJcbiAgICAgIC8vXG4gICAgICAvLyB0ZW1wbGF0ZSA6IHh4IHh4eHggeHh4eFxuICAgICAgLy9cbiAgICAgIC8vIEJ1dCB0aGUgY29ycmVjdCB0ZW1wbGF0ZSBpbiB0aGlzIGNhc2UgaXMgYHh4IHh4eCB4eHh4YC5cbiAgICAgIC8vIFRoZSB0ZW1wbGF0ZSB3YXMgZ2VuZXJhdGVkIGluY29ycmVjdGx5IGJlY2F1c2Ugb2YgdGhlXG4gICAgICAvLyBgezMsNH1gIHZhcmlhYmlsaXR5IGluIHRoZSBgcGF0dGVybmAuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIGZpeCBpcywgaWYgYHRoaXMubmF0aW9uYWxTaWduaWZpY2FudE51bWJlcmAgaGFzIGFscmVhZHkgc3VmZmljaWVudCBsZW5ndGhcbiAgICAgIC8vIHRvIHNhdGlzZnkgdGhlIGBwYXR0ZXJuYCBjb21wbGV0ZWx5IHRoZW4gYHRoaXMubmF0aW9uYWxTaWduaWZpY2FudE51bWJlcmBcbiAgICAgIC8vIGlzIHVzZWQgaW5zdGVhZCBvZiBgZGlnaXRzYC5cblxuXG4gICAgICB2YXIgc3RyaWN0UGF0dGVybiA9IG5ldyBSZWdFeHAoJ14nICsgcGF0dGVybiArICckJyk7XG4gICAgICB2YXIgbmF0aW9uYWxOdW1iZXJEdW1teURpZ2l0cyA9IG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIucmVwbGFjZSgvXFxkL2csIERVTU1ZX0RJR0lUKTsgLy8gSWYgYHRoaXMubmF0aW9uYWxTaWduaWZpY2FudE51bWJlcmAgaGFzIGFscmVhZHkgc3VmZmljaWVudCBsZW5ndGhcbiAgICAgIC8vIHRvIHNhdGlzZnkgdGhlIGBwYXR0ZXJuYCBjb21wbGV0ZWx5IHRoZW4gdXNlIGl0XG4gICAgICAvLyBpbnN0ZWFkIG9mIGBkaWdpdHNgLlxuXG4gICAgICBpZiAoc3RyaWN0UGF0dGVybi50ZXN0KG5hdGlvbmFsTnVtYmVyRHVtbXlEaWdpdHMpKSB7XG4gICAgICAgIGRpZ2l0cyA9IG5hdGlvbmFsTnVtYmVyRHVtbXlEaWdpdHM7XG4gICAgICB9XG5cbiAgICAgIHZhciBudW1iZXJGb3JtYXQgPSB0aGlzLmdldEZvcm1hdEZvcm1hdChmb3JtYXQsIGludGVybmF0aW9uYWwpO1xuICAgICAgdmFyIG5hdGlvbmFsUHJlZml4SW5jbHVkZWRJblRlbXBsYXRlOyAvLyBJZiBhIHVzZXIgZGlkIGlucHV0IGEgbmF0aW9uYWwgcHJlZml4IChhbmQgdGhhdCdzIGd1YXJhbnRlZWQpLFxuICAgICAgLy8gYW5kIGlmIGEgYGZvcm1hdGAgZG9lcyBoYXZlIGEgbmF0aW9uYWwgcHJlZml4IGZvcm1hdHRpbmcgcnVsZSxcbiAgICAgIC8vIHRoZW4gc2VlIGlmIHRoYXQgbmF0aW9uYWwgcHJlZml4IGZvcm1hdHRpbmcgcnVsZVxuICAgICAgLy8gcHJlcGVuZHMgZXhhY3RseSB0aGUgc2FtZSBuYXRpb25hbCBwcmVmaXggdGhlIHVzZXIgaGFzIGlucHV0LlxuICAgICAgLy8gSWYgdGhhdCdzIHRoZSBjYXNlLCB0aGVuIHVzZSB0aGUgYGZvcm1hdGAgd2l0aCB0aGUgbmF0aW9uYWwgcHJlZml4IGZvcm1hdHRpbmcgcnVsZS5cbiAgICAgIC8vIE90aGVyd2lzZSwgdXNlICB0aGUgYGZvcm1hdGAgd2l0aG91dCB0aGUgbmF0aW9uYWwgcHJlZml4IGZvcm1hdHRpbmcgcnVsZSxcbiAgICAgIC8vIGFuZCBwcmVwZW5kIGEgbmF0aW9uYWwgcHJlZml4IG1hbnVhbGx5IHRvIGl0LlxuXG4gICAgICBpZiAodGhpcy5zaG91bGRUcnlOYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlKGZvcm1hdCwge1xuICAgICAgICBpbnRlcm5hdGlvbmFsOiBpbnRlcm5hdGlvbmFsLFxuICAgICAgICBuYXRpb25hbFByZWZpeDogbmF0aW9uYWxQcmVmaXhcbiAgICAgIH0pKSB7XG4gICAgICAgIHZhciBudW1iZXJGb3JtYXRXaXRoTmF0aW9uYWxQcmVmaXggPSBudW1iZXJGb3JtYXQucmVwbGFjZShfZm9ybWF0TmF0aW9uYWxOdW1iZXJVc2luZ0Zvcm1hdC5GSVJTVF9HUk9VUF9QQVRURVJOLCBmb3JtYXQubmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSgpKTsgLy8gSWYgYG5hdGlvbmFsX3ByZWZpeF9mb3JtYXR0aW5nX3J1bGVgIG9mIGEgYGZvcm1hdGAgc2ltcGx5IHByZXBlbmRzXG4gICAgICAgIC8vIG5hdGlvbmFsIHByZWZpeCBhdCB0aGUgc3RhcnQgb2YgYSBuYXRpb25hbCAoc2lnbmlmaWNhbnQpIG51bWJlcixcbiAgICAgICAgLy8gdGhlbiBzdWNoIGZvcm1hdHRpbmcgY2FuIGJlIHVzZWQgd2l0aCBgQXNZb3VUeXBlYCBmb3JtYXR0ZXIuXG4gICAgICAgIC8vIFRoZXJlIHNlZW1zIHRvIGJlIG5vIGBlbHNlYCBjYXNlOiBldmVyeXdoZXJlIGluIG1ldGFkYXRhLFxuICAgICAgICAvLyBuYXRpb25hbCBwcmVmaXggZm9ybWF0dGluZyBydWxlIGlzIG5hdGlvbmFsIHByZWZpeCArICQxLFxuICAgICAgICAvLyBvciBgKCQxKWAsIGluIHdoaWNoIGNhc2Ugc3VjaCBmb3JtYXQgaXNuJ3QgZXZlbiBjb25zaWRlcmVkXG4gICAgICAgIC8vIHdoZW4gdGhlIHVzZXIgaGFzIGlucHV0IGEgbmF0aW9uYWwgcHJlZml4LlxuXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cbiAgICAgICAgaWYgKCgwLCBfcGFyc2VEaWdpdHNbXCJkZWZhdWx0XCJdKShmb3JtYXQubmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSgpKSA9PT0gKG5hdGlvbmFsUHJlZml4IHx8ICcnKSArICgwLCBfcGFyc2VEaWdpdHNbXCJkZWZhdWx0XCJdKSgnJDEnKSkge1xuICAgICAgICAgIG51bWJlckZvcm1hdCA9IG51bWJlckZvcm1hdFdpdGhOYXRpb25hbFByZWZpeDtcbiAgICAgICAgICBuYXRpb25hbFByZWZpeEluY2x1ZGVkSW5UZW1wbGF0ZSA9IHRydWU7IC8vIFJlcGxhY2UgYWxsIGRpZ2l0cyBvZiB0aGUgbmF0aW9uYWwgcHJlZml4IGluIHRoZSBmb3JtYXR0aW5nIHRlbXBsYXRlXG4gICAgICAgICAgLy8gd2l0aCBgRElHSVRfUExBQ0VIT0xERVJgcy5cblxuICAgICAgICAgIGlmIChuYXRpb25hbFByZWZpeCkge1xuICAgICAgICAgICAgdmFyIGkgPSBuYXRpb25hbFByZWZpeC5sZW5ndGg7XG5cbiAgICAgICAgICAgIHdoaWxlIChpID4gMCkge1xuICAgICAgICAgICAgICBudW1iZXJGb3JtYXQgPSBudW1iZXJGb3JtYXQucmVwbGFjZSgvXFxkLywgX0FzWW91VHlwZUZvcm1hdHRlclV0aWwuRElHSVRfUExBQ0VIT0xERVIpO1xuICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIEdlbmVyYXRlIGZvcm1hdHRpbmcgdGVtcGxhdGUgZm9yIHRoaXMgcGhvbmUgbnVtYmVyIGZvcm1hdC5cblxuXG4gICAgICB2YXIgdGVtcGxhdGUgPSBkaWdpdHMgLy8gRm9ybWF0IHRoZSBkdW1teSBwaG9uZSBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQuXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKHBhdHRlcm4pLCBudW1iZXJGb3JtYXQpIC8vIFJlcGxhY2UgZWFjaCBkdW1teSBkaWdpdCB3aXRoIGEgRElHSVRfUExBQ0VIT0xERVIuXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKERVTU1ZX0RJR0lULCAnZycpLCBfQXNZb3VUeXBlRm9ybWF0dGVyVXRpbC5ESUdJVF9QTEFDRUhPTERFUik7IC8vIElmIGEgcHJlZml4IG9mIGEgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIgaXMgbm90IGFzIHNpbXBsZVxuICAgICAgLy8gYXMganVzdCBhIGJhc2ljIG5hdGlvbmFsIHByZWZpeCwgdGhlbiBqdXN0IHByZXBlbmQgc3VjaCBwcmVmaXhcbiAgICAgIC8vIGJlZm9yZSB0aGUgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIsIG9wdGlvbmFsbHkgc3BhY2luZ1xuICAgICAgLy8gdGhlIHR3byB3aXRoIGEgd2hpdGVzcGFjZS5cblxuICAgICAgaWYgKCFuYXRpb25hbFByZWZpeEluY2x1ZGVkSW5UZW1wbGF0ZSkge1xuICAgICAgICBpZiAoY29tcGxleFByZWZpeEJlZm9yZU5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIpIHtcbiAgICAgICAgICAvLyBQcmVwZW5kIHRoZSBwcmVmaXggdG8gdGhlIHRlbXBsYXRlIG1hbnVhbGx5LlxuICAgICAgICAgIHRlbXBsYXRlID0gKDAsIF9Bc1lvdVR5cGVGb3JtYXR0ZXJVdGlsLnJlcGVhdCkoX0FzWW91VHlwZUZvcm1hdHRlclV0aWwuRElHSVRfUExBQ0VIT0xERVIsIGNvbXBsZXhQcmVmaXhCZWZvcmVOYXRpb25hbFNpZ25pZmljYW50TnVtYmVyLmxlbmd0aCkgKyAnICcgKyB0ZW1wbGF0ZTtcbiAgICAgICAgfSBlbHNlIGlmIChuYXRpb25hbFByZWZpeCkge1xuICAgICAgICAgIC8vIFByZXBlbmQgbmF0aW9uYWwgcHJlZml4IHRvIHRoZSB0ZW1wbGF0ZSBtYW51YWxseS5cbiAgICAgICAgICB0ZW1wbGF0ZSA9ICgwLCBfQXNZb3VUeXBlRm9ybWF0dGVyVXRpbC5yZXBlYXQpKF9Bc1lvdVR5cGVGb3JtYXR0ZXJVdGlsLkRJR0lUX1BMQUNFSE9MREVSLCBuYXRpb25hbFByZWZpeC5sZW5ndGgpICsgdGhpcy5nZXRTZXBhcmF0b3JBZnRlck5hdGlvbmFsUHJlZml4KGZvcm1hdCkgKyB0ZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaW50ZXJuYXRpb25hbCkge1xuICAgICAgICB0ZW1wbGF0ZSA9ICgwLCBfYXBwbHlJbnRlcm5hdGlvbmFsU2VwYXJhdG9yU3R5bGVbXCJkZWZhdWx0XCJdKSh0ZW1wbGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9ybWF0TmV4dE5hdGlvbmFsTnVtYmVyRGlnaXRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdE5leHROYXRpb25hbE51bWJlckRpZ2l0cyhkaWdpdHMpIHtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgX0FzWW91VHlwZUZvcm1hdHRlclV0aWwucG9wdWxhdGVUZW1wbGF0ZVdpdGhEaWdpdHMpKHRoaXMucG9wdWxhdGVkTmF0aW9uYWxOdW1iZXJUZW1wbGF0ZSwgdGhpcy5wb3B1bGF0ZWROYXRpb25hbE51bWJlclRlbXBsYXRlUG9zaXRpb24sIGRpZ2l0cyk7XG5cbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBmb3JtYXQuXG4gICAgICAgIHRoaXMucmVzZXRGb3JtYXQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcHVsYXRlZE5hdGlvbmFsTnVtYmVyVGVtcGxhdGUgPSByZXN1bHRbMF07XG4gICAgICB0aGlzLnBvcHVsYXRlZE5hdGlvbmFsTnVtYmVyVGVtcGxhdGVQb3NpdGlvbiA9IHJlc3VsdFsxXTsgLy8gUmV0dXJuIHRoZSBmb3JtYXR0ZWQgcGhvbmUgbnVtYmVyIHNvIGZhci5cblxuICAgICAgcmV0dXJuICgwLCBfQXNZb3VUeXBlRm9ybWF0dGVyVXRpbC5jdXRBbmRTdHJpcE5vblBhaXJlZFBhcmVucykodGhpcy5wb3B1bGF0ZWROYXRpb25hbE51bWJlclRlbXBsYXRlLCB0aGlzLnBvcHVsYXRlZE5hdGlvbmFsTnVtYmVyVGVtcGxhdGVQb3NpdGlvbiArIDEpOyAvLyBUaGUgb2xkIHdheSB3aGljaCB3YXMgZ29vZCBmb3IgYGlucHV0LWZvcm1hdGAgYnV0IGlzIG5vdCBzbyBnb29kXG4gICAgICAvLyBmb3IgYHJlYWN0LXBob25lLW51bWJlci1pbnB1dGAncyBkZWZhdWx0IGlucHV0IChgSW5wdXRCYXNpY2ApLlxuICAgICAgLy8gcmV0dXJuIGNsb3NlTm9uUGFpcmVkUGFyZW5zKHRoaXMucG9wdWxhdGVkTmF0aW9uYWxOdW1iZXJUZW1wbGF0ZSwgdGhpcy5wb3B1bGF0ZWROYXRpb25hbE51bWJlclRlbXBsYXRlUG9zaXRpb24gKyAxKVxuICAgICAgLy8gXHQucmVwbGFjZShuZXcgUmVnRXhwKERJR0lUX1BMQUNFSE9MREVSLCAnZycpLCAnICcpXG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZFRyeU5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkVHJ5TmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZShmb3JtYXQsIF9yZWY1KSB7XG4gICAgICB2YXIgaW50ZXJuYXRpb25hbCA9IF9yZWY1LmludGVybmF0aW9uYWwsXG4gICAgICAgICAgbmF0aW9uYWxQcmVmaXggPSBfcmVmNS5uYXRpb25hbFByZWZpeDtcblxuICAgICAgaWYgKGZvcm1hdC5uYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlKCkpIHtcbiAgICAgICAgLy8gSW4gc29tZSBjb3VudHJpZXMsIGBuYXRpb25hbF9wcmVmaXhfZm9ybWF0dGluZ19ydWxlYCBpcyBgKCQxKWAsXG4gICAgICAgIC8vIHNvIGl0IGFwcGxpZXMgZXZlbiBpZiB0aGUgdXNlciBoYXNuJ3QgaW5wdXQgYSBuYXRpb25hbCBwcmVmaXguXG4gICAgICAgIC8vIGBmb3JtYXQudXNlc05hdGlvbmFsUHJlZml4KClgIGRldGVjdHMgc3VjaCBjYXNlcy5cbiAgICAgICAgdmFyIHVzZXNOYXRpb25hbFByZWZpeCA9IGZvcm1hdC51c2VzTmF0aW9uYWxQcmVmaXgoKTtcblxuICAgICAgICBpZiAodXNlc05hdGlvbmFsUHJlZml4ICYmIG5hdGlvbmFsUHJlZml4IHx8ICF1c2VzTmF0aW9uYWxQcmVmaXggJiYgIWludGVybmF0aW9uYWwpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBc1lvdVR5cGVGb3JtYXR0ZXI7XG59KCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQXNZb3VUeXBlRm9ybWF0dGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNZb3VUeXBlRm9ybWF0dGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5ESUdJVF9QTEFDRUhPTERFUiA9IHZvaWQgMDtcbmV4cG9ydHMuY2xvc2VOb25QYWlyZWRQYXJlbnMgPSBjbG9zZU5vblBhaXJlZFBhcmVucztcbmV4cG9ydHMuY291bnRPY2N1cmVuY2VzID0gY291bnRPY2N1cmVuY2VzO1xuZXhwb3J0cy5jdXRBbmRTdHJpcE5vblBhaXJlZFBhcmVucyA9IGN1dEFuZFN0cmlwTm9uUGFpcmVkUGFyZW5zO1xuZXhwb3J0cy5wb3B1bGF0ZVRlbXBsYXRlV2l0aERpZ2l0cyA9IHBvcHVsYXRlVGVtcGxhdGVXaXRoRGlnaXRzO1xuZXhwb3J0cy5yZXBlYXQgPSByZXBlYXQ7XG5leHBvcnRzLnN0cmlwTm9uUGFpcmVkUGFyZW5zID0gc3RyaXBOb25QYWlyZWRQYXJlbnM7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07IGlmIChpdCkgcmV0dXJuIChpdCA9IGl0LmNhbGwobykpLm5leHQuYmluZChpdCk7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG4vLyBTaG91bGQgYmUgdGhlIHNhbWUgYXMgYERJR0lUX1BMQUNFSE9MREVSYCBpbiBgbGlicGhvbmVudW1iZXItbWV0YWRhdGEtZ2VuZXJhdG9yYC5cbnZhciBESUdJVF9QTEFDRUhPTERFUiA9ICd4JzsgLy8gJ1xcdTIwMDgnIChwdW5jdHVhdGlvbiBzcGFjZSlcblxuZXhwb3J0cy5ESUdJVF9QTEFDRUhPTERFUiA9IERJR0lUX1BMQUNFSE9MREVSO1xudmFyIERJR0lUX1BMQUNFSE9MREVSX01BVENIRVIgPSBuZXcgUmVnRXhwKERJR0lUX1BMQUNFSE9MREVSKTsgLy8gQ291bnRzIGFsbCBvY2N1cmVuY2VzIG9mIGEgc3ltYm9sIGluIGEgc3RyaW5nLlxuLy8gVW5pY29kZS11bnNhZmUgKGJlY2F1c2UgdXNpbmcgYC5zcGxpdCgpYCkuXG5cbmZ1bmN0aW9uIGNvdW50T2NjdXJlbmNlcyhzeW1ib2wsIHN0cmluZykge1xuICB2YXIgY291bnQgPSAwOyAvLyBVc2luZyBgLnNwbGl0KCcnKWAgdG8gaXRlcmF0ZSB0aHJvdWdoIGEgc3RyaW5nIGhlcmVcbiAgLy8gdG8gYXZvaWQgcmVxdWlyaW5nIGBTeW1ib2wuaXRlcmF0b3JgIHBvbHlmaWxsLlxuICAvLyBgLnNwbGl0KCcnKWAgaXMgZ2VuZXJhbGx5IG5vdCBzYWZlIGZvciBVbmljb2RlLFxuICAvLyBidXQgaW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UgZm9yIGNvdW50aW5nIGJyYWNrZXRzIGl0IGlzIHNhZmUuXG4gIC8vIGZvciAoY29uc3QgY2hhcmFjdGVyIG9mIHN0cmluZylcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKHN0cmluZy5zcGxpdCgnJykpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgIHZhciBjaGFyYWN0ZXIgPSBfc3RlcC52YWx1ZTtcblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IHN5bWJvbCkge1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY291bnQ7XG59IC8vIFJlcGVhdHMgYSBzdHJpbmcgKG9yIGEgc3ltYm9sKSBOIHRpbWVzLlxuLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yMDI2MDUvcmVwZWF0LXN0cmluZy1qYXZhc2NyaXB0XG5cblxuZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgdGltZXMpIHtcbiAgaWYgKHRpbWVzIDwgMSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcblxuICB3aGlsZSAodGltZXMgPiAxKSB7XG4gICAgaWYgKHRpbWVzICYgMSkge1xuICAgICAgcmVzdWx0ICs9IHN0cmluZztcbiAgICB9XG5cbiAgICB0aW1lcyA+Pj0gMTtcbiAgICBzdHJpbmcgKz0gc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCArIHN0cmluZztcbn1cblxuZnVuY3Rpb24gY3V0QW5kU3RyaXBOb25QYWlyZWRQYXJlbnMoc3RyaW5nLCBjdXRCZWZvcmVJbmRleCkge1xuICBpZiAoc3RyaW5nW2N1dEJlZm9yZUluZGV4XSA9PT0gJyknKSB7XG4gICAgY3V0QmVmb3JlSW5kZXgrKztcbiAgfVxuXG4gIHJldHVybiBzdHJpcE5vblBhaXJlZFBhcmVucyhzdHJpbmcuc2xpY2UoMCwgY3V0QmVmb3JlSW5kZXgpKTtcbn1cblxuZnVuY3Rpb24gY2xvc2VOb25QYWlyZWRQYXJlbnModGVtcGxhdGUsIGN1dF9iZWZvcmUpIHtcbiAgdmFyIHJldGFpbmVkX3RlbXBsYXRlID0gdGVtcGxhdGUuc2xpY2UoMCwgY3V0X2JlZm9yZSk7XG4gIHZhciBvcGVuaW5nX2JyYWNlcyA9IGNvdW50T2NjdXJlbmNlcygnKCcsIHJldGFpbmVkX3RlbXBsYXRlKTtcbiAgdmFyIGNsb3NpbmdfYnJhY2VzID0gY291bnRPY2N1cmVuY2VzKCcpJywgcmV0YWluZWRfdGVtcGxhdGUpO1xuICB2YXIgZGFuZ2xpbmdfYnJhY2VzID0gb3BlbmluZ19icmFjZXMgLSBjbG9zaW5nX2JyYWNlcztcblxuICB3aGlsZSAoZGFuZ2xpbmdfYnJhY2VzID4gMCAmJiBjdXRfYmVmb3JlIDwgdGVtcGxhdGUubGVuZ3RoKSB7XG4gICAgaWYgKHRlbXBsYXRlW2N1dF9iZWZvcmVdID09PSAnKScpIHtcbiAgICAgIGRhbmdsaW5nX2JyYWNlcy0tO1xuICAgIH1cblxuICAgIGN1dF9iZWZvcmUrKztcbiAgfVxuXG4gIHJldHVybiB0ZW1wbGF0ZS5zbGljZSgwLCBjdXRfYmVmb3JlKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBOb25QYWlyZWRQYXJlbnMoc3RyaW5nKSB7XG4gIHZhciBkYW5nbGluZ19icmFjZXMgPSBbXTtcbiAgdmFyIGkgPSAwO1xuXG4gIHdoaWxlIChpIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgIGlmIChzdHJpbmdbaV0gPT09ICcoJykge1xuICAgICAgZGFuZ2xpbmdfYnJhY2VzLnB1c2goaSk7XG4gICAgfSBlbHNlIGlmIChzdHJpbmdbaV0gPT09ICcpJykge1xuICAgICAgZGFuZ2xpbmdfYnJhY2VzLnBvcCgpO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIHZhciBzdGFydCA9IDA7XG4gIHZhciBjbGVhcmVkX3N0cmluZyA9ICcnO1xuICBkYW5nbGluZ19icmFjZXMucHVzaChzdHJpbmcubGVuZ3RoKTtcblxuICBmb3IgKHZhciBfaSA9IDAsIF9kYW5nbGluZ19icmFjZXMgPSBkYW5nbGluZ19icmFjZXM7IF9pIDwgX2RhbmdsaW5nX2JyYWNlcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgaW5kZXggPSBfZGFuZ2xpbmdfYnJhY2VzW19pXTtcbiAgICBjbGVhcmVkX3N0cmluZyArPSBzdHJpbmcuc2xpY2Uoc3RhcnQsIGluZGV4KTtcbiAgICBzdGFydCA9IGluZGV4ICsgMTtcbiAgfVxuXG4gIHJldHVybiBjbGVhcmVkX3N0cmluZztcbn1cblxuZnVuY3Rpb24gcG9wdWxhdGVUZW1wbGF0ZVdpdGhEaWdpdHModGVtcGxhdGUsIHBvc2l0aW9uLCBkaWdpdHMpIHtcbiAgLy8gVXNpbmcgYC5zcGxpdCgnJylgIHRvIGl0ZXJhdGUgdGhyb3VnaCBhIHN0cmluZyBoZXJlXG4gIC8vIHRvIGF2b2lkIHJlcXVpcmluZyBgU3ltYm9sLml0ZXJhdG9yYCBwb2x5ZmlsbC5cbiAgLy8gYC5zcGxpdCgnJylgIGlzIGdlbmVyYWxseSBub3Qgc2FmZSBmb3IgVW5pY29kZSxcbiAgLy8gYnV0IGluIHRoaXMgcGFydGljdWxhciBjYXNlIGZvciBgZGlnaXRzYCBpdCBpcyBzYWZlLlxuICAvLyBmb3IgKGNvbnN0IGRpZ2l0IG9mIGRpZ2l0cylcbiAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UoZGlnaXRzLnNwbGl0KCcnKSksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgdmFyIGRpZ2l0ID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgcm9vbSBmb3IgbW9yZSBkaWdpdHMgaW4gY3VycmVudCBgdGVtcGxhdGVgLFxuICAgIC8vIHRoZW4gc2V0IHRoZSBuZXh0IGRpZ2l0IGluIHRoZSBgdGVtcGxhdGVgLFxuICAgIC8vIGFuZCByZXR1cm4gdGhlIGZvcm1hdHRlZCBkaWdpdHMgc28gZmFyLlxuICAgIC8vIElmIG1vcmUgZGlnaXRzIGFyZSBlbnRlcmVkIHRoYW4gdGhlIGN1cnJlbnQgZm9ybWF0IGNvdWxkIGhhbmRsZS5cbiAgICBpZiAodGVtcGxhdGUuc2xpY2UocG9zaXRpb24gKyAxKS5zZWFyY2goRElHSVRfUExBQ0VIT0xERVJfTUFUQ0hFUikgPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcG9zaXRpb24gPSB0ZW1wbGF0ZS5zZWFyY2goRElHSVRfUExBQ0VIT0xERVJfTUFUQ0hFUik7XG4gICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKERJR0lUX1BMQUNFSE9MREVSX01BVENIRVIsIGRpZ2l0KTtcbiAgfVxuXG4gIHJldHVybiBbdGVtcGxhdGUsIHBvc2l0aW9uXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzWW91VHlwZUZvcm1hdHRlci51dGlsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5leHBvcnRzLmV4dHJhY3RGb3JtYXR0ZWREaWdpdHNBbmRQbHVzID0gZXh0cmFjdEZvcm1hdHRlZERpZ2l0c0FuZFBsdXM7XG5cbnZhciBfZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZS5qc1wiKSk7XG5cbnZhciBfZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZUZyb21JbnRlcm5hdGlvbmFsTnVtYmVyV2l0aG91dFBsdXNTaWduID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9oZWxwZXJzL2V4dHJhY3RDb3VudHJ5Q2FsbGluZ0NvZGVGcm9tSW50ZXJuYXRpb25hbE51bWJlcldpdGhvdXRQbHVzU2lnbi5qc1wiKSk7XG5cbnZhciBfZXh0cmFjdE5hdGlvbmFsTnVtYmVyRnJvbVBvc3NpYmx5SW5jb21wbGV0ZU51bWJlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaGVscGVycy9leHRyYWN0TmF0aW9uYWxOdW1iZXJGcm9tUG9zc2libHlJbmNvbXBsZXRlTnVtYmVyLmpzXCIpKTtcblxudmFyIF9zdHJpcElkZFByZWZpeCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaGVscGVycy9zdHJpcElkZFByZWZpeC5qc1wiKSk7XG5cbnZhciBfcGFyc2VEaWdpdHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvcGFyc2VEaWdpdHMuanNcIikpO1xuXG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTsgaWYgKF9pID09IG51bGwpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfcywgX2U7IHRyeSB7IGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG52YXIgVkFMSURfRk9STUFUVEVEX1BIT05FX05VTUJFUl9ESUdJVFNfUEFSVCA9ICdbJyArIF9jb25zdGFudHMuVkFMSURfUFVOQ1RVQVRJT04gKyBfY29uc3RhbnRzLlZBTElEX0RJR0lUUyArICddKyc7XG52YXIgVkFMSURfRk9STUFUVEVEX1BIT05FX05VTUJFUl9ESUdJVFNfUEFSVF9QQVRURVJOID0gbmV3IFJlZ0V4cCgnXicgKyBWQUxJRF9GT1JNQVRURURfUEhPTkVfTlVNQkVSX0RJR0lUU19QQVJUICsgJyQnLCAnaScpO1xudmFyIFZBTElEX0ZPUk1BVFRFRF9QSE9ORV9OVU1CRVJfUEFSVCA9ICcoPzonICsgJ1snICsgX2NvbnN0YW50cy5QTFVTX0NIQVJTICsgJ10nICsgJ1snICsgX2NvbnN0YW50cy5WQUxJRF9QVU5DVFVBVElPTiArIF9jb25zdGFudHMuVkFMSURfRElHSVRTICsgJ10qJyArICd8JyArICdbJyArIF9jb25zdGFudHMuVkFMSURfUFVOQ1RVQVRJT04gKyBfY29uc3RhbnRzLlZBTElEX0RJR0lUUyArICddKycgKyAnKSc7XG52YXIgQUZURVJfUEhPTkVfTlVNQkVSX0RJR0lUU19FTkRfUEFUVEVSTiA9IG5ldyBSZWdFeHAoJ1teJyArIF9jb25zdGFudHMuVkFMSURfUFVOQ1RVQVRJT04gKyBfY29uc3RhbnRzLlZBTElEX0RJR0lUUyArICddKycgKyAnLionICsgJyQnKTsgLy8gVGVzdHMgd2hldGhlciBgbmF0aW9uYWxfcHJlZml4X2Zvcl9wYXJzaW5nYCBjb3VsZCBtYXRjaFxuLy8gZGlmZmVyZW50IG5hdGlvbmFsIHByZWZpeGVzLlxuLy8gTWF0Y2hlcyBhbnl0aGluZyB0aGF0J3Mgbm90IGEgZGlnaXQgb3IgYSBzcXVhcmUgYnJhY2tldC5cblxudmFyIENPTVBMRVhfTkFUSU9OQUxfUFJFRklYID0gL1teXFxkXFxbXFxdXS87XG5cbnZhciBBc1lvdVR5cGVQYXJzZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBc1lvdVR5cGVQYXJzZXIoX3JlZikge1xuICAgIHZhciBkZWZhdWx0Q291bnRyeSA9IF9yZWYuZGVmYXVsdENvdW50cnksXG4gICAgICAgIGRlZmF1bHRDYWxsaW5nQ29kZSA9IF9yZWYuZGVmYXVsdENhbGxpbmdDb2RlLFxuICAgICAgICBtZXRhZGF0YSA9IF9yZWYubWV0YWRhdGEsXG4gICAgICAgIG9uTmF0aW9uYWxTaWduaWZpY2FudE51bWJlckNoYW5nZSA9IF9yZWYub25OYXRpb25hbFNpZ25pZmljYW50TnVtYmVyQ2hhbmdlO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFzWW91VHlwZVBhcnNlcik7XG5cbiAgICB0aGlzLmRlZmF1bHRDb3VudHJ5ID0gZGVmYXVsdENvdW50cnk7XG4gICAgdGhpcy5kZWZhdWx0Q2FsbGluZ0NvZGUgPSBkZWZhdWx0Q2FsbGluZ0NvZGU7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAgIHRoaXMub25OYXRpb25hbFNpZ25pZmljYW50TnVtYmVyQ2hhbmdlID0gb25OYXRpb25hbFNpZ25pZmljYW50TnVtYmVyQ2hhbmdlO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFzWW91VHlwZVBhcnNlciwgW3tcbiAgICBrZXk6IFwiaW5wdXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5wdXQodGV4dCwgc3RhdGUpIHtcbiAgICAgIHZhciBfZXh0cmFjdEZvcm1hdHRlZERpZ2kgPSBleHRyYWN0Rm9ybWF0dGVkRGlnaXRzQW5kUGx1cyh0ZXh0KSxcbiAgICAgICAgICBfZXh0cmFjdEZvcm1hdHRlZERpZ2kyID0gX3NsaWNlZFRvQXJyYXkoX2V4dHJhY3RGb3JtYXR0ZWREaWdpLCAyKSxcbiAgICAgICAgICBmb3JtYXR0ZWREaWdpdHMgPSBfZXh0cmFjdEZvcm1hdHRlZERpZ2kyWzBdLFxuICAgICAgICAgIGhhc1BsdXMgPSBfZXh0cmFjdEZvcm1hdHRlZERpZ2kyWzFdO1xuXG4gICAgICB2YXIgZGlnaXRzID0gKDAsIF9wYXJzZURpZ2l0c1tcImRlZmF1bHRcIl0pKGZvcm1hdHRlZERpZ2l0cyk7IC8vIENoZWNrcyBmb3IgYSBzcGVjaWFsIGNhc2U6IGp1c3QgYSBsZWFkaW5nIGArYCBoYXMgYmVlbiBlbnRlcmVkLlxuXG4gICAgICB2YXIganVzdExlYWRpbmdQbHVzO1xuXG4gICAgICBpZiAoaGFzUGx1cykge1xuICAgICAgICBpZiAoIXN0YXRlLmRpZ2l0cykge1xuICAgICAgICAgIHN0YXRlLnN0YXJ0SW50ZXJuYXRpb25hbE51bWJlcigpO1xuXG4gICAgICAgICAgaWYgKCFkaWdpdHMpIHtcbiAgICAgICAgICAgIGp1c3RMZWFkaW5nUGx1cyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWdpdHMpIHtcbiAgICAgICAgdGhpcy5pbnB1dERpZ2l0cyhkaWdpdHMsIHN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlnaXRzOiBkaWdpdHMsXG4gICAgICAgIGp1c3RMZWFkaW5nUGx1czoganVzdExlYWRpbmdQbHVzXG4gICAgICB9O1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIElucHV0cyBcIm5leHRcIiBwaG9uZSBudW1iZXIgZGlnaXRzLlxyXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBkaWdpdHNcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gW2Zvcm1hdHRlZE51bWJlcl0gRm9ybWF0dGVkIG5hdGlvbmFsIHBob25lIG51bWJlciAoaWYgaXQgY2FuIGJlIGZvcm1hdHRlZCBhdCB0aGlzIHN0YWdlKS4gUmV0dXJuaW5nIGB1bmRlZmluZWRgIG1lYW5zIFwiZG9uJ3QgZm9ybWF0IHRoZSBuYXRpb25hbCBwaG9uZSBudW1iZXIgYXQgdGhpcyBzdGFnZVwiLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbnB1dERpZ2l0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnB1dERpZ2l0cyhuZXh0RGlnaXRzLCBzdGF0ZSkge1xuICAgICAgdmFyIGRpZ2l0cyA9IHN0YXRlLmRpZ2l0cztcbiAgICAgIHZhciBoYXNSZWNlaXZlZFRocmVlTGVhZGluZ0RpZ2l0cyA9IGRpZ2l0cy5sZW5ndGggPCAzICYmIGRpZ2l0cy5sZW5ndGggKyBuZXh0RGlnaXRzLmxlbmd0aCA+PSAzOyAvLyBBcHBlbmQgcGhvbmUgbnVtYmVyIGRpZ2l0cy5cblxuICAgICAgc3RhdGUuYXBwZW5kRGlnaXRzKG5leHREaWdpdHMpOyAvLyBBdHRlbXB0IHRvIGV4dHJhY3QgSUREIHByZWZpeDpcbiAgICAgIC8vIFNvbWUgdXNlcnMgaW5wdXQgdGhlaXIgcGhvbmUgbnVtYmVyIGluIGludGVybmF0aW9uYWwgZm9ybWF0LFxuICAgICAgLy8gYnV0IGluIGFuIFwib3V0LW9mLWNvdW50cnlcIiBkaWFsaW5nIGZvcm1hdCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBsZWFkaW5nIGArYC5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXRhbXBoZXRhbWluZS9saWJwaG9uZW51bWJlci1qcy9pc3N1ZXMvMTg1XG4gICAgICAvLyBEZXRlY3Qgc3VjaCBudW1iZXJzIGFzIHNvb24gYXMgdGhlcmUncmUgYXQgbGVhc3QgMyBkaWdpdHMuXG4gICAgICAvLyBHb29nbGUncyBsaWJyYXJ5IGF0dGVtcHRzIHRvIGV4dHJhY3QgSUREIHByZWZpeCBhdCAzIGRpZ2l0cyxcbiAgICAgIC8vIHNvIHRoaXMgbGlicmFyeSBqdXN0IGNvcGllcyB0aGF0IGJlaGF2aW9yLlxuICAgICAgLy8gSSBndWVzcyB0aGF0J3MgYmVjYXVzZSB0aGUgbW9zdCBjb21tb3QgSUREIHByZWZpeGVzIGFyZVxuICAgICAgLy8gYDAwYCAoRXVyb3BlKSBhbmQgYDAxMWAgKFVTKS5cbiAgICAgIC8vIFRoZXJlIGV4aXN0IHJlYWxseSBsb25nIElERCBwcmVmaXhlcyB0b286XG4gICAgICAvLyBmb3IgZXhhbXBsZSwgaW4gQXVzdHJhbGlhIHRoZSBkZWZhdWx0IElERCBwcmVmaXggaXMgYDAwMTFgLFxuICAgICAgLy8gYW5kIGl0IGNvdWxkIGV2ZW4gYmUgYXMgbG9uZyBhcyBgMTQ4ODAwMTFgLlxuICAgICAgLy8gQW4gSUREIHByZWZpeCBpcyBleHRyYWN0ZWQgaGVyZSwgYW5kIHRoZW4gZXZlcnkgdGltZSB3aGVuXG4gICAgICAvLyB0aGVyZSdzIGEgbmV3IGRpZ2l0IGFuZCB0aGUgbnVtYmVyIGNvdWxkbid0IGJlIGZvcm1hdHRlZC5cblxuICAgICAgaWYgKGhhc1JlY2VpdmVkVGhyZWVMZWFkaW5nRGlnaXRzKSB7XG4gICAgICAgIHRoaXMuZXh0cmFjdElkZFByZWZpeChzdGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzV2FpdGluZ0ZvckNvdW50cnlDYWxsaW5nQ29kZShzdGF0ZSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV4dHJhY3RDb3VudHJ5Q2FsbGluZ0NvZGUoc3RhdGUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5hcHBlbmROYXRpb25hbFNpZ25pZmljYW50TnVtYmVyRGlnaXRzKG5leHREaWdpdHMpO1xuICAgICAgfSAvLyBJZiBhIHBob25lIG51bWJlciBpcyBiZWluZyBpbnB1dCBpbiBpbnRlcm5hdGlvbmFsIGZvcm1hdCxcbiAgICAgIC8vIHRoZW4gaXQncyBub3QgdmFsaWQgZm9yIGl0IHRvIGhhdmUgYSBuYXRpb25hbCBwcmVmaXguXG4gICAgICAvLyBTdGlsbCwgc29tZSBwZW9wbGUgaW5jb3JyZWN0bHkgaW5wdXQgc3VjaCBudW1iZXJzIHdpdGggYSBuYXRpb25hbCBwcmVmaXguXG4gICAgICAvLyBJbiBzdWNoIGNhc2VzLCBvbmx5IGF0dGVtcHQgdG8gc3RyaXAgYSBuYXRpb25hbCBwcmVmaXggaWYgdGhlIG51bWJlciBiZWNvbWVzIHRvbyBsb25nLlxuICAgICAgLy8gKGJ1dCB0aGF0IGlzIGRvbmUgbGF0ZXIsIG5vdCBoZXJlKVxuXG5cbiAgICAgIGlmICghc3RhdGUuaW50ZXJuYXRpb25hbCkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzRXh0cmFjdGVkTmF0aW9uYWxTaWduaWZpY2FudE51bWJlcikge1xuICAgICAgICAgIHRoaXMuZXh0cmFjdE5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIoc3RhdGUuZ2V0TmF0aW9uYWxEaWdpdHMoKSwgZnVuY3Rpb24gKHN0YXRlVXBkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUudXBkYXRlKHN0YXRlVXBkYXRlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1dhaXRpbmdGb3JDb3VudHJ5Q2FsbGluZ0NvZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNXYWl0aW5nRm9yQ291bnRyeUNhbGxpbmdDb2RlKF9yZWYyKSB7XG4gICAgICB2YXIgaW50ZXJuYXRpb25hbCA9IF9yZWYyLmludGVybmF0aW9uYWwsXG4gICAgICAgICAgY2FsbGluZ0NvZGUgPSBfcmVmMi5jYWxsaW5nQ29kZTtcbiAgICAgIHJldHVybiBpbnRlcm5hdGlvbmFsICYmICFjYWxsaW5nQ29kZTtcbiAgICB9IC8vIEV4dHJhY3RzIGEgY291bnRyeSBjYWxsaW5nIGNvZGUgZnJvbSBhIG51bWJlclxuICAgIC8vIGJlaW5nIGVudGVyZWQgaW4gaW50ZXJuYXRvbmFsIGZvcm1hdC5cblxuICB9LCB7XG4gICAga2V5OiBcImV4dHJhY3RDb3VudHJ5Q2FsbGluZ0NvZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZShzdGF0ZSkge1xuICAgICAgdmFyIF9leHRyYWN0Q291bnRyeUNhbGxpbiA9ICgwLCBfZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZTJbXCJkZWZhdWx0XCJdKSgnKycgKyBzdGF0ZS5nZXREaWdpdHNXaXRob3V0SW50ZXJuYXRpb25hbFByZWZpeCgpLCB0aGlzLmRlZmF1bHRDb3VudHJ5LCB0aGlzLmRlZmF1bHRDYWxsaW5nQ29kZSwgdGhpcy5tZXRhZGF0YS5tZXRhZGF0YSksXG4gICAgICAgICAgY291bnRyeUNhbGxpbmdDb2RlID0gX2V4dHJhY3RDb3VudHJ5Q2FsbGluLmNvdW50cnlDYWxsaW5nQ29kZSxcbiAgICAgICAgICBudW1iZXIgPSBfZXh0cmFjdENvdW50cnlDYWxsaW4ubnVtYmVyO1xuXG4gICAgICBpZiAoY291bnRyeUNhbGxpbmdDb2RlKSB7XG4gICAgICAgIHN0YXRlLnNldENhbGxpbmdDb2RlKGNvdW50cnlDYWxsaW5nQ29kZSk7XG4gICAgICAgIHN0YXRlLnVwZGF0ZSh7XG4gICAgICAgICAgbmF0aW9uYWxTaWduaWZpY2FudE51bWJlcjogbnVtYmVyXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQobnVtYmVyaW5nUGxhbikge1xuICAgICAgaWYgKG51bWJlcmluZ1BsYW4pIHtcbiAgICAgICAgdGhpcy5oYXNTZWxlY3RlZE51bWJlcmluZ1BsYW4gPSB0cnVlO1xuXG4gICAgICAgIHZhciBuYXRpb25hbFByZWZpeEZvclBhcnNpbmcgPSBudW1iZXJpbmdQbGFuLl9uYXRpb25hbFByZWZpeEZvclBhcnNpbmcoKTtcblxuICAgICAgICB0aGlzLmNvdWxkUG9zc2libHlFeHRyYWN0QW5vdGhlck5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIgPSBuYXRpb25hbFByZWZpeEZvclBhcnNpbmcgJiYgQ09NUExFWF9OQVRJT05BTF9QUkVGSVgudGVzdChuYXRpb25hbFByZWZpeEZvclBhcnNpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oYXNTZWxlY3RlZE51bWJlcmluZ1BsYW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY291bGRQb3NzaWJseUV4dHJhY3RBbm90aGVyTmF0aW9uYWxTaWduaWZpY2FudE51bWJlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBFeHRyYWN0cyBhIG5hdGlvbmFsIChzaWduaWZpY2FudCkgbnVtYmVyIGZyb20gdXNlciBpbnB1dC5cclxuICAgICAqIEdvb2dsZSdzIGxpYnJhcnkgaXMgZGlmZmVyZW50IGluIHRoYXQgaXQgb25seSBhcHBsaWVzIGBuYXRpb25hbF9wcmVmaXhfZm9yX3BhcnNpbmdgXHJcbiAgICAgKiBhbmQgZG9lc24ndCBhcHBseSBgbmF0aW9uYWxfcHJlZml4X3RyYW5zZm9ybV9ydWxlYCBhZnRlciB0aGF0LlxyXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9saWJwaG9uZW51bWJlci9ibG9iL2EzZDcwYjA0ODc4NzU0NzVlNmFkNjU5YWY0MDQ5NDMyMTFkMjY0NTYvamF2YS9saWJwaG9uZW51bWJlci9zcmMvY29tL2dvb2dsZS9pMThuL3Bob25lbnVtYmVycy9Bc1lvdVR5cGVGb3JtYXR0ZXIuamF2YSNMNTM5XHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBbZXh0cmFjdGVkXVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJleHRyYWN0TmF0aW9uYWxTaWduaWZpY2FudE51bWJlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleHRyYWN0TmF0aW9uYWxTaWduaWZpY2FudE51bWJlcihuYXRpb25hbERpZ2l0cywgc2V0U3RhdGUpIHtcbiAgICAgIGlmICghdGhpcy5oYXNTZWxlY3RlZE51bWJlcmluZ1BsYW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgX2V4dHJhY3ROYXRpb25hbE51bWJlID0gKDAsIF9leHRyYWN0TmF0aW9uYWxOdW1iZXJGcm9tUG9zc2libHlJbmNvbXBsZXRlTnVtYmVyW1wiZGVmYXVsdFwiXSkobmF0aW9uYWxEaWdpdHMsIHRoaXMubWV0YWRhdGEpLFxuICAgICAgICAgIG5hdGlvbmFsUHJlZml4ID0gX2V4dHJhY3ROYXRpb25hbE51bWJlLm5hdGlvbmFsUHJlZml4LFxuICAgICAgICAgIG5hdGlvbmFsTnVtYmVyID0gX2V4dHJhY3ROYXRpb25hbE51bWJlLm5hdGlvbmFsTnVtYmVyLFxuICAgICAgICAgIGNhcnJpZXJDb2RlID0gX2V4dHJhY3ROYXRpb25hbE51bWJlLmNhcnJpZXJDb2RlO1xuXG4gICAgICBpZiAobmF0aW9uYWxOdW1iZXIgPT09IG5hdGlvbmFsRGlnaXRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vbkV4dHJhY3RlZE5hdGlvbmFsTnVtYmVyKG5hdGlvbmFsUHJlZml4LCBjYXJyaWVyQ29kZSwgbmF0aW9uYWxOdW1iZXIsIG5hdGlvbmFsRGlnaXRzLCBzZXRTdGF0ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJbiBHb29nbGUncyBjb2RlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIFwiYXR0ZW1wdCB0byBleHRyYWN0IGxvbmdlciBORERcIi5cclxuICAgICAqIFwiU29tZSBuYXRpb25hbCBwcmVmaXhlcyBhcmUgYSBzdWJzdHJpbmcgb2Ygb3RoZXJzXCIsIHRoZXkgc2F5LlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gW3Jlc3VsdF0g4oCUIFJldHVybnMgYHRydWVgIGlmIGV4dHJhY3RpbmcgYSBuYXRpb25hbCBwcmVmaXggcHJvZHVjZWQgZGlmZmVyZW50IHJlc3VsdHMgZnJvbSB3aGF0IHRoZXkgd2VyZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZXh0cmFjdEFub3RoZXJOYXRpb25hbFNpZ25pZmljYW50TnVtYmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4dHJhY3RBbm90aGVyTmF0aW9uYWxTaWduaWZpY2FudE51bWJlcihuYXRpb25hbERpZ2l0cywgcHJldk5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIsIHNldFN0YXRlKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzRXh0cmFjdGVkTmF0aW9uYWxTaWduaWZpY2FudE51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0TmF0aW9uYWxTaWduaWZpY2FudE51bWJlcihuYXRpb25hbERpZ2l0cywgc2V0U3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuY291bGRQb3NzaWJseUV4dHJhY3RBbm90aGVyTmF0aW9uYWxTaWduaWZpY2FudE51bWJlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBfZXh0cmFjdE5hdGlvbmFsTnVtYmUyID0gKDAsIF9leHRyYWN0TmF0aW9uYWxOdW1iZXJGcm9tUG9zc2libHlJbmNvbXBsZXRlTnVtYmVyW1wiZGVmYXVsdFwiXSkobmF0aW9uYWxEaWdpdHMsIHRoaXMubWV0YWRhdGEpLFxuICAgICAgICAgIG5hdGlvbmFsUHJlZml4ID0gX2V4dHJhY3ROYXRpb25hbE51bWJlMi5uYXRpb25hbFByZWZpeCxcbiAgICAgICAgICBuYXRpb25hbE51bWJlciA9IF9leHRyYWN0TmF0aW9uYWxOdW1iZTIubmF0aW9uYWxOdW1iZXIsXG4gICAgICAgICAgY2FycmllckNvZGUgPSBfZXh0cmFjdE5hdGlvbmFsTnVtYmUyLmNhcnJpZXJDb2RlOyAvLyBJZiBhIG5hdGlvbmFsIHByZWZpeCBoYXMgYmVlbiBleHRyYWN0ZWQgcHJldmlvdXNseSxcbiAgICAgIC8vIHRoZW4gaXQncyBhbHdheXMgZXh0cmFjdGVkIGFzIGFkZGl0aW9uYWwgZGlnaXRzIGFyZSBhZGRlZC5cbiAgICAgIC8vIFRoYXQncyBhc3N1bWluZyBgZXh0cmFjdE5hdGlvbmFsTnVtYmVyRnJvbVBvc3NpYmx5SW5jb21wbGV0ZU51bWJlcigpYFxuICAgICAgLy8gZG9lc24ndCBkbyBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSB3aGF0IGl0IGN1cnJlbnRseSBkb2VzLlxuICAgICAgLy8gU28sIGp1c3QgaW4gY2FzZSwgaGVyZSdzIHRoaXMgY2hlY2ssIHRob3VnaCBpdCBkb2Vzbid0IG9jY3VyLlxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cblxuXG4gICAgICBpZiAobmF0aW9uYWxOdW1iZXIgPT09IHByZXZOYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vbkV4dHJhY3RlZE5hdGlvbmFsTnVtYmVyKG5hdGlvbmFsUHJlZml4LCBjYXJyaWVyQ29kZSwgbmF0aW9uYWxOdW1iZXIsIG5hdGlvbmFsRGlnaXRzLCBzZXRTdGF0ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25FeHRyYWN0ZWROYXRpb25hbE51bWJlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkV4dHJhY3RlZE5hdGlvbmFsTnVtYmVyKG5hdGlvbmFsUHJlZml4LCBjYXJyaWVyQ29kZSwgbmF0aW9uYWxTaWduaWZpY2FudE51bWJlciwgbmF0aW9uYWxEaWdpdHMsIHNldFN0YXRlKSB7XG4gICAgICB2YXIgY29tcGxleFByZWZpeEJlZm9yZU5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXI7XG4gICAgICB2YXIgbmF0aW9uYWxTaWduaWZpY2FudE51bWJlck1hdGNoZXNJbnB1dDsgLy8gVGhpcyBjaGVjayBhbHNvIHdvcmtzIHdpdGggZW1wdHkgYHRoaXMubmF0aW9uYWxTaWduaWZpY2FudE51bWJlcmAuXG5cbiAgICAgIHZhciBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVySW5kZXggPSBuYXRpb25hbERpZ2l0cy5sYXN0SW5kZXhPZihuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKTsgLy8gSWYgdGhlIGV4dHJhY3RlZCBuYXRpb25hbCAoc2lnbmlmaWNhbnQpIG51bWJlciBpcyB0aGVcbiAgICAgIC8vIGxhc3Qgc3Vic3RyaW5nIG9mIHRoZSBgZGlnaXRzYCwgdGhlbiBpdCBtZWFucyB0aGF0IGl0IGhhc24ndCBiZWVuIGFsdGVyZWQ6XG4gICAgICAvLyBubyBkaWdpdHMgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXJcbiAgICAgIC8vIHdoaWxlIGFwcGx5aW5nIGBuYXRpb25hbF9wcmVmaXhfdHJhbnNmb3JtX3J1bGVgLlxuICAgICAgLy8gaHR0cHM6Ly9naXRsYWIuY29tL2NhdGFtcGhldGFtaW5lL2xpYnBob25lbnVtYmVyLWpzLy0vYmxvYi9tYXN0ZXIvTUVUQURBVEEubWQjbmF0aW9uYWxfcHJlZml4X2Zvcl9wYXJzaW5nLS1uYXRpb25hbF9wcmVmaXhfdHJhbnNmb3JtX3J1bGVcblxuICAgICAgaWYgKG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXJJbmRleCA+PSAwICYmIG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXJJbmRleCA9PT0gbmF0aW9uYWxEaWdpdHMubGVuZ3RoIC0gbmF0aW9uYWxTaWduaWZpY2FudE51bWJlci5sZW5ndGgpIHtcbiAgICAgICAgbmF0aW9uYWxTaWduaWZpY2FudE51bWJlck1hdGNoZXNJbnB1dCA9IHRydWU7IC8vIElmIGEgcHJlZml4IG9mIGEgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIgaXMgbm90IGFzIHNpbXBsZVxuICAgICAgICAvLyBhcyBqdXN0IGEgYmFzaWMgbmF0aW9uYWwgcHJlZml4LCB0aGVuIHN1Y2ggcHJlZml4IGlzIHN0b3JlZCBpblxuICAgICAgICAvLyBgdGhpcy5jb21wbGV4UHJlZml4QmVmb3JlTmF0aW9uYWxTaWduaWZpY2FudE51bWJlcmAgcHJvcGVydHkgYW5kIHdpbGwgYmVcbiAgICAgICAgLy8gcHJlcGVuZGVkIFwiYXMgaXNcIiB0byB0aGUgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIgdG8gcHJvZHVjZVxuICAgICAgICAvLyBhIGZvcm1hdHRlZCByZXN1bHQuXG5cbiAgICAgICAgdmFyIHByZWZpeEJlZm9yZU5hdGlvbmFsTnVtYmVyID0gbmF0aW9uYWxEaWdpdHMuc2xpY2UoMCwgbmF0aW9uYWxTaWduaWZpY2FudE51bWJlckluZGV4KTsgLy8gYHByZWZpeEJlZm9yZU5hdGlvbmFsTnVtYmVyYCBpcyBhbHdheXMgbm9uLWVtcHR5LFxuICAgICAgICAvLyBiZWNhdXNlIGBvbkV4dHJhY3RlZE5hdGlvbmFsTnVtYmVyKClgIGlzbid0IGNhbGxlZFxuICAgICAgICAvLyB3aGVuIGEgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIgaGFzbid0IGJlZW4gYWN0dWFsbHkgXCJleHRyYWN0ZWRcIjpcbiAgICAgICAgLy8gd2hlbiBhIG5hdGlvbmFsIChzaWduaWZpY2FudCkgbnVtYmVyIGlzIGVxdWFsIHRvIHRoZSBuYXRpb25hbCBwYXJ0IG9mIGBkaWdpdHNgLFxuICAgICAgICAvLyB0aGVuIGBvbkV4dHJhY3RlZE5hdGlvbmFsTnVtYmVyKClgIGRvZXNuJ3QgZ2V0IGNhbGxlZC5cblxuICAgICAgICBpZiAocHJlZml4QmVmb3JlTmF0aW9uYWxOdW1iZXIgIT09IG5hdGlvbmFsUHJlZml4KSB7XG4gICAgICAgICAgY29tcGxleFByZWZpeEJlZm9yZU5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIgPSBwcmVmaXhCZWZvcmVOYXRpb25hbE51bWJlcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIG5hdGlvbmFsUHJlZml4OiBuYXRpb25hbFByZWZpeCxcbiAgICAgICAgY2FycmllckNvZGU6IGNhcnJpZXJDb2RlLFxuICAgICAgICBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyOiBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyLFxuICAgICAgICBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyTWF0Y2hlc0lucHV0OiBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyTWF0Y2hlc0lucHV0LFxuICAgICAgICBjb21wbGV4UHJlZml4QmVmb3JlTmF0aW9uYWxTaWduaWZpY2FudE51bWJlcjogY29tcGxleFByZWZpeEJlZm9yZU5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXJcbiAgICAgIH0pOyAvLyBgb25FeHRyYWN0ZWROYXRpb25hbE51bWJlcigpYCBpcyBvbmx5IGNhbGxlZCB3aGVuXG4gICAgICAvLyB0aGUgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIgYWN0dWFsbHkgZGlkIGNoYW5nZS5cblxuICAgICAgdGhpcy5oYXNFeHRyYWN0ZWROYXRpb25hbFNpZ25pZmljYW50TnVtYmVyID0gdHJ1ZTtcbiAgICAgIHRoaXMub25OYXRpb25hbFNpZ25pZmljYW50TnVtYmVyQ2hhbmdlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlRXh0cmFjdE5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVFeHRyYWN0TmF0aW9uYWxTaWduaWZpY2FudE51bWJlcihzdGF0ZSkge1xuICAgICAgLy8gQXR0ZW1wdCB0byBleHRyYWN0IGEgbmF0aW9uYWwgcHJlZml4LlxuICAgICAgLy9cbiAgICAgIC8vIFNvbWUgcGVvcGxlIGluY29ycmVjdGx5IGlucHV0IG5hdGlvbmFsIHByZWZpeFxuICAgICAgLy8gaW4gYW4gaW50ZXJuYXRpb25hbCBwaG9uZSBudW1iZXIuXG4gICAgICAvLyBGb3IgZXhhbXBsZSwgc29tZSBwZW9wbGUgd3JpdGUgQnJpdGlzaCBwaG9uZSBudW1iZXJzIGFzIGArNDQoMCkuLi5gLlxuICAgICAgLy9cbiAgICAgIC8vIEFsc28sIGluIHNvbWUgcmFyZSBjYXNlcywgaXQgaXMgdmFsaWQgZm9yIGEgbmF0aW9uYWwgcHJlZml4XG4gICAgICAvLyB0byBiZSBhIHBhcnQgb2YgYW4gaW50ZXJuYXRpb25hbCBwaG9uZSBudW1iZXIuXG4gICAgICAvLyBGb3IgZXhhbXBsZSwgbW9iaWxlIHBob25lIG51bWJlcnMgaW4gTWV4aWNvIGFyZSBzdXBwb3NlZCB0byBiZVxuICAgICAgLy8gZGlhbGxlZCBpbnRlcm5hdGlvbmFsbHkgdXNpbmcgYSBgMWAgbmF0aW9uYWwgcHJlZml4LFxuICAgICAgLy8gc28gdGhlIG5hdGlvbmFsIHByZWZpeCB3aWxsIGJlIHBhcnQgb2YgYW4gaW50ZXJuYXRpb25hbCBudW1iZXIuXG4gICAgICAvL1xuICAgICAgLy8gUXVvdGUgZnJvbTpcbiAgICAgIC8vIGh0dHBzOi8vd3d3Lm1leHBlcmllbmNlLmNvbS9kaWFsaW5nLWNlbGwtcGhvbmVzLWluLW1leGljby9cbiAgICAgIC8vXG4gICAgICAvLyBcIkRpYWxpbmcgYSBNZXhpY2FuIGNlbGwgcGhvbmUgZnJvbSBhYnJvYWRcbiAgICAgIC8vIFdoZW4geW91IGFyZSBjYWxsaW5nIGEgY2VsbCBwaG9uZSBudW1iZXIgaW4gTWV4aWNvIGZyb20gb3V0c2lkZSBNZXhpY28sXG4gICAgICAvLyBpdOKAmXMgbmVjZXNzYXJ5IHRvIGRpYWwgYW4gYWRkaXRpb25hbCDigJwx4oCdIGFmdGVyIE1leGljb+KAmXMgY291bnRyeSBjb2RlXG4gICAgICAvLyAod2hpY2ggaXMg4oCcNTLigJ0pIGFuZCBiZWZvcmUgdGhlIGFyZWEgY29kZS5cbiAgICAgIC8vIFlvdSBhbHNvIGlnbm9yZSB0aGUgMDQ1LCBhbmQgc2ltcGx5IGRpYWwgdGhlIGFyZWEgY29kZSBhbmQgdGhlXG4gICAgICAvLyBjZWxsIHBob25l4oCZcyBudW1iZXIuXG4gICAgICAvL1xuICAgICAgLy8gSWYgeW91IGRvbuKAmXQgYWRkIHRoZSDigJwx4oCdLCB5b3XigJlsbCByZWNlaXZlIGEgcmVjb3JkZWQgYW5ub3VuY2VtZW50XG4gICAgICAvLyBhc2tpbmcgeW91IHRvIHJlZGlhbCB1c2luZyBpdC5cbiAgICAgIC8vXG4gICAgICAvLyBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBjYWxsaW5nIGZyb20gdGhlIFVTQSB0byBhIGNlbGwgcGhvbmVcbiAgICAgIC8vIGluIE1leGljbyBDaXR5LCB5b3Ugd291bGQgZGlhbCArNTIg4oCTIDEg4oCTIDU1IOKAkyAxMjM0IDU2NzguXG4gICAgICAvLyAoTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRvIGNhbGxpbmcgYSBsYW5kIGxpbmUgaW4gTWV4aWNvIENpdHlcbiAgICAgIC8vIGZyb20gYWJyb2FkLCB3aGVyZSB0aGUgbnVtYmVyIGRpYWxlZCB3b3VsZCBiZSArNTIg4oCTIDU1IOKAkyAxMjM0IDU2NzgpXCIuXG4gICAgICAvL1xuICAgICAgLy8gR29vZ2xlJ3MgZGVtbyBvdXRwdXQ6XG4gICAgICAvLyBodHRwczovL2xpYnBob25lbnVtYmVyLmFwcHNwb3QuY29tL3Bob25lbnVtYmVycGFyc2VyP251bWJlcj0lMmI1MjE1NTEyMzQ1Njc4JmNvdW50cnk9TVhcbiAgICAgIC8vXG4gICAgICBpZiAodGhpcy5leHRyYWN0QW5vdGhlck5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIoc3RhdGUuZ2V0TmF0aW9uYWxEaWdpdHMoKSwgc3RhdGUubmF0aW9uYWxTaWduaWZpY2FudE51bWJlciwgZnVuY3Rpb24gKHN0YXRlVXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS51cGRhdGUoc3RhdGVVcGRhdGUpO1xuICAgICAgfSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIElmIG5vIGZvcm1hdCBtYXRjaGVzIHRoZSBwaG9uZSBudW1iZXIsIHRoZW4gaXQgY291bGQgYmVcbiAgICAgIC8vIFwiYSByZWFsbHkgbG9uZyBJRERcIiAocXVvdGUgZnJvbSBhIGNvbW1lbnQgaW4gR29vZ2xlJ3MgbGlicmFyeSkuXG4gICAgICAvLyBBbiBJREQgcHJlZml4IGlzIGZpcnN0IGV4dHJhY3RlZCB3aGVuIHRoZSB1c2VyIGhhcyBlbnRlcmVkIGF0IGxlYXN0IDMgZGlnaXRzLFxuICAgICAgLy8gYW5kIHRoZW4gaGVyZSDigJQgZXZlcnkgdGltZSB3aGVuIHRoZXJlJ3MgYSBuZXcgZGlnaXQgYW5kIHRoZSBudW1iZXJcbiAgICAgIC8vIGNvdWxkbid0IGJlIGZvcm1hdHRlZC5cbiAgICAgIC8vIEZvciBleGFtcGxlLCBpbiBBdXN0cmFsaWEgdGhlIGRlZmF1bHQgSUREIHByZWZpeCBpcyBgMDAxMWAsXG4gICAgICAvLyBhbmQgaXQgY291bGQgZXZlbiBiZSBhcyBsb25nIGFzIGAxNDg4MDAxMWAuXG4gICAgICAvL1xuICAgICAgLy8gQ291bGQgYWxzbyBjaGVjayBgIWhhc1JlY2VpdmVkVGhyZWVMZWFkaW5nRGlnaXRzYCBoZXJlXG4gICAgICAvLyB0byBmaWx0ZXIgb3V0IHRoZSBjYXNlIHdoZW4gdGhpcyBjaGVjayBkdXBsaWNhdGVzIHRoZSBvbmVcbiAgICAgIC8vIGFscmVhZHkgcGVyZm9ybWVkIHdoZW4gdGhlcmUncmUgMyBsZWFkaW5nIGRpZ2l0cyxcbiAgICAgIC8vIGJ1dCBpdCdzIG5vdCBhIGJpZyBkZWFsLCBhbmQgaW4gbW9zdCBjYXNlcyB0aGVyZVxuICAgICAgLy8gd2lsbCBiZSBhIHN1aXRhYmxlIGBmb3JtYXRgIHdoZW4gdGhlcmUncmUgMyBsZWFkaW5nIGRpZ2l0cy5cbiAgICAgIC8vXG5cblxuICAgICAgaWYgKHRoaXMuZXh0cmFjdElkZFByZWZpeChzdGF0ZSkpIHtcbiAgICAgICAgdGhpcy5leHRyYWN0Q2FsbGluZ0NvZGVBbmROYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIEdvb2dsZSdzIEFzWW91VHlwZSBmb3JtYXR0ZXIgc3VwcG9ydHMgc29ydCBvZiBhbiBcImF1dG9jb3JyZWN0aW9uXCIgZmVhdHVyZVxuICAgICAgLy8gd2hlbiBpdCBcImF1dG9jb3JyZWN0c1wiIG51bWJlcnMgdGhhdCBoYXZlIGJlZW4gaW5wdXQgZm9yIGEgY291bnRyeVxuICAgICAgLy8gd2l0aCB0aGF0IGNvdW50cnkncyBjYWxsaW5nIGNvZGUuXG4gICAgICAvLyBTdWNoIFwiYXV0b2NvcnJlY3Rpb25cIiBmZWF0dXJlIGxvb2tzIHdlaXJkLCBidXQgZGlmZmVyZW50IHBlb3BsZSBoYXZlIGJlZW4gcmVxdWVzdGluZyBpdDpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXRhbXBoZXRhbWluZS9saWJwaG9uZW51bWJlci1qcy9pc3N1ZXMvMzc2XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2F0YW1waGV0YW1pbmUvbGlicGhvbmVudW1iZXItanMvaXNzdWVzLzM3NVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NhdGFtcGhldGFtaW5lL2xpYnBob25lbnVtYmVyLWpzL2lzc3Vlcy8zMTZcblxuXG4gICAgICBpZiAodGhpcy5maXhNaXNzaW5nUGx1cyhzdGF0ZSkpIHtcbiAgICAgICAgdGhpcy5leHRyYWN0Q2FsbGluZ0NvZGVBbmROYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV4dHJhY3RJZGRQcmVmaXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXh0cmFjdElkZFByZWZpeChzdGF0ZSkge1xuICAgICAgLy8gQW4gSUREIHByZWZpeCBjYW4ndCBiZSBwcmVzZW50IGluIGEgbnVtYmVyIHdyaXR0ZW4gd2l0aCBhIGArYC5cbiAgICAgIC8vIEFsc28sIGRvbid0IHJlLWV4dHJhY3QgYW4gSUREIHByZWZpeCBpZiBoYXMgYWxyZWFkeSBiZWVuIGV4dHJhY3RlZC5cbiAgICAgIHZhciBpbnRlcm5hdGlvbmFsID0gc3RhdGUuaW50ZXJuYXRpb25hbCxcbiAgICAgICAgICBJRERQcmVmaXggPSBzdGF0ZS5JRERQcmVmaXgsXG4gICAgICAgICAgZGlnaXRzID0gc3RhdGUuZGlnaXRzLFxuICAgICAgICAgIG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIgPSBzdGF0ZS5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyO1xuXG4gICAgICBpZiAoaW50ZXJuYXRpb25hbCB8fCBJRERQcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBTb21lIHVzZXJzIGlucHV0IHRoZWlyIHBob25lIG51bWJlciBpbiBcIm91dC1vZi1jb3VudHJ5XCJcbiAgICAgIC8vIGRpYWxpbmcgZm9ybWF0IGluc3RlYWQgb2YgdXNpbmcgdGhlIGxlYWRpbmcgYCtgLlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NhdGFtcGhldGFtaW5lL2xpYnBob25lbnVtYmVyLWpzL2lzc3Vlcy8xODVcbiAgICAgIC8vIERldGVjdCBzdWNoIG51bWJlcnMuXG5cblxuICAgICAgdmFyIG51bWJlcldpdGhvdXRJREQgPSAoMCwgX3N0cmlwSWRkUHJlZml4W1wiZGVmYXVsdFwiXSkoZGlnaXRzLCB0aGlzLmRlZmF1bHRDb3VudHJ5LCB0aGlzLmRlZmF1bHRDYWxsaW5nQ29kZSwgdGhpcy5tZXRhZGF0YS5tZXRhZGF0YSk7XG5cbiAgICAgIGlmIChudW1iZXJXaXRob3V0SUREICE9PSB1bmRlZmluZWQgJiYgbnVtYmVyV2l0aG91dElERCAhPT0gZGlnaXRzKSB7XG4gICAgICAgIC8vIElmIGFuIElERCBwcmVmaXggd2FzIHN0cmlwcGVkIHRoZW4gY29udmVydCB0aGUgSURELXByZWZpeGVkIG51bWJlclxuICAgICAgICAvLyB0byBpbnRlcm5hdGlvbmFsIG51bWJlciBmb3Igc3Vic2VxdWVudCBwYXJzaW5nLlxuICAgICAgICBzdGF0ZS51cGRhdGUoe1xuICAgICAgICAgIElERFByZWZpeDogZGlnaXRzLnNsaWNlKDAsIGRpZ2l0cy5sZW5ndGggLSBudW1iZXJXaXRob3V0SURELmxlbmd0aClcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RhcnRJbnRlcm5hdGlvbmFsTnVtYmVyKHN0YXRlLCB7XG4gICAgICAgICAgY291bnRyeTogdW5kZWZpbmVkLFxuICAgICAgICAgIGNhbGxpbmdDb2RlOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmaXhNaXNzaW5nUGx1c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaXhNaXNzaW5nUGx1cyhzdGF0ZSkge1xuICAgICAgaWYgKCFzdGF0ZS5pbnRlcm5hdGlvbmFsKSB7XG4gICAgICAgIHZhciBfZXh0cmFjdENvdW50cnlDYWxsaW4yID0gKDAsIF9leHRyYWN0Q291bnRyeUNhbGxpbmdDb2RlRnJvbUludGVybmF0aW9uYWxOdW1iZXJXaXRob3V0UGx1c1NpZ25bXCJkZWZhdWx0XCJdKShzdGF0ZS5kaWdpdHMsIHRoaXMuZGVmYXVsdENvdW50cnksIHRoaXMuZGVmYXVsdENhbGxpbmdDb2RlLCB0aGlzLm1ldGFkYXRhLm1ldGFkYXRhKSxcbiAgICAgICAgICAgIG5ld0NhbGxpbmdDb2RlID0gX2V4dHJhY3RDb3VudHJ5Q2FsbGluMi5jb3VudHJ5Q2FsbGluZ0NvZGUsXG4gICAgICAgICAgICBudW1iZXIgPSBfZXh0cmFjdENvdW50cnlDYWxsaW4yLm51bWJlcjtcblxuICAgICAgICBpZiAobmV3Q2FsbGluZ0NvZGUpIHtcbiAgICAgICAgICBzdGF0ZS51cGRhdGUoe1xuICAgICAgICAgICAgbWlzc2luZ1BsdXM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnN0YXJ0SW50ZXJuYXRpb25hbE51bWJlcihzdGF0ZSwge1xuICAgICAgICAgICAgY291bnRyeTogc3RhdGUuY291bnRyeSxcbiAgICAgICAgICAgIGNhbGxpbmdDb2RlOiBuZXdDYWxsaW5nQ29kZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0YXJ0SW50ZXJuYXRpb25hbE51bWJlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydEludGVybmF0aW9uYWxOdW1iZXIoc3RhdGUsIF9yZWYzKSB7XG4gICAgICB2YXIgY291bnRyeSA9IF9yZWYzLmNvdW50cnksXG4gICAgICAgICAgY2FsbGluZ0NvZGUgPSBfcmVmMy5jYWxsaW5nQ29kZTtcbiAgICAgIHN0YXRlLnN0YXJ0SW50ZXJuYXRpb25hbE51bWJlcihjb3VudHJ5LCBjYWxsaW5nQ29kZSk7IC8vIElmIGEgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIgaGFzIGJlZW4gZXh0cmFjdGVkIGJlZm9yZSwgcmVzZXQgaXQuXG5cbiAgICAgIGlmIChzdGF0ZS5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKSB7XG4gICAgICAgIHN0YXRlLnJlc2V0TmF0aW9uYWxTaWduaWZpY2FudE51bWJlcigpO1xuICAgICAgICB0aGlzLm9uTmF0aW9uYWxTaWduaWZpY2FudE51bWJlckNoYW5nZSgpO1xuICAgICAgICB0aGlzLmhhc0V4dHJhY3RlZE5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV4dHJhY3RDYWxsaW5nQ29kZUFuZE5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXh0cmFjdENhbGxpbmdDb2RlQW5kTmF0aW9uYWxTaWduaWZpY2FudE51bWJlcihzdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZShzdGF0ZSkpIHtcbiAgICAgICAgLy8gYHRoaXMuZXh0cmFjdENhbGxpbmdDb2RlKClgIGlzIGN1cnJlbnRseSBjYWxsZWQgd2hlbiB0aGUgbnVtYmVyXG4gICAgICAgIC8vIGNvdWxkbid0IGJlIGZvcm1hdHRlZCBkdXJpbmcgdGhlIHN0YW5kYXJkIHByb2NlZHVyZS5cbiAgICAgICAgLy8gTm9ybWFsbHksIHRoZSBuYXRpb25hbCBwcmVmaXggd291bGQgYmUgcmUtZXh0cmFjdGVkXG4gICAgICAgIC8vIGZvciBhbiBpbnRlcm5hdGlvbmFsIG51bWJlciBpZiBzdWNoIG51bWJlciBjb3VsZG4ndCBiZSBmb3JtYXR0ZWQsXG4gICAgICAgIC8vIGJ1dCBzaW5jZSBpdCdzIGFscmVhZHkgbm90IGFibGUgdG8gYmUgZm9ybWF0dGVkLFxuICAgICAgICAvLyB0aGVyZSB3b24ndCBiZSB5ZXQgYW5vdGhlciByZXRyeSwgc28gYWxzbyBleHRyYWN0IG5hdGlvbmFsIHByZWZpeCBoZXJlLlxuICAgICAgICB0aGlzLmV4dHJhY3ROYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKHN0YXRlLmdldE5hdGlvbmFsRGlnaXRzKCksIGZ1bmN0aW9uIChzdGF0ZVVwZGF0ZSkge1xuICAgICAgICAgIHJldHVybiBzdGF0ZS51cGRhdGUoc3RhdGVVcGRhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQXNZb3VUeXBlUGFyc2VyO1xufSgpO1xuLyoqXHJcbiAqIEV4dHJhY3RzIGZvcm1hdHRlZCBwaG9uZSBudW1iZXIgZnJvbSB0ZXh0IChpZiB0aGVyZSdzIGFueSkuXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gdGV4dFxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFtmb3JtYXR0ZWRQaG9uZU51bWJlcl1cclxuICovXG5cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBBc1lvdVR5cGVQYXJzZXI7XG5cbmZ1bmN0aW9uIGV4dHJhY3RGb3JtYXR0ZWRQaG9uZU51bWJlcih0ZXh0KSB7XG4gIC8vIEF0dGVtcHQgdG8gZXh0cmFjdCBhIHBvc3NpYmxlIG51bWJlciBmcm9tIHRoZSBzdHJpbmcgcGFzc2VkIGluLlxuICB2YXIgc3RhcnRzQXQgPSB0ZXh0LnNlYXJjaChWQUxJRF9GT1JNQVRURURfUEhPTkVfTlVNQkVSX1BBUlQpO1xuXG4gIGlmIChzdGFydHNBdCA8IDApIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVHJpbSBldmVyeXRoaW5nIHRvIHRoZSBsZWZ0IG9mIHRoZSBwaG9uZSBudW1iZXIuXG5cblxuICB0ZXh0ID0gdGV4dC5zbGljZShzdGFydHNBdCk7IC8vIFRyaW0gdGhlIGArYC5cblxuICB2YXIgaGFzUGx1cztcblxuICBpZiAodGV4dFswXSA9PT0gJysnKSB7XG4gICAgaGFzUGx1cyA9IHRydWU7XG4gICAgdGV4dCA9IHRleHQuc2xpY2UoJysnLmxlbmd0aCk7XG4gIH0gLy8gVHJpbSBldmVyeXRoaW5nIHRvIHRoZSByaWdodCBvZiB0aGUgcGhvbmUgbnVtYmVyLlxuXG5cbiAgdGV4dCA9IHRleHQucmVwbGFjZShBRlRFUl9QSE9ORV9OVU1CRVJfRElHSVRTX0VORF9QQVRURVJOLCAnJyk7IC8vIFJlLWFkZCB0aGUgcHJldmlvdXNseSB0cmltbWVkIGArYC5cblxuICBpZiAoaGFzUGx1cykge1xuICAgIHRleHQgPSAnKycgKyB0ZXh0O1xuICB9XG5cbiAgcmV0dXJuIHRleHQ7XG59XG4vKipcclxuICogRXh0cmFjdHMgZm9ybWF0dGVkIHBob25lIG51bWJlciBkaWdpdHMgKGFuZCBhIGArYCkgZnJvbSB0ZXh0IChpZiB0aGVyZSdyZSBhbnkpLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHRleHRcclxuICogQHJldHVybiB7YW55W119XHJcbiAqL1xuXG5cbmZ1bmN0aW9uIF9leHRyYWN0Rm9ybWF0dGVkRGlnaXRzQW5kUGx1cyh0ZXh0KSB7XG4gIC8vIEV4dHJhY3QgYSBmb3JtYXR0ZWQgcGhvbmUgbnVtYmVyIHBhcnQgZnJvbSB0ZXh0LlxuICB2YXIgZXh0cmFjdGVkTnVtYmVyID0gZXh0cmFjdEZvcm1hdHRlZFBob25lTnVtYmVyKHRleHQpIHx8ICcnOyAvLyBUcmltIGEgYCtgLlxuXG4gIGlmIChleHRyYWN0ZWROdW1iZXJbMF0gPT09ICcrJykge1xuICAgIHJldHVybiBbZXh0cmFjdGVkTnVtYmVyLnNsaWNlKCcrJy5sZW5ndGgpLCB0cnVlXTtcbiAgfVxuXG4gIHJldHVybiBbZXh0cmFjdGVkTnVtYmVyXTtcbn1cbi8qKlxyXG4gKiBFeHRyYWN0cyBmb3JtYXR0ZWQgcGhvbmUgbnVtYmVyIGRpZ2l0cyAoYW5kIGEgYCtgKSBmcm9tIHRleHQgKGlmIHRoZXJlJ3JlIGFueSkuXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gdGV4dFxyXG4gKiBAcmV0dXJuIHthbnlbXX1cclxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEZvcm1hdHRlZERpZ2l0c0FuZFBsdXModGV4dCkge1xuICB2YXIgX2V4dHJhY3RGb3JtYXR0ZWREaWdpMyA9IF9leHRyYWN0Rm9ybWF0dGVkRGlnaXRzQW5kUGx1cyh0ZXh0KSxcbiAgICAgIF9leHRyYWN0Rm9ybWF0dGVkRGlnaTQgPSBfc2xpY2VkVG9BcnJheShfZXh0cmFjdEZvcm1hdHRlZERpZ2kzLCAyKSxcbiAgICAgIGZvcm1hdHRlZERpZ2l0cyA9IF9leHRyYWN0Rm9ybWF0dGVkRGlnaTRbMF0sXG4gICAgICBoYXNQbHVzID0gX2V4dHJhY3RGb3JtYXR0ZWREaWdpNFsxXTsgLy8gSWYgdGhlIGV4dHJhY3RlZCBwaG9uZSBudW1iZXIgcGFydFxuICAvLyBjYW4gcG9zc2libHkgYmUgYSBwYXJ0IG9mIHNvbWUgdmFsaWQgcGhvbmUgbnVtYmVyXG4gIC8vIHRoZW4gcGFyc2UgcGhvbmUgbnVtYmVyIGNoYXJhY3RlcnMgZnJvbSBhIGZvcm1hdHRlZCBwaG9uZSBudW1iZXIuXG5cblxuICBpZiAoIVZBTElEX0ZPUk1BVFRFRF9QSE9ORV9OVU1CRVJfRElHSVRTX1BBUlRfUEFUVEVSTi50ZXN0KGZvcm1hdHRlZERpZ2l0cykpIHtcbiAgICBmb3JtYXR0ZWREaWdpdHMgPSAnJztcbiAgfVxuXG4gIHJldHVybiBbZm9ybWF0dGVkRGlnaXRzLCBoYXNQbHVzXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzWW91VHlwZVBhcnNlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciBBc1lvdVR5cGVTdGF0ZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFzWW91VHlwZVN0YXRlKF9yZWYpIHtcbiAgICB2YXIgb25Db3VudHJ5Q2hhbmdlID0gX3JlZi5vbkNvdW50cnlDaGFuZ2UsXG4gICAgICAgIG9uQ2FsbGluZ0NvZGVDaGFuZ2UgPSBfcmVmLm9uQ2FsbGluZ0NvZGVDaGFuZ2U7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXNZb3VUeXBlU3RhdGUpO1xuXG4gICAgdGhpcy5vbkNvdW50cnlDaGFuZ2UgPSBvbkNvdW50cnlDaGFuZ2U7XG4gICAgdGhpcy5vbkNhbGxpbmdDb2RlQ2hhbmdlID0gb25DYWxsaW5nQ29kZUNoYW5nZTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBc1lvdVR5cGVTdGF0ZSwgW3tcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoX3JlZjIpIHtcbiAgICAgIHZhciBjb3VudHJ5ID0gX3JlZjIuY291bnRyeSxcbiAgICAgICAgICBjYWxsaW5nQ29kZSA9IF9yZWYyLmNhbGxpbmdDb2RlO1xuICAgICAgdGhpcy5pbnRlcm5hdGlvbmFsID0gZmFsc2U7XG4gICAgICB0aGlzLklERFByZWZpeCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMubWlzc2luZ1BsdXMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmNhbGxpbmdDb2RlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kaWdpdHMgPSAnJztcbiAgICAgIHRoaXMucmVzZXROYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKCk7XG4gICAgICB0aGlzLmluaXRDb3VudHJ5QW5kQ2FsbGluZ0NvZGUoY291bnRyeSwgY2FsbGluZ0NvZGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldE5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXROYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKCkge1xuICAgICAgdGhpcy5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyID0gdGhpcy5nZXROYXRpb25hbERpZ2l0cygpO1xuICAgICAgdGhpcy5uYXRpb25hbFNpZ25pZmljYW50TnVtYmVyTWF0Y2hlc0lucHV0ID0gdHJ1ZTtcbiAgICAgIHRoaXMubmF0aW9uYWxQcmVmaXggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmNhcnJpZXJDb2RlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jb21wbGV4UHJlZml4QmVmb3JlTmF0aW9uYWxTaWduaWZpY2FudE51bWJlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZShwcm9wZXJ0aWVzKSB7XG4gICAgICBmb3IgKHZhciBfaSA9IDAsIF9PYmplY3Qka2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpOyBfaSA8IF9PYmplY3Qka2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGtleSA9IF9PYmplY3Qka2V5c1tfaV07XG4gICAgICAgIHRoaXNba2V5XSA9IHByb3BlcnRpZXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdENvdW50cnlBbmRDYWxsaW5nQ29kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0Q291bnRyeUFuZENhbGxpbmdDb2RlKGNvdW50cnksIGNhbGxpbmdDb2RlKSB7XG4gICAgICB0aGlzLnNldENvdW50cnkoY291bnRyeSk7XG4gICAgICB0aGlzLnNldENhbGxpbmdDb2RlKGNhbGxpbmdDb2RlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Q291bnRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDb3VudHJ5KGNvdW50cnkpIHtcbiAgICAgIHRoaXMuY291bnRyeSA9IGNvdW50cnk7XG4gICAgICB0aGlzLm9uQ291bnRyeUNoYW5nZShjb3VudHJ5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Q2FsbGluZ0NvZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q2FsbGluZ0NvZGUoY2FsbGluZ0NvZGUpIHtcbiAgICAgIHRoaXMuY2FsbGluZ0NvZGUgPSBjYWxsaW5nQ29kZTtcbiAgICAgIHRoaXMub25DYWxsaW5nQ29kZUNoYW5nZShjYWxsaW5nQ29kZSwgdGhpcy5jb3VudHJ5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRJbnRlcm5hdGlvbmFsTnVtYmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0SW50ZXJuYXRpb25hbE51bWJlcihjb3VudHJ5LCBjYWxsaW5nQ29kZSkge1xuICAgICAgLy8gUHJlcGVuZCB0aGUgYCtgIHRvIHBhcnNlZCBpbnB1dC5cbiAgICAgIHRoaXMuaW50ZXJuYXRpb25hbCA9IHRydWU7IC8vIElmIGEgZGVmYXVsdCBjb3VudHJ5IHdhcyBzZXQgdGhlbiByZXNldCBpdFxuICAgICAgLy8gYmVjYXVzZSBhbiBleHBsaWNpdGx5IGludGVybmF0aW9uYWwgcGhvbmVcbiAgICAgIC8vIG51bWJlciBpcyBiZWluZyBlbnRlcmVkLlxuXG4gICAgICB0aGlzLmluaXRDb3VudHJ5QW5kQ2FsbGluZ0NvZGUoY291bnRyeSwgY2FsbGluZ0NvZGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhcHBlbmREaWdpdHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwZW5kRGlnaXRzKG5leHREaWdpdHMpIHtcbiAgICAgIHRoaXMuZGlnaXRzICs9IG5leHREaWdpdHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFwcGVuZE5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXJEaWdpdHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwZW5kTmF0aW9uYWxTaWduaWZpY2FudE51bWJlckRpZ2l0cyhuZXh0RGlnaXRzKSB7XG4gICAgICB0aGlzLm5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIgKz0gbmV4dERpZ2l0cztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwYXJ0IG9mIGB0aGlzLmRpZ2l0c2AgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbmF0aW9uYWwgbnVtYmVyLlxyXG4gICAgICogQmFzaWNhbGx5LCBhbGwgZGlnaXRzIHRoYXQgaGF2ZSBiZWVuIGlucHV0IGJ5IHRoZSB1c2VyLCBleGNlcHQgZm9yIHRoZVxyXG4gICAgICogaW50ZXJuYXRpb25hbCBwcmVmaXggYW5kIHRoZSBjb3VudHJ5IGNhbGxpbmcgY29kZSBwYXJ0XHJcbiAgICAgKiAoaWYgdGhlIG51bWJlciBpcyBhbiBpbnRlcm5hdGlvbmFsIG9uZSkuXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldE5hdGlvbmFsRGlnaXRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hdGlvbmFsRGlnaXRzKCkge1xuICAgICAgaWYgKHRoaXMuaW50ZXJuYXRpb25hbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWdpdHMuc2xpY2UoKHRoaXMuSUREUHJlZml4ID8gdGhpcy5JRERQcmVmaXgubGVuZ3RoIDogMCkgKyAodGhpcy5jYWxsaW5nQ29kZSA/IHRoaXMuY2FsbGluZ0NvZGUubGVuZ3RoIDogMCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5kaWdpdHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldERpZ2l0c1dpdGhvdXRJbnRlcm5hdGlvbmFsUHJlZml4XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERpZ2l0c1dpdGhvdXRJbnRlcm5hdGlvbmFsUHJlZml4KCkge1xuICAgICAgaWYgKHRoaXMuaW50ZXJuYXRpb25hbCkge1xuICAgICAgICBpZiAodGhpcy5JRERQcmVmaXgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kaWdpdHMuc2xpY2UodGhpcy5JRERQcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5kaWdpdHM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFzWW91VHlwZVN0YXRlO1xufSgpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEFzWW91VHlwZVN0YXRlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNZb3VUeXBlU3RhdGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9LCBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykgeyB2YXIgX2NhY2hlID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiID8gbmV3IE1hcCgpIDogdW5kZWZpbmVkOyBfd3JhcE5hdGl2ZVN1cGVyID0gZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykgeyBpZiAoQ2xhc3MgPT09IG51bGwgfHwgIV9pc05hdGl2ZUZ1bmN0aW9uKENsYXNzKSkgcmV0dXJuIENsYXNzOyBpZiAodHlwZW9mIENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7IGlmIChfY2FjaGUuaGFzKENsYXNzKSkgcmV0dXJuIF9jYWNoZS5nZXQoQ2xhc3MpOyBfY2FjaGUuc2V0KENsYXNzLCBXcmFwcGVyKTsgfSBmdW5jdGlvbiBXcmFwcGVyKCkgeyByZXR1cm4gX2NvbnN0cnVjdChDbGFzcywgYXJndW1lbnRzLCBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3IpOyB9IFdyYXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IFdyYXBwZXIsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IHJldHVybiBfc2V0UHJvdG90eXBlT2YoV3JhcHBlciwgQ2xhc3MpOyB9OyByZXR1cm4gX3dyYXBOYXRpdmVTdXBlcihDbGFzcyk7IH1cblxuZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHsgX2NvbnN0cnVjdCA9IFJlZmxlY3QuY29uc3RydWN0OyB9IGVsc2UgeyBfY29uc3RydWN0ID0gZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7IHZhciBhID0gW251bGxdOyBhLnB1c2guYXBwbHkoYSwgYXJncyk7IHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTsgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7IGlmIChDbGFzcykgX3NldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpOyByZXR1cm4gaW5zdGFuY2U7IH07IH0gcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlRnVuY3Rpb24oZm4pIHsgcmV0dXJuIEZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoZm4pLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpICE9PSAtMTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80Njk3MTA0NC85NzA3Njlcbi8vIFwiQnJlYWtpbmcgY2hhbmdlcyBpbiBUeXBlc2NyaXB0IDIuMVwiXG4vLyBcIkV4dGVuZGluZyBidWlsdC1pbnMgbGlrZSBFcnJvciwgQXJyYXksIGFuZCBNYXAgbWF5IG5vIGxvbmdlciB3b3JrLlwiXG4vLyBcIkFzIGEgcmVjb21tZW5kYXRpb24sIHlvdSBjYW4gbWFudWFsbHkgYWRqdXN0IHRoZSBwcm90b3R5cGUgaW1tZWRpYXRlbHkgYWZ0ZXIgYW55IHN1cGVyKC4uLikgY2FsbHMuXCJcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFpbi9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xudmFyIFBhcnNlRXJyb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FcnJvcikge1xuICBfaW5oZXJpdHMoUGFyc2VFcnJvciwgX0Vycm9yKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFBhcnNlRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIFBhcnNlRXJyb3IoY29kZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYXJzZUVycm9yKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29kZSk7IC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXG4gICAgLy8gQW55IHN1YmNsYXNzIG9mIEZvb0Vycm9yIHdpbGwgaGF2ZSB0byBtYW51YWxseSBzZXQgdGhlIHByb3RvdHlwZSBhcyB3ZWxsLlxuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBQYXJzZUVycm9yLnByb3RvdHlwZSk7XG4gICAgX3RoaXMubmFtZSA9IF90aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhQYXJzZUVycm9yKTtcbn0oIC8qI19fUFVSRV9fKi9fd3JhcE5hdGl2ZVN1cGVyKEVycm9yKSk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gUGFyc2VFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhcnNlRXJyb3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9tZXRhZGF0YSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbWV0YWRhdGEuanNcIikpO1xuXG52YXIgX2lzUG9zc2libGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2lzUG9zc2libGUuanNcIikpO1xuXG52YXIgX2lzVmFsaWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2lzVmFsaWQuanNcIikpO1xuXG52YXIgX2dldE51bWJlclR5cGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvZ2V0TnVtYmVyVHlwZS5qc1wiKSk7XG5cbnZhciBfZ2V0UG9zc2libGVDb3VudHJpZXNGb3JOdW1iZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvZ2V0UG9zc2libGVDb3VudHJpZXNGb3JOdW1iZXIuanNcIikpO1xuXG52YXIgX2Zvcm1hdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2Zvcm1hdC5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciBVU0VfTk9OX0dFT0dSQVBISUNfQ09VTlRSWV9DT0RFID0gZmFsc2U7XG5cbnZhciBQaG9uZU51bWJlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIEBwYXJhbSAge3N0cmluZ30gY291bnRyeU9yQ291bnRyeUNhbGxpbmdDb2RlXHJcbiAgICogQHBhcmFtICB7c3RyaW5nfSBuYXRpb25hbE51bWJlclxyXG4gICAqIEBwYXJhbSAge29iamVjdH0gbWV0YWRhdGEg4oCUIE1ldGFkYXRhIEpTT05cclxuICAgKiBAcmV0dXJuIHtQaG9uZU51bWJlcn1cclxuICAgKi9cbiAgZnVuY3Rpb24gUGhvbmVOdW1iZXIoY291bnRyeU9yQ291bnRyeUNhbGxpbmdDb2RlLCBuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGhvbmVOdW1iZXIpO1xuXG4gICAgaWYgKCFjb3VudHJ5T3JDb3VudHJ5Q2FsbGluZ0NvZGUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Bjb3VudHJ5YCBvciBgY291bnRyeUNhbGxpbmdDb2RlYCBub3QgcGFzc2VkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFuYXRpb25hbE51bWJlcikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYG5hdGlvbmFsTnVtYmVyYCBub3QgcGFzc2VkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFtZXRhZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYG1ldGFkYXRhYCBub3QgcGFzc2VkJyk7XG4gICAgfVxuXG4gICAgdmFyIF9nZXRDb3VudHJ5QW5kQ291bnRyeSA9IGdldENvdW50cnlBbmRDb3VudHJ5Q2FsbGluZ0NvZGUoY291bnRyeU9yQ291bnRyeUNhbGxpbmdDb2RlLCBtZXRhZGF0YSksXG4gICAgICAgIGNvdW50cnkgPSBfZ2V0Q291bnRyeUFuZENvdW50cnkuY291bnRyeSxcbiAgICAgICAgY291bnRyeUNhbGxpbmdDb2RlID0gX2dldENvdW50cnlBbmRDb3VudHJ5LmNvdW50cnlDYWxsaW5nQ29kZTtcblxuICAgIHRoaXMuY291bnRyeSA9IGNvdW50cnk7XG4gICAgdGhpcy5jb3VudHJ5Q2FsbGluZ0NvZGUgPSBjb3VudHJ5Q2FsbGluZ0NvZGU7XG4gICAgdGhpcy5uYXRpb25hbE51bWJlciA9IG5hdGlvbmFsTnVtYmVyO1xuICAgIHRoaXMubnVtYmVyID0gJysnICsgdGhpcy5jb3VudHJ5Q2FsbGluZ0NvZGUgKyB0aGlzLm5hdGlvbmFsTnVtYmVyO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQaG9uZU51bWJlciwgW3tcbiAgICBrZXk6IFwic2V0RXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEV4dChleHQpIHtcbiAgICAgIHRoaXMuZXh0ID0gZXh0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRQb3NzaWJsZUNvdW50cmllc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQb3NzaWJsZUNvdW50cmllcygpIHtcbiAgICAgIGlmICh0aGlzLmNvdW50cnkpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLmNvdW50cnldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKDAsIF9nZXRQb3NzaWJsZUNvdW50cmllc0Zvck51bWJlcltcImRlZmF1bHRcIl0pKHRoaXMuY291bnRyeUNhbGxpbmdDb2RlLCB0aGlzLm5hdGlvbmFsTnVtYmVyLCB0aGlzLm1ldGFkYXRhKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNQb3NzaWJsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1Bvc3NpYmxlKCkge1xuICAgICAgcmV0dXJuICgwLCBfaXNQb3NzaWJsZVtcImRlZmF1bHRcIl0pKHRoaXMsIHtcbiAgICAgICAgdjI6IHRydWVcbiAgICAgIH0sIHRoaXMubWV0YWRhdGEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1ZhbGlkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzVmFsaWQoKSB7XG4gICAgICByZXR1cm4gKDAsIF9pc1ZhbGlkW1wiZGVmYXVsdFwiXSkodGhpcywge1xuICAgICAgICB2MjogdHJ1ZVxuICAgICAgfSwgdGhpcy5tZXRhZGF0YSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzTm9uR2VvZ3JhcGhpY1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc05vbkdlb2dyYXBoaWMoKSB7XG4gICAgICB2YXIgbWV0YWRhdGEgPSBuZXcgX21ldGFkYXRhW1wiZGVmYXVsdFwiXSh0aGlzLm1ldGFkYXRhKTtcbiAgICAgIHJldHVybiBtZXRhZGF0YS5pc05vbkdlb2dyYXBoaWNDYWxsaW5nQ29kZSh0aGlzLmNvdW50cnlDYWxsaW5nQ29kZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzRXF1YWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNFcXVhbChwaG9uZU51bWJlcikge1xuICAgICAgcmV0dXJuIHRoaXMubnVtYmVyID09PSBwaG9uZU51bWJlci5udW1iZXIgJiYgdGhpcy5leHQgPT09IHBob25lTnVtYmVyLmV4dDtcbiAgICB9IC8vIFRoaXMgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgbWVhbnQgdG8gYmUgYW4gZXF1aXZhbGVudCBmb3IgYHZhbGlkYXRlUGhvbmVOdW1iZXJMZW5ndGgoKWAsXG4gICAgLy8gYnV0IGxhdGVyIGl0IHdhcyBmb3VuZCBvdXQgdGhhdCBpdCBkb2Vzbid0IGluY2x1ZGUgdGhlIHBvc3NpYmxlIGBUT09fU0hPUlRgIHJlc3VsdFxuICAgIC8vIHJldHVybmVkIGZyb20gYHBhcnNlUGhvbmVOdW1iZXJXaXRoRXJyb3IoKWAgaW4gdGhlIG9yaWdpbmFsIGB2YWxpZGF0ZVBob25lTnVtYmVyTGVuZ3RoKClgLFxuICAgIC8vIHNvIGV2ZW50dWFsbHkgSSBzaW1wbHkgY29tbWVudGVkIG91dCB0aGlzIG1ldGhvZCBmcm9tIHRoZSBgUGhvbmVOdW1iZXJgIGNsYXNzXG4gICAgLy8gYW5kIGp1c3QgbGVmdCB0aGUgYHZhbGlkYXRlUGhvbmVOdW1iZXJMZW5ndGgoKWAgZnVuY3Rpb24sIGV2ZW4gdGhvdWdoIHRoYXQgb25lIHdvdWxkIHJlcXVpcmVcbiAgICAvLyBhbmQgYWRkaXRpb25hbCBzdGVwIHRvIGFsc28gdmFsaWRhdGUgdGhlIGFjdHVhbCBjb3VudHJ5IC8gY2FsbGluZyBjb2RlIG9mIHRoZSBwaG9uZSBudW1iZXIuXG4gICAgLy8gdmFsaWRhdGVMZW5ndGgoKSB7XG4gICAgLy8gXHRjb25zdCBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSh0aGlzLm1ldGFkYXRhKVxuICAgIC8vIFx0bWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbih0aGlzLmNvdW50cnlDYWxsaW5nQ29kZSlcbiAgICAvLyBcdGNvbnN0IHJlc3VsdCA9IGNoZWNrTnVtYmVyTGVuZ3RoKHRoaXMubmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhKVxuICAgIC8vIFx0aWYgKHJlc3VsdCAhPT0gJ0lTX1BPU1NJQkxFJykge1xuICAgIC8vIFx0XHRyZXR1cm4gcmVzdWx0XG4gICAgLy8gXHR9XG4gICAgLy8gfVxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUeXBlKCkge1xuICAgICAgcmV0dXJuICgwLCBfZ2V0TnVtYmVyVHlwZVtcImRlZmF1bHRcIl0pKHRoaXMsIHtcbiAgICAgICAgdjI6IHRydWVcbiAgICAgIH0sIHRoaXMubWV0YWRhdGEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JtYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0KF9mb3JtYXQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiAoMCwgX2Zvcm1hdDJbXCJkZWZhdWx0XCJdKSh0aGlzLCBfZm9ybWF0LCBvcHRpb25zID8gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb25zKSwge30sIHtcbiAgICAgICAgdjI6IHRydWVcbiAgICAgIH0pIDoge1xuICAgICAgICB2MjogdHJ1ZVxuICAgICAgfSwgdGhpcy5tZXRhZGF0YSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvcm1hdE5hdGlvbmFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdE5hdGlvbmFsKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdCgnTkFUSU9OQUwnLCBvcHRpb25zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9ybWF0SW50ZXJuYXRpb25hbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JtYXRJbnRlcm5hdGlvbmFsKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdCgnSU5URVJOQVRJT05BTCcsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRVUklcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VVJJKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdCgnUkZDMzk2NicsIG9wdGlvbnMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQaG9uZU51bWJlcjtcbn0oKTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBQaG9uZU51bWJlcjtcblxudmFyIGlzQ291bnRyeUNvZGUgPSBmdW5jdGlvbiBpc0NvdW50cnlDb2RlKHZhbHVlKSB7XG4gIHJldHVybiAvXltBLVpdezJ9JC8udGVzdCh2YWx1ZSk7XG59O1xuXG5mdW5jdGlvbiBnZXRDb3VudHJ5QW5kQ291bnRyeUNhbGxpbmdDb2RlKGNvdW50cnlPckNvdW50cnlDYWxsaW5nQ29kZSwgbWV0YWRhdGFKc29uKSB7XG4gIHZhciBjb3VudHJ5O1xuICB2YXIgY291bnRyeUNhbGxpbmdDb2RlO1xuICB2YXIgbWV0YWRhdGEgPSBuZXcgX21ldGFkYXRhW1wiZGVmYXVsdFwiXShtZXRhZGF0YUpzb24pOyAvLyBJZiBjb3VudHJ5IGNvZGUgaXMgcGFzc2VkIHRoZW4gZGVyaXZlIGBjb3VudHJ5Q2FsbGluZ0NvZGVgIGZyb20gaXQuXG4gIC8vIEFsc28gc3RvcmUgdGhlIGNvdW50cnkgY29kZSBhcyBgLmNvdW50cnlgLlxuXG4gIGlmIChpc0NvdW50cnlDb2RlKGNvdW50cnlPckNvdW50cnlDYWxsaW5nQ29kZSkpIHtcbiAgICBjb3VudHJ5ID0gY291bnRyeU9yQ291bnRyeUNhbGxpbmdDb2RlO1xuICAgIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oY291bnRyeSk7XG4gICAgY291bnRyeUNhbGxpbmdDb2RlID0gbWV0YWRhdGEuY291bnRyeUNhbGxpbmdDb2RlKCk7XG4gIH0gZWxzZSB7XG4gICAgY291bnRyeUNhbGxpbmdDb2RlID0gY291bnRyeU9yQ291bnRyeUNhbGxpbmdDb2RlO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuXG4gICAgaWYgKFVTRV9OT05fR0VPR1JBUEhJQ19DT1VOVFJZX0NPREUpIHtcbiAgICAgIGlmIChtZXRhZGF0YS5pc05vbkdlb2dyYXBoaWNDYWxsaW5nQ29kZShjb3VudHJ5Q2FsbGluZ0NvZGUpKSB7XG4gICAgICAgIGNvdW50cnkgPSAnMDAxJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvdW50cnk6IGNvdW50cnksXG4gICAgY291bnRyeUNhbGxpbmdDb2RlOiBjb3VudHJ5Q2FsbGluZ0NvZGVcbiAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBob25lTnVtYmVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9QaG9uZU51bWJlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGhvbmVOdW1iZXIuanNcIikpO1xuXG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcblxudmFyIF9jcmVhdGVFeHRlbnNpb25QYXR0ZXJuID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9oZWxwZXJzL2V4dGVuc2lvbi9jcmVhdGVFeHRlbnNpb25QYXR0ZXJuLmpzXCIpKTtcblxudmFyIF9SZWdFeHBDYWNoZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZmluZE51bWJlcnMvUmVnRXhwQ2FjaGUuanNcIikpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi9maW5kTnVtYmVycy91dGlsLmpzXCIpO1xuXG52YXIgX3V0ZiA9IHJlcXVpcmUoXCIuL2ZpbmROdW1iZXJzL3V0Zi04LmpzXCIpO1xuXG52YXIgX0xlbmllbmN5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9maW5kTnVtYmVycy9MZW5pZW5jeS5qc1wiKSk7XG5cbnZhciBfcGFyc2VQcmVDYW5kaWRhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2ZpbmROdW1iZXJzL3BhcnNlUHJlQ2FuZGlkYXRlLmpzXCIpKTtcblxudmFyIF9pc1ZhbGlkUHJlQ2FuZGlkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9maW5kTnVtYmVycy9pc1ZhbGlkUHJlQ2FuZGlkYXRlLmpzXCIpKTtcblxudmFyIF9pc1ZhbGlkQ2FuZGlkYXRlID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vZmluZE51bWJlcnMvaXNWYWxpZENhbmRpZGF0ZS5qc1wiKSk7XG5cbnZhciBfbWV0YWRhdGEgPSByZXF1aXJlKFwiLi9tZXRhZGF0YS5qc1wiKTtcblxudmFyIF9wYXJzZVBob25lTnVtYmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZVBob25lTnVtYmVyLmpzXCIpKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgdmFyIGNhY2hlTm9kZUludGVyb3AgPSBuZXcgV2Vha01hcCgpOyByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7IH0pKG5vZGVJbnRlcm9wKTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChrZXkgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqW1wiZGVmYXVsdFwiXSA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKGl0KSByZXR1cm4gKGl0ID0gaXQuY2FsbChvKSkubmV4dC5iaW5kKGl0KTsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxudmFyIFVTRV9OT05fR0VPR1JBUEhJQ19DT1VOVFJZX0NPREUgPSBmYWxzZTtcbnZhciBFWFROX1BBVFRFUk5TX0ZPUl9NQVRDSElORyA9ICgwLCBfY3JlYXRlRXh0ZW5zaW9uUGF0dGVybltcImRlZmF1bHRcIl0pKCdtYXRjaGluZycpO1xuLyoqXHJcbiAqIFBhdHRlcm5zIHVzZWQgdG8gZXh0cmFjdCBwaG9uZSBudW1iZXJzIGZyb20gYSBsYXJnZXIgcGhvbmUtbnVtYmVyLWxpa2UgcGF0dGVybi4gVGhlc2UgYXJlXHJcbiAqIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHNwZWNpZmljaXR5LiBGb3IgZXhhbXBsZSwgd2hpdGUtc3BhY2UgaXMgbGFzdCBzaW5jZSB0aGF0IGlzIGZyZXF1ZW50bHlcclxuICogdXNlZCBpbiBudW1iZXJzLCBub3QganVzdCB0byBzZXBhcmF0ZSB0d28gbnVtYmVycy4gV2UgaGF2ZSBzZXBhcmF0ZSBwYXR0ZXJucyBzaW5jZSB3ZSBkb24ndFxyXG4gKiB3YW50IHRvIGJyZWFrIHVwIHRoZSBwaG9uZS1udW1iZXItbGlrZSB0ZXh0IG9uIG1vcmUgdGhhbiBvbmUgZGlmZmVyZW50IGtpbmQgb2Ygc3ltYm9sIGF0IG9uZVxyXG4gKiB0aW1lLCBhbHRob3VnaCBzeW1ib2xzIG9mIHRoZSBzYW1lIHR5cGUgKGUuZy4gc3BhY2UpIGNhbiBiZSBzYWZlbHkgZ3JvdXBlZCB0b2dldGhlci5cclxuICpcclxuICogTm90ZSB0aGF0IGlmIHRoZXJlIGlzIGEgbWF0Y2gsIHdlIHdpbGwgYWx3YXlzIGNoZWNrIGFueSB0ZXh0IGZvdW5kIHVwIHRvIHRoZSBmaXJzdCBtYXRjaCBhc1xyXG4gKiB3ZWxsLlxyXG4gKi9cblxudmFyIElOTkVSX01BVENIRVMgPSBbLy8gQnJlYWtzIG9uIHRoZSBzbGFzaCAtIGUuZy4gXCI2NTEtMjM0LTIzNDUvMzMyLTQ0NS0xMjM0XCJcbidcXFxcLysoLiopLycsIC8vIE5vdGUgdGhhdCB0aGUgYnJhY2tldCBoZXJlIGlzIGluc2lkZSB0aGUgY2FwdHVyaW5nIGdyb3VwLCBzaW5jZSB3ZSBjb25zaWRlciBpdCBwYXJ0IG9mIHRoZVxuLy8gcGhvbmUgbnVtYmVyLiBXaWxsIG1hdGNoIGEgcGF0dGVybiBsaWtlIFwiKDY1MCkgMjIzIDMzNDUgKDc1NCkgMjIzIDMzMjFcIi5cbicoXFxcXChbXihdKiknLCAvLyBCcmVha3Mgb24gYSBoeXBoZW4gLSBlLmcuIFwiMTIzNDUgLSAzMzItNDQ1LTEyMzQgaXMgbXkgbnVtYmVyLlwiXG4vLyBXZSByZXF1aXJlIGEgc3BhY2Ugb24gZWl0aGVyIHNpZGUgb2YgdGhlIGh5cGhlbiBmb3IgaXQgdG8gYmUgY29uc2lkZXJlZCBhIHNlcGFyYXRvci5cblwiKD86XCIuY29uY2F0KF91dGYucFosIFwiLXwtXCIpLmNvbmNhdChfdXRmLnBaLCBcIilcIikuY29uY2F0KF91dGYucFosIFwiKiguKylcIiksIC8vIFZhcmlvdXMgdHlwZXMgb2Ygd2lkZSBoeXBoZW5zLiBOb3RlIHdlIGhhdmUgZGVjaWRlZCBub3QgdG8gZW5mb3JjZSBhIHNwYWNlIGhlcmUsIHNpbmNlIGl0J3Ncbi8vIHBvc3NpYmxlIHRoYXQgaXQncyBzdXBwb3NlZCB0byBiZSB1c2VkIHRvIGJyZWFrIHR3byBudW1iZXJzIHdpdGhvdXQgc3BhY2VzLCBhbmQgd2UgaGF2ZW4ndFxuLy8gc2VlbiBtYW55IGluc3RhbmNlcyBvZiBpdCB1c2VkIHdpdGhpbiBhIG51bWJlci5cblwiW1xcdTIwMTItXFx1MjAxNVxcdUZGMERdXCIuY29uY2F0KF91dGYucFosIFwiKiguKylcIiksIC8vIEJyZWFrcyBvbiBhIGZ1bGwgc3RvcCAtIGUuZy4gXCIxMjM0NS4gMzMyLTQ0NS0xMjM0IGlzIG15IG51bWJlci5cIlxuXCJcXFxcLitcIi5jb25jYXQoX3V0Zi5wWiwgXCIqKFteLl0rKVwiKSwgLy8gQnJlYWtzIG9uIHNwYWNlIC0gZS5nLiBcIjMzMjQ0NTEyMzQgODAwMjM0MTIzNFwiXG5cIlwiLmNvbmNhdChfdXRmLnBaLCBcIisoXCIpLmNvbmNhdChfdXRmLlBaLCBcIispXCIpXTsgLy8gTGltaXQgb24gdGhlIG51bWJlciBvZiBsZWFkaW5nIChwbHVzKSBjaGFyYWN0ZXJzLlxuXG52YXIgbGVhZExpbWl0ID0gKDAsIF91dGlsLmxpbWl0KSgwLCAyKTsgLy8gTGltaXQgb24gdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzLlxuXG52YXIgcHVuY3R1YXRpb25MaW1pdCA9ICgwLCBfdXRpbC5saW1pdCkoMCwgNCk7XG4vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzIGFsbG93ZWQgaW4gYSBkaWdpdC1zZXBhcmF0ZWQgYmxvY2suIEFzIHdlIGFsbG93IGFsbCBkaWdpdHMgaW4gYVxyXG4gKiBzaW5nbGUgYmxvY2ssIHNldCBoaWdoIGVub3VnaCB0byBhY2NvbW1vZGF0ZSB0aGUgZW50aXJlIG5hdGlvbmFsIG51bWJlciBhbmQgdGhlIGludGVybmF0aW9uYWxcclxuICogY291bnRyeSBjb2RlLiAqL1xuXG52YXIgZGlnaXRCbG9ja0xpbWl0ID0gX2NvbnN0YW50cy5NQVhfTEVOR1RIX0ZPUl9OU04gKyBfY29uc3RhbnRzLk1BWF9MRU5HVEhfQ09VTlRSWV9DT0RFOyAvLyBMaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBzZXBhcmF0ZWQgYnkgcHVuY3R1YXRpb24uXG4vLyBVc2VzIGRpZ2l0QmxvY2tMaW1pdCBzaW5jZSBzb21lIGZvcm1hdHMgdXNlIHNwYWNlcyB0byBzZXBhcmF0ZSBlYWNoIGRpZ2l0LlxuXG52YXIgYmxvY2tMaW1pdCA9ICgwLCBfdXRpbC5saW1pdCkoMCwgZGlnaXRCbG9ja0xpbWl0KTtcbi8qIEEgcHVuY3R1YXRpb24gc2VxdWVuY2UgYWxsb3dpbmcgd2hpdGUgc3BhY2UuICovXG5cbnZhciBwdW5jdHVhdGlvbiA9IFwiW1wiLmNvbmNhdChfY29uc3RhbnRzLlZBTElEX1BVTkNUVUFUSU9OLCBcIl1cIikgKyBwdW5jdHVhdGlvbkxpbWl0OyAvLyBBIGRpZ2l0cyBibG9jayB3aXRob3V0IHB1bmN0dWF0aW9uLlxuXG52YXIgZGlnaXRTZXF1ZW5jZSA9IF91dGYucE5kICsgKDAsIF91dGlsLmxpbWl0KSgxLCBkaWdpdEJsb2NrTGltaXQpO1xuLyoqXHJcbiAqIFBob25lIG51bWJlciBwYXR0ZXJuIGFsbG93aW5nIG9wdGlvbmFsIHB1bmN0dWF0aW9uLlxyXG4gKiBUaGUgcGhvbmUgbnVtYmVyIHBhdHRlcm4gdXNlZCBieSBgZmluZCgpYCwgc2ltaWxhciB0b1xyXG4gKiBWQUxJRF9QSE9ORV9OVU1CRVIsIGJ1dCB3aXRoIHRoZSBmb2xsb3dpbmcgZGlmZmVyZW5jZXM6XHJcbiAqIDx1bD5cclxuICogICA8bGk+QWxsIGNhcHR1cmVzIGFyZSBsaW1pdGVkIGluIG9yZGVyIHRvIHBsYWNlIGFuIHVwcGVyIGJvdW5kIHRvIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlXHJcbiAqICAgICAgIHBhdHRlcm4uXHJcbiAqIDx1bD5cclxuICogICA8bGk+TGVhZGluZyBwdW5jdHVhdGlvbiAvIHBsdXMgc2lnbnMgYXJlIGxpbWl0ZWQuXHJcbiAqICAgPGxpPkNvbnNlY3V0aXZlIG9jY3VycmVuY2VzIG9mIHB1bmN0dWF0aW9uIGFyZSBsaW1pdGVkLlxyXG4gKiAgIDxsaT5OdW1iZXIgb2YgZGlnaXRzIGlzIGxpbWl0ZWQuXHJcbiAqIDwvdWw+XHJcbiAqICAgPGxpPk5vIHdoaXRlc3BhY2UgaXMgYWxsb3dlZCBhdCB0aGUgc3RhcnQgb3IgZW5kLlxyXG4gKiAgIDxsaT5ObyBhbHBoYSBkaWdpdHMgKHZhbml0eSBudW1iZXJzIHN1Y2ggYXMgMS04MDAtU0lYLUZMQUdTKSBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC5cclxuICogPC91bD5cclxuICovXG5cbnZhciBQQVRURVJOID0gJyg/OicgKyBfaXNWYWxpZENhbmRpZGF0ZS5MRUFEX0NMQVNTICsgcHVuY3R1YXRpb24gKyAnKScgKyBsZWFkTGltaXQgKyBkaWdpdFNlcXVlbmNlICsgJyg/OicgKyBwdW5jdHVhdGlvbiArIGRpZ2l0U2VxdWVuY2UgKyAnKScgKyBibG9ja0xpbWl0ICsgJyg/OicgKyBFWFROX1BBVFRFUk5TX0ZPUl9NQVRDSElORyArICcpPyc7IC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiBvZiB0cmFpbGluZyBjaGFyYWN0ZXJzIHRoYXQgd2Ugd2FudCB0byByZW1vdmUuXG4vLyBXZSByZW1vdmUgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGFscGhhIG9yIG51bWVyaWNhbCBjaGFyYWN0ZXJzLlxuLy8gVGhlIGhhc2ggY2hhcmFjdGVyIGlzIHJldGFpbmVkIGhlcmUsIGFzIGl0IG1heSBzaWduaWZ5XG4vLyB0aGUgcHJldmlvdXMgYmxvY2sgd2FzIGFuIGV4dGVuc2lvbi5cbi8vXG4vLyAvLyBEb24ndCBrbm93IHdoYXQgZG9lcyAnJiYnIG1lYW4gaGVyZS5cbi8vIGNvbnN0IFVOV0FOVEVEX0VORF9DSEFSX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBbW1xcXFxQe059JiZcXFxcUHtMfV0mJlteI11dKyRgKVxuLy9cblxudmFyIFVOV0FOVEVEX0VORF9DSEFSX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFwiW15cIi5jb25jYXQoX3V0Zi5fcE4pLmNvbmNhdChfdXRmLl9wTCwgXCIjXSskXCIpKTtcbnZhciBOT05fRElHSVRTX1BBVFRFUk4gPSAvKFxcRCspLztcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHwgTWF0aC5wb3coMiwgNTMpIC0gMTtcbi8qKlxyXG4gKiBBIHN0YXRlZnVsIGNsYXNzIHRoYXQgZmluZHMgYW5kIGV4dHJhY3RzIHRlbGVwaG9uZSBudW1iZXJzIGZyb20ge0BsaW5rcGxhaW4gQ2hhclNlcXVlbmNlIHRleHR9LlxyXG4gKiBJbnN0YW5jZXMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIHtAbGlua3BsYWluIFBob25lTnVtYmVyVXRpbCNmaW5kTnVtYmVycyBmYWN0b3J5IG1ldGhvZHN9IGluXHJcbiAqIHtAbGluayBQaG9uZU51bWJlclV0aWx9LlxyXG4gKlxyXG4gKiA8cD5WYW5pdHkgbnVtYmVycyAocGhvbmUgbnVtYmVycyB1c2luZyBhbHBoYWJldGljIGRpZ2l0cyBzdWNoIGFzIDx0dD4xLTgwMC1TSVgtRkxBR1M8L3R0PiBhcmVcclxuICogbm90IGZvdW5kLlxyXG4gKlxyXG4gKiA8cD5UaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQtc2FmZS5cclxuICovXG5cbnZhciBQaG9uZU51bWJlck1hdGNoZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCDigJQgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0aGF0IHdlIHdpbGwgc2VhcmNoLCBudWxsIGZvciBubyB0ZXh0LlxyXG4gICAqIEBwYXJhbSB7J1BPU1NJQkxFJ3wnVkFMSUQnfCdTVFJJQ1RfR1JPVVBJTkcnfCdFWEFDVF9HUk9VUElORyd9IFtvcHRpb25zLmxlbmllbmN5XSDigJQgVGhlIGxlbmllbmN5IHRvIHVzZSB3aGVuIGV2YWx1YXRpbmcgY2FuZGlkYXRlIHBob25lIG51bWJlcnMuIFNlZSBgc291cmNlL2ZpbmROdW1iZXJzL0xlbmllbmN5LmpzYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhUcmllc10g4oCUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnZhbGlkIG51bWJlcnMgdG8gdHJ5IGJlZm9yZSBnaXZpbmcgdXAgb24gdGhlIHRleHQuIFRoaXMgaXMgdG8gY292ZXIgZGVnZW5lcmF0ZSBjYXNlcyB3aGVyZSB0aGUgdGV4dCBoYXMgYSBsb3Qgb2YgZmFsc2UgcG9zaXRpdmVzIGluIGl0LiBNdXN0IGJlID49IDAuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFBob25lTnVtYmVyTWF0Y2hlcigpIHtcbiAgICB2YXIgdGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHZhciBtZXRhZGF0YSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBob25lTnVtYmVyTWF0Y2hlcik7XG5cbiAgICBvcHRpb25zID0ge1xuICAgICAgdjI6IG9wdGlvbnMudjIsXG4gICAgICBkZWZhdWx0Q2FsbGluZ0NvZGU6IG9wdGlvbnMuZGVmYXVsdENhbGxpbmdDb2RlLFxuICAgICAgZGVmYXVsdENvdW50cnk6IG9wdGlvbnMuZGVmYXVsdENvdW50cnkgJiYgKDAsIF9tZXRhZGF0YS5pc1N1cHBvcnRlZENvdW50cnkpKG9wdGlvbnMuZGVmYXVsdENvdW50cnksIG1ldGFkYXRhKSA/IG9wdGlvbnMuZGVmYXVsdENvdW50cnkgOiB1bmRlZmluZWQsXG4gICAgICBsZW5pZW5jeTogb3B0aW9ucy5sZW5pZW5jeSB8fCAob3B0aW9ucy5leHRlbmRlZCA/ICdQT1NTSUJMRScgOiAnVkFMSUQnKSxcbiAgICAgIG1heFRyaWVzOiBvcHRpb25zLm1heFRyaWVzIHx8IE1BWF9TQUZFX0lOVEVHRVJcbiAgICB9OyAvLyBWYWxpZGF0ZSBgbGVuaWVuY3lgLlxuXG4gICAgaWYgKCFvcHRpb25zLmxlbmllbmN5KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgbGVuaWVuY3lgIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubGVuaWVuY3kgIT09ICdQT1NTSUJMRScgJiYgb3B0aW9ucy5sZW5pZW5jeSAhPT0gJ1ZBTElEJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYGxlbmllbmN5YDogXFxcIlwiLmNvbmNhdChvcHRpb25zLmxlbmllbmN5LCBcIlxcXCIuIFN1cHBvcnRlZCB2YWx1ZXM6IFxcXCJQT1NTSUJMRVxcXCIsIFxcXCJWQUxJRFxcXCIuXCIpKTtcbiAgICB9IC8vIFZhbGlkYXRlIGBtYXhUcmllc2AuXG5cblxuICAgIGlmIChvcHRpb25zLm1heFRyaWVzIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYG1heFRyaWVzYCBtdXN0IGJlIGA+PSAwYCcpO1xuICAgIH1cblxuICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7IC8vIFRoZSBkZWdyZWUgb2YgcGhvbmUgbnVtYmVyIHZhbGlkYXRpb24uXG5cbiAgICB0aGlzLmxlbmllbmN5ID0gX0xlbmllbmN5W1wiZGVmYXVsdFwiXVtvcHRpb25zLmxlbmllbmN5XTtcblxuICAgIGlmICghdGhpcy5sZW5pZW5jeSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gbGVuaWVuY3k6IFxcXCJcIi5jb25jYXQob3B0aW9ucy5sZW5pZW5jeSwgXCJcXFwiXCIpKTtcbiAgICB9XG4gICAgLyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGFmdGVyIG1hdGNoaW5nIGFuIGludmFsaWQgbnVtYmVyLiAqL1xuXG5cbiAgICB0aGlzLm1heFRyaWVzID0gb3B0aW9ucy5tYXhUcmllcztcbiAgICB0aGlzLlBBVFRFUk4gPSBuZXcgUmVnRXhwKFBBVFRFUk4sICdpZycpO1xuICAgIC8qKiBUaGUgaXRlcmF0aW9uIHRyaXN0YXRlLiAqL1xuXG4gICAgdGhpcy5zdGF0ZSA9ICdOT1RfUkVBRFknO1xuICAgIC8qKiBUaGUgbmV4dCBpbmRleCB0byBzdGFydCBzZWFyY2hpbmcgYXQuIFVuZGVmaW5lZCBpbiB7QGxpbmsgU3RhdGUjRE9ORX0uICovXG5cbiAgICB0aGlzLnNlYXJjaEluZGV4ID0gMDsgLy8gQSBjYWNoZSBmb3IgZnJlcXVlbnRseSB1c2VkIGNvdW50cnktc3BlY2lmaWMgcmVndWxhciBleHByZXNzaW9ucy4gU2V0IHRvIDMyIHRvIGNvdmVyIH4yLTNcbiAgICAvLyBjb3VudHJpZXMgYmVpbmcgdXNlZCBmb3IgdGhlIHNhbWUgZG9jIHdpdGggfjEwIHBhdHRlcm5zIGZvciBlYWNoIGNvdW50cnkuIFNvbWUgcGFnZXMgd2lsbCBoYXZlXG4gICAgLy8gYSBsb3QgbW9yZSBjb3VudHJpZXMgaW4gdXNlLCBidXQgdHlwaWNhbGx5IGZld2VyIG51bWJlcnMgZm9yIGVhY2ggc28gZXhwYW5kaW5nIHRoZSBjYWNoZSBmb3JcbiAgICAvLyB0aGF0IHVzZS1jYXNlIHdvbid0IGhhdmUgYSBsb3Qgb2YgYmVuZWZpdC5cblxuICAgIHRoaXMucmVnRXhwQ2FjaGUgPSBuZXcgX1JlZ0V4cENhY2hlW1wiZGVmYXVsdFwiXSgzMik7XG4gIH1cbiAgLyoqXHJcbiAgICogQXR0ZW1wdHMgdG8gZmluZCB0aGUgbmV4dCBzdWJzZXF1ZW5jZSBpbiB0aGUgc2VhcmNoZWQgc2VxdWVuY2Ugb24gb3IgYWZ0ZXIge0Bjb2RlIHNlYXJjaEluZGV4fVxyXG4gICAqIHRoYXQgcmVwcmVzZW50cyBhIHBob25lIG51bWJlci4gUmV0dXJucyB0aGUgbmV4dCBtYXRjaCwgbnVsbCBpZiBub25lIHdhcyBmb3VuZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBpbmRleCAgdGhlIHNlYXJjaCBpbmRleCB0byBzdGFydCBzZWFyY2hpbmcgYXRcclxuICAgKiBAcmV0dXJuICB0aGUgcGhvbmUgbnVtYmVyIG1hdGNoIGZvdW5kLCBudWxsIGlmIG5vbmUgY2FuIGJlIGZvdW5kXHJcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoUGhvbmVOdW1iZXJNYXRjaGVyLCBbe1xuICAgIGtleTogXCJmaW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmQoKSB7XG4gICAgICAvLyAvLyBSZXNldCB0aGUgcmVndWxhciBleHByZXNzaW9uLlxuICAgICAgLy8gdGhpcy5QQVRURVJOLmxhc3RJbmRleCA9IGluZGV4XG4gICAgICB2YXIgbWF0Y2hlcztcblxuICAgICAgd2hpbGUgKHRoaXMubWF4VHJpZXMgPiAwICYmIChtYXRjaGVzID0gdGhpcy5QQVRURVJOLmV4ZWModGhpcy50ZXh0KSkgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IG1hdGNoZXNbMF07XG4gICAgICAgIHZhciBvZmZzZXQgPSBtYXRjaGVzLmluZGV4O1xuICAgICAgICBjYW5kaWRhdGUgPSAoMCwgX3BhcnNlUHJlQ2FuZGlkYXRlW1wiZGVmYXVsdFwiXSkoY2FuZGlkYXRlKTtcblxuICAgICAgICBpZiAoKDAsIF9pc1ZhbGlkUHJlQ2FuZGlkYXRlW1wiZGVmYXVsdFwiXSkoY2FuZGlkYXRlLCBvZmZzZXQsIHRoaXMudGV4dCkpIHtcbiAgICAgICAgICB2YXIgbWF0Y2ggPSAvLyBUcnkgdG8gY29tZSB1cCB3aXRoIGEgdmFsaWQgbWF0Y2ggZ2l2ZW4gdGhlIGVudGlyZSBjYW5kaWRhdGUuXG4gICAgICAgICAgdGhpcy5wYXJzZUFuZFZlcmlmeShjYW5kaWRhdGUsIG9mZnNldCwgdGhpcy50ZXh0KSAvLyBJZiB0aGF0IGZhaWxlZCwgdHJ5IHRvIGZpbmQgYW4gXCJpbm5lciBtYXRjaFwiIC1cbiAgICAgICAgICAvLyB0aGVyZSBtaWdodCBiZSBhIHBob25lIG51bWJlciB3aXRoaW4gdGhpcyBjYW5kaWRhdGUuXG4gICAgICAgICAgfHwgdGhpcy5leHRyYWN0SW5uZXJNYXRjaChjYW5kaWRhdGUsIG9mZnNldCwgdGhpcy50ZXh0KTtcblxuICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52Mikge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXJ0c0F0OiBtYXRjaC5zdGFydHNBdCxcbiAgICAgICAgICAgICAgICBlbmRzQXQ6IG1hdGNoLmVuZHNBdCxcbiAgICAgICAgICAgICAgICBudW1iZXI6IG1hdGNoLnBob25lTnVtYmVyXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgcGhvbmVOdW1iZXIgPSBtYXRjaC5waG9uZU51bWJlcjtcbiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICBzdGFydHNBdDogbWF0Y2guc3RhcnRzQXQsXG4gICAgICAgICAgICAgICAgZW5kc0F0OiBtYXRjaC5lbmRzQXQsXG4gICAgICAgICAgICAgICAgcGhvbmU6IHBob25lTnVtYmVyLm5hdGlvbmFsTnVtYmVyXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgaWYgKHBob25lTnVtYmVyLmNvdW50cnkpIHtcbiAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgICBpZiAoVVNFX05PTl9HRU9HUkFQSElDX0NPVU5UUllfQ09ERSAmJiBjb3VudHJ5ID09PSAnMDAxJykge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvdW50cnlDYWxsaW5nQ29kZSA9IHBob25lTnVtYmVyLmNvdW50cnlDYWxsaW5nQ29kZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvdW50cnkgPSBwaG9uZU51bWJlci5jb3VudHJ5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuY291bnRyeUNhbGxpbmdDb2RlID0gcGhvbmVOdW1iZXIuY291bnRyeUNhbGxpbmdDb2RlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHBob25lTnVtYmVyLmV4dCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5leHQgPSBwaG9uZU51bWJlci5leHQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWF4VHJpZXMtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBBdHRlbXB0cyB0byBleHRyYWN0IGEgbWF0Y2ggZnJvbSBgc3Vic3RyaW5nYFxyXG4gICAgICogaWYgdGhlIHN1YnN0cmluZyBpdHNlbGYgZG9lcyBub3QgcXVhbGlmeSBhcyBhIG1hdGNoLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJleHRyYWN0SW5uZXJNYXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleHRyYWN0SW5uZXJNYXRjaChzdWJzdHJpbmcsIG9mZnNldCwgdGV4dCkge1xuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShJTk5FUl9NQVRDSEVTKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGlubmVyTWF0Y2hQYXR0ZXJuID0gX3N0ZXAudmFsdWU7XG4gICAgICAgIHZhciBpc0ZpcnN0TWF0Y2ggPSB0cnVlO1xuICAgICAgICB2YXIgY2FuZGlkYXRlTWF0Y2ggPSB2b2lkIDA7XG4gICAgICAgIHZhciBpbm5lck1hdGNoUmVnRXhwID0gbmV3IFJlZ0V4cChpbm5lck1hdGNoUGF0dGVybiwgJ2cnKTtcblxuICAgICAgICB3aGlsZSAodGhpcy5tYXhUcmllcyA+IDAgJiYgKGNhbmRpZGF0ZU1hdGNoID0gaW5uZXJNYXRjaFJlZ0V4cC5leGVjKHN1YnN0cmluZykpICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGlzRmlyc3RNYXRjaCkge1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGhhbmRsZSBhbnkgZ3JvdXAgYmVmb3JlIHRoaXMgb25lIHRvby5cbiAgICAgICAgICAgIHZhciBfY2FuZGlkYXRlID0gKDAsIF91dGlsLnRyaW1BZnRlckZpcnN0TWF0Y2gpKFVOV0FOVEVEX0VORF9DSEFSX1BBVFRFUk4sIHN1YnN0cmluZy5zbGljZSgwLCBjYW5kaWRhdGVNYXRjaC5pbmRleCkpO1xuXG4gICAgICAgICAgICB2YXIgX21hdGNoID0gdGhpcy5wYXJzZUFuZFZlcmlmeShfY2FuZGlkYXRlLCBvZmZzZXQsIHRleHQpO1xuXG4gICAgICAgICAgICBpZiAoX21hdGNoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfbWF0Y2g7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubWF4VHJpZXMtLTtcbiAgICAgICAgICAgIGlzRmlyc3RNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjYW5kaWRhdGUgPSAoMCwgX3V0aWwudHJpbUFmdGVyRmlyc3RNYXRjaCkoVU5XQU5URURfRU5EX0NIQVJfUEFUVEVSTiwgY2FuZGlkYXRlTWF0Y2hbMV0pOyAvLyBKYXZhIGNvZGUgZG9lcyBgZ3JvdXBNYXRjaGVyLnN0YXJ0KDEpYCBoZXJlLFxuICAgICAgICAgIC8vIGJ1dCB0aGVyZSdzIG5vIHdheSBpbiBqYXZhc2NyaXB0IHRvIGdldCBhIGBjYW5kaWRhdGVgIHN0YXJ0IGluZGV4LFxuICAgICAgICAgIC8vIHRoZXJlZm9yZSByZXNvcnQgdG8gdXNpbmcgdGhpcyBraW5kIG9mIGFuIGFwcHJveGltYXRpb24uXG4gICAgICAgICAgLy8gKGBncm91cE1hdGNoZXJgIGlzIGNhbGxlZCBgY2FuZGlkYXRlSW5TdWJzdHJpbmdNYXRjaGAgaW4gdGhpcyBqYXZhc2NyaXB0IHBvcnQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU5MzQzNTMvZ2V0LWluZGV4LW9mLWVhY2gtY2FwdHVyZS1pbi1hLWphdmFzY3JpcHQtcmVnZXhcblxuICAgICAgICAgIHZhciBjYW5kaWRhdGVJbmRleEd1ZXNzID0gc3Vic3RyaW5nLmluZGV4T2YoY2FuZGlkYXRlLCBjYW5kaWRhdGVNYXRjaC5pbmRleCk7XG4gICAgICAgICAgdmFyIG1hdGNoID0gdGhpcy5wYXJzZUFuZFZlcmlmeShjYW5kaWRhdGUsIG9mZnNldCArIGNhbmRpZGF0ZUluZGV4R3Vlc3MsIHRleHQpO1xuXG4gICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5tYXhUcmllcy0tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUGFyc2VzIGEgcGhvbmUgbnVtYmVyIGZyb20gdGhlIGBjYW5kaWRhdGVgIHVzaW5nIGBwYXJzZWAgYW5kXHJcbiAgICAgKiB2ZXJpZmllcyBpdCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgYGxlbmllbmN5YC4gSWYgcGFyc2luZyBhbmQgdmVyaWZpY2F0aW9uIHN1Y2NlZWQsXHJcbiAgICAgKiBhIGNvcnJlc3BvbmRpbmcgYFBob25lTnVtYmVyTWF0Y2hgIGlzIHJldHVybmVkLCBvdGhlcndpc2UgdGhpcyBtZXRob2QgcmV0dXJucyBgbnVsbGAuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNhbmRpZGF0ZSAgdGhlIGNhbmRpZGF0ZSBtYXRjaFxyXG4gICAgICogQHBhcmFtIG9mZnNldCAgdGhlIG9mZnNldCBvZiB7QGNvZGUgY2FuZGlkYXRlfSB3aXRoaW4ge0BsaW5rICN0ZXh0fVxyXG4gICAgICogQHJldHVybiAgdGhlIHBhcnNlZCBhbmQgdmFsaWRhdGVkIHBob25lIG51bWJlciBtYXRjaCwgb3IgbnVsbFxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJwYXJzZUFuZFZlcmlmeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUFuZFZlcmlmeShjYW5kaWRhdGUsIG9mZnNldCwgdGV4dCkge1xuICAgICAgaWYgKCEoMCwgX2lzVmFsaWRDYW5kaWRhdGVbXCJkZWZhdWx0XCJdKShjYW5kaWRhdGUsIG9mZnNldCwgdGV4dCwgdGhpcy5vcHRpb25zLmxlbmllbmN5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwaG9uZU51bWJlciA9ICgwLCBfcGFyc2VQaG9uZU51bWJlcltcImRlZmF1bHRcIl0pKGNhbmRpZGF0ZSwge1xuICAgICAgICBleHRlbmRlZDogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdENvdW50cnk6IHRoaXMub3B0aW9ucy5kZWZhdWx0Q291bnRyeSxcbiAgICAgICAgZGVmYXVsdENhbGxpbmdDb2RlOiB0aGlzLm9wdGlvbnMuZGVmYXVsdENhbGxpbmdDb2RlXG4gICAgICB9LCB0aGlzLm1ldGFkYXRhKTtcblxuICAgICAgaWYgKCFwaG9uZU51bWJlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghcGhvbmVOdW1iZXIuaXNQb3NzaWJsZSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubGVuaWVuY3kocGhvbmVOdW1iZXIsIGNhbmRpZGF0ZSwgdGhpcy5tZXRhZGF0YSwgdGhpcy5yZWdFeHBDYWNoZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydHNBdDogb2Zmc2V0LFxuICAgICAgICAgIGVuZHNBdDogb2Zmc2V0ICsgY2FuZGlkYXRlLmxlbmd0aCxcbiAgICAgICAgICBwaG9uZU51bWJlcjogcGhvbmVOdW1iZXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzTmV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNOZXh0KCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdOT1RfUkVBRFknKSB7XG4gICAgICAgIHRoaXMubGFzdE1hdGNoID0gdGhpcy5maW5kKCk7IC8vICh0aGlzLnNlYXJjaEluZGV4KVxuXG4gICAgICAgIGlmICh0aGlzLmxhc3RNYXRjaCkge1xuICAgICAgICAgIC8vIHRoaXMuc2VhcmNoSW5kZXggPSB0aGlzLmxhc3RNYXRjaC5lbmRzQXRcbiAgICAgICAgICB0aGlzLnN0YXRlID0gJ1JFQURZJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gJ0RPTkUnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSAnUkVBRFknO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAvLyBDaGVjayB0aGUgc3RhdGUgYW5kIGZpbmQgdGhlIG5leHQgbWF0Y2ggYXMgYSBzaWRlLWVmZmVjdCBpZiBuZWNlc3NhcnkuXG4gICAgICBpZiAoIXRoaXMuaGFzTmV4dCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gbmV4dCBlbGVtZW50Jyk7XG4gICAgICB9IC8vIERvbid0IHJldGFpbiB0aGF0IG1lbW9yeSBhbnkgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LlxuXG5cbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmxhc3RNYXRjaDtcbiAgICAgIHRoaXMubGFzdE1hdGNoID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhdGUgPSAnTk9UX1JFQURZJztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBob25lTnVtYmVyTWF0Y2hlcjtcbn0oKTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBQaG9uZU51bWJlck1hdGNoZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QaG9uZU51bWJlck1hdGNoZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLldISVRFU1BBQ0UgPSBleHBvcnRzLlZBTElEX1BVTkNUVUFUSU9OID0gZXhwb3J0cy5WQUxJRF9ESUdJVFMgPSBleHBvcnRzLlBMVVNfQ0hBUlMgPSBleHBvcnRzLk1JTl9MRU5HVEhfRk9SX05TTiA9IGV4cG9ydHMuTUFYX0xFTkdUSF9GT1JfTlNOID0gZXhwb3J0cy5NQVhfTEVOR1RIX0NPVU5UUllfQ09ERSA9IHZvaWQgMDtcbi8vIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgbmF0aW9uYWwgc2lnbmlmaWNhbnQgbnVtYmVyLlxudmFyIE1JTl9MRU5HVEhfRk9SX05TTiA9IDI7IC8vIFRoZSBJVFUgc2F5cyB0aGUgbWF4aW11bSBsZW5ndGggc2hvdWxkIGJlIDE1LFxuLy8gYnV0IG9uZSBjYW4gZmluZCBsb25nZXIgbnVtYmVycyBpbiBHZXJtYW55LlxuXG5leHBvcnRzLk1JTl9MRU5HVEhfRk9SX05TTiA9IE1JTl9MRU5HVEhfRk9SX05TTjtcbnZhciBNQVhfTEVOR1RIX0ZPUl9OU04gPSAxNzsgLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBjb3VudHJ5IGNhbGxpbmcgY29kZS5cblxuZXhwb3J0cy5NQVhfTEVOR1RIX0ZPUl9OU04gPSBNQVhfTEVOR1RIX0ZPUl9OU047XG52YXIgTUFYX0xFTkdUSF9DT1VOVFJZX0NPREUgPSAzOyAvLyBEaWdpdHMgYWNjZXB0ZWQgaW4gcGhvbmUgbnVtYmVyc1xuLy8gKGFzY2lpLCBmdWxsd2lkdGgsIGFyYWJpYy1pbmRpYywgYW5kIGVhc3Rlcm4gYXJhYmljIGRpZ2l0cykuXG5cbmV4cG9ydHMuTUFYX0xFTkdUSF9DT1VOVFJZX0NPREUgPSBNQVhfTEVOR1RIX0NPVU5UUllfQ09ERTtcbnZhciBWQUxJRF9ESUdJVFMgPSBcIjAtOVxcdUZGMTAtXFx1RkYxOVxcdTA2NjAtXFx1MDY2OVxcdTA2RjAtXFx1MDZGOVwiOyAvLyBgREFTSEVTYCB3aWxsIGJlIHJpZ2h0IGFmdGVyIHRoZSBvcGVuaW5nIHNxdWFyZSBicmFja2V0IG9mIHRoZSBcImNoYXJhY3RlciBjbGFzc1wiXG5cbmV4cG9ydHMuVkFMSURfRElHSVRTID0gVkFMSURfRElHSVRTO1xudmFyIERBU0hFUyA9IFwiLVxcdTIwMTAtXFx1MjAxNVxcdTIyMTJcXHUzMEZDXFx1RkYwRFwiO1xudmFyIFNMQVNIRVMgPSBcIlxcdUZGMEYvXCI7XG52YXIgRE9UUyA9IFwiXFx1RkYwRS5cIjtcbnZhciBXSElURVNQQUNFID0gXCIgXFx4QTBcXHhBRFxcdTIwMEJcXHUyMDYwXFx1MzAwMFwiO1xuZXhwb3J0cy5XSElURVNQQUNFID0gV0hJVEVTUEFDRTtcbnZhciBCUkFDS0VUUyA9IFwiKClcXHVGRjA4XFx1RkYwOVxcdUZGM0JcXHVGRjNEXFxcXFtcXFxcXVwiOyAvLyBleHBvcnQgY29uc3QgT1BFTklOR19CUkFDS0VUUyA9ICcoXFx1RkYwOFxcdUZGM0JcXFxcXFxbJ1xuXG52YXIgVElMREVTID0gXCJ+XFx1MjA1M1xcdTIyM0NcXHVGRjVFXCI7IC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBhY2NlcHRhYmxlIHB1bmN0dWF0aW9uIGZvdW5kIGluIHBob25lIG51bWJlcnMuIFRoaXNcbi8vIGV4Y2x1ZGVzIHB1bmN0dWF0aW9uIGZvdW5kIGFzIGEgbGVhZGluZyBjaGFyYWN0ZXIgb25seS4gVGhpcyBjb25zaXN0cyBvZiBkYXNoXG4vLyBjaGFyYWN0ZXJzLCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzLCBmdWxsIHN0b3BzLCBzbGFzaGVzLCBzcXVhcmUgYnJhY2tldHMsXG4vLyBwYXJlbnRoZXNlcyBhbmQgdGlsZGVzLiBGdWxsLXdpZHRoIHZhcmlhbnRzIGFyZSBhbHNvIHByZXNlbnQuXG5cbnZhciBWQUxJRF9QVU5DVFVBVElPTiA9IFwiXCIuY29uY2F0KERBU0hFUykuY29uY2F0KFNMQVNIRVMpLmNvbmNhdChET1RTKS5jb25jYXQoV0hJVEVTUEFDRSkuY29uY2F0KEJSQUNLRVRTKS5jb25jYXQoVElMREVTKTtcbmV4cG9ydHMuVkFMSURfUFVOQ1RVQVRJT04gPSBWQUxJRF9QVU5DVFVBVElPTjtcbnZhciBQTFVTX0NIQVJTID0gXCIrXFx1RkYwQlwiOyAvLyBjb25zdCBMRUFESU5HX1BMVVNfQ0hBUlNfUEFUVEVSTiA9IG5ldyBSZWdFeHAoJ15bJyArIFBMVVNfQ0hBUlMgKyAnXSsnKVxuXG5leHBvcnRzLlBMVVNfQ0hBUlMgPSBQTFVTX0NIQVJTO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLy8gaHR0cHM6Ly9tZWRpdW0uY29tL2RzaW5qcy9pbXBsZW1lbnRpbmctbHJ1LWNhY2hlLWluLWphdmFzY3JpcHQtOTRiYTY3NTVjZGE5XG52YXIgTm9kZSA9IC8qI19fUFVSRV9fKi9fY3JlYXRlQ2xhc3MoZnVuY3Rpb24gTm9kZShrZXksIHZhbHVlKSB7XG4gIHZhciBuZXh0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuICB2YXIgcHJldiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm9kZSk7XG5cbiAgdGhpcy5rZXkgPSBrZXk7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgdGhpcy5uZXh0ID0gbmV4dDtcbiAgdGhpcy5wcmV2ID0gcHJldjtcbn0pO1xuXG52YXIgTFJVQ2FjaGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvL3NldCBkZWZhdWx0IGxpbWl0IG9mIDEwIGlmIGxpbWl0IGlzIG5vdCBwYXNzZWQuXG4gIGZ1bmN0aW9uIExSVUNhY2hlKCkge1xuICAgIHZhciBsaW1pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMTA7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTFJVQ2FjaGUpO1xuXG4gICAgdGhpcy5zaXplID0gMDtcbiAgICB0aGlzLmxpbWl0ID0gbGltaXQ7XG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMuY2FjaGUgPSB7fTtcbiAgfSAvLyBXcml0ZSBOb2RlIHRvIGhlYWQgb2YgTGlua2VkTGlzdFxuICAvLyB1cGRhdGUgY2FjaGUgd2l0aCBOb2RlIGtleSBhbmQgTm9kZSByZWZlcmVuY2VcblxuXG4gIF9jcmVhdGVDbGFzcyhMUlVDYWNoZSwgW3tcbiAgICBrZXk6IFwicHV0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHB1dChrZXksIHZhbHVlKSB7XG4gICAgICB0aGlzLmVuc3VyZUxpbWl0KCk7XG5cbiAgICAgIGlmICghdGhpcy5oZWFkKSB7XG4gICAgICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG5ldyBOb2RlKGtleSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgTm9kZShrZXksIHZhbHVlLCB0aGlzLmhlYWQpO1xuICAgICAgICB0aGlzLmhlYWQucHJldiA9IG5vZGU7XG4gICAgICAgIHRoaXMuaGVhZCA9IG5vZGU7XG4gICAgICB9IC8vVXBkYXRlIHRoZSBjYWNoZSBtYXBcblxuXG4gICAgICB0aGlzLmNhY2hlW2tleV0gPSB0aGlzLmhlYWQ7XG4gICAgICB0aGlzLnNpemUrKztcbiAgICB9IC8vIFJlYWQgZnJvbSBjYWNoZSBtYXAgYW5kIG1ha2UgdGhhdCBub2RlIGFzIG5ldyBIZWFkIG9mIExpbmtlZExpc3RcblxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICBpZiAodGhpcy5jYWNoZVtrZXldKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuY2FjaGVba2V5XS52YWx1ZTsgLy8gbm9kZSByZW1vdmVkIGZyb20gaXQncyBwb3NpdGlvbiBhbmQgY2FjaGVcblxuICAgICAgICB0aGlzLnJlbW92ZShrZXkpOyAvLyB3cml0ZSBub2RlIGFnYWluIHRvIHRoZSBoZWFkIG9mIExpbmtlZExpc3QgdG8gbWFrZSBpdCBtb3N0IHJlY2VudGx5IHVzZWRcblxuICAgICAgICB0aGlzLnB1dChrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhcIkl0ZW0gbm90IGF2YWlsYWJsZSBpbiBjYWNoZSBmb3Iga2V5IFwiLmNvbmNhdChrZXkpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5zdXJlTGltaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5zdXJlTGltaXQoKSB7XG4gICAgICBpZiAodGhpcy5zaXplID09PSB0aGlzLmxpbWl0KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKHRoaXMudGFpbC5rZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKGtleSkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLmNhY2hlW2tleV07XG5cbiAgICAgIGlmIChub2RlLnByZXYgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5wcmV2Lm5leHQgPSBub2RlLm5leHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhlYWQgPSBub2RlLm5leHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5leHQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5uZXh0LnByZXYgPSBub2RlLnByZXY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRhaWwgPSBub2RlLnByZXY7XG4gICAgICB9XG5cbiAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2tleV07XG4gICAgICB0aGlzLnNpemUtLTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgICAgdGhpcy50YWlsID0gbnVsbDtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICB0aGlzLmNhY2hlID0ge307XG4gICAgfSAvLyAvLyBJbnZva2VzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZXJ5IG5vZGUgb2YgdGhlIGNoYWluIGFuZCB0aGUgaW5kZXggb2YgdGhlIG5vZGUuXG4gICAgLy8gZm9yRWFjaChmbikge1xuICAgIC8vICAgbGV0IG5vZGUgPSB0aGlzLmhlYWQ7XG4gICAgLy8gICBsZXQgY291bnRlciA9IDA7XG4gICAgLy8gICB3aGlsZSAobm9kZSkge1xuICAgIC8vICAgICBmbihub2RlLCBjb3VudGVyKTtcbiAgICAvLyAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAvLyAgICAgY291bnRlcisrO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICAvLyAvLyBUbyBpdGVyYXRlIG92ZXIgTFJVIHdpdGggYSAnZm9yLi4ub2YnIGxvb3BcbiAgICAvLyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgLy8gICBsZXQgbm9kZSA9IHRoaXMuaGVhZDtcbiAgICAvLyAgIHdoaWxlIChub2RlKSB7XG4gICAgLy8gICAgIHlpZWxkIG5vZGU7XG4gICAgLy8gICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gIH1dKTtcblxuICByZXR1cm4gTFJVQ2FjaGU7XG59KCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gTFJVQ2FjaGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MUlVDYWNoZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY29udGFpbnNNb3JlVGhhbk9uZVNsYXNoSW5OYXRpb25hbE51bWJlciA9IGNvbnRhaW5zTW9yZVRoYW5PbmVTbGFzaEluTmF0aW9uYWxOdW1iZXI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9pc1ZhbGlkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vaXNWYWxpZC5qc1wiKSk7XG5cbnZhciBfcGFyc2VEaWdpdHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9oZWxwZXJzL3BhcnNlRGlnaXRzLmpzXCIpKTtcblxudmFyIF9tYXRjaFBob25lTnVtYmVyU3RyaW5nQWdhaW5zdFBob25lTnVtYmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9tYXRjaFBob25lTnVtYmVyU3RyaW5nQWdhaW5zdFBob25lTnVtYmVyLmpzXCIpKTtcblxudmFyIF9tZXRhZGF0YTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9tZXRhZGF0YS5qc1wiKSk7XG5cbnZhciBfZ2V0Q291bnRyeUJ5Q2FsbGluZ0NvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9oZWxwZXJzL2dldENvdW50cnlCeUNhbGxpbmdDb2RlLmpzXCIpKTtcblxudmFyIF9mb3JtYXQgPSByZXF1aXJlKFwiLi4vZm9ybWF0LmpzXCIpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi91dGlsLmpzXCIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKGl0KSByZXR1cm4gKGl0ID0gaXQuY2FsbChvKSkubmV4dC5iaW5kKGl0KTsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbi8qKlxyXG4gKiBMZW5pZW5jeSB3aGVuIGZpbmRpbmcgcG90ZW50aWFsIHBob25lIG51bWJlcnMgaW4gdGV4dCBzZWdtZW50c1xyXG4gKiBUaGUgbGV2ZWxzIGhlcmUgYXJlIG9yZGVyZWQgaW4gaW5jcmVhc2luZyBzdHJpY3RuZXNzLlxyXG4gKi9cbnZhciBfZGVmYXVsdCA9IHtcbiAgLyoqXHJcbiAgICogUGhvbmUgbnVtYmVycyBhY2NlcHRlZCBhcmUgXCJwb3NzaWJsZVwiLCBidXQgbm90IG5lY2Vzc2FyaWx5IFwidmFsaWRcIi5cclxuICAgKi9cbiAgUE9TU0lCTEU6IGZ1bmN0aW9uIFBPU1NJQkxFKHBob25lTnVtYmVyLCBjYW5kaWRhdGUsIG1ldGFkYXRhKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgLyoqXHJcbiAgICogUGhvbmUgbnVtYmVycyBhY2NlcHRlZCBhcmUgXCJwb3NzaWJsZVwiIGFuZCBcInZhbGlkXCIuXHJcbiAgICogTnVtYmVycyB3cml0dGVuIGluIG5hdGlvbmFsIGZvcm1hdCBtdXN0IGhhdmUgdGhlaXIgbmF0aW9uYWwtcHJlZml4XHJcbiAgICogcHJlc2VudCBpZiBpdCBpcyB1c3VhbGx5IHdyaXR0ZW4gZm9yIGEgbnVtYmVyIG9mIHRoaXMgdHlwZS5cclxuICAgKi9cbiAgVkFMSUQ6IGZ1bmN0aW9uIFZBTElEKHBob25lTnVtYmVyLCBjYW5kaWRhdGUsIG1ldGFkYXRhKSB7XG4gICAgaWYgKCFwaG9uZU51bWJlci5pc1ZhbGlkKCkgfHwgIWNvbnRhaW5zT25seVZhbGlkWENoYXJzKHBob25lTnVtYmVyLCBjYW5kaWRhdGUsIG1ldGFkYXRhKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gU2tpcHBlZCBmb3Igc2ltcGxpY2l0eS5cbiAgICAvLyByZXR1cm4gaXNOYXRpb25hbFByZWZpeFByZXNlbnRJZlJlcXVpcmVkKHBob25lTnVtYmVyLCBtZXRhZGF0YSlcblxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgLyoqXHJcbiAgICogUGhvbmUgbnVtYmVycyBhY2NlcHRlZCBhcmUgXCJ2YWxpZFwiIGFuZFxyXG4gICAqIGFyZSBncm91cGVkIGluIGEgcG9zc2libGUgd2F5IGZvciB0aGlzIGxvY2FsZS4gRm9yIGV4YW1wbGUsIGEgVVMgbnVtYmVyIHdyaXR0ZW4gYXNcclxuICAgKiBcIjY1IDAyIDUzIDAwIDAwXCIgYW5kIFwiNjUwMjUzIDAwMDBcIiBhcmUgbm90IGFjY2VwdGVkIGF0IHRoaXMgbGVuaWVuY3kgbGV2ZWwsIHdoZXJlYXNcclxuICAgKiBcIjY1MCAyNTMgMDAwMFwiLCBcIjY1MCAyNTMwMDAwXCIgb3IgXCI2NTAyNTMwMDAwXCIgYXJlLlxyXG4gICAqIE51bWJlcnMgd2l0aCBtb3JlIHRoYW4gb25lICcvJyBzeW1ib2wgaW4gdGhlIG5hdGlvbmFsIHNpZ25pZmljYW50IG51bWJlclxyXG4gICAqIGFyZSBhbHNvIGRyb3BwZWQgYXQgdGhpcyBsZXZlbC5cclxuICAgKlxyXG4gICAqIFdhcm5pbmc6IFRoaXMgbGV2ZWwgbWlnaHQgcmVzdWx0IGluIGxvd2VyIGNvdmVyYWdlIGVzcGVjaWFsbHkgZm9yIHJlZ2lvbnMgb3V0c2lkZSBvZlxyXG4gICAqIGNvdW50cnkgY29kZSBcIisxXCIuIElmIHlvdSBhcmUgbm90IHN1cmUgYWJvdXQgd2hpY2ggbGV2ZWwgdG8gdXNlLFxyXG4gICAqIGVtYWlsIHRoZSBkaXNjdXNzaW9uIGdyb3VwIGxpYnBob25lbnVtYmVyLWRpc2N1c3NAZ29vZ2xlZ3JvdXBzLmNvbS5cclxuICAgKi9cbiAgU1RSSUNUX0dST1VQSU5HOiBmdW5jdGlvbiBTVFJJQ1RfR1JPVVBJTkcocGhvbmVOdW1iZXIsIGNhbmRpZGF0ZSwgbWV0YWRhdGEsIHJlZ0V4cENhY2hlKSB7XG4gICAgaWYgKCFwaG9uZU51bWJlci5pc1ZhbGlkKCkgfHwgIWNvbnRhaW5zT25seVZhbGlkWENoYXJzKHBob25lTnVtYmVyLCBjYW5kaWRhdGUsIG1ldGFkYXRhKSB8fCBjb250YWluc01vcmVUaGFuT25lU2xhc2hJbk5hdGlvbmFsTnVtYmVyKHBob25lTnVtYmVyLCBjYW5kaWRhdGUpIHx8ICFpc05hdGlvbmFsUHJlZml4UHJlc2VudElmUmVxdWlyZWQocGhvbmVOdW1iZXIsIG1ldGFkYXRhKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBjaGVja051bWJlckdyb3VwaW5nSXNWYWxpZChwaG9uZU51bWJlciwgY2FuZGlkYXRlLCBtZXRhZGF0YSwgYWxsTnVtYmVyR3JvdXBzUmVtYWluR3JvdXBlZCwgcmVnRXhwQ2FjaGUpO1xuICB9LFxuXG4gIC8qKlxyXG4gICAqIFBob25lIG51bWJlcnMgYWNjZXB0ZWQgYXJlIFwidmFsaWRcIiBhbmQgYXJlIGdyb3VwZWQgaW4gdGhlIHNhbWUgd2F5XHJcbiAgICogdGhhdCB3ZSB3b3VsZCBoYXZlIGZvcm1hdHRlZCBpdCwgb3IgYXMgYSBzaW5nbGUgYmxvY2suXHJcbiAgICogRm9yIGV4YW1wbGUsIGEgVVMgbnVtYmVyIHdyaXR0ZW4gYXMgXCI2NTAgMjUzMDAwMFwiIGlzIG5vdCBhY2NlcHRlZFxyXG4gICAqIGF0IHRoaXMgbGVuaWVuY3kgbGV2ZWwsIHdoZXJlYXMgXCI2NTAgMjUzIDAwMDBcIiBvciBcIjY1MDI1MzAwMDBcIiBhcmUuXHJcbiAgICogTnVtYmVycyB3aXRoIG1vcmUgdGhhbiBvbmUgJy8nIHN5bWJvbCBhcmUgYWxzbyBkcm9wcGVkIGF0IHRoaXMgbGV2ZWwuXHJcbiAgICpcclxuICAgKiBXYXJuaW5nOiBUaGlzIGxldmVsIG1pZ2h0IHJlc3VsdCBpbiBsb3dlciBjb3ZlcmFnZSBlc3BlY2lhbGx5IGZvciByZWdpb25zIG91dHNpZGUgb2ZcclxuICAgKiBjb3VudHJ5IGNvZGUgXCIrMVwiLiBJZiB5b3UgYXJlIG5vdCBzdXJlIGFib3V0IHdoaWNoIGxldmVsIHRvIHVzZSwgZW1haWwgdGhlIGRpc2N1c3Npb24gZ3JvdXBcclxuICAgKiBsaWJwaG9uZW51bWJlci1kaXNjdXNzQGdvb2dsZWdyb3Vwcy5jb20uXHJcbiAgICovXG4gIEVYQUNUX0dST1VQSU5HOiBmdW5jdGlvbiBFWEFDVF9HUk9VUElORyhwaG9uZU51bWJlciwgY2FuZGlkYXRlLCBtZXRhZGF0YSwgcmVnRXhwQ2FjaGUpIHtcbiAgICBpZiAoIXBob25lTnVtYmVyLmlzVmFsaWQoKSB8fCAhY29udGFpbnNPbmx5VmFsaWRYQ2hhcnMocGhvbmVOdW1iZXIsIGNhbmRpZGF0ZSwgbWV0YWRhdGEpIHx8IGNvbnRhaW5zTW9yZVRoYW5PbmVTbGFzaEluTmF0aW9uYWxOdW1iZXIocGhvbmVOdW1iZXIsIGNhbmRpZGF0ZSkgfHwgIWlzTmF0aW9uYWxQcmVmaXhQcmVzZW50SWZSZXF1aXJlZChwaG9uZU51bWJlciwgbWV0YWRhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoZWNrTnVtYmVyR3JvdXBpbmdJc1ZhbGlkKHBob25lTnVtYmVyLCBjYW5kaWRhdGUsIG1ldGFkYXRhLCBhbGxOdW1iZXJHcm91cHNBcmVFeGFjdGx5UHJlc2VudCwgcmVnRXhwQ2FjaGUpO1xuICB9XG59O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDtcblxuZnVuY3Rpb24gY29udGFpbnNPbmx5VmFsaWRYQ2hhcnMocGhvbmVOdW1iZXIsIGNhbmRpZGF0ZSwgbWV0YWRhdGEpIHtcbiAgLy8gVGhlIGNoYXJhY3RlcnMgJ3gnIGFuZCAnWCcgY2FuIGJlICgxKSBhIGNhcnJpZXIgY29kZSwgaW4gd2hpY2ggY2FzZSB0aGV5IGFsd2F5cyBwcmVjZWRlIHRoZVxuICAvLyBuYXRpb25hbCBzaWduaWZpY2FudCBudW1iZXIgb3IgKDIpIGFuIGV4dGVuc2lvbiBzaWduLCBpbiB3aGljaCBjYXNlIHRoZXkgYWx3YXlzIHByZWNlZGUgdGhlXG4gIC8vIGV4dGVuc2lvbiBudW1iZXIuIFdlIGFzc3VtZSBhIGNhcnJpZXIgY29kZSBpcyBtb3JlIHRoYW4gMSBkaWdpdCwgc28gdGhlIGZpcnN0IGNhc2UgaGFzIHRvXG4gIC8vIGhhdmUgbW9yZSB0aGFuIDEgY29uc2VjdXRpdmUgJ3gnIG9yICdYJywgd2hlcmVhcyB0aGUgc2Vjb25kIGNhc2UgY2FuIG9ubHkgaGF2ZSBleGFjdGx5IDEgJ3gnXG4gIC8vIG9yICdYJy4gV2UgaWdub3JlIHRoZSBjaGFyYWN0ZXIgaWYgaXQgYXBwZWFycyBhcyB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZy5cbiAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGNhbmRpZGF0ZS5sZW5ndGggLSAxOyBpbmRleCsrKSB7XG4gICAgdmFyIGNoYXJBdEluZGV4ID0gY2FuZGlkYXRlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhckF0SW5kZXggPT09ICd4JyB8fCBjaGFyQXRJbmRleCA9PT0gJ1gnKSB7XG4gICAgICB2YXIgY2hhckF0TmV4dEluZGV4ID0gY2FuZGlkYXRlLmNoYXJBdChpbmRleCArIDEpO1xuXG4gICAgICBpZiAoY2hhckF0TmV4dEluZGV4ID09PSAneCcgfHwgY2hhckF0TmV4dEluZGV4ID09PSAnWCcpIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2FycmllciBjb2RlIGNhc2UsIGluIHdoaWNoIHRoZSAnWCdzIGFsd2F5cyBwcmVjZWRlIHRoZSBuYXRpb25hbFxuICAgICAgICAvLyBzaWduaWZpY2FudCBudW1iZXIuXG4gICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgaWYgKCgwLCBfbWF0Y2hQaG9uZU51bWJlclN0cmluZ0FnYWluc3RQaG9uZU51bWJlcltcImRlZmF1bHRcIl0pKGNhbmRpZGF0ZS5zdWJzdHJpbmcoaW5kZXgpLCBwaG9uZU51bWJlciwgbWV0YWRhdGEpICE9PSAnTlNOX01BVENIJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSAvLyBUaGlzIGlzIHRoZSBleHRlbnNpb24gc2lnbiBjYXNlLCBpbiB3aGljaCB0aGUgJ3gnIG9yICdYJyBzaG91bGQgYWx3YXlzIHByZWNlZGUgdGhlXG4gICAgICAgIC8vIGV4dGVuc2lvbiBudW1iZXIuXG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBleHQgPSAoMCwgX3BhcnNlRGlnaXRzW1wiZGVmYXVsdFwiXSkoY2FuZGlkYXRlLnN1YnN0cmluZyhpbmRleCkpO1xuXG4gICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICBpZiAocGhvbmVOdW1iZXIuZXh0ICE9PSBleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHBob25lTnVtYmVyLmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc05hdGlvbmFsUHJlZml4UHJlc2VudElmUmVxdWlyZWQocGhvbmVOdW1iZXIsIF9tZXRhZGF0YSkge1xuICAvLyBGaXJzdCwgY2hlY2sgaG93IHdlIGRlZHVjZWQgdGhlIGNvdW50cnkgY29kZS4gSWYgaXQgd2FzIHdyaXR0ZW4gaW4gaW50ZXJuYXRpb25hbCBmb3JtYXQsIHRoZW5cbiAgLy8gdGhlIG5hdGlvbmFsIHByZWZpeCBpcyBub3QgcmVxdWlyZWQuXG4gIGlmIChwaG9uZU51bWJlci5fX2NvdW50cnlDYWxsaW5nQ29kZVNvdXJjZSAhPT0gJ0ZST01fREVGQVVMVF9DT1VOVFJZJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIG1ldGFkYXRhID0gbmV3IF9tZXRhZGF0YTJbXCJkZWZhdWx0XCJdKF9tZXRhZGF0YSk7XG4gIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4ocGhvbmVOdW1iZXIuY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgdmFyIHBob25lTnVtYmVyUmVnaW9uID0gcGhvbmVOdW1iZXIuY291bnRyeSB8fCAoMCwgX2dldENvdW50cnlCeUNhbGxpbmdDb2RlW1wiZGVmYXVsdFwiXSkocGhvbmVOdW1iZXIuY291bnRyeUNhbGxpbmdDb2RlLCBwaG9uZU51bWJlci5uYXRpb25hbE51bWJlciwgbWV0YWRhdGEpOyAvLyBDaGVjayBpZiBhIG5hdGlvbmFsIHByZWZpeCBzaG91bGQgYmUgcHJlc2VudCB3aGVuIGZvcm1hdHRpbmcgdGhpcyBudW1iZXIuXG5cbiAgdmFyIG5hdGlvbmFsTnVtYmVyID0gcGhvbmVOdW1iZXIubmF0aW9uYWxOdW1iZXI7XG4gIHZhciBmb3JtYXQgPSAoMCwgX2Zvcm1hdC5jaG9vc2VGb3JtYXRGb3JOdW1iZXIpKG1ldGFkYXRhLm51bWJlcmluZ1BsYW4uZm9ybWF0cygpLCBuYXRpb25hbE51bWJlcik7IC8vIFRvIGRvIHRoaXMsIHdlIGNoZWNrIHRoYXQgYSBuYXRpb25hbCBwcmVmaXggZm9ybWF0dGluZyBydWxlIHdhcyBwcmVzZW50XG4gIC8vIGFuZCB0aGF0IGl0IHdhc24ndCBqdXN0IHRoZSBmaXJzdC1ncm91cCBzeW1ib2wgKCQxKSB3aXRoIHB1bmN0dWF0aW9uLlxuXG4gIGlmIChmb3JtYXQubmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSgpKSB7XG4gICAgaWYgKG1ldGFkYXRhLm51bWJlcmluZ1BsYW4ubmF0aW9uYWxQcmVmaXhJc09wdGlvbmFsV2hlbkZvcm1hdHRpbmdJbk5hdGlvbmFsRm9ybWF0KCkpIHtcbiAgICAgIC8vIFRoZSBuYXRpb25hbC1wcmVmaXggaXMgb3B0aW9uYWwgaW4gdGhlc2UgY2FzZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgaXQgd2FzIHByZXNlbnQuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWZvcm1hdC51c2VzTmF0aW9uYWxQcmVmaXgoKSkge1xuICAgICAgLy8gTmF0aW9uYWwgUHJlZml4IG5vdCBuZWVkZWQgZm9yIHRoaXMgbnVtYmVyLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJvb2xlYW4ocGhvbmVOdW1iZXIubmF0aW9uYWxQcmVmaXgpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTW9yZVRoYW5PbmVTbGFzaEluTmF0aW9uYWxOdW1iZXIocGhvbmVOdW1iZXIsIGNhbmRpZGF0ZSkge1xuICB2YXIgZmlyc3RTbGFzaEluQm9keUluZGV4ID0gY2FuZGlkYXRlLmluZGV4T2YoJy8nKTtcblxuICBpZiAoZmlyc3RTbGFzaEluQm9keUluZGV4IDwgMCkge1xuICAgIC8vIE5vIHNsYXNoZXMsIHRoaXMgaXMgb2theS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gTm93IGxvb2sgZm9yIGEgc2Vjb25kIG9uZS5cblxuXG4gIHZhciBzZWNvbmRTbGFzaEluQm9keUluZGV4ID0gY2FuZGlkYXRlLmluZGV4T2YoJy8nLCBmaXJzdFNsYXNoSW5Cb2R5SW5kZXggKyAxKTtcblxuICBpZiAoc2Vjb25kU2xhc2hJbkJvZHlJbmRleCA8IDApIHtcbiAgICAvLyBPbmx5IG9uZSBzbGFzaCwgdGhpcyBpcyBva2F5LlxuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB0aGUgZmlyc3Qgc2xhc2ggaXMgYWZ0ZXIgdGhlIGNvdW50cnkgY2FsbGluZyBjb2RlLCB0aGlzIGlzIHBlcm1pdHRlZC5cblxuXG4gIHZhciBjYW5kaWRhdGVIYXNDb3VudHJ5Q29kZSA9IHBob25lTnVtYmVyLl9fY291bnRyeUNhbGxpbmdDb2RlU291cmNlID09PSAnRlJPTV9OVU1CRVJfV0lUSF9QTFVTX1NJR04nIHx8IHBob25lTnVtYmVyLl9fY291bnRyeUNhbGxpbmdDb2RlU291cmNlID09PSAnRlJPTV9OVU1CRVJfV0lUSE9VVF9QTFVTX1NJR04nO1xuXG4gIGlmIChjYW5kaWRhdGVIYXNDb3VudHJ5Q29kZSAmJiAoMCwgX3BhcnNlRGlnaXRzW1wiZGVmYXVsdFwiXSkoY2FuZGlkYXRlLnN1YnN0cmluZygwLCBmaXJzdFNsYXNoSW5Cb2R5SW5kZXgpKSA9PT0gcGhvbmVOdW1iZXIuY291bnRyeUNhbGxpbmdDb2RlKSB7XG4gICAgLy8gQW55IG1vcmUgc2xhc2hlcyBhbmQgdGhpcyBpcyBpbGxlZ2FsLlxuICAgIHJldHVybiBjYW5kaWRhdGUuc2xpY2Uoc2Vjb25kU2xhc2hJbkJvZHlJbmRleCArIDEpLmluZGV4T2YoJy8nKSA+PSAwO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrTnVtYmVyR3JvdXBpbmdJc1ZhbGlkKG51bWJlciwgY2FuZGlkYXRlLCBtZXRhZGF0YSwgY2hlY2tHcm91cHMsIHJlZ0V4cENhY2hlKSB7XG4gIHRocm93IG5ldyBFcnJvcignVGhpcyBwYXJ0IG9mIGNvZGUgaGFzblxcJ3QgYmVlbiBwb3J0ZWQnKTtcbiAgdmFyIG5vcm1hbGl6ZWRDYW5kaWRhdGUgPSBub3JtYWxpemVEaWdpdHMoY2FuZGlkYXRlLCB0cnVlXG4gIC8qIGtlZXAgbm9uLWRpZ2l0cyAqL1xuICApO1xuICB2YXIgZm9ybWF0dGVkTnVtYmVyR3JvdXBzID0gZ2V0TmF0aW9uYWxOdW1iZXJHcm91cHMobWV0YWRhdGEsIG51bWJlciwgbnVsbCk7XG5cbiAgaWYgKGNoZWNrR3JvdXBzKG1ldGFkYXRhLCBudW1iZXIsIG5vcm1hbGl6ZWRDYW5kaWRhdGUsIGZvcm1hdHRlZE51bWJlckdyb3VwcykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiB0aGlzIGRpZG4ndCBwYXNzLCBzZWUgaWYgdGhlcmUgYXJlIGFueSBhbHRlcm5hdGUgZm9ybWF0cyB0aGF0IG1hdGNoLCBhbmQgdHJ5IHRoZW0gaW5zdGVhZC5cblxuXG4gIHZhciBhbHRlcm5hdGVGb3JtYXRzID0gTWV0YWRhdGFNYW5hZ2VyLmdldEFsdGVybmF0ZUZvcm1hdHNGb3JDb3VudHJ5KG51bWJlci5nZXRDb3VudHJ5Q29kZSgpKTtcbiAgdmFyIG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIgPSB1dGlsLmdldE5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIobnVtYmVyKTtcblxuICBpZiAoYWx0ZXJuYXRlRm9ybWF0cykge1xuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UoYWx0ZXJuYXRlRm9ybWF0cy5udW1iZXJGb3JtYXRzKCkpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIGFsdGVybmF0ZUZvcm1hdCA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoYWx0ZXJuYXRlRm9ybWF0LmxlYWRpbmdEaWdpdHNQYXR0ZXJucygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVGhlcmUgaXMgb25seSBvbmUgbGVhZGluZyBkaWdpdHMgcGF0dGVybiBmb3IgYWx0ZXJuYXRlIGZvcm1hdHMuXG4gICAgICAgIHZhciBsZWFkaW5nRGlnaXRzUmVnRXhwID0gcmVnRXhwQ2FjaGUuZ2V0UGF0dGVybkZvclJlZ0V4cCgnXicgKyBhbHRlcm5hdGVGb3JtYXQubGVhZGluZ0RpZ2l0c1BhdHRlcm5zKClbMF0pO1xuXG4gICAgICAgIGlmICghbGVhZGluZ0RpZ2l0c1JlZ0V4cC50ZXN0KG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIpKSB7XG4gICAgICAgICAgLy8gTGVhZGluZyBkaWdpdHMgZG9uJ3QgbWF0Y2g7IHRyeSBhbm90aGVyIG9uZS5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3JtYXR0ZWROdW1iZXJHcm91cHMgPSBnZXROYXRpb25hbE51bWJlckdyb3VwcyhtZXRhZGF0YSwgbnVtYmVyLCBhbHRlcm5hdGVGb3JtYXQpO1xuXG4gICAgICBpZiAoY2hlY2tHcm91cHMobWV0YWRhdGEsIG51bWJlciwgbm9ybWFsaXplZENhbmRpZGF0ZSwgZm9ybWF0dGVkTnVtYmVyR3JvdXBzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4vKipcclxuICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIG5hdGlvbmFsLW51bWJlciBwYXJ0IG9mIGEgbnVtYmVyLCBmb3JtYXR0ZWQgd2l0aG91dCBhbnkgbmF0aW9uYWxcclxuICogcHJlZml4LCBhbmQgcmV0dXJuIGl0IGFzIGEgc2V0IG9mIGRpZ2l0IGJsb2NrcyB0aGF0IHdvdWxkIGJlIGZvcm1hdHRlZCB0b2dldGhlciBmb2xsb3dpbmdcclxuICogc3RhbmRhcmQgZm9ybWF0dGluZyBydWxlcy5cclxuICovXG5cblxuZnVuY3Rpb24gZ2V0TmF0aW9uYWxOdW1iZXJHcm91cHMobWV0YWRhdGEsIG51bWJlciwgZm9ybWF0dGluZ1BhdHRlcm4pIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHBhcnQgb2YgY29kZSBoYXNuXFwndCBiZWVuIHBvcnRlZCcpO1xuXG4gIGlmIChmb3JtYXR0aW5nUGF0dGVybikge1xuICAgIC8vIFdlIGZvcm1hdCB0aGUgTlNOIG9ubHksIGFuZCBzcGxpdCB0aGF0IGFjY29yZGluZyB0byB0aGUgc2VwYXJhdG9yLlxuICAgIHZhciBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyID0gdXRpbC5nZXROYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKG51bWJlcik7XG4gICAgcmV0dXJuIHV0aWwuZm9ybWF0TnNuVXNpbmdQYXR0ZXJuKG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIsIGZvcm1hdHRpbmdQYXR0ZXJuLCAnUkZDMzk2NicsIG1ldGFkYXRhKS5zcGxpdCgnLScpO1xuICB9IC8vIFRoaXMgd2lsbCBiZSBpbiB0aGUgZm9ybWF0ICtDQy1ERzEtREcyLURHWDtleHQ9RVhUIHdoZXJlIERHMS4uREdYIHJlcHJlc2VudHMgZ3JvdXBzIG9mIGRpZ2l0cy5cblxuXG4gIHZhciByZmMzOTY2Rm9ybWF0ID0gZm9ybWF0TnVtYmVyKG51bWJlciwgJ1JGQzM5NjYnLCBtZXRhZGF0YSk7IC8vIFdlIHJlbW92ZSB0aGUgZXh0ZW5zaW9uIHBhcnQgZnJvbSB0aGUgZm9ybWF0dGVkIHN0cmluZyBiZWZvcmUgc3BsaXR0aW5nIGl0IGludG8gZGlmZmVyZW50XG4gIC8vIGdyb3Vwcy5cblxuICB2YXIgZW5kSW5kZXggPSByZmMzOTY2Rm9ybWF0LmluZGV4T2YoJzsnKTtcblxuICBpZiAoZW5kSW5kZXggPCAwKSB7XG4gICAgZW5kSW5kZXggPSByZmMzOTY2Rm9ybWF0Lmxlbmd0aDtcbiAgfSAvLyBUaGUgY291bnRyeS1jb2RlIHdpbGwgaGF2ZSBhICctJyBmb2xsb3dpbmcgaXQuXG5cblxuICB2YXIgc3RhcnRJbmRleCA9IHJmYzM5NjZGb3JtYXQuaW5kZXhPZignLScpICsgMTtcbiAgcmV0dXJuIHJmYzM5NjZGb3JtYXQuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpLnNwbGl0KCctJyk7XG59XG5cbmZ1bmN0aW9uIGFsbE51bWJlckdyb3Vwc0FyZUV4YWN0bHlQcmVzZW50KG1ldGFkYXRhLCBudW1iZXIsIG5vcm1hbGl6ZWRDYW5kaWRhdGUsIGZvcm1hdHRlZE51bWJlckdyb3Vwcykge1xuICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgcGFydCBvZiBjb2RlIGhhc25cXCd0IGJlZW4gcG9ydGVkJyk7XG4gIHZhciBjYW5kaWRhdGVHcm91cHMgPSBub3JtYWxpemVkQ2FuZGlkYXRlLnNwbGl0KE5PTl9ESUdJVFNfUEFUVEVSTik7IC8vIFNldCB0aGlzIHRvIHRoZSBsYXN0IGdyb3VwLCBza2lwcGluZyBpdCBpZiB0aGUgbnVtYmVyIGhhcyBhbiBleHRlbnNpb24uXG5cbiAgdmFyIGNhbmRpZGF0ZU51bWJlckdyb3VwSW5kZXggPSBudW1iZXIuaGFzRXh0ZW5zaW9uKCkgPyBjYW5kaWRhdGVHcm91cHMubGVuZ3RoIC0gMiA6IGNhbmRpZGF0ZUdyb3Vwcy5sZW5ndGggLSAxOyAvLyBGaXJzdCB3ZSBjaGVjayBpZiB0aGUgbmF0aW9uYWwgc2lnbmlmaWNhbnQgbnVtYmVyIGlzIGZvcm1hdHRlZCBhcyBhIGJsb2NrLlxuICAvLyBXZSB1c2UgY29udGFpbnMgYW5kIG5vdCBlcXVhbHMsIHNpbmNlIHRoZSBuYXRpb25hbCBzaWduaWZpY2FudCBudW1iZXIgbWF5IGJlIHByZXNlbnQgd2l0aFxuICAvLyBhIHByZWZpeCBzdWNoIGFzIGEgbmF0aW9uYWwgbnVtYmVyIHByZWZpeCwgb3IgdGhlIGNvdW50cnkgY29kZSBpdHNlbGYuXG5cbiAgaWYgKGNhbmRpZGF0ZUdyb3Vwcy5sZW5ndGggPT0gMSB8fCBjYW5kaWRhdGVHcm91cHNbY2FuZGlkYXRlTnVtYmVyR3JvdXBJbmRleF0uY29udGFpbnModXRpbC5nZXROYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKG51bWJlcikpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gU3RhcnRpbmcgZnJvbSB0aGUgZW5kLCBnbyB0aHJvdWdoIGluIHJldmVyc2UsIGV4Y2x1ZGluZyB0aGUgZmlyc3QgZ3JvdXAsIGFuZCBjaGVjayB0aGVcbiAgLy8gY2FuZGlkYXRlIGFuZCBudW1iZXIgZ3JvdXBzIGFyZSB0aGUgc2FtZS5cblxuXG4gIHZhciBmb3JtYXR0ZWROdW1iZXJHcm91cEluZGV4ID0gZm9ybWF0dGVkTnVtYmVyR3JvdXBzLmxlbmd0aCAtIDE7XG5cbiAgd2hpbGUgKGZvcm1hdHRlZE51bWJlckdyb3VwSW5kZXggPiAwICYmIGNhbmRpZGF0ZU51bWJlckdyb3VwSW5kZXggPj0gMCkge1xuICAgIGlmIChjYW5kaWRhdGVHcm91cHNbY2FuZGlkYXRlTnVtYmVyR3JvdXBJbmRleF0gIT09IGZvcm1hdHRlZE51bWJlckdyb3Vwc1tmb3JtYXR0ZWROdW1iZXJHcm91cEluZGV4XSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvcm1hdHRlZE51bWJlckdyb3VwSW5kZXgtLTtcbiAgICBjYW5kaWRhdGVOdW1iZXJHcm91cEluZGV4LS07XG4gIH0gLy8gTm93IGNoZWNrIHRoZSBmaXJzdCBncm91cC4gVGhlcmUgbWF5IGJlIGEgbmF0aW9uYWwgcHJlZml4IGF0IHRoZSBzdGFydCwgc28gd2Ugb25seSBjaGVja1xuICAvLyB0aGF0IHRoZSBjYW5kaWRhdGUgZ3JvdXAgZW5kcyB3aXRoIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIGdyb3VwLlxuXG5cbiAgcmV0dXJuIGNhbmRpZGF0ZU51bWJlckdyb3VwSW5kZXggPj0gMCAmJiAoMCwgX3V0aWwuZW5kc1dpdGgpKGNhbmRpZGF0ZUdyb3Vwc1tjYW5kaWRhdGVOdW1iZXJHcm91cEluZGV4XSwgZm9ybWF0dGVkTnVtYmVyR3JvdXBzWzBdKTtcbn1cblxuZnVuY3Rpb24gYWxsTnVtYmVyR3JvdXBzUmVtYWluR3JvdXBlZChtZXRhZGF0YSwgbnVtYmVyLCBub3JtYWxpemVkQ2FuZGlkYXRlLCBmb3JtYXR0ZWROdW1iZXJHcm91cHMpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHBhcnQgb2YgY29kZSBoYXNuXFwndCBiZWVuIHBvcnRlZCcpO1xuICB2YXIgZnJvbUluZGV4ID0gMDtcblxuICBpZiAobnVtYmVyLmdldENvdW50cnlDb2RlU291cmNlKCkgIT09IENvdW50cnlDb2RlU291cmNlLkZST01fREVGQVVMVF9DT1VOVFJZKSB7XG4gICAgLy8gRmlyc3Qgc2tpcCB0aGUgY291bnRyeSBjb2RlIGlmIHRoZSBub3JtYWxpemVkIGNhbmRpZGF0ZSBjb250YWluZWQgaXQuXG4gICAgdmFyIGNvdW50cnlDb2RlID0gU3RyaW5nKG51bWJlci5nZXRDb3VudHJ5Q29kZSgpKTtcbiAgICBmcm9tSW5kZXggPSBub3JtYWxpemVkQ2FuZGlkYXRlLmluZGV4T2YoY291bnRyeUNvZGUpICsgY291bnRyeUNvZGUubGVuZ3RoKCk7XG4gIH0gLy8gQ2hlY2sgZWFjaCBncm91cCBvZiBjb25zZWN1dGl2ZSBkaWdpdHMgYXJlIG5vdCBicm9rZW4gaW50byBzZXBhcmF0ZSBncm91cGluZ3MgaW4gdGhlXG4gIC8vIHtAY29kZSBub3JtYWxpemVkQ2FuZGlkYXRlfSBzdHJpbmcuXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hdHRlZE51bWJlckdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgIC8vIEZhaWxzIGlmIHRoZSBzdWJzdHJpbmcgb2Yge0Bjb2RlIG5vcm1hbGl6ZWRDYW5kaWRhdGV9IHN0YXJ0aW5nIGZyb20ge0Bjb2RlIGZyb21JbmRleH1cbiAgICAvLyBkb2Vzbid0IGNvbnRhaW4gdGhlIGNvbnNlY3V0aXZlIGRpZ2l0cyBpbiBmb3JtYXR0ZWROdW1iZXJHcm91cHNbaV0uXG4gICAgZnJvbUluZGV4ID0gbm9ybWFsaXplZENhbmRpZGF0ZS5pbmRleE9mKGZvcm1hdHRlZE51bWJlckdyb3Vwc1tpXSwgZnJvbUluZGV4KTtcblxuICAgIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBNb3ZlcyB7QGNvZGUgZnJvbUluZGV4fSBmb3J3YXJkLlxuXG5cbiAgICBmcm9tSW5kZXggKz0gZm9ybWF0dGVkTnVtYmVyR3JvdXBzW2ldLmxlbmd0aCgpO1xuXG4gICAgaWYgKGkgPT0gMCAmJiBmcm9tSW5kZXggPCBub3JtYWxpemVkQ2FuZGlkYXRlLmxlbmd0aCgpKSB7XG4gICAgICAvLyBXZSBhcmUgYXQgdGhlIHBvc2l0aW9uIHJpZ2h0IGFmdGVyIHRoZSBOREMuIFdlIGdldCB0aGUgcmVnaW9uIHVzZWQgZm9yIGZvcm1hdHRpbmdcbiAgICAgIC8vIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSBjb3VudHJ5IGNvZGUgaW4gdGhlIHBob25lIG51bWJlciwgcmF0aGVyIHRoYW4gdGhlIG51bWJlciBpdHNlbGYsXG4gICAgICAvLyBhcyB3ZSBkbyBub3QgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRpZmZlcmVudCBjb3VudHJpZXMgd2l0aCB0aGUgc2FtZSBjb3VudHJ5XG4gICAgICAvLyBjYWxsaW5nIGNvZGUgYW5kIHRoaXMgaXMgZmFzdGVyLlxuICAgICAgdmFyIHJlZ2lvbiA9IHV0aWwuZ2V0UmVnaW9uQ29kZUZvckNvdW50cnlDb2RlKG51bWJlci5nZXRDb3VudHJ5Q29kZSgpKTtcblxuICAgICAgaWYgKHV0aWwuZ2V0TmRkUHJlZml4Rm9yUmVnaW9uKHJlZ2lvbiwgdHJ1ZSkgIT0gbnVsbCAmJiBDaGFyYWN0ZXIuaXNEaWdpdChub3JtYWxpemVkQ2FuZGlkYXRlLmNoYXJBdChmcm9tSW5kZXgpKSkge1xuICAgICAgICAvLyBUaGlzIG1lYW5zIHRoZXJlIGlzIG5vIGZvcm1hdHRpbmcgc3ltYm9sIGFmdGVyIHRoZSBOREMuIEluIHRoaXMgY2FzZSwgd2Ugb25seVxuICAgICAgICAvLyBhY2NlcHQgdGhlIG51bWJlciBpZiB0aGVyZSBpcyBubyBmb3JtYXR0aW5nIHN5bWJvbCBhdCBhbGwgaW4gdGhlIG51bWJlciwgZXhjZXB0XG4gICAgICAgIC8vIGZvciBleHRlbnNpb25zLiBUaGlzIGlzIG9ubHkgaW1wb3J0YW50IGZvciBjb3VudHJpZXMgd2l0aCBuYXRpb25hbCBwcmVmaXhlcy5cbiAgICAgICAgdmFyIG5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIgPSB1dGlsLmdldE5hdGlvbmFsU2lnbmlmaWNhbnROdW1iZXIobnVtYmVyKTtcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zdGFydHNXaXRoKShub3JtYWxpemVkQ2FuZGlkYXRlLnNsaWNlKGZyb21JbmRleCAtIGZvcm1hdHRlZE51bWJlckdyb3Vwc1tpXS5sZW5ndGgpLCBuYXRpb25hbFNpZ25pZmljYW50TnVtYmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gVGhlIGNoZWNrIGhlcmUgbWFrZXMgc3VyZSB0aGF0IHdlIGhhdmVuJ3QgbWlzdGFrZW5seSBhbHJlYWR5IHVzZWQgdGhlIGV4dGVuc2lvbiB0b1xuICAvLyBtYXRjaCB0aGUgbGFzdCBncm91cCBvZiB0aGUgc3Vic2NyaWJlciBudW1iZXIuIE5vdGUgdGhlIGV4dGVuc2lvbiBjYW5ub3QgaGF2ZVxuICAvLyBmb3JtYXR0aW5nIGluLWJldHdlZW4gZGlnaXRzLlxuXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRDYW5kaWRhdGUuc2xpY2UoZnJvbUluZGV4KS5jb250YWlucyhudW1iZXIuZ2V0RXh0ZW5zaW9uKCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVuaWVuY3kuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9MUlVDYWNoZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTFJVQ2FjaGUuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG4vLyBBIGNhY2hlIGZvciBmcmVxdWVudGx5IHVzZWQgY291bnRyeS1zcGVjaWZpYyByZWd1bGFyIGV4cHJlc3Npb25zLiBTZXQgdG8gMzIgdG8gY292ZXIgfjItM1xuLy8gY291bnRyaWVzIGJlaW5nIHVzZWQgZm9yIHRoZSBzYW1lIGRvYyB3aXRoIH4xMCBwYXR0ZXJucyBmb3IgZWFjaCBjb3VudHJ5LiBTb21lIHBhZ2VzIHdpbGwgaGF2ZVxuLy8gYSBsb3QgbW9yZSBjb3VudHJpZXMgaW4gdXNlLCBidXQgdHlwaWNhbGx5IGZld2VyIG51bWJlcnMgZm9yIGVhY2ggc28gZXhwYW5kaW5nIHRoZSBjYWNoZSBmb3Jcbi8vIHRoYXQgdXNlLWNhc2Ugd29uJ3QgaGF2ZSBhIGxvdCBvZiBiZW5lZml0LlxudmFyIFJlZ0V4cENhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmVnRXhwQ2FjaGUoc2l6ZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWdFeHBDYWNoZSk7XG5cbiAgICB0aGlzLmNhY2hlID0gbmV3IF9MUlVDYWNoZVtcImRlZmF1bHRcIl0oc2l6ZSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmVnRXhwQ2FjaGUsIFt7XG4gICAga2V5OiBcImdldFBhdHRlcm5Gb3JSZWdFeHBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGF0dGVybkZvclJlZ0V4cChwYXR0ZXJuKSB7XG4gICAgICB2YXIgcmVnRXhwID0gdGhpcy5jYWNoZS5nZXQocGF0dGVybik7XG5cbiAgICAgIGlmICghcmVnRXhwKSB7XG4gICAgICAgIHJlZ0V4cCA9IG5ldyBSZWdFeHAoJ14nICsgcGF0dGVybik7XG4gICAgICAgIHRoaXMuY2FjaGUucHV0KHBhdHRlcm4sIHJlZ0V4cCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWdFeHA7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlZ0V4cENhY2hlO1xufSgpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFJlZ0V4cENhY2hlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVnRXhwQ2FjaGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkxFQURfQ0xBU1MgPSB2b2lkIDA7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGlzVmFsaWRDYW5kaWRhdGU7XG5cbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcblxudmFyIF91dGlsID0gcmVxdWlyZShcIi4vdXRpbC5qc1wiKTtcblxudmFyIF91dGYgPSByZXF1aXJlKFwiLi91dGYtOC5qc1wiKTtcblxuLy8gQ29weS1wYXN0ZWQgZnJvbSBgUGhvbmVOdW1iZXJNYXRjaGVyLmpzYC5cbnZhciBPUEVOSU5HX1BBUkVOUyA9IFwiKFxcXFxbXFx1RkYwOFxcdUZGM0JcIjtcbnZhciBDTE9TSU5HX1BBUkVOUyA9IFwiKVxcXFxdXFx1RkYwOVxcdUZGM0RcIjtcbnZhciBOT05fUEFSRU5TID0gXCJbXlwiLmNvbmNhdChPUEVOSU5HX1BBUkVOUykuY29uY2F0KENMT1NJTkdfUEFSRU5TLCBcIl1cIik7XG52YXIgTEVBRF9DTEFTUyA9IFwiW1wiLmNvbmNhdChPUEVOSU5HX1BBUkVOUykuY29uY2F0KF9jb25zdGFudHMuUExVU19DSEFSUywgXCJdXCIpOyAvLyBQdW5jdHVhdGlvbiB0aGF0IG1heSBiZSBhdCB0aGUgc3RhcnQgb2YgYSBwaG9uZSBudW1iZXIgLSBicmFja2V0cyBhbmQgcGx1cyBzaWducy5cblxuZXhwb3J0cy5MRUFEX0NMQVNTID0gTEVBRF9DTEFTUztcbnZhciBMRUFEX0NMQVNTX0xFQURJTkcgPSBuZXcgUmVnRXhwKCdeJyArIExFQURfQ0xBU1MpOyAvLyBMaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHBhaXJzIG9mIGJyYWNrZXRzIGluIGEgcGhvbmUgbnVtYmVyLlxuXG52YXIgQlJBQ0tFVF9QQUlSX0xJTUlUID0gKDAsIF91dGlsLmxpbWl0KSgwLCAzKTtcbi8qKlxyXG4gKiBQYXR0ZXJuIHRvIGNoZWNrIHRoYXQgYnJhY2tldHMgbWF0Y2guIE9wZW5pbmcgYnJhY2tldHMgc2hvdWxkIGJlIGNsb3NlZCB3aXRoaW4gYSBwaG9uZSBudW1iZXIuXHJcbiAqIFRoaXMgYWxzbyBjaGVja3MgdGhhdCB0aGVyZSBpcyBzb21ldGhpbmcgaW5zaWRlIHRoZSBicmFja2V0cy4gSGF2aW5nIG5vIGJyYWNrZXRzIGF0IGFsbCBpcyBhbHNvXHJcbiAqIGZpbmUuXHJcbiAqXHJcbiAqIEFuIG9wZW5pbmcgYnJhY2tldCBhdCB0aGUgYmVnaW5uaW5nIG1heSBub3QgYmUgY2xvc2VkLCBidXQgc3Vic2VxdWVudCBvbmVzIHNob3VsZCBiZS4gIEl0J3NcclxuICogYWxzbyBwb3NzaWJsZSB0aGF0IHRoZSBsZWFkaW5nIGJyYWNrZXQgd2FzIGRyb3BwZWQsIHNvIHdlIHNob3VsZG4ndCBiZSBzdXJwcmlzZWQgaWYgd2Ugc2VlIGFcclxuICogY2xvc2luZyBicmFja2V0IGZpcnN0LiBXZSBsaW1pdCB0aGUgc2V0cyBvZiBicmFja2V0cyBpbiBhIHBob25lIG51bWJlciB0byBmb3VyLlxyXG4gKi9cblxudmFyIE1BVENISU5HX0JSQUNLRVRTX0VOVElSRSA9IG5ldyBSZWdFeHAoJ14nICsgXCIoPzpbXCIgKyBPUEVOSU5HX1BBUkVOUyArIFwiXSk/XCIgKyBcIig/OlwiICsgTk9OX1BBUkVOUyArIFwiK1wiICsgXCJbXCIgKyBDTE9TSU5HX1BBUkVOUyArIFwiXSk/XCIgKyBOT05fUEFSRU5TICsgXCIrXCIgKyBcIig/OltcIiArIE9QRU5JTkdfUEFSRU5TICsgXCJdXCIgKyBOT05fUEFSRU5TICsgXCIrW1wiICsgQ0xPU0lOR19QQVJFTlMgKyBcIl0pXCIgKyBCUkFDS0VUX1BBSVJfTElNSVQgKyBOT05fUEFSRU5TICsgXCIqXCIgKyAnJCcpO1xuLyoqXHJcbiAqIE1hdGNoZXMgc3RyaW5ncyB0aGF0IGxvb2sgbGlrZSBwdWJsaWNhdGlvbiBwYWdlcy4gRXhhbXBsZTpcclxuICogPHByZT5Db21wdXRpbmcgQ29tcGxldGUgQW5zd2VycyB0byBRdWVyaWVzIGluIHRoZSBQcmVzZW5jZSBvZiBMaW1pdGVkIEFjY2VzcyBQYXR0ZXJucy5cclxuICogQ2hlbiBMaS4gVkxEQiBKLiAxMigzKTogMjExLTIyNyAoMjAwMykuPC9wcmU+XHJcbiAqXHJcbiAqIFRoZSBzdHJpbmcgXCIyMTEtMjI3ICgyMDAzKVwiIGlzIG5vdCBhIHRlbGVwaG9uZSBudW1iZXIuXHJcbiAqL1xuXG52YXIgUFVCX1BBR0VTID0gL1xcZHsxLDV9LStcXGR7MSw1fVxcc3swLDR9XFwoXFxkezEsNH0vO1xuXG5mdW5jdGlvbiBpc1ZhbGlkQ2FuZGlkYXRlKGNhbmRpZGF0ZSwgb2Zmc2V0LCB0ZXh0LCBsZW5pZW5jeSkge1xuICAvLyBDaGVjayB0aGUgY2FuZGlkYXRlIGRvZXNuJ3QgY29udGFpbiBhbnkgZm9ybWF0dGluZ1xuICAvLyB3aGljaCB3b3VsZCBpbmRpY2F0ZSB0aGF0IGl0IHJlYWxseSBpc24ndCBhIHBob25lIG51bWJlci5cbiAgaWYgKCFNQVRDSElOR19CUkFDS0VUU19FTlRJUkUudGVzdChjYW5kaWRhdGUpIHx8IFBVQl9QQUdFUy50ZXN0KGNhbmRpZGF0ZSkpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gSWYgbGVuaWVuY3kgaXMgc2V0IHRvIFZBTElEIG9yIHN0cmljdGVyLCB3ZSBhbHNvIHdhbnQgdG8gc2tpcCBudW1iZXJzIHRoYXQgYXJlIHN1cnJvdW5kZWRcbiAgLy8gYnkgTGF0aW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXJzLCB0byBza2lwIGNhc2VzIGxpa2UgYWJjODAwNTAwMTIzNCBvciA4MDA1MDAxMjM0ZGVmLlxuXG5cbiAgaWYgKGxlbmllbmN5ICE9PSAnUE9TU0lCTEUnKSB7XG4gICAgLy8gSWYgdGhlIGNhbmRpZGF0ZSBpcyBub3QgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0LFxuICAgIC8vIGFuZCBkb2VzIG5vdCBzdGFydCB3aXRoIHBob25lLW51bWJlciBwdW5jdHVhdGlvbixcbiAgICAvLyBjaGVjayB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLlxuICAgIGlmIChvZmZzZXQgPiAwICYmICFMRUFEX0NMQVNTX0xFQURJTkcudGVzdChjYW5kaWRhdGUpKSB7XG4gICAgICB2YXIgcHJldmlvdXNDaGFyID0gdGV4dFtvZmZzZXQgLSAxXTsgLy8gV2UgcmV0dXJuIG51bGwgaWYgaXQgaXMgYSBsYXRpbiBsZXR0ZXIgb3IgYW4gaW52YWxpZCBwdW5jdHVhdGlvbiBzeW1ib2wuXG5cbiAgICAgIGlmICgoMCwgX3V0Zi5pc0ludmFsaWRQdW5jdHVhdGlvblN5bWJvbCkocHJldmlvdXNDaGFyKSB8fCAoMCwgX3V0Zi5pc0xhdGluTGV0dGVyKShwcmV2aW91c0NoYXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGFzdENoYXJJbmRleCA9IG9mZnNldCArIGNhbmRpZGF0ZS5sZW5ndGg7XG5cbiAgICBpZiAobGFzdENoYXJJbmRleCA8IHRleHQubGVuZ3RoKSB7XG4gICAgICB2YXIgbmV4dENoYXIgPSB0ZXh0W2xhc3RDaGFySW5kZXhdO1xuXG4gICAgICBpZiAoKDAsIF91dGYuaXNJbnZhbGlkUHVuY3R1YXRpb25TeW1ib2wpKG5leHRDaGFyKSB8fCAoMCwgX3V0Zi5pc0xhdGluTGV0dGVyKShuZXh0Q2hhcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNWYWxpZENhbmRpZGF0ZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaXNWYWxpZFByZUNhbmRpZGF0ZTtcbi8vIE1hdGNoZXMgc3RyaW5ncyB0aGF0IGxvb2sgbGlrZSBkYXRlcyB1c2luZyBcIi9cIiBhcyBhIHNlcGFyYXRvci5cbi8vIEV4YW1wbGVzOiAzLzEwLzIwMTEsIDMxLzEwLzk2IG9yIDA4LzMxLzk1LlxudmFyIFNMQVNIX1NFUEFSQVRFRF9EQVRFUyA9IC8oPzooPzpbMC0zXT9cXGRcXC9bMDFdP1xcZCl8KD86WzAxXT9cXGRcXC9bMC0zXT9cXGQpKVxcLyg/OlsxMl1cXGQpP1xcZHsyfS87IC8vIE1hdGNoZXMgdGltZXN0YW1wcy5cbi8vIEV4YW1wbGVzOiBcIjIwMTItMDEtMDIgMDg6MDBcIi5cbi8vIE5vdGUgdGhhdCB0aGUgcmVnLWV4IGRvZXMgbm90IGluY2x1ZGUgdGhlXG4vLyB0cmFpbGluZyBcIjpcXGRcXGRcIiAtLSB0aGF0IGlzIGNvdmVyZWQgYnkgVElNRV9TVEFNUFNfU1VGRklYLlxuXG52YXIgVElNRV9TVEFNUFMgPSAvWzEyXVxcZHszfVstL10/WzAxXVxcZFstL10/WzAtM11cXGQgK1swLTJdXFxkJC87XG52YXIgVElNRV9TVEFNUFNfU1VGRklYX0xFQURJTkcgPSAvXjpbMC01XVxcZC87XG5cbmZ1bmN0aW9uIGlzVmFsaWRQcmVDYW5kaWRhdGUoY2FuZGlkYXRlLCBvZmZzZXQsIHRleHQpIHtcbiAgLy8gU2tpcCBhIG1hdGNoIHRoYXQgaXMgbW9yZSBsaWtlbHkgdG8gYmUgYSBkYXRlLlxuICBpZiAoU0xBU0hfU0VQQVJBVEVEX0RBVEVTLnRlc3QoY2FuZGlkYXRlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBTa2lwIHBvdGVudGlhbCB0aW1lLXN0YW1wcy5cblxuXG4gIGlmIChUSU1FX1NUQU1QUy50ZXN0KGNhbmRpZGF0ZSkpIHtcbiAgICB2YXIgZm9sbG93aW5nVGV4dCA9IHRleHQuc2xpY2Uob2Zmc2V0ICsgY2FuZGlkYXRlLmxlbmd0aCk7XG5cbiAgICBpZiAoVElNRV9TVEFNUFNfU1VGRklYX0xFQURJTkcudGVzdChmb2xsb3dpbmdUZXh0KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNWYWxpZFByZUNhbmRpZGF0ZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbWF0Y2hQaG9uZU51bWJlclN0cmluZ0FnYWluc3RQaG9uZU51bWJlcjtcblxudmFyIF9wYXJzZVBob25lTnVtYmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vcGFyc2VQaG9uZU51bWJlci5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG4vKipcclxuICogTWF0Y2hlcyBhIHBob25lIG51bWJlciBvYmplY3QgYWdhaW5zdCBhIHBob25lIG51bWJlciBzdHJpbmcuXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gcGhvbmVOdW1iZXJTdHJpbmdcclxuICogQHBhcmFtICB7UGhvbmVOdW1iZXJ9IHBob25lTnVtYmVyXHJcbiAqIEBwYXJhbSAge29iamVjdH0gbWV0YWRhdGEg4oCUIE1ldGFkYXRhIEpTT05cclxuICogQHJldHVybiB7J0lOVkFMSURfTlVNQkVSJ3wnTk9fTUFUQ0gnfCdTSE9SVF9OU05fTUFUQ0gnfCdOU05fTUFUQ0gnfCdFWEFDVF9NQVRDSCd9XHJcbiAqL1xuZnVuY3Rpb24gbWF0Y2hQaG9uZU51bWJlclN0cmluZ0FnYWluc3RQaG9uZU51bWJlcihwaG9uZU51bWJlclN0cmluZywgcGhvbmVOdW1iZXIsIG1ldGFkYXRhKSB7XG4gIC8vIFBhcnNlIGBwaG9uZU51bWJlclN0cmluZ2AuXG4gIHZhciBwaG9uZU51bWJlclN0cmluZ0NvbnRhaW5zQ2FsbGluZ0NvZGUgPSB0cnVlO1xuICB2YXIgcGFyc2VkUGhvbmVOdW1iZXIgPSAoMCwgX3BhcnNlUGhvbmVOdW1iZXJbXCJkZWZhdWx0XCJdKShwaG9uZU51bWJlclN0cmluZywgbWV0YWRhdGEpO1xuXG4gIGlmICghcGFyc2VkUGhvbmVOdW1iZXIpIHtcbiAgICAvLyBJZiBgcGhvbmVOdW1iZXJTdHJpbmdgIGRpZG4ndCBjb250YWluIGEgY291bnRyeSBjYWxsaW5nIGNvZGVcbiAgICAvLyB0aGVuIHN1YnN0aXR1dGUgaXQgd2l0aCB0aGUgYHBob25lTnVtYmVyYCdzIGNvdW50cnkgY2FsbGluZyBjb2RlLlxuICAgIHBob25lTnVtYmVyU3RyaW5nQ29udGFpbnNDYWxsaW5nQ29kZSA9IGZhbHNlO1xuICAgIHBhcnNlZFBob25lTnVtYmVyID0gKDAsIF9wYXJzZVBob25lTnVtYmVyW1wiZGVmYXVsdFwiXSkocGhvbmVOdW1iZXJTdHJpbmcsIHtcbiAgICAgIGRlZmF1bHRDYWxsaW5nQ29kZTogcGhvbmVOdW1iZXIuY291bnRyeUNhbGxpbmdDb2RlXG4gICAgfSwgbWV0YWRhdGEpO1xuICB9XG5cbiAgaWYgKCFwYXJzZWRQaG9uZU51bWJlcikge1xuICAgIHJldHVybiAnSU5WQUxJRF9OVU1CRVInO1xuICB9IC8vIENoZWNrIHRoYXQgdGhlIGV4dGVuc2lvbnMgbWF0Y2guXG5cblxuICBpZiAocGhvbmVOdW1iZXIuZXh0KSB7XG4gICAgaWYgKHBhcnNlZFBob25lTnVtYmVyLmV4dCAhPT0gcGhvbmVOdW1iZXIuZXh0KSB7XG4gICAgICByZXR1cm4gJ05PX01BVENIJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHBhcnNlZFBob25lTnVtYmVyLmV4dCkge1xuICAgICAgcmV0dXJuICdOT19NQVRDSCc7XG4gICAgfVxuICB9IC8vIENoZWNrIHRoYXQgY291bnRyeSBjYWxsaW5nIGNvZGVzIG1hdGNoLlxuXG5cbiAgaWYgKHBob25lTnVtYmVyU3RyaW5nQ29udGFpbnNDYWxsaW5nQ29kZSkge1xuICAgIGlmIChwaG9uZU51bWJlci5jb3VudHJ5Q2FsbGluZ0NvZGUgIT09IHBhcnNlZFBob25lTnVtYmVyLmNvdW50cnlDYWxsaW5nQ29kZSkge1xuICAgICAgcmV0dXJuICdOT19NQVRDSCc7XG4gICAgfVxuICB9IC8vIENoZWNrIGlmIHRoZSB3aG9sZSBudW1iZXJzIG1hdGNoLlxuXG5cbiAgaWYgKHBob25lTnVtYmVyLm51bWJlciA9PT0gcGFyc2VkUGhvbmVOdW1iZXIubnVtYmVyKSB7XG4gICAgaWYgKHBob25lTnVtYmVyU3RyaW5nQ29udGFpbnNDYWxsaW5nQ29kZSkge1xuICAgICAgcmV0dXJuICdFWEFDVF9NQVRDSCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnTlNOX01BVENIJztcbiAgICB9XG4gIH0gLy8gQ2hlY2sgaWYgb25lIG5hdGlvbmFsIG51bWJlciBpcyBhIFwic3VmZml4XCIgb2YgdGhlIG90aGVyLlxuXG5cbiAgaWYgKHBob25lTnVtYmVyLm5hdGlvbmFsTnVtYmVyLmluZGV4T2YocGFyc2VkUGhvbmVOdW1iZXIubmF0aW9uYWxOdW1iZXIpID09PSAwIHx8IHBhcnNlZFBob25lTnVtYmVyLm5hdGlvbmFsTnVtYmVyLmluZGV4T2YocGhvbmVOdW1iZXIubmF0aW9uYWxOdW1iZXIpID09PSAwKSB7XG4gICAgLy8gXCJBIFNIT1JUX05TTl9NQVRDSCBvY2N1cnMgaWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJlY2F1c2Ugb2YgdGhlXG4gICAgLy8gIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgYW4gJ0l0YWxpYW4gbGVhZGluZyB6ZXJvJywgdGhlIHByZXNlbmNlIG9yXG4gICAgLy8gIGFic2VuY2Ugb2YgYW4gZXh0ZW5zaW9uLCBvciBvbmUgTlNOIGJlaW5nIGEgc2hvcnRlciB2YXJpYW50IG9mIHRoZVxuICAgIC8vICBvdGhlci5cIlxuICAgIHJldHVybiAnU0hPUlRfTlNOX01BVENIJztcbiAgfVxuXG4gIHJldHVybiAnTk9fTUFUQ0gnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0Y2hQaG9uZU51bWJlclN0cmluZ0FnYWluc3RQaG9uZU51bWJlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gcGFyc2VQcmVDYW5kaWRhdGU7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWwuanNcIik7XG5cbi8vIFJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBjaGFyYWN0ZXJzIHR5cGljYWxseSB1c2VkIHRvIHN0YXJ0IGEgc2Vjb25kIHBob25lIG51bWJlciBmb3IgdGhlIHB1cnBvc2VzXG4vLyBvZiBwYXJzaW5nLiBUaGlzIGFsbG93cyB1cyB0byBzdHJpcCBvZmYgcGFydHMgb2YgdGhlIG51bWJlciB0aGF0IGFyZSBhY3R1YWxseSB0aGUgc3RhcnQgb2Zcbi8vIGFub3RoZXIgbnVtYmVyLCBzdWNoIGFzIGZvcjogKDUzMCkgNTgzLTY5ODUgeDMwMi94MjMwMyAtPiB0aGUgc2Vjb25kIGV4dGVuc2lvbiBoZXJlIG1ha2VzIHRoaXNcbi8vIGFjdHVhbGx5IHR3byBwaG9uZSBudW1iZXJzLCAoNTMwKSA1ODMtNjk4NSB4MzAyIGFuZCAoNTMwKSA1ODMtNjk4NSB4MjMwMy4gV2UgcmVtb3ZlIHRoZSBzZWNvbmRcbi8vIGV4dGVuc2lvbiBzbyB0aGF0IHRoZSBmaXJzdCBudW1iZXIgaXMgcGFyc2VkIGNvcnJlY3RseS5cbi8vXG4vLyBNYXRjaGVzIGEgc2xhc2ggKFxcIG9yIC8pIGZvbGxvd2VkIGJ5IGEgc3BhY2UgZm9sbG93ZWQgYnkgYW4gYHhgLlxuLy9cbnZhciBTRUNPTkRfTlVNQkVSX1NUQVJUX1BBVFRFUk4gPSAvW1xcXFwvXSAqeC87XG5cbmZ1bmN0aW9uIHBhcnNlUHJlQ2FuZGlkYXRlKGNhbmRpZGF0ZSkge1xuICAvLyBDaGVjayBmb3IgZXh0cmEgbnVtYmVycyBhdCB0aGUgZW5kLlxuICAvLyBUT0RPOiBUaGlzIGlzIHRoZSBwbGFjZSB0byBzdGFydCB3aGVuIHRyeWluZyB0byBzdXBwb3J0IGV4dHJhY3Rpb24gb2YgbXVsdGlwbGUgcGhvbmUgbnVtYmVyXG4gIC8vIGZyb20gc3BsaXQgbm90YXRpb25zICgrNDEgNzkgMTIzIDQ1IDY3IC8gNjgpLlxuICByZXR1cm4gKDAsIF91dGlsLnRyaW1BZnRlckZpcnN0TWF0Y2gpKFNFQ09ORF9OVU1CRVJfU1RBUlRfUEFUVEVSTiwgY2FuZGlkYXRlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlUHJlQ2FuZGlkYXRlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5fcE4gPSBleHBvcnRzLl9wTCA9IGV4cG9ydHMuUFogPSB2b2lkIDA7XG5leHBvcnRzLmlzSW52YWxpZFB1bmN0dWF0aW9uU3ltYm9sID0gaXNJbnZhbGlkUHVuY3R1YXRpb25TeW1ib2w7XG5leHBvcnRzLmlzTGF0aW5MZXR0ZXIgPSBpc0xhdGluTGV0dGVyO1xuZXhwb3J0cy5wWiA9IGV4cG9ydHMucE5kID0gdm9pZCAwO1xuLy8gSmF2YXNjcmlwdCBkb2Vzbid0IHN1cHBvcnQgVVRGLTggcmVndWxhciBleHByZXNzaW9ucy5cbi8vIFNvIG1pbWlja2luZyB0aGVtIGhlcmUuXG4vLyBDb3B5LXBhc3RlZCBmcm9tIGBQaG9uZU51bWJlck1hdGNoZXIuanNgLlxuXG4vKipcclxuICogXCJcXHB7Wn1cIiBpcyBhbnkga2luZCBvZiB3aGl0ZXNwYWNlIG9yIGludmlzaWJsZSBzZXBhcmF0b3IgKFwiU2VwYXJhdG9yXCIpLlxyXG4gKiBodHRwOi8vd3d3LnJlZ3VsYXItZXhwcmVzc2lvbnMuaW5mby91bmljb2RlLmh0bWxcclxuICogXCJcXFB7Wn1cIiBpcyB0aGUgcmV2ZXJzZSBvZiBcIlxccHtafVwiLlxyXG4gKiBcIlxccHtOfVwiIGlzIGFueSBraW5kIG9mIG51bWVyaWMgY2hhcmFjdGVyIGluIGFueSBzY3JpcHQgKFwiTnVtYmVyXCIpLlxyXG4gKiBcIlxccHtOZH1cIiBpcyBhIGRpZ2l0IHplcm8gdGhyb3VnaCBuaW5lIGluIGFueSBzY3JpcHQgZXhjZXB0IFwiaWRlb2dyYXBoaWMgc2NyaXB0c1wiIChcIkRlY2ltYWxfRGlnaXRfTnVtYmVyXCIpLlxyXG4gKiBcIlxccHtTY31cIiBpcyBhIGN1cnJlbmN5IHN5bWJvbCAoXCJDdXJyZW5jeV9TeW1ib2xcIikuXHJcbiAqIFwiXFxwe0x9XCIgaXMgYW55IGtpbmQgb2YgbGV0dGVyIGZyb20gYW55IGxhbmd1YWdlIChcIkxldHRlclwiKS5cclxuICogXCJcXHB7TW59XCIgaXMgXCJub24tc3BhY2luZyBtYXJrXCIuXHJcbiAqXHJcbiAqIEphdmFzY3JpcHQgZG9lc24ndCBzdXBwb3J0IFVuaWNvZGUgUmVndWxhciBFeHByZXNzaW9uc1xyXG4gKiBzbyBzdWJzdGl0dXRpbmcgaXQgd2l0aCB0aGlzIGV4cGxpY2l0IHNldCBvZiBjaGFyYWN0ZXJzLlxyXG4gKlxyXG4gKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMzIxMDE5NC9qYXZhc2NyaXB0LXJlZ2V4LWVxdWl2YWxlbnQtb2YtYS16YS16LXVzaW5nLXBsXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxiZXJuZHQvYmFiZWwtcGx1Z2luLXV0Zi04LXJlZ2V4L2Jsb2IvbWFzdGVyL3NyYy90cmFuc2Zvcm1lci5qc1xyXG4gKi9cbnZhciBfcFogPSBcIiBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMC1cXHUyMDBBXFx1MjAyOFxcdTIwMjlcXHUyMDJGXFx1MjA1RlxcdTMwMDBcIjtcbnZhciBwWiA9IFwiW1wiLmNvbmNhdChfcFosIFwiXVwiKTtcbmV4cG9ydHMucFogPSBwWjtcbnZhciBQWiA9IFwiW15cIi5jb25jYXQoX3BaLCBcIl1cIik7XG5leHBvcnRzLlBaID0gUFo7XG52YXIgX3BOID0gXCIwLTlcXHhCMlxceEIzXFx4QjlcXHhCQy1cXHhCRVxcdTA2NjAtXFx1MDY2OVxcdTA2RjAtXFx1MDZGOVxcdTA3QzAtXFx1MDdDOVxcdTA5NjYtXFx1MDk2RlxcdTA5RTYtXFx1MDlFRlxcdTA5RjQtXFx1MDlGOVxcdTBBNjYtXFx1MEE2RlxcdTBBRTYtXFx1MEFFRlxcdTBCNjYtXFx1MEI2RlxcdTBCNzItXFx1MEI3N1xcdTBCRTYtXFx1MEJGMlxcdTBDNjYtXFx1MEM2RlxcdTBDNzgtXFx1MEM3RVxcdTBDRTYtXFx1MENFRlxcdTBENjYtXFx1MEQ3NVxcdTBFNTAtXFx1MEU1OVxcdTBFRDAtXFx1MEVEOVxcdTBGMjAtXFx1MEYzM1xcdTEwNDAtXFx1MTA0OVxcdTEwOTAtXFx1MTA5OVxcdTEzNjktXFx1MTM3Q1xcdTE2RUUtXFx1MTZGMFxcdTE3RTAtXFx1MTdFOVxcdTE3RjAtXFx1MTdGOVxcdTE4MTAtXFx1MTgxOVxcdTE5NDYtXFx1MTk0RlxcdTE5RDAtXFx1MTlEQVxcdTFBODAtXFx1MUE4OVxcdTFBOTAtXFx1MUE5OVxcdTFCNTAtXFx1MUI1OVxcdTFCQjAtXFx1MUJCOVxcdTFDNDAtXFx1MUM0OVxcdTFDNTAtXFx1MUM1OVxcdTIwNzBcXHUyMDc0LVxcdTIwNzlcXHUyMDgwLVxcdTIwODlcXHUyMTUwLVxcdTIxODJcXHUyMTg1LVxcdTIxODlcXHUyNDYwLVxcdTI0OUJcXHUyNEVBLVxcdTI0RkZcXHUyNzc2LVxcdTI3OTNcXHUyQ0ZEXFx1MzAwN1xcdTMwMjEtXFx1MzAyOVxcdTMwMzgtXFx1MzAzQVxcdTMxOTItXFx1MzE5NVxcdTMyMjAtXFx1MzIyOVxcdTMyNDgtXFx1MzI0RlxcdTMyNTEtXFx1MzI1RlxcdTMyODAtXFx1MzI4OVxcdTMyQjEtXFx1MzJCRlxcdUE2MjAtXFx1QTYyOVxcdUE2RTYtXFx1QTZFRlxcdUE4MzAtXFx1QTgzNVxcdUE4RDAtXFx1QThEOVxcdUE5MDAtXFx1QTkwOVxcdUE5RDAtXFx1QTlEOVxcdUFBNTAtXFx1QUE1OVxcdUFCRjAtXFx1QUJGOVxcdUZGMTAtXFx1RkYxOVwiOyAvLyBjb25zdCBwTiA9IGBbJHtfcE59XWBcblxuZXhwb3J0cy5fcE4gPSBfcE47XG52YXIgX3BOZCA9IFwiMC05XFx1MDY2MC1cXHUwNjY5XFx1MDZGMC1cXHUwNkY5XFx1MDdDMC1cXHUwN0M5XFx1MDk2Ni1cXHUwOTZGXFx1MDlFNi1cXHUwOUVGXFx1MEE2Ni1cXHUwQTZGXFx1MEFFNi1cXHUwQUVGXFx1MEI2Ni1cXHUwQjZGXFx1MEJFNi1cXHUwQkVGXFx1MEM2Ni1cXHUwQzZGXFx1MENFNi1cXHUwQ0VGXFx1MEQ2Ni1cXHUwRDZGXFx1MEU1MC1cXHUwRTU5XFx1MEVEMC1cXHUwRUQ5XFx1MEYyMC1cXHUwRjI5XFx1MTA0MC1cXHUxMDQ5XFx1MTA5MC1cXHUxMDk5XFx1MTdFMC1cXHUxN0U5XFx1MTgxMC1cXHUxODE5XFx1MTk0Ni1cXHUxOTRGXFx1MTlEMC1cXHUxOUQ5XFx1MUE4MC1cXHUxQTg5XFx1MUE5MC1cXHUxQTk5XFx1MUI1MC1cXHUxQjU5XFx1MUJCMC1cXHUxQkI5XFx1MUM0MC1cXHUxQzQ5XFx1MUM1MC1cXHUxQzU5XFx1QTYyMC1cXHVBNjI5XFx1QThEMC1cXHVBOEQ5XFx1QTkwMC1cXHVBOTA5XFx1QTlEMC1cXHVBOUQ5XFx1QUE1MC1cXHVBQTU5XFx1QUJGMC1cXHVBQkY5XFx1RkYxMC1cXHVGRjE5XCI7XG52YXIgcE5kID0gXCJbXCIuY29uY2F0KF9wTmQsIFwiXVwiKTtcbmV4cG9ydHMucE5kID0gcE5kO1xudmFyIF9wTCA9IFwiQS1aYS16XFx4QUFcXHhCNVxceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDhBLVxcdTA1MjdcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMC1cXHUwNjRBXFx1MDY2RVxcdTA2NkZcXHUwNjcxLVxcdTA2RDNcXHUwNkQ1XFx1MDZFNVxcdTA2RTZcXHUwNkVFXFx1MDZFRlxcdTA2RkEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwXFx1MDcxMi1cXHUwNzJGXFx1MDc0RC1cXHUwN0E1XFx1MDdCMVxcdTA3Q0EtXFx1MDdFQVxcdTA3RjRcXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgxNVxcdTA4MUFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4QTBcXHUwOEEyLVxcdTA4QUNcXHUwOTA0LVxcdTA5MzlcXHUwOTNEXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk3N1xcdTA5NzktXFx1MDk3RlxcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkRcXHUwOUNFXFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTFcXHUwOUYwXFx1MDlGMVxcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNzItXFx1MEE3NFxcdTBBODUtXFx1MEE4RFxcdTBBOEYtXFx1MEE5MVxcdTBBOTMtXFx1MEFBOFxcdTBBQUEtXFx1MEFCMFxcdTBBQjJcXHUwQUIzXFx1MEFCNS1cXHUwQUI5XFx1MEFCRFxcdTBBRDBcXHUwQUUwXFx1MEFFMVxcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNEXFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjcxXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkQwXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzMzXFx1MEMzNS1cXHUwQzM5XFx1MEMzRFxcdTBDNThcXHUwQzU5XFx1MEM2MFxcdTBDNjFcXHUwQzg1LVxcdTBDOENcXHUwQzhFLVxcdTBDOTBcXHUwQzkyLVxcdTBDQThcXHUwQ0FBLVxcdTBDQjNcXHUwQ0I1LVxcdTBDQjlcXHUwQ0JEXFx1MENERVxcdTBDRTBcXHUwQ0UxXFx1MENGMVxcdTBDRjJcXHUwRDA1LVxcdTBEMENcXHUwRDBFLVxcdTBEMTBcXHUwRDEyLVxcdTBEM0FcXHUwRDNEXFx1MEQ0RVxcdTBENjBcXHUwRDYxXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBFMDEtXFx1MEUzMFxcdTBFMzJcXHUwRTMzXFx1MEU0MC1cXHUwRTQ2XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjBcXHUwRUIyXFx1MEVCM1xcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGNDAtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGODgtXFx1MEY4Q1xcdTEwMDAtXFx1MTAyQVxcdTEwM0ZcXHUxMDUwLVxcdTEwNTVcXHUxMDVBLVxcdTEwNURcXHUxMDYxXFx1MTA2NVxcdTEwNjZcXHUxMDZFLVxcdTEwNzBcXHUxMDc1LVxcdTEwODFcXHUxMDhFXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxMVxcdTE3MjAtXFx1MTczMVxcdTE3NDAtXFx1MTc1MVxcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3ODAtXFx1MTdCM1xcdTE3RDdcXHUxN0RDXFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxOEE4XFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxQ1xcdTE5NTAtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QzEtXFx1MTlDN1xcdTFBMDAtXFx1MUExNlxcdTFBMjAtXFx1MUE1NFxcdTFBQTdcXHUxQjA1LVxcdTFCMzNcXHUxQjQ1LVxcdTFCNEJcXHUxQjgzLVxcdTFCQTBcXHUxQkFFXFx1MUJBRlxcdTFCQkEtXFx1MUJFNVxcdTFDMDAtXFx1MUMyM1xcdTFDNEQtXFx1MUM0RlxcdTFDNUEtXFx1MUM3RFxcdTFDRTktXFx1MUNFQ1xcdTFDRUUtXFx1MUNGMVxcdTFDRjVcXHUxQ0Y2XFx1MUQwMC1cXHUxREJGXFx1MUUwMC1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOS1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTJEXFx1MjEyRi1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxODNcXHUyMTg0XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0VFXFx1MkNGMlxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDgwLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyRTJGXFx1MzAwNVxcdTMwMDZcXHUzMDMxLVxcdTMwMzVcXHUzMDNCXFx1MzAzQ1xcdTMwNDEtXFx1MzA5NlxcdTMwOUQtXFx1MzA5RlxcdTMwQTEtXFx1MzBGQVxcdTMwRkMtXFx1MzBGRlxcdTMxMDUtXFx1MzEyRFxcdTMxMzEtXFx1MzE4RVxcdTMxQTAtXFx1MzFCQVxcdTMxRjAtXFx1MzFGRlxcdTM0MDAtXFx1NERCNVxcdTRFMDAtXFx1OUZDQ1xcdUEwMDAtXFx1QTQ4Q1xcdUE0RDAtXFx1QTRGRFxcdUE1MDAtXFx1QTYwQ1xcdUE2MTAtXFx1QTYxRlxcdUE2MkFcXHVBNjJCXFx1QTY0MC1cXHVBNjZFXFx1QTY3Ri1cXHVBNjk3XFx1QTZBMC1cXHVBNkU1XFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBNzhFXFx1QTc5MC1cXHVBNzkzXFx1QTdBMC1cXHVBN0FBXFx1QTdGOC1cXHVBODAxXFx1QTgwMy1cXHVBODA1XFx1QTgwNy1cXHVBODBBXFx1QTgwQy1cXHVBODIyXFx1QTg0MC1cXHVBODczXFx1QTg4Mi1cXHVBOEIzXFx1QThGMi1cXHVBOEY3XFx1QThGQlxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE4MC1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQkMwLVxcdUFCRTJcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjIxLVxcdUZGM0FcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENcIjtcbmV4cG9ydHMuX3BMID0gX3BMO1xudmFyIHBMID0gXCJbXCIuY29uY2F0KF9wTCwgXCJdXCIpO1xudmFyIHBMX3JlZ2V4cCA9IG5ldyBSZWdFeHAocEwpO1xudmFyIF9wU2MgPSBcIiRcXHhBMi1cXHhBNVxcdTA1OEZcXHUwNjBCXFx1MDlGMlxcdTA5RjNcXHUwOUZCXFx1MEFGMVxcdTBCRjlcXHUwRTNGXFx1MTdEQlxcdTIwQTAtXFx1MjBCOVxcdUE4MzhcXHVGREZDXFx1RkU2OVxcdUZGMDRcXHVGRkUwXFx1RkZFMVxcdUZGRTVcXHVGRkU2XCI7XG52YXIgcFNjID0gXCJbXCIuY29uY2F0KF9wU2MsIFwiXVwiKTtcbnZhciBwU2NfcmVnZXhwID0gbmV3IFJlZ0V4cChwU2MpO1xudmFyIF9wTW4gPSBcIlxcdTAzMDAtXFx1MDM2RlxcdTA0ODMtXFx1MDQ4N1xcdTA1OTEtXFx1MDVCRFxcdTA1QkZcXHUwNUMxXFx1MDVDMlxcdTA1QzRcXHUwNUM1XFx1MDVDN1xcdTA2MTAtXFx1MDYxQVxcdTA2NEItXFx1MDY1RlxcdTA2NzBcXHUwNkQ2LVxcdTA2RENcXHUwNkRGLVxcdTA2RTRcXHUwNkU3XFx1MDZFOFxcdTA2RUEtXFx1MDZFRFxcdTA3MTFcXHUwNzMwLVxcdTA3NEFcXHUwN0E2LVxcdTA3QjBcXHUwN0VCLVxcdTA3RjNcXHUwODE2LVxcdTA4MTlcXHUwODFCLVxcdTA4MjNcXHUwODI1LVxcdTA4MjdcXHUwODI5LVxcdTA4MkRcXHUwODU5LVxcdTA4NUJcXHUwOEU0LVxcdTA4RkVcXHUwOTAwLVxcdTA5MDJcXHUwOTNBXFx1MDkzQ1xcdTA5NDEtXFx1MDk0OFxcdTA5NERcXHUwOTUxLVxcdTA5NTdcXHUwOTYyXFx1MDk2M1xcdTA5ODFcXHUwOUJDXFx1MDlDMS1cXHUwOUM0XFx1MDlDRFxcdTA5RTJcXHUwOUUzXFx1MEEwMVxcdTBBMDJcXHUwQTNDXFx1MEE0MVxcdTBBNDJcXHUwQTQ3XFx1MEE0OFxcdTBBNEItXFx1MEE0RFxcdTBBNTFcXHUwQTcwXFx1MEE3MVxcdTBBNzVcXHUwQTgxXFx1MEE4MlxcdTBBQkNcXHUwQUMxLVxcdTBBQzVcXHUwQUM3XFx1MEFDOFxcdTBBQ0RcXHUwQUUyXFx1MEFFM1xcdTBCMDFcXHUwQjNDXFx1MEIzRlxcdTBCNDEtXFx1MEI0NFxcdTBCNERcXHUwQjU2XFx1MEI2MlxcdTBCNjNcXHUwQjgyXFx1MEJDMFxcdTBCQ0RcXHUwQzNFLVxcdTBDNDBcXHUwQzQ2LVxcdTBDNDhcXHUwQzRBLVxcdTBDNERcXHUwQzU1XFx1MEM1NlxcdTBDNjJcXHUwQzYzXFx1MENCQ1xcdTBDQkZcXHUwQ0M2XFx1MENDQ1xcdTBDQ0RcXHUwQ0UyXFx1MENFM1xcdTBENDEtXFx1MEQ0NFxcdTBENERcXHUwRDYyXFx1MEQ2M1xcdTBEQ0FcXHUwREQyLVxcdTBERDRcXHUwREQ2XFx1MEUzMVxcdTBFMzQtXFx1MEUzQVxcdTBFNDctXFx1MEU0RVxcdTBFQjFcXHUwRUI0LVxcdTBFQjlcXHUwRUJCXFx1MEVCQ1xcdTBFQzgtXFx1MEVDRFxcdTBGMThcXHUwRjE5XFx1MEYzNVxcdTBGMzdcXHUwRjM5XFx1MEY3MS1cXHUwRjdFXFx1MEY4MC1cXHUwRjg0XFx1MEY4NlxcdTBGODdcXHUwRjhELVxcdTBGOTdcXHUwRjk5LVxcdTBGQkNcXHUwRkM2XFx1MTAyRC1cXHUxMDMwXFx1MTAzMi1cXHUxMDM3XFx1MTAzOVxcdTEwM0FcXHUxMDNEXFx1MTAzRVxcdTEwNThcXHUxMDU5XFx1MTA1RS1cXHUxMDYwXFx1MTA3MS1cXHUxMDc0XFx1MTA4MlxcdTEwODVcXHUxMDg2XFx1MTA4RFxcdTEwOURcXHUxMzVELVxcdTEzNUZcXHUxNzEyLVxcdTE3MTRcXHUxNzMyLVxcdTE3MzRcXHUxNzUyXFx1MTc1M1xcdTE3NzJcXHUxNzczXFx1MTdCNFxcdTE3QjVcXHUxN0I3LVxcdTE3QkRcXHUxN0M2XFx1MTdDOS1cXHUxN0QzXFx1MTdERFxcdTE4MEItXFx1MTgwRFxcdTE4QTlcXHUxOTIwLVxcdTE5MjJcXHUxOTI3XFx1MTkyOFxcdTE5MzJcXHUxOTM5LVxcdTE5M0JcXHUxQTE3XFx1MUExOFxcdTFBNTZcXHUxQTU4LVxcdTFBNUVcXHUxQTYwXFx1MUE2MlxcdTFBNjUtXFx1MUE2Q1xcdTFBNzMtXFx1MUE3Q1xcdTFBN0ZcXHUxQjAwLVxcdTFCMDNcXHUxQjM0XFx1MUIzNi1cXHUxQjNBXFx1MUIzQ1xcdTFCNDJcXHUxQjZCLVxcdTFCNzNcXHUxQjgwXFx1MUI4MVxcdTFCQTItXFx1MUJBNVxcdTFCQThcXHUxQkE5XFx1MUJBQlxcdTFCRTZcXHUxQkU4XFx1MUJFOVxcdTFCRURcXHUxQkVGLVxcdTFCRjFcXHUxQzJDLVxcdTFDMzNcXHUxQzM2XFx1MUMzN1xcdTFDRDAtXFx1MUNEMlxcdTFDRDQtXFx1MUNFMFxcdTFDRTItXFx1MUNFOFxcdTFDRURcXHUxQ0Y0XFx1MURDMC1cXHUxREU2XFx1MURGQy1cXHUxREZGXFx1MjBEMC1cXHUyMERDXFx1MjBFMVxcdTIwRTUtXFx1MjBGMFxcdTJDRUYtXFx1MkNGMVxcdTJEN0ZcXHUyREUwLVxcdTJERkZcXHUzMDJBLVxcdTMwMkRcXHUzMDk5XFx1MzA5QVxcdUE2NkZcXHVBNjc0LVxcdUE2N0RcXHVBNjlGXFx1QTZGMFxcdUE2RjFcXHVBODAyXFx1QTgwNlxcdUE4MEJcXHVBODI1XFx1QTgyNlxcdUE4QzRcXHVBOEUwLVxcdUE4RjFcXHVBOTI2LVxcdUE5MkRcXHVBOTQ3LVxcdUE5NTFcXHVBOTgwLVxcdUE5ODJcXHVBOUIzXFx1QTlCNi1cXHVBOUI5XFx1QTlCQ1xcdUFBMjktXFx1QUEyRVxcdUFBMzFcXHVBQTMyXFx1QUEzNVxcdUFBMzZcXHVBQTQzXFx1QUE0Q1xcdUFBQjBcXHVBQUIyLVxcdUFBQjRcXHVBQUI3XFx1QUFCOFxcdUFBQkVcXHVBQUJGXFx1QUFDMVxcdUFBRUNcXHVBQUVEXFx1QUFGNlxcdUFCRTVcXHVBQkU4XFx1QUJFRFxcdUZCMUVcXHVGRTAwLVxcdUZFMEZcXHVGRTIwLVxcdUZFMjZcIjtcbnZhciBwTW4gPSBcIltcIi5jb25jYXQoX3BNbiwgXCJdXCIpO1xudmFyIHBNbl9yZWdleHAgPSBuZXcgUmVnRXhwKHBNbik7XG52YXIgX0luQmFzaWNfTGF0aW4gPSBcIlxcMC1cXHg3RlwiO1xudmFyIF9JbkxhdGluXzFfU3VwcGxlbWVudCA9IFwiXFx4ODAtXFx4RkZcIjtcbnZhciBfSW5MYXRpbl9FeHRlbmRlZF9BID0gXCJcXHUwMTAwLVxcdTAxN0ZcIjtcbnZhciBfSW5MYXRpbl9FeHRlbmRlZF9BZGRpdGlvbmFsID0gXCJcXHUxRTAwLVxcdTFFRkZcIjtcbnZhciBfSW5MYXRpbl9FeHRlbmRlZF9CID0gXCJcXHUwMTgwLVxcdTAyNEZcIjtcbnZhciBfSW5Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MgPSBcIlxcdTAzMDAtXFx1MDM2RlwiO1xudmFyIGxhdGluTGV0dGVyUmVnZXhwID0gbmV3IFJlZ0V4cCgnWycgKyBfSW5CYXNpY19MYXRpbiArIF9JbkxhdGluXzFfU3VwcGxlbWVudCArIF9JbkxhdGluX0V4dGVuZGVkX0EgKyBfSW5MYXRpbl9FeHRlbmRlZF9BZGRpdGlvbmFsICsgX0luTGF0aW5fRXh0ZW5kZWRfQiArIF9JbkNvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcyArICddJyk7XG4vKipcclxuICogSGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgYSBjaGFyYWN0ZXIgaXMgYSBMYXRpbi1zY3JpcHQgbGV0dGVyIG9yIG5vdC5cclxuICogRm9yIG91ciBwdXJwb3NlcywgY29tYmluaW5nIG1hcmtzIHNob3VsZCBhbHNvIHJldHVybiB0cnVlIHNpbmNlIHdlIGFzc3VtZVxyXG4gKiB0aGV5IGhhdmUgYmVlbiBhZGRlZCB0byBhIHByZWNlZGluZyBMYXRpbiBjaGFyYWN0ZXIuXHJcbiAqL1xuXG5mdW5jdGlvbiBpc0xhdGluTGV0dGVyKGxldHRlcikge1xuICAvLyBDb21iaW5pbmcgbWFya3MgYXJlIGEgc3Vic2V0IG9mIG5vbi1zcGFjaW5nLW1hcmsuXG4gIGlmICghcExfcmVnZXhwLnRlc3QobGV0dGVyKSAmJiAhcE1uX3JlZ2V4cC50ZXN0KGxldHRlcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbGF0aW5MZXR0ZXJSZWdleHAudGVzdChsZXR0ZXIpO1xufVxuXG5mdW5jdGlvbiBpc0ludmFsaWRQdW5jdHVhdGlvblN5bWJvbChjaGFyYWN0ZXIpIHtcbiAgcmV0dXJuIGNoYXJhY3RlciA9PT0gJyUnIHx8IHBTY19yZWdleHAudGVzdChjaGFyYWN0ZXIpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRmLTguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmVuZHNXaXRoID0gZW5kc1dpdGg7XG5leHBvcnRzLmxpbWl0ID0gbGltaXQ7XG5leHBvcnRzLnN0YXJ0c1dpdGggPSBzdGFydHNXaXRoO1xuZXhwb3J0cy50cmltQWZ0ZXJGaXJzdE1hdGNoID0gdHJpbUFmdGVyRmlyc3RNYXRjaDtcblxuLyoqIFJldHVybnMgYSByZWd1bGFyIGV4cHJlc3Npb24gcXVhbnRpZmllciB3aXRoIGFuIHVwcGVyIGFuZCBsb3dlciBsaW1pdC4gKi9cbmZ1bmN0aW9uIGxpbWl0KGxvd2VyLCB1cHBlcikge1xuICBpZiAobG93ZXIgPCAwIHx8IHVwcGVyIDw9IDAgfHwgdXBwZXIgPCBsb3dlcikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgfVxuXG4gIHJldHVybiBcIntcIi5jb25jYXQobG93ZXIsIFwiLFwiKS5jb25jYXQodXBwZXIsIFwifVwiKTtcbn1cbi8qKlxyXG4gKiBUcmltcyBhd2F5IGFueSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBmaXJzdCBtYXRjaCBvZiB7QGNvZGUgcGF0dGVybn0gaW4ge0Bjb2RlIGNhbmRpZGF0ZX0sXHJcbiAqIHJldHVybmluZyB0aGUgdHJpbW1lZCB2ZXJzaW9uLlxyXG4gKi9cblxuXG5mdW5jdGlvbiB0cmltQWZ0ZXJGaXJzdE1hdGNoKHJlZ2V4cCwgc3RyaW5nKSB7XG4gIHZhciBpbmRleCA9IHN0cmluZy5zZWFyY2gocmVnZXhwKTtcblxuICBpZiAoaW5kZXggPj0gMCkge1xuICAgIHJldHVybiBzdHJpbmcuc2xpY2UoMCwgaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZztcbn1cblxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsIHN1YnN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLmluZGV4T2Yoc3Vic3RyaW5nKSA9PT0gMDtcbn1cblxuZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCBzdWJzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5pbmRleE9mKHN1YnN0cmluZywgc3RyaW5nLmxlbmd0aCAtIHN1YnN0cmluZy5sZW5ndGgpID09PSBzdHJpbmcubGVuZ3RoIC0gc3Vic3RyaW5nLmxlbmd0aDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGZpbmRQaG9uZU51bWJlcnNJblRleHQ7XG5cbnZhciBfUGhvbmVOdW1iZXJNYXRjaGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QaG9uZU51bWJlck1hdGNoZXIuanNcIikpO1xuXG52YXIgX25vcm1hbGl6ZUFyZ3VtZW50czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL25vcm1hbGl6ZUFyZ3VtZW50cy5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBmaW5kUGhvbmVOdW1iZXJzSW5UZXh0KCkge1xuICB2YXIgX25vcm1hbGl6ZUFyZ3VtZW50cyA9ICgwLCBfbm9ybWFsaXplQXJndW1lbnRzMltcImRlZmF1bHRcIl0pKGFyZ3VtZW50cyksXG4gICAgICB0ZXh0ID0gX25vcm1hbGl6ZUFyZ3VtZW50cy50ZXh0LFxuICAgICAgb3B0aW9ucyA9IF9ub3JtYWxpemVBcmd1bWVudHMub3B0aW9ucyxcbiAgICAgIG1ldGFkYXRhID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5tZXRhZGF0YTtcblxuICB2YXIgbWF0Y2hlciA9IG5ldyBfUGhvbmVOdW1iZXJNYXRjaGVyW1wiZGVmYXVsdFwiXSh0ZXh0LCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbnMpLCB7fSwge1xuICAgIHYyOiB0cnVlXG4gIH0pLCBtZXRhZGF0YSk7XG4gIHZhciByZXN1bHRzID0gW107XG5cbiAgd2hpbGUgKG1hdGNoZXIuaGFzTmV4dCgpKSB7XG4gICAgcmVzdWx0cy5wdXNoKG1hdGNoZXIubmV4dCgpKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmluZFBob25lTnVtYmVyc0luVGV4dC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH0sIF90eXBlb2Yob2JqKTsgfVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jaG9vc2VGb3JtYXRGb3JOdW1iZXIgPSBjaG9vc2VGb3JtYXRGb3JOdW1iZXI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGZvcm1hdE51bWJlcjtcblxudmFyIF9tYXRjaGVzRW50aXJlbHkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvbWF0Y2hlc0VudGlyZWx5LmpzXCIpKTtcblxudmFyIF9mb3JtYXROYXRpb25hbE51bWJlclVzaW5nRm9ybWF0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9oZWxwZXJzL2Zvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQuanNcIikpO1xuXG52YXIgX21ldGFkYXRhID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vbWV0YWRhdGEuanNcIikpO1xuXG52YXIgX2dldElkZFByZWZpeCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaGVscGVycy9nZXRJZGRQcmVmaXguanNcIikpO1xuXG52YXIgX1JGQyA9IHJlcXVpcmUoXCIuL2hlbHBlcnMvUkZDMzk2Ni5qc1wiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgdmFyIGNhY2hlTm9kZUludGVyb3AgPSBuZXcgV2Vha01hcCgpOyByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7IH0pKG5vZGVJbnRlcm9wKTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChrZXkgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqW1wiZGVmYXVsdFwiXSA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKGl0KSByZXR1cm4gKGl0ID0gaXQuY2FsbChvKSkubmV4dC5iaW5kKGl0KTsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbnZhciBERUZBVUxUX09QVElPTlMgPSB7XG4gIGZvcm1hdEV4dGVuc2lvbjogZnVuY3Rpb24gZm9ybWF0RXh0ZW5zaW9uKGZvcm1hdHRlZE51bWJlciwgZXh0ZW5zaW9uLCBtZXRhZGF0YSkge1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChmb3JtYXR0ZWROdW1iZXIpLmNvbmNhdChtZXRhZGF0YS5leHQoKSkuY29uY2F0KGV4dGVuc2lvbik7XG4gIH1cbn07XG4vKipcclxuICogRm9ybWF0cyBhIHBob25lIG51bWJlci5cclxuICpcclxuICogZm9ybWF0KHBob25lTnVtYmVySW5zdGFuY2UsICdJTlRFUk5BVElPTkFMJywgeyAuLi4sIHYyOiB0cnVlIH0sIG1ldGFkYXRhKVxyXG4gKiBmb3JtYXQocGhvbmVOdW1iZXJJbnN0YW5jZSwgJ05BVElPTkFMJywgeyAuLi4sIHYyOiB0cnVlIH0sIG1ldGFkYXRhKVxyXG4gKlxyXG4gKiBmb3JtYXQoeyBwaG9uZTogJzgwMDU1NTM1MzUnLCBjb3VudHJ5OiAnUlUnIH0sICdJTlRFUk5BVElPTkFMJywgeyAuLi4gfSwgbWV0YWRhdGEpXHJcbiAqIGZvcm1hdCh7IHBob25lOiAnODAwNTU1MzUzNScsIGNvdW50cnk6ICdSVScgfSwgJ05BVElPTkFMJywgdW5kZWZpbmVkLCBtZXRhZGF0YSlcclxuICpcclxuICogQHBhcmFtICB7b2JqZWN0fFBob25lTnVtYmVyfSBpbnB1dCDigJQgSWYgYG9wdGlvbnMudjI6IHRydWVgIGZsYWcgaXMgcGFzc2VkLCB0aGUgYGlucHV0YCBzaG91bGQgYmUgYSBgUGhvbmVOdW1iZXJgIGluc3RhbmNlLiBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBhbiBvYmplY3Qgb2Ygc2hhcGUgYHsgcGhvbmU6ICcuLi4nLCBjb3VudHJ5OiAnLi4uJyB9YC5cclxuICogQHBhcmFtICB7c3RyaW5nfSBmb3JtYXRcclxuICogQHBhcmFtICB7b2JqZWN0fSBbb3B0aW9uc11cclxuICogQHBhcmFtICB7b2JqZWN0fSBtZXRhZGF0YVxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXROdW1iZXIoaW5wdXQsIGZvcm1hdCwgb3B0aW9ucywgbWV0YWRhdGEpIHtcbiAgLy8gQXBwbHkgZGVmYXVsdCBvcHRpb25zLlxuICBpZiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIERFRkFVTFRfT1BUSU9OUyksIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSBERUZBVUxUX09QVElPTlM7XG4gIH1cblxuICBtZXRhZGF0YSA9IG5ldyBfbWV0YWRhdGFbXCJkZWZhdWx0XCJdKG1ldGFkYXRhKTtcblxuICBpZiAoaW5wdXQuY291bnRyeSAmJiBpbnB1dC5jb3VudHJ5ICE9PSAnMDAxJykge1xuICAgIC8vIFZhbGlkYXRlIGBpbnB1dC5jb3VudHJ5YC5cbiAgICBpZiAoIW1ldGFkYXRhLmhhc0NvdW50cnkoaW5wdXQuY291bnRyeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY291bnRyeTogXCIuY29uY2F0KGlucHV0LmNvdW50cnkpKTtcbiAgICB9XG5cbiAgICBtZXRhZGF0YS5jb3VudHJ5KGlucHV0LmNvdW50cnkpO1xuICB9IGVsc2UgaWYgKGlucHV0LmNvdW50cnlDYWxsaW5nQ29kZSkge1xuICAgIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgfSBlbHNlIHJldHVybiBpbnB1dC5waG9uZSB8fCAnJztcblxuICB2YXIgY291bnRyeUNhbGxpbmdDb2RlID0gbWV0YWRhdGEuY291bnRyeUNhbGxpbmdDb2RlKCk7XG4gIHZhciBuYXRpb25hbE51bWJlciA9IG9wdGlvbnMudjIgPyBpbnB1dC5uYXRpb25hbE51bWJlciA6IGlucHV0LnBob25lOyAvLyBUaGlzIHZhcmlhYmxlIHNob3VsZCBoYXZlIGJlZW4gZGVjbGFyZWQgaW5zaWRlIGBjYXNlYHNcbiAgLy8gYnV0IEJhYmVsIGhhcyBhIGJ1ZyBhbmQgaXQgc2F5cyBcImR1cGxpY2F0ZSB2YXJpYWJsZSBkZWNsYXJhdGlvblwiLlxuXG4gIHZhciBudW1iZXI7XG5cbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlICdOQVRJT05BTCc6XG4gICAgICAvLyBMZWdhY3kgYXJndW1lbnQgc3VwcG9ydC5cbiAgICAgIC8vIChgeyBjb3VudHJ5OiAuLi4sIHBob25lOiAnJyB9YClcbiAgICAgIGlmICghbmF0aW9uYWxOdW1iZXIpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICBudW1iZXIgPSBmb3JtYXROYXRpb25hbE51bWJlcihuYXRpb25hbE51bWJlciwgaW5wdXQuY2FycmllckNvZGUsICdOQVRJT05BTCcsIG1ldGFkYXRhLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiBhZGRFeHRlbnNpb24obnVtYmVyLCBpbnB1dC5leHQsIG1ldGFkYXRhLCBvcHRpb25zLmZvcm1hdEV4dGVuc2lvbik7XG5cbiAgICBjYXNlICdJTlRFUk5BVElPTkFMJzpcbiAgICAgIC8vIExlZ2FjeSBhcmd1bWVudCBzdXBwb3J0LlxuICAgICAgLy8gKGB7IGNvdW50cnk6IC4uLiwgcGhvbmU6ICcnIH1gKVxuICAgICAgaWYgKCFuYXRpb25hbE51bWJlcikge1xuICAgICAgICByZXR1cm4gXCIrXCIuY29uY2F0KGNvdW50cnlDYWxsaW5nQ29kZSk7XG4gICAgICB9XG5cbiAgICAgIG51bWJlciA9IGZvcm1hdE5hdGlvbmFsTnVtYmVyKG5hdGlvbmFsTnVtYmVyLCBudWxsLCAnSU5URVJOQVRJT05BTCcsIG1ldGFkYXRhLCBvcHRpb25zKTtcbiAgICAgIG51bWJlciA9IFwiK1wiLmNvbmNhdChjb3VudHJ5Q2FsbGluZ0NvZGUsIFwiIFwiKS5jb25jYXQobnVtYmVyKTtcbiAgICAgIHJldHVybiBhZGRFeHRlbnNpb24obnVtYmVyLCBpbnB1dC5leHQsIG1ldGFkYXRhLCBvcHRpb25zLmZvcm1hdEV4dGVuc2lvbik7XG5cbiAgICBjYXNlICdFLjE2NCc6XG4gICAgICAvLyBgRS4xNjRgIGRvZXNuJ3QgZGVmaW5lIFwicGhvbmUgbnVtYmVyIGV4dGVuc2lvbnNcIi5cbiAgICAgIHJldHVybiBcIitcIi5jb25jYXQoY291bnRyeUNhbGxpbmdDb2RlKS5jb25jYXQobmF0aW9uYWxOdW1iZXIpO1xuXG4gICAgY2FzZSAnUkZDMzk2Nic6XG4gICAgICByZXR1cm4gKDAsIF9SRkMuZm9ybWF0UkZDMzk2Nikoe1xuICAgICAgICBudW1iZXI6IFwiK1wiLmNvbmNhdChjb3VudHJ5Q2FsbGluZ0NvZGUpLmNvbmNhdChuYXRpb25hbE51bWJlciksXG4gICAgICAgIGV4dDogaW5wdXQuZXh0XG4gICAgICB9KTtcbiAgICAvLyBGb3IgcmVmZXJlbmNlLCBoZXJlJ3MgR29vZ2xlJ3MgSUREIGZvcm1hdHRlcjpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2xpYnBob25lbnVtYmVyL2Jsb2IvMzI3MTljZjc0ZTY4Nzk2Nzg4ZDFjYTQ1YWJjODVkY2RjNjNiYTViOS9qYXZhL2xpYnBob25lbnVtYmVyL3NyYy9jb20vZ29vZ2xlL2kxOG4vcGhvbmVudW1iZXJzL1Bob25lTnVtYmVyVXRpbC5qYXZhI0wxNTQ2XG4gICAgLy8gTm90IHNheWluZyB0aGF0IHRoaXMgSUREIGZvcm1hdHRlciByZXBsaWNhdGVzIGl0IDE6MSwgYnV0IGl0IHNlZW1zIHRvIHdvcmsuXG4gICAgLy8gV2hvIHdvdWxkIGV2ZW4gbmVlZCB0byBmb3JtYXQgcGhvbmUgbnVtYmVycyBpbiBJREQgZm9ybWF0IGFueXdheT9cblxuICAgIGNhc2UgJ0lERCc6XG4gICAgICBpZiAoIW9wdGlvbnMuZnJvbUNvdW50cnkpIHtcbiAgICAgICAgcmV0dXJuOyAvLyB0aHJvdyBuZXcgRXJyb3IoJ2Bmcm9tQ291bnRyeWAgb3B0aW9uIG5vdCBwYXNzZWQgZm9yIElERC1wcmVmaXhlZCBmb3JtYXR0aW5nLicpXG4gICAgICB9XG5cbiAgICAgIHZhciBmb3JtYXR0ZWROdW1iZXIgPSBmb3JtYXRJREQobmF0aW9uYWxOdW1iZXIsIGlucHV0LmNhcnJpZXJDb2RlLCBjb3VudHJ5Q2FsbGluZ0NvZGUsIG9wdGlvbnMuZnJvbUNvdW50cnksIG1ldGFkYXRhKTtcbiAgICAgIHJldHVybiBhZGRFeHRlbnNpb24oZm9ybWF0dGVkTnVtYmVyLCBpbnB1dC5leHQsIG1ldGFkYXRhLCBvcHRpb25zLmZvcm1hdEV4dGVuc2lvbik7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBcXFwiZm9ybWF0XFxcIiBhcmd1bWVudCBwYXNzZWQgdG8gXFxcImZvcm1hdE51bWJlcigpXFxcIjogXFxcIlwiLmNvbmNhdChmb3JtYXQsIFwiXFxcIlwiKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0TmF0aW9uYWxOdW1iZXIobnVtYmVyLCBjYXJyaWVyQ29kZSwgZm9ybWF0QXMsIG1ldGFkYXRhLCBvcHRpb25zKSB7XG4gIHZhciBmb3JtYXQgPSBjaG9vc2VGb3JtYXRGb3JOdW1iZXIobWV0YWRhdGEuZm9ybWF0cygpLCBudW1iZXIpO1xuXG4gIGlmICghZm9ybWF0KSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuXG4gIHJldHVybiAoMCwgX2Zvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXRbXCJkZWZhdWx0XCJdKShudW1iZXIsIGZvcm1hdCwge1xuICAgIHVzZUludGVybmF0aW9uYWxGb3JtYXQ6IGZvcm1hdEFzID09PSAnSU5URVJOQVRJT05BTCcsXG4gICAgd2l0aE5hdGlvbmFsUHJlZml4OiBmb3JtYXQubmF0aW9uYWxQcmVmaXhJc09wdGlvbmFsV2hlbkZvcm1hdHRpbmdJbk5hdGlvbmFsRm9ybWF0KCkgJiYgb3B0aW9ucyAmJiBvcHRpb25zLm5hdGlvbmFsUHJlZml4ID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSxcbiAgICBjYXJyaWVyQ29kZTogY2FycmllckNvZGUsXG4gICAgbWV0YWRhdGE6IG1ldGFkYXRhXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjaG9vc2VGb3JtYXRGb3JOdW1iZXIoYXZhaWxhYmxlRm9ybWF0cywgbmF0aW9uYWxObnVtYmVyKSB7XG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UoYXZhaWxhYmxlRm9ybWF0cyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgdmFyIGZvcm1hdCA9IF9zdGVwLnZhbHVlO1xuXG4gICAgLy8gVmFsaWRhdGUgbGVhZGluZyBkaWdpdHMuXG4gICAgLy8gVGhlIHRlc3QgY2FzZSBmb3IgXCJlbHNlIHBhdGhcIiBjb3VsZCBiZSBmb3VuZCBieSBzZWFyY2hpbmcgZm9yXG4gICAgLy8gXCJmb3JtYXQubGVhZGluZ0RpZ2l0c1BhdHRlcm5zKCkubGVuZ3RoID09PSAwXCIuXG4gICAgaWYgKGZvcm1hdC5sZWFkaW5nRGlnaXRzUGF0dGVybnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgbGFzdCBsZWFkaW5nX2RpZ2l0c19wYXR0ZXJuIGlzIHVzZWQgaGVyZSwgYXMgaXQgaXMgdGhlIG1vc3QgZGV0YWlsZWRcbiAgICAgIHZhciBsYXN0TGVhZGluZ0RpZ2l0c1BhdHRlcm4gPSBmb3JtYXQubGVhZGluZ0RpZ2l0c1BhdHRlcm5zKClbZm9ybWF0LmxlYWRpbmdEaWdpdHNQYXR0ZXJucygpLmxlbmd0aCAtIDFdOyAvLyBJZiBsZWFkaW5nIGRpZ2l0cyBkb24ndCBtYXRjaCB0aGVuIG1vdmUgb24gdG8gdGhlIG5leHQgcGhvbmUgbnVtYmVyIGZvcm1hdFxuXG4gICAgICBpZiAobmF0aW9uYWxObnVtYmVyLnNlYXJjaChsYXN0TGVhZGluZ0RpZ2l0c1BhdHRlcm4pICE9PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gLy8gQ2hlY2sgdGhhdCB0aGUgbmF0aW9uYWwgbnVtYmVyIG1hdGNoZXMgdGhlIHBob25lIG51bWJlciBmb3JtYXQgcmVndWxhciBleHByZXNzaW9uXG5cblxuICAgIGlmICgoMCwgX21hdGNoZXNFbnRpcmVseVtcImRlZmF1bHRcIl0pKG5hdGlvbmFsTm51bWJlciwgZm9ybWF0LnBhdHRlcm4oKSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEV4dGVuc2lvbihmb3JtYXR0ZWROdW1iZXIsIGV4dCwgbWV0YWRhdGEsIGZvcm1hdEV4dGVuc2lvbikge1xuICByZXR1cm4gZXh0ID8gZm9ybWF0RXh0ZW5zaW9uKGZvcm1hdHRlZE51bWJlciwgZXh0LCBtZXRhZGF0YSkgOiBmb3JtYXR0ZWROdW1iZXI7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdElERChuYXRpb25hbE51bWJlciwgY2FycmllckNvZGUsIGNvdW50cnlDYWxsaW5nQ29kZSwgZnJvbUNvdW50cnksIG1ldGFkYXRhKSB7XG4gIHZhciBmcm9tQ291bnRyeUNhbGxpbmdDb2RlID0gKDAsIF9tZXRhZGF0YS5nZXRDb3VudHJ5Q2FsbGluZ0NvZGUpKGZyb21Db3VudHJ5LCBtZXRhZGF0YS5tZXRhZGF0YSk7IC8vIFdoZW4gY2FsbGluZyB3aXRoaW4gdGhlIHNhbWUgY291bnRyeSBjYWxsaW5nIGNvZGUuXG5cbiAgaWYgKGZyb21Db3VudHJ5Q2FsbGluZ0NvZGUgPT09IGNvdW50cnlDYWxsaW5nQ29kZSkge1xuICAgIHZhciBmb3JtYXR0ZWROdW1iZXIgPSBmb3JtYXROYXRpb25hbE51bWJlcihuYXRpb25hbE51bWJlciwgY2FycmllckNvZGUsICdOQVRJT05BTCcsIG1ldGFkYXRhKTsgLy8gRm9yIE5BTlBBIHJlZ2lvbnMsIHJldHVybiB0aGUgbmF0aW9uYWwgZm9ybWF0IGZvciB0aGVzZSByZWdpb25zXG4gICAgLy8gYnV0IHByZWZpeCBpdCB3aXRoIHRoZSBjb3VudHJ5IGNhbGxpbmcgY29kZS5cblxuICAgIGlmIChjb3VudHJ5Q2FsbGluZ0NvZGUgPT09ICcxJykge1xuICAgICAgcmV0dXJuIGNvdW50cnlDYWxsaW5nQ29kZSArICcgJyArIGZvcm1hdHRlZE51bWJlcjtcbiAgICB9IC8vIElmIHJlZ2lvbnMgc2hhcmUgYSBjb3VudHJ5IGNhbGxpbmcgY29kZSwgdGhlIGNvdW50cnkgY2FsbGluZyBjb2RlIG5lZWRcbiAgICAvLyBub3QgYmUgZGlhbGxlZC4gVGhpcyBhbHNvIGFwcGxpZXMgd2hlbiBkaWFsbGluZyB3aXRoaW4gYSByZWdpb24sIHNvIHRoaXNcbiAgICAvLyBpZiBjbGF1c2UgY292ZXJzIGJvdGggdGhlc2UgY2FzZXMuIFRlY2huaWNhbGx5IHRoaXMgaXMgdGhlIGNhc2UgZm9yXG4gICAgLy8gZGlhbGxpbmcgZnJvbSBMYSBSZXVuaW9uIHRvIG90aGVyIG92ZXJzZWFzIGRlcGFydG1lbnRzIG9mIEZyYW5jZSAoRnJlbmNoXG4gICAgLy8gR3VpYW5hLCBNYXJ0aW5pcXVlLCBHdWFkZWxvdXBlKSwgYnV0IG5vdCB2aWNlIHZlcnNhIC0gc28gd2UgZG9uJ3QgY292ZXJcbiAgICAvLyB0aGlzIGVkZ2UgY2FzZSBmb3Igbm93IGFuZCBmb3IgdGhvc2UgY2FzZXMgcmV0dXJuIHRoZSB2ZXJzaW9uIGluY2x1ZGluZ1xuICAgIC8vIGNvdW50cnkgY2FsbGluZyBjb2RlLiBEZXRhaWxzIGhlcmU6XG4gICAgLy8gaHR0cDovL3d3dy5wZXRpdGZ1dGUuY29tL3ZveWFnZS8yMjUtaW5mby1wcmF0aXF1ZXMtcmV1bmlvblxuICAgIC8vXG5cblxuICAgIHJldHVybiBmb3JtYXR0ZWROdW1iZXI7XG4gIH1cblxuICB2YXIgaWRkUHJlZml4ID0gKDAsIF9nZXRJZGRQcmVmaXhbXCJkZWZhdWx0XCJdKShmcm9tQ291bnRyeSwgdW5kZWZpbmVkLCBtZXRhZGF0YS5tZXRhZGF0YSk7XG5cbiAgaWYgKGlkZFByZWZpeCkge1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChpZGRQcmVmaXgsIFwiIFwiKS5jb25jYXQoY291bnRyeUNhbGxpbmdDb2RlLCBcIiBcIikuY29uY2F0KGZvcm1hdE5hdGlvbmFsTnVtYmVyKG5hdGlvbmFsTnVtYmVyLCBudWxsLCAnSU5URVJOQVRJT05BTCcsIG1ldGFkYXRhKSk7XG4gIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcm1hdC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZm9ybWF0SW5jb21wbGV0ZVBob25lTnVtYmVyO1xuXG52YXIgX0FzWW91VHlwZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQXNZb3VUeXBlLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbi8qKlxyXG4gKiBGb3JtYXRzIGEgKHBvc3NpYmx5IGluY29tcGxldGUpIHBob25lIG51bWJlci5cclxuICogVGhlIHBob25lIG51bWJlciBjYW4gYmUgZWl0aGVyIGluIEUuMTY0IGZvcm1hdFxyXG4gKiBvciBpbiBhIGZvcm0gb2YgbmF0aW9uYWwgbnVtYmVyIGRpZ2l0cy5cclxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQSBwb3NzaWJseSBpbmNvbXBsZXRlIHBob25lIG51bWJlci4gRWl0aGVyIGluIEUuMTY0IGZvcm1hdCBvciBpbiBhIGZvcm0gb2YgbmF0aW9uYWwgbnVtYmVyIGRpZ2l0cy5cclxuICogQHBhcmFtIHtzdHJpbmc/fSBjb3VudHJ5IC0gVHdvLWxldHRlciAoXCJJU08gMzE2Ni0xIGFscGhhLTJcIikgY291bnRyeSBjb2RlLlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCAocG9zc2libHkgaW5jb21wbGV0ZSkgcGhvbmUgbnVtYmVyLlxyXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdEluY29tcGxldGVQaG9uZU51bWJlcih2YWx1ZSwgY291bnRyeSwgbWV0YWRhdGEpIHtcbiAgaWYgKCFtZXRhZGF0YSkge1xuICAgIG1ldGFkYXRhID0gY291bnRyeTtcbiAgICBjb3VudHJ5ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBfQXNZb3VUeXBlW1wiZGVmYXVsdFwiXShjb3VudHJ5LCBtZXRhZGF0YSkuaW5wdXQodmFsdWUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0SW5jb21wbGV0ZVBob25lTnVtYmVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBnZXRDb3VudHJpZXM7XG5cbnZhciBfbWV0YWRhdGEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL21ldGFkYXRhLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGdldENvdW50cmllcyhtZXRhZGF0YSkge1xuICByZXR1cm4gbmV3IF9tZXRhZGF0YVtcImRlZmF1bHRcIl0obWV0YWRhdGEpLmdldENvdW50cmllcygpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0Q291bnRyaWVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVmYXVsdFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbWV0YWRhdGEuZ2V0Q291bnRyeUNhbGxpbmdDb2RlO1xuICB9XG59KTtcblxudmFyIF9tZXRhZGF0YSA9IHJlcXVpcmUoXCIuL21ldGFkYXRhLmpzXCIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0Q291bnRyeUNhbGxpbmdDb2RlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBnZXRFeGFtcGxlTnVtYmVyO1xuXG52YXIgX1Bob25lTnVtYmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QaG9uZU51bWJlci5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBnZXRFeGFtcGxlTnVtYmVyKGNvdW50cnksIGV4YW1wbGVzLCBtZXRhZGF0YSkge1xuICBpZiAoZXhhbXBsZXNbY291bnRyeV0pIHtcbiAgICByZXR1cm4gbmV3IF9QaG9uZU51bWJlcltcImRlZmF1bHRcIl0oY291bnRyeSwgZXhhbXBsZXNbY291bnRyeV0sIG1ldGFkYXRhKTtcbiAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0RXhhbXBsZU51bWJlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZm9ybWF0UkZDMzk2NiA9IGZvcm1hdFJGQzM5NjY7XG5leHBvcnRzLnBhcnNlUkZDMzk2NiA9IHBhcnNlUkZDMzk2NjtcblxudmFyIF9pc1ZpYWJsZVBob25lTnVtYmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9pc1ZpYWJsZVBob25lTnVtYmVyLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2kgPSBhcnIgPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07IGlmIChfaSA9PSBudWxsKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX3MsIF9lOyB0cnkgeyBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07IGlmIChpdCkgcmV0dXJuIChpdCA9IGl0LmNhbGwobykpLm5leHQuYmluZChpdCk7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG4vLyBodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzk2Ni50eHRcblxuLyoqXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gdGV4dCAtIFBob25lIFVSSSAoUkZDIDM5NjYpLlxyXG4gKiBAcmV0dXJuIHtvYmplY3R9IGB7ID9udW1iZXIsID9leHQgfWAuXHJcbiAqL1xuZnVuY3Rpb24gcGFyc2VSRkMzOTY2KHRleHQpIHtcbiAgdmFyIG51bWJlcjtcbiAgdmFyIGV4dDsgLy8gUmVwbGFjZSBcInRlbDpcIiB3aXRoIFwidGVsPVwiIGZvciBwYXJzaW5nIGNvbnZlbmllbmNlLlxuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL150ZWw6LywgJ3RlbD0nKTtcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKHRleHQuc3BsaXQoJzsnKSksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgdmFyIHBhcnQgPSBfc3RlcC52YWx1ZTtcblxuICAgIHZhciBfcGFydCRzcGxpdCA9IHBhcnQuc3BsaXQoJz0nKSxcbiAgICAgICAgX3BhcnQkc3BsaXQyID0gX3NsaWNlZFRvQXJyYXkoX3BhcnQkc3BsaXQsIDIpLFxuICAgICAgICBuYW1lID0gX3BhcnQkc3BsaXQyWzBdLFxuICAgICAgICB2YWx1ZSA9IF9wYXJ0JHNwbGl0MlsxXTtcblxuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAndGVsJzpcbiAgICAgICAgbnVtYmVyID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdleHQnOlxuICAgICAgICBleHQgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3Bob25lLWNvbnRleHQnOlxuICAgICAgICAvLyBPbmx5IFwiY291bnRyeSBjb250ZXh0c1wiIGFyZSBzdXBwb3J0ZWQuXG4gICAgICAgIC8vIFwiRG9tYWluIGNvbnRleHRzXCIgYXJlIGlnbm9yZWQuXG4gICAgICAgIGlmICh2YWx1ZVswXSA9PT0gJysnKSB7XG4gICAgICAgICAgbnVtYmVyID0gdmFsdWUgKyBudW1iZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gLy8gSWYgdGhlIHBob25lIG51bWJlciBpcyBub3QgdmlhYmxlLCB0aGVuIGFib3J0LlxuXG5cbiAgaWYgKCEoMCwgX2lzVmlhYmxlUGhvbmVOdW1iZXJbXCJkZWZhdWx0XCJdKShudW1iZXIpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBudW1iZXI6IG51bWJlclxuICB9O1xuXG4gIGlmIChleHQpIHtcbiAgICByZXN1bHQuZXh0ID0gZXh0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxyXG4gKiBAcGFyYW0gIHtvYmplY3R9IC0gYHsgP251bWJlciwgP2V4dGVuc2lvbiB9YC5cclxuICogQHJldHVybiB7c3RyaW5nfSBQaG9uZSBVUkkgKFJGQyAzOTY2KS5cclxuICovXG5cblxuZnVuY3Rpb24gZm9ybWF0UkZDMzk2NihfcmVmKSB7XG4gIHZhciBudW1iZXIgPSBfcmVmLm51bWJlcixcbiAgICAgIGV4dCA9IF9yZWYuZXh0O1xuXG4gIGlmICghbnVtYmVyKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKG51bWJlclswXSAhPT0gJysnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiXFxcImZvcm1hdFJGQzM5NjYoKVxcXCIgZXhwZWN0cyBcXFwibnVtYmVyXFxcIiB0byBiZSBpbiBFLjE2NCBmb3JtYXQuXCIpO1xuICB9XG5cbiAgcmV0dXJuIFwidGVsOlwiLmNvbmNhdChudW1iZXIpLmNvbmNhdChleHQgPyAnO2V4dD0nICsgZXh0IDogJycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UkZDMzk2Ni5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gYXBwbHlJbnRlcm5hdGlvbmFsU2VwYXJhdG9yU3R5bGU7XG5cbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcblxuLy8gUmVtb3ZlcyBicmFja2V0cyBhbmQgcmVwbGFjZXMgZGFzaGVzIHdpdGggc3BhY2VzLlxuLy9cbi8vIEUuZy4gXCIoOTk5KSAxMTEtMjItMzNcIiAtPiBcIjk5OSAxMTEgMjIgMzNcIlxuLy9cbi8vIEZvciBzb21lIHJlYXNvbiBHb29nbGUncyBtZXRhZGF0YSBjb250YWlucyBgPGludGxGb3JtYXQvPmBzIHdpdGggYnJhY2tldHMgYW5kIGRhc2hlcy5cbi8vIE1lYW53aGlsZSwgdGhlcmUncyBubyBzaW5nbGUgb3BpbmlvbiBhYm91dCB1c2luZyBwdW5jdHVhdGlvbiBpbiBpbnRlcm5hdGlvbmFsIHBob25lIG51bWJlcnMuXG4vL1xuLy8gRm9yIGV4YW1wbGUsIEdvb2dsZSdzIGA8aW50bEZvcm1hdC8+YCBmb3IgVVNBIGlzIGArMSAyMTMtMzczLTQyNTNgLlxuLy8gQW5kIGhlcmUncyBhIHF1b3RlIGZyb20gV2lraVBlZGlhJ3MgXCJOb3J0aCBBbWVyaWNhbiBOdW1iZXJpbmcgUGxhblwiIHBhZ2U6XG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ob3J0aF9BbWVyaWNhbl9OdW1iZXJpbmdfUGxhblxuLy9cbi8vIFwiVGhlIGNvdW50cnkgY2FsbGluZyBjb2RlIGZvciBhbGwgY291bnRyaWVzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIE5BTlAgaXMgMS5cbi8vIEluIGludGVybmF0aW9uYWwgZm9ybWF0LCBhbiBOQU5QIG51bWJlciBzaG91bGQgYmUgbGlzdGVkIGFzICsxIDMwMSA1NTUgMDEgMDAsXG4vLyB3aGVyZSAzMDEgaXMgYW4gYXJlYSBjb2RlIChNYXJ5bGFuZCkuXCJcbi8vXG4vLyBJIHBlcnNvbmFsbHkgcHJlZmVyIHRoZSBpbnRlcm5hdGlvbmFsIGZvcm1hdCB3aXRob3V0IGFueSBwdW5jdHVhdGlvbi5cbi8vIEZvciBleGFtcGxlLCBicmFja2V0cyBhcmUgcmVtbmFudHMgb2YgdGhlIG9sZCBhZ2UsIG1lYW5pbmcgdGhhdCB0aGVcbi8vIHBob25lIG51bWJlciBwYXJ0IGluIGJyYWNrZXRzIChzbyBjYWxsZWQgXCJhcmVhIGNvZGVcIikgY2FuIGJlIG9taXR0ZWRcbi8vIGlmIGRpYWxpbmcgd2l0aGluIHRoZSBzYW1lIFwiYXJlYVwiLlxuLy8gQW5kIGh5cGhlbnMgd2VyZSBjbGVhcmx5IGludHJvZHVjZWQgZm9yIHNwbGl0dGluZyBsb2NhbCBudW1iZXJzIGludG8gbWVtb3JpemFibGUgZ3JvdXBzLlxuLy8gRm9yIGV4YW1wbGUsIHJlbWVtYmVyaW5nIFwiNTU1MzUzNVwiIGlzIGRpZmZpY3VsdCBidXQgXCI1NTUtMzUtMzVcIiBpcyBtdWNoIHNpbXBsZXIuXG4vLyBJbWFnaW5lIGEgbWFuIHRha2luZyBhIGJ1cyBmcm9tIGhvbWUgdG8gd29yayBhbmQgc2VlaW5nIGFuIGFkIHdpdGggYSBwaG9uZSBudW1iZXIuXG4vLyBIZSBoYXMgYSBjb3VwbGUgb2Ygc2Vjb25kcyB0byBtZW1vcml6ZSB0aGF0IG51bWJlciB1bnRpbCBpdCBwYXNzZXMgYnkuXG4vLyBJZiBpdCB3ZXJlIHNwYWNlcyBpbnN0ZWFkIG9mIGh5cGhlbnMgdGhlIG1hbiB3b3VsZG4ndCBuZWNlc3NhcmlseSBnZXQgaXQsXG4vLyBidXQgd2l0aCBoeXBoZW5zIGluc3RlYWQgb2Ygc3BhY2VzIHRoZSBncm91cGluZyBpcyBtb3JlIGV4cGxpY2l0LlxuLy8gSSBwZXJzb25hbGx5IHRoaW5rIHRoYXQgaHlwaGVucyBpbnRyb2R1Y2UgdmlzdWFsIGNsdXR0ZXIsXG4vLyBzbyBJIHByZWZlciByZXBsYWNpbmcgdGhlbSB3aXRoIHNwYWNlcyBpbiBpbnRlcm5hdGlvbmFsIG51bWJlcnMuXG4vLyBJbiB0aGUgbW9kZXJuIGFnZSBhbGwgb3V0cHV0IGlzIGRvbmUgb24gZGlzcGxheXMgd2hlcmUgc3BhY2VzIGFyZSBjbGVhcmx5IGRpc3Rpbmd1aXNoYWJsZVxuLy8gc28gaHlwaGVucyBjYW4gYmUgc2FmZWx5IHJlcGxhY2VkIHdpdGggc3BhY2VzIHdpdGhvdXQgbG9zaW5nIGFueSBsZWdpYmlsaXR5LlxuLy9cbmZ1bmN0aW9uIGFwcGx5SW50ZXJuYXRpb25hbFNlcGFyYXRvclN0eWxlKGZvcm1hdHRlZE51bWJlcikge1xuICByZXR1cm4gZm9ybWF0dGVkTnVtYmVyLnJlcGxhY2UobmV3IFJlZ0V4cChcIltcIi5jb25jYXQoX2NvbnN0YW50cy5WQUxJRF9QVU5DVFVBVElPTiwgXCJdK1wiKSwgJ2cnKSwgJyAnKS50cmltKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHBseUludGVybmF0aW9uYWxTZXBhcmF0b3JTdHlsZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2hlY2tOdW1iZXJMZW5ndGhGb3JUeXBlID0gY2hlY2tOdW1iZXJMZW5ndGhGb3JUeXBlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBjaGVja051bWJlckxlbmd0aDtcblxudmFyIF9tZXJnZUFycmF5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbWVyZ2VBcnJheXMuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gY2hlY2tOdW1iZXJMZW5ndGgobmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhKSB7XG4gIHJldHVybiBjaGVja051bWJlckxlbmd0aEZvclR5cGUobmF0aW9uYWxOdW1iZXIsIHVuZGVmaW5lZCwgbWV0YWRhdGEpO1xufSAvLyBDaGVja3Mgd2hldGhlciBhIG51bWJlciBpcyBwb3NzaWJsZSBmb3IgdGhlIGNvdW50cnkgYmFzZWQgb24gaXRzIGxlbmd0aC5cbi8vIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgdGhlIFwibmV3XCIgbWV0YWRhdGEgd2hpY2ggaGFzIFwicG9zc2libGUgbGVuZ3Roc1wiLlxuXG5cbmZ1bmN0aW9uIGNoZWNrTnVtYmVyTGVuZ3RoRm9yVHlwZShuYXRpb25hbE51bWJlciwgdHlwZSwgbWV0YWRhdGEpIHtcbiAgdmFyIHR5cGVfaW5mbyA9IG1ldGFkYXRhLnR5cGUodHlwZSk7IC8vIFRoZXJlIHNob3VsZCBhbHdheXMgYmUgXCI8cG9zc2libGVQZW5ndGhzLz5cIiBzZXQgZm9yIGV2ZXJ5IHR5cGUgZWxlbWVudC5cbiAgLy8gVGhpcyBpcyBkZWNsYXJlZCBpbiB0aGUgWE1MIHNjaGVtYS5cbiAgLy8gRm9yIHNpemUgZWZmaWNpZW5jeSwgd2hlcmUgYSBzdWItZGVzY3JpcHRpb24gKGUuZy4gZml4ZWQtbGluZSlcbiAgLy8gaGFzIHRoZSBzYW1lIFwiPHBvc3NpYmxlUGVuZ3Rocy8+XCIgYXMgdGhlIFwiZ2VuZXJhbCBkZXNjcmlwdGlvblwiLCB0aGlzIGlzIG1pc3NpbmcsXG4gIC8vIHNvIHdlIGZhbGwgYmFjayB0byB0aGUgXCJnZW5lcmFsIGRlc2NyaXB0aW9uXCIuIFdoZXJlIG5vIG51bWJlcnMgb2YgdGhlIHR5cGVcbiAgLy8gZXhpc3QgYXQgYWxsLCB0aGVyZSBpcyBvbmUgcG9zc2libGUgbGVuZ3RoICgtMSkgd2hpY2ggaXMgZ3VhcmFudGVlZFxuICAvLyBub3QgdG8gbWF0Y2ggdGhlIGxlbmd0aCBvZiBhbnkgcmVhbCBwaG9uZSBudW1iZXIuXG5cbiAgdmFyIHBvc3NpYmxlX2xlbmd0aHMgPSB0eXBlX2luZm8gJiYgdHlwZV9pbmZvLnBvc3NpYmxlTGVuZ3RocygpIHx8IG1ldGFkYXRhLnBvc3NpYmxlTGVuZ3RocygpOyAvLyBsZXQgbG9jYWxfbGVuZ3RocyAgICA9IHR5cGVfaW5mbyAmJiB0eXBlLnBvc3NpYmxlTGVuZ3Roc0xvY2FsKCkgfHwgbWV0YWRhdGEucG9zc2libGVMZW5ndGhzTG9jYWwoKVxuICAvLyBNZXRhZGF0YSBiZWZvcmUgdmVyc2lvbiBgMS4wLjE4YCBkaWRuJ3QgY29udGFpbiBgcG9zc2libGVfbGVuZ3Roc2AuXG5cbiAgaWYgKCFwb3NzaWJsZV9sZW5ndGhzKSB7XG4gICAgcmV0dXJuICdJU19QT1NTSUJMRSc7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gJ0ZJWEVEX0xJTkVfT1JfTU9CSUxFJykge1xuICAgIC8vIE5vIHN1Y2ggY291bnRyeSBpbiBtZXRhZGF0YS5cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKCFtZXRhZGF0YS50eXBlKCdGSVhFRF9MSU5FJykpIHtcbiAgICAgIC8vIFRoZSByYXJlIGNhc2UgaGFzIGJlZW4gZW5jb3VudGVyZWQgd2hlcmUgbm8gZml4ZWRMaW5lIGRhdGEgaXMgYXZhaWxhYmxlXG4gICAgICAvLyAodHJ1ZSBmb3Igc29tZSBub24tZ2VvZ3JhcGhpYyBlbnRpdGllcyksIHNvIHdlIGp1c3QgY2hlY2sgbW9iaWxlLlxuICAgICAgcmV0dXJuIGNoZWNrTnVtYmVyTGVuZ3RoRm9yVHlwZShuYXRpb25hbE51bWJlciwgJ01PQklMRScsIG1ldGFkYXRhKTtcbiAgICB9XG5cbiAgICB2YXIgbW9iaWxlX3R5cGUgPSBtZXRhZGF0YS50eXBlKCdNT0JJTEUnKTtcblxuICAgIGlmIChtb2JpbGVfdHlwZSkge1xuICAgICAgLy8gTWVyZ2UgdGhlIG1vYmlsZSBkYXRhIGluIGlmIHRoZXJlIHdhcyBhbnkuIFwiQ29uY2F0XCIgY3JlYXRlcyBhIG5ld1xuICAgICAgLy8gYXJyYXksIGl0IGRvZXNuJ3QgZWRpdCBwb3NzaWJsZV9sZW5ndGhzIGluIHBsYWNlLCBzbyB3ZSBkb24ndCBuZWVkIGEgY29weS5cbiAgICAgIC8vIE5vdGUgdGhhdCB3aGVuIGFkZGluZyB0aGUgcG9zc2libGUgbGVuZ3RocyBmcm9tIG1vYmlsZSwgd2UgaGF2ZVxuICAgICAgLy8gdG8gYWdhaW4gY2hlY2sgdGhleSBhcmVuJ3QgZW1wdHkgc2luY2UgaWYgdGhleSBhcmUgdGhpcyBpbmRpY2F0ZXNcbiAgICAgIC8vIHRoZXkgYXJlIHRoZSBzYW1lIGFzIHRoZSBnZW5lcmFsIGRlc2MgYW5kIHNob3VsZCBiZSBvYnRhaW5lZCBmcm9tIHRoZXJlLlxuICAgICAgcG9zc2libGVfbGVuZ3RocyA9ICgwLCBfbWVyZ2VBcnJheXNbXCJkZWZhdWx0XCJdKShwb3NzaWJsZV9sZW5ndGhzLCBtb2JpbGVfdHlwZS5wb3NzaWJsZUxlbmd0aHMoKSk7IC8vIFRoZSBjdXJyZW50IGxpc3QgaXMgc29ydGVkOyB3ZSBuZWVkIHRvIG1lcmdlIGluIHRoZSBuZXcgbGlzdCBhbmRcbiAgICAgIC8vIHJlLXNvcnQgKGR1cGxpY2F0ZXMgYXJlIG9rYXkpLiBTb3J0aW5nIGlzbid0IHNvIGV4cGVuc2l2ZSBiZWNhdXNlXG4gICAgICAvLyB0aGUgbGlzdHMgYXJlIHZlcnkgc21hbGwuXG4gICAgICAvLyBpZiAobG9jYWxfbGVuZ3Rocykge1xuICAgICAgLy8gXHRsb2NhbF9sZW5ndGhzID0gbWVyZ2VBcnJheXMobG9jYWxfbGVuZ3RocywgbW9iaWxlX3R5cGUucG9zc2libGVMZW5ndGhzTG9jYWwoKSlcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyBcdGxvY2FsX2xlbmd0aHMgPSBtb2JpbGVfdHlwZS5wb3NzaWJsZUxlbmd0aHNMb2NhbCgpXG4gICAgICAvLyB9XG4gICAgfVxuICB9IC8vIElmIHRoZSB0eXBlIGRvZXNuJ3QgZXhpc3QgdGhlbiByZXR1cm4gJ0lOVkFMSURfTEVOR1RIJy5cbiAgZWxzZSBpZiAodHlwZSAmJiAhdHlwZV9pbmZvKSB7XG4gICAgcmV0dXJuICdJTlZBTElEX0xFTkdUSCc7XG4gIH1cblxuICB2YXIgYWN0dWFsX2xlbmd0aCA9IG5hdGlvbmFsTnVtYmVyLmxlbmd0aDsgLy8gSW4gYGxpYnBob25lbnVtYmVyLWpzYCBhbGwgXCJsb2NhbC1vbmx5XCIgZm9ybWF0cyBhcmUgZHJvcHBlZCBmb3Igc2ltcGxpY2l0eS5cbiAgLy8gLy8gVGhpcyBpcyBzYWZlIGJlY2F1c2UgdGhlcmUgaXMgbmV2ZXIgYW4gb3ZlcmxhcCBiZXdlZW4gdGhlIHBvc3NpYmxlIGxlbmd0aHNcbiAgLy8gLy8gYW5kIHRoZSBsb2NhbC1vbmx5IGxlbmd0aHM7IHRoaXMgaXMgY2hlY2tlZCBhdCBidWlsZCB0aW1lLlxuICAvLyBpZiAobG9jYWxfbGVuZ3RocyAmJiBsb2NhbF9sZW5ndGhzLmluZGV4T2YobmF0aW9uYWxOdW1iZXIubGVuZ3RoKSA+PSAwKVxuICAvLyB7XG4gIC8vIFx0cmV0dXJuICdJU19QT1NTSUJMRV9MT0NBTF9PTkxZJ1xuICAvLyB9XG5cbiAgdmFyIG1pbmltdW1fbGVuZ3RoID0gcG9zc2libGVfbGVuZ3Roc1swXTtcblxuICBpZiAobWluaW11bV9sZW5ndGggPT09IGFjdHVhbF9sZW5ndGgpIHtcbiAgICByZXR1cm4gJ0lTX1BPU1NJQkxFJztcbiAgfVxuXG4gIGlmIChtaW5pbXVtX2xlbmd0aCA+IGFjdHVhbF9sZW5ndGgpIHtcbiAgICByZXR1cm4gJ1RPT19TSE9SVCc7XG4gIH1cblxuICBpZiAocG9zc2libGVfbGVuZ3Roc1twb3NzaWJsZV9sZW5ndGhzLmxlbmd0aCAtIDFdIDwgYWN0dWFsX2xlbmd0aCkge1xuICAgIHJldHVybiAnVE9PX0xPTkcnO1xuICB9IC8vIFdlIHNraXAgdGhlIGZpcnN0IGVsZW1lbnQgc2luY2Ugd2UndmUgYWxyZWFkeSBjaGVja2VkIGl0LlxuXG5cbiAgcmV0dXJuIHBvc3NpYmxlX2xlbmd0aHMuaW5kZXhPZihhY3R1YWxfbGVuZ3RoLCAxKSA+PSAwID8gJ0lTX1BPU1NJQkxFJyA6ICdJTlZBTElEX0xFTkdUSCc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGVja051bWJlckxlbmd0aC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gY3JlYXRlRXh0ZW5zaW9uUGF0dGVybjtcblxudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vLi4vY29uc3RhbnRzLmpzXCIpO1xuXG4vLyBUaGUgUkZDIDM5NjYgZm9ybWF0IGZvciBleHRlbnNpb25zLlxudmFyIFJGQzM5NjZfRVhUTl9QUkVGSVggPSAnO2V4dD0nO1xuLyoqXHJcbiAqIEhlbHBlciBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyByZWd1bGFyIGV4cHJlc3Npb25zIGZvciBwYXJzaW5nLiBDcmVhdGVzXHJcbiAqIGFuIGV4cHJlc3Npb24gdGhhdCBjYXB0dXJlcyB1cCB0byBtYXhfbGVuZ3RoIGRpZ2l0cy5cclxuICogQHJldHVybiB7c3RyaW5nfSBSZWdFeCBwYXR0ZXJuIHRvIGNhcHR1cmUgZXh0ZW5zaW9uIGRpZ2l0cy5cclxuICovXG5cbnZhciBnZXRFeHRlbnNpb25EaWdpdHNQYXR0ZXJuID0gZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uRGlnaXRzUGF0dGVybihtYXhMZW5ndGgpIHtcbiAgcmV0dXJuIFwiKFtcIi5jb25jYXQoX2NvbnN0YW50cy5WQUxJRF9ESUdJVFMsIFwiXXsxLFwiKS5jb25jYXQobWF4TGVuZ3RoLCBcIn0pXCIpO1xufTtcbi8qKlxyXG4gKiBIZWxwZXIgaW5pdGlhbGlzZXIgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcmVndWxhci1leHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2hcclxuICogZXh0ZW5zaW9ucy5cclxuICogQ29weS1wYXN0ZWQgZnJvbSBHb29nbGUncyBgbGlicGhvbmVudW1iZXJgOlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2xpYnBob25lbnVtYmVyL2Jsb2IvNTViMjY0NmVjOTM5M2Y0ZDNkNjY2MWI5YzgyZWY5ZTI1OGU4YjgyOS9qYXZhc2NyaXB0L2kxOG4vcGhvbmVudW1iZXJzL3Bob25lbnVtYmVydXRpbC5qcyNMNzU5LUw3NjZcclxuICogQHJldHVybiB7c3RyaW5nfSBSZWdFeCBwYXR0ZXJuIHRvIGNhcHR1cmUgZXh0ZW5zaW9ucy5cclxuICovXG5cblxuZnVuY3Rpb24gY3JlYXRlRXh0ZW5zaW9uUGF0dGVybihwdXJwb3NlKSB7XG4gIC8vIFdlIGNhcCB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gZXh0ZW5zaW9uIGJhc2VkIG9uIHRoZSBhbWJpZ3VpdHkgb2YgdGhlIHdheVxuICAvLyB0aGUgZXh0ZW5zaW9uIGlzIHByZWZpeGVkLiBBcyBwZXIgSVRVLCB0aGUgb2ZmaWNpYWxseSBhbGxvd2VkIGxlbmd0aCBmb3JcbiAgLy8gZXh0ZW5zaW9ucyBpcyBhY3R1YWxseSA0MCwgYnV0IHdlIGRvbid0IHN1cHBvcnQgdGhpcyBzaW5jZSB3ZSBoYXZlbid0IHNlZW4gcmVhbFxuICAvLyBleGFtcGxlcyBhbmQgdGhpcyBpbnRyb2R1Y2VzIG1hbnkgZmFsc2UgaW50ZXJwcmV0YXRpb25zIGFzIHRoZSBleHRlbnNpb24gbGFiZWxzXG4gIC8vIGFyZSBub3Qgc3RhbmRhcmRpemVkLlxuXG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICB2YXIgZXh0TGltaXRBZnRlckV4cGxpY2l0TGFiZWwgPSAnMjAnO1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgZXh0TGltaXRBZnRlckxpa2VseUxhYmVsID0gJzE1JztcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIGV4dExpbWl0QWZ0ZXJBbWJpZ3VvdXNDaGFyID0gJzknO1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgZXh0TGltaXRXaGVuTm90U3VyZSA9ICc2JztcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIHBvc3NpYmxlU2VwYXJhdG9yc0JldHdlZW5OdW1iZXJBbmRFeHRMYWJlbCA9IFwiWyBcXHhBMFxcXFx0LF0qXCI7IC8vIE9wdGlvbmFsIGZ1bGwgc3RvcCAoLikgb3IgY29sb24sIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBzcGFjZXMvdGFicy9jb21tYXMuXG5cbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIHBvc3NpYmxlQ2hhcnNBZnRlckV4dExhYmVsID0gXCJbOlxcXFwuXFx1RkYwRV0/WyBcXHhBMFxcXFx0LC1dKlwiO1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgb3B0aW9uYWxFeHRuU3VmZml4ID0gXCIjP1wiOyAvLyBIZXJlIHRoZSBleHRlbnNpb24gaXMgY2FsbGVkIG91dCBpbiBtb3JlIGV4cGxpY2l0IHdheSwgaS5lIG1lbnRpb25pbmcgaXQgb2J2aW91c1xuICAvLyBwYXR0ZXJucyBsaWtlIFwiZXh0LlwiLlxuXG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBleHBsaWNpdEV4dExhYmVscyA9IFwiKD86ZT94dCg/OmVuc2koPzpvXFx1MDMwMT98XFx4RjMpKT9uP3xcXHVGRjQ1P1xcdUZGNThcXHVGRjU0XFx1RkY0RT98XFx1MDQzNFxcdTA0M0VcXHUwNDMxfGFuZXhvKVwiOyAvLyBPbmUtY2hhcmFjdGVyIHN5bWJvbHMgdGhhdCBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHRlbnNpb24sIGFuZCBsZXNzXG4gIC8vIGNvbW1vbmx5IHVzZWQgb3IgbW9yZSBhbWJpZ3VvdXMgZXh0ZW5zaW9uIGxhYmVscy5cblxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgYW1iaWd1b3VzRXh0TGFiZWxzID0gXCIoPzpbeFxcdUZGNTgjXFx1RkYwM35cXHVGRjVFXXxpbnR8XFx1RkY0OVxcdUZGNEVcXHVGRjU0KVwiOyAvLyBXaGVuIGV4dGVuc2lvbiBpcyBub3Qgc2VwYXJhdGVkIGNsZWFybHkuXG5cbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIGFtYmlndW91c1NlcGFyYXRvciA9IFwiWy0gXStcIjsgLy8gVGhpcyBpcyB0aGUgc2FtZSBhcyBwb3NzaWJsZVNlcGFyYXRvcnNCZXR3ZWVuTnVtYmVyQW5kRXh0TGFiZWwsIGJ1dCBub3QgbWF0Y2hpbmdcbiAgLy8gY29tbWEgYXMgZXh0ZW5zaW9uIGxhYmVsIG1heSBoYXZlIGl0LlxuXG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBwb3NzaWJsZVNlcGFyYXRvcnNOdW1iZXJFeHRMYWJlbE5vQ29tbWEgPSBcIlsgXFx4QTBcXFxcdF0qXCI7IC8vIFwiLCxcIiBpcyBjb21tb25seSB1c2VkIGZvciBhdXRvIGRpYWxsaW5nIHRoZSBleHRlbnNpb24gd2hlbiBjb25uZWN0ZWQuIEZpcnN0XG4gIC8vIGNvbW1hIGlzIG1hdGNoZWQgdGhyb3VnaCBwb3NzaWJsZVNlcGFyYXRvcnNCZXR3ZWVuTnVtYmVyQW5kRXh0TGFiZWwsIHNvIHdlIGRvXG4gIC8vIG5vdCByZXBlYXQgaXQgaGVyZS4gU2VtaS1jb2xvbiB3b3JrcyBpbiBJcGhvbmUgYW5kIEFuZHJvaWQgYWxzbyB0byBwb3AgdXAgYVxuICAvLyBidXR0b24gd2l0aCB0aGUgZXh0ZW5zaW9uIG51bWJlciBmb2xsb3dpbmcuXG5cbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIGF1dG9EaWFsbGluZ0FuZEV4dExhYmVsc0ZvdW5kID0gXCIoPzosezJ9fDspXCI7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciByZmNFeHRuID0gUkZDMzk2Nl9FWFROX1BSRUZJWCArIGdldEV4dGVuc2lvbkRpZ2l0c1BhdHRlcm4oZXh0TGltaXRBZnRlckV4cGxpY2l0TGFiZWwpO1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgZXhwbGljaXRFeHRuID0gcG9zc2libGVTZXBhcmF0b3JzQmV0d2Vlbk51bWJlckFuZEV4dExhYmVsICsgZXhwbGljaXRFeHRMYWJlbHMgKyBwb3NzaWJsZUNoYXJzQWZ0ZXJFeHRMYWJlbCArIGdldEV4dGVuc2lvbkRpZ2l0c1BhdHRlcm4oZXh0TGltaXRBZnRlckV4cGxpY2l0TGFiZWwpICsgb3B0aW9uYWxFeHRuU3VmZml4O1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgYW1iaWd1b3VzRXh0biA9IHBvc3NpYmxlU2VwYXJhdG9yc0JldHdlZW5OdW1iZXJBbmRFeHRMYWJlbCArIGFtYmlndW91c0V4dExhYmVscyArIHBvc3NpYmxlQ2hhcnNBZnRlckV4dExhYmVsICsgZ2V0RXh0ZW5zaW9uRGlnaXRzUGF0dGVybihleHRMaW1pdEFmdGVyQW1iaWd1b3VzQ2hhcikgKyBvcHRpb25hbEV4dG5TdWZmaXg7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBhbWVyaWNhblN0eWxlRXh0bldpdGhTdWZmaXggPSBhbWJpZ3VvdXNTZXBhcmF0b3IgKyBnZXRFeHRlbnNpb25EaWdpdHNQYXR0ZXJuKGV4dExpbWl0V2hlbk5vdFN1cmUpICsgXCIjXCI7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBhdXRvRGlhbGxpbmdFeHRuID0gcG9zc2libGVTZXBhcmF0b3JzTnVtYmVyRXh0TGFiZWxOb0NvbW1hICsgYXV0b0RpYWxsaW5nQW5kRXh0TGFiZWxzRm91bmQgKyBwb3NzaWJsZUNoYXJzQWZ0ZXJFeHRMYWJlbCArIGdldEV4dGVuc2lvbkRpZ2l0c1BhdHRlcm4oZXh0TGltaXRBZnRlckxpa2VseUxhYmVsKSArIG9wdGlvbmFsRXh0blN1ZmZpeDtcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIG9ubHlDb21tYXNFeHRuID0gcG9zc2libGVTZXBhcmF0b3JzTnVtYmVyRXh0TGFiZWxOb0NvbW1hICsgXCIoPzosKStcIiArIHBvc3NpYmxlQ2hhcnNBZnRlckV4dExhYmVsICsgZ2V0RXh0ZW5zaW9uRGlnaXRzUGF0dGVybihleHRMaW1pdEFmdGVyQW1iaWd1b3VzQ2hhcikgKyBvcHRpb25hbEV4dG5TdWZmaXg7IC8vIFRoZSBmaXJzdCByZWd1bGFyIGV4cHJlc3Npb24gY292ZXJzIFJGQyAzOTY2IGZvcm1hdCwgd2hlcmUgdGhlIGV4dGVuc2lvbiBpcyBhZGRlZFxuICAvLyB1c2luZyBcIjtleHQ9XCIuIFRoZSBzZWNvbmQgbW9yZSBnZW5lcmljIHdoZXJlIGV4dGVuc2lvbiBpcyBtZW50aW9uZWQgd2l0aCBleHBsaWNpdFxuICAvLyBsYWJlbHMgbGlrZSBcImV4dDpcIi4gSW4gYm90aCB0aGUgYWJvdmUgY2FzZXMgd2UgYWxsb3cgbW9yZSBudW1iZXJzIGluIGV4dGVuc2lvbiB0aGFuXG4gIC8vIGFueSBvdGhlciBleHRlbnNpb24gbGFiZWxzLiBUaGUgdGhpcmQgb25lIGNhcHR1cmVzIHdoZW4gc2luZ2xlIGNoYXJhY3RlciBleHRlbnNpb25cbiAgLy8gbGFiZWxzIG9yIGxlc3MgY29tbW9ubHkgdXNlZCBsYWJlbHMgYXJlIHVzZWQuIEluIHN1Y2ggY2FzZXMgd2UgY2FwdHVyZSBmZXdlclxuICAvLyBleHRlbnNpb24gZGlnaXRzIGluIG9yZGVyIHRvIHJlZHVjZSB0aGUgY2hhbmNlIG9mIGZhbHNlbHkgaW50ZXJwcmV0aW5nIHR3b1xuICAvLyBudW1iZXJzIGJlc2lkZSBlYWNoIG90aGVyIGFzIGEgbnVtYmVyICsgZXh0ZW5zaW9uLiBUaGUgZm91cnRoIG9uZSBjb3ZlcnMgdGhlXG4gIC8vIHNwZWNpYWwgY2FzZSBvZiBBbWVyaWNhbiBudW1iZXJzIHdoZXJlIHRoZSBleHRlbnNpb24gaXMgd3JpdHRlbiB3aXRoIGEgaGFzaFxuICAvLyBhdCB0aGUgZW5kLCBzdWNoIGFzIFwiLSA1MDMjXCIuIFRoZSBmaWZ0aCBvbmUgaXMgZXhjbHVzaXZlbHkgZm9yIGV4dGVuc2lvblxuICAvLyBhdXRvZGlhbGxpbmcgZm9ybWF0cyB3aGljaCBhcmUgdXNlZCB3aGVuIGRpYWxsaW5nIGFuZCBpbiB0aGlzIGNhc2Ugd2UgYWNjZXB0IGxvbmdlclxuICAvLyBleHRlbnNpb25zLiBUaGUgbGFzdCBvbmUgaXMgbW9yZSBsaWJlcmFsIG9uIHRoZSBudW1iZXIgb2YgY29tbWFzIHRoYXQgYWN0cyBhc1xuICAvLyBleHRlbnNpb24gbGFiZWxzLCBzbyB3ZSBoYXZlIGEgc3RyaWN0IGNhcCBvbiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpbiBzdWNoIGV4dGVuc2lvbnMuXG5cbiAgcmV0dXJuIHJmY0V4dG4gKyBcInxcIiArIGV4cGxpY2l0RXh0biArIFwifFwiICsgYW1iaWd1b3VzRXh0biArIFwifFwiICsgYW1lcmljYW5TdHlsZUV4dG5XaXRoU3VmZml4ICsgXCJ8XCIgKyBhdXRvRGlhbGxpbmdFeHRuICsgXCJ8XCIgKyBvbmx5Q29tbWFzRXh0bjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNyZWF0ZUV4dGVuc2lvblBhdHRlcm4uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGV4dHJhY3RFeHRlbnNpb247XG5cbnZhciBfY3JlYXRlRXh0ZW5zaW9uUGF0dGVybiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY3JlYXRlRXh0ZW5zaW9uUGF0dGVybi5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG4vLyBSZWdleHAgb2YgYWxsIGtub3duIGV4dGVuc2lvbiBwcmVmaXhlcyB1c2VkIGJ5IGRpZmZlcmVudCByZWdpb25zIGZvbGxvd2VkIGJ5XG4vLyAxIG9yIG1vcmUgdmFsaWQgZGlnaXRzLCBmb3IgdXNlIHdoZW4gcGFyc2luZy5cbnZhciBFWFROX1BBVFRFUk4gPSBuZXcgUmVnRXhwKCcoPzonICsgKDAsIF9jcmVhdGVFeHRlbnNpb25QYXR0ZXJuW1wiZGVmYXVsdFwiXSkoKSArICcpJCcsICdpJyk7IC8vIFN0cmlwcyBhbnkgZXh0ZW5zaW9uIChhcyBpbiwgdGhlIHBhcnQgb2YgdGhlIG51bWJlciBkaWFsbGVkIGFmdGVyIHRoZSBjYWxsIGlzXG4vLyBjb25uZWN0ZWQsIHVzdWFsbHkgaW5kaWNhdGVkIHdpdGggZXh0biwgZXh0LCB4IG9yIHNpbWlsYXIpIGZyb20gdGhlIGVuZCBvZlxuLy8gdGhlIG51bWJlciwgYW5kIHJldHVybnMgaXQuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFeHRlbnNpb24obnVtYmVyKSB7XG4gIHZhciBzdGFydCA9IG51bWJlci5zZWFyY2goRVhUTl9QQVRURVJOKTtcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9IC8vIElmIHdlIGZpbmQgYSBwb3RlbnRpYWwgZXh0ZW5zaW9uLCBhbmQgdGhlIG51bWJlciBwcmVjZWRpbmcgdGhpcyBpcyBhIHZpYWJsZVxuICAvLyBudW1iZXIsIHdlIGFzc3VtZSBpdCBpcyBhbiBleHRlbnNpb24uXG5cblxuICB2YXIgbnVtYmVyV2l0aG91dEV4dGVuc2lvbiA9IG51bWJlci5zbGljZSgwLCBzdGFydCk7XG4gIHZhciBtYXRjaGVzID0gbnVtYmVyLm1hdGNoKEVYVE5fUEFUVEVSTik7XG4gIHZhciBpID0gMTtcblxuICB3aGlsZSAoaSA8IG1hdGNoZXMubGVuZ3RoKSB7XG4gICAgaWYgKG1hdGNoZXNbaV0pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG51bWJlcjogbnVtYmVyV2l0aG91dEV4dGVuc2lvbixcbiAgICAgICAgZXh0OiBtYXRjaGVzW2ldXG4gICAgICB9O1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXh0cmFjdEV4dGVuc2lvbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZTtcblxudmFyIF9zdHJpcElkZFByZWZpeCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3RyaXBJZGRQcmVmaXguanNcIikpO1xuXG52YXIgX2V4dHJhY3RDb3VudHJ5Q2FsbGluZ0NvZGVGcm9tSW50ZXJuYXRpb25hbE51bWJlcldpdGhvdXRQbHVzU2lnbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZUZyb21JbnRlcm5hdGlvbmFsTnVtYmVyV2l0aG91dFBsdXNTaWduLmpzXCIpKTtcblxudmFyIF9tZXRhZGF0YSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL21ldGFkYXRhLmpzXCIpKTtcblxudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyoqXHJcbiAqIENvbnZlcnRzIGEgcGhvbmUgbnVtYmVyIGRpZ2l0cyAocG9zc2libHkgd2l0aCBhIGArYClcclxuICogaW50byBhIGNhbGxpbmcgY29kZSBhbmQgdGhlIHJlc3QgcGhvbmUgbnVtYmVyIGRpZ2l0cy5cclxuICogVGhlIFwicmVzdCBwaG9uZSBudW1iZXIgZGlnaXRzXCIgY291bGQgaW5jbHVkZVxyXG4gKiBhIG5hdGlvbmFsIHByZWZpeCwgY2FycmllciBjb2RlLCBhbmQgbmF0aW9uYWxcclxuICogKHNpZ25pZmljYW50KSBudW1iZXIuXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gbnVtYmVyIOKAlCBQaG9uZSBudW1iZXIgZGlnaXRzIChwb3NzaWJseSB3aXRoIGEgYCtgKS5cclxuICogQHBhcmFtICB7c3RyaW5nfSBbY291bnRyeV0g4oCUwqBEZWZhdWx0IGNvdW50cnkuXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gW2NhbGxpbmdDb2RlXSDigJQgRGVmYXVsdCBjYWxsaW5nIGNvZGUgKHNvbWUgcGhvbmUgbnVtYmVyaW5nIHBsYW5zIGFyZSBub24tZ2VvZ3JhcGhpYykuXHJcbiAqIEBwYXJhbSAge29iamVjdH0gbWV0YWRhdGFcclxuICogQHJldHVybiB7b2JqZWN0fSBgeyBjb3VudHJ5Q2FsbGluZ0NvZGVTb3VyY2U6IHN0cmluZz8sIGNvdW50cnlDYWxsaW5nQ29kZTogc3RyaW5nPywgbnVtYmVyOiBzdHJpbmcgfWBcclxuICogQGV4YW1wbGVcclxuICogLy8gUmV0dXJucyBgeyBjb3VudHJ5Q2FsbGluZ0NvZGU6IFwiMVwiLCBudW1iZXI6IFwiMjEzMzczNDI1M1wiIH1gLlxyXG4gKiBleHRyYWN0Q291bnRyeUNhbGxpbmdDb2RlKCcyMTMzNzM0MjUzJywgJ1VTJywgbnVsbCwgbWV0YWRhdGEpXHJcbiAqIGV4dHJhY3RDb3VudHJ5Q2FsbGluZ0NvZGUoJzIxMzM3MzQyNTMnLCBudWxsLCAnMScsIG1ldGFkYXRhKVxyXG4gKiBleHRyYWN0Q291bnRyeUNhbGxpbmdDb2RlKCcrMTIxMzM3MzQyNTMnLCBudWxsLCBudWxsLCBtZXRhZGF0YSlcclxuICogZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZSgnKzEyMTMzNzM0MjUzJywgJ1JVJywgbnVsbCwgbWV0YWRhdGEpXHJcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZShudW1iZXIsIGNvdW50cnksIGNhbGxpbmdDb2RlLCBtZXRhZGF0YSkge1xuICBpZiAoIW51bWJlcikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHZhciBpc051bWJlcldpdGhJZGRQcmVmaXg7IC8vIElmIHRoaXMgaXMgbm90IGFuIGludGVybmF0aW9uYWwgcGhvbmUgbnVtYmVyLFxuICAvLyB0aGVuIGVpdGhlciBleHRyYWN0IGFuIFwiSUREXCIgcHJlZml4LCBvciBleHRyYWN0IGFcbiAgLy8gY291bnRyeSBjYWxsaW5nIGNvZGUgZnJvbSBhIG51bWJlciBieSBhdXRvY29ycmVjdGluZyBpdFxuICAvLyBieSBwcmVwZW5kaW5nIGEgbGVhZGluZyBgK2AgaW4gY2FzZXMgd2hlbiBpdCBzdGFydHNcbiAgLy8gd2l0aCB0aGUgY291bnRyeSBjYWxsaW5nIGNvZGUuXG4gIC8vIGh0dHBzOi8vd2lraXRyYXZlbC5vcmcvZW4vSW50ZXJuYXRpb25hbF9kaWFsbGluZ19wcmVmaXhcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NhdGFtcGhldGFtaW5lL2xpYnBob25lbnVtYmVyLWpzL2lzc3Vlcy8zNzZcblxuICBpZiAobnVtYmVyWzBdICE9PSAnKycpIHtcbiAgICAvLyBDb252ZXJ0IGFuIFwib3V0LW9mLWNvdW50cnlcIiBkaWFsaW5nIHBob25lIG51bWJlclxuICAgIC8vIHRvIGEgcHJvcGVyIGludGVybmF0aW9uYWwgcGhvbmUgbnVtYmVyLlxuICAgIHZhciBudW1iZXJXaXRob3V0SUREID0gKDAsIF9zdHJpcElkZFByZWZpeFtcImRlZmF1bHRcIl0pKG51bWJlciwgY291bnRyeSwgY2FsbGluZ0NvZGUsIG1ldGFkYXRhKTsgLy8gSWYgYW4gSUREIHByZWZpeCB3YXMgc3RyaXBwZWQgdGhlblxuICAgIC8vIGNvbnZlcnQgdGhlIG51bWJlciB0byBpbnRlcm5hdGlvbmFsIG9uZVxuICAgIC8vIGZvciBzdWJzZXF1ZW50IHBhcnNpbmcuXG5cbiAgICBpZiAobnVtYmVyV2l0aG91dElERCAmJiBudW1iZXJXaXRob3V0SUREICE9PSBudW1iZXIpIHtcbiAgICAgIGlzTnVtYmVyV2l0aElkZFByZWZpeCA9IHRydWU7XG4gICAgICBudW1iZXIgPSAnKycgKyBudW1iZXJXaXRob3V0SUREO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG51bWJlciBzdGFydHMgd2l0aCB0aGUgY291bnRyeSBjYWxsaW5nIGNvZGVcbiAgICAgIC8vIGZvciB0aGUgZGVmYXVsdCBjb3VudHJ5LiBJZiBzbywgd2UgcmVtb3ZlIHRoZSBjb3VudHJ5IGNhbGxpbmcgY29kZSxcbiAgICAgIC8vIGFuZCBkbyBzb21lIGNoZWNrcyBvbiB0aGUgdmFsaWRpdHkgb2YgdGhlIG51bWJlciBiZWZvcmUgYW5kIGFmdGVyLlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NhdGFtcGhldGFtaW5lL2xpYnBob25lbnVtYmVyLWpzL2lzc3Vlcy8zNzZcbiAgICAgIGlmIChjb3VudHJ5IHx8IGNhbGxpbmdDb2RlKSB7XG4gICAgICAgIHZhciBfZXh0cmFjdENvdW50cnlDYWxsaW4gPSAoMCwgX2V4dHJhY3RDb3VudHJ5Q2FsbGluZ0NvZGVGcm9tSW50ZXJuYXRpb25hbE51bWJlcldpdGhvdXRQbHVzU2lnbltcImRlZmF1bHRcIl0pKG51bWJlciwgY291bnRyeSwgY2FsbGluZ0NvZGUsIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIGNvdW50cnlDYWxsaW5nQ29kZSA9IF9leHRyYWN0Q291bnRyeUNhbGxpbi5jb3VudHJ5Q2FsbGluZ0NvZGUsXG4gICAgICAgICAgICBzaG9ydGVyTnVtYmVyID0gX2V4dHJhY3RDb3VudHJ5Q2FsbGluLm51bWJlcjtcblxuICAgICAgICBpZiAoY291bnRyeUNhbGxpbmdDb2RlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvdW50cnlDYWxsaW5nQ29kZVNvdXJjZTogJ0ZST01fTlVNQkVSX1dJVEhPVVRfUExVU19TSUdOJyxcbiAgICAgICAgICAgIGNvdW50cnlDYWxsaW5nQ29kZTogY291bnRyeUNhbGxpbmdDb2RlLFxuICAgICAgICAgICAgbnVtYmVyOiBzaG9ydGVyTnVtYmVyXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAvLyBObyBuZWVkIHRvIHNldCBpdCB0byBgVU5TUEVDSUZJRURgLiBJdCBjYW4gYmUganVzdCBgdW5kZWZpbmVkYC5cbiAgICAgICAgLy8gY291bnRyeUNhbGxpbmdDb2RlU291cmNlOiAnVU5TUEVDSUZJRUQnLFxuICAgICAgICBudW1iZXI6IG51bWJlclxuICAgICAgfTtcbiAgICB9XG4gIH0gLy8gRmFzdCBhYm9ydGlvbjogY291bnRyeSBjb2RlcyBkbyBub3QgYmVnaW4gd2l0aCBhICcwJ1xuXG5cbiAgaWYgKG51bWJlclsxXSA9PT0gJzAnKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgbWV0YWRhdGEgPSBuZXcgX21ldGFkYXRhW1wiZGVmYXVsdFwiXShtZXRhZGF0YSk7IC8vIFRoZSB0aGluZyB3aXRoIGNvdW50cnkgcGhvbmUgY29kZXNcbiAgLy8gaXMgdGhhdCB0aGV5IGFyZSBvcnRob2dvbmFsIHRvIGVhY2ggb3RoZXJcbiAgLy8gaS5lLiB0aGVyZSdzIG5vIHN1Y2ggY291bnRyeSBwaG9uZSBjb2RlIEFcbiAgLy8gZm9yIHdoaWNoIGNvdW50cnkgcGhvbmUgY29kZSBCIGV4aXN0c1xuICAvLyB3aGVyZSBCIHN0YXJ0cyB3aXRoIEEuXG4gIC8vIFRoZXJlZm9yZSwgd2hpbGUgc2Nhbm5pbmcgZGlnaXRzLFxuICAvLyBpZiBhIHZhbGlkIGNvdW50cnkgY29kZSBpcyBmb3VuZCxcbiAgLy8gdGhhdCBtZWFucyB0aGF0IGl0IGlzIHRoZSBjb3VudHJ5IGNvZGUuXG4gIC8vXG5cbiAgdmFyIGkgPSAyO1xuXG4gIHdoaWxlIChpIC0gMSA8PSBfY29uc3RhbnRzLk1BWF9MRU5HVEhfQ09VTlRSWV9DT0RFICYmIGkgPD0gbnVtYmVyLmxlbmd0aCkge1xuICAgIHZhciBfY291bnRyeUNhbGxpbmdDb2RlID0gbnVtYmVyLnNsaWNlKDEsIGkpO1xuXG4gICAgaWYgKG1ldGFkYXRhLmhhc0NhbGxpbmdDb2RlKF9jb3VudHJ5Q2FsbGluZ0NvZGUpKSB7XG4gICAgICBtZXRhZGF0YS5zZWxlY3ROdW1iZXJpbmdQbGFuKF9jb3VudHJ5Q2FsbGluZ0NvZGUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY291bnRyeUNhbGxpbmdDb2RlU291cmNlOiBpc051bWJlcldpdGhJZGRQcmVmaXggPyAnRlJPTV9OVU1CRVJfV0lUSF9JREQnIDogJ0ZST01fTlVNQkVSX1dJVEhfUExVU19TSUdOJyxcbiAgICAgICAgY291bnRyeUNhbGxpbmdDb2RlOiBfY291bnRyeUNhbGxpbmdDb2RlLFxuICAgICAgICBudW1iZXI6IG51bWJlci5zbGljZShpKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4ge307XG59IC8vIFRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSByZXR1cm5lZCBgY291bnRyeUNhbGxpbmdDb2RlU291cmNlYCBhcmU6XG4vL1xuLy8gQ29weS1wYXN0ZWQgZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvbGlicGhvbmVudW1iZXIvYmxvYi9tYXN0ZXIvcmVzb3VyY2VzL3Bob25lbnVtYmVyLnByb3RvXG4vL1xuLy8gLy8gVGhlIHNvdXJjZSBmcm9tIHdoaWNoIHRoZSBjb3VudHJ5X2NvZGUgaXMgZGVyaXZlZC4gVGhpcyBpcyBub3Qgc2V0IGluIHRoZVxuLy8gLy8gZ2VuZXJhbCBwYXJzaW5nIG1ldGhvZCwgYnV0IGluIHRoZSBtZXRob2QgdGhhdCBwYXJzZXMgYW5kIGtlZXBzIHJhd19pbnB1dC5cbi8vIC8vIE5ldyBmaWVsZHMgY291bGQgYmUgYWRkZWQgdXBvbiByZXF1ZXN0LlxuLy8gZW51bSBDb3VudHJ5Q29kZVNvdXJjZSB7XG4vLyAgLy8gRGVmYXVsdCB2YWx1ZSByZXR1cm5lZCBpZiB0aGlzIGlzIG5vdCBzZXQsIGJlY2F1c2UgdGhlIHBob25lIG51bWJlciB3YXNcbi8vICAvLyBjcmVhdGVkIHVzaW5nIHBhcnNlLCBub3QgcGFyc2VBbmRLZWVwUmF3SW5wdXQuIGhhc0NvdW50cnlDb2RlU291cmNlIHdpbGxcbi8vICAvLyByZXR1cm4gZmFsc2UgaWYgdGhpcyBpcyB0aGUgY2FzZS5cbi8vICBVTlNQRUNJRklFRCA9IDA7XG4vL1xuLy8gIC8vIFRoZSBjb3VudHJ5X2NvZGUgaXMgZGVyaXZlZCBiYXNlZCBvbiBhIHBob25lIG51bWJlciB3aXRoIGEgbGVhZGluZyBcIitcIixcbi8vICAvLyBlLmcuIHRoZSBGcmVuY2ggbnVtYmVyIFwiKzMzIDEgNDIgNjggNTMgMDBcIi5cbi8vICBGUk9NX05VTUJFUl9XSVRIX1BMVVNfU0lHTiA9IDE7XG4vL1xuLy8gIC8vIFRoZSBjb3VudHJ5X2NvZGUgaXMgZGVyaXZlZCBiYXNlZCBvbiBhIHBob25lIG51bWJlciB3aXRoIGEgbGVhZGluZyBJREQsXG4vLyAgLy8gZS5nLiB0aGUgRnJlbmNoIG51bWJlciBcIjAxMSAzMyAxIDQyIDY4IDUzIDAwXCIsIGFzIGl0IGlzIGRpYWxsZWQgZnJvbSBVUy5cbi8vICBGUk9NX05VTUJFUl9XSVRIX0lERCA9IDU7XG4vL1xuLy8gIC8vIFRoZSBjb3VudHJ5X2NvZGUgaXMgZGVyaXZlZCBiYXNlZCBvbiBhIHBob25lIG51bWJlciB3aXRob3V0IGEgbGVhZGluZ1xuLy8gIC8vIFwiK1wiLCBlLmcuIHRoZSBGcmVuY2ggbnVtYmVyIFwiMzMgMSA0MiA2OCA1MyAwMFwiIHdoZW4gZGVmYXVsdENvdW50cnkgaXNcbi8vICAvLyBzdXBwbGllZCBhcyBGcmFuY2UuXG4vLyAgRlJPTV9OVU1CRVJfV0lUSE9VVF9QTFVTX1NJR04gPSAxMDtcbi8vXG4vLyAgLy8gVGhlIGNvdW50cnlfY29kZSBpcyBkZXJpdmVkIE5PVCBiYXNlZCBvbiB0aGUgcGhvbmUgbnVtYmVyIGl0c2VsZiwgYnV0XG4vLyAgLy8gZnJvbSB0aGUgZGVmYXVsdENvdW50cnkgcGFyYW1ldGVyIHByb3ZpZGVkIGluIHRoZSBwYXJzaW5nIGZ1bmN0aW9uIGJ5IHRoZVxuLy8gIC8vIGNsaWVudHMuIFRoaXMgaGFwcGVucyBtb3N0bHkgZm9yIG51bWJlcnMgd3JpdHRlbiBpbiB0aGUgbmF0aW9uYWwgZm9ybWF0XG4vLyAgLy8gKHdpdGhvdXQgY291bnRyeSBjb2RlKS4gRm9yIGV4YW1wbGUsIHRoaXMgd291bGQgYmUgc2V0IHdoZW4gcGFyc2luZyB0aGVcbi8vICAvLyBGcmVuY2ggbnVtYmVyIFwiMDEgNDIgNjggNTMgMDBcIiwgd2hlbiBkZWZhdWx0Q291bnRyeSBpcyBzdXBwbGllZCBhc1xuLy8gIC8vIEZyYW5jZS5cbi8vICBGUk9NX0RFRkFVTFRfQ09VTlRSWSA9IDIwO1xuLy8gfVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZUZyb21JbnRlcm5hdGlvbmFsTnVtYmVyV2l0aG91dFBsdXNTaWduO1xuXG52YXIgX21ldGFkYXRhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbWV0YWRhdGEuanNcIikpO1xuXG52YXIgX21hdGNoZXNFbnRpcmVseSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbWF0Y2hlc0VudGlyZWx5LmpzXCIpKTtcblxudmFyIF9leHRyYWN0TmF0aW9uYWxOdW1iZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2V4dHJhY3ROYXRpb25hbE51bWJlci5qc1wiKSk7XG5cbnZhciBfY2hlY2tOdW1iZXJMZW5ndGggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NoZWNrTnVtYmVyTGVuZ3RoLmpzXCIpKTtcblxudmFyIF9nZXRDb3VudHJ5Q2FsbGluZ0NvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9nZXRDb3VudHJ5Q2FsbGluZ0NvZGUuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyoqXHJcbiAqIFNvbWV0aW1lcyBzb21lIHBlb3BsZSBpbmNvcnJlY3RseSBpbnB1dCBpbnRlcm5hdGlvbmFsIHBob25lIG51bWJlcnNcclxuICogd2l0aG91dCB0aGUgbGVhZGluZyBgK2AuIFRoaXMgZnVuY3Rpb24gY29ycmVjdHMgc3VjaCBpbnB1dC5cclxuICogQHBhcmFtICB7c3RyaW5nfSBudW1iZXIg4oCUIFBob25lIG51bWJlciBkaWdpdHMuXHJcbiAqIEBwYXJhbSAge3N0cmluZz99IGNvdW50cnlcclxuICogQHBhcmFtICB7c3RyaW5nP30gY2FsbGluZ0NvZGVcclxuICogQHBhcmFtICB7b2JqZWN0fSBtZXRhZGF0YVxyXG4gKiBAcmV0dXJuIHtvYmplY3R9IGB7IGNvdW50cnlDYWxsaW5nQ29kZTogc3RyaW5nPywgbnVtYmVyOiBzdHJpbmcgfWAuXHJcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZUZyb21JbnRlcm5hdGlvbmFsTnVtYmVyV2l0aG91dFBsdXNTaWduKG51bWJlciwgY291bnRyeSwgY2FsbGluZ0NvZGUsIG1ldGFkYXRhKSB7XG4gIHZhciBjb3VudHJ5Q2FsbGluZ0NvZGUgPSBjb3VudHJ5ID8gKDAsIF9nZXRDb3VudHJ5Q2FsbGluZ0NvZGVbXCJkZWZhdWx0XCJdKShjb3VudHJ5LCBtZXRhZGF0YSkgOiBjYWxsaW5nQ29kZTtcblxuICBpZiAobnVtYmVyLmluZGV4T2YoY291bnRyeUNhbGxpbmdDb2RlKSA9PT0gMCkge1xuICAgIG1ldGFkYXRhID0gbmV3IF9tZXRhZGF0YVtcImRlZmF1bHRcIl0obWV0YWRhdGEpO1xuICAgIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oY291bnRyeSwgY2FsbGluZ0NvZGUpO1xuICAgIHZhciBwb3NzaWJsZVNob3J0ZXJOdW1iZXIgPSBudW1iZXIuc2xpY2UoY291bnRyeUNhbGxpbmdDb2RlLmxlbmd0aCk7XG5cbiAgICB2YXIgX2V4dHJhY3ROYXRpb25hbE51bWJlID0gKDAsIF9leHRyYWN0TmF0aW9uYWxOdW1iZXJbXCJkZWZhdWx0XCJdKShwb3NzaWJsZVNob3J0ZXJOdW1iZXIsIG1ldGFkYXRhKSxcbiAgICAgICAgcG9zc2libGVTaG9ydGVyTmF0aW9uYWxOdW1iZXIgPSBfZXh0cmFjdE5hdGlvbmFsTnVtYmUubmF0aW9uYWxOdW1iZXI7XG5cbiAgICB2YXIgX2V4dHJhY3ROYXRpb25hbE51bWJlMiA9ICgwLCBfZXh0cmFjdE5hdGlvbmFsTnVtYmVyW1wiZGVmYXVsdFwiXSkobnVtYmVyLCBtZXRhZGF0YSksXG4gICAgICAgIG5hdGlvbmFsTnVtYmVyID0gX2V4dHJhY3ROYXRpb25hbE51bWJlMi5uYXRpb25hbE51bWJlcjsgLy8gSWYgdGhlIG51bWJlciB3YXMgbm90IHZhbGlkIGJlZm9yZSBidXQgaXMgdmFsaWQgbm93LFxuICAgIC8vIG9yIGlmIGl0IHdhcyB0b28gbG9uZyBiZWZvcmUsIHdlIGNvbnNpZGVyIHRoZSBudW1iZXJcbiAgICAvLyB3aXRoIHRoZSBjb3VudHJ5IGNhbGxpbmcgY29kZSBzdHJpcHBlZCB0byBiZSBhIGJldHRlciByZXN1bHRcbiAgICAvLyBhbmQga2VlcCB0aGF0IGluc3RlYWQuXG4gICAgLy8gRm9yIGV4YW1wbGUsIGluIEdlcm1hbnkgKCs0OSksIGA0OWAgaXMgYSB2YWxpZCBhcmVhIGNvZGUsXG4gICAgLy8gc28gaWYgYSBudW1iZXIgc3RhcnRzIHdpdGggYDQ5YCwgaXQgY291bGQgYmUgYm90aCBhIHZhbGlkXG4gICAgLy8gbmF0aW9uYWwgR2VybWFuIG51bWJlciBvciBhbiBpbnRlcm5hdGlvbmFsIG51bWJlciB3aXRob3V0XG4gICAgLy8gYSBsZWFkaW5nIGArYC5cblxuXG4gICAgaWYgKCEoMCwgX21hdGNoZXNFbnRpcmVseVtcImRlZmF1bHRcIl0pKG5hdGlvbmFsTnVtYmVyLCBtZXRhZGF0YS5uYXRpb25hbE51bWJlclBhdHRlcm4oKSkgJiYgKDAsIF9tYXRjaGVzRW50aXJlbHlbXCJkZWZhdWx0XCJdKShwb3NzaWJsZVNob3J0ZXJOYXRpb25hbE51bWJlciwgbWV0YWRhdGEubmF0aW9uYWxOdW1iZXJQYXR0ZXJuKCkpIHx8ICgwLCBfY2hlY2tOdW1iZXJMZW5ndGhbXCJkZWZhdWx0XCJdKShuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpID09PSAnVE9PX0xPTkcnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb3VudHJ5Q2FsbGluZ0NvZGU6IGNvdW50cnlDYWxsaW5nQ29kZSxcbiAgICAgICAgbnVtYmVyOiBwb3NzaWJsZVNob3J0ZXJOdW1iZXJcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBudW1iZXI6IG51bWJlclxuICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZUZyb21JbnRlcm5hdGlvbmFsTnVtYmVyV2l0aG91dFBsdXNTaWduLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGV4dHJhY3RGb3JtYXR0ZWRQaG9uZU51bWJlckZyb21Qb3NzaWJsZVJmYzM5NjZOdW1iZXJVcmk7XG5cbnZhciBfZXh0cmFjdFBob25lQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2V4dHJhY3RQaG9uZUNvbnRleHQuanNcIikpO1xuXG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9QYXJzZUVycm9yLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkgeyBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBcImRlZmF1bHRcIjogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuLyoqXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gbnVtYmVyVG9QYXJzZVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5hdGlvbmFsTnVtYmVyXHJcbiAqIEByZXR1cm4ge31cclxuICovXG5mdW5jdGlvbiBleHRyYWN0Rm9ybWF0dGVkUGhvbmVOdW1iZXJGcm9tUG9zc2libGVSZmMzOTY2TnVtYmVyVXJpKG51bWJlclRvUGFyc2UsIF9yZWYpIHtcbiAgdmFyIGV4dHJhY3RGb3JtYXR0ZWRQaG9uZU51bWJlciA9IF9yZWYuZXh0cmFjdEZvcm1hdHRlZFBob25lTnVtYmVyO1xuICB2YXIgcGhvbmVDb250ZXh0ID0gKDAsIF9leHRyYWN0UGhvbmVDb250ZXh0W1wiZGVmYXVsdFwiXSkobnVtYmVyVG9QYXJzZSk7XG5cbiAgaWYgKCEoMCwgX2V4dHJhY3RQaG9uZUNvbnRleHQuaXNQaG9uZUNvbnRleHRWYWxpZCkocGhvbmVDb250ZXh0KSkge1xuICAgIHRocm93IG5ldyBfUGFyc2VFcnJvcltcImRlZmF1bHRcIl0oJ05PVF9BX05VTUJFUicpO1xuICB9XG5cbiAgdmFyIHBob25lTnVtYmVyU3RyaW5nO1xuXG4gIGlmIChwaG9uZUNvbnRleHQgPT09IG51bGwpIHtcbiAgICAvLyBFeHRyYWN0IGEgcG9zc2libGUgbnVtYmVyIGZyb20gdGhlIHN0cmluZyBwYXNzZWQgaW4uXG4gICAgLy8gKHRoaXMgc3RyaXBzIGxlYWRpbmcgY2hhcmFjdGVycyB0aGF0IGNvdWxkIG5vdCBiZSB0aGUgc3RhcnQgb2YgYSBwaG9uZSBudW1iZXIpXG4gICAgcGhvbmVOdW1iZXJTdHJpbmcgPSBleHRyYWN0Rm9ybWF0dGVkUGhvbmVOdW1iZXIobnVtYmVyVG9QYXJzZSkgfHwgJyc7XG4gIH0gZWxzZSB7XG4gICAgcGhvbmVOdW1iZXJTdHJpbmcgPSAnJzsgLy8gSWYgdGhlIHBob25lIGNvbnRleHQgY29udGFpbnMgYSBwaG9uZSBudW1iZXIgcHJlZml4LCB3ZSBuZWVkIHRvIGNhcHR1cmVcbiAgICAvLyBpdCwgd2hlcmVhcyBkb21haW5zIHdpbGwgYmUgaWdub3JlZC5cblxuICAgIGlmIChwaG9uZUNvbnRleHQuY2hhckF0KDApID09PSBfZXh0cmFjdFBob25lQ29udGV4dC5QTFVTX1NJR04pIHtcbiAgICAgIHBob25lTnVtYmVyU3RyaW5nICs9IHBob25lQ29udGV4dDtcbiAgICB9IC8vIE5vdyBhcHBlbmQgZXZlcnl0aGluZyBiZXR3ZWVuIHRoZSBcInRlbDpcIiBwcmVmaXggYW5kIHRoZSBwaG9uZS1jb250ZXh0LlxuICAgIC8vIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIG5hdGlvbmFsIG51bWJlciwgYW4gb3B0aW9uYWwgZXh0ZW5zaW9uIG9yXG4gICAgLy8gaXNkbi1zdWJhZGRyZXNzIGNvbXBvbmVudC4gTm90ZSB3ZSBhbHNvIGhhbmRsZSB0aGUgY2FzZSB3aGVuIFwidGVsOlwiIGlzXG4gICAgLy8gbWlzc2luZywgYXMgd2UgaGF2ZSBzZWVuIGluIHNvbWUgb2YgdGhlIHBob25lIG51bWJlciBpbnB1dHMuXG4gICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSBhcHBlbmQgZXZlcnl0aGluZyBmcm9tIHRoZSBiZWdpbm5pbmcuXG5cblxuICAgIHZhciBpbmRleE9mUmZjMzk2NlByZWZpeCA9IG51bWJlclRvUGFyc2UuaW5kZXhPZihfZXh0cmFjdFBob25lQ29udGV4dC5SRkMzOTY2X1BSRUZJWF8pO1xuICAgIHZhciBpbmRleE9mTmF0aW9uYWxOdW1iZXI7IC8vIFJGQyAzOTY2IFwidGVsOlwiIHByZWZpeCBpcyBwcmVzZXQgYXQgdGhpcyBzdGFnZSBiZWNhdXNlXG4gICAgLy8gYGlzUGhvbmVDb250ZXh0VmFsaWQoKWAgcmVxdWlyZXMgaXQgdG8gYmUgcHJlc2VudC5cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cbiAgICBpZiAoaW5kZXhPZlJmYzM5NjZQcmVmaXggPj0gMCkge1xuICAgICAgaW5kZXhPZk5hdGlvbmFsTnVtYmVyID0gaW5kZXhPZlJmYzM5NjZQcmVmaXggKyBfZXh0cmFjdFBob25lQ29udGV4dC5SRkMzOTY2X1BSRUZJWF8ubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleE9mTmF0aW9uYWxOdW1iZXIgPSAwO1xuICAgIH1cblxuICAgIHZhciBpbmRleE9mUGhvbmVDb250ZXh0ID0gbnVtYmVyVG9QYXJzZS5pbmRleE9mKF9leHRyYWN0UGhvbmVDb250ZXh0LlJGQzM5NjZfUEhPTkVfQ09OVEVYVF8pO1xuICAgIHBob25lTnVtYmVyU3RyaW5nICs9IG51bWJlclRvUGFyc2Uuc3Vic3RyaW5nKGluZGV4T2ZOYXRpb25hbE51bWJlciwgaW5kZXhPZlBob25lQ29udGV4dCk7XG4gIH0gLy8gRGVsZXRlIHRoZSBpc2RuLXN1YmFkZHJlc3MgYW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXQgaWYgaXQgaXMgcHJlc2VudC5cbiAgLy8gTm90ZSBleHRlbnNpb24gd29uJ3QgYXBwZWFyIGF0IHRoZSBzYW1lIHRpbWUgd2l0aCBpc2RuLXN1YmFkZHJlc3NcbiAgLy8gYWNjb3JkaW5nIHRvIHBhcmFncmFwaCA1LjMgb2YgdGhlIFJGQzM5NjYgc3BlYy5cblxuXG4gIHZhciBpbmRleE9mSXNkbiA9IHBob25lTnVtYmVyU3RyaW5nLmluZGV4T2YoX2V4dHJhY3RQaG9uZUNvbnRleHQuUkZDMzk2Nl9JU0ROX1NVQkFERFJFU1NfKTtcblxuICBpZiAoaW5kZXhPZklzZG4gPiAwKSB7XG4gICAgcGhvbmVOdW1iZXJTdHJpbmcgPSBwaG9uZU51bWJlclN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXhPZklzZG4pO1xuICB9IC8vIElmIGJvdGggcGhvbmUgY29udGV4dCBhbmQgaXNkbi1zdWJhZGRyZXNzIGFyZSBhYnNlbnQgYnV0IG90aGVyXG4gIC8vIHBhcmFtZXRlcnMgYXJlIHByZXNlbnQsIHRoZSBwYXJhbWV0ZXJzIGFyZSBsZWZ0IGluIG5hdGlvbmFsTnVtYmVyLlxuICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2UgYXJlIGNvbmNlcm5lZCBhYm91dCBkZWxldGluZyBjb250ZW50IGZyb20gYSBwb3RlbnRpYWxcbiAgLy8gbnVtYmVyIHN0cmluZyB3aGVuIHRoZXJlIGlzIG5vIHN0cm9uZyBldmlkZW5jZSB0aGF0IHRoZSBudW1iZXIgaXNcbiAgLy8gYWN0dWFsbHkgd3JpdHRlbiBpbiBSRkMzOTY2LlxuXG5cbiAgaWYgKHBob25lTnVtYmVyU3RyaW5nICE9PSAnJykge1xuICAgIHJldHVybiBwaG9uZU51bWJlclN0cmluZztcbiAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXh0cmFjdEZvcm1hdHRlZFBob25lTnVtYmVyRnJvbVBvc3NpYmxlUmZjMzk2Nk51bWJlclVyaS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZXh0cmFjdE5hdGlvbmFsTnVtYmVyO1xuXG52YXIgX2V4dHJhY3ROYXRpb25hbE51bWJlckZyb21Qb3NzaWJseUluY29tcGxldGVOdW1iZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2V4dHJhY3ROYXRpb25hbE51bWJlckZyb21Qb3NzaWJseUluY29tcGxldGVOdW1iZXIuanNcIikpO1xuXG52YXIgX21hdGNoZXNFbnRpcmVseSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbWF0Y2hlc0VudGlyZWx5LmpzXCIpKTtcblxudmFyIF9jaGVja051bWJlckxlbmd0aCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY2hlY2tOdW1iZXJMZW5ndGguanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyoqXHJcbiAqIFN0cmlwcyBuYXRpb25hbCBwcmVmaXggYW5kIGNhcnJpZXIgY29kZSBmcm9tIGEgY29tcGxldGUgcGhvbmUgbnVtYmVyLlxyXG4gKiBUaGUgZGlmZmVyZW5jZSBmcm9tIHRoZSBub24tXCJGcm9tQ29tcGxldGVOdW1iZXJcIiBmdW5jdGlvbiBpcyB0aGF0XHJcbiAqIGl0IHdvbid0IGV4dHJhY3QgbmF0aW9uYWwgcHJlZml4IGlmIHRoZSByZXN1bHRhbnQgbnVtYmVyIGlzIHRvbyBzaG9ydFxyXG4gKiB0byBiZSBhIGNvbXBsZXRlIG51bWJlciBmb3IgdGhlIHNlbGVjdGVkIHBob25lIG51bWJlcmluZyBwbGFuLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG51bWJlciDigJQgQ29tcGxldGUgcGhvbmUgbnVtYmVyIGRpZ2l0cy5cclxuICogQHBhcmFtICB7TWV0YWRhdGF9IG1ldGFkYXRhIOKAlCBNZXRhZGF0YSB3aXRoIGEgcGhvbmUgbnVtYmVyaW5nIHBsYW4gc2VsZWN0ZWQuXHJcbiAqIEByZXR1cm4ge29iamVjdH0gYHsgbmF0aW9uYWxOdW1iZXI6IHN0cmluZywgY2FycmllckNvZGU6IHN0cmluZz8gfWAuXHJcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE5hdGlvbmFsTnVtYmVyKG51bWJlciwgbWV0YWRhdGEpIHtcbiAgLy8gUGFyc2luZyBuYXRpb25hbCBwcmVmaXhlcyBhbmQgY2FycmllciBjb2Rlc1xuICAvLyBpcyBvbmx5IHJlcXVpcmVkIGZvciBsb2NhbCBwaG9uZSBudW1iZXJzXG4gIC8vIGJ1dCBzb21lIHBlb3BsZSBkb24ndCB1bmRlcnN0YW5kIHRoYXRcbiAgLy8gYW5kIHNvbWV0aW1lcyB3cml0ZSBpbnRlcm5hdGlvbmFsIHBob25lIG51bWJlcnNcbiAgLy8gd2l0aCBuYXRpb25hbCBwcmVmaXhlcyAob3IgbWF5YmUgZXZlbiBjYXJyaWVyIGNvZGVzKS5cbiAgLy8gaHR0cDovL3Vja2VuLmJsb2dzcG90LnJ1LzIwMTYvMDMvdHJ1bmstcHJlZml4ZXMtaW4tc2t5cGU0Yi5odG1sXG4gIC8vIEdvb2dsZSdzIG9yaWdpbmFsIGxpYnJhcnkgZm9yZ2l2ZXMgc3VjaCBtaXN0YWtlc1xuICAvLyBhbmQgc28gZG9lcyB0aGlzIGxpYnJhcnksIGJlY2F1c2UgaXQgaGFzIGJlZW4gcmVxdWVzdGVkOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2F0YW1waGV0YW1pbmUvbGlicGhvbmVudW1iZXItanMvaXNzdWVzLzEyN1xuICB2YXIgX2V4dHJhY3ROYXRpb25hbE51bWJlID0gKDAsIF9leHRyYWN0TmF0aW9uYWxOdW1iZXJGcm9tUG9zc2libHlJbmNvbXBsZXRlTnVtYmVyW1wiZGVmYXVsdFwiXSkobnVtYmVyLCBtZXRhZGF0YSksXG4gICAgICBjYXJyaWVyQ29kZSA9IF9leHRyYWN0TmF0aW9uYWxOdW1iZS5jYXJyaWVyQ29kZSxcbiAgICAgIG5hdGlvbmFsTnVtYmVyID0gX2V4dHJhY3ROYXRpb25hbE51bWJlLm5hdGlvbmFsTnVtYmVyO1xuXG4gIGlmIChuYXRpb25hbE51bWJlciAhPT0gbnVtYmVyKSB7XG4gICAgaWYgKCFzaG91bGRIYXZlRXh0cmFjdGVkTmF0aW9uYWxQcmVmaXgobnVtYmVyLCBuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpKSB7XG4gICAgICAvLyBEb24ndCBzdHJpcCB0aGUgbmF0aW9uYWwgcHJlZml4LlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmF0aW9uYWxOdW1iZXI6IG51bWJlclxuICAgICAgfTtcbiAgICB9IC8vIENoZWNrIHRoZSBuYXRpb25hbCAoc2lnbmlmaWNhbnQpIG51bWJlciBsZW5ndGggYWZ0ZXIgZXh0cmFjdGluZyBuYXRpb25hbCBwcmVmaXggYW5kIGNhcnJpZXIgY29kZS5cbiAgICAvLyBMZWdhY3kgZ2VuZXJhdGVkIG1ldGFkYXRhIChiZWZvcmUgYDEuMC4xOGApIGRpZG4ndCBzdXBwb3J0IHRoZSBcInBvc3NpYmxlIGxlbmd0aHNcIiBmZWF0dXJlLlxuXG5cbiAgICBpZiAobWV0YWRhdGEucG9zc2libGVMZW5ndGhzKCkpIHtcbiAgICAgIC8vIFRoZSBudW1iZXIgcmVtYWluaW5nIGFmdGVyIHN0cmlwcGluZyB0aGUgbmF0aW9uYWwgcHJlZml4IGFuZCBjYXJyaWVyIGNvZGVcbiAgICAgIC8vIHNob3VsZCBiZSBsb25nIGVub3VnaCB0byBoYXZlIGEgcG9zc2libGUgbGVuZ3RoIGZvciB0aGUgY291bnRyeS5cbiAgICAgIC8vIE90aGVyd2lzZSwgZG9uJ3Qgc3RyaXAgdGhlIG5hdGlvbmFsIHByZWZpeCBhbmQgY2FycmllciBjb2RlLFxuICAgICAgLy8gc2luY2UgdGhlIG9yaWdpbmFsIG51bWJlciBjb3VsZCBiZSBhIHZhbGlkIG51bWJlci5cbiAgICAgIC8vIFRoaXMgY2hlY2sgaGFzIGJlZW4gY29weS1wYXN0ZWQgXCJhcyBpc1wiIGZyb20gR29vZ2xlJ3Mgb3JpZ2luYWwgbGlicmFyeTpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvbGlicGhvbmVudW1iZXIvYmxvYi84NzYyNjhlYjFhZDZjZGMxYjdiNWJlZjE3ZmM1ZTQzMDUyNzAyZDU3L2phdmEvbGlicGhvbmVudW1iZXIvc3JjL2NvbS9nb29nbGUvaTE4bi9waG9uZW51bWJlcnMvUGhvbmVOdW1iZXJVdGlsLmphdmEjTDMyMzYtTDMyNTBcbiAgICAgIC8vIEl0IGRvZXNuJ3QgY2hlY2sgZm9yIHRoZSBcInBvc3NpYmlsaXR5XCIgb2YgdGhlIG9yaWdpbmFsIGBudW1iZXJgLlxuICAgICAgLy8gSSBndWVzcyBpdCdzIGZpbmUgbm90IGNoZWNraW5nIHRoYXQgb25lLiBJdCB3b3JrcyBhcyBpcyBhbnl3YXkuXG4gICAgICBpZiAoIWlzUG9zc2libGVJbmNvbXBsZXRlTmF0aW9uYWxOdW1iZXIobmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhKSkge1xuICAgICAgICAvLyBEb24ndCBzdHJpcCB0aGUgbmF0aW9uYWwgcHJlZml4LlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hdGlvbmFsTnVtYmVyOiBudW1iZXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hdGlvbmFsTnVtYmVyOiBuYXRpb25hbE51bWJlcixcbiAgICBjYXJyaWVyQ29kZTogY2FycmllckNvZGVcbiAgfTtcbn0gLy8gSW4gc29tZSBjb3VudHJpZXMsIHRoZSBzYW1lIGRpZ2l0IGNvdWxkIGJlIGEgbmF0aW9uYWwgcHJlZml4XG4vLyBvciBhIGxlYWRpbmcgZGlnaXQgb2YgYSB2YWxpZCBwaG9uZSBudW1iZXIuXG4vLyBGb3IgZXhhbXBsZSwgaW4gUnVzc2lhLCBuYXRpb25hbCBwcmVmaXggaXMgYDhgLFxuLy8gYW5kIGFsc28gYDgwMCA1NTUgMzUgMzVgIGlzIGEgdmFsaWQgbnVtYmVyXG4vLyBpbiB3aGljaCBgOGAgaXMgbm90IGEgbmF0aW9uYWwgcHJlZml4LCBidXQgdGhlIGZpcnN0IGRpZ2l0XG4vLyBvZiBhIG5hdGlvbmFsIChzaWduaWZpY2FudCkgbnVtYmVyLlxuLy8gU2FtZSdzIHdpdGggQmVsYXJ1czpcbi8vIGA4MjAwNDkxMDA2MGAgaXMgYSB2YWxpZCBuYXRpb25hbCAoc2lnbmlmaWNhbnQpIG51bWJlcixcbi8vIGJ1dCBgMjAwNDkxMDA2MGAgaXMgbm90LlxuLy8gVG8gc3VwcG9ydCBzdWNoIGNhc2VzICh0byBwcmV2ZW50IHRoZSBjb2RlIGZyb20gYWx3YXlzIHN0cmlwcGluZ1xuLy8gbmF0aW9uYWwgcHJlZml4KSwgYSBjb25kaXRpb24gaXMgaW1wb3NlZDogYSBuYXRpb25hbCBwcmVmaXhcbi8vIGlzIG5vdCBleHRyYWN0ZWQgd2hlbiB0aGUgb3JpZ2luYWwgbnVtYmVyIGlzIFwidmlhYmxlXCIgYW5kIHRoZVxuLy8gcmVzdWx0YW50IG51bWJlciBpcyBub3QsIGEgXCJ2aWFibGVcIiBuYXRpb25hbCBudW1iZXIgYmVpbmcgdGhlIG9uZVxuLy8gdGhhdCBtYXRjaGVzIGBuYXRpb25hbF9udW1iZXJfcGF0dGVybmAuXG5cblxuZnVuY3Rpb24gc2hvdWxkSGF2ZUV4dHJhY3RlZE5hdGlvbmFsUHJlZml4KG5hdGlvbmFsTnVtYmVyQmVmb3JlLCBuYXRpb25hbE51bWJlckFmdGVyLCBtZXRhZGF0YSkge1xuICAvLyBUaGUgZXF1aXZhbGVudCBpbiBHb29nbGUncyBjb2RlIGlzOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2xpYnBob25lbnVtYmVyL2Jsb2IvZTMyNmZhMWZjNDI4M2JiMDVlYjM1Y2IzYzE1YzE4Zjk4YTMxYWYzMy9qYXZhL2xpYnBob25lbnVtYmVyL3NyYy9jb20vZ29vZ2xlL2kxOG4vcGhvbmVudW1iZXJzL1Bob25lTnVtYmVyVXRpbC5qYXZhI0wyOTY5LUwzMDA0XG4gIGlmICgoMCwgX21hdGNoZXNFbnRpcmVseVtcImRlZmF1bHRcIl0pKG5hdGlvbmFsTnVtYmVyQmVmb3JlLCBtZXRhZGF0YS5uYXRpb25hbE51bWJlclBhdHRlcm4oKSkgJiYgISgwLCBfbWF0Y2hlc0VudGlyZWx5W1wiZGVmYXVsdFwiXSkobmF0aW9uYWxOdW1iZXJBZnRlciwgbWV0YWRhdGEubmF0aW9uYWxOdW1iZXJQYXR0ZXJuKCkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIFRoaXMgXCJpcyBwb3NzaWJsZVwiIG5hdGlvbmFsIG51bWJlciAobGVuZ3RoKSBjaGVjayBoYXMgYmVlbiBjb21tZW50ZWQgb3V0XG4gIC8vIGJlY2F1c2UgaXQncyBzdXBlcmNlZGVkIGJ5IHRoZSAoZWZmZWN0aXZlbHkpIHNhbWUgY2hlY2sgZG9uZSBpbiB0aGVcbiAgLy8gYGV4dHJhY3ROYXRpb25hbE51bWJlcigpYCBmdW5jdGlvbiBhZnRlciBpdCBjYWxscyBgc2hvdWxkSGF2ZUV4dHJhY3RlZE5hdGlvbmFsUHJlZml4KClgLlxuICAvLyBJbiBvdGhlciB3b3Jkcywgd2h5IHJ1biB0aGUgc2FtZSBjaGVjayB0d2ljZSBpZiBpdCBjb3VsZCBvbmx5IGJlIHJ1biBvbmNlLlxuICAvLyAvLyBDaGVjayB0aGUgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIgbGVuZ3RoIGFmdGVyIGV4dHJhY3RpbmcgbmF0aW9uYWwgcHJlZml4IGFuZCBjYXJyaWVyIGNvZGUuXG4gIC8vIC8vIEZpeGVzIGEgbWlub3IgXCJ3ZWlyZCBiZWhhdmlvclwiIGJ1ZzogaHR0cHM6Ly9naXRsYWIuY29tL2NhdGFtcGhldGFtaW5lL2xpYnBob25lbnVtYmVyLWpzLy0vaXNzdWVzLzU3XG4gIC8vIC8vIChMZWdhY3kgZ2VuZXJhdGVkIG1ldGFkYXRhIChiZWZvcmUgYDEuMC4xOGApIGRpZG4ndCBzdXBwb3J0IHRoZSBcInBvc3NpYmxlIGxlbmd0aHNcIiBmZWF0dXJlKS5cbiAgLy8gaWYgKG1ldGFkYXRhLnBvc3NpYmxlTGVuZ3RocygpKSB7XG4gIC8vIFx0aWYgKGlzUG9zc2libGVJbmNvbXBsZXRlTmF0aW9uYWxOdW1iZXIobmF0aW9uYWxOdW1iZXJCZWZvcmUsIG1ldGFkYXRhKSAmJlxuICAvLyBcdFx0IWlzUG9zc2libGVJbmNvbXBsZXRlTmF0aW9uYWxOdW1iZXIobmF0aW9uYWxOdW1iZXJBZnRlciwgbWV0YWRhdGEpKSB7XG4gIC8vIFx0XHRyZXR1cm4gZmFsc2VcbiAgLy8gXHR9XG4gIC8vIH1cblxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1Bvc3NpYmxlSW5jb21wbGV0ZU5hdGlvbmFsTnVtYmVyKG5hdGlvbmFsTnVtYmVyLCBtZXRhZGF0YSkge1xuICBzd2l0Y2ggKCgwLCBfY2hlY2tOdW1iZXJMZW5ndGhbXCJkZWZhdWx0XCJdKShuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpKSB7XG4gICAgY2FzZSAnVE9PX1NIT1JUJzpcbiAgICBjYXNlICdJTlZBTElEX0xFTkdUSCc6XG4gICAgICAvLyBUaGlzIGxpYnJhcnkgaWdub3JlcyBcImxvY2FsLW9ubHlcIiBwaG9uZSBudW1iZXJzIChmb3Igc2ltcGxpY2l0eSkuXG4gICAgICAvLyBTZWUgdGhlIHJlYWRtZSBmb3IgbW9yZSBpbmZvIG9uIHdoYXQgYXJlIFwibG9jYWwtb25seVwiIHBob25lIG51bWJlcnMuXG4gICAgICAvLyBjYXNlICdJU19QT1NTSUJMRV9MT0NBTF9PTkxZJzpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXh0cmFjdE5hdGlvbmFsTnVtYmVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBleHRyYWN0TmF0aW9uYWxOdW1iZXJGcm9tUG9zc2libHlJbmNvbXBsZXRlTnVtYmVyO1xuXG4vKipcclxuICogU3RyaXBzIGFueSBuYXRpb25hbCBwcmVmaXggKHN1Y2ggYXMgMCwgMSkgcHJlc2VudCBpbiBhXHJcbiAqIChwb3NzaWJseSBpbmNvbXBsZXRlKSBudW1iZXIgcHJvdmlkZWQuXHJcbiAqIFwiQ2FycmllciBjb2Rlc1wiIGFyZSBvbmx5IHVzZWQgIGluIENvbG9tYmlhIGFuZCBCcmF6aWwsXHJcbiAqIGFuZCBvbmx5IHdoZW4gZGlhbGluZyB3aXRoaW4gdGhvc2UgY291bnRyaWVzIGZyb20gYSBtb2JpbGUgcGhvbmUgdG8gYSBmaXhlZCBsaW5lIG51bWJlci5cclxuICogU29tZXRpbWVzIGl0IHdvbid0IGFjdHVhbGx5IHN0cmlwIG5hdGlvbmFsIHByZWZpeFxyXG4gKiBhbmQgd2lsbCBpbnN0ZWFkIHByZXBlbmQgc29tZSBkaWdpdHMgdG8gdGhlIGBudW1iZXJgOlxyXG4gKiBmb3IgZXhhbXBsZSwgd2hlbiBudW1iZXIgYDIzNDU2NzhgIGlzIHBhc3NlZCB3aXRoIGBWSWAgY291bnRyeSBzZWxlY3RlZCxcclxuICogaXQgd2lsbCByZXR1cm4gYHsgbnVtYmVyOiBcIjM0MDIzNDU2NzhcIiB9YCwgYmVjYXVzZSBgMzQwYCBhcmVhIGNvZGUgaXMgcHJlcGVuZGVkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbnVtYmVyIOKAlCBOYXRpb25hbCBudW1iZXIgZGlnaXRzLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gbWV0YWRhdGEg4oCUIE1ldGFkYXRhIHdpdGggY291bnRyeSBzZWxlY3RlZC5cclxuICogQHJldHVybiB7b2JqZWN0fSBgeyBuYXRpb25hbE51bWJlcjogc3RyaW5nLCBuYXRpb25hbFByZWZpeDogc3RyaW5nPyBjYXJyaWVyQ29kZTogc3RyaW5nPyB9YC4gRXZlbiBpZiBhIG5hdGlvbmFsIHByZWZpeCB3YXMgZXh0cmFjdGVkLCBpdCdzIG5vdCBuZWNlc3NhcmlseSBwcmVzZW50IGluIHRoZSByZXR1cm5lZCBvYmplY3QsIHNvIGRvbid0IHJlbHkgb24gaXRzIHByZXNlbmNlIGluIHRoZSByZXR1cm5lZCBvYmplY3QgaW4gb3JkZXIgdG8gZmluZCBvdXQgd2hldGhlciBhIG5hdGlvbmFsIHByZWZpeCBoYXMgYmVlbiBleHRyYWN0ZWQgb3Igbm90LlxyXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3ROYXRpb25hbE51bWJlckZyb21Qb3NzaWJseUluY29tcGxldGVOdW1iZXIobnVtYmVyLCBtZXRhZGF0YSkge1xuICBpZiAobnVtYmVyICYmIG1ldGFkYXRhLm51bWJlcmluZ1BsYW4ubmF0aW9uYWxQcmVmaXhGb3JQYXJzaW5nKCkpIHtcbiAgICAvLyBTZWUgTUVUQURBVEEubWQgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZlxuICAgIC8vIGBuYXRpb25hbF9wcmVmaXhfZm9yX3BhcnNpbmdgIGFuZCBgbmF0aW9uYWxfcHJlZml4X3RyYW5zZm9ybV9ydWxlYC5cbiAgICAvLyBBdHRlbXB0IHRvIHBhcnNlIHRoZSBmaXJzdCBkaWdpdHMgYXMgYSBuYXRpb25hbCBwcmVmaXguXG4gICAgdmFyIHByZWZpeFBhdHRlcm4gPSBuZXcgUmVnRXhwKCdeKD86JyArIG1ldGFkYXRhLm51bWJlcmluZ1BsYW4ubmF0aW9uYWxQcmVmaXhGb3JQYXJzaW5nKCkgKyAnKScpO1xuICAgIHZhciBwcmVmaXhNYXRjaCA9IHByZWZpeFBhdHRlcm4uZXhlYyhudW1iZXIpO1xuXG4gICAgaWYgKHByZWZpeE1hdGNoKSB7XG4gICAgICB2YXIgbmF0aW9uYWxOdW1iZXI7XG4gICAgICB2YXIgY2FycmllckNvZGU7IC8vIGh0dHBzOi8vZ2l0bGFiLmNvbS9jYXRhbXBoZXRhbWluZS9saWJwaG9uZW51bWJlci1qcy8tL2Jsb2IvbWFzdGVyL01FVEFEQVRBLm1kI25hdGlvbmFsX3ByZWZpeF9mb3JfcGFyc2luZy0tbmF0aW9uYWxfcHJlZml4X3RyYW5zZm9ybV9ydWxlXG4gICAgICAvLyBJZiBhIGBuYXRpb25hbF9wcmVmaXhfZm9yX3BhcnNpbmdgIGhhcyBhbnkgXCJjYXB0dXJpbmcgZ3JvdXBzXCJcbiAgICAgIC8vIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGUgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIgaXMgZXF1YWwgdG9cbiAgICAgIC8vIHRob3NlIFwiY2FwdHVyaW5nIGdyb3Vwc1wiIHRyYW5zZm9ybWVkIHZpYSBgbmF0aW9uYWxfcHJlZml4X3RyYW5zZm9ybV9ydWxlYCxcbiAgICAgIC8vIGFuZCBub3RoaW5nIGNvdWxkIGJlIHNhaWQgYWJvdXQgdGhlIGFjdHVhbCBuYXRpb25hbCBwcmVmaXg6XG4gICAgICAvLyB3aGF0IGlzIGl0IGFuZCB3YXMgaXQgZXZlbiB0aGVyZS5cbiAgICAgIC8vIElmIGEgYG5hdGlvbmFsX3ByZWZpeF9mb3JfcGFyc2luZ2AgZG9lc24ndCBoYXZlIGFueSBcImNhcHR1cmluZyBncm91cHNcIixcbiAgICAgIC8vIHRoZW4gZXZlcnl0aGluZyBpdCBtYXRjaGVzIGlzIGEgbmF0aW9uYWwgcHJlZml4LlxuICAgICAgLy8gVG8gZGV0ZXJtaW5lIHdoZXRoZXIgYG5hdGlvbmFsX3ByZWZpeF9mb3JfcGFyc2luZ2AgbWF0Y2hlZCBhbnlcbiAgICAgIC8vIFwiY2FwdHVyaW5nIGdyb3Vwc1wiLCB0aGUgdmFsdWUgb2YgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGAuZXhlYygpYFxuICAgICAgLy8gaXMgbG9va2VkIGF0LCBhbmQgaWYgaXQgaGFzIG5vbi11bmRlZmluZWQgdmFsdWVzIHdoZXJlIHRoZXJlJ3JlXG4gICAgICAvLyBcImNhcHR1cmluZyBncm91cHNcIiBpbiB0aGUgcmVndWxhciBleHByZXNzaW9uLCB0aGVuIGl0IG1lYW5zXG4gICAgICAvLyB0aGF0IFwiY2FwdHVyaW5nIGdyb3Vwc1wiIGhhdmUgYmVlbiBtYXRjaGVkLlxuICAgICAgLy8gSXQncyBub3QgcG9zc2libGUgdG8gdGVsbCB3aGV0aGVyIHRoZXJlJ2xsIGJlIGFueSBcImNhcHR1cmluZyBncm9wdXNcIlxuICAgICAgLy8gYmVmb3JlIHRoZSBtYXRjaGluZyBwcm9jZXNzLCBiZWNhdXNlIGEgYG5hdGlvbmFsX3ByZWZpeF9mb3JfcGFyc2luZ2BcbiAgICAgIC8vIGNvdWxkIGV4aGliaXQgYm90aCBiZWhhdmlvcnMuXG5cbiAgICAgIHZhciBjYXB0dXJlZEdyb3Vwc0NvdW50ID0gcHJlZml4TWF0Y2gubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBoYXNDYXB0dXJlZEdyb3VwcyA9IGNhcHR1cmVkR3JvdXBzQ291bnQgPiAwICYmIHByZWZpeE1hdGNoW2NhcHR1cmVkR3JvdXBzQ291bnRdO1xuXG4gICAgICBpZiAobWV0YWRhdGEubmF0aW9uYWxQcmVmaXhUcmFuc2Zvcm1SdWxlKCkgJiYgaGFzQ2FwdHVyZWRHcm91cHMpIHtcbiAgICAgICAgbmF0aW9uYWxOdW1iZXIgPSBudW1iZXIucmVwbGFjZShwcmVmaXhQYXR0ZXJuLCBtZXRhZGF0YS5uYXRpb25hbFByZWZpeFRyYW5zZm9ybVJ1bGUoKSk7IC8vIElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBjYXB0dXJlZCBncm91cCxcbiAgICAgICAgLy8gdGhlbiBjYXJyaWVyIGNvZGUgaXMgdGhlIHNlY29uZCBvbmUuXG5cbiAgICAgICAgaWYgKGNhcHR1cmVkR3JvdXBzQ291bnQgPiAxKSB7XG4gICAgICAgICAgY2FycmllckNvZGUgPSBwcmVmaXhNYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBJZiB0aGVyZSdyZSBubyBcImNhcHR1cmluZyBncm91cHNcIixcbiAgICAgIC8vIG9yIGlmIHRoZXJlJ3JlIFwiY2FwdHVyaW5nIGdyb3Vwc1wiIGJ1dCBub1xuICAgICAgLy8gYG5hdGlvbmFsX3ByZWZpeF90cmFuc2Zvcm1fcnVsZWAsXG4gICAgICAvLyB0aGVuIGp1c3Qgc3RyaXAgdGhlIG5hdGlvbmFsIHByZWZpeCBmcm9tIHRoZSBudW1iZXIsXG4gICAgICAvLyBhbmQgcG9zc2libHkgYSBjYXJyaWVyIGNvZGUuXG4gICAgICAvLyBTZWVtcyBsaWtlIHRoZXJlIGNvdWxkIGJlIG1vcmUuXG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gYHByZWZpeEJlZm9yZU5hdGlvbmFsTnVtYmVyYCBpcyB0aGUgd2hvbGUgc3Vic3RyaW5nIG1hdGNoZWQgYnlcbiAgICAgICAgLy8gdGhlIGBuYXRpb25hbF9wcmVmaXhfZm9yX3BhcnNpbmdgIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICAgICAgLy8gVGhlcmUgc2VlbSB0byBiZSBubyBndWFyYW50ZWVzIHRoYXQgaXQncyBqdXN0IGEgbmF0aW9uYWwgcHJlZml4LlxuICAgICAgICAvLyBGb3IgZXhhbXBsZSwgaWYgdGhlcmUncyBhIGNhcnJpZXIgY29kZSwgaXQncyBnb25uYSBiZSBhXG4gICAgICAgIC8vIHBhcnQgb2YgYHByZWZpeEJlZm9yZU5hdGlvbmFsTnVtYmVyYCB0b28uXG4gICAgICAgIHZhciBwcmVmaXhCZWZvcmVOYXRpb25hbE51bWJlciA9IHByZWZpeE1hdGNoWzBdO1xuICAgICAgICBuYXRpb25hbE51bWJlciA9IG51bWJlci5zbGljZShwcmVmaXhCZWZvcmVOYXRpb25hbE51bWJlci5sZW5ndGgpOyAvLyBJZiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjYXB0dXJlZCBncm91cCxcbiAgICAgICAgLy8gdGhlbiBjYXJyaWVyIGNvZGUgaXMgdGhlIGZpcnN0IG9uZS5cblxuICAgICAgICBpZiAoaGFzQ2FwdHVyZWRHcm91cHMpIHtcbiAgICAgICAgICBjYXJyaWVyQ29kZSA9IHByZWZpeE1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICB9IC8vIFRyaWVzIHRvIGd1ZXNzIHdoZXRoZXIgYSBuYXRpb25hbCBwcmVmaXggd2FzIHByZXNlbnQgaW4gdGhlIGlucHV0LlxuICAgICAgLy8gVGhpcyBpcyBub3Qgc29tZXRoaW5nIGNvcHktcGFzdGVkIGZyb20gR29vZ2xlJ3MgbGlicmFyeTpcbiAgICAgIC8vIHRoZXkgZG9uJ3Qgc2VlbSB0byBoYXZlIGFuIGVxdWl2YWxlbnQgZm9yIHRoYXQuXG4gICAgICAvLyBTbyB0aGlzIGlzbid0IGFuIFwib2ZmaWNpYWxseSBhcHByb3ZlZFwiIHdheSBvZiBkb2luZyBzb21ldGhpbmcgbGlrZSB0aGF0LlxuICAgICAgLy8gQnV0IHNpbmNlIHRoZXJlIHNlZW1zIG5vIG90aGVyIGV4aXN0aW5nIG1ldGhvZCwgdGhpcyBsaWJyYXJ5IHVzZXMgaXQuXG5cblxuICAgICAgdmFyIG5hdGlvbmFsUHJlZml4O1xuXG4gICAgICBpZiAoaGFzQ2FwdHVyZWRHcm91cHMpIHtcbiAgICAgICAgdmFyIHBvc3NpYmxlUG9zaXRpb25PZlRoZUZpcnN0Q2FwdHVyZWRHcm91cCA9IG51bWJlci5pbmRleE9mKHByZWZpeE1hdGNoWzFdKTtcbiAgICAgICAgdmFyIHBvc3NpYmxlTmF0aW9uYWxQcmVmaXggPSBudW1iZXIuc2xpY2UoMCwgcG9zc2libGVQb3NpdGlvbk9mVGhlRmlyc3RDYXB0dXJlZEdyb3VwKTsgLy8gRXhhbXBsZTogYW4gQXJnZW50aW5pYW4gKEFSKSBwaG9uZSBudW1iZXIgYDAxMTE1MjM0NTY3ODlgLlxuICAgICAgICAvLyBgcHJlZml4TWF0Y2hbMF1gIGlzIGAwMTExNWAsIGFuZCBgJDFgIGlzIGAxMWAsXG4gICAgICAgIC8vIGFuZCB0aGUgcmVzdCBvZiB0aGUgcGhvbmUgbnVtYmVyIGlzIGAyMzQ1Njc4OWAuXG4gICAgICAgIC8vIFRoZSBuYXRpb25hbCBudW1iZXIgaXMgdHJhbnNmb3JtZWQgdmlhIGA5JDFgIHRvIGA5MTEyMzQ1Njc4OWAuXG4gICAgICAgIC8vIE5hdGlvbmFsIHByZWZpeCBgMGAgaXMgZGV0ZWN0ZWQgYmVpbmcgcHJlc2VudCBhdCB0aGUgc3RhcnQuXG4gICAgICAgIC8vIGlmIChwb3NzaWJsZU5hdGlvbmFsUHJlZml4LmluZGV4T2YobWV0YWRhdGEubnVtYmVyaW5nUGxhbi5uYXRpb25hbFByZWZpeCgpKSA9PT0gMCkge1xuXG4gICAgICAgIGlmIChwb3NzaWJsZU5hdGlvbmFsUHJlZml4ID09PSBtZXRhZGF0YS5udW1iZXJpbmdQbGFuLm5hdGlvbmFsUHJlZml4KCkpIHtcbiAgICAgICAgICBuYXRpb25hbFByZWZpeCA9IG1ldGFkYXRhLm51bWJlcmluZ1BsYW4ubmF0aW9uYWxQcmVmaXgoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmF0aW9uYWxQcmVmaXggPSBwcmVmaXhNYXRjaFswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmF0aW9uYWxOdW1iZXI6IG5hdGlvbmFsTnVtYmVyLFxuICAgICAgICBuYXRpb25hbFByZWZpeDogbmF0aW9uYWxQcmVmaXgsXG4gICAgICAgIGNhcnJpZXJDb2RlOiBjYXJyaWVyQ29kZVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hdGlvbmFsTnVtYmVyOiBudW1iZXJcbiAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV4dHJhY3ROYXRpb25hbE51bWJlckZyb21Qb3NzaWJseUluY29tcGxldGVOdW1iZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlJGQzM5NjZfUFJFRklYXyA9IGV4cG9ydHMuUkZDMzk2Nl9QSE9ORV9DT05URVhUXyA9IGV4cG9ydHMuUkZDMzk2Nl9JU0ROX1NVQkFERFJFU1NfID0gZXhwb3J0cy5QTFVTX1NJR04gPSB2b2lkIDA7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGV4dHJhY3RQaG9uZUNvbnRleHQ7XG5leHBvcnRzLmlzUGhvbmVDb250ZXh0VmFsaWQgPSBpc1Bob25lQ29udGV4dFZhbGlkO1xuXG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG5cbi8vIFdoZW4gcGhvbmUgbnVtYmVycyBhcmUgd3JpdHRlbiBpbiBgUkZDMzk2NmAgZm9ybWF0IOKAlCBgXCJ0ZWw6KzEyMTMzNzM0MjUzXCJgIOKAlFxuLy8gdGhleSBjYW4gaGF2ZSB0aGVpciBcImNhbGxpbmcgY29kZVwiIHBhcnQgd3JpdHRlbiBzZXBhcmF0ZWx5IGluIGEgYHBob25lLWNvbnRleHRgIHBhcmFtZXRlci5cbi8vIEV4YW1wbGU6IGBcInRlbDoxMjEzMzczNDI1MztwaG9uZS1jb250ZXh0PSsxXCJgLlxuLy8gVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIGZ1bGwgcGhvbmUgbnVtYmVyIGZyb20gdGhlIGxvY2FsIG51bWJlciBhbmQgdGhlIGBwaG9uZS1jb250ZXh0YFxuLy8gd2hlbiB0aGUgYHBob25lLWNvbnRleHRgIGNvbnRhaW5zIGEgYCtgIHNpZ24uXG52YXIgUExVU19TSUdOID0gJysnO1xuZXhwb3J0cy5QTFVTX1NJR04gPSBQTFVTX1NJR047XG52YXIgUkZDMzk2Nl9WSVNVQUxfU0VQQVJBVE9SXyA9ICdbXFxcXC1cXFxcLlxcXFwoXFxcXCldPyc7XG52YXIgUkZDMzk2Nl9QSE9ORV9ESUdJVF8gPSAnKCcgKyAnWycgKyBfY29uc3RhbnRzLlZBTElEX0RJR0lUUyArICddJyArICd8JyArIFJGQzM5NjZfVklTVUFMX1NFUEFSQVRPUl8gKyAnKSc7XG52YXIgUkZDMzk2Nl9HTE9CQUxfTlVNQkVSX0RJR0lUU18gPSAnXicgKyAnXFxcXCcgKyBQTFVTX1NJR04gKyBSRkMzOTY2X1BIT05FX0RJR0lUXyArICcqJyArICdbJyArIF9jb25zdGFudHMuVkFMSURfRElHSVRTICsgJ10nICsgUkZDMzk2Nl9QSE9ORV9ESUdJVF8gKyAnKicgKyAnJCc7XG4vKipcclxuICogUmVndWxhciBleHByZXNzaW9uIG9mIHZhbGlkIGdsb2JhbC1udW1iZXItZGlnaXRzIGZvciB0aGUgcGhvbmUtY29udGV4dFxyXG4gKiBwYXJhbWV0ZXIsIGZvbGxvd2luZyB0aGUgc3ludGF4IGRlZmluZWQgaW4gUkZDMzk2Ni5cclxuICovXG5cbnZhciBSRkMzOTY2X0dMT0JBTF9OVU1CRVJfRElHSVRTX1BBVFRFUk5fID0gbmV3IFJlZ0V4cChSRkMzOTY2X0dMT0JBTF9OVU1CRVJfRElHSVRTXywgJ2cnKTsgLy8gSW4gdGhpcyBwb3J0IG9mIEdvb2dsZSdzIGxpYnJhcnksIHdlIGRvbid0IGFjY2VwdCBhbHBoYSBjaGFyYWN0ZXJzIGluIHBob25lIG51bWJlcnMuXG4vLyBjb25zdCBBTFBIQU5VTV8gPSBWQUxJRF9BTFBIQV8gKyBWQUxJRF9ESUdJVFNcblxudmFyIEFMUEhBTlVNXyA9IF9jb25zdGFudHMuVkFMSURfRElHSVRTO1xudmFyIFJGQzM5NjZfRE9NQUlOTEFCRUxfID0gJ1snICsgQUxQSEFOVU1fICsgJ10rKChcXFxcLSkqWycgKyBBTFBIQU5VTV8gKyAnXSkqJztcbnZhciBWQUxJRF9BTFBIQV8gPSAnYS16QS1aJztcbnZhciBSRkMzOTY2X1RPUExBQkVMXyA9ICdbJyArIFZBTElEX0FMUEhBXyArICddKygoXFxcXC0pKlsnICsgQUxQSEFOVU1fICsgJ10pKic7XG52YXIgUkZDMzk2Nl9ET01BSU5OQU1FXyA9ICdeKCcgKyBSRkMzOTY2X0RPTUFJTkxBQkVMXyArICdcXFxcLikqJyArIFJGQzM5NjZfVE9QTEFCRUxfICsgJ1xcXFwuPyQnO1xuLyoqXHJcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBvZiB2YWxpZCBkb21haW5uYW1lIGZvciB0aGUgcGhvbmUtY29udGV4dCBwYXJhbWV0ZXIsXHJcbiAqIGZvbGxvd2luZyB0aGUgc3ludGF4IGRlZmluZWQgaW4gUkZDMzk2Ni5cclxuICovXG5cbnZhciBSRkMzOTY2X0RPTUFJTk5BTUVfUEFUVEVSTl8gPSBuZXcgUmVnRXhwKFJGQzM5NjZfRE9NQUlOTkFNRV8sICdnJyk7XG52YXIgUkZDMzk2Nl9QUkVGSVhfID0gJ3RlbDonO1xuZXhwb3J0cy5SRkMzOTY2X1BSRUZJWF8gPSBSRkMzOTY2X1BSRUZJWF87XG52YXIgUkZDMzk2Nl9QSE9ORV9DT05URVhUXyA9ICc7cGhvbmUtY29udGV4dD0nO1xuZXhwb3J0cy5SRkMzOTY2X1BIT05FX0NPTlRFWFRfID0gUkZDMzk2Nl9QSE9ORV9DT05URVhUXztcbnZhciBSRkMzOTY2X0lTRE5fU1VCQUREUkVTU18gPSAnO2lzdWI9Jztcbi8qKlxyXG4gKiBFeHRyYWN0cyB0aGUgdmFsdWUgb2YgdGhlIHBob25lLWNvbnRleHQgcGFyYW1ldGVyIG9mIGBudW1iZXJUb0V4dHJhY3RGcm9tYCxcclxuICogZm9sbG93aW5nIHRoZSBzeW50YXggZGVmaW5lZCBpbiBSRkMzOTY2LlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbnVtYmVyVG9FeHRyYWN0RnJvbVxyXG4gKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH0gdGhlIGV4dHJhY3RlZCBzdHJpbmcgKHBvc3NpYmx5IGVtcHR5KSwgb3IgYG51bGxgIGlmIG5vIHBob25lLWNvbnRleHQgcGFyYW1ldGVyIGlzIGZvdW5kLlxyXG4gKi9cblxuZXhwb3J0cy5SRkMzOTY2X0lTRE5fU1VCQUREUkVTU18gPSBSRkMzOTY2X0lTRE5fU1VCQUREUkVTU187XG5cbmZ1bmN0aW9uIGV4dHJhY3RQaG9uZUNvbnRleHQobnVtYmVyVG9FeHRyYWN0RnJvbSkge1xuICB2YXIgaW5kZXhPZlBob25lQ29udGV4dCA9IG51bWJlclRvRXh0cmFjdEZyb20uaW5kZXhPZihSRkMzOTY2X1BIT05FX0NPTlRFWFRfKTsgLy8gSWYgbm8gcGhvbmUtY29udGV4dCBwYXJhbWV0ZXIgaXMgcHJlc2VudFxuXG4gIGlmIChpbmRleE9mUGhvbmVDb250ZXh0IDwgMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHBob25lQ29udGV4dFN0YXJ0ID0gaW5kZXhPZlBob25lQ29udGV4dCArIFJGQzM5NjZfUEhPTkVfQ09OVEVYVF8ubGVuZ3RoOyAvLyBJZiBwaG9uZS1jb250ZXh0IHBhcmFtZXRlciBpcyBlbXB0eVxuXG4gIGlmIChwaG9uZUNvbnRleHRTdGFydCA+PSBudW1iZXJUb0V4dHJhY3RGcm9tLmxlbmd0aCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHZhciBwaG9uZUNvbnRleHRFbmQgPSBudW1iZXJUb0V4dHJhY3RGcm9tLmluZGV4T2YoJzsnLCBwaG9uZUNvbnRleHRTdGFydCk7IC8vIElmIHBob25lLWNvbnRleHQgaXMgbm90IHRoZSBsYXN0IHBhcmFtZXRlclxuXG4gIGlmIChwaG9uZUNvbnRleHRFbmQgPj0gMCkge1xuICAgIHJldHVybiBudW1iZXJUb0V4dHJhY3RGcm9tLnN1YnN0cmluZyhwaG9uZUNvbnRleHRTdGFydCwgcGhvbmVDb250ZXh0RW5kKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVtYmVyVG9FeHRyYWN0RnJvbS5zdWJzdHJpbmcocGhvbmVDb250ZXh0U3RhcnQpO1xuICB9XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiBwaG9uZUNvbnRleHQgZm9sbG93cyB0aGUgc3ludGF4IGRlZmluZWQgaW4gUkZDMzk2Ni5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gcGhvbmVDb250ZXh0XHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGlzUGhvbmVDb250ZXh0VmFsaWQocGhvbmVDb250ZXh0KSB7XG4gIGlmIChwaG9uZUNvbnRleHQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChwaG9uZUNvbnRleHQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIERvZXMgcGhvbmUtY29udGV4dCB2YWx1ZSBtYXRjaCBwYXR0ZXJuIG9mIGdsb2JhbC1udW1iZXItZGlnaXRzIG9yIGRvbWFpbm5hbWUuXG5cblxuICByZXR1cm4gUkZDMzk2Nl9HTE9CQUxfTlVNQkVSX0RJR0lUU19QQVRURVJOXy50ZXN0KHBob25lQ29udGV4dCkgfHwgUkZDMzk2Nl9ET01BSU5OQU1FX1BBVFRFUk5fLnRlc3QocGhvbmVDb250ZXh0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV4dHJhY3RQaG9uZUNvbnRleHQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkZJUlNUX0dST1VQX1BBVFRFUk4gPSB2b2lkIDA7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGZvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQ7XG5cbnZhciBfYXBwbHlJbnRlcm5hdGlvbmFsU2VwYXJhdG9yU3R5bGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2FwcGx5SW50ZXJuYXRpb25hbFNlcGFyYXRvclN0eWxlLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbi8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgc2V0IHRvICQxIGJ1dCB0aGVyZSBhcmUgc29tZSBjb3VudHJpZXMgZm9yIHdoaWNoIHRoZVxuLy8gZmlyc3QgZ3JvdXAgaXMgbm90IHVzZWQgaW4gdGhlIG5hdGlvbmFsIHBhdHRlcm4gKGUuZy4gQXJnZW50aW5hKSBzbyB0aGUgJDFcbi8vIGdyb3VwIGRvZXMgbm90IG1hdGNoIGNvcnJlY3RseS4gVGhlcmVmb3JlLCB3ZSB1c2UgYFxcZGAsIHNvIHRoYXQgdGhlIGZpcnN0XG4vLyBncm91cCBhY3R1YWxseSB1c2VkIGluIHRoZSBwYXR0ZXJuIHdpbGwgYmUgbWF0Y2hlZC5cbnZhciBGSVJTVF9HUk9VUF9QQVRURVJOID0gLyhcXCRcXGQpLztcbmV4cG9ydHMuRklSU1RfR1JPVVBfUEFUVEVSTiA9IEZJUlNUX0dST1VQX1BBVFRFUk47XG5cbmZ1bmN0aW9uIGZvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQobnVtYmVyLCBmb3JtYXQsIF9yZWYpIHtcbiAgdmFyIHVzZUludGVybmF0aW9uYWxGb3JtYXQgPSBfcmVmLnVzZUludGVybmF0aW9uYWxGb3JtYXQsXG4gICAgICB3aXRoTmF0aW9uYWxQcmVmaXggPSBfcmVmLndpdGhOYXRpb25hbFByZWZpeCxcbiAgICAgIGNhcnJpZXJDb2RlID0gX3JlZi5jYXJyaWVyQ29kZSxcbiAgICAgIG1ldGFkYXRhID0gX3JlZi5tZXRhZGF0YTtcbiAgdmFyIGZvcm1hdHRlZE51bWJlciA9IG51bWJlci5yZXBsYWNlKG5ldyBSZWdFeHAoZm9ybWF0LnBhdHRlcm4oKSksIHVzZUludGVybmF0aW9uYWxGb3JtYXQgPyBmb3JtYXQuaW50ZXJuYXRpb25hbEZvcm1hdCgpIDogLy8gVGhpcyBsaWJyYXJ5IGRvZXNuJ3QgdXNlIGBkb21lc3RpY19jYXJyaWVyX2NvZGVfZm9ybWF0dGluZ19ydWxlYCxcbiAgLy8gYmVjYXVzZSB0aGF0IG9uZSBpcyBvbmx5IHVzZWQgd2hlbiBmb3JtYXR0aW5nIHBob25lIG51bWJlcnNcbiAgLy8gZm9yIGRpYWxpbmcgZnJvbSBhIG1vYmlsZSBwaG9uZSwgYW5kIHRoaXMgaXMgbm90IGEgZGlhbGluZyBsaWJyYXJ5LlxuICAvLyBjYXJyaWVyQ29kZSAmJiBmb3JtYXQuZG9tZXN0aWNDYXJyaWVyQ29kZUZvcm1hdHRpbmdSdWxlKClcbiAgLy8gXHQvLyBGaXJzdCwgcmVwbGFjZSB0aGUgJENDIGluIHRoZSBmb3JtYXR0aW5nIHJ1bGUgd2l0aCB0aGUgZGVzaXJlZCBjYXJyaWVyIGNvZGUuXG4gIC8vIFx0Ly8gVGhlbiwgcmVwbGFjZSB0aGUgJEZHIGluIHRoZSBmb3JtYXR0aW5nIHJ1bGUgd2l0aCB0aGUgZmlyc3QgZ3JvdXBcbiAgLy8gXHQvLyBhbmQgdGhlIGNhcnJpZXIgY29kZSBjb21iaW5lZCBpbiB0aGUgYXBwcm9wcmlhdGUgd2F5LlxuICAvLyBcdD8gZm9ybWF0LmZvcm1hdCgpLnJlcGxhY2UoRklSU1RfR1JPVVBfUEFUVEVSTiwgZm9ybWF0LmRvbWVzdGljQ2FycmllckNvZGVGb3JtYXR0aW5nUnVsZSgpLnJlcGxhY2UoJyRDQycsIGNhcnJpZXJDb2RlKSlcbiAgLy8gXHQ6IChcbiAgLy8gXHRcdHdpdGhOYXRpb25hbFByZWZpeCAmJiBmb3JtYXQubmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSgpXG4gIC8vIFx0XHRcdD8gZm9ybWF0LmZvcm1hdCgpLnJlcGxhY2UoRklSU1RfR1JPVVBfUEFUVEVSTiwgZm9ybWF0Lm5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUoKSlcbiAgLy8gXHRcdFx0OiBmb3JtYXQuZm9ybWF0KClcbiAgLy8gXHQpXG4gIHdpdGhOYXRpb25hbFByZWZpeCAmJiBmb3JtYXQubmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSgpID8gZm9ybWF0LmZvcm1hdCgpLnJlcGxhY2UoRklSU1RfR1JPVVBfUEFUVEVSTiwgZm9ybWF0Lm5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUoKSkgOiBmb3JtYXQuZm9ybWF0KCkpO1xuXG4gIGlmICh1c2VJbnRlcm5hdGlvbmFsRm9ybWF0KSB7XG4gICAgcmV0dXJuICgwLCBfYXBwbHlJbnRlcm5hdGlvbmFsU2VwYXJhdG9yU3R5bGVbXCJkZWZhdWx0XCJdKShmb3JtYXR0ZWROdW1iZXIpO1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdHRlZE51bWJlcjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGdldENvdW50cnlCeUNhbGxpbmdDb2RlO1xuXG52YXIgX2dldENvdW50cnlCeU5hdGlvbmFsTnVtYmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9nZXRDb3VudHJ5QnlOYXRpb25hbE51bWJlci5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG52YXIgVVNFX05PTl9HRU9HUkFQSElDX0NPVU5UUllfQ09ERSA9IGZhbHNlO1xuXG5mdW5jdGlvbiBnZXRDb3VudHJ5QnlDYWxsaW5nQ29kZShjYWxsaW5nQ29kZSwgbmF0aW9uYWxQaG9uZU51bWJlciwgbWV0YWRhdGEpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChVU0VfTk9OX0dFT0dSQVBISUNfQ09VTlRSWV9DT0RFKSB7XG4gICAgaWYgKG1ldGFkYXRhLmlzTm9uR2VvZ3JhcGhpY0NhbGxpbmdDb2RlKGNhbGxpbmdDb2RlKSkge1xuICAgICAgcmV0dXJuICcwMDEnO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwb3NzaWJsZUNvdW50cmllcyA9IG1ldGFkYXRhLmdldENvdW50cnlDb2Rlc0ZvckNhbGxpbmdDb2RlKGNhbGxpbmdDb2RlKTtcblxuICBpZiAoIXBvc3NpYmxlQ291bnRyaWVzKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIElmIHRoZXJlJ3MganVzdCBvbmUgY291bnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb3VudHJ5IGNvZGUsXG4gIC8vIHRoZW4ganVzdCByZXR1cm4gaXQsIHdpdGhvdXQgZnVydGhlciBwaG9uZSBudW1iZXIgZGlnaXRzIHZhbGlkYXRpb24uXG5cblxuICBpZiAocG9zc2libGVDb3VudHJpZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ291bnRyaWVzWzBdO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfZ2V0Q291bnRyeUJ5TmF0aW9uYWxOdW1iZXJbXCJkZWZhdWx0XCJdKShwb3NzaWJsZUNvdW50cmllcywgbmF0aW9uYWxQaG9uZU51bWJlciwgbWV0YWRhdGEubWV0YWRhdGEpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0Q291bnRyeUJ5Q2FsbGluZ0NvZGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGdldENvdW50cnlCeU5hdGlvbmFsTnVtYmVyO1xuXG52YXIgX21ldGFkYXRhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbWV0YWRhdGEuanNcIikpO1xuXG52YXIgX2dldE51bWJlclR5cGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2dldE51bWJlclR5cGUuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKGl0KSByZXR1cm4gKGl0ID0gaXQuY2FsbChvKSkubmV4dC5iaW5kKGl0KTsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIGdldENvdW50cnlCeU5hdGlvbmFsTnVtYmVyKHBvc3NpYmxlQ291bnRyaWVzLCBuYXRpb25hbFBob25lTnVtYmVyLCBtZXRhZGF0YSkge1xuICAvLyBSZS1jcmVhdGUgYG1ldGFkYXRhYCBiZWNhdXNlIGl0IHdpbGwgYmUgc2VsZWN0aW5nIGEgYGNvdW50cnlgLlxuICBtZXRhZGF0YSA9IG5ldyBfbWV0YWRhdGFbXCJkZWZhdWx0XCJdKG1ldGFkYXRhKTtcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKHBvc3NpYmxlQ291bnRyaWVzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgY291bnRyeSA9IF9zdGVwLnZhbHVlO1xuICAgIG1ldGFkYXRhLmNvdW50cnkoY291bnRyeSk7IC8vIFwiTGVhZGluZyBkaWdpdHNcIiBwYXR0ZXJucyBhcmUgb25seSBkZWZpbmVkIGZvciBhYm91dCAyMCUgb2YgYWxsIGNvdW50cmllcy5cbiAgICAvLyBCeSBkZWZpbml0aW9uLCBtYXRjaGluZyBcImxlYWRpbmcgZGlnaXRzXCIgaXMgYSBzdWZmaWNpZW50IGJ1dCBub3QgYSBuZWNlc3NhcnlcbiAgICAvLyBjb25kaXRpb24gZm9yIGEgcGhvbmUgbnVtYmVyIHRvIGJlbG9uZyB0byBhIGNvdW50cnkuXG4gICAgLy8gVGhlIHBvaW50IG9mIFwibGVhZGluZyBkaWdpdHNcIiBjaGVjayBpcyB0aGF0IGl0J3MgdGhlIGZhc3Rlc3Qgb25lIHRvIGdldCBhIG1hdGNoLlxuICAgIC8vIGh0dHBzOi8vZ2l0bGFiLmNvbS9jYXRhbXBoZXRhbWluZS9saWJwaG9uZW51bWJlci1qcy9ibG9iL21hc3Rlci9NRVRBREFUQS5tZCNsZWFkaW5nX2RpZ2l0c1xuXG4gICAgaWYgKG1ldGFkYXRhLmxlYWRpbmdEaWdpdHMoKSkge1xuICAgICAgaWYgKG5hdGlvbmFsUGhvbmVOdW1iZXIgJiYgbmF0aW9uYWxQaG9uZU51bWJlci5zZWFyY2gobWV0YWRhdGEubGVhZGluZ0RpZ2l0cygpKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gY291bnRyeTtcbiAgICAgIH1cbiAgICB9IC8vIEVsc2UgcGVyZm9ybSBmdWxsIHZhbGlkYXRpb24gd2l0aCBhbGwgb2YgdGhvc2VcbiAgICAvLyBmaXhlZC1saW5lL21vYmlsZS9ldGMgcmVndWxhciBleHByZXNzaW9ucy5cbiAgICBlbHNlIGlmICgoMCwgX2dldE51bWJlclR5cGVbXCJkZWZhdWx0XCJdKSh7XG4gICAgICBwaG9uZTogbmF0aW9uYWxQaG9uZU51bWJlcixcbiAgICAgIGNvdW50cnk6IGNvdW50cnlcbiAgICB9LCB1bmRlZmluZWQsIG1ldGFkYXRhLm1ldGFkYXRhKSkge1xuICAgICAgcmV0dXJuIGNvdW50cnk7XG4gICAgfVxuICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDb3VudHJ5QnlOYXRpb25hbE51bWJlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZ2V0SWRkUHJlZml4O1xuXG52YXIgX21ldGFkYXRhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbWV0YWRhdGEuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyoqXHJcbiAqIFBhdHRlcm4gdGhhdCBtYWtlcyBpdCBlYXN5IHRvIGRpc3Rpbmd1aXNoIHdoZXRoZXIgYSByZWdpb24gaGFzIGEgc2luZ2xlXHJcbiAqIGludGVybmF0aW9uYWwgZGlhbGluZyBwcmVmaXggb3Igbm90LiBJZiBhIHJlZ2lvbiBoYXMgYSBzaW5nbGUgaW50ZXJuYXRpb25hbFxyXG4gKiBwcmVmaXggKGUuZy4gMDExIGluIFVTQSksIGl0IHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcgdGhhdCBjb250YWluc1xyXG4gKiBhIHNlcXVlbmNlIG9mIEFTQ0lJIGRpZ2l0cywgYW5kIHBvc3NpYmx5IGEgdGlsZGUsIHdoaWNoIHNpZ25hbHMgd2FpdGluZyBmb3JcclxuICogdGhlIHRvbmUuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBhdmFpbGFibGUgaW50ZXJuYXRpb25hbCBwcmVmaXhlcyBpbiBhXHJcbiAqIHJlZ2lvbiwgdGhleSB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGEgcmVnZXggc3RyaW5nIHRoYXQgYWx3YXlzIGNvbnRhaW5zIG9uZVxyXG4gKiBvciBtb3JlIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IEFTQ0lJIGRpZ2l0cyBvciBhIHRpbGRlLlxyXG4gKi9cbnZhciBTSU5HTEVfSUREX1BSRUZJWF9SRUdfRVhQID0gL15bXFxkXSsoPzpbflxcdTIwNTNcXHUyMjNDXFx1RkY1RV1bXFxkXSspPyQvOyAvLyBGb3IgcmVnaW9ucyB0aGF0IGhhdmUgbXVsdGlwbGUgSUREIHByZWZpeGVzXG4vLyBhIHByZWZlcnJlZCBJREQgcHJlZml4IGlzIHJldHVybmVkLlxuXG5mdW5jdGlvbiBnZXRJZGRQcmVmaXgoY291bnRyeSwgY2FsbGluZ0NvZGUsIG1ldGFkYXRhKSB7XG4gIHZhciBjb3VudHJ5TWV0YWRhdGEgPSBuZXcgX21ldGFkYXRhW1wiZGVmYXVsdFwiXShtZXRhZGF0YSk7XG4gIGNvdW50cnlNZXRhZGF0YS5zZWxlY3ROdW1iZXJpbmdQbGFuKGNvdW50cnksIGNhbGxpbmdDb2RlKTtcblxuICBpZiAoY291bnRyeU1ldGFkYXRhLmRlZmF1bHRJRERQcmVmaXgoKSkge1xuICAgIHJldHVybiBjb3VudHJ5TWV0YWRhdGEuZGVmYXVsdElERFByZWZpeCgpO1xuICB9XG5cbiAgaWYgKFNJTkdMRV9JRERfUFJFRklYX1JFR19FWFAudGVzdChjb3VudHJ5TWV0YWRhdGEuSUREUHJlZml4KCkpKSB7XG4gICAgcmV0dXJuIGNvdW50cnlNZXRhZGF0YS5JRERQcmVmaXgoKTtcbiAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0SWRkUHJlZml4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBnZXROdW1iZXJUeXBlO1xuZXhwb3J0cy5pc051bWJlclR5cGVFcXVhbFRvID0gaXNOdW1iZXJUeXBlRXF1YWxUbztcblxudmFyIF9tZXRhZGF0YSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL21ldGFkYXRhLmpzXCIpKTtcblxudmFyIF9tYXRjaGVzRW50aXJlbHkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL21hdGNoZXNFbnRpcmVseS5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoaXQpIHJldHVybiAoaXQgPSBpdC5jYWxsKG8pKS5uZXh0LmJpbmQoaXQpOyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIE5PTl9GSVhFRF9MSU5FX1BIT05FX1RZUEVTID0gWydNT0JJTEUnLCAnUFJFTUlVTV9SQVRFJywgJ1RPTExfRlJFRScsICdTSEFSRURfQ09TVCcsICdWT0lQJywgJ1BFUlNPTkFMX05VTUJFUicsICdQQUdFUicsICdVQU4nLCAnVk9JQ0VNQUlMJ107IC8vIEZpbmRzIG91dCBuYXRpb25hbCBwaG9uZSBudW1iZXIgdHlwZSAoZml4ZWQgbGluZSwgbW9iaWxlLCBldGMpXG5cbmZ1bmN0aW9uIGdldE51bWJlclR5cGUoaW5wdXQsIG9wdGlvbnMsIG1ldGFkYXRhKSB7XG4gIC8vIElmIGFzc2lnbmluZyB0aGUgYHt9YCBkZWZhdWx0IHZhbHVlIGlzIG1vdmVkIHRvIHRoZSBhcmd1bWVudHMgYWJvdmUsXG4gIC8vIGNvZGUgY292ZXJhZ2Ugd291bGQgZGVjcmVhc2UgZm9yIHNvbWUgd2VpcmQgcmVhc29uLlxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsgLy8gV2hlbiBgcGFyc2UoKWAgcmV0dXJuZWQgYHt9YFxuICAvLyBtZWFuaW5nIHRoYXQgdGhlIHBob25lIG51bWJlciBpcyBub3QgYSB2YWxpZCBvbmUuXG5cbiAgaWYgKCFpbnB1dC5jb3VudHJ5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbWV0YWRhdGEgPSBuZXcgX21ldGFkYXRhW1wiZGVmYXVsdFwiXShtZXRhZGF0YSk7XG4gIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oaW5wdXQuY291bnRyeSwgaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgdmFyIG5hdGlvbmFsTnVtYmVyID0gb3B0aW9ucy52MiA/IGlucHV0Lm5hdGlvbmFsTnVtYmVyIDogaW5wdXQucGhvbmU7IC8vIFRoZSBmb2xsb3dpbmcgaXMgY29weS1wYXN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgZnVuY3Rpb246XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGVpMThuL2xpYnBob25lbnVtYmVyL2Jsb2IvM2VhNTQ3ZDRmYmFhMmQwYjY3NTg4OTA0ZGZhNWQzZjI1NTdjMjdmZi9qYXZhc2NyaXB0L2kxOG4vcGhvbmVudW1iZXJzL3Bob25lbnVtYmVydXRpbC5qcyNMMjgzNVxuICAvLyBJcyB0aGlzIG5hdGlvbmFsIG51bWJlciBldmVuIHZhbGlkIGZvciB0aGlzIGNvdW50cnlcblxuICBpZiAoISgwLCBfbWF0Y2hlc0VudGlyZWx5W1wiZGVmYXVsdFwiXSkobmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhLm5hdGlvbmFsTnVtYmVyUGF0dGVybigpKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBJcyBpdCBmaXhlZCBsaW5lIG51bWJlclxuXG5cbiAgaWYgKGlzTnVtYmVyVHlwZUVxdWFsVG8obmF0aW9uYWxOdW1iZXIsICdGSVhFRF9MSU5FJywgbWV0YWRhdGEpKSB7XG4gICAgLy8gQmVjYXVzZSBkdXBsaWNhdGUgcmVndWxhciBleHByZXNzaW9ucyBhcmUgcmVtb3ZlZFxuICAgIC8vIHRvIHJlZHVjZSBtZXRhZGF0YSBzaXplLCBpZiBcIm1vYmlsZVwiIHBhdHRlcm4gaXMgXCJcIlxuICAgIC8vIHRoZW4gaXQgbWVhbnMgaXQgd2FzIHJlbW92ZWQgZHVlIHRvIGJlaW5nIGEgZHVwbGljYXRlIG9mIHRoZSBmaXhlZC1saW5lIHBhdHRlcm4uXG4gICAgLy9cbiAgICBpZiAobWV0YWRhdGEudHlwZSgnTU9CSUxFJykgJiYgbWV0YWRhdGEudHlwZSgnTU9CSUxFJykucGF0dGVybigpID09PSAnJykge1xuICAgICAgcmV0dXJuICdGSVhFRF9MSU5FX09SX01PQklMRSc7XG4gICAgfSAvLyBgTU9CSUxFYCB0eXBlIHBhdHRlcm4gaXNuJ3QgaW5jbHVkZWQgaWYgaXQgbWF0Y2hlZCBgRklYRURfTElORWAgb25lLlxuICAgIC8vIEZvciBleGFtcGxlLCBmb3IgXCJVU1wiIGNvdW50cnkuXG4gICAgLy8gT2xkIG1ldGFkYXRhICg8IGAxLjAuMThgKSBoYWQgYSBzcGVjaWZpYyBcInR5cGVzXCIgZGF0YSBzdHJ1Y3R1cmVcbiAgICAvLyB0aGF0IGhhcHBlbmVkIHRvIGJlIGB1bmRlZmluZWRgIGZvciBgTU9CSUxFYCBpbiB0aGF0IGNhc2UuXG4gICAgLy8gTmV3ZXIgbWV0YWRhdGEgKD49IGAxLjAuMThgKSBoYXMgYW5vdGhlciBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzXG4gICAgLy8gbm90IGB1bmRlZmluZWRgIGZvciBgTU9CSUxFYCBpbiB0aGF0IGNhc2UgKGl0J3MganVzdCBhbiBlbXB0eSBhcnJheSkuXG4gICAgLy8gU28gdGhpcyBgaWZgIGlzIGp1c3QgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIG1ldGFkYXRhLlxuXG5cbiAgICBpZiAoIW1ldGFkYXRhLnR5cGUoJ01PQklMRScpKSB7XG4gICAgICByZXR1cm4gJ0ZJWEVEX0xJTkVfT1JfTU9CSUxFJztcbiAgICB9IC8vIENoZWNrIGlmIHRoZSBudW1iZXIgaGFwcGVucyB0byBxdWFsaWZ5IGFzIGJvdGggZml4ZWQgbGluZSBhbmQgbW9iaWxlLlxuICAgIC8vIChubyBzdWNoIGNvdW50cnkgaW4gdGhlIG1pbmltYWwgbWV0YWRhdGEgc2V0KVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cblxuICAgIGlmIChpc051bWJlclR5cGVFcXVhbFRvKG5hdGlvbmFsTnVtYmVyLCAnTU9CSUxFJywgbWV0YWRhdGEpKSB7XG4gICAgICByZXR1cm4gJ0ZJWEVEX0xJTkVfT1JfTU9CSUxFJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ0ZJWEVEX0xJTkUnO1xuICB9XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShOT05fRklYRURfTElORV9QSE9ORV9UWVBFUyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgdmFyIHR5cGUgPSBfc3RlcC52YWx1ZTtcblxuICAgIGlmIChpc051bWJlclR5cGVFcXVhbFRvKG5hdGlvbmFsTnVtYmVyLCB0eXBlLCBtZXRhZGF0YSkpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc051bWJlclR5cGVFcXVhbFRvKG5hdGlvbmFsTnVtYmVyLCB0eXBlLCBtZXRhZGF0YSkge1xuICB0eXBlID0gbWV0YWRhdGEudHlwZSh0eXBlKTtcblxuICBpZiAoIXR5cGUgfHwgIXR5cGUucGF0dGVybigpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIENoZWNrIGlmIGFueSBwb3NzaWJsZSBudW1iZXIgbGVuZ3RocyBhcmUgcHJlc2VudDtcbiAgLy8gaWYgc28sIHdlIHVzZSB0aGVtIHRvIGF2b2lkIGNoZWNraW5nXG4gIC8vIHRoZSB2YWxpZGF0aW9uIHBhdHRlcm4gaWYgdGhleSBkb24ndCBtYXRjaC5cbiAgLy8gSWYgdGhleSBhcmUgYWJzZW50LCB0aGlzIG1lYW5zIHRoZXkgbWF0Y2hcbiAgLy8gdGhlIGdlbmVyYWwgZGVzY3JpcHRpb24sIHdoaWNoIHdlIGhhdmVcbiAgLy8gYWxyZWFkeSBjaGVja2VkIGJlZm9yZSBhIHNwZWNpZmljIG51bWJlciB0eXBlLlxuXG5cbiAgaWYgKHR5cGUucG9zc2libGVMZW5ndGhzKCkgJiYgdHlwZS5wb3NzaWJsZUxlbmd0aHMoKS5pbmRleE9mKG5hdGlvbmFsTnVtYmVyLmxlbmd0aCkgPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfbWF0Y2hlc0VudGlyZWx5W1wiZGVmYXVsdFwiXSkobmF0aW9uYWxOdW1iZXIsIHR5cGUucGF0dGVybigpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldE51bWJlclR5cGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGdldFBvc3NpYmxlQ291bnRyaWVzRm9yTnVtYmVyO1xuXG52YXIgX21ldGFkYXRhMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL21ldGFkYXRhLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbi8qKlxyXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBjb3VudHJpZXMgdGhhdCB0aGUgcGhvbmUgbnVtYmVyIGNvdWxkIHBvdGVudGlhbGx5IGJlbG9uZyB0by5cclxuICogQHBhcmFtICB7c3RyaW5nfSBjYWxsaW5nQ29kZSDigJQgQ2FsbGluZyBjb2RlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5hdGlvbmFsTnVtYmVyIOKAlCBOYXRpb25hbCAoc2lnbmlmaWNhbnQpIG51bWJlci5cclxuICogQHBhcmFtICB7b2JqZWN0fSBtZXRhZGF0YSDigJQgTWV0YWRhdGEuXHJcbiAqIEByZXR1cm4ge3N0cmluZ1tdfSBBIGxpc3Qgb2YgcG9zc2libGUgY291bnRyaWVzLlxyXG4gKi9cbmZ1bmN0aW9uIGdldFBvc3NpYmxlQ291bnRyaWVzRm9yTnVtYmVyKGNhbGxpbmdDb2RlLCBuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpIHtcbiAgdmFyIF9tZXRhZGF0YSA9IG5ldyBfbWV0YWRhdGEyW1wiZGVmYXVsdFwiXShtZXRhZGF0YSk7XG5cbiAgdmFyIHBvc3NpYmxlQ291bnRyaWVzID0gX21ldGFkYXRhLmdldENvdW50cnlDb2Rlc0ZvckNhbGxpbmdDb2RlKGNhbGxpbmdDb2RlKTtcblxuICBpZiAoIXBvc3NpYmxlQ291bnRyaWVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIHBvc3NpYmxlQ291bnRyaWVzLmZpbHRlcihmdW5jdGlvbiAoY291bnRyeSkge1xuICAgIHJldHVybiBjb3VsZE5hdGlvbmFsTnVtYmVyQmVsb25nVG9Db3VudHJ5KG5hdGlvbmFsTnVtYmVyLCBjb3VudHJ5LCBtZXRhZGF0YSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb3VsZE5hdGlvbmFsTnVtYmVyQmVsb25nVG9Db3VudHJ5KG5hdGlvbmFsTnVtYmVyLCBjb3VudHJ5LCBtZXRhZGF0YSkge1xuICB2YXIgX21ldGFkYXRhID0gbmV3IF9tZXRhZGF0YTJbXCJkZWZhdWx0XCJdKG1ldGFkYXRhKTtcblxuICBfbWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbihjb3VudHJ5KTtcblxuICBpZiAoX21ldGFkYXRhLm51bWJlcmluZ1BsYW4ucG9zc2libGVMZW5ndGhzKCkuaW5kZXhPZihuYXRpb25hbE51bWJlci5sZW5ndGgpID49IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldFBvc3NpYmxlQ291bnRyaWVzRm9yTnVtYmVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5WQUxJRF9QSE9ORV9OVU1CRVJfV0lUSF9FWFRFTlNJT04gPSBleHBvcnRzLlZBTElEX1BIT05FX05VTUJFUiA9IHZvaWQgMDtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaXNWaWFibGVQaG9uZU51bWJlcjtcbmV4cG9ydHMuaXNWaWFibGVQaG9uZU51bWJlclN0YXJ0ID0gaXNWaWFibGVQaG9uZU51bWJlclN0YXJ0O1xuXG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG5cbnZhciBfY3JlYXRlRXh0ZW5zaW9uUGF0dGVybiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZXh0ZW5zaW9uL2NyZWF0ZUV4dGVuc2lvblBhdHRlcm4uanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLy8gIFJlZ3VsYXIgZXhwcmVzc2lvbiBvZiB2aWFibGUgcGhvbmUgbnVtYmVycy4gVGhpcyBpcyBsb2NhdGlvbiBpbmRlcGVuZGVudC5cbi8vICBDaGVja3Mgd2UgaGF2ZSBhdCBsZWFzdCB0aHJlZSBsZWFkaW5nIGRpZ2l0cywgYW5kIG9ubHkgdmFsaWQgcHVuY3R1YXRpb24sXG4vLyAgYWxwaGEgY2hhcmFjdGVycyBhbmQgZGlnaXRzIGluIHRoZSBwaG9uZSBudW1iZXIuIERvZXMgbm90IGluY2x1ZGUgZXh0ZW5zaW9uXG4vLyAgZGF0YS4gVGhlIHN5bWJvbCAneCcgaXMgYWxsb3dlZCBoZXJlIGFzIHZhbGlkIHB1bmN0dWF0aW9uIHNpbmNlIGl0IGlzIG9mdGVuXG4vLyAgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBjYXJyaWVyIGNvZGVzLCBmb3IgZXhhbXBsZSBpbiBCcmF6aWxpYW4gcGhvbmVcbi8vICBudW1iZXJzLiBXZSBhbHNvIGFsbG93IG11bHRpcGxlICcrJyBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydC5cbi8vXG4vLyAgQ29ycmVzcG9uZHMgdG8gdGhlIGZvbGxvd2luZzpcbi8vICBbZGlnaXRzXXttaW5MZW5ndGhOc259fFxuLy8gIHBsdXNfc2lnbipcbi8vICAoKFtwdW5jdHVhdGlvbl18W3N0YXJdKSpbZGlnaXRzXSl7Myx9KFtwdW5jdHVhdGlvbl18W3N0YXJdfFtkaWdpdHNdfFthbHBoYV0pKlxuLy9cbi8vICBUaGUgZmlyc3QgcmVnLWV4IGlzIHRvIGFsbG93IHNob3J0IG51bWJlcnMgKHR3byBkaWdpdHMgbG9uZykgdG8gYmUgcGFyc2VkIGlmXG4vLyAgdGhleSBhcmUgZW50ZXJlZCBhcyBcIjE1XCIgZXRjLCBidXQgb25seSBpZiB0aGVyZSBpcyBubyBwdW5jdHVhdGlvbiBpbiB0aGVtLlxuLy8gIFRoZSBzZWNvbmQgZXhwcmVzc2lvbiByZXN0cmljdHMgdGhlIG51bWJlciBvZiBkaWdpdHMgdG8gdGhyZWUgb3IgbW9yZSwgYnV0XG4vLyAgdGhlbiBhbGxvd3MgdGhlbSB0byBiZSBpbiBpbnRlcm5hdGlvbmFsIGZvcm0sIGFuZCB0byBoYXZlIGFscGhhLWNoYXJhY3RlcnNcbi8vICBhbmQgcHVuY3R1YXRpb24uIFdlIHNwbGl0IHVwIHRoZSB0d28gcmVnLWV4ZXMgaGVyZSBhbmQgY29tYmluZSB0aGVtIHdoZW5cbi8vICBjcmVhdGluZyB0aGUgcmVnLWV4IFZBTElEX1BIT05FX05VTUJFUl9QQVRURVJOIGl0c2VsZiBzbyB3ZSBjYW4gcHJlZml4IGl0XG4vLyAgd2l0aCBeIGFuZCBhcHBlbmQgJCB0byBlYWNoIGJyYW5jaC5cbi8vXG4vLyAgXCJOb3RlIFZBTElEX1BVTkNUVUFUSU9OIHN0YXJ0cyB3aXRoIGEgLSxcbi8vICAgc28gbXVzdCBiZSB0aGUgZmlyc3QgaW4gdGhlIHJhbmdlXCIgKGMpIEdvb2dsZSBkZXZzLlxuLy8gICh3dGYgZGlkIHRoZXkgbWVhbiBieSBzYXlpbmcgdGhhdDsgcHJvYmFibHkgbm90aGluZylcbi8vXG52YXIgTUlOX0xFTkdUSF9QSE9ORV9OVU1CRVJfUEFUVEVSTiA9ICdbJyArIF9jb25zdGFudHMuVkFMSURfRElHSVRTICsgJ117JyArIF9jb25zdGFudHMuTUlOX0xFTkdUSF9GT1JfTlNOICsgJ30nOyAvL1xuLy8gQW5kIHRoaXMgaXMgdGhlIHNlY29uZCByZWctZXhwOlxuLy8gKHNlZSBNSU5fTEVOR1RIX1BIT05FX05VTUJFUl9QQVRURVJOIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhpcyByZWctZXhwKVxuLy9cblxudmFyIFZBTElEX1BIT05FX05VTUJFUiA9ICdbJyArIF9jb25zdGFudHMuUExVU19DSEFSUyArICddezAsMX0nICsgJyg/OicgKyAnWycgKyBfY29uc3RhbnRzLlZBTElEX1BVTkNUVUFUSU9OICsgJ10qJyArICdbJyArIF9jb25zdGFudHMuVkFMSURfRElHSVRTICsgJ10nICsgJyl7Myx9JyArICdbJyArIF9jb25zdGFudHMuVkFMSURfUFVOQ1RVQVRJT04gKyBfY29uc3RhbnRzLlZBTElEX0RJR0lUUyArICddKic7IC8vIFRoaXMgcmVndWxhciBleHByZXNzaW9uIGlzbid0IHByZXNlbnQgaW4gR29vZ2xlJ3MgYGxpYnBob25lbnVtYmVyYFxuLy8gYW5kIGlzIG9ubHkgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcGhvbmUgbnVtYmVyIGJlaW5nIGlucHV0XG4vLyBpcyB0b28gc2hvcnQgZm9yIGl0IHRvIGV2ZW4gY29uc2lkZXIgaXQgYSBcInZhbGlkXCIgbnVtYmVyLlxuLy8gVGhpcyBpcyBqdXN0IGEgd2F5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIHJlYWxseSBpbnZhbGlkIHBob25lXG4vLyBudW1iZXIgbGlrZSBcImFiY2RlXCIgYW5kIGEgdmFsaWQgcGhvbmUgbnVtYmVyIHRoYXQgYSB1c2VyIGhhcyBqdXN0XG4vLyBzdGFydGVkIGlucHV0dGluZywgbGlrZSBcIisxXCIgb3IgXCIxXCI6IGJvdGggdGhlc2UgY2FzZXMgd291bGQgYmVcbi8vIGNvbnNpZGVyZWQgYE5PVF9BX05VTUJFUmAgYnkgR29vZ2xlJ3MgYGxpYnBob25lbnVtYmVyYCwgYnV0IHRoaXNcbi8vIGxpYnJhcnkgY2FuIHByb3ZpZGUgYSBtb3JlIGRldGFpbGVkIGVycm9yIG1lc3NhZ2Ug4oCUIHdoZXRoZXIgaXQnc1xuLy8gcmVhbGx5IFwibm90IGEgbnVtYmVyXCIsIG9yIGlzIGl0IGp1c3QgYSBzdGFydCBvZiBhIHZhbGlkIHBob25lIG51bWJlci5cblxuZXhwb3J0cy5WQUxJRF9QSE9ORV9OVU1CRVIgPSBWQUxJRF9QSE9ORV9OVU1CRVI7XG52YXIgVkFMSURfUEhPTkVfTlVNQkVSX1NUQVJUX1JFR19FWFAgPSBuZXcgUmVnRXhwKCdeJyArICdbJyArIF9jb25zdGFudHMuUExVU19DSEFSUyArICddezAsMX0nICsgJyg/OicgKyAnWycgKyBfY29uc3RhbnRzLlZBTElEX1BVTkNUVUFUSU9OICsgJ10qJyArICdbJyArIF9jb25zdGFudHMuVkFMSURfRElHSVRTICsgJ10nICsgJyl7MSwyfScgKyAnJCcsICdpJyk7XG52YXIgVkFMSURfUEhPTkVfTlVNQkVSX1dJVEhfRVhURU5TSU9OID0gVkFMSURfUEhPTkVfTlVNQkVSICsgLy8gUGhvbmUgbnVtYmVyIGV4dGVuc2lvbnNcbicoPzonICsgKDAsIF9jcmVhdGVFeHRlbnNpb25QYXR0ZXJuW1wiZGVmYXVsdFwiXSkoKSArICcpPyc7IC8vIFRoZSBjb21iaW5lZCByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHZhbGlkIHBob25lIG51bWJlcnM6XG4vL1xuXG5leHBvcnRzLlZBTElEX1BIT05FX05VTUJFUl9XSVRIX0VYVEVOU0lPTiA9IFZBTElEX1BIT05FX05VTUJFUl9XSVRIX0VYVEVOU0lPTjtcbnZhciBWQUxJRF9QSE9ORV9OVU1CRVJfUEFUVEVSTiA9IG5ldyBSZWdFeHAoIC8vIEVpdGhlciBhIHNob3J0IHR3by1kaWdpdC1vbmx5IHBob25lIG51bWJlclxuJ14nICsgTUlOX0xFTkdUSF9QSE9ORV9OVU1CRVJfUEFUVEVSTiArICckJyArICd8JyArIC8vIE9yIGEgbG9uZ2VyIGZ1bGx5IHBhcnNlZCBwaG9uZSBudW1iZXIgKG1pbiAzIGNoYXJhY3RlcnMpXG4nXicgKyBWQUxJRF9QSE9ORV9OVU1CRVJfV0lUSF9FWFRFTlNJT04gKyAnJCcsICdpJyk7IC8vIENoZWNrcyB0byBzZWUgaWYgdGhlIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGNvdWxkIHBvc3NpYmx5IGJlIGEgcGhvbmUgbnVtYmVyIGF0XG4vLyBhbGwuIEF0IHRoZSBtb21lbnQsIGNoZWNrcyB0byBzZWUgdGhhdCB0aGUgc3RyaW5nIGJlZ2lucyB3aXRoIGF0IGxlYXN0IDJcbi8vIGRpZ2l0cywgaWdub3JpbmcgYW55IHB1bmN0dWF0aW9uIGNvbW1vbmx5IGZvdW5kIGluIHBob25lIG51bWJlcnMuIFRoaXMgbWV0aG9kXG4vLyBkb2VzIG5vdCByZXF1aXJlIHRoZSBudW1iZXIgdG8gYmUgbm9ybWFsaXplZCBpbiBhZHZhbmNlIC0gYnV0IGRvZXMgYXNzdW1lXG4vLyB0aGF0IGxlYWRpbmcgbm9uLW51bWJlciBzeW1ib2xzIGhhdmUgYmVlbiByZW1vdmVkLCBzdWNoIGFzIGJ5IHRoZSBtZXRob2Rcbi8vIGBleHRyYWN0X3Bvc3NpYmxlX251bWJlcmAuXG4vL1xuXG5mdW5jdGlvbiBpc1ZpYWJsZVBob25lTnVtYmVyKG51bWJlcikge1xuICByZXR1cm4gbnVtYmVyLmxlbmd0aCA+PSBfY29uc3RhbnRzLk1JTl9MRU5HVEhfRk9SX05TTiAmJiBWQUxJRF9QSE9ORV9OVU1CRVJfUEFUVEVSTi50ZXN0KG51bWJlcik7XG59IC8vIFRoaXMgaXMganVzdCBhIHdheSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSByZWFsbHkgaW52YWxpZCBwaG9uZVxuLy8gbnVtYmVyIGxpa2UgXCJhYmNkZVwiIGFuZCBhIHZhbGlkIHBob25lIG51bWJlciB0aGF0IGEgdXNlciBoYXMganVzdFxuLy8gc3RhcnRlZCBpbnB1dHRpbmcsIGxpa2UgXCIrMVwiIG9yIFwiMVwiOiBib3RoIHRoZXNlIGNhc2VzIHdvdWxkIGJlXG4vLyBjb25zaWRlcmVkIGBOT1RfQV9OVU1CRVJgIGJ5IEdvb2dsZSdzIGBsaWJwaG9uZW51bWJlcmAsIGJ1dCB0aGlzXG4vLyBsaWJyYXJ5IGNhbiBwcm92aWRlIGEgbW9yZSBkZXRhaWxlZCBlcnJvciBtZXNzYWdlIOKAlCB3aGV0aGVyIGl0J3Ncbi8vIHJlYWxseSBcIm5vdCBhIG51bWJlclwiLCBvciBpcyBpdCBqdXN0IGEgc3RhcnQgb2YgYSB2YWxpZCBwaG9uZSBudW1iZXIuXG5cblxuZnVuY3Rpb24gaXNWaWFibGVQaG9uZU51bWJlclN0YXJ0KG51bWJlcikge1xuICByZXR1cm4gVkFMSURfUEhPTkVfTlVNQkVSX1NUQVJUX1JFR19FWFAudGVzdChudW1iZXIpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNWaWFibGVQaG9uZU51bWJlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbWF0Y2hlc0VudGlyZWx5O1xuXG4vKipcclxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGVudGlyZSBpbnB1dCBzZXF1ZW5jZSBjYW4gYmUgbWF0Y2hlZFxyXG4gKiBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc0VudGlyZWx5KHRleHQsIHJlZ3VsYXJfZXhwcmVzc2lvbikge1xuICAvLyBJZiBhc3NpZ25pbmcgdGhlIGAnJ2AgZGVmYXVsdCB2YWx1ZSBpcyBtb3ZlZCB0byB0aGUgYXJndW1lbnRzIGFib3ZlLFxuICAvLyBjb2RlIGNvdmVyYWdlIHdvdWxkIGRlY3JlYXNlIGZvciBzb21lIHdlaXJkIHJlYXNvbi5cbiAgdGV4dCA9IHRleHQgfHwgJyc7XG4gIHJldHVybiBuZXcgUmVnRXhwKCdeKD86JyArIHJlZ3VsYXJfZXhwcmVzc2lvbiArICcpJCcpLnRlc3QodGV4dCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXRjaGVzRW50aXJlbHkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1lcmdlQXJyYXlzO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoaXQpIHJldHVybiAoaXQgPSBpdC5jYWxsKG8pKS5uZXh0LmJpbmQoaXQpOyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuLyoqXHJcbiAqIE1lcmdlcyB0d28gYXJyYXlzLlxyXG4gKiBAcGFyYW0gIHsqfSBhXHJcbiAqIEBwYXJhbSAgeyp9IGJcclxuICogQHJldHVybiB7Kn1cclxuICovXG5mdW5jdGlvbiBtZXJnZUFycmF5cyhhLCBiKSB7XG4gIHZhciBtZXJnZWQgPSBhLnNsaWNlKCk7XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShiKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgZWxlbWVudCA9IF9zdGVwLnZhbHVlO1xuXG4gICAgaWYgKGEuaW5kZXhPZihlbGVtZW50KSA8IDApIHtcbiAgICAgIG1lcmdlZC5wdXNoKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfSk7IC8vIEVTNiB2ZXJzaW9uLCByZXF1aXJlcyBTZXQgcG9seWZpbGwuXG4gIC8vIGxldCBtZXJnZWQgPSBuZXcgU2V0KGEpXG4gIC8vIGZvciAoY29uc3QgZWxlbWVudCBvZiBiKSB7XG4gIC8vIFx0bWVyZ2VkLmFkZChpKVxuICAvLyB9XG4gIC8vIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZCkuc29ydCgoYSwgYikgPT4gYSAtIGIpXG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXJnZUFycmF5cy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuRElHSVRTID0gdm9pZCAwO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBwYXJzZURpZ2l0cztcbmV4cG9ydHMucGFyc2VEaWdpdCA9IHBhcnNlRGlnaXQ7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07IGlmIChpdCkgcmV0dXJuIChpdCA9IGl0LmNhbGwobykpLm5leHQuYmluZChpdCk7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG4vLyBUaGVzZSBtYXBwaW5ncyBtYXAgYSBjaGFyYWN0ZXIgKGtleSkgdG8gYSBzcGVjaWZpYyBkaWdpdCB0aGF0IHNob3VsZFxuLy8gcmVwbGFjZSBpdCBmb3Igbm9ybWFsaXphdGlvbiBwdXJwb3Nlcy4gTm9uLUV1cm9wZWFuIGRpZ2l0cyB0aGF0XG4vLyBtYXkgYmUgdXNlZCBpbiBwaG9uZSBudW1iZXJzIGFyZSBtYXBwZWQgdG8gYSBFdXJvcGVhbiBlcXVpdmFsZW50LlxuLy9cbi8vIEUuZy4gaW4gSXJhcSB0aGV5IGRvbid0IHdyaXRlIGArNDQyMzIzMjM0YCBidXQgcmF0aGVyIGAr2aTZpNmi2aPZotmj2aLZo9mkYC5cbi8vXG52YXIgRElHSVRTID0ge1xuICAnMCc6ICcwJyxcbiAgJzEnOiAnMScsXG4gICcyJzogJzInLFxuICAnMyc6ICczJyxcbiAgJzQnOiAnNCcsXG4gICc1JzogJzUnLFxuICAnNic6ICc2JyxcbiAgJzcnOiAnNycsXG4gICc4JzogJzgnLFxuICAnOSc6ICc5JyxcbiAgXCJcXHVGRjEwXCI6ICcwJyxcbiAgLy8gRnVsbHdpZHRoIGRpZ2l0IDBcbiAgXCJcXHVGRjExXCI6ICcxJyxcbiAgLy8gRnVsbHdpZHRoIGRpZ2l0IDFcbiAgXCJcXHVGRjEyXCI6ICcyJyxcbiAgLy8gRnVsbHdpZHRoIGRpZ2l0IDJcbiAgXCJcXHVGRjEzXCI6ICczJyxcbiAgLy8gRnVsbHdpZHRoIGRpZ2l0IDNcbiAgXCJcXHVGRjE0XCI6ICc0JyxcbiAgLy8gRnVsbHdpZHRoIGRpZ2l0IDRcbiAgXCJcXHVGRjE1XCI6ICc1JyxcbiAgLy8gRnVsbHdpZHRoIGRpZ2l0IDVcbiAgXCJcXHVGRjE2XCI6ICc2JyxcbiAgLy8gRnVsbHdpZHRoIGRpZ2l0IDZcbiAgXCJcXHVGRjE3XCI6ICc3JyxcbiAgLy8gRnVsbHdpZHRoIGRpZ2l0IDdcbiAgXCJcXHVGRjE4XCI6ICc4JyxcbiAgLy8gRnVsbHdpZHRoIGRpZ2l0IDhcbiAgXCJcXHVGRjE5XCI6ICc5JyxcbiAgLy8gRnVsbHdpZHRoIGRpZ2l0IDlcbiAgXCJcXHUwNjYwXCI6ICcwJyxcbiAgLy8gQXJhYmljLWluZGljIGRpZ2l0IDBcbiAgXCJcXHUwNjYxXCI6ICcxJyxcbiAgLy8gQXJhYmljLWluZGljIGRpZ2l0IDFcbiAgXCJcXHUwNjYyXCI6ICcyJyxcbiAgLy8gQXJhYmljLWluZGljIGRpZ2l0IDJcbiAgXCJcXHUwNjYzXCI6ICczJyxcbiAgLy8gQXJhYmljLWluZGljIGRpZ2l0IDNcbiAgXCJcXHUwNjY0XCI6ICc0JyxcbiAgLy8gQXJhYmljLWluZGljIGRpZ2l0IDRcbiAgXCJcXHUwNjY1XCI6ICc1JyxcbiAgLy8gQXJhYmljLWluZGljIGRpZ2l0IDVcbiAgXCJcXHUwNjY2XCI6ICc2JyxcbiAgLy8gQXJhYmljLWluZGljIGRpZ2l0IDZcbiAgXCJcXHUwNjY3XCI6ICc3JyxcbiAgLy8gQXJhYmljLWluZGljIGRpZ2l0IDdcbiAgXCJcXHUwNjY4XCI6ICc4JyxcbiAgLy8gQXJhYmljLWluZGljIGRpZ2l0IDhcbiAgXCJcXHUwNjY5XCI6ICc5JyxcbiAgLy8gQXJhYmljLWluZGljIGRpZ2l0IDlcbiAgXCJcXHUwNkYwXCI6ICcwJyxcbiAgLy8gRWFzdGVybi1BcmFiaWMgZGlnaXQgMFxuICBcIlxcdTA2RjFcIjogJzEnLFxuICAvLyBFYXN0ZXJuLUFyYWJpYyBkaWdpdCAxXG4gIFwiXFx1MDZGMlwiOiAnMicsXG4gIC8vIEVhc3Rlcm4tQXJhYmljIGRpZ2l0IDJcbiAgXCJcXHUwNkYzXCI6ICczJyxcbiAgLy8gRWFzdGVybi1BcmFiaWMgZGlnaXQgM1xuICBcIlxcdTA2RjRcIjogJzQnLFxuICAvLyBFYXN0ZXJuLUFyYWJpYyBkaWdpdCA0XG4gIFwiXFx1MDZGNVwiOiAnNScsXG4gIC8vIEVhc3Rlcm4tQXJhYmljIGRpZ2l0IDVcbiAgXCJcXHUwNkY2XCI6ICc2JyxcbiAgLy8gRWFzdGVybi1BcmFiaWMgZGlnaXQgNlxuICBcIlxcdTA2RjdcIjogJzcnLFxuICAvLyBFYXN0ZXJuLUFyYWJpYyBkaWdpdCA3XG4gIFwiXFx1MDZGOFwiOiAnOCcsXG4gIC8vIEVhc3Rlcm4tQXJhYmljIGRpZ2l0IDhcbiAgXCJcXHUwNkY5XCI6ICc5JyAvLyBFYXN0ZXJuLUFyYWJpYyBkaWdpdCA5XG5cbn07XG5leHBvcnRzLkRJR0lUUyA9IERJR0lUUztcblxuZnVuY3Rpb24gcGFyc2VEaWdpdChjaGFyYWN0ZXIpIHtcbiAgcmV0dXJuIERJR0lUU1tjaGFyYWN0ZXJdO1xufVxuLyoqXHJcbiAqIFBhcnNlcyBwaG9uZSBudW1iZXIgZGlnaXRzIGZyb20gYSBzdHJpbmcuXHJcbiAqIERyb3BzIGFsbCBwdW5jdHVhdGlvbiBsZWF2aW5nIG9ubHkgZGlnaXRzLlxyXG4gKiBBbHNvIGNvbnZlcnRzIHdpZGUtYXNjaWkgYW5kIGFyYWJpYy1pbmRpYyBudW1lcmFscyB0byBjb252ZW50aW9uYWwgbnVtZXJhbHMuXHJcbiAqIEUuZy4gaW4gSXJhcSB0aGV5IGRvbid0IHdyaXRlIGArNDQyMzIzMjM0YCBidXQgcmF0aGVyIGAr2aTZpNmi2aPZotmj2aLZo9mkYC5cclxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJpbmdcclxuICogQHJldHVybiB7c3RyaW5nfVxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqc1xyXG4gKiBwYXJzZURpZ2l0cygnOCAoODAwKSA1NTUnKVxyXG4gKiAvLyBPdXRwdXRzICc4ODAwNTU1Jy5cclxuICogYGBgXHJcbiAqL1xuXG5cbmZ1bmN0aW9uIHBhcnNlRGlnaXRzKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gJyc7IC8vIFVzaW5nIGAuc3BsaXQoJycpYCBoZXJlIGluc3RlYWQgb2Ygbm9ybWFsIGBmb3IgLi4uIG9mYFxuICAvLyBiZWNhdXNlIHRoZSBpbXBvcnRpbmcgYXBwbGljYXRpb24gZG9lc24ndCBuZWNjZXNzYXJpbHkgaW5jbHVkZSBhbiBFUzYgcG9seWZpbGwuXG4gIC8vIFRoZSBgLnNwbGl0KCcnKWAgYXBwcm9hY2ggZGlzY2FyZHMgXCJleG90aWNcIiBVVEYtOCBjaGFyYWN0ZXJzXG4gIC8vICh0aGUgb25lcyBjb25zaXN0aW5nIG9mIGZvdXIgYnl0ZXMpIGJ1dCBkaWdpdHNcbiAgLy8gKGluY2x1ZGluZyBub24tRXVyb3BlYW4gb25lcykgZG9uJ3QgZmFsbCBpbnRvIHRoYXQgcmFuZ2VcbiAgLy8gc28gc3VjaCBcImV4b3RpY1wiIGNoYXJhY3RlcnMgd291bGQgYmUgZGlzY2FyZGVkIGFueXdheS5cblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKHN0cmluZy5zcGxpdCgnJykpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgIHZhciBjaGFyYWN0ZXIgPSBfc3RlcC52YWx1ZTtcbiAgICB2YXIgZGlnaXQgPSBwYXJzZURpZ2l0KGNoYXJhY3Rlcik7XG5cbiAgICBpZiAoZGlnaXQpIHtcbiAgICAgIHJlc3VsdCArPSBkaWdpdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2VEaWdpdHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHN0cmlwSWRkUHJlZml4O1xuXG52YXIgX21ldGFkYXRhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbWV0YWRhdGEuanNcIikpO1xuXG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG52YXIgQ0FQVFVSSU5HX0RJR0lUX1BBVFRFUk4gPSBuZXcgUmVnRXhwKCcoWycgKyBfY29uc3RhbnRzLlZBTElEX0RJR0lUUyArICddKScpO1xuXG5mdW5jdGlvbiBzdHJpcElkZFByZWZpeChudW1iZXIsIGNvdW50cnksIGNhbGxpbmdDb2RlLCBtZXRhZGF0YSkge1xuICBpZiAoIWNvdW50cnkpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gQ2hlY2sgaWYgdGhlIG51bWJlciBpcyBJREQtcHJlZml4ZWQuXG5cblxuICB2YXIgY291bnRyeU1ldGFkYXRhID0gbmV3IF9tZXRhZGF0YVtcImRlZmF1bHRcIl0obWV0YWRhdGEpO1xuICBjb3VudHJ5TWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbihjb3VudHJ5LCBjYWxsaW5nQ29kZSk7XG4gIHZhciBJRERQcmVmaXhQYXR0ZXJuID0gbmV3IFJlZ0V4cChjb3VudHJ5TWV0YWRhdGEuSUREUHJlZml4KCkpO1xuXG4gIGlmIChudW1iZXIuc2VhcmNoKElERFByZWZpeFBhdHRlcm4pICE9PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFN0cmlwIElERCBwcmVmaXguXG5cblxuICBudW1iZXIgPSBudW1iZXIuc2xpY2UobnVtYmVyLm1hdGNoKElERFByZWZpeFBhdHRlcm4pWzBdLmxlbmd0aCk7IC8vIElmIHRoZXJlJ3JlIGFueSBkaWdpdHMgYWZ0ZXIgYW4gSUREIHByZWZpeCxcbiAgLy8gdGhlbiB0aG9zZSBkaWdpdHMgYXJlIGEgY291bnRyeSBjYWxsaW5nIGNvZGUuXG4gIC8vIFNpbmNlIG5vIGNvdW50cnkgY29kZSBzdGFydHMgd2l0aCBhIGAwYCxcbiAgLy8gdGhlIGNvZGUgYmVsb3cgdmFsaWRhdGVzIHRoYXQgdGhlIG5leHQgZGlnaXQgKGlmIHByZXNlbnQpIGlzIG5vdCBgMGAuXG5cbiAgdmFyIG1hdGNoZWRHcm91cHMgPSBudW1iZXIubWF0Y2goQ0FQVFVSSU5HX0RJR0lUX1BBVFRFUk4pO1xuXG4gIGlmIChtYXRjaGVkR3JvdXBzICYmIG1hdGNoZWRHcm91cHNbMV0gIT0gbnVsbCAmJiBtYXRjaGVkR3JvdXBzWzFdLmxlbmd0aCA+IDApIHtcbiAgICBpZiAobWF0Y2hlZEdyb3Vwc1sxXSA9PT0gJzAnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bWJlcjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmlwSWRkUHJlZml4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBpc1Bvc3NpYmxlUGhvbmVOdW1iZXI7XG5leHBvcnRzLmlzUG9zc2libGVOdW1iZXIgPSBpc1Bvc3NpYmxlTnVtYmVyO1xuXG52YXIgX21ldGFkYXRhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9tZXRhZGF0YS5qc1wiKSk7XG5cbnZhciBfY2hlY2tOdW1iZXJMZW5ndGggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvY2hlY2tOdW1iZXJMZW5ndGguanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIHBob25lIG51bWJlciBpcyBcInBvc3NpYmxlXCIgKGJhc2ljYWxseSBqdXN0IGNoZWNrcyBpdHMgbGVuZ3RoKS5cclxuICpcclxuICogaXNQb3NzaWJsZShwaG9uZU51bWJlckluc3RhbmNlLCB7IC4uLiwgdjI6IHRydWUgfSwgbWV0YWRhdGEpXHJcbiAqXHJcbiAqIGlzUG9zc2libGUoeyBwaG9uZTogJzgwMDU1NTM1MzUnLCBjb3VudHJ5OiAnUlUnIH0sIHsgLi4uIH0sIG1ldGFkYXRhKVxyXG4gKiBpc1Bvc3NpYmxlKHsgcGhvbmU6ICc4MDA1NTUzNTM1JywgY291bnRyeTogJ1JVJyB9LCB1bmRlZmluZWQsIG1ldGFkYXRhKVxyXG4gKlxyXG4gKiBAcGFyYW0gIHtvYmplY3R8UGhvbmVOdW1iZXJ9IGlucHV0IOKAlCBJZiBgb3B0aW9ucy52MjogdHJ1ZWAgZmxhZyBpcyBwYXNzZWQsIHRoZSBgaW5wdXRgIHNob3VsZCBiZSBhIGBQaG9uZU51bWJlcmAgaW5zdGFuY2UuIE90aGVyd2lzZSwgaXQgc2hvdWxkIGJlIGFuIG9iamVjdCBvZiBzaGFwZSBgeyBwaG9uZTogJy4uLicsIGNvdW50cnk6ICcuLi4nIH1gLlxyXG4gKiBAcGFyYW0gIHtvYmplY3R9IFtvcHRpb25zXVxyXG4gKiBAcGFyYW0gIHtvYmplY3R9IG1ldGFkYXRhXHJcbiAqIEByZXR1cm4ge3N0cmluZ31cclxuICovXG5mdW5jdGlvbiBpc1Bvc3NpYmxlUGhvbmVOdW1iZXIoaW5wdXQsIG9wdGlvbnMsIG1ldGFkYXRhKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgbWV0YWRhdGEgPSBuZXcgX21ldGFkYXRhW1wiZGVmYXVsdFwiXShtZXRhZGF0YSk7XG5cbiAgaWYgKG9wdGlvbnMudjIpIHtcbiAgICBpZiAoIWlucHV0LmNvdW50cnlDYWxsaW5nQ29kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBob25lIG51bWJlciBvYmplY3QgcGFzc2VkJyk7XG4gICAgfVxuXG4gICAgbWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbihpbnB1dC5jb3VudHJ5Q2FsbGluZ0NvZGUpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW5wdXQucGhvbmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQuY291bnRyeSkge1xuICAgICAgaWYgKCFtZXRhZGF0YS5oYXNDb3VudHJ5KGlucHV0LmNvdW50cnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY291bnRyeTogXCIuY29uY2F0KGlucHV0LmNvdW50cnkpKTtcbiAgICAgIH1cblxuICAgICAgbWV0YWRhdGEuY291bnRyeShpbnB1dC5jb3VudHJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpbnB1dC5jb3VudHJ5Q2FsbGluZ0NvZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBob25lIG51bWJlciBvYmplY3QgcGFzc2VkJyk7XG4gICAgICB9XG5cbiAgICAgIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgICB9XG4gIH0gLy8gT2xkIG1ldGFkYXRhICg8IDEuMC4xOCkgaGFkIG5vIFwicG9zc2libGUgbGVuZ3RoXCIgZGF0YS5cblxuXG4gIGlmIChtZXRhZGF0YS5wb3NzaWJsZUxlbmd0aHMoKSkge1xuICAgIHJldHVybiBpc1Bvc3NpYmxlTnVtYmVyKGlucHV0LnBob25lIHx8IGlucHV0Lm5hdGlvbmFsTnVtYmVyLCBtZXRhZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlcmUgd2FzIGEgYnVnIGJldHdlZW4gYDEuNy4zNWAgYW5kIGAxLjcuMzdgIHdoZXJlIFwicG9zc2libGVfbGVuZ3Roc1wiXG4gICAgLy8gd2VyZSBtaXNzaW5nIGZvciBcIm5vbi1nZW9ncmFwaGljYWxcIiBudW1iZXJpbmcgcGxhbnMuXG4gICAgLy8gSnVzdCBhc3N1bWUgdGhlIG51bWJlciBpcyBwb3NzaWJsZSBpbiBzdWNoIGNhc2VzOlxuICAgIC8vIGl0J3MgdW5saWtlbHkgdGhhdCBhbnlvbmUgZ2VuZXJhdGVkIHRoZWlyIGN1c3RvbSBtZXRhZGF0YVxuICAgIC8vIGluIHRoYXQgc2hvcnQgcGVyaW9kIG9mIHRpbWUgKG9uZSBkYXkpLlxuICAgIC8vIFRoaXMgY29kZSBjYW4gYmUgcmVtb3ZlZCBpbiBzb21lIGZ1dHVyZSBtYWpvciB2ZXJzaW9uIHVwZGF0ZS5cbiAgICBpZiAoaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlICYmIG1ldGFkYXRhLmlzTm9uR2VvZ3JhcGhpY0NhbGxpbmdDb2RlKGlucHV0LmNvdW50cnlDYWxsaW5nQ29kZSkpIHtcbiAgICAgIC8vIFwiTm9uLWdlb2dyYXBoaWMgZW50aXRpZXNcIiBkaWQndCBoYXZlIGBwb3NzaWJsZUxlbmd0aHNgXG4gICAgICAvLyBkdWUgdG8gYSBidWcgaW4gbWV0YWRhdGEgZ2VuZXJhdGlvbiBwcm9jZXNzLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBcInBvc3NpYmxlTGVuZ3Roc1wiIGluIG1ldGFkYXRhLiBQZXJoYXBzIHRoZSBtZXRhZGF0YSBoYXMgYmVlbiBnZW5lcmF0ZWQgYmVmb3JlIHYxLjAuMTguJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzUG9zc2libGVOdW1iZXIobmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhKSB7XG4gIC8vLCBpc0ludGVybmF0aW9uYWwpIHtcbiAgc3dpdGNoICgoMCwgX2NoZWNrTnVtYmVyTGVuZ3RoW1wiZGVmYXVsdFwiXSkobmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhKSkge1xuICAgIGNhc2UgJ0lTX1BPU1NJQkxFJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFRoaXMgbGlicmFyeSBpZ25vcmVzIFwibG9jYWwtb25seVwiIHBob25lIG51bWJlcnMgKGZvciBzaW1wbGljaXR5KS5cbiAgICAvLyBTZWUgdGhlIHJlYWRtZSBmb3IgbW9yZSBpbmZvIG9uIHdoYXQgYXJlIFwibG9jYWwtb25seVwiIHBob25lIG51bWJlcnMuXG4gICAgLy8gY2FzZSAnSVNfUE9TU0lCTEVfTE9DQUxfT05MWSc6XG4gICAgLy8gXHRyZXR1cm4gIWlzSW50ZXJuYXRpb25hbFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNQb3NzaWJsZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaXNQb3NzaWJsZVBob25lTnVtYmVyO1xuXG52YXIgX25vcm1hbGl6ZUFyZ3VtZW50czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL25vcm1hbGl6ZUFyZ3VtZW50cy5qc1wiKSk7XG5cbnZhciBfcGFyc2VQaG9uZU51bWJlcl8gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlUGhvbmVOdW1iZXJfLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIGlzUG9zc2libGVQaG9uZU51bWJlcigpIHtcbiAgdmFyIF9ub3JtYWxpemVBcmd1bWVudHMgPSAoMCwgX25vcm1hbGl6ZUFyZ3VtZW50czJbXCJkZWZhdWx0XCJdKShhcmd1bWVudHMpLFxuICAgICAgdGV4dCA9IF9ub3JtYWxpemVBcmd1bWVudHMudGV4dCxcbiAgICAgIG9wdGlvbnMgPSBfbm9ybWFsaXplQXJndW1lbnRzLm9wdGlvbnMsXG4gICAgICBtZXRhZGF0YSA9IF9ub3JtYWxpemVBcmd1bWVudHMubWV0YWRhdGE7XG5cbiAgb3B0aW9ucyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgZXh0cmFjdDogZmFsc2VcbiAgfSk7XG4gIHZhciBwaG9uZU51bWJlciA9ICgwLCBfcGFyc2VQaG9uZU51bWJlcl9bXCJkZWZhdWx0XCJdKSh0ZXh0LCBvcHRpb25zLCBtZXRhZGF0YSk7XG4gIHJldHVybiBwaG9uZU51bWJlciAmJiBwaG9uZU51bWJlci5pc1Bvc3NpYmxlKCkgfHwgZmFsc2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1Bvc3NpYmxlUGhvbmVOdW1iZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGlzVmFsaWROdW1iZXI7XG5cbnZhciBfbWV0YWRhdGEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL21ldGFkYXRhLmpzXCIpKTtcblxudmFyIF9tYXRjaGVzRW50aXJlbHkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvbWF0Y2hlc0VudGlyZWx5LmpzXCIpKTtcblxudmFyIF9nZXROdW1iZXJUeXBlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9oZWxwZXJzL2dldE51bWJlclR5cGUuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIGdpdmVuIHBob25lIG51bWJlciBpcyB2YWxpZC5cclxuICpcclxuICogaXNWYWxpZChwaG9uZU51bWJlckluc3RhbmNlLCB7IC4uLiwgdjI6IHRydWUgfSwgbWV0YWRhdGEpXHJcbiAqXHJcbiAqIGlzUG9zc2libGUoeyBwaG9uZTogJzgwMDU1NTM1MzUnLCBjb3VudHJ5OiAnUlUnIH0sIHsgLi4uIH0sIG1ldGFkYXRhKVxyXG4gKiBpc1Bvc3NpYmxlKHsgcGhvbmU6ICc4MDA1NTUzNTM1JywgY291bnRyeTogJ1JVJyB9LCB1bmRlZmluZWQsIG1ldGFkYXRhKVxyXG4gKlxyXG4gKiBJZiB0aGUgYG51bWJlcmAgaXMgYSBzdHJpbmcsIGl0IHdpbGwgYmUgcGFyc2VkIHRvIGFuIG9iamVjdCxcclxuICogYnV0IG9ubHkgaWYgaXQgY29udGFpbnMgb25seSB2YWxpZCBwaG9uZSBudW1iZXIgY2hhcmFjdGVycyAoaW5jbHVkaW5nIHB1bmN0dWF0aW9uKS5cclxuICogSWYgdGhlIGBudW1iZXJgIGlzIGFuIG9iamVjdCwgaXQgaXMgdXNlZCBhcyBpcy5cclxuICpcclxuICogVGhlIG9wdGlvbmFsIGBkZWZhdWx0Q291bnRyeWAgYXJndW1lbnQgaXMgdGhlIGRlZmF1bHQgY291bnRyeS5cclxuICogSS5lLiBpdCBkb2VzIG5vdCByZXN0cmljdCB0byBqdXN0IHRoYXQgY291bnRyeSxcclxuICogZS5nLiBpbiB0aG9zZSBjYXNlcyB3aGVyZSBzZXZlcmFsIGNvdW50cmllcyBzaGFyZVxyXG4gKiB0aGUgc2FtZSBwaG9uZSBudW1iZXJpbmcgcnVsZXMgKE5BTlBBLCBCcml0YWluLCBldGMpLlxyXG4gKiBGb3IgZXhhbXBsZSwgZXZlbiB0aG91Z2ggdGhlIG51bWJlciBgMDc2MjQgMzY5MjMwYFxyXG4gKiBiZWxvbmdzIHRvIHRoZSBJc2xlIG9mIE1hbiAoXCJJTVwiIGNvdW50cnkgY29kZSlcclxuICogY2FsbGluZyBgaXNWYWxpZE51bWJlcignMDc2MjQzNjkyMzAnLCAnR0InLCBtZXRhZGF0YSlgXHJcbiAqIHN0aWxsIHJldHVybnMgYHRydWVgIGJlY2F1c2UgdGhlIGNvdW50cnkgaXMgbm90IHJlc3RyaWN0ZWQgdG8gYEdCYCxcclxuICogaXQncyBqdXN0IHRoYXQgYEdCYCBpcyB0aGUgZGVmYXVsdCBvbmUgZm9yIHRoZSBwaG9uZSBudW1iZXJpbmcgcnVsZXMuXHJcbiAqIEZvciByZXN0cmljdGluZyB0aGUgY291bnRyeSBzZWUgYGlzVmFsaWROdW1iZXJGb3JSZWdpb24oKWBcclxuICogdGhvdWdoIHJlc3RyaWN0aW5nIGEgY291bnRyeSBtaWdodCBub3QgYmUgYSBnb29kIGlkZWEuXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGVpMThuL2xpYnBob25lbnVtYmVyL2Jsb2IvbWFzdGVyL0ZBUS5tZCN3aGVuLXNob3VsZC1pLXVzZS1pc3ZhbGlkbnVtYmVyZm9ycmVnaW9uXHJcbiAqXHJcbiAqIEV4YW1wbGVzOlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBpc1ZhbGlkTnVtYmVyKCcrNzgwMDU1NTM1MzUnLCBtZXRhZGF0YSlcclxuICogaXNWYWxpZE51bWJlcignODAwNTU1MzUzNScsICdSVScsIG1ldGFkYXRhKVxyXG4gKiBpc1ZhbGlkTnVtYmVyKCc4ODAwNTU1MzUzNScsICdSVScsIG1ldGFkYXRhKVxyXG4gKiBpc1ZhbGlkTnVtYmVyKHsgcGhvbmU6ICc4MDA1NTUzNTM1JywgY291bnRyeTogJ1JVJyB9LCBtZXRhZGF0YSlcclxuICogYGBgXHJcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZE51bWJlcihpbnB1dCwgb3B0aW9ucywgbWV0YWRhdGEpIHtcbiAgLy8gSWYgYXNzaWduaW5nIHRoZSBge31gIGRlZmF1bHQgdmFsdWUgaXMgbW92ZWQgdG8gdGhlIGFyZ3VtZW50cyBhYm92ZSxcbiAgLy8gY29kZSBjb3ZlcmFnZSB3b3VsZCBkZWNyZWFzZSBmb3Igc29tZSB3ZWlyZCByZWFzb24uXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBtZXRhZGF0YSA9IG5ldyBfbWV0YWRhdGFbXCJkZWZhdWx0XCJdKG1ldGFkYXRhKTtcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIGEgcGhvbmUgbnVtYmVyIGlzIFwicG9zc2libGVcIiAoYmFzaWNhbGx5IGp1c3QgY2hlY2tzIGl0cyBsZW5ndGgpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtICB7b2JqZWN0fFBob25lTnVtYmVyfSBpbnB1dCDigJQgSWYgYG9wdGlvbnMudjI6IHRydWVgIGZsYWcgaXMgcGFzc2VkLCB0aGUgYGlucHV0YCBzaG91bGQgYmUgYSBgUGhvbmVOdW1iZXJgIGluc3RhbmNlLiBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBhbiBvYmplY3Qgb2Ygc2hhcGUgYHsgcGhvbmU6ICcuLi4nLCBjb3VudHJ5OiAnLi4uJyB9YC5cclxuICAgKiBAcGFyYW0gIHtvYmplY3R9IFtvcHRpb25zXVxyXG4gICAqIEBwYXJhbSAge29iamVjdH0gbWV0YWRhdGFcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cbiAgbWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbihpbnB1dC5jb3VudHJ5LCBpbnB1dC5jb3VudHJ5Q2FsbGluZ0NvZGUpOyAvLyBCeSBkZWZhdWx0LCBjb3VudHJpZXMgb25seSBoYXZlIHR5cGUgcmVnZXhwcyB3aGVuIGl0J3MgcmVxdWlyZWQgZm9yXG4gIC8vIGRpc3Rpbmd1aXNoaW5nIGRpZmZlcmVudCBjb3VudHJpZXMgaGF2aW5nIHRoZSBzYW1lIGBjb3VudHJ5Q2FsbGluZ0NvZGVgLlxuXG4gIGlmIChtZXRhZGF0YS5oYXNUeXBlcygpKSB7XG4gICAgcmV0dXJuICgwLCBfZ2V0TnVtYmVyVHlwZVtcImRlZmF1bHRcIl0pKGlucHV0LCBvcHRpb25zLCBtZXRhZGF0YS5tZXRhZGF0YSkgIT09IHVuZGVmaW5lZDtcbiAgfSAvLyBJZiB0aGVyZSBhcmUgbm8gdHlwZSByZWdleHBzIGZvciB0aGlzIGNvdW50cnkgaW4gbWV0YWRhdGEgdGhlbiB1c2VcbiAgLy8gYG5hdGlvbmFsTnVtYmVyUGF0dGVybmAgYXMgYSBcImJldHRlciB0aGFuIG5vdGhpbmdcIiByZXBsYWNlbWVudC5cblxuXG4gIHZhciBuYXRpb25hbE51bWJlciA9IG9wdGlvbnMudjIgPyBpbnB1dC5uYXRpb25hbE51bWJlciA6IGlucHV0LnBob25lO1xuICByZXR1cm4gKDAsIF9tYXRjaGVzRW50aXJlbHlbXCJkZWZhdWx0XCJdKShuYXRpb25hbE51bWJlciwgbWV0YWRhdGEubmF0aW9uYWxOdW1iZXJQYXR0ZXJuKCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNWYWxpZC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaXNWYWxpZFBob25lTnVtYmVyO1xuXG52YXIgX25vcm1hbGl6ZUFyZ3VtZW50czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL25vcm1hbGl6ZUFyZ3VtZW50cy5qc1wiKSk7XG5cbnZhciBfcGFyc2VQaG9uZU51bWJlcl8gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlUGhvbmVOdW1iZXJfLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIGlzVmFsaWRQaG9uZU51bWJlcigpIHtcbiAgdmFyIF9ub3JtYWxpemVBcmd1bWVudHMgPSAoMCwgX25vcm1hbGl6ZUFyZ3VtZW50czJbXCJkZWZhdWx0XCJdKShhcmd1bWVudHMpLFxuICAgICAgdGV4dCA9IF9ub3JtYWxpemVBcmd1bWVudHMudGV4dCxcbiAgICAgIG9wdGlvbnMgPSBfbm9ybWFsaXplQXJndW1lbnRzLm9wdGlvbnMsXG4gICAgICBtZXRhZGF0YSA9IF9ub3JtYWxpemVBcmd1bWVudHMubWV0YWRhdGE7XG5cbiAgb3B0aW9ucyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgZXh0cmFjdDogZmFsc2VcbiAgfSk7XG4gIHZhciBwaG9uZU51bWJlciA9ICgwLCBfcGFyc2VQaG9uZU51bWJlcl9bXCJkZWZhdWx0XCJdKSh0ZXh0LCBvcHRpb25zLCBtZXRhZGF0YSk7XG4gIHJldHVybiBwaG9uZU51bWJlciAmJiBwaG9uZU51bWJlci5pc1ZhbGlkKCkgfHwgZmFsc2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1ZhbGlkUGhvbmVOdW1iZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGZpbmROdW1iZXJzO1xuXG52YXIgX1Bob25lTnVtYmVyTWF0Y2hlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL1Bob25lTnVtYmVyTWF0Y2hlci5qc1wiKSk7XG5cbnZhciBfbm9ybWFsaXplQXJndW1lbnRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL25vcm1hbGl6ZUFyZ3VtZW50cy5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBmaW5kTnVtYmVycygpIHtcbiAgdmFyIF9ub3JtYWxpemVBcmd1bWVudHMgPSAoMCwgX25vcm1hbGl6ZUFyZ3VtZW50czJbXCJkZWZhdWx0XCJdKShhcmd1bWVudHMpLFxuICAgICAgdGV4dCA9IF9ub3JtYWxpemVBcmd1bWVudHMudGV4dCxcbiAgICAgIG9wdGlvbnMgPSBfbm9ybWFsaXplQXJndW1lbnRzLm9wdGlvbnMsXG4gICAgICBtZXRhZGF0YSA9IF9ub3JtYWxpemVBcmd1bWVudHMubWV0YWRhdGE7XG5cbiAgdmFyIG1hdGNoZXIgPSBuZXcgX1Bob25lTnVtYmVyTWF0Y2hlcltcImRlZmF1bHRcIl0odGV4dCwgb3B0aW9ucywgbWV0YWRhdGEpO1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIHdoaWxlIChtYXRjaGVyLmhhc05leHQoKSkge1xuICAgIHJlc3VsdHMucHVzaChtYXRjaGVyLm5leHQoKSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbmROdW1iZXJzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGZpbmRQaG9uZU51bWJlcnM7XG5leHBvcnRzLnNlYXJjaFBob25lTnVtYmVycyA9IHNlYXJjaFBob25lTnVtYmVycztcblxudmFyIF9maW5kUGhvbmVOdW1iZXJzSW5pdGlhbEltcGxlbWVudGF0aW9uID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vZmluZFBob25lTnVtYmVyc0luaXRpYWxJbXBsZW1lbnRhdGlvbi5qc1wiKSk7XG5cbnZhciBfbm9ybWFsaXplQXJndW1lbnRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL25vcm1hbGl6ZUFyZ3VtZW50cy5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaiwgbm9kZUludGVyb3ApIHsgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbi8vIFRoaXMgaXMgYSBsZWdhY3kgZnVuY3Rpb24uXG4vLyBVc2UgYGZpbmROdW1iZXJzKClgIGluc3RlYWQuXG5mdW5jdGlvbiBmaW5kUGhvbmVOdW1iZXJzKCkge1xuICB2YXIgX25vcm1hbGl6ZUFyZ3VtZW50cyA9ICgwLCBfbm9ybWFsaXplQXJndW1lbnRzM1tcImRlZmF1bHRcIl0pKGFyZ3VtZW50cyksXG4gICAgICB0ZXh0ID0gX25vcm1hbGl6ZUFyZ3VtZW50cy50ZXh0LFxuICAgICAgb3B0aW9ucyA9IF9ub3JtYWxpemVBcmd1bWVudHMub3B0aW9ucyxcbiAgICAgIG1ldGFkYXRhID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5tZXRhZGF0YTtcblxuICByZXR1cm4gKDAsIF9maW5kUGhvbmVOdW1iZXJzSW5pdGlhbEltcGxlbWVudGF0aW9uW1wiZGVmYXVsdFwiXSkodGV4dCwgb3B0aW9ucywgbWV0YWRhdGEpO1xufVxuLyoqXHJcbiAqIEByZXR1cm4gRVM2IGBmb3IgLi4uIG9mYCBpdGVyYXRvci5cclxuICovXG5cblxuZnVuY3Rpb24gc2VhcmNoUGhvbmVOdW1iZXJzKCkge1xuICB2YXIgX25vcm1hbGl6ZUFyZ3VtZW50czIgPSAoMCwgX25vcm1hbGl6ZUFyZ3VtZW50czNbXCJkZWZhdWx0XCJdKShhcmd1bWVudHMpLFxuICAgICAgdGV4dCA9IF9ub3JtYWxpemVBcmd1bWVudHMyLnRleHQsXG4gICAgICBvcHRpb25zID0gX25vcm1hbGl6ZUFyZ3VtZW50czIub3B0aW9ucyxcbiAgICAgIG1ldGFkYXRhID0gX25vcm1hbGl6ZUFyZ3VtZW50czIubWV0YWRhdGE7XG5cbiAgcmV0dXJuICgwLCBfZmluZFBob25lTnVtYmVyc0luaXRpYWxJbXBsZW1lbnRhdGlvbi5zZWFyY2hQaG9uZU51bWJlcnMpKHRleHQsIG9wdGlvbnMsIG1ldGFkYXRhKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbmRQaG9uZU51bWJlcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlBob25lTnVtYmVyU2VhcmNoID0gZXhwb3J0cy5FWFROX1BBVFRFUk5TX0ZPUl9QQVJTSU5HID0gdm9pZCAwO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBmaW5kUGhvbmVOdW1iZXJzO1xuZXhwb3J0cy5zZWFyY2hQaG9uZU51bWJlcnMgPSBzZWFyY2hQaG9uZU51bWJlcnM7XG5cbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcblxudmFyIF9wYXJzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3BhcnNlLmpzXCIpKTtcblxudmFyIF9pc1ZpYWJsZVBob25lTnVtYmVyID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvaXNWaWFibGVQaG9uZU51bWJlci5qc1wiKTtcblxudmFyIF9jcmVhdGVFeHRlbnNpb25QYXR0ZXJuID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vaGVscGVycy9leHRlbnNpb24vY3JlYXRlRXh0ZW5zaW9uUGF0dGVybi5qc1wiKSk7XG5cbnZhciBfcGFyc2VQcmVDYW5kaWRhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9maW5kTnVtYmVycy9wYXJzZVByZUNhbmRpZGF0ZS5qc1wiKSk7XG5cbnZhciBfaXNWYWxpZFByZUNhbmRpZGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2ZpbmROdW1iZXJzL2lzVmFsaWRQcmVDYW5kaWRhdGUuanNcIikpO1xuXG52YXIgX2lzVmFsaWRDYW5kaWRhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9maW5kTnVtYmVycy9pc1ZhbGlkQ2FuZGlkYXRlLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuLyoqXHJcbiAqIFJlZ2V4cCBvZiBhbGwgcG9zc2libGUgd2F5cyB0byB3cml0ZSBleHRlbnNpb25zLCBmb3IgdXNlIHdoZW4gcGFyc2luZy4gVGhpc1xyXG4gKiB3aWxsIGJlIHJ1biBhcyBhIGNhc2UtaW5zZW5zaXRpdmUgcmVnZXhwIG1hdGNoLiBXaWRlIGNoYXJhY3RlciB2ZXJzaW9ucyBhcmVcclxuICogYWxzbyBwcm92aWRlZCBhZnRlciBlYWNoIEFTQ0lJIHZlcnNpb24uIFRoZXJlIGFyZSB0aHJlZSByZWd1bGFyIGV4cHJlc3Npb25zXHJcbiAqIGhlcmUuIFRoZSBmaXJzdCBjb3ZlcnMgUkZDIDM5NjYgZm9ybWF0LCB3aGVyZSB0aGUgZXh0ZW5zaW9uIGlzIGFkZGVkIHVzaW5nXHJcbiAqICc7ZXh0PScuIFRoZSBzZWNvbmQgbW9yZSBnZW5lcmljIG9uZSBzdGFydHMgd2l0aCBvcHRpb25hbCB3aGl0ZSBzcGFjZSBhbmRcclxuICogZW5kcyB3aXRoIGFuIG9wdGlvbmFsIGZ1bGwgc3RvcCAoLiksIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBzcGFjZXMvdGFic1xyXG4gKiAvY29tbWFzIGFuZCB0aGVuIHRoZSBudW1iZXJzIHRoZW1zZWx2ZXMuIFRoZSBvdGhlciBvbmUgY292ZXJzIHRoZSBzcGVjaWFsXHJcbiAqIGNhc2Ugb2YgQW1lcmljYW4gbnVtYmVycyB3aGVyZSB0aGUgZXh0ZW5zaW9uIGlzIHdyaXR0ZW4gd2l0aCBhIGhhc2ggYXQgdGhlXHJcbiAqIGVuZCwgc3VjaCBhcyAnLSA1MDMjJy4gTm90ZSB0aGF0IHRoZSBvbmx5IGNhcHR1cmluZyBncm91cHMgc2hvdWxkIGJlIGFyb3VuZFxyXG4gKiB0aGUgZGlnaXRzIHRoYXQgeW91IHdhbnQgdG8gY2FwdHVyZSBhcyBwYXJ0IG9mIHRoZSBleHRlbnNpb24sIG9yIGVsc2UgcGFyc2luZ1xyXG4gKiB3aWxsIGZhaWwhIFdlIGFsbG93IHR3byBvcHRpb25zIGZvciByZXByZXNlbnRpbmcgdGhlIGFjY2VudGVkIG8gLSB0aGVcclxuICogY2hhcmFjdGVyIGl0c2VsZiwgYW5kIG9uZSBpbiB0aGUgdW5pY29kZSBkZWNvbXBvc2VkIGZvcm0gd2l0aCB0aGUgY29tYmluaW5nXHJcbiAqIGFjdXRlIGFjY2VudC5cclxuICovXG52YXIgRVhUTl9QQVRURVJOU19GT1JfUEFSU0lORyA9ICgwLCBfY3JlYXRlRXh0ZW5zaW9uUGF0dGVybltcImRlZmF1bHRcIl0pKCdwYXJzaW5nJyk7XG5leHBvcnRzLkVYVE5fUEFUVEVSTlNfRk9SX1BBUlNJTkcgPSBFWFROX1BBVFRFUk5TX0ZPUl9QQVJTSU5HO1xudmFyIFdISVRFU1BBQ0VfSU5fVEhFX0JFR0lOTklOR19QQVRURVJOID0gbmV3IFJlZ0V4cCgnXlsnICsgX2NvbnN0YW50cy5XSElURVNQQUNFICsgJ10rJyk7XG52YXIgUFVOQ1RVQVRJT05fSU5fVEhFX0VORF9QQVRURVJOID0gbmV3IFJlZ0V4cCgnWycgKyBfY29uc3RhbnRzLlZBTElEX1BVTkNUVUFUSU9OICsgJ10rJCcpOyAvLyAvLyBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIGdldHRpbmcgb3BlbmluZyBicmFja2V0cyBmb3IgYSB2YWxpZCBudW1iZXJcbi8vIC8vIGZvdW5kIHVzaW5nIGBQSE9ORV9OVU1CRVJfU1RBUlRfUEFUVEVSTmAgZm9yIHByZXBlbmRpbmcgdGhvc2UgYnJhY2tldHMgdG8gdGhlIG51bWJlci5cbi8vIGNvbnN0IEJFRk9SRV9OVU1CRVJfRElHSVRTX1BVTkNUVUFUSU9OID0gbmV3IFJlZ0V4cCgnWycgKyBPUEVOSU5HX0JSQUNLRVRTICsgJ10rJyArICdbJyArIFdISVRFU1BBQ0UgKyAnXSonICsgJyQnKVxuXG52YXIgVkFMSURfUFJFQ0VESU5HX0NIQVJBQ1RFUl9QQVRURVJOID0gL1teYS16QS1aMC05XS87XG5cbmZ1bmN0aW9uIGZpbmRQaG9uZU51bWJlcnModGV4dCwgb3B0aW9ucywgbWV0YWRhdGEpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgc2VhcmNoID0gbmV3IFBob25lTnVtYmVyU2VhcmNoKHRleHQsIG9wdGlvbnMsIG1ldGFkYXRhKTtcbiAgdmFyIHBob25lcyA9IFtdO1xuXG4gIHdoaWxlIChzZWFyY2guaGFzTmV4dCgpKSB7XG4gICAgcGhvbmVzLnB1c2goc2VhcmNoLm5leHQoKSk7XG4gIH1cblxuICByZXR1cm4gcGhvbmVzO1xufVxuLyoqXHJcbiAqIEByZXR1cm4gRVM2IGBmb3IgLi4uIG9mYCBpdGVyYXRvci5cclxuICovXG5cblxuZnVuY3Rpb24gc2VhcmNoUGhvbmVOdW1iZXJzKHRleHQsIG9wdGlvbnMsIG1ldGFkYXRhKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIHNlYXJjaCA9IG5ldyBQaG9uZU51bWJlclNlYXJjaCh0ZXh0LCBvcHRpb25zLCBtZXRhZGF0YSk7XG4gIHJldHVybiBfZGVmaW5lUHJvcGVydHkoe30sIFN5bWJvbC5pdGVyYXRvciwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICBpZiAoc2VhcmNoLmhhc05leHQoKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBzZWFyY2gubmV4dCgpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xufVxuLyoqXHJcbiAqIEV4dHJhY3RzIGEgcGFyc2VhYmxlIHBob25lIG51bWJlciBpbmNsdWRpbmcgYW55IG9wZW5pbmcgYnJhY2tldHMsIGV0Yy5cclxuICogQHBhcmFtICB7c3RyaW5nfSB0ZXh0IC0gSW5wdXQuXHJcbiAqIEByZXR1cm4ge29iamVjdH0gYHsgP251bWJlciwgP3N0YXJ0c0F0LCA/ZW5kc0F0IH1gLlxyXG4gKi9cblxuXG52YXIgUGhvbmVOdW1iZXJTZWFyY2ggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQaG9uZU51bWJlclNlYXJjaCh0ZXh0LCBvcHRpb25zLCBtZXRhZGF0YSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQaG9uZU51bWJlclNlYXJjaCk7XG5cbiAgICB0aGlzLnRleHQgPSB0ZXh0OyAvLyBJZiBhc3NpZ25pbmcgdGhlIGB7fWAgZGVmYXVsdCB2YWx1ZSBpcyBtb3ZlZCB0byB0aGUgYXJndW1lbnRzIGFib3ZlLFxuICAgIC8vIGNvZGUgY292ZXJhZ2Ugd291bGQgZGVjcmVhc2UgZm9yIHNvbWUgd2VpcmQgcmVhc29uLlxuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7IC8vIEl0ZXJhdGlvbiB0cmlzdGF0ZS5cblxuICAgIHRoaXMuc3RhdGUgPSAnTk9UX1JFQURZJztcbiAgICB0aGlzLnJlZ2V4cCA9IG5ldyBSZWdFeHAoX2lzVmlhYmxlUGhvbmVOdW1iZXIuVkFMSURfUEhPTkVfTlVNQkVSX1dJVEhfRVhURU5TSU9OLCAnaWcnKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQaG9uZU51bWJlclNlYXJjaCwgW3tcbiAgICBrZXk6IFwiZmluZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kKCkge1xuICAgICAgdmFyIG1hdGNoZXMgPSB0aGlzLnJlZ2V4cC5leGVjKHRoaXMudGV4dCk7XG5cbiAgICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBudW1iZXIgPSBtYXRjaGVzWzBdO1xuICAgICAgdmFyIHN0YXJ0c0F0ID0gbWF0Y2hlcy5pbmRleDtcbiAgICAgIG51bWJlciA9IG51bWJlci5yZXBsYWNlKFdISVRFU1BBQ0VfSU5fVEhFX0JFR0lOTklOR19QQVRURVJOLCAnJyk7XG4gICAgICBzdGFydHNBdCArPSBtYXRjaGVzWzBdLmxlbmd0aCAtIG51bWJlci5sZW5ndGg7IC8vIEZpeGVzIG5vdCBwYXJzaW5nIG51bWJlcnMgd2l0aCB3aGl0ZXNwYWNlIGluIHRoZSBlbmQuXG4gICAgICAvLyBBbHNvIGZpeGVzIG5vdCBwYXJzaW5nIG51bWJlcnMgd2l0aCBvcGVuaW5nIHBhcmVudGhlc2VzIGluIHRoZSBlbmQuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2F0YW1waGV0YW1pbmUvbGlicGhvbmVudW1iZXItanMvaXNzdWVzLzI1MlxuXG4gICAgICBudW1iZXIgPSBudW1iZXIucmVwbGFjZShQVU5DVFVBVElPTl9JTl9USEVfRU5EX1BBVFRFUk4sICcnKTtcbiAgICAgIG51bWJlciA9ICgwLCBfcGFyc2VQcmVDYW5kaWRhdGVbXCJkZWZhdWx0XCJdKShudW1iZXIpO1xuICAgICAgdmFyIHJlc3VsdCA9IHRoaXMucGFyc2VDYW5kaWRhdGUobnVtYmVyLCBzdGFydHNBdCk7XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gLy8gVGFpbCByZWN1cnNpb24uXG4gICAgICAvLyBUcnkgdGhlIG5leHQgb25lIGlmIHRoaXMgb25lIGlzIG5vdCBhIHZhbGlkIHBob25lIG51bWJlci5cblxuXG4gICAgICByZXR1cm4gdGhpcy5maW5kKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhcnNlQ2FuZGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlQ2FuZGlkYXRlKG51bWJlciwgc3RhcnRzQXQpIHtcbiAgICAgIGlmICghKDAsIF9pc1ZhbGlkUHJlQ2FuZGlkYXRlW1wiZGVmYXVsdFwiXSkobnVtYmVyLCBzdGFydHNBdCwgdGhpcy50ZXh0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIERvbid0IHBhcnNlIHBob25lIG51bWJlcnMgd2hpY2ggYXJlIG5vbi1waG9uZSBudW1iZXJzXG4gICAgICAvLyBkdWUgdG8gYmVpbmcgcGFydCBvZiBzb21ldGhpbmcgZWxzZSAoZS5nLiBhIFVVSUQpLlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NhdGFtcGhldGFtaW5lL2xpYnBob25lbnVtYmVyLWpzL2lzc3Vlcy8yMTNcbiAgICAgIC8vIENvcHktcGFzdGVkIGZyb20gR29vZ2xlJ3MgYFBob25lTnVtYmVyTWF0Y2hlci5qc2AgKGAucGFyc2VBbmRWYWxpZGF0ZSgpYCkuXG5cblxuICAgICAgaWYgKCEoMCwgX2lzVmFsaWRDYW5kaWRhdGVbXCJkZWZhdWx0XCJdKShudW1iZXIsIHN0YXJ0c0F0LCB0aGlzLnRleHQsIHRoaXMub3B0aW9ucy5leHRlbmRlZCA/ICdQT1NTSUJMRScgOiAnVkFMSUQnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIC8vIFByZXBlbmQgYW55IG9wZW5pbmcgYnJhY2tldHMgbGVmdCBiZWhpbmQgYnkgdGhlXG4gICAgICAvLyAvLyBgUEhPTkVfTlVNQkVSX1NUQVJUX1BBVFRFUk5gIHJlZ2V4cC5cbiAgICAgIC8vIGNvbnN0IHRleHRfYmVmb3JlX251bWJlciA9IHRleHQuc2xpY2UodGhpcy5zZWFyY2hpbmdfZnJvbSwgc3RhcnRzQXQpXG4gICAgICAvLyBjb25zdCBmdWxsX251bWJlcl9zdGFydHNfYXQgPSB0ZXh0X2JlZm9yZV9udW1iZXIuc2VhcmNoKEJFRk9SRV9OVU1CRVJfRElHSVRTX1BVTkNUVUFUSU9OKVxuICAgICAgLy8gaWYgKGZ1bGxfbnVtYmVyX3N0YXJ0c19hdCA+PSAwKVxuICAgICAgLy8ge1xuICAgICAgLy8gXHRudW1iZXIgICA9IHRleHRfYmVmb3JlX251bWJlci5zbGljZShmdWxsX251bWJlcl9zdGFydHNfYXQpICsgbnVtYmVyXG4gICAgICAvLyBcdHN0YXJ0c0F0ID0gZnVsbF9udW1iZXJfc3RhcnRzX2F0XG4gICAgICAvLyB9XG4gICAgICAvL1xuICAgICAgLy8gdGhpcy5zZWFyY2hpbmdfZnJvbSA9IG1hdGNoZXMubGFzdEluZGV4XG5cblxuICAgICAgdmFyIHJlc3VsdCA9ICgwLCBfcGFyc2VbXCJkZWZhdWx0XCJdKShudW1iZXIsIHRoaXMub3B0aW9ucywgdGhpcy5tZXRhZGF0YSk7XG5cbiAgICAgIGlmICghcmVzdWx0LnBob25lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0LnN0YXJ0c0F0ID0gc3RhcnRzQXQ7XG4gICAgICByZXN1bHQuZW5kc0F0ID0gc3RhcnRzQXQgKyBudW1iZXIubGVuZ3RoO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzTmV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNOZXh0KCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdOT1RfUkVBRFknKSB7XG4gICAgICAgIHRoaXMubGFzdF9tYXRjaCA9IHRoaXMuZmluZCgpO1xuXG4gICAgICAgIGlmICh0aGlzLmxhc3RfbWF0Y2gpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gJ1JFQURZJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gJ0RPTkUnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSAnUkVBRFknO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAvLyBDaGVjayB0aGUgc3RhdGUgYW5kIGZpbmQgdGhlIG5leHQgbWF0Y2ggYXMgYSBzaWRlLWVmZmVjdCBpZiBuZWNlc3NhcnkuXG4gICAgICBpZiAoIXRoaXMuaGFzTmV4dCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gbmV4dCBlbGVtZW50Jyk7XG4gICAgICB9IC8vIERvbid0IHJldGFpbiB0aGF0IG1lbW9yeSBhbnkgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LlxuXG5cbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmxhc3RfbWF0Y2g7XG4gICAgICB0aGlzLmxhc3RfbWF0Y2ggPSBudWxsO1xuICAgICAgdGhpcy5zdGF0ZSA9ICdOT1RfUkVBRFknO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGhvbmVOdW1iZXJTZWFyY2g7XG59KCk7XG5cbmV4cG9ydHMuUGhvbmVOdW1iZXJTZWFyY2ggPSBQaG9uZU51bWJlclNlYXJjaDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbmRQaG9uZU51bWJlcnNJbml0aWFsSW1wbGVtZW50YXRpb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGZvcm1hdE51bWJlcjtcblxudmFyIF9mb3JtYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9mb3JtYXQuanNcIikpO1xuXG52YXIgX3BhcnNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vcGFyc2UuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH0sIF90eXBlb2Yob2JqKTsgfVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2kgPSBhcnIgPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07IGlmIChfaSA9PSBudWxsKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX3MsIF9lOyB0cnkgeyBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5cbmZ1bmN0aW9uIGZvcm1hdE51bWJlcigpIHtcbiAgdmFyIF9ub3JtYWxpemVBcmd1bWVudHMgPSBub3JtYWxpemVBcmd1bWVudHMoYXJndW1lbnRzKSxcbiAgICAgIGlucHV0ID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5pbnB1dCxcbiAgICAgIGZvcm1hdCA9IF9ub3JtYWxpemVBcmd1bWVudHMuZm9ybWF0LFxuICAgICAgb3B0aW9ucyA9IF9ub3JtYWxpemVBcmd1bWVudHMub3B0aW9ucyxcbiAgICAgIG1ldGFkYXRhID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5tZXRhZGF0YTtcblxuICByZXR1cm4gKDAsIF9mb3JtYXRbXCJkZWZhdWx0XCJdKShpbnB1dCwgZm9ybWF0LCBvcHRpb25zLCBtZXRhZGF0YSk7XG59IC8vIFNvcnQgb3V0IGFyZ3VtZW50c1xuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3VtZW50cyhhcmdzKSB7XG4gIHZhciBfQXJyYXkkcHJvdG90eXBlJHNsaWMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzKSxcbiAgICAgIF9BcnJheSRwcm90b3R5cGUkc2xpYzIgPSBfc2xpY2VkVG9BcnJheShfQXJyYXkkcHJvdG90eXBlJHNsaWMsIDUpLFxuICAgICAgYXJnXzEgPSBfQXJyYXkkcHJvdG90eXBlJHNsaWMyWzBdLFxuICAgICAgYXJnXzIgPSBfQXJyYXkkcHJvdG90eXBlJHNsaWMyWzFdLFxuICAgICAgYXJnXzMgPSBfQXJyYXkkcHJvdG90eXBlJHNsaWMyWzJdLFxuICAgICAgYXJnXzQgPSBfQXJyYXkkcHJvdG90eXBlJHNsaWMyWzNdLFxuICAgICAgYXJnXzUgPSBfQXJyYXkkcHJvdG90eXBlJHNsaWMyWzRdO1xuXG4gIHZhciBpbnB1dDtcbiAgdmFyIGZvcm1hdDtcbiAgdmFyIG9wdGlvbnM7XG4gIHZhciBtZXRhZGF0YTsgLy8gU29ydCBvdXQgYXJndW1lbnRzLlxuICAvLyBJZiB0aGUgcGhvbmUgbnVtYmVyIGlzIHBhc3NlZCBhcyBhIHN0cmluZy5cbiAgLy8gYGZvcm1hdCgnODAwNTU1MzUzNScsIC4uLilgLlxuXG4gIGlmICh0eXBlb2YgYXJnXzEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gSWYgY291bnRyeSBjb2RlIGlzIHN1cHBsaWVkLlxuICAgIC8vIGBmb3JtYXQoJzgwMDU1NTM1MzUnLCAnUlUnLCAnTkFUSU9OQUwnLCBbb3B0aW9uc10sIG1ldGFkYXRhKWAuXG4gICAgaWYgKHR5cGVvZiBhcmdfMyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZvcm1hdCA9IGFyZ18zO1xuXG4gICAgICBpZiAoYXJnXzUpIHtcbiAgICAgICAgb3B0aW9ucyA9IGFyZ180O1xuICAgICAgICBtZXRhZGF0YSA9IGFyZ181O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0YWRhdGEgPSBhcmdfNDtcbiAgICAgIH1cblxuICAgICAgaW5wdXQgPSAoMCwgX3BhcnNlW1wiZGVmYXVsdFwiXSkoYXJnXzEsIHtcbiAgICAgICAgZGVmYXVsdENvdW50cnk6IGFyZ18yLFxuICAgICAgICBleHRlbmRlZDogdHJ1ZVxuICAgICAgfSwgbWV0YWRhdGEpO1xuICAgIH0gLy8gSnVzdCBhbiBpbnRlcm5hdGlvbmFsIHBob25lIG51bWJlciBpcyBzdXBwbGllZFxuICAgIC8vIGBmb3JtYXQoJys3ODAwNTU1MzUzNScsICdOQVRJT05BTCcsIFtvcHRpb25zXSwgbWV0YWRhdGEpYC5cbiAgICBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnXzIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGZvcm1hdGAgYXJndW1lbnQgbm90IHBhc3NlZCB0byBgZm9ybWF0TnVtYmVyKG51bWJlciwgZm9ybWF0KWAnKTtcbiAgICAgIH1cblxuICAgICAgZm9ybWF0ID0gYXJnXzI7XG5cbiAgICAgIGlmIChhcmdfNCkge1xuICAgICAgICBvcHRpb25zID0gYXJnXzM7XG4gICAgICAgIG1ldGFkYXRhID0gYXJnXzQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhZGF0YSA9IGFyZ18zO1xuICAgICAgfVxuXG4gICAgICBpbnB1dCA9ICgwLCBfcGFyc2VbXCJkZWZhdWx0XCJdKShhcmdfMSwge1xuICAgICAgICBleHRlbmRlZDogdHJ1ZVxuICAgICAgfSwgbWV0YWRhdGEpO1xuICAgIH1cbiAgfSAvLyBJZiB0aGUgcGhvbmUgbnVtYmVyIGlzIHBhc3NlZCBhcyBhIHBhcnNlZCBudW1iZXIgb2JqZWN0LlxuICAvLyBgZm9ybWF0KHsgcGhvbmU6ICc4MDA1NTUzNTM1JywgY291bnRyeTogJ1JVJyB9LCAnTkFUSU9OQUwnLCBbb3B0aW9uc10sIG1ldGFkYXRhKWAuXG4gIGVsc2UgaWYgKGlzX29iamVjdChhcmdfMSkpIHtcbiAgICBpbnB1dCA9IGFyZ18xO1xuICAgIGZvcm1hdCA9IGFyZ18yO1xuXG4gICAgaWYgKGFyZ180KSB7XG4gICAgICBvcHRpb25zID0gYXJnXzM7XG4gICAgICBtZXRhZGF0YSA9IGFyZ180O1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXRhZGF0YSA9IGFyZ18zO1xuICAgIH1cbiAgfSBlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgcGhvbmUgbnVtYmVyIG11c3QgZWl0aGVyIGJlIGEgc3RyaW5nIG9yIGFuIG9iamVjdCBvZiBzaGFwZSB7IHBob25lLCBbY291bnRyeV0gfS4nKTsgLy8gTGVnYWN5IGxvd2VyY2FzZSBmb3JtYXRzLlxuXG5cbiAgaWYgKGZvcm1hdCA9PT0gJ0ludGVybmF0aW9uYWwnKSB7XG4gICAgZm9ybWF0ID0gJ0lOVEVSTkFUSU9OQUwnO1xuICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ05hdGlvbmFsJykge1xuICAgIGZvcm1hdCA9ICdOQVRJT05BTCc7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlucHV0OiBpbnB1dCxcbiAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIG1ldGFkYXRhOiBtZXRhZGF0YVxuICB9O1xufSAvLyBCYWJlbCB0cmFuc2Zvcm1zIGB0eXBlb2ZgIGludG8gc29tZSBcImJyYW5jaGVzXCJcbi8vIHNvIGlzdGFuYnVsIHdpbGwgc2hvdyB0aGlzIGFzIFwiYnJhbmNoIG5vdCBjb3ZlcmVkXCIuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxudmFyIGlzX29iamVjdCA9IGZ1bmN0aW9uIGlzX29iamVjdChfKSB7XG4gIHJldHVybiBfdHlwZW9mKF8pID09PSAnb2JqZWN0Jztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JtYXQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGdldE51bWJlclR5cGU7XG5leHBvcnRzLm5vcm1hbGl6ZUFyZ3VtZW50cyA9IG5vcm1hbGl6ZUFyZ3VtZW50cztcblxudmFyIF9pc1ZpYWJsZVBob25lTnVtYmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vaGVscGVycy9pc1ZpYWJsZVBob25lTnVtYmVyLmpzXCIpKTtcblxudmFyIF9nZXROdW1iZXJUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2hlbHBlcnMvZ2V0TnVtYmVyVHlwZS5qc1wiKSk7XG5cbnZhciBfcGFyc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9wYXJzZS5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTsgaWYgKF9pID09IG51bGwpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfcywgX2U7IHRyeSB7IGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuLy8gRmluZHMgb3V0IG5hdGlvbmFsIHBob25lIG51bWJlciB0eXBlIChmaXhlZCBsaW5lLCBtb2JpbGUsIGV0YylcbmZ1bmN0aW9uIGdldE51bWJlclR5cGUoKSB7XG4gIHZhciBfbm9ybWFsaXplQXJndW1lbnRzID0gbm9ybWFsaXplQXJndW1lbnRzKGFyZ3VtZW50cyksXG4gICAgICBpbnB1dCA9IF9ub3JtYWxpemVBcmd1bWVudHMuaW5wdXQsXG4gICAgICBvcHRpb25zID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5vcHRpb25zLFxuICAgICAgbWV0YWRhdGEgPSBfbm9ybWFsaXplQXJndW1lbnRzLm1ldGFkYXRhOyAvLyBgcGFyc2VOdW1iZXIoKWAgd291bGQgcmV0dXJuIGB7fWAgd2hlbiBubyBwaG9uZSBudW1iZXIgY291bGQgYmUgcGFyc2VkIGZyb20gdGhlIGlucHV0LlxuXG5cbiAgaWYgKCFpbnB1dC5waG9uZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiAoMCwgX2dldE51bWJlclR5cGUyW1wiZGVmYXVsdFwiXSkoaW5wdXQsIG9wdGlvbnMsIG1ldGFkYXRhKTtcbn0gLy8gU29ydCBvdXQgYXJndW1lbnRzXG5cblxuZnVuY3Rpb24gbm9ybWFsaXplQXJndW1lbnRzKGFyZ3MpIHtcbiAgdmFyIF9BcnJheSRwcm90b3R5cGUkc2xpYyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpLFxuICAgICAgX0FycmF5JHByb3RvdHlwZSRzbGljMiA9IF9zbGljZWRUb0FycmF5KF9BcnJheSRwcm90b3R5cGUkc2xpYywgNCksXG4gICAgICBhcmdfMSA9IF9BcnJheSRwcm90b3R5cGUkc2xpYzJbMF0sXG4gICAgICBhcmdfMiA9IF9BcnJheSRwcm90b3R5cGUkc2xpYzJbMV0sXG4gICAgICBhcmdfMyA9IF9BcnJheSRwcm90b3R5cGUkc2xpYzJbMl0sXG4gICAgICBhcmdfNCA9IF9BcnJheSRwcm90b3R5cGUkc2xpYzJbM107XG5cbiAgdmFyIGlucHV0O1xuICB2YXIgb3B0aW9ucyA9IHt9O1xuICB2YXIgbWV0YWRhdGE7IC8vIElmIHRoZSBwaG9uZSBudW1iZXIgaXMgcGFzc2VkIGFzIGEgc3RyaW5nLlxuICAvLyBgZ2V0TnVtYmVyVHlwZSgnODgwMDU1NTM1MzUnLCAuLi4pYC5cblxuICBpZiAodHlwZW9mIGFyZ18xID09PSAnc3RyaW5nJykge1xuICAgIC8vIElmIFwiZGVmYXVsdCBjb3VudHJ5XCIgYXJndW1lbnQgaXMgYmVpbmcgcGFzc2VkXG4gICAgLy8gdGhlbiBjb252ZXJ0IGl0IHRvIGFuIGBvcHRpb25zYCBvYmplY3QuXG4gICAgLy8gYGdldE51bWJlclR5cGUoJzg4MDA1NTUzNTM1JywgJ1JVJywgbWV0YWRhdGEpYC5cbiAgICBpZiAoX3R5cGVvZihhcmdfMikgIT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoYXJnXzQpIHtcbiAgICAgICAgb3B0aW9ucyA9IGFyZ18zO1xuICAgICAgICBtZXRhZGF0YSA9IGFyZ180O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0YWRhdGEgPSBhcmdfMztcbiAgICAgIH0gLy8gYHBhcnNlYCBleHRyYWN0cyBwaG9uZSBudW1iZXJzIGZyb20gcmF3IHRleHQsXG4gICAgICAvLyB0aGVyZWZvcmUgaXQgd2lsbCBjdXQgb2ZmIGFsbCBcImdhcmJhZ2VcIiBjaGFyYWN0ZXJzLFxuICAgICAgLy8gd2hpbGUgdGhpcyBgdmFsaWRhdGVgIGZ1bmN0aW9uIG5lZWRzIHRvIHZlcmlmeVxuICAgICAgLy8gdGhhdCB0aGUgcGhvbmUgbnVtYmVyIGNvbnRhaW5zIG5vIFwiZ2FyYmFnZVwiXG4gICAgICAvLyB0aGVyZWZvcmUgdGhlIGV4cGxpY2l0IGBpc1ZpYWJsZVBob25lTnVtYmVyYCBjaGVjay5cblxuXG4gICAgICBpZiAoKDAsIF9pc1ZpYWJsZVBob25lTnVtYmVyW1wiZGVmYXVsdFwiXSkoYXJnXzEpKSB7XG4gICAgICAgIGlucHV0ID0gKDAsIF9wYXJzZVtcImRlZmF1bHRcIl0pKGFyZ18xLCB7XG4gICAgICAgICAgZGVmYXVsdENvdW50cnk6IGFyZ18yXG4gICAgICAgIH0sIG1ldGFkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0ID0ge307XG4gICAgICB9XG4gICAgfSAvLyBObyBcInJlc3JpY3QgY291bnRyeVwiIGFyZ3VtZW50IGlzIGJlaW5nIHBhc3NlZC5cbiAgICAvLyBJbnRlcm5hdGlvbmFsIHBob25lIG51bWJlciBpcyBwYXNzZWQuXG4gICAgLy8gYGdldE51bWJlclR5cGUoJys3ODAwNTU1MzUzNScsIG1ldGFkYXRhKWAuXG4gICAgZWxzZSB7XG4gICAgICBpZiAoYXJnXzMpIHtcbiAgICAgICAgb3B0aW9ucyA9IGFyZ18yO1xuICAgICAgICBtZXRhZGF0YSA9IGFyZ18zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0YWRhdGEgPSBhcmdfMjtcbiAgICAgIH0gLy8gYHBhcnNlYCBleHRyYWN0cyBwaG9uZSBudW1iZXJzIGZyb20gcmF3IHRleHQsXG4gICAgICAvLyB0aGVyZWZvcmUgaXQgd2lsbCBjdXQgb2ZmIGFsbCBcImdhcmJhZ2VcIiBjaGFyYWN0ZXJzLFxuICAgICAgLy8gd2hpbGUgdGhpcyBgdmFsaWRhdGVgIGZ1bmN0aW9uIG5lZWRzIHRvIHZlcmlmeVxuICAgICAgLy8gdGhhdCB0aGUgcGhvbmUgbnVtYmVyIGNvbnRhaW5zIG5vIFwiZ2FyYmFnZVwiXG4gICAgICAvLyB0aGVyZWZvcmUgdGhlIGV4cGxpY2l0IGBpc1ZpYWJsZVBob25lTnVtYmVyYCBjaGVjay5cblxuXG4gICAgICBpZiAoKDAsIF9pc1ZpYWJsZVBob25lTnVtYmVyW1wiZGVmYXVsdFwiXSkoYXJnXzEpKSB7XG4gICAgICAgIGlucHV0ID0gKDAsIF9wYXJzZVtcImRlZmF1bHRcIl0pKGFyZ18xLCB1bmRlZmluZWQsIG1ldGFkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0ID0ge307XG4gICAgICB9XG4gICAgfVxuICB9IC8vIElmIHRoZSBwaG9uZSBudW1iZXIgaXMgcGFzc2VkIGFzIGEgcGFyc2VkIHBob25lIG51bWJlci5cbiAgLy8gYGdldE51bWJlclR5cGUoeyBwaG9uZTogJzg4MDA1NTUzNTM1JywgY291bnRyeTogJ1JVJyB9LCAuLi4pYC5cbiAgZWxzZSBpZiAoaXNfb2JqZWN0KGFyZ18xKSkge1xuICAgIGlucHV0ID0gYXJnXzE7XG5cbiAgICBpZiAoYXJnXzMpIHtcbiAgICAgIG9wdGlvbnMgPSBhcmdfMjtcbiAgICAgIG1ldGFkYXRhID0gYXJnXzM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGFkYXRhID0gYXJnXzI7XG4gICAgfVxuICB9IGVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBwaG9uZSBudW1iZXIgbXVzdCBlaXRoZXIgYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0IG9mIHNoYXBlIHsgcGhvbmUsIFtjb3VudHJ5XSB9LicpO1xuXG4gIHJldHVybiB7XG4gICAgaW5wdXQ6IGlucHV0LFxuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgbWV0YWRhdGE6IG1ldGFkYXRhXG4gIH07XG59IC8vIEJhYmVsIHRyYW5zZm9ybXMgYHR5cGVvZmAgaW50byBzb21lIFwiYnJhbmNoZXNcIlxuLy8gc28gaXN0YW5idWwgd2lsbCBzaG93IHRoaXMgYXMgXCJicmFuY2ggbm90IGNvdmVyZWRcIi5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG52YXIgaXNfb2JqZWN0ID0gZnVuY3Rpb24gaXNfb2JqZWN0KF8pIHtcbiAgcmV0dXJuIF90eXBlb2YoXykgPT09ICdvYmplY3QnO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldE51bWJlclR5cGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGlzUG9zc2libGVOdW1iZXI7XG5cbnZhciBfZ2V0TnVtYmVyVHlwZSA9IHJlcXVpcmUoXCIuL2dldE51bWJlclR5cGUuanNcIik7XG5cbnZhciBfaXNQb3NzaWJsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2lzUG9zc2libGUuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIGdpdmVuIHBob25lIG51bWJlciBpcyBwb3NzaWJsZS5cclxuICogV2hpY2ggbWVhbnMgaXQgb25seSBjaGVja3MgcGhvbmUgbnVtYmVyIGxlbmd0aFxyXG4gKiBhbmQgZG9lc24ndCB0ZXN0IGFueSByZWd1bGFyIGV4cHJlc3Npb25zLlxyXG4gKlxyXG4gKiBFeGFtcGxlczpcclxuICpcclxuICogYGBganNcclxuICogaXNQb3NzaWJsZU51bWJlcignKzc4MDA1NTUzNTM1JywgbWV0YWRhdGEpXHJcbiAqIGlzUG9zc2libGVOdW1iZXIoJzgwMDU1NTM1MzUnLCAnUlUnLCBtZXRhZGF0YSlcclxuICogaXNQb3NzaWJsZU51bWJlcignODgwMDU1NTM1MzUnLCAnUlUnLCBtZXRhZGF0YSlcclxuICogaXNQb3NzaWJsZU51bWJlcih7IHBob25lOiAnODAwNTU1MzUzNScsIGNvdW50cnk6ICdSVScgfSwgbWV0YWRhdGEpXHJcbiAqIGBgYFxyXG4gKi9cbmZ1bmN0aW9uIGlzUG9zc2libGVOdW1iZXIoKSB7XG4gIHZhciBfbm9ybWFsaXplQXJndW1lbnRzID0gKDAsIF9nZXROdW1iZXJUeXBlLm5vcm1hbGl6ZUFyZ3VtZW50cykoYXJndW1lbnRzKSxcbiAgICAgIGlucHV0ID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5pbnB1dCxcbiAgICAgIG9wdGlvbnMgPSBfbm9ybWFsaXplQXJndW1lbnRzLm9wdGlvbnMsXG4gICAgICBtZXRhZGF0YSA9IF9ub3JtYWxpemVBcmd1bWVudHMubWV0YWRhdGE7IC8vIGBwYXJzZU51bWJlcigpYCB3b3VsZCByZXR1cm4gYHt9YCB3aGVuIG5vIHBob25lIG51bWJlciBjb3VsZCBiZSBwYXJzZWQgZnJvbSB0aGUgaW5wdXQuXG5cblxuICBpZiAoIWlucHV0LnBob25lICYmICEob3B0aW9ucyAmJiBvcHRpb25zLnYyKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoMCwgX2lzUG9zc2libGVbXCJkZWZhdWx0XCJdKShpbnB1dCwgb3B0aW9ucywgbWV0YWRhdGEpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNQb3NzaWJsZU51bWJlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaXNWYWxpZE51bWJlcjtcblxudmFyIF9pc1ZhbGlkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vaXNWYWxpZC5qc1wiKSk7XG5cbnZhciBfZ2V0TnVtYmVyVHlwZSA9IHJlcXVpcmUoXCIuL2dldE51bWJlclR5cGUuanNcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG4vLyBGaW5kcyBvdXQgbmF0aW9uYWwgcGhvbmUgbnVtYmVyIHR5cGUgKGZpeGVkIGxpbmUsIG1vYmlsZSwgZXRjKVxuZnVuY3Rpb24gaXNWYWxpZE51bWJlcigpIHtcbiAgdmFyIF9ub3JtYWxpemVBcmd1bWVudHMgPSAoMCwgX2dldE51bWJlclR5cGUubm9ybWFsaXplQXJndW1lbnRzKShhcmd1bWVudHMpLFxuICAgICAgaW5wdXQgPSBfbm9ybWFsaXplQXJndW1lbnRzLmlucHV0LFxuICAgICAgb3B0aW9ucyA9IF9ub3JtYWxpemVBcmd1bWVudHMub3B0aW9ucyxcbiAgICAgIG1ldGFkYXRhID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5tZXRhZGF0YTsgLy8gYHBhcnNlTnVtYmVyKClgIHdvdWxkIHJldHVybiBge31gIHdoZW4gbm8gcGhvbmUgbnVtYmVyIGNvdWxkIGJlIHBhcnNlZCBmcm9tIHRoZSBpbnB1dC5cblxuXG4gIGlmICghaW5wdXQucGhvbmUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gKDAsIF9pc1ZhbGlkW1wiZGVmYXVsdFwiXSkoaW5wdXQsIG9wdGlvbnMsIG1ldGFkYXRhKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzVmFsaWROdW1iZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGlzVmFsaWROdW1iZXJGb3JSZWdpb247XG5cbnZhciBfaXNWaWFibGVQaG9uZU51bWJlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2hlbHBlcnMvaXNWaWFibGVQaG9uZU51bWJlci5qc1wiKSk7XG5cbnZhciBfcGFyc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9wYXJzZS5qc1wiKSk7XG5cbnZhciBfaXNWYWxpZE51bWJlckZvclJlZ2lvbl8gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2lzVmFsaWROdW1iZXJGb3JSZWdpb25fLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbi8vIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgaXMgbm90IGV4cG9ydGVkIGFzXG4vLyBgaXNWYWxpZFBob25lTnVtYmVyRm9yQ291bnRyeSgpYCBvciBgaXNWYWxpZFBob25lTnVtYmVyRm9yUmVnaW9uKClgLlxuLy9cbi8vIFRoZSByYXRpb25hbGUgaXM6XG4vL1xuLy8gKiBXZSBkb24ndCB1c2UgdGhlIFwicmVnaW9uXCIgd29yZCwgc28gXCJjb3VudHJ5XCIgd291bGQgYmUgYmV0dGVyLlxuLy9cbi8vICogSXQgY291bGQgYmUgc3Vic3RpdHV0ZWQgd2l0aDpcbi8vXG4vLyBgYGBqc1xuLy8gZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNWYWxpZFBob25lTnVtYmVyRm9yQ291bnRyeShwaG9uZU51bWJlclN0cmluZywgY291bnRyeSkge1xuLy8gXHRjb25zdCBwaG9uZU51bWJlciA9IHBhcnNlUGhvbmVOdW1iZXIocGhvbmVOdW1iZXJTdHJpbmcsIHtcbi8vIFx0XHRkZWZhdWx0Q291bnRyeTogY291bnRyeSxcbi8vIFx0XHQvLyBEZW1hbmQgdGhhdCB0aGUgZW50aXJlIGlucHV0IHN0cmluZyBtdXN0IGJlIGEgcGhvbmUgbnVtYmVyLlxuLy8gXHRcdC8vIE90aGVyd2lzZSwgaXQgd291bGQgXCJleHRyYWN0XCIgYSBwaG9uZSBudW1iZXIgZnJvbSBhbiBpbnB1dCBzdHJpbmcuXG4vLyBcdFx0ZXh0cmFjdDogZmFsc2Vcbi8vIFx0fSlcbi8vIFx0aWYgKCFwaG9uZU51bWJlcikge1xuLy8gXHRcdHJldHVybiBmYWxzZVxuLy8gXHR9XG4vLyBcdGlmIChwaG9uZU51bWJlci5jb3VudHJ5ICE9PSBjb3VudHJ5KSB7XG4vLyBcdFx0cmV0dXJuIGZhbHNlXG4vLyBcdH1cbi8vIFx0cmV0dXJuIHBob25lTnVtYmVyLmlzVmFsaWQoKVxuLy8gfVxuLy8gYGBgXG4vL1xuLy8gKiBTYW1lIGZ1bmN0aW9uIGNvdWxkIGJlIHVzZWQgZm9yIGBpc1Bvc3NpYmxlUGhvbmVOdW1iZXJGb3JDb3VudHJ5KClgXG4vLyAgIGJ5IHJlcGxhY2luZyBgaXNWYWxpZCgpYCB3aXRoIGBpc1Bvc3NpYmxlKClgLlxuLy9cbi8vICogVGhlIHJlYXNvbiB3aHkgdGhpcyBmdW5jdGlvbiBpcyBub3QgZXhwb3J0ZWQgaXMgYmVjYXVzZSBpdHMgcmVzdWx0IGlzIGFtYmlndW91cy5cbi8vICAgU3VwcG9zZSBgZmFsc2VgIGlzIHJldHVybmVkLiBJdCBjb3VsZCBtZWFuIGFueSBvZjpcbi8vICAgKiBOb3QgYSBwaG9uZSBudW1iZXIuXG4vLyAgICogVGhlIHBob25lIG51bWJlciBpcyB2YWxpZCBidXQgYmVsb25ncyB0byBhbm90aGVyIGNvdW50cnkgb3IgYW5vdGhlciBjYWxsaW5nIGNvZGUuXG4vLyAgICogVGhlIHBob25lIG51bWJlciBiZWxvbmdzIHRvIHRoZSBjb3JyZWN0IGNvdW50cnkgYnV0IGlzIG5vdCB2YWxpZCBkaWdpdC13aXNlLlxuLy8gICBBbGwgdGhvc2UgdGhyZWUgY2FzZXMgc2hvdWxkIGJlIGhhbmRsZWQgc2VwYXJhdGVseSBmcm9tIGEgXCJVc2VyIEV4cGVyaWVuY2VcIiBzdGFuZHBvaW50LlxuLy8gICBTaW1wbHkgc2hvd2luZyBcIkludmFsaWQgcGhvbmUgbnVtYmVyXCIgZXJyb3IgaW4gYWxsIG9mIHRob3NlIGNhc2VzIHdvdWxkIGJlIGxhenkgVVguXG5mdW5jdGlvbiBpc1ZhbGlkTnVtYmVyRm9yUmVnaW9uKG51bWJlciwgY291bnRyeSwgbWV0YWRhdGEpIHtcbiAgaWYgKHR5cGVvZiBudW1iZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbnVtYmVyIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY291bnRyeSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb3VudHJ5IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfSAvLyBgcGFyc2VgIGV4dHJhY3RzIHBob25lIG51bWJlcnMgZnJvbSByYXcgdGV4dCxcbiAgLy8gdGhlcmVmb3JlIGl0IHdpbGwgY3V0IG9mZiBhbGwgXCJnYXJiYWdlXCIgY2hhcmFjdGVycyxcbiAgLy8gd2hpbGUgdGhpcyBgdmFsaWRhdGVgIGZ1bmN0aW9uIG5lZWRzIHRvIHZlcmlmeVxuICAvLyB0aGF0IHRoZSBwaG9uZSBudW1iZXIgY29udGFpbnMgbm8gXCJnYXJiYWdlXCJcbiAgLy8gdGhlcmVmb3JlIHRoZSBleHBsaWNpdCBgaXNWaWFibGVQaG9uZU51bWJlcmAgY2hlY2suXG5cblxuICB2YXIgaW5wdXQ7XG5cbiAgaWYgKCgwLCBfaXNWaWFibGVQaG9uZU51bWJlcltcImRlZmF1bHRcIl0pKG51bWJlcikpIHtcbiAgICBpbnB1dCA9ICgwLCBfcGFyc2VbXCJkZWZhdWx0XCJdKShudW1iZXIsIHtcbiAgICAgIGRlZmF1bHRDb3VudHJ5OiBjb3VudHJ5XG4gICAgfSwgbWV0YWRhdGEpO1xuICB9IGVsc2Uge1xuICAgIGlucHV0ID0ge307XG4gIH1cblxuICByZXR1cm4gKDAsIF9pc1ZhbGlkTnVtYmVyRm9yUmVnaW9uX1tcImRlZmF1bHRcIl0pKGlucHV0LCBjb3VudHJ5LCB1bmRlZmluZWQsIG1ldGFkYXRhKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzVmFsaWROdW1iZXJGb3JSZWdpb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGlzVmFsaWROdW1iZXJGb3JSZWdpb247XG5cbnZhciBfaXNWYWxpZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2lzVmFsaWQuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIGdpdmVuIHBob25lIG51bWJlciBpcyB2YWxpZCB3aXRoaW4gYSBnaXZlbiByZWdpb24uXHJcbiAqIElzIGp1c3QgYW4gYWxpYXMgZm9yIGBwaG9uZU51bWJlci5pc1ZhbGlkKCkgJiYgcGhvbmVOdW1iZXIuY291bnRyeSA9PT0gY291bnRyeWAuXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGVpMThuL2xpYnBob25lbnVtYmVyL2Jsb2IvbWFzdGVyL0ZBUS5tZCN3aGVuLXNob3VsZC1pLXVzZS1pc3ZhbGlkbnVtYmVyZm9ycmVnaW9uXHJcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZE51bWJlckZvclJlZ2lvbihpbnB1dCwgY291bnRyeSwgb3B0aW9ucywgbWV0YWRhdGEpIHtcbiAgLy8gSWYgYXNzaWduaW5nIHRoZSBge31gIGRlZmF1bHQgdmFsdWUgaXMgbW92ZWQgdG8gdGhlIGFyZ3VtZW50cyBhYm92ZSxcbiAgLy8gY29kZSBjb3ZlcmFnZSB3b3VsZCBkZWNyZWFzZSBmb3Igc29tZSB3ZWlyZCByZWFzb24uXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICByZXR1cm4gaW5wdXQuY291bnRyeSA9PT0gY291bnRyeSAmJiAoMCwgX2lzVmFsaWRbXCJkZWZhdWx0XCJdKShpbnB1dCwgb3B0aW9ucywgbWV0YWRhdGEpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNWYWxpZE51bWJlckZvclJlZ2lvbl8uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHBhcnNlTnVtYmVyO1xuXG52YXIgX3BhcnNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vcGFyc2UuanNcIikpO1xuXG52YXIgX25vcm1hbGl6ZUFyZ3VtZW50czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9ub3JtYWxpemVBcmd1bWVudHMuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gcGFyc2VOdW1iZXIoKSB7XG4gIHZhciBfbm9ybWFsaXplQXJndW1lbnRzID0gKDAsIF9ub3JtYWxpemVBcmd1bWVudHMyW1wiZGVmYXVsdFwiXSkoYXJndW1lbnRzKSxcbiAgICAgIHRleHQgPSBfbm9ybWFsaXplQXJndW1lbnRzLnRleHQsXG4gICAgICBvcHRpb25zID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5vcHRpb25zLFxuICAgICAgbWV0YWRhdGEgPSBfbm9ybWFsaXplQXJndW1lbnRzLm1ldGFkYXRhO1xuXG4gIHJldHVybiAoMCwgX3BhcnNlW1wiZGVmYXVsdFwiXSkodGV4dCwgb3B0aW9ucywgbWV0YWRhdGEpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2UuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHNlYXJjaE51bWJlcnM7XG5cbnZhciBfbm9ybWFsaXplQXJndW1lbnRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL25vcm1hbGl6ZUFyZ3VtZW50cy5qc1wiKSk7XG5cbnZhciBfUGhvbmVOdW1iZXJNYXRjaGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vUGhvbmVOdW1iZXJNYXRjaGVyLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbi8qKlxyXG4gKiBAcmV0dXJuIEVTNiBgZm9yIC4uLiBvZmAgaXRlcmF0b3IuXHJcbiAqL1xuZnVuY3Rpb24gc2VhcmNoTnVtYmVycygpIHtcbiAgdmFyIF9ub3JtYWxpemVBcmd1bWVudHMgPSAoMCwgX25vcm1hbGl6ZUFyZ3VtZW50czJbXCJkZWZhdWx0XCJdKShhcmd1bWVudHMpLFxuICAgICAgdGV4dCA9IF9ub3JtYWxpemVBcmd1bWVudHMudGV4dCxcbiAgICAgIG9wdGlvbnMgPSBfbm9ybWFsaXplQXJndW1lbnRzLm9wdGlvbnMsXG4gICAgICBtZXRhZGF0YSA9IF9ub3JtYWxpemVBcmd1bWVudHMubWV0YWRhdGE7XG5cbiAgdmFyIG1hdGNoZXIgPSBuZXcgX1Bob25lTnVtYmVyTWF0Y2hlcltcImRlZmF1bHRcIl0odGV4dCwgb3B0aW9ucywgbWV0YWRhdGEpO1xuICByZXR1cm4gX2RlZmluZVByb3BlcnR5KHt9LCBTeW1ib2wuaXRlcmF0b3IsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgaWYgKG1hdGNoZXIuaGFzTmV4dCgpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IG1hdGNoZXIubmV4dCgpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VhcmNoTnVtYmVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuZXhwb3J0cy5nZXRDb3VudHJ5Q2FsbGluZ0NvZGUgPSBnZXRDb3VudHJ5Q2FsbGluZ0NvZGU7XG5leHBvcnRzLmdldEV4dFByZWZpeCA9IGdldEV4dFByZWZpeDtcbmV4cG9ydHMuaXNTdXBwb3J0ZWRDb3VudHJ5ID0gaXNTdXBwb3J0ZWRDb3VudHJ5O1xuZXhwb3J0cy52YWxpZGF0ZU1ldGFkYXRhID0gdmFsaWRhdGVNZXRhZGF0YTtcblxudmFyIF9zZW12ZXJDb21wYXJlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi90b29scy9zZW12ZXItY29tcGFyZS5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuLy8gQWRkZWQgXCJwb3NzaWJsZUxlbmd0aHNcIiBhbmQgcmVuYW1lZFxuLy8gXCJjb3VudHJ5X3Bob25lX2NvZGVfdG9fY291bnRyaWVzXCIgdG8gXCJjb3VudHJ5X2NhbGxpbmdfY29kZXNcIi5cbnZhciBWMiA9ICcxLjAuMTgnOyAvLyBBZGRlZCBcImlkZF9wcmVmaXhcIiBhbmQgXCJkZWZhdWx0X2lkZF9wcmVmaXhcIi5cblxudmFyIFYzID0gJzEuMi4wJzsgLy8gTW92ZWQgYDAwMWAgY291bnRyeSBjb2RlIHRvIFwibm9uR2VvZ3JhcGhpY1wiIHNlY3Rpb24gb2YgbWV0YWRhdGEuXG5cbnZhciBWNCA9ICcxLjcuMzUnO1xudmFyIERFRkFVTFRfRVhUX1BSRUZJWCA9ICcgZXh0LiAnO1xudmFyIENBTExJTkdfQ09ERV9SRUdfRVhQID0gL15cXGQrJC87XG4vKipcclxuICogU2VlOiBodHRwczovL2dpdGxhYi5jb20vY2F0YW1waGV0YW1pbmUvbGlicGhvbmVudW1iZXItanMvYmxvYi9tYXN0ZXIvTUVUQURBVEEubWRcclxuICovXG5cbnZhciBNZXRhZGF0YSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1ldGFkYXRhKG1ldGFkYXRhKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1ldGFkYXRhKTtcblxuICAgIHZhbGlkYXRlTWV0YWRhdGEobWV0YWRhdGEpO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICBzZXRWZXJzaW9uLmNhbGwodGhpcywgbWV0YWRhdGEpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1ldGFkYXRhLCBbe1xuICAgIGtleTogXCJnZXRDb3VudHJpZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q291bnRyaWVzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubWV0YWRhdGEuY291bnRyaWVzKS5maWx0ZXIoZnVuY3Rpb24gKF8pIHtcbiAgICAgICAgcmV0dXJuIF8gIT09ICcwMDEnO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENvdW50cnlNZXRhZGF0YVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb3VudHJ5TWV0YWRhdGEoY291bnRyeUNvZGUpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLmNvdW50cmllc1tjb3VudHJ5Q29kZV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5vbkdlb2dyYXBoaWNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbm9uR2VvZ3JhcGhpYygpIHtcbiAgICAgIGlmICh0aGlzLnYxIHx8IHRoaXMudjIgfHwgdGhpcy52MykgcmV0dXJuOyAvLyBgbm9uR2VvZ3JhcGhpY2FsYCB3YXMgYSB0eXBvLlxuICAgICAgLy8gSXQncyBwcmVzZW50IGluIG1ldGFkYXRhIGdlbmVyYXRlZCBmcm9tIGAxLjcuMzVgIHRvIGAxLjcuMzdgLlxuICAgICAgLy8gVGhlIHRlc3QgY2FzZSBjb3VsZCBiZSBmb3VuZCBieSBzZWFyY2hpbmcgZm9yIFwibm9uR2VvZ3JhcGhpY2FsXCIuXG5cbiAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLm5vbkdlb2dyYXBoaWMgfHwgdGhpcy5tZXRhZGF0YS5ub25HZW9ncmFwaGljYWw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0NvdW50cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzQ291bnRyeShjb3VudHJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb3VudHJ5TWV0YWRhdGEoY291bnRyeSkgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzQ2FsbGluZ0NvZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzQ2FsbGluZ0NvZGUoY2FsbGluZ0NvZGUpIHtcbiAgICAgIGlmICh0aGlzLmdldENvdW50cnlDb2Rlc0ZvckNhbGxpbmdDb2RlKGNhbGxpbmdDb2RlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubm9uR2VvZ3JhcGhpYygpKSB7XG4gICAgICAgIGlmICh0aGlzLm5vbkdlb2dyYXBoaWMoKVtjYWxsaW5nQ29kZV0pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQSBoYWNreSB3b3JrYXJvdW5kIGZvciBvbGQgY3VzdG9tIG1ldGFkYXRhIChnZW5lcmF0ZWQgYmVmb3JlIFY0KS5cbiAgICAgICAgdmFyIGNvdW50cnlDb2RlcyA9IHRoaXMuY291bnRyeUNhbGxpbmdDb2RlcygpW2NhbGxpbmdDb2RlXTtcblxuICAgICAgICBpZiAoY291bnRyeUNvZGVzICYmIGNvdW50cnlDb2Rlcy5sZW5ndGggPT09IDEgJiYgY291bnRyeUNvZGVzWzBdID09PSAnMDAxJykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzTm9uR2VvZ3JhcGhpY0NhbGxpbmdDb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzTm9uR2VvZ3JhcGhpY0NhbGxpbmdDb2RlKGNhbGxpbmdDb2RlKSB7XG4gICAgICBpZiAodGhpcy5ub25HZW9ncmFwaGljKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9uR2VvZ3JhcGhpYygpW2NhbGxpbmdDb2RlXSA/IHRydWUgOiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvdW50cnlDb2Rlc0ZvckNhbGxpbmdDb2RlKGNhbGxpbmdDb2RlKSA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgIH1cbiAgICB9IC8vIERlcHJlY2F0ZWQuXG5cbiAgfSwge1xuICAgIGtleTogXCJjb3VudHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvdW50cnkoY291bnRyeUNvZGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdE51bWJlcmluZ1BsYW4oY291bnRyeUNvZGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWxlY3ROdW1iZXJpbmdQbGFuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlbGVjdE51bWJlcmluZ1BsYW4oY291bnRyeUNvZGUsIGNhbGxpbmdDb2RlKSB7XG4gICAgICAvLyBTdXBwb3J0cyBqdXN0IHBhc3NpbmcgYGNhbGxpbmdDb2RlYCBhcyB0aGUgZmlyc3QgYXJndW1lbnQuXG4gICAgICBpZiAoY291bnRyeUNvZGUgJiYgQ0FMTElOR19DT0RFX1JFR19FWFAudGVzdChjb3VudHJ5Q29kZSkpIHtcbiAgICAgICAgY2FsbGluZ0NvZGUgPSBjb3VudHJ5Q29kZTtcbiAgICAgICAgY291bnRyeUNvZGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY291bnRyeUNvZGUgJiYgY291bnRyeUNvZGUgIT09ICcwMDEnKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNDb3VudHJ5KGNvdW50cnlDb2RlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY291bnRyeTogXCIuY29uY2F0KGNvdW50cnlDb2RlKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm51bWJlcmluZ1BsYW4gPSBuZXcgTnVtYmVyaW5nUGxhbih0aGlzLmdldENvdW50cnlNZXRhZGF0YShjb3VudHJ5Q29kZSksIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChjYWxsaW5nQ29kZSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzQ2FsbGluZ0NvZGUoY2FsbGluZ0NvZGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBjYWxsaW5nIGNvZGU6IFwiLmNvbmNhdChjYWxsaW5nQ29kZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5udW1iZXJpbmdQbGFuID0gbmV3IE51bWJlcmluZ1BsYW4odGhpcy5nZXROdW1iZXJpbmdQbGFuTWV0YWRhdGEoY2FsbGluZ0NvZGUpLCB0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubnVtYmVyaW5nUGxhbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENvdW50cnlDb2Rlc0ZvckNhbGxpbmdDb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvdW50cnlDb2Rlc0ZvckNhbGxpbmdDb2RlKGNhbGxpbmdDb2RlKSB7XG4gICAgICB2YXIgY291bnRyeUNvZGVzID0gdGhpcy5jb3VudHJ5Q2FsbGluZ0NvZGVzKClbY2FsbGluZ0NvZGVdO1xuXG4gICAgICBpZiAoY291bnRyeUNvZGVzKSB7XG4gICAgICAgIC8vIE1ldGFkYXRhIGJlZm9yZSBWNCBpbmNsdWRlZCBcIm5vbi1nZW9ncmFwaGljIGVudGl0eVwiIGNhbGxpbmcgY29kZXNcbiAgICAgICAgLy8gaW5zaWRlIGBjb3VudHJ5X2NhbGxpbmdfY29kZXNgIChmb3IgZXhhbXBsZSwgYFwiODgxXCI6W1wiMDAxXCJdYCkuXG4gICAgICAgIC8vIE5vdyB0aGUgc2VtYW50aWNzIG9mIGBjb3VudHJ5X2NhbGxpbmdfY29kZXNgIGhhcyBjaGFuZ2VkOlxuICAgICAgICAvLyBpdCdzIHNwZWNpZmljYWxseSBmb3IgXCJjb3VudHJpZXNcIiBub3cuXG4gICAgICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIGN1c3RvbSBtZXRhZGF0YSB3aWxsIHNpbXBseSBza2lwIHBhcnNpbmdcbiAgICAgICAgLy8gXCJub24tZ2VvZ3JhcGhpYyBlbnRpdHlcIiBwaG9uZSBudW1iZXJzIHdpdGggbmV3IHZlcnNpb25zXG4gICAgICAgIC8vIG9mIHRoaXMgbGlicmFyeTogaXQncyBub3QgY29uc2lkZXJlZCBhIGJ1ZyxcbiAgICAgICAgLy8gYmVjYXVzZSBzdWNoIG51bWJlcnMgYXJlIGV4dHJlbWVseSByYXJlLFxuICAgICAgICAvLyBhbmQgZGV2ZWxvcGVycyBleHRyZW1lbHkgcmFyZWx5IHVzZSBjdXN0b20gbWV0YWRhdGEuXG4gICAgICAgIGlmIChjb3VudHJ5Q29kZXMubGVuZ3RoID09PSAxICYmIGNvdW50cnlDb2Rlc1swXS5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnRyeUNvZGVzO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDb3VudHJ5Q29kZUZvckNhbGxpbmdDb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvdW50cnlDb2RlRm9yQ2FsbGluZ0NvZGUoY2FsbGluZ0NvZGUpIHtcbiAgICAgIHZhciBjb3VudHJ5Q29kZXMgPSB0aGlzLmdldENvdW50cnlDb2Rlc0ZvckNhbGxpbmdDb2RlKGNhbGxpbmdDb2RlKTtcblxuICAgICAgaWYgKGNvdW50cnlDb2Rlcykge1xuICAgICAgICByZXR1cm4gY291bnRyeUNvZGVzWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXROdW1iZXJpbmdQbGFuTWV0YWRhdGFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TnVtYmVyaW5nUGxhbk1ldGFkYXRhKGNhbGxpbmdDb2RlKSB7XG4gICAgICB2YXIgY291bnRyeUNvZGUgPSB0aGlzLmdldENvdW50cnlDb2RlRm9yQ2FsbGluZ0NvZGUoY2FsbGluZ0NvZGUpO1xuXG4gICAgICBpZiAoY291bnRyeUNvZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q291bnRyeU1ldGFkYXRhKGNvdW50cnlDb2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubm9uR2VvZ3JhcGhpYygpKSB7XG4gICAgICAgIHZhciBtZXRhZGF0YSA9IHRoaXMubm9uR2VvZ3JhcGhpYygpW2NhbGxpbmdDb2RlXTtcblxuICAgICAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEEgaGFja3kgd29ya2Fyb3VuZCBmb3Igb2xkIGN1c3RvbSBtZXRhZGF0YSAoZ2VuZXJhdGVkIGJlZm9yZSBWNCkuXG4gICAgICAgIC8vIEluIHRoYXQgbWV0YWRhdGEsIHRoZXJlIHdhcyBubyBjb25jZXB0IG9mIFwibm9uLWdlb2dyYXBoaWNcIiBtZXRhZGF0YVxuICAgICAgICAvLyBzbyBtZXRhZGF0YSBmb3IgYDAwMWAgY291bnRyeSBjb2RlIHdhcyBzdG9yZWQgYWxvbmcgd2l0aCBvdGhlciBjb3VudHJpZXMuXG4gICAgICAgIC8vIFRoZSB0ZXN0IGNhc2UgY2FuIGJlIGZvdW5kIGJ5IHNlYXJjaGluZyBmb3I6XG4gICAgICAgIC8vIFwic2hvdWxkIHdvcmsgYXJvdW5kIGBub25HZW9ncmFwaGljYCBtZXRhZGF0YSBub3QgZXhpc3RpbmdcIi5cbiAgICAgICAgdmFyIGNvdW50cnlDb2RlcyA9IHRoaXMuY291bnRyeUNhbGxpbmdDb2RlcygpW2NhbGxpbmdDb2RlXTtcblxuICAgICAgICBpZiAoY291bnRyeUNvZGVzICYmIGNvdW50cnlDb2Rlcy5sZW5ndGggPT09IDEgJiYgY291bnRyeUNvZGVzWzBdID09PSAnMDAxJykge1xuICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLmNvdW50cmllc1snMDAxJ107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIERlcHJlY2F0ZWQuXG5cbiAgfSwge1xuICAgIGtleTogXCJjb3VudHJ5Q2FsbGluZ0NvZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY291bnRyeUNhbGxpbmdDb2RlKCkge1xuICAgICAgcmV0dXJuIHRoaXMubnVtYmVyaW5nUGxhbi5jYWxsaW5nQ29kZSgpO1xuICAgIH0gLy8gRGVwcmVjYXRlZC5cblxuICB9LCB7XG4gICAga2V5OiBcIklERFByZWZpeFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBJRERQcmVmaXgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1iZXJpbmdQbGFuLklERFByZWZpeCgpO1xuICAgIH0gLy8gRGVwcmVjYXRlZC5cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRJRERQcmVmaXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmYXVsdElERFByZWZpeCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm51bWJlcmluZ1BsYW4uZGVmYXVsdElERFByZWZpeCgpO1xuICAgIH0gLy8gRGVwcmVjYXRlZC5cblxuICB9LCB7XG4gICAga2V5OiBcIm5hdGlvbmFsTnVtYmVyUGF0dGVyblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuYXRpb25hbE51bWJlclBhdHRlcm4oKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1iZXJpbmdQbGFuLm5hdGlvbmFsTnVtYmVyUGF0dGVybigpO1xuICAgIH0gLy8gRGVwcmVjYXRlZC5cblxuICB9LCB7XG4gICAga2V5OiBcInBvc3NpYmxlTGVuZ3Roc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb3NzaWJsZUxlbmd0aHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1iZXJpbmdQbGFuLnBvc3NpYmxlTGVuZ3RocygpO1xuICAgIH0gLy8gRGVwcmVjYXRlZC5cblxuICB9LCB7XG4gICAga2V5OiBcImZvcm1hdHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0cygpIHtcbiAgICAgIHJldHVybiB0aGlzLm51bWJlcmluZ1BsYW4uZm9ybWF0cygpO1xuICAgIH0gLy8gRGVwcmVjYXRlZC5cblxuICB9LCB7XG4gICAga2V5OiBcIm5hdGlvbmFsUHJlZml4Rm9yUGFyc2luZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuYXRpb25hbFByZWZpeEZvclBhcnNpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1iZXJpbmdQbGFuLm5hdGlvbmFsUHJlZml4Rm9yUGFyc2luZygpO1xuICAgIH0gLy8gRGVwcmVjYXRlZC5cblxuICB9LCB7XG4gICAga2V5OiBcIm5hdGlvbmFsUHJlZml4VHJhbnNmb3JtUnVsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuYXRpb25hbFByZWZpeFRyYW5zZm9ybVJ1bGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1iZXJpbmdQbGFuLm5hdGlvbmFsUHJlZml4VHJhbnNmb3JtUnVsZSgpO1xuICAgIH0gLy8gRGVwcmVjYXRlZC5cblxuICB9LCB7XG4gICAga2V5OiBcImxlYWRpbmdEaWdpdHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGVhZGluZ0RpZ2l0cygpIHtcbiAgICAgIHJldHVybiB0aGlzLm51bWJlcmluZ1BsYW4ubGVhZGluZ0RpZ2l0cygpO1xuICAgIH0gLy8gRGVwcmVjYXRlZC5cblxuICB9LCB7XG4gICAga2V5OiBcImhhc1R5cGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc1R5cGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubnVtYmVyaW5nUGxhbi5oYXNUeXBlcygpO1xuICAgIH0gLy8gRGVwcmVjYXRlZC5cblxuICB9LCB7XG4gICAga2V5OiBcInR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdHlwZShfdHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMubnVtYmVyaW5nUGxhbi50eXBlKF90eXBlKTtcbiAgICB9IC8vIERlcHJlY2F0ZWQuXG5cbiAgfSwge1xuICAgIGtleTogXCJleHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubnVtYmVyaW5nUGxhbi5leHQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY291bnRyeUNhbGxpbmdDb2Rlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3VudHJ5Q2FsbGluZ0NvZGVzKCkge1xuICAgICAgaWYgKHRoaXMudjEpIHJldHVybiB0aGlzLm1ldGFkYXRhLmNvdW50cnlfcGhvbmVfY29kZV90b19jb3VudHJpZXM7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS5jb3VudHJ5X2NhbGxpbmdfY29kZXM7XG4gICAgfSAvLyBEZXByZWNhdGVkLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2hvb3NlQ291bnRyeUJ5Q291bnRyeUNhbGxpbmdDb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNob29zZUNvdW50cnlCeUNvdW50cnlDYWxsaW5nQ29kZShjYWxsaW5nQ29kZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0TnVtYmVyaW5nUGxhbihjYWxsaW5nQ29kZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1NlbGVjdGVkTnVtYmVyaW5nUGxhblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNTZWxlY3RlZE51bWJlcmluZ1BsYW4oKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1iZXJpbmdQbGFuICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1ldGFkYXRhO1xufSgpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IE1ldGFkYXRhO1xuXG52YXIgTnVtYmVyaW5nUGxhbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE51bWJlcmluZ1BsYW4obWV0YWRhdGEsIGdsb2JhbE1ldGFkYXRhT2JqZWN0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE51bWJlcmluZ1BsYW4pO1xuXG4gICAgdGhpcy5nbG9iYWxNZXRhZGF0YU9iamVjdCA9IGdsb2JhbE1ldGFkYXRhT2JqZWN0O1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICBzZXRWZXJzaW9uLmNhbGwodGhpcywgZ2xvYmFsTWV0YWRhdGFPYmplY3QubWV0YWRhdGEpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE51bWJlcmluZ1BsYW4sIFt7XG4gICAga2V5OiBcImNhbGxpbmdDb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbGxpbmdDb2RlKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGFbMF07XG4gICAgfSAvLyBGb3JtYXR0aW5nIGluZm9ybWF0aW9uIGZvciByZWdpb25zIHdoaWNoIHNoYXJlXG4gICAgLy8gYSBjb3VudHJ5IGNhbGxpbmcgY29kZSBpcyBjb250YWluZWQgYnkgb25seSBvbmUgcmVnaW9uXG4gICAgLy8gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIEZvciBleGFtcGxlLCBmb3IgTkFOUEEgcmVnaW9uXG4gICAgLy8gKFwiTm9ydGggQW1lcmljYW4gTnVtYmVyaW5nIFBsYW4gQWRtaW5pc3RyYXRpb25cIixcbiAgICAvLyAgd2hpY2ggaW5jbHVkZXMgVVNBLCBDYW5hZGEsIENheW1hbiBJc2xhbmRzLCBCYWhhbWFzLCBldGMpXG4gICAgLy8gaXQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhlIG1ldGFkYXRhIGZvciBgVVNgLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RGVmYXVsdENvdW50cnlNZXRhZGF0YUZvclJlZ2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWZhdWx0Q291bnRyeU1ldGFkYXRhRm9yUmVnaW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsTWV0YWRhdGFPYmplY3QuZ2V0TnVtYmVyaW5nUGxhbk1ldGFkYXRhKHRoaXMuY2FsbGluZ0NvZGUoKSk7XG4gICAgfSAvLyBJcyBhbHdheXMgcHJlc2VudC5cblxuICB9LCB7XG4gICAga2V5OiBcIklERFByZWZpeFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBJRERQcmVmaXgoKSB7XG4gICAgICBpZiAodGhpcy52MSB8fCB0aGlzLnYyKSByZXR1cm47XG4gICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YVsxXTtcbiAgICB9IC8vIElzIG9ubHkgcHJlc2VudCB3aGVuIGEgY291bnRyeSBzdXBwb3J0cyBtdWx0aXBsZSBJREQgcHJlZml4ZXMuXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0SUREUHJlZml4XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRJRERQcmVmaXgoKSB7XG4gICAgICBpZiAodGhpcy52MSB8fCB0aGlzLnYyKSByZXR1cm47XG4gICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YVsxMl07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5hdGlvbmFsTnVtYmVyUGF0dGVyblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuYXRpb25hbE51bWJlclBhdHRlcm4oKSB7XG4gICAgICBpZiAodGhpcy52MSB8fCB0aGlzLnYyKSByZXR1cm4gdGhpcy5tZXRhZGF0YVsxXTtcbiAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhWzJdO1xuICAgIH0gLy8gXCJwb3NzaWJsZSBsZW5ndGhcIiBkYXRhIGlzIGFsd2F5cyBwcmVzZW50IGluIEdvb2dsZSdzIG1ldGFkYXRhLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwicG9zc2libGVMZW5ndGhzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvc3NpYmxlTGVuZ3RocygpIHtcbiAgICAgIGlmICh0aGlzLnYxKSByZXR1cm47XG4gICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YVt0aGlzLnYyID8gMiA6IDNdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0Rm9ybWF0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0Rm9ybWF0cyhtZXRhZGF0YSkge1xuICAgICAgcmV0dXJuIG1ldGFkYXRhW3RoaXMudjEgPyAyIDogdGhpcy52MiA/IDMgOiA0XTtcbiAgICB9IC8vIEZvciBjb3VudHJpZXMgb2YgdGhlIHNhbWUgcmVnaW9uIChlLmcuIE5BTlBBKVxuICAgIC8vIGZvcm1hdHMgYXJlIGFsbCBzdG9yZWQgaW4gdGhlIFwibWFpblwiIGNvdW50cnkgZm9yIHRoYXQgcmVnaW9uLlxuICAgIC8vIEUuZy4gXCJSVVwiIGFuZCBcIktaXCIsIFwiVVNcIiBhbmQgXCJDQVwiLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwiZm9ybWF0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JtYXRzKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGZvcm1hdHMgPSB0aGlzLl9nZXRGb3JtYXRzKHRoaXMubWV0YWRhdGEpIHx8IHRoaXMuX2dldEZvcm1hdHModGhpcy5nZXREZWZhdWx0Q291bnRyeU1ldGFkYXRhRm9yUmVnaW9uKCkpIHx8IFtdO1xuICAgICAgcmV0dXJuIGZvcm1hdHMubWFwKGZ1bmN0aW9uIChfKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybWF0KF8sIF90aGlzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuYXRpb25hbFByZWZpeFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuYXRpb25hbFByZWZpeCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhW3RoaXMudjEgPyAzIDogdGhpcy52MiA/IDQgOiA1XTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldE5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldE5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUobWV0YWRhdGEpIHtcbiAgICAgIHJldHVybiBtZXRhZGF0YVt0aGlzLnYxID8gNCA6IHRoaXMudjIgPyA1IDogNl07XG4gICAgfSAvLyBGb3IgY291bnRyaWVzIG9mIHRoZSBzYW1lIHJlZ2lvbiAoZS5nLiBOQU5QQSlcbiAgICAvLyBuYXRpb25hbCBwcmVmaXggZm9ybWF0dGluZyBydWxlIGlzIHN0b3JlZCBpbiB0aGUgXCJtYWluXCIgY291bnRyeSBmb3IgdGhhdCByZWdpb24uXG4gICAgLy8gRS5nLiBcIlJVXCIgYW5kIFwiS1pcIiwgXCJVU1wiIGFuZCBcIkNBXCIuXG5cbiAgfSwge1xuICAgIGtleTogXCJuYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0TmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSh0aGlzLm1ldGFkYXRhKSB8fCB0aGlzLl9nZXROYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlKHRoaXMuZ2V0RGVmYXVsdENvdW50cnlNZXRhZGF0YUZvclJlZ2lvbigpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX25hdGlvbmFsUHJlZml4Rm9yUGFyc2luZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfbmF0aW9uYWxQcmVmaXhGb3JQYXJzaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGFbdGhpcy52MSA/IDUgOiB0aGlzLnYyID8gNiA6IDddO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuYXRpb25hbFByZWZpeEZvclBhcnNpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmF0aW9uYWxQcmVmaXhGb3JQYXJzaW5nKCkge1xuICAgICAgLy8gSWYgYG5hdGlvbmFsX3ByZWZpeF9mb3JfcGFyc2luZ2AgaXMgbm90IHNldCBleHBsaWNpdGx5LFxuICAgICAgLy8gdGhlbiBpbmZlciBpdCBmcm9tIGBuYXRpb25hbF9wcmVmaXhgIChpZiBhbnkpXG4gICAgICByZXR1cm4gdGhpcy5fbmF0aW9uYWxQcmVmaXhGb3JQYXJzaW5nKCkgfHwgdGhpcy5uYXRpb25hbFByZWZpeCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuYXRpb25hbFByZWZpeFRyYW5zZm9ybVJ1bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmF0aW9uYWxQcmVmaXhUcmFuc2Zvcm1SdWxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGFbdGhpcy52MSA/IDYgOiB0aGlzLnYyID8gNyA6IDhdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0TmF0aW9uYWxQcmVmaXhJc09wdGlvbmFsV2hlbkZvcm1hdHRpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldE5hdGlvbmFsUHJlZml4SXNPcHRpb25hbFdoZW5Gb3JtYXR0aW5nKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5tZXRhZGF0YVt0aGlzLnYxID8gNyA6IHRoaXMudjIgPyA4IDogOV07XG4gICAgfSAvLyBGb3IgY291bnRyaWVzIG9mIHRoZSBzYW1lIHJlZ2lvbiAoZS5nLiBOQU5QQSlcbiAgICAvLyBcIm5hdGlvbmFsIHByZWZpeCBpcyBvcHRpb25hbCB3aGVuIGZvcm1hdHRpbmdcIiBmbGFnIGlzXG4gICAgLy8gc3RvcmVkIGluIHRoZSBcIm1haW5cIiBjb3VudHJ5IGZvciB0aGF0IHJlZ2lvbi5cbiAgICAvLyBFLmcuIFwiUlVcIiBhbmQgXCJLWlwiLCBcIlVTXCIgYW5kIFwiQ0FcIi5cblxuICB9LCB7XG4gICAga2V5OiBcIm5hdGlvbmFsUHJlZml4SXNPcHRpb25hbFdoZW5Gb3JtYXR0aW5nSW5OYXRpb25hbEZvcm1hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuYXRpb25hbFByZWZpeElzT3B0aW9uYWxXaGVuRm9ybWF0dGluZ0luTmF0aW9uYWxGb3JtYXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0TmF0aW9uYWxQcmVmaXhJc09wdGlvbmFsV2hlbkZvcm1hdHRpbmcodGhpcy5tZXRhZGF0YSkgfHwgdGhpcy5fZ2V0TmF0aW9uYWxQcmVmaXhJc09wdGlvbmFsV2hlbkZvcm1hdHRpbmcodGhpcy5nZXREZWZhdWx0Q291bnRyeU1ldGFkYXRhRm9yUmVnaW9uKCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsZWFkaW5nRGlnaXRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlYWRpbmdEaWdpdHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YVt0aGlzLnYxID8gOCA6IHRoaXMudjIgPyA5IDogMTBdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0eXBlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0eXBlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhW3RoaXMudjEgPyA5IDogdGhpcy52MiA/IDEwIDogMTFdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNUeXBlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNUeXBlcygpIHtcbiAgICAgIC8vIFZlcnNpb25zIDEuMi4wIC0gMS4yLjQ6IGNhbiBiZSBgW11gLlxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKHRoaXMudHlwZXMoKSAmJiB0aGlzLnR5cGVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gVmVyc2lvbnMgPD0gMS4yLjQ6IGNhbiBiZSBgdW5kZWZpbmVkYC5cbiAgICAgIC8vIFZlcnNpb24gPj0gMS4yLjU6IGNhbiBiZSBgMGAuXG5cblxuICAgICAgcmV0dXJuICEhdGhpcy50eXBlcygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0eXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHR5cGUoX3R5cGUyKSB7XG4gICAgICBpZiAodGhpcy5oYXNUeXBlcygpICYmIGdldFR5cGUodGhpcy50eXBlcygpLCBfdHlwZTIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHlwZShnZXRUeXBlKHRoaXMudHlwZXMoKSwgX3R5cGUyKSwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleHQoKSB7XG4gICAgICBpZiAodGhpcy52MSB8fCB0aGlzLnYyKSByZXR1cm4gREVGQVVMVF9FWFRfUFJFRklYO1xuICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGFbMTNdIHx8IERFRkFVTFRfRVhUX1BSRUZJWDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTnVtYmVyaW5nUGxhbjtcbn0oKTtcblxudmFyIEZvcm1hdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEZvcm1hdChmb3JtYXQsIG1ldGFkYXRhKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZvcm1hdCk7XG5cbiAgICB0aGlzLl9mb3JtYXQgPSBmb3JtYXQ7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZvcm1hdCwgW3tcbiAgICBrZXk6IFwicGF0dGVyblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXR0ZXJuKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdFswXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9ybWF0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mb3JtYXRbMV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxlYWRpbmdEaWdpdHNQYXR0ZXJuc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsZWFkaW5nRGlnaXRzUGF0dGVybnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybWF0WzJdIHx8IFtdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybWF0WzNdIHx8IHRoaXMubWV0YWRhdGEubmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuYXRpb25hbFByZWZpeElzT3B0aW9uYWxXaGVuRm9ybWF0dGluZ0luTmF0aW9uYWxGb3JtYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmF0aW9uYWxQcmVmaXhJc09wdGlvbmFsV2hlbkZvcm1hdHRpbmdJbk5hdGlvbmFsRm9ybWF0KCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5fZm9ybWF0WzRdIHx8IHRoaXMubWV0YWRhdGEubmF0aW9uYWxQcmVmaXhJc09wdGlvbmFsV2hlbkZvcm1hdHRpbmdJbk5hdGlvbmFsRm9ybWF0KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5hdGlvbmFsUHJlZml4SXNNYW5kYXRvcnlXaGVuRm9ybWF0dGluZ0luTmF0aW9uYWxGb3JtYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmF0aW9uYWxQcmVmaXhJc01hbmRhdG9yeVdoZW5Gb3JtYXR0aW5nSW5OYXRpb25hbEZvcm1hdCgpIHtcbiAgICAgIC8vIE5hdGlvbmFsIHByZWZpeCBpcyBvbWl0dGVkIGlmIHRoZXJlJ3Mgbm8gbmF0aW9uYWwgcHJlZml4IGZvcm1hdHRpbmcgcnVsZVxuICAgICAgLy8gc2V0IGZvciB0aGlzIGNvdW50cnksIG9yIHdoZW4gdGhlIG5hdGlvbmFsIHByZWZpeCBmb3JtYXR0aW5nIHJ1bGVcbiAgICAgIC8vIGNvbnRhaW5zIG5vIG5hdGlvbmFsIHByZWZpeCBpdHNlbGYsIG9yIHdoZW4gdGhpcyBydWxlIGlzIHNldCBidXRcbiAgICAgIC8vIG5hdGlvbmFsIHByZWZpeCBpcyBvcHRpb25hbCBmb3IgdGhpcyBwaG9uZSBudW1iZXIgZm9ybWF0XG4gICAgICAvLyAoYW5kIGl0IGlzIG5vdCBlbmZvcmNlZCBleHBsaWNpdGx5KVxuICAgICAgcmV0dXJuIHRoaXMudXNlc05hdGlvbmFsUHJlZml4KCkgJiYgIXRoaXMubmF0aW9uYWxQcmVmaXhJc09wdGlvbmFsV2hlbkZvcm1hdHRpbmdJbk5hdGlvbmFsRm9ybWF0KCk7XG4gICAgfSAvLyBDaGVja3Mgd2hldGhlciBuYXRpb25hbCBwcmVmaXggZm9ybWF0dGluZyBydWxlIGNvbnRhaW5zIG5hdGlvbmFsIHByZWZpeC5cblxuICB9LCB7XG4gICAga2V5OiBcInVzZXNOYXRpb25hbFByZWZpeFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1c2VzTmF0aW9uYWxQcmVmaXgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlKCkgJiYgLy8gQ2hlY2sgdGhhdCBuYXRpb25hbCBwcmVmaXggZm9ybWF0dGluZyBydWxlIGlzIG5vdCBhIFwiZHVtbXlcIiBvbmUuXG4gICAgICAhRklSU1RfR1JPVVBfT05MWV9QUkVGSVhfUEFUVEVSTi50ZXN0KHRoaXMubmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSgpKSAvLyBJbiBjb21wcmVzc2VkIG1ldGFkYXRhLCBgdGhpcy5uYXRpb25hbFByZWZpeEZvcm1hdHRpbmdSdWxlKClgIGlzIGAwYFxuICAgICAgLy8gd2hlbiBgbmF0aW9uYWxfcHJlZml4X2Zvcm1hdHRpbmdfcnVsZWAgaXMgbm90IHByZXNlbnQuXG4gICAgICAvLyBTbywgYHRydWVgIG9yIGBmYWxzZWAgYXJlIHJldHVybmVkIGV4cGxpY2l0bHkgaGVyZSwgc28gdGhhdFxuICAgICAgLy8gYDBgIG51bWJlciBpc24ndCByZXR1cm5lZC5cbiAgICAgID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnRlcm5hdGlvbmFsRm9ybWF0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVybmF0aW9uYWxGb3JtYXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybWF0WzVdIHx8IHRoaXMuZm9ybWF0KCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZvcm1hdDtcbn0oKTtcbi8qKlxyXG4gKiBBIHBhdHRlcm4gdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgbmF0aW9uYWwgcHJlZml4IGZvcm1hdHRpbmcgcnVsZVxyXG4gKiBoYXMgdGhlIGZpcnN0IGdyb3VwIG9ubHksIGkuZS4sIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIG5hdGlvbmFsIHByZWZpeC5cclxuICogTm90ZSB0aGF0IHRoZSBwYXR0ZXJuIGV4cGxpY2l0bHkgYWxsb3dzIGZvciB1bmJhbGFuY2VkIHBhcmVudGhlc2VzLlxyXG4gKi9cblxuXG52YXIgRklSU1RfR1JPVVBfT05MWV9QUkVGSVhfUEFUVEVSTiA9IC9eXFwoP1xcJDFcXCk/JC87XG5cbnZhciBUeXBlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVHlwZSh0eXBlLCBtZXRhZGF0YSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUeXBlKTtcblxuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFR5cGUsIFt7XG4gICAga2V5OiBcInBhdHRlcm5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0dGVybigpIHtcbiAgICAgIGlmICh0aGlzLm1ldGFkYXRhLnYxKSByZXR1cm4gdGhpcy50eXBlO1xuICAgICAgcmV0dXJuIHRoaXMudHlwZVswXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9zc2libGVMZW5ndGhzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvc3NpYmxlTGVuZ3RocygpIHtcbiAgICAgIGlmICh0aGlzLm1ldGFkYXRhLnYxKSByZXR1cm47XG4gICAgICByZXR1cm4gdGhpcy50eXBlWzFdIHx8IHRoaXMubWV0YWRhdGEucG9zc2libGVMZW5ndGhzKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFR5cGU7XG59KCk7XG5cbmZ1bmN0aW9uIGdldFR5cGUodHlwZXMsIHR5cGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnRklYRURfTElORSc6XG4gICAgICByZXR1cm4gdHlwZXNbMF07XG5cbiAgICBjYXNlICdNT0JJTEUnOlxuICAgICAgcmV0dXJuIHR5cGVzWzFdO1xuXG4gICAgY2FzZSAnVE9MTF9GUkVFJzpcbiAgICAgIHJldHVybiB0eXBlc1syXTtcblxuICAgIGNhc2UgJ1BSRU1JVU1fUkFURSc6XG4gICAgICByZXR1cm4gdHlwZXNbM107XG5cbiAgICBjYXNlICdQRVJTT05BTF9OVU1CRVInOlxuICAgICAgcmV0dXJuIHR5cGVzWzRdO1xuXG4gICAgY2FzZSAnVk9JQ0VNQUlMJzpcbiAgICAgIHJldHVybiB0eXBlc1s1XTtcblxuICAgIGNhc2UgJ1VBTic6XG4gICAgICByZXR1cm4gdHlwZXNbNl07XG5cbiAgICBjYXNlICdQQUdFUic6XG4gICAgICByZXR1cm4gdHlwZXNbN107XG5cbiAgICBjYXNlICdWT0lQJzpcbiAgICAgIHJldHVybiB0eXBlc1s4XTtcblxuICAgIGNhc2UgJ1NIQVJFRF9DT1NUJzpcbiAgICAgIHJldHVybiB0eXBlc1s5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU1ldGFkYXRhKG1ldGFkYXRhKSB7XG4gIGlmICghbWV0YWRhdGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1tsaWJwaG9uZW51bWJlci1qc10gYG1ldGFkYXRhYCBhcmd1bWVudCBub3QgcGFzc2VkLiBDaGVjayB5b3VyIGFyZ3VtZW50cy4nKTtcbiAgfSAvLyBgY291bnRyeV9waG9uZV9jb2RlX3RvX2NvdW50cmllc2Agd2FzIHJlbmFtZWQgdG9cbiAgLy8gYGNvdW50cnlfY2FsbGluZ19jb2Rlc2AgaW4gYDEuMC4xOGAuXG5cblxuICBpZiAoIWlzX29iamVjdChtZXRhZGF0YSkgfHwgIWlzX29iamVjdChtZXRhZGF0YS5jb3VudHJpZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiW2xpYnBob25lbnVtYmVyLWpzXSBgbWV0YWRhdGFgIGFyZ3VtZW50IHdhcyBwYXNzZWQgYnV0IGl0J3Mgbm90IGEgdmFsaWQgbWV0YWRhdGEuIE11c3QgYmUgYW4gb2JqZWN0IGhhdmluZyBgLmNvdW50cmllc2AgY2hpbGQgb2JqZWN0IHByb3BlcnR5LiBHb3QgXCIuY29uY2F0KGlzX29iamVjdChtZXRhZGF0YSkgPyAnYW4gb2JqZWN0IG9mIHNoYXBlOiB7ICcgKyBPYmplY3Qua2V5cyhtZXRhZGF0YSkuam9pbignLCAnKSArICcgfScgOiAnYSAnICsgdHlwZV9vZihtZXRhZGF0YSkgKyAnOiAnICsgbWV0YWRhdGEsIFwiLlwiKSk7XG4gIH1cbn0gLy8gQmFiZWwgdHJhbnNmb3JtcyBgdHlwZW9mYCBpbnRvIHNvbWUgXCJicmFuY2hlc1wiXG4vLyBzbyBpc3RhbmJ1bCB3aWxsIHNob3cgdGhpcyBhcyBcImJyYW5jaCBub3QgY292ZXJlZFwiLlxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG5cbnZhciBpc19vYmplY3QgPSBmdW5jdGlvbiBpc19vYmplY3QoXykge1xuICByZXR1cm4gX3R5cGVvZihfKSA9PT0gJ29iamVjdCc7XG59OyAvLyBCYWJlbCB0cmFuc2Zvcm1zIGB0eXBlb2ZgIGludG8gc29tZSBcImJyYW5jaGVzXCJcbi8vIHNvIGlzdGFuYnVsIHdpbGwgc2hvdyB0aGlzIGFzIFwiYnJhbmNoIG5vdCBjb3ZlcmVkXCIuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxudmFyIHR5cGVfb2YgPSBmdW5jdGlvbiB0eXBlX29mKF8pIHtcbiAgcmV0dXJuIF90eXBlb2YoXyk7XG59O1xuLyoqXHJcbiAqIFJldHVybnMgZXh0ZW5zaW9uIHByZWZpeCBmb3IgYSBjb3VudHJ5LlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNvdW50cnlcclxuICogQHBhcmFtICB7b2JqZWN0fSBtZXRhZGF0YVxyXG4gKiBAcmV0dXJuIHtzdHJpbmc/fVxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyBSZXR1cm5zIFwiIGV4dC4gXCJcclxuICogZ2V0RXh0UHJlZml4KFwiVVNcIilcclxuICovXG5cblxuZnVuY3Rpb24gZ2V0RXh0UHJlZml4KGNvdW50cnksIG1ldGFkYXRhKSB7XG4gIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKG1ldGFkYXRhKTtcblxuICBpZiAobWV0YWRhdGEuaGFzQ291bnRyeShjb3VudHJ5KSkge1xuICAgIHJldHVybiBtZXRhZGF0YS5jb3VudHJ5KGNvdW50cnkpLmV4dCgpO1xuICB9XG5cbiAgcmV0dXJuIERFRkFVTFRfRVhUX1BSRUZJWDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIFwiY291bnRyeSBjYWxsaW5nIGNvZGVcIiBmb3IgYSBjb3VudHJ5LlxyXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNvdW50cnkgZG9lc24ndCBleGlzdCBvciBpc24ndCBzdXBwb3J0ZWQgYnkgdGhpcyBsaWJyYXJ5LlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNvdW50cnlcclxuICogQHBhcmFtICB7b2JqZWN0fSBtZXRhZGF0YVxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAqIEBleGFtcGxlXHJcbiAqIC8vIFJldHVybnMgXCI0NFwiXHJcbiAqIGdldENvdW50cnlDYWxsaW5nQ29kZShcIkdCXCIpXHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldENvdW50cnlDYWxsaW5nQ29kZShjb3VudHJ5LCBtZXRhZGF0YSkge1xuICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YShtZXRhZGF0YSk7XG5cbiAgaWYgKG1ldGFkYXRhLmhhc0NvdW50cnkoY291bnRyeSkpIHtcbiAgICByZXR1cm4gbWV0YWRhdGEuY291bnRyeShjb3VudHJ5KS5jb3VudHJ5Q2FsbGluZ0NvZGUoKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY291bnRyeTogXCIuY29uY2F0KGNvdW50cnkpKTtcbn1cblxuZnVuY3Rpb24gaXNTdXBwb3J0ZWRDb3VudHJ5KGNvdW50cnksIG1ldGFkYXRhKSB7XG4gIC8vIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKG1ldGFkYXRhKVxuICAvLyByZXR1cm4gbWV0YWRhdGEuaGFzQ291bnRyeShjb3VudHJ5KVxuICByZXR1cm4gbWV0YWRhdGEuY291bnRyaWVzW2NvdW50cnldICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNldFZlcnNpb24obWV0YWRhdGEpIHtcbiAgdmFyIHZlcnNpb24gPSBtZXRhZGF0YS52ZXJzaW9uO1xuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICB0aGlzLnYxID0gdmVyc2lvbiA9PT0gMTtcbiAgICB0aGlzLnYyID0gdmVyc2lvbiA9PT0gMjtcbiAgICB0aGlzLnYzID0gdmVyc2lvbiA9PT0gMztcbiAgICB0aGlzLnY0ID0gdmVyc2lvbiA9PT0gNDtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHRoaXMudjEgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoKDAsIF9zZW12ZXJDb21wYXJlW1wiZGVmYXVsdFwiXSkodmVyc2lvbiwgVjMpID09PSAtMSkge1xuICAgICAgdGhpcy52MiA9IHRydWU7XG4gICAgfSBlbHNlIGlmICgoMCwgX3NlbXZlckNvbXBhcmVbXCJkZWZhdWx0XCJdKSh2ZXJzaW9uLCBWNCkgPT09IC0xKSB7XG4gICAgICB0aGlzLnYzID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52NCA9IHRydWU7XG4gICAgfVxuICB9XG59IC8vIGNvbnN0IElTT19DT1VOVFJZX0NPREUgPSAvXltBLVpdezJ9JC9cbi8vIGZ1bmN0aW9uIGlzQ291bnRyeUNvZGUoY291bnRyeUNvZGUpIHtcbi8vIFx0cmV0dXJuIElTT19DT1VOVFJZX0NPREUudGVzdChjb3VudHJ5Q29kZU9yQ291bnRyeUNhbGxpbmdDb2RlKVxuLy8gfVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWV0YWRhdGEuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG5vcm1hbGl6ZUFyZ3VtZW50cztcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH0sIF90eXBlb2Yob2JqKTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2kgPSBhcnIgPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07IGlmIChfaSA9PSBudWxsKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX3MsIF9lOyB0cnkgeyBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5cbi8vIEV4dHJhY3RzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBmcm9tIGZ1bmN0aW9uIGFyZ3VtZW50czpcbi8vICogaW5wdXQgYHRleHRgXG4vLyAqIGBvcHRpb25zYCBvYmplY3Rcbi8vICogYG1ldGFkYXRhYCBKU09OXG5mdW5jdGlvbiBub3JtYWxpemVBcmd1bWVudHMoYXJncykge1xuICB2YXIgX0FycmF5JHByb3RvdHlwZSRzbGljID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyksXG4gICAgICBfQXJyYXkkcHJvdG90eXBlJHNsaWMyID0gX3NsaWNlZFRvQXJyYXkoX0FycmF5JHByb3RvdHlwZSRzbGljLCA0KSxcbiAgICAgIGFyZ18xID0gX0FycmF5JHByb3RvdHlwZSRzbGljMlswXSxcbiAgICAgIGFyZ18yID0gX0FycmF5JHByb3RvdHlwZSRzbGljMlsxXSxcbiAgICAgIGFyZ18zID0gX0FycmF5JHByb3RvdHlwZSRzbGljMlsyXSxcbiAgICAgIGFyZ180ID0gX0FycmF5JHByb3RvdHlwZSRzbGljMlszXTtcblxuICB2YXIgdGV4dDtcbiAgdmFyIG9wdGlvbnM7XG4gIHZhciBtZXRhZGF0YTsgLy8gSWYgdGhlIHBob25lIG51bWJlciBpcyBwYXNzZWQgYXMgYSBzdHJpbmcuXG4gIC8vIGBwYXJzZVBob25lTnVtYmVyKCc4ODAwNTU1MzUzNScsIC4uLilgLlxuXG4gIGlmICh0eXBlb2YgYXJnXzEgPT09ICdzdHJpbmcnKSB7XG4gICAgdGV4dCA9IGFyZ18xO1xuICB9IGVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcignQSB0ZXh0IGZvciBwYXJzaW5nIG11c3QgYmUgYSBzdHJpbmcuJyk7IC8vIElmIFwiZGVmYXVsdCBjb3VudHJ5XCIgYXJndW1lbnQgaXMgYmVpbmcgcGFzc2VkIHRoZW4gbW92ZSBpdCB0byBgb3B0aW9uc2AuXG4gIC8vIGBwYXJzZVBob25lTnVtYmVyKCc4ODAwNTU1MzUzNScsICdSVScsIFtvcHRpb25zXSwgbWV0YWRhdGEpYC5cblxuXG4gIGlmICghYXJnXzIgfHwgdHlwZW9mIGFyZ18yID09PSAnc3RyaW5nJykge1xuICAgIGlmIChhcmdfNCkge1xuICAgICAgb3B0aW9ucyA9IGFyZ18zO1xuICAgICAgbWV0YWRhdGEgPSBhcmdfNDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIG1ldGFkYXRhID0gYXJnXzM7XG4gICAgfVxuXG4gICAgaWYgKGFyZ18yKSB7XG4gICAgICBvcHRpb25zID0gX29iamVjdFNwcmVhZCh7XG4gICAgICAgIGRlZmF1bHRDb3VudHJ5OiBhcmdfMlxuICAgICAgfSwgb3B0aW9ucyk7XG4gICAgfVxuICB9IC8vIGBkZWZhdWx0Q291bnRyeWAgaXMgbm90IHBhc3NlZC5cbiAgLy8gRXhhbXBsZTogYHBhcnNlUGhvbmVOdW1iZXIoJys3ODAwNTU1MzUzNScsIFtvcHRpb25zXSwgbWV0YWRhdGEpYC5cbiAgZWxzZSBpZiAoaXNPYmplY3QoYXJnXzIpKSB7XG4gICAgaWYgKGFyZ18zKSB7XG4gICAgICBvcHRpb25zID0gYXJnXzI7XG4gICAgICBtZXRhZGF0YSA9IGFyZ18zO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXRhZGF0YSA9IGFyZ18yO1xuICAgIH1cbiAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2Vjb25kIGFyZ3VtZW50OiBcIi5jb25jYXQoYXJnXzIpKTtcblxuICByZXR1cm4ge1xuICAgIHRleHQ6IHRleHQsXG4gICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICBtZXRhZGF0YTogbWV0YWRhdGFcbiAgfTtcbn0gLy8gT3RoZXJ3aXNlIGlzdGFuYnVsIHdvdWxkIHNob3cgdGhpcyBhcyBcImJyYW5jaCBub3QgY292ZXJlZFwiLlxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG5cbnZhciBpc09iamVjdCA9IGZ1bmN0aW9uIGlzT2JqZWN0KF8pIHtcbiAgcmV0dXJuIF90eXBlb2YoXykgPT09ICdvYmplY3QnO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vcm1hbGl6ZUFyZ3VtZW50cy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH0sIF90eXBlb2Yob2JqKTsgfVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBwYXJzZTtcblxudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG5cbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvci5qc1wiKSk7XG5cbnZhciBfbWV0YWRhdGEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL21ldGFkYXRhLmpzXCIpKTtcblxudmFyIF9pc1ZpYWJsZVBob25lTnVtYmVyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vaGVscGVycy9pc1ZpYWJsZVBob25lTnVtYmVyLmpzXCIpKTtcblxudmFyIF9leHRyYWN0RXh0ZW5zaW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9oZWxwZXJzL2V4dGVuc2lvbi9leHRyYWN0RXh0ZW5zaW9uLmpzXCIpKTtcblxudmFyIF9wYXJzZUluY29tcGxldGVQaG9uZU51bWJlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFyc2VJbmNvbXBsZXRlUGhvbmVOdW1iZXIuanNcIikpO1xuXG52YXIgX2dldENvdW50cnlDYWxsaW5nQ29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZ2V0Q291bnRyeUNhbGxpbmdDb2RlLmpzXCIpKTtcblxudmFyIF9pc1Bvc3NpYmxlID0gcmVxdWlyZShcIi4vaXNQb3NzaWJsZS5qc1wiKTtcblxudmFyIF9QaG9uZU51bWJlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGhvbmVOdW1iZXIuanNcIikpO1xuXG52YXIgX21hdGNoZXNFbnRpcmVseSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaGVscGVycy9tYXRjaGVzRW50aXJlbHkuanNcIikpO1xuXG52YXIgX2V4dHJhY3RDb3VudHJ5Q2FsbGluZ0NvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZS5qc1wiKSk7XG5cbnZhciBfZXh0cmFjdE5hdGlvbmFsTnVtYmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9oZWxwZXJzL2V4dHJhY3ROYXRpb25hbE51bWJlci5qc1wiKSk7XG5cbnZhciBfc3RyaXBJZGRQcmVmaXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvc3RyaXBJZGRQcmVmaXguanNcIikpO1xuXG52YXIgX2dldENvdW50cnlCeUNhbGxpbmdDb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9oZWxwZXJzL2dldENvdW50cnlCeUNhbGxpbmdDb2RlLmpzXCIpKTtcblxudmFyIF9leHRyYWN0Rm9ybWF0dGVkUGhvbmVOdW1iZXJGcm9tUG9zc2libGVSZmMzOTY2TnVtYmVyVXJpID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9oZWxwZXJzL2V4dHJhY3RGb3JtYXR0ZWRQaG9uZU51bWJlckZyb21Qb3NzaWJsZVJmYzM5NjZOdW1iZXJVcmkuanNcIikpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaiwgbm9kZUludGVyb3ApIHsgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG4vLyBUaGlzIGlzIGEgcG9ydCBvZiBHb29nbGUgQW5kcm9pZCBgbGlicGhvbmVudW1iZXJgJ3Ncbi8vIGBwaG9uZW51bWJlcnV0aWwuanNgIG9mIERlY2VtYmVyIDMxdGgsIDIwMTguXG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZWkxOG4vbGlicGhvbmVudW1iZXIvY29tbWl0cy9tYXN0ZXIvamF2YXNjcmlwdC9pMThuL3Bob25lbnVtYmVycy9waG9uZW51bWJlcnV0aWwuanNcbi8vIGltcG9ydCB7IHBhcnNlUkZDMzk2NiB9IGZyb20gJy4vaGVscGVycy9SRkMzOTY2LmpzJ1xuLy8gV2UgZG9uJ3QgYWxsb3cgaW5wdXQgc3RyaW5ncyBmb3IgcGFyc2luZyB0byBiZSBsb25nZXIgdGhhbiAyNTAgY2hhcnMuXG4vLyBUaGlzIHByZXZlbnRzIG1hbGljaW91cyBpbnB1dCBmcm9tIGNvbnN1bWluZyBDUFUuXG52YXIgTUFYX0lOUFVUX1NUUklOR19MRU5HVEggPSAyNTA7IC8vIFRoaXMgY29uc2lzdHMgb2YgdGhlIHBsdXMgc3ltYm9sLCBkaWdpdHMsIGFuZCBhcmFiaWMtaW5kaWMgZGlnaXRzLlxuXG52YXIgUEhPTkVfTlVNQkVSX1NUQVJUX1BBVFRFUk4gPSBuZXcgUmVnRXhwKCdbJyArIF9jb25zdGFudHMuUExVU19DSEFSUyArIF9jb25zdGFudHMuVkFMSURfRElHSVRTICsgJ10nKTsgLy8gUmVndWxhciBleHByZXNzaW9uIG9mIHRyYWlsaW5nIGNoYXJhY3RlcnMgdGhhdCB3ZSB3YW50IHRvIHJlbW92ZS5cbi8vIEEgdHJhaWxpbmcgYCNgIGlzIHNvbWV0aW1lcyB1c2VkIHdoZW4gd3JpdGluZyBwaG9uZSBudW1iZXJzIHdpdGggZXh0ZW5zaW9ucyBpbiBVUy5cbi8vIEV4YW1wbGU6IFwiKzEgKDY0NSkgMTIzIDEyMzQtOTEwI1wiIG51bWJlciBoYXMgZXh0ZW5zaW9uIFwiOTEwXCIuXG5cbnZhciBBRlRFUl9QSE9ORV9OVU1CRVJfRU5EX1BBVFRFUk4gPSBuZXcgUmVnRXhwKCdbXicgKyBfY29uc3RhbnRzLlZBTElEX0RJR0lUUyArICcjJyArICddKyQnKTtcbnZhciBVU0VfTk9OX0dFT0dSQVBISUNfQ09VTlRSWV9DT0RFID0gZmFsc2U7IC8vIEV4YW1wbGVzOlxuLy9cbi8vIGBgYGpzXG4vLyBwYXJzZSgnOCAoODAwKSA1NTUtMzUtMzUnLCAnUlUnKVxuLy8gcGFyc2UoJzggKDgwMCkgNTU1LTM1LTM1JywgJ1JVJywgbWV0YWRhdGEpXG4vLyBwYXJzZSgnOCAoODAwKSA1NTUtMzUtMzUnLCB7IGNvdW50cnk6IHsgZGVmYXVsdDogJ1JVJyB9IH0pXG4vLyBwYXJzZSgnOCAoODAwKSA1NTUtMzUtMzUnLCB7IGNvdW50cnk6IHsgZGVmYXVsdDogJ1JVJyB9IH0sIG1ldGFkYXRhKVxuLy8gcGFyc2UoJys3IDgwMCA1NTUgMzUgMzUnKVxuLy8gcGFyc2UoJys3IDgwMCA1NTUgMzUgMzUnLCBtZXRhZGF0YSlcbi8vIGBgYFxuLy9cblxuLyoqXHJcbiAqIFBhcnNlcyBhIHBob25lIG51bWJlci5cclxuICpcclxuICogcGFyc2UoJzEyMzQ1Njc4OScsIHsgZGVmYXVsdENvdW50cnk6ICdSVScsIHYyOiB0cnVlIH0sIG1ldGFkYXRhKVxyXG4gKiBwYXJzZSgnMTIzNDU2Nzg5JywgeyBkZWZhdWx0Q291bnRyeTogJ1JVJyB9LCBtZXRhZGF0YSlcclxuICogcGFyc2UoJzEyMzQ1Njc4OScsIHVuZGVmaW5lZCwgbWV0YWRhdGEpXHJcbiAqXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gaW5wdXRcclxuICogQHBhcmFtICB7b2JqZWN0fSBbb3B0aW9uc11cclxuICogQHBhcmFtICB7b2JqZWN0fSBtZXRhZGF0YVxyXG4gKiBAcmV0dXJuIHtvYmplY3R8UGhvbmVOdW1iZXI/fSBJZiBgb3B0aW9ucy52MjogdHJ1ZWAgZmxhZyBpcyBwYXNzZWQsIGl0IHJldHVybnMgYSBgUGhvbmVOdW1iZXI/YCBpbnN0YW5jZS4gT3RoZXJ3aXNlLCByZXR1cm5zIGFuIG9iamVjdCBvZiBzaGFwZSBgeyBwaG9uZTogJy4uLicsIGNvdW50cnk6ICcuLi4nIH1gIChvciBqdXN0IGB7fWAgaWYgbm8gcGhvbmUgbnVtYmVyIHdhcyBwYXJzZWQpLlxyXG4gKi9cblxuZnVuY3Rpb24gcGFyc2UodGV4dCwgb3B0aW9ucywgbWV0YWRhdGEpIHtcbiAgLy8gSWYgYXNzaWduaW5nIHRoZSBge31gIGRlZmF1bHQgdmFsdWUgaXMgbW92ZWQgdG8gdGhlIGFyZ3VtZW50cyBhYm92ZSxcbiAgLy8gY29kZSBjb3ZlcmFnZSB3b3VsZCBkZWNyZWFzZSBmb3Igc29tZSB3ZWlyZCByZWFzb24uXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBtZXRhZGF0YSA9IG5ldyBfbWV0YWRhdGFbXCJkZWZhdWx0XCJdKG1ldGFkYXRhKTsgLy8gVmFsaWRhdGUgYGRlZmF1bHRDb3VudHJ5YC5cblxuICBpZiAob3B0aW9ucy5kZWZhdWx0Q291bnRyeSAmJiAhbWV0YWRhdGEuaGFzQ291bnRyeShvcHRpb25zLmRlZmF1bHRDb3VudHJ5KSkge1xuICAgIGlmIChvcHRpb25zLnYyKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3JbXCJkZWZhdWx0XCJdKCdJTlZBTElEX0NPVU5UUlknKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNvdW50cnk6IFwiLmNvbmNhdChvcHRpb25zLmRlZmF1bHRDb3VudHJ5KSk7XG4gIH0gLy8gUGFyc2UgdGhlIHBob25lIG51bWJlci5cblxuXG4gIHZhciBfcGFyc2VJbnB1dCA9IHBhcnNlSW5wdXQodGV4dCwgb3B0aW9ucy52Miwgb3B0aW9ucy5leHRyYWN0KSxcbiAgICAgIGZvcm1hdHRlZFBob25lTnVtYmVyID0gX3BhcnNlSW5wdXQubnVtYmVyLFxuICAgICAgZXh0ID0gX3BhcnNlSW5wdXQuZXh0LFxuICAgICAgZXJyb3IgPSBfcGFyc2VJbnB1dC5lcnJvcjsgLy8gSWYgdGhlIHBob25lIG51bWJlciBpcyBub3QgdmlhYmxlIHRoZW4gcmV0dXJuIG5vdGhpbmcuXG5cblxuICBpZiAoIWZvcm1hdHRlZFBob25lTnVtYmVyKSB7XG4gICAgaWYgKG9wdGlvbnMudjIpIHtcbiAgICAgIGlmIChlcnJvciA9PT0gJ1RPT19TSE9SVCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yW1wiZGVmYXVsdFwiXSgnVE9PX1NIT1JUJyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvcltcImRlZmF1bHRcIl0oJ05PVF9BX05VTUJFUicpO1xuICAgIH1cblxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHZhciBfcGFyc2VQaG9uZU51bWJlciA9IHBhcnNlUGhvbmVOdW1iZXIoZm9ybWF0dGVkUGhvbmVOdW1iZXIsIG9wdGlvbnMuZGVmYXVsdENvdW50cnksIG9wdGlvbnMuZGVmYXVsdENhbGxpbmdDb2RlLCBtZXRhZGF0YSksXG4gICAgICBjb3VudHJ5ID0gX3BhcnNlUGhvbmVOdW1iZXIuY291bnRyeSxcbiAgICAgIG5hdGlvbmFsTnVtYmVyID0gX3BhcnNlUGhvbmVOdW1iZXIubmF0aW9uYWxOdW1iZXIsXG4gICAgICBjb3VudHJ5Q2FsbGluZ0NvZGUgPSBfcGFyc2VQaG9uZU51bWJlci5jb3VudHJ5Q2FsbGluZ0NvZGUsXG4gICAgICBjb3VudHJ5Q2FsbGluZ0NvZGVTb3VyY2UgPSBfcGFyc2VQaG9uZU51bWJlci5jb3VudHJ5Q2FsbGluZ0NvZGVTb3VyY2UsXG4gICAgICBjYXJyaWVyQ29kZSA9IF9wYXJzZVBob25lTnVtYmVyLmNhcnJpZXJDb2RlO1xuXG4gIGlmICghbWV0YWRhdGEuaGFzU2VsZWN0ZWROdW1iZXJpbmdQbGFuKCkpIHtcbiAgICBpZiAob3B0aW9ucy52Mikge1xuICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yW1wiZGVmYXVsdFwiXSgnSU5WQUxJRF9DT1VOVFJZJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9IC8vIFZhbGlkYXRlIG5hdGlvbmFsIChzaWduaWZpY2FudCkgbnVtYmVyIGxlbmd0aC5cblxuXG4gIGlmICghbmF0aW9uYWxOdW1iZXIgfHwgbmF0aW9uYWxOdW1iZXIubGVuZ3RoIDwgX2NvbnN0YW50cy5NSU5fTEVOR1RIX0ZPUl9OU04pIHtcbiAgICAvLyBXb24ndCB0aHJvdyBoZXJlIGJlY2F1c2UgdGhlIHJlZ2V4cCBhbHJlYWR5IGRlbWFuZHMgbGVuZ3RoID4gMS5cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChvcHRpb25zLnYyKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3JbXCJkZWZhdWx0XCJdKCdUT09fU0hPUlQnKTtcbiAgICB9IC8vIEdvb2dsZSdzIGRlbW8ganVzdCB0aHJvd3MgYW4gZXJyb3IgaW4gdGhpcyBjYXNlLlxuXG5cbiAgICByZXR1cm4ge307XG4gIH0gLy8gVmFsaWRhdGUgbmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIgbGVuZ3RoLlxuICAvL1xuICAvLyBBIHNpZGVub3RlOlxuICAvL1xuICAvLyBUaGV5IHNheSB0aGF0IHNvbWV0aW1lcyBuYXRpb25hbCAoc2lnbmlmaWNhbnQpIG51bWJlcnNcbiAgLy8gY2FuIGJlIGxvbmdlciB0aGFuIGBNQVhfTEVOR1RIX0ZPUl9OU05gIChlLmcuIGluIEdlcm1hbnkpLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlaTE4bi9saWJwaG9uZW51bWJlci9ibG9iLzdlMTc0ODY0NTU1MmRhMzljNGUxYmE3MzFlNDc5NjlkOTdiZGI1MzkvcmVzb3VyY2VzL3Bob25lbnVtYmVyLnByb3RvI0wzNlxuICAvLyBTdWNoIG51bWJlcnMgd2lsbCBqdXN0IGJlIGRpc2NhcmRlZC5cbiAgLy9cblxuXG4gIGlmIChuYXRpb25hbE51bWJlci5sZW5ndGggPiBfY29uc3RhbnRzLk1BWF9MRU5HVEhfRk9SX05TTikge1xuICAgIGlmIChvcHRpb25zLnYyKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3JbXCJkZWZhdWx0XCJdKCdUT09fTE9ORycpO1xuICAgIH0gLy8gR29vZ2xlJ3MgZGVtbyBqdXN0IHRocm93cyBhbiBlcnJvciBpbiB0aGlzIGNhc2UuXG5cblxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnYyKSB7XG4gICAgdmFyIHBob25lTnVtYmVyID0gbmV3IF9QaG9uZU51bWJlcltcImRlZmF1bHRcIl0oY291bnRyeUNhbGxpbmdDb2RlLCBuYXRpb25hbE51bWJlciwgbWV0YWRhdGEubWV0YWRhdGEpO1xuXG4gICAgaWYgKGNvdW50cnkpIHtcbiAgICAgIHBob25lTnVtYmVyLmNvdW50cnkgPSBjb3VudHJ5O1xuICAgIH1cblxuICAgIGlmIChjYXJyaWVyQ29kZSkge1xuICAgICAgcGhvbmVOdW1iZXIuY2FycmllckNvZGUgPSBjYXJyaWVyQ29kZTtcbiAgICB9XG5cbiAgICBpZiAoZXh0KSB7XG4gICAgICBwaG9uZU51bWJlci5leHQgPSBleHQ7XG4gICAgfVxuXG4gICAgcGhvbmVOdW1iZXIuX19jb3VudHJ5Q2FsbGluZ0NvZGVTb3VyY2UgPSBjb3VudHJ5Q2FsbGluZ0NvZGVTb3VyY2U7XG4gICAgcmV0dXJuIHBob25lTnVtYmVyO1xuICB9IC8vIENoZWNrIGlmIG5hdGlvbmFsIHBob25lIG51bWJlciBwYXR0ZXJuIG1hdGNoZXMgdGhlIG51bWJlci5cbiAgLy8gTmF0aW9uYWwgbnVtYmVyIHBhdHRlcm4gaXMgZGlmZmVyZW50IGZvciBlYWNoIGNvdW50cnksXG4gIC8vIGV2ZW4gZm9yIHRob3NlIG9uZXMgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIFwiTkFOUEFcIiBncm91cC5cblxuXG4gIHZhciB2YWxpZCA9IChvcHRpb25zLmV4dGVuZGVkID8gbWV0YWRhdGEuaGFzU2VsZWN0ZWROdW1iZXJpbmdQbGFuKCkgOiBjb3VudHJ5KSA/ICgwLCBfbWF0Y2hlc0VudGlyZWx5W1wiZGVmYXVsdFwiXSkobmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhLm5hdGlvbmFsTnVtYmVyUGF0dGVybigpKSA6IGZhbHNlO1xuXG4gIGlmICghb3B0aW9ucy5leHRlbmRlZCkge1xuICAgIHJldHVybiB2YWxpZCA/IHJlc3VsdChjb3VudHJ5LCBuYXRpb25hbE51bWJlciwgZXh0KSA6IHt9O1xuICB9IC8vIGlzSW50ZXJuYXRpb25hbDogY291bnRyeUNhbGxpbmdDb2RlICE9PSB1bmRlZmluZWRcblxuXG4gIHJldHVybiB7XG4gICAgY291bnRyeTogY291bnRyeSxcbiAgICBjb3VudHJ5Q2FsbGluZ0NvZGU6IGNvdW50cnlDYWxsaW5nQ29kZSxcbiAgICBjYXJyaWVyQ29kZTogY2FycmllckNvZGUsXG4gICAgdmFsaWQ6IHZhbGlkLFxuICAgIHBvc3NpYmxlOiB2YWxpZCA/IHRydWUgOiBvcHRpb25zLmV4dGVuZGVkID09PSB0cnVlICYmIG1ldGFkYXRhLnBvc3NpYmxlTGVuZ3RocygpICYmICgwLCBfaXNQb3NzaWJsZS5pc1Bvc3NpYmxlTnVtYmVyKShuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpID8gdHJ1ZSA6IGZhbHNlLFxuICAgIHBob25lOiBuYXRpb25hbE51bWJlcixcbiAgICBleHQ6IGV4dFxuICB9O1xufVxuLyoqXHJcbiAqIEV4dHJhY3RzIGEgZm9ybWF0dGVkIHBob25lIG51bWJlciBmcm9tIHRleHQuXHJcbiAqIERvZXNuJ3QgZ3VhcmFudGVlIHRoYXQgdGhlIGV4dHJhY3RlZCBwaG9uZSBudW1iZXJcclxuICogaXMgYSB2YWxpZCBwaG9uZSBudW1iZXIgKGZvciBleGFtcGxlLCBkb2Vzbid0IHZhbGlkYXRlIGl0cyBsZW5ndGgpLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHRleHRcclxuICogQHBhcmFtICB7Ym9vbGVhbn0gW2V4dHJhY3RdIOKAlCBJZiBgZmFsc2VgLCB0aGVuIHdpbGwgcGFyc2UgdGhlIGVudGlyZSBgdGV4dGAgYXMgYSBwaG9uZSBudW1iZXIuXHJcbiAqIEBwYXJhbSAge2Jvb2xlYW59IFt0aHJvd09uRXJyb3JdIOKAlCBCeSBkZWZhdWx0LCBpdCB3b24ndCB0aHJvdyBpZiB0aGUgdGV4dCBpcyB0b28gbG9uZy5cclxuICogQHJldHVybiB7c3RyaW5nfVxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyBSZXR1cm5zIFwiKDIxMykgMzczLTQyNTNcIi5cclxuICogZXh0cmFjdEZvcm1hdHRlZFBob25lTnVtYmVyKFwiQ2FsbCAoMjEzKSAzNzMtNDI1MyBmb3IgYXNzaXN0YW5jZS5cIilcclxuICovXG5cblxuZnVuY3Rpb24gX2V4dHJhY3RGb3JtYXR0ZWRQaG9uZU51bWJlcih0ZXh0LCBleHRyYWN0LCB0aHJvd09uRXJyb3IpIHtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHRleHQubGVuZ3RoID4gTUFYX0lOUFVUX1NUUklOR19MRU5HVEgpIHtcbiAgICBpZiAodGhyb3dPbkVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3JbXCJkZWZhdWx0XCJdKCdUT09fTE9ORycpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChleHRyYWN0ID09PSBmYWxzZSkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9IC8vIEF0dGVtcHQgdG8gZXh0cmFjdCBhIHBvc3NpYmxlIG51bWJlciBmcm9tIHRoZSBzdHJpbmcgcGFzc2VkIGluXG5cblxuICB2YXIgc3RhcnRzQXQgPSB0ZXh0LnNlYXJjaChQSE9ORV9OVU1CRVJfU1RBUlRfUEFUVEVSTik7XG5cbiAgaWYgKHN0YXJ0c0F0IDwgMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiB0ZXh0IC8vIFRyaW0gZXZlcnl0aGluZyB0byB0aGUgbGVmdCBvZiB0aGUgcGhvbmUgbnVtYmVyXG4gIC5zbGljZShzdGFydHNBdCkgLy8gUmVtb3ZlIHRyYWlsaW5nIG5vbi1udW1lcmljYWwgY2hhcmFjdGVyc1xuICAucmVwbGFjZShBRlRFUl9QSE9ORV9OVU1CRVJfRU5EX1BBVFRFUk4sICcnKTtcbn1cbi8qKlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHRleHQgLSBJbnB1dC5cclxuICogQHBhcmFtICB7Ym9vbGVhbn0gdjIgLSBMZWdhY3kgQVBJIGZ1bmN0aW9ucyBkb24ndCBwYXNzIGB2MjogdHJ1ZWAgZmxhZy5cclxuICogQHBhcmFtICB7Ym9vbGVhbn0gW2V4dHJhY3RdIC0gV2hldGhlciB0byBleHRyYWN0IGEgcGhvbmUgbnVtYmVyIGZyb20gYHRleHRgLCBvciBhdHRlbXB0IHRvIHBhcnNlIHRoZSBlbnRpcmUgdGV4dCBhcyBhIHBob25lIG51bWJlci5cclxuICogQHJldHVybiB7b2JqZWN0fSBgeyA/bnVtYmVyLCA/ZXh0IH1gLlxyXG4gKi9cblxuXG5mdW5jdGlvbiBwYXJzZUlucHV0KHRleHQsIHYyLCBleHRyYWN0KSB7XG4gIC8vIC8vIFBhcnNlIFJGQyAzOTY2IHBob25lIG51bWJlciBVUkkuXG4gIC8vIGlmICh0ZXh0ICYmIHRleHQuaW5kZXhPZigndGVsOicpID09PSAwKSB7XG4gIC8vIFx0cmV0dXJuIHBhcnNlUkZDMzk2Nih0ZXh0KVxuICAvLyB9XG4gIC8vIGxldCBudW1iZXIgPSBleHRyYWN0Rm9ybWF0dGVkUGhvbmVOdW1iZXIodGV4dCwgZXh0cmFjdCwgdjIpXG4gIHZhciBudW1iZXIgPSAoMCwgX2V4dHJhY3RGb3JtYXR0ZWRQaG9uZU51bWJlckZyb21Qb3NzaWJsZVJmYzM5NjZOdW1iZXJVcmlbXCJkZWZhdWx0XCJdKSh0ZXh0LCB7XG4gICAgZXh0cmFjdEZvcm1hdHRlZFBob25lTnVtYmVyOiBmdW5jdGlvbiBleHRyYWN0Rm9ybWF0dGVkUGhvbmVOdW1iZXIodGV4dCkge1xuICAgICAgcmV0dXJuIF9leHRyYWN0Rm9ybWF0dGVkUGhvbmVOdW1iZXIodGV4dCwgZXh0cmFjdCwgdjIpO1xuICAgIH1cbiAgfSk7IC8vIElmIHRoZSBwaG9uZSBudW1iZXIgaXMgbm90IHZpYWJsZSwgdGhlbiBhYm9ydC5cblxuICBpZiAoIW51bWJlcikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGlmICghKDAsIF9pc1ZpYWJsZVBob25lTnVtYmVyW1wiZGVmYXVsdFwiXSkobnVtYmVyKSkge1xuICAgIGlmICgoMCwgX2lzVmlhYmxlUGhvbmVOdW1iZXIuaXNWaWFibGVQaG9uZU51bWJlclN0YXJ0KShudW1iZXIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogJ1RPT19TSE9SVCdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9IC8vIEF0dGVtcHQgdG8gcGFyc2UgZXh0ZW5zaW9uIGZpcnN0LCBzaW5jZSBpdCBkb2Vzbid0IHJlcXVpcmUgcmVnaW9uLXNwZWNpZmljXG4gIC8vIGRhdGEgYW5kIHdlIHdhbnQgdG8gaGF2ZSB0aGUgbm9uLW5vcm1hbGlzZWQgbnVtYmVyIGhlcmUuXG5cblxuICB2YXIgd2l0aEV4dGVuc2lvblN0cmlwcGVkID0gKDAsIF9leHRyYWN0RXh0ZW5zaW9uW1wiZGVmYXVsdFwiXSkobnVtYmVyKTtcblxuICBpZiAod2l0aEV4dGVuc2lvblN0cmlwcGVkLmV4dCkge1xuICAgIHJldHVybiB3aXRoRXh0ZW5zaW9uU3RyaXBwZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG51bWJlcjogbnVtYmVyXG4gIH07XG59XG4vKipcclxuICogQ3JlYXRlcyBgcGFyc2UoKWAgcmVzdWx0IG9iamVjdC5cclxuICovXG5cblxuZnVuY3Rpb24gcmVzdWx0KGNvdW50cnksIG5hdGlvbmFsTnVtYmVyLCBleHQpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBjb3VudHJ5OiBjb3VudHJ5LFxuICAgIHBob25lOiBuYXRpb25hbE51bWJlclxuICB9O1xuXG4gIGlmIChleHQpIHtcbiAgICByZXN1bHQuZXh0ID0gZXh0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxyXG4gKiBQYXJzZXMgYSB2aWFibGUgcGhvbmUgbnVtYmVyLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0dGVkUGhvbmVOdW1iZXIg4oCUIEV4YW1wbGU6IFwiKDIxMykgMzczLTQyNTNcIi5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtkZWZhdWx0Q291bnRyeV1cclxuICogQHBhcmFtIHtzdHJpbmd9IFtkZWZhdWx0Q2FsbGluZ0NvZGVdXHJcbiAqIEBwYXJhbSB7TWV0YWRhdGF9IG1ldGFkYXRhXHJcbiAqIEByZXR1cm4ge29iamVjdH0gUmV0dXJucyBgeyBjb3VudHJ5OiBzdHJpbmc/LCBjb3VudHJ5Q2FsbGluZ0NvZGU6IHN0cmluZz8sIG5hdGlvbmFsTnVtYmVyOiBzdHJpbmc/IH1gLlxyXG4gKi9cblxuXG5mdW5jdGlvbiBwYXJzZVBob25lTnVtYmVyKGZvcm1hdHRlZFBob25lTnVtYmVyLCBkZWZhdWx0Q291bnRyeSwgZGVmYXVsdENhbGxpbmdDb2RlLCBtZXRhZGF0YSkge1xuICAvLyBFeHRyYWN0IGNhbGxpbmcgY29kZSBmcm9tIHBob25lIG51bWJlci5cbiAgdmFyIF9leHRyYWN0Q291bnRyeUNhbGxpbiA9ICgwLCBfZXh0cmFjdENvdW50cnlDYWxsaW5nQ29kZVtcImRlZmF1bHRcIl0pKCgwLCBfcGFyc2VJbmNvbXBsZXRlUGhvbmVOdW1iZXJbXCJkZWZhdWx0XCJdKShmb3JtYXR0ZWRQaG9uZU51bWJlciksIGRlZmF1bHRDb3VudHJ5LCBkZWZhdWx0Q2FsbGluZ0NvZGUsIG1ldGFkYXRhLm1ldGFkYXRhKSxcbiAgICAgIGNvdW50cnlDYWxsaW5nQ29kZVNvdXJjZSA9IF9leHRyYWN0Q291bnRyeUNhbGxpbi5jb3VudHJ5Q2FsbGluZ0NvZGVTb3VyY2UsXG4gICAgICBjb3VudHJ5Q2FsbGluZ0NvZGUgPSBfZXh0cmFjdENvdW50cnlDYWxsaW4uY291bnRyeUNhbGxpbmdDb2RlLFxuICAgICAgbnVtYmVyID0gX2V4dHJhY3RDb3VudHJ5Q2FsbGluLm51bWJlcjsgLy8gQ2hvb3NlIGEgY291bnRyeSBieSBgY291bnRyeUNhbGxpbmdDb2RlYC5cblxuXG4gIHZhciBjb3VudHJ5O1xuXG4gIGlmIChjb3VudHJ5Q2FsbGluZ0NvZGUpIHtcbiAgICBtZXRhZGF0YS5zZWxlY3ROdW1iZXJpbmdQbGFuKGNvdW50cnlDYWxsaW5nQ29kZSk7XG4gIH0gLy8gSWYgYGZvcm1hdHRlZFBob25lTnVtYmVyYCBpcyBwYXNzZWQgaW4gXCJuYXRpb25hbFwiIGZvcm1hdFxuICAvLyB0aGVuIGBudW1iZXJgIGlzIGRlZmluZWQgYW5kIGBjb3VudHJ5Q2FsbGluZ0NvZGVgIGlzIGB1bmRlZmluZWRgLlxuICBlbHNlIGlmIChudW1iZXIgJiYgKGRlZmF1bHRDb3VudHJ5IHx8IGRlZmF1bHRDYWxsaW5nQ29kZSkpIHtcbiAgICBtZXRhZGF0YS5zZWxlY3ROdW1iZXJpbmdQbGFuKGRlZmF1bHRDb3VudHJ5LCBkZWZhdWx0Q2FsbGluZ0NvZGUpO1xuXG4gICAgaWYgKGRlZmF1bHRDb3VudHJ5KSB7XG4gICAgICBjb3VudHJ5ID0gZGVmYXVsdENvdW50cnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKFVTRV9OT05fR0VPR1JBUEhJQ19DT1VOVFJZX0NPREUpIHtcbiAgICAgICAgaWYgKG1ldGFkYXRhLmlzTm9uR2VvZ3JhcGhpY0NhbGxpbmdDb2RlKGRlZmF1bHRDYWxsaW5nQ29kZSkpIHtcbiAgICAgICAgICBjb3VudHJ5ID0gJzAwMSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb3VudHJ5Q2FsbGluZ0NvZGUgPSBkZWZhdWx0Q2FsbGluZ0NvZGUgfHwgKDAsIF9nZXRDb3VudHJ5Q2FsbGluZ0NvZGVbXCJkZWZhdWx0XCJdKShkZWZhdWx0Q291bnRyeSwgbWV0YWRhdGEubWV0YWRhdGEpO1xuICB9IGVsc2UgcmV0dXJuIHt9O1xuXG4gIGlmICghbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvdW50cnlDYWxsaW5nQ29kZVNvdXJjZTogY291bnRyeUNhbGxpbmdDb2RlU291cmNlLFxuICAgICAgY291bnRyeUNhbGxpbmdDb2RlOiBjb3VudHJ5Q2FsbGluZ0NvZGVcbiAgICB9O1xuICB9XG5cbiAgdmFyIF9leHRyYWN0TmF0aW9uYWxOdW1iZSA9ICgwLCBfZXh0cmFjdE5hdGlvbmFsTnVtYmVyW1wiZGVmYXVsdFwiXSkoKDAsIF9wYXJzZUluY29tcGxldGVQaG9uZU51bWJlcltcImRlZmF1bHRcIl0pKG51bWJlciksIG1ldGFkYXRhKSxcbiAgICAgIG5hdGlvbmFsTnVtYmVyID0gX2V4dHJhY3ROYXRpb25hbE51bWJlLm5hdGlvbmFsTnVtYmVyLFxuICAgICAgY2FycmllckNvZGUgPSBfZXh0cmFjdE5hdGlvbmFsTnVtYmUuY2FycmllckNvZGU7IC8vIFNvbWV0aW1lcyB0aGVyZSBhcmUgc2V2ZXJhbCBjb3VudHJpZXNcbiAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgc2FtZSBjb3VudHJ5IHBob25lIGNvZGVcbiAgLy8gKGUuZy4gTkFOUEEgY291bnRyaWVzIGFsbCBoYXZpbmcgYDFgIGNvdW50cnkgcGhvbmUgY29kZSkuXG4gIC8vIFRoZXJlZm9yZSwgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIHRoZSBleGFjdCBjb3VudHJ5LFxuICAvLyBuYXRpb25hbCAoc2lnbmlmaWNhbnQpIG51bWJlciBzaG91bGQgaGF2ZSBiZWVuIHBhcnNlZCBmaXJzdC5cbiAgLy9cbiAgLy8gV2hlbiBgbWV0YWRhdGEuanNvbmAgaXMgZ2VuZXJhdGVkLCBhbGwgXCJhbWJpZ3VvdXNcIiBjb3VudHJ5IHBob25lIGNvZGVzXG4gIC8vIGdldCB0aGVpciBjb3VudHJpZXMgcG9wdWxhdGVkIHdpdGggdGhlIGZ1bGwgc2V0IG9mXG4gIC8vIFwicGhvbmUgbnVtYmVyIHR5cGVcIiByZWd1bGFyIGV4cHJlc3Npb25zLlxuICAvL1xuXG5cbiAgdmFyIGV4YWN0Q291bnRyeSA9ICgwLCBfZ2V0Q291bnRyeUJ5Q2FsbGluZ0NvZGVbXCJkZWZhdWx0XCJdKShjb3VudHJ5Q2FsbGluZ0NvZGUsIG5hdGlvbmFsTnVtYmVyLCBtZXRhZGF0YSk7XG5cbiAgaWYgKGV4YWN0Q291bnRyeSkge1xuICAgIGNvdW50cnkgPSBleGFjdENvdW50cnk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cbiAgICBpZiAoZXhhY3RDb3VudHJ5ID09PSAnMDAxJykgey8vIENhbid0IGhhcHBlbiB3aXRoIGBVU0VfTk9OX0dFT0dSQVBISUNfQ09VTlRSWV9DT0RFYCBiZWluZyBgZmFsc2VgLlxuICAgICAgLy8gSWYgYFVTRV9OT05fR0VPR1JBUEhJQ19DT1VOVFJZX0NPREVgIGlzIHNldCB0byBgdHJ1ZWAgZm9yIHNvbWUgcmVhc29uLFxuICAgICAgLy8gdGhlbiByZW1vdmUgdGhlIFwiaXN0YW5idWwgaWdub3JlIGlmXCIuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGFkYXRhLmNvdW50cnkoY291bnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb3VudHJ5OiBjb3VudHJ5LFxuICAgIGNvdW50cnlDYWxsaW5nQ29kZTogY291bnRyeUNhbGxpbmdDb2RlLFxuICAgIGNvdW50cnlDYWxsaW5nQ29kZVNvdXJjZTogY291bnRyeUNhbGxpbmdDb2RlU291cmNlLFxuICAgIG5hdGlvbmFsTnVtYmVyOiBuYXRpb25hbE51bWJlcixcbiAgICBjYXJyaWVyQ29kZTogY2FycmllckNvZGVcbiAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBwYXJzZUluY29tcGxldGVQaG9uZU51bWJlcjtcbmV4cG9ydHMucGFyc2VQaG9uZU51bWJlckNoYXJhY3RlciA9IHBhcnNlUGhvbmVOdW1iZXJDaGFyYWN0ZXI7XG5cbnZhciBfcGFyc2VEaWdpdHMgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3BhcnNlRGlnaXRzLmpzXCIpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoaXQpIHJldHVybiAoaXQgPSBpdC5jYWxsKG8pKS5uZXh0LmJpbmQoaXQpOyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuLyoqXHJcbiAqIFBhcnNlcyBwaG9uZSBudW1iZXIgY2hhcmFjdGVycyBmcm9tIGEgc3RyaW5nLlxyXG4gKiBEcm9wcyBhbGwgcHVuY3R1YXRpb24gbGVhdmluZyBvbmx5IGRpZ2l0cyBhbmQgdGhlIGxlYWRpbmcgYCtgIHNpZ24gKGlmIGFueSkuXHJcbiAqIEFsc28gY29udmVydHMgd2lkZS1hc2NpaSBhbmQgYXJhYmljLWluZGljIG51bWVyYWxzIHRvIGNvbnZlbnRpb25hbCBudW1lcmFscy5cclxuICogRS5nLiBpbiBJcmFxIHRoZXkgZG9uJ3Qgd3JpdGUgYCs0NDIzMjMyMzRgIGJ1dCByYXRoZXIgYCvZpNmk2aLZo9mi2aPZotmj2aRgLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHN0cmluZ1xyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGpzXHJcbiAqIC8vIE91dHB1dHMgJzg4MDA1NTUnLlxyXG4gKiBwYXJzZUluY29tcGxldGVQaG9uZU51bWJlcignOCAoODAwKSA1NTUnKVxyXG4gKiAvLyBPdXRwdXRzICcrNzgwMDU1NScuXHJcbiAqIHBhcnNlSW5jb21wbGV0ZVBob25lTnVtYmVyKCcrNyA4MDAgNTU1JylcclxuICogYGBgXHJcbiAqL1xuZnVuY3Rpb24gcGFyc2VJbmNvbXBsZXRlUGhvbmVOdW1iZXIoc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSAnJzsgLy8gVXNpbmcgYC5zcGxpdCgnJylgIGhlcmUgaW5zdGVhZCBvZiBub3JtYWwgYGZvciAuLi4gb2ZgXG4gIC8vIGJlY2F1c2UgdGhlIGltcG9ydGluZyBhcHBsaWNhdGlvbiBkb2Vzbid0IG5lY2Nlc3NhcmlseSBpbmNsdWRlIGFuIEVTNiBwb2x5ZmlsbC5cbiAgLy8gVGhlIGAuc3BsaXQoJycpYCBhcHByb2FjaCBkaXNjYXJkcyBcImV4b3RpY1wiIFVURi04IGNoYXJhY3RlcnNcbiAgLy8gKHRoZSBvbmVzIGNvbnNpc3Rpbmcgb2YgZm91ciBieXRlcykgYnV0IGRpZ2l0c1xuICAvLyAoaW5jbHVkaW5nIG5vbi1FdXJvcGVhbiBvbmVzKSBkb24ndCBmYWxsIGludG8gdGhhdCByYW5nZVxuICAvLyBzbyBzdWNoIFwiZXhvdGljXCIgY2hhcmFjdGVycyB3b3VsZCBiZSBkaXNjYXJkZWQgYW55d2F5LlxuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2Uoc3RyaW5nLnNwbGl0KCcnKSksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgdmFyIGNoYXJhY3RlciA9IF9zdGVwLnZhbHVlO1xuICAgIHJlc3VsdCArPSBwYXJzZVBob25lTnVtYmVyQ2hhcmFjdGVyKGNoYXJhY3RlciwgcmVzdWx0KSB8fCAnJztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcclxuICogUGFyc2VzIG5leHQgY2hhcmFjdGVyIHdoaWxlIHBhcnNpbmcgcGhvbmUgbnVtYmVyIGRpZ2l0cyAoaW5jbHVkaW5nIGEgYCtgKVxyXG4gKiBmcm9tIHRleHQ6IGRpc2NhcmRzIGV2ZXJ5dGhpbmcgZXhjZXB0IGArYCBhbmQgZGlnaXRzLCBhbmQgYCtgIGlzIG9ubHkgYWxsb3dlZFxyXG4gKiBhdCB0aGUgc3RhcnQgb2YgYSBwaG9uZSBudW1iZXIuXHJcbiAqIEZvciBleGFtcGxlLCBpcyB1c2VkIGluIGByZWFjdC1waG9uZS1udW1iZXItaW5wdXRgIHdoZXJlIGl0IHVzZXNcclxuICogW2BpbnB1dC1mb3JtYXRgXShodHRwczovL2dpdGxhYi5jb20vY2F0YW1waGV0YW1pbmUvaW5wdXQtZm9ybWF0KS5cclxuICogQHBhcmFtICB7c3RyaW5nfSBjaGFyYWN0ZXIgLSBZZXQgYW5vdGhlciBjaGFyYWN0ZXIgZnJvbSByYXcgaW5wdXQgc3RyaW5nLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmc/fSBwcmV2UGFyc2VkQ2hhcmFjdGVycyAtIFByZXZpb3VzIHBhcnNlZCBjaGFyYWN0ZXJzLlxyXG4gKiBAcGFyYW0gIHtvYmplY3R9IG1ldGEgLSBPcHRpb25hbCBjdXN0b20gdXNlLWNhc2Utc3BlY2lmaWMgbWV0YWRhdGEuXHJcbiAqIEByZXR1cm4ge3N0cmluZz99IFRoZSBwYXJzZWQgY2hhcmFjdGVyLlxyXG4gKi9cblxuXG5mdW5jdGlvbiBwYXJzZVBob25lTnVtYmVyQ2hhcmFjdGVyKGNoYXJhY3RlciwgcHJldlBhcnNlZENoYXJhY3RlcnMpIHtcbiAgLy8gT25seSBhbGxvdyBhIGxlYWRpbmcgYCtgLlxuICBpZiAoY2hhcmFjdGVyID09PSAnKycpIHtcbiAgICAvLyBJZiB0aGlzIGArYCBpcyBub3QgdGhlIGZpcnN0IHBhcnNlZCBjaGFyYWN0ZXJcbiAgICAvLyB0aGVuIGRpc2NhcmQgaXQuXG4gICAgaWYgKHByZXZQYXJzZWRDaGFyYWN0ZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuICcrJztcbiAgfSAvLyBBbGxvdyBkaWdpdHMuXG5cblxuICByZXR1cm4gKDAsIF9wYXJzZURpZ2l0cy5wYXJzZURpZ2l0KShjaGFyYWN0ZXIpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2VJbmNvbXBsZXRlUGhvbmVOdW1iZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHBhcnNlUGhvbmVOdW1iZXI7XG5cbnZhciBfbm9ybWFsaXplQXJndW1lbnRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbm9ybWFsaXplQXJndW1lbnRzLmpzXCIpKTtcblxudmFyIF9wYXJzZVBob25lTnVtYmVyXyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFyc2VQaG9uZU51bWJlcl8uanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gcGFyc2VQaG9uZU51bWJlcigpIHtcbiAgdmFyIF9ub3JtYWxpemVBcmd1bWVudHMgPSAoMCwgX25vcm1hbGl6ZUFyZ3VtZW50czJbXCJkZWZhdWx0XCJdKShhcmd1bWVudHMpLFxuICAgICAgdGV4dCA9IF9ub3JtYWxpemVBcmd1bWVudHMudGV4dCxcbiAgICAgIG9wdGlvbnMgPSBfbm9ybWFsaXplQXJndW1lbnRzLm9wdGlvbnMsXG4gICAgICBtZXRhZGF0YSA9IF9ub3JtYWxpemVBcmd1bWVudHMubWV0YWRhdGE7XG5cbiAgcmV0dXJuICgwLCBfcGFyc2VQaG9uZU51bWJlcl9bXCJkZWZhdWx0XCJdKSh0ZXh0LCBvcHRpb25zLCBtZXRhZGF0YSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZVBob25lTnVtYmVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBwYXJzZVBob25lTnVtYmVyV2l0aEVycm9yO1xuXG52YXIgX3BhcnNlUGhvbmVOdW1iZXJXaXRoRXJyb3JfID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZVBob25lTnVtYmVyV2l0aEVycm9yXy5qc1wiKSk7XG5cbnZhciBfbm9ybWFsaXplQXJndW1lbnRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbm9ybWFsaXplQXJndW1lbnRzLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHBhcnNlUGhvbmVOdW1iZXJXaXRoRXJyb3IoKSB7XG4gIHZhciBfbm9ybWFsaXplQXJndW1lbnRzID0gKDAsIF9ub3JtYWxpemVBcmd1bWVudHMyW1wiZGVmYXVsdFwiXSkoYXJndW1lbnRzKSxcbiAgICAgIHRleHQgPSBfbm9ybWFsaXplQXJndW1lbnRzLnRleHQsXG4gICAgICBvcHRpb25zID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5vcHRpb25zLFxuICAgICAgbWV0YWRhdGEgPSBfbm9ybWFsaXplQXJndW1lbnRzLm1ldGFkYXRhO1xuXG4gIHJldHVybiAoMCwgX3BhcnNlUGhvbmVOdW1iZXJXaXRoRXJyb3JfW1wiZGVmYXVsdFwiXSkodGV4dCwgb3B0aW9ucywgbWV0YWRhdGEpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2VQaG9uZU51bWJlcldpdGhFcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gcGFyc2VQaG9uZU51bWJlcldpdGhFcnJvcjtcblxudmFyIF9wYXJzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFyc2UuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gcGFyc2VQaG9uZU51bWJlcldpdGhFcnJvcih0ZXh0LCBvcHRpb25zLCBtZXRhZGF0YSkge1xuICByZXR1cm4gKDAsIF9wYXJzZVtcImRlZmF1bHRcIl0pKHRleHQsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgdjI6IHRydWVcbiAgfSksIG1ldGFkYXRhKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlUGhvbmVOdW1iZXJXaXRoRXJyb3JfLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBwYXJzZVBob25lTnVtYmVyO1xuXG52YXIgX3BhcnNlUGhvbmVOdW1iZXJXaXRoRXJyb3JfID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZVBob25lTnVtYmVyV2l0aEVycm9yXy5qc1wiKSk7XG5cbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvci5qc1wiKSk7XG5cbnZhciBfbWV0YWRhdGEgPSByZXF1aXJlKFwiLi9tZXRhZGF0YS5qc1wiKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIHBhcnNlUGhvbmVOdW1iZXIodGV4dCwgb3B0aW9ucywgbWV0YWRhdGEpIHtcbiAgLy8gVmFsaWRhdGUgYGRlZmF1bHRDb3VudHJ5YC5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWZhdWx0Q291bnRyeSAmJiAhKDAsIF9tZXRhZGF0YS5pc1N1cHBvcnRlZENvdW50cnkpKG9wdGlvbnMuZGVmYXVsdENvdW50cnksIG1ldGFkYXRhKSkge1xuICAgIG9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbnMpLCB7fSwge1xuICAgICAgZGVmYXVsdENvdW50cnk6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9IC8vIFBhcnNlIHBob25lIG51bWJlci5cblxuXG4gIHRyeSB7XG4gICAgcmV0dXJuICgwLCBfcGFyc2VQaG9uZU51bWJlcldpdGhFcnJvcl9bXCJkZWZhdWx0XCJdKSh0ZXh0LCBvcHRpb25zLCBtZXRhZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBfUGFyc2VFcnJvcltcImRlZmF1bHRcIl0pIHsvL1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlUGhvbmVOdW1iZXJfLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBzZWFyY2hQaG9uZU51bWJlcnNJblRleHQ7XG5cbnZhciBfUGhvbmVOdW1iZXJNYXRjaGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QaG9uZU51bWJlck1hdGNoZXIuanNcIikpO1xuXG52YXIgX25vcm1hbGl6ZUFyZ3VtZW50czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL25vcm1hbGl6ZUFyZ3VtZW50cy5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBzZWFyY2hQaG9uZU51bWJlcnNJblRleHQoKSB7XG4gIHZhciBfbm9ybWFsaXplQXJndW1lbnRzID0gKDAsIF9ub3JtYWxpemVBcmd1bWVudHMyW1wiZGVmYXVsdFwiXSkoYXJndW1lbnRzKSxcbiAgICAgIHRleHQgPSBfbm9ybWFsaXplQXJndW1lbnRzLnRleHQsXG4gICAgICBvcHRpb25zID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5vcHRpb25zLFxuICAgICAgbWV0YWRhdGEgPSBfbm9ybWFsaXplQXJndW1lbnRzLm1ldGFkYXRhO1xuXG4gIHZhciBtYXRjaGVyID0gbmV3IF9QaG9uZU51bWJlck1hdGNoZXJbXCJkZWZhdWx0XCJdKHRleHQsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgdjI6IHRydWVcbiAgfSksIG1ldGFkYXRhKTtcbiAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eSh7fSwgU3ltYm9sLml0ZXJhdG9yLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgIGlmIChtYXRjaGVyLmhhc05leHQoKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBtYXRjaGVyLm5leHQoKVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlYXJjaFBob25lTnVtYmVyc0luVGV4dC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7XG5cbi8vIENvcHktcGFzdGVkIGZyb206XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc3Vic3RhY2svc2VtdmVyLWNvbXBhcmUvYmxvYi9tYXN0ZXIvaW5kZXguanNcbi8vXG4vLyBJbmxpbmluZyB0aGlzIGZ1bmN0aW9uIGJlY2F1c2Ugc29tZSB1c2VycyByZXBvcnRlZCBpc3N1ZXMgd2l0aFxuLy8gaW1wb3J0aW5nIGZyb20gYHNlbXZlci1jb21wYXJlYCBpbiBhIGJyb3dzZXIgd2l0aCBFUzYgXCJuYXRpdmVcIiBtb2R1bGVzLlxuLy9cbi8vIEZpeGVzIGBzZW12ZXItY29tcGFyZWAgbm90IGJlaW5nIGFibGUgdG8gY29tcGFyZSB2ZXJzaW9ucyB3aXRoIGFscGhhL2JldGEvZXRjIFwidGFnc1wiLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2NhdGFtcGhldGFtaW5lL2xpYnBob25lbnVtYmVyLWpzL2lzc3Vlcy8zODFcbmZ1bmN0aW9uIF9kZWZhdWx0KGEsIGIpIHtcbiAgYSA9IGEuc3BsaXQoJy0nKTtcbiAgYiA9IGIuc3BsaXQoJy0nKTtcbiAgdmFyIHBhID0gYVswXS5zcGxpdCgnLicpO1xuICB2YXIgcGIgPSBiWzBdLnNwbGl0KCcuJyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICB2YXIgbmEgPSBOdW1iZXIocGFbaV0pO1xuICAgIHZhciBuYiA9IE51bWJlcihwYltpXSk7XG4gICAgaWYgKG5hID4gbmIpIHJldHVybiAxO1xuICAgIGlmIChuYiA+IG5hKSByZXR1cm4gLTE7XG4gICAgaWYgKCFpc05hTihuYSkgJiYgaXNOYU4obmIpKSByZXR1cm4gMTtcbiAgICBpZiAoaXNOYU4obmEpICYmICFpc05hTihuYikpIHJldHVybiAtMTtcbiAgfVxuXG4gIGlmIChhWzFdICYmIGJbMV0pIHtcbiAgICByZXR1cm4gYVsxXSA+IGJbMV0gPyAxIDogYVsxXSA8IGJbMV0gPyAtMSA6IDA7XG4gIH1cblxuICByZXR1cm4gIWFbMV0gJiYgYlsxXSA/IDEgOiBhWzFdICYmICFiWzFdID8gLTEgOiAwO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VtdmVyLWNvbXBhcmUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZhbGlkYXRlUGhvbmVOdW1iZXJMZW5ndGg7XG5cbnZhciBfbm9ybWFsaXplQXJndW1lbnRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbm9ybWFsaXplQXJndW1lbnRzLmpzXCIpKTtcblxudmFyIF9wYXJzZVBob25lTnVtYmVyV2l0aEVycm9yXyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFyc2VQaG9uZU51bWJlcldpdGhFcnJvcl8uanNcIikpO1xuXG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3IuanNcIikpO1xuXG52YXIgX21ldGFkYXRhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9tZXRhZGF0YS5qc1wiKSk7XG5cbnZhciBfY2hlY2tOdW1iZXJMZW5ndGggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hlbHBlcnMvY2hlY2tOdW1iZXJMZW5ndGguanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gdmFsaWRhdGVQaG9uZU51bWJlckxlbmd0aCgpIHtcbiAgdmFyIF9ub3JtYWxpemVBcmd1bWVudHMgPSAoMCwgX25vcm1hbGl6ZUFyZ3VtZW50czJbXCJkZWZhdWx0XCJdKShhcmd1bWVudHMpLFxuICAgICAgdGV4dCA9IF9ub3JtYWxpemVBcmd1bWVudHMudGV4dCxcbiAgICAgIG9wdGlvbnMgPSBfbm9ybWFsaXplQXJndW1lbnRzLm9wdGlvbnMsXG4gICAgICBtZXRhZGF0YSA9IF9ub3JtYWxpemVBcmd1bWVudHMubWV0YWRhdGE7XG5cbiAgb3B0aW9ucyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgZXh0cmFjdDogZmFsc2VcbiAgfSk7IC8vIFBhcnNlIHBob25lIG51bWJlci5cblxuICB0cnkge1xuICAgIHZhciBwaG9uZU51bWJlciA9ICgwLCBfcGFyc2VQaG9uZU51bWJlcldpdGhFcnJvcl9bXCJkZWZhdWx0XCJdKSh0ZXh0LCBvcHRpb25zLCBtZXRhZGF0YSk7XG4gICAgbWV0YWRhdGEgPSBuZXcgX21ldGFkYXRhW1wiZGVmYXVsdFwiXShtZXRhZGF0YSk7XG4gICAgbWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbihwaG9uZU51bWJlci5jb3VudHJ5Q2FsbGluZ0NvZGUpO1xuICAgIHZhciByZXN1bHQgPSAoMCwgX2NoZWNrTnVtYmVyTGVuZ3RoW1wiZGVmYXVsdFwiXSkocGhvbmVOdW1iZXIubmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhKTtcblxuICAgIGlmIChyZXN1bHQgIT09ICdJU19QT1NTSUJMRScpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgX1BhcnNlRXJyb3JbXCJkZWZhdWx0XCJdKSB7XG4gICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD12YWxpZGF0ZVBob25lTnVtYmVyTGVuZ3RoLmpzLm1hcCIsIid1c2Ugc3RyaWN0J1xyXG5cclxudmFyIHBhcnNlUGhvbmVOdW1iZXJGcm9tU3RyaW5nID0gcmVxdWlyZSgnLi4vYnVpbGQvcGFyc2VQaG9uZU51bWJlci5qcycpLmRlZmF1bHRcclxuXHJcbi8vIEVTNSBgcmVxdWlyZSgpYCBcImRlZmF1bHRcIiBcImludGVyb3BlcmFiaWxpdHlcIiBoYWNrLlxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYmFiZWwvYmFiZWwvaXNzdWVzLzIyMTIjaXNzdWVjb21tZW50LTEzMTgyNzk4NlxyXG4vLyBBbiBhbHRlcm5hdGl2ZSBhcHByb2FjaDpcclxuLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmFiZWwtcGx1Z2luLWFkZC1tb2R1bGUtZXhwb3J0c1xyXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBwYXJzZVBob25lTnVtYmVyRnJvbVN0cmluZ1xyXG5leHBvcnRzWydkZWZhdWx0J10gPSBwYXJzZVBob25lTnVtYmVyRnJvbVN0cmluZ1xyXG5cclxuZXhwb3J0cy5QYXJzZUVycm9yID0gcmVxdWlyZSgnLi4vYnVpbGQvUGFyc2VFcnJvci5qcycpLmRlZmF1bHRcclxudmFyIHBhcnNlUGhvbmVOdW1iZXJXaXRoRXJyb3IgPSByZXF1aXJlKCcuLi9idWlsZC9wYXJzZVBob25lTnVtYmVyV2l0aEVycm9yLmpzJykuZGVmYXVsdFxyXG4vLyBgcGFyc2VQaG9uZU51bWJlcigpYCBuYW1lZCBleHBvcnQgaGFzIGJlZW4gcmVuYW1lZCB0byBgcGFyc2VQaG9uZU51bWJlcldpdGhFcnJvcigpYC5cclxuZXhwb3J0cy5wYXJzZVBob25lTnVtYmVyV2l0aEVycm9yID0gcGFyc2VQaG9uZU51bWJlcldpdGhFcnJvclxyXG5leHBvcnRzLnBhcnNlUGhvbmVOdW1iZXIgPSBwYXJzZVBob25lTnVtYmVyV2l0aEVycm9yXHJcblxyXG4vLyBgcGFyc2VQaG9uZU51bWJlckZyb21TdHJpbmcoKWAgbmFtZWQgZXhwb3J0IGlzIG5vdyBjb25zaWRlcmVkIGxlZ2FjeTpcclxuLy8gaXQgaGFzIGJlZW4gcHJvbW90ZWQgdG8gYSBkZWZhdWx0IGV4cG9ydCBkdWUgdG8gYmVpbmcgdG9vIHZlcmJvc2UuXHJcbmV4cG9ydHMucGFyc2VQaG9uZU51bWJlckZyb21TdHJpbmcgPSBwYXJzZVBob25lTnVtYmVyRnJvbVN0cmluZ1xyXG5cclxuZXhwb3J0cy5pc1ZhbGlkUGhvbmVOdW1iZXIgPSByZXF1aXJlKCcuLi9idWlsZC9pc1ZhbGlkUGhvbmVOdW1iZXIuanMnKS5kZWZhdWx0XHJcbmV4cG9ydHMuaXNQb3NzaWJsZVBob25lTnVtYmVyID0gcmVxdWlyZSgnLi4vYnVpbGQvaXNQb3NzaWJsZVBob25lTnVtYmVyLmpzJykuZGVmYXVsdFxyXG5leHBvcnRzLnZhbGlkYXRlUGhvbmVOdW1iZXJMZW5ndGggPSByZXF1aXJlKCcuLi9idWlsZC92YWxpZGF0ZVBob25lTnVtYmVyTGVuZ3RoLmpzJykuZGVmYXVsdFxyXG5cclxuZXhwb3J0cy5maW5kTnVtYmVycyA9IHJlcXVpcmUoJy4uL2J1aWxkL2xlZ2FjeS9maW5kTnVtYmVycy5qcycpLmRlZmF1bHRcclxuZXhwb3J0cy5zZWFyY2hOdW1iZXJzID0gcmVxdWlyZSgnLi4vYnVpbGQvbGVnYWN5L3NlYXJjaE51bWJlcnMuanMnKS5kZWZhdWx0XHJcblxyXG5leHBvcnRzLmZpbmRQaG9uZU51bWJlcnNJblRleHQgPSByZXF1aXJlKCcuLi9idWlsZC9maW5kUGhvbmVOdW1iZXJzSW5UZXh0LmpzJykuZGVmYXVsdFxyXG5leHBvcnRzLnNlYXJjaFBob25lTnVtYmVyc0luVGV4dCA9IHJlcXVpcmUoJy4uL2J1aWxkL3NlYXJjaFBob25lTnVtYmVyc0luVGV4dC5qcycpLmRlZmF1bHRcclxuZXhwb3J0cy5QaG9uZU51bWJlck1hdGNoZXIgPSByZXF1aXJlKCcuLi9idWlsZC9QaG9uZU51bWJlck1hdGNoZXIuanMnKS5kZWZhdWx0XHJcblxyXG5leHBvcnRzLkFzWW91VHlwZSA9IHJlcXVpcmUoJy4uL2J1aWxkL0FzWW91VHlwZS5qcycpLmRlZmF1bHRcclxuXHJcbmV4cG9ydHMuTWV0YWRhdGEgPSByZXF1aXJlKCcuLi9idWlsZC9tZXRhZGF0YS5qcycpLmRlZmF1bHRcclxuZXhwb3J0cy5pc1N1cHBvcnRlZENvdW50cnkgPSByZXF1aXJlKCcuLi9idWlsZC9tZXRhZGF0YS5qcycpLmlzU3VwcG9ydGVkQ291bnRyeVxyXG5leHBvcnRzLmdldENvdW50cmllcyA9IHJlcXVpcmUoJy4uL2J1aWxkL2dldENvdW50cmllcy5qcycpLmRlZmF1bHRcclxuZXhwb3J0cy5nZXRDb3VudHJ5Q2FsbGluZ0NvZGUgPSByZXF1aXJlKCcuLi9idWlsZC9tZXRhZGF0YS5qcycpLmdldENvdW50cnlDYWxsaW5nQ29kZVxyXG5leHBvcnRzLmdldEV4dFByZWZpeCA9IHJlcXVpcmUoJy4uL2J1aWxkL21ldGFkYXRhLmpzJykuZ2V0RXh0UHJlZml4XHJcblxyXG5leHBvcnRzLmdldEV4YW1wbGVOdW1iZXIgPSByZXF1aXJlKCcuLi9idWlsZC9nZXRFeGFtcGxlTnVtYmVyLmpzJykuZGVmYXVsdFxyXG5cclxuZXhwb3J0cy5mb3JtYXRJbmNvbXBsZXRlUGhvbmVOdW1iZXIgPSByZXF1aXJlKCcuLi9idWlsZC9mb3JtYXRJbmNvbXBsZXRlUGhvbmVOdW1iZXIuanMnKS5kZWZhdWx0XHJcblxyXG5leHBvcnRzLnBhcnNlSW5jb21wbGV0ZVBob25lTnVtYmVyID0gcmVxdWlyZSgnLi4vYnVpbGQvcGFyc2VJbmNvbXBsZXRlUGhvbmVOdW1iZXIuanMnKS5kZWZhdWx0XHJcbmV4cG9ydHMucGFyc2VQaG9uZU51bWJlckNoYXJhY3RlciA9IHJlcXVpcmUoJy4uL2J1aWxkL3BhcnNlSW5jb21wbGV0ZVBob25lTnVtYmVyLmpzJykucGFyc2VQaG9uZU51bWJlckNoYXJhY3RlclxyXG5leHBvcnRzLnBhcnNlRGlnaXRzID0gcmVxdWlyZSgnLi4vYnVpbGQvaGVscGVycy9wYXJzZURpZ2l0cy5qcycpLmRlZmF1bHRcclxuZXhwb3J0cy5ESUdJVF9QTEFDRUhPTERFUiA9IHJlcXVpcmUoJy4uL2J1aWxkL0FzWW91VHlwZUZvcm1hdHRlci5qcycpLkRJR0lUX1BMQUNFSE9MREVSXHJcblxyXG5leHBvcnRzLnBhcnNlUkZDMzk2NiA9IHJlcXVpcmUoJy4uL2J1aWxkL2hlbHBlcnMvUkZDMzk2Ni5qcycpLnBhcnNlUkZDMzk2NlxyXG5leHBvcnRzLmZvcm1hdFJGQzM5NjYgPSByZXF1aXJlKCcuLi9idWlsZC9oZWxwZXJzL1JGQzM5NjYuanMnKS5mb3JtYXRSRkMzOTY2IiwiJ3VzZSBzdHJpY3QnXHJcblxyXG52YXIgbWluID0gcmVxdWlyZSgnLi9taW4vaW5kZXguY2pzJylcclxudmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9tZXRhZGF0YS5taW4uanNvbicpXHJcblxyXG5mdW5jdGlvbiB3aXRoTWV0YWRhdGFBcmd1bWVudChmdW5jLCBfYXJndW1lbnRzKSB7XHJcblx0dmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChfYXJndW1lbnRzKVxyXG5cdGFyZ3MucHVzaChtZXRhZGF0YSlcclxuXHRyZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzKVxyXG59XHJcblxyXG4vLyBFUzUgYHJlcXVpcmUoKWAgXCJkZWZhdWx0XCIgXCJpbnRlcm9wZXJhYmlsaXR5XCIgaGFjay5cclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYmVsL2lzc3Vlcy8yMjEyI2lzc3VlY29tbWVudC0xMzE4Mjc5ODZcclxuLy8gQW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2g6XHJcbi8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBsdWdpbi1hZGQtbW9kdWxlLWV4cG9ydHNcclxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gbWluLnBhcnNlUGhvbmVOdW1iZXJGcm9tU3RyaW5nXHJcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IG1pbi5wYXJzZVBob25lTnVtYmVyRnJvbVN0cmluZ1xyXG5cclxuLy8gYHBhcnNlUGhvbmVOdW1iZXJGcm9tU3RyaW5nKClgIG5hbWVkIGV4cG9ydCBpcyBub3cgY29uc2lkZXJlZCBsZWdhY3k6XHJcbi8vIGl0IGhhcyBiZWVuIHByb21vdGVkIHRvIGEgZGVmYXVsdCBleHBvcnQgZHVlIHRvIGJlaW5nIHRvbyB2ZXJib3NlLlxyXG5leHBvcnRzLnBhcnNlUGhvbmVOdW1iZXJGcm9tU3RyaW5nID0gbWluLnBhcnNlUGhvbmVOdW1iZXJGcm9tU3RyaW5nXHJcblxyXG5leHBvcnRzLlBhcnNlRXJyb3IgPSBtaW4uUGFyc2VFcnJvclxyXG5cclxuLy8gYHBhcnNlUGhvbmVOdW1iZXIoKWAgbmFtZWQgZXhwb3J0IGhhcyBiZWVuIHJlbmFtZWQgdG8gYHBhcnNlUGhvbmVOdW1iZXJXaXRoRXJyb3IoKWAuXHJcbmV4cG9ydHMucGFyc2VQaG9uZU51bWJlciA9IG1pbi5wYXJzZVBob25lTnVtYmVyV2l0aEVycm9yXHJcbmV4cG9ydHMucGFyc2VQaG9uZU51bWJlcldpdGhFcnJvciA9IG1pbi5wYXJzZVBob25lTnVtYmVyV2l0aEVycm9yXHJcblxyXG5leHBvcnRzLmlzVmFsaWRQaG9uZU51bWJlciA9IG1pbi5pc1ZhbGlkUGhvbmVOdW1iZXJcclxuZXhwb3J0cy5pc1Bvc3NpYmxlUGhvbmVOdW1iZXIgPSBtaW4uaXNQb3NzaWJsZVBob25lTnVtYmVyXHJcbmV4cG9ydHMudmFsaWRhdGVQaG9uZU51bWJlckxlbmd0aCA9IG1pbi52YWxpZGF0ZVBob25lTnVtYmVyTGVuZ3RoXHJcblxyXG4vLyBgcGFyc2UoKWAgYW5kIGBwYXJzZU51bWJlcigpYCBmdW5jdGlvbnMgYXJlIGRlcHJlY2F0ZWQuXHJcbnZhciBwYXJzZV8gPSByZXF1aXJlKCcuL2J1aWxkL2xlZ2FjeS9wYXJzZS5qcycpLmRlZmF1bHRcclxuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKCkge1xyXG5cdHJldHVybiB3aXRoTWV0YWRhdGFBcmd1bWVudChwYXJzZV8sIGFyZ3VtZW50cylcclxufVxyXG5leHBvcnRzLnBhcnNlTnVtYmVyID0gZXhwb3J0cy5wYXJzZVxyXG5cclxuLy8gYGZvcm1hdCgpYCBhbmQgYGZvcm1hdE51bWJlcigpYCBmdW5jdGlvbnMgYXJlIGRlcHJlY2F0ZWQuXHJcbnZhciBmb3JtYXRfID0gcmVxdWlyZSgnLi9idWlsZC9sZWdhY3kvZm9ybWF0LmpzJykuZGVmYXVsdFxyXG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdCgpIHtcclxuXHRyZXR1cm4gd2l0aE1ldGFkYXRhQXJndW1lbnQoZm9ybWF0XywgYXJndW1lbnRzKVxyXG59XHJcbmV4cG9ydHMuZm9ybWF0TnVtYmVyID0gZXhwb3J0cy5mb3JtYXRcclxuXHJcbi8vIERlcHJlY2F0ZWQuXHJcbnZhciBnZXROdW1iZXJUeXBlXyA9IHJlcXVpcmUoJy4vYnVpbGQvbGVnYWN5L2dldE51bWJlclR5cGUuanMnKS5kZWZhdWx0XHJcbmV4cG9ydHMuZ2V0TnVtYmVyVHlwZSA9IGZ1bmN0aW9uIGdldE51bWJlclR5cGUoKSB7XHJcblx0cmV0dXJuIHdpdGhNZXRhZGF0YUFyZ3VtZW50KGdldE51bWJlclR5cGVfLCBhcmd1bWVudHMpXHJcbn1cclxuXHJcbi8vIERlcHJlY2F0ZWQuXHJcbnZhciBpc1Bvc3NpYmxlTnVtYmVyXyA9IHJlcXVpcmUoJy4vYnVpbGQvbGVnYWN5L2lzUG9zc2libGVOdW1iZXIuanMnKS5kZWZhdWx0XHJcbmV4cG9ydHMuaXNQb3NzaWJsZU51bWJlciA9IGZ1bmN0aW9uIGlzUG9zc2libGVOdW1iZXIoKSB7XHJcblx0cmV0dXJuIHdpdGhNZXRhZGF0YUFyZ3VtZW50KGlzUG9zc2libGVOdW1iZXJfLCBhcmd1bWVudHMpXHJcbn1cclxuXHJcbi8vIERlcHJlY2F0ZWQuXHJcbnZhciBpc1ZhbGlkTnVtYmVyXyA9IHJlcXVpcmUoJy4vYnVpbGQvbGVnYWN5L2lzVmFsaWROdW1iZXIuanMnKS5kZWZhdWx0XHJcbmV4cG9ydHMuaXNWYWxpZE51bWJlciA9IGZ1bmN0aW9uIGlzVmFsaWROdW1iZXIoKSB7XHJcblx0cmV0dXJuIHdpdGhNZXRhZGF0YUFyZ3VtZW50KGlzVmFsaWROdW1iZXJfLCBhcmd1bWVudHMpXHJcbn1cclxuXHJcbi8vIERlcHJlY2F0ZWQuXHJcbnZhciBpc1ZhbGlkTnVtYmVyRm9yUmVnaW9uXyA9IHJlcXVpcmUoJy4vYnVpbGQvbGVnYWN5L2lzVmFsaWROdW1iZXJGb3JSZWdpb24uanMnKS5kZWZhdWx0XHJcbmV4cG9ydHMuaXNWYWxpZE51bWJlckZvclJlZ2lvbiA9IGZ1bmN0aW9uIGlzVmFsaWROdW1iZXJGb3JSZWdpb24oKSB7XHJcblx0cmV0dXJuIHdpdGhNZXRhZGF0YUFyZ3VtZW50KGlzVmFsaWROdW1iZXJGb3JSZWdpb25fLCBhcmd1bWVudHMpXHJcbn1cclxuXHJcbmV4cG9ydHMuZ2V0RXhhbXBsZU51bWJlciA9IG1pbi5nZXRFeGFtcGxlTnVtYmVyXHJcbmV4cG9ydHMuTWV0YWRhdGEgPSBtaW4uTWV0YWRhdGFcclxuXHJcbi8vIERlcHJlY2F0ZWQuXHJcbnZhciBmaW5kUGhvbmVOdW1iZXJzXyA9IHJlcXVpcmUoJy4vYnVpbGQvbGVnYWN5L2ZpbmRQaG9uZU51bWJlcnMuanMnKS5kZWZhdWx0XHJcbmV4cG9ydHMuZmluZFBob25lTnVtYmVycyA9IGZ1bmN0aW9uIGZpbmRQaG9uZU51bWJlcnMoKSB7XHJcblx0cmV0dXJuIHdpdGhNZXRhZGF0YUFyZ3VtZW50KGZpbmRQaG9uZU51bWJlcnNfLCBhcmd1bWVudHMpXHJcbn1cclxuXHJcbi8vIERlcHJlY2F0ZWQuXHJcbnZhciBzZWFyY2hQaG9uZU51bWJlcnNfID0gcmVxdWlyZSgnLi9idWlsZC9sZWdhY3kvZmluZFBob25lTnVtYmVycy5qcycpLnNlYXJjaFBob25lTnVtYmVyc1xyXG5leHBvcnRzLnNlYXJjaFBob25lTnVtYmVycyA9IGZ1bmN0aW9uIHNlYXJjaFBob25lTnVtYmVycygpIHtcclxuXHRyZXR1cm4gd2l0aE1ldGFkYXRhQXJndW1lbnQoc2VhcmNoUGhvbmVOdW1iZXJzXywgYXJndW1lbnRzKVxyXG59XHJcblxyXG4vLyBEZXByZWNhdGVkLlxyXG52YXIgUGhvbmVOdW1iZXJTZWFyY2hfID0gcmVxdWlyZSgnLi9idWlsZC9sZWdhY3kvZmluZFBob25lTnVtYmVyc0luaXRpYWxJbXBsZW1lbnRhdGlvbi5qcycpLlBob25lTnVtYmVyU2VhcmNoXHJcbmV4cG9ydHMuUGhvbmVOdW1iZXJTZWFyY2ggPSBmdW5jdGlvbiBQaG9uZU51bWJlclNlYXJjaCh0ZXh0LCBvcHRpb25zKSB7XHJcblx0cmV0dXJuIFBob25lTnVtYmVyU2VhcmNoXy5jYWxsKHRoaXMsIHRleHQsIG9wdGlvbnMsIG1ldGFkYXRhKVxyXG59XHJcbmV4cG9ydHMuUGhvbmVOdW1iZXJTZWFyY2gucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShQaG9uZU51bWJlclNlYXJjaF8ucHJvdG90eXBlLCB7fSlcclxuZXhwb3J0cy5QaG9uZU51bWJlclNlYXJjaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBleHBvcnRzLlBob25lTnVtYmVyU2VhcmNoXHJcblxyXG4vLyBEZXByZWNhdGVkLlxyXG5leHBvcnRzLmZpbmROdW1iZXJzID0gbWluLmZpbmROdW1iZXJzXHJcbi8vIERlcHJlY2F0ZWQuXHJcbmV4cG9ydHMuc2VhcmNoTnVtYmVycyA9IG1pbi5zZWFyY2hOdW1iZXJzXHJcblxyXG5leHBvcnRzLmZpbmRQaG9uZU51bWJlcnNJblRleHQgPSBtaW4uZmluZFBob25lTnVtYmVyc0luVGV4dFxyXG5leHBvcnRzLnNlYXJjaFBob25lTnVtYmVyc0luVGV4dCA9IG1pbi5zZWFyY2hQaG9uZU51bWJlcnNJblRleHRcclxuZXhwb3J0cy5QaG9uZU51bWJlck1hdGNoZXIgPSBtaW4uUGhvbmVOdW1iZXJNYXRjaGVyXHJcblxyXG5leHBvcnRzLkFzWW91VHlwZSA9IG1pbi5Bc1lvdVR5cGVcclxuXHJcbmV4cG9ydHMuZ2V0Q291bnRyaWVzID0gbWluLmdldENvdW50cmllc1xyXG5leHBvcnRzLmdldENvdW50cnlDYWxsaW5nQ29kZSA9IG1pbi5nZXRDb3VudHJ5Q2FsbGluZ0NvZGVcclxuZXhwb3J0cy5pc1N1cHBvcnRlZENvdW50cnkgPSBtaW4uaXNTdXBwb3J0ZWRDb3VudHJ5XHJcbmV4cG9ydHMuZ2V0RXh0UHJlZml4ID0gbWluLmdldEV4dFByZWZpeFxyXG5cclxuZXhwb3J0cy5wYXJzZVJGQzM5NjYgPSBtaW4ucGFyc2VSRkMzOTY2XHJcbmV4cG9ydHMuZm9ybWF0UkZDMzk2NiA9IG1pbi5mb3JtYXRSRkMzOTY2XHJcblxyXG4vLyBEZXByZWNhdGVkOiBgRElHSVRTYCB3ZXJlIHVzZWQgYnkgYHJlYWN0LXBob25lLW51bWJlci1pbnB1dGAuXHJcbi8vIFJlcGxhY2VkIGJ5IGBwYXJzZURpZ2l0cygpYC5cclxuZXhwb3J0cy5ESUdJVFMgPSByZXF1aXJlKCcuL2J1aWxkL2hlbHBlcnMvcGFyc2VEaWdpdHMuanMnKS5ESUdJVFNcclxuZXhwb3J0cy5ESUdJVF9QTEFDRUhPTERFUiA9IG1pbi5ESUdJVF9QTEFDRUhPTERFUlxyXG5cclxuLy8gYGdldFBob25lQ29kZWAgbmFtZSBpcyBkZXByZWNhdGVkXHJcbmV4cG9ydHMuZ2V0UGhvbmVDb2RlID0gbWluLmdldENvdW50cnlDYWxsaW5nQ29kZVxyXG5cclxuZXhwb3J0cy5mb3JtYXRJbmNvbXBsZXRlUGhvbmVOdW1iZXIgPSBtaW4uZm9ybWF0SW5jb21wbGV0ZVBob25lTnVtYmVyXHJcbmV4cG9ydHMucGFyc2VJbmNvbXBsZXRlUGhvbmVOdW1iZXIgPSBtaW4ucGFyc2VJbmNvbXBsZXRlUGhvbmVOdW1iZXJcclxuZXhwb3J0cy5wYXJzZVBob25lTnVtYmVyQ2hhcmFjdGVyID0gbWluLnBhcnNlUGhvbmVOdW1iZXJDaGFyYWN0ZXJcclxuZXhwb3J0cy5wYXJzZURpZ2l0cyA9IG1pbi5wYXJzZURpZ2l0cyIsIm1vZHVsZS5leHBvcnRzPXtcInZlcnNpb25cIjo0LFwiY291bnRyeV9jYWxsaW5nX2NvZGVzXCI6e1wiMVwiOltcIlVTXCIsXCJBR1wiLFwiQUlcIixcIkFTXCIsXCJCQlwiLFwiQk1cIixcIkJTXCIsXCJDQVwiLFwiRE1cIixcIkRPXCIsXCJHRFwiLFwiR1VcIixcIkpNXCIsXCJLTlwiLFwiS1lcIixcIkxDXCIsXCJNUFwiLFwiTVNcIixcIlBSXCIsXCJTWFwiLFwiVENcIixcIlRUXCIsXCJWQ1wiLFwiVkdcIixcIlZJXCJdLFwiN1wiOltcIlJVXCIsXCJLWlwiXSxcIjIwXCI6W1wiRUdcIl0sXCIyN1wiOltcIlpBXCJdLFwiMzBcIjpbXCJHUlwiXSxcIjMxXCI6W1wiTkxcIl0sXCIzMlwiOltcIkJFXCJdLFwiMzNcIjpbXCJGUlwiXSxcIjM0XCI6W1wiRVNcIl0sXCIzNlwiOltcIkhVXCJdLFwiMzlcIjpbXCJJVFwiLFwiVkFcIl0sXCI0MFwiOltcIlJPXCJdLFwiNDFcIjpbXCJDSFwiXSxcIjQzXCI6W1wiQVRcIl0sXCI0NFwiOltcIkdCXCIsXCJHR1wiLFwiSU1cIixcIkpFXCJdLFwiNDVcIjpbXCJES1wiXSxcIjQ2XCI6W1wiU0VcIl0sXCI0N1wiOltcIk5PXCIsXCJTSlwiXSxcIjQ4XCI6W1wiUExcIl0sXCI0OVwiOltcIkRFXCJdLFwiNTFcIjpbXCJQRVwiXSxcIjUyXCI6W1wiTVhcIl0sXCI1M1wiOltcIkNVXCJdLFwiNTRcIjpbXCJBUlwiXSxcIjU1XCI6W1wiQlJcIl0sXCI1NlwiOltcIkNMXCJdLFwiNTdcIjpbXCJDT1wiXSxcIjU4XCI6W1wiVkVcIl0sXCI2MFwiOltcIk1ZXCJdLFwiNjFcIjpbXCJBVVwiLFwiQ0NcIixcIkNYXCJdLFwiNjJcIjpbXCJJRFwiXSxcIjYzXCI6W1wiUEhcIl0sXCI2NFwiOltcIk5aXCJdLFwiNjVcIjpbXCJTR1wiXSxcIjY2XCI6W1wiVEhcIl0sXCI4MVwiOltcIkpQXCJdLFwiODJcIjpbXCJLUlwiXSxcIjg0XCI6W1wiVk5cIl0sXCI4NlwiOltcIkNOXCJdLFwiOTBcIjpbXCJUUlwiXSxcIjkxXCI6W1wiSU5cIl0sXCI5MlwiOltcIlBLXCJdLFwiOTNcIjpbXCJBRlwiXSxcIjk0XCI6W1wiTEtcIl0sXCI5NVwiOltcIk1NXCJdLFwiOThcIjpbXCJJUlwiXSxcIjIxMVwiOltcIlNTXCJdLFwiMjEyXCI6W1wiTUFcIixcIkVIXCJdLFwiMjEzXCI6W1wiRFpcIl0sXCIyMTZcIjpbXCJUTlwiXSxcIjIxOFwiOltcIkxZXCJdLFwiMjIwXCI6W1wiR01cIl0sXCIyMjFcIjpbXCJTTlwiXSxcIjIyMlwiOltcIk1SXCJdLFwiMjIzXCI6W1wiTUxcIl0sXCIyMjRcIjpbXCJHTlwiXSxcIjIyNVwiOltcIkNJXCJdLFwiMjI2XCI6W1wiQkZcIl0sXCIyMjdcIjpbXCJORVwiXSxcIjIyOFwiOltcIlRHXCJdLFwiMjI5XCI6W1wiQkpcIl0sXCIyMzBcIjpbXCJNVVwiXSxcIjIzMVwiOltcIkxSXCJdLFwiMjMyXCI6W1wiU0xcIl0sXCIyMzNcIjpbXCJHSFwiXSxcIjIzNFwiOltcIk5HXCJdLFwiMjM1XCI6W1wiVERcIl0sXCIyMzZcIjpbXCJDRlwiXSxcIjIzN1wiOltcIkNNXCJdLFwiMjM4XCI6W1wiQ1ZcIl0sXCIyMzlcIjpbXCJTVFwiXSxcIjI0MFwiOltcIkdRXCJdLFwiMjQxXCI6W1wiR0FcIl0sXCIyNDJcIjpbXCJDR1wiXSxcIjI0M1wiOltcIkNEXCJdLFwiMjQ0XCI6W1wiQU9cIl0sXCIyNDVcIjpbXCJHV1wiXSxcIjI0NlwiOltcIklPXCJdLFwiMjQ3XCI6W1wiQUNcIl0sXCIyNDhcIjpbXCJTQ1wiXSxcIjI0OVwiOltcIlNEXCJdLFwiMjUwXCI6W1wiUldcIl0sXCIyNTFcIjpbXCJFVFwiXSxcIjI1MlwiOltcIlNPXCJdLFwiMjUzXCI6W1wiREpcIl0sXCIyNTRcIjpbXCJLRVwiXSxcIjI1NVwiOltcIlRaXCJdLFwiMjU2XCI6W1wiVUdcIl0sXCIyNTdcIjpbXCJCSVwiXSxcIjI1OFwiOltcIk1aXCJdLFwiMjYwXCI6W1wiWk1cIl0sXCIyNjFcIjpbXCJNR1wiXSxcIjI2MlwiOltcIlJFXCIsXCJZVFwiXSxcIjI2M1wiOltcIlpXXCJdLFwiMjY0XCI6W1wiTkFcIl0sXCIyNjVcIjpbXCJNV1wiXSxcIjI2NlwiOltcIkxTXCJdLFwiMjY3XCI6W1wiQldcIl0sXCIyNjhcIjpbXCJTWlwiXSxcIjI2OVwiOltcIktNXCJdLFwiMjkwXCI6W1wiU0hcIixcIlRBXCJdLFwiMjkxXCI6W1wiRVJcIl0sXCIyOTdcIjpbXCJBV1wiXSxcIjI5OFwiOltcIkZPXCJdLFwiMjk5XCI6W1wiR0xcIl0sXCIzNTBcIjpbXCJHSVwiXSxcIjM1MVwiOltcIlBUXCJdLFwiMzUyXCI6W1wiTFVcIl0sXCIzNTNcIjpbXCJJRVwiXSxcIjM1NFwiOltcIklTXCJdLFwiMzU1XCI6W1wiQUxcIl0sXCIzNTZcIjpbXCJNVFwiXSxcIjM1N1wiOltcIkNZXCJdLFwiMzU4XCI6W1wiRklcIixcIkFYXCJdLFwiMzU5XCI6W1wiQkdcIl0sXCIzNzBcIjpbXCJMVFwiXSxcIjM3MVwiOltcIkxWXCJdLFwiMzcyXCI6W1wiRUVcIl0sXCIzNzNcIjpbXCJNRFwiXSxcIjM3NFwiOltcIkFNXCJdLFwiMzc1XCI6W1wiQllcIl0sXCIzNzZcIjpbXCJBRFwiXSxcIjM3N1wiOltcIk1DXCJdLFwiMzc4XCI6W1wiU01cIl0sXCIzODBcIjpbXCJVQVwiXSxcIjM4MVwiOltcIlJTXCJdLFwiMzgyXCI6W1wiTUVcIl0sXCIzODNcIjpbXCJYS1wiXSxcIjM4NVwiOltcIkhSXCJdLFwiMzg2XCI6W1wiU0lcIl0sXCIzODdcIjpbXCJCQVwiXSxcIjM4OVwiOltcIk1LXCJdLFwiNDIwXCI6W1wiQ1pcIl0sXCI0MjFcIjpbXCJTS1wiXSxcIjQyM1wiOltcIkxJXCJdLFwiNTAwXCI6W1wiRktcIl0sXCI1MDFcIjpbXCJCWlwiXSxcIjUwMlwiOltcIkdUXCJdLFwiNTAzXCI6W1wiU1ZcIl0sXCI1MDRcIjpbXCJITlwiXSxcIjUwNVwiOltcIk5JXCJdLFwiNTA2XCI6W1wiQ1JcIl0sXCI1MDdcIjpbXCJQQVwiXSxcIjUwOFwiOltcIlBNXCJdLFwiNTA5XCI6W1wiSFRcIl0sXCI1OTBcIjpbXCJHUFwiLFwiQkxcIixcIk1GXCJdLFwiNTkxXCI6W1wiQk9cIl0sXCI1OTJcIjpbXCJHWVwiXSxcIjU5M1wiOltcIkVDXCJdLFwiNTk0XCI6W1wiR0ZcIl0sXCI1OTVcIjpbXCJQWVwiXSxcIjU5NlwiOltcIk1RXCJdLFwiNTk3XCI6W1wiU1JcIl0sXCI1OThcIjpbXCJVWVwiXSxcIjU5OVwiOltcIkNXXCIsXCJCUVwiXSxcIjY3MFwiOltcIlRMXCJdLFwiNjcyXCI6W1wiTkZcIl0sXCI2NzNcIjpbXCJCTlwiXSxcIjY3NFwiOltcIk5SXCJdLFwiNjc1XCI6W1wiUEdcIl0sXCI2NzZcIjpbXCJUT1wiXSxcIjY3N1wiOltcIlNCXCJdLFwiNjc4XCI6W1wiVlVcIl0sXCI2NzlcIjpbXCJGSlwiXSxcIjY4MFwiOltcIlBXXCJdLFwiNjgxXCI6W1wiV0ZcIl0sXCI2ODJcIjpbXCJDS1wiXSxcIjY4M1wiOltcIk5VXCJdLFwiNjg1XCI6W1wiV1NcIl0sXCI2ODZcIjpbXCJLSVwiXSxcIjY4N1wiOltcIk5DXCJdLFwiNjg4XCI6W1wiVFZcIl0sXCI2ODlcIjpbXCJQRlwiXSxcIjY5MFwiOltcIlRLXCJdLFwiNjkxXCI6W1wiRk1cIl0sXCI2OTJcIjpbXCJNSFwiXSxcIjg1MFwiOltcIktQXCJdLFwiODUyXCI6W1wiSEtcIl0sXCI4NTNcIjpbXCJNT1wiXSxcIjg1NVwiOltcIktIXCJdLFwiODU2XCI6W1wiTEFcIl0sXCI4ODBcIjpbXCJCRFwiXSxcIjg4NlwiOltcIlRXXCJdLFwiOTYwXCI6W1wiTVZcIl0sXCI5NjFcIjpbXCJMQlwiXSxcIjk2MlwiOltcIkpPXCJdLFwiOTYzXCI6W1wiU1lcIl0sXCI5NjRcIjpbXCJJUVwiXSxcIjk2NVwiOltcIktXXCJdLFwiOTY2XCI6W1wiU0FcIl0sXCI5NjdcIjpbXCJZRVwiXSxcIjk2OFwiOltcIk9NXCJdLFwiOTcwXCI6W1wiUFNcIl0sXCI5NzFcIjpbXCJBRVwiXSxcIjk3MlwiOltcIklMXCJdLFwiOTczXCI6W1wiQkhcIl0sXCI5NzRcIjpbXCJRQVwiXSxcIjk3NVwiOltcIkJUXCJdLFwiOTc2XCI6W1wiTU5cIl0sXCI5NzdcIjpbXCJOUFwiXSxcIjk5MlwiOltcIlRKXCJdLFwiOTkzXCI6W1wiVE1cIl0sXCI5OTRcIjpbXCJBWlwiXSxcIjk5NVwiOltcIkdFXCJdLFwiOTk2XCI6W1wiS0dcIl0sXCI5OThcIjpbXCJVWlwiXX0sXCJjb3VudHJpZXNcIjp7XCJBQ1wiOltcIjI0N1wiLFwiMDBcIixcIig/OlswMTU4OV1cXFxcZHxbNDZdKVxcXFxkezR9XCIsWzUsNl1dLFwiQURcIjpbXCIzNzZcIixcIjAwXCIsXCIoPzoxfDZcXFxcZClcXFxcZHs3fXxbMTM1LTldXFxcXGR7NX1cIixbNiw4LDldLFtbXCIoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDJcIixbXCJbMTM1LTldXCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCIxXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiNlwiXV1dXSxcIkFFXCI6W1wiOTcxXCIsXCIwMFwiLFwiKD86WzQtN11cXFxcZHw5WzAtNjg5XSlcXFxcZHs3fXw4MDBcXFxcZHsyLDl9fFsyLTQ2NzldXFxcXGR7N31cIixbNSw2LDcsOCw5LDEwLDExLDEyXSxbW1wiKFxcXFxkezN9KShcXFxcZHsyLDl9KVwiLFwiJDEgJDJcIixbXCI2MHw4XCJdXSxbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzIzNl18WzQ3OV1bMi04XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkKShcXFxcZHs1fSlcIixcIiQxICQyICQzXCIsW1wiWzQ3OV1cIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI1XCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJBRlwiOltcIjkzXCIsXCIwMFwiLFwiWzItN11cXFxcZHs4fVwiLFs5XSxbW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsyLTddXCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJBR1wiOltcIjFcIixcIjAxMVwiLFwiKD86MjY4fFs1OF1cXFxcZFxcXFxkfDkwMClcXFxcZHs3fVwiLFsxMF0sMCxcIjFcIiwwLFwiKFs0NTddXFxcXGR7Nn0pJHwxXCIsXCIyNjgkMVwiLDAsXCIyNjhcIl0sXCJBSVwiOltcIjFcIixcIjAxMVwiLFwiKD86MjY0fFs1OF1cXFxcZFxcXFxkfDkwMClcXFxcZHs3fVwiLFsxMF0sMCxcIjFcIiwwLFwiKFsyNDU3XVxcXFxkezZ9KSR8MVwiLFwiMjY0JDFcIiwwLFwiMjY0XCJdLFwiQUxcIjpbXCIzNTVcIixcIjAwXCIsXCIoPzo3MDBcXFxcZFxcXFxkfDkwMClcXFxcZHszfXw4XFxcXGR7NSw3fXwoPzpbMi01XXw2XFxcXGQpXFxcXGR7N31cIixbNiw3LDgsOV0sW1tcIihcXFxcZHszfSkoXFxcXGR7Myw0fSlcIixcIiQxICQyXCIsW1wiODB8OVwiXSxcIjAkMVwiXSxbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiNFsyLTZdXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbMjM1OF1bMi01XXw0XCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7NX0pXCIsXCIkMSAkMlwiLFtcIlsyMzU3OF1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjZcIl0sXCIwJDFcIl1dLFwiMFwiXSxcIkFNXCI6W1wiMzc0XCIsXCIwMFwiLFwiKD86WzEtNDg5XVxcXFxkfDU1fDYwfDc3KVxcXFxkezZ9XCIsWzhdLFtbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiWzg5XTBcIl0sXCIwICQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7NX0pXCIsXCIkMSAkMlwiLFtcIjJ8M1sxMl1cIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezZ9KVwiLFwiJDEgJDJcIixbXCIxfDQ3XCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs2fSlcIixcIiQxICQyXCIsW1wiWzMtOV1cIl0sXCIwJDFcIl1dLFwiMFwiXSxcIkFPXCI6W1wiMjQ0XCIsXCIwMFwiLFwiWzI5XVxcXFxkezh9XCIsWzldLFtbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiWzI5XVwiXV1dXSxcIkFSXCI6W1wiNTRcIixcIjAwXCIsXCIoPzoxMXxbODldXFxcXGRcXFxcZClcXFxcZHs4fXxbMjM2OF1cXFxcZHs5fVwiLFsxMCwxMV0sW1tcIihcXFxcZHs0fSkoXFxcXGR7Mn0pKFxcXFxkezR9KVwiLFwiJDEgJDItJDNcIixbXCIyKD86MlswMjQtOV18M1swLTU5XXw0N3w2WzI0NV18OVswMi04XSl8Myg/OjNbMjhdfDRbMDMtOV18NVsyLTQ2LThdfDdbMS01NzhdfDhbMi05XSlcIixcIjIoPzpbMjNdMDJ8Nig/OlsyNV18NFs2LThdKXw5KD86WzAyMzU2XXw0WzAyNTY4XXw3Mnw4WzIzXSkpfDMoPzozWzI4XXw0KD86WzA0Njc5XXwzWzUtOF18NVs0LTY4XXw4WzIzNzldKXw1KD86WzI0NjddfDNbMjM3XXw4WzItNV0pfDdbMS01NzhdfDgoPzpbMjQ2OV18M1syNTc4XXw1WzQtOF18N1szNi04XXw4WzUtOF0pKXwyKD86MlsyNC05XXwzWzEtNTldfDQ3KVwiLFwiMig/OlsyM10wMnw2KD86WzI1XXw0KD86NjR8Wzc4XSkpfDkoPzpbMDIzNTZdfDQoPzpbMDI2OF18NVsyLTZdKXw3Mnw4WzIzXSkpfDMoPzozWzI4XXw0KD86WzA0Njc5XXwzWzc4XXw1KD86NFs0Nl18OCl8OFsyMzc5XSl8NSg/OlsyNDY3XXwzWzIzN118OFsyM10pfDdbMS01NzhdfDgoPzpbMjQ2OV18M1syNzhdfDVbNTZdWzQ2XXw4NlszLTZdKSl8Mig/OjJbMjQtOV18M1sxLTU5XXw0Nyl8MzgoPzpbNThdWzc4XXw3WzM3OF0pfDMoPzo0WzM1XVs1Nl18NThbNDVdfDgoPzpbMzhdNXw1NHw3NikpWzQtNl1cIixcIjIoPzpbMjNdMDJ8Nig/OlsyNV18NCg/OjY0fFs3OF0pKXw5KD86WzAyMzU2XXw0KD86WzAyNjhdfDVbMi02XSl8NzJ8OFsyM10pKXwzKD86M1syOF18NCg/OlswNDY3OV18Myg/OjUoPzo0WzAtMjU2ODldfFs1Nl0pfFs3OF0pfDU4fDhbMjM3OV0pfDUoPzpbMjQ2N118M1syMzddfDgoPzpbMjNdfDQoPzpbNDVdfDYwKXw1KD86NFswLTM5XXw1fDY0KSkpfDdbMS01NzhdfDgoPzpbMjQ2OV18M1syNzhdfDU0KD86NHw1WzEzLTddfDZbODldKXw4NlszLTZdKSl8Mig/OjJbMjQtOV18M1sxLTU5XXw0Nyl8MzgoPzpbNThdWzc4XXw3WzM3OF0pfDMoPzo0NTR8ODVbNTZdKVs0Nl18Myg/OjQoPzozNnw1WzU2XSl8OCg/OlszOF01fDc2KSlbNC02XVwiXSxcIjAkMVwiLDFdLFtcIihcXFxcZHsyfSkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDItJDNcIixbXCIxXCJdLFwiMCQxXCIsMV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMS0kMi0kM1wiLFtcIls2OF1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMi0kM1wiLFtcIlsyM11cIl0sXCIwJDFcIiwxXSxbXCIoXFxcXGQpKFxcXFxkezR9KShcXFxcZHsyfSkoXFxcXGR7NH0pXCIsXCIkMiAxNS0kMy0kNFwiLFtcIjkoPzoyWzItNDY5XXwzWzMtNTc4XSlcIixcIjkoPzoyKD86MlswMjQtOV18M1swLTU5XXw0N3w2WzI0NV18OVswMi04XSl8Myg/OjNbMjhdfDRbMDMtOV18NVsyLTQ2LThdfDdbMS01NzhdfDhbMi05XSkpXCIsXCI5KD86Mig/OlsyM10wMnw2KD86WzI1XXw0WzYtOF0pfDkoPzpbMDIzNTZdfDRbMDI1NjhdfDcyfDhbMjNdKSl8Myg/OjNbMjhdfDQoPzpbMDQ2NzldfDNbNS04XXw1WzQtNjhdfDhbMjM3OV0pfDUoPzpbMjQ2N118M1syMzddfDhbMi01XSl8N1sxLTU3OF18OCg/OlsyNDY5XXwzWzI1NzhdfDVbNC04XXw3WzM2LThdfDhbNS04XSkpKXw5Mig/OjJbMjQtOV18M1sxLTU5XXw0NylcIixcIjkoPzoyKD86WzIzXTAyfDYoPzpbMjVdfDQoPzo2NHxbNzhdKSl8OSg/OlswMjM1Nl18NCg/OlswMjY4XXw1WzItNl0pfDcyfDhbMjNdKSl8Myg/OjNbMjhdfDQoPzpbMDQ2NzldfDNbNzhdfDUoPzo0WzQ2XXw4KXw4WzIzNzldKXw1KD86WzI0NjddfDNbMjM3XXw4WzIzXSl8N1sxLTU3OF18OCg/OlsyNDY5XXwzWzI3OF18NSg/Ols1Nl1bNDZdfFs3OF0pfDdbMzc4XXw4KD86NlszLTZdfFs3OF0pKSkpfDkyKD86MlsyNC05XXwzWzEtNTldfDQ3KXw5Myg/OjRbMzVdWzU2XXw1OFs0NV18OCg/OlszOF01fDU0fDc2KSlbNC02XVwiLFwiOSg/OjIoPzpbMjNdMDJ8Nig/OlsyNV18NCg/OjY0fFs3OF0pKXw5KD86WzAyMzU2XXw0KD86WzAyNjhdfDVbMi02XSl8NzJ8OFsyM10pKXwzKD86M1syOF18NCg/OlswNDY3OV18Myg/OjUoPzo0WzAtMjU2ODldfFs1Nl0pfFs3OF0pfDUoPzo0WzQ2XXw4KXw4WzIzNzldKXw1KD86WzI0NjddfDNbMjM3XXw4KD86WzIzXXw0KD86WzQ1XXw2MCl8NSg/OjRbMC0zOV18NXw2NCkpKXw3WzEtNTc4XXw4KD86WzI0NjldfDNbMjc4XXw1KD86NCg/OjR8NVsxMy03XXw2Wzg5XSl8WzU2XVs0Nl18Wzc4XSl8N1szNzhdfDgoPzo2WzMtNl18Wzc4XSkpKSl8OTIoPzoyWzI0LTldfDNbMS01OV18NDcpfDkzKD86NCg/OjM2fDVbNTZdKXw4KD86WzM4XTV8NzYpKVs0LTZdXCJdLFwiMCQxXCIsMCxcIiQxICQyICQzLSQ0XCJdLFtcIihcXFxcZCkoXFxcXGR7Mn0pKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQyIDE1LSQzLSQ0XCIsW1wiOTFcIl0sXCIwJDFcIiwwLFwiJDEgJDIgJDMtJDRcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NX0pXCIsXCIkMS0kMi0kM1wiLFtcIjhcIl0sXCIwJDFcIl0sW1wiKFxcXFxkKShcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDIgMTUtJDMtJDRcIixbXCI5XCJdLFwiMCQxXCIsMCxcIiQxICQyICQzLSQ0XCJdXSxcIjBcIiwwLFwiMD8oPzooMTF8Mig/OjIoPzowMj98WzEzXXwyWzEzLTc5XXw0WzEtNl18NVsyNDU3XXw2WzEyNC04XXw3WzEtNF18OFsxMy02XXw5WzEyNjddKXwzKD86MDI/fDFbNDY3XXwyWzAzLTZdfDNbMTMtOF18WzQ5XVsyLTZdfDVbMi04XXxbNjddKXw0KD86N1szLTU3OF18OSl8Nig/OlswMTM2XXwyWzI0LTZdfDRbNi04XT98NVsxNS04XSl8ODB8OSg/OjBbMS0zXXxbMTldfDJcXFxcZHwzWzEtNl18NFswMjU2OF0/fDVbMi00XXw2WzItNDZdfDcyP3w4WzIzXT8pKXwzKD86Myg/OjJbNzldfDZ8OFsyNTc4XSl8NCg/OjBbMC0yNC05XXxbMTJdfDNbNS04XT98NFsyNC03XXw1WzQtNjhdP3w2WzAyLTldfDdbMTI2XXw4WzIzNzldP3w5WzEtMzYtOF0pfDUoPzoxfDJbMTI0NV18M1syMzddP3w0WzEtNDYtOV18NlsyLTRdfDdbMS02XXw4WzItNV0/KXw2WzI0XXw3KD86WzA2OV18MVsxNTY4XXwyWzE1XXwzWzE0NV18NFsxM118NVsxNC04XXw3WzItNTddfDhbMTI2XSl8OCg/OlswMV18MlsxNS03XXwzWzI1NzhdP3w0WzEzLTZdfDVbNC04XT98NlsxLTM1Ny05XXw3WzM2LThdP3w4WzUtOF0/fDlbMTI0XSkpKTE1KT9cIixcIjkkMVwiXSxcIkFTXCI6W1wiMVwiLFwiMDExXCIsXCIoPzpbNThdXFxcXGRcXFxcZHw2ODR8OTAwKVxcXFxkezd9XCIsWzEwXSwwLFwiMVwiLDAsXCIoWzI2N11cXFxcZHs2fSkkfDFcIixcIjY4NCQxXCIsMCxcIjY4NFwiXSxcIkFUXCI6W1wiNDNcIixcIjAwXCIsXCIxXFxcXGR7MywxMn18MlxcXFxkezYsMTJ9fDQzKD86KD86MFxcXFxkfDVbMDItOV0pXFxcXGR7Myw5fXwyXFxcXGR7NCw1fXxbMzQ2N11cXFxcZHs0fXw4XFxcXGR7NCw2fXw5XFxcXGR7NCw3fSl8NVxcXFxkezQsMTJ9fDhcXFxcZHs3LDEyfXw5XFxcXGR7OCwxMn18KD86WzM2N11cXFxcZHw0WzAtMjQtOV0pXFxcXGR7NCwxMX1cIixbNCw1LDYsNyw4LDksMTAsMTEsMTIsMTNdLFtbXCIoXFxcXGQpKFxcXFxkezMsMTJ9KVwiLFwiJDEgJDJcIixbXCIxKD86MTF8WzItOV0pXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMlwiLFtcIjUxN1wiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezMsNX0pXCIsXCIkMSAkMlwiLFtcIjVbMDc5XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezMsMTB9KVwiLFwiJDEgJDJcIixbXCIoPzozMXw0KTZ8NTF8Nig/OjVbMC0zNTc5XXxbNi05XSl8Nyg/OjIwfDMyfDgpfFs4OV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZHszLDl9KVwiLFwiJDEgJDJcIixbXCJbMi00NjddfDVbMi02XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCI1XCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7NH0pKFxcXFxkezQsN30pXCIsXCIkMSAkMiAkM1wiLFtcIjVcIl0sXCIwJDFcIl1dLFwiMFwiXSxcIkFVXCI6W1wiNjFcIixcIjAwMVsxNC02ODldfDE0KD86MVsxNF18MzR8NFsxN118WzU2XTZ8N1s0N118ODgpMDAxMVwiLFwiMSg/OlswLTc5XVxcXFxkezd9KD86XFxcXGQoPzpcXFxcZHsyfSk/KT98OFswLTI0LTldXFxcXGR7N30pfFsyLTQ3OF1cXFxcZHs4fXwxXFxcXGR7NCw3fVwiLFs1LDYsNyw4LDksMTAsMTJdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezMsNH0pXCIsXCIkMSAkMlwiLFtcIjE2XCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezIsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIjE2XCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCIxNHw0XCJdLFwiMCQxXCJdLFtcIihcXFxcZCkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMjM3OF1cIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGR7NH0pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiMSg/OjMwfFs4OV0pXCJdXV0sXCIwXCIsMCxcIigxODNbMTJdKXwwXCIsMCwwLDAsW1tcIig/Oig/OjIoPzpbMC0yNi05XVxcXFxkfDNbMC04XXw0WzAyLTldfDVbMDEzNS05XSl8Myg/OlswLTM1ODldXFxcXGR8NFswLTU3OF18NlsxLTldfDdbMC0zNS05XSl8Nyg/OlswMTMtNTctOV1cXFxcZHwyWzAtOF0pKVxcXFxkezN9fDgoPzo1MSg/OjAoPzowWzAzLTldfFsxMjQ3OV1cXFxcZHwzWzItOV18NVswLThdfDZbMS05XXw4WzAtN10pfDEoPzpbMDIzNTY4OV1cXFxcZHwxWzAtNjldfDRbMC01ODldfDdbMC00Ny05XSl8Mig/OjBbMC03OV18WzE4XVsxMzU3OV18MlsxNC05XXwzWzAtNDYtOV18WzQtNl1cXFxcZHw3Wzg5XXw5WzAtNF0pKXwoPzo2WzAtOF18Wzc4XVxcXFxkKVxcXFxkezN9fDkoPzpbMDItOV1cXFxcZHszfXwxKD86KD86WzAtNThdXFxcXGR8NlswMTM1LTldKVxcXFxkfDcoPzowWzAtMjQtOV18WzEtOV1cXFxcZCl8OSg/OlswLTQ2LTldXFxcXGR8NVswLTc5XSkpKSkpXFxcXGR7M31cIixbOV1dLFtcIjQoPzo3OVswMV18ODNbMC0zODldfDkzWzAtNl0pXFxcXGR7NX18NCg/OlswLTNdXFxcXGR8NFswNDctOV18NVswLTI1LTldfDZbMDE2LTldfDdbMDItOF18OFswLTI0LTldfDlbMC0yNy05XSlcXFxcZHs2fVwiLFs5XV0sW1wiMTgwKD86MFxcXFxkezN9fDIpXFxcXGR7M31cIixbNywxMF1dLFtcIjE5MFswLTI2XVxcXFxkezZ9XCIsWzEwXV0sMCwwLDAsW1wiMTYzXFxcXGR7Miw2fVwiLFs1LDYsNyw4LDldXSxbXCIxNCg/OjUoPzoxWzA0NThdfFsyM11bNDU4XSl8NzFcXFxcZClcXFxcZHs0fVwiLFs5XV0sW1wiMTMoPzowMFxcXFxkezZ9KD86XFxcXGR7Mn0pP3w0NVswLTRdXFxcXGR7M30pfDEzXFxcXGR7NH1cIixbNiw4LDEwLDEyXV1dLFwiMDAxMVwiXSxcIkFXXCI6W1wiMjk3XCIsXCIwMFwiLFwiKD86WzI1LTc5XVxcXFxkXFxcXGR8ODAwKVxcXFxkezR9XCIsWzddLFtbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMjUtOV1cIl1dXV0sXCJBWFwiOltcIjM1OFwiLFwiMDB8OTkoPzpbMDE0NjldfDUoPzpbMTRdMXwzWzIzXXw1WzU5XXw3N3w4OHw5WzA5XSkpXCIsXCIyXFxcXGR7NCw5fXwzNVxcXFxkezQsNX18KD86NjBcXFxcZFxcXFxkfDgwMClcXFxcZHs0LDZ9fDdcXFxcZHs1LDExfXwoPzpbMTRdXFxcXGR8M1swLTQ2LTldfDUwKVxcXFxkezQsOH1cIixbNSw2LDcsOCw5LDEwLDExLDEyXSwwLFwiMFwiLDAsMCwwLDAsXCIxOFwiLDAsXCIwMFwiXSxcIkFaXCI6W1wiOTk0XCIsXCIwMFwiLFwiMzY1XFxcXGR7Nn18KD86WzEyNDU3OV1cXFxcZHw2MHw4OClcXFxcZHs3fVwiLFs5XSxbW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCI5MFwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjFbMjhdfDJ8MzY1fDQ2XCIsXCIxWzI4XXwyfDM2NVs0NV18NDZcIixcIjFbMjhdfDJ8MzY1KD86NHw1WzAyXSl8NDZcIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsxMy05XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiQkFcIjpbXCIzODdcIixcIjAwXCIsXCI2XFxcXGR7OH18KD86WzM1Njg5XVxcXFxkfDQ5fDcwKVxcXFxkezZ9XCIsWzgsOV0sW1tcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCI2WzEtM118WzctOV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMi0kM1wiLFtcIlszLTVdfDZbNTZdXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHszfSlcIixcIiQxICQyICQzICQ0XCIsW1wiNlwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiQkJcIjpbXCIxXCIsXCIwMTFcIixcIig/OjI0NnxbNThdXFxcXGRcXFxcZHw5MDApXFxcXGR7N31cIixbMTBdLDAsXCIxXCIsMCxcIihbMi05XVxcXFxkezZ9KSR8MVwiLFwiMjQ2JDFcIiwwLFwiMjQ2XCJdLFwiQkRcIjpbXCI4ODBcIixcIjAwXCIsXCJbMS00NjldXFxcXGR7OX18OFswLTc5XVxcXFxkezcsOH18WzItNzldXFxcXGR7OH18WzItOV1cXFxcZHs3fXxbMy05XVxcXFxkezZ9fFs1Ny05XVxcXFxkezV9XCIsWzYsNyw4LDksMTBdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezQsNn0pXCIsXCIkMS0kMlwiLFtcIjMxWzUtOF18WzQ1OV0xXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Myw3fSlcIixcIiQxLSQyXCIsW1wiMyg/Ols2N118OFswMTMtOV0pfDQoPzo2WzE2OF18N3xbODldWzE4XSl8NSg/OjZbMTI4XXw5KXw2KD86Mjh8NFsxNF18NSl8N1syLTU4OV18OCg/OjBbMDE0LTldfFsxMl0pfDlbMzU4XXwoPzozWzItNV18NFsyMzVdfDVbMi01NzhdfDZbMDM4OV18NzZ8OFszLTddfDlbMjRdKTF8KD86NDR8NjYpWzAxMzQ2LTldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHs0fSkoXFxcXGR7Myw2fSlcIixcIiQxLSQyXCIsW1wiWzEzLTldfDIyXCJdLFwiMCQxXCJdLFtcIihcXFxcZCkoXFxcXGR7Nyw4fSlcIixcIiQxLSQyXCIsW1wiMlwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiQkVcIjpbXCIzMlwiLFwiMDBcIixcIjRcXFxcZHs4fXxbMS05XVxcXFxkezd9XCIsWzgsOV0sW1tcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCIoPzo4MHw5KTBcIl0sXCIwJDFcIl0sW1wiKFxcXFxkKShcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbMjM5XXw0WzIzXVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsxNS04XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjRcIl0sXCIwJDFcIl1dLFwiMFwiXSxcIkJGXCI6W1wiMjI2XCIsXCIwMFwiLFwiWzAyNS03XVxcXFxkezd9XCIsWzhdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlswMjUtN11cIl1dXV0sXCJCR1wiOltcIjM1OVwiLFwiMDBcIixcIjAwODAwXFxcXGR7N318WzItN11cXFxcZHs2LDd9fFs4OV1cXFxcZHs2LDh9fDJcXFxcZHs1fVwiLFs2LDcsOCw5LDEyXSxbW1wiKFxcXFxkKShcXFxcZCkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCIyXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIjQzWzEtNl18NzBbMS05XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCIyXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezIsM30pXCIsXCIkMSAkMiAkM1wiLFtcIlszNTZdfDRbMTI0LTddfDdbMS05XXw4WzEtNl18OVsxLTddXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCIoPzo3MHw4KTBcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkM1wiLFtcIjQzWzEtN118N1wiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCJbNDhdfDlbMDhdXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCI5XCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJCSFwiOltcIjk3M1wiLFwiMDBcIixcIlsxMzYtOV1cXFxcZHs3fVwiLFs4XSxbW1wiKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiWzEzNjc5XXw4WzA0N11cIl1dXV0sXCJCSVwiOltcIjI1N1wiLFwiMDBcIixcIig/OlsyNjddXFxcXGR8MzEpXFxcXGR7Nn1cIixbOF0sW1tcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiWzIzNjddXCJdXV1dLFwiQkpcIjpbXCIyMjlcIixcIjAwXCIsXCJbMjQtNjg5XVxcXFxkezd9XCIsWzhdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsyNC02ODldXCJdXV1dLFwiQkxcIjpbXCI1OTBcIixcIjAwXCIsXCI1OTBcXFxcZHs2fXwoPzo2OXw4MHw5XFxcXGQpXFxcXGR7N31cIixbOV0sMCxcIjBcIiwwLDAsMCwwLDAsW1tcIjU5MCg/OjJbNy05XXw1WzEyXXw4NylcXFxcZHs0fVwiXSxbXCI2OSg/OjBcXFxcZFxcXFxkfDEoPzoyWzItOV18M1swLTVdKSlcXFxcZHs0fVwiXSxbXCI4MFswLTVdXFxcXGR7Nn1cIl0sMCwwLDAsMCwwLFtcIjkoPzooPzozOTV8NzZbMDE4XSlcXFxcZHw0NzVbMDFdKVxcXFxkezR9XCJdXV0sXCJCTVwiOltcIjFcIixcIjAxMVwiLFwiKD86NDQxfFs1OF1cXFxcZFxcXFxkfDkwMClcXFxcZHs3fVwiLFsxMF0sMCxcIjFcIiwwLFwiKFsyLTldXFxcXGR7Nn0pJHwxXCIsXCI0NDEkMVwiLDAsXCI0NDFcIl0sXCJCTlwiOltcIjY3M1wiLFwiMDBcIixcIlsyLTU3OF1cXFxcZHs2fVwiLFs3XSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiWzItNTc4XVwiXV1dXSxcIkJPXCI6W1wiNTkxXCIsXCIwMCg/OjFcXFxcZCk/XCIsXCIoPzpbMi00NjddXFxcXGRcXFxcZHw4MDAxKVxcXFxkezV9XCIsWzgsOV0sW1tcIihcXFxcZCkoXFxcXGR7N30pXCIsXCIkMSAkMlwiLFtcIlsyM118NFs0Nl1cIl1dLFtcIihcXFxcZHs4fSlcIixcIiQxXCIsW1wiWzY3XVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjhcIl1dXSxcIjBcIiwwLFwiMCgxXFxcXGQpP1wiXSxcIkJRXCI6W1wiNTk5XCIsXCIwMFwiLFwiKD86WzM0XTF8N1xcXFxkKVxcXFxkezV9XCIsWzddLDAsMCwwLDAsMCwwLFwiWzM0N11cIl0sXCJCUlwiOltcIjU1XCIsXCIwMCg/OjFbMjQ1XXwyWzEtMzVdfDMxfDRbMTNdfFs1Nl01fDk5KVwiLFwiKD86WzEtNDYtOV1cXFxcZFxcXFxkfDUoPzpbMC00Ni05XVxcXFxkfDVbMC00Ni05XSkpXFxcXGR7OH18WzEtOV1cXFxcZHs5fXxbMzU4OV1cXFxcZHs4fXxbMzRdXFxcXGR7N31cIixbOCw5LDEwLDExXSxbW1wiKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxLSQyXCIsW1wiMzAwfDQoPzowWzAyXXwzNylcIixcIjQoPzowMnwzNykwfFszNF0wMFwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHsyLDN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiKD86WzM1OF18OTApMFwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxICQyLSQzXCIsW1wiKD86WzE0Njg5XVsxLTldfDJbMTI0NzhdfDNbMS01NzhdfDVbMTMtNV18N1sxMy01NzldKVsyLTU3XVwiXSxcIigkMSlcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs1fSkoXFxcXGR7NH0pXCIsXCIkMSAkMi0kM1wiLFtcIlsxNl1bMS05XXxbMi01Ny05XVwiXSxcIigkMSlcIl1dLFwiMFwiLDAsXCIoPzowfDkwKSg/OigxWzI0NV18MlsxLTM1XXwzMXw0WzEzXXxbNTZdNXw5OSkoXFxcXGR7MTAsMTF9KSk/XCIsXCIkMlwiXSxcIkJTXCI6W1wiMVwiLFwiMDExXCIsXCIoPzoyNDJ8WzU4XVxcXFxkXFxcXGR8OTAwKVxcXFxkezd9XCIsWzEwXSwwLFwiMVwiLDAsXCIoWzMtOF1cXFxcZHs2fSkkfDFcIixcIjI0MiQxXCIsMCxcIjI0MlwiXSxcIkJUXCI6W1wiOTc1XCIsXCIwMFwiLFwiWzE3XVxcXFxkezd9fFsyLThdXFxcXGR7Nn1cIixbNyw4XSxbW1wiKFxcXFxkKShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIlsyLTY4XXw3WzI0Nl1cIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiMVs2N118N1wiXV1dXSxcIkJXXCI6W1wiMjY3XCIsXCIwMFwiLFwiKD86MDgwMHwoPzpbMzddfDgwMClcXFxcZClcXFxcZHs2fXwoPzpbMi02XVxcXFxkfDkwKVxcXFxkezV9XCIsWzcsOCwxMF0sW1tcIihcXFxcZHsyfSkoXFxcXGR7NX0pXCIsXCIkMSAkMlwiLFtcIjkwXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMjQtNl18M1sxNS03OV1cIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbMzddXCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiMFwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHs0fSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjhcIl1dXV0sXCJCWVwiOltcIjM3NVwiLFwiODEwXCIsXCIoPzpbMTJdXFxcXGR8MzN8NDR8OTAyKVxcXFxkezd9fDgoPzowWzAtNzldXFxcXGR7NSw3fXxbMS03XVxcXFxkezl9KXw4KD86MVswLTQ4OV18WzUtNzldXFxcXGQpXFxcXGR7N318OFsxLTc5XVxcXFxkezYsN318OFswLTc5XVxcXFxkezV9fDhcXFxcZHs1fVwiLFs2LDcsOCw5LDEwLDExXSxbW1wiKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyXCIsW1wiODAwXCJdLFwiOCAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyLDR9KVwiLFwiJDEgJDIgJDNcIixbXCI4MDBcIl0sXCI4ICQxXCJdLFtcIihcXFxcZHs0fSkoXFxcXGR7Mn0pKFxcXFxkezN9KVwiLFwiJDEgJDItJDNcIixbXCIxKD86NVsxNjldfDZbMy01XXw3WzE3OV0pfDIoPzoxWzM1XXwyWzM0XXwzWzMtNV0pXCIsXCIxKD86NVsxNjldfDYoPzozWzEtM118NHw1WzEyNV0pfDcoPzoxWzMtOV18N1swLTI0LTZdfDlbMi03XSkpfDIoPzoxWzM1XXwyWzM0XXwzWzMtNV0pXCJdLFwiOCAwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDItJDMtJDRcIixbXCIxKD86WzU2XXw3WzQ2N10pfDJbMS0zXVwiXSxcIjggMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyLSQzLSQ0XCIsW1wiWzEtNF1cIl0sXCI4IDAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezMsNH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbODldXCJdLFwiOCAkMVwiXV0sXCI4XCIsMCxcIjB8ODA/XCIsMCwwLDAsMCxcIjh+MTBcIl0sXCJCWlwiOltcIjUwMVwiLFwiMDBcIixcIig/OjA4MDBcXFxcZHxbMi04XSlcXFxcZHs2fVwiLFs3LDExXSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxLSQyXCIsW1wiWzItOF1cIl1dLFtcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezR9KShcXFxcZHszfSlcIixcIiQxLSQyLSQzLSQ0XCIsW1wiMFwiXV1dXSxcIkNBXCI6W1wiMVwiLFwiMDExXCIsXCIoPzpbMi04XVxcXFxkfDkwKVxcXFxkezh9fDNcXFxcZHs2fVwiLFs3LDEwXSwwLFwiMVwiLDAsMCwwLDAsMCxbW1wiKD86Mig/OjA0fFsyM102fFs0OF05fDUwfDYzKXwzKD86MDZ8NDN8NTR8Nls1NzhdfDgyKXw0KD86MDN8MVs2OF18M1sxNzhdfDUwfDY4fDc0KXw1KD86MDZ8MVs0OV18NDh8Nzl8OFsxNDddKXw2KD86MDR8WzE4XTN8Mzl8NDd8NzIpfDcoPzowWzU5XXw0Mnw1M3w3OHw4WzAyXSl8OCg/OlswNl03fDE5fDI1fDczKXw5MFsyNV0pWzItOV1cXFxcZHs2fVwiLFsxMF1dLFtcIlwiLFsxMF1dLFtcIjgoPzowMHwzM3w0NHw1NXw2Nnw3N3w4OClbMi05XVxcXFxkezZ9XCIsWzEwXV0sW1wiOTAwWzItOV1cXFxcZHs2fVwiLFsxMF1dLFtcIjUyKD86Myg/OlsyLTQ2LTldWzAyLTldXFxcXGR8NSg/OlswMi00Ni05XVxcXFxkfDVbMC00Ni05XSkpfDQoPzpbMi00NzhdWzAyLTldXFxcXGR8NSg/OlswMzRdXFxcXGR8MlswMjQtOV18NVswLTQ2LTldKXw2KD86MFsxLTldfFsyLTldXFxcXGQpfDkoPzpbMDUtOV1cXFxcZHwyWzAtNV18NDkpKSlcXFxcZHs0fXw1MlszNF1bMi05XTFbMDItOV1cXFxcZHs0fXwoPzo1KD86MDB8MlsxMjUtOV18MzN8NDR8NjZ8Nzd8ODgpfDYyMilbMi05XVxcXFxkezZ9XCIsWzEwXV0sMCxbXCIzMTBcXFxcZHs0fVwiLFs3XV0sMCxbXCI2MDBbMi05XVxcXFxkezZ9XCIsWzEwXV1dXSxcIkNDXCI6W1wiNjFcIixcIjAwMVsxNC02ODldfDE0KD86MVsxNF18MzR8NFsxN118WzU2XTZ8N1s0N118ODgpMDAxMVwiLFwiMSg/OlswLTc5XVxcXFxkezh9KD86XFxcXGR7Mn0pP3w4WzAtMjQtOV1cXFxcZHs3fSl8WzE0OF1cXFxcZHs4fXwxXFxcXGR7NSw3fVwiLFs2LDcsOCw5LDEwLDEyXSwwLFwiMFwiLDAsXCIoWzU5XVxcXFxkezd9KSR8MFwiLFwiOCQxXCIsMCwwLFtbXCI4KD86NTEoPzowKD86MDJ8MzF8NjB8ODkpfDEoPzoxOHw3Nil8MjIzKXw5MSg/OjAoPzoxWzAtMl18MjkpfDEoPzpbMjhdMnw1MHw3OSl8Mig/OjEwfDY0KXwzKD86WzA2XTh8MjIpfDRbMjldOHw2MlxcXFxkfDcwWzIzXXw5NTkpKVxcXFxkezN9XCIsWzldXSxbXCI0KD86NzlbMDFdfDgzWzAtMzg5XXw5M1swLTZdKVxcXFxkezV9fDQoPzpbMC0zXVxcXFxkfDRbMDQ3LTldfDVbMC0yNS05XXw2WzAxNi05XXw3WzAyLThdfDhbMC0yNC05XXw5WzAtMjctOV0pXFxcXGR7Nn1cIixbOV1dLFtcIjE4MCg/OjBcXFxcZHszfXwyKVxcXFxkezN9XCIsWzcsMTBdXSxbXCIxOTBbMC0yNl1cXFxcZHs2fVwiLFsxMF1dLDAsMCwwLDAsW1wiMTQoPzo1KD86MVswNDU4XXxbMjNdWzQ1OF0pfDcxXFxcXGQpXFxcXGR7NH1cIixbOV1dLFtcIjEzKD86MDBcXFxcZHs2fSg/OlxcXFxkezJ9KT98NDVbMC00XVxcXFxkezN9KXwxM1xcXFxkezR9XCIsWzYsOCwxMCwxMl1dXSxcIjAwMTFcIl0sXCJDRFwiOltcIjI0M1wiLFwiMDBcIixcIlsxODldXFxcXGR7OH18WzEtNjhdXFxcXGR7Nn1cIixbNyw5XSxbW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjg4XCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7NX0pXCIsXCIkMSAkMlwiLFtcIlsxLTZdXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIxXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbODldXCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJDRlwiOltcIjIzNlwiLFwiMDBcIixcIig/OlsyN11cXFxcZHszfXw4Nzc2KVxcXFxkezR9XCIsWzhdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsyNzhdXCJdXV1dLFwiQ0dcIjpbXCIyNDJcIixcIjAwXCIsXCIyMjJcXFxcZHs2fXwoPzowXFxcXGR8ODApXFxcXGR7N31cIixbOV0sW1tcIihcXFxcZCkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI4XCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzAyXVwiXV1dXSxcIkNIXCI6W1wiNDFcIixcIjAwXCIsXCI4XFxcXGR7MTF9fFsyLTldXFxcXGR7OH1cIixbOV0sW1tcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCI4WzA0N118OTBcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbMi03OV18ODFcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0ICQ1XCIsW1wiOFwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiQ0lcIjpbXCIyMjVcIixcIjAwXCIsXCJbMDJdXFxcXGR7OX1cIixbMTBdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZCkoXFxcXGR7NX0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjJcIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHs0fSlcIixcIiQxICQyICQzICQ0XCIsW1wiMFwiXV1dXSxcIkNLXCI6W1wiNjgyXCIsXCIwMFwiLFwiWzItNTc4XVxcXFxkezR9XCIsWzVdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KVwiLFwiJDEgJDJcIixbXCJbMi01NzhdXCJdXV1dLFwiQ0xcIjpbXCI1NlwiLFwiKD86MHwxKD86MVswLTY5XXwyWzAyLTVdfDVbMTMtNThdfDY5fDdbMDE2N118OFswMThdKSkwXCIsXCIxMjMwMFxcXFxkezZ9fDZcXFxcZHs5LDEwfXxbMi05XVxcXFxkezh9XCIsWzksMTAsMTFdLFtbXCIoXFxcXGR7NX0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCIyMTlcIixcIjIxOTZcIl0sXCIoJDEpXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI0NFwiXV0sW1wiKFxcXFxkKShcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjJbMS0zNl1cIl0sXCIoJDEpXCJdLFtcIihcXFxcZCkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI5WzItOV1cIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIzWzItNV18WzQ3XXw1WzEtMzU3OF18NlsxMy01N118OCg/OjBbMS05XXxbMS05XSlcIl0sXCIoJDEpXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIjYwfDhcIl1dLFtcIihcXFxcZHs0fSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIxXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjYwXCJdXV1dLFwiQ01cIjpbXCIyMzdcIixcIjAwXCIsXCJbMjZdXFxcXGR7OH18ODhcXFxcZHs2LDd9XCIsWzgsOV0sW1tcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiODhcIl1dLFtcIihcXFxcZCkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNCAkNVwiLFtcIlsyNl18ODhcIl1dXV0sXCJDTlwiOltcIjg2XCIsXCIwMHwxKD86WzEyXVxcXFxkfDc5KVxcXFxkXFxcXGQwMFwiLFwiMVsxMjddXFxcXGR7OCw5fXwyXFxcXGR7OX0oPzpcXFxcZHsyfSk/fFsxMl1cXFxcZHs2LDd9fDg2XFxcXGR7Nn18KD86MVswMy02ODldXFxcXGR8NilcXFxcZHs3LDl9fCg/OlszLTU3OV1cXFxcZHw4WzAtNTctOV0pXFxcXGR7Niw5fVwiLFs3LDgsOSwxMCwxMSwxMl0sW1tcIihcXFxcZHsyfSkoXFxcXGR7NSw2fSlcIixcIiQxICQyXCIsW1wiKD86MTB8MlswLTU3LTldKVsxOV1cIixcIig/OjEwfDJbMC01Ny05XSkoPzoxMHw5WzU2XSlcIixcIjEwKD86MTB8OVs1Nl0pfDJbMC01Ny05XSg/OjEwMHw5WzU2XSlcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHs1LDZ9KVwiLFwiJDEgJDJcIixbXCIzKD86WzE1N118MzV8NDl8OVsxLTY4XSl8NCg/OlsxN118MlsxNzldfDZbNDctOV18OFsyM10pfDUoPzpbMTM1N118MlszN118NFszNl18NlsxLTQ2XXw4MCl8Nig/OjNbMS01XXw2WzAyMzhdfDlbMTJdKXw3KD86MDF8WzE1NzldfDJbMjQ4XXwzWzAxNC05XXw0WzMtNl18NlswMjM2ODldKXw4KD86MVsyMzYtOF18Mls1LTddfFszN118OFszNi04XXw5WzEtOF0pfDkoPzowWzEtMzY4OV18MVsxLTc5XXxbMzc5XXw0WzEzXXw1WzEtNV0pfCg/OjRbMzVdfDU5fDg1KVsxLTldXCIsXCIoPzozKD86WzE1N11cXFxcZHwzNXw0OXw5WzEtNjhdKXw0KD86WzE3XVxcXFxkfDJbMTc5XXxbMzVdWzEtOV18Nls0Ny05XXw4WzIzXSl8NSg/OlsxMzU3XVxcXFxkfDJbMzddfDRbMzZdfDZbMS00Nl18ODB8OVsxLTldKXw2KD86M1sxLTVdfDZbMDIzOF18OVsxMl0pfDcoPzowMXxbMTU3OV1cXFxcZHwyWzI0OF18M1swMTQtOV18NFszLTZdfDZbMDIzNjg5XSl8OCg/OjFbMjM2LThdfDJbNS03XXxbMzddXFxcXGR8NVsxLTldfDhbMzYtOF18OVsxLThdKXw5KD86MFsxLTM2ODldfDFbMS03OV18WzM3OV1cXFxcZHw0WzEzXXw1WzEtNV0pKVsxOV1cIixcIjg1WzIzXSg/OjEwfDk1KXwoPzozKD86WzE1N11cXFxcZHwzNXw0OXw5WzEtNjhdKXw0KD86WzE3XVxcXFxkfDJbMTc5XXxbMzVdWzEtOV18Nls0Ny05XXw4WzIzXSl8NSg/OlsxMzU3XVxcXFxkfDJbMzddfDRbMzZdfDZbMS00Nl18ODB8OVsxLTldKXw2KD86M1sxLTVdfDZbMDIzOF18OVsxMl0pfDcoPzowMXxbMTU3OV1cXFxcZHwyWzI0OF18M1swMTQtOV18NFszLTZdfDZbMDIzNjg5XSl8OCg/OjFbMjM2LThdfDJbNS03XXxbMzddXFxcXGR8NVsxNC05XXw4WzM2LThdfDlbMS04XSl8OSg/OjBbMS0zNjg5XXwxWzEtNzldfFszNzldXFxcXGR8NFsxM118NVsxLTVdKSkoPzoxMHw5WzU2XSlcIixcIjg1WzIzXSg/OjEwMHw5NSl8KD86Myg/OlsxNTddXFxcXGR8MzV8NDl8OVsxLTY4XSl8NCg/OlsxN11cXFxcZHwyWzE3OV18WzM1XVsxLTldfDZbNDctOV18OFsyM10pfDUoPzpbMTM1N11cXFxcZHwyWzM3XXw0WzM2XXw2WzEtNDZdfDgwfDlbMS05XSl8Nig/OjNbMS01XXw2WzAyMzhdfDlbMTJdKXw3KD86MDF8WzE1NzldXFxcXGR8MlsyNDhdfDNbMDE0LTldfDRbMy02XXw2WzAyMzY4OV0pfDgoPzoxWzIzNi04XXwyWzUtN118WzM3XVxcXFxkfDVbMTQtOV18OFszNi04XXw5WzEtOF0pfDkoPzowWzEtMzY4OV18MVsxLTc5XXxbMzc5XVxcXFxkfDRbMTNdfDVbMS01XSkpKD86MTAwfDlbNTZdKVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiKD86NHw4MCkwXCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiMTB8Mig/OlswMi01Ny05XXwxWzEtOV0pXCIsXCIxMHwyKD86WzAyLTU3LTldfDFbMS05XSlcIixcIjEwWzAtNzldfDIoPzpbMDItNTctOV18MVsxLTc5XSl8KD86MTB8MjEpOCg/OjBbMS05XXxbMS05XSlcIl0sXCIwJDFcIiwxXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiMyg/OlszLTU5XXw3WzAyLTY4XSl8NCg/OlsyNi04XXwzWzMtOV18NVsyLTldKXw1KD86M1swMy05XXxbNDY4XXw3WzAyOF18OVsyLTQ2LTldKXw2fDcoPzpbMC0yNDddfDNbMDQtOV18NVswLTQ2ODldfDZbMjM2OF0pfDgoPzpbMS0zNThdfDlbMS03XSl8OSg/OlswMTM0NzldfDVbMS01XSl8KD86WzM0XTF8NTV8Nzl8ODcpWzAyLTldXCJdLFwiMCQxXCIsMV0sW1wiKFxcXFxkezN9KShcXFxcZHs3LDh9KVwiLFwiJDEgJDJcIixbXCI5XCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiODBcIl0sXCIwJDFcIiwxXSxbXCIoXFxcXGR7M30pKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzMtNTc4XVwiXSxcIjAkMVwiLDFdLFtcIihcXFxcZHszfSkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIxWzMtOV1cIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzICQ0XCIsW1wiWzEyXVwiXSxcIjAkMVwiLDFdXSxcIjBcIiwwLFwiKDEoPzpbMTJdXFxcXGR8NzkpXFxcXGRcXFxcZCl8MFwiLDAsMCwwLDAsXCIwMFwiXSxcIkNPXCI6W1wiNTdcIixcIjAwKD86NCg/OlsxNF00fDU2KXxbNTc5XSlcIixcIig/OjYwXFxcXGRcXFxcZHw5MTAxKVxcXFxkezZ9fCg/OjFcXFxcZHwzKVxcXFxkezl9XCIsWzEwLDExXSxbW1wiKFxcXFxkezN9KShcXFxcZHs3fSlcIixcIiQxICQyXCIsW1wiNlwiXSxcIigkMSlcIl0sW1wiKFxcXFxkezN9KShcXFxcZHs3fSlcIixcIiQxICQyXCIsW1wiM1swLTM1N118OTFcIl1dLFtcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezd9KVwiLFwiJDEtJDItJDNcIixbXCIxXCJdLFwiMCQxXCIsMCxcIiQxICQyICQzXCJdXSxcIjBcIiwwLFwiMCg0KD86WzE0XTR8NTYpfFs1NzldKT9cIl0sXCJDUlwiOltcIjUwNlwiLFwiMDBcIixcIig/OjhcXFxcZHw5MClcXFxcZHs4fXwoPzpbMjQtOF1cXFxcZHszfXwzMDA1KVxcXFxkezR9XCIsWzgsMTBdLFtbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMi03XXw4WzMtOV1cIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEtJDItJDNcIixbXCJbODldXCJdXV0sMCwwLFwiKDE5KD86MFswLTI0NjhdfDFbMDldfDIwfDY2fDc3fDk5KSlcIl0sXCJDVVwiOltcIjUzXCIsXCIxMTlcIixcIlsyN11cXFxcZHs2LDd9fFszNF1cXFxcZHs1LDd9fCg/OjV8OFxcXFxkXFxcXGQpXFxcXGR7N31cIixbNiw3LDgsMTBdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezQsNn0pXCIsXCIkMSAkMlwiLFtcIjJbMS00XXxbMzRdXCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkKShcXFxcZHs2LDd9KVwiLFwiJDEgJDJcIixbXCI3XCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkKShcXFxcZHs3fSlcIixcIiQxICQyXCIsW1wiNVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezd9KVwiLFwiJDEgJDJcIixbXCI4XCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJDVlwiOltcIjIzOFwiLFwiMFwiLFwiKD86WzItNTldXFxcXGRcXFxcZHw4MDApXFxcXGR7NH1cIixbN10sW1tcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDNcIixbXCJbMi01ODldXCJdXV1dLFwiQ1dcIjpbXCI1OTlcIixcIjAwXCIsXCIoPzpbMzRdMXw2MHwoPzo3fDlcXFxcZClcXFxcZClcXFxcZHs1fVwiLFs3LDhdLFtbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMzQ2N11cIl1dLFtcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI5WzQtOF1cIl1dXSwwLDAsMCwwLDAsXCJbNjldXCJdLFwiQ1hcIjpbXCI2MVwiLFwiMDAxWzE0LTY4OV18MTQoPzoxWzE0XXwzNHw0WzE3XXxbNTZdNnw3WzQ3XXw4OCkwMDExXCIsXCIxKD86WzAtNzldXFxcXGR7OH0oPzpcXFxcZHsyfSk/fDhbMC0yNC05XVxcXFxkezd9KXxbMTQ4XVxcXFxkezh9fDFcXFxcZHs1LDd9XCIsWzYsNyw4LDksMTAsMTJdLDAsXCIwXCIsMCxcIihbNTldXFxcXGR7N30pJHwwXCIsXCI4JDFcIiwwLDAsW1tcIjgoPzo1MSg/OjAoPzowMXwzMHw1OXw4OCl8MSg/OjE3fDQ2fDc1KXwyKD86MjJ8MzUpKXw5MSg/OjAwWzYtOV18MSg/OlsyOF0xfDQ5fDc4KXwyKD86MDl8NjMpfDMoPzoxMnwyNnw3NSl8NCg/OjU2fDk3KXw2NFxcXFxkfDcoPzowWzAxXXwxWzAtMl0pfDk1OCkpXFxcXGR7M31cIixbOV1dLFtcIjQoPzo3OVswMV18ODNbMC0zODldfDkzWzAtNl0pXFxcXGR7NX18NCg/OlswLTNdXFxcXGR8NFswNDctOV18NVswLTI1LTldfDZbMDE2LTldfDdbMDItOF18OFswLTI0LTldfDlbMC0yNy05XSlcXFxcZHs2fVwiLFs5XV0sW1wiMTgwKD86MFxcXFxkezN9fDIpXFxcXGR7M31cIixbNywxMF1dLFtcIjE5MFswLTI2XVxcXFxkezZ9XCIsWzEwXV0sMCwwLDAsMCxbXCIxNCg/OjUoPzoxWzA0NThdfFsyM11bNDU4XSl8NzFcXFxcZClcXFxcZHs0fVwiLFs5XV0sW1wiMTMoPzowMFxcXFxkezZ9KD86XFxcXGR7Mn0pP3w0NVswLTRdXFxcXGR7M30pfDEzXFxcXGR7NH1cIixbNiw4LDEwLDEyXV1dLFwiMDAxMVwiXSxcIkNZXCI6W1wiMzU3XCIsXCIwMFwiLFwiKD86WzI3OV1cXFxcZHxbNThdMClcXFxcZHs2fVwiLFs4XSxbW1wiKFxcXFxkezJ9KShcXFxcZHs2fSlcIixcIiQxICQyXCIsW1wiWzI1Ny05XVwiXV1dXSxcIkNaXCI6W1wiNDIwXCIsXCIwMFwiLFwiKD86WzItNTc4XVxcXFxkfDYwKVxcXFxkezd9fDlcXFxcZHs4LDExfVwiLFs5XSxbW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIlsyLThdfDlbMDE1LTddXCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjk2XCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjlcIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzICQ0XCIsW1wiOVwiXV1dXSxcIkRFXCI6W1wiNDlcIixcIjAwXCIsXCJbMjU3OV1cXFxcZHs1LDE0fXw0OSg/OlszNF0wfDY5fDhcXFxcZClcXFxcZFxcXFxkP3w0OSg/OjM3fDQ5fDYwfDdbMDg5XXw5XFxcXGQpXFxcXGR7MSwzfXw0OSg/OjJbMDI0LTldfDNbMi02ODldfDdbMS03XSlcXFxcZHsxLDh9fCg/OjF8WzM2OF1cXFxcZHw0WzAtOF0pXFxcXGR7MywxM318NDkoPzpbMDE1XVxcXFxkfDJbMTNdfDMxfFs0Nl1bMS04XSlcXFxcZHsxLDl9XCIsWzQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1XSxbW1wiKFxcXFxkezJ9KShcXFxcZHszLDEzfSlcIixcIiQxICQyXCIsW1wiM1swMl18NDB8WzY4XTlcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszLDEyfSlcIixcIiQxICQyXCIsW1wiMig/OjBbMS0zODldfDFbMTI0XXwyWzE4XXwzWzE0XSl8Myg/OlszNS05XVsxNV18NFswMTVdKXw5MDZ8KD86Mls0LTldfDRbMi05XXxbNTc5XVsxLTldfFs2OF1bMS04XSkxXCIsXCIyKD86MFsxLTM4OV18MTJbMC04XSl8Myg/OlszNS05XVsxNV18NFswMTVdKXw5MDZ8Mig/OlsxM11bMTRdfDJbMThdKXwoPzoyWzQtOV18NFsyLTldfFs1NzldWzEtOV18WzY4XVsxLThdKTFcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZHsyLDExfSlcIixcIiQxICQyXCIsW1wiWzI0LTZdfDMoPzpbMzU2OV1bMDItNDYtOV18NFsyLTQ2NzldfDdbMi00NjddfDhbMi00Ni04XSl8NzBbMi04XXw4KD86MFsyLTldfFsxLThdKXw5MFs3LTldfFs3OV1bMS05XVwiLFwiWzI0LTZdfDMoPzozKD86MFsxLTQ2N118MlsxMjctOV18M1sxMjQ1NzhdfDdbMTI1Ny05XXw4WzEyNTZdfDlbMTQ1XSl8NCg/OjJbMTM1XXw0WzEzNTc4XXw5WzEzNDZdKXw1KD86MFsxNF18MlsxLTM1ODldfDZbMS00XXw3WzEzNDY4XXw4WzEzNTY4XSl8Nig/OjJbMS00ODldfDNbMTI0LTZdfDZbMTNdfDdbMTI1NzldfDhbMS0zNTZdfDlbMTM1XSl8Nyg/OjJbMS03XXw0WzE0NV18NlsxLTVdfDdbMS00XSl8OCg/OjIxfDNbMTQ2OF18Nnw3WzE0NjddfDhbMTM2XSl8OSg/OjBbMTI0NzldfDJbMTM1OF18NFsxMzQ2NzldfDZbMS05XXw3WzEzNl18OFsxNDddfDlbMTQ2OF0pKXw3MFsyLThdfDgoPzowWzItOV18WzEtOF0pfDkwWzctOV18Wzc5XVsxLTldfDNbNjhdNFsxMzQ3XXwzKD86NDd8NjApWzEzNTZdfDMoPzozWzQ2XXw0Nnw1WzQ5XSlbMTI0Nl18M1s0NTc5XTNbMTM1N11cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiMTM4XCJdLFwiMCQxXCJdLFtcIihcXFxcZHs1fSkoXFxcXGR7MiwxMH0pXCIsXCIkMSAkMlwiLFtcIjNcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHs1LDExfSlcIixcIiQxICQyXCIsW1wiMTgxXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGQpKFxcXFxkezQsMTB9KVwiLFwiJDEgJDIgJDNcIixbXCIxKD86M3w4MCl8OVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezcsOH0pXCIsXCIkMSAkMlwiLFtcIjFbNjddXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7NywxMn0pXCIsXCIkMSAkMlwiLFtcIjhcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezV9KShcXFxcZHs2fSlcIixcIiQxICQyXCIsW1wiMTg1XCIsXCIxODUwXCIsXCIxODUwMFwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiN1wiXSxcIjAkMVwiXSxbXCIoXFxcXGR7NH0pKFxcXFxkezd9KVwiLFwiJDEgJDJcIixbXCIxOFs2OF1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezV9KShcXFxcZHs2fSlcIixcIiQxICQyXCIsW1wiMTVbMDU2OF1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZHs3fSlcIixcIiQxICQyXCIsW1wiMTVbMTI3OV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHs4fSlcIixcIiQxICQyXCIsW1wiMThcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Nyw4fSlcIixcIiQxICQyICQzXCIsW1wiMSg/OjZbMDIzXXw3KVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7NH0pKFxcXFxkezJ9KShcXFxcZHs3fSlcIixcIiQxICQyICQzXCIsW1wiMTVbMjc5XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHs4fSlcIixcIiQxICQyICQzXCIsW1wiMTVcIl0sXCIwJDFcIl1dLFwiMFwiXSxcIkRKXCI6W1wiMjUzXCIsXCIwMFwiLFwiKD86MlxcXFxkfDc3KVxcXFxkezZ9XCIsWzhdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsyN11cIl1dXV0sXCJES1wiOltcIjQ1XCIsXCIwMFwiLFwiWzItOV1cXFxcZHs3fVwiLFs4XSxbW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbMi05XVwiXV1dXSxcIkRNXCI6W1wiMVwiLFwiMDExXCIsXCIoPzpbNThdXFxcXGRcXFxcZHw3Njd8OTAwKVxcXFxkezd9XCIsWzEwXSwwLFwiMVwiLDAsXCIoWzItN11cXFxcZHs2fSkkfDFcIixcIjc2NyQxXCIsMCxcIjc2N1wiXSxcIkRPXCI6W1wiMVwiLFwiMDExXCIsXCIoPzpbNThdXFxcXGRcXFxcZHw5MDApXFxcXGR7N31cIixbMTBdLDAsXCIxXCIsMCwwLDAsMCxcIjgwMDF8OFswMjRdOVwiXSxcIkRaXCI6W1wiMjEzXCIsXCIwMFwiLFwiKD86WzEtNF18WzUtNzldXFxcXGR8ODApXFxcXGR7N31cIixbOCw5XSxbW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbMS00XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjlcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbNS04XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiRUNcIjpbXCI1OTNcIixcIjAwXCIsXCIxXFxcXGR7OSwxMH18KD86WzItN118OVxcXFxkKVxcXFxkezd9XCIsWzgsOSwxMCwxMV0sW1tcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDItJDNcIixbXCJbMi03XVwiXSxcIigwJDEpXCIsMCxcIiQxLSQyLSQzXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI5XCJdLFwiMCQxXCJdLFtcIihcXFxcZHs0fSkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIjFcIl1dXSxcIjBcIl0sXCJFRVwiOltcIjM3MlwiLFwiMDBcIixcIjhcXFxcZHs5fXxbNDU3OF1cXFxcZHs3fXwoPzpbMy04XVxcXFxkfDkwKVxcXFxkezV9XCIsWzcsOCwxMF0sW1tcIihcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIlszNjldfDRbMy04XXw1KD86WzAtMl18NVswLTQ3OF18Nls0NV0pfDdbMS05XXw4OFwiLFwiWzM2OV18NFszLThdfDUoPzpbMDJdfDEoPzpbMC04XXw5NSl8NVswLTQ3OF18Nig/OjRbMC00XXw1WzEtNTg5XSkpfDdbMS05XXw4OFwiXV0sW1wiKFxcXFxkezR9KShcXFxcZHszLDR9KVwiLFwiJDEgJDJcIixbXCJbNDVdfDgoPzowMHxbMS00OV0pXCIsXCJbNDVdfDgoPzowMFsxLTldfFsxLTQ5XSlcIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI3XCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiOFwiXV1dXSxcIkVHXCI6W1wiMjBcIixcIjAwXCIsXCJbMTg5XVxcXFxkezgsOX18WzI0LTZdXFxcXGR7OH18WzEzNV1cXFxcZHs3fVwiLFs4LDksMTBdLFtbXCIoXFxcXGQpKFxcXFxkezcsOH0pXCIsXCIkMSAkMlwiLFtcIlsyM11cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs2LDd9KVwiLFwiJDEgJDJcIixbXCIxWzM1XXxbNC02XXw4WzI0NjhdfDlbMjM1LTddXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMTg5XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiRUhcIjpbXCIyMTJcIixcIjAwXCIsXCJbNS04XVxcXFxkezh9XCIsWzldLDAsXCIwXCIsMCwwLDAsMCxcIjUyOFs4OV1cIl0sXCJFUlwiOltcIjI5MVwiLFwiMDBcIixcIlsxNzhdXFxcXGR7Nn1cIixbN10sW1tcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbMTc4XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiRVNcIjpbXCIzNFwiLFwiMDBcIixcIls1LTldXFxcXGR7OH1cIixbOV0sW1tcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbODldMDBcIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiWzUtOV1cIl1dXV0sXCJFVFwiOltcIjI1MVwiLFwiMDBcIixcIig/OjExfFsyLTU3OV1cXFxcZClcXFxcZHs3fVwiLFs5XSxbW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsxLTU3OV1cIl0sXCIwJDFcIl1dLFwiMFwiXSxcIkZJXCI6W1wiMzU4XCIsXCIwMHw5OSg/OlswMTQ2OV18NSg/OlsxNF0xfDNbMjNdfDVbNTldfDc3fDg4fDlbMDldKSlcIixcIlsxLTM1Njg5XVxcXFxkezR9fDdcXFxcZHsxMCwxMX18KD86WzEyNC03XVxcXFxkfDNbMC00Ni05XSlcXFxcZHs4fXxbMS05XVxcXFxkezUsOH1cIixbNSw2LDcsOCw5LDEwLDExLDEyXSxbW1wiKFxcXFxkKShcXFxcZHs0LDl9KVwiLFwiJDEgJDJcIixbXCJbMjU2OF1bMS04XXwzKD86MFsxLTldfFsxLTldKXw5XCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Myw3fSlcIixcIiQxICQyXCIsW1wiWzEyXTAwfFszNjhdfDcwWzA3LTldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7NCw4fSlcIixcIiQxICQyXCIsW1wiWzEyNDVdfDdbMTM1XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezYsMTB9KVwiLFwiJDEgJDJcIixbXCI3XCJdLFwiMCQxXCJdXSxcIjBcIiwwLDAsMCwwLFwiMVswMy03OV18WzItOV1cIiwwLFwiMDBcIl0sXCJGSlwiOltcIjY3OVwiLFwiMCg/OjB8NTIpXCIsXCI0NVxcXFxkezV9fCg/OjA4MDBcXFxcZHxbMjM1LTldKVxcXFxkezZ9XCIsWzcsMTFdLFtbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMjM1LTldfDQ1XCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiMFwiXV1dLDAsMCwwLDAsMCwwLDAsXCIwMFwiXSxcIkZLXCI6W1wiNTAwXCIsXCIwMFwiLFwiWzItN11cXFxcZHs0fVwiLFs1XV0sXCJGTVwiOltcIjY5MVwiLFwiMDBcIixcIig/OlszOV1cXFxcZFxcXFxkfDgyMClcXFxcZHs0fVwiLFs3XSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiWzM4OV1cIl1dXV0sXCJGT1wiOltcIjI5OFwiLFwiMDBcIixcIlsyLTldXFxcXGR7NX1cIixbNl0sW1tcIihcXFxcZHs2fSlcIixcIiQxXCIsW1wiWzItOV1cIl1dXSwwLDAsXCIoMTAoPzowMXxbMTJdMHw4OCkpXCJdLFwiRlJcIjpbXCIzM1wiLFwiMDBcIixcIlsxLTldXFxcXGR7OH1cIixbOV0sW1tcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiOFwiXSxcIjAgJDFcIl0sW1wiKFxcXFxkKShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0ICQ1XCIsW1wiWzEtNzldXCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJHQVwiOltcIjI0MVwiLFwiMDBcIixcIig/OlswNjddXFxcXGR8MTEpXFxcXGR7Nn18WzItN11cXFxcZHs2fVwiLFs3LDhdLFtbXCIoXFxcXGQpKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsyLTddXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiMFwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCIxMXxbNjddXCJdLFwiMCQxXCJdXSwwLDAsXCIwKDExXFxcXGR7Nn18NjBcXFxcZHs2fXw2MVxcXFxkezZ9fDZbMjU2XVxcXFxkezZ9fDdbNDY3XVxcXFxkezZ9KVwiLFwiJDFcIl0sXCJHQlwiOltcIjQ0XCIsXCIwMFwiLFwiWzEtMzU3LTldXFxcXGR7OX18WzE4XVxcXFxkezh9fDhcXFxcZHs2fVwiLFs3LDksMTBdLFtbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCI4MDBcIixcIjgwMDFcIixcIjgwMDExXCIsXCI4MDAxMTFcIixcIjgwMDExMTFcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkM1wiLFtcIjg0NVwiLFwiODQ1NFwiLFwiODQ1NDZcIixcIjg0NTQ2NFwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezZ9KVwiLFwiJDEgJDJcIixbXCI4MDBcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezV9KShcXFxcZHs0LDV9KVwiLFwiJDEgJDJcIixbXCIxKD86Mzh8NVsyM118Njl8NzZ8OTQpXCIsXCIxKD86KD86Mzh8NjkpN3w1KD86MjR8MzkpfDc2OHw5NDYpXCIsXCIxKD86Mzg3M3w1KD86MjQyfDM5WzQtNl0pfCg/OjY5N3w3NjgpWzM0N118OTQ2NylcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZHs1LDZ9KVwiLFwiJDEgJDJcIixbXCIxKD86WzItNjldWzAyLTldfFs3OF0pXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMjVdfDcoPzowfDZbMDItOV0pXCIsXCJbMjVdfDcoPzowfDYoPzpbMDMtOV18MlszNTZdKSlcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZHs2fSlcIixcIiQxICQyXCIsW1wiN1wiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzEzODldXCJdLFwiMCQxXCJdXSxcIjBcIiwwLDAsMCwwLDAsW1tcIig/OjEoPzoxKD86Myg/OlswLTU4XVxcXFxkXFxcXGR8NzNbMDIzNV0pfDQoPzpbMC01XVxcXFxkXFxcXGR8NjlbNy05XXw3MFswLTU3OV0pfCg/Oig/OjVbMC0yNi05XXxbNzhdWzAtNDldKVxcXFxkfDYoPzpbMC00XVxcXFxkfDUwKSlcXFxcZCl8Mig/Oig/OjBbMDI0LTldfDJbMy05XXwzWzMtNzldfDRbMS02ODldfFs1OF1bMDItOV18NlswLTQ3LTldfDdbMDEzLTldfDlcXFxcZClcXFxcZFxcXFxkfDEoPzpbMC03XVxcXFxkXFxcXGR8OCg/OlswMl1cXFxcZHwxWzAtMjQ2LTldKSkpfCg/OjMoPzowXFxcXGR8MVswLThdfFsyNV1bMDItOV18M1swMi01NzldfFs0NjhdWzAtNDYtOV18N1sxLTM1LTc5XXw5WzItNTc4XSl8NCg/OjBbMDMtOV18WzEzN11cXFxcZHxbMjhdWzAyLTU3LTldfDRbMDItNjldfDVbMC04XXxbNjldWzAtNzldKXw1KD86MFsxLTM1LTldfFsxNl1cXFxcZHwyWzAyNC05XXwzWzAxNTY4OV18NFswMi05XXw1WzAzLTldfDdbMC0zNS05XXw4WzAtNDY4XXw5WzAtNTctOV0pfDYoPzowWzAzNDY4OV18MVxcXFxkfDJbMC0zNTY4OV18WzM4XVswMTMtOV18NFsxLTQ2N118NVswLTY5XXw2WzEzLTldfDdbMC04XXw5WzAtMjQ1NzhdKXw3KD86MFswMjQ2LTldfDJcXFxcZHwzWzAyMzYtOF18NFswMy05XXw1WzAtNDYtOV18NlswMTMtOV18N1swLTM1LTldfDhbMDI0LTldfDlbMDItOV0pfDgoPzowWzM1LTldfDJbMS01Ny05XXwzWzAyLTU3OF18NFswLTU3OF18NVsxMjQtOV18NlsyLTY5XXw3XFxcXGR8OFswMi05XXw5WzAyNTY5XSl8OSg/OjBbMDItNTg5XXxbMThdXFxcXGR8MlswMi02ODldfDNbMS01Ny05XXw0WzItOV18NVswLTU3OV18NlsyLTQ3LTldfDdbMC0yNDU3OF18OVsyLTU3XSkpXFxcXGRcXFxcZCl8Mig/OjBbMDEzNDc4XXwzWzAxODldfDRbMDE3XXw4WzAtNDYtOV18OVswLTJdKVxcXFxkezN9KVxcXFxkezR9fDEoPzoyKD86MCg/OjQ2WzEtNF18ODdbMi05XSl8NTQ1WzEtNzldfDc2KD86MlxcXFxkfDNbMS04XXw2WzEtNl0pfDkoPzo3KD86MlswLTRdfDNbMi01XSl8OCg/OjJbMi04XXw3WzAtNDctOV18OFszLTVdKSkpfDMoPzo2KD86MzhbMi01XXw0N1syM10pfDgoPzo0N1swNC05XXw2NFswMTU3LTldKSl8NCg/OjA0NFsxLTddfDIwKD86MlsyM118OFxcXFxkKXw2KD86MCg/OjMwfDVbMi01N118NlsxLThdfDdbMi04XSl8MTQwKXw4KD86MDUyfDg3WzEtM10pKXw1KD86Mig/OjQoPzozWzItNzldfDZcXFxcZCl8NzZcXFxcZCl8Nig/OjI2WzA2LTldfDY4NikpfDYoPzowNig/OjRcXFxcZHw3WzQtNzldKXwyOTVbNS03XXwzNVszNF1cXFxcZHw0Nyg/OjI0fDYxKXw1OSg/OjVbMDhdfDZbNjddfDc0KXw5KD86NTVbMC00XXw3N1syM10pKXw3KD86MjYoPzo2WzEzLTldfDdbMC03XSl8KD86NDQyfDY4OClcXFxcZHw1MCg/OjJbMC0zXXxbMy02OF0yfDc2KSl8OCg/OjI3WzU2XVxcXFxkfDM3KD86NVsyLTVdfDhbMjM5XSl8ODQzWzItNThdKXw5KD86MCg/OjAoPzo2WzEtOF18ODUpfDUyXFxcXGQpfDM1ODN8NCg/OjY2WzEtOF18OSg/OjJbMDFdfDgxKSl8NjMoPzoyM3wzWzEtNF0pfDk1NjEpKVxcXFxkezN9XCIsWzksMTBdXSxbXCI3KD86NDU3WzAtNTctOV18NzAwWzAxXXw5MTFbMDI4XSlcXFxcZHs1fXw3KD86WzEtM11cXFxcZFxcXFxkfDQoPzpbMC00Ni05XVxcXFxkfDVbMC02ODldKXw1KD86MFswLThdfFsxMy05XVxcXFxkfDJbMC0zNS05XSl8Nyg/OjBbMS05XXxbMS03XVxcXFxkfDhbMDItOV18OVswLTY4OV0pfDgoPzpbMDE0LTldXFxcXGR8WzIzXVswLThdKXw5KD86WzAyNC05XVxcXFxkfDFbMDItOV18M1swLTY4OV0pKVxcXFxkezZ9XCIsWzEwXV0sW1wiODBbMDhdXFxcXGR7N318ODAwXFxcXGR7Nn18ODAwMTExMVwiXSxbXCIoPzo4KD86NFsyLTVdfDdbMC0zXSl8OSg/OlswMV1cXFxcZHw4WzItNDldKSlcXFxcZHs3fXw4NDU0NjRcXFxcZFwiLFs3LDEwXV0sW1wiNzBcXFxcZHs4fVwiLFsxMF1dLDAsW1wiKD86M1swMzQ3XXw1NSlcXFxcZHs4fVwiLFsxMF1dLFtcIjc2KD86NDY0fDY1MilcXFxcZHs1fXw3Nig/OjBbMC0yOF18MlszNTZdfDM0fDRbMDEzNDddfDVbNDldfDZbMC0zNjldfDc3fDhbMTRdfDlbMTM5XSlcXFxcZHs2fVwiLFsxMF1dLFtcIjU2XFxcXGR7OH1cIixbMTBdXV0sMCxcIiB4XCJdLFwiR0RcIjpbXCIxXCIsXCIwMTFcIixcIig/OjQ3M3xbNThdXFxcXGRcXFxcZHw5MDApXFxcXGR7N31cIixbMTBdLDAsXCIxXCIsMCxcIihbMi05XVxcXFxkezZ9KSR8MVwiLFwiNDczJDFcIiwwLFwiNDczXCJdLFwiR0VcIjpbXCI5OTVcIixcIjAwXCIsXCIoPzpbMy01N11cXFxcZFxcXFxkfDgwMClcXFxcZHs2fVwiLFs5XSxbW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjcwXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiMzJcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbNTddXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlszNDhdXCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJHRlwiOltcIjU5NFwiLFwiMDBcIixcIls1Nl05NFxcXFxkezZ9fCg/OjgwfDlcXFxcZClcXFxcZHs3fVwiLFs5XSxbW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbNTZdfDlbNDddXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiWzg5XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiR0dcIjpbXCI0NFwiLFwiMDBcIixcIig/OjE0ODF8WzM1Ny05XVxcXFxkezN9KVxcXFxkezZ9fDhcXFxcZHs2fSg/OlxcXFxkezJ9KT9cIixbNyw5LDEwXSwwLFwiMFwiLDAsXCIoWzI1LTldXFxcXGR7NX0pJHwwXCIsXCIxNDgxJDFcIiwwLDAsW1tcIjE0ODFbMjUtOV1cXFxcZHs1fVwiLFsxMF1dLFtcIjcoPzooPzo3ODF8ODM5KVxcXFxkfDkxMVsxN10pXFxcXGR7NX1cIixbMTBdXSxbXCI4MFswOF1cXFxcZHs3fXw4MDBcXFxcZHs2fXw4MDAxMTExXCJdLFtcIig/OjgoPzo0WzItNV18N1swLTNdKXw5KD86WzAxXVxcXFxkfDhbMC0zXSkpXFxcXGR7N318ODQ1NDY0XFxcXGRcIixbNywxMF1dLFtcIjcwXFxcXGR7OH1cIixbMTBdXSwwLFtcIig/OjNbMDM0N118NTUpXFxcXGR7OH1cIixbMTBdXSxbXCI3Nig/OjQ2NHw2NTIpXFxcXGR7NX18NzYoPzowWzAtMjhdfDJbMzU2XXwzNHw0WzAxMzQ3XXw1WzQ5XXw2WzAtMzY5XXw3N3w4WzE0XXw5WzEzOV0pXFxcXGR7Nn1cIixbMTBdXSxbXCI1NlxcXFxkezh9XCIsWzEwXV1dXSxcIkdIXCI6W1wiMjMzXCIsXCIwMFwiLFwiKD86WzIzNV1cXFxcZHszfXw4MDApXFxcXGR7NX1cIixbOCw5XSxbW1wiKFxcXFxkezN9KShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiOFwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzIzNV1cIl0sXCIwJDFcIl1dLFwiMFwiXSxcIkdJXCI6W1wiMzUwXCIsXCIwMFwiLFwiKD86WzI1XVxcXFxkfDYwKVxcXFxkezZ9XCIsWzhdLFtbXCIoXFxcXGR7M30pKFxcXFxkezV9KVwiLFwiJDEgJDJcIixbXCIyXCJdXV1dLFwiR0xcIjpbXCIyOTlcIixcIjAwXCIsXCIoPzoxOXxbMi02ODldXFxcXGR8NzApXFxcXGR7NH1cIixbNl0sW1tcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDNcIixbXCIxOXxbMi05XVwiXV1dXSxcIkdNXCI6W1wiMjIwXCIsXCIwMFwiLFwiWzItOV1cXFxcZHs2fVwiLFs3XSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiWzItOV1cIl1dXV0sXCJHTlwiOltcIjIyNFwiLFwiMDBcIixcIjcyMlxcXFxkezZ9fCg/OjN8NlxcXFxkKVxcXFxkezd9XCIsWzgsOV0sW1tcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiM1wiXV0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbNjddXCJdXV1dLFwiR1BcIjpbXCI1OTBcIixcIjAwXCIsXCI1OTBcXFxcZHs2fXwoPzo2OXw4MHw5XFxcXGQpXFxcXGR7N31cIixbOV0sW1tcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiWzU2OV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCI4XCJdLFwiMCQxXCJdXSxcIjBcIiwwLDAsMCwwLDAsW1tcIjU5MCg/OjBbMS02OF18WzE0XVswLTI0LTldfDJbMC02OF18M1sxMjg5XXw1WzMtNTc5XXxbNjhdWzAtNjg5XXw3WzA4XXw5XFxcXGQpXFxcXGR7NH1cIl0sW1wiNjkoPzowXFxcXGRcXFxcZHwxKD86MlsyLTldfDNbMC01XSkpXFxcXGR7NH1cIl0sW1wiODBbMC01XVxcXFxkezZ9XCJdLDAsMCwwLDAsMCxbXCI5KD86KD86Mzk1fDc2WzAxOF0pXFxcXGR8NDc1WzAxXSlcXFxcZHs0fVwiXV1dLFwiR1FcIjpbXCIyNDBcIixcIjAwXCIsXCIyMjJcXFxcZHs2fXwoPzozXFxcXGR8NTV8Wzg5XTApXFxcXGR7N31cIixbOV0sW1tcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbMjM1XVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHs2fSlcIixcIiQxICQyXCIsW1wiWzg5XVwiXV1dXSxcIkdSXCI6W1wiMzBcIixcIjAwXCIsXCI1MDA1MDAwXFxcXGR7M318OFxcXFxkezksMTF9fCg/OlsyNjldXFxcXGR8NzApXFxcXGR7OH1cIixbMTAsMTEsMTJdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiMjF8N1wiXV0sW1wiKFxcXFxkezR9KShcXFxcZHs2fSlcIixcIiQxICQyXCIsW1wiMig/OjJ8M1syLTU3LTldfDRbMi00NjldfDVbMi01OV18NlsyLTldfDdbMi02OV18OFsyLTQ5XSl8NVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsyNjg5XVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHszLDR9KShcXFxcZHs1fSlcIixcIiQxICQyICQzXCIsW1wiOFwiXV1dXSxcIkdUXCI6W1wiNTAyXCIsXCIwMFwiLFwiKD86MVxcXFxkezN9fFsyLTddKVxcXFxkezd9XCIsWzgsMTFdLFtbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMi03XVwiXV0sW1wiKFxcXFxkezR9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjFcIl1dXV0sXCJHVVwiOltcIjFcIixcIjAxMVwiLFwiKD86WzU4XVxcXFxkXFxcXGR8NjcxfDkwMClcXFxcZHs3fVwiLFsxMF0sMCxcIjFcIiwwLFwiKFszLTldXFxcXGR7Nn0pJHwxXCIsXCI2NzEkMVwiLDAsXCI2NzFcIl0sXCJHV1wiOltcIjI0NVwiLFwiMDBcIixcIls0OV1cXFxcZHs4fXw0XFxcXGR7Nn1cIixbNyw5XSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiNDBcIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbNDldXCJdXV1dLFwiR1lcIjpbXCI1OTJcIixcIjAwMVwiLFwiOTAwOFxcXFxkezN9fCg/OlsyLTQ2N11cXFxcZFxcXFxkfDg2MilcXFxcZHs0fVwiLFs3XSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiWzItNDYtOV1cIl1dXV0sXCJIS1wiOltcIjg1MlwiLFwiMDAoPzozMHw1WzA5XXxbMTI2LTldPylcIixcIjhbMC00Ni05XVxcXFxkezYsN318OVxcXFxkezQsN318KD86WzItN118OVxcXFxkezN9KVxcXFxkezd9XCIsWzUsNiw3LDgsOSwxMV0sW1tcIihcXFxcZHszfSkoXFxcXGR7Miw1fSlcIixcIiQxICQyXCIsW1wiOTAwXCIsXCI5MDAzXCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMi03XXw4WzEtNF18OSg/OjBbMS05XXxbMS04XSlcIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCI4XCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjlcIl1dXSwwLDAsMCwwLDAsMCwwLFwiMDBcIl0sXCJITlwiOltcIjUwNFwiLFwiMDBcIixcIjhcXFxcZHsxMH18WzIzNy05XVxcXFxkezd9XCIsWzgsMTFdLFtbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEtJDJcIixbXCJbMjM3LTldXCJdXV1dLFwiSFJcIjpbXCIzODVcIixcIjAwXCIsXCIoPzpbMjQtNjldXFxcXGR8M1swLTc5XSlcXFxcZHs3fXw4MFxcXFxkezUsN318WzEtNzldXFxcXGR7N318NlxcXFxkezUsNn1cIixbNiw3LDgsOV0sW1tcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezIsM30pXCIsXCIkMSAkMiAkM1wiLFtcIjZbMDFdXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezIsM30pXCIsXCIkMSAkMiAkM1wiLFtcIjhcIl0sXCIwJDFcIl0sW1wiKFxcXFxkKShcXFxcZHs0fSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjFcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Myw0fSlcIixcIiQxICQyICQzXCIsW1wiWzY3XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCI5XCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsyLTVdXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCI4XCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJIVFwiOltcIjUwOVwiLFwiMDBcIixcIig/OlsyLTQ4OV1cXFxcZHw1NSlcXFxcZHs2fVwiLFs4XSxbW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsyLTU4OV1cIl1dXV0sXCJIVVwiOltcIjM2XCIsXCIwMFwiLFwiWzIzNS03XVxcXFxkezh9fFsxLTldXFxcXGR7N31cIixbOCw5XSxbW1wiKFxcXFxkKShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjFcIl0sXCIoMDYgJDEpXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbMjddWzItOV18M1syLTddfDRbMjQtOV18NVsyLTc5XXw2fDhbMi01Ny05XXw5WzItNjldXCJdLFwiKDA2ICQxKVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMi05XVwiXSxcIjA2ICQxXCJdXSxcIjA2XCJdLFwiSURcIjpbXCI2MlwiLFwiMDBbODldXCIsXCIoPzooPzowMFsxLTldfDhcXFxcZClcXFxcZHs0fXxbMS0zNl0pXFxcXGR7Nn18MDBcXFxcZHsxMH18WzEtOV1cXFxcZHs4LDEwfXxbMi05XVxcXFxkezd9XCIsWzcsOCw5LDEwLDExLDEyLDEzXSxbW1wiKFxcXFxkKShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjE1XCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezUsOX0pXCIsXCIkMSAkMlwiLFtcIjJbMTI0XXxbMzZdMVwiXSxcIigwJDEpXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7NSw3fSlcIixcIiQxICQyXCIsW1wiODAwXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7NSw4fSlcIixcIiQxICQyXCIsW1wiWzItNzldXCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszLDR9KShcXFxcZHszfSlcIixcIiQxLSQyLSQzXCIsW1wiOFsxLTM1LTldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Niw4fSlcIixcIiQxICQyXCIsW1wiMVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiODA0XCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGQpKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzICQ0XCIsW1wiODBcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHs0fSkoXFxcXGR7NCw1fSlcIixcIiQxLSQyLSQzXCIsW1wiOFwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiSUVcIjpbXCIzNTNcIixcIjAwXCIsXCIoPzoxXFxcXGR8WzI1NjldKVxcXFxkezYsOH18NFxcXFxkezYsOX18N1xcXFxkezh9fDhcXFxcZHs4LDl9XCIsWzcsOCw5LDEwXSxbW1wiKFxcXFxkezJ9KShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiMlsyNC05XXw0N3w1OHw2WzIzNy05XXw5WzM1LTldXCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezN9KShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiWzQ1XTBcIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGQpKFxcXFxkezMsNH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIxXCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Myw0fSlcIixcIiQxICQyICQzXCIsW1wiWzI1NjldfDRbMS02OV18N1sxNF1cIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiNzBcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjgxXCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIls3OF1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjFcIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI0XCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezJ9KShcXFxcZCkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCI4XCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJJTFwiOltcIjk3MlwiLFwiMCg/OjB8MVsyLTldKVwiLFwiMVxcXFxkezZ9KD86XFxcXGR7Myw1fSk/fFs1N11cXFxcZHs4fXxbMS00ODldXFxcXGR7N31cIixbNyw4LDksMTAsMTEsMTJdLFtbXCIoXFxcXGR7NH0pKFxcXFxkezN9KVwiLFwiJDEtJDJcIixbXCIxMjVcIl1dLFtcIihcXFxcZHs0fSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEtJDItJDNcIixbXCIxMjFcIl1dLFtcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEtJDItJDNcIixbXCJbMi00ODldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEtJDItJDNcIixbXCJbNTddXCJdLFwiMCQxXCJdLFtcIihcXFxcZHs0fSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEtJDItJDNcIixbXCIxMlwiXV0sW1wiKFxcXFxkezR9KShcXFxcZHs2fSlcIixcIiQxLSQyXCIsW1wiMTU5XCJdXSxbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMS0kMi0kMy0kNFwiLFtcIjFbNy05XVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHsxLDJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMS0kMiAkMy0kNFwiLFtcIjE1XCJdXV0sXCIwXCJdLFwiSU1cIjpbXCI0NFwiLFwiMDBcIixcIjE2MjRcXFxcZHs2fXwoPzpbMzU3OF1cXFxcZHw5MClcXFxcZHs4fVwiLFsxMF0sMCxcIjBcIiwwLFwiKFsyNS04XVxcXFxkezV9KSR8MFwiLFwiMTYyNCQxXCIsMCxcIjc0NTc2fCg/OjE2fDdbNTZdKTI0XCJdLFwiSU5cIjpbXCI5MVwiLFwiMDBcIixcIig/OjAwMDgwMHxbMi05XVxcXFxkXFxcXGQpXFxcXGR7N318MVxcXFxkezcsMTJ9XCIsWzgsOSwxMCwxMSwxMiwxM10sW1tcIihcXFxcZHs4fSlcIixcIiQxXCIsW1wiNSg/OjB8MlsyM118M1swM118WzY3XTF8ODgpXCIsXCI1KD86MHwyKD86MjF8Myl8Myg/OjB8M1syM10pfDYxNnw3MTd8ODg4KVwiLFwiNSg/OjB8Mig/OjIxfDMpfDMoPzowfDNbMjNdKXw2MTZ8NzE3fDg4ODgpXCJdLDAsMV0sW1wiKFxcXFxkezR9KShcXFxcZHs0LDV9KVwiLFwiJDEgJDJcIixbXCIxODBcIixcIjE4MDBcIl0sMCwxXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiMTQwXCJdLDAsMV0sW1wiKFxcXFxkezJ9KShcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjExfDJbMDJdfDMzfDRbMDRdfDc5WzEtN118ODBbMi00Nl1cIixcIjExfDJbMDJdfDMzfDRbMDRdfDc5KD86WzEtNl18N1sxOV0pfDgwKD86WzItNF18NlswLTU4OV0pXCIsXCIxMXwyWzAyXXwzM3w0WzA0XXw3OSg/OlsxMjQtNl18Myg/OlswMi05XXwxWzAtMjQtOV0pfDcoPzoxfDlbMS02XSkpfDgwKD86WzItNF18NlswLTU4OV0pXCJdLFwiMCQxXCIsMV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjEoPzoyWzAtMjQ5XXwzWzAtMjVdfDRbMTQ1XXxbNjhdfDdbMTI1N10pfDIoPzoxWzI1N118M1swMTNdfDRbMDFdfDVbMDEzN118NlswMTU4XXw3OHw4WzE1NjhdKXwzKD86MjZ8NFsxLTNdfDVbMzRdfDZbMDE0ODldfDdbMDItNDZdfDhbMTU5XSl8NCg/OjFbMzZdfDJbMS00N118NVsxMl18NlswLTI2LTldfDdbMC0yNC05XXw4WzAxMy01N118OVswMTQtN10pfDUoPzoxWzAyNV18MjJ8WzM2XVsyNV18NFsyOF18NVsxMl18Wzc4XTEpfDYoPzoxMnxbMi00XTF8NVsxN118NlsxM118ODApfDcoPzoxMnwzWzEzNF18NFs0N118NjF8ODgpfDgoPzoxNnwyWzAxNF18M1sxMjZdfDZbMTM2XXw3WzA3OF18OFszNF18OTEpfCg/OjQzfDU5fDc1KVsxNV18KD86MVs1OV18Mjl8Njd8NzIpWzE0XVwiLFwiMSg/OjJbMC0yNF18M1swLTI1XXw0WzE0NV18WzU5XVsxNF18NlsxLTldfDdbMTI1N118OFsxLTU3LTldKXwyKD86MVsyNTddfDNbMDEzXXw0WzAxXXw1WzAxMzddfDZbMDU4XXw3OHw4WzE1NjhdfDlbMTRdKXwzKD86MjZ8NFsxLTNdfDVbMzRdfDZbMDE0ODldfDdbMDItNDZdfDhbMTU5XSl8NCg/OjFbMzZdfDJbMS00N118M1sxNV18NVsxMl18NlswLTI2LTldfDdbMC0yNC05XXw4WzAxMy01N118OVswMTQtN10pfDUoPzoxWzAyNV18MjJ8WzM2XVsyNV18NFsyOF18WzU3OF0xfDlbMTVdKXw2NzR8Nyg/Oig/OjJbMTRdfDNbMzRdfDVbMTVdKVsyLTZdfDYxWzM0Nl18ODhbMC04XSl8OCg/OjcwWzItNl18ODRbMjM1LTddfDkxWzMtN10pfCg/OjEoPzoyOXw2MHw4WzA2XSl8MjYxfDU1Mnw2KD86MTJ8WzItNDddMXw1WzE3XXw2WzEzXXw4MCl8Nyg/OjEyfDMxfDRbNDddKXw4KD86MTZ8MlswMTRdfDNbMTI2XXw2WzEzNl18N1s3OF18ODMpKVsyLTddXCIsXCIxKD86MlswLTI0XXwzWzAtMjVdfDRbMTQ1XXxbNTldWzE0XXw2WzEtOV18N1sxMjU3XXw4WzEtNTctOV0pfDIoPzoxWzI1N118M1swMTNdfDRbMDFdfDVbMDEzN118NlswNThdfDc4fDhbMTU2OF18OVsxNF0pfDMoPzoyNnw0WzEtM118NVszNF18NlswMTQ4OV18N1swMi00Nl18OFsxNTldKXw0KD86MVszNl18MlsxLTQ3XXwzWzE1XXw1WzEyXXw2WzAtMjYtOV18N1swLTI0LTldfDhbMDEzLTU3XXw5WzAxNC03XSl8NSg/OjFbMDI1XXwyMnxbMzZdWzI1XXw0WzI4XXxbNTc4XTF8OVsxNV0pfDYoPzoxMig/OlsyLTZdfDdbMC04XSl8NzRbMi03XSl8Nyg/Oig/OjJbMTRdfDVbMTVdKVsyLTZdfDMxNzF8NjFbMzQ2XXw4OCg/OlsyLTddfDgyKSl8OCg/OjcwWzItNl18ODQoPzpbMjM1Nl18N1sxOV0pfDkxKD86WzMtNl18N1sxOV0pKXw3M1sxMzRdWzItNl18KD86NzRbNDddfDgoPzoxNnwyWzAxNF18M1sxMjZdfDZbMTM2XXw3Wzc4XXw4MykpKD86WzItNl18N1sxOV0pfCg/OjEoPzoyOXw2MHw4WzA2XSl8MjYxfDU1Mnw2KD86WzItNF0xfDVbMTddfDZbMTNdfDcoPzoxfDRbMDE4OV0pfDgwKXw3KD86MTJ8ODhbMDFdKSlbMi03XVwiXSxcIjAkMVwiLDFdLFtcIihcXFxcZHs0fSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCIxKD86WzItNDc5XXw1WzAyMzUtOV0pfFsyLTVdfDYoPzoxWzEzNThdfDJbMjQ1Ny05XXwzWzItNV18NFsyMzUtN118NVsyLTY4OV18NlsyNDU3OF18N1syMzU2ODldfDhbMS02XSl8Nyg/OjFbMDEzLTldfDI4fDNbMTI5XXw0WzEtMzU2ODldfDVbMjldfDZbMDItNV18NzApfDgwN1wiLFwiMSg/OlsyLTQ3OV18NVswMjM1LTldKXxbMi01XXw2KD86MVsxMzU4XXwyKD86WzI0NTddfDg0fDk1KXwzKD86WzItNF18NTUpfDRbMjM1LTddfDVbMi02ODldfDZbMjQ1NzhdfDdbMjM1Njg5XXw4WzEtNl0pfDcoPzoxKD86WzAxMy04XXw5WzYtOV0pfDI4WzYtOF18Myg/OjE3fDJbMC00OV18OVsyLTU3XSl8NCg/OjFbMi00XXxbMjldWzAtN118M1swLThdfFs1Nl18OFswLTI0LTddKXw1KD86MlsxLTNdfDlbMC02XSl8Nig/OjBbNTY4OV18Mls1LTldfDNbMDItOF18NHw1WzAtMzY3XSl8NzBbMTMtN10pfDgwN1sxOV1cIixcIjEoPzpbMi00NzldfDUoPzpbMDIzNi05XXw1WzAxMy05XSkpfFsyLTVdfDYoPzoyKD86ODR8OTUpfDM1NXw4Myl8NzMxNzl8ODA3KD86MXw5WzEtM10pfCg/OjE1NTJ8Nig/OjFbMTM1OF18MlsyNDU3XXwzWzItNF18NFsyMzUtN118NVsyLTY4OV18NlsyNDU3OF18N1syMzU2ODldfDhbMTI0LTZdKVxcXFxkfDcoPzoxKD86WzAxMy04XVxcXFxkfDlbNi05XSl8MjhbNi04XXwzKD86MlswLTQ5XXw5WzItNTddKXw0KD86MVsyLTRdfFsyOV1bMC03XXwzWzAtOF18WzU2XVxcXFxkfDhbMC0yNC03XSl8NSg/OjJbMS0zXXw5WzAtNl0pfDYoPzowWzU2ODldfDJbNS05XXwzWzAyLThdfDRcXFxcZHw1WzAtMzY3XSl8NzBbMTMtN10pKVsyLTddXCJdLFwiMCQxXCIsMV0sW1wiKFxcXFxkezV9KShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiWzYtOV1cIl0sXCIwJDFcIiwxXSxbXCIoXFxcXGR7NH0pKFxcXFxkezIsNH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIxKD86Nnw4WzA2XSlcIixcIjEoPzo2fDhbMDZdMClcIl0sMCwxXSxbXCIoXFxcXGR7NH0pKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjE4XCJdLDAsMV1dLFwiMFwiXSxcIklPXCI6W1wiMjQ2XCIsXCIwMFwiLFwiM1xcXFxkezZ9XCIsWzddLFtbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCIzXCJdXV1dLFwiSVFcIjpbXCI5NjRcIixcIjAwXCIsXCIoPzoxfDdcXFxcZFxcXFxkKVxcXFxkezd9fFsyLTZdXFxcXGR7Nyw4fVwiLFs4LDksMTBdLFtbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiMVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMi02XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiN1wiXSxcIjAkMVwiXV0sXCIwXCJdLFwiSVJcIjpbXCI5OFwiLFwiMDBcIixcIlsxLTldXFxcXGR7OX18KD86WzEtOF1cXFxcZFxcXFxkfDkpXFxcXGR7Myw0fVwiLFs0LDUsNiw3LDEwXSxbW1wiKFxcXFxkezQsNX0pXCIsXCIkMVwiLFtcIjk2XCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7NCw1fSlcIixcIiQxICQyXCIsW1wiKD86MVsxMzddfDJbMTMtNjhdfDNbMTQ1OF18NFsxNDVdfDVbMTQ2OF18NlsxNl18N1sxNDY3XXw4WzEzNDY3XSlbMTI2ODldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIjlcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsxLThdXCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJJU1wiOltcIjM1NFwiLFwiMDB8MSg/OjAoPzowMXxbMTJdMCl8MTAwKVwiLFwiKD86MzhcXFxcZHxbNC05XSlcXFxcZHs2fVwiLFs3LDldLFtbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbNC05XVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjNcIl1dXSwwLDAsMCwwLDAsMCwwLFwiMDBcIl0sXCJJVFwiOltcIjM5XCIsXCIwMFwiLFwiMFxcXFxkezUsMTB9fDFcXFxcZHs4LDEwfXwzKD86WzAtOF1cXFxcZHs3LDEwfXw5XFxcXGR7Nyw4fSl8KD86NTV8NzApXFxcXGR7OH18OFxcXFxkezV9KD86XFxcXGR7Miw0fSk/XCIsWzYsNyw4LDksMTAsMTFdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezQsNn0pXCIsXCIkMSAkMlwiLFtcIjBbMjZdXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezMsNn0pXCIsXCIkMSAkMlwiLFtcIjBbMTMtNTctOV1bMDE1OV18OCg/OjAzfDRbMTddfDlbMi01XSlcIixcIjBbMTMtNTctOV1bMDE1OV18OCg/OjAzfDRbMTddfDkoPzoyfDNbMDRdfFs0NV1bMC00XSkpXCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezIsNn0pXCIsXCIkMSAkMlwiLFtcIjAoPzpbMTMtNTc5XVsyLTQ2LThdfDhbMjM2LThdKVwiXV0sW1wiKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiODk0XCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezMsNH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIwWzI2XXw1XCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCIxKD86NDR8WzY3OV0pfFszNzhdXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezMsNH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIwWzEzLTU3LTldWzAxNTldfDE0XCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezR9KShcXFxcZHs1fSlcIixcIiQxICQyICQzXCIsW1wiMFsyNl1cIl1dLFtcIihcXFxcZHs0fSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIwXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezR9KShcXFxcZHs0LDV9KVwiLFwiJDEgJDIgJDNcIixbXCIzXCJdXV0sMCwwLDAsMCwwLDAsW1tcIjA2NjlbMC03OV1cXFxcZHsxLDZ9fDAoPzoxKD86WzAxNTldXFxcXGR8WzI3XVsxLTVdfDMxfDRbMS00XXw2WzEzNTZdfDhbMi01N10pfDJcXFxcZFxcXFxkfDMoPzpbMDE1OV1cXFxcZHwyWzEtNF18M1sxMl18WzQ4XVsxLTZdfDZbMi01OV18N1sxLTddKXw0KD86WzAxNTldXFxcXGR8WzIzXVsxLTldfDRbMjQ1XXw2WzEtNV18N1sxLTRdfDgxKXw1KD86WzAxNTldXFxcXGR8MlsxLTVdfDNbMi02XXw0WzEtNzldfDZbNC02XXw3WzEtNTc4XXw4WzMtOF0pfDYoPzpbMC01Ny05XVxcXFxkfDZbMC04XSl8Nyg/OlswMTU5XVxcXFxkfDJbMTJdfDNbMS03XXw0WzItNDZdfDZbMTM1NjldfDdbMTMtNl18OFsxLTU5XSl8OCg/OlswMTU5XVxcXFxkfDJbMy01NzhdfDNbMS0zNTZdfFs2LThdWzEtNV0pfDkoPzpbMDE1OV1cXFxcZHxbMjM4XVsxLTVdfDRbMTJdfDZbMS04XXw3WzEtNl0pKVxcXFxkezIsN31cIl0sW1wiM1sxLTldXFxcXGR7OH18M1syLTldXFxcXGR7N31cIixbOSwxMF1dLFtcIjgwKD86MFxcXFxkezN9fDMpXFxcXGR7M31cIixbNiw5XV0sW1wiKD86MDg3OFxcXFxkezN9fDg5KD86MlxcXFxkfDNbMDRdfDQoPzpbMC00XXxbNS05XVxcXFxkXFxcXGQpfDVbMC00XSkpXFxcXGRcXFxcZHwoPzoxKD86NDR8NlszNDZdKXw4OSg/OjM4fDVbNS05XXw5KSlcXFxcZHs2fVwiLFs2LDgsOSwxMF1dLFtcIjEoPzo3OFxcXFxkfDk5KVxcXFxkezZ9XCIsWzksMTBdXSwwLDAsMCxbXCI1NVxcXFxkezh9XCIsWzEwXV0sW1wiODQoPzpbMDhdXFxcXGR7M318WzE3XSlcXFxcZHszfVwiLFs2LDldXV1dLFwiSkVcIjpbXCI0NFwiLFwiMDBcIixcIjE1MzRcXFxcZHs2fXwoPzpbMzU3OF1cXFxcZHw5MClcXFxcZHs4fVwiLFsxMF0sMCxcIjBcIiwwLFwiKFswLTI0LThdXFxcXGR7NX0pJHwwXCIsXCIxNTM0JDFcIiwwLDAsW1tcIjE1MzRbMC0yNC04XVxcXFxkezV9XCJdLFtcIjcoPzooPzooPzo1MHw4Mik5fDkzNylcXFxcZHw3KD86MDBbMzc4XXw5N1s3LTldKSlcXFxcZHs1fVwiXSxbXCI4MCg/OjA3KD86MzV8ODEpfDg5MDEpXFxcXGR7NH1cIl0sW1wiKD86OCg/OjQoPzo0KD86NCg/OjA1fDQyfDY5KXw3MDMpfDUoPzowNDF8ODAwKSl8Nyg/OjAwMDJ8MTIwNikpfDkwKD86MDY2WzU5XXwxODEwfDcxKD86MDd8NTUpKSlcXFxcZHs0fVwiXSxbXCI3MDE1MTFcXFxcZHs0fVwiXSwwLFtcIig/OjMoPzowKD86MDcoPzozNXw4MSl8ODkwMSl8M1xcXFxkezR9fDQoPzo0KD86NCg/OjA1fDQyfDY5KXw3MDMpfDUoPzowNDF8ODAwKSl8Nyg/OjAwMDJ8MTIwNikpfDU1XFxcXGR7NH0pXFxcXGR7NH1cIl0sW1wiNzYoPzo0NjR8NjUyKVxcXFxkezV9fDc2KD86MFswLTI4XXwyWzM1Nl18MzR8NFswMTM0N118NVs0OV18NlswLTM2OV18Nzd8OFsxNF18OVsxMzldKVxcXFxkezZ9XCJdLFtcIjU2XFxcXGR7OH1cIl1dXSxcIkpNXCI6W1wiMVwiLFwiMDExXCIsXCIoPzpbNThdXFxcXGRcXFxcZHw2NTh8OTAwKVxcXFxkezd9XCIsWzEwXSwwLFwiMVwiLDAsMCwwLDAsXCI2NTh8ODc2XCJdLFwiSk9cIjpbXCI5NjJcIixcIjAwXCIsXCIoPzooPzpbMjY4OV18N1xcXFxkKVxcXFxkfDMyfDUzKVxcXFxkezZ9XCIsWzgsOV0sW1tcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMjM1Nl18ODdcIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezUsNn0pXCIsXCIkMSAkMlwiLFtcIls4OV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs3fSlcIixcIiQxICQyXCIsW1wiNzBcIl0sXCIwJDFcIl0sW1wiKFxcXFxkKShcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjdcIl0sXCIwJDFcIl1dLFwiMFwiXSxcIkpQXCI6W1wiODFcIixcIjAxMFwiLFwiMDBbMS05XVxcXFxkezYsMTR9fFsyNTctOV1cXFxcZHs5fXwoPzowMHxbMS05XVxcXFxkXFxcXGQpXFxcXGR7Nn1cIixbOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3XSxbW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMS0kMi0kM1wiLFtcIig/OjEyfDU3fDk5KTBcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZCkoXFxcXGR7NH0pXCIsXCIkMS0kMi0kM1wiLFtcIjEoPzoyNnwzWzc5XXw0WzU2XXw1WzQtNjhdfDZbMy01XSl8NDk5fDUoPzo3Nnw5Nyl8NzQ2fDgoPzozWzg5XXw0N3w1MXw2Myl8OSg/OjgwfDlbMTZdKVwiLFwiMSg/OjI2N3wzKD86N1syNDddfDlbMjc4XSl8NDY2fDUoPzo0N3w1OHw2NCl8Nig/OjNbMjQ1XXw0OHw1WzQtNjhdKSl8NDk5WzI0NjhdfDUoPzo3Nnw5Nyk5fDc0Njh8OCg/OjMoPzo4WzctOV18OTYpfDQ3N3w1MVsyLTldfDYzNil8OSg/OjgwMnw5KD86MVsyM118NjkpKXwxKD86NDV8NTgpWzY3XVwiLFwiMSg/OjI2N3wzKD86N1syNDddfDlbMjc4XSl8NDY2fDUoPzo0N3w1OHw2NCl8Nig/OjNbMjQ1XXw0OHw1WzQtNjhdKSl8NDk5WzI0NjhdfDUoPzo3Njl8OTc5WzItNjldKXw3NDY4fDgoPzozKD86OFs3LTldfDk2WzI0NTctOV0pfDQ3N3w1MVsyLTldfDYzNls0NTctOV0pfDkoPzo4MDJ8OSg/OjFbMjNdfDY5KSl8MSg/OjQ1fDU4KVs2N11cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMS0kMi0kM1wiLFtcIjYwXCJdLFwiMCQxXCJdLFtcIihcXFxcZCkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEtJDItJDNcIixbXCJbMzZdfDQoPzoyWzA5XXw3WzAxXSlcIixcIlszNl18NCg/OjIoPzowfDlbMDItNjldKXw3KD86MFswMTldfDEpKVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxLSQyLSQzXCIsW1wiMSg/OjF8NVs0NV18Nzd8ODh8OVs2OV0pfDIoPzoyWzEtMzddfDNbMC0yNjldfDRbNTldfDV8NlsyNF18N1sxLTM1OF18OFsxMzY5XXw5WzAtMzhdKXw0KD86WzI4XVsxLTldfDNbMC01N118WzQ1XXw2WzI0OF18N1syLTU3OV18OVsyOV0pfDUoPzoyfDNbMDQ1XXw0WzAtMzY5XXw1WzI5XXw4WzAyMzg5XXw5WzAtMzg5XSl8Nyg/OjJbMDItNDYtOV18MzR8WzU4XXw2WzAyNDldfDdbNTddfDlbMi02XSl8OCg/OjJbMTI0NTg5XXwzWzI3LTldfDQ5fDUxfDZ8N1swLTQ2OF18OFs2OF18OVswMTldKXw5KD86WzIzXVsxLTldfDRbMTVdfDVbMTM4XXw2WzEtM118N1sxNTZdfDhbMTg5XXw5WzEtNDg5XSlcIixcIjEoPzoxfDUoPzo0WzAxOF18NVswMTddKXw3N3w4OHw5WzY5XSl8Mig/OjIoPzpbMTI3XXwzWzAxNC05XSl8M1swLTI2OV18NFs1OV18NSg/OlsxLTNdfDVbMC02OV18OVsxOV0pfDYyfDcoPzpbMS0zNV18OFswMTg5XSl8OCg/OlsxNl18M1swMTM0XXw5WzAtNV0pfDkoPzpbMDI4XXwxNykpfDQoPzoyKD86WzEzLTc5XXw4WzAxNC02XSl8M1swLTU3XXxbNDVdfDZbMjQ4XXw3WzItNDddfDhbMS05XSl8NSg/OjJ8M1swNDVdfDRbMC0zNjldfDhbMDIzODldfDlbMC0zXSl8Nyg/OjJbMDItNDYtOV18MzR8WzU4XXw2WzAyNDldfDdbNTddfDkoPzpbMjNdfDRbMC01OV18NVswMTU2OV18NlswMTY3XSkpfDgoPzoyKD86WzEyNThdfDRbMC0zOV18OVswLTI0NjldKXw0OXw1MXw2KD86WzAtMjRdfDM2fDVbMC0zNTg5XXw3Mnw5WzAxNDU5XSl8N1swLTQ2OF18OFs2OF0pfDkoPzpbMjNdWzEtOV18NFsxNV18NVsxMzhdfDZbMS0zXXw3WzE1Nl18OFsxODldfDkoPzpbMTI4OV18M1szNF18NFswMTc4XSkpfCg/OjQ5fDU1fDgzKVsyOV18KD86MjY0fDgzNylbMDE2LTldfDIoPzo1N3w5MylbMDE1LTldfCg/OjI1WzA0NjhdfDQyMnw4MzgpWzAxXXwoPzo0N1s1OV18NTlbODldfDgoPzo2WzY4XXw5KSlbMDE5XVwiLFwiMSg/OjF8NSg/OjRbMDE4XXw1WzAxN10pfDc3fDg4fDlbNjldKXwyKD86MlsxMjddfDNbMC0yNjldfDRbNTldfDUoPzpbMS0zXXw1WzAtNjldfDkoPzoxN3w5OSkpfDYoPzoyfDRbMDE2LTldKXw3KD86WzEtMzVdfDhbMDE4OV0pfDgoPzpbMTZdfDNbMDEzNF18OVswLTVdKXw5KD86WzAyOF18MTcpKXw0KD86Mig/OlsxMy03OV18OFswMTQtNl0pfDNbMC01N118WzQ1XXw2WzI0OF18N1syLTQ3XXw5WzI5XSl8NSg/OjJ8M1swNDVdfDRbMC0zNjldfDVbMjldfDhbMDIzODldfDlbMC0zXSl8Nyg/OjJbMDItNDYtOV18MzR8WzU4XXw2WzAyNDldfDdbNTddfDkoPzpbMjNdfDRbMC01OV18NVswMTU2OV18NlswMTY3XSkpfDgoPzoyKD86WzEyNThdfDRbMC0zOV18OVswMTY5XSl8Myg/OlsyOV18Nyg/OlswMTctOV18Nls2LThdKSl8NDl8NTF8Nig/OlswLTI0XXwzNlsyM118NSg/OlswLTM4OV18NVsyM10pfDYoPzpbMDFdfDlbMTc4XSl8NzJ8OVswMTQ1XSl8N1swLTQ2OF18OFs2OF0pfDkoPzo0WzE1XXw1WzEzOF18N1sxNTZdfDhbMTg5XXw5KD86WzEyODldfDMoPzozMXw0WzM1N10pfDRbMDE3OF0pKXwoPzo4Mjk0fDk2KVsxLTNdfDIoPzo1N3w5MylbMDE1LTldfCg/OjIyM3w4Njk5KVswMTQtOV18KD86MjVbMDQ2OF18NDIyfDgzOClbMDFdfCg/OjQ4fDgyOTJ8OVsyM10pWzEtOV18KD86NDdbNTldfDU5Wzg5XXw4KD86Njh8OSkpWzAxOV1cIixcIjEoPzoxfDUoPzo0WzAxOF18NVswMTddKXw3N3w4OHw5WzY5XSl8Mig/OjJbMTI3XXwzWzAtMjY5XXw0WzU5XXw1KD86WzEtM118NVswLTY5XXw3WzAxNS05XXw5KD86MTd8OTkpKXw2KD86Mnw0WzAxNi05XSl8Nyg/OlsxLTM1XXw4WzAxODldKXw4KD86WzE2XXwzWzAxMzRdfDlbMC01XSl8OSg/OlswMjhdfDE3fDNbMDE1LTldKSl8NCg/OjIoPzpbMTMtNzldfDhbMDE0LTZdKXwzWzAtNTddfFs0NV18NlsyNDhdfDdbMi00N118OVsyOV0pfDUoPzoyfDNbMDQ1XXw0WzAtMzY5XXw1WzI5XXw4WzAyMzg5XXw5WzAtM10pfDcoPzoyWzAyLTQ2LTldfDM0fFs1OF18NlswMjQ5XXw3WzU3XXw5KD86WzIzXXw0WzAtNTldfDVbMDE1NjldfDZbMDE2N10pKXw4KD86Mig/OlsxMjU4XXw0WzAtMzldfDkoPzpbMDE5XXw0WzEtM118Nig/OlswLTQ3LTldfDVbMDEzNDYtOV0pKSl8Myg/OlsyOV18Nyg/OlswMTctOV18Nls2LThdKSl8NDl8NTF8Nig/OlswLTI0XXwzNlsyM118NSg/OlswLTM4OV18NVsyM10pfDYoPzpbMDFdfDlbMTc4XSl8NzJ8OVswMTQ1XSl8N1swLTQ2OF18OFs2OF0pfDkoPzo0WzE1XXw1WzEzOF18NlsxLTNdfDdbMTU2XXw4WzE4OV18OSg/OlsxMjg5XXwzKD86MzF8NFszNTddKXw0WzAxNzhdKSl8KD86MjIzfDg2OTkpWzAxNC05XXwoPzoyNVswNDY4XXw0MjJ8ODM4KVswMV18KD86NDh8ODI5KD86Mnw2Nil8OVsyM10pWzEtOV18KD86NDdbNTldfDU5Wzg5XXw4KD86Njh8OSkpWzAxOV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7NH0pXCIsXCIkMS0kMi0kM1wiLFtcIlsxNF18WzI4OV1bMi05XXw1WzMtOV18N1syLTQ2NzldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEtJDItJDNcIixbXCI4MDBcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMS0kMi0kM1wiLFtcIlsyNTctOV1cIl0sXCIwJDFcIl1dLFwiMFwiXSxcIktFXCI6W1wiMjU0XCIsXCIwMDBcIixcIig/OlsxN11cXFxcZFxcXFxkfDkwMClcXFxcZHs2fXwoPzoyfDgwKTBcXFxcZHs2LDd9fFs0LTZdXFxcXGR7Niw4fVwiLFs3LDgsOSwxMF0sW1tcIihcXFxcZHsyfSkoXFxcXGR7NSw3fSlcIixcIiQxICQyXCIsW1wiWzI0LTZdXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Nn0pXCIsXCIkMSAkMlwiLFtcIlsxN11cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7Myw0fSlcIixcIiQxICQyICQzXCIsW1wiWzg5XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiS0dcIjpbXCI5OTZcIixcIjAwXCIsXCI4XFxcXGR7OX18KD86WzIzNS04XVxcXFxkfDk5KVxcXFxkezd9XCIsWzksMTBdLFtbXCIoXFxcXGR7NH0pKFxcXFxkezV9KVwiLFwiJDEgJDJcIixbXCIzKD86MVszNDZdfFsyNC03OV0pXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbMjM1LTc5XXw4OFwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZCkoXFxcXGR7MiwzfSlcIixcIiQxICQyICQzICQ0XCIsW1wiOFwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiS0hcIjpbXCI4NTVcIixcIjAwWzE0LTldXCIsXCIxXFxcXGR7OX18WzEtOV1cXFxcZHs3LDh9XCIsWzgsOSwxMF0sW1tcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsxLTldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHs0fSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCIxXCJdXV0sXCIwXCJdLFwiS0lcIjpbXCI2ODZcIixcIjAwXCIsXCIoPzpbMzddXFxcXGR8NlswLTc5XSlcXFxcZHs2fXwoPzpbMi00OF1cXFxcZHw1MClcXFxcZHszfVwiLFs1LDhdLDAsXCIwXCJdLFwiS01cIjpbXCIyNjlcIixcIjAwXCIsXCJbMzQ3OF1cXFxcZHs2fVwiLFs3XSxbW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkM1wiLFtcIlszNDc4XVwiXV1dXSxcIktOXCI6W1wiMVwiLFwiMDExXCIsXCIoPzpbNThdXFxcXGRcXFxcZHw5MDApXFxcXGR7N31cIixbMTBdLDAsXCIxXCIsMCxcIihbMi03XVxcXFxkezZ9KSR8MVwiLFwiODY5JDFcIiwwLFwiODY5XCJdLFwiS1BcIjpbXCI4NTBcIixcIjAwfDk5XCIsXCI4NVxcXFxkezZ9fCg/OjE5XFxcXGR8WzItN10pXFxcXGR7N31cIixbOCwxMF0sW1tcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCI4XCJdLFwiMCQxXCJdLFtcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMi03XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiMVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiS1JcIjpbXCI4MlwiLFwiMDAoPzpbMTI1Njg5XXwzKD86WzQ2XTV8OTEpfDcoPzowMHwyN3wzfDU1fDZbMTI2XSkpXCIsXCIwMFsxLTldXFxcXGR7OCwxMX18KD86WzEyXXw1XFxcXGR7M30pXFxcXGR7N318WzEzLTZdXFxcXGR7OX18KD86WzEtNl1cXFxcZHw4MClcXFxcZHs3fXxbMy02XVxcXFxkezQsNX18KD86MDB8NykwXFxcXGR7OH1cIixbNSw2LDgsOSwxMCwxMSwxMiwxMywxNF0sW1tcIihcXFxcZHsyfSkoXFxcXGR7Myw0fSlcIixcIiQxLSQyXCIsW1wiKD86M1sxLTNdfFs0Nl1bMS00XXw1WzEtNV0pMVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEtJDJcIixbXCIxXCJdXSxbXCIoXFxcXGQpKFxcXFxkezMsNH0pKFxcXFxkezR9KVwiLFwiJDEtJDItJDNcIixbXCIyXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEtJDItJDNcIixbXCI2MHw4XCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7Myw0fSkoXFxcXGR7NH0pXCIsXCIkMS0kMi0kM1wiLFtcIlsxMzQ2XXw1WzEtNV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMS0kMi0kM1wiLFtcIls1N11cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs1fSkoXFxcXGR7NH0pXCIsXCIkMS0kMi0kM1wiLFtcIjVcIl0sXCIwJDFcIl1dLFwiMFwiLDAsXCIwKDgoPzpbMS00Ni04XXw1XFxcXGRcXFxcZCkpP1wiXSxcIktXXCI6W1wiOTY1XCIsXCIwMFwiLFwiMThcXFxcZHs1fXwoPzpbMjU2OV1cXFxcZHw0MSlcXFxcZHs2fVwiLFs3LDhdLFtbXCIoXFxcXGR7NH0pKFxcXFxkezMsNH0pXCIsXCIkMSAkMlwiLFtcIlsxNjldfDIoPzpbMjM1XXw0WzEtMzUtOV0pfDUyXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezV9KVwiLFwiJDEgJDJcIixbXCJbMjQ1XVwiXV1dXSxcIktZXCI6W1wiMVwiLFwiMDExXCIsXCIoPzozNDV8WzU4XVxcXFxkXFxcXGR8OTAwKVxcXFxkezd9XCIsWzEwXSwwLFwiMVwiLDAsXCIoWzItOV1cXFxcZHs2fSkkfDFcIixcIjM0NSQxXCIsMCxcIjM0NVwiXSxcIktaXCI6W1wiN1wiLFwiODEwXCIsXCIoPzozMzYyMnw4XFxcXGR7OH0pXFxcXGR7NX18Wzc4XVxcXFxkezl9XCIsWzEwLDE0XSwwLFwiOFwiLDAsMCwwLDAsXCIzM3w3XCIsMCxcIjh+MTBcIl0sXCJMQVwiOltcIjg1NlwiLFwiMDBcIixcIlsyM11cXFxcZHs5fXwzXFxcXGR7OH18KD86WzIzNS04XVxcXFxkfDQxKVxcXFxkezZ9XCIsWzgsOSwxMF0sW1tcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCIyWzEzXXwzWzE0XXxbNC04XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjMwWzAxMy05XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsyM11cIl0sXCIwJDFcIl1dLFwiMFwiXSxcIkxCXCI6W1wiOTYxXCIsXCIwMFwiLFwiWzI3LTldXFxcXGR7N318WzEzLTldXFxcXGR7Nn1cIixbNyw4XSxbW1wiKFxcXFxkKShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIlsxMy02OV18Nyg/OlsyLTU3XXw2Mnw4WzAtN118OVswNC05XSl8OFswMi05XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiWzI3LTldXCJdXV0sXCIwXCJdLFwiTENcIjpbXCIxXCIsXCIwMTFcIixcIig/Ols1OF1cXFxcZFxcXFxkfDc1OHw5MDApXFxcXGR7N31cIixbMTBdLDAsXCIxXCIsMCxcIihbMi04XVxcXFxkezZ9KSR8MVwiLFwiNzU4JDFcIiwwLFwiNzU4XCJdLFwiTElcIjpbXCI0MjNcIixcIjAwXCIsXCJbNjhdXFxcXGR7OH18KD86WzIzNzhdXFxcXGR8OTApXFxcXGR7NX1cIixbNyw5XSxbW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkM1wiLFtcIlsyMzc5XXw4KD86MFswOV18NylcIixcIlsyMzc5XXw4KD86MCg/OjAyfDkpfDcpXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiOFwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjY5XCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiNlwiXV1dLFwiMFwiLDAsXCIoMTAwMSl8MFwiXSxcIkxLXCI6W1wiOTRcIixcIjAwXCIsXCJbMS05XVxcXFxkezh9XCIsWzldLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiN1wiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiWzEtNjg5XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiTFJcIjpbXCIyMzFcIixcIjAwXCIsXCIoPzpbMjVdXFxcXGR8MzN8Nzd8ODgpXFxcXGR7N318KD86MlxcXFxkfFs0LTZdKVxcXFxkezZ9XCIsWzcsOCw5XSxbW1wiKFxcXFxkKShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIls0LTZdXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCIyXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMjM1NzhdXCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJMU1wiOltcIjI2NlwiLFwiMDBcIixcIig/OlsyNTZdXFxcXGRcXFxcZHw4MDApXFxcXGR7NX1cIixbOF0sW1tcIihcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIlsyNTY4XVwiXV1dXSxcIkxUXCI6W1wiMzcwXCIsXCIwMFwiLFwiKD86WzM0NjldXFxcXGR8NTJ8Wzc4XTApXFxcXGR7Nn1cIixbOF0sW1tcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI1MlswLTddXCJdLFwiKDgtJDEpXCIsMV0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIls3LTldXCJdLFwiOCAkMVwiLDFdLFtcIihcXFxcZHsyfSkoXFxcXGR7Nn0pXCIsXCIkMSAkMlwiLFtcIjM3fDQoPzpbMTVdfDZbMS04XSlcIl0sXCIoOC0kMSlcIiwxXSxbXCIoXFxcXGR7M30pKFxcXFxkezV9KVwiLFwiJDEgJDJcIixbXCJbMy02XVwiXSxcIig4LSQxKVwiLDFdXSxcIjhcIiwwLFwiWzA4XVwiXSxcIkxVXCI6W1wiMzUyXCIsXCIwMFwiLFwiMzVbMDEzLTldXFxcXGR7NCw4fXw2XFxcXGR7OH18MzVcXFxcZHsyLDR9fCg/OlsyNDU3LTldXFxcXGR8M1swLTQ2LTldKVxcXFxkezIsOX1cIixbNCw1LDYsNyw4LDksMTAsMTFdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KVwiLFwiJDEgJDJcIixbXCIyKD86MFsyLTY4OV18WzItOV0pfFszLTU3XXw4KD86MFsyLTldfFsxMy05XSl8OSg/OjBbODldfFsyLTU3OV0pXCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzXCIsW1wiMig/OjBbMi02ODldfFsyLTldKXxbMy01N118OCg/OjBbMi05XXxbMTMtOV0pfDkoPzowWzg5XXxbMi01NzldKVwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjIwWzItNjg5XVwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezEsMn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjIoPzpbMDM2N118NFszLThdKVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjgwWzAxXXw5MFswMTVdXCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjIwXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiNlwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsxLDJ9KVwiLFwiJDEgJDIgJDMgJDQgJDVcIixbXCIyKD86WzAzNjddfDRbMy04XSlcIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsxLDV9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbMy01N118OFsxMy05XXw5KD86MFs4OV18WzItNTc5XSl8KD86Mnw4MClbMi05XVwiXV1dLDAsMCxcIigxNSg/OjBbMDZdfDFbMTJdfFszNV01fDRbMDRdfDZbMjZdfDc3fDg4fDk5KVxcXFxkKVwiXSxcIkxWXCI6W1wiMzcxXCIsXCIwMFwiLFwiKD86WzI2OF1cXFxcZHw5MClcXFxcZHs2fVwiLFs4XSxbW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIlsyNjldfDhbMDFdXCJdXV1dLFwiTFlcIjpbXCIyMThcIixcIjAwXCIsXCJbMi05XVxcXFxkezh9XCIsWzldLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezd9KVwiLFwiJDEtJDJcIixbXCJbMi05XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiTUFcIjpbXCIyMTJcIixcIjAwXCIsXCJbNS04XVxcXFxkezh9XCIsWzldLFtbXCIoXFxcXGR7NX0pKFxcXFxkezR9KVwiLFwiJDEtJDJcIixbXCI1KD86Mjl8MzgpXCIsXCI1KD86MjlbMTI4OV18Mzg5KVwiLFwiNTI5KD86MVsxLTQ2LTldfDJbMDEzLThdfDkwKXw1KD86Mjk4fDM4OSlbMC00Ni05XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjVbNDVdXCJdLFwiMCQxXCJdLFtcIihcXFxcZHs0fSkoXFxcXGR7NX0pXCIsXCIkMS0kMlwiLFtcIjUoPzoyWzItNDg5XXwzWzUtOV18OSl8ODkyXCIsXCI1KD86Mig/OlsyLTQ5XXw4WzIzNS05XSl8M1s1LTldfDkpfDg5MlwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezd9KVwiLFwiJDEtJDJcIixbXCI4XCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Nn0pXCIsXCIkMS0kMlwiLFtcIls1LTddXCJdLFwiMCQxXCJdXSxcIjBcIiwwLDAsMCwwLDAsW1tcIjUyOTNbMDFdXFxcXGR7NH18NSg/OjIoPzpbMC0yNS03XVxcXFxkfDNbMS01NzhdfDRbMDItNDYtOF18OFswMjM1LTddfDlbMC0yODldKXwzKD86WzAtNDddXFxcXGR8NVswMi05XXw2WzAyLThdfDhbMDE4OV18OVszLTldKXwoPzo0WzA2N118NVswM10pXFxcXGQpXFxcXGR7NX1cIl0sW1wiKD86Nig/OlswLTc5XVxcXFxkfDhbMC0yNDctOV0pfDcoPzpbMDE3XVxcXFxkfDJbMC0yXXw2WzAtOF18OFswLTNdKSlcXFxcZHs2fVwiXSxbXCI4MFxcXFxkezd9XCJdLFtcIjg5XFxcXGR7N31cIl0sMCwwLDAsMCxbXCI1OTIoPzo0WzAtMl18OTMpXFxcXGR7NH1cIl1dXSxcIk1DXCI6W1wiMzc3XCIsXCIwMFwiLFwiKD86WzM0ODldfDZcXFxcZClcXFxcZHs3fVwiLFs4LDldLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiNFwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlszODldXCJdXSxbXCIoXFxcXGQpKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDQgJDVcIixbXCI2XCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJNRFwiOltcIjM3M1wiLFwiMDBcIixcIig/OlsyMzUtN11cXFxcZHxbODldMClcXFxcZHs2fVwiLFs4XSxbW1wiKFxcXFxkezN9KShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiWzg5XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiMjJ8M1wiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiWzI1LTddXCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJNRVwiOltcIjM4MlwiLFwiMDBcIixcIig/OjIwfFszLTc5XVxcXFxkKVxcXFxkezZ9fDgwXFxcXGR7Niw3fVwiLFs4LDldLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMi05XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiTUZcIjpbXCI1OTBcIixcIjAwXCIsXCI1OTBcXFxcZHs2fXwoPzo2OXw4MHw5XFxcXGQpXFxcXGR7N31cIixbOV0sMCxcIjBcIiwwLDAsMCwwLDAsW1tcIjU5MCg/OjBbMDc5XXxbMTRdM3xbMjddWzc5XXwzMHw1WzAtMjY4XXw4NylcXFxcZHs0fVwiXSxbXCI2OSg/OjBcXFxcZFxcXFxkfDEoPzoyWzItOV18M1swLTVdKSlcXFxcZHs0fVwiXSxbXCI4MFswLTVdXFxcXGR7Nn1cIl0sMCwwLDAsMCwwLFtcIjkoPzooPzozOTV8NzZbMDE4XSlcXFxcZHw0NzVbMDFdKVxcXFxkezR9XCJdXV0sXCJNR1wiOltcIjI2MVwiLFwiMDBcIixcIlsyM11cXFxcZHs4fVwiLFs5XSxbW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbMjNdXCJdLFwiMCQxXCJdXSxcIjBcIiwwLFwiKFsyNC05XVxcXFxkezZ9KSR8MFwiLFwiMjAkMVwiXSxcIk1IXCI6W1wiNjkyXCIsXCIwMTFcIixcIjMyOVxcXFxkezR9fCg/OlsyNTZdXFxcXGR8NDUpXFxcXGR7NX1cIixbN10sW1tcIihcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMS0kMlwiLFtcIlsyLTZdXCJdXV0sXCIxXCJdLFwiTUtcIjpbXCIzODlcIixcIjAwXCIsXCJbMi01NzhdXFxcXGR7N31cIixbOF0sW1tcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIyfDM0WzQ3XXw0KD86WzM3XTd8NVs0N118NjQpXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbMzQ3XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkKShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIls1OF1cIl0sXCIwJDFcIl1dLFwiMFwiXSxcIk1MXCI6W1wiMjIzXCIsXCIwMFwiLFwiWzI0LTldXFxcXGR7N31cIixbOF0sW1tcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiWzI0LTldXCJdXV1dLFwiTU1cIjpbXCI5NVwiLFwiMDBcIixcIjFcXFxcZHs1LDd9fDk1XFxcXGR7Nn18KD86WzQtN118OVswLTQ2LTldKVxcXFxkezYsOH18KD86Mnw4XFxcXGQpXFxcXGR7NSw4fVwiLFs2LDcsOCw5LDEwXSxbW1wiKFxcXFxkKShcXFxcZHsyfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjE2fDJcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIls0NV18Nig/OjBbMjNdfFsxLTY4OV18N1syMzUtN10pfDcoPzpbMC00XXw1WzItN10pfDhbMS02XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMTJdXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIls0LTddfDhbMS0zNV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkKShcXFxcZHszfSkoXFxcXGR7NCw2fSlcIixcIiQxICQyICQzXCIsW1wiOSg/OjJbMC00XXxbMzUtOV18NFsxMzctOV0pXCJdLFwiMCQxXCJdLFtcIihcXFxcZCkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIyXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI4XCJdLFwiMCQxXCJdLFtcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzICQ0XCIsW1wiOTJcIl0sXCIwJDFcIl0sW1wiKFxcXFxkKShcXFxcZHs1fSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjlcIl0sXCIwJDFcIl1dLFwiMFwiXSxcIk1OXCI6W1wiOTc2XCIsXCIwMDFcIixcIlsxMl1cXFxcZHs3LDl9fFs1LTldXFxcXGR7N31cIixbOCw5LDEwXSxbW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsxMl0xXCJdLFwiMCQxXCJdLFtcIihcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIls1LTldXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezUsNn0pXCIsXCIkMSAkMlwiLFtcIlsxMl0yWzEtM11cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZHs1LDZ9KVwiLFwiJDEgJDJcIixbXCJbMTJdKD86Mjd8M1syLThdfDRbMi02OF18NVsxLTQ2ODldKVwiLFwiWzEyXSg/OjI3fDNbMi04XXw0WzItNjhdfDVbMS00Njg5XSlbMC0zXVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7NX0pKFxcXFxkezQsNX0pXCIsXCIkMSAkMlwiLFtcIlsxMl1cIl0sXCIwJDFcIl1dLFwiMFwiXSxcIk1PXCI6W1wiODUzXCIsXCIwMFwiLFwiMDgwMFxcXFxkezN9fCg/OjI4fFs2OF1cXFxcZClcXFxcZHs2fVwiLFs3LDhdLFtbXCIoXFxcXGR7NH0pKFxcXFxkezN9KVwiLFwiJDEgJDJcIixbXCIwXCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMjY4XVwiXV1dXSxcIk1QXCI6W1wiMVwiLFwiMDExXCIsXCJbNThdXFxcXGR7OX18KD86Njd8OTApMFxcXFxkezd9XCIsWzEwXSwwLFwiMVwiLDAsXCIoWzItOV1cXFxcZHs2fSkkfDFcIixcIjY3MCQxXCIsMCxcIjY3MFwiXSxcIk1RXCI6W1wiNTk2XCIsXCIwMFwiLFwiNTk2XFxcXGR7Nn18KD86Njl8ODB8OVxcXFxkKVxcXFxkezd9XCIsWzldLFtbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIls1NjldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiOFwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiTVJcIjpbXCIyMjJcIixcIjAwXCIsXCIoPzpbMi00XVxcXFxkXFxcXGR8ODAwKVxcXFxkezV9XCIsWzhdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsyLTQ4XVwiXV1dXSxcIk1TXCI6W1wiMVwiLFwiMDExXCIsXCIoPzpbNThdXFxcXGRcXFxcZHw2NjR8OTAwKVxcXFxkezd9XCIsWzEwXSwwLFwiMVwiLDAsXCIoWzM0XVxcXFxkezZ9KSR8MVwiLFwiNjY0JDFcIiwwLFwiNjY0XCJdLFwiTVRcIjpbXCIzNTZcIixcIjAwXCIsXCIzNTUwXFxcXGR7NH18KD86WzI1NzldXFxcXGRcXFxcZHw4MDApXFxcXGR7NX1cIixbOF0sW1tcIihcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIlsyMzU3LTldXCJdXV1dLFwiTVVcIjpbXCIyMzBcIixcIjAoPzowfFsyNC03XTB8M1swM10pXCIsXCIoPzpbNTddfDhcXFxcZFxcXFxkKVxcXFxkezd9fFsyLTQ2OF1cXFxcZHs2fVwiLFs3LDgsMTBdLFtbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMi00Nl18OFswMTNdXCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbNTddXCJdXSxbXCIoXFxcXGR7NX0pKFxcXFxkezV9KVwiLFwiJDEgJDJcIixbXCI4XCJdXV0sMCwwLDAsMCwwLDAsMCxcIjAyMFwiXSxcIk1WXCI6W1wiOTYwXCIsXCIwKD86MHwxOSlcIixcIig/OjgwMHw5WzAtNTctOV1cXFxcZClcXFxcZHs3fXxbMzQ2NzldXFxcXGR7Nn1cIixbNywxMF0sW1tcIihcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMS0kMlwiLFtcIlszNDY3OV1cIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbODldXCJdXV0sMCwwLDAsMCwwLDAsMCxcIjAwXCJdLFwiTVdcIjpbXCIyNjVcIixcIjAwXCIsXCIoPzpbMTI4OV1cXFxcZHwzMXw3NylcXFxcZHs3fXwxXFxcXGR7Nn1cIixbNyw5XSxbW1wiKFxcXFxkKShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjFbMi05XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiMlwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsxMzctOV1cIl0sXCIwJDFcIl1dLFwiMFwiXSxcIk1YXCI6W1wiNTJcIixcIjBbMDldXCIsXCIxKD86KD86WzI3XTJ8NDR8OTkpWzEtOV18NjVbMC02ODldKVxcXFxkezd9fCg/OjEoPzpbMDFdXFxcXGR8MlsxMy05XXxbMzVdWzEtOV18NFswLTM1LTldfDZbMC00Ni05XXw3WzAxMy05XXw4WzEtNzldfDlbMS04XSl8WzItOV1cXFxcZClcXFxcZHs4fVwiLFsxMCwxMV0sW1tcIihcXFxcZHsyfSkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIzM3w1WzU2XXw4MVwiXSwwLDFdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMi05XVwiXSwwLDFdLFtcIihcXFxcZCkoXFxcXGR7Mn0pKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQyICQzICQ0XCIsW1wiMSg/OjMzfDVbNTZdfDgxKVwiXSwwLDFdLFtcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQyICQzICQ0XCIsW1wiMVwiXSwwLDFdXSxcIjAxXCIsMCxcIjAoPzpbMTJdfDRbNDVdKXwxXCIsMCwwLDAsMCxcIjAwXCJdLFwiTVlcIjpbXCI2MFwiLFwiMDBcIixcIjFcXFxcZHs4LDl9fCg/OjNcXFxcZHxbNC05XSlcXFxcZHs3fVwiLFs4LDksMTBdLFtbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxLSQyICQzXCIsW1wiWzQtNzldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMS0kMiAkM1wiLFtcIjEoPzpbMDI0NjldfFszNzhdWzEtOV18NTMpfDhcIixcIjEoPzpbMDI0NjldfFszN11bMS05XXw1M3w4KD86WzEtNDYtOV18NVs3LTldKSl8OFwiXSxcIjAkMVwiXSxbXCIoXFxcXGQpKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxLSQyICQzXCIsW1wiM1wiXSxcIjAkMVwiXSxbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7NH0pXCIsXCIkMS0kMi0kMy0kNFwiLFtcIjEoPzpbMzY3XXw4MClcIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEtJDIgJDNcIixbXCIxNVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxLSQyICQzXCIsW1wiMVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiTVpcIjpbXCIyNThcIixcIjAwXCIsXCIoPzoyfDhcXFxcZClcXFxcZHs3fVwiLFs4LDldLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCIyfDhbMi03OV1cIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCI4XCJdXV1dLFwiTkFcIjpbXCIyNjRcIixcIjAwXCIsXCJbNjhdXFxcXGR7Nyw4fVwiLFs4LDldLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiODhcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Myw0fSlcIixcIiQxICQyICQzXCIsW1wiNlwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiODdcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjhcIl0sXCIwJDFcIl1dLFwiMFwiXSxcIk5DXCI6W1wiNjg3XCIsXCIwMFwiLFwiKD86MDUwfFsyLTU3LTldXFxcXGRcXFxcZClcXFxcZHszfVwiLFs2XSxbW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMS4kMi4kM1wiLFtcIlswMi01Ny05XVwiXV1dXSxcIk5FXCI6W1wiMjI3XCIsXCIwMFwiLFwiWzAyNy05XVxcXFxkezd9XCIsWzhdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiMDhcIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiWzA4OV18MlswMTNdfDdbMDRdXCJdXV1dLFwiTkZcIjpbXCI2NzJcIixcIjAwXCIsXCJbMTNdXFxcXGR7NX1cIixbNl0sW1tcIihcXFxcZHsyfSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIjFbMC0zXVwiXV0sW1wiKFxcXFxkKShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiWzEzXVwiXV1dLDAsMCxcIihbMC0yNThdXFxcXGR7NH0pJFwiLFwiMyQxXCJdLFwiTkdcIjpbXCIyMzRcIixcIjAwOVwiLFwiKD86WzEyNC03XXw5XFxcXGR7M30pXFxcXGR7Nn18WzEtOV1cXFxcZHs3fXxbNzhdXFxcXGR7OSwxM31cIixbNyw4LDEwLDExLDEyLDEzLDE0XSxbW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjc4XCJdLFwiMCQxXCJdLFtcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsxMl18OSg/OjBbMy05XXxbMS05XSlcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7MiwzfSlcIixcIiQxICQyICQzXCIsW1wiWzMtN118OFsyLTldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIls3LTldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7NH0pKFxcXFxkezQsNX0pXCIsXCIkMSAkMiAkM1wiLFtcIls3OF1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHs1fSkoXFxcXGR7NSw2fSlcIixcIiQxICQyICQzXCIsW1wiWzc4XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiTklcIjpbXCI1MDVcIixcIjAwXCIsXCIoPzoxODAwfFsyNS04XVxcXFxkezN9KVxcXFxkezR9XCIsWzhdLFtbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMTI1LThdXCJdXV1dLFwiTkxcIjpbXCIzMVwiLFwiMDBcIixcIig/OlsxMjQtN11cXFxcZFxcXFxkfDMoPzpbMDItOV1cXFxcZHwxWzAtOF0pKVxcXFxkezZ9fDhcXFxcZHs2LDl9fDlcXFxcZHs2LDEwfXwxXFxcXGR7NCw1fVwiLFs1LDYsNyw4LDksMTAsMTFdLFtbXCIoXFxcXGR7M30pKFxcXFxkezQsN30pXCIsXCIkMSAkMlwiLFtcIls4OV0wXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7N30pXCIsXCIkMSAkMlwiLFtcIjY2XCJdLFwiMCQxXCJdLFtcIihcXFxcZCkoXFxcXGR7OH0pXCIsXCIkMSAkMlwiLFtcIjZcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjFbMTYtOF18MlsyNTldfDNbMTI0XXw0WzE3LTldfDVbMTI0Njc5XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzEtNTc4XXw5MVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs1fSlcIixcIiQxICQyICQzXCIsW1wiOVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiTk9cIjpbXCI0N1wiLFwiMDBcIixcIig/OjB8WzItOV1cXFxcZHszfSlcXFxcZHs0fVwiLFs1LDhdLFtbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiWzQ4OV18NTlcIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiWzIzNS03XVwiXV1dLDAsMCwwLDAsMCxcIlswMi02ODldfDdbMC04XVwiXSxcIk5QXCI6W1wiOTc3XCIsXCIwMFwiLFwiKD86MVxcXFxkfDkpXFxcXGR7OX18WzEtOV1cXFxcZHs3fVwiLFs4LDEwLDExXSxbW1wiKFxcXFxkKShcXFxcZHs3fSlcIixcIiQxLSQyXCIsW1wiMVsyLTZdXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7Nn0pXCIsXCIkMS0kMlwiLFtcIjFbMDFdfFsyLThdfDkoPzpbMS01OV18WzY3XVsyLTZdKVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezd9KVwiLFwiJDEtJDJcIixbXCI5XCJdXV0sXCIwXCJdLFwiTlJcIjpbXCI2NzRcIixcIjAwXCIsXCIoPzo0NDR8KD86NTV8OFxcXFxkKVxcXFxkfDY2NilcXFxcZHs0fVwiLFs3XSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiWzQtNjhdXCJdXV1dLFwiTlVcIjpbXCI2ODNcIixcIjAwXCIsXCIoPzpbNDddfDg4OFxcXFxkKVxcXFxkezN9XCIsWzQsN10sW1tcIihcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIjhcIl1dXV0sXCJOWlwiOltcIjY0XCIsXCIwKD86MHwxNjEpXCIsXCJbMjldXFxcXGR7Nyw5fXw1MFxcXFxkezV9KD86XFxcXGR7MiwzfSk/fDZbMC0zNS05XVxcXFxkezZ9fDdcXFxcZHs3LDh9fDhcXFxcZHs0LDl9fCg/OjExXFxcXGR8WzM0XSlcXFxcZHs3fVwiLFs1LDYsNyw4LDksMTBdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezMsOH0pXCIsXCIkMSAkMlwiLFtcIjhbMS01NzldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezIsM30pXCIsXCIkMSAkMiAkM1wiLFtcIjUwWzAzNi04XXxbODldMFwiLFwiNTAoPzpbMDM2N118ODgpfFs4OV0wXCJdLFwiMCQxXCJdLFtcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIyNHxbMzQ2XXw3WzItNTctOV18OVsyLTldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIjIoPzoxMHw3NCl8WzU5XXw4MFwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezMsNH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIxfDJbMDI4XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszLDV9KVwiLFwiJDEgJDIgJDNcIixbXCIyKD86WzE2OV18N1swLTM1LTldKXw3fDg2XCJdLFwiMCQxXCJdXSxcIjBcIiwwLDAsMCwwLDAsMCxcIjAwXCJdLFwiT01cIjpbXCI5NjhcIixcIjAwXCIsXCIoPzoxNTA1fFsyNzldXFxcXGR7M318NTAwKVxcXFxkezR9fDgwMFxcXFxkezUsNn1cIixbNyw4LDldLFtbXCIoXFxcXGR7M30pKFxcXFxkezQsNn0pXCIsXCIkMSAkMlwiLFtcIls1OF1cIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7Nn0pXCIsXCIkMSAkMlwiLFtcIjJcIl1dLFtcIihcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIlsxNzldXCJdXV1dLFwiUEFcIjpbXCI1MDdcIixcIjAwXCIsXCIoPzowMDgwMHw4XFxcXGR7M30pXFxcXGR7Nn18WzY4XVxcXFxkezd9fFsxLTU3LTldXFxcXGR7Nn1cIixbNyw4LDEwLDExXSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxLSQyXCIsW1wiWzEtNTctOV1cIl1dLFtcIihcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMS0kMlwiLFtcIls2OF1cIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI4XCJdXV1dLFwiUEVcIjpbXCI1MVwiLFwiMDB8MTkoPzoxWzEyNF18Nzd8OTApMDBcIixcIig/OlsxNC04XXw5XFxcXGQpXFxcXGR7N31cIixbOCw5XSxbW1wiKFxcXFxkezN9KShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiODBcIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGQpKFxcXFxkezd9KVwiLFwiJDEgJDJcIixbXCIxXCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs2fSlcIixcIiQxICQyXCIsW1wiWzQtOF1cIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiOVwiXV1dLFwiMFwiLDAsMCwwLDAsMCwwLFwiMDBcIixcIiBBbmV4byBcIl0sXCJQRlwiOltcIjY4OVwiLFwiMDBcIixcIjRcXFxcZHs1fSg/OlxcXFxkezJ9KT98OFxcXFxkezcsOH1cIixbNiw4LDldLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzXCIsW1wiNDRcIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiNHw4WzctOV1cIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiOFwiXV1dXSxcIlBHXCI6W1wiNjc1XCIsXCIwMHwxNDBbMS0zXVwiLFwiKD86MTgwfFs3OF1cXFxcZHszfSlcXFxcZHs0fXwoPzpbMi01ODldXFxcXGR8NjQpXFxcXGR7NX1cIixbNyw4XSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiMTh8WzItNjldfDg1XCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbNzhdXCJdXV0sMCwwLDAsMCwwLDAsMCxcIjAwXCJdLFwiUEhcIjpbXCI2M1wiLFwiMDBcIixcIig/OlsyLTddfDlcXFxcZClcXFxcZHs4fXwyXFxcXGR7NX18KD86MTgwMHw4KVxcXFxkezcsOX1cIixbNiw4LDksMTAsMTEsMTIsMTNdLFtbXCIoXFxcXGQpKFxcXFxkezV9KVwiLFwiJDEgJDJcIixbXCIyXCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezR9KShcXFxcZHs0LDZ9KVwiLFwiJDEgJDJcIixbXCIzKD86MjN8Mzl8NDYpfDQoPzoyWzMtNl18WzM1XTl8NFsyNl18NzYpfDU0NHw4OFsyNDVdfCg/OjUyfDY0fDg2KTJcIixcIjMoPzoyMzB8Mzk3fDQ2MSl8NCg/OjIoPzozNXxbNDZdNHw1MSl8Mzk2fDQoPzoyMnw2Myl8NTlbMzQ3XXw3NlsxNV0pfDUoPzoyMjF8NDQ2KXw2NDJbMjNdfDgoPzo2MjJ8OCg/OlsyNF0yfDVbMTNdKSlcIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGR7NX0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCIzNDZ8NCg/OjI3fDlbMzVdKXw4ODNcIixcIjM0Njl8NCg/OjI3OXw5KD86MzB8NTYpKXw4ODM0XCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkKShcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjJcIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzMtN118OFsyLThdXCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIls4OV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjFcIl1dLFtcIihcXFxcZHs0fSkoXFxcXGR7MSwyfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCIxXCJdXV0sXCIwXCJdLFwiUEtcIjpbXCI5MlwiLFwiMDBcIixcIjEyMlxcXFxkezZ9fFsyNC04XVxcXFxkezEwLDExfXw5KD86WzAxMy05XVxcXFxkezgsMTB9fDIoPzpbMDFdXFxcXGRcXFxcZHwyKD86WzA2LThdXFxcXGR8MVswMV0pKVxcXFxkezd9KXwoPzpbMi04XVxcXFxkezN9fDkyKD86WzAtN11cXFxcZHw4WzEtOV0pKVxcXFxkezZ9fFsyNC05XVxcXFxkezh9fFs4OV1cXFxcZHs3fVwiLFs4LDksMTAsMTEsMTJdLFtbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHsyLDd9KVwiLFwiJDEgJDIgJDNcIixbXCJbODldMFwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7NH0pKFxcXFxkezV9KVwiLFwiJDEgJDJcIixbXCIxXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezYsN30pXCIsXCIkMSAkMlwiLFtcIjIoPzozWzIzNThdfDRbMi00XXw5WzItOF0pfDQ1WzM0NzldfDU0WzItNDY3XXw2MFs0NjhdfDcyWzIzNl18OCg/OjJbMi02ODldfDNbMjM1NzhdfDRbMzQ3OF18NVsyMzU2XSl8OSg/OjJbMi04XXwzWzI3LTldfDRbMi02XXw2WzM1NjldfDlbMjUtOF0pXCIsXCI5KD86MlszLThdfDk4KXwoPzoyKD86M1syMzU4XXw0WzItNF18OVsyLThdKXw0NVszNDc5XXw1NFsyLTQ2N118NjBbNDY4XXw3MlsyMzZdfDgoPzoyWzItNjg5XXwzWzIzNTc4XXw0WzM0NzhdfDVbMjM1Nl0pfDkoPzoyMnwzWzI3LTldfDRbMi02XXw2WzM1NjldfDlbMjUtN10pKVsyLTldXCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs3LDh9KVwiLFwiJDEgJDJcIixbXCIoPzoyWzEyNV18NFswLTI0Ni05XXw1WzEtMzUtN118NlsxLThdfDdbMTRdfDhbMTZdfDkxKVsyLTldXCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezV9KShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiNThcIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezd9KVwiLFwiJDEgJDJcIixbXCIzXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzICQ0XCIsW1wiMlsxMjVdfDRbMC0yNDYtOV18NVsxLTM1LTddfDZbMS04XXw3WzE0XXw4WzE2XXw5MVwiXSxcIigwJDEpXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzICQ0XCIsW1wiWzI0LTldXCJdLFwiKDAkMSlcIl1dLFwiMFwiXSxcIlBMXCI6W1wiNDhcIixcIjAwXCIsXCIoPzo2fDhcXFxcZFxcXFxkKVxcXFxkezd9fFsxLTldXFxcXGR7Nn0oPzpcXFxcZHsyfSk/fFsyNl1cXFxcZHs1fVwiLFs2LDcsOCw5LDEwXSxbW1wiKFxcXFxkezV9KVwiLFwiJDFcIixbXCIxOVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyXCIsW1wiMTF8MjB8NjRcIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCIoPzoxWzItOF18MlsyLTY5XXwzWzItNF18NFsxLTQ2OF18NVsyNC02ODldfDZbMS0zNTc4XXw3WzE0LTddfDhbMS03OV18OVsxNDVdKTFcIixcIig/OjFbMi04XXwyWzItNjldfDNbMi00XXw0WzEtNDY4XXw1WzI0LTY4OV18NlsxLTM1NzhdfDdbMTQtN118OFsxLTc5XXw5WzE0NV0pMTlcIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezIsM30pXCIsXCIkMSAkMiAkM1wiLFtcIjY0XCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiMjF8Mzl8NDV8NVswMTM3XXw2WzA0NjldfDdbMDIzODldfDgoPzowWzE0XXw4KVwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCIxWzItOF18WzItN118OFsxLTc5XXw5WzE0NV1cIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIjhcIl1dXV0sXCJQTVwiOltcIjUwOFwiLFwiMDBcIixcIls0NV1cXFxcZHs1fXwoPzo3MDh8ODBcXFxcZClcXFxcZHs2fVwiLFs2LDldLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzXCIsW1wiWzQ1XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiN1wiXV0sW1wiKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCI4XCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJQUlwiOltcIjFcIixcIjAxMVwiLFwiKD86WzU4OV1cXFxcZFxcXFxkfDc4NylcXFxcZHs3fVwiLFsxMF0sMCxcIjFcIiwwLDAsMCwwLFwiNzg3fDkzOVwiXSxcIlBTXCI6W1wiOTcwXCIsXCIwMFwiLFwiWzI0ODldMlxcXFxkezZ9fCg/OjFcXFxcZHw1KVxcXFxkezh9XCIsWzgsOSwxMF0sW1tcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMjQ4OV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjVcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjFcIl1dXSxcIjBcIl0sXCJQVFwiOltcIjM1MVwiLFwiMDBcIixcIjE2OTNcXFxcZHs1fXwoPzpbMjYtOV1cXFxcZHwzMClcXFxcZHs3fVwiLFs5XSxbW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjJbMTJdXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiMTZ8WzIzNi05XVwiXV1dXSxcIlBXXCI6W1wiNjgwXCIsXCIwMVsxMl1cIixcIig/OlsyNC04XVxcXFxkXFxcXGR8MzQ1fDkwMClcXFxcZHs0fVwiLFs3XSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiWzItOV1cIl1dXV0sXCJQWVwiOltcIjU5NVwiLFwiMDBcIixcIjU5XFxcXGR7NCw2fXw5XFxcXGR7NSwxMH18KD86WzItNDYtOF1cXFxcZHw1WzAtOF0pXFxcXGR7NCw3fVwiLFs2LDcsOCw5LDEwLDExXSxbW1wiKFxcXFxkezN9KShcXFxcZHszLDZ9KVwiLFwiJDEgJDJcIixbXCJbMi05XTBcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiWzI2XTF8M1syODldfDRbMTI0Ni04XXw3WzEtM118OFsxLTM2XVwiXSxcIigwJDEpXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7NCw1fSlcIixcIiQxICQyXCIsW1wiMlsyNzldfDNbMTMtNV18NFszNTldfDV8Nig/OlszNF18N1sxLTQ2LThdKXw3WzQ2LThdfDg1XCJdLFwiKDAkMSlcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Myw0fSlcIixcIiQxICQyICQzXCIsW1wiMlsxNC02OF18M1syNi05XXw0WzEyNDYtOF18Nig/OjF8NzUpfDdbMS0zNV18OFsxLTM2XVwiXSxcIigwJDEpXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI4N1wiXV0sW1wiKFxcXFxkezN9KShcXFxcZHs2fSlcIixcIiQxICQyXCIsW1wiOSg/Ols1LTc5XXw4WzEtNl0pXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbMi04XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7NH0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiOVwiXV1dLFwiMFwiXSxcIlFBXCI6W1wiOTc0XCIsXCIwMFwiLFwiODAwXFxcXGR7NH18KD86Mnw4MDApXFxcXGR7Nn18KD86MDA4MHxbMy03XSlcXFxcZHs3fVwiLFs3LDgsOSwxMV0sW1tcIihcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIjJbMTZdfDhcIl1dLFtcIihcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIlszLTddXCJdXV1dLFwiUkVcIjpbXCIyNjJcIixcIjAwXCIsXCIoPzoyNnxbNjg5XVxcXFxkKVxcXFxkezd9XCIsWzldLFtbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsyNjg5XVwiXSxcIjAkMVwiXV0sXCIwXCIsMCwwLDAsMCwwLFtbXCIyNig/OjJcXFxcZFxcXFxkfDMoPzowXFxcXGR8MVswLTNdKSlcXFxcZHs0fVwiXSxbXCIoPzo2OSg/OjJcXFxcZFxcXFxkfDMoPzowWzAtNDZdfDFbMDEzXXwyWzAtMl18M1swLTM5XXw0XFxcXGR8NVswLTVdfDZbMC02XXw3WzAtMjddfDhbMC04XXw5WzAtNDc5XSkpfDkoPzozOTlbMC0yXXw0NzkwfDc2KD86MlsyN118M1swLTM3XXw5XFxcXGQpKSlcXFxcZHs0fVwiXSxbXCI4MFxcXFxkezd9XCJdLFtcIjg5WzEtMzctOV1cXFxcZHs2fVwiXSwwLDAsMCwwLDAsW1wiOCg/OjFbMDE5XXwyWzAxNTZdfDg0fDkwKVxcXFxkezZ9XCJdXV0sXCJST1wiOltcIjQwXCIsXCIwMFwiLFwiKD86WzIzNzhdXFxcXGR8OTApXFxcXGR7N318WzIzXVxcXFxkezV9XCIsWzYsOV0sW1tcIihcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMlwiLFtcIjJbMy02XVwiLFwiMlszLTZdXFxcXGQ5XCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIjIxOXwzMVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzIzXTFcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIlsyMzctOV1cIl0sXCIwJDFcIl1dLFwiMFwiLDAsMCwwLDAsMCwwLDAsXCIgaW50IFwiXSxcIlJTXCI6W1wiMzgxXCIsXCIwMFwiLFwiMzhbMDItOV1cXFxcZHs2LDl9fDZcXFxcZHs3LDl9fDkwXFxcXGR7NCw4fXwzOFxcXFxkezUsNn18KD86N1xcXFxkXFxcXGR8ODAwKVxcXFxkezMsOX18KD86WzEyXVxcXFxkfDNbMC03OV0pXFxcXGR7NSwxMH1cIixbNiw3LDgsOSwxMCwxMSwxMl0sW1tcIihcXFxcZHszfSkoXFxcXGR7Myw5fSlcIixcIiQxICQyXCIsW1wiKD86MlszODldfDM5KTB8WzctOV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs1LDEwfSlcIixcIiQxICQyXCIsW1wiWzEtMzZdXCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJSVVwiOltcIjdcIixcIjgxMFwiLFwiOFxcXFxkezEzfXxbMzQ3LTldXFxcXGR7OX1cIixbMTAsMTRdLFtbXCIoXFxcXGR7NH0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjcoPzoxWzAtOF18MlsxLTldKVwiLFwiNyg/OjEoPzpbMC0zNTZdMnw0WzI5XXw3fDhbMjddKXwyKD86MVsyM118WzItOV0yKSlcIixcIjcoPzoxKD86WzAtMzU2XTJ8NFsyOV18N3w4WzI3XSl8Mig/OjEzWzAzLTY5XXw2MlswMTMtOV0pKXw3MlsxLTU3LTldMlwiXSxcIjggKCQxKVwiLDFdLFtcIihcXFxcZHs1fSkoXFxcXGQpKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiNyg/OjFbMC02OF18MlsxLTldKVwiLFwiNyg/OjEoPzpbMDZdWzMtNl18WzE4XXwyWzM1XXxbMy01XVszLTVdKXwyKD86WzEzXVszLTVdfFsyNC02ODldfDdbNDU3XSkpXCIsXCI3KD86MSg/OjAoPzpbMzU2XXw0WzAyM10pfFsxOF18Mig/OjNbMDEzLTldfDUpfDNbNDVdfDQzWzAxMy03OV18NSg/OjNbMS04XXw0WzEtN118NSl8Nig/OjNbMC0zNS05XXxbNC02XSkpfDIoPzoxKD86M1sxNzhdfFs0NV0pfFsyNC02ODldfDNbMzVdfDdbNDU3XSkpfDcoPzoxNHwyMyk0WzAtOF18NzEoPzozM3w0NSlbMS03OV1cIl0sXCI4ICgkMSlcIiwxXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiN1wiXSxcIjggKCQxKVwiLDFdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyLSQzLSQ0XCIsW1wiWzM0OV18OCg/OlswMi03XXwxWzEtOF0pXCJdLFwiOCAoJDEpXCIsMV0sW1wiKFxcXFxkezR9KShcXFxcZHs0fSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCI4XCJdLFwiOCAoJDEpXCJdXSxcIjhcIiwwLDAsMCwwLFwiM1swNC02ODldfFs0ODldXCIsMCxcIjh+MTBcIl0sXCJSV1wiOltcIjI1MFwiLFwiMDBcIixcIig/OjA2fFsyN11cXFxcZFxcXFxkfFs4OV0wMClcXFxcZHs2fVwiLFs4LDldLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjBcIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbNy05XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiMlwiXV1dLFwiMFwiXSxcIlNBXCI6W1wiOTY2XCIsXCIwMFwiLFwiOTJcXFxcZHs3fXwoPzpbMTVdfDhcXFxcZClcXFxcZHs4fVwiLFs5LDEwXSxbW1wiKFxcXFxkezR9KShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiOVwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjFcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjVcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7Myw0fSlcIixcIiQxICQyICQzXCIsW1wiODFcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjhcIl1dXSxcIjBcIl0sXCJTQlwiOltcIjY3N1wiLFwiMFswMV1cIixcIig/OlsxLTZdfFs3LTldXFxcXGRcXFxcZClcXFxcZHs0fVwiLFs1LDddLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezV9KVwiLFwiJDEgJDJcIixbXCI3fDhbNC05XXw5KD86WzEtOF18OVswLThdKVwiXV1dXSxcIlNDXCI6W1wiMjQ4XCIsXCIwMTB8MFswLTJdXCIsXCI4MDBcXFxcZHs0fXwoPzpbMjQ5XVxcXFxkfDY0KVxcXFxkezV9XCIsWzddLFtbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiWzI0Nl18OVs1N11cIl1dXSwwLDAsMCwwLDAsMCwwLFwiMDBcIl0sXCJTRFwiOltcIjI0OVwiLFwiMDBcIixcIlsxOV1cXFxcZHs4fVwiLFs5XSxbW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsxOV1cIl0sXCIwJDFcIl1dLFwiMFwiXSxcIlNFXCI6W1wiNDZcIixcIjAwXCIsXCIoPzpbMjZdXFxcXGRcXFxcZHw5KVxcXFxkezl9fFsxLTldXFxcXGR7OH18WzEtNjg5XVxcXFxkezd9fFsxLTQ2ODldXFxcXGR7Nn18MlxcXFxkezV9XCIsWzYsNyw4LDksMTBdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezIsM30pKFxcXFxkezJ9KVwiLFwiJDEtJDIgJDNcIixbXCIyMFwiXSxcIjAkMVwiLDAsXCIkMSAkMiAkM1wiXSxbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEtJDJcIixbXCI5KD86MDB8Mzl8NDR8OSlcIl0sXCIwJDFcIiwwLFwiJDEgJDJcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Mn0pXCIsXCIkMS0kMiAkM1wiLFtcIlsxMl1bMTM2XXwzWzM1Nl18NFswMjQ2XXw2WzAzXXw5MFsxLTldXCJdLFwiMCQxXCIsMCxcIiQxICQyICQzXCJdLFtcIihcXFxcZCkoXFxcXGR7MiwzfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEtJDIgJDMgJDRcIixbXCI4XCJdLFwiMCQxXCIsMCxcIiQxICQyICQzICQ0XCJdLFtcIihcXFxcZHszfSkoXFxcXGR7MiwzfSkoXFxcXGR7Mn0pXCIsXCIkMS0kMiAkM1wiLFtcIjFbMjQ1N118Mig/OlsyNDctOV18NVswMTM4XSl8M1swMjQ3LTldfDRbMTM1Ny05XXw1WzAtMzUtOV18Nig/OlsxMjU2ODldfDRbMDItNTddfDdbMC0yXSl8OSg/OlsxMjUtOF18M1swMi01XXw0WzAtM10pXCJdLFwiMCQxXCIsMCxcIiQxICQyICQzXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7MiwzfSkoXFxcXGR7M30pXCIsXCIkMS0kMiAkM1wiLFtcIjkoPzowMHwzOXw0NClcIl0sXCIwJDFcIiwwLFwiJDEgJDIgJDNcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHsyLDN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMS0kMiAkMyAkNFwiLFtcIjFbMTM2ODldfDJbMDEzNl18M1sxMzU2XXw0WzAyNDZdfDU0fDZbMDNdfDkwWzEtOV1cIl0sXCIwJDFcIiwwLFwiJDEgJDIgJDMgJDRcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEtJDIgJDMgJDRcIixbXCIxMHw3XCJdLFwiMCQxXCIsMCxcIiQxICQyICQzICQ0XCJdLFtcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHsyfSlcIixcIiQxLSQyICQzICQ0XCIsW1wiOFwiXSxcIjAkMVwiLDAsXCIkMSAkMiAkMyAkNFwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMS0kMiAkMyAkNFwiLFtcIlsxMy01XXwyKD86WzI0Ny05XXw1WzAxMzhdKXw2KD86WzEyNC02ODldfDdbMC0yXSl8OSg/OlsxMjUtOF18M1swMi01XXw0WzAtM10pXCJdLFwiMCQxXCIsMCxcIiQxICQyICQzICQ0XCJdLFtcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHszfSlcIixcIiQxLSQyICQzICQ0XCIsW1wiOVwiXSxcIjAkMVwiLDAsXCIkMSAkMiAkMyAkNFwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEtJDIgJDMgJDQgJDVcIixbXCJbMjZdXCJdLFwiMCQxXCIsMCxcIiQxICQyICQzICQ0ICQ1XCJdXSxcIjBcIl0sXCJTR1wiOltcIjY1XCIsXCIwWzAtM11cXFxcZFwiLFwiKD86KD86MVxcXFxkfDgpXFxcXGRcXFxcZHw3MDAwKVxcXFxkezd9fFszNjg5XVxcXFxkezd9XCIsWzgsMTAsMTFdLFtbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMzY5XXw4KD86MFsxLTZdfFsxLTldKVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjhcIl1dLFtcIihcXFxcZHs0fSkoXFxcXGR7NH0pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCI3XCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiMVwiXV1dXSxcIlNIXCI6W1wiMjkwXCIsXCIwMFwiLFwiKD86WzI1Nl1cXFxcZHw4KVxcXFxkezN9XCIsWzQsNV0sMCwwLDAsMCwwLDAsXCJbMjU2XVwiXSxcIlNJXCI6W1wiMzg2XCIsXCIwMHwxMCg/OjIyfDY2fDg4fDk5KVwiLFwiWzEtN11cXFxcZHs3fXw4XFxcXGR7NCw3fXw5MFxcXFxkezQsNn1cIixbNSw2LDcsOF0sW1tcIihcXFxcZHsyfSkoXFxcXGR7Myw2fSlcIixcIiQxICQyXCIsW1wiOFswOV18OVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezV9KVwiLFwiJDEgJDJcIixbXCI1OXw4XCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbMzddWzAxXXw0WzAxMzldfDUxfDZcIl0sXCIwJDFcIl0sW1wiKFxcXFxkKShcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbMS01N11cIl0sXCIoMCQxKVwiXV0sXCIwXCIsMCwwLDAsMCwwLDAsXCIwMFwiXSxcIlNKXCI6W1wiNDdcIixcIjAwXCIsXCIwXFxcXGR7NH18KD86WzQ4OV1cXFxcZHxbNTddOSlcXFxcZHs2fVwiLFs1LDhdLDAsMCwwLDAsMCwwLFwiNzlcIl0sXCJTS1wiOltcIjQyMVwiLFwiMDBcIixcIlsyLTY4OV1cXFxcZHs4fXxbMi01OV1cXFxcZHs2fXxbMi01XVxcXFxkezV9XCIsWzYsNyw5XSxbW1wiKFxcXFxkKShcXFxcZHsyfSkoXFxcXGR7Myw0fSlcIixcIiQxICQyICQzXCIsW1wiMjFcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7MiwzfSlcIixcIiQxICQyICQzXCIsW1wiWzMtNV1bMS04XTFcIixcIlszLTVdWzEtOF0xWzY3XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7Mn0pXCIsXCIkMS8kMiAkMyAkNFwiLFtcIjJcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIls2ODldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxLyQyICQzICQ0XCIsW1wiWzMtNV1cIl0sXCIwJDFcIl1dLFwiMFwiXSxcIlNMXCI6W1wiMjMyXCIsXCIwMFwiLFwiKD86WzIzNy05XVxcXFxkfDY2KVxcXFxkezZ9XCIsWzhdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezZ9KVwiLFwiJDEgJDJcIixbXCJbMjM2LTldXCJdLFwiKDAkMSlcIl1dLFwiMFwiXSxcIlNNXCI6W1wiMzc4XCIsXCIwMFwiLFwiKD86MDU0OXxbNS03XVxcXFxkKVxcXFxkezZ9XCIsWzgsMTBdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIls1LTddXCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezZ9KVwiLFwiJDEgJDJcIixbXCIwXCJdXV0sMCwwLFwiKFs4OV1cXFxcZHs1fSkkXCIsXCIwNTQ5JDFcIl0sXCJTTlwiOltcIjIyMVwiLFwiMDBcIixcIig/OlszNzhdXFxcXGR8OTMpXFxcXGR7N31cIixbOV0sW1tcIihcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiOFwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbMzc5XVwiXV1dXSxcIlNPXCI6W1wiMjUyXCIsXCIwMFwiLFwiWzM0Ni05XVxcXFxkezh9fFsxMjY3OV1cXFxcZHs3fXxbMS01XVxcXFxkezZ9fFsxMzQ4XVxcXFxkezV9XCIsWzYsNyw4LDldLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCI4WzEyNV1cIl1dLFtcIihcXFxcZHs2fSlcIixcIiQxXCIsW1wiWzEzNF1cIl1dLFtcIihcXFxcZCkoXFxcXGR7Nn0pXCIsXCIkMSAkMlwiLFtcIlsxNV18MlswLTc5XXwzWzAtNDYtOF18NFswLTddXCJdXSxbXCIoXFxcXGQpKFxcXFxkezd9KVwiLFwiJDEgJDJcIixbXCIoPzoyfDkwKTR8WzY3XVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIlszNDc4XXw2NHw5MFwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHs1LDd9KVwiLFwiJDEgJDJcIixbXCIxfDI4fDYoPzowWzUtN118WzEtMzUtOV0pfDlbMi05XVwiXV1dLFwiMFwiXSxcIlNSXCI6W1wiNTk3XCIsXCIwMFwiLFwiKD86WzItNV18Njh8Wzc4XVxcXFxkKVxcXFxkezV9XCIsWzYsN10sW1tcIihcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEtJDItJDNcIixbXCI1NlwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxLSQyXCIsW1wiWzItNV1cIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMS0kMlwiLFtcIls2LThdXCJdXV1dLFwiU1NcIjpbXCIyMTFcIixcIjAwXCIsXCJbMTldXFxcXGR7OH1cIixbOV0sW1tcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbMTldXCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJTVFwiOltcIjIzOVwiLFwiMDBcIixcIig/OjIyfDlcXFxcZClcXFxcZHs1fVwiLFs3XSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiWzI5XVwiXV1dXSxcIlNWXCI6W1wiNTAzXCIsXCIwMFwiLFwiWzI2N11cXFxcZHs3fXxbODldMDBcXFxcZHs0fSg/OlxcXFxkezR9KT9cIixbNyw4LDExXSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiWzg5XVwiXV0sW1wiKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiWzI2N11cIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbODldXCJdXV1dLFwiU1hcIjpbXCIxXCIsXCIwMTFcIixcIjcyMTVcXFxcZHs2fXwoPzpbNThdXFxcXGRcXFxcZHw5MDApXFxcXGR7N31cIixbMTBdLDAsXCIxXCIsMCxcIig1XFxcXGR7Nn0pJHwxXCIsXCI3MjEkMVwiLDAsXCI3MjFcIl0sXCJTWVwiOltcIjk2M1wiLFwiMDBcIixcIlsxLTM5XVxcXFxkezh9fFsxLTVdXFxcXGR7N31cIixbOCw5XSxbW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Myw0fSlcIixcIiQxICQyICQzXCIsW1wiWzEtNV1cIl0sXCIwJDFcIiwxXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiOVwiXSxcIjAkMVwiLDFdXSxcIjBcIl0sXCJTWlwiOltcIjI2OFwiLFwiMDBcIixcIjA4MDBcXFxcZHs0fXwoPzpbMjM3XVxcXFxkfDkwMClcXFxcZHs2fVwiLFs4LDldLFtbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMDIzN11cIl1dLFtcIihcXFxcZHs1fSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIjlcIl1dXV0sXCJUQVwiOltcIjI5MFwiLFwiMDBcIixcIjhcXFxcZHszfVwiLFs0XSwwLDAsMCwwLDAsMCxcIjhcIl0sXCJUQ1wiOltcIjFcIixcIjAxMVwiLFwiKD86WzU4XVxcXFxkXFxcXGR8NjQ5fDkwMClcXFxcZHs3fVwiLFsxMF0sMCxcIjFcIiwwLFwiKFsyLTQ3OV1cXFxcZHs2fSkkfDFcIixcIjY0OSQxXCIsMCxcIjY0OVwiXSxcIlREXCI6W1wiMjM1XCIsXCIwMHwxNlwiLFwiKD86MjJ8WzY5XVxcXFxkfDc3KVxcXFxkezZ9XCIsWzhdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsyNjc5XVwiXV1dLDAsMCwwLDAsMCwwLDAsXCIwMFwiXSxcIlRHXCI6W1wiMjI4XCIsXCIwMFwiLFwiWzI3OV1cXFxcZHs3fVwiLFs4XSxbW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbMjc5XVwiXV1dXSxcIlRIXCI6W1wiNjZcIixcIjAwWzEtOV1cIixcIig/OjAwMTgwMHxbMi01N118WzY4OV1cXFxcZClcXFxcZHs3fXwxXFxcXGR7Nyw5fVwiLFs4LDksMTAsMTNdLFtbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiMlwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMTMtOV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjFcIl1dXSxcIjBcIl0sXCJUSlwiOltcIjk5MlwiLFwiODEwXCIsXCIoPzowMHxbMS01Ny05XVxcXFxkKVxcXFxkezd9XCIsWzldLFtbXCIoXFxcXGR7Nn0pKFxcXFxkKShcXFxcZHsyfSlcIixcIiQxICQyICQzXCIsW1wiMzMxXCIsXCIzMzE3XCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzM0XTd8OTFbNzhdXCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkKShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiM1sxLTVdXCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzAtNTctOV1cIl1dXSwwLDAsMCwwLDAsMCwwLFwiOH4xMFwiXSxcIlRLXCI6W1wiNjkwXCIsXCIwMFwiLFwiWzItNDddXFxcXGR7Myw2fVwiLFs0LDUsNiw3XV0sXCJUTFwiOltcIjY3MFwiLFwiMDBcIixcIjdcXFxcZHs3fXwoPzpbMi00N11cXFxcZHxbODldMClcXFxcZHs1fVwiLFs3LDhdLFtbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMi00ODldfDcwXCJdXSxbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCI3XCJdXV1dLFwiVE1cIjpbXCI5OTNcIixcIjgxMFwiLFwiWzEtNl1cXFxcZHs3fVwiLFs4XSxbW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDItJDMtJDRcIixbXCIxMlwiXSxcIig4ICQxKVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkKShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMi0kMy0kNFwiLFtcIlsxLTVdXCJdLFwiKDggJDEpXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7Nn0pXCIsXCIkMSAkMlwiLFtcIjZcIl0sXCI4ICQxXCJdXSxcIjhcIiwwLDAsMCwwLDAsMCxcIjh+MTBcIl0sXCJUTlwiOltcIjIxNlwiLFwiMDBcIixcIlsyLTU3LTldXFxcXGR7N31cIixbOF0sW1tcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbMi01Ny05XVwiXV1dXSxcIlRPXCI6W1wiNjc2XCIsXCIwMFwiLFwiKD86MDgwMHwoPzpbNS04XVxcXFxkXFxcXGR8OTk5KVxcXFxkKVxcXFxkezN9fFsyLThdXFxcXGR7NH1cIixbNSw3XSxbW1wiKFxcXFxkezJ9KShcXFxcZHszfSlcIixcIiQxLSQyXCIsW1wiWzItNF18NTB8NlswOV18N1swLTI0LTY5XXw4WzA1XVwiXV0sW1wiKFxcXFxkezR9KShcXFxcZHszfSlcIixcIiQxICQyXCIsW1wiMFwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiWzUtOV1cIl1dXV0sXCJUUlwiOltcIjkwXCIsXCIwMFwiLFwiNFxcXFxkezZ9fDhcXFxcZHsxMSwxMn18KD86WzItNThdXFxcXGRcXFxcZHw5MDApXFxcXGR7N31cIixbNywxMCwxMiwxM10sW1tcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCI1MTJ8OFswMTU4OV18OTBcIl0sXCIwJDFcIiwxXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjUoPzpbMC01OV18NjEpXCIsXCI1KD86WzAtNTldfDYxNilcIixcIjUoPzpbMC01OV18NjE2MSlcIl0sXCIwJDFcIiwxXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIlsyNF1bMS04XXwzWzEtOV1cIl0sXCIoMCQxKVwiLDFdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezYsN30pXCIsXCIkMSAkMiAkM1wiLFtcIjgwXCJdLFwiMCQxXCIsMV1dLFwiMFwiXSxcIlRUXCI6W1wiMVwiLFwiMDExXCIsXCIoPzpbNThdXFxcXGRcXFxcZHw5MDApXFxcXGR7N31cIixbMTBdLDAsXCIxXCIsMCxcIihbMi00Ni04XVxcXFxkezZ9KSR8MVwiLFwiODY4JDFcIiwwLFwiODY4XCJdLFwiVFZcIjpbXCI2ODhcIixcIjAwXCIsXCIoPzoyfDdcXFxcZFxcXFxkfDkwKVxcXFxkezR9XCIsWzUsNiw3XSxbW1wiKFxcXFxkezJ9KShcXFxcZHszfSlcIixcIiQxICQyXCIsW1wiMlwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiOTBcIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7NX0pXCIsXCIkMSAkMlwiLFtcIjdcIl1dXV0sXCJUV1wiOltcIjg4NlwiLFwiMCg/OjBbMjUtNzldfDE5KVwiLFwiWzItNjg5XVxcXFxkezh9fDdcXFxcZHs5LDEwfXxbMi04XVxcXFxkezd9fDJcXFxcZHs2fVwiLFs3LDgsOSwxMCwxMV0sW1tcIihcXFxcZHsyfSkoXFxcXGQpKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIyMDJcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Myw0fSlcIixcIiQxICQyICQzXCIsW1wiWzI1OF0wXCJdLFwiMCQxXCJdLFtcIihcXFxcZCkoXFxcXGR7Myw0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsyMzU2OF18NCg/OjBbMDItNDhdfFsxLTQ3LTldKXw3WzEtOV1cIixcIlsyMzU2OF18NCg/OjBbMi00OF18WzEtNDctOV0pfCg/OjQwMHw3KVsxLTldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCJbNDldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7NH0pKFxcXFxkezQsNX0pXCIsXCIkMSAkMiAkM1wiLFtcIjdcIl0sXCIwJDFcIl1dLFwiMFwiLDAsMCwwLDAsMCwwLDAsXCIjXCJdLFwiVFpcIjpbXCIyNTVcIixcIjAwWzA1Nl1cIixcIig/OlsyNS04XVxcXFxkfDQxfDkwKVxcXFxkezd9XCIsWzldLFtbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzg5XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzI0XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezd9KVwiLFwiJDEgJDJcIixbXCI1XCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiWzY3XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiVUFcIjpbXCIzODBcIixcIjAwXCIsXCJbODldXFxcXGR7OX18WzMtOV1cXFxcZHs4fVwiLFs5LDEwXSxbW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjZbMTJdWzI5XXwoPzozWzEtOF18NFsxMzYtOF18NVsxMjQ1N118Nls0OV0pMnwoPzo1Nnw2NSlbMjRdXCIsXCI2WzEyXVsyOV18KD86MzV8NFsxMzc4XXw1WzEyNDU3XXw2WzQ5XSkyfCg/OjU2fDY1KVsyNF18KD86M1sxLTQ2LThdfDQ2KTJbMDEzLTldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHs0fSkoXFxcXGR7NX0pXCIsXCIkMSAkMlwiLFtcIjNbMS04XXw0KD86WzEzNjddfFs0NV1bNi05XXw4WzQtNl0pfDUoPzpbMS01XXw2WzAxMzU2ODldfDdbNC02XSl8Nig/OlsxMl1bMy03XXxbNDU5XSlcIixcIjNbMS04XXw0KD86WzEzNjddfFs0NV1bNi05XXw4WzQtNl0pfDUoPzpbMS01XXw2KD86WzAxNTY4OV18M1swMjM4OV0pfDdbNC02XSl8Nig/OlsxMl1bMy03XXxbNDU5XSlcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIlszLTddfDg5fDlbMS05XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCJbODldXCJdLFwiMCQxXCJdXSxcIjBcIiwwLDAsMCwwLDAsMCxcIjB+MFwiXSxcIlVHXCI6W1wiMjU2XCIsXCIwMFswNTddXCIsXCI4MDBcXFxcZHs2fXwoPzpbMjldMHxbMzQ3XVxcXFxkKVxcXFxkezd9XCIsWzldLFtbXCIoXFxcXGR7NH0pKFxcXFxkezV9KVwiLFwiJDEgJDJcIixbXCIyMDJcIixcIjIwMjRcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHs2fSlcIixcIiQxICQyXCIsW1wiWzI3LTldfDQoPzo2WzQ1XXxbNy05XSlcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHs3fSlcIixcIiQxICQyXCIsW1wiWzM0XVwiXSxcIjAkMVwiXV0sXCIwXCJdLFwiVVNcIjpbXCIxXCIsXCIwMTFcIixcIlsyLTldXFxcXGR7OX18M1xcXFxkezZ9XCIsWzEwXSxbW1wiKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxLSQyXCIsW1wiMzEwXCJdLDAsMV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIoJDEpICQyLSQzXCIsW1wiWzItOV1cIl0sMCwxLFwiJDEtJDItJDNcIl1dLFwiMVwiLDAsMCwwLDAsMCxbW1wiKD86NDcyMjBbMDFdfDUoPzowNSg/OlsyLTU3LTldXFxcXGRcXFxcZHw2KD86WzAtMzUtOV1cXFxcZHw0WzQ2XSkpfDU3MjAwKSlcXFxcZHs0fXwoPzoyKD86MFsxLTM1LTldfDFbMDItOV18MlswMy01ODldfDNbMTQ5XXw0WzA4XXw1WzEtNDZdfDZbMDI3OV18N1swMjY5XXw4WzEzXSl8Myg/OjBbMS01Ny05XXwxWzAyLTldfDJbMDEzNTZdfDNbMC0yNDY3OV18NFsxNjddfDVbMC0yXXw2WzAxNF18OFswNTZdKXw0KD86MFsxMjQtOV18MVswMi01NzldfDJbMy01XXwzWzAyNDVdfDRbMDIzNTc4XXw1OHw2WzM0OV18N1swNTg5XXw4WzA0XSl8NSg/OjBbMS00Ny05XXwxWzAyMzUtOF18MjB8M1swMTQ5XXw0WzAxXXw1WzE5XXw2WzEtNDddfDdbMC01XXw4WzAyNTZdKXw2KD86MFsxLTM1LTldfDFbMDI0LTldfDJbMDM2ODldfFszNF1bMDE2XXw1WzAxNjc5XXw2WzAtMjc5XXw3OHw4WzAtMjldKXw3KD86MFsxLTQ2LThdfDFbMi05XXwyWzA0LTddfDNbMTI0N118NFswMzddfDVbNDddfDZbMDIzNTldfDdbMC01OV18OFsxNTZdKXw4KD86MFsxLTY4XXwxWzAyLThdfDJbMDY4XXwzWzAtMjU4OV18NFswMzU3OF18NVswNDYtOV18NlswMi01XXw3WzAyOF0pfDkoPzowWzEzNDYtOV18MVswMi05XXwyWzA1ODldfDNbMDE0Ni04XXw0WzAxMzU3LTldfDVbMTI0NjldfDdbMC0zODldfDhbMDQtNjldKSlbMi05XVxcXFxkezZ9XCJdLFtcIlwiXSxbXCI4KD86MDB8MzN8NDR8NTV8NjZ8Nzd8ODgpWzItOV1cXFxcZHs2fVwiXSxbXCI5MDBbMi05XVxcXFxkezZ9XCJdLFtcIjUyKD86Myg/OlsyLTQ2LTldWzAyLTldXFxcXGR8NSg/OlswMi00Ni05XVxcXFxkfDVbMC00Ni05XSkpfDQoPzpbMi00NzhdWzAyLTldXFxcXGR8NSg/OlswMzRdXFxcXGR8MlswMjQtOV18NVswLTQ2LTldKXw2KD86MFsxLTldfFsyLTldXFxcXGQpfDkoPzpbMDUtOV1cXFxcZHwyWzAtNV18NDkpKSlcXFxcZHs0fXw1MlszNF1bMi05XTFbMDItOV1cXFxcZHs0fXw1KD86MDB8MlsxMjUtOV18MzN8NDR8NjZ8Nzd8ODgpWzItOV1cXFxcZHs2fVwiXV1dLFwiVVlcIjpbXCI1OThcIixcIjAoPzowfDFbMy05XVxcXFxkKVwiLFwiKD86MDAwNHw0KVxcXFxkezl9fFsxMjQ5XVxcXFxkezd9fCg/Ols0OV1cXFxcZHw4MClcXFxcZHs1fVwiLFs3LDgsMTAsMTNdLFtbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCI0MDV8OHw5MFwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiOVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMTI0XVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjRcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCIwXCJdXV0sXCIwXCIsMCwwLDAsMCwwLDAsXCIwMFwiLFwiIGludC4gXCJdLFwiVVpcIjpbXCI5OThcIixcIjgxMFwiLFwiKD86MzN8WzUtNzldXFxcXGR8ODgpXFxcXGR7N31cIixbOV0sW1tcIihcXFxcZHsyfSkoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSlcIixcIiQxICQyICQzICQ0XCIsW1wiWzM1LTldXCJdLFwiOCAkMVwiXV0sXCI4XCIsMCwwLDAsMCwwLDAsXCI4fjEwXCJdLFwiVkFcIjpbXCIzOVwiLFwiMDBcIixcIjBcXFxcZHs1LDEwfXwzWzAtOF1cXFxcZHs3LDEwfXw1NVxcXFxkezh9fDhcXFxcZHs1fSg/OlxcXFxkezIsNH0pP3woPzoxXFxcXGR8MzkpXFxcXGR7Nyw4fVwiLFs2LDcsOCw5LDEwLDExXSwwLDAsMCwwLDAsMCxcIjA2Njk4XCJdLFwiVkNcIjpbXCIxXCIsXCIwMTFcIixcIig/Ols1OF1cXFxcZFxcXFxkfDc4NHw5MDApXFxcXGR7N31cIixbMTBdLDAsXCIxXCIsMCxcIihbMi03XVxcXFxkezZ9KSR8MVwiLFwiNzg0JDFcIiwwLFwiNzg0XCJdLFwiVkVcIjpbXCI1OFwiLFwiMDBcIixcIls2OF0wMFxcXFxkezd9fCg/OlsyNF1cXFxcZHxbNTldMClcXFxcZHs4fVwiLFsxMF0sW1tcIihcXFxcZHszfSkoXFxcXGR7N30pXCIsXCIkMS0kMlwiLFtcIlsyNC02ODldXCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJWR1wiOltcIjFcIixcIjAxMVwiLFwiKD86Mjg0fFs1OF1cXFxcZFxcXFxkfDkwMClcXFxcZHs3fVwiLFsxMF0sMCxcIjFcIiwwLFwiKFsyLTU3OF1cXFxcZHs2fSkkfDFcIixcIjI4NCQxXCIsMCxcIjI4NFwiXSxcIlZJXCI6W1wiMVwiLFwiMDExXCIsXCJbNThdXFxcXGR7OX18KD86MzR8OTApMFxcXFxkezd9XCIsWzEwXSwwLFwiMVwiLDAsXCIoWzItOV1cXFxcZHs2fSkkfDFcIixcIjM0MCQxXCIsMCxcIjM0MFwiXSxcIlZOXCI6W1wiODRcIixcIjAwXCIsXCJbMTJdXFxcXGR7OX18WzEzNS05XVxcXFxkezh9fFsxNl1cXFxcZHs3fXxbMTYtOF1cXFxcZHs2fVwiLFs3LDgsOSwxMF0sW1tcIihcXFxcZHsyfSkoXFxcXGR7NX0pXCIsXCIkMSAkMlwiLFtcIjgwXCJdLFwiMCQxXCIsMV0sW1wiKFxcXFxkezR9KShcXFxcZHs0LDZ9KVwiLFwiJDEgJDJcIixbXCIxXCJdLDAsMV0sW1wiKFxcXFxkezJ9KShcXFxcZHszfSkoXFxcXGR7Mn0pKFxcXFxkezJ9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbNjldXCJdLFwiMCQxXCIsMV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIlszNTc4XVwiXSxcIjAkMVwiLDFdLFtcIihcXFxcZHsyfSkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIyWzQ4XVwiXSxcIjAkMVwiLDFdLFtcIihcXFxcZHszfSkoXFxcXGR7NH0pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCIyXCJdLFwiMCQxXCIsMV1dLFwiMFwiXSxcIlZVXCI6W1wiNjc4XCIsXCIwMFwiLFwiWzU3LTldXFxcXGR7Nn18KD86WzIzOF1cXFxcZHw0OClcXFxcZHszfVwiLFs1LDddLFtbXCIoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbNTctOV1cIl1dXV0sXCJXRlwiOltcIjY4MVwiLFwiMDBcIixcIig/OjQwfDcyKVxcXFxkezR9fDhcXFxcZHs1fSg/OlxcXFxkezN9KT9cIixbNiw5XSxbW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkM1wiLFtcIls0NzhdXCJdXSxbXCIoXFxcXGR7M30pKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7Mn0pXCIsXCIkMSAkMiAkMyAkNFwiLFtcIjhcIl1dXV0sXCJXU1wiOltcIjY4NVwiLFwiMFwiLFwiKD86WzItNl18OFxcXFxkezV9KVxcXFxkezR9fFs3OF1cXFxcZHs2fXxbNjhdXFxcXGR7NX1cIixbNSw2LDcsMTBdLFtbXCIoXFxcXGR7NX0pXCIsXCIkMVwiLFtcIlsyLTVdfDZbMS05XVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHszLDd9KVwiLFwiJDEgJDJcIixbXCJbNjhdXCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezV9KVwiLFwiJDEgJDJcIixbXCI3XCJdXV1dLFwiWEtcIjpbXCIzODNcIixcIjAwXCIsXCJbMjNdXFxcXGR7Nyw4fXwoPzo0XFxcXGRcXFxcZHxbODldMDApXFxcXGR7NX1cIixbOCw5XSxbW1wiKFxcXFxkezN9KShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiWzg5XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiWzItNF1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIlsyM11cIl0sXCIwJDFcIl1dLFwiMFwiXSxcIllFXCI6W1wiOTY3XCIsXCIwMFwiLFwiKD86MXw3XFxcXGQpXFxcXGR7N318WzEtN11cXFxcZHs2fVwiLFs3LDgsOV0sW1tcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezMsNH0pXCIsXCIkMSAkMiAkM1wiLFtcIlsxLTZdfDcoPzpbMjQtNl18OFswLTddKVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiN1wiXSxcIjAkMVwiXV0sXCIwXCJdLFwiWVRcIjpbXCIyNjJcIixcIjAwXCIsXCIoPzooPzooPzoyNnw2Myk5fDgwXFxcXGQpXFxcXGRcXFxcZHw5Mzk4MClcXFxcZHs0fVwiLFs5XSwwLFwiMFwiLDAsMCwwLDAsXCIyNjl8NjN8OTM5OFwiXSxcIlpBXCI6W1wiMjdcIixcIjAwXCIsXCJbMS03OV1cXFxcZHs4fXw4XFxcXGR7NCw5fVwiLFs1LDYsNyw4LDksMTBdLFtbXCIoXFxcXGR7Mn0pKFxcXFxkezMsNH0pXCIsXCIkMSAkMlwiLFtcIjhbMS00XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHsyLDN9KVwiLFwiJDEgJDIgJDNcIixbXCI4WzEtNF1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIjg2MFwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiWzEtOV1cIl0sXCIwJDFcIl0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjhcIl0sXCIwJDFcIl1dLFwiMFwiXSxcIlpNXCI6W1wiMjYwXCIsXCIwMFwiLFwiODAwXFxcXGR7Nn18KD86MjF8NjN8Wzc5XVxcXFxkKVxcXFxkezd9XCIsWzldLFtbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSlcIixcIiQxICQyICQzXCIsW1wiWzI4XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezd9KVwiLFwiJDEgJDJcIixbXCJbNzldXCJdLFwiMCQxXCJdXSxcIjBcIl0sXCJaV1wiOltcIjI2M1wiLFwiMDBcIixcIjIoPzpbMC01Ny05XVxcXFxkezYsOH18NlswLTI0LTldXFxcXGR7Niw3fSl8WzM4XVxcXFxkezl9fFszNS04XVxcXFxkezh9fFszLTZdXFxcXGR7N318WzEtNjg5XVxcXFxkezZ9fFsxLTM1NjldXFxcXGR7NX18WzEzNTZdXFxcXGR7NH1cIixbNSw2LDcsOCw5LDEwXSxbW1wiKFxcXFxkezN9KShcXFxcZHszLDV9KVwiLFwiJDEgJDJcIixbXCIyKD86MFs0NV18MlsyNzhdfFs0OV04KXwzKD86WzA5XTh8MTcpfDYoPzpbMjldOHwzN3w3NSl8WzIzXVs3OF18KD86MzN8NVsxNV18Nls2OF0pWzc4XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGQpKFxcXFxkezN9KShcXFxcZHsyLDR9KVwiLFwiJDEgJDIgJDNcIixbXCJbNDldXCJdLFwiMCQxXCJdLFtcIihcXFxcZHszfSkoXFxcXGR7NH0pXCIsXCIkMSAkMlwiLFtcIjgwXCJdLFwiMCQxXCJdLFtcIihcXFxcZHsyfSkoXFxcXGR7N30pXCIsXCIkMSAkMlwiLFtcIjI0fDhbMTMtNTldfCg/OjJbMDUtNzldfDM5fDVbNDVdfDZbMTUtOF0pMlwiLFwiMig/OjAyWzAxNF18NHxbNTZdMjB8Wzc5XTIpfDM5Mnw1KD86NDJ8NTI1KXw2KD86WzE2LThdMjF8NTJbMDEzXSl8OFsxMy01OV1cIl0sXCIoMCQxKVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiN1wiXSxcIjAkMVwiXSxbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCIyKD86MVszOV18MlswMTU3XXxbMzc4XXxbNTZdWzE0XSl8Myg/OjEyfDI5KVwiLFwiMig/OjFbMzldfDJbMDE1N118WzM3OF18WzU2XVsxNF0pfDMoPzoxMjN8MjkpXCJdLFwiMCQxXCJdLFtcIihcXFxcZHs0fSkoXFxcXGR7Nn0pXCIsXCIkMSAkMlwiLFtcIjhcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezJ9KShcXFxcZHszLDV9KVwiLFwiJDEgJDJcIixbXCIxfDIoPzowWzAtMzYtOV18MTJ8Mjl8WzU2XSl8Myg/OjFbMC02ODldfFsyNC02XSl8NSg/OlswMjM2LTldfDFbMi00XSl8Nig/OlswMTMtNTldfDdbMC00Ni05XSl8KD86MzN8NTV8Nls2OF0pWzAtNjldfCg/OjI5fDNbMDldfDYyKVswLTc5XVwiXSxcIjAkMVwiXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszLDR9KVwiLFwiJDEgJDIgJDNcIixbXCIyOVswMTMtOV18Mzl8NTRcIl0sXCIwJDFcIl0sW1wiKFxcXFxkezR9KShcXFxcZHszLDV9KVwiLFwiJDEgJDJcIixbXCIoPzoyNXw1NCk4XCIsXCIyNTh8NTQ4M1wiXSxcIjAkMVwiXV0sXCIwXCJdfSxcIm5vbkdlb2dyYXBoaWNcIjp7XCI4MDBcIjpbXCI4MDBcIiwwLFwiKD86MDB8WzEtOV1cXFxcZClcXFxcZHs2fVwiLFs4XSxbW1wiKFxcXFxkezR9KShcXFxcZHs0fSlcIixcIiQxICQyXCIsW1wiXFxcXGRcIl1dXSwwLDAsMCwwLDAsMCxbMCwwLFtcIig/OjAwfFsxLTldXFxcXGQpXFxcXGR7Nn1cIl1dXSxcIjgwOFwiOltcIjgwOFwiLDAsXCJbMS05XVxcXFxkezd9XCIsWzhdLFtbXCIoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDJcIixbXCJbMS05XVwiXV1dLDAsMCwwLDAsMCwwLFswLDAsMCwwLDAsMCwwLDAsMCxbXCJbMS05XVxcXFxkezd9XCJdXV0sXCI4NzBcIjpbXCI4NzBcIiwwLFwiN1xcXFxkezExfXxbMzUtN11cXFxcZHs4fVwiLFs5LDEyXSxbW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pXCIsXCIkMSAkMiAkM1wiLFtcIlszNS03XVwiXV1dLDAsMCwwLDAsMCwwLFswLFtcIig/OlszNTZdfDc3NFs0NV0pXFxcXGR7OH18N1s2LThdXFxcXGR7N31cIl1dXSxcIjg3OFwiOltcIjg3OFwiLDAsXCIxMFxcXFxkezEwfVwiLFsxMl0sW1tcIihcXFxcZHsyfSkoXFxcXGR7NX0pKFxcXFxkezV9KVwiLFwiJDEgJDIgJDNcIixbXCIxXCJdXV0sMCwwLDAsMCwwLDAsWzAsMCwwLDAsMCwwLDAsMCxbXCIxMFxcXFxkezEwfVwiXV1dLFwiODgxXCI6W1wiODgxXCIsMCxcIlswLTM2LTldXFxcXGR7OH1cIixbOV0sW1tcIihcXFxcZCkoXFxcXGR7M30pKFxcXFxkezV9KVwiLFwiJDEgJDIgJDNcIixbXCJbMC0zNi05XVwiXV1dLDAsMCwwLDAsMCwwLFswLFtcIlswLTM2LTldXFxcXGR7OH1cIl1dXSxcIjg4MlwiOltcIjg4MlwiLDAsXCJbMTNdXFxcXGR7Nn0oPzpcXFxcZHsyLDV9KT98WzE5XVxcXFxkezd9fCg/OlsyNV1cXFxcZFxcXFxkfDQpXFxcXGR7N30oPzpcXFxcZHsyfSk/XCIsWzcsOCw5LDEwLDExLDEyXSxbW1wiKFxcXFxkezJ9KShcXFxcZHs1fSlcIixcIiQxICQyXCIsW1wiMTZ8MzQyXCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezZ9KVwiLFwiJDEgJDJcIixbXCI0OVwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHsyfSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjFbMzZdfDlcIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7NH0pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCIzWzIzXVwiXV0sW1wiKFxcXFxkezJ9KShcXFxcZHszLDR9KShcXFxcZHs0fSlcIixcIiQxICQyICQzXCIsW1wiMTZcIl1dLFtcIihcXFxcZHsyfSkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIxMHwyM3wzKD86WzE1XXw0WzU3XSl8NHw1MVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjM0XCJdXSxbXCIoXFxcXGR7Mn0pKFxcXFxkezQsNX0pKFxcXFxkezV9KVwiLFwiJDEgJDIgJDNcIixbXCJbMS0zNV1cIl1dXSwwLDAsMCwwLDAsMCxbMCxbXCIzNDJcXFxcZHs0fXwoPzozMzd8NDkpXFxcXGR7Nn18KD86Myg/OjJ8NDd8N1xcXFxkezN9KXw1MFxcXFxkezN9KVxcXFxkezd9XCIsWzcsOCw5LDEwLDEyXV0sMCwwLDAsMCwwLDAsW1wiMSg/OjMoPzowWzAzNDddfFsxM11bMDEzOV18MlswMzVdfDRbMDEzNTY4XXw2WzA0NTldfDdbMDZdfDhbMTUtOF18OVswNjg5XSlcXFxcZHs0fXw2XFxcXGR7NSwxMH0pfCg/OjM0NVxcXFxkfDlbODldKVxcXFxkezZ9fCg/OjEwfDIoPzozfDg1XFxcXGQpfDMoPzpbMTVdfFs2OV1cXFxcZFxcXFxkKXw0WzE1LThdfDUxKVxcXFxkezh9XCJdXV0sXCI4ODNcIjpbXCI4ODNcIiwwLFwiKD86WzEtNF1cXFxcZHw1MSlcXFxcZHs2LDEwfVwiLFs4LDksMTAsMTEsMTJdLFtbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHsyLDh9KVwiLFwiJDEgJDIgJDNcIixbXCJbMTRdfDJbMjQtNjg5XXwzWzAyLTY4OV18NTFbMjQtOV1cIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDNcIixbXCI1MTBcIl1dLFtcIihcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCIyMVwiXV0sW1wiKFxcXFxkezR9KShcXFxcZHs0fSkoXFxcXGR7NH0pXCIsXCIkMSAkMiAkM1wiLFtcIjUxWzEzXVwiXV0sW1wiKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7M30pKFxcXFxkezN9KVwiLFwiJDEgJDIgJDMgJDRcIixbXCJbMjM1XVwiXV1dLDAsMCwwLDAsMCwwLFswLDAsMCwwLDAsMCwwLDAsW1wiKD86Mig/OjAwXFxcXGRcXFxcZHwxMCl8KD86MzcwWzEtOV18NTFcXFxcZDApXFxcXGQpXFxcXGR7N318NTEoPzowMFxcXFxkezV9fFsyNC05XTBcXFxcZHs0LDd9KXwoPzoxWzAxMy03OV18MlsyNC02ODldfDNbMDItNjg5XXw0WzAtNF0pMFxcXFxkezUsOX1cIl1dXSxcIjg4OFwiOltcIjg4OFwiLDAsXCJcXFxcZHsxMX1cIixbMTFdLFtbXCIoXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHs1fSlcIixcIiQxICQyICQzXCJdXSwwLDAsMCwwLDAsMCxbMCwwLDAsMCwwLDAsW1wiXFxcXGR7MTF9XCJdXV0sXCI5NzlcIjpbXCI5NzlcIiwwLFwiWzEzNTldXFxcXGR7OH1cIixbOV0sW1tcIihcXFxcZCkoXFxcXGR7NH0pKFxcXFxkezR9KVwiLFwiJDEgJDIgJDNcIixbXCJbMTM1OV1cIl1dXSwwLDAsMCwwLDAsMCxbMCwwLDAsW1wiWzEzNTldXFxcXGR7OH1cIl1dXX19IiwiJ3VzZSBzdHJpY3QnXHJcblxyXG52YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuLi9tZXRhZGF0YS5taW4uanNvbicpXHJcbnZhciBjb3JlID0gcmVxdWlyZSgnLi4vY29yZS9pbmRleC5janMnKVxyXG5cclxuZnVuY3Rpb24gY2FsbChmdW5jLCBfYXJndW1lbnRzKSB7XHJcblx0dmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChfYXJndW1lbnRzKVxyXG5cdGFyZ3MucHVzaChtZXRhZGF0YSlcclxuXHRyZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzKVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZVBob25lTnVtYmVyRnJvbVN0cmluZygpIHtcclxuXHRyZXR1cm4gY2FsbChjb3JlLnBhcnNlUGhvbmVOdW1iZXJGcm9tU3RyaW5nLCBhcmd1bWVudHMpXHJcbn1cclxuXHJcbi8vIEVTNSBgcmVxdWlyZSgpYCBcImRlZmF1bHRcIiBcImludGVyb3BlcmFiaWxpdHlcIiBoYWNrLlxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYmFiZWwvYmFiZWwvaXNzdWVzLzIyMTIjaXNzdWVjb21tZW50LTEzMTgyNzk4NlxyXG4vLyBBbiBhbHRlcm5hdGl2ZSBhcHByb2FjaDpcclxuLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmFiZWwtcGx1Z2luLWFkZC1tb2R1bGUtZXhwb3J0c1xyXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBwYXJzZVBob25lTnVtYmVyRnJvbVN0cmluZ1xyXG5leHBvcnRzWydkZWZhdWx0J10gPSBwYXJzZVBob25lTnVtYmVyRnJvbVN0cmluZ1xyXG5cclxuZXhwb3J0cy5QYXJzZUVycm9yID0gY29yZS5QYXJzZUVycm9yXHJcblxyXG5mdW5jdGlvbiBwYXJzZVBob25lTnVtYmVyV2l0aEVycm9yKCkge1xyXG5cdHJldHVybiBjYWxsKGNvcmUucGFyc2VQaG9uZU51bWJlcldpdGhFcnJvciwgYXJndW1lbnRzKVxyXG59XHJcblxyXG4vLyBgcGFyc2VQaG9uZU51bWJlcigpYCBuYW1lZCBleHBvcnQgaGFzIGJlZW4gcmVuYW1lZCB0byBgcGFyc2VQaG9uZU51bWJlcldpdGhFcnJvcigpYC5cclxuZXhwb3J0cy5wYXJzZVBob25lTnVtYmVyID0gcGFyc2VQaG9uZU51bWJlcldpdGhFcnJvclxyXG5leHBvcnRzLnBhcnNlUGhvbmVOdW1iZXJXaXRoRXJyb3IgPSBwYXJzZVBob25lTnVtYmVyV2l0aEVycm9yXHJcblxyXG4vLyBgcGFyc2VQaG9uZU51bWJlckZyb21TdHJpbmcoKWAgbmFtZWQgZXhwb3J0IGlzIG5vdyBjb25zaWRlcmVkIGxlZ2FjeTpcclxuLy8gaXQgaGFzIGJlZW4gcHJvbW90ZWQgdG8gYSBkZWZhdWx0IGV4cG9ydCBkdWUgdG8gYmVpbmcgdG9vIHZlcmJvc2UuXHJcbmV4cG9ydHMucGFyc2VQaG9uZU51bWJlckZyb21TdHJpbmcgPSBwYXJzZVBob25lTnVtYmVyRnJvbVN0cmluZ1xyXG5cclxuZXhwb3J0cy5pc1ZhbGlkUGhvbmVOdW1iZXIgPSBmdW5jdGlvbiBpc1ZhbGlkUGhvbmVOdW1iZXIoKSB7XHJcblx0cmV0dXJuIGNhbGwoY29yZS5pc1ZhbGlkUGhvbmVOdW1iZXIsIGFyZ3VtZW50cylcclxufVxyXG5cclxuZXhwb3J0cy5pc1Bvc3NpYmxlUGhvbmVOdW1iZXIgPSBmdW5jdGlvbiBpc1Bvc3NpYmxlUGhvbmVOdW1iZXIoKSB7XHJcblx0cmV0dXJuIGNhbGwoY29yZS5pc1Bvc3NpYmxlUGhvbmVOdW1iZXIsIGFyZ3VtZW50cylcclxufVxyXG5cclxuZXhwb3J0cy52YWxpZGF0ZVBob25lTnVtYmVyTGVuZ3RoID0gZnVuY3Rpb24gdmFsaWRhdGVQaG9uZU51bWJlckxlbmd0aCgpIHtcclxuXHRyZXR1cm4gY2FsbChjb3JlLnZhbGlkYXRlUGhvbmVOdW1iZXJMZW5ndGgsIGFyZ3VtZW50cylcclxufVxyXG5cclxuZXhwb3J0cy5maW5kTnVtYmVycyA9IGZ1bmN0aW9uIGZpbmROdW1iZXJzKCkge1xyXG5cdHJldHVybiBjYWxsKGNvcmUuZmluZE51bWJlcnMsIGFyZ3VtZW50cylcclxufVxyXG5cclxuZXhwb3J0cy5zZWFyY2hOdW1iZXJzID0gZnVuY3Rpb24gc2VhcmNoTnVtYmVycygpIHtcclxuXHRyZXR1cm4gY2FsbChjb3JlLnNlYXJjaE51bWJlcnMsIGFyZ3VtZW50cylcclxufVxyXG5cclxuZXhwb3J0cy5maW5kUGhvbmVOdW1iZXJzSW5UZXh0ID0gZnVuY3Rpb24gZmluZFBob25lTnVtYmVyc0luVGV4dCgpIHtcclxuXHRyZXR1cm4gY2FsbChjb3JlLmZpbmRQaG9uZU51bWJlcnNJblRleHQsIGFyZ3VtZW50cylcclxufVxyXG5cclxuZXhwb3J0cy5zZWFyY2hQaG9uZU51bWJlcnNJblRleHQgPSBmdW5jdGlvbiBzZWFyY2hQaG9uZU51bWJlcnNJblRleHQoKSB7XHJcblx0cmV0dXJuIGNhbGwoY29yZS5zZWFyY2hQaG9uZU51bWJlcnNJblRleHQsIGFyZ3VtZW50cylcclxufVxyXG5cclxuZXhwb3J0cy5QaG9uZU51bWJlck1hdGNoZXIgPSBmdW5jdGlvbiBQaG9uZU51bWJlck1hdGNoZXIodGV4dCwgb3B0aW9ucykge1xyXG5cdHJldHVybiBjb3JlLlBob25lTnVtYmVyTWF0Y2hlci5jYWxsKHRoaXMsIHRleHQsIG9wdGlvbnMsIG1ldGFkYXRhKVxyXG59XHJcbmV4cG9ydHMuUGhvbmVOdW1iZXJNYXRjaGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoY29yZS5QaG9uZU51bWJlck1hdGNoZXIucHJvdG90eXBlLCB7fSlcclxuZXhwb3J0cy5QaG9uZU51bWJlck1hdGNoZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gZXhwb3J0cy5QaG9uZU51bWJlck1hdGNoZXJcclxuXHJcbmV4cG9ydHMuQXNZb3VUeXBlID0gZnVuY3Rpb24gQXNZb3VUeXBlKGNvdW50cnkpIHtcclxuXHRyZXR1cm4gY29yZS5Bc1lvdVR5cGUuY2FsbCh0aGlzLCBjb3VudHJ5LCBtZXRhZGF0YSlcclxufVxyXG5leHBvcnRzLkFzWW91VHlwZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGNvcmUuQXNZb3VUeXBlLnByb3RvdHlwZSwge30pXHJcbmV4cG9ydHMuQXNZb3VUeXBlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGV4cG9ydHMuQXNZb3VUeXBlXHJcblxyXG5leHBvcnRzLmlzU3VwcG9ydGVkQ291bnRyeSA9IGZ1bmN0aW9uIGlzU3VwcG9ydGVkQ291bnRyeShjb3VudHJ5KSB7XHJcblx0cmV0dXJuIGNhbGwoY29yZS5pc1N1cHBvcnRlZENvdW50cnksIGFyZ3VtZW50cylcclxufVxyXG5cclxuZXhwb3J0cy5nZXRDb3VudHJpZXMgPSBmdW5jdGlvbiBnZXRDb3VudHJpZXMoKSB7XHJcblx0cmV0dXJuIGNhbGwoY29yZS5nZXRDb3VudHJpZXMsIGFyZ3VtZW50cylcclxufVxyXG5cclxuZXhwb3J0cy5nZXRDb3VudHJ5Q2FsbGluZ0NvZGUgPSBmdW5jdGlvbiBnZXRDb3VudHJ5Q2FsbGluZ0NvZGUoKSB7XHJcblx0cmV0dXJuIGNhbGwoY29yZS5nZXRDb3VudHJ5Q2FsbGluZ0NvZGUsIGFyZ3VtZW50cylcclxufVxyXG5cclxuZXhwb3J0cy5nZXRFeHRQcmVmaXggPSBmdW5jdGlvbiBnZXRFeHRQcmVmaXgoY291bnRyeSkge1xyXG5cdHJldHVybiBjYWxsKGNvcmUuZ2V0RXh0UHJlZml4LCBhcmd1bWVudHMpXHJcbn1cclxuXHJcbmV4cG9ydHMuZ2V0RXhhbXBsZU51bWJlciA9IGZ1bmN0aW9uIGdldEV4YW1wbGVOdW1iZXIoKSB7XHJcblx0cmV0dXJuIGNhbGwoY29yZS5nZXRFeGFtcGxlTnVtYmVyLCBhcmd1bWVudHMpXHJcbn1cclxuXHJcbmV4cG9ydHMuTWV0YWRhdGEgPSBmdW5jdGlvbiBNZXRhZGF0YSgpIHtcclxuXHRyZXR1cm4gY29yZS5NZXRhZGF0YS5jYWxsKHRoaXMsIG1ldGFkYXRhKVxyXG59XHJcbmV4cG9ydHMuTWV0YWRhdGEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShjb3JlLk1ldGFkYXRhLnByb3RvdHlwZSwge30pXHJcbmV4cG9ydHMuTWV0YWRhdGEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gZXhwb3J0cy5NZXRhZGF0YVxyXG5cclxuZXhwb3J0cy5mb3JtYXRJbmNvbXBsZXRlUGhvbmVOdW1iZXIgPSBmdW5jdGlvbiBmb3JtYXRJbmNvbXBsZXRlUGhvbmVOdW1iZXIoKSB7XHJcblx0cmV0dXJuIGNhbGwoY29yZS5mb3JtYXRJbmNvbXBsZXRlUGhvbmVOdW1iZXIsIGFyZ3VtZW50cylcclxufVxyXG5cclxuZXhwb3J0cy5wYXJzZUluY29tcGxldGVQaG9uZU51bWJlciA9IGNvcmUucGFyc2VJbmNvbXBsZXRlUGhvbmVOdW1iZXJcclxuZXhwb3J0cy5wYXJzZVBob25lTnVtYmVyQ2hhcmFjdGVyID0gY29yZS5wYXJzZVBob25lTnVtYmVyQ2hhcmFjdGVyXHJcbmV4cG9ydHMucGFyc2VEaWdpdHMgPSBjb3JlLnBhcnNlRGlnaXRzXHJcbmV4cG9ydHMuRElHSVRfUExBQ0VIT0xERVIgPSBjb3JlLkRJR0lUX1BMQUNFSE9MREVSXHJcblxyXG5leHBvcnRzLnBhcnNlUkZDMzk2NiA9IGNvcmUucGFyc2VSRkMzOTY2XHJcbmV4cG9ydHMuZm9ybWF0UkZDMzk2NiA9IGNvcmUuZm9ybWF0UkZDMzk2NiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dG9Db21wbGV0ZUlucHV0IGV4dGVuZHMgQmFja2JvbmUuVmlldyB7XG4gICAgdGVtcGxhdGUoe2NsYXNzTmFtZSwgaWQsIGxhYmVsfSkge1xuICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLXdpZGdldCBhdXRvQ29tcGxldGUgJHtjbGFzc05hbWV9XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiJHtpZH1cIiBhcmlhLWxhYmVsPVwiJHtsYWJlbH1cIiB0eXBlPVwic2VhcmNoXCIgbmFtZT1cInNlYXJjaFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImlucHV0TGFiZWxcIiBmb3I9XCIke2lkfVwiIHRpdGxlPVwiJHtsYWJlbH1cIj4ke2xhYmVsfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uLWRvd24tYXJyb3dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdHNcIj48ZGl2PlxuICAgICAgICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcih7IGNsYXNzTmFtZSwgaWQsIGxhYmVsLCBmaWVsZExpc3QsIGRlZmF1bHRGaWVsZCwgc2VsZWN0ZWRFdmVudCB9KSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG5cbiAgICAgICAgXy5leHRlbmQodGhpcywgYXJndW1lbnRzWzBdKTtcblxuICAgICAgICB0aGlzLmRlZmF1bHRGaWVsZCA9IGRlZmF1bHRGaWVsZCB8fCAnJztcbiAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50ID0gc2VsZWN0ZWRFdmVudCB8fCAoKCkgPT4ge30pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgdGhpcy4kZWwuZW1wdHkoKS5hcHBlbmQodGhpcy50ZW1wbGF0ZSh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy4kaW5wdXQgPSB0aGlzLiRlbC5maW5kKCdpbnB1dCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSB0aGlzLmRlZmF1bHRGaWVsZDtcbiAgICAgICAgICAgIHRoaXMuJGlucHV0LnZhbCh0aGlzLmRlZmF1bHRGaWVsZCk7XG4gICAgICAgICAgICB0aGlzLiRlbC5maW5kKCcuaW5wdXRMYWJlbCcpLmFkZENsYXNzKCdzZWNvbmRhcnktY29sb3InKTtcbiAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoJy5hdXRvQ29tcGxldGUnKS5hZGRDbGFzcygnZm9jdXNlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4kaW5wdXQuYXV0b2NvbXBsZXRlKHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5maWVsZExpc3QsXG4gICAgICAgICAgICBhcHBlbmRUbzogdGhpcy4kZWwuZmluZCgnLnJlc3VsdHMnKSxcbiAgICAgICAgICAgIG1pbkxlbmd0aDogMFxuICAgICAgICB9KS5hdXRvY29tcGxldGUoJ3dpZGdldCcpLmFkZENsYXNzKCdmaXhlZC1oZWlnaHQnKTtcblxuICAgICAgICB0aGlzLl9hdHRhY2hFdmVudHMoKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfYXR0YWNoRXZlbnRzKCkge1xuICAgICAgICB0aGlzLiRpbnB1dC5vbignZm9jdXMgY2xpY2snLCAoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLiRpbnB1dC52YWwoJycpO1xuICAgICAgICAgICAgdGhpcy4kaW5wdXQuYXV0b2NvbXBsZXRlKCdzZWFyY2gnLCAnJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuJGlucHV0Lm9uKCdhdXRvY29tcGxldGVzZWxlY3QnLCAoZXZlbnQsIHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kaW5wdXQudmFsKHRhcmdldC5pdGVtLmxhYmVsKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFdmVudCh0YXJnZXQuaXRlbS5sYWJlbCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IHRhcmdldC5pdGVtLmxhYmVsO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLiRlbC5maW5kKCcuaWNvbi1kb3duLWFycm93Jykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICB0aGlzLiRpbnB1dC5jbGljaygpLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuJGlucHV0Lm9uKCdmb2N1cycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoJy5hdXRvQ29tcGxldGUnKS5maW5kKCcuaW5wdXRMYWJlbCcpLmFkZENsYXNzKCdzZWNvbmRhcnktY29sb3InKTtcbiAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoJy5hdXRvQ29tcGxldGUnKS5hZGRDbGFzcygnZm9jdXNlZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLiRpbnB1dC5vbignYmx1cicsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGlucHV0LnZhbCh0aGlzLmxhc3RTZWxlY3RlZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy4kaW5wdXQudmFsKCkpe1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoJy5pbnB1dExhYmVsJykucmVtb3ZlQ2xhc3MoJ3NlY29uZGFyeS1jb2xvcicpO1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoJy5hdXRvQ29tcGxldGUnKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0b1N0YXRpY1VybCB9IGZyb20gJy4uLy4uLy4uLy4uL2xpYi9hc3NldE1hcHBlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZsb2F0aW5nTGFiZWxJbnB1dCBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuICAgIHRlbXBsYXRlKHsgY2xhc3NOYW1lLCBpZCwgbGFiZWwsIHR5cGUgfSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGp1c3RGb3JTYWZhcmlcbiAgICAgICAgICAgID8gYFxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaW5wdXRMYWJlbFwiIGxhYmVsRm9yPVwiJHtpZH1cIiB0aXRsZT1cIiR7bGFiZWx9XCI+JHtsYWJlbH08L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwiJHtpZH1cIiBuYW1lPVwiJHtpZH1cIiB0eXBlPVwiJHt0eXBlfVwiIGFyaWEtbGFiZWw9XCIke2xhYmVsfVwiICR7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID8gYHBsYWNlaG9sZGVyPVwiJHt0aGlzLnBsYWNlaG9sZGVyfVwiYCA6ICcnXG4gICAgICAgICAgICAgIH0gJHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlSGludFxuICAgICAgICAgICAgICAgICAgICAgID8gYGF1dG9jb21wbGV0ZT1cIiR7dGhpcy5hdXRvY29tcGxldGVIaW50fVwiYFxuICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgdHlwZSA9PT0gJ3Bhc3N3b3JkJ1xuICAgICAgICAgICAgICAgICAgICA/IGBcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwic2hvd1Bhc3N3b3JkSWNvblwiIHRhYmluZGV4PVwiMFwiIHJvbGU9XCJidXR0b25cIiBhbHQ9JyR7d2luZG93LnRleHQoXG4gICAgICAgICAgICAgICAgICAgICdzaWduSW5QYWdlLmxpYnJhcnlDYXJkLnNob3dQYXNzd29yZCdcbiAgICAgICAgICAgICAgICApfScgc3JjPScke3RvU3RhdGljVXJsKCdpbWcvaWNvbi1wYXNzd29yZC1zaG93LnBuZycpfScvPlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJzaG93UGFzc3dvcmRJY29uXCIgdGFiaW5kZXg9XCIwXCIgcm9sZT1cImJ1dHRvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiIGFsdD0nJHt3aW5kb3cudGV4dChcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UubGlicmFyeUNhcmQuaGlkZVBhc3N3b3JkJ1xuICAgICAgICAgICAgICAgICl9JyBzcmM9JyR7dG9TdGF0aWNVcmwoJ2ltZy9pY29uLXBhc3N3b3JkLWhpZGUucG5nJyl9Jy8+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxwIGNsYXNzPVwiaW52YWxpZExhYmVsXCI+JHt3aW5kb3cudGV4dCgnc2lnbkluUGFnZS5pbnZhbGlkRmllbGQnLCB7XG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBsYWJlbCxcbiAgICAgICAgICAgIH0pfTwvcD5gXG4gICAgICAgICAgICA6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbG9hdGluZ0xhYmVsSW5wdXQgJHtjbGFzc05hbWV9XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiJHtpZH1cIiBuYW1lPVwiJHtpZH1cIiB0eXBlPVwiJHt0eXBlfVwiIGFyaWEtbGFiZWw9XCIke2xhYmVsfVwiICR7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID8gYHBsYWNlaG9sZGVyPVwiJHt0aGlzLnBsYWNlaG9sZGVyfVwiYCA6ICcnXG4gICAgICAgICAgICAgIH0gJHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlSGludFxuICAgICAgICAgICAgICAgICAgICAgID8gYGF1dG9jb21wbGV0ZT1cIiR7dGhpcy5hdXRvY29tcGxldGVIaW50fVwiYFxuICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJpbnB1dExhYmVsXCIgbGFiZWxGb3I9XCIke2lkfVwiIHRpdGxlPVwiJHtsYWJlbH1cIj4ke2xhYmVsfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PT0gJ3Bhc3N3b3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBgXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJzaG93UGFzc3dvcmRJY29uXCIgdGFiaW5kZXg9XCIwXCIgcm9sZT1cImJ1dHRvblwiIGFsdD0nJHt3aW5kb3cudGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICdzaWduSW5QYWdlLmxpYnJhcnlDYXJkLnNob3dQYXNzd29yZCdcbiAgICAgICAgICAgICAgICAgICAgKX0nIHNyYz0nJHt0b1N0YXRpY1VybCgnaW1nL2ljb24tcGFzc3dvcmQtc2hvdy5wbmcnKX0nLz5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInNob3dQYXNzd29yZEljb25cIiB0YWJpbmRleD1cIjBcIiByb2xlPVwiYnV0dG9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgYWx0PScke3dpbmRvdy50ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UubGlicmFyeUNhcmQuaGlkZVBhc3N3b3JkJ1xuICAgICAgICAgICAgICAgICAgICApfScgc3JjPScke3RvU3RhdGljVXJsKCdpbWcvaWNvbi1wYXNzd29yZC1oaWRlLnBuZycpfScvPlxuICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJpbnZhbGlkTGFiZWxcIj4ke3dpbmRvdy50ZXh0KFxuICAgICAgICAgICAgICAgICAgICAnc2lnbkluUGFnZS5pbnZhbGlkRmllbGQnLFxuICAgICAgICAgICAgICAgICAgICB7IGZpZWxkTmFtZTogbGFiZWwgfVxuICAgICAgICAgICAgICAgICl9PC9wPlxuICAgICAgICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcih7IGNsYXNzTmFtZSwgaWQsIGxhYmVsLCB0eXBlLCBhdXRvY29tcGxldGVIaW50IH0pIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcblxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICd0ZXh0JztcbiAgICAgICAgdGhpcy5mbG9hdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxvYXRQb2xsSW50ZXJ2YWxNUyA9IDEwMDtcbiAgICAgICAgdGhpcy5hZGp1c3RGb3JTYWZhcmkgPVxuICAgICAgICAgICAgd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnc2FmYXJpLWF1dG9jb21wbGV0ZS1hZGp1c3RtZW50JykgJiZcbiAgICAgICAgICAgIHR5cGUgIT0gJ3RlbCc7XG5cbiAgICAgICAgXy5leHRlbmQodGhpcywgYXJndW1lbnRzWzBdKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzQXR0YWNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4kZWwuZW1wdHkoKS5hcHBlbmQodGhpcy50ZW1wbGF0ZSh0aGlzKSk7XG4gICAgICAgIHRoaXMuJGlucHV0ID0gdGhpcy4kZWwuZmluZCgnaW5wdXQnKTtcbiAgICAgICAgdGhpcy4kaW52YWxpZExhYmVsID0gdGhpcy4kZWwuZmluZCgncC5pbnZhbGlkTGFiZWwnKTtcbiAgICAgICAgdGhpcy5fYXR0YWNoRXZlbnRzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9hdHRhY2hFdmVudHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5ldmVudHNBdHRhY2hlZCkge1xuICAgICAgICAgICAgdGhpcy4kaW5wdXQub24oJ2ZvY3VzIGlucHV0IGNoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb2F0TGFiZWwoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLiRpbnB1dC5vbignYmx1cicsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuJGlucHV0LnZhbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2lua0xhYmVsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdwb2xsRm9yQXV0b2ZpbGwnKSkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2lkY0R1cGxpY2F0ZUhhbmRsZXJGaXgnKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3RhcnQgcG9sbGluZycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuY2hlY2tGb3JXZWJraXRBdXRvZmlsbCgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsb2F0UG9sbEludGVydmFsTVNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kaW5wdXQuY3NzKCdwYWRkaW5nLXJpZ2h0JywgJzNyZW0nKTtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbC5maW5kKCcuc2hvd1Bhc3N3b3JkSWNvbicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwuZmluZCgnLnNob3dQYXNzd29yZEljb24nKS50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJGlucHV0LmF0dHIoJ3R5cGUnKSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kaW5wdXQuYXR0cigndHlwZScsICd0ZXh0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRpbnB1dC5hdHRyKCd0eXBlJywgJ3Bhc3N3b3JkJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbC5maW5kKCcuc2hvd1Bhc3N3b3JkSWNvbicpLm9uKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW50ZXIgYW5kIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSAxMyB8fCBlLndoaWNoID09PSAzMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJChlLnRhcmdldCkudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ldmVudHNBdHRhY2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwb2xsIGZvciBhdXRvZmlsbCBieSB3ZWJraXQuICBXZWJraXQgYnJvd3NlcnNcbiAgICAvLyBkbyBub3QgdHJpZ2dlciBhbnkgZXZlbnQgb24gYXV0b2ZpbGwgdW50aWwgdGhlIHVzZXJcbiAgICAvLyBpbnRlcmFjdHMgd2l0aCB0aGUgcGFnZSBpbiBzb21lIHdheS4gIFRoZSBhdXRvZmlsbGVkXG4gICAgLy8gdmFsdWUgaXMgYWxzbyBub3QgYXZhaWxhYmxlIG9uIHRoZSBlbGVtZW50IHVudGlsIHRoYXQgdGltZS5cbiAgICAvLyBIb3dldmVyLCB0aGUgYnJvd3Nlci1zcGVjaWZpYyBwc2V1ZG8gY2xhc3MgaXMgYXBwbGllZC5cbiAgICBjaGVja0ZvcldlYmtpdEF1dG9maWxsKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuJGlucHV0LmlzKCc6LXdlYmtpdC1hdXRvZmlsbCcpICYmICF0aGlzLmZsb2F0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb2F0TGFiZWwoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmZsb2F0ZWQpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLmNoZWNrRm9yV2Via2l0QXV0b2ZpbGwoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbG9hdFBvbGxJbnRlcnZhbE1TXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBzaW1wbHkgZmFpbCBpbiBzb21lIGJyb3dzZXJzIHdoZXJlIHRoZSAtd2Via2l0LWF1dG9maWxsIHBzZXVkby1zZWxlY3RvciBpcyBub3Qgc3VwcG9ydGVkLiBOb3QgbXVjaCB3ZSBjYW4gZG8gaW4gdGhhdCBjYXNlLCBidXQgd2UgYWxzbyBkb24ndCB3YW50IHRoZSBlcnJvciB0byBzaG93IHVwIGFzIG5vaXNlIGluIE5SXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmbG9hdExhYmVsKCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdwb2xsRm9yQXV0b2ZpbGwnKSAmJlxuICAgICAgICAgICAgdGhpcy5mbG9hdGVkXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4kZWwuZmluZCgnLmlucHV0TGFiZWwnKS5hZGRDbGFzcygnc2Vjb25kYXJ5LWNvbG9yJyk7XG4gICAgICAgIHRoaXMuYWRqdXN0Rm9yU2FmYXJpXG4gICAgICAgICAgICA/IHRoaXMuJGVsLmFkZENsYXNzKCdmb2N1c2VkJylcbiAgICAgICAgICAgIDogdGhpcy4kZWwuZmluZCgnLmZsb2F0aW5nTGFiZWxJbnB1dCcpLmFkZENsYXNzKCdmb2N1c2VkJyk7XG4gICAgICAgIHRoaXMuZmxvYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgc2lua0xhYmVsKCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdwb2xsRm9yQXV0b2ZpbGwnKSAmJlxuICAgICAgICAgICAgIXRoaXMuZmxvYXRlZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuJGVsLmZpbmQoJy5pbnB1dExhYmVsJykucmVtb3ZlQ2xhc3MoJ3NlY29uZGFyeS1jb2xvcicpO1xuICAgICAgICB0aGlzLmFkanVzdEZvclNhZmFyaVxuICAgICAgICAgICAgPyB0aGlzLiRlbC5yZW1vdmVDbGFzcygnZm9jdXNlZCcpXG4gICAgICAgICAgICA6IHRoaXMuJGVsLmZpbmQoJy5mbG9hdGluZ0xhYmVsSW5wdXQnKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xuICAgICAgICB0aGlzLmZsb2F0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZU5vbkVtcHR5KCkge1xuICAgICAgICBpZiAodGhpcy4kaW5wdXQudmFsKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlzcGxheUludmFsaWQoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGRpc3BsYXlJbnZhbGlkKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5hZGp1c3RGb3JTYWZhcmlcbiAgICAgICAgICAgICAgICA/IHRoaXMuJGVsLmFkZENsYXNzKCdpbnZhbGlkJylcbiAgICAgICAgICAgICAgICA6IHRoaXMuJGVsLmZpbmQoJy5mbG9hdGluZ0xhYmVsSW5wdXQnKS5hZGRDbGFzcygnaW52YWxpZCcpO1xuXG4gICAgICAgICAgICB0aGlzLiRpbnB1dC5vbignZm9jdXMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckludmFsaWQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFySW52YWxpZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5hZGp1c3RGb3JTYWZhcmlcbiAgICAgICAgICAgICAgICA/IHRoaXMuJGVsLnJlbW92ZUNsYXNzKCdpbnZhbGlkJylcbiAgICAgICAgICAgICAgICA6IHRoaXMuJGVsLmZpbmQoJy5mbG9hdGluZ0xhYmVsSW5wdXQnKS5yZW1vdmVDbGFzcygnaW52YWxpZCcpO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgRmxvYXRpbmdMYWJlbElucHV0IGZyb20gJy4vRmxvYXRpbmdMYWJlbElucHV0JztcbmltcG9ydCB7IEFzWW91VHlwZSwgcGFyc2VQaG9uZU51bWJlckZyb21TdHJpbmcsIGdldENvdW50cnlDYWxsaW5nQ29kZSwgaXNTdXBwb3J0ZWRDb3VudHJ5IH0gZnJvbSAnbGlicGhvbmVudW1iZXItanMnO1xuaW1wb3J0IHsgdG9TdGF0aWNVcmwgfSBmcm9tICcuLi8uLi8uLi8uLi9saWIvYXNzZXRNYXBwZXInO1xuY29uc3Qge3RleHR9ID0gd2luZG93O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQaG9uZU51bWJlcklucHV0IGV4dGVuZHMgRmxvYXRpbmdMYWJlbElucHV0IHtcblxuICAgIGNvbnN0cnVjdG9yKHsgY2xhc3NOYW1lLCBpZCwgbGFiZWwsIHR5cGUsIGFsbG93QWxsQ291bnRyaWVzLCBhbGxvd2VkQ291bnRyaWVzfSkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgICAgIGlmICghYWxsb3dBbGxDb3VudHJpZXMgJiYgIWFsbG93ZWRDb3VudHJpZXMpe1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBhbGxvd2VkIGNvdW50cmllcyBzcGVjaWZpZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhbGxvd0FsbENvdW50cmllcyl7XG4gICAgICAgICAgICB0aGlzLmFsbG93ZWRDb3VudHJpZXMgPSB0aGlzLmFsbENvdW50cmllcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dlZENvdW50cmllcyA9IGFsbG93ZWRDb3VudHJpZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hbGxvd2VkQ291bnRyaWVzKXtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5hbGxvd2VkQ291bnRyaWVzWzBdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0dXBNZW51V2lkZ2V0KCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCl7XG4gICAgICAgIHN1cGVyLnJlbmRlcigpO1xuXG4gICAgICAgIHRoaXMuJGVsLmFkZENsYXNzKCdwaG9uZU51bWJlcklucHV0IHVpLWZyb250Jyk7XG4gICAgICAgIGlmICh0aGlzLnNob3dDb3VudHJ5U2VsZWN0b3Ipe1xuICAgICAgICAgICAgdGhpcy4kZWwucHJlcGVuZChgXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInBob25lQ291bnRyeVNlbGVjdG9yXCIgYXJpYS1sYWJlbD1cIiR7dGV4dCgnaWRjLm1vYmlsZU51bWJlckNvdW50cnlMYWJlbCcpfVwiPlxuICAgICAgICAgICAgICAgICAgICAke3RoaXMuYWxsb3dlZENvdW50cmllcy5tYXAoKHgpID0+IGA8b3B0aW9uIHZhbHVlPVwiJHt4fVwiPiAke3h9IDxpbWcgY2xhc3M9XCJmbGFnSWNvblwiIHNyYz1cIiR7IHRvU3RhdGljVXJsKGBpbWcvZmxhZ3MvJHt4LnRvTG93ZXJDYXNlKCl9LnN2Z2ApIH1cIi8+PC9vcHRpb24+YCkuam9pbignXFxuJyl9XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+YCk7XG4gICAgICAgICAgICB0aGlzLiRjb3VudHJ5U2VsZWN0ID0gdGhpcy4kZWwuZmluZCgnLnBob25lQ291bnRyeVNlbGVjdG9yJyk7XG4gICAgICAgICAgICB0aGlzLiRjb3VudHJ5U2VsZWN0LmNvdW50cnlTZWxlY3RNZW51KHtcbiAgICAgICAgICAgICAgICBjaGFuZ2U6IChldnQsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudHJ5ID0gaXRlbS5pdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaWNvbnM6IHtidXR0b246ICdpY29uLWRvd24tYXJyb3cnfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hdHRhY2hQaG9uZU51bWJlckV2ZW50cygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzZXR1cE1lbnVXaWRnZXQoKSB7XG4gICAgICAgICQud2lkZ2V0KCdjdXN0b20uY291bnRyeVNlbGVjdE1lbnUnLCAkLnVpLnNlbGVjdG1lbnUsIHtcbiAgICAgICAgICAgIF9yZW5kZXJJdGVtOiAodWwsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gaXRlbS5lbGVtZW50LnZhbCgpO1xuICAgICAgICAgICAgICAgIGxldCBsaXN0SXRlbSA9ICQoYDxsaT5cbiAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZmxhZ0ljb25cIiBzcmM9XCIkeyB0b1N0YXRpY1VybChgaW1nL2ZsYWdzLyR7dmFsLnRvTG93ZXJDYXNlKCl9LnN2Z2ApIH1cIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50cnlOYW1lXCI+JHt0ZXh0KGBjb3VudHJ5TmFtZXMuJHt2YWwudG9VcHBlckNhc2UoKX1gKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50cnlDYWxsaW5nQ29kZVwiPiske2dldENvdW50cnlDYWxsaW5nQ29kZSh2YWwpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xpPmApO1xuXG4gICAgICAgICAgICAgICAgIHVsLmFwcGVuZChsaXN0SXRlbSk7XG4gICAgICAgICAgICAgICAgIHJldHVybiBsaXN0SXRlbTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfcmVuZGVyQnV0dG9uSXRlbShpdGVtKXtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIGxldCBidXR0b25JdGVtID0gJChgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51QnV0dG9uV3JhcHBlclwiPjxpbWcgY2xhc3M9XCJmbGFnSWNvblwiIHNyYz0nJHsgdG9TdGF0aWNVcmwoYGltZy9mbGFncy8ke2l0ZW0uZWxlbWVudC52YWwoKS50b0xvd2VyQ2FzZSgpfS5zdmdgKSB9JyAvPjxpIGNsYXNzPSdpY29uLWRvd24tYXJyb3cnIGFyaWEtaGlkZGVuPSd0cnVlJz48L2k+PGRpdj5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnV0dG9uSXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgY291bnRyeShjb3VudHJ5Q29kZSl7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb3VudHJ5ID0gY291bnRyeUNvZGU7XG4gICAgICAgIHRoaXMuX2Zvcm1hdE51bWJlcigpO1xuICAgICAgICB0aGlzLmNsZWFySW52YWxpZCgpO1xuICAgIH1cblxuICAgIGdldCBzaG93Q291bnRyeVNlbGVjdG9yKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmFsbG93QWxsQ291bnRyaWVzIHx8ICh0aGlzLmFsbG93ZWRDb3VudHJpZXMubGVuZ3RoID4gMSk7XG4gICAgfVxuXG4gICAgX2Zvcm1hdE51bWJlcigpe1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuJGlucHV0LnZhbCgpO1xuICAgICAgICBpZiAoY3VycmVudCl7XG4gICAgICAgICAgICBsZXQgZm9ybWF0dGVkID0gbmV3IEFzWW91VHlwZSh0aGlzLnNlbGVjdGVkQ291bnRyeSkuaW5wdXQoY3VycmVudCk7XG4gICAgICAgICAgICB0aGlzLiRpbnB1dC52YWwoZm9ybWF0dGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9hdHRhY2hQaG9uZU51bWJlckV2ZW50cygpe1xuICAgICAgICB0aGlzLiRpbnB1dC5vbignaW5wdXQnLCAoKSA9PiB0aGlzLl9mb3JtYXROdW1iZXIoKSk7XG4gICAgICAgIGlmICh0aGlzLiRjb3VudHJ5U2VsZWN0KXtcbiAgICAgICAgICAgIHRoaXMuJGNvdW50cnlTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50cnkgPSB0aGlzLiRjb3VudHJ5U2VsZWN0LnZhbCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kaW5wdXQub24oJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5vbktleWRvd24oZSkpO1xuICAgIH1cblxuICAgIG9uS2V5ZG93bihlKXtcbiAgICAgICAgLy8gV2UgbmVlZCBzcGVjaWFsIGhhbmRpbmcgZm9yIGJhY2tzcGFjZSBhbmQgZGVsZXRlIGJlY2F1c2Ugb2YgdGhlIGF1dG8tZm9ybWF0dGluZ1xuICAgICAgICAvLyBiZWhhdmlvci4gV2l0aG91dCB0aGlzLCBpdCdzIGltcG9zc2libGUgdG8gYmFja3NwYWNlL2RlbGV0ZSBwYXN0IGNlcnRhaW4gZm9ybWF0dGluZyBjaGFyYWN0ZXJzXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIGZvcm1hdHRpbmcga2VlcHMgcmVpbnNlcnRpbmcgdGhlbS4gIFVzZXIgc2VsZWN0ZWQgdGV4dCBjYW4gYmUgaGFuZGxlZCBub3JtYWxseS5cbiAgICAgICAgbGV0IG5vU2VsZWN0aW9uID0gZS50YXJnZXQuc2VsZWN0aW9uU3RhcnQgPT09IGUudGFyZ2V0LnNlbGVjdGlvbkVuZDtcbiAgICAgICAgaWYgKG5vU2VsZWN0aW9uICYmIChlLmtleUNvZGUgPT09IDggfHwgZS5rZXlDb2RlID09PSA0NikpIHtcblxuICAgICAgICAgICAgbGV0IGRpZ2l0c0JlZm9yZUN1cnNvciA9IHRoaXMuY291bnRQcmVjZWRpbmdEaWdpdHMoZS50YXJnZXQuc2VsZWN0aW9uU3RhcnQpO1xuICAgICAgICAgICAgbGV0IGRpZ2l0c09ubHkgPSB0aGlzLnVuZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgICAgICBsZXQgdXBkYXRlZCwgbmV3Q3Vyc29yUG9zaXRpb247XG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA4KXsgIC8vIEJBQ0tTUEFDRVxuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSBkaWdpdHNPbmx5LnNsaWNlKDAsIGRpZ2l0c0JlZm9yZUN1cnNvciAtIDEpICsgZGlnaXRzT25seS5zbGljZShkaWdpdHNCZWZvcmVDdXJzb3IpO1xuICAgICAgICAgICAgICAgIG5ld0N1cnNvclBvc2l0aW9uID0gZGlnaXRzQmVmb3JlQ3Vyc29yO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDQ2KXsgIC8vIERFTEVURVxuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSBkaWdpdHNPbmx5LnNsaWNlKDAsIGRpZ2l0c0JlZm9yZUN1cnNvcikgKyBkaWdpdHNPbmx5LnNsaWNlKGRpZ2l0c0JlZm9yZUN1cnNvciArIDEpO1xuICAgICAgICAgICAgICAgIG5ld0N1cnNvclBvc2l0aW9uID0gZGlnaXRzQmVmb3JlQ3Vyc29yICsgMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy4kaW5wdXQudmFsKHVwZGF0ZWQpO1xuICAgICAgICAgICAgdGhpcy5fZm9ybWF0TnVtYmVyKCk7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25DdXJzb3IobmV3Q3Vyc29yUG9zaXRpb24pO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVwb3NpdGlvbiB0aGUgY3Vyc29yIGZvbGxvd2luZyB0aGUgbnRoIG51bWVyaWMgY2hhcmFjdGVyIGluIHRoZSBmb3JtYXR0ZWQgc3RyaW5nXG4gICAgcmVwb3NpdGlvbkN1cnNvcihkaWdpdEluZGV4KXtcbiAgICAgICAgbGV0IHZhbCA9IHRoaXMuJGlucHV0LnZhbCgpO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBkaWdpdHNGb3VuZCA9IDA7XG4gICAgICAgIGZvciAoOyBpIDwgdmFsLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoZGlnaXRzRm91bmQgPT09IGRpZ2l0SW5kZXggLSAxKXtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjaGFyID0gdmFsLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRGlnaXQoY2hhcikpe1xuICAgICAgICAgICAgICAgIGRpZ2l0c0ZvdW5kKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kaW5wdXRbMF0uc2V0U2VsZWN0aW9uUmFuZ2UoaSxpKTtcbiAgICB9XG5cbiAgICBpc0RpZ2l0KGMpe1xuICAgICAgICByZXR1cm4gKC9eXFxkJC8pLnRlc3QoYyk7XG4gICAgfVxuXG4gICAgY291bnRQcmVjZWRpbmdEaWdpdHMoaW5kZXgpe1xuICAgICAgICByZXR1cm4gdGhpcy4kaW5wdXQudmFsKCkuc2xpY2UoMCwgaW5kZXgpLnNwbGl0KCcnKS5maWx0ZXIoKGMpID0+IHRoaXMuaXNEaWdpdChjKSkubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvdW50Rm9sbG93aW5nRGlnaXRzKGluZGV4KXtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGlucHV0LnZhbCgpLnNsaWNlKGluZGV4KS5zcGxpdCgnJykuZmlsdGVyKChjKSA9PiB0aGlzLmlzRGlnaXQoYykpLmxlbmd0aDtcbiAgICB9XG5cbiAgICBnZXQgdW5mb3JtYXR0ZWRWYWx1ZSgpe1xuICAgICAgICByZXR1cm4gdGhpcy4kaW5wdXQudmFsKCkuc3BsaXQoJycpLmZpbHRlcigoYykgPT4gdGhpcy5pc0RpZ2l0KGMpKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICByZXNldEludmFsaWRUZXh0KCkge1xuICAgICAgICB0aGlzLiRpbnZhbGlkTGFiZWwudGV4dCh3aW5kb3cudGV4dCgnc2lnbkluUGFnZS5pbnZhbGlkRmllbGQnLCB7ZmllbGROYW1lOiB0aGlzLmxhYmVsfSkpO1xuICAgIH1cblxuICAgIHNldEludmFsaWRUZXh0KHRleHQpIHtcbiAgICAgICAgdGhpcy4kaW52YWxpZExhYmVsLnRleHQodGV4dCk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGUoKXtcbiAgICAgICAgbGV0IG51bWJlciA9IHBhcnNlUGhvbmVOdW1iZXJGcm9tU3RyaW5nKHRoaXMuJGlucHV0LnZhbCgpLCB0aGlzLnNlbGVjdGVkQ291bnRyeSk7XG4gICAgICAgIGlmICghbnVtYmVyIHx8ICFudW1iZXIuaXNWYWxpZCgpKXtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheUludmFsaWQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBkaXNwbGF5SW52YWxpZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmludmFsaWQpe1xuICAgICAgICAgICAgc3VwZXIuZGlzcGxheUludmFsaWQoKTtcbiAgICAgICAgICAgIHRoaXMuJGVsLmFkZENsYXNzKCdpbnZhbGlkJyk7XG4gICAgICAgICAgICB0aGlzLmludmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXJJbnZhbGlkKCl7XG4gICAgICAgIGlmICh0aGlzLmludmFsaWQpe1xuICAgICAgICAgICAgc3VwZXIuY2xlYXJJbnZhbGlkKCk7XG4gICAgICAgICAgICB0aGlzLiRlbC5yZW1vdmVDbGFzcygnaW52YWxpZCcpO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGZsb2F0TGFiZWwoKXtcbiAgICAgICAgc3VwZXIuZmxvYXRMYWJlbCgpO1xuICAgICAgICB0aGlzLiRlbC5hZGRDbGFzcygnZm9jdXNlZCcpO1xuXG4gICAgfVxuXG4gICAgc2lua0xhYmVsKCl7XG4gICAgICAgIHN1cGVyLnNpbmtMYWJlbCgpO1xuICAgICAgICB0aGlzLiRlbC5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xuICAgIH1cblxuICAgIGdldCBFMTY0KCl7XG4gICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZVBob25lTnVtYmVyRnJvbVN0cmluZyh0aGlzLiRpbnB1dC52YWwoKSwgdGhpcy5zZWxlY3RlZENvdW50cnkpO1xuICAgICAgICByZXR1cm4gcGFyc2VkID8gcGFyc2VkLm51bWJlciA6IHBhcnNlZDtcbiAgICB9XG5cbiAgICBnZXQgZGlzcGxheVZhbHVlKCl7XG4gICAgICAgIHJldHVybiB0aGlzLiRpbnB1dC52YWwoKTtcbiAgICB9XG5cbiAgICBnZXQgYWxsQ291bnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gWydBRicsJ0FYJywnQUwnLCdEWicsJ0FTJywnQUQnLCdBTycsJ0FJJywnQUcnLCdBUicsJ0FNJywnQVcnLCdBVScsJ0FUJywnQVonLCdCUycsJ0JIJywnQkQnLCdCQicsJ0JZJywnQkUnLCdCWicsJ0JKJywnQk0nLCdCVCcsJ0JPJywnQkEnLCdCVycsJ0JSJywnSU8nLCdWRycsJ0JOJywnQkcnLCdCRicsJ0JJJywnS0gnLCdDTScsJ0NBJywnSUMnLCdDVicsJ0JRJywnS1knLCdDRicsJ0VBJywnVEQnLCdDTCcsJ0NOJywnQ1gnLCdDQycsJ0NPJywnS00nLCdDRycsJ0NEJywnQ0snLCdDUicsJ0NJJywnSFInLCdDVScsJ0NXJywnQ1knLCdDWicsJ0RLJywnREcnLCdESicsJ0RNJywnRE8nLCdFQycsJ0VHJywnU1YnLCdHUScsJ0VSJywnRUUnLCdTWicsJ0VUJywnRksnLCdGTycsJ0ZKJywnRkknLCdGUicsJ0dGJywnUEYnLCdURicsJ0dBJywnR00nLCdHRScsJ0RFJywnR0gnLCdHSScsJ0dSJywnR0wnLCdHRCcsJ0dQJywnR1UnLCdHVCcsJ0dHJywnR04nLCdHVycsJ0dZJywnSFQnLCdITicsJ0hLJywnSFUnLCdJUycsJ0lOJywnSUQnLCdJUicsJ0lRJywnSUUnLCdJTScsJ0lMJywnSVQnLCdKTScsJ0pQJywnSkUnLCdKTycsJ0taJywnS0UnLCdLSScsJ1hLJywnS1cnLCdLRycsJ0xBJywnTFYnLCdMQicsJ0xTJywnTFInLCdMWScsJ0xJJywnTFQnLCdMVScsJ01PJywnTUcnLCdNVycsJ01ZJywnTVYnLCdNTCcsJ01UJywnTUgnLCdNUScsJ01SJywnTVUnLCdZVCcsJ01YJywnRk0nLCdNRCcsJ01DJywnTU4nLCdNRScsJ01TJywnTUEnLCdNWicsJ01NJywnTkEnLCdOUicsJ05QJywnTkwnLCdOQycsJ05aJywnTkknLCdORScsJ05HJywnTlUnLCdORicsJ0tQJywnTUsnLCdNUCcsJ05PJywnT00nLCdQSycsJ1BXJywnUFMnLCdQQScsJ1BHJywnUFknLCdQRScsJ1BIJywnUE4nLCdQTCcsJ1BUJywnWEEnLCdYQicsJ1BSJywnUUEnLCdSRScsJ1JPJywnUlUnLCdSVycsJ1dTJywnU00nLCdTVCcsJ1NBJywnU04nLCdSUycsJ1NDJywnU0wnLCdTRycsJ1NYJywnU0snLCdTSScsJ1NCJywnU08nLCdaQScsJ0dTJywnS1InLCdTUycsJ0VTJywnTEsnLCdCTCcsJ1NIJywnS04nLCdMQycsJ01GJywnUE0nLCdWQycsJ1NEJywnU1InLCdTSicsJ1NFJywnQ0gnLCdTWScsJ1RXJywnVEonLCdUWicsJ1RIJywnVEwnLCdURycsJ1RLJywnVE8nLCdUVCcsJ1ROJywnVFInLCdUTScsJ1RDJywnVFYnLCdVTScsJ1ZJJywnVUcnLCdVQScsJ0FFJywnR0InLCdVUycsJ1VZJywnVVonLCdWVScsJ1ZBJywnVkUnLCdWTicsJ1dGJywnRUgnLCdZRScsJ1pNJywnWlcnXVxuICAgICAgICAgICAgLmZpbHRlcigoeCkgPT4gaXNTdXBwb3J0ZWRDb3VudHJ5KHgpKTtcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJpZmljYXRpb25Db2RlSW5wdXQgZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICB0ZW1wbGF0ZSh7Y2xhc3NOYW1lLCBpZCwgY29kZUxlbmd0aCwgbGFiZWx9KSB7XG4gICAgICAgIGxldCBpbnB1dExhYmVsQm94ZXMgPSAkKCc8ZGl2PjwvZGl2PicpO1xuICAgICAgICBpbnB1dExhYmVsQm94ZXMuYXBwZW5kKCc8ZGl2IGNsYXNzPVwiaW5wdXRMYWJlbEJveGVzXCI+PC9kaXY+Jyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2RlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlucHV0TGFiZWxCb3hlcy5maW5kKCcuaW5wdXRMYWJlbEJveGVzJykuYXBwZW5kKGBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXRMYWJlbEJveFwiIHN0eWxlPVwid2lkdGg6ICR7dGhpcy5ib3hXaWR0aFBlcmNlbnRhZ2V9JVwiIGlkPVwiJHtpfVwiPjxkaXY+XG4gICAgICAgICAgICBgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmVyaWZpY2F0aW9uQ29kZUlucHV0ICR7Y2xhc3NOYW1lfVwiIHN0eWxlPVwicGFkZGluZy10b3A6ICR7dGhpcy5jb250YWluZXJIZWlnaHRQZXJjZW50YWdlfSVcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCIke2lkfVwiIHR5cGU9XCJ0ZWxcIiBuYW1lPVwiJHtpZH1cIiBhcmlhLWxhYmVsPVwiJHtsYWJlbH1cIj5cbiAgICAgICAgICAgICAgICAke2lucHV0TGFiZWxCb3hlcy5odG1sKCl9XG4gICAgICAgICAgICA8L2Rpdj5gO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHsgY2xhc3NOYW1lLCBpZCwgY29kZUxlbmd0aCwgbGFiZWwgfSkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgICAgIF8uZXh0ZW5kKHRoaXMsIGFyZ3VtZW50c1swXSk7XG5cbiAgICAgICAgdGhpcy5jb2RlTGVuZ3RoID0gY29kZUxlbmd0aCB8fCA2O1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgdGhpcy5ib3hXaWR0aFBlcmNlbnRhZ2UgPSBNYXRoLmZsb29yKDEwMCAvIHRoaXMuY29kZUxlbmd0aCAtIDEpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodFBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKHRoaXMuYm94V2lkdGhQZXJjZW50YWdlICogNCAvIDMpO1xuXG4gICAgICAgIHRoaXMuJGVsLmVtcHR5KCkuYXBwZW5kKHRoaXMudGVtcGxhdGUodGhpcykpO1xuXG4gICAgICAgIHRoaXMuJGlucHV0ID0gdGhpcy4kZWwuZmluZCgnaW5wdXQnKTtcblxuICAgICAgICB0aGlzLl9hdHRhY2hFdmVudHMoKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfYXR0YWNoRXZlbnRzKCkge1xuICAgICAgICB0aGlzLiRpbnB1dC5vbignaW5wdXQgY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGlucHV0Q29kZSA9IHRoaXMuJGlucHV0LnZhbCgpLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICAgICAgICBpZiAoaW5wdXRDb2RlLmxlbmd0aCA+IHRoaXMuY29kZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlucHV0Q29kZSA9IGlucHV0Q29kZS5zbGljZSgwLCB0aGlzLmNvZGVMZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4kaW5wdXQudmFsKGlucHV0Q29kZSk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgIHRoaXMuY29kZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJveCA9ICB0aGlzLiRlbC5maW5kKGAuaW5wdXRMYWJlbEJveCMke2l9YCk7XG4gICAgICAgICAgICAgICAgYm94LmVtcHR5KCkuYXBwZW5kKGA8ZGl2IGNsYXNzPVwiaW5wdXRCb3hDb250ZW50V3JhcHBlclwiPjxzcGFuIGNsYXNzPVwiaW5wdXRCb3hDb250ZW50c1wiPiR7aW5wdXRDb2RlLmNoYXJBdChpKX08L3NwYW4+PC9kaXY+YCk7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBpbnB1dENvZGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGJveC5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSBpbnB1dENvZGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGJveC5hZGRDbGFzcygnZmlsbGVkJykuYWRkQ2xhc3MoJ2ZvY3VzZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJveC5yZW1vdmVDbGFzcygnZmlsbGVkJykucmVtb3ZlQ2xhc3MoJ2ZvY3VzZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5wdXRDb2RlLmxlbmd0aCA9PT0gdGhpcy5jb2RlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kZWwuZmluZChgLmlucHV0TGFiZWxCb3gjJHtpbnB1dENvZGUubGVuZ3RoIC0gMX1gKS5hZGRDbGFzcygnZm9jdXNlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLiRlbC5maW5kKCcuaW5wdXRMYWJlbEJveCcpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGlucHV0LmZvY3VzKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuJGlucHV0Lm9uKCdmb2N1cycsICgpID0+IHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuJGlucHV0LnZhbCgpLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy5jb2RlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoYC5pbnB1dExhYmVsQm94IyR7aW5kZXh9YCkuYWRkQ2xhc3MoJ2ZvY3VzZWQnKS5hZGRDbGFzcygnZmlsbGVkJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuJGlucHV0Lm9uKCdibHVyJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy4kaW5wdXQudmFsKCkubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLmNvZGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbC5maW5kKGAuaW5wdXRMYWJlbEJveCMke2luZGV4IC0gMX1gKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kZWwuZmluZChgLmlucHV0TGFiZWxCb3gjJHtpbmRleH1gKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpLnJlbW92ZUNsYXNzKCdmaWxsZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9jdXMoKXtcbiAgICAgICAgdGhpcy4kaW5wdXQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuJGlucHV0LnZhbCgpLmxlbmd0aCA9PT0gdGhpcy5jb2RlTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiRlbC5maW5kKCcudmVyaWZpY2F0aW9uQ29kZUlucHV0JykuYWRkQ2xhc3MoJ2ludmFsaWQnKTtcbiAgICAgICAgdGhpcy4kaW5wdXQub24oJ2ZvY3VzJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kZWwuZmluZCgnLnZlcmlmaWNhdGlvbkNvZGVJbnB1dCcpLnJlbW92ZUNsYXNzKCdpbnZhbGlkJyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBrZXlzIGZyb20gJy4uLy4uL3V0aWwva2V5Y29kZXMnO1xuaW1wb3J0IE1vZGFsVGVtcGxhdGUgZnJvbSAnLi90ZW1wbGF0ZXMvbW9kYWwuaHRtbCc7XG5cbmNsYXNzIE1vZGFsIGV4dGVuZHMgQmFja2JvbmUuVmlldyB7XG4gICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICAvLyBXaGVuIHRoZSBmbGFnIGlzIGVuYWJsZWQsIGNsb3NlT25Fc2MgbXVzdCBhbHdheXMgYmUgRkFMU0VcbiAgICAgICAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIEVTQyBrZXkgYmVoYXZpb3IgZGVmaW5lZCBpbiBfYmluZEV2ZW50cygpIGV4ZWN1dGVzIHByb3Blcmx5LlxuICAgICAgICAvLyBEbyBub3QgbW9kaWZ5IHRoaXMgdmFsdWUgd2hlbiBjYWxsaW5nIGEgbmV3IG1vZGFsLlxuICAgICAgICB2YXIgY2xvc2VNb2RhbE9uRXNjID0gd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZChcbiAgICAgICAgICAgICdjbG9zZS1kcm9wZG93bnMtb24tZXNjJ1xuICAgICAgICApXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGF1dG9TaG93OiB0cnVlLFxuICAgICAgICAgICAgYXV0b1JlbmRlcjogdHJ1ZSxcbiAgICAgICAgICAgIGNsb3NlT25Fc2M6IGNsb3NlTW9kYWxPbkVzYyxcbiAgICAgICAgICAgIGNsb3NlT25CbHVyOiB0cnVlLFxuXG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3NtYWxsJ10sXG4gICAgICAgICAgICBidXR0b25BbGlnbjogJ3JpZ2h0JyxcbiAgICAgICAgICAgIHRpdGxlOiAnVGl0bGUnLFxuICAgICAgICAgICAgaGlkZGVuVGl0bGU6IGZhbHNlLFxuICAgICAgICAgICAgY29udGVudDogJ1NvbWUgQ29udGVudCcsXG4gICAgICAgICAgICBzdWJtaXRUZXh0OiBodG1sKCdvaycpLFxuICAgICAgICAgICAgY2FuY2VsVGV4dDogaHRtbCgnY2FuY2VsJyksXG4gICAgICAgICAgICBhdHRhY2hUb0RvY3VtZW50OiB0cnVlLFxuICAgICAgICAgICAgZGVmYXVsdEJ1dHRvbkJlaGF2aW91cjogdHJ1ZSxcbiAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKG9wdGlvbnMpIHtcbiAgICAgICAgXy5leHRlbmQodGhpcywgdGhpcy5kZWZhdWx0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy50cGwgPSBNb2RhbFRlbXBsYXRlO1xuICAgICAgICB0aGlzLnNldEVsZW1lbnQodGhpcy50cGwodGhpcykpO1xuXG4gICAgICAgIGlmICh0aGlzLmlkLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy4kZWwuYXR0cignaWQnLCB0aGlzLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuJGNvbnRlbnQgPSB0aGlzLiRlbC5maW5kKCcubW9kYWwtY29udGFpbmVyJyk7XG5cbiAgICAgICAgdGhpcy4kY29udGVudC5lbXB0eSgpLmFwcGVuZCh0aGlzLmNvbnRlbnQpO1xuXG4gICAgICAgIHRoaXMuJGVsLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5qb2luKCcgJykpO1xuXG4gICAgICAgIHRoaXMuJHRpdGxlID0gdGhpcy4kZWwuZmluZCgnLm1vZGFsLXRpdGxlJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuVGl0bGUpIHtcbiAgICAgICAgICAgIHRoaXMuJHRpdGxlLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICB0aGlzLiR0aXRsZS5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hdXRvUmVuZGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgICB9XG5cbiAgICBfcmVuZGVyKCkge1xuICAgICAgICBpZiAodGhpcy5hdHRhY2hUb0RvY3VtZW50KSB7XG4gICAgICAgICAgICAvLyBGb3IgRm91bmRhdGlvbiB0byB3b3JrIGFzIGV4cGVjdGVkIHdlIG5lZWQgdG8gaGF2ZSB0aGUgZWxlbWVudCBhdHRhY2hlZCB0byB0aGUgRE9NIGJlZm9yZSBjYWxsaW5nIC5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpXG4gICAgICAgICAgICAkKCdib2R5JykuYXBwZW5kKHRoaXMuZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0b1Nob3cpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaXNTZWxlY3RFdmVudCA9IChlKSA9PlxuICAgICAgICAoZS50eXBlID09PSAnY2xpY2snIHx8IGUud2hpY2ggPT09IDEzIHx8IGUud2hpY2ggPT09IDMyKSAmJlxuICAgICAgICAoZS5wcmV2ZW50RGVmYXVsdCgpIHx8IHRydWUpO1xuXG4gICAgLy8gV2UgZG9udCBhY3R1YWxseSB3YW50IHRvIHVzZSB0aGUgRm91bmRhdGlvbiBtb2RhbCBldmVudHMgc2luY2UgdGhleSBnZXQgd2VpcmQgZmFzdC4uLlxuICAgIC8vIGxldHMgdXNlIG91ciBvd24gc28gY29uc3VtZXJzIGRvbnQgaGF2ZSB0byBrbm93IGl0cyBmb3VuZGF0aW9uXG4gICAgX2JpbmRFdmVudHMoKSB7XG4gICAgICAgIHRoaXMuJGVsLm9uKCdjbGljayBrZXlkb3duJywgJy5qcy1jbG9zZScsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzU2VsZWN0RXZlbnQoZSkgJiYgdGhpcy50cmlnZ2VyKCdjYW5jZWwnLCB0aGlzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEJ1dHRvbkJlaGF2aW91cikge1xuICAgICAgICAgICAgdGhpcy5vbignY2xvc2UgY2FuY2VsJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4kZWwub24oJ2tleXByZXNzJywgJyonLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IGtleXMuVEFCKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fa2VlcEZvY3VzKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAod2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnY2xvc2UtZHJvcGRvd25zLW9uLWVzYycpKSB7XG4gICAgICAgICAgICAvLyBQcmV2ZW50IEVTQyBmcm9tIGNsb3NpbmcgbW9kYWwgd2hlbiA8c2VsZWN0PiBlbGVtZW50cyBhcmUgb3BlblxuICAgICAgICAgICAgdGhpcy4kZWwub24oJ2NsaWNrIGtleWRvd24ga2V5dXAnLCAnc2VsZWN0JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29ycmVjdEV2ZW50VHlwZSA9XG4gICAgICAgICAgICAgICAgICAgIGUudHlwZSA9PT0gJ2NsaWNrJyB8fFxuICAgICAgICAgICAgICAgICAgICBlLndoaWNoID09PSBrZXlzLkVOVEVSIHx8XG4gICAgICAgICAgICAgICAgICAgIGUud2hpY2ggPT09IGtleXMuRVNDO1xuICAgICAgICAgICAgICAgIGlmICghY29ycmVjdEV2ZW50VHlwZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgdmFyIHNlbGVjdE9wZW4gPSAkKHRoaXMpLmF0dHIoJ2RhdGEtb3BlbicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdE9wZW4gPT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2RhdGEtb3BlbicsICdmYWxzZScpO1xuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdE9wZW4gPT09ICdmYWxzZScgfHwgc2VsZWN0T3BlbiA9PSBudWxsKSAmJlxuICAgICAgICAgICAgICAgICAgICBlLndoaWNoICE9PSBrZXlzLkVTQ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2RhdGEtb3BlbicsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuJGVsLm9uKCdibHVyJywgJ3NlbGVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2RhdGEtb3BlbicsICdmYWxzZScpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIENsb3NlIG1vZGFscyB3aXRoIEVTQ1xuICAgICAgICAgICAgdGhpcy4kZWwub24oJ2tleXVwJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0SXNOb3RPcGVuID1cbiAgICAgICAgICAgICAgICAgICAgISQoJ3NlbGVjdCcpLmlzKCc6Zm9jdXMnKSB8fFxuICAgICAgICAgICAgICAgICAgICAkKCc6Zm9jdXMnKS5hdHRyKCdkYXRhLW9wZW4nKSAhPT0gJ3RydWUnO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZS53aGljaCA9PT0ga2V5cy5FU0MgJiZcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SXNOb3RPcGVuICYmXG4gICAgICAgICAgICAgICAgICAgICQoJy5mLW9wZW4tZHJvcGRvd24nKS5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdjYW5jZWwnLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuX2JlZm9yZVNob3coKTtcbiAgICAgICAgdGhpcy4kZWwuZm91bmRhdGlvbigncmV2ZWFsJywgJ29wZW4nKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdzaG93JywgdGhpcyk7XG5cbiAgICAgICAgdGhpcy4kZWwub24oJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fa2VlcEZvY3VzKGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFeGVjdXRlIGNvZGUgYWZ0ZXIgdGhlIG1vZGFsIGlzIGRpc3BsYXllZFxuICAgICAgICB0aGlzLiRlbC5vbignb3BlbmVkLmZuZHRuLnJldmVhbCcsICgpID0+IHRoaXMuX2FmdGVyU2hvdygpKTtcblxuICAgICAgICAvLyBUcmFwcyBmb3VuZGF0aW9uIGJ1ZyB0aGF0IGNsb3NlcyBtb2RhbCBvbiBkcm9wZG93biBcImNsb3NlZFwiLCBub3QgYW4gaXNzdWUgaW4gNS41LjMrXG4gICAgICAgIHRoaXMuJGVsLm9mZignY2xvc2VkJyk7XG5cbiAgICAgICAgLy8gSGFuZGxlIGZvdW5kYXRpb24gIGNsb3NlIGV2ZW50cyBmcm9tIEVTQyBhbmQgQkcgY2xpY2tzXG4gICAgICAgIHRoaXMuJGVsLm9uKCdjbG9zZS5mbmR0bi5yZXZlYWwnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiRlbC5vZmYoJ2Nsb3NlLmZuZHRuLnJldmVhbCcpO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdjbG9zZScpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfYmVmb3JlU2hvdygpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBfYWZ0ZXJTaG93KCkge1xuICAgICAgICB0aGlzLiRlbC5hdHRyKCdhcmlhLWhpZGRlbicsIGZhbHNlKTtcbiAgICAgICAgJCgnLmNvbnRhaW5lcicpLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgICAgJCgnLnJvdy5mb290ZXInKS5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgICAgICQoJy5uYXYtY29udGFpbmVyJykuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgICAgIHRoaXMuJGVsLmZpbmQoJzpmb2N1c2FibGU6dmlzaWJsZScpLmZpcnN0KCkuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5fc2V0U2Nyb2xsKCk7XG4gICAgfVxuXG4gICAgX3NldFNjcm9sbCgpIHtcbiAgICAgICAgbGV0IG9mZnNldCA9XG4gICAgICAgICAgICB3aW5kb3cucGFnZVlPZmZzZXQgLSBwYXJzZUludCh0aGlzLiRlbC5jc3MoJ3RvcCcpLnNsaWNlKDAsIC0yKSwgMTApOyAvLyB0aGUgJ3RvcCcgc3R5bGluZyBpcyBiYWtlZCBpbiBieSBmb3VuZGF0aW9uXG4gICAgICAgIGlmICh3aW5kb3cuaW5uZXJIZWlnaHQgPCB0aGlzLmVsLm9mZnNldEhlaWdodCAtIG9mZnNldCkge1xuICAgICAgICAgICAgLy8gc2Nyb2xsIHRhbGwgbW9kYWxzIGludG8gdmlldyBhcyBtdWNoIGFzIGZpdHNcbiAgICAgICAgICAgIG9mZnNldCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgIHRoaXMuZWwub2Zmc2V0SGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0ICsgMTAsXG4gICAgICAgICAgICAgICAgLTVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPCA2NDEpIHtcbiAgICAgICAgICAgIC8vIG1vYmlsZSB2aWV3IHBhZGRpbmdcbiAgICAgICAgICAgIG9mZnNldCAtPSA1O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWwuc2Nyb2xsSW50b1ZpZXcoKTsgLy8gc2V0cyBzY3JvbGwgdG8gdG9wIG9mIG1vZGFsXG4gICAgICAgIHdpbmRvdy5zY3JvbGxCeSgwLCBvZmZzZXQpOyAvLyBhZGp1c3RzIHNjcm9sbCBhY2NvcmRpbmcgdG8gY2FsY3VsYXRlZCBvZmZzZXRcbiAgICB9XG5cbiAgICBfa2VlcEZvY3VzKGUpIHtcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbSA9ICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGZpcnN0Rm9jdXNhYmxlID0gdGhpcy4kZWwuZmluZCgnOmZvY3VzYWJsZTp2aXNpYmxlJykuZmlyc3QoKTtcbiAgICAgICAgY29uc3QgbGFzdEZvY3VzYWJsZSA9IHRoaXMuJGVsLmZpbmQoJzpmb2N1c2FibGU6dmlzaWJsZScpLmxhc3QoKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBhY3RpdmVFbGVtLmlzKGZpcnN0Rm9jdXNhYmxlKSAmJlxuICAgICAgICAgICAgZS53aGljaCA9PT0ga2V5cy5UQUIgJiZcbiAgICAgICAgICAgIGUuc2hpZnRLZXlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBsYXN0Rm9jdXNhYmxlLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAkKGFjdGl2ZUVsZW0pLmlzKGxhc3RGb2N1c2FibGUpICYmXG4gICAgICAgICAgICBlLndoaWNoID09PSBrZXlzLlRBQiAmJlxuICAgICAgICAgICAgIWUuc2hpZnRLZXlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBmaXJzdEZvY3VzYWJsZS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy4kZWwuZm91bmRhdGlvbigncmV2ZWFsJywgJ2Nsb3NlJyk7XG4gICAgICAgIHRoaXMudHJpZ2dlcignaGlkZScsIHRoaXMpO1xuICAgICAgICAkKCcuY29udGFpbmVyJykuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcbiAgICAgICAgJCgnLnJvdy5mb290ZXInKS5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuICAgICAgICAkKCcubmF2LWNvbnRhaW5lcicpLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG4gICAgICAgIHRoaXMuZm9jdXNlZC5mb2N1cygpO1xuICAgIH1cblxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IE1vZGFsIH07XG4iLCJleHBvcnQgZGVmYXVsdCAoe3RpdGxlLCBjbG9zZU9uRXNjLCBjbG9zZU9uQmx1ciwgc2hvd0Nsb3NlQnV0dG9ufSkgPT5cbmA8ZGl2XG4gICAgY2xhc3M9XCJyZXZlYWwtbW9kYWxcIlxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgYXJpYS1sYWJlbD1cIiR7dGl0bGV9XCJcbiAgICByb2xlPVwiZGlhbG9nXCJcbiAgICBkYXRhLXJldmVhbFxuICAgIGRhdGEtb3B0aW9ucz1cImNsb3NlX29uX2VzYzokeyBjbG9zZU9uRXNjIH07Y2xvc2Vfb25fYmFja2dyb3VuZF9jbGljazokeyBjbG9zZU9uQmx1ciB9O1wiXG4+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJtb2RhbC10aXRsZSBwcmltYXJ5LWNvbG9yXCI+JHsgdGl0bGUgfTwvaDI+XG4gICAgICAgICR7c2hvd0Nsb3NlQnV0dG9uID8gYDxhIGNsYXNzPVwiY2xvc2UtcmV2ZWFsLW1vZGFsIGpzLWNsb3NlXCIgcm9sZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCIkeyB3aW5kb3cuaHRtbCgnY2xvc2UnKSB9XCIgdGFiaW5kZXg9XCIwXCI+JiMyMTU7PC9hPmAgOiAnJ31cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250YWluZXJcIj48L2Rpdj5cbjwvZGl2PmA7XG4iLCJjb25zdCB7IHRleHQsIGh0bWwsIHVybCwgcm91dGVzIH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBkZWZhdWx0IChsZWFybk1vcmVMaW5rKSA9PiBgXG48ZGl2IGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJjaGVja0JveFwiPjwvZGl2PlxuPC9kaXY+XG48c3BhbiBjbGFzcz1cInNtYWxsLTEyIGNvbHVtbnMgc2lnblVwU3VjY2Vzcy1zdWNjZXNzIHByaW1hcnktY29sb3JcIj4ke2h0bWwoXG4gICAgJ2lkY1NpZ25JblN1Y2Nlc3Muc3VjY2Vzcydcbil9PC9zcGFuPlxuPHNwYW4gY2xhc3M9XCJzbWFsbC0xMiBjb2x1bW5zIHNpZ25VcFN1Y2Nlc3Mtc3RhcnRCb3Jyb3dpbmdcIj4ke2h0bWwoXG4gICAgJ2lkY1NpZ25JblN1Y2Nlc3Muc3RhcnRCb3Jyb3dpbmcnXG4pfTwvc3Bhbj5cbjxzcGFuIGNsYXNzPVwic21hbGwtMTIgY29sdW1uc1wiPiR7dGV4dCgnaWRjU2lnbkluU3VjY2Vzcy53aGVuWW91Q29tZUJhY2snLCB7XG4gICAgdXNlTW9iaWxlTnVtOiBgPHNwYW4gY2xhc3M9XCJib2xkXCI+JHtodG1sKFxuICAgICAgICAnaWRjU2lnbkluU3VjY2Vzcy51c2VNb2JpbGVOdW0nXG4gICAgKX08L3NwYW4+YCxcbn0pfTwvc3Bhbj5cbjxzcGFuIGNsYXNzPVwic21hbGwtMTIgY29sdW1uc1wiPiR7aHRtbCgnaWRjU2lnbkluU3VjY2Vzcy5jYXJkRXhwZXJpYXRpb24nKX0gXG4gICAgJHtcbiAgICAgICAgbGVhcm5Nb3JlTGluayAhPT0gJydcbiAgICAgICAgICAgID8gYDxhIGNsYXNzPVwic2lnblVwU3VjY2Vzcy1sZWFybk1vcmUgc2Vjb25kYXJ5LWNvbG9yXCIgaHJlZj1cIiR7bGVhcm5Nb3JlTGlua31cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCI+JHtodG1sKFxuICAgICAgICAgICAgICAgICAgJ2lkY1NpZ25JblN1Y2Nlc3MubGVhcm5Nb3JlJ1xuICAgICAgICAgICAgICApfTwvYT5gXG4gICAgICAgICAgICA6IGBgXG4gICAgfVxuPC9zcGFuPlxuPHNwYW4gY2xhc3M9XCJzaWduVXBTdWNjZXNzLWhhcHB5UmVhZGluZyBzbWFsbC0xMiBjb2x1bW5zXCI+JHtodG1sKFxuICAgICdpZGNTaWduSW5TdWNjZXNzLmhhcHB5UmVhZGluZydcbil9PC9zcGFuPlxuPGJ1dHRvbiBjbGFzcz1cInNtYWxsLTEyIGNvbHVtbnMgc2Vjb25kYXJ5IGpzLWNsb3NlIGJ1dHRvblwiPiR7aHRtbChcbiAgICAnaWRjU2lnbkluU3VjY2Vzcy5icm93c2VDb2xsZWN0aW9uJ1xuKX08L2J1dHRvbj5cbmA7XG4iLCJpbXBvcnQgeyBNb2RhbCB9IGZyb20gICcuLi9jb21tb24vbW9kYWwnO1xuaW1wb3J0IFNpZ25VcFN1Y2Nlc3NUZW1wbGF0ZSBmcm9tICcuL1NpZ25VcFN1Y2Nlc3NNb2RhbC5odG1sJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnblVwU3VjY2Vzc01vZGFsIGV4dGVuZHMgTW9kYWwge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBsZXQgY29udGVudCA9IFNpZ25VcFN1Y2Nlc3NUZW1wbGF0ZSh3aW5kb3cuT3ZlckRyaXZlLmNhcmRTaWduVXBMaW5rKTtcbiAgICAgICAgbGV0IG1vZGFsQ29udGVudHMgPSB7XG4gICAgICAgICAgICBjbGFzc2VzIDogWydTaWduVXBTdWNjZXNzTW9kYWwnXSxcbiAgICAgICAgICAgIHRpdGxlOiBodG1sKCdpZGNTaWduSW5TdWNjZXNzLnN1Y2Nlc3MnKSxcbiAgICAgICAgICAgIGhpZGRlblRpdGxlOiB0cnVlLFxuICAgICAgICAgICAgY29udGVudFxuICAgICAgICB9O1xuICAgICAgICBzdXBlcihtb2RhbENvbnRlbnRzKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgQXV0b0NvbXBsZXRlSW5wdXQgZnJvbSAnLi4vY29tbW9uL0F1dG9Db21wbGV0ZUlucHV0JztcbmltcG9ydCBGbG9hdGluZ0xhYmVsSW5wdXQgZnJvbSAnLi4vY29tbW9uL0Zsb2F0aW5nTGFiZWxJbnB1dCc7XG5pbXBvcnQgVmVyaWZpY2F0aW9uQ29kZUlucHV0IGZyb20gJy4uL2NvbW1vbi9WZXJpZmljYXRpb25Db2RlSW5wdXQnO1xuaW1wb3J0IFBob25lTnVtYmVySW5wdXQgZnJvbSAnLi4vY29tbW9uL1Bob25lTnVtYmVySW5wdXQnO1xuaW1wb3J0IFNpZ25VcFN1Y2Nlc3NNb2RhbCBmcm9tICcuLi9pZGNfc2lnbnVwX3N1Y2Nlc3NfbW9kYWwvU2lnblVwU3VjY2Vzc01vZGFsJztcbmltcG9ydCB7IHRvU3RhdGljVXJsIH0gZnJvbSAnLi4vLi4vLi4vLi4vbGliL2Fzc2V0TWFwcGVyJztcblxuY29uc3QgeyB0ZXh0LCByb3V0ZXMsIHVybCwgTG9nZ2VyIH0gPSB3aW5kb3c7XG5jb25zdCB7IF8gfSA9IHdpbmRvdztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnbkluIGV4dGVuZHMgQmFja2JvbmUuVmlldyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVsLFxuICAgICAgICBvem9uZURhdGEsXG4gICAgICAgIGZvcndhcmRVcmwsXG4gICAgICAgIGZvcm1LZXkgPSAnJyxcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gJycsXG4gICAgICAgIG96b25lQ2FwdGNoYVJlcXVpcmVkID0gZmFsc2UsXG4gICAgICAgIHNob3dJZGNTaWduVXAgPSBmYWxzZSxcbiAgICAgICAgcHJldmlvdXNVc2VybmFtZSA9ICcnLFxuICAgICAgICBwcmV2aW91c0xpYnJhcnlOYW1lID0gJycsXG4gICAgICAgIGlkY0NhcHRjaGFSZXF1aXJlZCA9IGZhbHNlLFxuICAgICAgICBpZGNDYXB0Y2hhID0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgICAgdGhpcy5vem9uZURhdGEgPSBvem9uZURhdGE7XG4gICAgICAgIHRoaXMuZm9ybXMgPSBvem9uZURhdGEuZm9ybXM7XG4gICAgICAgIHRoaXMuZmVhdHVyZXMgPSBvem9uZURhdGEuZmVhdHVyZXM7XG4gICAgICAgIHRoaXMuZm9yd2FyZFVybCA9IGZvcndhcmRVcmw7XG4gICAgICAgIHRoaXMuZm9ybUtleSA9IGZvcm1LZXkgfHwgd2luZG93LkNvb2tpZXMuZ2V0KCdvem9uZVByZWZlcmVkSWxzJyk7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlO1xuICAgICAgICB0aGlzLm96b25lQ2FwdGNoYSA9IG96b25lQ2FwdGNoYVJlcXVpcmVkICYmIG96b25lRGF0YS5jYXB0Y2hhO1xuICAgICAgICB0aGlzLmlkY0NhcHRjaGEgPSBpZGNDYXB0Y2hhUmVxdWlyZWQgJiYgaWRjQ2FwdGNoYTtcbiAgICAgICAgdGhpcy5zaG93SWRjU2lnblVwID0gc2hvd0lkY1NpZ25VcCA9PT0gJ3RydWUnO1xuICAgICAgICB0aGlzLmlkY09wdGlvbnMgPSBvem9uZURhdGEuZ2V0QUNhcmQ7XG4gICAgICAgIHRoaXMucHJldmlvdXNVc2VybmFtZSA9IHByZXZpb3VzVXNlcm5hbWU7XG4gICAgICAgIHRoaXMucHJldmlvdXNMaWJyYXJ5TmFtZSA9IHByZXZpb3VzTGlicmFyeU5hbWU7XG4gICAgICAgIHRoaXMuaWRjT25seSA9XG4gICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdpZGMtb25seS1pbHMnKSAmJlxuICAgICAgICAgICAgdGhpcy5mb3Jtcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIHRoaXMuaWRjT3B0aW9ucztcbiAgICB9XG5cbiAgICBfcmVuZGVyKCkge1xuICAgICAgICBpZiAod2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnZ2VvLWlkYycpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJHZW9TaWdudXAoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3dJZGNTaWduVXAgJiYgdGhpcy5vem9uZURhdGEuZ2V0QUNhcmQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0lkY1NpZ25VcCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVySWRjU2lnbnVwKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJMaWJyYXJ5Q2FyZEZvcm0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlkY09ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlck1vYmlsZU51bWJlckZvcm0oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRQcml2YWN5UG9saWN5TGluaygpIHtcbiAgICAgICAgY29uc3QgaXNEeXNsZXhpY01vZGUgPSB3aW5kb3cuT3ZlckRyaXZlLmR5c2xleGljO1xuICAgICAgICBjb25zdCBpc0hDTSA9IHdpbmRvdy5PdmVyRHJpdmUuaGlnaENvbnRyYXN0O1xuICAgICAgICBsZXQgYWNjZXNzaWJpbGl0eVNldHRpbmdzUXVlcnkgPSAnJztcbiAgICAgICAgbGV0IGFjY2Vzc2liaWxpdHlTZXR0aW5ncyA9IFtdO1xuICAgICAgICBpZiAoaXNIQ00pIHtcbiAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlTZXR0aW5ncy5wdXNoKCdoaWdoLWNvbnRyYXN0PTEnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEeXNsZXhpY01vZGUpIHtcbiAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlTZXR0aW5ncy5wdXNoKCdkeXNsZXhpYz0xJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWNjZXNzaWJpbGl0eVNldHRpbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlTZXR0aW5nc1F1ZXJ5ID0gYD8ke2FjY2Vzc2liaWxpdHlTZXR0aW5ncy5qb2luKCcmJyl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgaHR0cHM6Ly9jb21wYW55LmNkbi5vdmVyZHJpdmUuY29tL3BvbGljaWVzL3ByaXZhY3ktcG9saWN5Lmh0bSR7YWNjZXNzaWJpbGl0eVNldHRpbmdzUXVlcnl9YDtcbiAgICB9XG5cbiAgICBfbWFpbkZvcm1IdG1sKHR5cGUpIHtcbiAgICAgICAgY29uc3Qgc2lnbkluTGluayA9IHdpbmRvdy5yb3V0ZXMuYWNjb3VudFNpZ25JbjtcbiAgICAgICAgbGV0IHRlbXBsYXRlID0gJChgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2lnbkluSGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwiaGVhZGVyVGV4dCBwcmltYXJ5LWNvbG9yXCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAnc2lnbkluUGFnZS53ZWxjb21lJ1xuICAgICAgICAgICAgICAgICl9PC9oMT5cbiAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICB0eXBlID09PSAnbW9iaWxlTnVtYmVyJyB8fCB0eXBlID09PSAnZ2VvJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBgPHAgY2xhc3M9XCJwbGVhc2VTaWduSW5cIj4ke3RleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2lnbkluUGFnZS5wbGVhc2VTaWduSW5Nb2JpbGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9PC9wPmBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYDxwIGNsYXNzPVwicGxlYXNlU2lnbkluXCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UucGxlYXNlU2lnbkluJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApfTwvcD5gXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3pvbmVEYXRhLmdldEFDYXJkICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3pvbmVEYXRhLmdldEFDYXJkLnByaW1hcnkuc2lnblVwICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgIT09ICdtb2JpbGVOdW1iZXInICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgIT09ICdnZW8nXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdldEFDYXJkUHJvbW9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPiR7dGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2lnbkluUGFnZS5tZW1iZXJZZXQnXG4gICAgICAgICAgICAgICAgICAgICAgICApfSA8YSBjbGFzcz1cInNlY29uZGFyeS1jb2xvciBnZXRPbmVJbnN0YW50bHlMaW5rXCIgdGFiaW5kZXg9XCIwXCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UuZ2V0QUNhcmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9PC9hPjwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICB0eXBlID09PSAnbW9iaWxlTnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBgPHAgY2xhc3M9XCJwbGVhc2VTaWduSW5cIj5cbiAgICAgICAgICAgICAgICAgICAgJHt0ZXh0KCdzaWduSW5QYWdlLmhhdmVBQ2FyZCcsIHsgc2lnbkluTGluayB9KX1cbiAgICAgICAgICAgICAgICA8L3A+YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0Q29udGFpbmVyXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tU2lnbkluT3B0aW9uc0NvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgICBgKTtcblxuICAgICAgICB0ZW1wbGF0ZS5maW5kKCcuZ2V0T25lSW5zdGFudGx5TGluaycpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcklkY1NpZ251cCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgX3JlbmRlckxpYnJhcnlDYXJkRm9ybSgpIHtcbiAgICAgICAgdGhpcy5lbC5lbXB0eSgpLmFwcGVuZCh0aGlzLl9tYWluRm9ybUh0bWwoKSk7XG4gICAgICAgIHRoaXMuc2lnbkluSGVhZGVyID0gdGhpcy5lbC5maW5kKCcuc2lnbkluSGVhZGVyJyk7XG4gICAgICAgIHRoaXMuaW5wdXRDb250YWluZXIgPSB0aGlzLmVsLmZpbmQoJy5pbnB1dENvbnRhaW5lcicpO1xuICAgICAgICB0aGlzLmJvdHRvbVNpZ25Jbk9wdGlvbnNEaXYgPSB0aGlzLmVsLmZpbmQoXG4gICAgICAgICAgICAnLmJvdHRvbVNpZ25Jbk9wdGlvbnNDb250YWluZXInXG4gICAgICAgICk7XG4gICAgICAgIGxldCBsaWJyYXJ5Q2FyZFNpZ25JbkNvbnRhbmluZXIgPSAkKFxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJMaWJyYXJ5Q2FyZFNpZ25JblwiPjwvZGl2PidcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRGb3JtO1xuICAgICAgICBpZiAodGhpcy5mb3JtS2V5KSB7XG4gICAgICAgICAgICBzZWxlY3RlZEZvcm0gPSB0aGlzLmZvcm1zLmZpbmQoKGYpID0+IGYuaWxzTmFtZSA9PT0gdGhpcy5mb3JtS2V5KTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJTdWJGb3JtKHNlbGVjdGVkRm9ybSwgbGlicmFyeUNhcmRTaWduSW5Db250YW5pbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZvcm1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyU3ViRm9ybSh0aGlzLmZvcm1zWzBdLCBsaWJyYXJ5Q2FyZFNpZ25JbkNvbnRhbmluZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbGlicmFyeVR5cGUgPSB3aW5kb3cuT3ZlckRyaXZlLmRpZ2l0YWxDb2xsZWN0aW9uVHlwZTtcbiAgICAgICAgICAgIGxldCBzaWduSW5MYWJlbDtcbiAgICAgICAgICAgIGlmIChsaWJyYXJ5VHlwZSA9PT0gJ1NETCcpIHtcbiAgICAgICAgICAgICAgICBzaWduSW5MYWJlbCA9IHRleHQoJ3NpZ25JblBhZ2UubGlicmFyeUNhcmQuc2Nob29sJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpYnJhcnlUeXBlID09PSAnQ0RMJyB8fCBsaWJyYXJ5VHlwZSA9PT0gJ0NvcnBvcmF0ZScpIHtcbiAgICAgICAgICAgICAgICBzaWduSW5MYWJlbCA9IHRleHQoJ3NpZ25JblBhZ2UubGlicmFyeUNhcmQub3JnYW5pemF0aW9uJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpYnJhcnlUeXBlID09PSAnRExSJykge1xuICAgICAgICAgICAgICAgIHNpZ25JbkxhYmVsID0gdGV4dCgnc2lnbkluUGFnZS5saWJyYXJ5Q2FyZC5icmFuY2hlcycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXcgQXV0b0NvbXBsZXRlSW5wdXQoe1xuICAgICAgICAgICAgICAgIGVsOiB0aGlzLmlucHV0Q29udGFpbmVyLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3NpZ25JbklucHV0JyxcbiAgICAgICAgICAgICAgICBpZDogJ3NpZ25pbi1vcHRpb25zJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogc2lnbkluTGFiZWwsXG4gICAgICAgICAgICAgICAgZmllbGRMaXN0OiB0aGlzLmZvcm1zLm1hcCgoZikgPT4gZi5kaXNwbGF5TmFtZSksXG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpZWxkOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzTGlicmFyeU5hbWUgfHxcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRm9ybSAmJiBzZWxlY3RlZEZvcm0uZGlzcGxheU5hbWUpLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRXZlbnQ6IChicmFuY2hLZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGb3JtID0gdGhpcy5mb3Jtcy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGYpID0+IGYuZGlzcGxheU5hbWUgPT09IGJyYW5jaEtleVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kc0luWWVhciA9IDEwMDAgKiA2MCAqIDYwICogMjQgKiAzNjU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGlyZURhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGUubm93KCkgKyBtaWxsaXNlY29uZHNJblllYXJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LkNvb2tpZXMuc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJ296b25lUHJlZmVyZWRJbHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGb3JtLmlsc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cE9ubHk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM6IGV4cGlyZURhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZVNpdGU6ICdsYXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJTdWJGb3JtKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeUNhcmRTaWduSW5Db250YW5pbmVyXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLnJlbmRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnB1dENvbnRhaW5lci5hcHBlbmQobGlicmFyeUNhcmRTaWduSW5Db250YW5pbmVyKTtcblxuICAgICAgICBpZiAodGhpcy5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nob3dFcnJvck1lc3NhZ2UodGhpcy5lcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldmlvdXNVc2VybmFtZSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAkKCcjdXNlcm5hbWUnKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICQoJyN1c2VybmFtZScpLnZhbCh0aGlzLnByZXZpb3VzVXNlcm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJldmVudCByZW5kZXJpbmcgdGhlIG1vYmlsZU51bWJlciBmb3JtIGlmIG1vdmVkU2l0ZU1lc3NhZ2UgaXMgZW5hYmxlZCBBTkQgdGhlIGZvcm0gaXMgb2YgdHlwZSBcIk1vdmVkXCJcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5vem9uZURhdGEuZ2V0QUNhcmQgJiZcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnbW92ZWRTaXRlTWVzc2FnZScpICYmXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRGb3JtICYmXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRGb3JtLnR5cGUgPT09ICdNb3ZlZCdcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl9hZGRTZWNvbmRhcnlTaWduSW4oJ21vYmlsZU51bWJlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlR2V0T25lSW5zdGFudGx5QnV0dG9uKHRydWUpO1xuICAgICAgICBpZiAoIXRoaXMuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmVsLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcmVuZGVyU3ViRm9ybShzZWxlY3RlZEZvcm0sIGNvbnRhaW5lcikge1xuICAgICAgICBjb250YWluZXIuZW1wdHkoKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdtb3ZlZFNpdGVNZXNzYWdlJykgJiZcbiAgICAgICAgICAgIHRoaXMuc2lnbkluSGVhZGVyLmNzcygnZGlzcGxheScpID09PSAnbm9uZSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNpZ25JbkhlYWRlci5zaG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdtb3ZlZFNpdGVNZXNzYWdlJykgJiZcbiAgICAgICAgICAgIHNlbGVjdGVkRm9ybS50eXBlID09PSAnTW92ZWQnXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyTW92ZWRBY2NvdW50TWVzc2FnZShzZWxlY3RlZEZvcm0sIGNvbnRhaW5lcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW5wdXRzO1xuICAgICAgICBpZiAoc2VsZWN0ZWRGb3JtLnR5cGUgPT09ICdFeHRlcm5hbCcpIHtcbiAgICAgICAgICAgIGlucHV0cyA9ICQoYFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJFeHRlcm5hbFNpZ25JblRleHRDb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+JHt0ZXh0KCdzaWduSW5QYWdlLmxpYnJhcnlDYXJkLmV4dGVybmFsU2lnbkluJyl9PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRGb3JtLnR5cGUgPT09ICdFbWFpbFJlZ2lzdHJhdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlckVtYWlsUmVnaXN0cmF0aW9uKHNlbGVjdGVkRm9ybSwgY29udGFpbmVyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0cyA9ICQoJzxkaXY+PC9kaXY+Jyk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRGb3JtLmxvY2FsLnVzZXJuYW1lLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dHMuYXBwZW5kKGBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXJuYW1lQ29udGFpbmVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzYWZhcmktYXV0b2NvbXBsZXRlLWFkanVzdG1lbnQnXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnZmxvYXRpbmdMYWJlbElucHV0IHNpZ25JbklucHV0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgICAgfVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICAgICAgISFzZWxlY3RlZEZvcm0ubG9naW5IaW50VXJsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVscExpbmtDb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImhlbHBMaW5rXCIgaHJlZj1cIiR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9ybS5sb2dpbkhpbnRVcmxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9yZWZlcnJlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RleHQoJ3NpZ25JblBhZ2UuaGVscExpbmsnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IHRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHNpZ25JblBhZ2UudXNlcm5hbWVLZXlzLiR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9ybS5sb2NhbC51c2VybmFtZS5rZXkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NhcmROdW1iZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm0ubG9jYWwucGFzc3dvcmQuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIGlucHV0cy5hcHBlbmQoYFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFzc3dvcmRDb250YWluZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NhZmFyaS1hdXRvY29tcGxldGUtYWRqdXN0bWVudCdcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdmbG9hdGluZ0xhYmVsSW5wdXQgc2lnbkluSW5wdXQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAhIXNlbGVjdGVkRm9ybS5waW5IZWxwVXJsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVscExpbmtDb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImhlbHBMaW5rXCIgaHJlZj1cIiR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9ybS5waW5IZWxwVXJsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0ZXh0KCdzaWduSW5QYWdlLmhlbHBMaW5rJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lOiB0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBzaWduSW5QYWdlLnVzZXJuYW1lS2V5cy4ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZvcm0ubG9jYWwucGFzc3dvcmQua2V5IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQSU4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGVtcGxhdGUgPSAkKGBcbiAgICAgICAgICAgIDxmb3JtIG5hbWU9XCJsb2dpbi1mb3JtXCIgaWQ9XCJsb2dpbi1mb3JtXCIgbWV0aG9kPVwicG9zdFwiIGFjdGlvbj1cIiR7d2luZG93LnVybChcbiAgICAgICAgICAgICAgICByb3V0ZXMub3pvbmUuYXV0aGVudGljYXRlLFxuICAgICAgICAgICAgICAgIHsgZm9yd2FyZFVybDogdGhpcy5mb3J3YXJkVXJsIH1cbiAgICAgICAgICAgICl9XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiaWxzTmFtZVwiIHZhbHVlPVwiJHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGb3JtLmlsc05hbWVcbiAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiYXV0aFR5cGVcIiB2YWx1ZT1cIiR7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9ybS50eXBlXG4gICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cImxpYnJhcnlOYW1lXCI+XG4gICAgICAgICAgICAgICAgJHtpbnB1dHMuaHRtbCgpfVxuICAgICAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3pvbmVDYXB0Y2hhXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImctcmVjYXB0Y2hhXCIgZGF0YS1zaXRla2V5PVwiJHt0aGlzLm96b25lQ2FwdGNoYS5rZXl9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uc0NvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lnbmluLWJ1dHRvbiBidXR0b24gc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke3RleHQoJ3NpZ25JbicpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIGApO1xuXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmQodGVtcGxhdGUpO1xuXG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHNlbGVjdGVkRm9ybS50eXBlID09PSAnTG9jYWwnICYmXG4gICAgICAgICAgICBzZWxlY3RlZEZvcm0ubG9jYWwudXNlcm5hbWUuZW5hYmxlZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudXNlcm5hbWUgPSBuZXcgRmxvYXRpbmdMYWJlbElucHV0KHtcbiAgICAgICAgICAgICAgICBlbDogdGVtcGxhdGUuZmluZCgnLnVzZXJuYW1lQ29udGFpbmVyJyksXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnc2lnbkluSW5wdXQnLFxuICAgICAgICAgICAgICAgIGlkOiAndXNlcm5hbWUnLFxuICAgICAgICAgICAgICAgIC8vIHJlcGxhY2Ugc3BhY2VzIHdpdGggbm9uLWJyZWFraW5nIHNwYWNlcyB0byBwcmV2ZW50IFNhZmFyaSBmcm9tIGludGVycHJldGluZyB0aGUgXCJjYXJkIG51bWJlclwiIGZpZWxkIGFzIGEgY3JlZGl0IGNhcmQgaW5wdXRcbiAgICAgICAgICAgICAgICBsYWJlbDogdGV4dChcbiAgICAgICAgICAgICAgICAgICAgYHNpZ25JblBhZ2UudXNlcm5hbWVLZXlzLiR7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZvcm0ubG9jYWwudXNlcm5hbWUua2V5IHx8ICdDYXJkTnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgICAgICkucmVwbGFjZSgnXFx4MjAnLCAnXFx4YTAnKSxcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVIaW50OiAndXNlcm5hbWUnLFxuICAgICAgICAgICAgfSkucmVuZGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZWxlY3RlZEZvcm0udHlwZSA9PT0gJ0xvY2FsJyAmJlxuICAgICAgICAgICAgc2VsZWN0ZWRGb3JtLmxvY2FsLnBhc3N3b3JkLmVuYWJsZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gbmV3IEZsb2F0aW5nTGFiZWxJbnB1dCh7XG4gICAgICAgICAgICAgICAgZWw6IHRlbXBsYXRlLmZpbmQoJy5wYXNzd29yZENvbnRhaW5lcicpLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3NpZ25JbklucHV0JyxcbiAgICAgICAgICAgICAgICBpZDogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGV4dChcbiAgICAgICAgICAgICAgICAgICAgYHNpZ25JblBhZ2UucGluS2V5cy4ke1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGb3JtLmxvY2FsLnBhc3N3b3JkLmtleSB8fCAnUElOJ1xuICAgICAgICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVIaW50OiAnY3VycmVudC1wYXNzd29yZCcsXG4gICAgICAgICAgICB9KS5yZW5kZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRlbXBsYXRlLmZpbmQoJy5zaWduSW5JbnB1dCBpbnB1dCcpLm9uKCdrZXlwcmVzcycsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3VibWl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRlbXBsYXRlLmZpbmQoJy5zaWduaW4tYnV0dG9uJykub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm0udHlwZSA9PT0gJ0V4dGVybmFsJykge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25JbjpleHRlcm5hbCcsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9ybS5kaXNwbGF5TmFtZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25JbjpsaWJyYXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGb3JtLmRpc3BsYXlOYW1lXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fc3VibWl0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFByZXZlbnQgcmVuZGVyaW5nIHRoZSBtb2JpbGVOdW1iZXIgZm9ybSBpZiBtb3ZlZFNpdGVNZXNzYWdlIGlzIGVuYWJsZWQgQU5EIHRoZSBmb3JtIGlzIG9mIHR5cGUgXCJNb3ZlZFwiXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMub3pvbmVEYXRhLmdldEFDYXJkICYmXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ21vdmVkU2l0ZU1lc3NhZ2UnKSAmJlxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9ybSAmJlxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9ybS50eXBlID09PSAnTW92ZWQnXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fYWRkU2Vjb25kYXJ5U2lnbkluKCdtb2JpbGVOdW1iZXInKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zdWJtaXQoKSB7XG4gICAgICAgIGxldCB2YWxpZFVzZXJuYW1lID0gIXRoaXMudXNlcm5hbWUgfHwgdGhpcy51c2VybmFtZS52YWxpZGF0ZU5vbkVtcHR5KCk7XG4gICAgICAgIGxldCB2YWxpZFBhc3N3b3JkID0gIXRoaXMucGFzc3dvcmQgfHwgdGhpcy5wYXNzd29yZC52YWxpZGF0ZU5vbkVtcHR5KCk7XG5cbiAgICAgICAgaWYgKHZhbGlkVXNlcm5hbWUgJiYgdmFsaWRQYXNzd29yZCkge1xuICAgICAgICAgICAgY29uc3QgbGlicmFyeU5hbWUgPSB0aGlzLmVsLmZpbmQoJyNzaWduaW4tb3B0aW9ucycpLnZhbCgpO1xuICAgICAgICAgICAgdGhpcy5lbC5maW5kKCdbbmFtZT1saWJyYXJ5TmFtZV0nKS52YWwobGlicmFyeU5hbWUpO1xuXG4gICAgICAgICAgICB0aGlzLmVsXG4gICAgICAgICAgICAgICAgLmZpbmQoJy5zaWduaW4tYnV0dG9uJylcbiAgICAgICAgICAgICAgICAuZW1wdHkoKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnd2FpdGluZycpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj4nKTtcbiAgICAgICAgICAgIHRoaXMuZWwuZmluZCgnI2xvZ2luLWZvcm0nKS5zdWJtaXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9yZW5kZXJJZGNDYXB0Y2hhKGlkID0gJ2lkYy1jYXB0Y2hhLWNvbnRhaW5lcicpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlkY0NhcHRjaGEpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImctcmVjYXB0Y2hhXCJcbiAgICAgICAgICAgICAgICBkYXRhLWNhbGxiYWNrPVwiX19yZWNhcHRjaGFEYXRhQ2FsbGJhY2tcIlxuICAgICAgICAgICAgICAgIGRhdGEtc2l0ZWtleT1cIiR7dGhpcy5pZGNDYXB0Y2hhLmtleX1cIlxuICAgICAgICAgICAgICAgIGRhdGEtc2l6ZT1cImludmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgaWQ9XCIke2lkfVwiPjwvZGl2PlxuICAgICAgICBgO1xuICAgIH1cblxuICAgIF9yZW5kZXJNb3ZlZEFjY291bnRNZXNzYWdlKGFjY291bnQsIGNvbnRhaW5lcikge1xuICAgICAgICBjb250YWluZXIuZW1wdHkoKTtcbiAgICAgICAgdGhpcy5zaWduSW5IZWFkZXIuaGlkZSgpO1xuICAgICAgICB0aGlzLmJvdHRvbVNpZ25Jbk9wdGlvbnNEaXYuZW1wdHkoKTtcblxuICAgICAgICBsZXQgbWVzc2FnZUxpbmsgPSBgPGEgY2xhc3M9XCJoZWxwTGlua1wiIGhyZWY9XCJodHRwczovL2xpbmsub3ZlcmRyaXZlLmNvbT93ZWJzaXRlSWQ9JHtcbiAgICAgICAgICAgIGFjY291bnQubW92ZWQud2Vic2l0ZUlkXG4gICAgICAgIH0mYXBwPWxpZ2h0bmluZ1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RleHQoJ3NpZ25JblBhZ2UuYWNjb3VudE1vdmVkTGluaycpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5gO1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRleHQoJ3NpZ25JblBhZ2UuYWNjb3VudE1vdmVkJywge1xuICAgICAgICAgICAgYWNjb3VudExpbms6IG1lc3NhZ2VMaW5rLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGFjY2Vzc01lc3NhZ2UgPSB0ZXh0KCdzaWduSW5QYWdlLmFjY291bnRNb3ZlZEFjY2VzcycpO1xuXG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9ICQoYFxuICAgICAgICAgICAgPHA+JHttZXNzYWdlfTwvcD5cbiAgICAgICAgICAgIDxwPiR7YWNjZXNzTWVzc2FnZX08L3A+XG4gICAgICAgIGApO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kKHRlbXBsYXRlKTtcbiAgICB9XG5cbiAgICBfcmVuZGVyTW9iaWxlTnVtYmVyRm9ybSgpIHtcbiAgICAgICAgdGhpcy5pbnB1dENvbnRhaW5lci5lbXB0eSgpO1xuICAgICAgICB0aGlzLmVsLmZpbmQoJy5lcnJvck1lc3NhZ2UnKS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5lbC5lbXB0eSgpLmFwcGVuZCh0aGlzLl9tYWluRm9ybUh0bWwoJ21vYmlsZU51bWJlcicpKTtcbiAgICAgICAgdGhpcy5zaWduSW5IZWFkZXIgPSB0aGlzLmVsLmZpbmQoJy5zaWduSW5IZWFkZXInKTtcbiAgICAgICAgdGhpcy5pbnB1dENvbnRhaW5lciA9IHRoaXMuZWwuZmluZCgnLmlucHV0Q29udGFpbmVyJyk7XG4gICAgICAgIHRoaXMuYm90dG9tU2lnbkluT3B0aW9uc0RpdiA9IHRoaXMuZWwuZmluZChcbiAgICAgICAgICAgICcuYm90dG9tU2lnbkluT3B0aW9uc0NvbnRhaW5lcidcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBjYXB0Y2hhRWxlbWVudElkID0gJ2lkYy1tb2JpbGUtbnVtYmVyLWZvcm0tY2FwdGNoYSc7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9ICQoYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIk1vYmlsZVNpZ25JblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGVOdW1iZXJDb250YWluZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmVyaWZpY2F0aW9uQ29kZVRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+JHt0ZXh0KCdzaWduSW5QYWdlLm1vYmlsZS50ZXh0VmVyaWZpY2F0aW9uQ29kZScpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHA+JHt0ZXh0KCdzaWduSW5QYWdlLm1vYmlsZS5yYXRlc01heUFwcGx5Jyl9PC9wPlxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInZlcmlmaWNhdGlvbkNvZGVUZXh0LXByaXZhY3lQb2xpY3lcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCIgaHJlZj1cIiR7dGhpcy5fZ2V0UHJpdmFjeVBvbGljeUxpbmsoKX1cIj4ke3RleHQoXG4gICAgICAgICAgICAnc2lnbkluUGFnZS5pZGMucHJpdmFjeVBvbGljeSdcbiAgICAgICAgKX08L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnNDb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgJHt0aGlzLl9yZW5kZXJJZGNDYXB0Y2hhKGNhcHRjaGFFbGVtZW50SWQpfVxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lnbmluLWJ1dHRvbiBidXR0b24gc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke3RleHQoJ3NpZ25JblBhZ2UubW9iaWxlLnNlbmRDb2RlJyl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgKTtcblxuICAgICAgICBsZXQgbnVtYmVySW5wdXQgPSBuZXcgUGhvbmVOdW1iZXJJbnB1dCh7XG4gICAgICAgICAgICBlbDogdGVtcGxhdGUuZmluZCgnLm1vYmlsZU51bWJlckNvbnRhaW5lcicpLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiAnc2lnbkluSW5wdXQnLFxuICAgICAgICAgICAgaWQ6ICdtb2JpbGVOdW1iZXInLFxuICAgICAgICAgICAgbGFiZWw6IHRleHQoJ3NpZ25JblBhZ2UubW9iaWxlLm1vYmlsZU51bWJlcicpLFxuICAgICAgICAgICAgdHlwZTogJ3RlbCcsXG4gICAgICAgICAgICBhbGxvd0FsbENvdW50cmllczogIXRoaXMuaWRjT3B0aW9ucy5wcmltYXJ5LnBob25lQ291bnRyeUNvZGVzLFxuICAgICAgICAgICAgYWxsb3dlZENvdW50cmllczogdGhpcy5pZGNPcHRpb25zLnByaW1hcnkucGhvbmVDb3VudHJ5Q29kZXMsXG4gICAgICAgIH0pLnJlbmRlcigpO1xuXG4gICAgICAgIHRoaXMuaW5wdXRDb250YWluZXIuYXBwZW5kKHRlbXBsYXRlKTtcbiAgICAgICAgdGhpcy5fYWRkU2Vjb25kYXJ5U2lnbkluKCdsaWJyYXJ5Q2FyZCcpO1xuXG4gICAgICAgIHRoaXMuaWRjT25seVxuICAgICAgICAgICAgPyB0aGlzLl91cGRhdGVHZXRPbmVJbnN0YW50bHlCdXR0b24odHJ1ZSlcbiAgICAgICAgICAgIDogdGhpcy5fdXBkYXRlR2V0T25lSW5zdGFudGx5QnV0dG9uKGZhbHNlKTtcblxuICAgICAgICB0aGlzLmVsLmZvY3VzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaWRjQ2FwdGNoYSkge1xuICAgICAgICAgICAgd2luZG93Ll9fcmVjYXB0Y2hhRGF0YUNhbGxiYWNrID0gKGNhcHRjaGFDb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VuZENvZGUobnVtYmVySW5wdXQsIGNhcHRjaGFDb2RlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJSZWNhcHRjaGEoY2FwdGNoYUVsZW1lbnRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0ZW1wbGF0ZS5maW5kKCcuc2lnbmluLWJ1dHRvbicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlQW5kU2VuZENvZGUobnVtYmVySW5wdXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0ZW1wbGF0ZVxuICAgICAgICAgICAgLmZpbmQoJy5zaWduSW5JbnB1dCBpbnB1dCcpXG4gICAgICAgICAgICAub24oJ2tleXByZXNzJywgdGhpcy5fZ2V0TW9iaWxlTnVtYmVyS2V5cHJlc3NIYW5kbGVyKG51bWJlcklucHV0KSk7XG4gICAgfVxuXG4gICAgX2FkZFNlY29uZGFyeVNpZ25Jbih0eXBlKSB7XG4gICAgICAgIHRoaXMuYm90dG9tU2lnbkluT3B0aW9uc0Rpdi5lbXB0eSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmlkY09ubHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYWluVGVtcGxhdGUgPSAkKGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaWduSW5XaXRoXCI+JHt0ZXh0KCdzaWduSW5QYWdlLm9yJyl9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiT3B0aW9uc0NvbnRhaW5lciBidXR0b25zQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm9wdGlvbkJ1dHRvbiBidXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09PSAnbW9iaWxlTnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwib3B0aW9uSW1hZ2VcIiBhbHQ9Jycgc3JjPScke3RvU3RhdGljVXJsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbWcvcGhvbmUtaWNvbi5zdmcnXG4gICAgICAgICAgICAgICAgICAgICAgICApfScvPlxuICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiR7dGV4dCgnc2lnbkluUGFnZS5tb2JpbGUudXNpbmdNb2JpbGVOdW1iZXInKX08L3A+XG4gICAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYFxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cIm9wdGlvbkltYWdlXCIgYWx0PScnIHNyYz0nJHt0b1N0YXRpY1VybChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1nL2xpYnJhcnktY2FyZC1pY29uLnN2ZydcbiAgICAgICAgICAgICAgICAgICAgICAgICl9ICcvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+JHt0ZXh0KCdzaWduSW5QYWdlLmxpYnJhcnlDYXJkLmNhcmQnKX08L3A+XG4gICAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCk7XG5cbiAgICAgICAgdGhpcy5ib3R0b21TaWduSW5PcHRpb25zRGl2LmFwcGVuZChtYWluVGVtcGxhdGUpO1xuXG4gICAgICAgIHRoaXMuYm90dG9tU2lnbkluT3B0aW9uc0Rpdi5maW5kKCcub3B0aW9uQnV0dG9uJykuY2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdtb2JpbGVOdW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyTW9iaWxlTnVtYmVyRm9ybSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJMaWJyYXJ5Q2FyZEZvcm0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUdldE9uZUluc3RhbnRseUJ1dHRvbihpc0RlZmF1bHQpIHtcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9ICQoJy5nZXRBQ2FyZFByb21vSGVhZGVyJyk7XG4gICAgICAgIGxldCBsYWJlbCA9IGNvbnRhaW5lci5maW5kKCdwJyk7XG4gICAgICAgIGxldCBidXR0b24gPSAkKCcuZ2V0T25lSW5zdGFudGx5Jyk7XG5cbiAgICAgICAgaWYgKHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2lkY0R1cGxpY2F0ZUhhbmRsZXJGaXgnKSkge1xuICAgICAgICAgICAgYnV0dG9uLnVuYmluZCgnY2xpY2snKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0RlZmF1bHQpIHtcbiAgICAgICAgICAgIGxhYmVsLmh0bWwodGV4dCgnc2lnbkluUGFnZS5tZW1iZXJZZXQnKSk7XG4gICAgICAgICAgICAkKCcuYnV0dG9uLmdldE9uZUluc3RhbnRseScpLmh0bWwoXG4gICAgICAgICAgICAgICAgYDxzcGFuPiR7dGV4dCgnc2lnbkluUGFnZS5nZXRBQ2FyZEJ1dHRvbicpfTwvc3Bhbj5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcklkY1NpZ251cCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYWJlbC5odG1sKHRleHQoJ3NpZ25JblBhZ2UuYWxyZWFkeU1lbWJlcicpKTtcbiAgICAgICAgICAgICQoJy5idXR0b24uZ2V0T25lSW5zdGFudGx5JykuaHRtbChgPHNwYW4+JHt0ZXh0KCdzaWduSW4nKX08L3NwYW4+YCk7XG5cbiAgICAgICAgICAgIGJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9yZW5kZXJWZXJpZmljYXRpb25Db2RlSW5wdXQoXG4gICAgICAgIGRpc3BsYXlQaG9uZU51bWJlcixcbiAgICAgICAgZTE2NFBob25lTnVtYmVyLFxuICAgICAgICBpZGNSZXNwb25zZVxuICAgICkge1xuICAgICAgICB0aGlzLmVsLmVtcHR5KCk7XG5cbiAgICAgICAgY29uc3QgY2FwdGNoYUVsZW1lbnRJZCA9ICdpZGMtbW9iaWxlLW51bWJlci1mb3JtLWNhcHRjaGEnO1xuICAgICAgICBsZXQgdGVtcGxhdGUgPSAkKGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJWZXJpZmljYXRpb25Db2RlQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidmVyaWZ5SGVhZGVyVGV4dCBwcmltYXJ5LWNvbG9yXCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAnc2lnbkluUGFnZS52ZXJpZnlZb3VyTnVtYmVyJ1xuICAgICAgICAgICAgICAgICl9PC9oMT5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInZlcmlmeVN1YkhlYWRpbmdcIj4ke3RleHQoJ3NpZ25JblBhZ2UuZW50ZXJUaGVDb2RlJywge1xuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogZGlzcGxheVBob25lTnVtYmVyLFxuICAgICAgICAgICAgICAgIH0pfTwvcD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmVyaWZpY2F0aW9uSW5wdXRDb250YWluZXIgaW5wdXRDb250YWluZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm5vQ29kZVwiPiR7dGV4dCgnc2lnbkluUGFnZS5ub0NvZGVIdG1sJywge1xuICAgICAgICAgICAgICAgICAgICByZXNlbmQ6IGA8YSB0YWJpbmRleD1cIjBcIiByb2xlPVwiYnV0dG9uXCIgY2xhc3M9XCJyZXNlbmROb3cgc2Vjb25kYXJ5LWNvbG9yXCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UucmVzZW5kTm93J1xuICAgICAgICAgICAgICAgICAgICApfTwvYT5gLFxuICAgICAgICAgICAgICAgIH0pfTwvcD5cbiAgICAgICAgICAgICAgICA8cD4ke3RleHQoJ3NpZ25JblBhZ2UubW9iaWxlLnJhdGVzTWF5QXBwbHknKX08L3A+XG4gICAgICAgICAgICAgICAgJHt0aGlzLl9yZW5kZXJJZGNDYXB0Y2hhKGNhcHRjaGFFbGVtZW50SWQpfVxuICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lnbmluLWJ1dHRvbiBidXR0b24gc2Vjb25kYXJ5XCIgc3R5bGU9XCJ3aWR0aDogOTYlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7dGV4dCgnc2lnbkluUGFnZS52ZXJpZnknKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCk7XG5cbiAgICAgICAgbGV0IGNvZGVJbnB1dCA9IG5ldyBWZXJpZmljYXRpb25Db2RlSW5wdXQoe1xuICAgICAgICAgICAgZWw6IHRlbXBsYXRlLmZpbmQoJy52ZXJpZmljYXRpb25JbnB1dENvbnRhaW5lcicpLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiAndmVyaWZpY2F0aW9uQ29kZScsXG4gICAgICAgICAgICBpZDogJ3ZlcmlmaWNhdGlvbkNvZGUnLFxuICAgICAgICAgICAgbGFiZWw6IHRleHQoJ3NpZ25JblBhZ2UuZW50ZXJUaGVDb2RlJywge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBkaXNwbGF5UGhvbmVOdW1iZXIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSkucmVuZGVyKCk7XG5cbiAgICAgICAgdGhpcy5lbC5hcHBlbmQodGVtcGxhdGUpO1xuICAgICAgICBjb2RlSW5wdXQuZm9jdXMoKTtcblxuICAgICAgICBpZiAodGhpcy5pZGNDYXB0Y2hhKSB7XG4gICAgICAgICAgICB3aW5kb3cuX19yZWNhcHRjaGFEYXRhQ2FsbGJhY2sgPSAoY2FwdGNoYUNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNlbmRDb2RlKGUxNjRQaG9uZU51bWJlciwgY2FwdGNoYUNvZGUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclJlY2FwdGNoYShjYXB0Y2hhRWxlbWVudElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRlbXBsYXRlLmZpbmQoJy5yZXNlbmROb3cnKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUFuZFJlc2VuZENvZGUoZTE2NFBob25lTnVtYmVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGVtcGxhdGUuZmluZCgnLnNpZ25pbi1idXR0b24nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl92ZXJpZnlDb2RlKGNvZGVJbnB1dCwgaWRjUmVzcG9uc2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0ZW1wbGF0ZS5maW5kKCcudmVyaWZpY2F0aW9uQ29kZSBpbnB1dCcpLm9uKCdrZXlwcmVzcycsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmVyaWZ5Q29kZShjb2RlSW5wdXQsIGlkY1Jlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3JlbmRlckVtYWlsVmVyaWZpY2F0aW9uQ29kZUlucHV0KGVtYWlsLCBpZGNSZXNwb25zZSwgaWxzTmFtZSkge1xuICAgICAgICB0aGlzLmVsLmVtcHR5KCk7XG5cbiAgICAgICAgbGV0IHRlbXBsYXRlID0gJChgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiVmVyaWZpY2F0aW9uQ29kZUNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxoMSBjbGFzcz1cInZlcmlmeUhlYWRlclRleHQgcHJpbWFyeS1jb2xvclwiPiR7dGV4dChcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UudmVyaWZ5WW91ckVtYWlsJ1xuICAgICAgICAgICAgICAgICl9PC9oMT5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInZlcmlmeVN1YkhlYWRpbmdcIj4ke3RleHQoJ3NpZ25JblBhZ2UuZW50ZXJUaGVDb2RlJywge1xuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogZW1haWwsXG4gICAgICAgICAgICAgICAgfSl9PC9wPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJpZmljYXRpb25JbnB1dENvbnRhaW5lciBpbnB1dENvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibm9Db2RlXCI+JHt0ZXh0KCdzaWduSW5QYWdlLm5vQ29kZUh0bWwnLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlc2VuZDogYDxhIHRhYmluZGV4PVwiMFwiIHJvbGU9XCJidXR0b25cIiBjbGFzcz1cInJlc2VuZE5vdyBzZWNvbmRhcnktY29sb3JcIj4ke3RleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2lnbkluUGFnZS5yZXNlbmROb3cnXG4gICAgICAgICAgICAgICAgICAgICl9PC9hPmAsXG4gICAgICAgICAgICAgICAgfSl9PC9wPlxuICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lnbmluLWJ1dHRvbiBidXR0b24gc2Vjb25kYXJ5XCIgc3R5bGU9XCJ3aWR0aDogOTYlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7dGV4dCgnc2lnbkluUGFnZS52ZXJpZnknKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCk7XG5cbiAgICAgICAgbGV0IGNvZGVJbnB1dCA9IG5ldyBWZXJpZmljYXRpb25Db2RlSW5wdXQoe1xuICAgICAgICAgICAgZWw6IHRlbXBsYXRlLmZpbmQoJy52ZXJpZmljYXRpb25JbnB1dENvbnRhaW5lcicpLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiAndmVyaWZpY2F0aW9uQ29kZScsXG4gICAgICAgICAgICBpZDogJ3ZlcmlmaWNhdGlvbkNvZGUnLFxuICAgICAgICAgICAgbGFiZWw6IHRleHQoJ3NpZ25JblBhZ2UuZW50ZXJUaGVDb2RlJywgeyBsb2NhdGlvbjogZW1haWwgfSksXG4gICAgICAgIH0pLnJlbmRlcigpO1xuXG4gICAgICAgIHRoaXMuZWwuYXBwZW5kKHRlbXBsYXRlKTtcbiAgICAgICAgY29kZUlucHV0LmZvY3VzKCk7XG5cbiAgICAgICAgdGVtcGxhdGUuZmluZCgnLnJlc2VuZE5vdycpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2VuZEVtYWlsQ29kZShlbWFpbCwgaWxzTmFtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRlbXBsYXRlLmZpbmQoJy5zaWduaW4tYnV0dG9uJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1haWxWZXJpZnlDb2RlKGNvZGVJbnB1dCwgaWRjUmVzcG9uc2UsIGlsc05hbWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0ZW1wbGF0ZS5maW5kKCcudmVyaWZpY2F0aW9uQ29kZSBpbnB1dCcpLm9uKCdrZXlwcmVzcycsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1haWxWZXJpZnlDb2RlKGNvZGVJbnB1dCwgaWRjUmVzcG9uc2UsIGlsc05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfZ2V0TW9iaWxlTnVtYmVyS2V5cHJlc3NIYW5kbGVyKG1vYmlsZU51bWJlcklucHV0KSB7XG4gICAgICAgIGlmICghbW9iaWxlTnVtYmVySW5wdXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigneW91IG11c3QgcGFzcyBcIm1vYmlsZU51bWJlcklucHV0XCInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLndoaWNoID09PSAxMykge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUFuZFNlbmRDb2RlKG1vYmlsZU51bWJlcklucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfcmVuZGVyR2VvU2lnbnVwKCkge1xuICAgICAgICB0aGlzLmVsLmVtcHR5KCk7XG5cbiAgICAgICAgd2luZG93Lmdsb2JhbEV2ZW50cy50cmlnZ2VyKCdnZW86cmVnaXN0ZXI6dmlldycpO1xuXG4gICAgICAgIGNvbnN0IGNhcHRjaGFFbGVtZW50SWQgPSAnaWRjLXNpZ251cC1jYXB0Y2hhJztcblxuICAgICAgICBsZXQgdGVybXMgPSBgPGEgaHJlZj1cImh0dHBzOi8vY29tcGFueS5jZG4ub3ZlcmRyaXZlLmNvbS9wb2xpY2llcy90ZXJtcy1hbmQtY29uZGl0aW9ucy5odG0/X2dhPTIuMjY1MzU4MzUxLjE0NjkwNzMyOTUuMTcxNTg1OTQyOC0xOTg3Mjg3NTMwLjE3MTU4NTk0MjhcIiBjbGFzcz1cInNlY29uZGFyeS1jb2xvclwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIj4ke3RleHQoXG4gICAgICAgICAgICAnc2lnbkluUGFnZS5nZW8udGVybXNBbmRDb25kaXRpb25zJ1xuICAgICAgICApfTwvYT5gO1xuICAgICAgICBsZXQgcG9saWN5ID0gYDxhIGhyZWY9XCJodHRwczovL2NvbXBhbnkuY2RuLm92ZXJkcml2ZS5jb20vcG9saWNpZXMvcHJpdmFjeS1wb2xpY3kuaHRtP19nYT0yLjYwODg2MTg4LjE0NjkwNzMyOTUuMTcxNTg1OTQyOC0xOTg3Mjg3NTMwLjE3MTU4NTk0MjhcIiBjbGFzcz1cInNlY29uZGFyeS1jb2xvclwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIj4ke3RleHQoXG4gICAgICAgICAgICAnc2lnbkluUGFnZS5nZW8ucHJpdmFjeVBvbGljeSdcbiAgICAgICAgKX08L2E+YDtcblxuICAgICAgICBsZXQgdGVtcGxhdGUgPSAkKGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJJZGNBZGRpdG9uYWxJbmZvQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwiSWRjQWRkaXRpb25hbEhlYWRlclRleHQgcHJpbWFyeS1jb2xvclwiPiR7dGV4dChcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UuZ2VvLmluc3RhbnREaWdpdGFsQWNjZXNzJ1xuICAgICAgICAgICAgICAgICl9PC9oMT5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImdlb0J5U2VsZWN0aW5nQWNjZXB0XCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAnc2lnbkluUGFnZS5nZW8uYnlTZWxlY3RpbmdBY2NlcHRBbmRDb250aW51ZSdcbiAgICAgICAgICAgICAgICApfTwvcD5cbiAgICAgICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgICAgICAgIDxsaT4ke3RleHQoJ3NpZ25JblBhZ2UuaWRjLjEzT3JPbGRlcicpfTwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaT4ke3RleHQoJ3NpZ25JblBhZ2UuZ2VvLndlSGF2ZVBlcm1pc3Npb24nKX08L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJJZGNBZGRpdGlvbmFsU3ViSGVhZGluZ1wiPiR7dGV4dChcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UuZ2VvLmRvTm90U2VsbCcsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5LFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKX08L3A+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnNDb250YWluZXIgaW5wdXRDb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgJHt0aGlzLl9yZW5kZXJJZGNDYXB0Y2hhKGNhcHRjaGFFbGVtZW50SWQpfVxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lnbmluLWJ1dHRvbiBidXR0b24gc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke3RleHQoJ3NpZ25JblBhZ2UuZ2VvLmFjY2VwdEFuZENvbnRpbnVlJyl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2VSZXNwZWN0UHJpdmFjeUNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHJpdmFjeUljb25cIiBhbHQ9Jycgc3JjPScke3RvU3RhdGljVXJsKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ltZy9wcml2YWN5LWljb24uc3ZnJ1xuICAgICAgICAgICAgICAgICAgICApfScvPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIndlUmVzcGVjdFByaXZhY3lcIj4ke3RleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2lnbkluUGFnZS5pZGMud2VSZXNwZWN0UHJpdmFjeSdcbiAgICAgICAgICAgICAgICAgICAgKX08L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCk7XG5cbiAgICAgICAgdGhpcy5lbC5hcHBlbmQodGVtcGxhdGUpO1xuXG4gICAgICAgIHRoaXMuZWwuZm9jdXMoKTtcblxuICAgICAgICBpZiAodGhpcy5pZGNDYXB0Y2hhKSB7XG4gICAgICAgICAgICB3aW5kb3cuX19yZWNhcHRjaGFEYXRhQ2FsbGJhY2sgPSAoY2FwdGNoYUNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl92ZXJpZnlHZW9sb2NhdGlvbihjYXB0Y2hhQ29kZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyUmVjYXB0Y2hhKGNhcHRjaGFFbGVtZW50SWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGVtcGxhdGUuZmluZCgnLnNpZ25pbi1idXR0b24nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUFuZFZlcmlmeUdlb2xvY2F0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF92ZXJpZnlHZW9sb2NhdGlvbihjYXB0Y2hhQ29kZSA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmVsXG4gICAgICAgICAgICAuZmluZCgnLnNpZ25pbi1idXR0b24nKVxuICAgICAgICAgICAgLmVtcHR5KClcbiAgICAgICAgICAgIC5hZGRDbGFzcygnd2FpdGluZycpXG4gICAgICAgICAgICAuYXBwZW5kKCc8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PicpO1xuICAgICAgICB0aGlzLl9oaWRlRXJyb3JNZXNzYWdlKCk7XG5cbiAgICAgICAgd2luZG93Lmdsb2JhbEV2ZW50cy50cmlnZ2VyKCdnZW86cmVnaXN0ZXI6YWNjZXB0OnN0YXJ0Jyk7XG5cbiAgICAgICAgJC5wb3N0KHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5yZXN0LmlkYy5nZW8uYXV0aG9yaXplKSwge1xuICAgICAgICAgICAgaWxzTmFtZTogdGhpcy5vem9uZURhdGEuZ2VvbG9jYXRpb24ub3B0aW9uc1swXS5pbHNOYW1lLFxuICAgICAgICAgICAgY2FwdGNoYUNvZGUsXG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZG9uZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuZ2xvYmFsRXZlbnRzLnRyaWdnZXIoJ2dlbzpyZWdpc3RlcjphY2NlcHQ6c3VjY2VzcycpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25JbjpnZW8nLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuT3ZlckRyaXZlLmxpYnJhcnlOYW1lXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pZGNTaWduSW4ocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5mYWlsKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Vycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQoJ3NpZ25JblBhZ2UuZ2VvLmVycm9yU2VydmljZUFyZWEnKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLnNpZ25pbi1idXR0b24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmVtcHR5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnd2FpdGluZycpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHRleHQoJ3NpZ25JblBhZ2UuZ2VvLmFjY2VwdEFuZENvbnRpbnVlJykpO1xuXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcignZ2VvOnJlZ2lzdGVyOmFjY2VwdDpmYWlsJyk7XG4gICAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZUFuZFZlcmlmeUdlb2xvY2F0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5pZGNDYXB0Y2hhKSB7XG4gICAgICAgICAgICB3aW5kb3cuZ3JlY2FwdGNoYS5yZXNldCgpO1xuICAgICAgICAgICAgd2luZG93LmdyZWNhcHRjaGEuZXhlY3V0ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdmVyaWZ5R2VvbG9jYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9yZW5kZXJJZGNTaWdudXAoKSB7XG4gICAgICAgIHRoaXMuZWwuZW1wdHkoKTtcblxuICAgICAgICBjb25zdCBzaWduSW5MaW5rID0gd2luZG93LnJvdXRlcy5hY2NvdW50U2lnbkluO1xuICAgICAgICBjb25zdCBjYXB0Y2hhRWxlbWVudElkID0gJ2lkYy1zaWdudXAtY2FwdGNoYSc7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9ICQoYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIklkY1NpZ251cENvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxoMSBjbGFzcz1cIklkY0hlYWRlclRleHQgcHJpbWFyeS1jb2xvclwiPiR7dGV4dChcbiAgICAgICAgICAgICAgICAgICAgJ2dldENhcmQubm9MaWJyYXJ5Q2FyZCdcbiAgICAgICAgICAgICAgICApfTwvaDE+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJJZGNTdWJIZWFkaW5nXCI+JHt0ZXh0KCdnZXRDYXJkLnRha2VzQUZld1NlYycpfTwvcD5cbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIndoeURvWW91TmVlZCBzZWNvbmRhcnktY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly93d3cub3ZlcmRyaXZlLmNvbS9wb2xpY2llcy9wcml2YWN5LXBvbGljeSN3aGF0LWlzLW92ZXJkcml2ZS1zLWluc3RhbnQtZGlnaXRhbC1jYXJkLXNlcnZpY2VcIlxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICA+JHt0ZXh0KCdnZXRDYXJkLndoeURvWW91TmVlZCcpfTwvYT5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImFscmVhZHlIYXZlQ2FyZEh0bWxcIj5cbiAgICAgICAgICAgICAgICAke3RleHQoJ3NpZ25JblBhZ2UuaWRjLmFscmVhZHlIYXZlQ2FyZEh0bWwnLCB7IHNpZ25JbkxpbmsgfSl9XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJJZGNJbnB1dENvbnRhaW5lciBpbnB1dENvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlTnVtYmVyQ29udGFpbmVyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJpZmljYXRpb25Db2RlVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+JHt0ZXh0KCdzaWduSW5QYWdlLm1vYmlsZS50ZXh0VmVyaWZpY2F0aW9uQ29kZScpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPiR7dGV4dCgnc2lnbkluUGFnZS5tb2JpbGUucmF0ZXNNYXlBcHBseScpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwidmVyaWZpY2F0aW9uQ29kZVRleHQtcHJpdmFjeVBvbGljeVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIiBocmVmPVwiJHt0aGlzLl9nZXRQcml2YWN5UG9saWN5TGluaygpfVwiPiR7dGV4dChcbiAgICAgICAgICAgICdzaWduSW5QYWdlLmlkYy5wcml2YWN5UG9saWN5J1xuICAgICAgICApfTwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuX3JlbmRlcklkY0NhcHRjaGEoY2FwdGNoYUVsZW1lbnRJZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lnbmluLWJ1dHRvbiBidXR0b24gc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHt0ZXh0KCdzaWduSW5QYWdlLm1vYmlsZS5zZW5kQ29kZScpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgKTtcblxuICAgICAgICBsZXQgbnVtYmVySW5wdXQgPSBuZXcgUGhvbmVOdW1iZXJJbnB1dCh7XG4gICAgICAgICAgICBlbDogdGVtcGxhdGUuZmluZCgnLm1vYmlsZU51bWJlckNvbnRhaW5lcicpLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiAnc2lnbkluSW5wdXQnLFxuICAgICAgICAgICAgaWQ6ICdtb2JpbGVOdW1iZXInLFxuICAgICAgICAgICAgbGFiZWw6IHRleHQoJ3NpZ25JblBhZ2UubW9iaWxlLm1vYmlsZU51bWJlcicpLFxuICAgICAgICAgICAgdHlwZTogJ3RlbCcsXG4gICAgICAgICAgICBhbGxvd0FsbENvdW50cmllczogIXRoaXMuaWRjT3B0aW9ucy5wcmltYXJ5LnBob25lQ291bnRyeUNvZGVzLFxuICAgICAgICAgICAgYWxsb3dlZENvdW50cmllczogdGhpcy5pZGNPcHRpb25zLnByaW1hcnkucGhvbmVDb3VudHJ5Q29kZXMsXG4gICAgICAgIH0pLnJlbmRlcigpO1xuXG4gICAgICAgIHRoaXMuZWwuYXBwZW5kKHRlbXBsYXRlKTtcblxuICAgICAgICB0aGlzLl91cGRhdGVHZXRPbmVJbnN0YW50bHlCdXR0b24oZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuZWwuZm9jdXMoKTtcblxuICAgICAgICBpZiAodGhpcy5pZGNDYXB0Y2hhKSB7XG4gICAgICAgICAgICB3aW5kb3cuX19yZWNhcHRjaGFEYXRhQ2FsbGJhY2sgPSAoY2FwdGNoYUNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZW5kQ29kZShudW1iZXJJbnB1dCwgY2FwdGNoYUNvZGUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclJlY2FwdGNoYShjYXB0Y2hhRWxlbWVudElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRlbXBsYXRlLmZpbmQoJy5zaWduaW4tYnV0dG9uJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVBbmRTZW5kQ29kZShudW1iZXJJbnB1dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRlbXBsYXRlXG4gICAgICAgICAgICAuZmluZCgnLnNpZ25JbklucHV0IGlucHV0JylcbiAgICAgICAgICAgIC5vbigna2V5cHJlc3MnLCB0aGlzLl9nZXRNb2JpbGVOdW1iZXJLZXlwcmVzc0hhbmRsZXIobnVtYmVySW5wdXQpKTtcbiAgICB9XG5cbiAgICBfcmVuZGVySWRjQWRkaXRpb25hbEluZm8oaWRjUmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5lbC5lbXB0eSgpO1xuXG4gICAgICAgIGxldCBzaWduVXBPcHRpb25zID0gaWRjUmVzcG9uc2Uuc2lnblVwT3B0aW9uc1swXTtcbiAgICAgICAgbGV0IHJlcXVpcmVkRmllbGRzID0gc2lnblVwT3B0aW9ucy5yZXF1aXJlZEZpZWxkcy5maWx0ZXIoXG4gICAgICAgICAgICAoZmllbGQpID0+XG4gICAgICAgICAgICAgICAgZmllbGQgIT09ICdQaG9uZVRva2VuJyAmJlxuICAgICAgICAgICAgICAgIGZpZWxkICE9PSAnQXV0aFRva2VuJyAmJlxuICAgICAgICAgICAgICAgIGZpZWxkICE9PSAnSXBBZGRyZXNzJ1xuICAgICAgICApO1xuICAgICAgICBsZXQgb3B0aW9uYWxGaWVsZHMgPSBzaWduVXBPcHRpb25zLm9wdGlvbmFsRmllbGRzIHx8IFtdO1xuXG4gICAgICAgIGxldCBmaWVsZHMgPSAkKCc8ZGl2PjwvZGl2PicpO1xuXG4gICAgICAgIHJlcXVpcmVkRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZHMuYXBwZW5kKFxuICAgICAgICAgICAgICAgIGA8ZGl2IGNsYXNzPVwiJHtmaWVsZH1Db250YWluZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYWZhcmktYXV0b2NvbXBsZXRlLWFkanVzdG1lbnQnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2Zsb2F0aW5nTGFiZWxJbnB1dCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICB9XCI+PC9kaXY+YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgb3B0aW9uYWxGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIGZpZWxkcy5hcHBlbmQoXG4gICAgICAgICAgICAgICAgYDxkaXYgY2xhc3M9XCIke2ZpZWxkfUNvbnRhaW5lciAke1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NhZmFyaS1hdXRvY29tcGxldGUtYWRqdXN0bWVudCdcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnZmxvYXRpbmdMYWJlbElucHV0J1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgIH1cIj48L2Rpdj5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgdGVybXMgPSBgPGEgaHJlZj1cImh0dHBzOi8vY29tcGFueS5jZG4ub3ZlcmRyaXZlLmNvbS9wb2xpY2llcy90ZXJtcy1hbmQtY29uZGl0aW9ucy5odG1cIiBjbGFzcz1cInNlY29uZGFyeS1jb2xvclwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIj4ke3RleHQoXG4gICAgICAgICAgICAnc2lnbkluUGFnZS5pZGMudGVybXNBbmRDb25kaXRpb25zJ1xuICAgICAgICApfTwvYT5gO1xuICAgICAgICBsZXQgcG9saWN5ID0gYDxhIGhyZWY9XCJodHRwczovL2NvbXBhbnkuY2RuLm92ZXJkcml2ZS5jb20vcG9saWNpZXMvcHJpdmFjeS1wb2xpY3kuaHRtXCIgY2xhc3M9XCJzZWNvbmRhcnktY29sb3JcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCI+JHt0ZXh0KFxuICAgICAgICAgICAgJ3NpZ25JblBhZ2UuaWRjLnByaXZhY3lQb2xpY3knXG4gICAgICAgICl9PC9hPmA7XG5cbiAgICAgICAgY29uc3QgY2FwdGNoYUVsZW1lbnRJZCA9ICdpZGMtYWRkaXRpb25hbC1pbmZvLWNhcHRjaGEnO1xuICAgICAgICBsZXQgdGVtcGxhdGUgPSAkKGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJJZGNBZGRpdG9uYWxJbmZvQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwiSWRjQWRkaXRpb25hbEhlYWRlclRleHQgcHJpbWFyeS1jb2xvclwiPiR7dGV4dChcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UuaWRjLmNvbXBsZXRlVmVyaWZpY2F0aW9uJ1xuICAgICAgICAgICAgICAgICl9PC9oMT5cbiAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJJZGNBZGRpdGlvbmFsU3ViSGVhZGluZ1wiPiR7dGV4dChcbiAgICAgICAgICAgICAgICAgICAgICdzaWduSW5QYWdlLmlkYy5mZXdNb3JlVGhpbmdzJ1xuICAgICAgICAgICAgICAgICApfTwvcD5cbiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0Q29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICR7ZmllbGRzLmh0bWwoKX1cbiAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYnlTZWxlY3RpbmdDb250aW51ZVwiPiR7dGV4dChcbiAgICAgICAgICAgICAgICAgICAgICdzaWduSW5QYWdlLmlkYy5ieVNlbGVjdGluZ0NvbnRpbnVlJ1xuICAgICAgICAgICAgICAgICApfTwvcD5cbiAgICAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgICAgICA8bGk+JHt0ZXh0KCdzaWduSW5QYWdlLmlkYy4xM09yT2xkZXInKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGk+JHt0ZXh0KCdzaWduSW5QYWdlLmlkYy55b3VBZ3JlZUh0bWwnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeSxcbiAgICAgICAgICAgICAgICAgICAgfSl9PC9saT5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICR7dGhpcy5fcmVuZGVySWRjQ2FwdGNoYShjYXB0Y2hhRWxlbWVudElkKX1cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZ25pbi1idXR0b24gYnV0dG9uIHNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHt0ZXh0KCdzaWduSW5QYWdlLmlkYy5jb250aW51ZScpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndlUmVzcGVjdFByaXZhY3lDb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInByaXZhY3lJY29uXCIgYWx0PScnIHNyYz0nJHt0b1N0YXRpY1VybChcbiAgICAgICAgICAgICAgICAgICAgICAgICdpbWcvcHJpdmFjeS1pY29uLnN2ZydcbiAgICAgICAgICAgICAgICAgICAgKX0nLz5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ3ZVJlc3BlY3RQcml2YWN5XCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UuaWRjLndlUmVzcGVjdFByaXZhY3knXG4gICAgICAgICAgICAgICAgICAgICl9PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIGApO1xuXG4gICAgICAgIGxldCByZXF1aXJlZEZpZWxkSW5wdXRzID0gW107XG4gICAgICAgIHJlcXVpcmVkRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICByZXF1aXJlZEZpZWxkSW5wdXRzLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IEZsb2F0aW5nTGFiZWxJbnB1dCh7XG4gICAgICAgICAgICAgICAgICAgIGVsOiB0ZW1wbGF0ZS5maW5kKGAuJHtmaWVsZH1Db250YWluZXJgKSxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnc2lnbkluSW5wdXQgcmVxdWlyZWRGaWVsZCcsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRleHQoYHNpZ25JblBhZ2UuaWRjLiR7ZmllbGR9YCksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICB9KS5yZW5kZXIoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbmFsRmllbGRJbnB1dHMgPSBbXTtcbiAgICAgICAgb3B0aW9uYWxGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIG9wdGlvbmFsRmllbGRJbnB1dHMucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgRmxvYXRpbmdMYWJlbElucHV0KHtcbiAgICAgICAgICAgICAgICAgICAgZWw6IHRlbXBsYXRlLmZpbmQoYC4ke2ZpZWxkfUNvbnRhaW5lcmApLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdzaWduSW5JbnB1dCcsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRleHQoJ3NpZ25JblBhZ2Uub3B0aW9uYWxGaWVsZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogdGV4dChgc2lnbkluUGFnZS5pZGMuJHtmaWVsZH1gKSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICB9KS5yZW5kZXIoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbC5hcHBlbmQodGVtcGxhdGUpO1xuICAgICAgICB0aGlzLmVsLmZvY3VzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaWRjQ2FwdGNoYSkge1xuICAgICAgICAgICAgd2luZG93Ll9fcmVjYXB0Y2hhRGF0YUNhbGxiYWNrID0gKGNhcHRjaGFDb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2lnblVwKFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZEZpZWxkSW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbEZpZWxkSW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICBpZGNSZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgY2FwdGNoYUNvZGVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclJlY2FwdGNoYShjYXB0Y2hhRWxlbWVudElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRlbXBsYXRlLmZpbmQoJy5zaWduaW4tYnV0dG9uJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVBbmRTaWduVXAoXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRGaWVsZElucHV0cyxcbiAgICAgICAgICAgICAgICBvcHRpb25hbEZpZWxkSW5wdXRzLFxuICAgICAgICAgICAgICAgIGlkY1Jlc3BvbnNlXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICB0ZW1wbGF0ZS5maW5kKCcuc2lnbkluSW5wdXQgaW5wdXQnKS5vbigna2V5cHJlc3MnLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IDEzKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlQW5kU2lnblVwKFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZEZpZWxkSW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbEZpZWxkSW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICBpZGNSZXNwb25zZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZW5kZXJJZGNEZW5pZWQoKSB7XG4gICAgICAgIHRoaXMuZWwuZW1wdHkoKTtcblxuICAgICAgICBsZXQgdGVtcGxhdGUgPSAkKGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJJZGNBZGRpdG9uYWxJbmZvQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwiSWRjQWRkaXRpb25hbEhlYWRlclRleHQgcHJpbWFyeS1jb2xvclwiPiR7dGV4dChcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UuaWRjLnVuYWJsZVRvQ29uZmlybSdcbiAgICAgICAgICAgICAgICApfTwvaDE+XG4gICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwid2VDb3VsZG50R3JhbnRcIj4ke3RleHQoXG4gICAgICAgICAgICAgICAgICAgICAnc2lnbkluUGFnZS5pZGMud2VDb3VsZG50R3JhbnQnXG4gICAgICAgICAgICAgICAgICl9PC9wPlxuICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInlvdU1heUJlRWxpZ2libGVcIj4ke3RleHQoXG4gICAgICAgICAgICAgICAgICAgICAnc2lnbkluUGFnZS5pZGMueW91TWF5QmVFbGlnaWJsZSdcbiAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICEhd2luZG93Lk92ZXJEcml2ZS5jYXJkU2lnblVwTGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYFxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lk92ZXJEcml2ZS5jYXJkU2lnblVwTGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgfVwiIGNsYXNzPVwic2Vjb25kYXJ5LWNvbG9yXCIgIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIj4ke3RleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpZ25JblBhZ2UuaWRjLmxlYXJuTW9yZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9PC9hPlxuICAgICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWduaW4tYnV0dG9uIGJ1dHRvbiBzZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7dGV4dCgnc2lnbkluUGFnZS5pZGMuZ29CYWNrJyl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgKTtcblxuICAgICAgICB0aGlzLmVsLmFwcGVuZCh0ZW1wbGF0ZSk7XG4gICAgICAgIHRoaXMuZWwuZm9jdXMoKTtcblxuICAgICAgICB0ZW1wbGF0ZS5maW5kKCcuc2lnbmluLWJ1dHRvbicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfcmVuZGVyRW1haWxSZWdpc3RyYXRpb24oc2VsZWN0ZWRGb3JtLCBjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5lbC5maW5kKCcuZXJyb3JNZXNzYWdlJykucmVtb3ZlKCk7XG5cbiAgICAgICAgbGV0IHRlbXBsYXRlID0gJChgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRW1haWxTaWduSW5cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1haWxDb250YWluZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYWZhcmktYXV0b2NvbXBsZXRlLWFkanVzdG1lbnQnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2Zsb2F0aW5nTGFiZWxJbnB1dCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICB9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcmlmaWNhdGlvbkNvZGVUZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxwPiR7dGV4dCgnc2lnbkluUGFnZS5lbWFpbFZlcmlmaWNhdGlvbkNvZGUnKX08L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnNDb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZ25pbi1idXR0b24gYnV0dG9uIHNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHt0ZXh0KCdzaWduSW5QYWdlLm1vYmlsZS5zZW5kQ29kZScpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCk7XG5cbiAgICAgICAgbGV0IGVtYWlsSW5wdXQgPSBuZXcgRmxvYXRpbmdMYWJlbElucHV0KHtcbiAgICAgICAgICAgIGVsOiB0ZW1wbGF0ZS5maW5kKCcuZW1haWxDb250YWluZXInKSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3NpZ25JbklucHV0JyxcbiAgICAgICAgICAgIGlkOiAnZW1haWwnLFxuICAgICAgICAgICAgbGFiZWw6IHRleHQoJ3NpZ25JblBhZ2UuaWRjLkVtYWlsJyksXG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIH0pLnJlbmRlcigpO1xuXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmQodGVtcGxhdGUpO1xuICAgICAgICBpZiAodGhpcy5vem9uZURhdGEuZm9ybXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5fYWRkU2Vjb25kYXJ5U2lnbkluKCdsaWJyYXJ5Q2FyZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbC5mb2N1cygpO1xuXG4gICAgICAgIHRlbXBsYXRlLmZpbmQoJy5zaWduaW4tYnV0dG9uJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tWYWxpZEVtYWlsKGVtYWlsSW5wdXQsIHNlbGVjdGVkRm9ybS5pbHNOYW1lKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGVtcGxhdGUuZmluZCgnLnNpZ25JbklucHV0IGlucHV0Jykub24oJ2tleXByZXNzJywgKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLndoaWNoID09PSAxMykge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1ZhbGlkRW1haWwoZW1haWxJbnB1dCwgc2VsZWN0ZWRGb3JtLmlsc05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVBbmRTaWduVXAocmVxdWlyZWRGaWVsZElucHV0cywgb3B0aW9uYWxGaWVsZElucHV0cywgaWRjUmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgcmVxdWlyZWRGaWVsZElucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpbnB1dC52YWxpZGF0ZU5vbkVtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsXG4gICAgICAgICAgICAuZmluZCgnLnNpZ25pbi1idXR0b24nKVxuICAgICAgICAgICAgLmVtcHR5KClcbiAgICAgICAgICAgIC5hZGRDbGFzcygnd2FpdGluZycpXG4gICAgICAgICAgICAuYXBwZW5kKCc8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PicpO1xuXG4gICAgICAgIGlmICh0aGlzLmlkY0NhcHRjaGEpIHtcbiAgICAgICAgICAgIHdpbmRvdy5ncmVjYXB0Y2hhLmV4ZWN1dGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NpZ25VcChyZXF1aXJlZEZpZWxkSW5wdXRzLCBvcHRpb25hbEZpZWxkSW5wdXRzLCBpZGNSZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc2lnblVwKFxuICAgICAgICByZXF1aXJlZEZpZWxkSW5wdXRzLFxuICAgICAgICBvcHRpb25hbEZpZWxkSW5wdXRzLFxuICAgICAgICBpZGNSZXNwb25zZSxcbiAgICAgICAgY2FwdGNoYUNvZGUgPSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgICAgbGV0IHVzZXJEYXRhID0ge307XG4gICAgICAgIHJlcXVpcmVkRmllbGRJbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgICAgICAgIHVzZXJEYXRhW2lucHV0LiRpbnB1dC5hdHRyKCdpZCcpXSA9IGlucHV0LiRpbnB1dC52YWwoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgb3B0aW9uYWxGaWVsZElucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgICAgICAgICAgdXNlckRhdGFbaW5wdXQuJGlucHV0LmF0dHIoJ2lkJyldID0gaW5wdXQuJGlucHV0LnZhbCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB1c2VyRGF0YS5QaG9uZVRva2VuID0gaWRjUmVzcG9uc2UudG9rZW47XG5cbiAgICAgICAgJC5wb3N0KHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5yZXN0LmlkYy5waG9uZS5zaWduVXApLCB7XG4gICAgICAgICAgICB1c2VyRGF0YTogSlNPTi5zdHJpbmdpZnkodXNlckRhdGEpLFxuICAgICAgICAgICAgaWxzTmFtZTogdGhpcy5vem9uZURhdGEuZ2V0QUNhcmQucHJpbWFyeS5pbHNOYW1lLFxuICAgICAgICAgICAgY2FwdGNoYUNvZGUsXG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZG9uZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgc3VjY2Vzc01vZGFsID0gbmV3IFNpZ25VcFN1Y2Nlc3NNb2RhbCgpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25Jbjptb2JpbGVOdW0nLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuT3ZlckRyaXZlLmxpYnJhcnlOYW1lXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBzdWNjZXNzTW9kYWwub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pZGNTaWduSW4ocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5mYWlsKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc2lnbmluLWJ1dHRvbicpXG4gICAgICAgICAgICAgICAgICAgIC5lbXB0eSgpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnd2FpdGluZycpXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodGV4dCgnc2lnbkluUGFnZS5tb2JpbGUuc2VuZENvZGUnKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVyci5yZXNwb25zZUpTT04uZXJyb3Iuc3RhdHVzQ29kZSAmJlxuICAgICAgICAgICAgICAgICAgICBlcnIucmVzcG9uc2VKU09OLmVycm9yLnN0YXR1c0NvZGUgPT09ICdEZW5pZWQnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0lEQyBzaWduLXVwIHN0ZXAsIHVzZXIgd2FzIGRlbmllZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5yZXNwb25zZVRleHQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJJZGNEZW5pZWQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nKCdlcnJvcicsICdJREMgc2lnbi11cCBzdGVwIGZhaWxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5yZXNwb25zZVRleHQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaG93RXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCgnc2lnbkluUGFnZS5pZGMuc2lnblVwRXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluazogYDxhIGhyZWY9XCIke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuT3ZlckRyaXZlLmNhcmRTaWduVXBMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPiR7dGV4dCgnc2lnbkluUGFnZS5pZGMuY29udGFjdExpYnJhcnknKX08L2E+YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlQW5kU2VuZENvZGUocGhvbmVOdW1iZXJJbnB1dCkge1xuICAgICAgICBpZiAoIXBob25lTnVtYmVySW5wdXQudmFsaWRhdGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbFxuICAgICAgICAgICAgLmZpbmQoJy5zaWduaW4tYnV0dG9uJylcbiAgICAgICAgICAgIC5lbXB0eSgpXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ3dhaXRpbmcnKVxuICAgICAgICAgICAgLmFwcGVuZCgnPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj4nKTtcblxuICAgICAgICBpZiAodGhpcy5pZGNDYXB0Y2hhKSB7XG4gICAgICAgICAgICB3aW5kb3cuZ3JlY2FwdGNoYS5leGVjdXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zZW5kQ29kZShwaG9uZU51bWJlcklucHV0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF92YWxpZGF0ZUFuZFJlc2VuZENvZGUocGhvbmVOdW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuaWRjQ2FwdGNoYSkge1xuICAgICAgICAgICAgd2luZG93LmdyZWNhcHRjaGEuZXhlY3V0ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcmVzZW5kQ29kZShwaG9uZU51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc2VuZENvZGUocGhvbmVOdW1iZXJJbnB1dCwgY2FwdGNoYUNvZGUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgJC5wb3N0KHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5yZXN0LmlkYy5waG9uZS5zZW5kQ29kZSksIHtcbiAgICAgICAgICAgIHBob25lTnVtYmVyOiBwaG9uZU51bWJlcklucHV0LkUxNjQsXG4gICAgICAgICAgICBjYXB0Y2hhQ29kZSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5kb25lKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcignbW9iaWxlOnJlZ2lzdGVyOmNvZGU6c2VudCcpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICAgJ21vYmlsZTpjb2RlOnNlbnQnLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuT3ZlckRyaXZlLmxpYnJhcnlOYW1lXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJWZXJpZmljYXRpb25Db2RlSW5wdXQoXG4gICAgICAgICAgICAgICAgICAgIHBob25lTnVtYmVySW5wdXQuZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwaG9uZU51bWJlcklucHV0LkUxNjQsXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmFpbCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbFxuICAgICAgICAgICAgICAgICAgICAuZmluZCgnLnNpZ25pbi1idXR0b24nKVxuICAgICAgICAgICAgICAgICAgICAuZW1wdHkoKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3dhaXRpbmcnKVxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHRleHQoJ3NpZ25JblBhZ2UubW9iaWxlLnNlbmRDb2RlJykpO1xuICAgICAgICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ1NlbmQgSURDIGNvZGUgdG8gcGhvbmUgZmFpbGVkJywge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIucmVzcG9uc2VUZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dFcnJvck1lc3NhZ2UodGV4dCgnc2lnbkluUGFnZS5pZGMuZXJyb3JTZW5kaW5nQ29kZScpKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZXNlbmRDb2RlKHBob25lTnVtYmVyLCBjYXB0Y2hhQ29kZSA9IHVuZGVmaW5lZCkge1xuICAgICAgICAkLnBvc3Qod2luZG93LnVybCh3aW5kb3cucm91dGVzLnJlc3QuaWRjLnBob25lLnNlbmRDb2RlKSwge1xuICAgICAgICAgICAgcGhvbmVOdW1iZXIsXG4gICAgICAgICAgICBjYXB0Y2hhQ29kZSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5kb25lKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICAgJ21vYmlsZTpjb2RlOnJlc2VudCcsXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5PdmVyRHJpdmUubGlicmFyeU5hbWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcignbW9iaWxlOnJlZ2lzdGVyOmNvZGU6cmVzZW50Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvd0NvZGVSZXNlbnRNZXNzYWdlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZhaWwoKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ1NlbmQgSURDIGNvZGUgdG8gcGhvbmUgZmFpbGVkJywge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIucmVzcG9uc2VUZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dFcnJvck1lc3NhZ2UodGV4dCgnc2lnbkluUGFnZS5pZGMuZXJyb3JTZW5kaW5nQ29kZScpKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIF92ZXJpZnlDb2RlKGNvZGVJbnB1dCwgaWRjUmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKCFjb2RlSW5wdXQudmFsaWRhdGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcihcbiAgICAgICAgICAgICdtb2JpbGU6Y29kZTp2ZXJpZmllZCcsXG4gICAgICAgICAgICB3aW5kb3cuT3ZlckRyaXZlLmxpYnJhcnlOYW1lXG4gICAgICAgICk7XG4gICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcignbW9iaWxlOnJlZ2lzdGVyOmNvZGU6dmVyaWZpZWQnKTtcbiAgICAgICAgdGhpcy5lbFxuICAgICAgICAgICAgLmZpbmQoJy5zaWduaW4tYnV0dG9uJylcbiAgICAgICAgICAgIC5lbXB0eSgpXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ3dhaXRpbmcnKVxuICAgICAgICAgICAgLmFwcGVuZCgnPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj4nKTtcbiAgICAgICAgJC5wb3N0KHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5yZXN0LmlkYy5waG9uZS52ZXJpZnlDb2RlKSwge1xuICAgICAgICAgICAgY29kZTogY29kZUlucHV0LiRpbnB1dC52YWwoKSxcbiAgICAgICAgICAgIHBob25lRTE2NDogaWRjUmVzcG9uc2UucGhvbmVFMTY0LFxuICAgICAgICAgICAgaWxzTmFtZTogdGhpcy5vem9uZURhdGEuZ2V0QUNhcmQucHJpbWFyeS5pbHNOYW1lLFxuICAgICAgICB9KVxuICAgICAgICAgICAgLmRvbmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ1NpZ25JbkF2YWlsYWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lmdsb2JhbEV2ZW50cy50cmlnZ2VyKCdtb2JpbGU6cmVnaXN0ZXI6c3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lkY1NpZ25JbihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdTaWduVXBBdmFpbGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcklkY0FkZGl0aW9uYWxJbmZvKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5mYWlsKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2RlY2xpbmVOZXdJZGNMb2dpbicpICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLm96b25lRGF0YS5nZXRBQ2FyZC5wcmltYXJ5LnNpZ25VcCAmJlxuICAgICAgICAgICAgICAgICAgICBlcnIuc3RhdHVzID09PSA0MDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZXJyLnJlc3BvbnNlSlNPTi5lcnJvci5zdGF0dXMgPT09ICdVbmF2YWlsYWJsZSdcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlck1vYmlsZU51bWJlckZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Vycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQoJ3NpZ25JblBhZ2UuaWRjLm51bWJlck5vdEtub3duJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLnNpZ25pbi1idXR0b24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmVtcHR5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnd2FpdGluZycpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHRleHQoJ3NpZ25JblBhZ2UubW9iaWxlLnNlbmRDb2RlJykpO1xuICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nKCdlcnJvcicsICdGYWlsZWQgdG8gdmVyaWZ5IElEQyBjb2RlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLnJlc3BvbnNlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KCdzaWduSW5QYWdlLmlkYy5lcnJvclNlbmRpbmdDb2RlJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfY2hlY2tWYWxpZEVtYWlsKGVtYWlsSW5wdXQsIGlsc05hbWUpIHtcbiAgICAgICAgaWYgKGVtYWlsSW5wdXQudmFsaWRhdGVOb25FbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVsXG4gICAgICAgICAgICAgICAgLmZpbmQoJy5zaWduaW4tYnV0dG9uJylcbiAgICAgICAgICAgICAgICAuZW1wdHkoKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnd2FpdGluZycpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj4nKTtcblxuICAgICAgICAgICAgbGV0IHVzZXJEYXRhID0ge1xuICAgICAgICAgICAgICAgIEVtYWlsOiBlbWFpbElucHV0LiRpbnB1dC52YWwoKSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICQucG9zdCh3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMucmVzdC5pZGMuc2lnblVwKSwge1xuICAgICAgICAgICAgICAgIHVzZXJEYXRhOiBKU09OLnN0cmluZ2lmeSh1c2VyRGF0YSksXG4gICAgICAgICAgICAgICAgaWxzTmFtZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmRvbmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcignc2lnbkluLmVtYWlsJywgaWxzTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lkY1NpZ25JbihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmFpbCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc2lnbmluLWJ1dHRvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZW1wdHkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCd3YWl0aW5nJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodGV4dCgnc2lnbkluUGFnZS5tb2JpbGUuc2VuZENvZGUnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlc3BvbnNlSlNPTi5lcnJvci5zdGF0dXNDb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVzcG9uc2VKU09OLmVycm9yLnN0YXR1c0NvZGUgPT09ICdEZW5pZWQnXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZygnZXJyb3InLCAnSURDIGVtYWlsIHdhcyBub3QgdmFsaWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLnJlc3BvbnNlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Vycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KCdzaWduSW5QYWdlLmVtYWlsSW5lbGlnaWJsZScpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlc3BvbnNlSlNPTi5lcnJvci5yZXF1aXJlZEZpZWxkcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlc3BvbnNlSlNPTi5lcnJvci5yZXF1aXJlZEZpZWxkcy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRW1haWxUb2tlbidcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWFpbFNlbmRDb2RlKGVtYWlsSW5wdXQsIGlsc05hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJREMgY2hlY2sgdmFsaWQgZW1haWwgc3RlcCBmYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVzc2FnZTogZXJyLnJlc3BvbnNlVGV4dCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Vycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KCdzaWduSW5QYWdlLmVtYWlsLnZhbGlkYXRpb25FcnJvcicpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZW1haWxTaWduVXAoaWxzTmFtZSwgaWRjUmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5lbFxuICAgICAgICAgICAgLmZpbmQoJy5zaWduaW4tYnV0dG9uJylcbiAgICAgICAgICAgIC5lbXB0eSgpXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ3dhaXRpbmcnKVxuICAgICAgICAgICAgLmFwcGVuZCgnPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj4nKTtcblxuICAgICAgICBsZXQgdXNlckRhdGEgPSB7XG4gICAgICAgICAgICBFbWFpbDogaWRjUmVzcG9uc2UuZW1haWwsXG4gICAgICAgICAgICBFbWFpbFRva2VuOiBpZGNSZXNwb25zZS5lbWFpbFRva2VuLFxuICAgICAgICB9O1xuXG4gICAgICAgICQucG9zdCh3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMucmVzdC5pZGMuc2lnblVwKSwge1xuICAgICAgICAgICAgdXNlckRhdGE6IEpTT04uc3RyaW5naWZ5KHVzZXJEYXRhKSxcbiAgICAgICAgICAgIGlsc05hbWUsXG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZG9uZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pZGNTaWduSW4ocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5mYWlsKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc2lnbmluLWJ1dHRvbicpXG4gICAgICAgICAgICAgICAgICAgIC5lbXB0eSgpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnd2FpdGluZycpXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodGV4dCgnc2lnbkluUGFnZS5tb2JpbGUuc2VuZENvZGUnKSk7XG4gICAgICAgICAgICAgICAgTG9nZ2VyLmxvZygnZXJyb3InLCAnSURDIGVtYWlsIHNpZ24tdXAgZmFpbGVkJywge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIucmVzcG9uc2VUZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgIHRleHQoJ3NpZ25JblBhZ2UuaWRjLnNpZ25VcEVycm9yJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluazogYDxhIGhyZWY9XCIke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5PdmVyRHJpdmUuY2FyZFNpZ25VcExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIj4ke3RleHQoJ3NpZ25JblBhZ2UuaWRjLmNvbnRhY3RMaWJyYXJ5Jyl9PC9hPmAsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9lbWFpbFNlbmRDb2RlKGVtYWlsSW5wdXQsIGlsc05hbWUpIHtcbiAgICAgICAgJC5wb3N0KHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5yZXN0LmlkYy5lbWFpbC5zZW5kQ29kZSksIHtcbiAgICAgICAgICAgIGVtYWlsQWRkcmVzczogZW1haWxJbnB1dC4kaW5wdXQudmFsKCksXG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZG9uZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuZ2xvYmFsRXZlbnRzLnRyaWdnZXIoJ2VtYWlsOmNvZGU6c2VudCcsIGlsc05hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlckVtYWlsVmVyaWZpY2F0aW9uQ29kZUlucHV0KFxuICAgICAgICAgICAgICAgICAgICBlbWFpbElucHV0LiRpbnB1dC52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgIGlsc05hbWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5mYWlsKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc2lnbmluLWJ1dHRvbicpXG4gICAgICAgICAgICAgICAgICAgIC5lbXB0eSgpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnd2FpdGluZycpXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodGV4dCgnc2lnbkluUGFnZS5tb2JpbGUuc2VuZENvZGUnKSk7XG4gICAgICAgICAgICAgICAgTG9nZ2VyLmxvZygnZXJyb3InLCAnU2VuZCBJREMgY29kZSB0byBlbWFpbCBmYWlsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5yZXNwb25zZVRleHQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Vycm9yTWVzc2FnZSh0ZXh0KCdzaWduSW5QYWdlLmlkYy5lcnJvclNlbmRpbmdDb2RlJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3Jlc2VuZEVtYWlsQ29kZShlbWFpbEFkZHJlc3MpIHtcbiAgICAgICAgJC5wb3N0KHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5yZXN0LmlkYy5lbWFpbC5zZW5kQ29kZSksIHtcbiAgICAgICAgICAgIGVtYWlsQWRkcmVzcyxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5kb25lKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICAgJ2VtYWlsOmNvZGU6cmVzZW50JyxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lk92ZXJEcml2ZS5saWJyYXJ5TmFtZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvd0NvZGVSZXNlbnRNZXNzYWdlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZhaWwoKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ1NlbmQgSURDIGNvZGUgdG8gZW1haWwgZmFpbGVkJywge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIucmVzcG9uc2VUZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dFcnJvck1lc3NhZ2UodGV4dCgnc2lnbkluUGFnZS5pZGMuZXJyb3JTZW5kaW5nQ29kZScpKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9lbWFpbFZlcmlmeUNvZGUoY29kZUlucHV0LCBpZGNSZXNwb25zZSwgaWxzTmFtZSkge1xuICAgICAgICBpZiAoY29kZUlucHV0LnZhbGlkYXRlKCkpIHtcbiAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcignZW1haWw6Y29kZTp2ZXJpZmllZCcsIGlsc05hbWUpO1xuICAgICAgICAgICAgdGhpcy5lbFxuICAgICAgICAgICAgICAgIC5maW5kKCcuc2lnbmluLWJ1dHRvbicpXG4gICAgICAgICAgICAgICAgLmVtcHR5KClcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3dhaXRpbmcnKVxuICAgICAgICAgICAgICAgIC5hcHBlbmQoJzxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+Jyk7XG4gICAgICAgICAgICAkLnBvc3Qod2luZG93LnVybCh3aW5kb3cucm91dGVzLnJlc3QuaWRjLmVtYWlsLnZlcmlmeUNvZGUpLCB7XG4gICAgICAgICAgICAgICAgY29kZTogY29kZUlucHV0LiRpbnB1dC52YWwoKSxcbiAgICAgICAgICAgICAgICBlbWFpbEFkZHJlc3M6IGlkY1Jlc3BvbnNlLmVtYWlsLFxuICAgICAgICAgICAgICAgIGlsc05hbWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5kb25lKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWFpbFNpZ25VcChpbHNOYW1lLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmFpbCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuc2lnbmluLWJ1dHRvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZW1wdHkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCd3YWl0aW5nJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodGV4dCgnc2lnbkluUGFnZS5tb2JpbGUuc2VuZENvZGUnKSk7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0ZhaWxlZCB0byB2ZXJpZnkgSURDIGVtYWlsIGNvZGUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIucmVzcG9uc2VUZXh0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Vycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQoJ3NpZ25JblBhZ2UuaWRjLmludmFsaWRWZXJpZnknKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2lkY1NpZ25JbihpZGNSZXNwb25zZSkge1xuICAgICAgICBjb25zdCAkZm9ybSA9ICQoYFxuICAgICAgICAgICAgPGZvcm0gbWV0aG9kPVwicG9zdFwiIGFjdGlvbj1cIiR7dXJsKHJvdXRlcy5vem9uZS5hdXRoZW50aWNhdGUsIHtcbiAgICAgICAgICAgICAgICBmb3J3YXJkVXJsOiB0aGlzLmZvcndhcmRVcmwsXG4gICAgICAgICAgICB9KX1cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJhdXRoVHlwZVwiIHZhbHVlPVwibG9jYWxcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJpbHNOYW1lXCIgdmFsdWU9XCIke1xuICAgICAgICAgICAgICAgICAgICBpZGNSZXNwb25zZS5zaWduSW4uaWxzTmFtZVxuICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJ1c2VybmFtZVwiIHZhbHVlPVwiJHtcbiAgICAgICAgICAgICAgICAgICAgaWRjUmVzcG9uc2Uuc2lnbkluLnVzZXJuYW1lXG4gICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInBhc3N3b3JkXCIgdmFsdWU9XCIke1xuICAgICAgICAgICAgICAgICAgICBpZGNSZXNwb25zZS5zaWduSW4ucGFzc3dvcmRcbiAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIGApO1xuXG4gICAgICAgIHRoaXMuZWwuYXBwZW5kKCRmb3JtKTtcblxuICAgICAgICAkZm9ybS5zdWJtaXQoKTtcbiAgICB9XG5cbiAgICBfc2hvd0Vycm9yTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9ICQoYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yTWVzc2FnZVwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlcnJvckljb25cIj4hPC9kaXY+XG4gICAgICAgICAgICAgICAgPHA+JHttZXNzYWdlfTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgKTtcblxuICAgICAgICB0aGlzLmVsLmZpbmQoJy5lcnJvck1lc3NhZ2UnKS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5lbC5maW5kKCcuaW5wdXRDb250YWluZXInKS5iZWZvcmUodGVtcGxhdGUpO1xuICAgIH1cblxuICAgIF9oaWRlRXJyb3JNZXNzYWdlKCkge1xuICAgICAgICB0aGlzLmVsLmZpbmQoJy5lcnJvck1lc3NhZ2UnKS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBfc2hvd0NvZGVSZXNlbnRNZXNzYWdlKCkge1xuICAgICAgICBsZXQgdGVtcGxhdGUgPSAkKGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2RlUmVzZW50XCI+XG4gICAgICAgICAgICAgICAgPHA+ICR7dGV4dCgnc2lnbkluUGFnZS5pZGMubmV3Q29kZVNlbnQnKX1cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJqcy1zYXZlZCBTYXZlZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiU2F2ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiU2F2ZWQtQ2hlY2ttYXJrXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZlcnNpb249XCIxLjFcIiB2aWV3Qm94PVwiMCAwIDUyIDUyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJTYXZlZC1jaGVja21hcmtDaXJjbGVcIiBjeD1cIjI2XCIgY3k9XCIyNlwiIHI9XCIyNVwiIGZpbGw9XCJub25lXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwiU2F2ZWQtY2hlY2ttYXJrQ2hlY2tcIiBmaWxsPVwibm9uZVwiIGQ9XCJNMTQuMSAyNy4ybDcuMSA3LjIgMTYuNy0xNi44XCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIGApO1xuICAgICAgICB0aGlzLmVsLmZpbmQoJy5lcnJvck1lc3NhZ2UnKS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5lbC5maW5kKCcuY29kZVJlc2VudCcpLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLmVsLmZpbmQoJy5pbnB1dENvbnRhaW5lcicpLmJlZm9yZSh0ZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgX3JlbmRlclJlY2FwdGNoYShjYXB0Y2hhRWxlbWVudElkKSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBzb21lIGluc3RhbmNlcyB3aGVyZSByZWNhcHRjaGEgaGFzbid0IGxvYWRlZCB5ZXQuIE9uY2UgaXQgbG9hZHMsIGl0J2xsIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgLy8gcmVuZGVyIHdoZW4gaXQgZmluZHMgYW4gZWxlbWVudCB3aXRoIHRoZSBnLXJlY2FwdGNoYSBjbGFzcy5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHdpbmRvdy5ncmVjYXB0Y2hhICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHdpbmRvdy5ncmVjYXB0Y2hhLnJlbmRlciAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB3aW5kb3cuZ3JlY2FwdGNoYS5yZW5kZXIoY2FwdGNoYUVsZW1lbnRJZCwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBTaWduSW5WaWV3IGZyb20gJy4uL2NvbXBvbmVudHMvc2lnbl9pbi9TaWduSW4nO1xuXG4kKCgpID0+IHtcbiAgICBjb25zdCBlbCA9ICQoJy5TaWduSW5NYWluQm9keScpO1xuICAgIGxldCBzaWduSW5WaWV3ID0gbmV3IFNpZ25JblZpZXcoZWwsIHdpbmRvdy5PdmVyRHJpdmUubG9naW5Gb3Jtcywgd2luZG93Lk92ZXJEcml2ZS5mb3J3YXJkVXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lk92ZXJEcml2ZS5mb3JtS2V5LCB3aW5kb3cuT3ZlckRyaXZlLmVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5PdmVyRHJpdmUuY2FwdGNoYVJlcXVpcmVkLCB3aW5kb3cuT3ZlckRyaXZlLnNob3dJZGNTaWduVXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuT3ZlckRyaXZlLnByZXZpb3VzVXNlcm5hbWUsIHdpbmRvdy5PdmVyRHJpdmUucHJldmlvdXNMaWJyYXJ5TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5PdmVyRHJpdmUuaWRjQ2FwdGNoYVJlcXVpcmVkLCB3aW5kb3cuT3ZlckRyaXZlLmlkY0NhcHRjaGEpO1xuICAgIHNpZ25JblZpZXcuX3JlbmRlcigpO1xufSk7XG4iLCJjb25zdCBrZXlzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgVEFCOiA5LFxuICAgIEVOVEVSOiAxMyxcbiAgICBMRUZUOiAzNyxcbiAgICBVUDogMzgsXG4gICAgUklHSFQ6IDM5LFxuICAgIERPV046IDQwLFxuICAgIFNQQUNFOiAzMixcbiAgICBFU0M6IDI3XG59KTtcbmV4cG9ydCBkZWZhdWx0IGtleXM7XG4iXX0="}