{"version":3,"sources":["src/_scripts/node_modules/browser-pack/_prelude.js","src/_scripts/node_modules/clipboard/lib/clipboard-action.js","src/_scripts/node_modules/clipboard/lib/clipboard.js","src/_scripts/node_modules/delegate/src/closest.js","src/_scripts/node_modules/delegate/src/delegate.js","src/_scripts/node_modules/good-listener/src/is.js","src/_scripts/node_modules/good-listener/src/listen.js","src/_scripts/node_modules/js-beautify/js/index.js","src/_scripts/node_modules/js-beautify/js/lib/beautify-css.js","src/_scripts/node_modules/js-beautify/js/lib/beautify-html.js","src/_scripts/node_modules/js-beautify/js/lib/beautify.js","src/_scripts/node_modules/lodash/lodash.min.js","src/_scripts/node_modules/prismjs/plugins/unescaped-markup/prism-unescaped-markup.js","src/_scripts/node_modules/prismjs/prism.js","src/_scripts/node_modules/select/src/select.js","src/_scripts/node_modules/tiny-emitter/index.js","src/_scripts/src/_scripts/_vars.ts","src/_scripts/src/_scripts/components/_button-level-loader.ts","src/_scripts/src/_scripts/components/_carousel.ts","src/_scripts/src/_scripts/components/_overlay.ts","src/_scripts/src/_scripts/components/_page-level-loader.ts","src/_scripts/src/_scripts/components/_progress-steps.ts","src/_scripts/src/_scripts/components/_provider-result.ts","src/_scripts/src/_scripts/components/_query.ts","src/_scripts/src/_scripts/components/_type-ahead.ts","src/_scripts/src/_scripts/elements/_anchor.ts","src/_scripts/src/_scripts/elements/_equalize.ts","src/_scripts/src/_scripts/elements/_font-resize.ts","src/_scripts/src/_scripts/elements/_placeholder-label.ts","src/_scripts/src/_scripts/elements/_prevent.ts","src/_scripts/src/_scripts/elements/_show-password.ts","src/_scripts/src/_scripts/elements/_tooltip.ts","src/_scripts/src/_scripts/elements/_validate-pass-repass.ts","src/_scripts/src/_scripts/elements/_validate-password-conditions.ts","src/_scripts/src/_scripts/groups/_editable-controls.ts","src/_scripts/src/_scripts/groups/_search.ts","src/_scripts/src/_scripts/groups/_tabs.ts","src/_scripts/src/_scripts/main.custom.ts","src/_scripts/src/_scripts/modules/_chat.ts","src/_scripts/src/_scripts/modules/_footer.ts","src/_scripts/src/_scripts/modules/_header.ts","src/_scripts/src/_scripts/pages/_account_pov.ts","src/_scripts/src/_scripts/pages/_add_edit_providers.ts","src/_scripts/src/_scripts/pages/_appointment-use-different-number.ts","src/_scripts/src/_scripts/pages/_client-home.ts","src/_scripts/src/_scripts/pages/_client-update-info.ts","src/_scripts/src/_scripts/pages/_communication-preferences.ts","src/_scripts/src/_scripts/pages/_hide-my-account-alerts.ts","src/_scripts/src/_scripts/pages/_style-guide.ts","src/_scripts/src/_scripts/utilities/_helpers.ts","src/_scripts/src/_scripts/utilities/_user.ts"],"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;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AC1jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACvmCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACh7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACvIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC3xBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AAC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","file":"main.custom.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this.action = options.action;\n this.emitter = options.emitter;\n this.target = options.target;\n this.text = options.text;\n this.trigger = options.trigger;\n\n this.selectedText = '';\n }\n }, {\n key: 'initSelection',\n value: function initSelection() {\n if (this.text) {\n this.selectFake();\n } else if (this.target) {\n this.selectTarget();\n }\n }\n }, {\n key: 'selectFake',\n value: function selectFake() {\n var _this = this;\n\n var isRTL = document.documentElement.getAttribute('dir') == 'rtl';\n\n this.removeFake();\n\n this.fakeHandlerCallback = function () {\n return _this.removeFake();\n };\n this.fakeHandler = document.body.addEventListener('click', this.fakeHandlerCallback) || true;\n\n this.fakeElem = document.createElement('textarea');\n // Prevent zooming on iOS\n this.fakeElem.style.fontSize = '12pt';\n // Reset box model\n this.fakeElem.style.border = '0';\n this.fakeElem.style.padding = '0';\n this.fakeElem.style.margin = '0';\n // Move element out of screen horizontally\n this.fakeElem.style.position = 'absolute';\n this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';\n // Move element to the same position vertically\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n this.fakeElem.style.top = yPosition + 'px';\n\n this.fakeElem.setAttribute('readonly', '');\n this.fakeElem.value = this.text;\n\n document.body.appendChild(this.fakeElem);\n\n this.selectedText = (0, _select2.default)(this.fakeElem);\n this.copyText();\n }\n }, {\n key: 'removeFake',\n value: function removeFake() {\n if (this.fakeHandler) {\n document.body.removeEventListener('click', this.fakeHandlerCallback);\n this.fakeHandler = null;\n this.fakeHandlerCallback = null;\n }\n\n if (this.fakeElem) {\n document.body.removeChild(this.fakeElem);\n this.fakeElem = null;\n }\n }\n }, {\n key: 'selectTarget',\n value: function selectTarget() {\n this.selectedText = (0, _select2.default)(this.target);\n this.copyText();\n }\n }, {\n key: 'copyText',\n value: function copyText() {\n var succeeded = void 0;\n\n try {\n succeeded = document.execCommand(this.action);\n } catch (err) {\n succeeded = false;\n }\n\n this.handleResult(succeeded);\n }\n }, {\n key: 'handleResult',\n value: function handleResult(succeeded) {\n this.emitter.emit(succeeded ? 'success' : 'error', {\n action: this.action,\n text: this.selectedText,\n trigger: this.trigger,\n clearSelection: this.clearSelection.bind(this)\n });\n }\n }, {\n key: 'clearSelection',\n value: function clearSelection() {\n if (this.target) {\n this.target.blur();\n }\n\n window.getSelection().removeAllRanges();\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this.removeFake();\n }\n }, {\n key: 'action',\n set: function set() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';\n\n this._action = action;\n\n if (this._action !== 'copy' && this._action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n }\n },\n get: function get() {\n return this._action;\n }\n }, {\n key: 'target',\n set: function set(target) {\n if (target !== undefined) {\n if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {\n if (this.action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n\n this._target = target;\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n }\n },\n get: function get() {\n return this._target;\n }\n }]);\n\n return ClipboardAction;\n }();\n\n module.exports = ClipboardAction;\n});","(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(['module', './clipboard-action', 'tiny-emitter', 'good-listener'], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(module, require('./clipboard-action'), require('tiny-emitter'), require('good-listener'));\n } else {\n var mod = {\n exports: {}\n };\n factory(mod, global.clipboardAction, global.tinyEmitter, global.goodListener);\n global.clipboard = mod.exports;\n }\n})(this, function (module, _clipboardAction, _tinyEmitter, _goodListener) {\n 'use strict';\n\n var _clipboardAction2 = _interopRequireDefault(_clipboardAction);\n\n var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter);\n\n var _goodListener2 = _interopRequireDefault(_goodListener);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n }();\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n var Clipboard = function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n _classCallCheck(this, Clipboard);\n\n var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this));\n\n _this.resolveOptions(options);\n _this.listenClick(trigger);\n return _this;\n }\n\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: 'resolveOptions',\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n }\n }, {\n key: 'listenClick',\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = (0, _goodListener2.default)(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n }, {\n key: 'onClick',\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n\n if (this.clipboardAction) {\n this.clipboardAction = null;\n }\n\n this.clipboardAction = new _clipboardAction2.default({\n action: this.action(trigger),\n target: this.target(trigger),\n text: this.text(trigger),\n trigger: trigger,\n emitter: this\n });\n }\n }, {\n key: 'defaultAction',\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n }, {\n key: 'defaultTarget',\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n }, {\n key: 'defaultText',\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this.listener.destroy();\n\n if (this.clipboardAction) {\n this.clipboardAction.destroy();\n this.clipboardAction = null;\n }\n }\n }], [{\n key: 'isSupported',\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n\n return support;\n }\n }]);\n\n return Clipboard;\n }(_tinyEmitter2.default);\n\n /**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n function getAttributeValue(suffix, element) {\n var attribute = 'data-clipboard-' + suffix;\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n }\n\n module.exports = Clipboard;\n});","var DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n","var closest = require('./closest');\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n","/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n","var is = require('./is');\nvar delegate = require('delegate');\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n","/*\n The MIT License (MIT)\n\n Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n*/\n\n/**\nThe following batches are equivalent:\n\nvar beautify_js = require('js-beautify');\nvar beautify_js = require('js-beautify').js;\nvar beautify_js = require('js-beautify').js_beautify;\n\nvar beautify_css = require('js-beautify').css;\nvar beautify_css = require('js-beautify').css_beautify;\n\nvar beautify_html = require('js-beautify').html;\nvar beautify_html = require('js-beautify').html_beautify;\n\nAll methods returned accept two arguments, the source string and an options object.\n**/\n\nfunction get_beautify(js_beautify, css_beautify, html_beautify) {\n // the default is js\n var beautify = function(src, config) {\n return js_beautify.js_beautify(src, config);\n };\n\n // short aliases\n beautify.js = js_beautify.js_beautify;\n beautify.css = css_beautify.css_beautify;\n beautify.html = html_beautify.html_beautify;\n\n // legacy aliases\n beautify.js_beautify = js_beautify.js_beautify;\n beautify.css_beautify = css_beautify.css_beautify;\n beautify.html_beautify = html_beautify.html_beautify;\n\n return beautify;\n}\n\nif (typeof define === \"function\" && define.amd) {\n // Add support for AMD ( https://github.com/amdjs/amdjs-api/wiki/AMD#defineamd-property- )\n define([\n \"./lib/beautify\",\n \"./lib/beautify-css\",\n \"./lib/beautify-html\"\n ], function(js_beautify, css_beautify, html_beautify) {\n return get_beautify(js_beautify, css_beautify, html_beautify);\n });\n} else {\n (function(mod) {\n var js_beautify = require('./lib/beautify');\n var css_beautify = require('./lib/beautify-css');\n var html_beautify = require('./lib/beautify-html');\n\n mod.exports = get_beautify(js_beautify, css_beautify, html_beautify);\n\n })(module);\n}","/*jshint curly:true, eqeqeq:true, laxbreak:true, noempty:false */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n\n CSS Beautifier\n---------------\n\n Written by Harutyun Amirjanyan, (amirjanyan@gmail.com)\n\n Based on code initially developed by: Einar Lielmanis, \n http://jsbeautifier.org/\n\n Usage:\n css_beautify(source_text);\n css_beautify(source_text, options);\n\n The options are (default in brackets):\n indent_size (4) — indentation size,\n indent_char (space) — character to indent with,\n preserve_newlines (default false) - whether existing line breaks should be preserved,\n selector_separator_newline (true) - separate selectors with newline or\n not (e.g. \"a,\\nbr\" or \"a, br\")\n end_with_newline (false) - end with a newline\n newline_between_rules (true) - add a new line after every css rule\n space_around_selector_separator (false) - ensure space around selector separators:\n '>', '+', '~' (e.g. \"a>b\" -> \"a > b\")\n e.g\n\n css_beautify(css_source_text, {\n 'indent_size': 1,\n 'indent_char': '\\t',\n 'selector_separator': ' ',\n 'end_with_newline': false,\n 'newline_between_rules': true,\n 'space_around_selector_separator': true\n });\n*/\n\n// http://www.w3.org/TR/CSS21/syndata.html#tokenization\n// http://www.w3.org/TR/css3-syntax/\n\n(function() {\n\n function mergeOpts(allOptions, targetType) {\n var finalOpts = {};\n var name;\n\n for (name in allOptions) {\n if (name !== targetType) {\n finalOpts[name] = allOptions[name];\n }\n }\n\n\n //merge in the per type settings for the targetType\n if (targetType in allOptions) {\n for (name in allOptions[targetType]) {\n finalOpts[name] = allOptions[targetType][name];\n }\n }\n return finalOpts;\n }\n\n var lineBreak = /\\r\\n|[\\n\\r\\u2028\\u2029]/;\n var allLineBreaks = new RegExp(lineBreak.source, 'g');\n\n function css_beautify(source_text, options) {\n options = options || {};\n\n // Allow the setting of language/file-type specific options\n // with inheritance of overall settings\n options = mergeOpts(options, 'css');\n\n source_text = source_text || '';\n\n var newlinesFromLastWSEat = 0;\n var indentSize = options.indent_size ? parseInt(options.indent_size, 10) : 4;\n var indentCharacter = options.indent_char || ' ';\n var preserve_newlines = (options.preserve_newlines === undefined) ? false : options.preserve_newlines;\n var selectorSeparatorNewline = (options.selector_separator_newline === undefined) ? true : options.selector_separator_newline;\n var end_with_newline = (options.end_with_newline === undefined) ? false : options.end_with_newline;\n var newline_between_rules = (options.newline_between_rules === undefined) ? true : options.newline_between_rules;\n var space_around_combinator = (options.space_around_combinator === undefined) ? false : options.space_around_combinator;\n space_around_combinator = space_around_combinator || ((options.space_around_selector_separator === undefined) ? false : options.space_around_selector_separator);\n var eol = options.eol ? options.eol : 'auto';\n\n if (options.indent_with_tabs) {\n indentCharacter = '\\t';\n indentSize = 1;\n }\n\n if (eol === 'auto') {\n eol = '\\n';\n if (source_text && lineBreak.test(source_text || '')) {\n eol = source_text.match(lineBreak)[0];\n }\n }\n\n eol = eol.replace(/\\\\r/, '\\r').replace(/\\\\n/, '\\n');\n\n // HACK: newline parsing inconsistent. This brute force normalizes the input.\n source_text = source_text.replace(allLineBreaks, '\\n');\n\n // tokenizer\n var whiteRe = /^\\s+$/;\n\n var pos = -1,\n ch;\n var parenLevel = 0;\n\n function next() {\n ch = source_text.charAt(++pos);\n return ch || '';\n }\n\n function peek(skipWhitespace) {\n var result = '';\n var prev_pos = pos;\n if (skipWhitespace) {\n eatWhitespace();\n }\n result = source_text.charAt(pos + 1) || '';\n pos = prev_pos - 1;\n next();\n return result;\n }\n\n function eatString(endChars) {\n var start = pos;\n while (next()) {\n if (ch === \"\\\\\") {\n next();\n } else if (endChars.indexOf(ch) !== -1) {\n break;\n } else if (ch === \"\\n\") {\n break;\n }\n }\n return source_text.substring(start, pos + 1);\n }\n\n function peekString(endChar) {\n var prev_pos = pos;\n var str = eatString(endChar);\n pos = prev_pos - 1;\n next();\n return str;\n }\n\n function eatWhitespace(preserve_newlines_local) {\n var result = 0;\n while (whiteRe.test(peek())) {\n next();\n if (ch === '\\n' && preserve_newlines_local && preserve_newlines) {\n print.newLine(true);\n result++;\n }\n }\n newlinesFromLastWSEat = result;\n return result;\n }\n\n function skipWhitespace() {\n var result = '';\n if (ch && whiteRe.test(ch)) {\n result = ch;\n }\n while (whiteRe.test(next())) {\n result += ch;\n }\n return result;\n }\n\n function eatComment(singleLine) {\n var start = pos;\n singleLine = peek() === \"/\";\n next();\n while (next()) {\n if (!singleLine && ch === \"*\" && peek() === \"/\") {\n next();\n break;\n } else if (singleLine && ch === \"\\n\") {\n return source_text.substring(start, pos);\n }\n }\n\n return source_text.substring(start, pos) + ch;\n }\n\n\n function lookBack(str) {\n return source_text.substring(pos - str.length, pos).toLowerCase() ===\n str;\n }\n\n // Nested pseudo-class if we are insideRule\n // and the next special character found opens\n // a new block\n function foundNestedPseudoClass() {\n var openParen = 0;\n for (var i = pos + 1; i < source_text.length; i++) {\n var ch = source_text.charAt(i);\n if (ch === \"{\") {\n return true;\n } else if (ch === '(') {\n // pseudoclasses can contain ()\n openParen += 1;\n } else if (ch === ')') {\n if (openParen === 0) {\n return false;\n }\n openParen -= 1;\n } else if (ch === \";\" || ch === \"}\") {\n return false;\n }\n }\n return false;\n }\n\n // printer\n var basebaseIndentString = source_text.match(/^[\\t ]*/)[0];\n var singleIndent = new Array(indentSize + 1).join(indentCharacter);\n var indentLevel = 0;\n var nestedLevel = 0;\n\n function indent() {\n indentLevel++;\n basebaseIndentString += singleIndent;\n }\n\n function outdent() {\n indentLevel--;\n basebaseIndentString = basebaseIndentString.slice(0, -indentSize);\n }\n\n var print = {};\n print[\"{\"] = function(ch) {\n print.singleSpace();\n output.push(ch);\n if (!eatWhitespace(true)) {\n print.newLine();\n }\n };\n print[\"}\"] = function(newline) {\n if (newline) {\n print.newLine();\n }\n output.push('}');\n if (!eatWhitespace(true)) {\n print.newLine();\n }\n };\n\n print._lastCharWhitespace = function() {\n return whiteRe.test(output[output.length - 1]);\n };\n\n print.newLine = function(keepWhitespace) {\n if (output.length) {\n if (!keepWhitespace && output[output.length - 1] !== '\\n') {\n print.trim();\n } else if (output[output.length - 1] === basebaseIndentString) {\n output.pop();\n }\n output.push('\\n');\n\n if (basebaseIndentString) {\n output.push(basebaseIndentString);\n }\n }\n };\n print.singleSpace = function() {\n if (output.length && !print._lastCharWhitespace()) {\n output.push(' ');\n }\n };\n\n print.preserveSingleSpace = function() {\n if (isAfterSpace) {\n print.singleSpace();\n }\n };\n\n print.trim = function() {\n while (print._lastCharWhitespace()) {\n output.pop();\n }\n };\n\n\n var output = [];\n /*_____________________--------------------_____________________*/\n\n var insideRule = false;\n var insidePropertyValue = false;\n var enteringConditionalGroup = false;\n var top_ch = '';\n var last_top_ch = '';\n\n while (true) {\n var whitespace = skipWhitespace();\n var isAfterSpace = whitespace !== '';\n var isAfterNewline = whitespace.indexOf('\\n') !== -1;\n last_top_ch = top_ch;\n top_ch = ch;\n\n if (!ch) {\n break;\n } else if (ch === '/' && peek() === '*') { /* css comment */\n var header = indentLevel === 0;\n\n if (isAfterNewline || header) {\n print.newLine();\n }\n\n output.push(eatComment());\n print.newLine();\n if (header) {\n print.newLine(true);\n }\n } else if (ch === '/' && peek() === '/') { // single line comment\n if (!isAfterNewline && last_top_ch !== '{') {\n print.trim();\n }\n print.singleSpace();\n output.push(eatComment());\n print.newLine();\n } else if (ch === '@') {\n print.preserveSingleSpace();\n\n // deal with less propery mixins @{...}\n if (peek() === '{') {\n output.push(eatString('}'));\n } else {\n output.push(ch);\n\n // strip trailing space, if present, for hash property checks\n var variableOrRule = peekString(\": ,;{}()[]/='\\\"\");\n\n if (variableOrRule.match(/[ :]$/)) {\n // we have a variable or pseudo-class, add it and insert one space before continuing\n next();\n variableOrRule = eatString(\": \").replace(/\\s$/, '');\n output.push(variableOrRule);\n print.singleSpace();\n }\n\n variableOrRule = variableOrRule.replace(/\\s$/, '');\n\n // might be a nesting at-rule\n if (variableOrRule in css_beautify.NESTED_AT_RULE) {\n nestedLevel += 1;\n if (variableOrRule in css_beautify.CONDITIONAL_GROUP_RULE) {\n enteringConditionalGroup = true;\n }\n }\n }\n } else if (ch === '#' && peek() === '{') {\n print.preserveSingleSpace();\n output.push(eatString('}'));\n } else if (ch === '{') {\n if (peek(true) === '}') {\n eatWhitespace();\n next();\n print.singleSpace();\n output.push(\"{\");\n print['}'](false);\n if (newlinesFromLastWSEat < 2 && newline_between_rules && indentLevel === 0) {\n print.newLine(true);\n }\n } else {\n indent();\n print[\"{\"](ch);\n // when entering conditional groups, only rulesets are allowed\n if (enteringConditionalGroup) {\n enteringConditionalGroup = false;\n insideRule = (indentLevel > nestedLevel);\n } else {\n // otherwise, declarations are also allowed\n insideRule = (indentLevel >= nestedLevel);\n }\n }\n } else if (ch === '}') {\n outdent();\n print[\"}\"](true);\n insideRule = false;\n insidePropertyValue = false;\n if (nestedLevel) {\n nestedLevel--;\n }\n if (newlinesFromLastWSEat < 2 && newline_between_rules && indentLevel === 0) {\n print.newLine(true);\n }\n } else if (ch === \":\") {\n eatWhitespace();\n if ((insideRule || enteringConditionalGroup) &&\n !(lookBack(\"&\") || foundNestedPseudoClass()) &&\n !lookBack(\"(\")) {\n // 'property: value' delimiter\n // which could be in a conditional group query\n output.push(':');\n if (!insidePropertyValue) {\n insidePropertyValue = true;\n print.singleSpace();\n }\n } else {\n // sass/less parent reference don't use a space\n // sass nested pseudo-class don't use a space\n\n // preserve space before pseudoclasses/pseudoelements, as it means \"in any child\"\n if (lookBack(\" \") && output[output.length - 1] !== \" \") {\n output.push(\" \");\n }\n if (peek() === \":\") {\n // pseudo-element\n next();\n output.push(\"::\");\n } else {\n // pseudo-class\n output.push(':');\n }\n }\n } else if (ch === '\"' || ch === '\\'') {\n print.preserveSingleSpace();\n output.push(eatString(ch));\n } else if (ch === ';') {\n insidePropertyValue = false;\n output.push(ch);\n if (!eatWhitespace(true)) {\n print.newLine();\n }\n } else if (ch === '(') { // may be a url\n if (lookBack(\"url\")) {\n output.push(ch);\n eatWhitespace();\n if (next()) {\n if (ch !== ')' && ch !== '\"' && ch !== '\\'') {\n output.push(eatString(')'));\n } else {\n pos--;\n }\n }\n } else {\n parenLevel++;\n print.preserveSingleSpace();\n output.push(ch);\n eatWhitespace();\n }\n } else if (ch === ')') {\n output.push(ch);\n parenLevel--;\n } else if (ch === ',') {\n output.push(ch);\n if (!eatWhitespace(true) && selectorSeparatorNewline && !insidePropertyValue && parenLevel < 1) {\n print.newLine();\n } else {\n print.singleSpace();\n }\n } else if ((ch === '>' || ch === '+' || ch === '~') &&\n !insidePropertyValue && parenLevel < 1) {\n //handle combinator spacing\n if (space_around_combinator) {\n print.singleSpace();\n output.push(ch);\n print.singleSpace();\n } else {\n output.push(ch);\n eatWhitespace();\n // squash extra whitespace\n if (ch && whiteRe.test(ch)) {\n ch = '';\n }\n }\n } else if (ch === ']') {\n output.push(ch);\n } else if (ch === '[') {\n print.preserveSingleSpace();\n output.push(ch);\n } else if (ch === '=') { // no whitespace before or after\n eatWhitespace();\n output.push('=');\n if (whiteRe.test(ch)) {\n ch = '';\n }\n } else {\n print.preserveSingleSpace();\n output.push(ch);\n }\n }\n\n\n var sweetCode = '';\n if (basebaseIndentString) {\n sweetCode += basebaseIndentString;\n }\n\n sweetCode += output.join('').replace(/[\\r\\n\\t ]+$/, '');\n\n // establish end_with_newline\n if (end_with_newline) {\n sweetCode += '\\n';\n }\n\n if (eol !== '\\n') {\n sweetCode = sweetCode.replace(/[\\n]/g, eol);\n }\n\n return sweetCode;\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/At-rule\n css_beautify.NESTED_AT_RULE = {\n \"@page\": true,\n \"@font-face\": true,\n \"@keyframes\": true,\n // also in CONDITIONAL_GROUP_RULE below\n \"@media\": true,\n \"@supports\": true,\n \"@document\": true\n };\n css_beautify.CONDITIONAL_GROUP_RULE = {\n \"@media\": true,\n \"@supports\": true,\n \"@document\": true\n };\n\n /*global define */\n if (typeof define === \"function\" && define.amd) {\n // Add support for AMD ( https://github.com/amdjs/amdjs-api/wiki/AMD#defineamd-property- )\n define([], function() {\n return {\n css_beautify: css_beautify\n };\n });\n } else if (typeof exports !== \"undefined\") {\n // Add support for CommonJS. Just put this file somewhere on your require.paths\n // and you will be able to `var html_beautify = require(\"beautify\").html_beautify`.\n exports.css_beautify = css_beautify;\n } else if (typeof window !== \"undefined\") {\n // If we're running a web page and don't have either of the above, add our one global\n window.css_beautify = css_beautify;\n } else if (typeof global !== \"undefined\") {\n // If we don't even have window, try global.\n global.css_beautify = css_beautify;\n }\n\n}());","/*jshint curly:true, eqeqeq:true, laxbreak:true, noempty:false */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n\n Style HTML\n---------------\n\n Written by Nochum Sossonko, (nsossonko@hotmail.com)\n\n Based on code initially developed by: Einar Lielmanis, \n http://jsbeautifier.org/\n\n Usage:\n style_html(html_source);\n\n style_html(html_source, options);\n\n The options are:\n indent_inner_html (default false) — indent and sections,\n indent_size (default 4) — indentation size,\n indent_char (default space) — character to indent with,\n wrap_line_length (default 250) - maximum amount of characters per line (0 = disable)\n brace_style (default \"collapse\") - \"collapse\" | \"expand\" | \"end-expand\" | \"none\"\n put braces on the same line as control statements (default), or put braces on own line (Allman / ANSI style), or just put end braces on own line, or attempt to keep them where they are.\n unformatted (defaults to inline tags) - list of tags, that shouldn't be reformatted\n content_unformatted (defaults to pre tag) - list of tags, that its content shouldn't be reformatted\n indent_scripts (default normal) - \"keep\"|\"separate\"|\"normal\"\n preserve_newlines (default true) - whether existing line breaks before elements should be preserved\n Only works before elements, not inside tags or for text.\n max_preserve_newlines (default unlimited) - maximum number of line breaks to be preserved in one chunk\n indent_handlebars (default false) - format and indent {{#foo}} and {{/foo}}\n end_with_newline (false) - end with a newline\n extra_liners (default [head,body,/html]) -List of tags that should have an extra newline before them.\n\n e.g.\n\n style_html(html_source, {\n 'indent_inner_html': false,\n 'indent_size': 2,\n 'indent_char': ' ',\n 'wrap_line_length': 78,\n 'brace_style': 'expand',\n 'preserve_newlines': true,\n 'max_preserve_newlines': 5,\n 'indent_handlebars': false,\n 'extra_liners': ['/html']\n });\n*/\n\n(function() {\n\n // function trim(s) {\n // return s.replace(/^\\s+|\\s+$/g, '');\n // }\n\n function ltrim(s) {\n return s.replace(/^\\s+/g, '');\n }\n\n function rtrim(s) {\n return s.replace(/\\s+$/g, '');\n }\n\n function mergeOpts(allOptions, targetType) {\n var finalOpts = {};\n var name;\n\n for (name in allOptions) {\n if (name !== targetType) {\n finalOpts[name] = allOptions[name];\n }\n }\n\n //merge in the per type settings for the targetType\n if (targetType in allOptions) {\n for (name in allOptions[targetType]) {\n finalOpts[name] = allOptions[targetType][name];\n }\n }\n return finalOpts;\n }\n\n var lineBreak = /\\r\\n|[\\n\\r\\u2028\\u2029]/;\n var allLineBreaks = new RegExp(lineBreak.source, 'g');\n\n function style_html(html_source, options, js_beautify, css_beautify) {\n //Wrapper function to invoke all the necessary constructors and deal with the output.\n\n var multi_parser,\n indent_inner_html,\n indent_body_inner_html,\n indent_head_inner_html,\n indent_size,\n indent_character,\n wrap_line_length,\n brace_style,\n unformatted,\n content_unformatted,\n preserve_newlines,\n max_preserve_newlines,\n indent_handlebars,\n wrap_attributes,\n wrap_attributes_indent_size,\n is_wrap_attributes_force,\n is_wrap_attributes_force_expand_multiline,\n is_wrap_attributes_force_aligned,\n end_with_newline,\n extra_liners,\n eol;\n\n options = options || {};\n\n // Allow the setting of language/file-type specific options\n // with inheritance of overall settings\n options = mergeOpts(options, 'html');\n\n // backwards compatibility to 1.3.4\n if ((options.wrap_line_length === undefined || parseInt(options.wrap_line_length, 10) === 0) &&\n (options.max_char !== undefined && parseInt(options.max_char, 10) !== 0)) {\n options.wrap_line_length = options.max_char;\n }\n\n indent_inner_html = (options.indent_inner_html === undefined) ? false : options.indent_inner_html;\n indent_body_inner_html = (options.indent_body_inner_html === undefined) ? true : options.indent_body_inner_html;\n indent_head_inner_html = (options.indent_head_inner_html === undefined) ? true : options.indent_head_inner_html;\n indent_size = (options.indent_size === undefined) ? 4 : parseInt(options.indent_size, 10);\n indent_character = (options.indent_char === undefined) ? ' ' : options.indent_char;\n brace_style = (options.brace_style === undefined) ? 'collapse' : options.brace_style;\n wrap_line_length = parseInt(options.wrap_line_length, 10) === 0 ? 32786 : parseInt(options.wrap_line_length || 250, 10);\n unformatted = options.unformatted || [\n // https://www.w3.org/TR/html5/dom.html#phrasing-content\n 'a', 'abbr', 'area', 'audio', 'b', 'bdi', 'bdo', 'br', 'button', 'canvas', 'cite',\n 'code', 'data', 'datalist', 'del', 'dfn', 'em', 'embed', 'i', 'iframe', 'img',\n 'input', 'ins', 'kbd', 'keygen', 'label', 'map', 'mark', 'math', 'meter', 'noscript',\n 'object', 'output', 'progress', 'q', 'ruby', 's', 'samp', /* 'script', */ 'select', 'small',\n 'span', 'strong', 'sub', 'sup', 'svg', 'template', 'textarea', 'time', 'u', 'var',\n 'video', 'wbr', 'text',\n // prexisting - not sure of full effect of removing, leaving in\n 'acronym', 'address', 'big', 'dt', 'ins', 'strike', 'tt',\n ];\n content_unformatted = options.content_unformatted || [\n 'pre',\n ];\n preserve_newlines = (options.preserve_newlines === undefined) ? true : options.preserve_newlines;\n max_preserve_newlines = preserve_newlines ?\n (isNaN(parseInt(options.max_preserve_newlines, 10)) ? 32786 : parseInt(options.max_preserve_newlines, 10)) :\n 0;\n indent_handlebars = (options.indent_handlebars === undefined) ? false : options.indent_handlebars;\n wrap_attributes = (options.wrap_attributes === undefined) ? 'auto' : options.wrap_attributes;\n wrap_attributes_indent_size = (isNaN(parseInt(options.wrap_attributes_indent_size, 10))) ? indent_size : parseInt(options.wrap_attributes_indent_size, 10);\n is_wrap_attributes_force = wrap_attributes.substr(0, 'force'.length) === 'force';\n is_wrap_attributes_force_expand_multiline = (wrap_attributes === 'force-expand-multiline');\n is_wrap_attributes_force_aligned = (wrap_attributes === 'force-aligned');\n end_with_newline = (options.end_with_newline === undefined) ? false : options.end_with_newline;\n extra_liners = (typeof options.extra_liners === 'object') && options.extra_liners ?\n options.extra_liners.concat() : (typeof options.extra_liners === 'string') ?\n options.extra_liners.split(',') : 'head,body,/html'.split(',');\n eol = options.eol ? options.eol : 'auto';\n\n if (options.indent_with_tabs) {\n indent_character = '\\t';\n indent_size = 1;\n }\n\n if (eol === 'auto') {\n eol = '\\n';\n if (html_source && lineBreak.test(html_source || '')) {\n eol = html_source.match(lineBreak)[0];\n }\n }\n\n eol = eol.replace(/\\\\r/, '\\r').replace(/\\\\n/, '\\n');\n\n // HACK: newline parsing inconsistent. This brute force normalizes the input.\n html_source = html_source.replace(allLineBreaks, '\\n');\n\n function Parser() {\n\n this.pos = 0; //Parser position\n this.token = '';\n this.current_mode = 'CONTENT'; //reflects the current Parser mode: TAG/CONTENT\n this.tags = { //An object to hold tags, their position, and their parent-tags, initiated with default values\n parent: 'parent1',\n parentcount: 1,\n parent1: ''\n };\n this.tag_type = '';\n this.token_text = this.last_token = this.last_text = this.token_type = '';\n this.newlines = 0;\n this.indent_content = indent_inner_html;\n this.indent_body_inner_html = indent_body_inner_html;\n this.indent_head_inner_html = indent_head_inner_html;\n\n this.Utils = { //Uilities made available to the various functions\n whitespace: \"\\n\\r\\t \".split(''),\n\n single_token: options.void_elements || [\n // HTLM void elements - aka self-closing tags - aka singletons\n // https://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen',\n 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr',\n // NOTE: Optional tags - are not understood.\n // https://www.w3.org/TR/html5/syntax.html#optional-tags\n // The rules for optional tags are too complex for a simple list\n // Also, the content of these tags should still be indented in many cases.\n // 'li' is a good exmple.\n\n // Doctype and xml elements\n '!doctype', '?xml',\n // ?php tag\n '?php',\n // other tags that were in this list, keeping just in case\n 'basefont', 'isindex'\n ],\n extra_liners: extra_liners, //for tags that need a line of whitespace before them\n in_array: function(what, arr) {\n for (var i = 0; i < arr.length; i++) {\n if (what === arr[i]) {\n return true;\n }\n }\n return false;\n }\n };\n\n // Return true if the given text is composed entirely of whitespace.\n this.is_whitespace = function(text) {\n for (var n = 0; n < text.length; n++) {\n if (!this.Utils.in_array(text.charAt(n), this.Utils.whitespace)) {\n return false;\n }\n }\n return true;\n };\n\n this.traverse_whitespace = function() {\n var input_char = '';\n\n input_char = this.input.charAt(this.pos);\n if (this.Utils.in_array(input_char, this.Utils.whitespace)) {\n this.newlines = 0;\n while (this.Utils.in_array(input_char, this.Utils.whitespace)) {\n if (preserve_newlines && input_char === '\\n' && this.newlines <= max_preserve_newlines) {\n this.newlines += 1;\n }\n\n this.pos++;\n input_char = this.input.charAt(this.pos);\n }\n return true;\n }\n return false;\n };\n\n // Append a space to the given content (string array) or, if we are\n // at the wrap_line_length, append a newline/indentation.\n // return true if a newline was added, false if a space was added\n this.space_or_wrap = function(content) {\n if (this.line_char_count >= this.wrap_line_length) { //insert a line when the wrap_line_length is reached\n this.print_newline(false, content);\n this.print_indentation(content);\n return true;\n } else {\n this.line_char_count++;\n content.push(' ');\n return false;\n }\n };\n\n this.get_content = function() { //function to capture regular content between tags\n var input_char = '',\n content = [],\n handlebarsStarted = 0;\n\n while (this.input.charAt(this.pos) !== '<' || handlebarsStarted === 2) {\n if (this.pos >= this.input.length) {\n return content.length ? content.join('') : ['', 'TK_EOF'];\n }\n\n if (handlebarsStarted < 2 && this.traverse_whitespace()) {\n this.space_or_wrap(content);\n continue;\n }\n\n input_char = this.input.charAt(this.pos);\n\n if (indent_handlebars) {\n if (input_char === '{') {\n handlebarsStarted += 1;\n } else if (handlebarsStarted < 2) {\n handlebarsStarted = 0;\n }\n\n if (input_char === '}' && handlebarsStarted > 0) {\n if (handlebarsStarted-- === 0) {\n break;\n }\n }\n // Handlebars parsing is complicated.\n // {{#foo}} and {{/foo}} are formatted tags.\n // {{something}} should get treated as content, except:\n // {{else}} specifically behaves like {{#if}} and {{/if}}\n var peek3 = this.input.substr(this.pos, 3);\n if (peek3 === '{{#' || peek3 === '{{/') {\n // These are tags and not content.\n break;\n } else if (peek3 === '{{!') {\n return [this.get_tag(), 'TK_TAG_HANDLEBARS_COMMENT'];\n } else if (this.input.substr(this.pos, 2) === '{{') {\n if (this.get_tag(true) === '{{else}}') {\n break;\n }\n }\n }\n\n this.pos++;\n this.line_char_count++;\n content.push(input_char); //letter at-a-time (or string) inserted to an array\n }\n return content.length ? content.join('') : '';\n };\n\n this.get_contents_to = function(name) { //get the full content of a script or style to pass to js_beautify\n if (this.pos === this.input.length) {\n return ['', 'TK_EOF'];\n }\n var content = '';\n var reg_match = new RegExp('', 'igm');\n reg_match.lastIndex = this.pos;\n var reg_array = reg_match.exec(this.input);\n var end_script = reg_array ? reg_array.index : this.input.length; //absolute end of script\n if (this.pos < end_script) { //get everything in between the script tags\n content = this.input.substring(this.pos, end_script);\n this.pos = end_script;\n }\n return content;\n };\n\n this.record_tag = function(tag) { //function to record a tag and its parent in this.tags Object\n if (this.tags[tag + 'count']) { //check for the existence of this tag type\n this.tags[tag + 'count']++;\n this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level\n } else { //otherwise initialize this tag type\n this.tags[tag + 'count'] = 1;\n this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level\n }\n this.tags[tag + this.tags[tag + 'count'] + 'parent'] = this.tags.parent; //set the parent (i.e. in the case of a div this.tags.div1parent)\n this.tags.parent = tag + this.tags[tag + 'count']; //and make this the current parent (i.e. in the case of a div 'div1')\n };\n\n this.retrieve_tag = function(tag) { //function to retrieve the opening tag to the corresponding closer\n if (this.tags[tag + 'count']) { //if the openener is not in the Object we ignore it\n var temp_parent = this.tags.parent; //check to see if it's a closable tag.\n while (temp_parent) { //till we reach '' (the initial value);\n if (tag + this.tags[tag + 'count'] === temp_parent) { //if this is it use it\n break;\n }\n temp_parent = this.tags[temp_parent + 'parent']; //otherwise keep on climbing up the DOM Tree\n }\n if (temp_parent) { //if we caught something\n this.indent_level = this.tags[tag + this.tags[tag + 'count']]; //set the indent_level accordingly\n this.tags.parent = this.tags[temp_parent + 'parent']; //and set the current parent\n }\n delete this.tags[tag + this.tags[tag + 'count'] + 'parent']; //delete the closed tags parent reference...\n delete this.tags[tag + this.tags[tag + 'count']]; //...and the tag itself\n if (this.tags[tag + 'count'] === 1) {\n delete this.tags[tag + 'count'];\n } else {\n this.tags[tag + 'count']--;\n }\n }\n };\n\n this.indent_to_tag = function(tag) {\n // Match the indentation level to the last use of this tag, but don't remove it.\n if (!this.tags[tag + 'count']) {\n return;\n }\n var temp_parent = this.tags.parent;\n while (temp_parent) {\n if (tag + this.tags[tag + 'count'] === temp_parent) {\n break;\n }\n temp_parent = this.tags[temp_parent + 'parent'];\n }\n if (temp_parent) {\n this.indent_level = this.tags[tag + this.tags[tag + 'count']];\n }\n };\n\n this.get_tag = function(peek) { //function to get a full tag and parse its type\n var input_char = '',\n content = [],\n comment = '',\n space = false,\n first_attr = true,\n has_wrapped_attrs = false,\n tag_start, tag_end,\n tag_start_char,\n orig_pos = this.pos,\n orig_line_char_count = this.line_char_count,\n is_tag_closed = false,\n tail;\n\n peek = peek !== undefined ? peek : false;\n\n do {\n if (this.pos >= this.input.length) {\n if (peek) {\n this.pos = orig_pos;\n this.line_char_count = orig_line_char_count;\n }\n return content.length ? content.join('') : ['', 'TK_EOF'];\n }\n\n input_char = this.input.charAt(this.pos);\n this.pos++;\n\n if (this.Utils.in_array(input_char, this.Utils.whitespace)) { //don't want to insert unnecessary space\n space = true;\n continue;\n }\n\n if (input_char === \"'\" || input_char === '\"') {\n input_char += this.get_unformatted(input_char);\n space = true;\n }\n\n if (input_char === '=') { //no space before =\n space = false;\n }\n tail = this.input.substr(this.pos - 1);\n if (is_wrap_attributes_force_expand_multiline && has_wrapped_attrs && !is_tag_closed && (input_char === '>' || input_char === '/')) {\n if (tail.match(/^\\/?\\s*>/)) {\n space = false;\n is_tag_closed = true;\n this.print_newline(false, content);\n this.print_indentation(content);\n }\n }\n if (content.length && content[content.length - 1] !== '=' && input_char !== '>' && space) {\n //no space after = or before >\n var wrapped = this.space_or_wrap(content);\n var indentAttrs = wrapped && input_char !== '/' && !is_wrap_attributes_force;\n space = false;\n\n if (is_wrap_attributes_force && input_char !== '/') {\n var force_first_attr_wrap = false;\n if (is_wrap_attributes_force_expand_multiline && first_attr) {\n var is_only_attribute = tail.match(/^\\S*(=\"([^\"]|\\\\\")*\")?\\s*\\/?\\s*>/) !== null;\n force_first_attr_wrap = !is_only_attribute;\n }\n if (!first_attr || force_first_attr_wrap) {\n this.print_newline(false, content);\n this.print_indentation(content);\n indentAttrs = true;\n }\n }\n if (indentAttrs) {\n has_wrapped_attrs = true;\n\n //indent attributes an auto, forced, or forced-align line-wrap\n var alignment_size = wrap_attributes_indent_size;\n if (is_wrap_attributes_force_aligned) {\n alignment_size = content.indexOf(' ') + 1;\n }\n\n for (var count = 0; count < alignment_size; count++) {\n // only ever further indent with spaces since we're trying to align characters\n content.push(' ');\n }\n }\n if (first_attr) {\n for (var i = 0; i < content.length; i++) {\n if (content[i] === ' ') {\n first_attr = false;\n break;\n }\n }\n }\n }\n\n if (indent_handlebars && tag_start_char === '<') {\n // When inside an angle-bracket tag, put spaces around\n // handlebars not inside of strings.\n if ((input_char + this.input.charAt(this.pos)) === '{{') {\n input_char += this.get_unformatted('}}');\n if (content.length && content[content.length - 1] !== ' ' && content[content.length - 1] !== '<') {\n input_char = ' ' + input_char;\n }\n space = true;\n }\n }\n\n if (input_char === '<' && !tag_start_char) {\n tag_start = this.pos - 1;\n tag_start_char = '<';\n }\n\n if (indent_handlebars && !tag_start_char) {\n if (content.length >= 2 && content[content.length - 1] === '{' && content[content.length - 2] === '{') {\n if (input_char === '#' || input_char === '/' || input_char === '!') {\n tag_start = this.pos - 3;\n } else {\n tag_start = this.pos - 2;\n }\n tag_start_char = '{';\n }\n }\n\n this.line_char_count++;\n content.push(input_char); //inserts character at-a-time (or string)\n\n if (content[1] && (content[1] === '!' || content[1] === '?' || content[1] === '%')) { //if we're in a comment, do something special\n // We treat all comments as literals, even more than preformatted tags\n // we just look for the appropriate close tag\n content = [this.get_comment(tag_start)];\n break;\n }\n\n if (indent_handlebars && content[1] && content[1] === '{' && content[2] && content[2] === '!') { //if we're in a comment, do something special\n // We treat all comments as literals, even more than preformatted tags\n // we just look for the appropriate close tag\n content = [this.get_comment(tag_start)];\n break;\n }\n\n if (indent_handlebars && tag_start_char === '{' && content.length > 2 && content[content.length - 2] === '}' && content[content.length - 1] === '}') {\n break;\n }\n } while (input_char !== '>');\n\n var tag_complete = content.join('');\n var tag_index;\n var tag_offset;\n\n // must check for space first otherwise the tag could have the first attribute included, and\n // then not un-indent correctly\n if (tag_complete.indexOf(' ') !== -1) { //if there's whitespace, thats where the tag name ends\n tag_index = tag_complete.indexOf(' ');\n } else if (tag_complete.indexOf('\\n') !== -1) { //if there's a line break, thats where the tag name ends\n tag_index = tag_complete.indexOf('\\n');\n } else if (tag_complete.charAt(0) === '{') {\n tag_index = tag_complete.indexOf('}');\n } else { //otherwise go with the tag ending\n tag_index = tag_complete.indexOf('>');\n }\n if (tag_complete.charAt(0) === '<' || !indent_handlebars) {\n tag_offset = 1;\n } else {\n tag_offset = tag_complete.charAt(2) === '#' ? 3 : 2;\n }\n var tag_check = tag_complete.substring(tag_offset, tag_index).toLowerCase();\n if (tag_complete.charAt(tag_complete.length - 2) === '/' ||\n this.Utils.in_array(tag_check, this.Utils.single_token)) { //if this tag name is a single tag type (either in the list or has a closing /)\n if (!peek) {\n this.tag_type = 'SINGLE';\n }\n } else if (indent_handlebars && tag_complete.charAt(0) === '{' && tag_check === 'else') {\n if (!peek) {\n this.indent_to_tag('if');\n this.tag_type = 'HANDLEBARS_ELSE';\n this.indent_content = true;\n this.traverse_whitespace();\n }\n } else if (this.is_unformatted(tag_check, unformatted) ||\n this.is_unformatted(tag_check, content_unformatted)) {\n // do not reformat the \"unformatted\" or \"content_unformatted\" tags\n comment = this.get_unformatted('', tag_complete); //...delegate to get_unformatted function\n content.push(comment);\n tag_end = this.pos - 1;\n this.tag_type = 'SINGLE';\n } else if (tag_check === 'script' &&\n (tag_complete.search('type') === -1 ||\n (tag_complete.search('type') > -1 &&\n tag_complete.search(/\\b(text|application|dojo)\\/(x-)?(javascript|ecmascript|jscript|livescript|(ld\\+)?json|method|aspect)/) > -1))) {\n if (!peek) {\n this.record_tag(tag_check);\n this.tag_type = 'SCRIPT';\n }\n } else if (tag_check === 'style' &&\n (tag_complete.search('type') === -1 ||\n (tag_complete.search('type') > -1 && tag_complete.search('text/css') > -1))) {\n if (!peek) {\n this.record_tag(tag_check);\n this.tag_type = 'STYLE';\n }\n } else if (tag_check.charAt(0) === '!') { //peek for ',\n matched = false;\n\n this.pos = start_pos;\n var input_char = this.input.charAt(this.pos);\n this.pos++;\n\n while (this.pos <= this.input.length) {\n comment += input_char;\n\n // only need to check for the delimiter if the last chars match\n if (comment.charAt(comment.length - 1) === delimiter.charAt(delimiter.length - 1) &&\n comment.indexOf(delimiter) !== -1) {\n break;\n }\n\n // only need to search for custom delimiter for the first few characters\n if (!matched && comment.length < 10) {\n if (comment.indexOf('';\n matched = true;\n } else if (comment.indexOf('';\n matched = true;\n } else if (comment.indexOf('';\n matched = true;\n } else if (comment.indexOf('';\n matched = true;\n } else if (comment.indexOf('{{!--') === 0) { // {{!-- handlebars comment\n delimiter = '--}}';\n matched = true;\n } else if (comment.indexOf('{{!') === 0) { // {{! handlebars comment\n if (comment.length === 5 && comment.indexOf('{{!--') === -1) {\n delimiter = '}}';\n matched = true;\n }\n } else if (comment.indexOf('';\n matched = true;\n } else if (comment.indexOf('<%') === 0) { // {{! handlebars comment\n delimiter = '%>';\n matched = true;\n }\n }\n\n input_char = this.input.charAt(this.pos);\n this.pos++;\n }\n\n return comment;\n };\n\n function tokenMatcher(delimiter) {\n var token = '';\n\n var add = function(str) {\n var newToken = token + str.toLowerCase();\n token = newToken.length <= delimiter.length ? newToken : newToken.substr(newToken.length - delimiter.length, delimiter.length);\n };\n\n var doesNotMatch = function() {\n return token.indexOf(delimiter) === -1;\n };\n\n return {\n add: add,\n doesNotMatch: doesNotMatch\n };\n }\n\n this.get_unformatted = function(delimiter, orig_tag) { //function to return unformatted content in its entirety\n if (orig_tag && orig_tag.toLowerCase().indexOf(delimiter) !== -1) {\n return '';\n }\n var input_char = '';\n var content = '';\n var space = true;\n\n var delimiterMatcher = tokenMatcher(delimiter);\n\n do {\n\n if (this.pos >= this.input.length) {\n return content;\n }\n\n input_char = this.input.charAt(this.pos);\n this.pos++;\n\n if (this.Utils.in_array(input_char, this.Utils.whitespace)) {\n if (!space) {\n this.line_char_count--;\n continue;\n }\n if (input_char === '\\n' || input_char === '\\r') {\n content += '\\n';\n /* Don't change tab indention for unformatted blocks. If using code for html editing, this will greatly affect
 tags if they are specified in the 'unformatted array'\n                for (var i=0; i]*>\\s*$/);\n\n                // if next_tag comes back but is not an isolated tag, then\n                // let's treat the 'a' tag as having content\n                // and respect the unformatted option\n                if (!tag || this.Utils.in_array(tag[1], unformatted)) {\n                    return true;\n                } else {\n                    return false;\n                }\n            };\n\n            this.printer = function(js_source, indent_character, indent_size, wrap_line_length, brace_style) { //handles input/output and some other printing functions\n\n                this.input = js_source || ''; //gets the input for the Parser\n\n                // HACK: newline parsing inconsistent. This brute force normalizes the input.\n                this.input = this.input.replace(/\\r\\n|[\\r\\u2028\\u2029]/g, '\\n');\n\n                this.output = [];\n                this.indent_character = indent_character;\n                this.indent_string = '';\n                this.indent_size = indent_size;\n                this.brace_style = brace_style;\n                this.indent_level = 0;\n                this.wrap_line_length = wrap_line_length;\n                this.line_char_count = 0; //count to see if wrap_line_length was exceeded\n\n                for (var i = 0; i < this.indent_size; i++) {\n                    this.indent_string += this.indent_character;\n                }\n\n                this.print_newline = function(force, arr) {\n                    this.line_char_count = 0;\n                    if (!arr || !arr.length) {\n                        return;\n                    }\n                    if (force || (arr[arr.length - 1] !== '\\n')) { //we might want the extra line\n                        if ((arr[arr.length - 1] !== '\\n')) {\n                            arr[arr.length - 1] = rtrim(arr[arr.length - 1]);\n                        }\n                        arr.push('\\n');\n                    }\n                };\n\n                this.print_indentation = function(arr) {\n                    for (var i = 0; i < this.indent_level; i++) {\n                        arr.push(this.indent_string);\n                        this.line_char_count += this.indent_string.length;\n                    }\n                };\n\n                this.print_token = function(text) {\n                    // Avoid printing initial whitespace.\n                    if (this.is_whitespace(text) && !this.output.length) {\n                        return;\n                    }\n                    if (text || text !== '') {\n                        if (this.output.length && this.output[this.output.length - 1] === '\\n') {\n                            this.print_indentation(this.output);\n                            text = ltrim(text);\n                        }\n                    }\n                    this.print_token_raw(text);\n                };\n\n                this.print_token_raw = function(text) {\n                    // If we are going to print newlines, truncate trailing\n                    // whitespace, as the newlines will represent the space.\n                    if (this.newlines > 0) {\n                        text = rtrim(text);\n                    }\n\n                    if (text && text !== '') {\n                        if (text.length > 1 && text.charAt(text.length - 1) === '\\n') {\n                            // unformatted tags can grab newlines as their last character\n                            this.output.push(text.slice(0, -1));\n                            this.print_newline(false, this.output);\n                        } else {\n                            this.output.push(text);\n                        }\n                    }\n\n                    for (var n = 0; n < this.newlines; n++) {\n                        this.print_newline(n > 0, this.output);\n                    }\n                    this.newlines = 0;\n                };\n\n                this.indent = function() {\n                    this.indent_level++;\n                };\n\n                this.unindent = function() {\n                    if (this.indent_level > 0) {\n                        this.indent_level--;\n                    }\n                };\n            };\n            return this;\n        }\n\n        /*_____________________--------------------_____________________*/\n\n        multi_parser = new Parser(); //wrapping functions Parser\n        multi_parser.printer(html_source, indent_character, indent_size, wrap_line_length, brace_style); //initialize starting values\n\n        while (true) {\n            var t = multi_parser.get_token();\n            multi_parser.token_text = t[0];\n            multi_parser.token_type = t[1];\n\n            if (multi_parser.token_type === 'TK_EOF') {\n                break;\n            }\n\n            switch (multi_parser.token_type) {\n                case 'TK_TAG_START':\n                    multi_parser.print_newline(false, multi_parser.output);\n                    multi_parser.print_token(multi_parser.token_text);\n                    if (multi_parser.indent_content) {\n                        if ((multi_parser.indent_body_inner_html || !multi_parser.token_text.match(//)) &&\n                            (multi_parser.indent_head_inner_html || !multi_parser.token_text.match(//))) {\n\n                            multi_parser.indent();\n                        }\n\n                        multi_parser.indent_content = false;\n                    }\n                    multi_parser.current_mode = 'CONTENT';\n                    break;\n                case 'TK_TAG_STYLE':\n                case 'TK_TAG_SCRIPT':\n                    multi_parser.print_newline(false, multi_parser.output);\n                    multi_parser.print_token(multi_parser.token_text);\n                    multi_parser.current_mode = 'CONTENT';\n                    break;\n                case 'TK_TAG_END':\n                    //Print new line only if the tag has no content and has child\n                    if (multi_parser.last_token === 'TK_CONTENT' && multi_parser.last_text === '') {\n                        var tag_name = (multi_parser.token_text.match(/\\w+/) || [])[0];\n                        var tag_extracted_from_last_output = null;\n                        if (multi_parser.output.length) {\n                            tag_extracted_from_last_output = multi_parser.output[multi_parser.output.length - 1].match(/(?:<|{{#)\\s*(\\w+)/);\n                        }\n                        if (tag_extracted_from_last_output === null ||\n                            (tag_extracted_from_last_output[1] !== tag_name && !multi_parser.Utils.in_array(tag_extracted_from_last_output[1], unformatted))) {\n                            multi_parser.print_newline(false, multi_parser.output);\n                        }\n                    }\n                    multi_parser.print_token(multi_parser.token_text);\n                    multi_parser.current_mode = 'CONTENT';\n                    break;\n                case 'TK_TAG_SINGLE':\n                    // Don't add a newline before elements that should remain unformatted.\n                    var tag_check = multi_parser.token_text.match(/^\\s*<([a-z-]+)/i);\n                    if (!tag_check || !multi_parser.Utils.in_array(tag_check[1], unformatted)) {\n                        multi_parser.print_newline(false, multi_parser.output);\n                    }\n                    multi_parser.print_token(multi_parser.token_text);\n                    multi_parser.current_mode = 'CONTENT';\n                    break;\n                case 'TK_TAG_HANDLEBARS_ELSE':\n                    // Don't add a newline if opening {{#if}} tag is on the current line\n                    var foundIfOnCurrentLine = false;\n                    for (var lastCheckedOutput = multi_parser.output.length - 1; lastCheckedOutput >= 0; lastCheckedOutput--) {\n                        if (multi_parser.output[lastCheckedOutput] === '\\n') {\n                            break;\n                        } else {\n                            if (multi_parser.output[lastCheckedOutput].match(/{{#if/)) {\n                                foundIfOnCurrentLine = true;\n                                break;\n                            }\n                        }\n                    }\n                    if (!foundIfOnCurrentLine) {\n                        multi_parser.print_newline(false, multi_parser.output);\n                    }\n                    multi_parser.print_token(multi_parser.token_text);\n                    if (multi_parser.indent_content) {\n                        multi_parser.indent();\n                        multi_parser.indent_content = false;\n                    }\n                    multi_parser.current_mode = 'CONTENT';\n                    break;\n                case 'TK_TAG_HANDLEBARS_COMMENT':\n                    multi_parser.print_token(multi_parser.token_text);\n                    multi_parser.current_mode = 'TAG';\n                    break;\n                case 'TK_CONTENT':\n                    multi_parser.print_token(multi_parser.token_text);\n                    multi_parser.current_mode = 'TAG';\n                    break;\n                case 'TK_STYLE':\n                case 'TK_SCRIPT':\n                    if (multi_parser.token_text !== '') {\n                        multi_parser.print_newline(false, multi_parser.output);\n                        var text = multi_parser.token_text,\n                            _beautifier,\n                            script_indent_level = 1;\n                        if (multi_parser.token_type === 'TK_SCRIPT') {\n                            _beautifier = typeof js_beautify === 'function' && js_beautify;\n                        } else if (multi_parser.token_type === 'TK_STYLE') {\n                            _beautifier = typeof css_beautify === 'function' && css_beautify;\n                        }\n\n                        if (options.indent_scripts === \"keep\") {\n                            script_indent_level = 0;\n                        } else if (options.indent_scripts === \"separate\") {\n                            script_indent_level = -multi_parser.indent_level;\n                        }\n\n                        var indentation = multi_parser.get_full_indent(script_indent_level);\n                        if (_beautifier) {\n\n                            // call the Beautifier if avaliable\n                            var Child_options = function() {\n                                this.eol = '\\n';\n                            };\n                            Child_options.prototype = options;\n                            var child_options = new Child_options();\n                            text = _beautifier(text.replace(/^\\s*/, indentation), child_options);\n                        } else {\n                            // simply indent the string otherwise\n                            var white = text.match(/^\\s*/)[0];\n                            var _level = white.match(/[^\\n\\r]*$/)[0].split(multi_parser.indent_string).length - 1;\n                            var reindent = multi_parser.get_full_indent(script_indent_level - _level);\n                            text = text.replace(/^\\s*/, indentation)\n                                .replace(/\\r\\n|\\r|\\n/g, '\\n' + reindent)\n                                .replace(/\\s+$/, '');\n                        }\n                        if (text) {\n                            multi_parser.print_token_raw(text);\n                            multi_parser.print_newline(true, multi_parser.output);\n                        }\n                    }\n                    multi_parser.current_mode = 'TAG';\n                    break;\n                default:\n                    // We should not be getting here but we don't want to drop input on the floor\n                    // Just output the text and move on\n                    if (multi_parser.token_text !== '') {\n                        multi_parser.print_token(multi_parser.token_text);\n                    }\n                    break;\n            }\n            multi_parser.last_token = multi_parser.token_type;\n            multi_parser.last_text = multi_parser.token_text;\n        }\n        var sweet_code = multi_parser.output.join('').replace(/[\\r\\n\\t ]+$/, '');\n\n        // establish end_with_newline\n        if (end_with_newline) {\n            sweet_code += '\\n';\n        }\n\n        if (eol !== '\\n') {\n            sweet_code = sweet_code.replace(/[\\n]/g, eol);\n        }\n\n        return sweet_code;\n    }\n\n    if (typeof define === \"function\" && define.amd) {\n        // Add support for AMD ( https://github.com/amdjs/amdjs-api/wiki/AMD#defineamd-property- )\n        define([\"require\", \"./beautify\", \"./beautify-css\"], function(requireamd) {\n            var js_beautify = requireamd(\"./beautify\");\n            var css_beautify = requireamd(\"./beautify-css\");\n\n            return {\n                html_beautify: function(html_source, options) {\n                    return style_html(html_source, options, js_beautify.js_beautify, css_beautify.css_beautify);\n                }\n            };\n        });\n    } else if (typeof exports !== \"undefined\") {\n        // Add support for CommonJS. Just put this file somewhere on your require.paths\n        // and you will be able to `var html_beautify = require(\"beautify\").html_beautify`.\n        var js_beautify = require('./beautify.js');\n        var css_beautify = require('./beautify-css.js');\n\n        exports.html_beautify = function(html_source, options) {\n            return style_html(html_source, options, js_beautify.js_beautify, css_beautify.css_beautify);\n        };\n    } else if (typeof window !== \"undefined\") {\n        // If we're running a web page and don't have either of the above, add our one global\n        window.html_beautify = function(html_source, options) {\n            return style_html(html_source, options, window.js_beautify, window.css_beautify);\n        };\n    } else if (typeof global !== \"undefined\") {\n        // If we don't even have window, try global.\n        global.html_beautify = function(html_source, options) {\n            return style_html(html_source, options, global.js_beautify, global.css_beautify);\n        };\n    }\n\n}());","/*jshint curly:true, eqeqeq:true, laxbreak:true, noempty:false */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n\n JS Beautifier\n---------------\n\n\n  Written by Einar Lielmanis, \n      http://jsbeautifier.org/\n\n  Originally converted to javascript by Vital, \n  \"End braces on own line\" added by Chris J. Shull, \n  Parsing improvements for brace-less statements by Liam Newman \n\n\n  Usage:\n    js_beautify(js_source_text);\n    js_beautify(js_source_text, options);\n\n  The options are:\n    indent_size (default 4)          - indentation size,\n    indent_char (default space)      - character to indent with,\n    preserve_newlines (default true) - whether existing line breaks should be preserved,\n    max_preserve_newlines (default unlimited) - maximum number of line breaks to be preserved in one chunk,\n\n    jslint_happy (default false) - if true, then jslint-stricter mode is enforced.\n\n            jslint_happy        !jslint_happy\n            ---------------------------------\n            function ()         function()\n\n            switch () {         switch() {\n            case 1:               case 1:\n              break;                break;\n            }                   }\n\n    space_after_anon_function (default false) - should the space before an anonymous function's parens be added, \"function()\" vs \"function ()\",\n          NOTE: This option is overriden by jslint_happy (i.e. if jslint_happy is true, space_after_anon_function is true by design)\n\n    brace_style (default \"collapse\") - \"collapse\" | \"expand\" | \"end-expand\" | \"none\" | any of the former + \",preserve-inline\"\n            put braces on the same line as control statements (default), or put braces on own line (Allman / ANSI style), or just put end braces on own line, or attempt to keep them where they are.\n            preserve-inline will try to preserve inline blocks of curly braces\n\n    space_before_conditional (default true) - should the space before conditional statement be added, \"if(true)\" vs \"if (true)\",\n\n    unescape_strings (default false) - should printable characters in strings encoded in \\xNN notation be unescaped, \"example\" vs \"\\x65\\x78\\x61\\x6d\\x70\\x6c\\x65\"\n\n    wrap_line_length (default unlimited) - lines should wrap at next opportunity after this number of characters.\n          NOTE: This is not a hard limit. Lines will continue until a point where a newline would\n                be preserved if it were present.\n\n    end_with_newline (default false)  - end output with a newline\n\n\n    e.g\n\n    js_beautify(js_source_text, {\n      'indent_size': 1,\n      'indent_char': '\\t'\n    });\n\n*/\n\n// Object.values polyfill found here:\n// http://tokenposts.blogspot.com.au/2012/04/javascript-objectkeys-browser.html\nif (!Object.values) {\n    Object.values = function(o) {\n        if (o !== Object(o)) {\n            throw new TypeError('Object.values called on a non-object');\n        }\n        var k = [],\n            p;\n        for (p in o) {\n            if (Object.prototype.hasOwnProperty.call(o, p)) {\n                k.push(o[p]);\n            }\n        }\n        return k;\n    };\n}\n\n(function() {\n\n    function mergeOpts(allOptions, targetType) {\n        var finalOpts = {};\n        var name;\n\n        for (name in allOptions) {\n            if (name !== targetType) {\n                finalOpts[name] = allOptions[name];\n            }\n        }\n\n        //merge in the per type settings for the targetType\n        if (targetType in allOptions) {\n            for (name in allOptions[targetType]) {\n                finalOpts[name] = allOptions[targetType][name];\n            }\n        }\n        return finalOpts;\n    }\n\n    function js_beautify(js_source_text, options) {\n\n        var acorn = {};\n        (function(exports) {\n            /* jshint curly: false */\n            // This section of code is taken from acorn.\n            //\n            // Acorn was written by Marijn Haverbeke and released under an MIT\n            // license. The Unicode regexps (for identifiers and whitespace) were\n            // taken from [Esprima](http://esprima.org) by Ariya Hidayat.\n            //\n            // Git repositories for Acorn are available at\n            //\n            //     http://marijnhaverbeke.nl/git/acorn\n            //     https://github.com/marijnh/acorn.git\n\n            // ## Character categories\n\n            // Big ugly regular expressions that match characters in the\n            // whitespace, identifier, and identifier-start categories. These\n            // are only applied when a character is found to actually have a\n            // code point above 128.\n\n            var nonASCIIwhitespace = /[\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/; // jshint ignore:line\n            var nonASCIIidentifierStartChars = \"\\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\\u16ee-\\u16f0\\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\\u2160-\\u2188\\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-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\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-\\ua6ef\\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\";\n            var nonASCIIidentifierChars = \"\\u0300-\\u036f\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u0620-\\u0649\\u0672-\\u06d3\\u06e7-\\u06e8\\u06fb-\\u06fc\\u0730-\\u074a\\u0800-\\u0814\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0840-\\u0857\\u08e4-\\u08fe\\u0900-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962-\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09d7\\u09df-\\u09e0\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2-\\u0ae3\\u0ae6-\\u0aef\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b56\\u0b57\\u0b5f-\\u0b60\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c01-\\u0c03\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62-\\u0c63\\u0c66-\\u0c6f\\u0c82\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2-\\u0ce3\\u0ce6-\\u0cef\\u0d02\\u0d03\\u0d46-\\u0d48\\u0d57\\u0d62-\\u0d63\\u0d66-\\u0d6f\\u0d82\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2\\u0df3\\u0e34-\\u0e3a\\u0e40-\\u0e45\\u0e50-\\u0e59\\u0eb4-\\u0eb9\\u0ec8-\\u0ecd\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f41-\\u0f47\\u0f71-\\u0f84\\u0f86-\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u1000-\\u1029\\u1040-\\u1049\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u170e-\\u1710\\u1720-\\u1730\\u1740-\\u1750\\u1772\\u1773\\u1780-\\u17b2\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u1810-\\u1819\\u1920-\\u192b\\u1930-\\u193b\\u1951-\\u196d\\u19b0-\\u19c0\\u19c8-\\u19c9\\u19d0-\\u19d9\\u1a00-\\u1a15\\u1a20-\\u1a53\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1b46-\\u1b4b\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c00-\\u1c22\\u1c40-\\u1c49\\u1c5b-\\u1c7d\\u1cd0-\\u1cd2\\u1d00-\\u1dbe\\u1e01-\\u1f15\\u200c\\u200d\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2d81-\\u2d96\\u2de0-\\u2dff\\u3021-\\u3028\\u3099\\u309a\\ua640-\\ua66d\\ua674-\\ua67d\\ua69f\\ua6f0-\\ua6f1\\ua7f8-\\ua800\\ua806\\ua80b\\ua823-\\ua827\\ua880-\\ua881\\ua8b4-\\ua8c4\\ua8d0-\\ua8d9\\ua8f3-\\ua8f7\\ua900-\\ua909\\ua926-\\ua92d\\ua930-\\ua945\\ua980-\\ua983\\ua9b3-\\ua9c0\\uaa00-\\uaa27\\uaa40-\\uaa41\\uaa4c-\\uaa4d\\uaa50-\\uaa59\\uaa7b\\uaae0-\\uaae9\\uaaf2-\\uaaf3\\uabc0-\\uabe1\\uabec\\uabed\\uabf0-\\uabf9\\ufb20-\\ufb28\\ufe00-\\ufe0f\\ufe20-\\ufe26\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\";\n            var nonASCIIidentifierStart = new RegExp(\"[\" + nonASCIIidentifierStartChars + \"]\");\n            var nonASCIIidentifier = new RegExp(\"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\");\n\n            // Whether a single character denotes a newline.\n\n            exports.newline = /[\\n\\r\\u2028\\u2029]/;\n\n            // Matches a whole line break (where CRLF is considered a single\n            // line break). Used to count lines.\n\n            // in javascript, these two differ\n            // in python they are the same, different methods are called on them\n            exports.lineBreak = new RegExp('\\r\\n|' + exports.newline.source);\n            exports.allLineBreaks = new RegExp(exports.lineBreak.source, 'g');\n\n\n            // Test whether a given character code starts an identifier.\n\n            exports.isIdentifierStart = function(code) {\n                // permit $ (36) and @ (64). @ is used in ES7 decorators.\n                if (code < 65) return code === 36 || code === 64;\n                // 65 through 91 are uppercase letters.\n                if (code < 91) return true;\n                // permit _ (95).\n                if (code < 97) return code === 95;\n                // 97 through 123 are lowercase letters.\n                if (code < 123) return true;\n                return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code));\n            };\n\n            // Test whether a given character is part of an identifier.\n\n            exports.isIdentifierChar = function(code) {\n                if (code < 48) return code === 36;\n                if (code < 58) return true;\n                if (code < 65) return false;\n                if (code < 91) return true;\n                if (code < 97) return code === 95;\n                if (code < 123) return true;\n                return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));\n            };\n        })(acorn);\n        /* jshint curly: true */\n\n        function in_array(what, arr) {\n            for (var i = 0; i < arr.length; i += 1) {\n                if (arr[i] === what) {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        function trim(s) {\n            return s.replace(/^\\s+|\\s+$/g, '');\n        }\n\n        function ltrim(s) {\n            return s.replace(/^\\s+/g, '');\n        }\n\n        // function rtrim(s) {\n        //     return s.replace(/\\s+$/g, '');\n        // }\n\n        function sanitizeOperatorPosition(opPosition) {\n            opPosition = opPosition || OPERATOR_POSITION.before_newline;\n\n            var validPositionValues = Object.values(OPERATOR_POSITION);\n\n            if (!in_array(opPosition, validPositionValues)) {\n                throw new Error(\"Invalid Option Value: The option 'operator_position' must be one of the following values\\n\" +\n                    validPositionValues +\n                    \"\\nYou passed in: '\" + opPosition + \"'\");\n            }\n\n            return opPosition;\n        }\n\n        var OPERATOR_POSITION = {\n            before_newline: 'before-newline',\n            after_newline: 'after-newline',\n            preserve_newline: 'preserve-newline',\n        };\n\n        var OPERATOR_POSITION_BEFORE_OR_PRESERVE = [OPERATOR_POSITION.before_newline, OPERATOR_POSITION.preserve_newline];\n\n        var MODE = {\n            BlockStatement: 'BlockStatement', // 'BLOCK'\n            Statement: 'Statement', // 'STATEMENT'\n            ObjectLiteral: 'ObjectLiteral', // 'OBJECT',\n            ArrayLiteral: 'ArrayLiteral', //'[EXPRESSION]',\n            ForInitializer: 'ForInitializer', //'(FOR-EXPRESSION)',\n            Conditional: 'Conditional', //'(COND-EXPRESSION)',\n            Expression: 'Expression' //'(EXPRESSION)'\n        };\n\n        function Beautifier(js_source_text, options) {\n            \"use strict\";\n            var output;\n            var tokens = [],\n                token_pos;\n            var Tokenizer;\n            var current_token;\n            var last_type, last_last_text, indent_string;\n            var flags, previous_flags, flag_store;\n            var prefix;\n\n            var handlers, opt;\n            var baseIndentString = '';\n\n            handlers = {\n                'TK_START_EXPR': handle_start_expr,\n                'TK_END_EXPR': handle_end_expr,\n                'TK_START_BLOCK': handle_start_block,\n                'TK_END_BLOCK': handle_end_block,\n                'TK_WORD': handle_word,\n                'TK_RESERVED': handle_word,\n                'TK_SEMICOLON': handle_semicolon,\n                'TK_STRING': handle_string,\n                'TK_EQUALS': handle_equals,\n                'TK_OPERATOR': handle_operator,\n                'TK_COMMA': handle_comma,\n                'TK_BLOCK_COMMENT': handle_block_comment,\n                'TK_COMMENT': handle_comment,\n                'TK_DOT': handle_dot,\n                'TK_UNKNOWN': handle_unknown,\n                'TK_EOF': handle_eof\n            };\n\n            function create_flags(flags_base, mode) {\n                var next_indent_level = 0;\n                if (flags_base) {\n                    next_indent_level = flags_base.indentation_level;\n                    if (!output.just_added_newline() &&\n                        flags_base.line_indent_level > next_indent_level) {\n                        next_indent_level = flags_base.line_indent_level;\n                    }\n                }\n\n                var next_flags = {\n                    mode: mode,\n                    parent: flags_base,\n                    last_text: flags_base ? flags_base.last_text : '', // last token text\n                    last_word: flags_base ? flags_base.last_word : '', // last 'TK_WORD' passed\n                    declaration_statement: false,\n                    declaration_assignment: false,\n                    multiline_frame: false,\n                    inline_frame: false,\n                    if_block: false,\n                    else_block: false,\n                    do_block: false,\n                    do_while: false,\n                    import_block: false,\n                    in_case_statement: false, // switch(..){ INSIDE HERE }\n                    in_case: false, // we're on the exact line with \"case 0:\"\n                    case_body: false, // the indented case-action block\n                    indentation_level: next_indent_level,\n                    line_indent_level: flags_base ? flags_base.line_indent_level : next_indent_level,\n                    start_line_index: output.get_line_number(),\n                    ternary_depth: 0\n                };\n                return next_flags;\n            }\n\n            // Some interpreters have unexpected results with foo = baz || bar;\n            options = options ? options : {};\n\n            // Allow the setting of language/file-type specific options\n            // with inheritance of overall settings\n            options = mergeOpts(options, 'js');\n\n            opt = {};\n\n            // compatibility, re\n            if (options.brace_style === \"expand-strict\") { //graceful handling of deprecated option\n                options.brace_style = \"expand\";\n            } else if (options.brace_style === \"collapse-preserve-inline\") { //graceful handling of deprecated option\n                options.brace_style = \"collapse,preserve-inline\";\n            } else if (options.braces_on_own_line !== undefined) { //graceful handling of deprecated option\n                options.brace_style = options.braces_on_own_line ? \"expand\" : \"collapse\";\n            } else if (!options.brace_style) //Nothing exists to set it\n            {\n                options.brace_style = \"collapse\";\n            }\n\n\n            var brace_style_split = options.brace_style.split(/[^a-zA-Z0-9_\\-]+/);\n            opt.brace_style = brace_style_split[0];\n            opt.brace_preserve_inline = brace_style_split[1] ? brace_style_split[1] : false;\n\n            opt.indent_size = options.indent_size ? parseInt(options.indent_size, 10) : 4;\n            opt.indent_char = options.indent_char ? options.indent_char : ' ';\n            opt.eol = options.eol ? options.eol : 'auto';\n            opt.preserve_newlines = (options.preserve_newlines === undefined) ? true : options.preserve_newlines;\n            opt.break_chained_methods = (options.break_chained_methods === undefined) ? false : options.break_chained_methods;\n            opt.max_preserve_newlines = (options.max_preserve_newlines === undefined) ? 0 : parseInt(options.max_preserve_newlines, 10);\n            opt.space_in_paren = (options.space_in_paren === undefined) ? false : options.space_in_paren;\n            opt.space_in_empty_paren = (options.space_in_empty_paren === undefined) ? false : options.space_in_empty_paren;\n            opt.jslint_happy = (options.jslint_happy === undefined) ? false : options.jslint_happy;\n            opt.space_after_anon_function = (options.space_after_anon_function === undefined) ? false : options.space_after_anon_function;\n            opt.keep_array_indentation = (options.keep_array_indentation === undefined) ? false : options.keep_array_indentation;\n            opt.space_before_conditional = (options.space_before_conditional === undefined) ? true : options.space_before_conditional;\n            opt.unescape_strings = (options.unescape_strings === undefined) ? false : options.unescape_strings;\n            opt.wrap_line_length = (options.wrap_line_length === undefined) ? 0 : parseInt(options.wrap_line_length, 10);\n            opt.e4x = (options.e4x === undefined) ? false : options.e4x;\n            opt.end_with_newline = (options.end_with_newline === undefined) ? false : options.end_with_newline;\n            opt.comma_first = (options.comma_first === undefined) ? false : options.comma_first;\n            opt.operator_position = sanitizeOperatorPosition(options.operator_position);\n\n            // For testing of beautify ignore:start directive\n            opt.test_output_raw = (options.test_output_raw === undefined) ? false : options.test_output_raw;\n\n            // force opt.space_after_anon_function to true if opt.jslint_happy\n            if (opt.jslint_happy) {\n                opt.space_after_anon_function = true;\n            }\n\n            if (options.indent_with_tabs) {\n                opt.indent_char = '\\t';\n                opt.indent_size = 1;\n            }\n\n            if (opt.eol === 'auto') {\n                opt.eol = '\\n';\n                if (js_source_text && acorn.lineBreak.test(js_source_text || '')) {\n                    opt.eol = js_source_text.match(acorn.lineBreak)[0];\n                }\n            }\n\n            opt.eol = opt.eol.replace(/\\\\r/, '\\r').replace(/\\\\n/, '\\n');\n\n            //----------------------------------\n            indent_string = '';\n            while (opt.indent_size > 0) {\n                indent_string += opt.indent_char;\n                opt.indent_size -= 1;\n            }\n\n            var preindent_index = 0;\n            if (js_source_text && js_source_text.length) {\n                while ((js_source_text.charAt(preindent_index) === ' ' ||\n                        js_source_text.charAt(preindent_index) === '\\t')) {\n                    baseIndentString += js_source_text.charAt(preindent_index);\n                    preindent_index += 1;\n                }\n                js_source_text = js_source_text.substring(preindent_index);\n            }\n\n            last_type = 'TK_START_BLOCK'; // last token type\n            last_last_text = ''; // pre-last token text\n            output = new Output(indent_string, baseIndentString);\n\n            // If testing the ignore directive, start with output disable set to true\n            output.raw = opt.test_output_raw;\n\n\n            // Stack of parsing/formatting states, including MODE.\n            // We tokenize, parse, and output in an almost purely a forward-only stream of token input\n            // and formatted output.  This makes the beautifier less accurate than full parsers\n            // but also far more tolerant of syntax errors.\n            //\n            // For example, the default mode is MODE.BlockStatement. If we see a '{' we push a new frame of type\n            // MODE.BlockStatement on the the stack, even though it could be object literal.  If we later\n            // encounter a \":\", we'll switch to to MODE.ObjectLiteral.  If we then see a \";\",\n            // most full parsers would die, but the beautifier gracefully falls back to\n            // MODE.BlockStatement and continues on.\n            flag_store = [];\n            set_mode(MODE.BlockStatement);\n\n            this.beautify = function() {\n\n                /*jshint onevar:true */\n                var sweet_code;\n                Tokenizer = new tokenizer(js_source_text, opt, indent_string);\n                tokens = Tokenizer.tokenize();\n                token_pos = 0;\n\n                current_token = get_token();\n                while (current_token) {\n                    handlers[current_token.type]();\n\n                    last_last_text = flags.last_text;\n                    last_type = current_token.type;\n                    flags.last_text = current_token.text;\n\n                    token_pos += 1;\n                    current_token = get_token();\n                }\n\n                sweet_code = output.get_code();\n                if (opt.end_with_newline) {\n                    sweet_code += '\\n';\n                }\n\n                if (opt.eol !== '\\n') {\n                    sweet_code = sweet_code.replace(/[\\n]/g, opt.eol);\n                }\n\n                return sweet_code;\n            };\n\n            function handle_whitespace_and_comments(local_token, preserve_statement_flags) {\n                var newlines = local_token.newlines;\n                var keep_whitespace = opt.keep_array_indentation && is_array(flags.mode);\n                var temp_token = current_token;\n\n                for (var h = 0; h < local_token.comments_before.length; h++) {\n                    // The cleanest handling of inline comments is to treat them as though they aren't there.\n                    // Just continue formatting and the behavior should be logical.\n                    // Also ignore unknown tokens.  Again, this should result in better behavior.\n                    current_token = local_token.comments_before[h];\n                    handle_whitespace_and_comments(current_token, preserve_statement_flags);\n                    handlers[current_token.type](preserve_statement_flags);\n                }\n                current_token = temp_token;\n\n                if (keep_whitespace) {\n                    for (var i = 0; i < newlines; i += 1) {\n                        print_newline(i > 0, preserve_statement_flags);\n                    }\n                } else {\n                    if (opt.max_preserve_newlines && newlines > opt.max_preserve_newlines) {\n                        newlines = opt.max_preserve_newlines;\n                    }\n\n                    if (opt.preserve_newlines) {\n                        if (local_token.newlines > 1) {\n                            print_newline(false, preserve_statement_flags);\n                            for (var j = 1; j < newlines; j += 1) {\n                                print_newline(true, preserve_statement_flags);\n                            }\n                        }\n                    }\n                }\n\n            }\n\n            // we could use just string.split, but\n            // IE doesn't like returning empty strings\n            function split_linebreaks(s) {\n                //return s.split(/\\x0d\\x0a|\\x0a/);\n\n                s = s.replace(acorn.allLineBreaks, '\\n');\n                var out = [],\n                    idx = s.indexOf(\"\\n\");\n                while (idx !== -1) {\n                    out.push(s.substring(0, idx));\n                    s = s.substring(idx + 1);\n                    idx = s.indexOf(\"\\n\");\n                }\n                if (s.length) {\n                    out.push(s);\n                }\n                return out;\n            }\n\n            var newline_restricted_tokens = ['break', 'continue', 'return', 'throw'];\n\n            function allow_wrap_or_preserved_newline(force_linewrap) {\n                force_linewrap = (force_linewrap === undefined) ? false : force_linewrap;\n\n                // Never wrap the first token on a line\n                if (output.just_added_newline()) {\n                    return;\n                }\n\n                var shouldPreserveOrForce = (opt.preserve_newlines && current_token.wanted_newline) || force_linewrap;\n                var operatorLogicApplies = in_array(flags.last_text, Tokenizer.positionable_operators) || in_array(current_token.text, Tokenizer.positionable_operators);\n\n                if (operatorLogicApplies) {\n                    var shouldPrintOperatorNewline = (\n                            in_array(flags.last_text, Tokenizer.positionable_operators) &&\n                            in_array(opt.operator_position, OPERATOR_POSITION_BEFORE_OR_PRESERVE)\n                        ) ||\n                        in_array(current_token.text, Tokenizer.positionable_operators);\n                    shouldPreserveOrForce = shouldPreserveOrForce && shouldPrintOperatorNewline;\n                }\n\n                if (shouldPreserveOrForce) {\n                    print_newline(false, true);\n                } else if (opt.wrap_line_length) {\n                    if (last_type === 'TK_RESERVED' && in_array(flags.last_text, newline_restricted_tokens)) {\n                        // These tokens should never have a newline inserted\n                        // between them and the following expression.\n                        return;\n                    }\n                    var proposed_line_length = output.current_line.get_character_count() + current_token.text.length +\n                        (output.space_before_token ? 1 : 0);\n                    if (proposed_line_length >= opt.wrap_line_length) {\n                        print_newline(false, true);\n                    }\n                }\n            }\n\n            function print_newline(force_newline, preserve_statement_flags) {\n                if (!preserve_statement_flags) {\n                    if (flags.last_text !== ';' && flags.last_text !== ',' && flags.last_text !== '=' && last_type !== 'TK_OPERATOR') {\n                        var next_token = get_token(1);\n                        while (flags.mode === MODE.Statement &&\n                            !(flags.if_block && next_token && next_token.type === 'TK_RESERVED' && next_token.text === 'else') &&\n                            !flags.do_block) {\n                            restore_mode();\n                        }\n                    }\n                }\n\n                if (output.add_new_line(force_newline)) {\n                    flags.multiline_frame = true;\n                }\n            }\n\n            function print_token_line_indentation() {\n                if (output.just_added_newline()) {\n                    if (opt.keep_array_indentation && is_array(flags.mode) && current_token.wanted_newline) {\n                        output.current_line.push(current_token.whitespace_before);\n                        output.space_before_token = false;\n                    } else if (output.set_indent(flags.indentation_level)) {\n                        flags.line_indent_level = flags.indentation_level;\n                    }\n                }\n            }\n\n            function print_token(printable_token) {\n                if (output.raw) {\n                    output.add_raw_token(current_token);\n                    return;\n                }\n\n                if (opt.comma_first && last_type === 'TK_COMMA' &&\n                    output.just_added_newline()) {\n                    if (output.previous_line.last() === ',') {\n                        var popped = output.previous_line.pop();\n                        // if the comma was already at the start of the line,\n                        // pull back onto that line and reprint the indentation\n                        if (output.previous_line.is_empty()) {\n                            output.previous_line.push(popped);\n                            output.trim(true);\n                            output.current_line.pop();\n                            output.trim();\n                        }\n\n                        // add the comma in front of the next token\n                        print_token_line_indentation();\n                        output.add_token(',');\n                        output.space_before_token = true;\n                    }\n                }\n\n                printable_token = printable_token || current_token.text;\n                print_token_line_indentation();\n                output.add_token(printable_token);\n            }\n\n            function indent() {\n                flags.indentation_level += 1;\n            }\n\n            function deindent() {\n                if (flags.indentation_level > 0 &&\n                    ((!flags.parent) || flags.indentation_level > flags.parent.indentation_level)) {\n                    flags.indentation_level -= 1;\n\n                }\n            }\n\n            function set_mode(mode) {\n                if (flags) {\n                    flag_store.push(flags);\n                    previous_flags = flags;\n                } else {\n                    previous_flags = create_flags(null, mode);\n                }\n\n                flags = create_flags(previous_flags, mode);\n            }\n\n            function is_array(mode) {\n                return mode === MODE.ArrayLiteral;\n            }\n\n            function is_expression(mode) {\n                return in_array(mode, [MODE.Expression, MODE.ForInitializer, MODE.Conditional]);\n            }\n\n            function restore_mode() {\n                if (flag_store.length > 0) {\n                    previous_flags = flags;\n                    flags = flag_store.pop();\n                    if (previous_flags.mode === MODE.Statement) {\n                        output.remove_redundant_indentation(previous_flags);\n                    }\n                }\n            }\n\n            function start_of_object_property() {\n                return flags.parent.mode === MODE.ObjectLiteral && flags.mode === MODE.Statement && (\n                    (flags.last_text === ':' && flags.ternary_depth === 0) || (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['get', 'set'])));\n            }\n\n            function start_of_statement() {\n                if (\n                    (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['var', 'let', 'const']) && current_token.type === 'TK_WORD') ||\n                    (last_type === 'TK_RESERVED' && flags.last_text === 'do') ||\n                    (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['return', 'throw']) && !current_token.wanted_newline) ||\n                    (last_type === 'TK_RESERVED' && flags.last_text === 'else' &&\n                        !(current_token.type === 'TK_RESERVED' && current_token.text === 'if' && !current_token.comments_before.length)) ||\n                    (last_type === 'TK_END_EXPR' && (previous_flags.mode === MODE.ForInitializer || previous_flags.mode === MODE.Conditional)) ||\n                    (last_type === 'TK_WORD' && flags.mode === MODE.BlockStatement &&\n                        !flags.in_case &&\n                        !(current_token.text === '--' || current_token.text === '++') &&\n                        last_last_text !== 'function' &&\n                        current_token.type !== 'TK_WORD' && current_token.type !== 'TK_RESERVED') ||\n                    (flags.mode === MODE.ObjectLiteral && (\n                        (flags.last_text === ':' && flags.ternary_depth === 0) || (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['get', 'set']))))\n                ) {\n\n                    set_mode(MODE.Statement);\n                    indent();\n\n                    handle_whitespace_and_comments(current_token, true);\n\n                    // Issue #276:\n                    // If starting a new statement with [if, for, while, do], push to a new line.\n                    // if (a) if (b) if(c) d(); else e(); else f();\n                    if (!start_of_object_property()) {\n                        allow_wrap_or_preserved_newline(\n                            current_token.type === 'TK_RESERVED' && in_array(current_token.text, ['do', 'for', 'if', 'while']));\n                    }\n\n                    return true;\n                }\n                return false;\n            }\n\n            function all_lines_start_with(lines, c) {\n                for (var i = 0; i < lines.length; i++) {\n                    var line = trim(lines[i]);\n                    if (line.charAt(0) !== c) {\n                        return false;\n                    }\n                }\n                return true;\n            }\n\n            function each_line_matches_indent(lines, indent) {\n                var i = 0,\n                    len = lines.length,\n                    line;\n                for (; i < len; i++) {\n                    line = lines[i];\n                    // allow empty lines to pass through\n                    if (line && line.indexOf(indent) !== 0) {\n                        return false;\n                    }\n                }\n                return true;\n            }\n\n            function is_special_word(word) {\n                return in_array(word, ['case', 'return', 'do', 'if', 'throw', 'else']);\n            }\n\n            function get_token(offset) {\n                var index = token_pos + (offset || 0);\n                return (index < 0 || index >= tokens.length) ? null : tokens[index];\n            }\n\n            function handle_start_expr() {\n                // The conditional starts the statement if appropriate.\n                if (!start_of_statement()) {\n                    handle_whitespace_and_comments(current_token);\n                }\n\n                var next_mode = MODE.Expression;\n                if (current_token.text === '[') {\n\n                    if (last_type === 'TK_WORD' || flags.last_text === ')') {\n                        // this is array index specifier, break immediately\n                        // a[x], fn()[x]\n                        if (last_type === 'TK_RESERVED' && in_array(flags.last_text, Tokenizer.line_starters)) {\n                            output.space_before_token = true;\n                        }\n                        set_mode(next_mode);\n                        print_token();\n                        indent();\n                        if (opt.space_in_paren) {\n                            output.space_before_token = true;\n                        }\n                        return;\n                    }\n\n                    next_mode = MODE.ArrayLiteral;\n                    if (is_array(flags.mode)) {\n                        if (flags.last_text === '[' ||\n                            (flags.last_text === ',' && (last_last_text === ']' || last_last_text === '}'))) {\n                            // ], [ goes to new line\n                            // }, [ goes to new line\n                            if (!opt.keep_array_indentation) {\n                                print_newline();\n                            }\n                        }\n                    }\n\n                } else {\n                    if (last_type === 'TK_RESERVED' && flags.last_text === 'for') {\n                        next_mode = MODE.ForInitializer;\n                    } else if (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['if', 'while'])) {\n                        next_mode = MODE.Conditional;\n                    } else {\n                        // next_mode = MODE.Expression;\n                    }\n                }\n\n                if (flags.last_text === ';' || last_type === 'TK_START_BLOCK') {\n                    print_newline();\n                } else if (last_type === 'TK_END_EXPR' || last_type === 'TK_START_EXPR' || last_type === 'TK_END_BLOCK' || flags.last_text === '.') {\n                    // TODO: Consider whether forcing this is required.  Review failing tests when removed.\n                    allow_wrap_or_preserved_newline(current_token.wanted_newline);\n                    // do nothing on (( and )( and ][ and ]( and .(\n                } else if (!(last_type === 'TK_RESERVED' && current_token.text === '(') && last_type !== 'TK_WORD' && last_type !== 'TK_OPERATOR') {\n                    output.space_before_token = true;\n                } else if ((last_type === 'TK_RESERVED' && (flags.last_word === 'function' || flags.last_word === 'typeof')) ||\n                    (flags.last_text === '*' &&\n                        (in_array(last_last_text, ['function', 'yield']) ||\n                            (flags.mode === MODE.ObjectLiteral && in_array(last_last_text, ['{', ',']))))) {\n                    // function() vs function ()\n                    // yield*() vs yield* ()\n                    // function*() vs function* ()\n                    if (opt.space_after_anon_function) {\n                        output.space_before_token = true;\n                    }\n                } else if (last_type === 'TK_RESERVED' && (in_array(flags.last_text, Tokenizer.line_starters) || flags.last_text === 'catch')) {\n                    if (opt.space_before_conditional) {\n                        output.space_before_token = true;\n                    }\n                }\n\n                // Should be a space between await and an IIFE\n                if (current_token.text === '(' && last_type === 'TK_RESERVED' && flags.last_word === 'await') {\n                    output.space_before_token = true;\n                }\n\n                // Support of this kind of newline preservation.\n                // a = (b &&\n                //     (c || d));\n                if (current_token.text === '(') {\n                    if (last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') {\n                        if (!start_of_object_property()) {\n                            allow_wrap_or_preserved_newline();\n                        }\n                    }\n                }\n\n                // Support preserving wrapped arrow function expressions\n                // a.b('c',\n                //     () => d.e\n                // )\n                if (current_token.text === '(' && last_type !== 'TK_WORD' && last_type !== 'TK_RESERVED') {\n                    allow_wrap_or_preserved_newline();\n                }\n\n                set_mode(next_mode);\n                print_token();\n                if (opt.space_in_paren) {\n                    output.space_before_token = true;\n                }\n\n                // In all cases, if we newline while inside an expression it should be indented.\n                indent();\n            }\n\n            function handle_end_expr() {\n                // statements inside expressions are not valid syntax, but...\n                // statements must all be closed when their container closes\n                while (flags.mode === MODE.Statement) {\n                    restore_mode();\n                }\n\n                handle_whitespace_and_comments(current_token);\n\n                if (flags.multiline_frame) {\n                    allow_wrap_or_preserved_newline(current_token.text === ']' && is_array(flags.mode) && !opt.keep_array_indentation);\n                }\n\n                if (opt.space_in_paren) {\n                    if (last_type === 'TK_START_EXPR' && !opt.space_in_empty_paren) {\n                        // () [] no inner space in empty parens like these, ever, ref #320\n                        output.trim();\n                        output.space_before_token = false;\n                    } else {\n                        output.space_before_token = true;\n                    }\n                }\n                if (current_token.text === ']' && opt.keep_array_indentation) {\n                    print_token();\n                    restore_mode();\n                } else {\n                    restore_mode();\n                    print_token();\n                }\n                output.remove_redundant_indentation(previous_flags);\n\n                // do {} while () // no statement required after\n                if (flags.do_while && previous_flags.mode === MODE.Conditional) {\n                    previous_flags.mode = MODE.Expression;\n                    flags.do_block = false;\n                    flags.do_while = false;\n\n                }\n            }\n\n            function handle_start_block() {\n                handle_whitespace_and_comments(current_token);\n\n                // Check if this is should be treated as a ObjectLiteral\n                var next_token = get_token(1);\n                var second_token = get_token(2);\n                if (second_token && (\n                        (in_array(second_token.text, [':', ',']) && in_array(next_token.type, ['TK_STRING', 'TK_WORD', 'TK_RESERVED'])) ||\n                        (in_array(next_token.text, ['get', 'set', '...']) && in_array(second_token.type, ['TK_WORD', 'TK_RESERVED']))\n                    )) {\n                    // We don't support TypeScript,but we didn't break it for a very long time.\n                    // We'll try to keep not breaking it.\n                    if (!in_array(last_last_text, ['class', 'interface'])) {\n                        set_mode(MODE.ObjectLiteral);\n                    } else {\n                        set_mode(MODE.BlockStatement);\n                    }\n                } else if (last_type === 'TK_OPERATOR' && flags.last_text === '=>') {\n                    // arrow function: (param1, paramN) => { statements }\n                    set_mode(MODE.BlockStatement);\n                } else if (in_array(last_type, ['TK_EQUALS', 'TK_START_EXPR', 'TK_COMMA', 'TK_OPERATOR']) ||\n                    (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['return', 'throw', 'import', 'default']))\n                ) {\n                    // Detecting shorthand function syntax is difficult by scanning forward,\n                    //     so check the surrounding context.\n                    // If the block is being returned, imported, export default, passed as arg,\n                    //     assigned with = or assigned in a nested object, treat as an ObjectLiteral.\n                    set_mode(MODE.ObjectLiteral);\n                } else {\n                    set_mode(MODE.BlockStatement);\n                }\n\n                var empty_braces = !next_token.comments_before.length && next_token.text === '}';\n                var empty_anonymous_function = empty_braces && flags.last_word === 'function' &&\n                    last_type === 'TK_END_EXPR';\n\n                if (opt.brace_preserve_inline) // check for inline, set inline_frame if so\n                {\n                    // search forward for a newline wanted inside this block\n                    var index = 0;\n                    var check_token = null;\n                    flags.inline_frame = true;\n                    do {\n                        index += 1;\n                        check_token = get_token(index);\n                        if (check_token.wanted_newline) {\n                            flags.inline_frame = false;\n                            break;\n                        }\n                    } while (check_token.type !== 'TK_EOF' &&\n                        !(check_token.type === 'TK_END_BLOCK' && check_token.opened === current_token));\n                }\n\n                if ((opt.brace_style === \"expand\" ||\n                        (opt.brace_style === \"none\" && current_token.wanted_newline)) &&\n                    !flags.inline_frame) {\n                    if (last_type !== 'TK_OPERATOR' &&\n                        (empty_anonymous_function ||\n                            last_type === 'TK_EQUALS' ||\n                            (last_type === 'TK_RESERVED' && is_special_word(flags.last_text) && flags.last_text !== 'else'))) {\n                        output.space_before_token = true;\n                    } else {\n                        print_newline(false, true);\n                    }\n                } else { // collapse || inline_frame\n                    if (is_array(previous_flags.mode) && (last_type === 'TK_START_EXPR' || last_type === 'TK_COMMA')) {\n                        if (last_type === 'TK_COMMA' || opt.space_in_paren) {\n                            output.space_before_token = true;\n                        }\n\n                        if (last_type === 'TK_COMMA' || (last_type === 'TK_START_EXPR' && flags.inline_frame)) {\n                            allow_wrap_or_preserved_newline();\n                            previous_flags.multiline_frame = previous_flags.multiline_frame || flags.multiline_frame;\n                            flags.multiline_frame = false;\n                        }\n                    }\n                    if (last_type !== 'TK_OPERATOR' && last_type !== 'TK_START_EXPR') {\n                        if (last_type === 'TK_START_BLOCK' && !flags.inline_frame) {\n                            print_newline();\n                        } else {\n                            output.space_before_token = true;\n                        }\n                    }\n                }\n                print_token();\n                indent();\n            }\n\n            function handle_end_block() {\n                // statements must all be closed when their container closes\n                handle_whitespace_and_comments(current_token);\n\n                while (flags.mode === MODE.Statement) {\n                    restore_mode();\n                }\n\n                var empty_braces = last_type === 'TK_START_BLOCK';\n\n                if (flags.inline_frame && !empty_braces) { // try inline_frame (only set if opt.braces-preserve-inline) first\n                    output.space_before_token = true;\n                } else if (opt.brace_style === \"expand\") {\n                    if (!empty_braces) {\n                        print_newline();\n                    }\n                } else {\n                    // skip {}\n                    if (!empty_braces) {\n                        if (is_array(flags.mode) && opt.keep_array_indentation) {\n                            // we REALLY need a newline here, but newliner would skip that\n                            opt.keep_array_indentation = false;\n                            print_newline();\n                            opt.keep_array_indentation = true;\n\n                        } else {\n                            print_newline();\n                        }\n                    }\n                }\n                restore_mode();\n                print_token();\n            }\n\n            function handle_word() {\n                if (current_token.type === 'TK_RESERVED') {\n                    if (in_array(current_token.text, ['set', 'get']) && flags.mode !== MODE.ObjectLiteral) {\n                        current_token.type = 'TK_WORD';\n                    } else if (in_array(current_token.text, ['as', 'from']) && !flags.import_block) {\n                        current_token.type = 'TK_WORD';\n                    } else if (flags.mode === MODE.ObjectLiteral) {\n                        var next_token = get_token(1);\n                        if (next_token.text === ':') {\n                            current_token.type = 'TK_WORD';\n                        }\n                    }\n                }\n\n                if (start_of_statement()) {\n                    // The conditional starts the statement if appropriate.\n                    if (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['var', 'let', 'const']) && current_token.type === 'TK_WORD') {\n                        flags.declaration_statement = true;\n                    }\n                } else if (current_token.wanted_newline && !is_expression(flags.mode) &&\n                    (last_type !== 'TK_OPERATOR' || (flags.last_text === '--' || flags.last_text === '++')) &&\n                    last_type !== 'TK_EQUALS' &&\n                    (opt.preserve_newlines || !(last_type === 'TK_RESERVED' && in_array(flags.last_text, ['var', 'let', 'const', 'set', 'get'])))) {\n                    handle_whitespace_and_comments(current_token);\n                    print_newline();\n                } else {\n                    handle_whitespace_and_comments(current_token);\n                }\n\n                if (flags.do_block && !flags.do_while) {\n                    if (current_token.type === 'TK_RESERVED' && current_token.text === 'while') {\n                        // do {} ## while ()\n                        output.space_before_token = true;\n                        print_token();\n                        output.space_before_token = true;\n                        flags.do_while = true;\n                        return;\n                    } else {\n                        // do {} should always have while as the next word.\n                        // if we don't see the expected while, recover\n                        print_newline();\n                        flags.do_block = false;\n                    }\n                }\n\n                // if may be followed by else, or not\n                // Bare/inline ifs are tricky\n                // Need to unwind the modes correctly: if (a) if (b) c(); else d(); else e();\n                if (flags.if_block) {\n                    if (!flags.else_block && (current_token.type === 'TK_RESERVED' && current_token.text === 'else')) {\n                        flags.else_block = true;\n                    } else {\n                        while (flags.mode === MODE.Statement) {\n                            restore_mode();\n                        }\n                        flags.if_block = false;\n                        flags.else_block = false;\n                    }\n                }\n\n                if (current_token.type === 'TK_RESERVED' && (current_token.text === 'case' || (current_token.text === 'default' && flags.in_case_statement))) {\n                    print_newline();\n                    if (flags.case_body || opt.jslint_happy) {\n                        // switch cases following one another\n                        deindent();\n                        flags.case_body = false;\n                    }\n                    print_token();\n                    flags.in_case = true;\n                    flags.in_case_statement = true;\n                    return;\n                }\n\n                if (last_type === 'TK_COMMA' || last_type === 'TK_START_EXPR' || last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') {\n                    if (!start_of_object_property()) {\n                        allow_wrap_or_preserved_newline();\n                    }\n                }\n\n                if (current_token.type === 'TK_RESERVED' && current_token.text === 'function') {\n                    if (in_array(flags.last_text, ['}', ';']) ||\n                        (output.just_added_newline() && !(in_array(flags.last_text, ['(', '[', '{', ':', '=', ',']) || last_type === 'TK_OPERATOR'))) {\n                        // make sure there is a nice clean space of at least one blank line\n                        // before a new function definition\n                        if (!output.just_added_blankline() && !current_token.comments_before.length) {\n                            print_newline();\n                            print_newline(true);\n                        }\n                    }\n                    if (last_type === 'TK_RESERVED' || last_type === 'TK_WORD') {\n                        if (last_type === 'TK_RESERVED' && in_array(flags.last_text, ['get', 'set', 'new', 'return', 'export', 'async'])) {\n                            output.space_before_token = true;\n                        } else if (last_type === 'TK_RESERVED' && flags.last_text === 'default' && last_last_text === 'export') {\n                            output.space_before_token = true;\n                        } else {\n                            print_newline();\n                        }\n                    } else if (last_type === 'TK_OPERATOR' || flags.last_text === '=') {\n                        // foo = function\n                        output.space_before_token = true;\n                    } else if (!flags.multiline_frame && (is_expression(flags.mode) || is_array(flags.mode))) {\n                        // (function\n                    } else {\n                        print_newline();\n                    }\n\n                    print_token();\n                    flags.last_word = current_token.text;\n                    return;\n                }\n\n                prefix = 'NONE';\n\n                if (last_type === 'TK_END_BLOCK') {\n\n                    if (previous_flags.inline_frame) {\n                        prefix = 'SPACE';\n                    } else if (!(current_token.type === 'TK_RESERVED' && in_array(current_token.text, ['else', 'catch', 'finally', 'from']))) {\n                        prefix = 'NEWLINE';\n                    } else {\n                        if (opt.brace_style === \"expand\" ||\n                            opt.brace_style === \"end-expand\" ||\n                            (opt.brace_style === \"none\" && current_token.wanted_newline)) {\n                            prefix = 'NEWLINE';\n                        } else {\n                            prefix = 'SPACE';\n                            output.space_before_token = true;\n                        }\n                    }\n                } else if (last_type === 'TK_SEMICOLON' && flags.mode === MODE.BlockStatement) {\n                    // TODO: Should this be for STATEMENT as well?\n                    prefix = 'NEWLINE';\n                } else if (last_type === 'TK_SEMICOLON' && is_expression(flags.mode)) {\n                    prefix = 'SPACE';\n                } else if (last_type === 'TK_STRING') {\n                    prefix = 'NEWLINE';\n                } else if (last_type === 'TK_RESERVED' || last_type === 'TK_WORD' ||\n                    (flags.last_text === '*' &&\n                        (in_array(last_last_text, ['function', 'yield']) ||\n                            (flags.mode === MODE.ObjectLiteral && in_array(last_last_text, ['{', ',']))))) {\n                    prefix = 'SPACE';\n                } else if (last_type === 'TK_START_BLOCK') {\n                    if (flags.inline_frame) {\n                        prefix = 'SPACE';\n                    } else {\n                        prefix = 'NEWLINE';\n                    }\n                } else if (last_type === 'TK_END_EXPR') {\n                    output.space_before_token = true;\n                    prefix = 'NEWLINE';\n                }\n\n                if (current_token.type === 'TK_RESERVED' && in_array(current_token.text, Tokenizer.line_starters) && flags.last_text !== ')') {\n                    if (flags.inline_frame || flags.last_text === 'else' || flags.last_text === 'export') {\n                        prefix = 'SPACE';\n                    } else {\n                        prefix = 'NEWLINE';\n                    }\n\n                }\n\n                if (current_token.type === 'TK_RESERVED' && in_array(current_token.text, ['else', 'catch', 'finally'])) {\n                    if ((!(last_type === 'TK_END_BLOCK' && previous_flags.mode === MODE.BlockStatement) ||\n                            opt.brace_style === \"expand\" ||\n                            opt.brace_style === \"end-expand\" ||\n                            (opt.brace_style === \"none\" && current_token.wanted_newline)) &&\n                        !flags.inline_frame) {\n                        print_newline();\n                    } else {\n                        output.trim(true);\n                        var line = output.current_line;\n                        // If we trimmed and there's something other than a close block before us\n                        // put a newline back in.  Handles '} // comment' scenario.\n                        if (line.last() !== '}') {\n                            print_newline();\n                        }\n                        output.space_before_token = true;\n                    }\n                } else if (prefix === 'NEWLINE') {\n                    if (last_type === 'TK_RESERVED' && is_special_word(flags.last_text)) {\n                        // no newline between 'return nnn'\n                        output.space_before_token = true;\n                    } else if (last_type !== 'TK_END_EXPR') {\n                        if ((last_type !== 'TK_START_EXPR' || !(current_token.type === 'TK_RESERVED' && in_array(current_token.text, ['var', 'let', 'const']))) && flags.last_text !== ':') {\n                            // no need to force newline on 'var': for (var x = 0...)\n                            if (current_token.type === 'TK_RESERVED' && current_token.text === 'if' && flags.last_text === 'else') {\n                                // no newline for } else if {\n                                output.space_before_token = true;\n                            } else {\n                                print_newline();\n                            }\n                        }\n                    } else if (current_token.type === 'TK_RESERVED' && in_array(current_token.text, Tokenizer.line_starters) && flags.last_text !== ')') {\n                        print_newline();\n                    }\n                } else if (flags.multiline_frame && is_array(flags.mode) && flags.last_text === ',' && last_last_text === '}') {\n                    print_newline(); // }, in lists get a newline treatment\n                } else if (prefix === 'SPACE') {\n                    output.space_before_token = true;\n                }\n                print_token();\n                flags.last_word = current_token.text;\n\n                if (current_token.type === 'TK_RESERVED') {\n                    if (current_token.text === 'do') {\n                        flags.do_block = true;\n                    } else if (current_token.text === 'if') {\n                        flags.if_block = true;\n                    } else if (current_token.text === 'import') {\n                        flags.import_block = true;\n                    } else if (flags.import_block && current_token.type === 'TK_RESERVED' && current_token.text === 'from') {\n                        flags.import_block = false;\n                    }\n                }\n            }\n\n            function handle_semicolon() {\n                if (start_of_statement()) {\n                    // The conditional starts the statement if appropriate.\n                    // Semicolon can be the start (and end) of a statement\n                    output.space_before_token = false;\n                } else {\n                    handle_whitespace_and_comments(current_token);\n                }\n\n                var next_token = get_token(1);\n                while (flags.mode === MODE.Statement &&\n                    !(flags.if_block && next_token && next_token.type === 'TK_RESERVED' && next_token.text === 'else') &&\n                    !flags.do_block) {\n                    restore_mode();\n                }\n\n                // hacky but effective for the moment\n                if (flags.import_block) {\n                    flags.import_block = false;\n                }\n                print_token();\n            }\n\n            function handle_string() {\n                if (start_of_statement()) {\n                    // The conditional starts the statement if appropriate.\n                    // One difference - strings want at least a space before\n                    output.space_before_token = true;\n                } else {\n                    handle_whitespace_and_comments(current_token);\n                    if (last_type === 'TK_RESERVED' || last_type === 'TK_WORD' || flags.inline_frame) {\n                        output.space_before_token = true;\n                    } else if (last_type === 'TK_COMMA' || last_type === 'TK_START_EXPR' || last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') {\n                        if (!start_of_object_property()) {\n                            allow_wrap_or_preserved_newline();\n                        }\n                    } else {\n                        print_newline();\n                    }\n                }\n                print_token();\n            }\n\n            function handle_equals() {\n                if (start_of_statement()) {\n                    // The conditional starts the statement if appropriate.\n                } else {\n                    handle_whitespace_and_comments(current_token);\n                }\n\n                if (flags.declaration_statement) {\n                    // just got an '=' in a var-line, different formatting/line-breaking, etc will now be done\n                    flags.declaration_assignment = true;\n                }\n                output.space_before_token = true;\n                print_token();\n                output.space_before_token = true;\n            }\n\n            function handle_comma() {\n                handle_whitespace_and_comments(current_token, true);\n\n                print_token();\n                output.space_before_token = true;\n                if (flags.declaration_statement) {\n                    if (is_expression(flags.parent.mode)) {\n                        // do not break on comma, for(var a = 1, b = 2)\n                        flags.declaration_assignment = false;\n                    }\n\n                    if (flags.declaration_assignment) {\n                        flags.declaration_assignment = false;\n                        print_newline(false, true);\n                    } else if (opt.comma_first) {\n                        // for comma-first, we want to allow a newline before the comma\n                        // to turn into a newline after the comma, which we will fixup later\n                        allow_wrap_or_preserved_newline();\n                    }\n                } else if (flags.mode === MODE.ObjectLiteral ||\n                    (flags.mode === MODE.Statement && flags.parent.mode === MODE.ObjectLiteral)) {\n                    if (flags.mode === MODE.Statement) {\n                        restore_mode();\n                    }\n\n                    if (!flags.inline_frame) {\n                        print_newline();\n                    }\n                } else if (opt.comma_first) {\n                    // EXPR or DO_BLOCK\n                    // for comma-first, we want to allow a newline before the comma\n                    // to turn into a newline after the comma, which we will fixup later\n                    allow_wrap_or_preserved_newline();\n                }\n            }\n\n            function handle_operator() {\n                var isGeneratorAsterisk = current_token.text === '*' &&\n                    ((last_type === 'TK_RESERVED' && in_array(flags.last_text, ['function', 'yield'])) ||\n                        (in_array(last_type, ['TK_START_BLOCK', 'TK_COMMA', 'TK_END_BLOCK', 'TK_SEMICOLON']))\n                    );\n                var isUnary = in_array(current_token.text, ['-', '+']) && (\n                    in_array(last_type, ['TK_START_BLOCK', 'TK_START_EXPR', 'TK_EQUALS', 'TK_OPERATOR']) ||\n                    in_array(flags.last_text, Tokenizer.line_starters) ||\n                    flags.last_text === ','\n                );\n\n                if (start_of_statement()) {\n                    // The conditional starts the statement if appropriate.\n                } else {\n                    var preserve_statement_flags = !isGeneratorAsterisk;\n                    handle_whitespace_and_comments(current_token, preserve_statement_flags);\n                }\n\n                if (last_type === 'TK_RESERVED' && is_special_word(flags.last_text)) {\n                    // \"return\" had a special handling in TK_WORD. Now we need to return the favor\n                    output.space_before_token = true;\n                    print_token();\n                    return;\n                }\n\n                // hack for actionscript's import .*;\n                if (current_token.text === '*' && last_type === 'TK_DOT') {\n                    print_token();\n                    return;\n                }\n\n                if (current_token.text === '::') {\n                    // no spaces around exotic namespacing syntax operator\n                    print_token();\n                    return;\n                }\n\n                // Allow line wrapping between operators when operator_position is\n                //   set to before or preserve\n                if (last_type === 'TK_OPERATOR' && in_array(opt.operator_position, OPERATOR_POSITION_BEFORE_OR_PRESERVE)) {\n                    allow_wrap_or_preserved_newline();\n                }\n\n                if (current_token.text === ':' && flags.in_case) {\n                    flags.case_body = true;\n                    indent();\n                    print_token();\n                    print_newline();\n                    flags.in_case = false;\n                    return;\n                }\n\n                var space_before = true;\n                var space_after = true;\n                var in_ternary = false;\n                if (current_token.text === ':') {\n                    if (flags.ternary_depth === 0) {\n                        // Colon is invalid javascript outside of ternary and object, but do our best to guess what was meant.\n                        space_before = false;\n                    } else {\n                        flags.ternary_depth -= 1;\n                        in_ternary = true;\n                    }\n                } else if (current_token.text === '?') {\n                    flags.ternary_depth += 1;\n                }\n\n                // let's handle the operator_position option prior to any conflicting logic\n                if (!isUnary && !isGeneratorAsterisk && opt.preserve_newlines && in_array(current_token.text, Tokenizer.positionable_operators)) {\n                    var isColon = current_token.text === ':';\n                    var isTernaryColon = (isColon && in_ternary);\n                    var isOtherColon = (isColon && !in_ternary);\n\n                    switch (opt.operator_position) {\n                        case OPERATOR_POSITION.before_newline:\n                            // if the current token is : and it's not a ternary statement then we set space_before to false\n                            output.space_before_token = !isOtherColon;\n\n                            print_token();\n\n                            if (!isColon || isTernaryColon) {\n                                allow_wrap_or_preserved_newline();\n                            }\n\n                            output.space_before_token = true;\n                            return;\n\n                        case OPERATOR_POSITION.after_newline:\n                            // if the current token is anything but colon, or (via deduction) it's a colon and in a ternary statement,\n                            //   then print a newline.\n\n                            output.space_before_token = true;\n\n                            if (!isColon || isTernaryColon) {\n                                if (get_token(1).wanted_newline) {\n                                    print_newline(false, true);\n                                } else {\n                                    allow_wrap_or_preserved_newline();\n                                }\n                            } else {\n                                output.space_before_token = false;\n                            }\n\n                            print_token();\n\n                            output.space_before_token = true;\n                            return;\n\n                        case OPERATOR_POSITION.preserve_newline:\n                            if (!isOtherColon) {\n                                allow_wrap_or_preserved_newline();\n                            }\n\n                            // if we just added a newline, or the current token is : and it's not a ternary statement,\n                            //   then we set space_before to false\n                            space_before = !(output.just_added_newline() || isOtherColon);\n\n                            output.space_before_token = space_before;\n                            print_token();\n                            output.space_before_token = true;\n                            return;\n                    }\n                }\n\n                if (isGeneratorAsterisk) {\n                    allow_wrap_or_preserved_newline();\n                    space_before = false;\n                    var next_token = get_token(1);\n                    space_after = next_token && in_array(next_token.type, ['TK_WORD', 'TK_RESERVED']);\n                } else if (current_token.text === '...') {\n                    allow_wrap_or_preserved_newline();\n                    space_before = last_type === 'TK_START_BLOCK';\n                    space_after = false;\n                } else if (in_array(current_token.text, ['--', '++', '!', '~']) || isUnary) {\n                    // unary operators (and binary +/- pretending to be unary) special cases\n\n                    space_before = false;\n                    space_after = false;\n\n                    // http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.1\n                    // if there is a newline between -- or ++ and anything else we should preserve it.\n                    if (current_token.wanted_newline && (current_token.text === '--' || current_token.text === '++')) {\n                        print_newline(false, true);\n                    }\n\n                    if (flags.last_text === ';' && is_expression(flags.mode)) {\n                        // for (;; ++i)\n                        //        ^^^\n                        space_before = true;\n                    }\n\n                    if (last_type === 'TK_RESERVED') {\n                        space_before = true;\n                    } else if (last_type === 'TK_END_EXPR') {\n                        space_before = !(flags.last_text === ']' && (current_token.text === '--' || current_token.text === '++'));\n                    } else if (last_type === 'TK_OPERATOR') {\n                        // a++ + ++b;\n                        // a - -b\n                        space_before = in_array(current_token.text, ['--', '-', '++', '+']) && in_array(flags.last_text, ['--', '-', '++', '+']);\n                        // + and - are not unary when preceeded by -- or ++ operator\n                        // a-- + b\n                        // a * +b\n                        // a - -b\n                        if (in_array(current_token.text, ['+', '-']) && in_array(flags.last_text, ['--', '++'])) {\n                            space_after = true;\n                        }\n                    }\n\n\n                    if (((flags.mode === MODE.BlockStatement && !flags.inline_frame) || flags.mode === MODE.Statement) &&\n                        (flags.last_text === '{' || flags.last_text === ';')) {\n                        // { foo; --i }\n                        // foo(); --bar;\n                        print_newline();\n                    }\n                }\n\n                output.space_before_token = output.space_before_token || space_before;\n                print_token();\n                output.space_before_token = space_after;\n            }\n\n            function handle_block_comment(preserve_statement_flags) {\n                if (output.raw) {\n                    output.add_raw_token(current_token);\n                    if (current_token.directives && current_token.directives.preserve === 'end') {\n                        // If we're testing the raw output behavior, do not allow a directive to turn it off.\n                        output.raw = opt.test_output_raw;\n                    }\n                    return;\n                }\n\n                if (current_token.directives) {\n                    print_newline(false, preserve_statement_flags);\n                    print_token();\n                    if (current_token.directives.preserve === 'start') {\n                        output.raw = true;\n                    }\n                    print_newline(false, true);\n                    return;\n                }\n\n                // inline block\n                if (!acorn.newline.test(current_token.text) && !current_token.wanted_newline) {\n                    output.space_before_token = true;\n                    print_token();\n                    output.space_before_token = true;\n                    return;\n                }\n\n                var lines = split_linebreaks(current_token.text);\n                var j; // iterator for this case\n                var javadoc = false;\n                var starless = false;\n                var lastIndent = current_token.whitespace_before;\n                var lastIndentLength = lastIndent.length;\n\n                // block comment starts with a new line\n                print_newline(false, preserve_statement_flags);\n                if (lines.length > 1) {\n                    javadoc = all_lines_start_with(lines.slice(1), '*');\n                    starless = each_line_matches_indent(lines.slice(1), lastIndent);\n                }\n\n                // first line always indented\n                print_token(lines[0]);\n                for (j = 1; j < lines.length; j++) {\n                    print_newline(false, true);\n                    if (javadoc) {\n                        // javadoc: reformat and re-indent\n                        print_token(' ' + ltrim(lines[j]));\n                    } else if (starless && lines[j].length > lastIndentLength) {\n                        // starless: re-indent non-empty content, avoiding trim\n                        print_token(lines[j].substring(lastIndentLength));\n                    } else {\n                        // normal comments output raw\n                        output.add_token(lines[j]);\n                    }\n                }\n\n                // for comments of more than one line, make sure there's a new line after\n                print_newline(false, preserve_statement_flags);\n            }\n\n            function handle_comment(preserve_statement_flags) {\n                if (current_token.wanted_newline) {\n                    print_newline(false, preserve_statement_flags);\n                } else {\n                    output.trim(true);\n                }\n\n                output.space_before_token = true;\n                print_token();\n                print_newline(false, preserve_statement_flags);\n            }\n\n            function handle_dot() {\n                if (start_of_statement()) {\n                    // The conditional starts the statement if appropriate.\n                } else {\n                    handle_whitespace_and_comments(current_token, true);\n                }\n\n                if (last_type === 'TK_RESERVED' && is_special_word(flags.last_text)) {\n                    output.space_before_token = true;\n                } else {\n                    // allow preserved newlines before dots in general\n                    // force newlines on dots after close paren when break_chained - for bar().baz()\n                    allow_wrap_or_preserved_newline(flags.last_text === ')' && opt.break_chained_methods);\n                }\n\n                print_token();\n            }\n\n            function handle_unknown(preserve_statement_flags) {\n                print_token();\n\n                if (current_token.text[current_token.text.length - 1] === '\\n') {\n                    print_newline(false, preserve_statement_flags);\n                }\n            }\n\n            function handle_eof() {\n                // Unwind any open statements\n                while (flags.mode === MODE.Statement) {\n                    restore_mode();\n                }\n                handle_whitespace_and_comments(current_token);\n            }\n        }\n\n\n        function OutputLine(parent) {\n            var _character_count = 0;\n            // use indent_count as a marker for lines that have preserved indentation\n            var _indent_count = -1;\n\n            var _items = [];\n            var _empty = true;\n\n            this.set_indent = function(level) {\n                _character_count = parent.baseIndentLength + level * parent.indent_length;\n                _indent_count = level;\n            };\n\n            this.get_character_count = function() {\n                return _character_count;\n            };\n\n            this.is_empty = function() {\n                return _empty;\n            };\n\n            this.last = function() {\n                if (!this._empty) {\n                    return _items[_items.length - 1];\n                } else {\n                    return null;\n                }\n            };\n\n            this.push = function(input) {\n                _items.push(input);\n                _character_count += input.length;\n                _empty = false;\n            };\n\n            this.pop = function() {\n                var item = null;\n                if (!_empty) {\n                    item = _items.pop();\n                    _character_count -= item.length;\n                    _empty = _items.length === 0;\n                }\n                return item;\n            };\n\n            this.remove_indent = function() {\n                if (_indent_count > 0) {\n                    _indent_count -= 1;\n                    _character_count -= parent.indent_length;\n                }\n            };\n\n            this.trim = function() {\n                while (this.last() === ' ') {\n                    _items.pop();\n                    _character_count -= 1;\n                }\n                _empty = _items.length === 0;\n            };\n\n            this.toString = function() {\n                var result = '';\n                if (!this._empty) {\n                    if (_indent_count >= 0) {\n                        result = parent.indent_cache[_indent_count];\n                    }\n                    result += _items.join('');\n                }\n                return result;\n            };\n        }\n\n        function Output(indent_string, baseIndentString) {\n            baseIndentString = baseIndentString || '';\n            this.indent_cache = [baseIndentString];\n            this.baseIndentLength = baseIndentString.length;\n            this.indent_length = indent_string.length;\n            this.raw = false;\n\n            var lines = [];\n            this.baseIndentString = baseIndentString;\n            this.indent_string = indent_string;\n            this.previous_line = null;\n            this.current_line = null;\n            this.space_before_token = false;\n\n            this.add_outputline = function() {\n                this.previous_line = this.current_line;\n                this.current_line = new OutputLine(this);\n                lines.push(this.current_line);\n            };\n\n            // initialize\n            this.add_outputline();\n\n\n            this.get_line_number = function() {\n                return lines.length;\n            };\n\n            // Using object instead of string to allow for later expansion of info about each line\n            this.add_new_line = function(force_newline) {\n                if (this.get_line_number() === 1 && this.just_added_newline()) {\n                    return false; // no newline on start of file\n                }\n\n                if (force_newline || !this.just_added_newline()) {\n                    if (!this.raw) {\n                        this.add_outputline();\n                    }\n                    return true;\n                }\n\n                return false;\n            };\n\n            this.get_code = function() {\n                var sweet_code = lines.join('\\n').replace(/[\\r\\n\\t ]+$/, '');\n                return sweet_code;\n            };\n\n            this.set_indent = function(level) {\n                // Never indent your first output indent at the start of the file\n                if (lines.length > 1) {\n                    while (level >= this.indent_cache.length) {\n                        this.indent_cache.push(this.indent_cache[this.indent_cache.length - 1] + this.indent_string);\n                    }\n\n                    this.current_line.set_indent(level);\n                    return true;\n                }\n                this.current_line.set_indent(0);\n                return false;\n            };\n\n            this.add_raw_token = function(token) {\n                for (var x = 0; x < token.newlines; x++) {\n                    this.add_outputline();\n                }\n                this.current_line.push(token.whitespace_before);\n                this.current_line.push(token.text);\n                this.space_before_token = false;\n            };\n\n            this.add_token = function(printable_token) {\n                this.add_space_before_token();\n                this.current_line.push(printable_token);\n            };\n\n            this.add_space_before_token = function() {\n                if (this.space_before_token && !this.just_added_newline()) {\n                    this.current_line.push(' ');\n                }\n                this.space_before_token = false;\n            };\n\n            this.remove_redundant_indentation = function(frame) {\n                // This implementation is effective but has some issues:\n                //     - can cause line wrap to happen too soon due to indent removal\n                //           after wrap points are calculated\n                // These issues are minor compared to ugly indentation.\n\n                if (frame.multiline_frame ||\n                    frame.mode === MODE.ForInitializer ||\n                    frame.mode === MODE.Conditional) {\n                    return;\n                }\n\n                // remove one indent from each line inside this section\n                var index = frame.start_line_index;\n\n                var output_length = lines.length;\n                while (index < output_length) {\n                    lines[index].remove_indent();\n                    index++;\n                }\n            };\n\n            this.trim = function(eat_newlines) {\n                eat_newlines = (eat_newlines === undefined) ? false : eat_newlines;\n\n                this.current_line.trim(indent_string, baseIndentString);\n\n                while (eat_newlines && lines.length > 1 &&\n                    this.current_line.is_empty()) {\n                    lines.pop();\n                    this.current_line = lines[lines.length - 1];\n                    this.current_line.trim();\n                }\n\n                this.previous_line = lines.length > 1 ? lines[lines.length - 2] : null;\n            };\n\n            this.just_added_newline = function() {\n                return this.current_line.is_empty();\n            };\n\n            this.just_added_blankline = function() {\n                if (this.just_added_newline()) {\n                    if (lines.length === 1) {\n                        return true; // start of the file and newline = blank\n                    }\n\n                    var line = lines[lines.length - 2];\n                    return line.is_empty();\n                }\n                return false;\n            };\n        }\n\n        var InputScanner = function(input) {\n            var _input = input;\n            var _input_length = _input.length;\n            var _position = 0;\n\n            this.back = function() {\n                _position -= 1;\n            };\n\n            this.hasNext = function() {\n                return _position < _input_length;\n            };\n\n            this.next = function() {\n                var val = null;\n                if (this.hasNext()) {\n                    val = _input.charAt(_position);\n                    _position += 1;\n                }\n                return val;\n            };\n\n            this.peek = function(index) {\n                var val = null;\n                index = index || 0;\n                index += _position;\n                if (index >= 0 && index < _input_length) {\n                    val = _input.charAt(index);\n                }\n                return val;\n            };\n\n            this.peekCharCode = function(index) {\n                var val = 0;\n                index = index || 0;\n                index += _position;\n                if (index >= 0 && index < _input_length) {\n                    val = _input.charCodeAt(index);\n                }\n                return val;\n            };\n\n            this.test = function(pattern, index) {\n                index = index || 0;\n                pattern.lastIndex = _position + index;\n                return pattern.test(_input);\n            };\n\n            this.testChar = function(pattern, index) {\n                var val = this.peek(index);\n                return val !== null && pattern.test(val);\n            };\n\n            this.match = function(pattern) {\n                pattern.lastIndex = _position;\n                var pattern_match = pattern.exec(_input);\n                if (pattern_match && pattern_match.index === _position) {\n                    _position += pattern_match[0].length;\n                } else {\n                    pattern_match = null;\n                }\n                return pattern_match;\n            };\n        };\n\n        var Token = function(type, text, newlines, whitespace_before, parent) {\n            this.type = type;\n            this.text = text;\n\n            // comments_before are\n            // comments that have a new line before them\n            // and may or may not have a newline after\n            // this is a set of comments before\n            this.comments_before = /* inline comment*/ [];\n\n\n            this.comments_after = []; // no new line before and newline after\n            this.newlines = newlines || 0;\n            this.wanted_newline = newlines > 0;\n            this.whitespace_before = whitespace_before || '';\n            this.parent = parent || null;\n            this.opened = null;\n            this.directives = null;\n        };\n\n        function tokenizer(input_string, opts) {\n\n            var whitespace = \"\\n\\r\\t \".split('');\n            var digit = /[0-9]/;\n            var digit_bin = /[01]/;\n            var digit_oct = /[01234567]/;\n            var digit_hex = /[0123456789abcdefABCDEF]/;\n\n            this.positionable_operators = '!= !== % & && * ** + - / : < << <= == === > >= >> >>> ? ^ | ||'.split(' ');\n            var punct = this.positionable_operators.concat(\n                // non-positionable operators - these do not follow operator position settings\n                '! %= &= *= **= ++ += , -- -= /= :: <<= = => >>= >>>= ^= |= ~ ...'.split(' '));\n\n            // words which should always start on new line.\n            this.line_starters = 'continue,try,throw,return,var,let,const,if,switch,case,default,for,while,break,function,import,export'.split(',');\n            var reserved_words = this.line_starters.concat(['do', 'in', 'of', 'else', 'get', 'set', 'new', 'catch', 'finally', 'typeof', 'yield', 'async', 'await', 'from', 'as']);\n\n            //  /* ... */ comment ends with nearest */ or end of file\n            var block_comment_pattern = /([\\s\\S]*?)((?:\\*\\/)|$)/g;\n\n            // comment ends just before nearest linefeed or end of file\n            var comment_pattern = /([^\\n\\r\\u2028\\u2029]*)/g;\n\n            var directives_block_pattern = /\\/\\* beautify( \\w+[:]\\w+)+ \\*\\//g;\n            var directive_pattern = / (\\w+)[:](\\w+)/g;\n            var directives_end_ignore_pattern = /([\\s\\S]*?)((?:\\/\\*\\sbeautify\\signore:end\\s\\*\\/)|$)/g;\n\n            var template_pattern = /((<\\?php|<\\?=)[\\s\\S]*?\\?>)|(<%[\\s\\S]*?%>)/g;\n\n            var n_newlines, whitespace_before_token, in_html_comment, tokens;\n            var input;\n\n            this.tokenize = function() {\n                input = new InputScanner(input_string);\n                in_html_comment = false;\n                tokens = [];\n\n                var next, last;\n                var token_values;\n                var open = null;\n                var open_stack = [];\n                var comments = [];\n\n                while (!(last && last.type === 'TK_EOF')) {\n                    token_values = tokenize_next();\n                    next = new Token(token_values[1], token_values[0], n_newlines, whitespace_before_token);\n                    while (next.type === 'TK_COMMENT' || next.type === 'TK_BLOCK_COMMENT' || next.type === 'TK_UNKNOWN') {\n                        if (next.type === 'TK_BLOCK_COMMENT') {\n                            next.directives = token_values[2];\n                        }\n                        comments.push(next);\n                        token_values = tokenize_next();\n                        next = new Token(token_values[1], token_values[0], n_newlines, whitespace_before_token);\n                    }\n\n                    if (comments.length) {\n                        next.comments_before = comments;\n                        comments = [];\n                    }\n\n                    if (next.type === 'TK_START_BLOCK' || next.type === 'TK_START_EXPR') {\n                        next.parent = last;\n                        open_stack.push(open);\n                        open = next;\n                    } else if ((next.type === 'TK_END_BLOCK' || next.type === 'TK_END_EXPR') &&\n                        (open && (\n                            (next.text === ']' && open.text === '[') ||\n                            (next.text === ')' && open.text === '(') ||\n                            (next.text === '}' && open.text === '{')))) {\n                        next.parent = open.parent;\n                        next.opened = open;\n\n                        open = open_stack.pop();\n                    }\n\n                    tokens.push(next);\n                    last = next;\n                }\n\n                return tokens;\n            };\n\n            function get_directives(text) {\n                if (!text.match(directives_block_pattern)) {\n                    return null;\n                }\n\n                var directives = {};\n                directive_pattern.lastIndex = 0;\n                var directive_match = directive_pattern.exec(text);\n\n                while (directive_match) {\n                    directives[directive_match[1]] = directive_match[2];\n                    directive_match = directive_pattern.exec(text);\n                }\n\n                return directives;\n            }\n\n            function tokenize_next() {\n                var resulting_string;\n                var whitespace_on_this_line = [];\n\n                n_newlines = 0;\n                whitespace_before_token = '';\n\n                var c = input.next();\n\n                if (c === null) {\n                    return ['', 'TK_EOF'];\n                }\n\n                var last_token;\n                if (tokens.length) {\n                    last_token = tokens[tokens.length - 1];\n                } else {\n                    // For the sake of tokenizing we can pretend that there was on open brace to start\n                    last_token = new Token('TK_START_BLOCK', '{');\n                }\n\n                while (in_array(c, whitespace)) {\n\n                    if (acorn.newline.test(c)) {\n                        if (!(c === '\\n' && input.peek(-2) === '\\r')) {\n                            n_newlines += 1;\n                            whitespace_on_this_line = [];\n                        }\n                    } else {\n                        whitespace_on_this_line.push(c);\n                    }\n\n                    c = input.next();\n\n                    if (c === null) {\n                        return ['', 'TK_EOF'];\n                    }\n                }\n\n                if (whitespace_on_this_line.length) {\n                    whitespace_before_token = whitespace_on_this_line.join('');\n                }\n\n                if (digit.test(c) || (c === '.' && input.testChar(digit))) {\n                    var allow_decimal = true;\n                    var allow_e = true;\n                    var local_digit = digit;\n\n                    if (c === '0' && input.testChar(/[XxOoBb]/)) {\n                        // switch to hex/oct/bin number, no decimal or e, just hex/oct/bin digits\n                        allow_decimal = false;\n                        allow_e = false;\n                        if (input.testChar(/[Bb]/)) {\n                            local_digit = digit_bin;\n                        } else if (input.testChar(/[Oo]/)) {\n                            local_digit = digit_oct;\n                        } else {\n                            local_digit = digit_hex;\n                        }\n                        c += input.next();\n                    } else if (c === '.') {\n                        // Already have a decimal for this literal, don't allow another\n                        allow_decimal = false;\n                    } else {\n                        // we know this first loop will run.  It keeps the logic simpler.\n                        c = '';\n                        input.back();\n                    }\n\n                    // Add the digits\n                    while (input.testChar(local_digit)) {\n                        c += input.next();\n\n                        if (allow_decimal && input.peek() === '.') {\n                            c += input.next();\n                            allow_decimal = false;\n                        }\n\n                        // a = 1.e-7 is valid, so we test for . then e in one loop\n                        if (allow_e && input.testChar(/[Ee]/)) {\n                            c += input.next();\n\n                            if (input.testChar(/[+-]/)) {\n                                c += input.next();\n                            }\n\n                            allow_e = false;\n                            allow_decimal = false;\n                        }\n                    }\n\n                    return [c, 'TK_WORD'];\n                }\n\n                if (acorn.isIdentifierStart(input.peekCharCode(-1))) {\n                    if (input.hasNext()) {\n                        while (acorn.isIdentifierChar(input.peekCharCode())) {\n                            c += input.next();\n                            if (!input.hasNext()) {\n                                break;\n                            }\n                        }\n                    }\n\n                    if (!(last_token.type === 'TK_DOT' ||\n                            (last_token.type === 'TK_RESERVED' && in_array(last_token.text, ['set', 'get']))) &&\n                        in_array(c, reserved_words)) {\n                        if (c === 'in' || c === 'of') { // hack for 'in' and 'of' operators\n                            return [c, 'TK_OPERATOR'];\n                        }\n                        return [c, 'TK_RESERVED'];\n                    }\n\n                    return [c, 'TK_WORD'];\n                }\n\n                if (c === '(' || c === '[') {\n                    return [c, 'TK_START_EXPR'];\n                }\n\n                if (c === ')' || c === ']') {\n                    return [c, 'TK_END_EXPR'];\n                }\n\n                if (c === '{') {\n                    return [c, 'TK_START_BLOCK'];\n                }\n\n                if (c === '}') {\n                    return [c, 'TK_END_BLOCK'];\n                }\n\n                if (c === ';') {\n                    return [c, 'TK_SEMICOLON'];\n                }\n\n                if (c === '/') {\n                    var comment = '';\n                    var comment_match;\n                    // peek for comment /* ... */\n                    if (input.peek() === '*') {\n                        input.next();\n                        comment_match = input.match(block_comment_pattern);\n                        comment = '/*' + comment_match[0];\n                        var directives = get_directives(comment);\n                        if (directives && directives.ignore === 'start') {\n                            comment_match = input.match(directives_end_ignore_pattern);\n                            comment += comment_match[0];\n                        }\n                        comment = comment.replace(acorn.allLineBreaks, '\\n');\n                        return [comment, 'TK_BLOCK_COMMENT', directives];\n                    }\n                    // peek for comment // ...\n                    if (input.peek() === '/') {\n                        input.next();\n                        comment_match = input.match(comment_pattern);\n                        comment = '//' + comment_match[0];\n                        return [comment, 'TK_COMMENT'];\n                    }\n\n                }\n\n                var startXmlRegExp = /<()([-a-zA-Z:0-9_.]+|{[\\s\\S]+?}|!\\[CDATA\\[[\\s\\S]*?\\]\\])(\\s+{[\\s\\S]+?}|\\s+[-a-zA-Z:0-9_.]+|\\s+[-a-zA-Z:0-9_.]+\\s*=\\s*('[^']*'|\"[^\"]*\"|{[\\s\\S]+?}))*\\s*(\\/?)\\s*>/g;\n\n                if (c === '`' || c === \"'\" || c === '\"' || // string\n                    (\n                        (c === '/') || // regexp\n                        (opts.e4x && c === \"<\" && input.test(startXmlRegExp, -1)) // xml\n                    ) && ( // regex and xml can only appear in specific locations during parsing\n                        (last_token.type === 'TK_RESERVED' && in_array(last_token.text, ['return', 'case', 'throw', 'else', 'do', 'typeof', 'yield'])) ||\n                        (last_token.type === 'TK_END_EXPR' && last_token.text === ')' &&\n                            last_token.parent && last_token.parent.type === 'TK_RESERVED' && in_array(last_token.parent.text, ['if', 'while', 'for'])) ||\n                        (in_array(last_token.type, ['TK_COMMENT', 'TK_START_EXPR', 'TK_START_BLOCK',\n                            'TK_END_BLOCK', 'TK_OPERATOR', 'TK_EQUALS', 'TK_EOF', 'TK_SEMICOLON', 'TK_COMMA'\n                        ]))\n                    )) {\n\n                    var sep = c,\n                        esc = false,\n                        has_char_escapes = false;\n\n                    resulting_string = c;\n\n                    if (sep === '/') {\n                        //\n                        // handle regexp\n                        //\n                        var in_char_class = false;\n                        while (input.hasNext() &&\n                            ((esc || in_char_class || input.peek() !== sep) &&\n                                !input.testChar(acorn.newline))) {\n                            resulting_string += input.peek();\n                            if (!esc) {\n                                esc = input.peek() === '\\\\';\n                                if (input.peek() === '[') {\n                                    in_char_class = true;\n                                } else if (input.peek() === ']') {\n                                    in_char_class = false;\n                                }\n                            } else {\n                                esc = false;\n                            }\n                            input.next();\n                        }\n                    } else if (opts.e4x && sep === '<') {\n                        //\n                        // handle e4x xml literals\n                        //\n\n                        var xmlRegExp = /[\\s\\S]*?<(\\/?)([-a-zA-Z:0-9_.]+|{[\\s\\S]+?}|!\\[CDATA\\[[\\s\\S]*?\\]\\])(\\s+{[\\s\\S]+?}|\\s+[-a-zA-Z:0-9_.]+|\\s+[-a-zA-Z:0-9_.]+\\s*=\\s*('[^']*'|\"[^\"]*\"|{[\\s\\S]+?}))*\\s*(\\/?)\\s*>/g;\n                        input.back();\n                        var xmlStr = '';\n                        var match = input.match(startXmlRegExp);\n                        if (match) {\n                            // Trim root tag to attempt to\n                            var rootTag = match[2].replace(/^{\\s+/, '{').replace(/\\s+}$/, '}');\n                            var isCurlyRoot = rootTag.indexOf('{') === 0;\n                            var depth = 0;\n                            while (match) {\n                                var isEndTag = !!match[1];\n                                var tagName = match[2];\n                                var isSingletonTag = (!!match[match.length - 1]) || (tagName.slice(0, 8) === \"![CDATA[\");\n                                if (!isSingletonTag &&\n                                    (tagName === rootTag || (isCurlyRoot && tagName.replace(/^{\\s+/, '{').replace(/\\s+}$/, '}')))) {\n                                    if (isEndTag) {\n                                        --depth;\n                                    } else {\n                                        ++depth;\n                                    }\n                                }\n                                xmlStr += match[0];\n                                if (depth <= 0) {\n                                    break;\n                                }\n                                match = input.match(xmlRegExp);\n                            }\n                            // if we didn't close correctly, keep unformatted.\n                            if (!match) {\n                                xmlStr += input.match(/[\\s\\S]*/g)[0];\n                            }\n                            xmlStr = xmlStr.replace(acorn.allLineBreaks, '\\n');\n                            return [xmlStr, \"TK_STRING\"];\n                        }\n                    } else {\n                        //\n                        // handle string\n                        //\n                        var parse_string = function(delimiter, allow_unescaped_newlines, start_sub) {\n                            // Template strings can travers lines without escape characters.\n                            // Other strings cannot\n                            var current_char;\n                            while (input.hasNext()) {\n                                current_char = input.peek();\n                                if (!(esc || (current_char !== delimiter &&\n                                        (allow_unescaped_newlines || !acorn.newline.test(current_char))))) {\n                                    break;\n                                }\n\n                                // Handle \\r\\n linebreaks after escapes or in template strings\n                                if ((esc || allow_unescaped_newlines) && acorn.newline.test(current_char)) {\n                                    if (current_char === '\\r' && input.peek(1) === '\\n') {\n                                        input.next();\n                                        current_char = input.peek();\n                                    }\n                                    resulting_string += '\\n';\n                                } else {\n                                    resulting_string += current_char;\n                                }\n\n                                if (esc) {\n                                    if (current_char === 'x' || current_char === 'u') {\n                                        has_char_escapes = true;\n                                    }\n                                    esc = false;\n                                } else {\n                                    esc = current_char === '\\\\';\n                                }\n\n                                input.next();\n\n                                if (start_sub && resulting_string.indexOf(start_sub, resulting_string.length - start_sub.length) !== -1) {\n                                    if (delimiter === '`') {\n                                        parse_string('}', allow_unescaped_newlines, '`');\n                                    } else {\n                                        parse_string('`', allow_unescaped_newlines, '${');\n                                    }\n\n                                    if (input.hasNext()) {\n                                        resulting_string += input.next();\n                                    }\n                                }\n                            }\n                        };\n\n                        if (sep === '`') {\n                            parse_string('`', true, '${');\n                        } else {\n                            parse_string(sep);\n                        }\n                    }\n\n                    if (has_char_escapes && opts.unescape_strings) {\n                        resulting_string = unescape_string(resulting_string);\n                    }\n\n                    if (input.peek() === sep) {\n                        resulting_string += sep;\n                        input.next();\n\n                        if (sep === '/') {\n                            // regexps may have modifiers /regexp/MOD , so fetch those, too\n                            // Only [gim] are valid, but if the user puts in garbage, do what we can to take it.\n                            while (input.hasNext() && acorn.isIdentifierStart(input.peekCharCode())) {\n                                resulting_string += input.next();\n                            }\n                        }\n                    }\n                    return [resulting_string, 'TK_STRING'];\n                }\n\n                if (c === '#') {\n\n                    if (tokens.length === 0 && input.peek() === '!') {\n                        // shebang\n                        resulting_string = c;\n                        while (input.hasNext() && c !== '\\n') {\n                            c = input.next();\n                            resulting_string += c;\n                        }\n                        return [trim(resulting_string) + '\\n', 'TK_UNKNOWN'];\n                    }\n\n\n\n                    // Spidermonkey-specific sharp variables for circular references\n                    // https://developer.mozilla.org/En/Sharp_variables_in_JavaScript\n                    // http://mxr.mozilla.org/mozilla-central/source/js/src/jsscan.cpp around line 1935\n                    var sharp = '#';\n                    if (input.hasNext() && input.testChar(digit)) {\n                        do {\n                            c = input.next();\n                            sharp += c;\n                        } while (input.hasNext() && c !== '#' && c !== '=');\n                        if (c === '#') {\n                            //\n                        } else if (input.peek() === '[' && input.peek(1) === ']') {\n                            sharp += '[]';\n                            input.next();\n                            input.next();\n                        } else if (input.peek() === '{' && input.peek(1) === '}') {\n                            sharp += '{}';\n                            input.next();\n                            input.next();\n                        }\n                        return [sharp, 'TK_WORD'];\n                    }\n                }\n\n                if (c === '<' && (input.peek() === '?' || input.peek() === '%')) {\n                    input.back();\n                    var template_match = input.match(template_pattern);\n                    if (template_match) {\n                        c = template_match[0];\n                        c = c.replace(acorn.allLineBreaks, '\\n');\n                        return [c, 'TK_STRING'];\n                    }\n                }\n\n                if (c === '<' && input.match(/\\!--/g)) {\n                    c = '', 'TK_COMMENT'];\n                }\n\n                if (c === '.') {\n                    if (input.peek() === '.' && input.peek(1) === '.') {\n                        c += input.next() + input.next();\n                        return [c, 'TK_OPERATOR'];\n                    }\n                    return [c, 'TK_DOT'];\n                }\n\n                if (in_array(c, punct)) {\n                    while (input.hasNext() && in_array(c + input.peek(), punct)) {\n                        c += input.next();\n                        if (!input.hasNext()) {\n                            break;\n                        }\n                    }\n\n                    if (c === ',') {\n                        return [c, 'TK_COMMA'];\n                    } else if (c === '=') {\n                        return [c, 'TK_EQUALS'];\n                    } else {\n                        return [c, 'TK_OPERATOR'];\n                    }\n                }\n\n                return [c, 'TK_UNKNOWN'];\n            }\n\n\n            function unescape_string(s) {\n                // You think that a regex would work for this\n                // return s.replace(/\\\\x([0-9a-f]{2})/gi, function(match, val) {\n                //         return String.fromCharCode(parseInt(val, 16));\n                //     })\n                // However, dealing with '\\xff', '\\\\xff', '\\\\\\xff' makes this more fun.\n                var out = '',\n                    escaped = 0;\n\n                var input_scan = new InputScanner(s);\n                var matched = null;\n\n                while (input_scan.hasNext()) {\n                    // Keep any whitespace, non-slash characters\n                    // also keep slash pairs.\n                    matched = input_scan.match(/([\\s]|[^\\\\]|\\\\\\\\)+/g);\n\n                    if (matched) {\n                        out += matched[0];\n                    }\n\n                    if (input_scan.peek() === '\\\\') {\n                        input_scan.next();\n                        if (input_scan.peek() === 'x') {\n                            matched = input_scan.match(/x([0-9A-Fa-f]{2})/g);\n                        } else if (input_scan.peek() === 'u') {\n                            matched = input_scan.match(/u([0-9A-Fa-f]{4})/g);\n                        } else {\n                            out += '\\\\';\n                            if (input_scan.hasNext()) {\n                                out += input_scan.next();\n                            }\n                            continue;\n                        }\n\n                        // If there's some error decoding, return the original string\n                        if (!matched) {\n                            return s;\n                        }\n\n                        escaped = parseInt(matched[1], 16);\n\n                        if (escaped > 0x7e && escaped <= 0xff && matched[0].indexOf('x') === 0) {\n                            // we bail out on \\x7f..\\xff,\n                            // leaving whole string escaped,\n                            // as it's probably completely binary\n                            return s;\n                        } else if (escaped >= 0x00 && escaped < 0x20) {\n                            // leave 0x00...0x1f escaped\n                            out += '\\\\' + matched[0];\n                            continue;\n                        } else if (escaped === 0x22 || escaped === 0x27 || escaped === 0x5c) {\n                            // single-quote, apostrophe, backslash - escape these\n                            out += '\\\\' + String.fromCharCode(escaped);\n                        } else {\n                            out += String.fromCharCode(escaped);\n                        }\n                    }\n                }\n\n                return out;\n            }\n        }\n\n        var beautifier = new Beautifier(js_source_text, options);\n        return beautifier.beautify();\n\n    }\n\n    if (typeof define === \"function\" && define.amd) {\n        // Add support for AMD ( https://github.com/amdjs/amdjs-api/wiki/AMD#defineamd-property- )\n        define([], function() {\n            return { js_beautify: js_beautify };\n        });\n    } else if (typeof exports !== \"undefined\") {\n        // Add support for CommonJS. Just put this file somewhere on your require.paths\n        // and you will be able to `var js_beautify = require(\"beautify\").js_beautify`.\n        exports.js_beautify = js_beautify;\n    } else if (typeof window !== \"undefined\") {\n        // If we're running a web page and don't have either of the above, add our one global\n        window.js_beautify = js_beautify;\n    } else if (typeof global !== \"undefined\") {\n        // If we don't even have window, try global.\n        global.js_beautify = js_beautify;\n    }\n\n}());","/**\n * @license\n * Lodash lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE\n */\n;(function(){function n(n,t){return n.set(t[0],t[1]),n}function t(n,t){return n.add(t),n}function r(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function e(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u\"']/g,J=RegExp(G.source),Y=RegExp(H.source),Q=/<%-([\\s\\S]+?)%>/g,X=/<%([\\s\\S]+?)%>/g,nn=/<%=([\\s\\S]+?)%>/g,tn=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,rn=/^\\w*$/,en=/^\\./,un=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,on=/[\\\\^$.*+?()[\\]{}|]/g,fn=RegExp(on.source),cn=/^\\s+|\\s+$/g,an=/^\\s+/,ln=/\\s+$/,sn=/\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,hn=/\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,pn=/,? & /,_n=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g,vn=/\\\\(\\\\)?/g,gn=/\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g,dn=/\\w*$/,yn=/^[-+]0x[0-9a-f]+$/i,bn=/^0b[01]+$/i,xn=/^\\[object .+?Constructor\\]$/,jn=/^0o[0-7]+$/i,wn=/^(?:0|[1-9]\\d*)$/,mn=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,An=/($^)/,kn=/['\\n\\r\\u2028\\u2029\\\\]/g,En=\"[\\\\ufe0e\\\\ufe0f]?(?:[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]|\\\\ud83c[\\\\udffb-\\\\udfff])?(?:\\\\u200d(?:[^\\\\ud800-\\\\udfff]|(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}|[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff])[\\\\ufe0e\\\\ufe0f]?(?:[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]|\\\\ud83c[\\\\udffb-\\\\udfff])?)*\",On=\"(?:[\\\\u2700-\\\\u27bf]|(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}|[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff])\"+En,Sn=\"(?:[^\\\\ud800-\\\\udfff][\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]?|[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]|(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}|[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]|[\\\\ud800-\\\\udfff])\",In=RegExp(\"['\\u2019]\",\"g\"),Rn=RegExp(\"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",\"g\"),zn=RegExp(\"\\\\ud83c[\\\\udffb-\\\\udfff](?=\\\\ud83c[\\\\udffb-\\\\udfff])|\"+Sn+En,\"g\"),Wn=RegExp([\"[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]?[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]+(?:['\\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000]|[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]|$)|(?:[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]|[^\\\\ud800-\\\\udfff\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\d+\\\\u2700-\\\\u27bfa-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xffA-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde])+(?:['\\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000]|[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde](?:[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]|[^\\\\ud800-\\\\udfff\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\d+\\\\u2700-\\\\u27bfa-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xffA-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde])|$)|[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]?(?:[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]|[^\\\\ud800-\\\\udfff\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\d+\\\\u2700-\\\\u27bfa-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xffA-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde])+(?:['\\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]+(?:['\\u2019](?:D|LL|M|RE|S|T|VE))?|\\\\d*(?:(?:1ST|2ND|3RD|(?![123])\\\\dTH)\\\\b)|\\\\d*(?:(?:1st|2nd|3rd|(?![123])\\\\dth)\\\\b)|\\\\d+\",On].join(\"|\"),\"g\"),Bn=RegExp(\"[\\\\u200d\\\\ud800-\\\\udfff\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\\\\ufe0e\\\\ufe0f]\"),Ln=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Un=\"Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout\".split(\" \"),Cn={};\nCn[\"[object Float32Array]\"]=Cn[\"[object Float64Array]\"]=Cn[\"[object Int8Array]\"]=Cn[\"[object Int16Array]\"]=Cn[\"[object Int32Array]\"]=Cn[\"[object Uint8Array]\"]=Cn[\"[object Uint8ClampedArray]\"]=Cn[\"[object Uint16Array]\"]=Cn[\"[object Uint32Array]\"]=true,Cn[\"[object Arguments]\"]=Cn[\"[object Array]\"]=Cn[\"[object ArrayBuffer]\"]=Cn[\"[object Boolean]\"]=Cn[\"[object DataView]\"]=Cn[\"[object Date]\"]=Cn[\"[object Error]\"]=Cn[\"[object Function]\"]=Cn[\"[object Map]\"]=Cn[\"[object Number]\"]=Cn[\"[object Object]\"]=Cn[\"[object RegExp]\"]=Cn[\"[object Set]\"]=Cn[\"[object String]\"]=Cn[\"[object WeakMap]\"]=false;\nvar Dn={};Dn[\"[object Arguments]\"]=Dn[\"[object Array]\"]=Dn[\"[object ArrayBuffer]\"]=Dn[\"[object DataView]\"]=Dn[\"[object Boolean]\"]=Dn[\"[object Date]\"]=Dn[\"[object Float32Array]\"]=Dn[\"[object Float64Array]\"]=Dn[\"[object Int8Array]\"]=Dn[\"[object Int16Array]\"]=Dn[\"[object Int32Array]\"]=Dn[\"[object Map]\"]=Dn[\"[object Number]\"]=Dn[\"[object Object]\"]=Dn[\"[object RegExp]\"]=Dn[\"[object Set]\"]=Dn[\"[object String]\"]=Dn[\"[object Symbol]\"]=Dn[\"[object Uint8Array]\"]=Dn[\"[object Uint8ClampedArray]\"]=Dn[\"[object Uint16Array]\"]=Dn[\"[object Uint32Array]\"]=true,\nDn[\"[object Error]\"]=Dn[\"[object Function]\"]=Dn[\"[object WeakMap]\"]=false;var Mn,Tn={\"\\\\\":\"\\\\\",\"'\":\"'\",\"\\n\":\"n\",\"\\r\":\"r\",\"\\u2028\":\"u2028\",\"\\u2029\":\"u2029\"},$n=parseFloat,Fn=parseInt,Nn=typeof global==\"object\"&&global&&global.Object===Object&&global,Pn=typeof self==\"object\"&&self&&self.Object===Object&&self,Zn=Nn||Pn||Function(\"return this\")(),qn=typeof exports==\"object\"&&exports&&!exports.nodeType&&exports,Vn=qn&&typeof module==\"object\"&&module&&!module.nodeType&&module,Kn=Vn&&Vn.exports===qn,Gn=Kn&&Nn.process;\nn:{try{Mn=Gn&&Gn.binding&&Gn.binding(\"util\");break n}catch(n){}Mn=void 0}var Hn=Mn&&Mn.isArrayBuffer,Jn=Mn&&Mn.isDate,Yn=Mn&&Mn.isMap,Qn=Mn&&Mn.isRegExp,Xn=Mn&&Mn.isSet,nt=Mn&&Mn.isTypedArray,tt=j(\"length\"),rt=w({\"\\xc0\":\"A\",\"\\xc1\":\"A\",\"\\xc2\":\"A\",\"\\xc3\":\"A\",\"\\xc4\":\"A\",\"\\xc5\":\"A\",\"\\xe0\":\"a\",\"\\xe1\":\"a\",\"\\xe2\":\"a\",\"\\xe3\":\"a\",\"\\xe4\":\"a\",\"\\xe5\":\"a\",\"\\xc7\":\"C\",\"\\xe7\":\"c\",\"\\xd0\":\"D\",\"\\xf0\":\"d\",\"\\xc8\":\"E\",\"\\xc9\":\"E\",\"\\xca\":\"E\",\"\\xcb\":\"E\",\"\\xe8\":\"e\",\"\\xe9\":\"e\",\"\\xea\":\"e\",\"\\xeb\":\"e\",\"\\xcc\":\"I\",\"\\xcd\":\"I\",\"\\xce\":\"I\",\n\"\\xcf\":\"I\",\"\\xec\":\"i\",\"\\xed\":\"i\",\"\\xee\":\"i\",\"\\xef\":\"i\",\"\\xd1\":\"N\",\"\\xf1\":\"n\",\"\\xd2\":\"O\",\"\\xd3\":\"O\",\"\\xd4\":\"O\",\"\\xd5\":\"O\",\"\\xd6\":\"O\",\"\\xd8\":\"O\",\"\\xf2\":\"o\",\"\\xf3\":\"o\",\"\\xf4\":\"o\",\"\\xf5\":\"o\",\"\\xf6\":\"o\",\"\\xf8\":\"o\",\"\\xd9\":\"U\",\"\\xda\":\"U\",\"\\xdb\":\"U\",\"\\xdc\":\"U\",\"\\xf9\":\"u\",\"\\xfa\":\"u\",\"\\xfb\":\"u\",\"\\xfc\":\"u\",\"\\xdd\":\"Y\",\"\\xfd\":\"y\",\"\\xff\":\"y\",\"\\xc6\":\"Ae\",\"\\xe6\":\"ae\",\"\\xde\":\"Th\",\"\\xfe\":\"th\",\"\\xdf\":\"ss\",\"\\u0100\":\"A\",\"\\u0102\":\"A\",\"\\u0104\":\"A\",\"\\u0101\":\"a\",\"\\u0103\":\"a\",\"\\u0105\":\"a\",\"\\u0106\":\"C\",\"\\u0108\":\"C\",\"\\u010a\":\"C\",\n\"\\u010c\":\"C\",\"\\u0107\":\"c\",\"\\u0109\":\"c\",\"\\u010b\":\"c\",\"\\u010d\":\"c\",\"\\u010e\":\"D\",\"\\u0110\":\"D\",\"\\u010f\":\"d\",\"\\u0111\":\"d\",\"\\u0112\":\"E\",\"\\u0114\":\"E\",\"\\u0116\":\"E\",\"\\u0118\":\"E\",\"\\u011a\":\"E\",\"\\u0113\":\"e\",\"\\u0115\":\"e\",\"\\u0117\":\"e\",\"\\u0119\":\"e\",\"\\u011b\":\"e\",\"\\u011c\":\"G\",\"\\u011e\":\"G\",\"\\u0120\":\"G\",\"\\u0122\":\"G\",\"\\u011d\":\"g\",\"\\u011f\":\"g\",\"\\u0121\":\"g\",\"\\u0123\":\"g\",\"\\u0124\":\"H\",\"\\u0126\":\"H\",\"\\u0125\":\"h\",\"\\u0127\":\"h\",\"\\u0128\":\"I\",\"\\u012a\":\"I\",\"\\u012c\":\"I\",\"\\u012e\":\"I\",\"\\u0130\":\"I\",\"\\u0129\":\"i\",\"\\u012b\":\"i\",\"\\u012d\":\"i\",\n\"\\u012f\":\"i\",\"\\u0131\":\"i\",\"\\u0134\":\"J\",\"\\u0135\":\"j\",\"\\u0136\":\"K\",\"\\u0137\":\"k\",\"\\u0138\":\"k\",\"\\u0139\":\"L\",\"\\u013b\":\"L\",\"\\u013d\":\"L\",\"\\u013f\":\"L\",\"\\u0141\":\"L\",\"\\u013a\":\"l\",\"\\u013c\":\"l\",\"\\u013e\":\"l\",\"\\u0140\":\"l\",\"\\u0142\":\"l\",\"\\u0143\":\"N\",\"\\u0145\":\"N\",\"\\u0147\":\"N\",\"\\u014a\":\"N\",\"\\u0144\":\"n\",\"\\u0146\":\"n\",\"\\u0148\":\"n\",\"\\u014b\":\"n\",\"\\u014c\":\"O\",\"\\u014e\":\"O\",\"\\u0150\":\"O\",\"\\u014d\":\"o\",\"\\u014f\":\"o\",\"\\u0151\":\"o\",\"\\u0154\":\"R\",\"\\u0156\":\"R\",\"\\u0158\":\"R\",\"\\u0155\":\"r\",\"\\u0157\":\"r\",\"\\u0159\":\"r\",\"\\u015a\":\"S\",\"\\u015c\":\"S\",\n\"\\u015e\":\"S\",\"\\u0160\":\"S\",\"\\u015b\":\"s\",\"\\u015d\":\"s\",\"\\u015f\":\"s\",\"\\u0161\":\"s\",\"\\u0162\":\"T\",\"\\u0164\":\"T\",\"\\u0166\":\"T\",\"\\u0163\":\"t\",\"\\u0165\":\"t\",\"\\u0167\":\"t\",\"\\u0168\":\"U\",\"\\u016a\":\"U\",\"\\u016c\":\"U\",\"\\u016e\":\"U\",\"\\u0170\":\"U\",\"\\u0172\":\"U\",\"\\u0169\":\"u\",\"\\u016b\":\"u\",\"\\u016d\":\"u\",\"\\u016f\":\"u\",\"\\u0171\":\"u\",\"\\u0173\":\"u\",\"\\u0174\":\"W\",\"\\u0175\":\"w\",\"\\u0176\":\"Y\",\"\\u0177\":\"y\",\"\\u0178\":\"Y\",\"\\u0179\":\"Z\",\"\\u017b\":\"Z\",\"\\u017d\":\"Z\",\"\\u017a\":\"z\",\"\\u017c\":\"z\",\"\\u017e\":\"z\",\"\\u0132\":\"IJ\",\"\\u0133\":\"ij\",\"\\u0152\":\"Oe\",\"\\u0153\":\"oe\",\n\"\\u0149\":\"'n\",\"\\u017f\":\"s\"}),et=w({\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\"}),ut=w({\"&\":\"&\",\"<\":\"<\",\">\":\">\",\""\":'\"',\"'\":\"'\"}),it=function w(En){function On(n){if(xu(n)&&!af(n)&&!(n instanceof Mn)){if(n instanceof zn)return n;if(ci.call(n,\"__wrapped__\"))return Pe(n)}return new zn(n)}function Sn(){}function zn(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=F}function Mn(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,\nthis.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Tn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function dt(n,t,r,e,i,o){var f,c=1&t,a=2&t,l=4&t;if(r&&(f=i?r(n,e,i,o):r(n)),f!==F)return f;if(!bu(n))return n;if(e=af(n)){if(f=Ee(n),!c)return Mr(n,f)}else{var s=yo(n),h=\"[object Function]\"==s||\"[object GeneratorFunction]\"==s;if(sf(n))return Wr(n,c);if(\"[object Object]\"==s||\"[object Arguments]\"==s||h&&!i){if(f=a||h?{}:Oe(n),!c)return a?Fr(n,pt(f,n)):$r(n,ht(f,n))}else{if(!Dn[s])return i?n:{};f=Se(n,s,dt,c)}}if(o||(o=new Vn),\ni=o.get(n))return i;o.set(n,f);var a=l?a?ye:de:a?Uu:Lu,p=e?F:a(n);return u(p||n,function(e,u){p&&(u=e,e=n[u]),at(f,u,dt(e,t,r,u,n,o))}),f}function yt(n){var t=Lu(n);return function(r){return bt(r,n,t)}}function bt(n,t,r){var e=r.length;if(null==n)return!e;for(n=ni(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===F&&!(u in n)||!i(o))return false}return true}function xt(n,t,r){if(typeof n!=\"function\")throw new ei(\"Expected a function\");return jo(function(){n.apply(F,r)},t)}function jt(n,t,r,e){var u=-1,i=c,o=true,f=n.length,s=[],h=t.length;\nif(!f)return s;r&&(t=l(t,S(r))),e?(i=a,o=false):200<=t.length&&(i=R,o=false,t=new qn(t));n:for(;++ut}function Bt(n,t){return null!=n&&ci.call(n,t)}function Lt(n,t){return null!=n&&t in ni(n)}function Ut(n,t,r){for(var e=r?a:c,u=n[0].length,i=n.length,o=i,f=Hu(i),s=1/0,h=[];o--;){var p=n[o];o&&t&&(p=l(p,S(t))),s=Mi(p.length,s),f[o]=!r&&(t||120<=u&&120<=p.length)?new qn(o&&p):F}var p=n[0],_=-1,v=f[0];n:for(;++_t.length?n:It(n,vr(t,0,-1)),t=null==n?n:n[$e(Ge(t))],null==t?F:r(t,n,e)}function Mt(n){return xu(n)&&\"[object Arguments]\"==zt(n)}function Tt(n){return xu(n)&&\"[object ArrayBuffer]\"==zt(n)}function $t(n){return xu(n)&&\"[object Date]\"==zt(n)}function Ft(n,t,r,e,u){if(n===t)t=true;else if(null==n||null==t||!xu(n)&&!xu(t))t=n!==n&&t!==t;else n:{\nvar i=af(n),o=af(t),f=i?\"[object Array]\":yo(n),c=o?\"[object Array]\":yo(t),f=\"[object Arguments]\"==f?\"[object Object]\":f,c=\"[object Arguments]\"==c?\"[object Object]\":c,a=\"[object Object]\"==f,o=\"[object Object]\"==c;if((c=f==c)&&sf(n)){if(!sf(t)){t=false;break n}i=true,a=false}if(c&&!a)u||(u=new Vn),t=i||gf(n)?_e(n,t,r,e,Ft,u):ve(n,t,f,r,e,Ft,u);else{if(!(1&r)&&(i=a&&ci.call(n,\"__wrapped__\"),f=o&&ci.call(t,\"__wrapped__\"),i||f)){n=i?n.value():n,t=f?t.value():t,u||(u=new Vn),t=Ft(n,t,r,e,u);break n}if(c)t:if(u||(u=new Vn),\ni=1&r,f=de(n),o=f.length,c=de(t).length,o==c||i){for(a=o;a--;){var l=f[a];if(!(i?l in t:ci.call(t,l))){t=false;break t}}if((c=u.get(n))&&u.get(t))t=c==t;else{c=true,u.set(n,t),u.set(t,n);for(var s=i;++at?r:0,Re(t,r)?n[t]:F}function rr(n,t,r){var e=-1;return t=l(t.length?t:[Nu],S(je())),n=Yt(n,function(n){return{a:l(t,function(t){return t(n)}),b:++e,c:n}}),A(n,function(n,t){var e;n:{e=-1;for(var u=n.a,i=t.a,o=u.length,f=r.length;++e=f?c:c*(\"desc\"==r[e]?-1:1);\nbreak n}}e=n.b-t.b}return e})}function er(n,t){return ur(n,t,function(t,r){return Bu(n,r)})}function ur(n,t,r){for(var e=-1,u=t.length,i={};++et||9007199254740991t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Hu(u);++e=u){for(;e>>1,o=n[i];null!==o&&!Au(o)&&(r?o<=t:ot.length?n:It(n,vr(t,0,-1)),\nnull==n||delete n[$e(Ge(t))]}function Ar(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++ie)return e?wr(n[0]):[];for(var u=-1,i=Hu(e);++u=e?n:vr(n,t,r)}function Wr(n,t){if(t)return n.slice();var r=n.length,r=yi?yi(r):new n.constructor(r);return n.copy(r),r}function Br(n){var t=new n.constructor(n.byteLength);return new di(t).set(new di(n)),t}function Lr(n,t){return new n.constructor(t?Br(n.buffer):n.buffer,n.byteOffset,n.length)}function Ur(n,t){\nif(n!==t){var r=n!==F,e=null===n,u=n===n,i=Au(n),o=t!==F,f=null===t,c=t===t,a=Au(t);if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&nu?F:i,u=1),t=ni(t);++eo&&f[0]!==a&&f[o-1]!==a?[]:C(f,a),o-=c.length,or?r?ar(t,n):t:(r=ar(t,Ri(n/T(t))),Bn.test(t)?zr($(r),0,n).join(\"\"):r.slice(0,n))}function ue(n,t,e,u){function i(){for(var t=-1,c=arguments.length,a=-1,l=u.length,s=Hu(l+c),h=this&&this!==Zn&&this instanceof i?f:n;++at||e)&&(1&n&&(i[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=i[3],i[3]=e?Cr(e,r,h[4]):r,i[4]=e?C(i[3],\"__lodash_placeholder__\"):h[4]),(r=h[5])&&(e=i[5],i[5]=e?Dr(e,r,h[6]):r,i[6]=e?C(i[5],\"__lodash_placeholder__\"):h[6]),(r=h[7])&&(i[7]=r),128&n&&(i[8]=null==i[8]?h[8]:Mi(i[8],h[8])),null==i[9]&&(i[9]=h[9]),i[0]=h[0],i[1]=t),n=i[0],t=i[1],\nr=i[2],e=i[3],u=i[4],f=i[9]=i[9]===F?c?0:n.length:Di(i[9]-a,0),!f&&24&t&&(t&=-25),De((h?lo:xo)(t&&1!=t?8==t||16==t?Jr(n,t,f):32!=t&&33!=t||u.length?Xr.apply(F,i):ue(n,t,r,e):Vr(n,t,r),i),n,t)}function se(n,t,r,e){return n===F||hu(n,ii[r])&&!ci.call(e,r)?t:n}function he(n,t,r,e,u,i){return bu(n)&&bu(t)&&(i.set(t,n),nr(n,t,F,he,i),i.delete(t)),n}function pe(n){return wu(n)?F:n}function _e(n,t,r,e,u,i){var o=1&r,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return false;if((c=i.get(n))&&i.get(t))return c==t;var c=-1,a=true,l=2&r?new qn:F;\nfor(i.set(n,t),i.set(t,n);++cr&&(r=Di(e+r,0)),g(n,je(t,3),r)):-1}function qe(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==F&&(u=Ou(r),u=0>r?Di(e+u,0):Mi(u,e-1)),\ng(n,je(t,3),u,true)}function Ve(n){return(null==n?0:n.length)?kt(n,1):[]}function Ke(n){return n&&n.length?n[0]:F}function Ge(n){var t=null==n?0:n.length;return t?n[t-1]:F}function He(n,t){return n&&n.length&&t&&t.length?or(n,t):n}function Je(n){return null==n?n:Ni.call(n)}function Ye(n){if(!n||!n.length)return[];var t=0;return n=f(n,function(n){if(_u(n))return t=Di(n.length,t),true}),E(t,function(t){return l(n,j(t))})}function Qe(n,t){if(!n||!n.length)return[];var e=Ye(n);return null==t?e:l(e,function(n){\nreturn r(t,F,n)})}function Xe(n){return n=On(n),n.__chain__=true,n}function nu(n,t){return t(n)}function tu(){return this}function ru(n,t){return(af(n)?u:oo)(n,je(t,3))}function eu(n,t){return(af(n)?i:fo)(n,je(t,3))}function uu(n,t){return(af(n)?l:Yt)(n,je(t,3))}function iu(n,t,r){return t=r?F:t,t=n&&null==t?n.length:t,le(n,128,F,F,F,F,t)}function ou(n,t){var r;if(typeof t!=\"function\")throw new ei(\"Expected a function\");return n=Ou(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=F),\nr}}function fu(n,t,r){return t=r?F:t,n=le(n,8,F,F,F,F,F,t),n.placeholder=fu.placeholder,n}function cu(n,t,r){return t=r?F:t,n=le(n,16,F,F,F,F,F,t),n.placeholder=cu.placeholder,n}function au(n,t,r){function e(t){var r=c,e=a;return c=a=F,_=t,s=n.apply(e,r)}function u(n){var r=n-p;return n-=_,p===F||r>=t||0>r||g&&n>=l}function i(){var n=Jo();if(u(n))return o(n);var r,e=jo;r=n-_,n=t-(n-p),r=g?Mi(n,l-r):n,h=e(i,r)}function o(n){return h=F,d&&c?e(n):(c=a=F,s)}function f(){var n=Jo(),r=u(n);if(c=arguments,\na=this,p=n,r){if(h===F)return _=n=p,h=jo(i,t),v?e(n):s;if(g)return h=jo(i,t),e(p)}return h===F&&(h=jo(i,t)),s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof n!=\"function\")throw new ei(\"Expected a function\");return t=Iu(t)||0,bu(r)&&(v=!!r.leading,l=(g=\"maxWait\"in r)?Di(Iu(r.maxWait)||0,t):l,d=\"trailing\"in r?!!r.trailing:d),f.cancel=function(){h!==F&&ho(h),_=0,c=p=a=h=F},f.flush=function(){return h===F?s:o(Jo())},f}function lu(n,t){function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;return i.has(u)?i.get(u):(e=n.apply(this,e),\nr.cache=i.set(u,e)||i,e)}if(typeof n!=\"function\"||null!=t&&typeof t!=\"function\")throw new ei(\"Expected a function\");return r.cache=new(lu.Cache||Pn),r}function su(n){if(typeof n!=\"function\")throw new ei(\"Expected a function\");return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function hu(n,t){return n===t||n!==n&&t!==t}function pu(n){return null!=n&&yu(n.length)&&!gu(n);\n}function _u(n){return xu(n)&&pu(n)}function vu(n){if(!xu(n))return false;var t=zt(n);return\"[object Error]\"==t||\"[object DOMException]\"==t||typeof n.message==\"string\"&&typeof n.name==\"string\"&&!wu(n)}function gu(n){return!!bu(n)&&(n=zt(n),\"[object Function]\"==n||\"[object GeneratorFunction]\"==n||\"[object AsyncFunction]\"==n||\"[object Proxy]\"==n)}function du(n){return typeof n==\"number\"&&n==Ou(n)}function yu(n){return typeof n==\"number\"&&-1=n}function bu(n){var t=typeof n;return null!=n&&(\"object\"==t||\"function\"==t);\n}function xu(n){return null!=n&&typeof n==\"object\"}function ju(n){return typeof n==\"number\"||xu(n)&&\"[object Number]\"==zt(n)}function wu(n){return!(!xu(n)||\"[object Object]\"!=zt(n))&&(n=bi(n),null===n||(n=ci.call(n,\"constructor\")&&n.constructor,typeof n==\"function\"&&n instanceof n&&fi.call(n)==hi))}function mu(n){return typeof n==\"string\"||!af(n)&&xu(n)&&\"[object String]\"==zt(n)}function Au(n){return typeof n==\"symbol\"||xu(n)&&\"[object Symbol]\"==zt(n)}function ku(n){if(!n)return[];if(pu(n))return mu(n)?$(n):Mr(n);\nif(Ai&&n[Ai]){n=n[Ai]();for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}return t=yo(n),(\"[object Map]\"==t?L:\"[object Set]\"==t?D:Du)(n)}function Eu(n){return n?(n=Iu(n),n===N||n===-N?1.7976931348623157e308*(0>n?-1:1):n===n?n:0):0===n?n:0}function Ou(n){n=Eu(n);var t=n%1;return n===n?t?n-t:n:0}function Su(n){return n?gt(Ou(n),0,4294967295):0}function Iu(n){if(typeof n==\"number\")return n;if(Au(n))return P;if(bu(n)&&(n=typeof n.valueOf==\"function\"?n.valueOf():n,n=bu(n)?n+\"\":n),typeof n!=\"string\")return 0===n?n:+n;\nn=n.replace(cn,\"\");var t=bn.test(n);return t||jn.test(n)?Fn(n.slice(2),t?2:8):yn.test(n)?P:+n}function Ru(n){return Tr(n,Uu(n))}function zu(n){return null==n?\"\":jr(n)}function Wu(n,t,r){return n=null==n?F:It(n,t),n===F?r:n}function Bu(n,t){return null!=n&&ke(n,t,Lt)}function Lu(n){return pu(n)?Gn(n):Ht(n)}function Uu(n){if(pu(n))n=Gn(n,true);else if(bu(n)){var t,r=Le(n),e=[];for(t in n)(\"constructor\"!=t||!r&&ci.call(n,t))&&e.push(t);n=e}else{if(t=[],null!=n)for(r in ni(n))t.push(r);n=t}return n}function Cu(n,t){\nif(null==n)return{};var r=l(ye(n),function(n){return[n]});return t=je(t),ur(n,r,function(n,r){return t(n,r[0])})}function Du(n){return null==n?[]:I(n,Lu(n))}function Mu(n){return Nf(zu(n).toLowerCase())}function Tu(n){return(n=zu(n))&&n.replace(mn,rt).replace(Rn,\"\")}function $u(n,t,r){return n=zu(n),t=r?F:t,t===F?Ln.test(n)?n.match(Wn)||[]:n.match(_n)||[]:n.match(t)||[]}function Fu(n){return function(){return n}}function Nu(n){return n}function Pu(n){return Gt(typeof n==\"function\"?n:dt(n,1))}function Zu(n,t,r){\nvar e=Lu(t),i=St(t,e);null!=r||bu(t)&&(i.length||!e.length)||(r=t,t=n,n=this,i=St(t,Lu(t)));var o=!(bu(r)&&\"chain\"in r&&!r.chain),f=gu(n);return u(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Mr(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,s([this.value()],arguments))})}),n}function qu(){}function Vu(n){return We(n)?j($e(n)):ir(n)}function Ku(){return[]}function Gu(){\nreturn false}En=null==En?Zn:it.defaults(Zn.Object(),En,it.pick(Zn,Un));var Hu=En.Array,Ju=En.Date,Yu=En.Error,Qu=En.Function,Xu=En.Math,ni=En.Object,ti=En.RegExp,ri=En.String,ei=En.TypeError,ui=Hu.prototype,ii=ni.prototype,oi=En[\"__core-js_shared__\"],fi=Qu.prototype.toString,ci=ii.hasOwnProperty,ai=0,li=function(){var n=/[^.]+$/.exec(oi&&oi.keys&&oi.keys.IE_PROTO||\"\");return n?\"Symbol(src)_1.\"+n:\"\"}(),si=ii.toString,hi=fi.call(ni),pi=Zn._,_i=ti(\"^\"+fi.call(ci).replace(on,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\"),vi=Kn?En.Buffer:F,gi=En.Symbol,di=En.Uint8Array,yi=vi?vi.f:F,bi=U(ni.getPrototypeOf,ni),xi=ni.create,ji=ii.propertyIsEnumerable,wi=ui.splice,mi=gi?gi.isConcatSpreadable:F,Ai=gi?gi.iterator:F,ki=gi?gi.toStringTag:F,Ei=function(){\ntry{var n=Ae(ni,\"defineProperty\");return n({},\"\",{}),n}catch(n){}}(),Oi=En.clearTimeout!==Zn.clearTimeout&&En.clearTimeout,Si=Ju&&Ju.now!==Zn.Date.now&&Ju.now,Ii=En.setTimeout!==Zn.setTimeout&&En.setTimeout,Ri=Xu.ceil,zi=Xu.floor,Wi=ni.getOwnPropertySymbols,Bi=vi?vi.isBuffer:F,Li=En.isFinite,Ui=ui.join,Ci=U(ni.keys,ni),Di=Xu.max,Mi=Xu.min,Ti=Ju.now,$i=En.parseInt,Fi=Xu.random,Ni=ui.reverse,Pi=Ae(En,\"DataView\"),Zi=Ae(En,\"Map\"),qi=Ae(En,\"Promise\"),Vi=Ae(En,\"Set\"),Ki=Ae(En,\"WeakMap\"),Gi=Ae(ni,\"create\"),Hi=Ki&&new Ki,Ji={},Yi=Fe(Pi),Qi=Fe(Zi),Xi=Fe(qi),no=Fe(Vi),to=Fe(Ki),ro=gi?gi.prototype:F,eo=ro?ro.valueOf:F,uo=ro?ro.toString:F,io=function(){\nfunction n(){}return function(t){return bu(t)?xi?xi(t):(n.prototype=t,t=new n,n.prototype=F,t):{}}}();On.templateSettings={escape:Q,evaluate:X,interpolate:nn,variable:\"\",imports:{_:On}},On.prototype=Sn.prototype,On.prototype.constructor=On,zn.prototype=io(Sn.prototype),zn.prototype.constructor=zn,Mn.prototype=io(Sn.prototype),Mn.prototype.constructor=Mn,Tn.prototype.clear=function(){this.__data__=Gi?Gi(null):{},this.size=0},Tn.prototype.delete=function(n){return n=this.has(n)&&delete this.__data__[n],\nthis.size-=n?1:0,n},Tn.prototype.get=function(n){var t=this.__data__;return Gi?(n=t[n],\"__lodash_hash_undefined__\"===n?F:n):ci.call(t,n)?t[n]:F},Tn.prototype.has=function(n){var t=this.__data__;return Gi?t[n]!==F:ci.call(t,n)},Tn.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=Gi&&t===F?\"__lodash_hash_undefined__\":t,this},Nn.prototype.clear=function(){this.__data__=[],this.size=0},Nn.prototype.delete=function(n){var t=this.__data__;return n=lt(t,n),!(0>n)&&(n==t.length-1?t.pop():wi.call(t,n,1),\n--this.size,true)},Nn.prototype.get=function(n){var t=this.__data__;return n=lt(t,n),0>n?F:t[n][1]},Nn.prototype.has=function(n){return-1e?(++this.size,r.push([n,t])):r[e][1]=t,this},Pn.prototype.clear=function(){this.size=0,this.__data__={hash:new Tn,map:new(Zi||Nn),string:new Tn}},Pn.prototype.delete=function(n){return n=we(this,n).delete(n),this.size-=n?1:0,n},Pn.prototype.get=function(n){return we(this,n).get(n);\n},Pn.prototype.has=function(n){return we(this,n).has(n)},Pn.prototype.set=function(n,t){var r=we(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},qn.prototype.add=qn.prototype.push=function(n){return this.__data__.set(n,\"__lodash_hash_undefined__\"),this},qn.prototype.has=function(n){return this.__data__.has(n)},Vn.prototype.clear=function(){this.__data__=new Nn,this.size=0},Vn.prototype.delete=function(n){var t=this.__data__;return n=t.delete(n),this.size=t.size,n},Vn.prototype.get=function(n){\nreturn this.__data__.get(n)},Vn.prototype.has=function(n){return this.__data__.has(n)},Vn.prototype.set=function(n,t){var r=this.__data__;if(r instanceof Nn){var e=r.__data__;if(!Zi||199>e.length)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new Pn(e)}return r.set(n,t),this.size=r.size,this};var oo=Zr(Et),fo=Zr(Ot,true),co=qr(),ao=qr(true),lo=Hi?function(n,t){return Hi.set(n,t),n}:Nu,so=Ei?function(n,t){return Ei(n,\"toString\",{configurable:true,enumerable:false,value:Fu(t),writable:true})}:Nu,ho=Oi||function(n){\nreturn Zn.clearTimeout(n)},po=Vi&&1/D(new Vi([,-0]))[1]==N?function(n){return new Vi(n)}:qu,_o=Hi?function(n){return Hi.get(n)}:qu,vo=Wi?function(n){return null==n?[]:(n=ni(n),f(Wi(n),function(t){return ji.call(n,t)}))}:Ku,go=Wi?function(n){for(var t=[];n;)s(t,vo(n)),n=bi(n);return t}:Ku,yo=zt;(Pi&&\"[object DataView]\"!=yo(new Pi(new ArrayBuffer(1)))||Zi&&\"[object Map]\"!=yo(new Zi)||qi&&\"[object Promise]\"!=yo(qi.resolve())||Vi&&\"[object Set]\"!=yo(new Vi)||Ki&&\"[object WeakMap]\"!=yo(new Ki))&&(yo=function(n){\nvar t=zt(n);if(n=(n=\"[object Object]\"==t?n.constructor:F)?Fe(n):\"\")switch(n){case Yi:return\"[object DataView]\";case Qi:return\"[object Map]\";case Xi:return\"[object Promise]\";case no:return\"[object Set]\";case to:return\"[object WeakMap]\"}return t});var bo=oi?gu:Gu,xo=Me(lo),jo=Ii||function(n,t){return Zn.setTimeout(n,t)},wo=Me(so),mo=function(n){n=lu(n,function(n){return 500===t.size&&t.clear(),n});var t=n.cache;return n}(function(n){var t=[];return en.test(n)&&t.push(\"\"),n.replace(un,function(n,r,e,u){\nt.push(e?u.replace(vn,\"$1\"):r||n)}),t}),Ao=lr(function(n,t){return _u(n)?jt(n,kt(t,1,_u,true)):[]}),ko=lr(function(n,t){var r=Ge(t);return _u(r)&&(r=F),_u(n)?jt(n,kt(t,1,_u,true),je(r,2)):[]}),Eo=lr(function(n,t){var r=Ge(t);return _u(r)&&(r=F),_u(n)?jt(n,kt(t,1,_u,true),F,r):[]}),Oo=lr(function(n){var t=l(n,Sr);return t.length&&t[0]===n[0]?Ut(t):[]}),So=lr(function(n){var t=Ge(n),r=l(n,Sr);return t===Ge(r)?t=F:r.pop(),r.length&&r[0]===n[0]?Ut(r,je(t,2)):[]}),Io=lr(function(n){var t=Ge(n),r=l(n,Sr);return(t=typeof t==\"function\"?t:F)&&r.pop(),\nr.length&&r[0]===n[0]?Ut(r,F,t):[]}),Ro=lr(He),zo=ge(function(n,t){var r=null==n?0:n.length,e=vt(n,t);return fr(n,l(t,function(n){return Re(n,r)?+n:n}).sort(Ur)),e}),Wo=lr(function(n){return wr(kt(n,1,_u,true))}),Bo=lr(function(n){var t=Ge(n);return _u(t)&&(t=F),wr(kt(n,1,_u,true),je(t,2))}),Lo=lr(function(n){var t=Ge(n),t=typeof t==\"function\"?t:F;return wr(kt(n,1,_u,true),F,t)}),Uo=lr(function(n,t){return _u(n)?jt(n,t):[]}),Co=lr(function(n){return Er(f(n,_u))}),Do=lr(function(n){var t=Ge(n);return _u(t)&&(t=F),\nEr(f(n,_u),je(t,2))}),Mo=lr(function(n){var t=Ge(n),t=typeof t==\"function\"?t:F;return Er(f(n,_u),F,t)}),To=lr(Ye),$o=lr(function(n){var t=n.length,t=1=t}),cf=Mt(function(){return arguments}())?Mt:function(n){return xu(n)&&ci.call(n,\"callee\")&&!ji.call(n,\"callee\")},af=Hu.isArray,lf=Hn?S(Hn):Tt,sf=Bi||Gu,hf=Jn?S(Jn):$t,pf=Yn?S(Yn):Nt,_f=Qn?S(Qn):qt,vf=Xn?S(Xn):Vt,gf=nt?S(nt):Kt,df=oe(Jt),yf=oe(function(n,t){return n<=t}),bf=Pr(function(n,t){\nif(Le(t)||pu(t))Tr(t,Lu(t),n);else for(var r in t)ci.call(t,r)&&at(n,r,t[r])}),xf=Pr(function(n,t){Tr(t,Uu(t),n)}),jf=Pr(function(n,t,r,e){Tr(t,Uu(t),n,e)}),wf=Pr(function(n,t,r,e){Tr(t,Lu(t),n,e)}),mf=ge(vt),Af=lr(function(n){return n.push(F,se),r(jf,F,n)}),kf=lr(function(n){return n.push(F,he),r(Rf,F,n)}),Ef=ne(function(n,t,r){n[t]=r},Fu(Nu)),Of=ne(function(n,t,r){ci.call(n,t)?n[t].push(r):n[t]=[r]},je),Sf=lr(Dt),If=Pr(function(n,t,r){nr(n,t,r)}),Rf=Pr(function(n,t,r,e){nr(n,t,r,e)}),zf=ge(function(n,t){\nvar r={};if(null==n)return r;var e=false;t=l(t,function(t){return t=Rr(t,n),e||(e=1--n)return t.apply(this,arguments)}},On.ary=iu,On.assign=bf,On.assignIn=xf,On.assignInWith=jf,On.assignWith=wf,On.at=mf,On.before=ou,On.bind=Yo,On.bindAll=Zf,On.bindKey=Qo,On.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return af(n)?n:[n]},\nOn.chain=Xe,On.chunk=function(n,t,r){if(t=(r?ze(n,t,r):t===F)?1:Di(Ou(t),0),r=null==n?0:n.length,!r||1>t)return[];for(var e=0,u=0,i=Hu(Ri(r/t));et?0:t,e)):[]},On.dropRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===F?1:Ou(t),t=e-t,vr(n,0,0>t?0:t)):[]},On.dropRightWhile=function(n,t){return n&&n.length?Ar(n,je(t,3),true,true):[]},On.dropWhile=function(n,t){return n&&n.length?Ar(n,je(t,3),true):[]},On.fill=function(n,t,r,e){var u=null==n?0:n.length;if(!u)return[];for(r&&typeof r!=\"number\"&&ze(n,t,r)&&(r=0,e=u),u=n.length,r=Ou(r),0>r&&(r=-r>u?0:u+r),e=e===F||e>u?u:Ou(e),0>e&&(e+=u),e=r>e?0:Su(e);r>>0,r?(n=zu(n))&&(typeof t==\"string\"||null!=t&&!_f(t))&&(t=jr(t),\n!t&&Bn.test(n))?zr($(n),0,r):n.split(t,r):[]},On.spread=function(n,t){if(typeof n!=\"function\")throw new ei(\"Expected a function\");return t=null==t?0:Di(Ou(t),0),lr(function(e){var u=e[t];return e=zr(e,0,t),u&&s(e,u),r(n,this,e)})},On.tail=function(n){var t=null==n?0:n.length;return t?vr(n,1,t):[]},On.take=function(n,t,r){return n&&n.length?(t=r||t===F?1:Ou(t),vr(n,0,0>t?0:t)):[]},On.takeRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===F?1:Ou(t),t=e-t,vr(n,0>t?0:t,e)):[]},On.takeRightWhile=function(n,t){\nreturn n&&n.length?Ar(n,je(t,3),false,true):[]},On.takeWhile=function(n,t){return n&&n.length?Ar(n,je(t,3)):[]},On.tap=function(n,t){return t(n),n},On.throttle=function(n,t,r){var e=true,u=true;if(typeof n!=\"function\")throw new ei(\"Expected a function\");return bu(r)&&(e=\"leading\"in r?!!r.leading:e,u=\"trailing\"in r?!!r.trailing:u),au(n,t,{leading:e,maxWait:t,trailing:u})},On.thru=nu,On.toArray=ku,On.toPairs=Bf,On.toPairsIn=Lf,On.toPath=function(n){return af(n)?l(n,$e):Au(n)?[n]:Mr(mo(zu(n)))},On.toPlainObject=Ru,\nOn.transform=function(n,t,r){var e=af(n),i=e||sf(n)||gf(n);if(t=je(t,4),null==r){var o=n&&n.constructor;r=i?e?new o:[]:bu(n)&&gu(o)?io(bi(n)):{}}return(i?u:Et)(n,function(n,e,u){return t(r,n,e,u)}),r},On.unary=function(n){return iu(n,1)},On.union=Wo,On.unionBy=Bo,On.unionWith=Lo,On.uniq=function(n){return n&&n.length?wr(n):[]},On.uniqBy=function(n,t){return n&&n.length?wr(n,je(t,2)):[]},On.uniqWith=function(n,t){return t=typeof t==\"function\"?t:F,n&&n.length?wr(n,F,t):[]},On.unset=function(n,t){return null==n||mr(n,t);\n},On.unzip=Ye,On.unzipWith=Qe,On.update=function(n,t,r){return null==n?n:pr(n,t,Ir(r)(It(n,t)),void 0)},On.updateWith=function(n,t,r,e){return e=typeof e==\"function\"?e:F,null!=n&&(n=pr(n,t,Ir(r)(It(n,t)),e)),n},On.values=Du,On.valuesIn=function(n){return null==n?[]:I(n,Uu(n))},On.without=Uo,On.words=$u,On.wrap=function(n,t){return rf(Ir(t),n)},On.xor=Co,On.xorBy=Do,On.xorWith=Mo,On.zip=To,On.zipObject=function(n,t){return Or(n||[],t||[],at)},On.zipObjectDeep=function(n,t){return Or(n||[],t||[],pr);\n},On.zipWith=$o,On.entries=Bf,On.entriesIn=Lf,On.extend=xf,On.extendWith=jf,Zu(On,On),On.add=nc,On.attempt=Pf,On.camelCase=Uf,On.capitalize=Mu,On.ceil=tc,On.clamp=function(n,t,r){return r===F&&(r=t,t=F),r!==F&&(r=Iu(r),r=r===r?r:0),t!==F&&(t=Iu(t),t=t===t?t:0),gt(Iu(n),t,r)},On.clone=function(n){return dt(n,4)},On.cloneDeep=function(n){return dt(n,5)},On.cloneDeepWith=function(n,t){return t=typeof t==\"function\"?t:F,dt(n,5,t)},On.cloneWith=function(n,t){return t=typeof t==\"function\"?t:F,dt(n,4,t)},\nOn.conformsTo=function(n,t){return null==t||bt(n,t,Lu(t))},On.deburr=Tu,On.defaultTo=function(n,t){return null==n||n!==n?t:n},On.divide=rc,On.endsWith=function(n,t,r){n=zu(n),t=jr(t);var e=n.length,e=r=r===F?e:gt(Ou(r),0,e);return r-=t.length,0<=r&&n.slice(r,e)==t},On.eq=hu,On.escape=function(n){return(n=zu(n))&&Y.test(n)?n.replace(H,et):n},On.escapeRegExp=function(n){return(n=zu(n))&&fn.test(n)?n.replace(on,\"\\\\$&\"):n},On.every=function(n,t,r){var e=af(n)?o:wt;return r&&ze(n,t,r)&&(t=F),e(n,je(t,3));\n},On.find=Po,On.findIndex=Ze,On.findKey=function(n,t){return v(n,je(t,3),Et)},On.findLast=Zo,On.findLastIndex=qe,On.findLastKey=function(n,t){return v(n,je(t,3),Ot)},On.floor=ec,On.forEach=ru,On.forEachRight=eu,On.forIn=function(n,t){return null==n?n:co(n,je(t,3),Uu)},On.forInRight=function(n,t){return null==n?n:ao(n,je(t,3),Uu)},On.forOwn=function(n,t){return n&&Et(n,je(t,3))},On.forOwnRight=function(n,t){return n&&Ot(n,je(t,3))},On.get=Wu,On.gt=of,On.gte=ff,On.has=function(n,t){return null!=n&&ke(n,t,Bt);\n},On.hasIn=Bu,On.head=Ke,On.identity=Nu,On.includes=function(n,t,r,e){return n=pu(n)?n:Du(n),r=r&&!e?Ou(r):0,e=n.length,0>r&&(r=Di(e+r,0)),mu(n)?r<=e&&-1r&&(r=Di(e+r,0)),d(n,t,r)):-1},On.inRange=function(n,t,r){return t=Eu(t),r===F?(r=t,t=0):r=Eu(r),n=Iu(n),n>=Mi(t,r)&&n=n},On.isSet=vf,On.isString=mu,On.isSymbol=Au,On.isTypedArray=gf,On.isUndefined=function(n){return n===F},On.isWeakMap=function(n){return xu(n)&&\"[object WeakMap]\"==yo(n)},On.isWeakSet=function(n){return xu(n)&&\"[object WeakSet]\"==zt(n)},On.join=function(n,t){\nreturn null==n?\"\":Ui.call(n,t)},On.kebabCase=Cf,On.last=Ge,On.lastIndexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;if(r!==F&&(u=Ou(r),u=0>u?Di(e+u,0):Mi(u,e-1)),t===t){for(r=u+1;r--&&n[r]!==t;);n=r}else n=g(n,b,u,true);return n},On.lowerCase=Df,On.lowerFirst=Mf,On.lt=df,On.lte=yf,On.max=function(n){return n&&n.length?mt(n,Nu,Wt):F},On.maxBy=function(n,t){return n&&n.length?mt(n,je(t,2),Wt):F},On.mean=function(n){return x(n,Nu)},On.meanBy=function(n,t){return x(n,je(t,2))},On.min=function(n){\nreturn n&&n.length?mt(n,Nu,Jt):F},On.minBy=function(n,t){return n&&n.length?mt(n,je(t,2),Jt):F},On.stubArray=Ku,On.stubFalse=Gu,On.stubObject=function(){return{}},On.stubString=function(){return\"\"},On.stubTrue=function(){return true},On.multiply=uc,On.nth=function(n,t){return n&&n.length?tr(n,Ou(t)):F},On.noConflict=function(){return Zn._===this&&(Zn._=pi),this},On.noop=qu,On.now=Jo,On.pad=function(n,t,r){n=zu(n);var e=(t=Ou(t))?T(n):0;return!t||e>=t?n:(t=(t-e)/2,ee(zi(t),r)+n+ee(Ri(t),r))},On.padEnd=function(n,t,r){\nn=zu(n);var e=(t=Ou(t))?T(n):0;return t&&et){var e=n;n=t,t=e}return r||n%1||t%1?(r=Fi(),Mi(n+r*(t-n+$n(\"1e-\"+((r+\"\").length-1))),t)):cr(n,t);\n},On.reduce=function(n,t,r){var e=af(n)?h:m,u=3>arguments.length;return e(n,je(t,4),r,u,oo)},On.reduceRight=function(n,t,r){var e=af(n)?p:m,u=3>arguments.length;return e(n,je(t,4),r,u,fo)},On.repeat=function(n,t,r){return t=(r?ze(n,t,r):t===F)?1:Ou(t),ar(zu(n),t)},On.replace=function(){var n=arguments,t=zu(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},On.result=function(n,t,r){t=Rr(t,n);var e=-1,u=t.length;for(u||(u=1,n=F);++en||9007199254740991=i)return n;if(i=r-T(e),1>i)return e;\nif(r=o?zr(o,0,i).join(\"\"):n.slice(0,i),u===F)return r+e;if(o&&(i+=r.length-i),_f(u)){if(n.slice(i).search(u)){var f=r;for(u.global||(u=ti(u.source,zu(dn.exec(u))+\"g\")),u.lastIndex=0;o=u.exec(f);)var c=o.index;r=r.slice(0,c===F?i:c)}}else n.indexOf(jr(u),i)!=i&&(u=r.lastIndexOf(u),-1e.__dir__?\"Right\":\"\")}),e},Mn.prototype[n+\"Right\"]=function(t){\nreturn this.reverse()[n](t).reverse()}}),u([\"filter\",\"map\",\"takeWhile\"],function(n,t){var r=t+1,e=1==r||3==r;Mn.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:je(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),u([\"head\",\"last\"],function(n,t){var r=\"take\"+(t?\"Right\":\"\");Mn.prototype[n]=function(){return this[r](1).value()[0]}}),u([\"initial\",\"tail\"],function(n,t){var r=\"drop\"+(t?\"\":\"Right\");Mn.prototype[n]=function(){return this.__filtered__?new Mn(this):this[r](1);\n}}),Mn.prototype.compact=function(){return this.filter(Nu)},Mn.prototype.find=function(n){return this.filter(n).head()},Mn.prototype.findLast=function(n){return this.reverse().find(n)},Mn.prototype.invokeMap=lr(function(n,t){return typeof n==\"function\"?new Mn(this):this.map(function(r){return Dt(r,n,t)})}),Mn.prototype.reject=function(n){return this.filter(su(je(n)))},Mn.prototype.slice=function(n,t){n=Ou(n);var r=this;return r.__filtered__&&(0t)?new Mn(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),\nt!==F&&(t=Ou(t),r=0>t?r.dropRight(-t):r.take(t-n)),r)},Mn.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Mn.prototype.toArray=function(){return this.take(4294967295)},Et(Mn.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=On[e?\"take\"+(\"last\"==t?\"Right\":\"\"):t],i=e||/^find/.test(t);u&&(On.prototype[t]=function(){function t(n){return n=u.apply(On,s([n],f)),e&&h?n[0]:n}var o=this.__wrapped__,f=e?[1]:arguments,c=o instanceof Mn,a=f[0],l=c||af(o);\nl&&r&&typeof a==\"function\"&&1!=a.length&&(c=l=false);var h=this.__chain__,p=!!this.__actions__.length,a=i&&!h,c=c&&!p;return!i&&l?(o=c?o:new Mn(this),o=n.apply(o,f),o.__actions__.push({func:nu,args:[t],thisArg:F}),new zn(o,h)):a&&c?n.apply(this,f):(o=this.thru(t),a?e?o.value()[0]:o.value():o)})}),u(\"pop push shift sort splice unshift\".split(\" \"),function(n){var t=ui[n],r=/^(?:push|sort|unshift)$/.test(n)?\"tap\":\"thru\",e=/^(?:pop|shift)$/.test(n);On.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){\nvar u=this.value();return t.apply(af(u)?u:[],n)}return this[r](function(r){return t.apply(af(r)?r:[],n)})}}),Et(Mn.prototype,function(n,t){var r=On[t];if(r){var e=r.name+\"\";(Ji[e]||(Ji[e]=[])).push({name:t,func:r})}}),Ji[Xr(F,2).name]=[{name:\"wrapper\",func:F}],Mn.prototype.clone=function(){var n=new Mn(this.__wrapped__);return n.__actions__=Mr(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Mr(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Mr(this.__views__),\nn},Mn.prototype.reverse=function(){if(this.__filtered__){var n=new Mn(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n},Mn.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=af(t),u=0>r,i=e?t.length:0;n=i;for(var o=this.__views__,f=0,c=-1,a=o.length;++c=this.__values__.length;return{done:n,value:n?F:this.__values__[this.__index__++]}},On.prototype.plant=function(n){for(var t,r=this;r instanceof Sn;){var e=Pe(r);e.__index__=0,e.__values__=F,t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},On.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Mn?(this.__actions__.length&&(n=new Mn(this)),n=n.reverse(),n.__actions__.push({func:nu,args:[Je],thisArg:F}),new zn(n,this.__chain__)):this.thru(Je);\n},On.prototype.toJSON=On.prototype.valueOf=On.prototype.value=function(){return kr(this.__wrapped__,this.__actions__)},On.prototype.first=On.prototype.head,Ai&&(On.prototype[Ai]=tu),On}();typeof define==\"function\"&&typeof define.amd==\"object\"&&define.amd?(Zn._=it, define(function(){return it})):Vn?((Vn.exports=it)._=it,qn._=it):Zn._=it}).call(this);","(function () {\n\n\tif (typeof self === 'undefined' || !self.Prism || !self.document || !Prism.languages.markup) {\n\t\treturn;\n\t}\n\n\tPrism.plugins.UnescapedMarkup = true;\n\n\tPrism.hooks.add('before-highlightall', function (env) {\n\t\tenv.selector += \", .lang-markup script[type='text/plain'], .language-markup script[type='text/plain']\" +\n\t\t                \", script[type='text/plain'].lang-markup, script[type='text/plain'].language-markup\";\n\t});\n\n\tPrism.hooks.add('before-sanity-check', function (env) {\n\t\tif (env.language != \"markup\") {\n\t\t\treturn;\n\t\t}\n\n\t\tif (env.element.matches(\"script[type='text/plain']\")) {\n\t\t\tvar code = document.createElement(\"code\");\n\t\t\tvar pre = document.createElement(\"pre\");\n\n\t\t\tpre.className = code.className = env.element.className;\n\n\t\t\tenv.code = env.code.replace(/<\\/script(>|>)/gi, \"\");\n\t\t\tcode.textContent = env.code;\n\n\t\t\tpre.appendChild(code);\n\t\t\tenv.element.parentNode.replaceChild(pre, env.element);\n\t\t\tenv.element = code;\n\t\t\treturn;\n\t\t}\n\n\t\tvar pre = env.element.parentNode;\n\t\tif (!env.code && pre && pre.nodeName.toLowerCase() == 'pre' &&\n\t\t\t\tenv.element.childNodes.length && env.element.childNodes[0].nodeName == \"#comment\") {\n\t\t\tenv.element.textContent = env.code = env.element.childNodes[0].textContent;\n\t\t}\n\t});\n}());\n","\n/* **********************************************\n     Begin prism-core.js\n********************************************** */\n\nvar _self = (typeof window !== 'undefined')\n\t? window   // if in browser\n\t: (\n\t\t(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)\n\t\t? self // if in worker\n\t\t: {}   // if in node js\n\t);\n\n/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n * MIT license http://www.opensource.org/licenses/mit-license.php/\n * @author Lea Verou http://lea.verou.me\n */\n\nvar Prism = (function(){\n\n// Private helper vars\nvar lang = /\\blang(?:uage)?-(\\w+)\\b/i;\nvar uniqueId = 0;\n\nvar _ = _self.Prism = {\n\tutil: {\n\t\tencode: function (tokens) {\n\t\t\tif (tokens instanceof Token) {\n\t\t\t\treturn new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);\n\t\t\t} else if (_.util.type(tokens) === 'Array') {\n\t\t\t\treturn tokens.map(_.util.encode);\n\t\t\t} else {\n\t\t\t\treturn tokens.replace(/&/g, '&').replace(/ text.length) {\n\t\t\t\t\t\t// Something went terribly wrong, ABORT, ABORT!\n\t\t\t\t\t\tbreak tokenloop;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (str instanceof Token) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tpattern.lastIndex = 0;\n\n\t\t\t\t\tvar match = pattern.exec(str),\n\t\t\t\t\t    delNum = 1;\n\n\t\t\t\t\t// Greedy patterns can override/remove up to two previously matched tokens\n\t\t\t\t\tif (!match && greedy && i != strarr.length - 1) {\n\t\t\t\t\t\tpattern.lastIndex = pos;\n\t\t\t\t\t\tmatch = pattern.exec(text);\n\t\t\t\t\t\tif (!match) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar from = match.index + (lookbehind ? match[1].length : 0),\n\t\t\t\t\t\t    to = match.index + match[0].length,\n\t\t\t\t\t\t    k = i,\n\t\t\t\t\t\t    p = pos;\n\n\t\t\t\t\t\tfor (var len = strarr.length; k < len && p < to; ++k) {\n\t\t\t\t\t\t\tp += strarr[k].length;\n\t\t\t\t\t\t\t// Move the index i to the element in strarr that is closest to from\n\t\t\t\t\t\t\tif (from >= p) {\n\t\t\t\t\t\t\t\t++i;\n\t\t\t\t\t\t\t\tpos = p;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If strarr[i] is a Token, then the match starts inside another Token, which is invalid\n\t\t\t\t\t\t * If strarr[k - 1] is greedy we are in conflict with another greedy pattern\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (strarr[i] instanceof Token || strarr[k - 1].greedy) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Number of tokens to delete and replace with the new match\n\t\t\t\t\t\tdelNum = k - i;\n\t\t\t\t\t\tstr = text.slice(pos, p);\n\t\t\t\t\t\tmatch.index -= pos;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!match) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(lookbehind) {\n\t\t\t\t\t\tlookbehindLength = match[1].length;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar from = match.index + lookbehindLength,\n\t\t\t\t\t    match = match[0].slice(lookbehindLength),\n\t\t\t\t\t    to = from + match.length,\n\t\t\t\t\t    before = str.slice(0, from),\n\t\t\t\t\t    after = str.slice(to);\n\n\t\t\t\t\tvar args = [i, delNum];\n\n\t\t\t\t\tif (before) {\n\t\t\t\t\t\targs.push(before);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy);\n\n\t\t\t\t\targs.push(wrapped);\n\n\t\t\t\t\tif (after) {\n\t\t\t\t\t\targs.push(after);\n\t\t\t\t\t}\n\n\t\t\t\t\tArray.prototype.splice.apply(strarr, args);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn strarr;\n\t},\n\n\thooks: {\n\t\tall: {},\n\n\t\tadd: function (name, callback) {\n\t\t\tvar hooks = _.hooks.all;\n\n\t\t\thooks[name] = hooks[name] || [];\n\n\t\t\thooks[name].push(callback);\n\t\t},\n\n\t\trun: function (name, env) {\n\t\t\tvar callbacks = _.hooks.all[name];\n\n\t\t\tif (!callbacks || !callbacks.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i=0, callback; callback = callbacks[i++];) {\n\t\t\t\tcallback(env);\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar Token = _.Token = function(type, content, alias, matchedStr, greedy) {\n\tthis.type = type;\n\tthis.content = content;\n\tthis.alias = alias;\n\t// Copy of the full string this token was created from\n\tthis.length = (matchedStr || \"\").length|0;\n\tthis.greedy = !!greedy;\n};\n\nToken.stringify = function(o, language, parent) {\n\tif (typeof o == 'string') {\n\t\treturn o;\n\t}\n\n\tif (_.util.type(o) === 'Array') {\n\t\treturn o.map(function(element) {\n\t\t\treturn Token.stringify(element, language, o);\n\t\t}).join('');\n\t}\n\n\tvar env = {\n\t\ttype: o.type,\n\t\tcontent: Token.stringify(o.content, language, parent),\n\t\ttag: 'span',\n\t\tclasses: ['token', o.type],\n\t\tattributes: {},\n\t\tlanguage: language,\n\t\tparent: parent\n\t};\n\n\tif (env.type == 'comment') {\n\t\tenv.attributes['spellcheck'] = 'true';\n\t}\n\n\tif (o.alias) {\n\t\tvar aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];\n\t\tArray.prototype.push.apply(env.classes, aliases);\n\t}\n\n\t_.hooks.run('wrap', env);\n\n\tvar attributes = Object.keys(env.attributes).map(function(name) {\n\t\treturn name + '=\"' + (env.attributes[name] || '').replace(/\"/g, '"') + '\"';\n\t}).join(' ');\n\n\treturn '<' + env.tag + ' class=\"' + env.classes.join(' ') + '\"' + (attributes ? ' ' + attributes : '') + '>' + env.content + '';\n\n};\n\nif (!_self.document) {\n\tif (!_self.addEventListener) {\n\t\t// in Node.js\n\t\treturn _self.Prism;\n\t}\n \t// In worker\n\t_self.addEventListener('message', function(evt) {\n\t\tvar message = JSON.parse(evt.data),\n\t\t    lang = message.language,\n\t\t    code = message.code,\n\t\t    immediateClose = message.immediateClose;\n\n\t\t_self.postMessage(_.highlight(code, _.languages[lang], lang));\n\t\tif (immediateClose) {\n\t\t\t_self.close();\n\t\t}\n\t}, false);\n\n\treturn _self.Prism;\n}\n\n//Get current script and highlight\nvar script = document.currentScript || [].slice.call(document.getElementsByTagName(\"script\")).pop();\n\nif (script) {\n\t_.filename = script.src;\n\n\tif (document.addEventListener && !script.hasAttribute('data-manual')) {\n\t\tif(document.readyState !== \"loading\") {\n\t\t\tif (window.requestAnimationFrame) {\n\t\t\t\twindow.requestAnimationFrame(_.highlightAll);\n\t\t\t} else {\n\t\t\t\twindow.setTimeout(_.highlightAll, 16);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdocument.addEventListener('DOMContentLoaded', _.highlightAll);\n\t\t}\n\t}\n}\n\nreturn _self.Prism;\n\n})();\n\nif (typeof module !== 'undefined' && module.exports) {\n\tmodule.exports = Prism;\n}\n\n// hack for components to work correctly in node.js\nif (typeof global !== 'undefined') {\n\tglobal.Prism = Prism;\n}\n\n\n/* **********************************************\n     Begin prism-markup.js\n********************************************** */\n\nPrism.languages.markup = {\n\t'comment': //,\n\t'prolog': /<\\?[\\w\\W]+?\\?>/,\n\t'doctype': //i,\n\t'cdata': //i,\n\t'tag': {\n\t\tpattern: /<\\/?(?!\\d)[^\\s>\\/=$<]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\\\1|\\\\?(?!\\1)[\\w\\W])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/i,\n\t\tinside: {\n\t\t\t'tag': {\n\t\t\t\tpattern: /^<\\/?[^\\s>\\/]+/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^<\\/?/,\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'attr-value': {\n\t\t\t\tpattern: /=(?:('|\")[\\w\\W]*?(\\1)|[^\\s>]+)/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /[=>\"']/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'punctuation': /\\/?>/,\n\t\t\t'attr-name': {\n\t\t\t\tpattern: /[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t},\n\t'entity': /&#?[\\da-z]{1,8};/i\n};\n\n// Plugin to make entity title show the real entity, idea by Roman Komarov\nPrism.hooks.add('wrap', function(env) {\n\n\tif (env.type === 'entity') {\n\t\tenv.attributes['title'] = env.content.replace(/&/, '&');\n\t}\n});\n\nPrism.languages.xml = Prism.languages.markup;\nPrism.languages.html = Prism.languages.markup;\nPrism.languages.mathml = Prism.languages.markup;\nPrism.languages.svg = Prism.languages.markup;\n\n\n/* **********************************************\n     Begin prism-css.js\n********************************************** */\n\nPrism.languages.css = {\n\t'comment': /\\/\\*[\\w\\W]*?\\*\\//,\n\t'atrule': {\n\t\tpattern: /@[\\w-]+?.*?(;|(?=\\s*\\{))/i,\n\t\tinside: {\n\t\t\t'rule': /@[\\w-]+/\n\t\t\t// See rest below\n\t\t}\n\t},\n\t'url': /url\\((?:([\"'])(\\\\(?:\\r\\n|[\\w\\W])|(?!\\1)[^\\\\\\r\\n])*\\1|.*?)\\)/i,\n\t'selector': /[^\\{\\}\\s][^\\{\\};]*?(?=\\s*\\{)/,\n\t'string': {\n\t\tpattern: /(\"|')(\\\\(?:\\r\\n|[\\w\\W])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\tgreedy: true\n\t},\n\t'property': /(\\b|\\B)[\\w-]+(?=\\s*:)/i,\n\t'important': /\\B!important\\b/i,\n\t'function': /[-a-z0-9]+(?=\\()/i,\n\t'punctuation': /[(){};:]/\n};\n\nPrism.languages.css['atrule'].inside.rest = Prism.util.clone(Prism.languages.css);\n\nif (Prism.languages.markup) {\n\tPrism.languages.insertBefore('markup', 'tag', {\n\t\t'style': {\n\t\t\tpattern: /()[\\w\\W]*?(?=<\\/style>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.css,\n\t\t\talias: 'language-css'\n\t\t}\n\t});\n\t\n\tPrism.languages.insertBefore('inside', 'attr-value', {\n\t\t'style-attr': {\n\t\t\tpattern: /\\s*style=(\"|').*?\\1/i,\n\t\t\tinside: {\n\t\t\t\t'attr-name': {\n\t\t\t\t\tpattern: /^\\s*style/i,\n\t\t\t\t\tinside: Prism.languages.markup.tag.inside\n\t\t\t\t},\n\t\t\t\t'punctuation': /^\\s*=\\s*['\"]|['\"]\\s*$/,\n\t\t\t\t'attr-value': {\n\t\t\t\t\tpattern: /.+/i,\n\t\t\t\t\tinside: Prism.languages.css\n\t\t\t\t}\n\t\t\t},\n\t\t\talias: 'language-css'\n\t\t}\n\t}, Prism.languages.markup.tag);\n}\n\n/* **********************************************\n     Begin prism-clike.js\n********************************************** */\n\nPrism.languages.clike = {\n\t'comment': [\n\t\t{\n\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\w\\W]*?\\*\\//,\n\t\t\tlookbehind: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\tlookbehind: true\n\t\t}\n\t],\n\t'string': {\n\t\tpattern: /([\"'])(\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\tgreedy: true\n\t},\n\t'class-name': {\n\t\tpattern: /((?:\\b(?:class|interface|extends|implements|trait|instanceof|new)\\s+)|(?:catch\\s+\\())[a-z0-9_\\.\\\\]+/i,\n\t\tlookbehind: true,\n\t\tinside: {\n\t\t\tpunctuation: /(\\.|\\\\)/\n\t\t}\n\t},\n\t'keyword': /\\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\\b/,\n\t'boolean': /\\b(true|false)\\b/,\n\t'function': /[a-z0-9_]+(?=\\()/i,\n\t'number': /\\b-?(?:0x[\\da-f]+|\\d*\\.?\\d+(?:e[+-]?\\d+)?)\\b/i,\n\t'operator': /--?|\\+\\+?|!=?=?|<=?|>=?|==?=?|&&?|\\|\\|?|\\?|\\*|\\/|~|\\^|%/,\n\t'punctuation': /[{}[\\];(),.:]/\n};\n\n\n/* **********************************************\n     Begin prism-javascript.js\n********************************************** */\n\nPrism.languages.javascript = Prism.languages.extend('clike', {\n\t'keyword': /\\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\\b/,\n\t'number': /\\b-?(0x[\\dA-Fa-f]+|0b[01]+|0o[0-7]+|\\d*\\.?\\d+([Ee][+-]?\\d+)?|NaN|Infinity)\\b/,\n\t// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n\t'function': /[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*(?=\\()/i,\n\t'operator': /--?|\\+\\+?|!=?=?|<=?|>=?|==?=?|&&?|\\|\\|?|\\?|\\*\\*?|\\/|~|\\^|%|\\.{3}/\n});\n\nPrism.languages.insertBefore('javascript', 'keyword', {\n\t'regex': {\n\t\tpattern: /(^|[^/])\\/(?!\\/)(\\[.+?]|\\\\.|[^/\\\\\\r\\n])+\\/[gimyu]{0,5}(?=\\s*($|[\\r\\n,.;})]))/,\n\t\tlookbehind: true,\n\t\tgreedy: true\n\t}\n});\n\nPrism.languages.insertBefore('javascript', 'string', {\n\t'template-string': {\n\t\tpattern: /`(?:\\\\\\\\|\\\\?[^\\\\])*?`/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /\\$\\{[^}]+\\}/,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\talias: 'punctuation'\n\t\t\t\t\t},\n\t\t\t\t\trest: Prism.languages.javascript\n\t\t\t\t}\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/\n\t\t}\n\t}\n});\n\nif (Prism.languages.markup) {\n\tPrism.languages.insertBefore('markup', 'tag', {\n\t\t'script': {\n\t\t\tpattern: /()[\\w\\W]*?(?=<\\/script>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript,\n\t\t\talias: 'language-javascript'\n\t\t}\n\t});\n}\n\nPrism.languages.js = Prism.languages.javascript;\n\n/* **********************************************\n     Begin prism-file-highlight.js\n********************************************** */\n\n(function () {\n\tif (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) {\n\t\treturn;\n\t}\n\n\tself.Prism.fileHighlight = function() {\n\n\t\tvar Extensions = {\n\t\t\t'js': 'javascript',\n\t\t\t'py': 'python',\n\t\t\t'rb': 'ruby',\n\t\t\t'ps1': 'powershell',\n\t\t\t'psm1': 'powershell',\n\t\t\t'sh': 'bash',\n\t\t\t'bat': 'batch',\n\t\t\t'h': 'c',\n\t\t\t'tex': 'latex'\n\t\t};\n\n\t\tif(Array.prototype.forEach) { // Check to prevent error in IE8\n\t\t\tArray.prototype.slice.call(document.querySelectorAll('pre[data-src]')).forEach(function (pre) {\n\t\t\t\tvar src = pre.getAttribute('data-src');\n\n\t\t\t\tvar language, parent = pre;\n\t\t\t\tvar lang = /\\blang(?:uage)?-(?!\\*)(\\w+)\\b/i;\n\t\t\t\twhile (parent && !lang.test(parent.className)) {\n\t\t\t\t\tparent = parent.parentNode;\n\t\t\t\t}\n\n\t\t\t\tif (parent) {\n\t\t\t\t\tlanguage = (pre.className.match(lang) || [, ''])[1];\n\t\t\t\t}\n\n\t\t\t\tif (!language) {\n\t\t\t\t\tvar extension = (src.match(/\\.(\\w+)$/) || [, ''])[1];\n\t\t\t\t\tlanguage = Extensions[extension] || extension;\n\t\t\t\t}\n\n\t\t\t\tvar code = document.createElement('code');\n\t\t\t\tcode.className = 'language-' + language;\n\n\t\t\t\tpre.textContent = '';\n\n\t\t\t\tcode.textContent = 'Loading…';\n\n\t\t\t\tpre.appendChild(code);\n\n\t\t\t\tvar xhr = new XMLHttpRequest();\n\n\t\t\t\txhr.open('GET', src, true);\n\n\t\t\t\txhr.onreadystatechange = function () {\n\t\t\t\t\tif (xhr.readyState == 4) {\n\n\t\t\t\t\t\tif (xhr.status < 400 && xhr.responseText) {\n\t\t\t\t\t\t\tcode.textContent = xhr.responseText;\n\n\t\t\t\t\t\t\tPrism.highlightElement(code);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (xhr.status >= 400) {\n\t\t\t\t\t\t\tcode.textContent = '✖ Error ' + xhr.status + ' while fetching file: ' + xhr.statusText;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcode.textContent = '✖ Error: File does not exist or is empty';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\txhr.send(null);\n\t\t\t});\n\t\t}\n\n\t};\n\n\tdocument.addEventListener('DOMContentLoaded', self.Prism.fileHighlight);\n\n})();\n","function select(element) {\n    var selectedText;\n\n    if (element.nodeName === 'SELECT') {\n        element.focus();\n\n        selectedText = element.value;\n    }\n    else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n        var isReadOnly = element.hasAttribute('readonly');\n\n        if (!isReadOnly) {\n            element.setAttribute('readonly', '');\n        }\n\n        element.select();\n        element.setSelectionRange(0, element.value.length);\n\n        if (!isReadOnly) {\n            element.removeAttribute('readonly');\n        }\n\n        selectedText = element.value;\n    }\n    else {\n        if (element.hasAttribute('contenteditable')) {\n            element.focus();\n        }\n\n        var selection = window.getSelection();\n        var range = document.createRange();\n\n        range.selectNodeContents(element);\n        selection.removeAllRanges();\n        selection.addRange(range);\n\n        selectedText = selection.toString();\n    }\n\n    return selectedText;\n}\n\nmodule.exports = select;\n","function E () {\n  // Keep this empty so it's easier to inherit from\n  // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n  on: function (name, callback, ctx) {\n    var e = this.e || (this.e = {});\n\n    (e[name] || (e[name] = [])).push({\n      fn: callback,\n      ctx: ctx\n    });\n\n    return this;\n  },\n\n  once: function (name, callback, ctx) {\n    var self = this;\n    function listener () {\n      self.off(name, listener);\n      callback.apply(ctx, arguments);\n    };\n\n    listener._ = callback\n    return this.on(name, listener, ctx);\n  },\n\n  emit: function (name) {\n    var data = [].slice.call(arguments, 1);\n    var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n    var i = 0;\n    var len = evtArr.length;\n\n    for (i; i < len; i++) {\n      evtArr[i].fn.apply(evtArr[i].ctx, data);\n    }\n\n    return this;\n  },\n\n  off: function (name, callback) {\n    var e = this.e || (this.e = {});\n    var evts = e[name];\n    var liveEvents = [];\n\n    if (evts && callback) {\n      for (var i = 0, len = evts.length; i < len; i++) {\n        if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n          liveEvents.push(evts[i]);\n      }\n    }\n\n    // Remove event from queue to prevent memory leak\n    // Suggested by https://github.com/lazd\n    // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n    (liveEvents.length)\n      ? e[name] = liveEvents\n      : delete e[name];\n\n    return this;\n  }\n};\n\nmodule.exports = E;\n","'use strict';\r\n\r\nexport const PREFIX = 'aon';\r\n\r\nexport const BREAKPOINTS = ['xs', 'sm', 'md', 'lg', 'xl', 'dx', 'tx'];\r\n","'use strict';\r\n\r\nimport { $document } from '../utilities/_helpers';\r\n\r\nfunction activateButtonLoader(e: Object, obj: JQuery) {\r\n    const $this = $(obj);\r\n    $this.addClass('disabled show-btn-loader').attr('disabled', 'disabled');\r\n}\r\n\r\nfunction deactivateButtonLoader(e: Object, obj: JQuery) {\r\n    const $this = $(obj);\r\n    $this.removeClass('disabled show-btn-loader').removeAttr('disabled');\r\n}\r\n\r\n$document.on('activateButtonLoader', activateButtonLoader);\r\n$document.on('deactivateButtonLoader', deactivateButtonLoader);\r\n","'use strict';\r\n\r\n/*\r\n This is a general initialization of Slick.js carousels.\r\n Documentation: http://kenwheeler.github.io/slick/\r\n\r\n Custom configuration is passed in using the data-carousel attribute. Options are merged with defaults found below.\r\n */\r\n\r\nimport { merge } from 'lodash';\r\n\r\nimport { prefix, onReady, $document } from '../utilities/_helpers';\r\n\r\nfunction initializeCarousel() {\r\n    const $carousels = $('[data-carousel]');\r\n    $carousels.each((index) => {\r\n        const $carousel = $carousels.eq(index),\r\n              $prev = $carousel.find('[data-js=\"carousel-prev\"]').detach(),\r\n              $next = $carousel.find('[data-js=\"carousel-next\"]').detach();\r\n\r\n        $carousel\r\n            .on('init', () => {\r\n                $carousel.append($prev, $next);\r\n            })\r\n            .slick(merge(\r\n                {},\r\n                {\r\n                    speed: 300,\r\n                    dots: true,\r\n                    arrows: true,\r\n                    mobileFirst: true,\r\n                    variableWidth: true,\r\n                    slidesToShow: 3,\r\n                    swipeToSlide: true,\r\n                    slide: '[data-js=\"carousel-slide\"]',\r\n                    prevArrow: $prev,\r\n                    nextArrow: $next\r\n                },\r\n                $carousel.data('carousel') || {}\r\n            ));\r\n    })\r\n    .removeAttr('data-carousel');\r\n}\r\n\r\nonReady(() => {\r\n    const $carousels = $('[data-carousel]');\r\n\r\n    if (!!$carousels.length) {\r\n        initializeCarousel();\r\n    }\r\n});\r\n\r\n$document.on('initializeCarousel', initializeCarousel);\r\n","'use strict';\r\n\r\nimport { $document } from '../utilities/_helpers';\r\n\r\nfunction openNav() {\r\n    const $overlay = $('#myNav'),\r\n          $iframe = $overlay.find('iframe');\r\n    $overlay.css('width', '100%');\r\n    $iframe.attr('src', $iframe.attr('src') + '&autoplay=true');\r\n}\r\n\r\nfunction closeNav() {\r\n\r\n    const $overlay = $('#myNav'),\r\n          $iframe = $overlay.find('iframe');\r\n    $iframe.attr('src', $iframe.attr('src').replace('&autoplay=true', ''));\r\n    $overlay.css('width', '0%');\r\n}\r\n\r\n$(document).on('click', '.aon-video-overlay', openNav);\r\n$(document).on('click', '.close-video-overlay', closeNav);\r\n\r\n","'use strict';\r\n\r\nimport { $document } from '../utilities/_helpers';\r\n\r\nfunction ActivatePageLevelLoader() {\r\n    $('#page_overlay').show();\r\n}\r\n\r\nfunction DeactivatePageLevelLoader() {\r\n    $('#page_overlay').hide();\r\n}\r\n\r\n$(document).on('activatePageLoader', ActivatePageLevelLoader);\r\n$(document).on('deactivatePageLoader', DeactivatePageLevelLoader);\r\n","'use strict';\r\n\r\nimport { onResize, onReady, isBreakpointAndDown, $document } from '../utilities/_helpers';\r\n\r\nlet $steps = $('[data-js=\"progress-steps\"]'),\r\n    isResizeEventAttached = false;\r\n\r\nfunction adjust(): void {\r\n    $steps = $('[data-js=\"progress-steps\"]');\r\n    const isMobile = isBreakpointAndDown('md');\r\n\r\n    $steps.each((index, el) => {\r\n        const $el = $(el);\r\n\r\n        $el.css({'margin-top': isMobile ? ($el.find('[data-js=\"progress-step-active\"]').outerHeight() + 'px') : 0});\r\n    });\r\n}\r\n\r\nif (!!$steps.length) {\r\n    onReady(adjust);\r\n    onResize(adjust);\r\n    isResizeEventAttached = true;\r\n} else {\r\n    $document.on('initializeProgressSteps', function() {\r\n        adjust();\r\n        if (!isResizeEventAttached) {\r\n            onResize(adjust);\r\n        }\r\n    });\r\n}\r\n","'use strict';\r\n\r\nimport { prefix, $document } from '../utilities/_helpers';\r\n\r\n$document.on({\r\n    'show.bs.tab': (evt: Event) => {\r\n        const $target = $(evt.target);\r\n        const $parent = $target.parents(`.${prefix('provider-result')}`);\r\n        const $collapse = $parent.find(`.${prefix('provider-maps')}`);\r\n        const $tabs = $parent.find('[data-toggle=\"tab\"]');\r\n\r\n        // Fixes bug where previously activated tabs are no longer clickable\r\n        $tabs.not($target).removeClass('active').attr('aria-expanded', 'false');\r\n\r\n        $collapse.collapse('show');\r\n    },\r\n    'hide.bs.collapse': (evt: Event) => {\r\n        const $target = $(evt.target);\r\n        const $parent = $target.parents(`.${prefix('provider-result')}`);\r\n        const $tabs = $parent.find('[data-toggle=\"tab\"]');\r\n\r\n        $tabs.removeClass('active').attr('aria-expanded', 'false');\r\n    }\r\n}, `.${prefix('provider-result')}`);\r\n\r\n$document.on({\r\n    'show.bs.tab': (evt: Event) => {\r\n        const $target = $(evt.target);\r\n        const $parent = $target.parents(`.${prefix('provider-results')}`);\r\n        const $collapse = $parent.find(`.${prefix('provider-maps')}`);\r\n        const $tabs = $parent.find('[data-toggle=\"tab\"]');\r\n\r\n        // Fixes bug where previously activated tabs are no longer clickable\r\n        $tabs.not($target).removeClass('active').attr('aria-expanded', 'false');\r\n\r\n        $collapse.collapse('show');\r\n    },\r\n    'hide.bs.collapse': (evt: Event) => {\r\n        const $target = $(evt.target);\r\n        const $parent = $target.parents(`.${prefix('provider-results')}`);\r\n        const $tabs = $parent.find('[data-toggle=\"tab\"]');\r\n\r\n        $tabs.removeClass('active').attr('aria-expanded', 'false');\r\n    }\r\n}, `.${prefix('collapse')} .${prefix('result')}`);\r\n\r\n$document.on('click', `.${prefix('provider-result')} input[type=\"radio\"], .${prefix('provider-results')} input[type=\"radio\"]`, (evt: Event) => {\r\n    const $target = $(evt.target);\r\n    const $parent = $target.parents(`.${prefix('provider-location')}`);\r\n\r\n    $parent.find('[data-toggle]').trigger('click');\r\n});\r\n","'use strict';\r\n\r\nimport { $document } from '../utilities/_helpers';\r\n\r\n$document.on('click', '[data-js=\"response\"]', (evt: Event) => {\r\n    const $target = $(evt.target);\r\n\r\n    if ($target.is('[data-js=\"response\"]')) {\r\n        $target.children().trigger('click');\r\n    }\r\n});\r\n","'use strict';\r\n\r\nimport {$document} from '../utilities/_helpers'\r\n\r\nlet $searchInputs = $('#aon-provider-search, #aon-medication-search').not('.typeahead-initialized');\r\n\r\nfunction initializeTypeAhead() {\r\n  $searchInputs = $('#aon-provider-search, #aon-medication-search').not('.typeahead-initialized');\r\n\r\n    $searchInputs.typeahead({\r\n      source: ['Afghanistan', 'Albania', 'Algeria', 'Andorra', 'Angola', 'Anguilla', 'Antigua & Barbuda',\r\n                'Argentina', 'Armenia', 'Australia', 'Austria', 'Azerbaijan', 'Bahamas', 'Bahrain',\r\n                'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bermuda', 'Bhutan',\r\n                'Bolivia', 'Bosnia & Herzegovina', 'Botswana', 'Brazil', 'Brunei Darussalam', 'Bulgaria',\r\n                'Burkina Faso', 'Myanmar/Burma', 'Burundi', 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde',\r\n                'Cayman Islands', 'Central African Republic', 'Chad', 'Chile', 'China', 'Colombia', 'Comoros',\r\n                'Congo', 'Costa Rica', 'Croatia', 'Cuba', 'Cyprus', 'Czech Republic',\r\n                'Democratic Republic of the Congo', 'Denmark', 'Djibouti', 'Dominican Republic', 'Dominica',\r\n                'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia',\r\n                'Fiji', 'Finland', 'France', 'French Guiana', 'Gabon', 'Gambia', 'Georgia', 'Germany',\r\n                'Ghana', 'Great Britain', 'Greece', 'Grenada', 'Guadeloupe', 'Guatemala', 'Guinea',\r\n                'Guinea-Bissau', 'Guyana', 'Haiti', 'Honduras', 'Hungary', 'Iceland', 'India',\r\n                'Indonesia', 'Iran', 'Iraq', 'Italy',\r\n                'Jamaica', 'Japan', 'Jordan', 'Kazakhstan', 'Kenya', 'Kosovo', 'Kuwait', 'Laos',\r\n                'Latvia', 'Lebanon', 'Lesotho', 'Liberia', 'Libya', 'Liechtenstein', 'Lithuania',\r\n                'Luxembourg', 'Republic of Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives',\r\n                'Mali', 'Malta', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Monaco',\r\n                'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Namibia', 'Nepal',\r\n                'Netherlands', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Norway', 'Oman',\r\n                'Pacific Islands', 'Pakistan', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru',\r\n                'Philippines', 'Poland', 'Portugal', 'Puerto Rico', 'Qatar', 'Reunion', 'Romania',\r\n                'Russian Federation', 'Rwanda', 'Saint Kitts and Nevis', 'Saint Lucia',\r\n                'Saint Vincent\\'s & Grenadines', 'Samoa', 'Sao Tome and Principe', 'Saudi Arabia',\r\n                'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovenia',\r\n                'Solomon Islands', 'Somalia', 'South Africa', 'South Sudan', 'Spain', 'Sri Lanka', 'Sudan',\r\n                'Suriname', 'Swaziland', 'Sweden', 'Switzerland', 'Syria', 'Tajikistan', 'Tanzania',\r\n                'Thailand', 'Timor Leste', 'Togo', 'Trinidad & Tobago', 'Tunisia', 'Turkey', 'Turkmenistan',\r\n                'Turks & Caicos Islands', 'Uganda', 'Ukraine', 'United Arab Emirates',\r\n                'United States of America (USA)', 'Uruguay', 'Uzbekistan', 'Venezuela', 'Vietnam',\r\n                'Virgin Islands (UK)', 'Virgin Islands (US)', 'Yemen', 'Zambia', 'Zimbabwe']\r\n    }).addClass('typeahead-initialized');\r\n}\r\n\r\ninitializeTypeAhead();\r\n$document.on('initializeTypeAhead', initializeTypeAhead);\r\n\r\n","'use strict';\r\n\r\nimport { focus, onScrollStop, onLoad, $window, $document, $main } from '../utilities/_helpers';\r\n\r\nlet scroll = 0;\r\n\r\n$window.on('hashchange', () => {\r\n    const hash = window.location.hash;\r\n    let $el = $main.find(hash);\r\n\r\n    if (!hash || !hash.slice(1) || !$el.length) {\r\n        $el = $main;\r\n    }\r\n\r\n    $window.scrollTop(scroll);\r\n\r\n    $el.velocity('scroll', {\r\n        complete: () => {\r\n            scroll = $window.scrollTop();\r\n\r\n            focus($el);\r\n        }\r\n    });\r\n});\r\n\r\n$document.on('click', '[href*=\"#\"]', () => {\r\n    scroll = $window.scrollTop();\r\n});\r\n\r\nif (window.location.hash.length > 1) {\r\n    onScrollStop(() => {\r\n        scroll = $window.scrollTop();\r\n    });\r\n\r\n    onLoad(() => {\r\n        scroll = $window.scrollTop();\r\n\r\n        $window.trigger('hashchange');\r\n    });\r\n}\r\n","'use strict';\r\n\r\n/*\r\n If you want elements to be equal in height and flexbox or fixed height aren't options.\r\n\r\n Options are passed to a series of data attributes, only one of which is required.\r\n\r\n Pass a string value to data-equal-group on all elements that you want to equalize.\r\n\r\n Optionally, you may use data-equal-min and/or data-equal-max to turn this functionality on/off at certain breakpoints.\r\n\r\n As a performance optimization, if the elements are hidden on load/resize they will be skipped. But that means that you may need to manually trigger the equalize functionality on specific/custom events. The exported function accepts a string which should match the group name, this allows the functionality to filter out all other elements, as another performance optimization.\r\n */\r\n\r\nimport { forEach } from 'lodash';\r\n\r\nimport { onReady, onResize, $document } from '../utilities/_helpers';\r\n\r\nlet $els = $('[data-equal-group]');\r\n\r\nfunction equalizeGroup($group: JQuery): void {\r\n    $group = $group.filter(':visible');\r\n\r\n    if (!!$group.length) {\r\n        let tallest = 0;\r\n\r\n        $group\r\n            .css({'height': 'auto'})\r\n            .each((index, el) => {\r\n                const $el = $(el);\r\n                const min = $el.data('equal-min') || 0;\r\n                const max = $el.data('equal-max') || Infinity;\r\n\r\n                if (window.innerWidth >= min && window.innerWidth <= max) {\r\n                    const height = $el.outerHeight();\r\n\r\n                    if (height > tallest) {\r\n                        tallest = height;\r\n                    }\r\n                }\r\n            })\r\n            .css({'height': tallest || 'auto'});\r\n    }\r\n}\r\n\r\nexport function equalize(group: string): void {\r\n    equalizeGroup($els.filter(`[data-equal-group=${group}]`));\r\n}\r\n\r\nfunction resize(): void {\r\n    const groups = {};\r\n\r\n    $els.each((index, el) => {\r\n        const $el = $(el);\r\n        const group = $el.data('equal-group');\r\n\r\n        groups[group] = !!groups[group] ? groups[group].add($el) : $el;\r\n    });\r\n\r\n    forEach(Object.keys(groups), (group) => equalizeGroup(groups[group]));\r\n}\r\n\r\nif (!!$els.length) {\r\n    resize();\r\n    onResize(resize);\r\n}\r\n\r\n$document.on('initializeEqualHeights', function() {\r\n    $els = $('[data-equal-group]');\r\n\r\n    if (!!$els.length) {\r\n        resize();\r\n        onResize(resize);\r\n    }\r\n});\r\n","'use strict';\r\n\r\nimport { prefix, $window, $html, $document } from '../utilities/_helpers';\r\n\r\n$document.on('click', `.${prefix('font-resize')}`, () => {\r\n    $html.toggleClass(prefix('font-size-lg'));\r\n    $html.one('transitionend otransitionend oTransitionEnd msTransitionEnd webkitTransitionEnd', function () {\r\n        $window.trigger('resize');\r\n    });\r\n    return false;\r\n});\r\n","'use strict';\r\n\r\n/*\r\n This is functionality for the placeholder label element which swaps state on focus and when the input has a value.\r\n */\r\n\r\nimport { prefix } from '../utilities/_helpers';\r\n\r\nconst $inputs = $(`.${prefix('placeholder-label')} .form-control`); // TODO: Switch to [data]\r\n\r\nfunction toggle(el: Element): void {\r\n    const $input = $(el);\r\n\r\n    $input[`${!!$input.val() ? 'add' : 'remove'}Class`](prefix('holding'));\r\n}\r\n\r\nif (!!$inputs.length) {\r\n    $inputs\r\n        .on('focus blur keyup change', (evt: Event) => toggle(evt.currentTarget as Element))\r\n        .each((index, el) => toggle(el));\r\n}\r\n","'use strict';\r\n\r\nimport { $body } from '../utilities/_helpers';\r\n\r\n/* TODO: Add [data-bypass-prevent]\r\n Prevent default Bootstrap behavior from within by using data-prevent attribute and pass the event to be prevented.\r\n */\r\n\r\n$body.on('click', '[data-prevent]', (evt: Event) => {\r\n    const $target = $(evt.currentTarget);\r\n    const event = $target.data('prevent');\r\n    const $parent = $($target.closest(event.slice(event.lastIndexOf('.')))); // Extra JQuery wrapper due to any[] typed return definition\r\n\r\n    $parent.one(event, (e: Event) => e.preventDefault());\r\n});\r\n","'use strict';\r\n\r\nimport {$document} from '../utilities/_helpers'\r\n\r\nfunction showPassword(): void {\r\n   $document.on('click', '[data-show-password]', function() {\r\n\r\n       const showPasswordFor = $(this).data('show-password'),\r\n             $links = $('[data-show-password=\"' + showPasswordFor + '\"]'),\r\n             $input = $('#' + showPasswordFor);\r\n       if ($input.attr('type') === 'text') {\r\n            $input.attr('type', 'password');\r\n            $links.text('Show Password');\r\n        } else {\r\n            $input.attr('type', 'text');\r\n            $links.text('Hide Password');\r\n        }\r\n   });\r\n}\r\n\r\nshowPassword();\r\n","'use strict';\r\n\r\nimport { merge } from 'lodash';\r\nimport {$document} from '../utilities/_helpers'\r\n\r\nconst defaults = {\r\n    placement: 'bottom'\r\n};\r\n\r\n$document.on('initializeTooltips', function() {\r\n    const $tooltips = $('[data-toggle=\"tooltip\"]');\r\n    $tooltips.each((index, tooltip) => {\r\n        const $tooltip = $(tooltip);\r\n        $tooltip.tooltip(merge({}, defaults, $tooltip.data('tooltip')));\r\n    });\r\n})\r\n","'use strict';\r\n\r\nimport {$document} from '../utilities/_helpers'\r\n\r\n$document.on('input', '[data-repass-for], [data-re-entering-for]', function() {\r\n    const $this: JQuery = $(this),\r\n        $passwordField: JQuery = $this.data('repass-for') ? $('#' + $this.data('repass-for')) : $('#' + $this.data('re-entering-for')),\r\n        passValue = $passwordField.val(),\r\n        repassValue = $this.val();\r\n\r\n    if (passValue === repassValue && passValue !== '') {\r\n        $this.closest('.form-group').addClass('is-valid-check');\r\n    } else {\r\n        $this.closest('.form-group').removeClass('is-valid-check');\r\n    }\r\n});\r\n\r\n$document.on('input', 'input[id]', function() {\r\n    const $this = $(this);\r\n    if ($.trim($this.prop('id')) !== '') {\r\n        const $repassField: JQuery = $('[data-repass-for=\"' + $this.prop('id') + '\"], [data-re-entering-for=\"' + $this.prop('id') + '\"]');\r\n        if ($repassField.length > 0) {\r\n            const passValue = $this.val(),\r\n                    repassValue = $repassField.val();\r\n\r\n            if (passValue === repassValue && passValue !== '') {\r\n                $repassField.closest('.form-group').addClass('is-valid-check');\r\n            } else {\r\n                $repassField.closest('.form-group').removeClass('is-valid-check');\r\n            }\r\n        }\r\n    }\r\n});\r\n","'use strict';\r\n\r\nimport {$document} from '../utilities/_helpers'\r\n\r\ninterface ValidationRule {\r\n    type: string;\r\n    method: Function\r\n}\r\n\r\n\r\nconst validationRules: ValidationRule[] = [\r\n    {\r\n        'type': 'upper-case-character',\r\n        'method': hasUpperCaseCharacter\r\n    },\r\n    {\r\n        'type': 'lower-case-character',\r\n        'method': hasLowerCaseCharacter\r\n    },\r\n    {\r\n        'type': 'numeric-character',\r\n        'method': hasNumber\r\n    }\r\n];\r\n\r\nfunction hasUpperCaseCharacter(str: string): boolean {\r\n    const pattern = /[A-Z]/;\r\n    return pattern.test(str);\r\n}\r\n\r\nfunction hasLowerCaseCharacter(str: string): boolean {\r\n    const pattern = /[a-z]/;\r\n    return pattern.test(str);\r\n}\r\n\r\nfunction hasNumber(str: string): boolean {\r\n    const pattern = /[0-9]/;\r\n    return pattern.test(str);\r\n}\r\n\r\n$document.on('input', '[data-validate-password-conditions]', function() {\r\n\r\n    const $this: JQuery = $(this),\r\n        $input: String = $this.val(),\r\n        $conditions: JQuery = $('#' + $this.data('validate-password-conditions')).children();\r\n\r\n    $conditions.each(function() {\r\n        const $condition = $(this);\r\n        $.each(validationRules, function(index, validationRule) {\r\n            if ($condition.hasClass(validationRule.type)) {\r\n                if (validationRule.method($input)) {\r\n                    $condition.addClass('is-valid-check');\r\n                } else {\r\n                    $condition.removeClass('is-valid-check');\r\n                }\r\n            }\r\n        })\r\n    });\r\n\r\n    if ($conditions.length === $conditions.filter('.is-valid-check').length) {\r\n        $this.closest('.form-group').addClass('is-valid-check');\r\n    } else {\r\n        $this.closest('.form-group').removeClass('is-valid-check');\r\n    }\r\n});\r\n","'use strict';\r\n\r\nimport {$body} from '../utilities/_helpers'\r\n\r\n$body.on('click', '[data-toggle=\"tab\"]', (evt: Event) => {\r\n    evt.stopPropagation();\r\n\r\n    const $target = $(evt.target).closest('[data-toggle=\"tab\"]');\r\n\r\n    $target\r\n        .tab('show')\r\n        .parents('[data-toggle=\"collapse\"]')\r\n        .siblings('.collapse')\r\n        .collapse('show');\r\n\r\n    $('.collapse', $target.parents('.aon-collapse').siblings('.aon-collapse')).collapse('hide');\r\n\r\n    return false;\r\n});\r\n\r\n$body.on('shown.bs.tab', '[data-toggle=\"tab\"]', (evt: Event) => {\r\n    const $target = $(evt.target);\r\n    let target = $target.data('target');\r\n\r\n    target = target.replace(/-controls/, '');\r\n\r\n    $body.find(`[data-target=\"${target}\"]`).tab('show');\r\n});\r\n\r\n$body.on('shown.bs.tab', '[data-toggle=\"tab\"]', (evt: Event) => {\r\n    const $target = $(evt.target);\r\n    let target = $target.data('target');\r\n\r\n    target = target.replace(/-(output|input|remove)/, '-controls-$1');\r\n\r\n    $body.find(`[data-target=\"${target}\"]`).tab('show');\r\n});\r\n","'use strict';\r\n\r\nimport {$document} from '../utilities/_helpers'\r\n\r\n$document.on('click', '[data-js=\"search-clear\"]', function() {\r\n    $('[data-js=\"search\"]').val('');\r\n});\r\n","'use strict';\r\n\r\nimport { onReady, $document, $window } from '../utilities/_helpers';\r\n\r\nfunction activate(): void {\r\n    if (window.location.hash.length > 1) {\r\n        const $tabs = $('[data-toggle=\"tab\"]');\r\n        $tabs.filter(`[data-target=\"${window.location.hash}\"], [href*=\"${window.location.hash}\"]`).tab('show');\r\n    }\r\n}\r\n\r\n$document.on('activateRelevantTab', activate);\r\nactivate();\r\n\r\n// Bootstrap doesn't properly unset tabs which aren't grouped into a single nav\r\n$document.on('shown.bs.tab', '[data-toggle=\"tab\"]', () => {\r\n    const $panes = $('.tab-pane');\r\n    $panes.not('.active').each((index, el) => {\r\n        $(`[data-target=\"#${el.id}\"], [href*=\"#${el.id}\"]`).removeClass('active').attr('aria-expanded', 'false');\r\n    });\r\n    $window.resize();\r\n});\r\n","'use strict';\r\n\r\n// Elements\r\nimport './elements/_anchor';\r\nimport './elements/_equalize';\r\nimport './elements/_font-resize';\r\nimport './elements/_placeholder-label';\r\nimport './elements/_prevent';\r\nimport './elements/_tooltip';\r\nimport './elements/_show-password';\r\nimport './elements/_validate-password-conditions';\r\nimport './elements/_validate-pass-repass';\r\n\r\n// Groups\r\nimport './groups/_search';\r\nimport './groups/_tabs';\r\nimport './groups/_editable-controls';\r\n\r\n// Components\r\nimport './components/_carousel';\r\nimport './components/_query';\r\nimport './components/_progress-steps';\r\nimport './components/_provider-result';\r\nimport './components/_type-ahead';\r\nimport './components/_overlay';\r\nimport './components/_page-level-loader';\r\nimport './components/_button-level-loader';\r\n\r\n// Modules\r\nimport './modules/_header';\r\nimport './modules/_footer';\r\nimport './modules/_chat';\r\n\r\n// Pages\r\nimport './pages/_style-guide';\r\nimport './pages/_client-home';\r\nimport './pages/_client-update-info';\r\nimport './pages/_appointment-use-different-number';\r\nimport './pages/_hide-my-account-alerts';\r\nimport './pages/_add_edit_providers';\r\nimport './pages/_communication-preferences';\r\nimport './pages/_account_pov';\r\n\r\n// TODO: Remove, not needed for production site\r\nimport './utilities/_user';\r\n","'use strict';\r\n\r\nimport { prefix, onResize, $window, $html, $document } from '../utilities/_helpers';\r\n\r\nlet $header: JQuery,\r\n    $navUtil: JQuery,\r\n    $chat: JQuery,\r\n    chatEventsAttached = false;\r\n\r\nfunction initializeChatVariables() {\r\n    $header = $(`.${prefix('header')}`),\r\n    $navUtil = $header.find('[data-js=\"nav-util\"]'),\r\n    $chat = $('[data-js=\"chat\"]');\r\n}\r\n\r\nfunction adjust(): void {\r\n    const width = $chat.is(':visible') ? $chat.outerWidth() : 0;\r\n\r\n    $html.css({'margin-right': `${width}px`});\r\n\r\n    $navUtil.css({right: `${width}px`});\r\n}\r\n\r\nfunction initializeChat() {\r\n    initializeChatVariables();\r\n\r\n    if (!!$chat.length && !chatEventsAttached) {\r\n        $document.on('click', '[data-toggle=\"chat\"]', () => {\r\n            $chat.toggleClass(prefix('hidden'));\r\n\r\n            $window.trigger('resize');\r\n        });\r\n\r\n        onResize(adjust);\r\n\r\n        chatEventsAttached = true;\r\n    }\r\n}\r\n\r\ninitializeChat();\r\n$document.on('initializeHeader', initializeChat);\r\n","'use strict';\r\n\r\nimport { onResize, $window, $document } from '../utilities/_helpers';\r\n\r\nfunction pushFooterBelowViewPort(): void {\r\n    const $footer = $('footer');\r\n    $footer.css('margin-top', 0);\r\n\r\n    const windowHeight = $window.height(),\r\n        footerTop = $footer.offset().top,\r\n        diff = windowHeight - footerTop;\r\n    if (diff > 0) {\r\n        $footer.css('margin-top', (windowHeight - footerTop) + 'px');\r\n    }\r\n}\r\n\r\nif (!!$('footer').length) {\r\n    pushFooterBelowViewPort();\r\n    onResize(pushFooterBelowViewPort);\r\n} else {\r\n    $document.on('initializeFooter', pushFooterBelowViewPort);\r\n}\r\n","'use strict';\r\n\r\nimport { prefix, focus, onReady, onResize, isBreakpointAndDown, $html, $main, $document } from '../utilities/_helpers';\r\n\r\nlet $header: JQuery,\r\n    $navUtil: JQuery,\r\n    $toolbar: JQuery,\r\n    $navMain: JQuery,\r\n    $menus: JQuery,\r\n    $subMenus: JQuery,\r\n    $search: JQuery,\r\n    $close: JQuery,\r\n    $account: JQuery,\r\n    $accountMenus: JQuery,\r\n    $accountToggle: JQuery,\r\n    $accountTab: JQuery,\r\n    $userLoggedIn: JQuery,\r\n    $notifications: JQuery,\r\n    active = 0;\r\n\r\nfunction initializeHeaderVariables() {\r\n    $header = $('.aon-header');\r\n    $navUtil = $header.find('[data-js=\"nav-util\"]');\r\n    $toolbar = $navUtil.find('[data-js=\"nav-util-toolbar\"]');\r\n    $navMain = $header.find('[data-js=\"nav-main\"]');\r\n    $menus = $header.find('[data-js^=\"menu-\"]');\r\n    $subMenus = $header.find('[data-js^=\"sub-menu-\"]');\r\n    $search = $menus.filter('[data-js=\"menu-search\"]');\r\n    $close = $header.find('[data-js=\"menu-close\"], [data-js=\"search-cancel\"]');\r\n    $account = $menus.filter('[data-js=\"menu-account\"]');\r\n    $accountMenus = $header.find('[data-js=\"account-activity\"], [data-js=\"account-menu\"]');\r\n    $accountToggle = $navUtil.find('[data-toggle=\"account-activity\"]');\r\n    $accountTab = $navUtil.find('[data-toggle=\"tab\"]');\r\n    $userLoggedIn = $navUtil.find('[data-js=\"user-logged-in\"]');\r\n    $notifications = $navUtil.find('[data-js=\"user-notifications\"]');\r\n    active = 0;\r\n}\r\n\r\nfunction adjust(): void {\r\n    const $active = $menus.filter('.show'),\r\n          adj = {\r\n                top: 0,\r\n                bottom: 0,\r\n                left: 0\r\n            };\r\n    let hat = 0;\r\n\r\n    if (isBreakpointAndDown('md')) {\r\n        adj.top += Math.floor($navMain.outerHeight());\r\n\r\n        if (!$notifications.hasClass(prefix('hidden'))) {\r\n            adj.top += (hat = Math.floor($notifications.outerHeight()));\r\n        }\r\n\r\n        adj.bottom += Math.floor($navUtil.outerHeight());\r\n    } else {\r\n        adj.left += Math.floor($navMain.outerWidth());\r\n    }\r\n\r\n    $html.css({\r\n        'margin-top': `${adj.top}px`,\r\n        'margin-bottom': `${adj.bottom}px`,\r\n        'margin-left': `${adj.left}px`\r\n    });\r\n\r\n    $navUtil.css({left: `${adj.left}px`});\r\n\r\n    $navMain.css({top: `${hat}px`});\r\n\r\n    $userLoggedIn.css({width: $toolbar.outerWidth()});\r\n\r\n    if (!!$active.length) {\r\n        resizeMenu($active);\r\n    }\r\n}\r\n\r\nfunction closeMenu(): void {\r\n    const $active = $menus.filter('.show');\r\n\r\n    if (!!$active.length) {\r\n        $active.collapse('hide');\r\n    }\r\n}\r\n\r\nfunction resizeMenu($menu: JQuery): void {\r\n    if (isBreakpointAndDown('md')) {\r\n        let height = window.innerHeight;\r\n\r\n        height -= $navMain.outerHeight();\r\n        height -= $toolbar.outerHeight();\r\n\r\n        if (!$userLoggedIn.hasClass(prefix('hidden'))) {\r\n            height -= $userLoggedIn.outerHeight();\r\n        }\r\n\r\n        if (!$notifications.hasClass(prefix('hidden'))) {\r\n            height -= $notifications.outerHeight();\r\n        }\r\n\r\n        // Bootstrap functionality controls height\r\n        $menu.css({\r\n            width: 'auto',\r\n            'min-height': `${height}px`,\r\n            'max-height': `${height}px`\r\n        });\r\n\r\n        $search.css({top: 'auto'});\r\n    } else {\r\n        $menu.css({\r\n            width: $toolbar.outerWidth(),\r\n            'min-height': 0,\r\n            'max-height': 'none'\r\n        });\r\n    }\r\n}\r\n\r\nfunction initializeHeader() {\r\n    initializeHeaderVariables();\r\n    $menus.on({\r\n        'show.bs.collapse': (evt: Event) => {\r\n            const $target = $(evt.target).not($subMenus);\r\n\r\n            if (!!$target.length) {\r\n                active++;\r\n\r\n                $html.addClass(prefix('header-menu-active'));\r\n\r\n                closeMenu();\r\n\r\n                resizeMenu($target);\r\n            }\r\n        },\r\n        'shown.bs.collapse': (evt: Event) => {\r\n            const $target = $(evt.target).not($subMenus);\r\n\r\n            if (!!$target.length) {\r\n                const $input = $target.find('input');\r\n\r\n                focus(!!$input.length ? $input : $target);\r\n            }\r\n        },\r\n        'hidden.bs.collapse': (evt: Event) => {\r\n            const $target = $(evt.target).not($subMenus);\r\n\r\n            if (!!$target.length) {\r\n                active--;\r\n\r\n                if (!active) {\r\n                    $html.removeClass(prefix('header-menu-active'));\r\n                }\r\n            }\r\n        }\r\n    });\r\n\r\n    $subMenus.on('show.bs.collapse', () => $subMenus.filter('.show').collapse('hide'));\r\n\r\n    $accountToggle.on('click', () => {\r\n        $account.toggleClass(prefix('bg-red'));\r\n\r\n        $accountMenus.toggleClass(prefix('hidden'));\r\n    });\r\n\r\n    $accountTab.on('click', (evt: Event) => {\r\n        const $target = $(evt.target),\r\n              target = $target.data('target'),\r\n              $tab = $(target);\r\n\r\n        if (!!$tab.length) {\r\n            closeMenu();\r\n        } else {\r\n            window.location.href = window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : undefined) + $target.attr('href') + target;\r\n        }\r\n    });\r\n\r\n    $close.on('click', closeMenu);\r\n\r\n    $main.on('click', $main, closeMenu);\r\n\r\n    onResize(() => {\r\n        const $active = $menus.filter('.show');\r\n\r\n        if (!!$active.length) {\r\n            resizeMenu($active);\r\n        }\r\n\r\n        adjust();\r\n    });\r\n\r\n    onReady(adjust);\r\n}\r\n\r\nif (!!$('.aon-header').length) {\r\n    initializeHeader()\r\n} else {\r\n    $document.on('initializeHeader', initializeHeader);\r\n}\r\n","'use strict';\r\n\r\nimport {$document} from '../utilities/_helpers'\r\n\r\n$document.on('change', 'input[type=\"radio\"][name=\"account-poa-has-same-address\"]', function() {\r\n    const isDiffAddress = $('input[type=\"radio\"][name=\"account-poa-has-same-address\"]').filter(':checked').val() === 'yes',\r\n          $differentMailingAddress = $('.my-profile-pov-address-row');\r\n\r\n    if (isDiffAddress) {\r\n        $differentMailingAddress.removeClass('is-visible');\r\n    } else {\r\n        $differentMailingAddress.addClass('is-visible');\r\n    }\r\n});\r\n","'use strict';\r\n\r\nimport { $document } from '../utilities/_helpers';\r\n\r\nfunction showAllProviderLocations($this: JQuery) {\r\n    $this.addClass('all-locations-visible');\r\n    $this.text($this.data('hide-text'));\r\n    $('.aon-provider-location', $($this.parents('.aon-provider-result')[0])).fadeIn();\r\n}\r\n\r\nfunction hideOtherLocations($this: JQuery) {\r\n    $this.removeClass('all-locations-visible');\r\n    $this.text($this.data('show-text'));\r\n\r\n    const $locations = $('.aon-provider-location', $($this.parents('.aon-provider-result')[0])),\r\n          $checkedLocation = $('input', $locations).filter(':checked');\r\n\r\n    if ($checkedLocation.length > 0) {\r\n        $locations.not($checkedLocation.parents('.aon-provider-location')).fadeOut();\r\n    } else {\r\n        $locations.not(':first').fadeOut();\r\n    }\r\n}\r\n\r\n$document.on('click', '.view-all-locations-link', function() {\r\n    const shouldShow = !($(this).hasClass('all-locations-visible'))\r\n    if (shouldShow) {\r\n        showAllProviderLocations($(this));\r\n    } else {\r\n        hideOtherLocations($(this));\r\n    }\r\n});\r\n\r\nfunction providerResultsAdded() {\r\n    const viewLocationsLinks = $('.view-all-locations-link');\r\n    viewLocationsLinks.not('.initialized').each(function(i, e){\r\n        const $locations = $('.aon-provider-location', $($(e).parents('.aon-provider-result')[0])),\r\n              $checkedinput = $('input[type=\"radio\"]', $locations).filter(':checked');\r\n\r\n        if ($checkedinput.length > 0) {\r\n            const $checkedLocation = $checkedinput.parents('.aon-provider-location').first();\r\n            $locations.not($checkedLocation).hide();\r\n        } else {\r\n            $locations.not(':first').hide();\r\n        }\r\n\r\n        viewLocationsLinks.addClass('initialized');\r\n    });\r\n}\r\n\r\n$document.on('providerResultsAdded', providerResultsAdded);\r\n","'use strict';\r\n\r\nimport {$document} from '../utilities/_helpers'\r\n\r\n\r\n$document.on('click', '.use-different-number', function(e) {\r\n    e.preventDefault();\r\n\r\n    const $parent = $(this).parents('.aon-appointment-confirmed-box-contents').first(),\r\n            $currentNumberSection = $('.aon-appointment--details', $parent),\r\n            $differntNumberform = $('.aon-use-different-number-form', $parent);\r\n\r\n    $currentNumberSection.hide();\r\n    $differntNumberform.show();\r\n});\r\n\r\n$document.on('click', '.aon-use-different-number-form .aon-cta', function(e) {\r\n    e.preventDefault();\r\n\r\n    const $parent = $(this).parents('.aon-appointment-confirmed-box-contents').first(),\r\n            $currentNumberSection = $('.aon-appointment--details', $parent),\r\n            $differntNumberform = $('.aon-use-different-number-form', $parent);\r\n\r\n    $currentNumberSection.show();\r\n    $differntNumberform.hide();\r\n});\r\n","'use strict';\r\n\r\nimport {$document} from '../utilities/_helpers'\r\n\r\nlet $ssnForm = $('.ssn-form'),\r\n    $exchangeIDForm = $('.exchange-id-form'),\r\n    $existingAccountFormContainer = $('.existing-account-form--container'),\r\n    $commonFormLastName = $('.common-form--last-name'),\r\n    $commonFormDobAndZip = $('.common-form--dob-zip'),\r\n    $createAccountButtonContainer = $('.create-account-button-container'),\r\n    $loginButtonContainer = $('.login-button-container');\r\n\r\nfunction initializeVariables() {\r\n    $ssnForm = $('.ssn-form'),\r\n    $exchangeIDForm = $('.exchange-id-form'),\r\n    $existingAccountFormContainer = $('.existing-account-form--container'),\r\n    $commonFormLastName = $('.common-form--last-name'),\r\n    $commonFormDobAndZip = $('.common-form--dob-zip'),\r\n    $createAccountButtonContainer = $('.create-account-button-container'),\r\n    $loginButtonContainer = $('.login-button-container');\r\n}\r\n\r\nfunction displayFlex($e: JQuery) {\r\n    $e.css('display', 'flex');\r\n}\r\n\r\nfunction enableSSNForm() {\r\n    $exchangeIDForm.hide();\r\n    $existingAccountFormContainer.hide();\r\n    $loginButtonContainer.hide();\r\n\r\n    displayFlex($ssnForm);\r\n    displayFlex($commonFormLastName);\r\n    displayFlex($commonFormDobAndZip);\r\n    displayFlex($createAccountButtonContainer);\r\n}\r\n\r\nfunction exchangeIDForm() {\r\n    $ssnForm.hide();\r\n    $existingAccountFormContainer.hide();\r\n    $loginButtonContainer.hide();\r\n\r\n    displayFlex($exchangeIDForm);\r\n    displayFlex($commonFormLastName);\r\n    displayFlex($commonFormDobAndZip);\r\n    displayFlex($createAccountButtonContainer);\r\n}\r\n\r\nfunction existingAccountForm() {\r\n    $ssnForm.hide();\r\n    $exchangeIDForm.hide();\r\n    $commonFormLastName.hide();\r\n    $commonFormDobAndZip.hide();\r\n    $createAccountButtonContainer.hide();\r\n\r\n    displayFlex($existingAccountFormContainer);\r\n    displayFlex($loginButtonContainer);\r\n}\r\n\r\n$document.on('change', '[type=\"radio\"][name=\"identity\"]', function() {\r\n    const selectedOption = $('[type=\"radio\"][name=\"identity\"]').filter(':checked').val();\r\n\r\n    initializeVariables();\r\n\r\n    switch (selectedOption) {\r\n        case 'ssn': {\r\n            enableSSNForm();\r\n            return;\r\n        }\r\n        case 'exchange_id': {\r\n            exchangeIDForm();\r\n            return;\r\n        }\r\n        case 'existing_account': {\r\n            existingAccountForm();\r\n            return;\r\n        }\r\n    }\r\n});\r\n","'use strict';\r\n\r\nimport {$document} from '../utilities/_helpers'\r\n\r\n$document.on('change', 'input[type=\"radio\"][name=\"differentMailingAddress\"]', function() {\r\n    const isDiffAddress = $('input[type=\"radio\"][name=\"differentMailingAddress\"]').filter(':checked').val() === 'yes',\r\n          $differentMailingAddress = $('.mailing-address-different');\r\n\r\n    if (isDiffAddress) {\r\n        $differentMailingAddress.slideDown();\r\n    } else {\r\n        $differentMailingAddress.slideUp();\r\n    }\r\n});\r\n\r\n$document.on('change', 'input[type=\"radio\"][name=\"addPOA\"]', function() {\r\n    const isAddingPOA = $('input[type=\"radio\"][name=\"addPOA\"]').filter(':checked').val() === 'yes',\r\n          $addPOADetails = $('.poa-details-container');\r\n\r\n    if (isAddingPOA) {\r\n        $addPOADetails.slideDown();\r\n    } else {\r\n        $addPOADetails.slideUp();\r\n    }\r\n});\r\n\r\n$document.on('change', 'input[type=\"radio\"][name=\"POAHasSameAddress\"]', function() {\r\n    const isPOADiffHasAddress = $('input[type=\"radio\"][name=\"POAHasSameAddress\"]').filter(':checked').val() === 'no',\r\n          $POAMailingAddress = $('.poa-mailing-address');\r\n\r\n    if (isPOADiffHasAddress) {\r\n        $POAMailingAddress.slideDown();\r\n    } else {\r\n        $POAMailingAddress.slideUp();\r\n    }\r\n});\r\n","'use strict';\r\n\r\nimport {$document} from '../utilities/_helpers'\r\n\r\n$document.on('change', 'input[type=\"radio\"][name=\"can-send-physical-mail\"]', function() {\r\n    const canSendMail = $('input[type=\"radio\"][name=\"can-send-physical-mail\"]').filter(':checked').val() === 'yes',\r\n          $mailAddressForm = $('.com-pref-can-send-mail-form');\r\n\r\n    if (canSendMail) {\r\n        $mailAddressForm.addClass('can-send-email');\r\n    } else {\r\n        $mailAddressForm.removeClass('can-send-email');\r\n    }\r\n});\r\n\r\n$document.on('change', 'input[type=\"radio\"][name=\"can-call\"]', function() {\r\n    const canCall = $('input[type=\"radio\"][name=\"can-call\"]').filter(':checked').val() === 'yes',\r\n          $phoneNoForm = $('.com-pref-can-call-form');\r\n\r\n    if (canCall) {\r\n        $phoneNoForm.addClass('can-call');\r\n    } else {\r\n        $phoneNoForm.removeClass('can-call');\r\n    }\r\n});\r\n","'use strict';\r\n\r\nimport {$document} from '../utilities/_helpers'\r\n\r\nfunction hideOrShowAlerts() {\r\n    if ($('.hide-my-account-alerts').length > 0) {\r\n        $('.aon-menu-content .alert.aon-alert').hide();\r\n        $('.aon-menu-content+.card-block').hide();\r\n        $('.aon-menu-flag').hide();\r\n        $('.aon-menu-items').show();\r\n        $('.adv-name').show();\r\n    } else {\r\n        $('.aon-menu-content .alert.aon-alert').show();\r\n        $('.aon-menu-content+.card-block').show();\r\n        $('.aon-menu-items').hide();\r\n        $('.aon-menu-flag').show();\r\n    }\r\n}\r\nhideOrShowAlerts();\r\n","'use strict';\r\n\r\nimport { hooks } from 'prismjs';\r\nimport 'prismjs/plugins/unescaped-markup/prism-unescaped-markup';\r\nimport { html } from 'js-beautify';\r\nimport * as Clipboard from 'clipboard';\r\n\r\nimport { prefix, onReady, onResize, $html } from '../utilities/_helpers';\r\n\r\nconst $guide = $(`.${prefix('page-style-guide')}`);\r\nconst $nav = $guide.find('[data-example-nav]');\r\nconst $examples = $guide.find('[data-example]');\r\n\r\nfunction adjust(): void {\r\n    $html.css({'margin-bottom': $nav.outerHeight()});\r\n}\r\n\r\nif (!!$guide.length) {\r\n    $guide\r\n        .on('mouseenter', '[data-example]', (evt: Event) => {\r\n            $examples\r\n                .removeClass(prefix('example-highlight'))\r\n                .filter(`[data-example=\"${$(evt.target).closest('[data-example]').data('example')}\"]`)\r\n                .addClass(prefix('example-highlight'));\r\n        })\r\n        .on('mouseleave', '[data-example]', () => {\r\n            $examples.removeClass(prefix('example-highlight'));\r\n        });\r\n\r\n    new Clipboard(`.${prefix('example-copy')}`, {\r\n        text: (trigger) => $(`[data-example=\"${$(trigger).data('example')}\"] code`).data('clipboard')\r\n    });\r\n\r\n    hooks.add('before-sanity-check', (env) => {\r\n        if (env.language === 'markup') {\r\n            env.element.textContent = env.code = html(env.code, {\r\n                wrap_line_length: 0,\r\n                unformatted: 'none'\r\n            });\r\n\r\n            $(env.element).data('clipboard', env.code);\r\n        }\r\n    });\r\n\r\n    onResize(adjust);\r\n\r\n    onReady(adjust);\r\n}\r\n","'use strict';\r\n\r\nimport { bind, call, debounce, forEach, invokeMap } from 'lodash';\r\n\r\nimport { PREFIX, BREAKPOINTS } from '../_vars';\r\n\r\nexport function toDashCase(str = ''): string {\r\n    return str.trim().toLowerCase().replace(/[\\s_]/g, '-');\r\n}\r\n\r\nexport function prefix(...strings: string[]): string {\r\n    return strings.map((str) => `${PREFIX}-${toDashCase(str)}`).join(' ');\r\n}\r\n\r\nexport function parameters(): { [param: string]: any } {\r\n    const params = {};\r\n    const pairs = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');\r\n\r\n    forEach(pairs, (pair) => {\r\n        const hash = pair.split('=');\r\n\r\n        params[hash[0]] = hash[1] ? decodeURIComponent(hash[1]) : true;\r\n    });\r\n\r\n    return params;\r\n}\r\n\r\nconst $breakpoint = $(`#${prefix('breakpoint')}`);\r\n\r\nexport function getBreakpoint() {\r\n    return $breakpoint.css('font-family');\r\n}\r\n\r\nexport function isBreakpoint(breakpoint: string): boolean {\r\n    return breakpoint === getBreakpoint();\r\n}\r\n\r\nexport function isBreakpointAndUp(breakpoint: string): boolean {\r\n    return BREAKPOINTS.indexOf(breakpoint) <= BREAKPOINTS.indexOf(getBreakpoint());\r\n}\r\n\r\nexport function isBreakpointAndDown(breakpoint: string): boolean {\r\n    return BREAKPOINTS.indexOf(breakpoint) >= BREAKPOINTS.indexOf(getBreakpoint());\r\n}\r\n\r\nexport function focus($el: JQuery): void {\r\n    $el.trigger('focus');\r\n\r\n    if (!$el.is(':focus')) {\r\n        $el\r\n            .attr('tabindex', '-1')\r\n            .trigger('focus')\r\n            .one('blur', () => {\r\n                $el.removeAttr('tabindex');\r\n            });\r\n    }\r\n}\r\n\r\nlet scrollStopped = true;\r\nconst callbacks = {\r\n    load: [] as Function[],\r\n    ready: [] as Function[],\r\n    resize: [] as Function[],\r\n    scroll: {\r\n        start: [] as Function[],\r\n        every: [\r\n            debounce(() => {\r\n                invokeMap(callbacks.scroll.stop, call);\r\n\r\n                scrollStopped = true;\r\n            }, 250)\r\n        ] as Function[],\r\n        stop: [] as Function[]\r\n    }\r\n};\r\n\r\nexport function onLoad(callback: Function) {\r\n    if (!!callbacks.load) {\r\n        callbacks.load.push(callback);\r\n    } else {\r\n        callback();\r\n    }\r\n}\r\n\r\nexport function onReady(callback: Function) {\r\n    if (!!callbacks.ready) {\r\n        callbacks.ready.push(callback);\r\n    } else {\r\n        callback();\r\n    }\r\n}\r\n\r\nexport function onResize(callback: Function) {\r\n    callbacks.resize.push(callback);\r\n}\r\n\r\nexport function onScrollStart(callback: Function) {\r\n    callbacks.scroll.start.push(callback);\r\n}\r\n\r\nexport function onScroll(callback: Function) {\r\n    callbacks.scroll.every.push(callback);\r\n}\r\n\r\nexport function onScrollStop(callback: Function) {\r\n    callbacks.scroll.stop.push(callback);\r\n}\r\n\r\nexport const $window = $(window);\r\n\r\n$window.on({\r\n    load: () => {\r\n        invokeMap(callbacks.load, call);\r\n\r\n        delete callbacks.load;\r\n    },\r\n    resize: () => {\r\n        invokeMap(callbacks.resize, call);\r\n    }\r\n});\r\n\r\nexport const $document = $(document);\r\n\r\n$document\r\n    .on('scroll', () => {\r\n        if (scrollStopped) {\r\n            invokeMap(callbacks.scroll.start, call);\r\n\r\n            scrollStopped = false;\r\n        }\r\n\r\n        invokeMap(callbacks.scroll.every, call);\r\n    })\r\n    .ready(() => {\r\n        invokeMap(callbacks.ready, call);\r\n\r\n        delete callbacks.ready;\r\n    });\r\n\r\nexport const $html = $(document.documentElement);\r\n\r\nexport const $body = $(document.body);\r\n\r\nexport const $main = $(`#${prefix('main')}`);\r\n","'use strict';\r\n\r\nimport { prefix, $window, $document } from './_helpers';\r\n\r\n$document.on('click', '[data-toggle=\"user\"]', () => {\r\n    const $user = $('[data-js^=\"user\"]');\r\n    $user.toggleClass(prefix('hidden'));\r\n\r\n    $window.trigger('resize');\r\n});\r\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvY2xpcGJvYXJkL2xpYi9jbGlwYm9hcmQtYWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NsaXBib2FyZC9saWIvY2xpcGJvYXJkLmpzIiwibm9kZV9tb2R1bGVzL2RlbGVnYXRlL3NyYy9jbG9zZXN0LmpzIiwibm9kZV9tb2R1bGVzL2RlbGVnYXRlL3NyYy9kZWxlZ2F0ZS5qcyIsIm5vZGVfbW9kdWxlcy9nb29kLWxpc3RlbmVyL3NyYy9pcy5qcyIsIm5vZGVfbW9kdWxlcy9nb29kLWxpc3RlbmVyL3NyYy9saXN0ZW4uanMiLCJub2RlX21vZHVsZXMvanMtYmVhdXRpZnkvanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanMtYmVhdXRpZnkvanMvbGliL2JlYXV0aWZ5LWNzcy5qcyIsIm5vZGVfbW9kdWxlcy9qcy1iZWF1dGlmeS9qcy9saWIvYmVhdXRpZnktaHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy1iZWF1dGlmeS9qcy9saWIvYmVhdXRpZnkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2xvZGFzaC5taW4uanMiLCJub2RlX21vZHVsZXMvcHJpc21qcy9wbHVnaW5zL3VuZXNjYXBlZC1tYXJrdXAvcHJpc20tdW5lc2NhcGVkLW1hcmt1cC5qcyIsIm5vZGVfbW9kdWxlcy9wcmlzbWpzL3ByaXNtLmpzIiwibm9kZV9tb2R1bGVzL3NlbGVjdC9zcmMvc2VsZWN0LmpzIiwibm9kZV9tb2R1bGVzL3RpbnktZW1pdHRlci9pbmRleC5qcyIsInNyYy9fc2NyaXB0cy9fdmFycy50cyIsInNyYy9fc2NyaXB0cy9jb21wb25lbnRzL19idXR0b24tbGV2ZWwtbG9hZGVyLnRzIiwic3JjL19zY3JpcHRzL2NvbXBvbmVudHMvX2Nhcm91c2VsLnRzIiwic3JjL19zY3JpcHRzL2NvbXBvbmVudHMvX292ZXJsYXkudHMiLCJzcmMvX3NjcmlwdHMvY29tcG9uZW50cy9fcGFnZS1sZXZlbC1sb2FkZXIudHMiLCJzcmMvX3NjcmlwdHMvY29tcG9uZW50cy9fcHJvZ3Jlc3Mtc3RlcHMudHMiLCJzcmMvX3NjcmlwdHMvY29tcG9uZW50cy9fcHJvdmlkZXItcmVzdWx0LnRzIiwic3JjL19zY3JpcHRzL2NvbXBvbmVudHMvX3F1ZXJ5LnRzIiwic3JjL19zY3JpcHRzL2NvbXBvbmVudHMvX3R5cGUtYWhlYWQudHMiLCJzcmMvX3NjcmlwdHMvZWxlbWVudHMvX2FuY2hvci50cyIsInNyYy9fc2NyaXB0cy9lbGVtZW50cy9fZXF1YWxpemUudHMiLCJzcmMvX3NjcmlwdHMvZWxlbWVudHMvX2ZvbnQtcmVzaXplLnRzIiwic3JjL19zY3JpcHRzL2VsZW1lbnRzL19wbGFjZWhvbGRlci1sYWJlbC50cyIsInNyYy9fc2NyaXB0cy9lbGVtZW50cy9fcHJldmVudC50cyIsInNyYy9fc2NyaXB0cy9lbGVtZW50cy9fc2hvdy1wYXNzd29yZC50cyIsInNyYy9fc2NyaXB0cy9lbGVtZW50cy9fdG9vbHRpcC50cyIsInNyYy9fc2NyaXB0cy9lbGVtZW50cy9fdmFsaWRhdGUtcGFzcy1yZXBhc3MudHMiLCJzcmMvX3NjcmlwdHMvZWxlbWVudHMvX3ZhbGlkYXRlLXBhc3N3b3JkLWNvbmRpdGlvbnMudHMiLCJzcmMvX3NjcmlwdHMvZ3JvdXBzL19lZGl0YWJsZS1jb250cm9scy50cyIsInNyYy9fc2NyaXB0cy9ncm91cHMvX3NlYXJjaC50cyIsInNyYy9fc2NyaXB0cy9ncm91cHMvX3RhYnMudHMiLCJzcmMvX3NjcmlwdHMvbWFpbi5jdXN0b20udHMiLCJzcmMvX3NjcmlwdHMvbW9kdWxlcy9fY2hhdC50cyIsInNyYy9fc2NyaXB0cy9tb2R1bGVzL19mb290ZXIudHMiLCJzcmMvX3NjcmlwdHMvbW9kdWxlcy9faGVhZGVyLnRzIiwic3JjL19zY3JpcHRzL3BhZ2VzL19hY2NvdW50X3Bvdi50cyIsInNyYy9fc2NyaXB0cy9wYWdlcy9fYWRkX2VkaXRfcHJvdmlkZXJzLnRzIiwic3JjL19zY3JpcHRzL3BhZ2VzL19hcHBvaW50bWVudC11c2UtZGlmZmVyZW50LW51bWJlci50cyIsInNyYy9fc2NyaXB0cy9wYWdlcy9fY2xpZW50LWhvbWUudHMiLCJzcmMvX3NjcmlwdHMvcGFnZXMvX2NsaWVudC11cGRhdGUtaW5mby50cyIsInNyYy9fc2NyaXB0cy9wYWdlcy9fY29tbXVuaWNhdGlvbi1wcmVmZXJlbmNlcy50cyIsInNyYy9fc2NyaXB0cy9wYWdlcy9faGlkZS1teS1hY2NvdW50LWFsZXJ0cy50cyIsInNyYy9fc2NyaXB0cy9wYWdlcy9fc3R5bGUtZ3VpZGUudHMiLCJzcmMvX3NjcmlwdHMvdXRpbGl0aWVzL19oZWxwZXJzLnRzIiwic3JjL19zY3JpcHRzL3V0aWxpdGllcy9fdXNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDMWpCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDdm1DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDaDdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Y2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoWydtb2R1bGUnLCAnc2VsZWN0J10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZmFjdG9yeShtb2R1bGUsIHJlcXVpcmUoJ3NlbGVjdCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbW9kID0ge1xuICAgICAgICAgICAgZXhwb3J0czoge31cbiAgICAgICAgfTtcbiAgICAgICAgZmFjdG9yeShtb2QsIGdsb2JhbC5zZWxlY3QpO1xuICAgICAgICBnbG9iYWwuY2xpcGJvYXJkQWN0aW9uID0gbW9kLmV4cG9ydHM7XG4gICAgfVxufSkodGhpcywgZnVuY3Rpb24gKG1vZHVsZSwgX3NlbGVjdCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBfc2VsZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NlbGVjdCk7XG5cbiAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge1xuICAgICAgICAgICAgZGVmYXVsdDogb2JqXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgICAgICAgICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICAgICAgICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICAgICAgICB9O1xuICAgIH0oKTtcblxuICAgIHZhciBDbGlwYm9hcmRBY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQ2xpcGJvYXJkQWN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDbGlwYm9hcmRBY3Rpb24pO1xuXG4gICAgICAgICAgICB0aGlzLnJlc29sdmVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5pbml0U2VsZWN0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyBiYXNlIHByb3BlcnRpZXMgcGFzc2VkIGZyb20gY29uc3RydWN0b3IuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICAgICAqL1xuXG5cbiAgICAgICAgX2NyZWF0ZUNsYXNzKENsaXBib2FyZEFjdGlvbiwgW3tcbiAgICAgICAgICAgIGtleTogJ3Jlc29sdmVPcHRpb25zJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZXNvbHZlT3B0aW9ucygpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbiA9IG9wdGlvbnMuYWN0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlciA9IG9wdGlvbnMuZW1pdHRlcjtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIgPSBvcHRpb25zLnRyaWdnZXI7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXk6ICdpbml0U2VsZWN0aW9uJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0U2VsZWN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RGYWtlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRhcmdldCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5OiAnc2VsZWN0RmFrZScsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc2VsZWN0RmFrZSgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgdmFyIGlzUlRMID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlyJykgPT0gJ3J0bCc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZha2UoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZmFrZUhhbmRsZXJDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJlbW92ZUZha2UoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmFrZUhhbmRsZXIgPSBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKSB8fCB0cnVlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mYWtlRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCB6b29taW5nIG9uIGlPU1xuICAgICAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUuZm9udFNpemUgPSAnMTJwdCc7XG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgYm94IG1vZGVsXG4gICAgICAgICAgICAgICAgdGhpcy5mYWtlRWxlbS5zdHlsZS5ib3JkZXIgPSAnMCc7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWtlRWxlbS5zdHlsZS5wYWRkaW5nID0gJzAnO1xuICAgICAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUubWFyZ2luID0gJzAnO1xuICAgICAgICAgICAgICAgIC8vIE1vdmUgZWxlbWVudCBvdXQgb2Ygc2NyZWVuIGhvcml6b250YWxseVxuICAgICAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGVbaXNSVEwgPyAncmlnaHQnIDogJ2xlZnQnXSA9ICctOTk5OXB4JztcbiAgICAgICAgICAgICAgICAvLyBNb3ZlIGVsZW1lbnQgdG8gdGhlIHNhbWUgcG9zaXRpb24gdmVydGljYWxseVxuICAgICAgICAgICAgICAgIHZhciB5UG9zaXRpb24gPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICB0aGlzLmZha2VFbGVtLnN0eWxlLnRvcCA9IHlQb3NpdGlvbiArICdweCc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZha2VFbGVtLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWtlRWxlbS52YWx1ZSA9IHRoaXMudGV4dDtcblxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5mYWtlRWxlbSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9ICgwLCBfc2VsZWN0Mi5kZWZhdWx0KSh0aGlzLmZha2VFbGVtKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvcHlUZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleTogJ3JlbW92ZUZha2UnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUZha2UoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmFrZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZmFrZUhhbmRsZXJDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFrZUhhbmRsZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZha2VIYW5kbGVyQ2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZha2VFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5mYWtlRWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5OiAnc2VsZWN0VGFyZ2V0JyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZWxlY3RUYXJnZXQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSAoMCwgX3NlbGVjdDIuZGVmYXVsdCkodGhpcy50YXJnZXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29weVRleHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5OiAnY29weVRleHQnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHlUZXh0KCkge1xuICAgICAgICAgICAgICAgIHZhciBzdWNjZWVkZWQgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZWVkZWQgPSBkb2N1bWVudC5leGVjQ29tbWFuZCh0aGlzLmFjdGlvbik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVzdWx0KHN1Y2NlZWRlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleTogJ2hhbmRsZVJlc3VsdCcsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlUmVzdWx0KHN1Y2NlZWRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KHN1Y2NlZWRlZCA/ICdzdWNjZXNzJyA6ICdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5zZWxlY3RlZFRleHQsXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6IHRoaXMudHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJTZWxlY3Rpb246IHRoaXMuY2xlYXJTZWxlY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXk6ICdjbGVhclNlbGVjdGlvbicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmJsdXIoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleTogJ2Rlc3Ryb3knLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGYWtlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleTogJ2FjdGlvbicsXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnY29weSc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb24gPSBhY3Rpb247XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYWN0aW9uICE9PSAnY29weScgJiYgdGhpcy5fYWN0aW9uICE9PSAnY3V0Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJhY3Rpb25cIiB2YWx1ZSwgdXNlIGVpdGhlciBcImNvcHlcIiBvciBcImN1dFwiJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleTogJ3RhcmdldCcsXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAodHlwZW9mIHRhcmdldCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodGFyZ2V0KSkgPT09ICdvYmplY3QnICYmIHRhcmdldC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9uID09PSAnY29weScgJiYgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBcInRhcmdldFwiIGF0dHJpYnV0ZS4gUGxlYXNlIHVzZSBcInJlYWRvbmx5XCIgaW5zdGVhZCBvZiBcImRpc2FibGVkXCIgYXR0cmlidXRlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGlvbiA9PT0gJ2N1dCcgJiYgKHRhcmdldC5oYXNBdHRyaWJ1dGUoJ3JlYWRvbmx5JykgfHwgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJ0YXJnZXRcIiBhdHRyaWJ1dGUuIFlvdSBjYW5cXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCBcInJlYWRvbmx5XCIgb3IgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZXMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgdmFsdWUsIHVzZSBhIHZhbGlkIEVsZW1lbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XSk7XG5cbiAgICAgICAgcmV0dXJuIENsaXBib2FyZEFjdGlvbjtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IENsaXBib2FyZEFjdGlvbjtcbn0pOyIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShbJ21vZHVsZScsICcuL2NsaXBib2FyZC1hY3Rpb24nLCAndGlueS1lbWl0dGVyJywgJ2dvb2QtbGlzdGVuZXInXSwgZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBmYWN0b3J5KG1vZHVsZSwgcmVxdWlyZSgnLi9jbGlwYm9hcmQtYWN0aW9uJyksIHJlcXVpcmUoJ3RpbnktZW1pdHRlcicpLCByZXF1aXJlKCdnb29kLWxpc3RlbmVyJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBtb2QgPSB7XG4gICAgICAgICAgICBleHBvcnRzOiB7fVxuICAgICAgICB9O1xuICAgICAgICBmYWN0b3J5KG1vZCwgZ2xvYmFsLmNsaXBib2FyZEFjdGlvbiwgZ2xvYmFsLnRpbnlFbWl0dGVyLCBnbG9iYWwuZ29vZExpc3RlbmVyKTtcbiAgICAgICAgZ2xvYmFsLmNsaXBib2FyZCA9IG1vZC5leHBvcnRzO1xuICAgIH1cbn0pKHRoaXMsIGZ1bmN0aW9uIChtb2R1bGUsIF9jbGlwYm9hcmRBY3Rpb24sIF90aW55RW1pdHRlciwgX2dvb2RMaXN0ZW5lcikge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBfY2xpcGJvYXJkQWN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsaXBib2FyZEFjdGlvbik7XG5cbiAgICB2YXIgX3RpbnlFbWl0dGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3RpbnlFbWl0dGVyKTtcblxuICAgIHZhciBfZ29vZExpc3RlbmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dvb2RMaXN0ZW5lcik7XG5cbiAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge1xuICAgICAgICAgICAgZGVmYXVsdDogb2JqXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICAgICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgICAgICAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgICAgICAgICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gICAgICAgIH07XG4gICAgfSgpO1xuXG4gICAgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICAgICAgICBpZiAoIXNlbGYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICAgICAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgICAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG4gICAgfVxuXG4gICAgdmFyIENsaXBib2FyZCA9IGZ1bmN0aW9uIChfRW1pdHRlcikge1xuICAgICAgICBfaW5oZXJpdHMoQ2xpcGJvYXJkLCBfRW1pdHRlcik7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSB0cmlnZ2VyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBDbGlwYm9hcmQodHJpZ2dlciwgb3B0aW9ucykge1xuICAgICAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsaXBib2FyZCk7XG5cbiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDbGlwYm9hcmQuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDbGlwYm9hcmQpKS5jYWxsKHRoaXMpKTtcblxuICAgICAgICAgICAgX3RoaXMucmVzb2x2ZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgICAgICBfdGhpcy5saXN0ZW5DbGljayh0cmlnZ2VyKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIGlmIGF0dHJpYnV0ZXMgd291bGQgYmUgcmVzb2x2ZWQgdXNpbmcgaW50ZXJuYWwgc2V0dGVyIGZ1bmN0aW9uc1xuICAgICAgICAgKiBvciBjdXN0b20gZnVuY3Rpb25zIHRoYXQgd2VyZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAgICAgKi9cblxuXG4gICAgICAgIF9jcmVhdGVDbGFzcyhDbGlwYm9hcmQsIFt7XG4gICAgICAgICAgICBrZXk6ICdyZXNvbHZlT3B0aW9ucycsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVzb2x2ZU9wdGlvbnMoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb24gPSB0eXBlb2Ygb3B0aW9ucy5hY3Rpb24gPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmFjdGlvbiA6IHRoaXMuZGVmYXVsdEFjdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGFyZ2V0IDogdGhpcy5kZWZhdWx0VGFyZ2V0O1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHR5cGVvZiBvcHRpb25zLnRleHQgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnRleHQgOiB0aGlzLmRlZmF1bHRUZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXk6ICdsaXN0ZW5DbGljaycsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gbGlzdGVuQ2xpY2sodHJpZ2dlcikge1xuICAgICAgICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lciA9ICgwLCBfZ29vZExpc3RlbmVyMi5kZWZhdWx0KSh0cmlnZ2VyLCAnY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLm9uQ2xpY2soZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleTogJ29uQ2xpY2snLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyID0gZS5kZWxlZ2F0ZVRhcmdldCB8fCBlLmN1cnJlbnRUYXJnZXQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jbGlwYm9hcmRBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRBY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkQWN0aW9uID0gbmV3IF9jbGlwYm9hcmRBY3Rpb24yLmRlZmF1bHQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uKHRyaWdnZXIpLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHRoaXMudGFyZ2V0KHRyaWdnZXIpLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnRleHQodHJpZ2dlciksXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICAgIGVtaXR0ZXI6IHRoaXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5OiAnZGVmYXVsdEFjdGlvbicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZGVmYXVsdEFjdGlvbih0cmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCdhY3Rpb24nLCB0cmlnZ2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5OiAnZGVmYXVsdFRhcmdldCcsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZGVmYXVsdFRhcmdldCh0cmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gZ2V0QXR0cmlidXRlVmFsdWUoJ3RhcmdldCcsIHRyaWdnZXIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleTogJ2RlZmF1bHRUZXh0JyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VGV4dCh0cmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCd0ZXh0JywgdHJpZ2dlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleTogJ2Rlc3Ryb3knLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5kZXN0cm95KCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jbGlwYm9hcmRBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRBY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZEFjdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XSwgW3tcbiAgICAgICAgICAgIGtleTogJ2lzU3VwcG9ydGVkJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc1N1cHBvcnRlZCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbJ2NvcHknLCAnY3V0J107XG5cbiAgICAgICAgICAgICAgICB2YXIgYWN0aW9ucyA9IHR5cGVvZiBhY3Rpb24gPT09ICdzdHJpbmcnID8gW2FjdGlvbl0gOiBhY3Rpb247XG4gICAgICAgICAgICAgICAgdmFyIHN1cHBvcnQgPSAhIWRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZDtcblxuICAgICAgICAgICAgICAgIGFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgPSBzdXBwb3J0ICYmICEhZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkKGFjdGlvbik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwcG9ydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfV0pO1xuXG4gICAgICAgIHJldHVybiBDbGlwYm9hcmQ7XG4gICAgfShfdGlueUVtaXR0ZXIyLmRlZmF1bHQpO1xuXG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHJldHJpZXZlIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4XG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoc3VmZml4LCBlbGVtZW50KSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGUgPSAnZGF0YS1jbGlwYm9hcmQtJyArIHN1ZmZpeDtcblxuICAgICAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgIH1cblxuICAgIG1vZHVsZS5leHBvcnRzID0gQ2xpcGJvYXJkO1xufSk7IiwidmFyIERPQ1VNRU5UX05PREVfVFlQRSA9IDk7XG5cbi8qKlxuICogQSBwb2x5ZmlsbCBmb3IgRWxlbWVudC5tYXRjaGVzKClcbiAqL1xuaWYgKHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcykge1xuICAgIHZhciBwcm90byA9IEVsZW1lbnQucHJvdG90eXBlO1xuXG4gICAgcHJvdG8ubWF0Y2hlcyA9IHByb3RvLm1hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8ubXNNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8ub01hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGNsb3Nlc3QgcGFyZW50IHRoYXQgbWF0Y2hlcyBhIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gY2xvc2VzdCAoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9PSBET0NVTUVOVF9OT0RFX1RZUEUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgICAgIGVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9zZXN0O1xuIiwidmFyIGNsb3Nlc3QgPSByZXF1aXJlKCcuL2Nsb3Nlc3QnKTtcblxuLyoqXG4gKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmVcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVsZWdhdGUoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrLCB1c2VDYXB0dXJlKSB7XG4gICAgdmFyIGxpc3RlbmVyRm4gPSBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogRmluZHMgY2xvc2VzdCBtYXRjaCBhbmQgaW52b2tlcyBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuZXIoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5kZWxlZ2F0ZVRhcmdldCA9IGNsb3Nlc3QoZS50YXJnZXQsIHNlbGVjdG9yKTtcblxuICAgICAgICBpZiAoZS5kZWxlZ2F0ZVRhcmdldCkge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChlbGVtZW50LCBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWxlZ2F0ZTtcbiIsIi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBIVE1MIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnRzLm5vZGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgJiYgdmFsdWUubm9kZVR5cGUgPT09IDE7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgbGlzdCBvZiBIVE1MIGVsZW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5ub2RlTGlzdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgKHR5cGUgPT09ICdbb2JqZWN0IE5vZGVMaXN0XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJylcbiAgICAgICAgJiYgKCdsZW5ndGgnIGluIHZhbHVlKVxuICAgICAgICAmJiAodmFsdWUubGVuZ3RoID09PSAwIHx8IGV4cG9ydHMubm9kZSh2YWx1ZVswXSkpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuc3RyaW5nID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcblxuICAgIHJldHVybiB0eXBlID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufTtcbiIsInZhciBpcyA9IHJlcXVpcmUoJy4vaXMnKTtcbnZhciBkZWxlZ2F0ZSA9IHJlcXVpcmUoJ2RlbGVnYXRlJyk7XG5cbi8qKlxuICogVmFsaWRhdGVzIGFsbCBwYXJhbXMgYW5kIGNhbGxzIHRoZSByaWdodFxuICogbGlzdGVuZXIgZnVuY3Rpb24gYmFzZWQgb24gaXRzIHRhcmdldCB0eXBlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSB0YXJnZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW4odGFyZ2V0LCB0eXBlLCBjYWxsYmFjaykge1xuICAgIGlmICghdGFyZ2V0ICYmICF0eXBlICYmICFjYWxsYmFjaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnRzJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzLmZuKGNhbGxiYWNrKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlyZCBhcmd1bWVudCBtdXN0IGJlIGEgRnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoaXMubm9kZSh0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5Ob2RlKHRhcmdldCwgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBlbHNlIGlmIChpcy5ub2RlTGlzdCh0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5Ob2RlTGlzdCh0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXMuc3RyaW5nKHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RlblNlbGVjdG9yKHRhcmdldCwgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIFN0cmluZywgSFRNTEVsZW1lbnQsIEhUTUxDb2xsZWN0aW9uLCBvciBOb2RlTGlzdCcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgSFRNTCBlbGVtZW50XG4gKiBhbmQgcmV0dXJucyBhIHJlbW92ZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuTm9kZShub2RlLCB0eXBlLCBjYWxsYmFjaykge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjayk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgbGlzdCBvZiBIVE1MIGVsZW1lbnRzXG4gKiBhbmQgcmV0dXJucyBhIHJlbW92ZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge05vZGVMaXN0fEhUTUxDb2xsZWN0aW9ufSBub2RlTGlzdFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3Rlbk5vZGVMaXN0KG5vZGVMaXN0LCB0eXBlLCBjYWxsYmFjaykge1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobm9kZUxpc3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChub2RlTGlzdCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBzZWxlY3RvclxuICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuU2VsZWN0b3Ioc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGRlbGVnYXRlKGRvY3VtZW50LmJvZHksIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjayk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdGVuO1xuIiwiLypcbiAgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG5cbiAgQ29weXJpZ2h0IChjKSAyMDA3LTIwMTcgRWluYXIgTGllbG1hbmlzLCBMaWFtIE5ld21hbiwgYW5kIGNvbnRyaWJ1dG9ycy5cblxuICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlc1xuICAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sXG4gIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4gIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsXG4gIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sXG4gIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG4gIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4gIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTXG4gIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTlxuICBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTlxuICBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gIFNPRlRXQVJFLlxuXG4qL1xuXG4vKipcblRoZSBmb2xsb3dpbmcgYmF0Y2hlcyBhcmUgZXF1aXZhbGVudDpcblxudmFyIGJlYXV0aWZ5X2pzID0gcmVxdWlyZSgnanMtYmVhdXRpZnknKTtcbnZhciBiZWF1dGlmeV9qcyA9IHJlcXVpcmUoJ2pzLWJlYXV0aWZ5JykuanM7XG52YXIgYmVhdXRpZnlfanMgPSByZXF1aXJlKCdqcy1iZWF1dGlmeScpLmpzX2JlYXV0aWZ5O1xuXG52YXIgYmVhdXRpZnlfY3NzID0gcmVxdWlyZSgnanMtYmVhdXRpZnknKS5jc3M7XG52YXIgYmVhdXRpZnlfY3NzID0gcmVxdWlyZSgnanMtYmVhdXRpZnknKS5jc3NfYmVhdXRpZnk7XG5cbnZhciBiZWF1dGlmeV9odG1sID0gcmVxdWlyZSgnanMtYmVhdXRpZnknKS5odG1sO1xudmFyIGJlYXV0aWZ5X2h0bWwgPSByZXF1aXJlKCdqcy1iZWF1dGlmeScpLmh0bWxfYmVhdXRpZnk7XG5cbkFsbCBtZXRob2RzIHJldHVybmVkIGFjY2VwdCB0d28gYXJndW1lbnRzLCB0aGUgc291cmNlIHN0cmluZyBhbmQgYW4gb3B0aW9ucyBvYmplY3QuXG4qKi9cblxuZnVuY3Rpb24gZ2V0X2JlYXV0aWZ5KGpzX2JlYXV0aWZ5LCBjc3NfYmVhdXRpZnksIGh0bWxfYmVhdXRpZnkpIHtcbiAgICAvLyB0aGUgZGVmYXVsdCBpcyBqc1xuICAgIHZhciBiZWF1dGlmeSA9IGZ1bmN0aW9uKHNyYywgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBqc19iZWF1dGlmeS5qc19iZWF1dGlmeShzcmMsIGNvbmZpZyk7XG4gICAgfTtcblxuICAgIC8vIHNob3J0IGFsaWFzZXNcbiAgICBiZWF1dGlmeS5qcyA9IGpzX2JlYXV0aWZ5LmpzX2JlYXV0aWZ5O1xuICAgIGJlYXV0aWZ5LmNzcyA9IGNzc19iZWF1dGlmeS5jc3NfYmVhdXRpZnk7XG4gICAgYmVhdXRpZnkuaHRtbCA9IGh0bWxfYmVhdXRpZnkuaHRtbF9iZWF1dGlmeTtcblxuICAgIC8vIGxlZ2FjeSBhbGlhc2VzXG4gICAgYmVhdXRpZnkuanNfYmVhdXRpZnkgPSBqc19iZWF1dGlmeS5qc19iZWF1dGlmeTtcbiAgICBiZWF1dGlmeS5jc3NfYmVhdXRpZnkgPSBjc3NfYmVhdXRpZnkuY3NzX2JlYXV0aWZ5O1xuICAgIGJlYXV0aWZ5Lmh0bWxfYmVhdXRpZnkgPSBodG1sX2JlYXV0aWZ5Lmh0bWxfYmVhdXRpZnk7XG5cbiAgICByZXR1cm4gYmVhdXRpZnk7XG59XG5cbmlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEFkZCBzdXBwb3J0IGZvciBBTUQgKCBodHRwczovL2dpdGh1Yi5jb20vYW1kanMvYW1kanMtYXBpL3dpa2kvQU1EI2RlZmluZWFtZC1wcm9wZXJ0eS0gKVxuICAgIGRlZmluZShbXG4gICAgICAgIFwiLi9saWIvYmVhdXRpZnlcIixcbiAgICAgICAgXCIuL2xpYi9iZWF1dGlmeS1jc3NcIixcbiAgICAgICAgXCIuL2xpYi9iZWF1dGlmeS1odG1sXCJcbiAgICBdLCBmdW5jdGlvbihqc19iZWF1dGlmeSwgY3NzX2JlYXV0aWZ5LCBodG1sX2JlYXV0aWZ5KSB7XG4gICAgICAgIHJldHVybiBnZXRfYmVhdXRpZnkoanNfYmVhdXRpZnksIGNzc19iZWF1dGlmeSwgaHRtbF9iZWF1dGlmeSk7XG4gICAgfSk7XG59IGVsc2Uge1xuICAgIChmdW5jdGlvbihtb2QpIHtcbiAgICAgICAgdmFyIGpzX2JlYXV0aWZ5ID0gcmVxdWlyZSgnLi9saWIvYmVhdXRpZnknKTtcbiAgICAgICAgdmFyIGNzc19iZWF1dGlmeSA9IHJlcXVpcmUoJy4vbGliL2JlYXV0aWZ5LWNzcycpO1xuICAgICAgICB2YXIgaHRtbF9iZWF1dGlmeSA9IHJlcXVpcmUoJy4vbGliL2JlYXV0aWZ5LWh0bWwnKTtcblxuICAgICAgICBtb2QuZXhwb3J0cyA9IGdldF9iZWF1dGlmeShqc19iZWF1dGlmeSwgY3NzX2JlYXV0aWZ5LCBodG1sX2JlYXV0aWZ5KTtcblxuICAgIH0pKG1vZHVsZSk7XG59IiwiLypqc2hpbnQgY3VybHk6dHJ1ZSwgZXFlcWVxOnRydWUsIGxheGJyZWFrOnRydWUsIG5vZW1wdHk6ZmFsc2UgKi9cbi8qXG5cbiAgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG5cbiAgQ29weXJpZ2h0IChjKSAyMDA3LTIwMTcgRWluYXIgTGllbG1hbmlzLCBMaWFtIE5ld21hbiwgYW5kIGNvbnRyaWJ1dG9ycy5cblxuICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlc1xuICAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sXG4gIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4gIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsXG4gIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sXG4gIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG4gIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4gIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTXG4gIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTlxuICBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTlxuICBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gIFNPRlRXQVJFLlxuXG5cbiBDU1MgQmVhdXRpZmllclxuLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBXcml0dGVuIGJ5IEhhcnV0eXVuIEFtaXJqYW55YW4sIChhbWlyamFueWFuQGdtYWlsLmNvbSlcblxuICAgIEJhc2VkIG9uIGNvZGUgaW5pdGlhbGx5IGRldmVsb3BlZCBieTogRWluYXIgTGllbG1hbmlzLCA8ZWluYXJAanNiZWF1dGlmaWVyLm9yZz5cbiAgICAgICAgaHR0cDovL2pzYmVhdXRpZmllci5vcmcvXG5cbiAgICBVc2FnZTpcbiAgICAgICAgY3NzX2JlYXV0aWZ5KHNvdXJjZV90ZXh0KTtcbiAgICAgICAgY3NzX2JlYXV0aWZ5KHNvdXJjZV90ZXh0LCBvcHRpb25zKTtcblxuICAgIFRoZSBvcHRpb25zIGFyZSAoZGVmYXVsdCBpbiBicmFja2V0cyk6XG4gICAgICAgIGluZGVudF9zaXplICg0KSAgICAgICAgICAgICAgICAgICAgICAgICDigJQgaW5kZW50YXRpb24gc2l6ZSxcbiAgICAgICAgaW5kZW50X2NoYXIgKHNwYWNlKSAgICAgICAgICAgICAgICAgICAgIOKAlCBjaGFyYWN0ZXIgdG8gaW5kZW50IHdpdGgsXG4gICAgICAgIHByZXNlcnZlX25ld2xpbmVzIChkZWZhdWx0IGZhbHNlKSAgICAgICAtIHdoZXRoZXIgZXhpc3RpbmcgbGluZSBicmVha3Mgc2hvdWxkIGJlIHByZXNlcnZlZCxcbiAgICAgICAgc2VsZWN0b3Jfc2VwYXJhdG9yX25ld2xpbmUgKHRydWUpICAgICAgIC0gc2VwYXJhdGUgc2VsZWN0b3JzIHdpdGggbmV3bGluZSBvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgKGUuZy4gXCJhLFxcbmJyXCIgb3IgXCJhLCBiclwiKVxuICAgICAgICBlbmRfd2l0aF9uZXdsaW5lIChmYWxzZSkgICAgICAgICAgICAgICAgLSBlbmQgd2l0aCBhIG5ld2xpbmVcbiAgICAgICAgbmV3bGluZV9iZXR3ZWVuX3J1bGVzICh0cnVlKSAgICAgICAgICAgIC0gYWRkIGEgbmV3IGxpbmUgYWZ0ZXIgZXZlcnkgY3NzIHJ1bGVcbiAgICAgICAgc3BhY2VfYXJvdW5kX3NlbGVjdG9yX3NlcGFyYXRvciAoZmFsc2UpIC0gZW5zdXJlIHNwYWNlIGFyb3VuZCBzZWxlY3RvciBzZXBhcmF0b3JzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPicsICcrJywgJ34nIChlLmcuIFwiYT5iXCIgLT4gXCJhID4gYlwiKVxuICAgIGUuZ1xuXG4gICAgY3NzX2JlYXV0aWZ5KGNzc19zb3VyY2VfdGV4dCwge1xuICAgICAgJ2luZGVudF9zaXplJzogMSxcbiAgICAgICdpbmRlbnRfY2hhcic6ICdcXHQnLFxuICAgICAgJ3NlbGVjdG9yX3NlcGFyYXRvcic6ICcgJyxcbiAgICAgICdlbmRfd2l0aF9uZXdsaW5lJzogZmFsc2UsXG4gICAgICAnbmV3bGluZV9iZXR3ZWVuX3J1bGVzJzogdHJ1ZSxcbiAgICAgICdzcGFjZV9hcm91bmRfc2VsZWN0b3Jfc2VwYXJhdG9yJzogdHJ1ZVxuICAgIH0pO1xuKi9cblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI3Rva2VuaXphdGlvblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zeW50YXgvXG5cbihmdW5jdGlvbigpIHtcblxuICAgIGZ1bmN0aW9uIG1lcmdlT3B0cyhhbGxPcHRpb25zLCB0YXJnZXRUeXBlKSB7XG4gICAgICAgIHZhciBmaW5hbE9wdHMgPSB7fTtcbiAgICAgICAgdmFyIG5hbWU7XG5cbiAgICAgICAgZm9yIChuYW1lIGluIGFsbE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChuYW1lICE9PSB0YXJnZXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgZmluYWxPcHRzW25hbWVdID0gYWxsT3B0aW9uc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy9tZXJnZSBpbiB0aGUgcGVyIHR5cGUgc2V0dGluZ3MgZm9yIHRoZSB0YXJnZXRUeXBlXG4gICAgICAgIGlmICh0YXJnZXRUeXBlIGluIGFsbE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAobmFtZSBpbiBhbGxPcHRpb25zW3RhcmdldFR5cGVdKSB7XG4gICAgICAgICAgICAgICAgZmluYWxPcHRzW25hbWVdID0gYWxsT3B0aW9uc1t0YXJnZXRUeXBlXVtuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWxPcHRzO1xuICAgIH1cblxuICAgIHZhciBsaW5lQnJlYWsgPSAvXFxyXFxufFtcXG5cXHJcXHUyMDI4XFx1MjAyOV0vO1xuICAgIHZhciBhbGxMaW5lQnJlYWtzID0gbmV3IFJlZ0V4cChsaW5lQnJlYWsuc291cmNlLCAnZycpO1xuXG4gICAgZnVuY3Rpb24gY3NzX2JlYXV0aWZ5KHNvdXJjZV90ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIC8vIEFsbG93IHRoZSBzZXR0aW5nIG9mIGxhbmd1YWdlL2ZpbGUtdHlwZSBzcGVjaWZpYyBvcHRpb25zXG4gICAgICAgIC8vIHdpdGggaW5oZXJpdGFuY2Ugb2Ygb3ZlcmFsbCBzZXR0aW5nc1xuICAgICAgICBvcHRpb25zID0gbWVyZ2VPcHRzKG9wdGlvbnMsICdjc3MnKTtcblxuICAgICAgICBzb3VyY2VfdGV4dCA9IHNvdXJjZV90ZXh0IHx8ICcnO1xuXG4gICAgICAgIHZhciBuZXdsaW5lc0Zyb21MYXN0V1NFYXQgPSAwO1xuICAgICAgICB2YXIgaW5kZW50U2l6ZSA9IG9wdGlvbnMuaW5kZW50X3NpemUgPyBwYXJzZUludChvcHRpb25zLmluZGVudF9zaXplLCAxMCkgOiA0O1xuICAgICAgICB2YXIgaW5kZW50Q2hhcmFjdGVyID0gb3B0aW9ucy5pbmRlbnRfY2hhciB8fCAnICc7XG4gICAgICAgIHZhciBwcmVzZXJ2ZV9uZXdsaW5lcyA9IChvcHRpb25zLnByZXNlcnZlX25ld2xpbmVzID09PSB1bmRlZmluZWQpID8gZmFsc2UgOiBvcHRpb25zLnByZXNlcnZlX25ld2xpbmVzO1xuICAgICAgICB2YXIgc2VsZWN0b3JTZXBhcmF0b3JOZXdsaW5lID0gKG9wdGlvbnMuc2VsZWN0b3Jfc2VwYXJhdG9yX25ld2xpbmUgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogb3B0aW9ucy5zZWxlY3Rvcl9zZXBhcmF0b3JfbmV3bGluZTtcbiAgICAgICAgdmFyIGVuZF93aXRoX25ld2xpbmUgPSAob3B0aW9ucy5lbmRfd2l0aF9uZXdsaW5lID09PSB1bmRlZmluZWQpID8gZmFsc2UgOiBvcHRpb25zLmVuZF93aXRoX25ld2xpbmU7XG4gICAgICAgIHZhciBuZXdsaW5lX2JldHdlZW5fcnVsZXMgPSAob3B0aW9ucy5uZXdsaW5lX2JldHdlZW5fcnVsZXMgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogb3B0aW9ucy5uZXdsaW5lX2JldHdlZW5fcnVsZXM7XG4gICAgICAgIHZhciBzcGFjZV9hcm91bmRfY29tYmluYXRvciA9IChvcHRpb25zLnNwYWNlX2Fyb3VuZF9jb21iaW5hdG9yID09PSB1bmRlZmluZWQpID8gZmFsc2UgOiBvcHRpb25zLnNwYWNlX2Fyb3VuZF9jb21iaW5hdG9yO1xuICAgICAgICBzcGFjZV9hcm91bmRfY29tYmluYXRvciA9IHNwYWNlX2Fyb3VuZF9jb21iaW5hdG9yIHx8ICgob3B0aW9ucy5zcGFjZV9hcm91bmRfc2VsZWN0b3Jfc2VwYXJhdG9yID09PSB1bmRlZmluZWQpID8gZmFsc2UgOiBvcHRpb25zLnNwYWNlX2Fyb3VuZF9zZWxlY3Rvcl9zZXBhcmF0b3IpO1xuICAgICAgICB2YXIgZW9sID0gb3B0aW9ucy5lb2wgPyBvcHRpb25zLmVvbCA6ICdhdXRvJztcblxuICAgICAgICBpZiAob3B0aW9ucy5pbmRlbnRfd2l0aF90YWJzKSB7XG4gICAgICAgICAgICBpbmRlbnRDaGFyYWN0ZXIgPSAnXFx0JztcbiAgICAgICAgICAgIGluZGVudFNpemUgPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVvbCA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICBlb2wgPSAnXFxuJztcbiAgICAgICAgICAgIGlmIChzb3VyY2VfdGV4dCAmJiBsaW5lQnJlYWsudGVzdChzb3VyY2VfdGV4dCB8fCAnJykpIHtcbiAgICAgICAgICAgICAgICBlb2wgPSBzb3VyY2VfdGV4dC5tYXRjaChsaW5lQnJlYWspWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZW9sID0gZW9sLnJlcGxhY2UoL1xcXFxyLywgJ1xccicpLnJlcGxhY2UoL1xcXFxuLywgJ1xcbicpO1xuXG4gICAgICAgIC8vIEhBQ0s6IG5ld2xpbmUgcGFyc2luZyBpbmNvbnNpc3RlbnQuIFRoaXMgYnJ1dGUgZm9yY2Ugbm9ybWFsaXplcyB0aGUgaW5wdXQuXG4gICAgICAgIHNvdXJjZV90ZXh0ID0gc291cmNlX3RleHQucmVwbGFjZShhbGxMaW5lQnJlYWtzLCAnXFxuJyk7XG5cbiAgICAgICAgLy8gdG9rZW5pemVyXG4gICAgICAgIHZhciB3aGl0ZVJlID0gL15cXHMrJC87XG5cbiAgICAgICAgdmFyIHBvcyA9IC0xLFxuICAgICAgICAgICAgY2g7XG4gICAgICAgIHZhciBwYXJlbkxldmVsID0gMDtcblxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgY2ggPSBzb3VyY2VfdGV4dC5jaGFyQXQoKytwb3MpO1xuICAgICAgICAgICAgcmV0dXJuIGNoIHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcGVlayhza2lwV2hpdGVzcGFjZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgICAgICAgdmFyIHByZXZfcG9zID0gcG9zO1xuICAgICAgICAgICAgaWYgKHNraXBXaGl0ZXNwYWNlKSB7XG4gICAgICAgICAgICAgICAgZWF0V2hpdGVzcGFjZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlX3RleHQuY2hhckF0KHBvcyArIDEpIHx8ICcnO1xuICAgICAgICAgICAgcG9zID0gcHJldl9wb3MgLSAxO1xuICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGVhdFN0cmluZyhlbmRDaGFycykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcG9zO1xuICAgICAgICAgICAgd2hpbGUgKG5leHQoKSkge1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kQ2hhcnMuaW5kZXhPZihjaCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IFwiXFxuXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZV90ZXh0LnN1YnN0cmluZyhzdGFydCwgcG9zICsgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwZWVrU3RyaW5nKGVuZENoYXIpIHtcbiAgICAgICAgICAgIHZhciBwcmV2X3BvcyA9IHBvcztcbiAgICAgICAgICAgIHZhciBzdHIgPSBlYXRTdHJpbmcoZW5kQ2hhcik7XG4gICAgICAgICAgICBwb3MgPSBwcmV2X3BvcyAtIDE7XG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZWF0V2hpdGVzcGFjZShwcmVzZXJ2ZV9uZXdsaW5lc19sb2NhbCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAod2hpdGVSZS50ZXN0KHBlZWsoKSkpIHtcbiAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxuJyAmJiBwcmVzZXJ2ZV9uZXdsaW5lc19sb2NhbCAmJiBwcmVzZXJ2ZV9uZXdsaW5lcykge1xuICAgICAgICAgICAgICAgICAgICBwcmludC5uZXdMaW5lKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdsaW5lc0Zyb21MYXN0V1NFYXQgPSByZXN1bHQ7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2tpcFdoaXRlc3BhY2UoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgICAgICAgICBpZiAoY2ggJiYgd2hpdGVSZS50ZXN0KGNoKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHdoaXRlUmUudGVzdChuZXh0KCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGVhdENvbW1lbnQoc2luZ2xlTGluZSkge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcG9zO1xuICAgICAgICAgICAgc2luZ2xlTGluZSA9IHBlZWsoKSA9PT0gXCIvXCI7XG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICB3aGlsZSAobmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzaW5nbGVMaW5lICYmIGNoID09PSBcIipcIiAmJiBwZWVrKCkgPT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaW5nbGVMaW5lICYmIGNoID09PSBcIlxcblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VfdGV4dC5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc291cmNlX3RleHQuc3Vic3RyaW5nKHN0YXJ0LCBwb3MpICsgY2g7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGZ1bmN0aW9uIGxvb2tCYWNrKHN0cikge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZV90ZXh0LnN1YnN0cmluZyhwb3MgLSBzdHIubGVuZ3RoLCBwb3MpLnRvTG93ZXJDYXNlKCkgPT09XG4gICAgICAgICAgICAgICAgc3RyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmVzdGVkIHBzZXVkby1jbGFzcyBpZiB3ZSBhcmUgaW5zaWRlUnVsZVxuICAgICAgICAvLyBhbmQgdGhlIG5leHQgc3BlY2lhbCBjaGFyYWN0ZXIgZm91bmQgb3BlbnNcbiAgICAgICAgLy8gYSBuZXcgYmxvY2tcbiAgICAgICAgZnVuY3Rpb24gZm91bmROZXN0ZWRQc2V1ZG9DbGFzcygpIHtcbiAgICAgICAgICAgIHZhciBvcGVuUGFyZW4gPSAwO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHBvcyArIDE7IGkgPCBzb3VyY2VfdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjaCA9IHNvdXJjZV90ZXh0LmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09IFwie1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBwc2V1ZG9jbGFzc2VzIGNhbiBjb250YWluICgpXG4gICAgICAgICAgICAgICAgICAgIG9wZW5QYXJlbiArPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICcpJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3BlblBhcmVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3BlblBhcmVuIC09IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gXCI7XCIgfHwgY2ggPT09IFwifVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwcmludGVyXG4gICAgICAgIHZhciBiYXNlYmFzZUluZGVudFN0cmluZyA9IHNvdXJjZV90ZXh0Lm1hdGNoKC9eW1xcdCBdKi8pWzBdO1xuICAgICAgICB2YXIgc2luZ2xlSW5kZW50ID0gbmV3IEFycmF5KGluZGVudFNpemUgKyAxKS5qb2luKGluZGVudENoYXJhY3Rlcik7XG4gICAgICAgIHZhciBpbmRlbnRMZXZlbCA9IDA7XG4gICAgICAgIHZhciBuZXN0ZWRMZXZlbCA9IDA7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5kZW50KCkge1xuICAgICAgICAgICAgaW5kZW50TGV2ZWwrKztcbiAgICAgICAgICAgIGJhc2ViYXNlSW5kZW50U3RyaW5nICs9IHNpbmdsZUluZGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG91dGRlbnQoKSB7XG4gICAgICAgICAgICBpbmRlbnRMZXZlbC0tO1xuICAgICAgICAgICAgYmFzZWJhc2VJbmRlbnRTdHJpbmcgPSBiYXNlYmFzZUluZGVudFN0cmluZy5zbGljZSgwLCAtaW5kZW50U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcHJpbnQgPSB7fTtcbiAgICAgICAgcHJpbnRbXCJ7XCJdID0gZnVuY3Rpb24oY2gpIHtcbiAgICAgICAgICAgIHByaW50LnNpbmdsZVNwYWNlKCk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaChjaCk7XG4gICAgICAgICAgICBpZiAoIWVhdFdoaXRlc3BhY2UodHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICBwcmludC5uZXdMaW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHByaW50W1wifVwiXSA9IGZ1bmN0aW9uKG5ld2xpbmUpIHtcbiAgICAgICAgICAgIGlmIChuZXdsaW5lKSB7XG4gICAgICAgICAgICAgICAgcHJpbnQubmV3TGluZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0LnB1c2goJ30nKTtcbiAgICAgICAgICAgIGlmICghZWF0V2hpdGVzcGFjZSh0cnVlKSkge1xuICAgICAgICAgICAgICAgIHByaW50Lm5ld0xpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBwcmludC5fbGFzdENoYXJXaGl0ZXNwYWNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gd2hpdGVSZS50ZXN0KG91dHB1dFtvdXRwdXQubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHByaW50Lm5ld0xpbmUgPSBmdW5jdGlvbihrZWVwV2hpdGVzcGFjZSkge1xuICAgICAgICAgICAgaWYgKG91dHB1dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWtlZXBXaGl0ZXNwYWNlICYmIG91dHB1dFtvdXRwdXQubGVuZ3RoIC0gMV0gIT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW50LnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dFtvdXRwdXQubGVuZ3RoIC0gMV0gPT09IGJhc2ViYXNlSW5kZW50U3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goJ1xcbicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJhc2ViYXNlSW5kZW50U3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGJhc2ViYXNlSW5kZW50U3RyaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHByaW50LnNpbmdsZVNwYWNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAob3V0cHV0Lmxlbmd0aCAmJiAhcHJpbnQuX2xhc3RDaGFyV2hpdGVzcGFjZSgpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goJyAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBwcmludC5wcmVzZXJ2ZVNpbmdsZVNwYWNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoaXNBZnRlclNwYWNlKSB7XG4gICAgICAgICAgICAgICAgcHJpbnQuc2luZ2xlU3BhY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBwcmludC50cmltID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB3aGlsZSAocHJpbnQuX2xhc3RDaGFyV2hpdGVzcGFjZSgpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG5cbiAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xuICAgICAgICAvKl9fX19fX19fX19fX19fX19fX19fXy0tLS0tLS0tLS0tLS0tLS0tLS0tX19fX19fX19fX19fX19fX19fX19fKi9cblxuICAgICAgICB2YXIgaW5zaWRlUnVsZSA9IGZhbHNlO1xuICAgICAgICB2YXIgaW5zaWRlUHJvcGVydHlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICB2YXIgZW50ZXJpbmdDb25kaXRpb25hbEdyb3VwID0gZmFsc2U7XG4gICAgICAgIHZhciB0b3BfY2ggPSAnJztcbiAgICAgICAgdmFyIGxhc3RfdG9wX2NoID0gJyc7XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHZhciB3aGl0ZXNwYWNlID0gc2tpcFdoaXRlc3BhY2UoKTtcbiAgICAgICAgICAgIHZhciBpc0FmdGVyU3BhY2UgPSB3aGl0ZXNwYWNlICE9PSAnJztcbiAgICAgICAgICAgIHZhciBpc0FmdGVyTmV3bGluZSA9IHdoaXRlc3BhY2UuaW5kZXhPZignXFxuJykgIT09IC0xO1xuICAgICAgICAgICAgbGFzdF90b3BfY2ggPSB0b3BfY2g7XG4gICAgICAgICAgICB0b3BfY2ggPSBjaDtcblxuICAgICAgICAgICAgaWYgKCFjaCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJy8nICYmIHBlZWsoKSA9PT0gJyonKSB7IC8qIGNzcyBjb21tZW50ICovXG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IGluZGVudExldmVsID09PSAwO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzQWZ0ZXJOZXdsaW5lIHx8IGhlYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBwcmludC5uZXdMaW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goZWF0Q29tbWVudCgpKTtcbiAgICAgICAgICAgICAgICBwcmludC5uZXdMaW5lKCk7XG4gICAgICAgICAgICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBwcmludC5uZXdMaW5lKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICcvJyAmJiBwZWVrKCkgPT09ICcvJykgeyAvLyBzaW5nbGUgbGluZSBjb21tZW50XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FmdGVyTmV3bGluZSAmJiBsYXN0X3RvcF9jaCAhPT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW50LnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJpbnQuc2luZ2xlU3BhY2UoKTtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChlYXRDb21tZW50KCkpO1xuICAgICAgICAgICAgICAgIHByaW50Lm5ld0xpbmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdAJykge1xuICAgICAgICAgICAgICAgIHByaW50LnByZXNlcnZlU2luZ2xlU3BhY2UoKTtcblxuICAgICAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBsZXNzIHByb3BlcnkgbWl4aW5zIEB7Li4ufVxuICAgICAgICAgICAgICAgIGlmIChwZWVrKCkgPT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChlYXRTdHJpbmcoJ30nKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goY2gpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cmlwIHRyYWlsaW5nIHNwYWNlLCBpZiBwcmVzZW50LCBmb3IgaGFzaCBwcm9wZXJ0eSBjaGVja3NcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhcmlhYmxlT3JSdWxlID0gcGVla1N0cmluZyhcIjogLDt7fSgpW10vPSdcXFwiXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZU9yUnVsZS5tYXRjaCgvWyA6XSQvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHZhcmlhYmxlIG9yIHBzZXVkby1jbGFzcywgYWRkIGl0IGFuZCBpbnNlcnQgb25lIHNwYWNlIGJlZm9yZSBjb250aW51aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU9yUnVsZSA9IGVhdFN0cmluZyhcIjogXCIpLnJlcGxhY2UoL1xccyQvLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh2YXJpYWJsZU9yUnVsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmludC5zaW5nbGVTcGFjZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVPclJ1bGUgPSB2YXJpYWJsZU9yUnVsZS5yZXBsYWNlKC9cXHMkLywgJycpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIG1pZ2h0IGJlIGEgbmVzdGluZyBhdC1ydWxlXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZU9yUnVsZSBpbiBjc3NfYmVhdXRpZnkuTkVTVEVEX0FUX1JVTEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZExldmVsICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVPclJ1bGUgaW4gY3NzX2JlYXV0aWZ5LkNPTkRJVElPTkFMX0dST1VQX1JVTEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRlcmluZ0NvbmRpdGlvbmFsR3JvdXAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJyMnICYmIHBlZWsoKSA9PT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgcHJpbnQucHJlc2VydmVTaW5nbGVTcGFjZSgpO1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGVhdFN0cmluZygnfScpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICd7Jykge1xuICAgICAgICAgICAgICAgIGlmIChwZWVrKHRydWUpID09PSAnfScpIHtcbiAgICAgICAgICAgICAgICAgICAgZWF0V2hpdGVzcGFjZSgpO1xuICAgICAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHByaW50LnNpbmdsZVNwYWNlKCk7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKFwie1wiKTtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnRbJ30nXShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdsaW5lc0Zyb21MYXN0V1NFYXQgPCAyICYmIG5ld2xpbmVfYmV0d2Vlbl9ydWxlcyAmJiBpbmRlbnRMZXZlbCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQubmV3TGluZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGVudCgpO1xuICAgICAgICAgICAgICAgICAgICBwcmludFtcIntcIl0oY2gpO1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGVudGVyaW5nIGNvbmRpdGlvbmFsIGdyb3Vwcywgb25seSBydWxlc2V0cyBhcmUgYWxsb3dlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoZW50ZXJpbmdDb25kaXRpb25hbEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRlcmluZ0NvbmRpdGlvbmFsR3JvdXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZVJ1bGUgPSAoaW5kZW50TGV2ZWwgPiBuZXN0ZWRMZXZlbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGRlY2xhcmF0aW9ucyBhcmUgYWxzbyBhbGxvd2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVSdWxlID0gKGluZGVudExldmVsID49IG5lc3RlZExldmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICd9Jykge1xuICAgICAgICAgICAgICAgIG91dGRlbnQoKTtcbiAgICAgICAgICAgICAgICBwcmludFtcIn1cIl0odHJ1ZSk7XG4gICAgICAgICAgICAgICAgaW5zaWRlUnVsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGluc2lkZVByb3BlcnR5VmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAobmVzdGVkTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkTGV2ZWwtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5ld2xpbmVzRnJvbUxhc3RXU0VhdCA8IDIgJiYgbmV3bGluZV9iZXR3ZWVuX3J1bGVzICYmIGluZGVudExldmVsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW50Lm5ld0xpbmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gXCI6XCIpIHtcbiAgICAgICAgICAgICAgICBlYXRXaGl0ZXNwYWNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKChpbnNpZGVSdWxlIHx8IGVudGVyaW5nQ29uZGl0aW9uYWxHcm91cCkgJiZcbiAgICAgICAgICAgICAgICAgICAgIShsb29rQmFjayhcIiZcIikgfHwgZm91bmROZXN0ZWRQc2V1ZG9DbGFzcygpKSAmJlxuICAgICAgICAgICAgICAgICAgICAhbG9va0JhY2soXCIoXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICdwcm9wZXJ0eTogdmFsdWUnIGRlbGltaXRlclxuICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBjb3VsZCBiZSBpbiBhIGNvbmRpdGlvbmFsIGdyb3VwIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCc6Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5zaWRlUHJvcGVydHlWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlUHJvcGVydHlWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmludC5zaW5nbGVTcGFjZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2Fzcy9sZXNzIHBhcmVudCByZWZlcmVuY2UgZG9uJ3QgdXNlIGEgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgLy8gc2FzcyBuZXN0ZWQgcHNldWRvLWNsYXNzIGRvbid0IHVzZSBhIHNwYWNlXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VydmUgc3BhY2UgYmVmb3JlIHBzZXVkb2NsYXNzZXMvcHNldWRvZWxlbWVudHMsIGFzIGl0IG1lYW5zIFwiaW4gYW55IGNoaWxkXCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvb2tCYWNrKFwiIFwiKSAmJiBvdXRwdXRbb3V0cHV0Lmxlbmd0aCAtIDFdICE9PSBcIiBcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwZWVrKCkgPT09IFwiOlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwc2V1ZG8tZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goXCI6OlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBzZXVkby1jbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goJzonKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcIicgfHwgY2ggPT09ICdcXCcnKSB7XG4gICAgICAgICAgICAgICAgcHJpbnQucHJlc2VydmVTaW5nbGVTcGFjZSgpO1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGVhdFN0cmluZyhjaCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJzsnKSB7XG4gICAgICAgICAgICAgICAgaW5zaWRlUHJvcGVydHlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGNoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWVhdFdoaXRlc3BhY2UodHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnQubmV3TGluZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICcoJykgeyAvLyBtYXkgYmUgYSB1cmxcbiAgICAgICAgICAgICAgICBpZiAobG9va0JhY2soXCJ1cmxcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goY2gpO1xuICAgICAgICAgICAgICAgICAgICBlYXRXaGl0ZXNwYWNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPT0gJyknICYmIGNoICE9PSAnXCInICYmIGNoICE9PSAnXFwnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGVhdFN0cmluZygnKScpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbkxldmVsKys7XG4gICAgICAgICAgICAgICAgICAgIHByaW50LnByZXNlcnZlU2luZ2xlU3BhY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goY2gpO1xuICAgICAgICAgICAgICAgICAgICBlYXRXaGl0ZXNwYWNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJyknKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goY2gpO1xuICAgICAgICAgICAgICAgIHBhcmVuTGV2ZWwtLTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICcsJykge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGNoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWVhdFdoaXRlc3BhY2UodHJ1ZSkgJiYgc2VsZWN0b3JTZXBhcmF0b3JOZXdsaW5lICYmICFpbnNpZGVQcm9wZXJ0eVZhbHVlICYmIHBhcmVuTGV2ZWwgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW50Lm5ld0xpbmUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcmludC5zaW5nbGVTcGFjZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNoID09PSAnPicgfHwgY2ggPT09ICcrJyB8fCBjaCA9PT0gJ34nKSAmJlxuICAgICAgICAgICAgICAgICFpbnNpZGVQcm9wZXJ0eVZhbHVlICYmIHBhcmVuTGV2ZWwgPCAxKSB7XG4gICAgICAgICAgICAgICAgLy9oYW5kbGUgY29tYmluYXRvciBzcGFjaW5nXG4gICAgICAgICAgICAgICAgaWYgKHNwYWNlX2Fyb3VuZF9jb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW50LnNpbmdsZVNwYWNlKCk7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGNoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnQuc2luZ2xlU3BhY2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChjaCk7XG4gICAgICAgICAgICAgICAgICAgIGVhdFdoaXRlc3BhY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3F1YXNoIGV4dHJhIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoICYmIHdoaXRlUmUudGVzdChjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXScpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChjaCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnWycpIHtcbiAgICAgICAgICAgICAgICBwcmludC5wcmVzZXJ2ZVNpbmdsZVNwYWNlKCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goY2gpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJz0nKSB7IC8vIG5vIHdoaXRlc3BhY2UgYmVmb3JlIG9yIGFmdGVyXG4gICAgICAgICAgICAgICAgZWF0V2hpdGVzcGFjZSgpO1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCc9Jyk7XG4gICAgICAgICAgICAgICAgaWYgKHdoaXRlUmUudGVzdChjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2ggPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByaW50LnByZXNlcnZlU2luZ2xlU3BhY2UoKTtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuXG4gICAgICAgIHZhciBzd2VldENvZGUgPSAnJztcbiAgICAgICAgaWYgKGJhc2ViYXNlSW5kZW50U3RyaW5nKSB7XG4gICAgICAgICAgICBzd2VldENvZGUgKz0gYmFzZWJhc2VJbmRlbnRTdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBzd2VldENvZGUgKz0gb3V0cHV0LmpvaW4oJycpLnJlcGxhY2UoL1tcXHJcXG5cXHQgXSskLywgJycpO1xuXG4gICAgICAgIC8vIGVzdGFibGlzaCBlbmRfd2l0aF9uZXdsaW5lXG4gICAgICAgIGlmIChlbmRfd2l0aF9uZXdsaW5lKSB7XG4gICAgICAgICAgICBzd2VldENvZGUgKz0gJ1xcbic7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW9sICE9PSAnXFxuJykge1xuICAgICAgICAgICAgc3dlZXRDb2RlID0gc3dlZXRDb2RlLnJlcGxhY2UoL1tcXG5dL2csIGVvbCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3dlZXRDb2RlO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9BdC1ydWxlXG4gICAgY3NzX2JlYXV0aWZ5Lk5FU1RFRF9BVF9SVUxFID0ge1xuICAgICAgICBcIkBwYWdlXCI6IHRydWUsXG4gICAgICAgIFwiQGZvbnQtZmFjZVwiOiB0cnVlLFxuICAgICAgICBcIkBrZXlmcmFtZXNcIjogdHJ1ZSxcbiAgICAgICAgLy8gYWxzbyBpbiBDT05ESVRJT05BTF9HUk9VUF9SVUxFIGJlbG93XG4gICAgICAgIFwiQG1lZGlhXCI6IHRydWUsXG4gICAgICAgIFwiQHN1cHBvcnRzXCI6IHRydWUsXG4gICAgICAgIFwiQGRvY3VtZW50XCI6IHRydWVcbiAgICB9O1xuICAgIGNzc19iZWF1dGlmeS5DT05ESVRJT05BTF9HUk9VUF9SVUxFID0ge1xuICAgICAgICBcIkBtZWRpYVwiOiB0cnVlLFxuICAgICAgICBcIkBzdXBwb3J0c1wiOiB0cnVlLFxuICAgICAgICBcIkBkb2N1bWVudFwiOiB0cnVlXG4gICAgfTtcblxuICAgIC8qZ2xvYmFsIGRlZmluZSAqL1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBZGQgc3VwcG9ydCBmb3IgQU1EICggaHR0cHM6Ly9naXRodWIuY29tL2FtZGpzL2FtZGpzLWFwaS93aWtpL0FNRCNkZWZpbmVhbWQtcHJvcGVydHktIClcbiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY3NzX2JlYXV0aWZ5OiBjc3NfYmVhdXRpZnlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgLy8gQWRkIHN1cHBvcnQgZm9yIENvbW1vbkpTLiBKdXN0IHB1dCB0aGlzIGZpbGUgc29tZXdoZXJlIG9uIHlvdXIgcmVxdWlyZS5wYXRoc1xuICAgICAgICAvLyBhbmQgeW91IHdpbGwgYmUgYWJsZSB0byBgdmFyIGh0bWxfYmVhdXRpZnkgPSByZXF1aXJlKFwiYmVhdXRpZnlcIikuaHRtbF9iZWF1dGlmeWAuXG4gICAgICAgIGV4cG9ydHMuY3NzX2JlYXV0aWZ5ID0gY3NzX2JlYXV0aWZ5O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAvLyBJZiB3ZSdyZSBydW5uaW5nIGEgd2ViIHBhZ2UgYW5kIGRvbid0IGhhdmUgZWl0aGVyIG9mIHRoZSBhYm92ZSwgYWRkIG91ciBvbmUgZ2xvYmFsXG4gICAgICAgIHdpbmRvdy5jc3NfYmVhdXRpZnkgPSBjc3NfYmVhdXRpZnk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIC8vIElmIHdlIGRvbid0IGV2ZW4gaGF2ZSB3aW5kb3csIHRyeSBnbG9iYWwuXG4gICAgICAgIGdsb2JhbC5jc3NfYmVhdXRpZnkgPSBjc3NfYmVhdXRpZnk7XG4gICAgfVxuXG59KCkpOyIsIi8qanNoaW50IGN1cmx5OnRydWUsIGVxZXFlcTp0cnVlLCBsYXhicmVhazp0cnVlLCBub2VtcHR5OmZhbHNlICovXG4vKlxuXG4gIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuXG4gIENvcHlyaWdodCAoYykgMjAwNy0yMDE3IEVpbmFyIExpZWxtYW5pcywgTGlhbSBOZXdtYW4sIGFuZCBjb250cmlidXRvcnMuXG5cbiAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb25cbiAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbiAgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLFxuICBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLFxuICBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuICBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuICBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0ZcbiAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbiAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSU1xuICBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU5cbiAgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU5cbiAgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICBTT0ZUV0FSRS5cblxuXG4gU3R5bGUgSFRNTFxuLS0tLS0tLS0tLS0tLS0tXG5cbiAgV3JpdHRlbiBieSBOb2NodW0gU29zc29ua28sIChuc29zc29ua29AaG90bWFpbC5jb20pXG5cbiAgQmFzZWQgb24gY29kZSBpbml0aWFsbHkgZGV2ZWxvcGVkIGJ5OiBFaW5hciBMaWVsbWFuaXMsIDxlaW5hckBqc2JlYXV0aWZpZXIub3JnPlxuICAgIGh0dHA6Ly9qc2JlYXV0aWZpZXIub3JnL1xuXG4gIFVzYWdlOlxuICAgIHN0eWxlX2h0bWwoaHRtbF9zb3VyY2UpO1xuXG4gICAgc3R5bGVfaHRtbChodG1sX3NvdXJjZSwgb3B0aW9ucyk7XG5cbiAgVGhlIG9wdGlvbnMgYXJlOlxuICAgIGluZGVudF9pbm5lcl9odG1sIChkZWZhdWx0IGZhbHNlKSAg4oCUIGluZGVudCA8aGVhZD4gYW5kIDxib2R5PiBzZWN0aW9ucyxcbiAgICBpbmRlbnRfc2l6ZSAoZGVmYXVsdCA0KSAgICAgICAgICDigJQgaW5kZW50YXRpb24gc2l6ZSxcbiAgICBpbmRlbnRfY2hhciAoZGVmYXVsdCBzcGFjZSkgICAgICDigJQgY2hhcmFjdGVyIHRvIGluZGVudCB3aXRoLFxuICAgIHdyYXBfbGluZV9sZW5ndGggKGRlZmF1bHQgMjUwKSAgICAgICAgICAgIC0gIG1heGltdW0gYW1vdW50IG9mIGNoYXJhY3RlcnMgcGVyIGxpbmUgKDAgPSBkaXNhYmxlKVxuICAgIGJyYWNlX3N0eWxlIChkZWZhdWx0IFwiY29sbGFwc2VcIikgLSBcImNvbGxhcHNlXCIgfCBcImV4cGFuZFwiIHwgXCJlbmQtZXhwYW5kXCIgfCBcIm5vbmVcIlxuICAgICAgICAgICAgcHV0IGJyYWNlcyBvbiB0aGUgc2FtZSBsaW5lIGFzIGNvbnRyb2wgc3RhdGVtZW50cyAoZGVmYXVsdCksIG9yIHB1dCBicmFjZXMgb24gb3duIGxpbmUgKEFsbG1hbiAvIEFOU0kgc3R5bGUpLCBvciBqdXN0IHB1dCBlbmQgYnJhY2VzIG9uIG93biBsaW5lLCBvciBhdHRlbXB0IHRvIGtlZXAgdGhlbSB3aGVyZSB0aGV5IGFyZS5cbiAgICB1bmZvcm1hdHRlZCAoZGVmYXVsdHMgdG8gaW5saW5lIHRhZ3MpIC0gbGlzdCBvZiB0YWdzLCB0aGF0IHNob3VsZG4ndCBiZSByZWZvcm1hdHRlZFxuICAgIGNvbnRlbnRfdW5mb3JtYXR0ZWQgKGRlZmF1bHRzIHRvIHByZSB0YWcpIC0gbGlzdCBvZiB0YWdzLCB0aGF0IGl0cyBjb250ZW50IHNob3VsZG4ndCBiZSByZWZvcm1hdHRlZFxuICAgIGluZGVudF9zY3JpcHRzIChkZWZhdWx0IG5vcm1hbCkgIC0gXCJrZWVwXCJ8XCJzZXBhcmF0ZVwifFwibm9ybWFsXCJcbiAgICBwcmVzZXJ2ZV9uZXdsaW5lcyAoZGVmYXVsdCB0cnVlKSAtIHdoZXRoZXIgZXhpc3RpbmcgbGluZSBicmVha3MgYmVmb3JlIGVsZW1lbnRzIHNob3VsZCBiZSBwcmVzZXJ2ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHdvcmtzIGJlZm9yZSBlbGVtZW50cywgbm90IGluc2lkZSB0YWdzIG9yIGZvciB0ZXh0LlxuICAgIG1heF9wcmVzZXJ2ZV9uZXdsaW5lcyAoZGVmYXVsdCB1bmxpbWl0ZWQpIC0gbWF4aW11bSBudW1iZXIgb2YgbGluZSBicmVha3MgdG8gYmUgcHJlc2VydmVkIGluIG9uZSBjaHVua1xuICAgIGluZGVudF9oYW5kbGViYXJzIChkZWZhdWx0IGZhbHNlKSAtIGZvcm1hdCBhbmQgaW5kZW50IHt7I2Zvb319IGFuZCB7ey9mb299fVxuICAgIGVuZF93aXRoX25ld2xpbmUgKGZhbHNlKSAgICAgICAgICAtIGVuZCB3aXRoIGEgbmV3bGluZVxuICAgIGV4dHJhX2xpbmVycyAoZGVmYXVsdCBbaGVhZCxib2R5LC9odG1sXSkgLUxpc3Qgb2YgdGFncyB0aGF0IHNob3VsZCBoYXZlIGFuIGV4dHJhIG5ld2xpbmUgYmVmb3JlIHRoZW0uXG5cbiAgICBlLmcuXG5cbiAgICBzdHlsZV9odG1sKGh0bWxfc291cmNlLCB7XG4gICAgICAnaW5kZW50X2lubmVyX2h0bWwnOiBmYWxzZSxcbiAgICAgICdpbmRlbnRfc2l6ZSc6IDIsXG4gICAgICAnaW5kZW50X2NoYXInOiAnICcsXG4gICAgICAnd3JhcF9saW5lX2xlbmd0aCc6IDc4LFxuICAgICAgJ2JyYWNlX3N0eWxlJzogJ2V4cGFuZCcsXG4gICAgICAncHJlc2VydmVfbmV3bGluZXMnOiB0cnVlLFxuICAgICAgJ21heF9wcmVzZXJ2ZV9uZXdsaW5lcyc6IDUsXG4gICAgICAnaW5kZW50X2hhbmRsZWJhcnMnOiBmYWxzZSxcbiAgICAgICdleHRyYV9saW5lcnMnOiBbJy9odG1sJ11cbiAgICB9KTtcbiovXG5cbihmdW5jdGlvbigpIHtcblxuICAgIC8vIGZ1bmN0aW9uIHRyaW0ocykge1xuICAgIC8vICAgICByZXR1cm4gcy5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XG4gICAgLy8gfVxuXG4gICAgZnVuY3Rpb24gbHRyaW0ocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9eXFxzKy9nLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnRyaW0ocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9cXHMrJC9nLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VPcHRzKGFsbE9wdGlvbnMsIHRhcmdldFR5cGUpIHtcbiAgICAgICAgdmFyIGZpbmFsT3B0cyA9IHt9O1xuICAgICAgICB2YXIgbmFtZTtcblxuICAgICAgICBmb3IgKG5hbWUgaW4gYWxsT3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG5hbWUgIT09IHRhcmdldFR5cGUpIHtcbiAgICAgICAgICAgICAgICBmaW5hbE9wdHNbbmFtZV0gPSBhbGxPcHRpb25zW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9tZXJnZSBpbiB0aGUgcGVyIHR5cGUgc2V0dGluZ3MgZm9yIHRoZSB0YXJnZXRUeXBlXG4gICAgICAgIGlmICh0YXJnZXRUeXBlIGluIGFsbE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAobmFtZSBpbiBhbGxPcHRpb25zW3RhcmdldFR5cGVdKSB7XG4gICAgICAgICAgICAgICAgZmluYWxPcHRzW25hbWVdID0gYWxsT3B0aW9uc1t0YXJnZXRUeXBlXVtuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWxPcHRzO1xuICAgIH1cblxuICAgIHZhciBsaW5lQnJlYWsgPSAvXFxyXFxufFtcXG5cXHJcXHUyMDI4XFx1MjAyOV0vO1xuICAgIHZhciBhbGxMaW5lQnJlYWtzID0gbmV3IFJlZ0V4cChsaW5lQnJlYWsuc291cmNlLCAnZycpO1xuXG4gICAgZnVuY3Rpb24gc3R5bGVfaHRtbChodG1sX3NvdXJjZSwgb3B0aW9ucywganNfYmVhdXRpZnksIGNzc19iZWF1dGlmeSkge1xuICAgICAgICAvL1dyYXBwZXIgZnVuY3Rpb24gdG8gaW52b2tlIGFsbCB0aGUgbmVjZXNzYXJ5IGNvbnN0cnVjdG9ycyBhbmQgZGVhbCB3aXRoIHRoZSBvdXRwdXQuXG5cbiAgICAgICAgdmFyIG11bHRpX3BhcnNlcixcbiAgICAgICAgICAgIGluZGVudF9pbm5lcl9odG1sLFxuICAgICAgICAgICAgaW5kZW50X2JvZHlfaW5uZXJfaHRtbCxcbiAgICAgICAgICAgIGluZGVudF9oZWFkX2lubmVyX2h0bWwsXG4gICAgICAgICAgICBpbmRlbnRfc2l6ZSxcbiAgICAgICAgICAgIGluZGVudF9jaGFyYWN0ZXIsXG4gICAgICAgICAgICB3cmFwX2xpbmVfbGVuZ3RoLFxuICAgICAgICAgICAgYnJhY2Vfc3R5bGUsXG4gICAgICAgICAgICB1bmZvcm1hdHRlZCxcbiAgICAgICAgICAgIGNvbnRlbnRfdW5mb3JtYXR0ZWQsXG4gICAgICAgICAgICBwcmVzZXJ2ZV9uZXdsaW5lcyxcbiAgICAgICAgICAgIG1heF9wcmVzZXJ2ZV9uZXdsaW5lcyxcbiAgICAgICAgICAgIGluZGVudF9oYW5kbGViYXJzLFxuICAgICAgICAgICAgd3JhcF9hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgd3JhcF9hdHRyaWJ1dGVzX2luZGVudF9zaXplLFxuICAgICAgICAgICAgaXNfd3JhcF9hdHRyaWJ1dGVzX2ZvcmNlLFxuICAgICAgICAgICAgaXNfd3JhcF9hdHRyaWJ1dGVzX2ZvcmNlX2V4cGFuZF9tdWx0aWxpbmUsXG4gICAgICAgICAgICBpc193cmFwX2F0dHJpYnV0ZXNfZm9yY2VfYWxpZ25lZCxcbiAgICAgICAgICAgIGVuZF93aXRoX25ld2xpbmUsXG4gICAgICAgICAgICBleHRyYV9saW5lcnMsXG4gICAgICAgICAgICBlb2w7XG5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgLy8gQWxsb3cgdGhlIHNldHRpbmcgb2YgbGFuZ3VhZ2UvZmlsZS10eXBlIHNwZWNpZmljIG9wdGlvbnNcbiAgICAgICAgLy8gd2l0aCBpbmhlcml0YW5jZSBvZiBvdmVyYWxsIHNldHRpbmdzXG4gICAgICAgIG9wdGlvbnMgPSBtZXJnZU9wdHMob3B0aW9ucywgJ2h0bWwnKTtcblxuICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB0byAxLjMuNFxuICAgICAgICBpZiAoKG9wdGlvbnMud3JhcF9saW5lX2xlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IHBhcnNlSW50KG9wdGlvbnMud3JhcF9saW5lX2xlbmd0aCwgMTApID09PSAwKSAmJlxuICAgICAgICAgICAgKG9wdGlvbnMubWF4X2NoYXIgIT09IHVuZGVmaW5lZCAmJiBwYXJzZUludChvcHRpb25zLm1heF9jaGFyLCAxMCkgIT09IDApKSB7XG4gICAgICAgICAgICBvcHRpb25zLndyYXBfbGluZV9sZW5ndGggPSBvcHRpb25zLm1heF9jaGFyO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZW50X2lubmVyX2h0bWwgPSAob3B0aW9ucy5pbmRlbnRfaW5uZXJfaHRtbCA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogb3B0aW9ucy5pbmRlbnRfaW5uZXJfaHRtbDtcbiAgICAgICAgaW5kZW50X2JvZHlfaW5uZXJfaHRtbCA9IChvcHRpb25zLmluZGVudF9ib2R5X2lubmVyX2h0bWwgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogb3B0aW9ucy5pbmRlbnRfYm9keV9pbm5lcl9odG1sO1xuICAgICAgICBpbmRlbnRfaGVhZF9pbm5lcl9odG1sID0gKG9wdGlvbnMuaW5kZW50X2hlYWRfaW5uZXJfaHRtbCA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiBvcHRpb25zLmluZGVudF9oZWFkX2lubmVyX2h0bWw7XG4gICAgICAgIGluZGVudF9zaXplID0gKG9wdGlvbnMuaW5kZW50X3NpemUgPT09IHVuZGVmaW5lZCkgPyA0IDogcGFyc2VJbnQob3B0aW9ucy5pbmRlbnRfc2l6ZSwgMTApO1xuICAgICAgICBpbmRlbnRfY2hhcmFjdGVyID0gKG9wdGlvbnMuaW5kZW50X2NoYXIgPT09IHVuZGVmaW5lZCkgPyAnICcgOiBvcHRpb25zLmluZGVudF9jaGFyO1xuICAgICAgICBicmFjZV9zdHlsZSA9IChvcHRpb25zLmJyYWNlX3N0eWxlID09PSB1bmRlZmluZWQpID8gJ2NvbGxhcHNlJyA6IG9wdGlvbnMuYnJhY2Vfc3R5bGU7XG4gICAgICAgIHdyYXBfbGluZV9sZW5ndGggPSBwYXJzZUludChvcHRpb25zLndyYXBfbGluZV9sZW5ndGgsIDEwKSA9PT0gMCA/IDMyNzg2IDogcGFyc2VJbnQob3B0aW9ucy53cmFwX2xpbmVfbGVuZ3RoIHx8IDI1MCwgMTApO1xuICAgICAgICB1bmZvcm1hdHRlZCA9IG9wdGlvbnMudW5mb3JtYXR0ZWQgfHwgW1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2RvbS5odG1sI3BocmFzaW5nLWNvbnRlbnRcbiAgICAgICAgICAgICdhJywgJ2FiYnInLCAnYXJlYScsICdhdWRpbycsICdiJywgJ2JkaScsICdiZG8nLCAnYnInLCAnYnV0dG9uJywgJ2NhbnZhcycsICdjaXRlJyxcbiAgICAgICAgICAgICdjb2RlJywgJ2RhdGEnLCAnZGF0YWxpc3QnLCAnZGVsJywgJ2RmbicsICdlbScsICdlbWJlZCcsICdpJywgJ2lmcmFtZScsICdpbWcnLFxuICAgICAgICAgICAgJ2lucHV0JywgJ2lucycsICdrYmQnLCAna2V5Z2VuJywgJ2xhYmVsJywgJ21hcCcsICdtYXJrJywgJ21hdGgnLCAnbWV0ZXInLCAnbm9zY3JpcHQnLFxuICAgICAgICAgICAgJ29iamVjdCcsICdvdXRwdXQnLCAncHJvZ3Jlc3MnLCAncScsICdydWJ5JywgJ3MnLCAnc2FtcCcsIC8qICdzY3JpcHQnLCAqLyAnc2VsZWN0JywgJ3NtYWxsJyxcbiAgICAgICAgICAgICdzcGFuJywgJ3N0cm9uZycsICdzdWInLCAnc3VwJywgJ3N2ZycsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0aW1lJywgJ3UnLCAndmFyJyxcbiAgICAgICAgICAgICd2aWRlbycsICd3YnInLCAndGV4dCcsXG4gICAgICAgICAgICAvLyBwcmV4aXN0aW5nIC0gbm90IHN1cmUgb2YgZnVsbCBlZmZlY3Qgb2YgcmVtb3ZpbmcsIGxlYXZpbmcgaW5cbiAgICAgICAgICAgICdhY3JvbnltJywgJ2FkZHJlc3MnLCAnYmlnJywgJ2R0JywgJ2lucycsICdzdHJpa2UnLCAndHQnLFxuICAgICAgICBdO1xuICAgICAgICBjb250ZW50X3VuZm9ybWF0dGVkID0gb3B0aW9ucy5jb250ZW50X3VuZm9ybWF0dGVkIHx8IFtcbiAgICAgICAgICAgICdwcmUnLFxuICAgICAgICBdO1xuICAgICAgICBwcmVzZXJ2ZV9uZXdsaW5lcyA9IChvcHRpb25zLnByZXNlcnZlX25ld2xpbmVzID09PSB1bmRlZmluZWQpID8gdHJ1ZSA6IG9wdGlvbnMucHJlc2VydmVfbmV3bGluZXM7XG4gICAgICAgIG1heF9wcmVzZXJ2ZV9uZXdsaW5lcyA9IHByZXNlcnZlX25ld2xpbmVzID9cbiAgICAgICAgICAgIChpc05hTihwYXJzZUludChvcHRpb25zLm1heF9wcmVzZXJ2ZV9uZXdsaW5lcywgMTApKSA/IDMyNzg2IDogcGFyc2VJbnQob3B0aW9ucy5tYXhfcHJlc2VydmVfbmV3bGluZXMsIDEwKSkgOlxuICAgICAgICAgICAgMDtcbiAgICAgICAgaW5kZW50X2hhbmRsZWJhcnMgPSAob3B0aW9ucy5pbmRlbnRfaGFuZGxlYmFycyA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogb3B0aW9ucy5pbmRlbnRfaGFuZGxlYmFycztcbiAgICAgICAgd3JhcF9hdHRyaWJ1dGVzID0gKG9wdGlvbnMud3JhcF9hdHRyaWJ1dGVzID09PSB1bmRlZmluZWQpID8gJ2F1dG8nIDogb3B0aW9ucy53cmFwX2F0dHJpYnV0ZXM7XG4gICAgICAgIHdyYXBfYXR0cmlidXRlc19pbmRlbnRfc2l6ZSA9IChpc05hTihwYXJzZUludChvcHRpb25zLndyYXBfYXR0cmlidXRlc19pbmRlbnRfc2l6ZSwgMTApKSkgPyBpbmRlbnRfc2l6ZSA6IHBhcnNlSW50KG9wdGlvbnMud3JhcF9hdHRyaWJ1dGVzX2luZGVudF9zaXplLCAxMCk7XG4gICAgICAgIGlzX3dyYXBfYXR0cmlidXRlc19mb3JjZSA9IHdyYXBfYXR0cmlidXRlcy5zdWJzdHIoMCwgJ2ZvcmNlJy5sZW5ndGgpID09PSAnZm9yY2UnO1xuICAgICAgICBpc193cmFwX2F0dHJpYnV0ZXNfZm9yY2VfZXhwYW5kX211bHRpbGluZSA9ICh3cmFwX2F0dHJpYnV0ZXMgPT09ICdmb3JjZS1leHBhbmQtbXVsdGlsaW5lJyk7XG4gICAgICAgIGlzX3dyYXBfYXR0cmlidXRlc19mb3JjZV9hbGlnbmVkID0gKHdyYXBfYXR0cmlidXRlcyA9PT0gJ2ZvcmNlLWFsaWduZWQnKTtcbiAgICAgICAgZW5kX3dpdGhfbmV3bGluZSA9IChvcHRpb25zLmVuZF93aXRoX25ld2xpbmUgPT09IHVuZGVmaW5lZCkgPyBmYWxzZSA6IG9wdGlvbnMuZW5kX3dpdGhfbmV3bGluZTtcbiAgICAgICAgZXh0cmFfbGluZXJzID0gKHR5cGVvZiBvcHRpb25zLmV4dHJhX2xpbmVycyA9PT0gJ29iamVjdCcpICYmIG9wdGlvbnMuZXh0cmFfbGluZXJzID9cbiAgICAgICAgICAgIG9wdGlvbnMuZXh0cmFfbGluZXJzLmNvbmNhdCgpIDogKHR5cGVvZiBvcHRpb25zLmV4dHJhX2xpbmVycyA9PT0gJ3N0cmluZycpID9cbiAgICAgICAgICAgIG9wdGlvbnMuZXh0cmFfbGluZXJzLnNwbGl0KCcsJykgOiAnaGVhZCxib2R5LC9odG1sJy5zcGxpdCgnLCcpO1xuICAgICAgICBlb2wgPSBvcHRpb25zLmVvbCA/IG9wdGlvbnMuZW9sIDogJ2F1dG8nO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmluZGVudF93aXRoX3RhYnMpIHtcbiAgICAgICAgICAgIGluZGVudF9jaGFyYWN0ZXIgPSAnXFx0JztcbiAgICAgICAgICAgIGluZGVudF9zaXplID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlb2wgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgZW9sID0gJ1xcbic7XG4gICAgICAgICAgICBpZiAoaHRtbF9zb3VyY2UgJiYgbGluZUJyZWFrLnRlc3QoaHRtbF9zb3VyY2UgfHwgJycpKSB7XG4gICAgICAgICAgICAgICAgZW9sID0gaHRtbF9zb3VyY2UubWF0Y2gobGluZUJyZWFrKVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVvbCA9IGVvbC5yZXBsYWNlKC9cXFxcci8sICdcXHInKS5yZXBsYWNlKC9cXFxcbi8sICdcXG4nKTtcblxuICAgICAgICAvLyBIQUNLOiBuZXdsaW5lIHBhcnNpbmcgaW5jb25zaXN0ZW50LiBUaGlzIGJydXRlIGZvcmNlIG5vcm1hbGl6ZXMgdGhlIGlucHV0LlxuICAgICAgICBodG1sX3NvdXJjZSA9IGh0bWxfc291cmNlLnJlcGxhY2UoYWxsTGluZUJyZWFrcywgJ1xcbicpO1xuXG4gICAgICAgIGZ1bmN0aW9uIFBhcnNlcigpIHtcblxuICAgICAgICAgICAgdGhpcy5wb3MgPSAwOyAvL1BhcnNlciBwb3NpdGlvblxuICAgICAgICAgICAgdGhpcy50b2tlbiA9ICcnO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50X21vZGUgPSAnQ09OVEVOVCc7IC8vcmVmbGVjdHMgdGhlIGN1cnJlbnQgUGFyc2VyIG1vZGU6IFRBRy9DT05URU5UXG4gICAgICAgICAgICB0aGlzLnRhZ3MgPSB7IC8vQW4gb2JqZWN0IHRvIGhvbGQgdGFncywgdGhlaXIgcG9zaXRpb24sIGFuZCB0aGVpciBwYXJlbnQtdGFncywgaW5pdGlhdGVkIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICBwYXJlbnQ6ICdwYXJlbnQxJyxcbiAgICAgICAgICAgICAgICBwYXJlbnRjb3VudDogMSxcbiAgICAgICAgICAgICAgICBwYXJlbnQxOiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMudGFnX3R5cGUgPSAnJztcbiAgICAgICAgICAgIHRoaXMudG9rZW5fdGV4dCA9IHRoaXMubGFzdF90b2tlbiA9IHRoaXMubGFzdF90ZXh0ID0gdGhpcy50b2tlbl90eXBlID0gJyc7XG4gICAgICAgICAgICB0aGlzLm5ld2xpbmVzID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW5kZW50X2NvbnRlbnQgPSBpbmRlbnRfaW5uZXJfaHRtbDtcbiAgICAgICAgICAgIHRoaXMuaW5kZW50X2JvZHlfaW5uZXJfaHRtbCA9IGluZGVudF9ib2R5X2lubmVyX2h0bWw7XG4gICAgICAgICAgICB0aGlzLmluZGVudF9oZWFkX2lubmVyX2h0bWwgPSBpbmRlbnRfaGVhZF9pbm5lcl9odG1sO1xuXG4gICAgICAgICAgICB0aGlzLlV0aWxzID0geyAvL1VpbGl0aWVzIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB2YXJpb3VzIGZ1bmN0aW9uc1xuICAgICAgICAgICAgICAgIHdoaXRlc3BhY2U6IFwiXFxuXFxyXFx0IFwiLnNwbGl0KCcnKSxcblxuICAgICAgICAgICAgICAgIHNpbmdsZV90b2tlbjogb3B0aW9ucy52b2lkX2VsZW1lbnRzIHx8IFtcbiAgICAgICAgICAgICAgICAgICAgLy8gSFRMTSB2b2lkIGVsZW1lbnRzIC0gYWthIHNlbGYtY2xvc2luZyB0YWdzIC0gYWthIHNpbmdsZXRvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL2h0bWwvd2cvZHJhZnRzL2h0bWwvbWFzdGVyL3N5bnRheC5odG1sI3ZvaWQtZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgJ2FyZWEnLCAnYmFzZScsICdicicsICdjb2wnLCAnZW1iZWQnLCAnaHInLCAnaW1nJywgJ2lucHV0JywgJ2tleWdlbicsXG4gICAgICAgICAgICAgICAgICAgICdsaW5rJywgJ21lbnVpdGVtJywgJ21ldGEnLCAncGFyYW0nLCAnc291cmNlJywgJ3RyYWNrJywgJ3dicicsXG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IE9wdGlvbmFsIHRhZ3MgLSBhcmUgbm90IHVuZGVyc3Rvb2QuXG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNvcHRpb25hbC10YWdzXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBydWxlcyBmb3Igb3B0aW9uYWwgdGFncyBhcmUgdG9vIGNvbXBsZXggZm9yIGEgc2ltcGxlIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxzbywgdGhlIGNvbnRlbnQgb2YgdGhlc2UgdGFncyBzaG91bGQgc3RpbGwgYmUgaW5kZW50ZWQgaW4gbWFueSBjYXNlcy5cbiAgICAgICAgICAgICAgICAgICAgLy8gJ2xpJyBpcyBhIGdvb2QgZXhtcGxlLlxuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvY3R5cGUgYW5kIHhtbCBlbGVtZW50c1xuICAgICAgICAgICAgICAgICAgICAnIWRvY3R5cGUnLCAnP3htbCcsXG4gICAgICAgICAgICAgICAgICAgIC8vID9waHAgdGFnXG4gICAgICAgICAgICAgICAgICAgICc/cGhwJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgdGFncyB0aGF0IHdlcmUgaW4gdGhpcyBsaXN0LCBrZWVwaW5nIGp1c3QgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgICAnYmFzZWZvbnQnLCAnaXNpbmRleCdcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGV4dHJhX2xpbmVyczogZXh0cmFfbGluZXJzLCAvL2ZvciB0YWdzIHRoYXQgbmVlZCBhIGxpbmUgb2Ygd2hpdGVzcGFjZSBiZWZvcmUgdGhlbVxuICAgICAgICAgICAgICAgIGluX2FycmF5OiBmdW5jdGlvbih3aGF0LCBhcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09PSBhcnJbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHRleHQgaXMgY29tcG9zZWQgZW50aXJlbHkgb2Ygd2hpdGVzcGFjZS5cbiAgICAgICAgICAgIHRoaXMuaXNfd2hpdGVzcGFjZSA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHRleHQubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLlV0aWxzLmluX2FycmF5KHRleHQuY2hhckF0KG4pLCB0aGlzLlV0aWxzLndoaXRlc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnRyYXZlcnNlX3doaXRlc3BhY2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5wdXRfY2hhciA9ICcnO1xuXG4gICAgICAgICAgICAgICAgaW5wdXRfY2hhciA9IHRoaXMuaW5wdXQuY2hhckF0KHRoaXMucG9zKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5VdGlscy5pbl9hcnJheShpbnB1dF9jaGFyLCB0aGlzLlV0aWxzLndoaXRlc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV3bGluZXMgPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5VdGlscy5pbl9hcnJheShpbnB1dF9jaGFyLCB0aGlzLlV0aWxzLndoaXRlc3BhY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVfbmV3bGluZXMgJiYgaW5wdXRfY2hhciA9PT0gJ1xcbicgJiYgdGhpcy5uZXdsaW5lcyA8PSBtYXhfcHJlc2VydmVfbmV3bGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld2xpbmVzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9zKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9jaGFyID0gdGhpcy5pbnB1dC5jaGFyQXQodGhpcy5wb3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgYSBzcGFjZSB0byB0aGUgZ2l2ZW4gY29udGVudCAoc3RyaW5nIGFycmF5KSBvciwgaWYgd2UgYXJlXG4gICAgICAgICAgICAvLyBhdCB0aGUgd3JhcF9saW5lX2xlbmd0aCwgYXBwZW5kIGEgbmV3bGluZS9pbmRlbnRhdGlvbi5cbiAgICAgICAgICAgIC8vIHJldHVybiB0cnVlIGlmIGEgbmV3bGluZSB3YXMgYWRkZWQsIGZhbHNlIGlmIGEgc3BhY2Ugd2FzIGFkZGVkXG4gICAgICAgICAgICB0aGlzLnNwYWNlX29yX3dyYXAgPSBmdW5jdGlvbihjb250ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGluZV9jaGFyX2NvdW50ID49IHRoaXMud3JhcF9saW5lX2xlbmd0aCkgeyAvL2luc2VydCBhIGxpbmUgd2hlbiB0aGUgd3JhcF9saW5lX2xlbmd0aCBpcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbnRfbmV3bGluZShmYWxzZSwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbnRfaW5kZW50YXRpb24oY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZV9jaGFyX2NvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaCgnICcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5nZXRfY29udGVudCA9IGZ1bmN0aW9uKCkgeyAvL2Z1bmN0aW9uIHRvIGNhcHR1cmUgcmVndWxhciBjb250ZW50IGJldHdlZW4gdGFnc1xuICAgICAgICAgICAgICAgIHZhciBpbnB1dF9jaGFyID0gJycsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBbXSxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlYmFyc1N0YXJ0ZWQgPSAwO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuaW5wdXQuY2hhckF0KHRoaXMucG9zKSAhPT0gJzwnIHx8IGhhbmRsZWJhcnNTdGFydGVkID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmlucHV0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQubGVuZ3RoID8gY29udGVudC5qb2luKCcnKSA6IFsnJywgJ1RLX0VPRiddO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZWJhcnNTdGFydGVkIDwgMiAmJiB0aGlzLnRyYXZlcnNlX3doaXRlc3BhY2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFjZV9vcl93cmFwKGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpbnB1dF9jaGFyID0gdGhpcy5pbnB1dC5jaGFyQXQodGhpcy5wb3MpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRlbnRfaGFuZGxlYmFycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0X2NoYXIgPT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWJhcnNTdGFydGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZWJhcnNTdGFydGVkIDwgMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWJhcnNTdGFydGVkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0X2NoYXIgPT09ICd9JyAmJiBoYW5kbGViYXJzU3RhcnRlZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlYmFyc1N0YXJ0ZWQtLSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGViYXJzIHBhcnNpbmcgaXMgY29tcGxpY2F0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB7eyNmb299fSBhbmQge3svZm9vfX0gYXJlIGZvcm1hdHRlZCB0YWdzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ge3tzb21ldGhpbmd9fSBzaG91bGQgZ2V0IHRyZWF0ZWQgYXMgY29udGVudCwgZXhjZXB0OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ge3tlbHNlfX0gc3BlY2lmaWNhbGx5IGJlaGF2ZXMgbGlrZSB7eyNpZn19IGFuZCB7ey9pZn19XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGVlazMgPSB0aGlzLmlucHV0LnN1YnN0cih0aGlzLnBvcywgMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVlazMgPT09ICd7eyMnIHx8IHBlZWszID09PSAne3svJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSB0YWdzIGFuZCBub3QgY29udGVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVlazMgPT09ICd7eyEnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmdldF90YWcoKSwgJ1RLX1RBR19IQU5ETEVCQVJTX0NPTU1FTlQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnB1dC5zdWJzdHIodGhpcy5wb3MsIDIpID09PSAne3snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0X3RhZyh0cnVlKSA9PT0gJ3t7ZWxzZX19Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcysrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVfY2hhcl9jb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goaW5wdXRfY2hhcik7IC8vbGV0dGVyIGF0LWEtdGltZSAob3Igc3RyaW5nKSBpbnNlcnRlZCB0byBhbiBhcnJheVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudC5sZW5ndGggPyBjb250ZW50LmpvaW4oJycpIDogJyc7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLmdldF9jb250ZW50c190byA9IGZ1bmN0aW9uKG5hbWUpIHsgLy9nZXQgdGhlIGZ1bGwgY29udGVudCBvZiBhIHNjcmlwdCBvciBzdHlsZSB0byBwYXNzIHRvIGpzX2JlYXV0aWZ5XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucG9zID09PSB0aGlzLmlucHV0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWycnLCAnVEtfRU9GJ107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgdmFyIHJlZ19tYXRjaCA9IG5ldyBSZWdFeHAoJzwvJyArIG5hbWUgKyAnXFxcXHMqPicsICdpZ20nKTtcbiAgICAgICAgICAgICAgICByZWdfbWF0Y2gubGFzdEluZGV4ID0gdGhpcy5wb3M7XG4gICAgICAgICAgICAgICAgdmFyIHJlZ19hcnJheSA9IHJlZ19tYXRjaC5leGVjKHRoaXMuaW5wdXQpO1xuICAgICAgICAgICAgICAgIHZhciBlbmRfc2NyaXB0ID0gcmVnX2FycmF5ID8gcmVnX2FycmF5LmluZGV4IDogdGhpcy5pbnB1dC5sZW5ndGg7IC8vYWJzb2x1dGUgZW5kIG9mIHNjcmlwdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvcyA8IGVuZF9zY3JpcHQpIHsgLy9nZXQgZXZlcnl0aGluZyBpbiBiZXR3ZWVuIHRoZSBzY3JpcHQgdGFnc1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcodGhpcy5wb3MsIGVuZF9zY3JpcHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcyA9IGVuZF9zY3JpcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5yZWNvcmRfdGFnID0gZnVuY3Rpb24odGFnKSB7IC8vZnVuY3Rpb24gdG8gcmVjb3JkIGEgdGFnIGFuZCBpdHMgcGFyZW50IGluIHRoaXMudGFncyBPYmplY3RcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50YWdzW3RhZyArICdjb3VudCddKSB7IC8vY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyB0YWcgdHlwZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ3NbdGFnICsgJ2NvdW50J10rKztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdzW3RhZyArIHRoaXMudGFnc1t0YWcgKyAnY291bnQnXV0gPSB0aGlzLmluZGVudF9sZXZlbDsgLy9hbmQgcmVjb3JkIHRoZSBwcmVzZW50IGluZGVudCBsZXZlbFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vb3RoZXJ3aXNlIGluaXRpYWxpemUgdGhpcyB0YWcgdHlwZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ3NbdGFnICsgJ2NvdW50J10gPSAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ3NbdGFnICsgdGhpcy50YWdzW3RhZyArICdjb3VudCddXSA9IHRoaXMuaW5kZW50X2xldmVsOyAvL2FuZCByZWNvcmQgdGhlIHByZXNlbnQgaW5kZW50IGxldmVsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudGFnc1t0YWcgKyB0aGlzLnRhZ3NbdGFnICsgJ2NvdW50J10gKyAncGFyZW50J10gPSB0aGlzLnRhZ3MucGFyZW50OyAvL3NldCB0aGUgcGFyZW50IChpLmUuIGluIHRoZSBjYXNlIG9mIGEgZGl2IHRoaXMudGFncy5kaXYxcGFyZW50KVxuICAgICAgICAgICAgICAgIHRoaXMudGFncy5wYXJlbnQgPSB0YWcgKyB0aGlzLnRhZ3NbdGFnICsgJ2NvdW50J107IC8vYW5kIG1ha2UgdGhpcyB0aGUgY3VycmVudCBwYXJlbnQgKGkuZS4gaW4gdGhlIGNhc2Ugb2YgYSBkaXYgJ2RpdjEnKVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5yZXRyaWV2ZV90YWcgPSBmdW5jdGlvbih0YWcpIHsgLy9mdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgb3BlbmluZyB0YWcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY2xvc2VyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGFnc1t0YWcgKyAnY291bnQnXSkgeyAvL2lmIHRoZSBvcGVuZW5lciBpcyBub3QgaW4gdGhlIE9iamVjdCB3ZSBpZ25vcmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBfcGFyZW50ID0gdGhpcy50YWdzLnBhcmVudDsgLy9jaGVjayB0byBzZWUgaWYgaXQncyBhIGNsb3NhYmxlIHRhZy5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRlbXBfcGFyZW50KSB7IC8vdGlsbCB3ZSByZWFjaCAnJyAodGhlIGluaXRpYWwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyArIHRoaXMudGFnc1t0YWcgKyAnY291bnQnXSA9PT0gdGVtcF9wYXJlbnQpIHsgLy9pZiB0aGlzIGlzIGl0IHVzZSBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9wYXJlbnQgPSB0aGlzLnRhZ3NbdGVtcF9wYXJlbnQgKyAncGFyZW50J107IC8vb3RoZXJ3aXNlIGtlZXAgb24gY2xpbWJpbmcgdXAgdGhlIERPTSBUcmVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBfcGFyZW50KSB7IC8vaWYgd2UgY2F1Z2h0IHNvbWV0aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnRfbGV2ZWwgPSB0aGlzLnRhZ3NbdGFnICsgdGhpcy50YWdzW3RhZyArICdjb3VudCddXTsgLy9zZXQgdGhlIGluZGVudF9sZXZlbCBhY2NvcmRpbmdseVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdzLnBhcmVudCA9IHRoaXMudGFnc1t0ZW1wX3BhcmVudCArICdwYXJlbnQnXTsgLy9hbmQgc2V0IHRoZSBjdXJyZW50IHBhcmVudFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRhZ3NbdGFnICsgdGhpcy50YWdzW3RhZyArICdjb3VudCddICsgJ3BhcmVudCddOyAvL2RlbGV0ZSB0aGUgY2xvc2VkIHRhZ3MgcGFyZW50IHJlZmVyZW5jZS4uLlxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50YWdzW3RhZyArIHRoaXMudGFnc1t0YWcgKyAnY291bnQnXV07IC8vLi4uYW5kIHRoZSB0YWcgaXRzZWxmXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhZ3NbdGFnICsgJ2NvdW50J10gPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRhZ3NbdGFnICsgJ2NvdW50J107XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ3NbdGFnICsgJ2NvdW50J10tLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuaW5kZW50X3RvX3RhZyA9IGZ1bmN0aW9uKHRhZykge1xuICAgICAgICAgICAgICAgIC8vIE1hdGNoIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCB0byB0aGUgbGFzdCB1c2Ugb2YgdGhpcyB0YWcsIGJ1dCBkb24ndCByZW1vdmUgaXQuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRhZ3NbdGFnICsgJ2NvdW50J10pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdGVtcF9wYXJlbnQgPSB0aGlzLnRhZ3MucGFyZW50O1xuICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wX3BhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFnICsgdGhpcy50YWdzW3RhZyArICdjb3VudCddID09PSB0ZW1wX3BhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGVtcF9wYXJlbnQgPSB0aGlzLnRhZ3NbdGVtcF9wYXJlbnQgKyAncGFyZW50J107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0ZW1wX3BhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGVudF9sZXZlbCA9IHRoaXMudGFnc1t0YWcgKyB0aGlzLnRhZ3NbdGFnICsgJ2NvdW50J11dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0X3RhZyA9IGZ1bmN0aW9uKHBlZWspIHsgLy9mdW5jdGlvbiB0byBnZXQgYSBmdWxsIHRhZyBhbmQgcGFyc2UgaXRzIHR5cGVcbiAgICAgICAgICAgICAgICB2YXIgaW5wdXRfY2hhciA9ICcnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gW10sXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSAnJyxcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RfYXR0ciA9IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGhhc193cmFwcGVkX2F0dHJzID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRhZ19zdGFydCwgdGFnX2VuZCxcbiAgICAgICAgICAgICAgICAgICAgdGFnX3N0YXJ0X2NoYXIsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdfcG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdfbGluZV9jaGFyX2NvdW50ID0gdGhpcy5saW5lX2NoYXJfY291bnQsXG4gICAgICAgICAgICAgICAgICAgIGlzX3RhZ19jbG9zZWQgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdGFpbDtcblxuICAgICAgICAgICAgICAgIHBlZWsgPSBwZWVrICE9PSB1bmRlZmluZWQgPyBwZWVrIDogZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmlucHV0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlZWspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcyA9IG9yaWdfcG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZV9jaGFyX2NvdW50ID0gb3JpZ19saW5lX2NoYXJfY291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudC5sZW5ndGggPyBjb250ZW50LmpvaW4oJycpIDogWycnLCAnVEtfRU9GJ107XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpbnB1dF9jaGFyID0gdGhpcy5pbnB1dC5jaGFyQXQodGhpcy5wb3MpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcysrO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlV0aWxzLmluX2FycmF5KGlucHV0X2NoYXIsIHRoaXMuVXRpbHMud2hpdGVzcGFjZSkpIHsgLy9kb24ndCB3YW50IHRvIGluc2VydCB1bm5lY2Vzc2FyeSBzcGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRfY2hhciA9PT0gXCInXCIgfHwgaW5wdXRfY2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfY2hhciArPSB0aGlzLmdldF91bmZvcm1hdHRlZChpbnB1dF9jaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dF9jaGFyID09PSAnPScpIHsgLy9ubyBzcGFjZSBiZWZvcmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0YWlsID0gdGhpcy5pbnB1dC5zdWJzdHIodGhpcy5wb3MgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX3dyYXBfYXR0cmlidXRlc19mb3JjZV9leHBhbmRfbXVsdGlsaW5lICYmIGhhc193cmFwcGVkX2F0dHJzICYmICFpc190YWdfY2xvc2VkICYmIChpbnB1dF9jaGFyID09PSAnPicgfHwgaW5wdXRfY2hhciA9PT0gJy8nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhaWwubWF0Y2goL15cXC8/XFxzKj4vKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdGFnX2Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmludF9uZXdsaW5lKGZhbHNlLCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByaW50X2luZGVudGF0aW9uKGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCAmJiBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV0gIT09ICc9JyAmJiBpbnB1dF9jaGFyICE9PSAnPicgJiYgc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbm8gc3BhY2UgYWZ0ZXIgPSBvciBiZWZvcmUgPlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdyYXBwZWQgPSB0aGlzLnNwYWNlX29yX3dyYXAoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZW50QXR0cnMgPSB3cmFwcGVkICYmIGlucHV0X2NoYXIgIT09ICcvJyAmJiAhaXNfd3JhcF9hdHRyaWJ1dGVzX2ZvcmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2UgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX3dyYXBfYXR0cmlidXRlc19mb3JjZSAmJiBpbnB1dF9jaGFyICE9PSAnLycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9yY2VfZmlyc3RfYXR0cl93cmFwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX3dyYXBfYXR0cmlidXRlc19mb3JjZV9leHBhbmRfbXVsdGlsaW5lICYmIGZpcnN0X2F0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzX29ubHlfYXR0cmlidXRlID0gdGFpbC5tYXRjaCgvXlxcUyooPVwiKFteXCJdfFxcXFxcIikqXCIpP1xccypcXC8/XFxzKj4vKSAhPT0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VfZmlyc3RfYXR0cl93cmFwID0gIWlzX29ubHlfYXR0cmlidXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0X2F0dHIgfHwgZm9yY2VfZmlyc3RfYXR0cl93cmFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbnRfbmV3bGluZShmYWxzZSwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbnRfaW5kZW50YXRpb24oY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudEF0dHJzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZW50QXR0cnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfd3JhcHBlZF9hdHRycyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2luZGVudCBhdHRyaWJ1dGVzIGFuIGF1dG8sIGZvcmNlZCwgb3IgZm9yY2VkLWFsaWduIGxpbmUtd3JhcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbGlnbm1lbnRfc2l6ZSA9IHdyYXBfYXR0cmlidXRlc19pbmRlbnRfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfd3JhcF9hdHRyaWJ1dGVzX2ZvcmNlX2FsaWduZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50X3NpemUgPSBjb250ZW50LmluZGV4T2YoJyAnKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgY291bnQgPSAwOyBjb3VudCA8IGFsaWdubWVudF9zaXplOyBjb3VudCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZXZlciBmdXJ0aGVyIGluZGVudCB3aXRoIHNwYWNlcyBzaW5jZSB3ZSdyZSB0cnlpbmcgdG8gYWxpZ24gY2hhcmFjdGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RfYXR0cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFtpXSA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9hdHRyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRlbnRfaGFuZGxlYmFycyAmJiB0YWdfc3RhcnRfY2hhciA9PT0gJzwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGluc2lkZSBhbiBhbmdsZS1icmFja2V0IHRhZywgcHV0IHNwYWNlcyBhcm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZWJhcnMgbm90IGluc2lkZSBvZiBzdHJpbmdzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnB1dF9jaGFyICsgdGhpcy5pbnB1dC5jaGFyQXQodGhpcy5wb3MpKSA9PT0gJ3t7Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2NoYXIgKz0gdGhpcy5nZXRfdW5mb3JtYXR0ZWQoJ319Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXSAhPT0gJyAnICYmIGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXSAhPT0gJzwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2NoYXIgPSAnICcgKyBpbnB1dF9jaGFyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRfY2hhciA9PT0gJzwnICYmICF0YWdfc3RhcnRfY2hhcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnX3N0YXJ0ID0gdGhpcy5wb3MgLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnX3N0YXJ0X2NoYXIgPSAnPCc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZW50X2hhbmRsZWJhcnMgJiYgIXRhZ19zdGFydF9jaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPj0gMiAmJiBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV0gPT09ICd7JyAmJiBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMl0gPT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dF9jaGFyID09PSAnIycgfHwgaW5wdXRfY2hhciA9PT0gJy8nIHx8IGlucHV0X2NoYXIgPT09ICchJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdfc3RhcnQgPSB0aGlzLnBvcyAtIDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnX3N0YXJ0ID0gdGhpcy5wb3MgLSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdfc3RhcnRfY2hhciA9ICd7JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZV9jaGFyX2NvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChpbnB1dF9jaGFyKTsgLy9pbnNlcnRzIGNoYXJhY3RlciBhdC1hLXRpbWUgKG9yIHN0cmluZylcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFsxXSAmJiAoY29udGVudFsxXSA9PT0gJyEnIHx8IGNvbnRlbnRbMV0gPT09ICc/JyB8fCBjb250ZW50WzFdID09PSAnJScpKSB7IC8vaWYgd2UncmUgaW4gYSBjb21tZW50LCBkbyBzb21ldGhpbmcgc3BlY2lhbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgdHJlYXQgYWxsIGNvbW1lbnRzIGFzIGxpdGVyYWxzLCBldmVuIG1vcmUgdGhhbiBwcmVmb3JtYXR0ZWQgdGFnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UganVzdCBsb29rIGZvciB0aGUgYXBwcm9wcmlhdGUgY2xvc2UgdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gW3RoaXMuZ2V0X2NvbW1lbnQodGFnX3N0YXJ0KV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRlbnRfaGFuZGxlYmFycyAmJiBjb250ZW50WzFdICYmIGNvbnRlbnRbMV0gPT09ICd7JyAmJiBjb250ZW50WzJdICYmIGNvbnRlbnRbMl0gPT09ICchJykgeyAvL2lmIHdlJ3JlIGluIGEgY29tbWVudCwgZG8gc29tZXRoaW5nIHNwZWNpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHRyZWF0IGFsbCBjb21tZW50cyBhcyBsaXRlcmFscywgZXZlbiBtb3JlIHRoYW4gcHJlZm9ybWF0dGVkIHRhZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGp1c3QgbG9vayBmb3IgdGhlIGFwcHJvcHJpYXRlIGNsb3NlIHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IFt0aGlzLmdldF9jb21tZW50KHRhZ19zdGFydCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZW50X2hhbmRsZWJhcnMgJiYgdGFnX3N0YXJ0X2NoYXIgPT09ICd7JyAmJiBjb250ZW50Lmxlbmd0aCA+IDIgJiYgY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDJdID09PSAnfScgJiYgY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdID09PSAnfScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoaW5wdXRfY2hhciAhPT0gJz4nKTtcblxuICAgICAgICAgICAgICAgIHZhciB0YWdfY29tcGxldGUgPSBjb250ZW50LmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIHZhciB0YWdfaW5kZXg7XG4gICAgICAgICAgICAgICAgdmFyIHRhZ19vZmZzZXQ7XG5cbiAgICAgICAgICAgICAgICAvLyBtdXN0IGNoZWNrIGZvciBzcGFjZSBmaXJzdCBvdGhlcndpc2UgdGhlIHRhZyBjb3VsZCBoYXZlIHRoZSBmaXJzdCBhdHRyaWJ1dGUgaW5jbHVkZWQsIGFuZFxuICAgICAgICAgICAgICAgIC8vIHRoZW4gbm90IHVuLWluZGVudCBjb3JyZWN0bHlcbiAgICAgICAgICAgICAgICBpZiAodGFnX2NvbXBsZXRlLmluZGV4T2YoJyAnKSAhPT0gLTEpIHsgLy9pZiB0aGVyZSdzIHdoaXRlc3BhY2UsIHRoYXRzIHdoZXJlIHRoZSB0YWcgbmFtZSBlbmRzXG4gICAgICAgICAgICAgICAgICAgIHRhZ19pbmRleCA9IHRhZ19jb21wbGV0ZS5pbmRleE9mKCcgJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWdfY29tcGxldGUuaW5kZXhPZignXFxuJykgIT09IC0xKSB7IC8vaWYgdGhlcmUncyBhIGxpbmUgYnJlYWssIHRoYXRzIHdoZXJlIHRoZSB0YWcgbmFtZSBlbmRzXG4gICAgICAgICAgICAgICAgICAgIHRhZ19pbmRleCA9IHRhZ19jb21wbGV0ZS5pbmRleE9mKCdcXG4nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ19jb21wbGV0ZS5jaGFyQXQoMCkgPT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICB0YWdfaW5kZXggPSB0YWdfY29tcGxldGUuaW5kZXhPZignfScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vb3RoZXJ3aXNlIGdvIHdpdGggdGhlIHRhZyBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgdGFnX2luZGV4ID0gdGFnX2NvbXBsZXRlLmluZGV4T2YoJz4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhZ19jb21wbGV0ZS5jaGFyQXQoMCkgPT09ICc8JyB8fCAhaW5kZW50X2hhbmRsZWJhcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFnX29mZnNldCA9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFnX29mZnNldCA9IHRhZ19jb21wbGV0ZS5jaGFyQXQoMikgPT09ICcjJyA/IDMgOiAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdGFnX2NoZWNrID0gdGFnX2NvbXBsZXRlLnN1YnN0cmluZyh0YWdfb2Zmc2V0LCB0YWdfaW5kZXgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ19jb21wbGV0ZS5jaGFyQXQodGFnX2NvbXBsZXRlLmxlbmd0aCAtIDIpID09PSAnLycgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5VdGlscy5pbl9hcnJheSh0YWdfY2hlY2ssIHRoaXMuVXRpbHMuc2luZ2xlX3Rva2VuKSkgeyAvL2lmIHRoaXMgdGFnIG5hbWUgaXMgYSBzaW5nbGUgdGFnIHR5cGUgKGVpdGhlciBpbiB0aGUgbGlzdCBvciBoYXMgYSBjbG9zaW5nIC8pXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGVlaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdfdHlwZSA9ICdTSU5HTEUnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRlbnRfaGFuZGxlYmFycyAmJiB0YWdfY29tcGxldGUuY2hhckF0KDApID09PSAneycgJiYgdGFnX2NoZWNrID09PSAnZWxzZScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwZWVrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGVudF90b190YWcoJ2lmJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ190eXBlID0gJ0hBTkRMRUJBUlNfRUxTRSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGVudF9jb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhdmVyc2Vfd2hpdGVzcGFjZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzX3VuZm9ybWF0dGVkKHRhZ19jaGVjaywgdW5mb3JtYXR0ZWQpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNfdW5mb3JtYXR0ZWQodGFnX2NoZWNrLCBjb250ZW50X3VuZm9ybWF0dGVkKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVmb3JtYXQgdGhlIFwidW5mb3JtYXR0ZWRcIiBvciBcImNvbnRlbnRfdW5mb3JtYXR0ZWRcIiB0YWdzXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSB0aGlzLmdldF91bmZvcm1hdHRlZCgnPC8nICsgdGFnX2NoZWNrICsgJz4nLCB0YWdfY29tcGxldGUpOyAvLy4uLmRlbGVnYXRlIHRvIGdldF91bmZvcm1hdHRlZCBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goY29tbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRhZ19lbmQgPSB0aGlzLnBvcyAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnX3R5cGUgPSAnU0lOR0xFJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ19jaGVjayA9PT0gJ3NjcmlwdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgKHRhZ19jb21wbGV0ZS5zZWFyY2goJ3R5cGUnKSA9PT0gLTEgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0YWdfY29tcGxldGUuc2VhcmNoKCd0eXBlJykgPiAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19jb21wbGV0ZS5zZWFyY2goL1xcYih0ZXh0fGFwcGxpY2F0aW9ufGRvam8pXFwvKHgtKT8oamF2YXNjcmlwdHxlY21hc2NyaXB0fGpzY3JpcHR8bGl2ZXNjcmlwdHwobGRcXCspP2pzb258bWV0aG9kfGFzcGVjdCkvKSA+IC0xKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwZWVrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZF90YWcodGFnX2NoZWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnX3R5cGUgPSAnU0NSSVBUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnX2NoZWNrID09PSAnc3R5bGUnICYmXG4gICAgICAgICAgICAgICAgICAgICh0YWdfY29tcGxldGUuc2VhcmNoKCd0eXBlJykgPT09IC0xIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAodGFnX2NvbXBsZXRlLnNlYXJjaCgndHlwZScpID4gLTEgJiYgdGFnX2NvbXBsZXRlLnNlYXJjaCgndGV4dC9jc3MnKSA+IC0xKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwZWVrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZF90YWcodGFnX2NoZWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnX3R5cGUgPSAnU1RZTEUnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWdfY2hlY2suY2hhckF0KDApID09PSAnIScpIHsgLy9wZWVrIGZvciA8ISBjb21tZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb21tZW50cyBjb250ZW50IGlzIGFscmVhZHkgY29ycmVjdC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwZWVrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ190eXBlID0gJ1NJTkdMRSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYXZlcnNlX3doaXRlc3BhY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXBlZWspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ19jaGVjay5jaGFyQXQoMCkgPT09ICcvJykgeyAvL3RoaXMgdGFnIGlzIGEgZG91YmxlIHRhZyBzbyBjaGVjayBmb3IgdGFnLWVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRyaWV2ZV90YWcodGFnX2NoZWNrLnN1YnN0cmluZygxKSk7IC8vcmVtb3ZlIGl0IGFuZCBhbGwgYW5jZXN0b3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ190eXBlID0gJ0VORCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vb3RoZXJ3aXNlIGl0J3MgYSBzdGFydC10YWdcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkX3RhZyh0YWdfY2hlY2spOyAvL3B1c2ggaXQgb24gdGhlIHRhZyBzdGFja1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ19jaGVjay50b0xvd2VyQ2FzZSgpICE9PSAnaHRtbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGVudF9jb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnX3R5cGUgPSAnU1RBUlQnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgcHJlc2VydmluZyBvZiBuZXdsaW5lcyBhZnRlciBhIHN0YXJ0IG9yIGVuZCB0YWdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhdmVyc2Vfd2hpdGVzcGFjZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYWNlX29yX3dyYXAoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5VdGlscy5pbl9hcnJheSh0YWdfY2hlY2ssIHRoaXMuVXRpbHMuZXh0cmFfbGluZXJzKSkgeyAvL2NoZWNrIGlmIHRoaXMgZG91YmxlIG5lZWRzIGFuIGV4dHJhIGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbnRfbmV3bGluZShmYWxzZSwgdGhpcy5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3V0cHV0Lmxlbmd0aCAmJiB0aGlzLm91dHB1dFt0aGlzLm91dHB1dC5sZW5ndGggLSAyXSAhPT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByaW50X25ld2xpbmUodHJ1ZSwgdGhpcy5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHBlZWspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3MgPSBvcmlnX3BvcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lX2NoYXJfY291bnQgPSBvcmlnX2xpbmVfY2hhcl9jb3VudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudC5qb2luKCcnKTsgLy9yZXR1cm5zIGZ1bGx5IGZvcm1hdHRlZCB0YWdcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0X2NvbW1lbnQgPSBmdW5jdGlvbihzdGFydF9wb3MpIHsgLy9mdW5jdGlvbiB0byByZXR1cm4gY29tbWVudCBjb250ZW50IGluIGl0cyBlbnRpcmV0eVxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgd2lsbCBoYXZlIHZlcnkgcG9vciBwZXJmLCBidXQgd2lsbCB3b3JrIGZvciBub3cuXG4gICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSAnJyxcbiAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gJz4nLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0X3BvcztcbiAgICAgICAgICAgICAgICB2YXIgaW5wdXRfY2hhciA9IHRoaXMuaW5wdXQuY2hhckF0KHRoaXMucG9zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcysrO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMucG9zIDw9IHRoaXMuaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gaW5wdXRfY2hhcjtcblxuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG5lZWQgdG8gY2hlY2sgZm9yIHRoZSBkZWxpbWl0ZXIgaWYgdGhlIGxhc3QgY2hhcnMgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQuY2hhckF0KGNvbW1lbnQubGVuZ3RoIC0gMSkgPT09IGRlbGltaXRlci5jaGFyQXQoZGVsaW1pdGVyLmxlbmd0aCAtIDEpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LmluZGV4T2YoZGVsaW1pdGVyKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBuZWVkIHRvIHNlYXJjaCBmb3IgY3VzdG9tIGRlbGltaXRlciBmb3IgdGhlIGZpcnN0IGZldyBjaGFyYWN0ZXJzXG4gICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlZCAmJiBjb21tZW50Lmxlbmd0aCA8IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWVudC5pbmRleE9mKCc8IVtpZicpID09PSAwKSB7IC8vcGVlayBmb3IgPCFbaWYgY29uZGl0aW9uYWwgY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlciA9ICc8IVtlbmRpZl0+JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWVudC5pbmRleE9mKCc8IVtjZGF0YVsnKSA9PT0gMCkgeyAvL2lmIGl0J3MgYSA8W2NkYXRhWyBjb21tZW50Li4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gJ11dPic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1lbnQuaW5kZXhPZignPCFbJykgPT09IDApIHsgLy8gc29tZSBvdGhlciAhWyBjb21tZW50PyAuLi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSAnXT4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21tZW50LmluZGV4T2YoJzwhLS0nKSA9PT0gMCkgeyAvLyA8IS0tIGNvbW1lbnQgLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gJy0tPic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1lbnQuaW5kZXhPZigne3shLS0nKSA9PT0gMCkgeyAvLyB7eyEtLSBoYW5kbGViYXJzIGNvbW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSAnLS19fSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1lbnQuaW5kZXhPZigne3shJykgPT09IDApIHsgLy8ge3shIGhhbmRsZWJhcnMgY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50Lmxlbmd0aCA9PT0gNSAmJiBjb21tZW50LmluZGV4T2YoJ3t7IS0tJykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlciA9ICd9fSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWVudC5pbmRleE9mKCc8PycpID09PSAwKSB7IC8vIHt7ISBoYW5kbGViYXJzIGNvbW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSAnPz4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21tZW50LmluZGV4T2YoJzwlJykgPT09IDApIHsgLy8ge3shIGhhbmRsZWJhcnMgY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlciA9ICclPic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpbnB1dF9jaGFyID0gdGhpcy5pbnB1dC5jaGFyQXQodGhpcy5wb3MpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcysrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBjb21tZW50O1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gdG9rZW5NYXRjaGVyKGRlbGltaXRlcikge1xuICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdmFyIGFkZCA9IGZ1bmN0aW9uKHN0cikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VG9rZW4gPSB0b2tlbiArIHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IG5ld1Rva2VuLmxlbmd0aCA8PSBkZWxpbWl0ZXIubGVuZ3RoID8gbmV3VG9rZW4gOiBuZXdUb2tlbi5zdWJzdHIobmV3VG9rZW4ubGVuZ3RoIC0gZGVsaW1pdGVyLmxlbmd0aCwgZGVsaW1pdGVyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHZhciBkb2VzTm90TWF0Y2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuLmluZGV4T2YoZGVsaW1pdGVyKSA9PT0gLTE7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGFkZDogYWRkLFxuICAgICAgICAgICAgICAgICAgICBkb2VzTm90TWF0Y2g6IGRvZXNOb3RNYXRjaFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0X3VuZm9ybWF0dGVkID0gZnVuY3Rpb24oZGVsaW1pdGVyLCBvcmlnX3RhZykgeyAvL2Z1bmN0aW9uIHRvIHJldHVybiB1bmZvcm1hdHRlZCBjb250ZW50IGluIGl0cyBlbnRpcmV0eVxuICAgICAgICAgICAgICAgIGlmIChvcmlnX3RhZyAmJiBvcmlnX3RhZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZGVsaW1pdGVyKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaW5wdXRfY2hhciA9ICcnO1xuICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgdmFyIHNwYWNlID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHZhciBkZWxpbWl0ZXJNYXRjaGVyID0gdG9rZW5NYXRjaGVyKGRlbGltaXRlcik7XG5cbiAgICAgICAgICAgICAgICBkbyB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMuaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlucHV0X2NoYXIgPSB0aGlzLmlucHV0LmNoYXJBdCh0aGlzLnBvcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9zKys7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVXRpbHMuaW5fYXJyYXkoaW5wdXRfY2hhciwgdGhpcy5VdGlscy53aGl0ZXNwYWNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZV9jaGFyX2NvdW50LS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRfY2hhciA9PT0gJ1xcbicgfHwgaW5wdXRfY2hhciA9PT0gJ1xccicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBEb24ndCBjaGFuZ2UgdGFiIGluZGVudGlvbiBmb3IgdW5mb3JtYXR0ZWQgYmxvY2tzLiAgSWYgdXNpbmcgY29kZSBmb3IgaHRtbCBlZGl0aW5nLCB0aGlzIHdpbGwgZ3JlYXRseSBhZmZlY3QgPHByZT4gdGFncyBpZiB0aGV5IGFyZSBzcGVjaWZpZWQgaW4gdGhlICd1bmZvcm1hdHRlZCBhcnJheSdcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5pbmRlbnRfbGV2ZWw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgY29udGVudCArPSB0aGlzLmluZGVudF9zdHJpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNwYWNlID0gZmFsc2U7IC8vLi4uYW5kIG1ha2Ugc3VyZSBvdGhlciBpbmRlbnRhdGlvbiBpcyBlcmFzZWRcbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZV9jaGFyX2NvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGlucHV0X2NoYXI7XG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlck1hdGNoZXIuYWRkKGlucHV0X2NoYXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVfY2hhcl9jb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICBzcGFjZSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGVudF9oYW5kbGViYXJzICYmIGlucHV0X2NoYXIgPT09ICd7JyAmJiBjb250ZW50Lmxlbmd0aCAmJiBjb250ZW50LmNoYXJBdChjb250ZW50Lmxlbmd0aCAtIDIpID09PSAneycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZWJhcnMgZXhwcmVzc2lvbnMgaW4gc3RyaW5ncyBzaG91bGQgYWxzbyBiZSB1bmZvcm1hdHRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gdGhpcy5nZXRfdW5mb3JtYXR0ZWQoJ319Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBjb25zaWRlciB3aGVuIHN0b3BwaW5nIGZvciBkZWxpbWl0ZXJzLlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoZGVsaW1pdGVyTWF0Y2hlci5kb2VzTm90TWF0Y2goKSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0X3Rva2VuID0gZnVuY3Rpb24oKSB7IC8vaW5pdGlhbCBoYW5kbGVyIGZvciB0b2tlbi1yZXRyaWV2YWxcbiAgICAgICAgICAgICAgICB2YXIgdG9rZW47XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXN0X3Rva2VuID09PSAnVEtfVEFHX1NDUklQVCcgfHwgdGhpcy5sYXN0X3Rva2VuID09PSAnVEtfVEFHX1NUWUxFJykgeyAvL2NoZWNrIGlmIHdlIG5lZWQgdG8gZm9ybWF0IGphdmFzY3JpcHRcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSB0aGlzLmxhc3RfdG9rZW4uc3Vic3RyKDcpO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0X2NvbnRlbnRzX3RvKHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbdG9rZW4sICdUS18nICsgdHlwZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRfbW9kZSA9PT0gJ0NPTlRFTlQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRfY29udGVudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0b2tlbiwgJ1RLX0NPTlRFTlQnXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRfbW9kZSA9PT0gJ1RBRycpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldF90YWcoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWdfbmFtZV90eXBlID0gJ1RLX1RBR18nICsgdGhpcy50YWdfdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbdG9rZW4sIHRhZ19uYW1lX3R5cGVdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5nZXRfZnVsbF9pbmRlbnQgPSBmdW5jdGlvbihsZXZlbCkge1xuICAgICAgICAgICAgICAgIGxldmVsID0gdGhpcy5pbmRlbnRfbGV2ZWwgKyBsZXZlbCB8fCAwO1xuICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4odGhpcy5pbmRlbnRfc3RyaW5nKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuaXNfdW5mb3JtYXR0ZWQgPSBmdW5jdGlvbih0YWdfY2hlY2ssIHVuZm9ybWF0dGVkKSB7XG4gICAgICAgICAgICAgICAgLy9pcyB0aGlzIGFuIEhUTUw1IGJsb2NrLWxldmVsIGxpbms/XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLlV0aWxzLmluX2FycmF5KHRhZ19jaGVjaywgdW5mb3JtYXR0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGFnX2NoZWNrLnRvTG93ZXJDYXNlKCkgIT09ICdhJyB8fCAhdGhpcy5VdGlscy5pbl9hcnJheSgnYScsIHVuZm9ybWF0dGVkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2F0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbiAgdGFnOyBpcyBpdHMgZmlyc3QgY2hpbGQgc29tZXRoaW5nIHdlIHdhbnQgdG8gcmVtYWluXG4gICAgICAgICAgICAgICAgLy91bmZvcm1hdHRlZD9cbiAgICAgICAgICAgICAgICB2YXIgbmV4dF90YWcgPSB0aGlzLmdldF90YWcodHJ1ZSAvKiBwZWVrLiAqLyApO1xuXG4gICAgICAgICAgICAgICAgLy8gdGVzdCBuZXh0X3RhZyB0byBzZWUgaWYgaXQgaXMganVzdCBodG1sIHRhZyAobm8gZXh0ZXJuYWwgY29udGVudClcbiAgICAgICAgICAgICAgICB2YXIgdGFnID0gKG5leHRfdGFnIHx8IFwiXCIpLm1hdGNoKC9eXFxzKjxcXHMqXFwvPyhbYS16XSopXFxzKltePl0qPlxccyokLyk7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBuZXh0X3RhZyBjb21lcyBiYWNrIGJ1dCBpcyBub3QgYW4gaXNvbGF0ZWQgdGFnLCB0aGVuXG4gICAgICAgICAgICAgICAgLy8gbGV0J3MgdHJlYXQgdGhlICdhJyB0YWcgYXMgaGF2aW5nIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAvLyBhbmQgcmVzcGVjdCB0aGUgdW5mb3JtYXR0ZWQgb3B0aW9uXG4gICAgICAgICAgICAgICAgaWYgKCF0YWcgfHwgdGhpcy5VdGlscy5pbl9hcnJheSh0YWdbMV0sIHVuZm9ybWF0dGVkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5wcmludGVyID0gZnVuY3Rpb24oanNfc291cmNlLCBpbmRlbnRfY2hhcmFjdGVyLCBpbmRlbnRfc2l6ZSwgd3JhcF9saW5lX2xlbmd0aCwgYnJhY2Vfc3R5bGUpIHsgLy9oYW5kbGVzIGlucHV0L291dHB1dCBhbmQgc29tZSBvdGhlciBwcmludGluZyBmdW5jdGlvbnNcblxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBqc19zb3VyY2UgfHwgJyc7IC8vZ2V0cyB0aGUgaW5wdXQgZm9yIHRoZSBQYXJzZXJcblxuICAgICAgICAgICAgICAgIC8vIEhBQ0s6IG5ld2xpbmUgcGFyc2luZyBpbmNvbnNpc3RlbnQuIFRoaXMgYnJ1dGUgZm9yY2Ugbm9ybWFsaXplcyB0aGUgaW5wdXQuXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dCA9IHRoaXMuaW5wdXQucmVwbGFjZSgvXFxyXFxufFtcXHJcXHUyMDI4XFx1MjAyOV0vZywgJ1xcbicpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudF9jaGFyYWN0ZXIgPSBpbmRlbnRfY2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50X3N0cmluZyA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50X3NpemUgPSBpbmRlbnRfc2l6ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyYWNlX3N0eWxlID0gYnJhY2Vfc3R5bGU7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnRfbGV2ZWwgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMud3JhcF9saW5lX2xlbmd0aCA9IHdyYXBfbGluZV9sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lX2NoYXJfY291bnQgPSAwOyAvL2NvdW50IHRvIHNlZSBpZiB3cmFwX2xpbmVfbGVuZ3RoIHdhcyBleGNlZWRlZFxuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmluZGVudF9zaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnRfc3RyaW5nICs9IHRoaXMuaW5kZW50X2NoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnByaW50X25ld2xpbmUgPSBmdW5jdGlvbihmb3JjZSwgYXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZV9jaGFyX2NvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnIgfHwgIWFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9yY2UgfHwgKGFyclthcnIubGVuZ3RoIC0gMV0gIT09ICdcXG4nKSkgeyAvL3dlIG1pZ2h0IHdhbnQgdGhlIGV4dHJhIGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJyW2Fyci5sZW5ndGggLSAxXSAhPT0gJ1xcbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGggLSAxXSA9IHJ0cmltKGFyclthcnIubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goJ1xcbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRoaXMucHJpbnRfaW5kZW50YXRpb24gPSBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmluZGVudF9sZXZlbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLmluZGVudF9zdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lX2NoYXJfY291bnQgKz0gdGhpcy5pbmRlbnRfc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB0aGlzLnByaW50X3Rva2VuID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdm9pZCBwcmludGluZyBpbml0aWFsIHdoaXRlc3BhY2UuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzX3doaXRlc3BhY2UodGV4dCkgJiYgIXRoaXMub3V0cHV0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0IHx8IHRleHQgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vdXRwdXQubGVuZ3RoICYmIHRoaXMub3V0cHV0W3RoaXMub3V0cHV0Lmxlbmd0aCAtIDFdID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbnRfaW5kZW50YXRpb24odGhpcy5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBsdHJpbSh0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByaW50X3Rva2VuX3Jhdyh0ZXh0KTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wcmludF90b2tlbl9yYXcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBnb2luZyB0byBwcmludCBuZXdsaW5lcywgdHJ1bmNhdGUgdHJhaWxpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpdGVzcGFjZSwgYXMgdGhlIG5ld2xpbmVzIHdpbGwgcmVwcmVzZW50IHRoZSBzcGFjZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmV3bGluZXMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcnRyaW0odGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0ICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoID4gMSAmJiB0ZXh0LmNoYXJBdCh0ZXh0Lmxlbmd0aCAtIDEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZm9ybWF0dGVkIHRhZ3MgY2FuIGdyYWIgbmV3bGluZXMgYXMgdGhlaXIgbGFzdCBjaGFyYWN0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dC5wdXNoKHRleHQuc2xpY2UoMCwgLTEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByaW50X25ld2xpbmUoZmFsc2UsIHRoaXMub3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRwdXQucHVzaCh0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgdGhpcy5uZXdsaW5lczsgbisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByaW50X25ld2xpbmUobiA+IDAsIHRoaXMub3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld2xpbmVzID0gMDtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnRfbGV2ZWwrKztcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy51bmluZGVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmRlbnRfbGV2ZWwgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGVudF9sZXZlbC0tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qX19fX19fX19fX19fX19fX19fX19fLS0tLS0tLS0tLS0tLS0tLS0tLS1fX19fX19fX19fX19fX19fX19fX18qL1xuXG4gICAgICAgIG11bHRpX3BhcnNlciA9IG5ldyBQYXJzZXIoKTsgLy93cmFwcGluZyBmdW5jdGlvbnMgUGFyc2VyXG4gICAgICAgIG11bHRpX3BhcnNlci5wcmludGVyKGh0bWxfc291cmNlLCBpbmRlbnRfY2hhcmFjdGVyLCBpbmRlbnRfc2l6ZSwgd3JhcF9saW5lX2xlbmd0aCwgYnJhY2Vfc3R5bGUpOyAvL2luaXRpYWxpemUgc3RhcnRpbmcgdmFsdWVzXG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHZhciB0ID0gbXVsdGlfcGFyc2VyLmdldF90b2tlbigpO1xuICAgICAgICAgICAgbXVsdGlfcGFyc2VyLnRva2VuX3RleHQgPSB0WzBdO1xuICAgICAgICAgICAgbXVsdGlfcGFyc2VyLnRva2VuX3R5cGUgPSB0WzFdO1xuXG4gICAgICAgICAgICBpZiAobXVsdGlfcGFyc2VyLnRva2VuX3R5cGUgPT09ICdUS19FT0YnKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAobXVsdGlfcGFyc2VyLnRva2VuX3R5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdUS19UQUdfU1RBUlQnOlxuICAgICAgICAgICAgICAgICAgICBtdWx0aV9wYXJzZXIucHJpbnRfbmV3bGluZShmYWxzZSwgbXVsdGlfcGFyc2VyLm91dHB1dCk7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpX3BhcnNlci5wcmludF90b2tlbihtdWx0aV9wYXJzZXIudG9rZW5fdGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aV9wYXJzZXIuaW5kZW50X2NvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobXVsdGlfcGFyc2VyLmluZGVudF9ib2R5X2lubmVyX2h0bWwgfHwgIW11bHRpX3BhcnNlci50b2tlbl90ZXh0Lm1hdGNoKC88Ym9keSg/Oi4qKT4vKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobXVsdGlfcGFyc2VyLmluZGVudF9oZWFkX2lubmVyX2h0bWwgfHwgIW11bHRpX3BhcnNlci50b2tlbl90ZXh0Lm1hdGNoKC88aGVhZCg/Oi4qKT4vKSkpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpX3BhcnNlci5pbmRlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlfcGFyc2VyLmluZGVudF9jb250ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXVsdGlfcGFyc2VyLmN1cnJlbnRfbW9kZSA9ICdDT05URU5UJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVEtfVEFHX1NUWUxFJzpcbiAgICAgICAgICAgICAgICBjYXNlICdUS19UQUdfU0NSSVBUJzpcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlfcGFyc2VyLnByaW50X25ld2xpbmUoZmFsc2UsIG11bHRpX3BhcnNlci5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICBtdWx0aV9wYXJzZXIucHJpbnRfdG9rZW4obXVsdGlfcGFyc2VyLnRva2VuX3RleHQpO1xuICAgICAgICAgICAgICAgICAgICBtdWx0aV9wYXJzZXIuY3VycmVudF9tb2RlID0gJ0NPTlRFTlQnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdUS19UQUdfRU5EJzpcbiAgICAgICAgICAgICAgICAgICAgLy9QcmludCBuZXcgbGluZSBvbmx5IGlmIHRoZSB0YWcgaGFzIG5vIGNvbnRlbnQgYW5kIGhhcyBjaGlsZFxuICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlfcGFyc2VyLmxhc3RfdG9rZW4gPT09ICdUS19DT05URU5UJyAmJiBtdWx0aV9wYXJzZXIubGFzdF90ZXh0ID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhZ19uYW1lID0gKG11bHRpX3BhcnNlci50b2tlbl90ZXh0Lm1hdGNoKC9cXHcrLykgfHwgW10pWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhZ19leHRyYWN0ZWRfZnJvbV9sYXN0X291dHB1dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlfcGFyc2VyLm91dHB1dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdfZXh0cmFjdGVkX2Zyb21fbGFzdF9vdXRwdXQgPSBtdWx0aV9wYXJzZXIub3V0cHV0W211bHRpX3BhcnNlci5vdXRwdXQubGVuZ3RoIC0gMV0ubWF0Y2goLyg/Ojx8e3sjKVxccyooXFx3KykvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdfZXh0cmFjdGVkX2Zyb21fbGFzdF9vdXRwdXQgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGFnX2V4dHJhY3RlZF9mcm9tX2xhc3Rfb3V0cHV0WzFdICE9PSB0YWdfbmFtZSAmJiAhbXVsdGlfcGFyc2VyLlV0aWxzLmluX2FycmF5KHRhZ19leHRyYWN0ZWRfZnJvbV9sYXN0X291dHB1dFsxXSwgdW5mb3JtYXR0ZWQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpX3BhcnNlci5wcmludF9uZXdsaW5lKGZhbHNlLCBtdWx0aV9wYXJzZXIub3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtdWx0aV9wYXJzZXIucHJpbnRfdG9rZW4obXVsdGlfcGFyc2VyLnRva2VuX3RleHQpO1xuICAgICAgICAgICAgICAgICAgICBtdWx0aV9wYXJzZXIuY3VycmVudF9tb2RlID0gJ0NPTlRFTlQnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdUS19UQUdfU0lOR0xFJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWRkIGEgbmV3bGluZSBiZWZvcmUgZWxlbWVudHMgdGhhdCBzaG91bGQgcmVtYWluIHVuZm9ybWF0dGVkLlxuICAgICAgICAgICAgICAgICAgICB2YXIgdGFnX2NoZWNrID0gbXVsdGlfcGFyc2VyLnRva2VuX3RleHQubWF0Y2goL15cXHMqPChbYS16LV0rKS9pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdfY2hlY2sgfHwgIW11bHRpX3BhcnNlci5VdGlscy5pbl9hcnJheSh0YWdfY2hlY2tbMV0sIHVuZm9ybWF0dGVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlfcGFyc2VyLnByaW50X25ld2xpbmUoZmFsc2UsIG11bHRpX3BhcnNlci5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG11bHRpX3BhcnNlci5wcmludF90b2tlbihtdWx0aV9wYXJzZXIudG9rZW5fdGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpX3BhcnNlci5jdXJyZW50X21vZGUgPSAnQ09OVEVOVCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1RLX1RBR19IQU5ETEVCQVJTX0VMU0UnOlxuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhZGQgYSBuZXdsaW5lIGlmIG9wZW5pbmcge3sjaWZ9fSB0YWcgaXMgb24gdGhlIGN1cnJlbnQgbGluZVxuICAgICAgICAgICAgICAgICAgICB2YXIgZm91bmRJZk9uQ3VycmVudExpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbGFzdENoZWNrZWRPdXRwdXQgPSBtdWx0aV9wYXJzZXIub3V0cHV0Lmxlbmd0aCAtIDE7IGxhc3RDaGVja2VkT3V0cHV0ID49IDA7IGxhc3RDaGVja2VkT3V0cHV0LS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aV9wYXJzZXIub3V0cHV0W2xhc3RDaGVja2VkT3V0cHV0XSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpX3BhcnNlci5vdXRwdXRbbGFzdENoZWNrZWRPdXRwdXRdLm1hdGNoKC97eyNpZi8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSWZPbkN1cnJlbnRMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRJZk9uQ3VycmVudExpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpX3BhcnNlci5wcmludF9uZXdsaW5lKGZhbHNlLCBtdWx0aV9wYXJzZXIub3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtdWx0aV9wYXJzZXIucHJpbnRfdG9rZW4obXVsdGlfcGFyc2VyLnRva2VuX3RleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlfcGFyc2VyLmluZGVudF9jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aV9wYXJzZXIuaW5kZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aV9wYXJzZXIuaW5kZW50X2NvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtdWx0aV9wYXJzZXIuY3VycmVudF9tb2RlID0gJ0NPTlRFTlQnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdUS19UQUdfSEFORExFQkFSU19DT01NRU5UJzpcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlfcGFyc2VyLnByaW50X3Rva2VuKG11bHRpX3BhcnNlci50b2tlbl90ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlfcGFyc2VyLmN1cnJlbnRfbW9kZSA9ICdUQUcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdUS19DT05URU5UJzpcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlfcGFyc2VyLnByaW50X3Rva2VuKG11bHRpX3BhcnNlci50b2tlbl90ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlfcGFyc2VyLmN1cnJlbnRfbW9kZSA9ICdUQUcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdUS19TVFlMRSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVEtfU0NSSVBUJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpX3BhcnNlci50b2tlbl90ZXh0ICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlfcGFyc2VyLnByaW50X25ld2xpbmUoZmFsc2UsIG11bHRpX3BhcnNlci5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSBtdWx0aV9wYXJzZXIudG9rZW5fdGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYmVhdXRpZmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfaW5kZW50X2xldmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aV9wYXJzZXIudG9rZW5fdHlwZSA9PT0gJ1RLX1NDUklQVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYmVhdXRpZmllciA9IHR5cGVvZiBqc19iZWF1dGlmeSA9PT0gJ2Z1bmN0aW9uJyAmJiBqc19iZWF1dGlmeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXVsdGlfcGFyc2VyLnRva2VuX3R5cGUgPT09ICdUS19TVFlMRScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYmVhdXRpZmllciA9IHR5cGVvZiBjc3NfYmVhdXRpZnkgPT09ICdmdW5jdGlvbicgJiYgY3NzX2JlYXV0aWZ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pbmRlbnRfc2NyaXB0cyA9PT0gXCJrZWVwXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfaW5kZW50X2xldmVsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmRlbnRfc2NyaXB0cyA9PT0gXCJzZXBhcmF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X2luZGVudF9sZXZlbCA9IC1tdWx0aV9wYXJzZXIuaW5kZW50X2xldmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZW50YXRpb24gPSBtdWx0aV9wYXJzZXIuZ2V0X2Z1bGxfaW5kZW50KHNjcmlwdF9pbmRlbnRfbGV2ZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iZWF1dGlmaWVyKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsIHRoZSBCZWF1dGlmaWVyIGlmIGF2YWxpYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDaGlsZF9vcHRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW9sID0gJ1xcbic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGlsZF9vcHRpb25zLnByb3RvdHlwZSA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkX29wdGlvbnMgPSBuZXcgQ2hpbGRfb3B0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBfYmVhdXRpZmllcih0ZXh0LnJlcGxhY2UoL15cXHMqLywgaW5kZW50YXRpb24pLCBjaGlsZF9vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGx5IGluZGVudCB0aGUgc3RyaW5nIG90aGVyd2lzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aGl0ZSA9IHRleHQubWF0Y2goL15cXHMqLylbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9sZXZlbCA9IHdoaXRlLm1hdGNoKC9bXlxcblxccl0qJC8pWzBdLnNwbGl0KG11bHRpX3BhcnNlci5pbmRlbnRfc3RyaW5nKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWluZGVudCA9IG11bHRpX3BhcnNlci5nZXRfZnVsbF9pbmRlbnQoc2NyaXB0X2luZGVudF9sZXZlbCAtIF9sZXZlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXlxccyovLCBpbmRlbnRhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcclxcbnxcXHJ8XFxuL2csICdcXG4nICsgcmVpbmRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXHMrJC8sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlfcGFyc2VyLnByaW50X3Rva2VuX3Jhdyh0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aV9wYXJzZXIucHJpbnRfbmV3bGluZSh0cnVlLCBtdWx0aV9wYXJzZXIub3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtdWx0aV9wYXJzZXIuY3VycmVudF9tb2RlID0gJ1RBRyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgYmUgZ2V0dGluZyBoZXJlIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGRyb3AgaW5wdXQgb24gdGhlIGZsb29yXG4gICAgICAgICAgICAgICAgICAgIC8vIEp1c3Qgb3V0cHV0IHRoZSB0ZXh0IGFuZCBtb3ZlIG9uXG4gICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aV9wYXJzZXIudG9rZW5fdGV4dCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpX3BhcnNlci5wcmludF90b2tlbihtdWx0aV9wYXJzZXIudG9rZW5fdGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtdWx0aV9wYXJzZXIubGFzdF90b2tlbiA9IG11bHRpX3BhcnNlci50b2tlbl90eXBlO1xuICAgICAgICAgICAgbXVsdGlfcGFyc2VyLmxhc3RfdGV4dCA9IG11bHRpX3BhcnNlci50b2tlbl90ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBzd2VldF9jb2RlID0gbXVsdGlfcGFyc2VyLm91dHB1dC5qb2luKCcnKS5yZXBsYWNlKC9bXFxyXFxuXFx0IF0rJC8sICcnKTtcblxuICAgICAgICAvLyBlc3RhYmxpc2ggZW5kX3dpdGhfbmV3bGluZVxuICAgICAgICBpZiAoZW5kX3dpdGhfbmV3bGluZSkge1xuICAgICAgICAgICAgc3dlZXRfY29kZSArPSAnXFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlb2wgIT09ICdcXG4nKSB7XG4gICAgICAgICAgICBzd2VldF9jb2RlID0gc3dlZXRfY29kZS5yZXBsYWNlKC9bXFxuXS9nLCBlb2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN3ZWV0X2NvZGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFkZCBzdXBwb3J0IGZvciBBTUQgKCBodHRwczovL2dpdGh1Yi5jb20vYW1kanMvYW1kanMtYXBpL3dpa2kvQU1EI2RlZmluZWFtZC1wcm9wZXJ0eS0gKVxuICAgICAgICBkZWZpbmUoW1wicmVxdWlyZVwiLCBcIi4vYmVhdXRpZnlcIiwgXCIuL2JlYXV0aWZ5LWNzc1wiXSwgZnVuY3Rpb24ocmVxdWlyZWFtZCkge1xuICAgICAgICAgICAgdmFyIGpzX2JlYXV0aWZ5ID0gcmVxdWlyZWFtZChcIi4vYmVhdXRpZnlcIik7XG4gICAgICAgICAgICB2YXIgY3NzX2JlYXV0aWZ5ID0gcmVxdWlyZWFtZChcIi4vYmVhdXRpZnktY3NzXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGh0bWxfYmVhdXRpZnk6IGZ1bmN0aW9uKGh0bWxfc291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZV9odG1sKGh0bWxfc291cmNlLCBvcHRpb25zLCBqc19iZWF1dGlmeS5qc19iZWF1dGlmeSwgY3NzX2JlYXV0aWZ5LmNzc19iZWF1dGlmeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAvLyBBZGQgc3VwcG9ydCBmb3IgQ29tbW9uSlMuIEp1c3QgcHV0IHRoaXMgZmlsZSBzb21ld2hlcmUgb24geW91ciByZXF1aXJlLnBhdGhzXG4gICAgICAgIC8vIGFuZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGB2YXIgaHRtbF9iZWF1dGlmeSA9IHJlcXVpcmUoXCJiZWF1dGlmeVwiKS5odG1sX2JlYXV0aWZ5YC5cbiAgICAgICAgdmFyIGpzX2JlYXV0aWZ5ID0gcmVxdWlyZSgnLi9iZWF1dGlmeS5qcycpO1xuICAgICAgICB2YXIgY3NzX2JlYXV0aWZ5ID0gcmVxdWlyZSgnLi9iZWF1dGlmeS1jc3MuanMnKTtcblxuICAgICAgICBleHBvcnRzLmh0bWxfYmVhdXRpZnkgPSBmdW5jdGlvbihodG1sX3NvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlX2h0bWwoaHRtbF9zb3VyY2UsIG9wdGlvbnMsIGpzX2JlYXV0aWZ5LmpzX2JlYXV0aWZ5LCBjc3NfYmVhdXRpZnkuY3NzX2JlYXV0aWZ5KTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgLy8gSWYgd2UncmUgcnVubmluZyBhIHdlYiBwYWdlIGFuZCBkb24ndCBoYXZlIGVpdGhlciBvZiB0aGUgYWJvdmUsIGFkZCBvdXIgb25lIGdsb2JhbFxuICAgICAgICB3aW5kb3cuaHRtbF9iZWF1dGlmeSA9IGZ1bmN0aW9uKGh0bWxfc291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gc3R5bGVfaHRtbChodG1sX3NvdXJjZSwgb3B0aW9ucywgd2luZG93LmpzX2JlYXV0aWZ5LCB3aW5kb3cuY3NzX2JlYXV0aWZ5KTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgZXZlbiBoYXZlIHdpbmRvdywgdHJ5IGdsb2JhbC5cbiAgICAgICAgZ2xvYmFsLmh0bWxfYmVhdXRpZnkgPSBmdW5jdGlvbihodG1sX3NvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlX2h0bWwoaHRtbF9zb3VyY2UsIG9wdGlvbnMsIGdsb2JhbC5qc19iZWF1dGlmeSwgZ2xvYmFsLmNzc19iZWF1dGlmeSk7XG4gICAgICAgIH07XG4gICAgfVxuXG59KCkpOyIsIi8qanNoaW50IGN1cmx5OnRydWUsIGVxZXFlcTp0cnVlLCBsYXhicmVhazp0cnVlLCBub2VtcHR5OmZhbHNlICovXG4vKlxuXG4gIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuXG4gIENvcHlyaWdodCAoYykgMjAwNy0yMDE3IEVpbmFyIExpZWxtYW5pcywgTGlhbSBOZXdtYW4sIGFuZCBjb250cmlidXRvcnMuXG5cbiAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb25cbiAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbiAgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLFxuICBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLFxuICBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuICBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuICBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0ZcbiAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbiAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSU1xuICBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU5cbiAgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU5cbiAgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICBTT0ZUV0FSRS5cblxuIEpTIEJlYXV0aWZpZXJcbi0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgV3JpdHRlbiBieSBFaW5hciBMaWVsbWFuaXMsIDxlaW5hckBqc2JlYXV0aWZpZXIub3JnPlxuICAgICAgaHR0cDovL2pzYmVhdXRpZmllci5vcmcvXG5cbiAgT3JpZ2luYWxseSBjb252ZXJ0ZWQgdG8gamF2YXNjcmlwdCBieSBWaXRhbCwgPHZpdGFsNzZAZ21haWwuY29tPlxuICBcIkVuZCBicmFjZXMgb24gb3duIGxpbmVcIiBhZGRlZCBieSBDaHJpcyBKLiBTaHVsbCwgPGNocmlzanNodWxsQGdtYWlsLmNvbT5cbiAgUGFyc2luZyBpbXByb3ZlbWVudHMgZm9yIGJyYWNlLWxlc3Mgc3RhdGVtZW50cyBieSBMaWFtIE5ld21hbiA8Yml0d2lzZW1hbkBnbWFpbC5jb20+XG5cblxuICBVc2FnZTpcbiAgICBqc19iZWF1dGlmeShqc19zb3VyY2VfdGV4dCk7XG4gICAganNfYmVhdXRpZnkoanNfc291cmNlX3RleHQsIG9wdGlvbnMpO1xuXG4gIFRoZSBvcHRpb25zIGFyZTpcbiAgICBpbmRlbnRfc2l6ZSAoZGVmYXVsdCA0KSAgICAgICAgICAtIGluZGVudGF0aW9uIHNpemUsXG4gICAgaW5kZW50X2NoYXIgKGRlZmF1bHQgc3BhY2UpICAgICAgLSBjaGFyYWN0ZXIgdG8gaW5kZW50IHdpdGgsXG4gICAgcHJlc2VydmVfbmV3bGluZXMgKGRlZmF1bHQgdHJ1ZSkgLSB3aGV0aGVyIGV4aXN0aW5nIGxpbmUgYnJlYWtzIHNob3VsZCBiZSBwcmVzZXJ2ZWQsXG4gICAgbWF4X3ByZXNlcnZlX25ld2xpbmVzIChkZWZhdWx0IHVubGltaXRlZCkgLSBtYXhpbXVtIG51bWJlciBvZiBsaW5lIGJyZWFrcyB0byBiZSBwcmVzZXJ2ZWQgaW4gb25lIGNodW5rLFxuXG4gICAganNsaW50X2hhcHB5IChkZWZhdWx0IGZhbHNlKSAtIGlmIHRydWUsIHRoZW4ganNsaW50LXN0cmljdGVyIG1vZGUgaXMgZW5mb3JjZWQuXG5cbiAgICAgICAgICAgIGpzbGludF9oYXBweSAgICAgICAgIWpzbGludF9oYXBweVxuICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSAgICAgICAgIGZ1bmN0aW9uKClcblxuICAgICAgICAgICAgc3dpdGNoICgpIHsgICAgICAgICBzd2l0Y2goKSB7XG4gICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIH1cblxuICAgIHNwYWNlX2FmdGVyX2Fub25fZnVuY3Rpb24gKGRlZmF1bHQgZmFsc2UpIC0gc2hvdWxkIHRoZSBzcGFjZSBiZWZvcmUgYW4gYW5vbnltb3VzIGZ1bmN0aW9uJ3MgcGFyZW5zIGJlIGFkZGVkLCBcImZ1bmN0aW9uKClcIiB2cyBcImZ1bmN0aW9uICgpXCIsXG4gICAgICAgICAgTk9URTogVGhpcyBvcHRpb24gaXMgb3ZlcnJpZGVuIGJ5IGpzbGludF9oYXBweSAoaS5lLiBpZiBqc2xpbnRfaGFwcHkgaXMgdHJ1ZSwgc3BhY2VfYWZ0ZXJfYW5vbl9mdW5jdGlvbiBpcyB0cnVlIGJ5IGRlc2lnbilcblxuICAgIGJyYWNlX3N0eWxlIChkZWZhdWx0IFwiY29sbGFwc2VcIikgLSBcImNvbGxhcHNlXCIgfCBcImV4cGFuZFwiIHwgXCJlbmQtZXhwYW5kXCIgfCBcIm5vbmVcIiB8IGFueSBvZiB0aGUgZm9ybWVyICsgXCIscHJlc2VydmUtaW5saW5lXCJcbiAgICAgICAgICAgIHB1dCBicmFjZXMgb24gdGhlIHNhbWUgbGluZSBhcyBjb250cm9sIHN0YXRlbWVudHMgKGRlZmF1bHQpLCBvciBwdXQgYnJhY2VzIG9uIG93biBsaW5lIChBbGxtYW4gLyBBTlNJIHN0eWxlKSwgb3IganVzdCBwdXQgZW5kIGJyYWNlcyBvbiBvd24gbGluZSwgb3IgYXR0ZW1wdCB0byBrZWVwIHRoZW0gd2hlcmUgdGhleSBhcmUuXG4gICAgICAgICAgICBwcmVzZXJ2ZS1pbmxpbmUgd2lsbCB0cnkgdG8gcHJlc2VydmUgaW5saW5lIGJsb2NrcyBvZiBjdXJseSBicmFjZXNcblxuICAgIHNwYWNlX2JlZm9yZV9jb25kaXRpb25hbCAoZGVmYXVsdCB0cnVlKSAtIHNob3VsZCB0aGUgc3BhY2UgYmVmb3JlIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBiZSBhZGRlZCwgXCJpZih0cnVlKVwiIHZzIFwiaWYgKHRydWUpXCIsXG5cbiAgICB1bmVzY2FwZV9zdHJpbmdzIChkZWZhdWx0IGZhbHNlKSAtIHNob3VsZCBwcmludGFibGUgY2hhcmFjdGVycyBpbiBzdHJpbmdzIGVuY29kZWQgaW4gXFx4Tk4gbm90YXRpb24gYmUgdW5lc2NhcGVkLCBcImV4YW1wbGVcIiB2cyBcIlxceDY1XFx4NzhcXHg2MVxceDZkXFx4NzBcXHg2Y1xceDY1XCJcblxuICAgIHdyYXBfbGluZV9sZW5ndGggKGRlZmF1bHQgdW5saW1pdGVkKSAtIGxpbmVzIHNob3VsZCB3cmFwIGF0IG5leHQgb3Bwb3J0dW5pdHkgYWZ0ZXIgdGhpcyBudW1iZXIgb2YgY2hhcmFjdGVycy5cbiAgICAgICAgICBOT1RFOiBUaGlzIGlzIG5vdCBhIGhhcmQgbGltaXQuIExpbmVzIHdpbGwgY29udGludWUgdW50aWwgYSBwb2ludCB3aGVyZSBhIG5ld2xpbmUgd291bGRcbiAgICAgICAgICAgICAgICBiZSBwcmVzZXJ2ZWQgaWYgaXQgd2VyZSBwcmVzZW50LlxuXG4gICAgZW5kX3dpdGhfbmV3bGluZSAoZGVmYXVsdCBmYWxzZSkgIC0gZW5kIG91dHB1dCB3aXRoIGEgbmV3bGluZVxuXG5cbiAgICBlLmdcblxuICAgIGpzX2JlYXV0aWZ5KGpzX3NvdXJjZV90ZXh0LCB7XG4gICAgICAnaW5kZW50X3NpemUnOiAxLFxuICAgICAgJ2luZGVudF9jaGFyJzogJ1xcdCdcbiAgICB9KTtcblxuKi9cblxuLy8gT2JqZWN0LnZhbHVlcyBwb2x5ZmlsbCBmb3VuZCBoZXJlOlxuLy8gaHR0cDovL3Rva2VucG9zdHMuYmxvZ3Nwb3QuY29tLmF1LzIwMTIvMDQvamF2YXNjcmlwdC1vYmplY3RrZXlzLWJyb3dzZXIuaHRtbFxuaWYgKCFPYmplY3QudmFsdWVzKSB7XG4gICAgT2JqZWN0LnZhbHVlcyA9IGZ1bmN0aW9uKG8pIHtcbiAgICAgICAgaWYgKG8gIT09IE9iamVjdChvKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LnZhbHVlcyBjYWxsZWQgb24gYSBub24tb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGsgPSBbXSxcbiAgICAgICAgICAgIHA7XG4gICAgICAgIGZvciAocCBpbiBvKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSB7XG4gICAgICAgICAgICAgICAgay5wdXNoKG9bcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrO1xuICAgIH07XG59XG5cbihmdW5jdGlvbigpIHtcblxuICAgIGZ1bmN0aW9uIG1lcmdlT3B0cyhhbGxPcHRpb25zLCB0YXJnZXRUeXBlKSB7XG4gICAgICAgIHZhciBmaW5hbE9wdHMgPSB7fTtcbiAgICAgICAgdmFyIG5hbWU7XG5cbiAgICAgICAgZm9yIChuYW1lIGluIGFsbE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChuYW1lICE9PSB0YXJnZXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgZmluYWxPcHRzW25hbWVdID0gYWxsT3B0aW9uc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vbWVyZ2UgaW4gdGhlIHBlciB0eXBlIHNldHRpbmdzIGZvciB0aGUgdGFyZ2V0VHlwZVxuICAgICAgICBpZiAodGFyZ2V0VHlwZSBpbiBhbGxPcHRpb25zKSB7XG4gICAgICAgICAgICBmb3IgKG5hbWUgaW4gYWxsT3B0aW9uc1t0YXJnZXRUeXBlXSkge1xuICAgICAgICAgICAgICAgIGZpbmFsT3B0c1tuYW1lXSA9IGFsbE9wdGlvbnNbdGFyZ2V0VHlwZV1bbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmFsT3B0cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBqc19iZWF1dGlmeShqc19zb3VyY2VfdGV4dCwgb3B0aW9ucykge1xuXG4gICAgICAgIHZhciBhY29ybiA9IHt9O1xuICAgICAgICAoZnVuY3Rpb24oZXhwb3J0cykge1xuICAgICAgICAgICAgLyoganNoaW50IGN1cmx5OiBmYWxzZSAqL1xuICAgICAgICAgICAgLy8gVGhpcyBzZWN0aW9uIG9mIGNvZGUgaXMgdGFrZW4gZnJvbSBhY29ybi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBBY29ybiB3YXMgd3JpdHRlbiBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCByZWxlYXNlZCB1bmRlciBhbiBNSVRcbiAgICAgICAgICAgIC8vIGxpY2Vuc2UuIFRoZSBVbmljb2RlIHJlZ2V4cHMgKGZvciBpZGVudGlmaWVycyBhbmQgd2hpdGVzcGFjZSkgd2VyZVxuICAgICAgICAgICAgLy8gdGFrZW4gZnJvbSBbRXNwcmltYV0oaHR0cDovL2VzcHJpbWEub3JnKSBieSBBcml5YSBIaWRheWF0LlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEdpdCByZXBvc2l0b3JpZXMgZm9yIEFjb3JuIGFyZSBhdmFpbGFibGUgYXRcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvYWNvcm5cbiAgICAgICAgICAgIC8vICAgICBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9hY29ybi5naXRcblxuICAgICAgICAgICAgLy8gIyMgQ2hhcmFjdGVyIGNhdGVnb3JpZXNcblxuICAgICAgICAgICAgLy8gQmlnIHVnbHkgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IG1hdGNoIGNoYXJhY3RlcnMgaW4gdGhlXG4gICAgICAgICAgICAvLyB3aGl0ZXNwYWNlLCBpZGVudGlmaWVyLCBhbmQgaWRlbnRpZmllci1zdGFydCBjYXRlZ29yaWVzLiBUaGVzZVxuICAgICAgICAgICAgLy8gYXJlIG9ubHkgYXBwbGllZCB3aGVuIGEgY2hhcmFjdGVyIGlzIGZvdW5kIHRvIGFjdHVhbGx5IGhhdmUgYVxuICAgICAgICAgICAgLy8gY29kZSBwb2ludCBhYm92ZSAxMjguXG5cbiAgICAgICAgICAgIHZhciBub25BU0NJSXdoaXRlc3BhY2UgPSAvW1xcdTE2ODBcXHUxODBlXFx1MjAwMC1cXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1ZmVmZl0vOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIHZhciBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzID0gXCJcXHhhYVxceGI1XFx4YmFcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJjMVxcdTAyYzYtXFx1MDJkMVxcdTAyZTAtXFx1MDJlNFxcdTAyZWNcXHUwMmVlXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdhLVxcdTAzN2RcXHUwMzg2XFx1MDM4OC1cXHUwMzhhXFx1MDM4Y1xcdTAzOGUtXFx1MDNhMVxcdTAzYTMtXFx1MDNmNVxcdTAzZjctXFx1MDQ4MVxcdTA0OGEtXFx1MDUyN1xcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNWQwLVxcdTA1ZWFcXHUwNWYwLVxcdTA1ZjJcXHUwNjIwLVxcdTA2NGFcXHUwNjZlXFx1MDY2ZlxcdTA2NzEtXFx1MDZkM1xcdTA2ZDVcXHUwNmU1XFx1MDZlNlxcdTA2ZWVcXHUwNmVmXFx1MDZmYS1cXHUwNmZjXFx1MDZmZlxcdTA3MTBcXHUwNzEyLVxcdTA3MmZcXHUwNzRkLVxcdTA3YTVcXHUwN2IxXFx1MDdjYS1cXHUwN2VhXFx1MDdmNFxcdTA3ZjVcXHUwN2ZhXFx1MDgwMC1cXHUwODE1XFx1MDgxYVxcdTA4MjRcXHUwODI4XFx1MDg0MC1cXHUwODU4XFx1MDhhMFxcdTA4YTItXFx1MDhhY1xcdTA5MDQtXFx1MDkzOVxcdTA5M2RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTc3XFx1MDk3OS1cXHUwOTdmXFx1MDk4NS1cXHUwOThjXFx1MDk4ZlxcdTA5OTBcXHUwOTkzLVxcdTA5YThcXHUwOWFhLVxcdTA5YjBcXHUwOWIyXFx1MDliNi1cXHUwOWI5XFx1MDliZFxcdTA5Y2VcXHUwOWRjXFx1MDlkZFxcdTA5ZGYtXFx1MDllMVxcdTA5ZjBcXHUwOWYxXFx1MGEwNS1cXHUwYTBhXFx1MGEwZlxcdTBhMTBcXHUwYTEzLVxcdTBhMjhcXHUwYTJhLVxcdTBhMzBcXHUwYTMyXFx1MGEzM1xcdTBhMzVcXHUwYTM2XFx1MGEzOFxcdTBhMzlcXHUwYTU5LVxcdTBhNWNcXHUwYTVlXFx1MGE3Mi1cXHUwYTc0XFx1MGE4NS1cXHUwYThkXFx1MGE4Zi1cXHUwYTkxXFx1MGE5My1cXHUwYWE4XFx1MGFhYS1cXHUwYWIwXFx1MGFiMlxcdTBhYjNcXHUwYWI1LVxcdTBhYjlcXHUwYWJkXFx1MGFkMFxcdTBhZTBcXHUwYWUxXFx1MGIwNS1cXHUwYjBjXFx1MGIwZlxcdTBiMTBcXHUwYjEzLVxcdTBiMjhcXHUwYjJhLVxcdTBiMzBcXHUwYjMyXFx1MGIzM1xcdTBiMzUtXFx1MGIzOVxcdTBiM2RcXHUwYjVjXFx1MGI1ZFxcdTBiNWYtXFx1MGI2MVxcdTBiNzFcXHUwYjgzXFx1MGI4NS1cXHUwYjhhXFx1MGI4ZS1cXHUwYjkwXFx1MGI5Mi1cXHUwYjk1XFx1MGI5OVxcdTBiOWFcXHUwYjljXFx1MGI5ZVxcdTBiOWZcXHUwYmEzXFx1MGJhNFxcdTBiYTgtXFx1MGJhYVxcdTBiYWUtXFx1MGJiOVxcdTBiZDBcXHUwYzA1LVxcdTBjMGNcXHUwYzBlLVxcdTBjMTBcXHUwYzEyLVxcdTBjMjhcXHUwYzJhLVxcdTBjMzNcXHUwYzM1LVxcdTBjMzlcXHUwYzNkXFx1MGM1OFxcdTBjNTlcXHUwYzYwXFx1MGM2MVxcdTBjODUtXFx1MGM4Y1xcdTBjOGUtXFx1MGM5MFxcdTBjOTItXFx1MGNhOFxcdTBjYWEtXFx1MGNiM1xcdTBjYjUtXFx1MGNiOVxcdTBjYmRcXHUwY2RlXFx1MGNlMFxcdTBjZTFcXHUwY2YxXFx1MGNmMlxcdTBkMDUtXFx1MGQwY1xcdTBkMGUtXFx1MGQxMFxcdTBkMTItXFx1MGQzYVxcdTBkM2RcXHUwZDRlXFx1MGQ2MFxcdTBkNjFcXHUwZDdhLVxcdTBkN2ZcXHUwZDg1LVxcdTBkOTZcXHUwZDlhLVxcdTBkYjFcXHUwZGIzLVxcdTBkYmJcXHUwZGJkXFx1MGRjMC1cXHUwZGM2XFx1MGUwMS1cXHUwZTMwXFx1MGUzMlxcdTBlMzNcXHUwZTQwLVxcdTBlNDZcXHUwZTgxXFx1MGU4MlxcdTBlODRcXHUwZTg3XFx1MGU4OFxcdTBlOGFcXHUwZThkXFx1MGU5NC1cXHUwZTk3XFx1MGU5OS1cXHUwZTlmXFx1MGVhMS1cXHUwZWEzXFx1MGVhNVxcdTBlYTdcXHUwZWFhXFx1MGVhYlxcdTBlYWQtXFx1MGViMFxcdTBlYjJcXHUwZWIzXFx1MGViZFxcdTBlYzAtXFx1MGVjNFxcdTBlYzZcXHUwZWRjLVxcdTBlZGZcXHUwZjAwXFx1MGY0MC1cXHUwZjQ3XFx1MGY0OS1cXHUwZjZjXFx1MGY4OC1cXHUwZjhjXFx1MTAwMC1cXHUxMDJhXFx1MTAzZlxcdTEwNTAtXFx1MTA1NVxcdTEwNWEtXFx1MTA1ZFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNmUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOGVcXHUxMGEwLVxcdTEwYzVcXHUxMGM3XFx1MTBjZFxcdTEwZDAtXFx1MTBmYVxcdTEwZmMtXFx1MTI0OFxcdTEyNGEtXFx1MTI0ZFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVhLVxcdTEyNWRcXHUxMjYwLVxcdTEyODhcXHUxMjhhLVxcdTEyOGRcXHUxMjkwLVxcdTEyYjBcXHUxMmIyLVxcdTEyYjVcXHUxMmI4LVxcdTEyYmVcXHUxMmMwXFx1MTJjMi1cXHUxMmM1XFx1MTJjOC1cXHUxMmQ2XFx1MTJkOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVhXFx1MTM4MC1cXHUxMzhmXFx1MTNhMC1cXHUxM2Y0XFx1MTQwMS1cXHUxNjZjXFx1MTY2Zi1cXHUxNjdmXFx1MTY4MS1cXHUxNjlhXFx1MTZhMC1cXHUxNmVhXFx1MTZlZS1cXHUxNmYwXFx1MTcwMC1cXHUxNzBjXFx1MTcwZS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZjXFx1MTc2ZS1cXHUxNzcwXFx1MTc4MC1cXHUxN2IzXFx1MTdkN1xcdTE3ZGNcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4YThcXHUxOGFhXFx1MThiMC1cXHUxOGY1XFx1MTkwMC1cXHUxOTFjXFx1MTk1MC1cXHUxOTZkXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOWFiXFx1MTljMS1cXHUxOWM3XFx1MWEwMC1cXHUxYTE2XFx1MWEyMC1cXHUxYTU0XFx1MWFhN1xcdTFiMDUtXFx1MWIzM1xcdTFiNDUtXFx1MWI0YlxcdTFiODMtXFx1MWJhMFxcdTFiYWVcXHUxYmFmXFx1MWJiYS1cXHUxYmU1XFx1MWMwMC1cXHUxYzIzXFx1MWM0ZC1cXHUxYzRmXFx1MWM1YS1cXHUxYzdkXFx1MWNlOS1cXHUxY2VjXFx1MWNlZS1cXHUxY2YxXFx1MWNmNVxcdTFjZjZcXHUxZDAwLVxcdTFkYmZcXHUxZTAwLVxcdTFmMTVcXHUxZjE4LVxcdTFmMWRcXHUxZjIwLVxcdTFmNDVcXHUxZjQ4LVxcdTFmNGRcXHUxZjUwLVxcdTFmNTdcXHUxZjU5XFx1MWY1YlxcdTFmNWRcXHUxZjVmLVxcdTFmN2RcXHUxZjgwLVxcdTFmYjRcXHUxZmI2LVxcdTFmYmNcXHUxZmJlXFx1MWZjMi1cXHUxZmM0XFx1MWZjNi1cXHUxZmNjXFx1MWZkMC1cXHUxZmQzXFx1MWZkNi1cXHUxZmRiXFx1MWZlMC1cXHUxZmVjXFx1MWZmMi1cXHUxZmY0XFx1MWZmNi1cXHUxZmZjXFx1MjA3MVxcdTIwN2ZcXHUyMDkwLVxcdTIwOWNcXHUyMTAyXFx1MjEwN1xcdTIxMGEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMWRcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJhLVxcdTIxMmRcXHUyMTJmLVxcdTIxMzlcXHUyMTNjLVxcdTIxM2ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRlXFx1MjE2MC1cXHUyMTg4XFx1MmMwMC1cXHUyYzJlXFx1MmMzMC1cXHUyYzVlXFx1MmM2MC1cXHUyY2U0XFx1MmNlYi1cXHUyY2VlXFx1MmNmMlxcdTJjZjNcXHUyZDAwLVxcdTJkMjVcXHUyZDI3XFx1MmQyZFxcdTJkMzAtXFx1MmQ2N1xcdTJkNmZcXHUyZDgwLVxcdTJkOTZcXHUyZGEwLVxcdTJkYTZcXHUyZGE4LVxcdTJkYWVcXHUyZGIwLVxcdTJkYjZcXHUyZGI4LVxcdTJkYmVcXHUyZGMwLVxcdTJkYzZcXHUyZGM4LVxcdTJkY2VcXHUyZGQwLVxcdTJkZDZcXHUyZGQ4LVxcdTJkZGVcXHUyZTJmXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNjXFx1MzA0MS1cXHUzMDk2XFx1MzA5ZC1cXHUzMDlmXFx1MzBhMS1cXHUzMGZhXFx1MzBmYy1cXHUzMGZmXFx1MzEwNS1cXHUzMTJkXFx1MzEzMS1cXHUzMThlXFx1MzFhMC1cXHUzMWJhXFx1MzFmMC1cXHUzMWZmXFx1MzQwMC1cXHU0ZGI1XFx1NGUwMC1cXHU5ZmNjXFx1YTAwMC1cXHVhNDhjXFx1YTRkMC1cXHVhNGZkXFx1YTUwMC1cXHVhNjBjXFx1YTYxMC1cXHVhNjFmXFx1YTYyYVxcdWE2MmJcXHVhNjQwLVxcdWE2NmVcXHVhNjdmLVxcdWE2OTdcXHVhNmEwLVxcdWE2ZWZcXHVhNzE3LVxcdWE3MWZcXHVhNzIyLVxcdWE3ODhcXHVhNzhiLVxcdWE3OGVcXHVhNzkwLVxcdWE3OTNcXHVhN2EwLVxcdWE3YWFcXHVhN2Y4LVxcdWE4MDFcXHVhODAzLVxcdWE4MDVcXHVhODA3LVxcdWE4MGFcXHVhODBjLVxcdWE4MjJcXHVhODQwLVxcdWE4NzNcXHVhODgyLVxcdWE4YjNcXHVhOGYyLVxcdWE4ZjdcXHVhOGZiXFx1YTkwYS1cXHVhOTI1XFx1YTkzMC1cXHVhOTQ2XFx1YTk2MC1cXHVhOTdjXFx1YTk4NC1cXHVhOWIyXFx1YTljZlxcdWFhMDAtXFx1YWEyOFxcdWFhNDAtXFx1YWE0MlxcdWFhNDQtXFx1YWE0YlxcdWFhNjAtXFx1YWE3NlxcdWFhN2FcXHVhYTgwLVxcdWFhYWZcXHVhYWIxXFx1YWFiNVxcdWFhYjZcXHVhYWI5LVxcdWFhYmRcXHVhYWMwXFx1YWFjMlxcdWFhZGItXFx1YWFkZFxcdWFhZTAtXFx1YWFlYVxcdWFhZjItXFx1YWFmNFxcdWFiMDEtXFx1YWIwNlxcdWFiMDktXFx1YWIwZVxcdWFiMTEtXFx1YWIxNlxcdWFiMjAtXFx1YWIyNlxcdWFiMjgtXFx1YWIyZVxcdWFiYzAtXFx1YWJlMlxcdWFjMDAtXFx1ZDdhM1xcdWQ3YjAtXFx1ZDdjNlxcdWQ3Y2ItXFx1ZDdmYlxcdWY5MDAtXFx1ZmE2ZFxcdWZhNzAtXFx1ZmFkOVxcdWZiMDAtXFx1ZmIwNlxcdWZiMTMtXFx1ZmIxN1xcdWZiMWRcXHVmYjFmLVxcdWZiMjhcXHVmYjJhLVxcdWZiMzZcXHVmYjM4LVxcdWZiM2NcXHVmYjNlXFx1ZmI0MFxcdWZiNDFcXHVmYjQzXFx1ZmI0NFxcdWZiNDYtXFx1ZmJiMVxcdWZiZDMtXFx1ZmQzZFxcdWZkNTAtXFx1ZmQ4ZlxcdWZkOTItXFx1ZmRjN1xcdWZkZjAtXFx1ZmRmYlxcdWZlNzAtXFx1ZmU3NFxcdWZlNzYtXFx1ZmVmY1xcdWZmMjEtXFx1ZmYzYVxcdWZmNDEtXFx1ZmY1YVxcdWZmNjYtXFx1ZmZiZVxcdWZmYzItXFx1ZmZjN1xcdWZmY2EtXFx1ZmZjZlxcdWZmZDItXFx1ZmZkN1xcdWZmZGEtXFx1ZmZkY1wiO1xuICAgICAgICAgICAgdmFyIG5vbkFTQ0lJaWRlbnRpZmllckNoYXJzID0gXCJcXHUwMzAwLVxcdTAzNmZcXHUwNDgzLVxcdTA0ODdcXHUwNTkxLVxcdTA1YmRcXHUwNWJmXFx1MDVjMVxcdTA1YzJcXHUwNWM0XFx1MDVjNVxcdTA1YzdcXHUwNjEwLVxcdTA2MWFcXHUwNjIwLVxcdTA2NDlcXHUwNjcyLVxcdTA2ZDNcXHUwNmU3LVxcdTA2ZThcXHUwNmZiLVxcdTA2ZmNcXHUwNzMwLVxcdTA3NGFcXHUwODAwLVxcdTA4MTRcXHUwODFiLVxcdTA4MjNcXHUwODI1LVxcdTA4MjdcXHUwODI5LVxcdTA4MmRcXHUwODQwLVxcdTA4NTdcXHUwOGU0LVxcdTA4ZmVcXHUwOTAwLVxcdTA5MDNcXHUwOTNhLVxcdTA5M2NcXHUwOTNlLVxcdTA5NGZcXHUwOTUxLVxcdTA5NTdcXHUwOTYyLVxcdTA5NjNcXHUwOTY2LVxcdTA5NmZcXHUwOTgxLVxcdTA5ODNcXHUwOWJjXFx1MDliZS1cXHUwOWM0XFx1MDljN1xcdTA5YzhcXHUwOWQ3XFx1MDlkZi1cXHUwOWUwXFx1MGEwMS1cXHUwYTAzXFx1MGEzY1xcdTBhM2UtXFx1MGE0MlxcdTBhNDdcXHUwYTQ4XFx1MGE0Yi1cXHUwYTRkXFx1MGE1MVxcdTBhNjYtXFx1MGE3MVxcdTBhNzVcXHUwYTgxLVxcdTBhODNcXHUwYWJjXFx1MGFiZS1cXHUwYWM1XFx1MGFjNy1cXHUwYWM5XFx1MGFjYi1cXHUwYWNkXFx1MGFlMi1cXHUwYWUzXFx1MGFlNi1cXHUwYWVmXFx1MGIwMS1cXHUwYjAzXFx1MGIzY1xcdTBiM2UtXFx1MGI0NFxcdTBiNDdcXHUwYjQ4XFx1MGI0Yi1cXHUwYjRkXFx1MGI1NlxcdTBiNTdcXHUwYjVmLVxcdTBiNjBcXHUwYjY2LVxcdTBiNmZcXHUwYjgyXFx1MGJiZS1cXHUwYmMyXFx1MGJjNi1cXHUwYmM4XFx1MGJjYS1cXHUwYmNkXFx1MGJkN1xcdTBiZTYtXFx1MGJlZlxcdTBjMDEtXFx1MGMwM1xcdTBjNDYtXFx1MGM0OFxcdTBjNGEtXFx1MGM0ZFxcdTBjNTVcXHUwYzU2XFx1MGM2Mi1cXHUwYzYzXFx1MGM2Ni1cXHUwYzZmXFx1MGM4MlxcdTBjODNcXHUwY2JjXFx1MGNiZS1cXHUwY2M0XFx1MGNjNi1cXHUwY2M4XFx1MGNjYS1cXHUwY2NkXFx1MGNkNVxcdTBjZDZcXHUwY2UyLVxcdTBjZTNcXHUwY2U2LVxcdTBjZWZcXHUwZDAyXFx1MGQwM1xcdTBkNDYtXFx1MGQ0OFxcdTBkNTdcXHUwZDYyLVxcdTBkNjNcXHUwZDY2LVxcdTBkNmZcXHUwZDgyXFx1MGQ4M1xcdTBkY2FcXHUwZGNmLVxcdTBkZDRcXHUwZGQ2XFx1MGRkOC1cXHUwZGRmXFx1MGRmMlxcdTBkZjNcXHUwZTM0LVxcdTBlM2FcXHUwZTQwLVxcdTBlNDVcXHUwZTUwLVxcdTBlNTlcXHUwZWI0LVxcdTBlYjlcXHUwZWM4LVxcdTBlY2RcXHUwZWQwLVxcdTBlZDlcXHUwZjE4XFx1MGYxOVxcdTBmMjAtXFx1MGYyOVxcdTBmMzVcXHUwZjM3XFx1MGYzOVxcdTBmNDEtXFx1MGY0N1xcdTBmNzEtXFx1MGY4NFxcdTBmODYtXFx1MGY4N1xcdTBmOGQtXFx1MGY5N1xcdTBmOTktXFx1MGZiY1xcdTBmYzZcXHUxMDAwLVxcdTEwMjlcXHUxMDQwLVxcdTEwNDlcXHUxMDY3LVxcdTEwNmRcXHUxMDcxLVxcdTEwNzRcXHUxMDgyLVxcdTEwOGRcXHUxMDhmLVxcdTEwOWRcXHUxMzVkLVxcdTEzNWZcXHUxNzBlLVxcdTE3MTBcXHUxNzIwLVxcdTE3MzBcXHUxNzQwLVxcdTE3NTBcXHUxNzcyXFx1MTc3M1xcdTE3ODAtXFx1MTdiMlxcdTE3ZGRcXHUxN2UwLVxcdTE3ZTlcXHUxODBiLVxcdTE4MGRcXHUxODEwLVxcdTE4MTlcXHUxOTIwLVxcdTE5MmJcXHUxOTMwLVxcdTE5M2JcXHUxOTUxLVxcdTE5NmRcXHUxOWIwLVxcdTE5YzBcXHUxOWM4LVxcdTE5YzlcXHUxOWQwLVxcdTE5ZDlcXHUxYTAwLVxcdTFhMTVcXHUxYTIwLVxcdTFhNTNcXHUxYTYwLVxcdTFhN2NcXHUxYTdmLVxcdTFhODlcXHUxYTkwLVxcdTFhOTlcXHUxYjQ2LVxcdTFiNGJcXHUxYjUwLVxcdTFiNTlcXHUxYjZiLVxcdTFiNzNcXHUxYmIwLVxcdTFiYjlcXHUxYmU2LVxcdTFiZjNcXHUxYzAwLVxcdTFjMjJcXHUxYzQwLVxcdTFjNDlcXHUxYzViLVxcdTFjN2RcXHUxY2QwLVxcdTFjZDJcXHUxZDAwLVxcdTFkYmVcXHUxZTAxLVxcdTFmMTVcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA1NFxcdTIwZDAtXFx1MjBkY1xcdTIwZTFcXHUyMGU1LVxcdTIwZjBcXHUyZDgxLVxcdTJkOTZcXHUyZGUwLVxcdTJkZmZcXHUzMDIxLVxcdTMwMjhcXHUzMDk5XFx1MzA5YVxcdWE2NDAtXFx1YTY2ZFxcdWE2NzQtXFx1YTY3ZFxcdWE2OWZcXHVhNmYwLVxcdWE2ZjFcXHVhN2Y4LVxcdWE4MDBcXHVhODA2XFx1YTgwYlxcdWE4MjMtXFx1YTgyN1xcdWE4ODAtXFx1YTg4MVxcdWE4YjQtXFx1YThjNFxcdWE4ZDAtXFx1YThkOVxcdWE4ZjMtXFx1YThmN1xcdWE5MDAtXFx1YTkwOVxcdWE5MjYtXFx1YTkyZFxcdWE5MzAtXFx1YTk0NVxcdWE5ODAtXFx1YTk4M1xcdWE5YjMtXFx1YTljMFxcdWFhMDAtXFx1YWEyN1xcdWFhNDAtXFx1YWE0MVxcdWFhNGMtXFx1YWE0ZFxcdWFhNTAtXFx1YWE1OVxcdWFhN2JcXHVhYWUwLVxcdWFhZTlcXHVhYWYyLVxcdWFhZjNcXHVhYmMwLVxcdWFiZTFcXHVhYmVjXFx1YWJlZFxcdWFiZjAtXFx1YWJmOVxcdWZiMjAtXFx1ZmIyOFxcdWZlMDAtXFx1ZmUwZlxcdWZlMjAtXFx1ZmUyNlxcdWZlMzNcXHVmZTM0XFx1ZmU0ZC1cXHVmZTRmXFx1ZmYxMC1cXHVmZjE5XFx1ZmYzZlwiO1xuICAgICAgICAgICAgdmFyIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0ID0gbmV3IFJlZ0V4cChcIltcIiArIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgKyBcIl1cIik7XG4gICAgICAgICAgICB2YXIgbm9uQVNDSUlpZGVudGlmaWVyID0gbmV3IFJlZ0V4cChcIltcIiArIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgKyBub25BU0NJSWlkZW50aWZpZXJDaGFycyArIFwiXVwiKTtcblxuICAgICAgICAgICAgLy8gV2hldGhlciBhIHNpbmdsZSBjaGFyYWN0ZXIgZGVub3RlcyBhIG5ld2xpbmUuXG5cbiAgICAgICAgICAgIGV4cG9ydHMubmV3bGluZSA9IC9bXFxuXFxyXFx1MjAyOFxcdTIwMjldLztcblxuICAgICAgICAgICAgLy8gTWF0Y2hlcyBhIHdob2xlIGxpbmUgYnJlYWsgKHdoZXJlIENSTEYgaXMgY29uc2lkZXJlZCBhIHNpbmdsZVxuICAgICAgICAgICAgLy8gbGluZSBicmVhaykuIFVzZWQgdG8gY291bnQgbGluZXMuXG5cbiAgICAgICAgICAgIC8vIGluIGphdmFzY3JpcHQsIHRoZXNlIHR3byBkaWZmZXJcbiAgICAgICAgICAgIC8vIGluIHB5dGhvbiB0aGV5IGFyZSB0aGUgc2FtZSwgZGlmZmVyZW50IG1ldGhvZHMgYXJlIGNhbGxlZCBvbiB0aGVtXG4gICAgICAgICAgICBleHBvcnRzLmxpbmVCcmVhayA9IG5ldyBSZWdFeHAoJ1xcclxcbnwnICsgZXhwb3J0cy5uZXdsaW5lLnNvdXJjZSk7XG4gICAgICAgICAgICBleHBvcnRzLmFsbExpbmVCcmVha3MgPSBuZXcgUmVnRXhwKGV4cG9ydHMubGluZUJyZWFrLnNvdXJjZSwgJ2cnKTtcblxuXG4gICAgICAgICAgICAvLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZSBzdGFydHMgYW4gaWRlbnRpZmllci5cblxuICAgICAgICAgICAgZXhwb3J0cy5pc0lkZW50aWZpZXJTdGFydCA9IGZ1bmN0aW9uKGNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBwZXJtaXQgJCAoMzYpIGFuZCBAICg2NCkuIEAgaXMgdXNlZCBpbiBFUzcgZGVjb3JhdG9ycy5cbiAgICAgICAgICAgICAgICBpZiAoY29kZSA8IDY1KSByZXR1cm4gY29kZSA9PT0gMzYgfHwgY29kZSA9PT0gNjQ7XG4gICAgICAgICAgICAgICAgLy8gNjUgdGhyb3VnaCA5MSBhcmUgdXBwZXJjYXNlIGxldHRlcnMuXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPCA5MSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgLy8gcGVybWl0IF8gKDk1KS5cbiAgICAgICAgICAgICAgICBpZiAoY29kZSA8IDk3KSByZXR1cm4gY29kZSA9PT0gOTU7XG4gICAgICAgICAgICAgICAgLy8gOTcgdGhyb3VnaCAxMjMgYXJlIGxvd2VyY2FzZSBsZXR0ZXJzLlxuICAgICAgICAgICAgICAgIGlmIChjb2RlIDwgMTIzKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgcGFydCBvZiBhbiBpZGVudGlmaWVyLlxuXG4gICAgICAgICAgICBleHBvcnRzLmlzSWRlbnRpZmllckNoYXIgPSBmdW5jdGlvbihjb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPCA0OCkgcmV0dXJuIGNvZGUgPT09IDM2O1xuICAgICAgICAgICAgICAgIGlmIChjb2RlIDwgNTgpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlIDwgNjUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA8IDkxKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA8IDk3KSByZXR1cm4gY29kZSA9PT0gOTU7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPCAxMjMpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlID49IDB4YWEgJiYgbm9uQVNDSUlpZGVudGlmaWVyLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KShhY29ybik7XG4gICAgICAgIC8qIGpzaGludCBjdXJseTogdHJ1ZSAqL1xuXG4gICAgICAgIGZ1bmN0aW9uIGluX2FycmF5KHdoYXQsIGFycikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJyW2ldID09PSB3aGF0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHRyaW0ocykge1xuICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gbHRyaW0ocykge1xuICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvXlxccysvZywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZnVuY3Rpb24gcnRyaW0ocykge1xuICAgICAgICAvLyAgICAgcmV0dXJuIHMucmVwbGFjZSgvXFxzKyQvZywgJycpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2FuaXRpemVPcGVyYXRvclBvc2l0aW9uKG9wUG9zaXRpb24pIHtcbiAgICAgICAgICAgIG9wUG9zaXRpb24gPSBvcFBvc2l0aW9uIHx8IE9QRVJBVE9SX1BPU0lUSU9OLmJlZm9yZV9uZXdsaW5lO1xuXG4gICAgICAgICAgICB2YXIgdmFsaWRQb3NpdGlvblZhbHVlcyA9IE9iamVjdC52YWx1ZXMoT1BFUkFUT1JfUE9TSVRJT04pO1xuXG4gICAgICAgICAgICBpZiAoIWluX2FycmF5KG9wUG9zaXRpb24sIHZhbGlkUG9zaXRpb25WYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBPcHRpb24gVmFsdWU6IFRoZSBvcHRpb24gJ29wZXJhdG9yX3Bvc2l0aW9uJyBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlc1xcblwiICtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRQb3NpdGlvblZhbHVlcyArXG4gICAgICAgICAgICAgICAgICAgIFwiXFxuWW91IHBhc3NlZCBpbjogJ1wiICsgb3BQb3NpdGlvbiArIFwiJ1wiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG9wUG9zaXRpb247XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgT1BFUkFUT1JfUE9TSVRJT04gPSB7XG4gICAgICAgICAgICBiZWZvcmVfbmV3bGluZTogJ2JlZm9yZS1uZXdsaW5lJyxcbiAgICAgICAgICAgIGFmdGVyX25ld2xpbmU6ICdhZnRlci1uZXdsaW5lJyxcbiAgICAgICAgICAgIHByZXNlcnZlX25ld2xpbmU6ICdwcmVzZXJ2ZS1uZXdsaW5lJyxcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgT1BFUkFUT1JfUE9TSVRJT05fQkVGT1JFX09SX1BSRVNFUlZFID0gW09QRVJBVE9SX1BPU0lUSU9OLmJlZm9yZV9uZXdsaW5lLCBPUEVSQVRPUl9QT1NJVElPTi5wcmVzZXJ2ZV9uZXdsaW5lXTtcblxuICAgICAgICB2YXIgTU9ERSA9IHtcbiAgICAgICAgICAgIEJsb2NrU3RhdGVtZW50OiAnQmxvY2tTdGF0ZW1lbnQnLCAvLyAnQkxPQ0snXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6ICdTdGF0ZW1lbnQnLCAvLyAnU1RBVEVNRU5UJ1xuICAgICAgICAgICAgT2JqZWN0TGl0ZXJhbDogJ09iamVjdExpdGVyYWwnLCAvLyAnT0JKRUNUJyxcbiAgICAgICAgICAgIEFycmF5TGl0ZXJhbDogJ0FycmF5TGl0ZXJhbCcsIC8vJ1tFWFBSRVNTSU9OXScsXG4gICAgICAgICAgICBGb3JJbml0aWFsaXplcjogJ0ZvckluaXRpYWxpemVyJywgLy8nKEZPUi1FWFBSRVNTSU9OKScsXG4gICAgICAgICAgICBDb25kaXRpb25hbDogJ0NvbmRpdGlvbmFsJywgLy8nKENPTkQtRVhQUkVTU0lPTiknLFxuICAgICAgICAgICAgRXhwcmVzc2lvbjogJ0V4cHJlc3Npb24nIC8vJyhFWFBSRVNTSU9OKSdcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBCZWF1dGlmaWVyKGpzX3NvdXJjZV90ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICBcInVzZSBzdHJpY3RcIjtcbiAgICAgICAgICAgIHZhciBvdXRwdXQ7XG4gICAgICAgICAgICB2YXIgdG9rZW5zID0gW10sXG4gICAgICAgICAgICAgICAgdG9rZW5fcG9zO1xuICAgICAgICAgICAgdmFyIFRva2VuaXplcjtcbiAgICAgICAgICAgIHZhciBjdXJyZW50X3Rva2VuO1xuICAgICAgICAgICAgdmFyIGxhc3RfdHlwZSwgbGFzdF9sYXN0X3RleHQsIGluZGVudF9zdHJpbmc7XG4gICAgICAgICAgICB2YXIgZmxhZ3MsIHByZXZpb3VzX2ZsYWdzLCBmbGFnX3N0b3JlO1xuICAgICAgICAgICAgdmFyIHByZWZpeDtcblxuICAgICAgICAgICAgdmFyIGhhbmRsZXJzLCBvcHQ7XG4gICAgICAgICAgICB2YXIgYmFzZUluZGVudFN0cmluZyA9ICcnO1xuXG4gICAgICAgICAgICBoYW5kbGVycyA9IHtcbiAgICAgICAgICAgICAgICAnVEtfU1RBUlRfRVhQUic6IGhhbmRsZV9zdGFydF9leHByLFxuICAgICAgICAgICAgICAgICdUS19FTkRfRVhQUic6IGhhbmRsZV9lbmRfZXhwcixcbiAgICAgICAgICAgICAgICAnVEtfU1RBUlRfQkxPQ0snOiBoYW5kbGVfc3RhcnRfYmxvY2ssXG4gICAgICAgICAgICAgICAgJ1RLX0VORF9CTE9DSyc6IGhhbmRsZV9lbmRfYmxvY2ssXG4gICAgICAgICAgICAgICAgJ1RLX1dPUkQnOiBoYW5kbGVfd29yZCxcbiAgICAgICAgICAgICAgICAnVEtfUkVTRVJWRUQnOiBoYW5kbGVfd29yZCxcbiAgICAgICAgICAgICAgICAnVEtfU0VNSUNPTE9OJzogaGFuZGxlX3NlbWljb2xvbixcbiAgICAgICAgICAgICAgICAnVEtfU1RSSU5HJzogaGFuZGxlX3N0cmluZyxcbiAgICAgICAgICAgICAgICAnVEtfRVFVQUxTJzogaGFuZGxlX2VxdWFscyxcbiAgICAgICAgICAgICAgICAnVEtfT1BFUkFUT1InOiBoYW5kbGVfb3BlcmF0b3IsXG4gICAgICAgICAgICAgICAgJ1RLX0NPTU1BJzogaGFuZGxlX2NvbW1hLFxuICAgICAgICAgICAgICAgICdUS19CTE9DS19DT01NRU5UJzogaGFuZGxlX2Jsb2NrX2NvbW1lbnQsXG4gICAgICAgICAgICAgICAgJ1RLX0NPTU1FTlQnOiBoYW5kbGVfY29tbWVudCxcbiAgICAgICAgICAgICAgICAnVEtfRE9UJzogaGFuZGxlX2RvdCxcbiAgICAgICAgICAgICAgICAnVEtfVU5LTk9XTic6IGhhbmRsZV91bmtub3duLFxuICAgICAgICAgICAgICAgICdUS19FT0YnOiBoYW5kbGVfZW9mXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVfZmxhZ3MoZmxhZ3NfYmFzZSwgbW9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudF9sZXZlbCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGZsYWdzX2Jhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dF9pbmRlbnRfbGV2ZWwgPSBmbGFnc19iYXNlLmluZGVudGF0aW9uX2xldmVsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW91dHB1dC5qdXN0X2FkZGVkX25ld2xpbmUoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NfYmFzZS5saW5lX2luZGVudF9sZXZlbCA+IG5leHRfaW5kZW50X2xldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2luZGVudF9sZXZlbCA9IGZsYWdzX2Jhc2UubGluZV9pbmRlbnRfbGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgbmV4dF9mbGFncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogbW9kZSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBmbGFnc19iYXNlLFxuICAgICAgICAgICAgICAgICAgICBsYXN0X3RleHQ6IGZsYWdzX2Jhc2UgPyBmbGFnc19iYXNlLmxhc3RfdGV4dCA6ICcnLCAvLyBsYXN0IHRva2VuIHRleHRcbiAgICAgICAgICAgICAgICAgICAgbGFzdF93b3JkOiBmbGFnc19iYXNlID8gZmxhZ3NfYmFzZS5sYXN0X3dvcmQgOiAnJywgLy8gbGFzdCAnVEtfV09SRCcgcGFzc2VkXG4gICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uX3N0YXRlbWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uX2Fzc2lnbm1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVfZnJhbWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpbmxpbmVfZnJhbWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpZl9ibG9jazogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGVsc2VfYmxvY2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBkb19ibG9jazogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRvX3doaWxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0X2Jsb2NrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaW5fY2FzZV9zdGF0ZW1lbnQ6IGZhbHNlLCAvLyBzd2l0Y2goLi4peyBJTlNJREUgSEVSRSB9XG4gICAgICAgICAgICAgICAgICAgIGluX2Nhc2U6IGZhbHNlLCAvLyB3ZSdyZSBvbiB0aGUgZXhhY3QgbGluZSB3aXRoIFwiY2FzZSAwOlwiXG4gICAgICAgICAgICAgICAgICAgIGNhc2VfYm9keTogZmFsc2UsIC8vIHRoZSBpbmRlbnRlZCBjYXNlLWFjdGlvbiBibG9ja1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbl9sZXZlbDogbmV4dF9pbmRlbnRfbGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVfaW5kZW50X2xldmVsOiBmbGFnc19iYXNlID8gZmxhZ3NfYmFzZS5saW5lX2luZGVudF9sZXZlbCA6IG5leHRfaW5kZW50X2xldmVsLFxuICAgICAgICAgICAgICAgICAgICBzdGFydF9saW5lX2luZGV4OiBvdXRwdXQuZ2V0X2xpbmVfbnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICAgIHRlcm5hcnlfZGVwdGg6IDBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0X2ZsYWdzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTb21lIGludGVycHJldGVycyBoYXZlIHVuZXhwZWN0ZWQgcmVzdWx0cyB3aXRoIGZvbyA9IGJheiB8fCBiYXI7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyA/IG9wdGlvbnMgOiB7fTtcblxuICAgICAgICAgICAgLy8gQWxsb3cgdGhlIHNldHRpbmcgb2YgbGFuZ3VhZ2UvZmlsZS10eXBlIHNwZWNpZmljIG9wdGlvbnNcbiAgICAgICAgICAgIC8vIHdpdGggaW5oZXJpdGFuY2Ugb2Ygb3ZlcmFsbCBzZXR0aW5nc1xuICAgICAgICAgICAgb3B0aW9ucyA9IG1lcmdlT3B0cyhvcHRpb25zLCAnanMnKTtcblxuICAgICAgICAgICAgb3B0ID0ge307XG5cbiAgICAgICAgICAgIC8vIGNvbXBhdGliaWxpdHksIHJlXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5icmFjZV9zdHlsZSA9PT0gXCJleHBhbmQtc3RyaWN0XCIpIHsgLy9ncmFjZWZ1bCBoYW5kbGluZyBvZiBkZXByZWNhdGVkIG9wdGlvblxuICAgICAgICAgICAgICAgIG9wdGlvbnMuYnJhY2Vfc3R5bGUgPSBcImV4cGFuZFwiO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmJyYWNlX3N0eWxlID09PSBcImNvbGxhcHNlLXByZXNlcnZlLWlubGluZVwiKSB7IC8vZ3JhY2VmdWwgaGFuZGxpbmcgb2YgZGVwcmVjYXRlZCBvcHRpb25cbiAgICAgICAgICAgICAgICBvcHRpb25zLmJyYWNlX3N0eWxlID0gXCJjb2xsYXBzZSxwcmVzZXJ2ZS1pbmxpbmVcIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5icmFjZXNfb25fb3duX2xpbmUgIT09IHVuZGVmaW5lZCkgeyAvL2dyYWNlZnVsIGhhbmRsaW5nIG9mIGRlcHJlY2F0ZWQgb3B0aW9uXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5icmFjZV9zdHlsZSA9IG9wdGlvbnMuYnJhY2VzX29uX293bl9saW5lID8gXCJleHBhbmRcIiA6IFwiY29sbGFwc2VcIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuYnJhY2Vfc3R5bGUpIC8vTm90aGluZyBleGlzdHMgdG8gc2V0IGl0XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5icmFjZV9zdHlsZSA9IFwiY29sbGFwc2VcIjtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICB2YXIgYnJhY2Vfc3R5bGVfc3BsaXQgPSBvcHRpb25zLmJyYWNlX3N0eWxlLnNwbGl0KC9bXmEtekEtWjAtOV9cXC1dKy8pO1xuICAgICAgICAgICAgb3B0LmJyYWNlX3N0eWxlID0gYnJhY2Vfc3R5bGVfc3BsaXRbMF07XG4gICAgICAgICAgICBvcHQuYnJhY2VfcHJlc2VydmVfaW5saW5lID0gYnJhY2Vfc3R5bGVfc3BsaXRbMV0gPyBicmFjZV9zdHlsZV9zcGxpdFsxXSA6IGZhbHNlO1xuXG4gICAgICAgICAgICBvcHQuaW5kZW50X3NpemUgPSBvcHRpb25zLmluZGVudF9zaXplID8gcGFyc2VJbnQob3B0aW9ucy5pbmRlbnRfc2l6ZSwgMTApIDogNDtcbiAgICAgICAgICAgIG9wdC5pbmRlbnRfY2hhciA9IG9wdGlvbnMuaW5kZW50X2NoYXIgPyBvcHRpb25zLmluZGVudF9jaGFyIDogJyAnO1xuICAgICAgICAgICAgb3B0LmVvbCA9IG9wdGlvbnMuZW9sID8gb3B0aW9ucy5lb2wgOiAnYXV0byc7XG4gICAgICAgICAgICBvcHQucHJlc2VydmVfbmV3bGluZXMgPSAob3B0aW9ucy5wcmVzZXJ2ZV9uZXdsaW5lcyA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiBvcHRpb25zLnByZXNlcnZlX25ld2xpbmVzO1xuICAgICAgICAgICAgb3B0LmJyZWFrX2NoYWluZWRfbWV0aG9kcyA9IChvcHRpb25zLmJyZWFrX2NoYWluZWRfbWV0aG9kcyA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogb3B0aW9ucy5icmVha19jaGFpbmVkX21ldGhvZHM7XG4gICAgICAgICAgICBvcHQubWF4X3ByZXNlcnZlX25ld2xpbmVzID0gKG9wdGlvbnMubWF4X3ByZXNlcnZlX25ld2xpbmVzID09PSB1bmRlZmluZWQpID8gMCA6IHBhcnNlSW50KG9wdGlvbnMubWF4X3ByZXNlcnZlX25ld2xpbmVzLCAxMCk7XG4gICAgICAgICAgICBvcHQuc3BhY2VfaW5fcGFyZW4gPSAob3B0aW9ucy5zcGFjZV9pbl9wYXJlbiA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogb3B0aW9ucy5zcGFjZV9pbl9wYXJlbjtcbiAgICAgICAgICAgIG9wdC5zcGFjZV9pbl9lbXB0eV9wYXJlbiA9IChvcHRpb25zLnNwYWNlX2luX2VtcHR5X3BhcmVuID09PSB1bmRlZmluZWQpID8gZmFsc2UgOiBvcHRpb25zLnNwYWNlX2luX2VtcHR5X3BhcmVuO1xuICAgICAgICAgICAgb3B0LmpzbGludF9oYXBweSA9IChvcHRpb25zLmpzbGludF9oYXBweSA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogb3B0aW9ucy5qc2xpbnRfaGFwcHk7XG4gICAgICAgICAgICBvcHQuc3BhY2VfYWZ0ZXJfYW5vbl9mdW5jdGlvbiA9IChvcHRpb25zLnNwYWNlX2FmdGVyX2Fub25fZnVuY3Rpb24gPT09IHVuZGVmaW5lZCkgPyBmYWxzZSA6IG9wdGlvbnMuc3BhY2VfYWZ0ZXJfYW5vbl9mdW5jdGlvbjtcbiAgICAgICAgICAgIG9wdC5rZWVwX2FycmF5X2luZGVudGF0aW9uID0gKG9wdGlvbnMua2VlcF9hcnJheV9pbmRlbnRhdGlvbiA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogb3B0aW9ucy5rZWVwX2FycmF5X2luZGVudGF0aW9uO1xuICAgICAgICAgICAgb3B0LnNwYWNlX2JlZm9yZV9jb25kaXRpb25hbCA9IChvcHRpb25zLnNwYWNlX2JlZm9yZV9jb25kaXRpb25hbCA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiBvcHRpb25zLnNwYWNlX2JlZm9yZV9jb25kaXRpb25hbDtcbiAgICAgICAgICAgIG9wdC51bmVzY2FwZV9zdHJpbmdzID0gKG9wdGlvbnMudW5lc2NhcGVfc3RyaW5ncyA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogb3B0aW9ucy51bmVzY2FwZV9zdHJpbmdzO1xuICAgICAgICAgICAgb3B0LndyYXBfbGluZV9sZW5ndGggPSAob3B0aW9ucy53cmFwX2xpbmVfbGVuZ3RoID09PSB1bmRlZmluZWQpID8gMCA6IHBhcnNlSW50KG9wdGlvbnMud3JhcF9saW5lX2xlbmd0aCwgMTApO1xuICAgICAgICAgICAgb3B0LmU0eCA9IChvcHRpb25zLmU0eCA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogb3B0aW9ucy5lNHg7XG4gICAgICAgICAgICBvcHQuZW5kX3dpdGhfbmV3bGluZSA9IChvcHRpb25zLmVuZF93aXRoX25ld2xpbmUgPT09IHVuZGVmaW5lZCkgPyBmYWxzZSA6IG9wdGlvbnMuZW5kX3dpdGhfbmV3bGluZTtcbiAgICAgICAgICAgIG9wdC5jb21tYV9maXJzdCA9IChvcHRpb25zLmNvbW1hX2ZpcnN0ID09PSB1bmRlZmluZWQpID8gZmFsc2UgOiBvcHRpb25zLmNvbW1hX2ZpcnN0O1xuICAgICAgICAgICAgb3B0Lm9wZXJhdG9yX3Bvc2l0aW9uID0gc2FuaXRpemVPcGVyYXRvclBvc2l0aW9uKG9wdGlvbnMub3BlcmF0b3JfcG9zaXRpb24pO1xuXG4gICAgICAgICAgICAvLyBGb3IgdGVzdGluZyBvZiBiZWF1dGlmeSBpZ25vcmU6c3RhcnQgZGlyZWN0aXZlXG4gICAgICAgICAgICBvcHQudGVzdF9vdXRwdXRfcmF3ID0gKG9wdGlvbnMudGVzdF9vdXRwdXRfcmF3ID09PSB1bmRlZmluZWQpID8gZmFsc2UgOiBvcHRpb25zLnRlc3Rfb3V0cHV0X3JhdztcblxuICAgICAgICAgICAgLy8gZm9yY2Ugb3B0LnNwYWNlX2FmdGVyX2Fub25fZnVuY3Rpb24gdG8gdHJ1ZSBpZiBvcHQuanNsaW50X2hhcHB5XG4gICAgICAgICAgICBpZiAob3B0LmpzbGludF9oYXBweSkge1xuICAgICAgICAgICAgICAgIG9wdC5zcGFjZV9hZnRlcl9hbm9uX2Z1bmN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5kZW50X3dpdGhfdGFicykge1xuICAgICAgICAgICAgICAgIG9wdC5pbmRlbnRfY2hhciA9ICdcXHQnO1xuICAgICAgICAgICAgICAgIG9wdC5pbmRlbnRfc2l6ZSA9IDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHQuZW9sID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgICAgICBvcHQuZW9sID0gJ1xcbic7XG4gICAgICAgICAgICAgICAgaWYgKGpzX3NvdXJjZV90ZXh0ICYmIGFjb3JuLmxpbmVCcmVhay50ZXN0KGpzX3NvdXJjZV90ZXh0IHx8ICcnKSkge1xuICAgICAgICAgICAgICAgICAgICBvcHQuZW9sID0ganNfc291cmNlX3RleHQubWF0Y2goYWNvcm4ubGluZUJyZWFrKVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9wdC5lb2wgPSBvcHQuZW9sLnJlcGxhY2UoL1xcXFxyLywgJ1xccicpLnJlcGxhY2UoL1xcXFxuLywgJ1xcbicpO1xuXG4gICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICAgIGluZGVudF9zdHJpbmcgPSAnJztcbiAgICAgICAgICAgIHdoaWxlIChvcHQuaW5kZW50X3NpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgaW5kZW50X3N0cmluZyArPSBvcHQuaW5kZW50X2NoYXI7XG4gICAgICAgICAgICAgICAgb3B0LmluZGVudF9zaXplIC09IDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwcmVpbmRlbnRfaW5kZXggPSAwO1xuICAgICAgICAgICAgaWYgKGpzX3NvdXJjZV90ZXh0ICYmIGpzX3NvdXJjZV90ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHdoaWxlICgoanNfc291cmNlX3RleHQuY2hhckF0KHByZWluZGVudF9pbmRleCkgPT09ICcgJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAganNfc291cmNlX3RleHQuY2hhckF0KHByZWluZGVudF9pbmRleCkgPT09ICdcXHQnKSkge1xuICAgICAgICAgICAgICAgICAgICBiYXNlSW5kZW50U3RyaW5nICs9IGpzX3NvdXJjZV90ZXh0LmNoYXJBdChwcmVpbmRlbnRfaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBwcmVpbmRlbnRfaW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAganNfc291cmNlX3RleHQgPSBqc19zb3VyY2VfdGV4dC5zdWJzdHJpbmcocHJlaW5kZW50X2luZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGFzdF90eXBlID0gJ1RLX1NUQVJUX0JMT0NLJzsgLy8gbGFzdCB0b2tlbiB0eXBlXG4gICAgICAgICAgICBsYXN0X2xhc3RfdGV4dCA9ICcnOyAvLyBwcmUtbGFzdCB0b2tlbiB0ZXh0XG4gICAgICAgICAgICBvdXRwdXQgPSBuZXcgT3V0cHV0KGluZGVudF9zdHJpbmcsIGJhc2VJbmRlbnRTdHJpbmcpO1xuXG4gICAgICAgICAgICAvLyBJZiB0ZXN0aW5nIHRoZSBpZ25vcmUgZGlyZWN0aXZlLCBzdGFydCB3aXRoIG91dHB1dCBkaXNhYmxlIHNldCB0byB0cnVlXG4gICAgICAgICAgICBvdXRwdXQucmF3ID0gb3B0LnRlc3Rfb3V0cHV0X3JhdztcblxuXG4gICAgICAgICAgICAvLyBTdGFjayBvZiBwYXJzaW5nL2Zvcm1hdHRpbmcgc3RhdGVzLCBpbmNsdWRpbmcgTU9ERS5cbiAgICAgICAgICAgIC8vIFdlIHRva2VuaXplLCBwYXJzZSwgYW5kIG91dHB1dCBpbiBhbiBhbG1vc3QgcHVyZWx5IGEgZm9yd2FyZC1vbmx5IHN0cmVhbSBvZiB0b2tlbiBpbnB1dFxuICAgICAgICAgICAgLy8gYW5kIGZvcm1hdHRlZCBvdXRwdXQuICBUaGlzIG1ha2VzIHRoZSBiZWF1dGlmaWVyIGxlc3MgYWNjdXJhdGUgdGhhbiBmdWxsIHBhcnNlcnNcbiAgICAgICAgICAgIC8vIGJ1dCBhbHNvIGZhciBtb3JlIHRvbGVyYW50IG9mIHN5bnRheCBlcnJvcnMuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IG1vZGUgaXMgTU9ERS5CbG9ja1N0YXRlbWVudC4gSWYgd2Ugc2VlIGEgJ3snIHdlIHB1c2ggYSBuZXcgZnJhbWUgb2YgdHlwZVxuICAgICAgICAgICAgLy8gTU9ERS5CbG9ja1N0YXRlbWVudCBvbiB0aGUgdGhlIHN0YWNrLCBldmVuIHRob3VnaCBpdCBjb3VsZCBiZSBvYmplY3QgbGl0ZXJhbC4gIElmIHdlIGxhdGVyXG4gICAgICAgICAgICAvLyBlbmNvdW50ZXIgYSBcIjpcIiwgd2UnbGwgc3dpdGNoIHRvIHRvIE1PREUuT2JqZWN0TGl0ZXJhbC4gIElmIHdlIHRoZW4gc2VlIGEgXCI7XCIsXG4gICAgICAgICAgICAvLyBtb3N0IGZ1bGwgcGFyc2VycyB3b3VsZCBkaWUsIGJ1dCB0aGUgYmVhdXRpZmllciBncmFjZWZ1bGx5IGZhbGxzIGJhY2sgdG9cbiAgICAgICAgICAgIC8vIE1PREUuQmxvY2tTdGF0ZW1lbnQgYW5kIGNvbnRpbnVlcyBvbi5cbiAgICAgICAgICAgIGZsYWdfc3RvcmUgPSBbXTtcbiAgICAgICAgICAgIHNldF9tb2RlKE1PREUuQmxvY2tTdGF0ZW1lbnQpO1xuXG4gICAgICAgICAgICB0aGlzLmJlYXV0aWZ5ID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAvKmpzaGludCBvbmV2YXI6dHJ1ZSAqL1xuICAgICAgICAgICAgICAgIHZhciBzd2VldF9jb2RlO1xuICAgICAgICAgICAgICAgIFRva2VuaXplciA9IG5ldyB0b2tlbml6ZXIoanNfc291cmNlX3RleHQsIG9wdCwgaW5kZW50X3N0cmluZyk7XG4gICAgICAgICAgICAgICAgdG9rZW5zID0gVG9rZW5pemVyLnRva2VuaXplKCk7XG4gICAgICAgICAgICAgICAgdG9rZW5fcG9zID0gMDtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnRfdG9rZW4gPSBnZXRfdG9rZW4oKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudF90b2tlbikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyc1tjdXJyZW50X3Rva2VuLnR5cGVdKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGFzdF9sYXN0X3RleHQgPSBmbGFncy5sYXN0X3RleHQ7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RfdHlwZSA9IGN1cnJlbnRfdG9rZW4udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MubGFzdF90ZXh0ID0gY3VycmVudF90b2tlbi50ZXh0O1xuXG4gICAgICAgICAgICAgICAgICAgIHRva2VuX3BvcyArPSAxO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3Rva2VuID0gZ2V0X3Rva2VuKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3dlZXRfY29kZSA9IG91dHB1dC5nZXRfY29kZSgpO1xuICAgICAgICAgICAgICAgIGlmIChvcHQuZW5kX3dpdGhfbmV3bGluZSkge1xuICAgICAgICAgICAgICAgICAgICBzd2VldF9jb2RlICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcHQuZW9sICE9PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBzd2VldF9jb2RlID0gc3dlZXRfY29kZS5yZXBsYWNlKC9bXFxuXS9nLCBvcHQuZW9sKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3dlZXRfY29kZTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZV93aGl0ZXNwYWNlX2FuZF9jb21tZW50cyhsb2NhbF90b2tlbiwgcHJlc2VydmVfc3RhdGVtZW50X2ZsYWdzKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld2xpbmVzID0gbG9jYWxfdG9rZW4ubmV3bGluZXM7XG4gICAgICAgICAgICAgICAgdmFyIGtlZXBfd2hpdGVzcGFjZSA9IG9wdC5rZWVwX2FycmF5X2luZGVudGF0aW9uICYmIGlzX2FycmF5KGZsYWdzLm1vZGUpO1xuICAgICAgICAgICAgICAgIHZhciB0ZW1wX3Rva2VuID0gY3VycmVudF90b2tlbjtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGggPSAwOyBoIDwgbG9jYWxfdG9rZW4uY29tbWVudHNfYmVmb3JlLmxlbmd0aDsgaCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjbGVhbmVzdCBoYW5kbGluZyBvZiBpbmxpbmUgY29tbWVudHMgaXMgdG8gdHJlYXQgdGhlbSBhcyB0aG91Z2ggdGhleSBhcmVuJ3QgdGhlcmUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgY29udGludWUgZm9ybWF0dGluZyBhbmQgdGhlIGJlaGF2aW9yIHNob3VsZCBiZSBsb2dpY2FsLlxuICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIGlnbm9yZSB1bmtub3duIHRva2Vucy4gIEFnYWluLCB0aGlzIHNob3VsZCByZXN1bHQgaW4gYmV0dGVyIGJlaGF2aW9yLlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3Rva2VuID0gbG9jYWxfdG9rZW4uY29tbWVudHNfYmVmb3JlW2hdO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVfd2hpdGVzcGFjZV9hbmRfY29tbWVudHMoY3VycmVudF90b2tlbiwgcHJlc2VydmVfc3RhdGVtZW50X2ZsYWdzKTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnNbY3VycmVudF90b2tlbi50eXBlXShwcmVzZXJ2ZV9zdGF0ZW1lbnRfZmxhZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50X3Rva2VuID0gdGVtcF90b2tlbjtcblxuICAgICAgICAgICAgICAgIGlmIChrZWVwX3doaXRlc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdsaW5lczsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmludF9uZXdsaW5lKGkgPiAwLCBwcmVzZXJ2ZV9zdGF0ZW1lbnRfZmxhZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdC5tYXhfcHJlc2VydmVfbmV3bGluZXMgJiYgbmV3bGluZXMgPiBvcHQubWF4X3ByZXNlcnZlX25ld2xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lcyA9IG9wdC5tYXhfcHJlc2VydmVfbmV3bGluZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0LnByZXNlcnZlX25ld2xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxfdG9rZW4ubmV3bGluZXMgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZShmYWxzZSwgcHJlc2VydmVfc3RhdGVtZW50X2ZsYWdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IG5ld2xpbmVzOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZSh0cnVlLCBwcmVzZXJ2ZV9zdGF0ZW1lbnRfZmxhZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3ZSBjb3VsZCB1c2UganVzdCBzdHJpbmcuc3BsaXQsIGJ1dFxuICAgICAgICAgICAgLy8gSUUgZG9lc24ndCBsaWtlIHJldHVybmluZyBlbXB0eSBzdHJpbmdzXG4gICAgICAgICAgICBmdW5jdGlvbiBzcGxpdF9saW5lYnJlYWtzKHMpIHtcbiAgICAgICAgICAgICAgICAvL3JldHVybiBzLnNwbGl0KC9cXHgwZFxceDBhfFxceDBhLyk7XG5cbiAgICAgICAgICAgICAgICBzID0gcy5yZXBsYWNlKGFjb3JuLmFsbExpbmVCcmVha3MsICdcXG4nKTtcbiAgICAgICAgICAgICAgICB2YXIgb3V0ID0gW10sXG4gICAgICAgICAgICAgICAgICAgIGlkeCA9IHMuaW5kZXhPZihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChzLnN1YnN0cmluZygwLCBpZHgpKTtcbiAgICAgICAgICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKGlkeCArIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZHggPSBzLmluZGV4T2YoXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5ld2xpbmVfcmVzdHJpY3RlZF90b2tlbnMgPSBbJ2JyZWFrJywgJ2NvbnRpbnVlJywgJ3JldHVybicsICd0aHJvdyddO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBhbGxvd193cmFwX29yX3ByZXNlcnZlZF9uZXdsaW5lKGZvcmNlX2xpbmV3cmFwKSB7XG4gICAgICAgICAgICAgICAgZm9yY2VfbGluZXdyYXAgPSAoZm9yY2VfbGluZXdyYXAgPT09IHVuZGVmaW5lZCkgPyBmYWxzZSA6IGZvcmNlX2xpbmV3cmFwO1xuXG4gICAgICAgICAgICAgICAgLy8gTmV2ZXIgd3JhcCB0aGUgZmlyc3QgdG9rZW4gb24gYSBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKG91dHB1dC5qdXN0X2FkZGVkX25ld2xpbmUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHNob3VsZFByZXNlcnZlT3JGb3JjZSA9IChvcHQucHJlc2VydmVfbmV3bGluZXMgJiYgY3VycmVudF90b2tlbi53YW50ZWRfbmV3bGluZSkgfHwgZm9yY2VfbGluZXdyYXA7XG4gICAgICAgICAgICAgICAgdmFyIG9wZXJhdG9yTG9naWNBcHBsaWVzID0gaW5fYXJyYXkoZmxhZ3MubGFzdF90ZXh0LCBUb2tlbml6ZXIucG9zaXRpb25hYmxlX29wZXJhdG9ycykgfHwgaW5fYXJyYXkoY3VycmVudF90b2tlbi50ZXh0LCBUb2tlbml6ZXIucG9zaXRpb25hYmxlX29wZXJhdG9ycyk7XG5cbiAgICAgICAgICAgICAgICBpZiAob3BlcmF0b3JMb2dpY0FwcGxpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNob3VsZFByaW50T3BlcmF0b3JOZXdsaW5lID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2FycmF5KGZsYWdzLmxhc3RfdGV4dCwgVG9rZW5pemVyLnBvc2l0aW9uYWJsZV9vcGVyYXRvcnMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYXJyYXkob3B0Lm9wZXJhdG9yX3Bvc2l0aW9uLCBPUEVSQVRPUl9QT1NJVElPTl9CRUZPUkVfT1JfUFJFU0VSVkUpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBpbl9hcnJheShjdXJyZW50X3Rva2VuLnRleHQsIFRva2VuaXplci5wb3NpdGlvbmFibGVfb3BlcmF0b3JzKTtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkUHJlc2VydmVPckZvcmNlID0gc2hvdWxkUHJlc2VydmVPckZvcmNlICYmIHNob3VsZFByaW50T3BlcmF0b3JOZXdsaW5lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRQcmVzZXJ2ZU9yRm9yY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZShmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQud3JhcF9saW5lX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGluX2FycmF5KGZsYWdzLmxhc3RfdGV4dCwgbmV3bGluZV9yZXN0cmljdGVkX3Rva2VucykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHRva2VucyBzaG91bGQgbmV2ZXIgaGF2ZSBhIG5ld2xpbmUgaW5zZXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gdGhlbSBhbmQgdGhlIGZvbGxvd2luZyBleHByZXNzaW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wb3NlZF9saW5lX2xlbmd0aCA9IG91dHB1dC5jdXJyZW50X2xpbmUuZ2V0X2NoYXJhY3Rlcl9jb3VudCgpICsgY3VycmVudF90b2tlbi50ZXh0Lmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3Bvc2VkX2xpbmVfbGVuZ3RoID49IG9wdC53cmFwX2xpbmVfbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmludF9uZXdsaW5lKGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gcHJpbnRfbmV3bGluZShmb3JjZV9uZXdsaW5lLCBwcmVzZXJ2ZV9zdGF0ZW1lbnRfZmxhZ3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXNlcnZlX3N0YXRlbWVudF9mbGFncykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MubGFzdF90ZXh0ICE9PSAnOycgJiYgZmxhZ3MubGFzdF90ZXh0ICE9PSAnLCcgJiYgZmxhZ3MubGFzdF90ZXh0ICE9PSAnPScgJiYgbGFzdF90eXBlICE9PSAnVEtfT1BFUkFUT1InKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dF90b2tlbiA9IGdldF90b2tlbigxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChmbGFncy5tb2RlID09PSBNT0RFLlN0YXRlbWVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZmxhZ3MuaWZfYmxvY2sgJiYgbmV4dF90b2tlbiAmJiBuZXh0X3Rva2VuLnR5cGUgPT09ICdUS19SRVNFUlZFRCcgJiYgbmV4dF90b2tlbi50ZXh0ID09PSAnZWxzZScpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZsYWdzLmRvX2Jsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9tb2RlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3V0cHV0LmFkZF9uZXdfbGluZShmb3JjZV9uZXdsaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5tdWx0aWxpbmVfZnJhbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gcHJpbnRfdG9rZW5fbGluZV9pbmRlbnRhdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAob3V0cHV0Lmp1c3RfYWRkZWRfbmV3bGluZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHQua2VlcF9hcnJheV9pbmRlbnRhdGlvbiAmJiBpc19hcnJheShmbGFncy5tb2RlKSAmJiBjdXJyZW50X3Rva2VuLndhbnRlZF9uZXdsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY3VycmVudF9saW5lLnB1c2goY3VycmVudF90b2tlbi53aGl0ZXNwYWNlX2JlZm9yZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0LnNldF9pbmRlbnQoZmxhZ3MuaW5kZW50YXRpb25fbGV2ZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5saW5lX2luZGVudF9sZXZlbCA9IGZsYWdzLmluZGVudGF0aW9uX2xldmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBwcmludF90b2tlbihwcmludGFibGVfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAob3V0cHV0LnJhdykge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYWRkX3Jhd190b2tlbihjdXJyZW50X3Rva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcHQuY29tbWFfZmlyc3QgJiYgbGFzdF90eXBlID09PSAnVEtfQ09NTUEnICYmXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5qdXN0X2FkZGVkX25ld2xpbmUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LnByZXZpb3VzX2xpbmUubGFzdCgpID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb3BwZWQgPSBvdXRwdXQucHJldmlvdXNfbGluZS5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjb21tYSB3YXMgYWxyZWFkeSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwdWxsIGJhY2sgb250byB0aGF0IGxpbmUgYW5kIHJlcHJpbnQgdGhlIGluZGVudGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LnByZXZpb3VzX2xpbmUuaXNfZW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wcmV2aW91c19saW5lLnB1c2gocG9wcGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQudHJpbSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY3VycmVudF9saW5lLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgY29tbWEgaW4gZnJvbnQgb2YgdGhlIG5leHQgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Rva2VuX2xpbmVfaW5kZW50YXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hZGRfdG9rZW4oJywnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJpbnRhYmxlX3Rva2VuID0gcHJpbnRhYmxlX3Rva2VuIHx8IGN1cnJlbnRfdG9rZW4udGV4dDtcbiAgICAgICAgICAgICAgICBwcmludF90b2tlbl9saW5lX2luZGVudGF0aW9uKCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LmFkZF90b2tlbihwcmludGFibGVfdG9rZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBpbmRlbnQoKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MuaW5kZW50YXRpb25fbGV2ZWwgKz0gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gZGVpbmRlbnQoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZsYWdzLmluZGVudGF0aW9uX2xldmVsID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAoKCFmbGFncy5wYXJlbnQpIHx8IGZsYWdzLmluZGVudGF0aW9uX2xldmVsID4gZmxhZ3MucGFyZW50LmluZGVudGF0aW9uX2xldmVsKSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5pbmRlbnRhdGlvbl9sZXZlbCAtPSAxO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBzZXRfbW9kZShtb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZsYWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdfc3RvcmUucHVzaChmbGFncyk7XG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2ZsYWdzID0gZmxhZ3M7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfZmxhZ3MgPSBjcmVhdGVfZmxhZ3MobnVsbCwgbW9kZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmxhZ3MgPSBjcmVhdGVfZmxhZ3MocHJldmlvdXNfZmxhZ3MsIG1vZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBpc19hcnJheShtb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGUgPT09IE1PREUuQXJyYXlMaXRlcmFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBpc19leHByZXNzaW9uKG1vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5fYXJyYXkobW9kZSwgW01PREUuRXhwcmVzc2lvbiwgTU9ERS5Gb3JJbml0aWFsaXplciwgTU9ERS5Db25kaXRpb25hbF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiByZXN0b3JlX21vZGUoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZsYWdfc3RvcmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19mbGFncyA9IGZsYWdzO1xuICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGZsYWdfc3RvcmUucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c19mbGFncy5tb2RlID09PSBNT0RFLlN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnJlbW92ZV9yZWR1bmRhbnRfaW5kZW50YXRpb24ocHJldmlvdXNfZmxhZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBzdGFydF9vZl9vYmplY3RfcHJvcGVydHkoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZsYWdzLnBhcmVudC5tb2RlID09PSBNT0RFLk9iamVjdExpdGVyYWwgJiYgZmxhZ3MubW9kZSA9PT0gTU9ERS5TdGF0ZW1lbnQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAoZmxhZ3MubGFzdF90ZXh0ID09PSAnOicgJiYgZmxhZ3MudGVybmFyeV9kZXB0aCA9PT0gMCkgfHwgKGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBpbl9hcnJheShmbGFncy5sYXN0X3RleHQsIFsnZ2V0JywgJ3NldCddKSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBzdGFydF9vZl9zdGF0ZW1lbnQoKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGluX2FycmF5KGZsYWdzLmxhc3RfdGV4dCwgWyd2YXInLCAnbGV0JywgJ2NvbnN0J10pICYmIGN1cnJlbnRfdG9rZW4udHlwZSA9PT0gJ1RLX1dPUkQnKSB8fFxuICAgICAgICAgICAgICAgICAgICAobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGZsYWdzLmxhc3RfdGV4dCA9PT0gJ2RvJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBpbl9hcnJheShmbGFncy5sYXN0X3RleHQsIFsncmV0dXJuJywgJ3Rocm93J10pICYmICFjdXJyZW50X3Rva2VuLndhbnRlZF9uZXdsaW5lKSB8fFxuICAgICAgICAgICAgICAgICAgICAobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGZsYWdzLmxhc3RfdGV4dCA9PT0gJ2Vsc2UnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhKGN1cnJlbnRfdG9rZW4udHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBjdXJyZW50X3Rva2VuLnRleHQgPT09ICdpZicgJiYgIWN1cnJlbnRfdG9rZW4uY29tbWVudHNfYmVmb3JlLmxlbmd0aCkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChsYXN0X3R5cGUgPT09ICdUS19FTkRfRVhQUicgJiYgKHByZXZpb3VzX2ZsYWdzLm1vZGUgPT09IE1PREUuRm9ySW5pdGlhbGl6ZXIgfHwgcHJldmlvdXNfZmxhZ3MubW9kZSA9PT0gTU9ERS5Db25kaXRpb25hbCkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChsYXN0X3R5cGUgPT09ICdUS19XT1JEJyAmJiBmbGFncy5tb2RlID09PSBNT0RFLkJsb2NrU3RhdGVtZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhZmxhZ3MuaW5fY2FzZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIShjdXJyZW50X3Rva2VuLnRleHQgPT09ICctLScgfHwgY3VycmVudF90b2tlbi50ZXh0ID09PSAnKysnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9sYXN0X3RleHQgIT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdG9rZW4udHlwZSAhPT0gJ1RLX1dPUkQnICYmIGN1cnJlbnRfdG9rZW4udHlwZSAhPT0gJ1RLX1JFU0VSVkVEJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGZsYWdzLm1vZGUgPT09IE1PREUuT2JqZWN0TGl0ZXJhbCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MubGFzdF90ZXh0ID09PSAnOicgJiYgZmxhZ3MudGVybmFyeV9kZXB0aCA9PT0gMCkgfHwgKGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBpbl9hcnJheShmbGFncy5sYXN0X3RleHQsIFsnZ2V0JywgJ3NldCddKSkpKVxuICAgICAgICAgICAgICAgICkge1xuXG4gICAgICAgICAgICAgICAgICAgIHNldF9tb2RlKE1PREUuU3RhdGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzKGN1cnJlbnRfdG9rZW4sIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIElzc3VlICMyNzY6XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHN0YXJ0aW5nIGEgbmV3IHN0YXRlbWVudCB3aXRoIFtpZiwgZm9yLCB3aGlsZSwgZG9dLCBwdXNoIHRvIGEgbmV3IGxpbmUuXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhKSBpZiAoYikgaWYoYykgZCgpOyBlbHNlIGUoKTsgZWxzZSBmKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhcnRfb2Zfb2JqZWN0X3Byb3BlcnR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3dyYXBfb3JfcHJlc2VydmVkX25ld2xpbmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90b2tlbi50eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGluX2FycmF5KGN1cnJlbnRfdG9rZW4udGV4dCwgWydkbycsICdmb3InLCAnaWYnLCAnd2hpbGUnXSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gYWxsX2xpbmVzX3N0YXJ0X3dpdGgobGluZXMsIGMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsaW5lID0gdHJpbShsaW5lc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmNoYXJBdCgwKSAhPT0gYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBlYWNoX2xpbmVfbWF0Y2hlc19pbmRlbnQobGluZXMsIGluZGVudCkge1xuICAgICAgICAgICAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICAgICAgICAgICAgbGVuID0gbGluZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBsaW5lO1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBlbXB0eSBsaW5lcyB0byBwYXNzIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgJiYgbGluZS5pbmRleE9mKGluZGVudCkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gaXNfc3BlY2lhbF93b3JkKHdvcmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5fYXJyYXkod29yZCwgWydjYXNlJywgJ3JldHVybicsICdkbycsICdpZicsICd0aHJvdycsICdlbHNlJ10pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRfdG9rZW4ob2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdG9rZW5fcG9zICsgKG9mZnNldCB8fCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0b2tlbnMubGVuZ3RoKSA/IG51bGwgOiB0b2tlbnNbaW5kZXhdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVfc3RhcnRfZXhwcigpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgY29uZGl0aW9uYWwgc3RhcnRzIHRoZSBzdGF0ZW1lbnQgaWYgYXBwcm9wcmlhdGUuXG4gICAgICAgICAgICAgICAgaWYgKCFzdGFydF9vZl9zdGF0ZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVfd2hpdGVzcGFjZV9hbmRfY29tbWVudHMoY3VycmVudF90b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIG5leHRfbW9kZSA9IE1PREUuRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90b2tlbi50ZXh0ID09PSAnWycpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF90eXBlID09PSAnVEtfV09SRCcgfHwgZmxhZ3MubGFzdF90ZXh0ID09PSAnKScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYXJyYXkgaW5kZXggc3BlY2lmaWVyLCBicmVhayBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYVt4XSwgZm4oKVt4XVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBpbl9hcnJheShmbGFncy5sYXN0X3RleHQsIFRva2VuaXplci5saW5lX3N0YXJ0ZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0X21vZGUobmV4dF9tb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHQuc3BhY2VfaW5fcGFyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG5leHRfbW9kZSA9IE1PREUuQXJyYXlMaXRlcmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoZmxhZ3MubW9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGFncy5sYXN0X3RleHQgPT09ICdbJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncy5sYXN0X3RleHQgPT09ICcsJyAmJiAobGFzdF9sYXN0X3RleHQgPT09ICddJyB8fCBsYXN0X2xhc3RfdGV4dCA9PT0gJ30nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBdLCBbIGdvZXMgdG8gbmV3IGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9LCBbIGdvZXMgdG8gbmV3IGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdC5rZWVwX2FycmF5X2luZGVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X3R5cGUgPT09ICdUS19SRVNFUlZFRCcgJiYgZmxhZ3MubGFzdF90ZXh0ID09PSAnZm9yJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9tb2RlID0gTU9ERS5Gb3JJbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0X3R5cGUgPT09ICdUS19SRVNFUlZFRCcgJiYgaW5fYXJyYXkoZmxhZ3MubGFzdF90ZXh0LCBbJ2lmJywgJ3doaWxlJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0X21vZGUgPSBNT0RFLkNvbmRpdGlvbmFsO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dF9tb2RlID0gTU9ERS5FeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdzLmxhc3RfdGV4dCA9PT0gJzsnIHx8IGxhc3RfdHlwZSA9PT0gJ1RLX1NUQVJUX0JMT0NLJykge1xuICAgICAgICAgICAgICAgICAgICBwcmludF9uZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0X3R5cGUgPT09ICdUS19FTkRfRVhQUicgfHwgbGFzdF90eXBlID09PSAnVEtfU1RBUlRfRVhQUicgfHwgbGFzdF90eXBlID09PSAnVEtfRU5EX0JMT0NLJyB8fCBmbGFncy5sYXN0X3RleHQgPT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDb25zaWRlciB3aGV0aGVyIGZvcmNpbmcgdGhpcyBpcyByZXF1aXJlZC4gIFJldmlldyBmYWlsaW5nIHRlc3RzIHdoZW4gcmVtb3ZlZC5cbiAgICAgICAgICAgICAgICAgICAgYWxsb3dfd3JhcF9vcl9wcmVzZXJ2ZWRfbmV3bGluZShjdXJyZW50X3Rva2VuLndhbnRlZF9uZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZyBvbiAoKCBhbmQgKSggYW5kIF1bIGFuZCBdKCBhbmQgLihcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGN1cnJlbnRfdG9rZW4udGV4dCA9PT0gJygnKSAmJiBsYXN0X3R5cGUgIT09ICdUS19XT1JEJyAmJiBsYXN0X3R5cGUgIT09ICdUS19PUEVSQVRPUicpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIChmbGFncy5sYXN0X3dvcmQgPT09ICdmdW5jdGlvbicgfHwgZmxhZ3MubGFzdF93b3JkID09PSAndHlwZW9mJykpIHx8XG4gICAgICAgICAgICAgICAgICAgIChmbGFncy5sYXN0X3RleHQgPT09ICcqJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGluX2FycmF5KGxhc3RfbGFzdF90ZXh0LCBbJ2Z1bmN0aW9uJywgJ3lpZWxkJ10pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzLm1vZGUgPT09IE1PREUuT2JqZWN0TGl0ZXJhbCAmJiBpbl9hcnJheShsYXN0X2xhc3RfdGV4dCwgWyd7JywgJywnXSkpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24oKSB2cyBmdW5jdGlvbiAoKVxuICAgICAgICAgICAgICAgICAgICAvLyB5aWVsZCooKSB2cyB5aWVsZCogKClcbiAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24qKCkgdnMgZnVuY3Rpb24qICgpXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHQuc3BhY2VfYWZ0ZXJfYW5vbl9mdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiAoaW5fYXJyYXkoZmxhZ3MubGFzdF90ZXh0LCBUb2tlbml6ZXIubGluZV9zdGFydGVycykgfHwgZmxhZ3MubGFzdF90ZXh0ID09PSAnY2F0Y2gnKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0LnNwYWNlX2JlZm9yZV9jb25kaXRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgYSBzcGFjZSBiZXR3ZWVuIGF3YWl0IGFuZCBhbiBJSUZFXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdG9rZW4udGV4dCA9PT0gJygnICYmIGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBmbGFncy5sYXN0X3dvcmQgPT09ICdhd2FpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBvZiB0aGlzIGtpbmQgb2YgbmV3bGluZSBwcmVzZXJ2YXRpb24uXG4gICAgICAgICAgICAgICAgLy8gYSA9IChiICYmXG4gICAgICAgICAgICAgICAgLy8gICAgIChjIHx8IGQpKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90b2tlbi50ZXh0ID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX0VRVUFMUycgfHwgbGFzdF90eXBlID09PSAnVEtfT1BFUkFUT1InKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0X29mX29iamVjdF9wcm9wZXJ0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfd3JhcF9vcl9wcmVzZXJ2ZWRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBwcmVzZXJ2aW5nIHdyYXBwZWQgYXJyb3cgZnVuY3Rpb24gZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgICAvLyBhLmIoJ2MnLFxuICAgICAgICAgICAgICAgIC8vICAgICAoKSA9PiBkLmVcbiAgICAgICAgICAgICAgICAvLyApXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdG9rZW4udGV4dCA9PT0gJygnICYmIGxhc3RfdHlwZSAhPT0gJ1RLX1dPUkQnICYmIGxhc3RfdHlwZSAhPT0gJ1RLX1JFU0VSVkVEJykge1xuICAgICAgICAgICAgICAgICAgICBhbGxvd193cmFwX29yX3ByZXNlcnZlZF9uZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2V0X21vZGUobmV4dF9tb2RlKTtcbiAgICAgICAgICAgICAgICBwcmludF90b2tlbigpO1xuICAgICAgICAgICAgICAgIGlmIChvcHQuc3BhY2VfaW5fcGFyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSW4gYWxsIGNhc2VzLCBpZiB3ZSBuZXdsaW5lIHdoaWxlIGluc2lkZSBhbiBleHByZXNzaW9uIGl0IHNob3VsZCBiZSBpbmRlbnRlZC5cbiAgICAgICAgICAgICAgICBpbmRlbnQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gaGFuZGxlX2VuZF9leHByKCkge1xuICAgICAgICAgICAgICAgIC8vIHN0YXRlbWVudHMgaW5zaWRlIGV4cHJlc3Npb25zIGFyZSBub3QgdmFsaWQgc3ludGF4LCBidXQuLi5cbiAgICAgICAgICAgICAgICAvLyBzdGF0ZW1lbnRzIG11c3QgYWxsIGJlIGNsb3NlZCB3aGVuIHRoZWlyIGNvbnRhaW5lciBjbG9zZXNcbiAgICAgICAgICAgICAgICB3aGlsZSAoZmxhZ3MubW9kZSA9PT0gTU9ERS5TdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9tb2RlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaGFuZGxlX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzKGN1cnJlbnRfdG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdzLm11bHRpbGluZV9mcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBhbGxvd193cmFwX29yX3ByZXNlcnZlZF9uZXdsaW5lKGN1cnJlbnRfdG9rZW4udGV4dCA9PT0gJ10nICYmIGlzX2FycmF5KGZsYWdzLm1vZGUpICYmICFvcHQua2VlcF9hcnJheV9pbmRlbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdC5zcGFjZV9pbl9wYXJlbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF90eXBlID09PSAnVEtfU1RBUlRfRVhQUicgJiYgIW9wdC5zcGFjZV9pbl9lbXB0eV9wYXJlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKCkgW10gbm8gaW5uZXIgc3BhY2UgaW4gZW1wdHkgcGFyZW5zIGxpa2UgdGhlc2UsIGV2ZXIsIHJlZiAjMzIwXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdG9rZW4udGV4dCA9PT0gJ10nICYmIG9wdC5rZWVwX2FycmF5X2luZGVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfbW9kZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfbW9kZSgpO1xuICAgICAgICAgICAgICAgICAgICBwcmludF90b2tlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXRwdXQucmVtb3ZlX3JlZHVuZGFudF9pbmRlbnRhdGlvbihwcmV2aW91c19mbGFncyk7XG5cbiAgICAgICAgICAgICAgICAvLyBkbyB7fSB3aGlsZSAoKSAvLyBubyBzdGF0ZW1lbnQgcmVxdWlyZWQgYWZ0ZXJcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ3MuZG9fd2hpbGUgJiYgcHJldmlvdXNfZmxhZ3MubW9kZSA9PT0gTU9ERS5Db25kaXRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19mbGFncy5tb2RlID0gTU9ERS5FeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5kb19ibG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5kb193aGlsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVfc3RhcnRfYmxvY2soKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzKGN1cnJlbnRfdG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIE9iamVjdExpdGVyYWxcbiAgICAgICAgICAgICAgICB2YXIgbmV4dF90b2tlbiA9IGdldF90b2tlbigxKTtcbiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kX3Rva2VuID0gZ2V0X3Rva2VuKDIpO1xuICAgICAgICAgICAgICAgIGlmIChzZWNvbmRfdG9rZW4gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGluX2FycmF5KHNlY29uZF90b2tlbi50ZXh0LCBbJzonLCAnLCddKSAmJiBpbl9hcnJheShuZXh0X3Rva2VuLnR5cGUsIFsnVEtfU1RSSU5HJywgJ1RLX1dPUkQnLCAnVEtfUkVTRVJWRUQnXSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoaW5fYXJyYXkobmV4dF90b2tlbi50ZXh0LCBbJ2dldCcsICdzZXQnLCAnLi4uJ10pICYmIGluX2FycmF5KHNlY29uZF90b2tlbi50eXBlLCBbJ1RLX1dPUkQnLCAnVEtfUkVTRVJWRUQnXSkpXG4gICAgICAgICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBUeXBlU2NyaXB0LGJ1dCB3ZSBkaWRuJ3QgYnJlYWsgaXQgZm9yIGEgdmVyeSBsb25nIHRpbWUuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ2xsIHRyeSB0byBrZWVwIG5vdCBicmVha2luZyBpdC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbl9hcnJheShsYXN0X2xhc3RfdGV4dCwgWydjbGFzcycsICdpbnRlcmZhY2UnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldF9tb2RlKE1PREUuT2JqZWN0TGl0ZXJhbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRfbW9kZShNT0RFLkJsb2NrU3RhdGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdF90eXBlID09PSAnVEtfT1BFUkFUT1InICYmIGZsYWdzLmxhc3RfdGV4dCA9PT0gJz0+Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBhcnJvdyBmdW5jdGlvbjogKHBhcmFtMSwgcGFyYW1OKSA9PiB7IHN0YXRlbWVudHMgfVxuICAgICAgICAgICAgICAgICAgICBzZXRfbW9kZShNT0RFLkJsb2NrU3RhdGVtZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluX2FycmF5KGxhc3RfdHlwZSwgWydUS19FUVVBTFMnLCAnVEtfU1RBUlRfRVhQUicsICdUS19DT01NQScsICdUS19PUEVSQVRPUiddKSB8fFxuICAgICAgICAgICAgICAgICAgICAobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGluX2FycmF5KGZsYWdzLmxhc3RfdGV4dCwgWydyZXR1cm4nLCAndGhyb3cnLCAnaW1wb3J0JywgJ2RlZmF1bHQnXSkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERldGVjdGluZyBzaG9ydGhhbmQgZnVuY3Rpb24gc3ludGF4IGlzIGRpZmZpY3VsdCBieSBzY2FubmluZyBmb3J3YXJkLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgc28gY2hlY2sgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBibG9jayBpcyBiZWluZyByZXR1cm5lZCwgaW1wb3J0ZWQsIGV4cG9ydCBkZWZhdWx0LCBwYXNzZWQgYXMgYXJnLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYXNzaWduZWQgd2l0aCA9IG9yIGFzc2lnbmVkIGluIGEgbmVzdGVkIG9iamVjdCwgdHJlYXQgYXMgYW4gT2JqZWN0TGl0ZXJhbC5cbiAgICAgICAgICAgICAgICAgICAgc2V0X21vZGUoTU9ERS5PYmplY3RMaXRlcmFsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZXRfbW9kZShNT0RFLkJsb2NrU3RhdGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgZW1wdHlfYnJhY2VzID0gIW5leHRfdG9rZW4uY29tbWVudHNfYmVmb3JlLmxlbmd0aCAmJiBuZXh0X3Rva2VuLnRleHQgPT09ICd9JztcbiAgICAgICAgICAgICAgICB2YXIgZW1wdHlfYW5vbnltb3VzX2Z1bmN0aW9uID0gZW1wdHlfYnJhY2VzICYmIGZsYWdzLmxhc3Rfd29yZCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgICAgICAgICBsYXN0X3R5cGUgPT09ICdUS19FTkRfRVhQUic7XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0LmJyYWNlX3ByZXNlcnZlX2lubGluZSkgLy8gY2hlY2sgZm9yIGlubGluZSwgc2V0IGlubGluZV9mcmFtZSBpZiBzb1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGZvcndhcmQgZm9yIGEgbmV3bGluZSB3YW50ZWQgaW5zaWRlIHRoaXMgYmxvY2tcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoZWNrX3Rva2VuID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuaW5saW5lX2ZyYW1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3Rva2VuID0gZ2V0X3Rva2VuKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja190b2tlbi53YW50ZWRfbmV3bGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmlubGluZV9mcmFtZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChjaGVja190b2tlbi50eXBlICE9PSAnVEtfRU9GJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIShjaGVja190b2tlbi50eXBlID09PSAnVEtfRU5EX0JMT0NLJyAmJiBjaGVja190b2tlbi5vcGVuZWQgPT09IGN1cnJlbnRfdG9rZW4pKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoKG9wdC5icmFjZV9zdHlsZSA9PT0gXCJleHBhbmRcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG9wdC5icmFjZV9zdHlsZSA9PT0gXCJub25lXCIgJiYgY3VycmVudF90b2tlbi53YW50ZWRfbmV3bGluZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICFmbGFncy5pbmxpbmVfZnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfdHlwZSAhPT0gJ1RLX09QRVJBVE9SJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGVtcHR5X2Fub255bW91c19mdW5jdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfdHlwZSA9PT0gJ1RLX0VRVUFMUycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGlzX3NwZWNpYWxfd29yZChmbGFncy5sYXN0X3RleHQpICYmIGZsYWdzLmxhc3RfdGV4dCAhPT0gJ2Vsc2UnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZShmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBjb2xsYXBzZSB8fCBpbmxpbmVfZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KHByZXZpb3VzX2ZsYWdzLm1vZGUpICYmIChsYXN0X3R5cGUgPT09ICdUS19TVEFSVF9FWFBSJyB8fCBsYXN0X3R5cGUgPT09ICdUS19DT01NQScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF90eXBlID09PSAnVEtfQ09NTUEnIHx8IG9wdC5zcGFjZV9pbl9wYXJlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF90eXBlID09PSAnVEtfQ09NTUEnIHx8IChsYXN0X3R5cGUgPT09ICdUS19TVEFSVF9FWFBSJyAmJiBmbGFncy5pbmxpbmVfZnJhbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfd3JhcF9vcl9wcmVzZXJ2ZWRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2ZsYWdzLm11bHRpbGluZV9mcmFtZSA9IHByZXZpb3VzX2ZsYWdzLm11bHRpbGluZV9mcmFtZSB8fCBmbGFncy5tdWx0aWxpbmVfZnJhbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MubXVsdGlsaW5lX2ZyYW1lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfdHlwZSAhPT0gJ1RLX09QRVJBVE9SJyAmJiBsYXN0X3R5cGUgIT09ICdUS19TVEFSVF9FWFBSJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX1NUQVJUX0JMT0NLJyAmJiAhZmxhZ3MuaW5saW5lX2ZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmludF90b2tlbigpO1xuICAgICAgICAgICAgICAgIGluZGVudCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVfZW5kX2Jsb2NrKCkge1xuICAgICAgICAgICAgICAgIC8vIHN0YXRlbWVudHMgbXVzdCBhbGwgYmUgY2xvc2VkIHdoZW4gdGhlaXIgY29udGFpbmVyIGNsb3Nlc1xuICAgICAgICAgICAgICAgIGhhbmRsZV93aGl0ZXNwYWNlX2FuZF9jb21tZW50cyhjdXJyZW50X3Rva2VuKTtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChmbGFncy5tb2RlID09PSBNT0RFLlN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXN0b3JlX21vZGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgZW1wdHlfYnJhY2VzID0gbGFzdF90eXBlID09PSAnVEtfU1RBUlRfQkxPQ0snO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdzLmlubGluZV9mcmFtZSAmJiAhZW1wdHlfYnJhY2VzKSB7IC8vIHRyeSBpbmxpbmVfZnJhbWUgKG9ubHkgc2V0IGlmIG9wdC5icmFjZXMtcHJlc2VydmUtaW5saW5lKSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5icmFjZV9zdHlsZSA9PT0gXCJleHBhbmRcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5X2JyYWNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB7fVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5X2JyYWNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KGZsYWdzLm1vZGUpICYmIG9wdC5rZWVwX2FycmF5X2luZGVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgUkVBTExZIG5lZWQgYSBuZXdsaW5lIGhlcmUsIGJ1dCBuZXdsaW5lciB3b3VsZCBza2lwIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQua2VlcF9hcnJheV9pbmRlbnRhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQua2VlcF9hcnJheV9pbmRlbnRhdGlvbiA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3RvcmVfbW9kZSgpO1xuICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZV93b3JkKCkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3Rva2VuLnR5cGUgPT09ICdUS19SRVNFUlZFRCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KGN1cnJlbnRfdG9rZW4udGV4dCwgWydzZXQnLCAnZ2V0J10pICYmIGZsYWdzLm1vZGUgIT09IE1PREUuT2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90b2tlbi50eXBlID0gJ1RLX1dPUkQnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluX2FycmF5KGN1cnJlbnRfdG9rZW4udGV4dCwgWydhcycsICdmcm9tJ10pICYmICFmbGFncy5pbXBvcnRfYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdG9rZW4udHlwZSA9ICdUS19XT1JEJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncy5tb2RlID09PSBNT0RFLk9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0X3Rva2VuID0gZ2V0X3Rva2VuKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRfdG9rZW4udGV4dCA9PT0gJzonKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90b2tlbi50eXBlID0gJ1RLX1dPUkQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0X29mX3N0YXRlbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb25kaXRpb25hbCBzdGFydHMgdGhlIHN0YXRlbWVudCBpZiBhcHByb3ByaWF0ZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBpbl9hcnJheShmbGFncy5sYXN0X3RleHQsIFsndmFyJywgJ2xldCcsICdjb25zdCddKSAmJiBjdXJyZW50X3Rva2VuLnR5cGUgPT09ICdUS19XT1JEJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuZGVjbGFyYXRpb25fc3RhdGVtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudF90b2tlbi53YW50ZWRfbmV3bGluZSAmJiAhaXNfZXhwcmVzc2lvbihmbGFncy5tb2RlKSAmJlxuICAgICAgICAgICAgICAgICAgICAobGFzdF90eXBlICE9PSAnVEtfT1BFUkFUT1InIHx8IChmbGFncy5sYXN0X3RleHQgPT09ICctLScgfHwgZmxhZ3MubGFzdF90ZXh0ID09PSAnKysnKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgbGFzdF90eXBlICE9PSAnVEtfRVFVQUxTJyAmJlxuICAgICAgICAgICAgICAgICAgICAob3B0LnByZXNlcnZlX25ld2xpbmVzIHx8ICEobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGluX2FycmF5KGZsYWdzLmxhc3RfdGV4dCwgWyd2YXInLCAnbGV0JywgJ2NvbnN0JywgJ3NldCcsICdnZXQnXSkpKSkge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVfd2hpdGVzcGFjZV9hbmRfY29tbWVudHMoY3VycmVudF90b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVfd2hpdGVzcGFjZV9hbmRfY29tbWVudHMoY3VycmVudF90b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdzLmRvX2Jsb2NrICYmICFmbGFncy5kb193aGlsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90b2tlbi50eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGN1cnJlbnRfdG9rZW4udGV4dCA9PT0gJ3doaWxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8ge30gIyMgd2hpbGUgKClcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdG9rZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuZG9fd2hpbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8ge30gc2hvdWxkIGFsd2F5cyBoYXZlIHdoaWxlIGFzIHRoZSBuZXh0IHdvcmQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBzZWUgdGhlIGV4cGVjdGVkIHdoaWxlLCByZWNvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmludF9uZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5kb19ibG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gaWYgbWF5IGJlIGZvbGxvd2VkIGJ5IGVsc2UsIG9yIG5vdFxuICAgICAgICAgICAgICAgIC8vIEJhcmUvaW5saW5lIGlmcyBhcmUgdHJpY2t5XG4gICAgICAgICAgICAgICAgLy8gTmVlZCB0byB1bndpbmQgdGhlIG1vZGVzIGNvcnJlY3RseTogaWYgKGEpIGlmIChiKSBjKCk7IGVsc2UgZCgpOyBlbHNlIGUoKTtcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ3MuaWZfYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmbGFncy5lbHNlX2Jsb2NrICYmIChjdXJyZW50X3Rva2VuLnR5cGUgPT09ICdUS19SRVNFUlZFRCcgJiYgY3VycmVudF90b2tlbi50ZXh0ID09PSAnZWxzZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5lbHNlX2Jsb2NrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChmbGFncy5tb2RlID09PSBNT0RFLlN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfbW9kZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuaWZfYmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmVsc2VfYmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3Rva2VuLnR5cGUgPT09ICdUS19SRVNFUlZFRCcgJiYgKGN1cnJlbnRfdG9rZW4udGV4dCA9PT0gJ2Nhc2UnIHx8IChjdXJyZW50X3Rva2VuLnRleHQgPT09ICdkZWZhdWx0JyAmJiBmbGFncy5pbl9jYXNlX3N0YXRlbWVudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzLmNhc2VfYm9keSB8fCBvcHQuanNsaW50X2hhcHB5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggY2FzZXMgZm9sbG93aW5nIG9uZSBhbm90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWluZGVudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY2FzZV9ib2R5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJpbnRfdG9rZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuaW5fY2FzZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmluX2Nhc2Vfc3RhdGVtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChsYXN0X3R5cGUgPT09ICdUS19DT01NQScgfHwgbGFzdF90eXBlID09PSAnVEtfU1RBUlRfRVhQUicgfHwgbGFzdF90eXBlID09PSAnVEtfRVFVQUxTJyB8fCBsYXN0X3R5cGUgPT09ICdUS19PUEVSQVRPUicpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFydF9vZl9vYmplY3RfcHJvcGVydHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfd3JhcF9vcl9wcmVzZXJ2ZWRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdG9rZW4udHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBjdXJyZW50X3Rva2VuLnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KGZsYWdzLmxhc3RfdGV4dCwgWyd9JywgJzsnXSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRwdXQuanVzdF9hZGRlZF9uZXdsaW5lKCkgJiYgIShpbl9hcnJheShmbGFncy5sYXN0X3RleHQsIFsnKCcsICdbJywgJ3snLCAnOicsICc9JywgJywnXSkgfHwgbGFzdF90eXBlID09PSAnVEtfT1BFUkFUT1InKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBhIG5pY2UgY2xlYW4gc3BhY2Ugb2YgYXQgbGVhc3Qgb25lIGJsYW5rIGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBhIG5ldyBmdW5jdGlvbiBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW91dHB1dC5qdXN0X2FkZGVkX2JsYW5rbGluZSgpICYmICFjdXJyZW50X3Rva2VuLmNvbW1lbnRzX2JlZm9yZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9uZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnIHx8IGxhc3RfdHlwZSA9PT0gJ1RLX1dPUkQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGluX2FycmF5KGZsYWdzLmxhc3RfdGV4dCwgWydnZXQnLCAnc2V0JywgJ25ldycsICdyZXR1cm4nLCAnZXhwb3J0JywgJ2FzeW5jJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBmbGFncy5sYXN0X3RleHQgPT09ICdkZWZhdWx0JyAmJiBsYXN0X2xhc3RfdGV4dCA9PT0gJ2V4cG9ydCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX09QRVJBVE9SJyB8fCBmbGFncy5sYXN0X3RleHQgPT09ICc9Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9vID0gZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmbGFncy5tdWx0aWxpbmVfZnJhbWUgJiYgKGlzX2V4cHJlc3Npb24oZmxhZ3MubW9kZSkgfHwgaXNfYXJyYXkoZmxhZ3MubW9kZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKCk7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmxhc3Rfd29yZCA9IGN1cnJlbnRfdG9rZW4udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByZWZpeCA9ICdOT05FJztcblxuICAgICAgICAgICAgICAgIGlmIChsYXN0X3R5cGUgPT09ICdUS19FTkRfQkxPQ0snKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzX2ZsYWdzLmlubGluZV9mcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gJ1NQQUNFJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGN1cnJlbnRfdG9rZW4udHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBpbl9hcnJheShjdXJyZW50X3Rva2VuLnRleHQsIFsnZWxzZScsICdjYXRjaCcsICdmaW5hbGx5JywgJ2Zyb20nXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAnTkVXTElORSc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0LmJyYWNlX3N0eWxlID09PSBcImV4cGFuZFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0LmJyYWNlX3N0eWxlID09PSBcImVuZC1leHBhbmRcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHQuYnJhY2Vfc3R5bGUgPT09IFwibm9uZVwiICYmIGN1cnJlbnRfdG9rZW4ud2FudGVkX25ld2xpbmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gJ05FV0xJTkUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAnU1BBQ0UnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0X3R5cGUgPT09ICdUS19TRU1JQ09MT04nICYmIGZsYWdzLm1vZGUgPT09IE1PREUuQmxvY2tTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgYmUgZm9yIFNUQVRFTUVOVCBhcyB3ZWxsP1xuICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAnTkVXTElORSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0X3R5cGUgPT09ICdUS19TRU1JQ09MT04nICYmIGlzX2V4cHJlc3Npb24oZmxhZ3MubW9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gJ1NQQUNFJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX1NUUklORycpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gJ05FV0xJTkUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnIHx8IGxhc3RfdHlwZSA9PT0gJ1RLX1dPUkQnIHx8XG4gICAgICAgICAgICAgICAgICAgIChmbGFncy5sYXN0X3RleHQgPT09ICcqJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGluX2FycmF5KGxhc3RfbGFzdF90ZXh0LCBbJ2Z1bmN0aW9uJywgJ3lpZWxkJ10pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzLm1vZGUgPT09IE1PREUuT2JqZWN0TGl0ZXJhbCAmJiBpbl9hcnJheShsYXN0X2xhc3RfdGV4dCwgWyd7JywgJywnXSkpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gJ1NQQUNFJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX1NUQVJUX0JMT0NLJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MuaW5saW5lX2ZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAnU1BBQ0UnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gJ05FV0xJTkUnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0X3R5cGUgPT09ICdUS19FTkRfRVhQUicpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICdORVdMSU5FJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90b2tlbi50eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGluX2FycmF5KGN1cnJlbnRfdG9rZW4udGV4dCwgVG9rZW5pemVyLmxpbmVfc3RhcnRlcnMpICYmIGZsYWdzLmxhc3RfdGV4dCAhPT0gJyknKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmbGFncy5pbmxpbmVfZnJhbWUgfHwgZmxhZ3MubGFzdF90ZXh0ID09PSAnZWxzZScgfHwgZmxhZ3MubGFzdF90ZXh0ID09PSAnZXhwb3J0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gJ1NQQUNFJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICdORVdMSU5FJztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdG9rZW4udHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBpbl9hcnJheShjdXJyZW50X3Rva2VuLnRleHQsIFsnZWxzZScsICdjYXRjaCcsICdmaW5hbGx5J10pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoIShsYXN0X3R5cGUgPT09ICdUS19FTkRfQkxPQ0snICYmIHByZXZpb3VzX2ZsYWdzLm1vZGUgPT09IE1PREUuQmxvY2tTdGF0ZW1lbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0LmJyYWNlX3N0eWxlID09PSBcImV4cGFuZFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0LmJyYWNlX3N0eWxlID09PSBcImVuZC1leHBhbmRcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHQuYnJhY2Vfc3R5bGUgPT09IFwibm9uZVwiICYmIGN1cnJlbnRfdG9rZW4ud2FudGVkX25ld2xpbmUpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWZsYWdzLmlubGluZV9mcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnRyaW0odHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGluZSA9IG91dHB1dC5jdXJyZW50X2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSB0cmltbWVkIGFuZCB0aGVyZSdzIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgY2xvc2UgYmxvY2sgYmVmb3JlIHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXQgYSBuZXdsaW5lIGJhY2sgaW4uICBIYW5kbGVzICd9IC8vIGNvbW1lbnQnIHNjZW5hcmlvLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUubGFzdCgpICE9PSAnfScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9uZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlZml4ID09PSAnTkVXTElORScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBpc19zcGVjaWFsX3dvcmQoZmxhZ3MubGFzdF90ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbmV3bGluZSBiZXR3ZWVuICdyZXR1cm4gbm5uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdF90eXBlICE9PSAnVEtfRU5EX0VYUFInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxhc3RfdHlwZSAhPT0gJ1RLX1NUQVJUX0VYUFInIHx8ICEoY3VycmVudF90b2tlbi50eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGluX2FycmF5KGN1cnJlbnRfdG9rZW4udGV4dCwgWyd2YXInLCAnbGV0JywgJ2NvbnN0J10pKSkgJiYgZmxhZ3MubGFzdF90ZXh0ICE9PSAnOicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGZvcmNlIG5ld2xpbmUgb24gJ3Zhcic6IGZvciAodmFyIHggPSAwLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3Rva2VuLnR5cGUgPT09ICdUS19SRVNFUlZFRCcgJiYgY3VycmVudF90b2tlbi50ZXh0ID09PSAnaWYnICYmIGZsYWdzLmxhc3RfdGV4dCA9PT0gJ2Vsc2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG5ld2xpbmUgZm9yIH0gZWxzZSBpZiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudF90b2tlbi50eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGluX2FycmF5KGN1cnJlbnRfdG9rZW4udGV4dCwgVG9rZW5pemVyLmxpbmVfc3RhcnRlcnMpICYmIGZsYWdzLmxhc3RfdGV4dCAhPT0gJyknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmludF9uZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzLm11bHRpbGluZV9mcmFtZSAmJiBpc19hcnJheShmbGFncy5tb2RlKSAmJiBmbGFncy5sYXN0X3RleHQgPT09ICcsJyAmJiBsYXN0X2xhc3RfdGV4dCA9PT0gJ30nKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoKTsgLy8gfSwgaW4gbGlzdHMgZ2V0IGEgbmV3bGluZSB0cmVhdG1lbnRcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZWZpeCA9PT0gJ1NQQUNFJykge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJpbnRfdG9rZW4oKTtcbiAgICAgICAgICAgICAgICBmbGFncy5sYXN0X3dvcmQgPSBjdXJyZW50X3Rva2VuLnRleHQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90b2tlbi50eXBlID09PSAnVEtfUkVTRVJWRUQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3Rva2VuLnRleHQgPT09ICdkbycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmRvX2Jsb2NrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50X3Rva2VuLnRleHQgPT09ICdpZicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmlmX2Jsb2NrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50X3Rva2VuLnRleHQgPT09ICdpbXBvcnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5pbXBvcnRfYmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzLmltcG9ydF9ibG9jayAmJiBjdXJyZW50X3Rva2VuLnR5cGUgPT09ICdUS19SRVNFUlZFRCcgJiYgY3VycmVudF90b2tlbi50ZXh0ID09PSAnZnJvbScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmltcG9ydF9ibG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVfc2VtaWNvbG9uKCkge1xuICAgICAgICAgICAgICAgIGlmIChzdGFydF9vZl9zdGF0ZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29uZGl0aW9uYWwgc3RhcnRzIHRoZSBzdGF0ZW1lbnQgaWYgYXBwcm9wcmlhdGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbWljb2xvbiBjYW4gYmUgdGhlIHN0YXJ0IChhbmQgZW5kKSBvZiBhIHN0YXRlbWVudFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzKGN1cnJlbnRfdG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBuZXh0X3Rva2VuID0gZ2V0X3Rva2VuKDEpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChmbGFncy5tb2RlID09PSBNT0RFLlN0YXRlbWVudCAmJlxuICAgICAgICAgICAgICAgICAgICAhKGZsYWdzLmlmX2Jsb2NrICYmIG5leHRfdG9rZW4gJiYgbmV4dF90b2tlbi50eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIG5leHRfdG9rZW4udGV4dCA9PT0gJ2Vsc2UnKSAmJlxuICAgICAgICAgICAgICAgICAgICAhZmxhZ3MuZG9fYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9tb2RlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gaGFja3kgYnV0IGVmZmVjdGl2ZSBmb3IgdGhlIG1vbWVudFxuICAgICAgICAgICAgICAgIGlmIChmbGFncy5pbXBvcnRfYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuaW1wb3J0X2Jsb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZV9zdHJpbmcoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0X29mX3N0YXRlbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb25kaXRpb25hbCBzdGFydHMgdGhlIHN0YXRlbWVudCBpZiBhcHByb3ByaWF0ZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gT25lIGRpZmZlcmVuY2UgLSBzdHJpbmdzIHdhbnQgYXQgbGVhc3QgYSBzcGFjZSBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzKGN1cnJlbnRfdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF90eXBlID09PSAnVEtfUkVTRVJWRUQnIHx8IGxhc3RfdHlwZSA9PT0gJ1RLX1dPUkQnIHx8IGZsYWdzLmlubGluZV9mcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdF90eXBlID09PSAnVEtfQ09NTUEnIHx8IGxhc3RfdHlwZSA9PT0gJ1RLX1NUQVJUX0VYUFInIHx8IGxhc3RfdHlwZSA9PT0gJ1RLX0VRVUFMUycgfHwgbGFzdF90eXBlID09PSAnVEtfT1BFUkFUT1InKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0X29mX29iamVjdF9wcm9wZXJ0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfd3JhcF9vcl9wcmVzZXJ2ZWRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZV9lcXVhbHMoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0X29mX3N0YXRlbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb25kaXRpb25hbCBzdGFydHMgdGhlIHN0YXRlbWVudCBpZiBhcHByb3ByaWF0ZS5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVfd2hpdGVzcGFjZV9hbmRfY29tbWVudHMoY3VycmVudF90b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdzLmRlY2xhcmF0aW9uX3N0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGdvdCBhbiAnPScgaW4gYSB2YXItbGluZSwgZGlmZmVyZW50IGZvcm1hdHRpbmcvbGluZS1icmVha2luZywgZXRjIHdpbGwgbm93IGJlIGRvbmVcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuZGVjbGFyYXRpb25fYXNzaWdubWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZV9jb21tYSgpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVfd2hpdGVzcGFjZV9hbmRfY29tbWVudHMoY3VycmVudF90b2tlbiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBwcmludF90b2tlbigpO1xuICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChmbGFncy5kZWNsYXJhdGlvbl9zdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2V4cHJlc3Npb24oZmxhZ3MucGFyZW50Lm1vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgYnJlYWsgb24gY29tbWEsIGZvcih2YXIgYSA9IDEsIGIgPSAyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuZGVjbGFyYXRpb25fYXNzaWdubWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzLmRlY2xhcmF0aW9uX2Fzc2lnbm1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmRlY2xhcmF0aW9uX2Fzc2lnbm1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5jb21tYV9maXJzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGNvbW1hLWZpcnN0LCB3ZSB3YW50IHRvIGFsbG93IGEgbmV3bGluZSBiZWZvcmUgdGhlIGNvbW1hXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0dXJuIGludG8gYSBuZXdsaW5lIGFmdGVyIHRoZSBjb21tYSwgd2hpY2ggd2Ugd2lsbCBmaXh1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfd3JhcF9vcl9wcmVzZXJ2ZWRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncy5tb2RlID09PSBNT0RFLk9iamVjdExpdGVyYWwgfHxcbiAgICAgICAgICAgICAgICAgICAgKGZsYWdzLm1vZGUgPT09IE1PREUuU3RhdGVtZW50ICYmIGZsYWdzLnBhcmVudC5tb2RlID09PSBNT0RFLk9iamVjdExpdGVyYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmbGFncy5tb2RlID09PSBNT0RFLlN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9tb2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZsYWdzLmlubGluZV9mcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuY29tbWFfZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRVhQUiBvciBET19CTE9DS1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY29tbWEtZmlyc3QsIHdlIHdhbnQgdG8gYWxsb3cgYSBuZXdsaW5lIGJlZm9yZSB0aGUgY29tbWFcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gdHVybiBpbnRvIGEgbmV3bGluZSBhZnRlciB0aGUgY29tbWEsIHdoaWNoIHdlIHdpbGwgZml4dXAgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dfd3JhcF9vcl9wcmVzZXJ2ZWRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gaGFuZGxlX29wZXJhdG9yKCkge1xuICAgICAgICAgICAgICAgIHZhciBpc0dlbmVyYXRvckFzdGVyaXNrID0gY3VycmVudF90b2tlbi50ZXh0ID09PSAnKicgJiZcbiAgICAgICAgICAgICAgICAgICAgKChsYXN0X3R5cGUgPT09ICdUS19SRVNFUlZFRCcgJiYgaW5fYXJyYXkoZmxhZ3MubGFzdF90ZXh0LCBbJ2Z1bmN0aW9uJywgJ3lpZWxkJ10pKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGluX2FycmF5KGxhc3RfdHlwZSwgWydUS19TVEFSVF9CTE9DSycsICdUS19DT01NQScsICdUS19FTkRfQkxPQ0snLCAnVEtfU0VNSUNPTE9OJ10pKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZhciBpc1VuYXJ5ID0gaW5fYXJyYXkoY3VycmVudF90b2tlbi50ZXh0LCBbJy0nLCAnKyddKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgIGluX2FycmF5KGxhc3RfdHlwZSwgWydUS19TVEFSVF9CTE9DSycsICdUS19TVEFSVF9FWFBSJywgJ1RLX0VRVUFMUycsICdUS19PUEVSQVRPUiddKSB8fFxuICAgICAgICAgICAgICAgICAgICBpbl9hcnJheShmbGFncy5sYXN0X3RleHQsIFRva2VuaXplci5saW5lX3N0YXJ0ZXJzKSB8fFxuICAgICAgICAgICAgICAgICAgICBmbGFncy5sYXN0X3RleHQgPT09ICcsJ1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRfb2Zfc3RhdGVtZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbmRpdGlvbmFsIHN0YXJ0cyB0aGUgc3RhdGVtZW50IGlmIGFwcHJvcHJpYXRlLlxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmVzZXJ2ZV9zdGF0ZW1lbnRfZmxhZ3MgPSAhaXNHZW5lcmF0b3JBc3RlcmlzaztcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzKGN1cnJlbnRfdG9rZW4sIHByZXNlcnZlX3N0YXRlbWVudF9mbGFncyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBpc19zcGVjaWFsX3dvcmQoZmxhZ3MubGFzdF90ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBcInJldHVyblwiIGhhZCBhIHNwZWNpYWwgaGFuZGxpbmcgaW4gVEtfV09SRC4gTm93IHdlIG5lZWQgdG8gcmV0dXJuIHRoZSBmYXZvclxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnRfdG9rZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGhhY2sgZm9yIGFjdGlvbnNjcmlwdCdzIGltcG9ydCAuKjtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90b2tlbi50ZXh0ID09PSAnKicgJiYgbGFzdF90eXBlID09PSAnVEtfRE9UJykge1xuICAgICAgICAgICAgICAgICAgICBwcmludF90b2tlbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdG9rZW4udGV4dCA9PT0gJzo6Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBubyBzcGFjZXMgYXJvdW5kIGV4b3RpYyBuYW1lc3BhY2luZyBzeW50YXggb3BlcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgcHJpbnRfdG9rZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFsbG93IGxpbmUgd3JhcHBpbmcgYmV0d2VlbiBvcGVyYXRvcnMgd2hlbiBvcGVyYXRvcl9wb3NpdGlvbiBpc1xuICAgICAgICAgICAgICAgIC8vICAgc2V0IHRvIGJlZm9yZSBvciBwcmVzZXJ2ZVxuICAgICAgICAgICAgICAgIGlmIChsYXN0X3R5cGUgPT09ICdUS19PUEVSQVRPUicgJiYgaW5fYXJyYXkob3B0Lm9wZXJhdG9yX3Bvc2l0aW9uLCBPUEVSQVRPUl9QT1NJVElPTl9CRUZPUkVfT1JfUFJFU0VSVkUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93X3dyYXBfb3JfcHJlc2VydmVkX25ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90b2tlbi50ZXh0ID09PSAnOicgJiYgZmxhZ3MuaW5fY2FzZSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5jYXNlX2JvZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnRfdG9rZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5pbl9jYXNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgc3BhY2VfYmVmb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgc3BhY2VfYWZ0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciBpbl90ZXJuYXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdG9rZW4udGV4dCA9PT0gJzonKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmbGFncy50ZXJuYXJ5X2RlcHRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb2xvbiBpcyBpbnZhbGlkIGphdmFzY3JpcHQgb3V0c2lkZSBvZiB0ZXJuYXJ5IGFuZCBvYmplY3QsIGJ1dCBkbyBvdXIgYmVzdCB0byBndWVzcyB3aGF0IHdhcyBtZWFudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlX2JlZm9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MudGVybmFyeV9kZXB0aCAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5fdGVybmFyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfdG9rZW4udGV4dCA9PT0gJz8nKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLnRlcm5hcnlfZGVwdGggKz0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBsZXQncyBoYW5kbGUgdGhlIG9wZXJhdG9yX3Bvc2l0aW9uIG9wdGlvbiBwcmlvciB0byBhbnkgY29uZmxpY3RpbmcgbG9naWNcbiAgICAgICAgICAgICAgICBpZiAoIWlzVW5hcnkgJiYgIWlzR2VuZXJhdG9yQXN0ZXJpc2sgJiYgb3B0LnByZXNlcnZlX25ld2xpbmVzICYmIGluX2FycmF5KGN1cnJlbnRfdG9rZW4udGV4dCwgVG9rZW5pemVyLnBvc2l0aW9uYWJsZV9vcGVyYXRvcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpc0NvbG9uID0gY3VycmVudF90b2tlbi50ZXh0ID09PSAnOic7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpc1Rlcm5hcnlDb2xvbiA9IChpc0NvbG9uICYmIGluX3Rlcm5hcnkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXNPdGhlckNvbG9uID0gKGlzQ29sb24gJiYgIWluX3Rlcm5hcnkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0Lm9wZXJhdG9yX3Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9QRVJBVE9SX1BPU0lUSU9OLmJlZm9yZV9uZXdsaW5lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIDogYW5kIGl0J3Mgbm90IGEgdGVybmFyeSBzdGF0ZW1lbnQgdGhlbiB3ZSBzZXQgc3BhY2VfYmVmb3JlIHRvIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9ICFpc090aGVyQ29sb247XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF90b2tlbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbG9uIHx8IGlzVGVybmFyeUNvbG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3dyYXBfb3JfcHJlc2VydmVkX25ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BFUkFUT1JfUE9TSVRJT04uYWZ0ZXJfbmV3bGluZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhbnl0aGluZyBidXQgY29sb24sIG9yICh2aWEgZGVkdWN0aW9uKSBpdCdzIGEgY29sb24gYW5kIGluIGEgdGVybmFyeSBzdGF0ZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0aGVuIHByaW50IGEgbmV3bGluZS5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbG9uIHx8IGlzVGVybmFyeUNvbG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfdG9rZW4oMSkud2FudGVkX25ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfd3JhcF9vcl9wcmVzZXJ2ZWRfbmV3bGluZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BFUkFUT1JfUE9TSVRJT04ucHJlc2VydmVfbmV3bGluZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzT3RoZXJDb2xvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd193cmFwX29yX3ByZXNlcnZlZF9uZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UganVzdCBhZGRlZCBhIG5ld2xpbmUsIG9yIHRoZSBjdXJyZW50IHRva2VuIGlzIDogYW5kIGl0J3Mgbm90IGEgdGVybmFyeSBzdGF0ZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0aGVuIHdlIHNldCBzcGFjZV9iZWZvcmUgdG8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV9iZWZvcmUgPSAhKG91dHB1dC5qdXN0X2FkZGVkX25ld2xpbmUoKSB8fCBpc090aGVyQ29sb24pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHNwYWNlX2JlZm9yZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF90b2tlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zcGFjZV9iZWZvcmVfdG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRvckFzdGVyaXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93X3dyYXBfb3JfcHJlc2VydmVkX25ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgc3BhY2VfYmVmb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0X3Rva2VuID0gZ2V0X3Rva2VuKDEpO1xuICAgICAgICAgICAgICAgICAgICBzcGFjZV9hZnRlciA9IG5leHRfdG9rZW4gJiYgaW5fYXJyYXkobmV4dF90b2tlbi50eXBlLCBbJ1RLX1dPUkQnLCAnVEtfUkVTRVJWRUQnXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50X3Rva2VuLnRleHQgPT09ICcuLi4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93X3dyYXBfb3JfcHJlc2VydmVkX25ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgc3BhY2VfYmVmb3JlID0gbGFzdF90eXBlID09PSAnVEtfU1RBUlRfQkxPQ0snO1xuICAgICAgICAgICAgICAgICAgICBzcGFjZV9hZnRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5fYXJyYXkoY3VycmVudF90b2tlbi50ZXh0LCBbJy0tJywgJysrJywgJyEnLCAnfiddKSB8fCBpc1VuYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVuYXJ5IG9wZXJhdG9ycyAoYW5kIGJpbmFyeSArLy0gcHJldGVuZGluZyB0byBiZSB1bmFyeSkgc3BlY2lhbCBjYXNlc1xuXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlX2JlZm9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBzcGFjZV9hZnRlciA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy03LjkuMVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIG5ld2xpbmUgYmV0d2VlbiAtLSBvciArKyBhbmQgYW55dGhpbmcgZWxzZSB3ZSBzaG91bGQgcHJlc2VydmUgaXQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3Rva2VuLndhbnRlZF9uZXdsaW5lICYmIChjdXJyZW50X3Rva2VuLnRleHQgPT09ICctLScgfHwgY3VycmVudF90b2tlbi50ZXh0ID09PSAnKysnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZShmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MubGFzdF90ZXh0ID09PSAnOycgJiYgaXNfZXhwcmVzc2lvbihmbGFncy5tb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yICg7OyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgXl5eXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV9iZWZvcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VfYmVmb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0X3R5cGUgPT09ICdUS19FTkRfRVhQUicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlX2JlZm9yZSA9ICEoZmxhZ3MubGFzdF90ZXh0ID09PSAnXScgJiYgKGN1cnJlbnRfdG9rZW4udGV4dCA9PT0gJy0tJyB8fCBjdXJyZW50X3Rva2VuLnRleHQgPT09ICcrKycpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0X3R5cGUgPT09ICdUS19PUEVSQVRPUicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGErKyArICsrYjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgLSAtYlxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VfYmVmb3JlID0gaW5fYXJyYXkoY3VycmVudF90b2tlbi50ZXh0LCBbJy0tJywgJy0nLCAnKysnLCAnKyddKSAmJiBpbl9hcnJheShmbGFncy5sYXN0X3RleHQsIFsnLS0nLCAnLScsICcrKycsICcrJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKyBhbmQgLSBhcmUgbm90IHVuYXJ5IHdoZW4gcHJlY2VlZGVkIGJ5IC0tIG9yICsrIG9wZXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhLS0gKyBiXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhICogK2JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgLSAtYlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KGN1cnJlbnRfdG9rZW4udGV4dCwgWycrJywgJy0nXSkgJiYgaW5fYXJyYXkoZmxhZ3MubGFzdF90ZXh0LCBbJy0tJywgJysrJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VfYWZ0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgICAgICBpZiAoKChmbGFncy5tb2RlID09PSBNT0RFLkJsb2NrU3RhdGVtZW50ICYmICFmbGFncy5pbmxpbmVfZnJhbWUpIHx8IGZsYWdzLm1vZGUgPT09IE1PREUuU3RhdGVtZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzLmxhc3RfdGV4dCA9PT0gJ3snIHx8IGZsYWdzLmxhc3RfdGV4dCA9PT0gJzsnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8geyBmb287IC0taSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb28oKTsgLS1iYXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmludF9uZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiB8fCBzcGFjZV9iZWZvcmU7XG4gICAgICAgICAgICAgICAgcHJpbnRfdG9rZW4oKTtcbiAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gc3BhY2VfYWZ0ZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZV9ibG9ja19jb21tZW50KHByZXNlcnZlX3N0YXRlbWVudF9mbGFncykge1xuICAgICAgICAgICAgICAgIGlmIChvdXRwdXQucmF3KSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5hZGRfcmF3X3Rva2VuKGN1cnJlbnRfdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90b2tlbi5kaXJlY3RpdmVzICYmIGN1cnJlbnRfdG9rZW4uZGlyZWN0aXZlcy5wcmVzZXJ2ZSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIHRlc3RpbmcgdGhlIHJhdyBvdXRwdXQgYmVoYXZpb3IsIGRvIG5vdCBhbGxvdyBhIGRpcmVjdGl2ZSB0byB0dXJuIGl0IG9mZi5cbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5yYXcgPSBvcHQudGVzdF9vdXRwdXRfcmF3O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90b2tlbi5kaXJlY3RpdmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoZmFsc2UsIHByZXNlcnZlX3N0YXRlbWVudF9mbGFncyk7XG4gICAgICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3Rva2VuLmRpcmVjdGl2ZXMucHJlc2VydmUgPT09ICdzdGFydCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5yYXcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gaW5saW5lIGJsb2NrXG4gICAgICAgICAgICAgICAgaWYgKCFhY29ybi5uZXdsaW5lLnRlc3QoY3VycmVudF90b2tlbi50ZXh0KSAmJiAhY3VycmVudF90b2tlbi53YW50ZWRfbmV3bGluZSkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnRfdG9rZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNwYWNlX2JlZm9yZV90b2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBzcGxpdF9saW5lYnJlYWtzKGN1cnJlbnRfdG9rZW4udGV4dCk7XG4gICAgICAgICAgICAgICAgdmFyIGo7IC8vIGl0ZXJhdG9yIGZvciB0aGlzIGNhc2VcbiAgICAgICAgICAgICAgICB2YXIgamF2YWRvYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBzdGFybGVzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBsYXN0SW5kZW50ID0gY3VycmVudF90b2tlbi53aGl0ZXNwYWNlX2JlZm9yZTtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdEluZGVudExlbmd0aCA9IGxhc3RJbmRlbnQubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgLy8gYmxvY2sgY29tbWVudCBzdGFydHMgd2l0aCBhIG5ldyBsaW5lXG4gICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZShmYWxzZSwgcHJlc2VydmVfc3RhdGVtZW50X2ZsYWdzKTtcbiAgICAgICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBqYXZhZG9jID0gYWxsX2xpbmVzX3N0YXJ0X3dpdGgobGluZXMuc2xpY2UoMSksICcqJyk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJsZXNzID0gZWFjaF9saW5lX21hdGNoZXNfaW5kZW50KGxpbmVzLnNsaWNlKDEpLCBsYXN0SW5kZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBmaXJzdCBsaW5lIGFsd2F5cyBpbmRlbnRlZFxuICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKGxpbmVzWzBdKTtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZShmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqYXZhZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhZG9jOiByZWZvcm1hdCBhbmQgcmUtaW5kZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmludF90b2tlbignICcgKyBsdHJpbShsaW5lc1tqXSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJsZXNzICYmIGxpbmVzW2pdLmxlbmd0aCA+IGxhc3RJbmRlbnRMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJsZXNzOiByZS1pbmRlbnQgbm9uLWVtcHR5IGNvbnRlbnQsIGF2b2lkaW5nIHRyaW1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKGxpbmVzW2pdLnN1YnN0cmluZyhsYXN0SW5kZW50TGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWwgY29tbWVudHMgb3V0cHV0IHJhd1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFkZF90b2tlbihsaW5lc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgY29tbWVudHMgb2YgbW9yZSB0aGFuIG9uZSBsaW5lLCBtYWtlIHN1cmUgdGhlcmUncyBhIG5ldyBsaW5lIGFmdGVyXG4gICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZShmYWxzZSwgcHJlc2VydmVfc3RhdGVtZW50X2ZsYWdzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gaGFuZGxlX2NvbW1lbnQocHJlc2VydmVfc3RhdGVtZW50X2ZsYWdzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdG9rZW4ud2FudGVkX25ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZShmYWxzZSwgcHJlc2VydmVfc3RhdGVtZW50X2ZsYWdzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQudHJpbSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwcmludF90b2tlbigpO1xuICAgICAgICAgICAgICAgIHByaW50X25ld2xpbmUoZmFsc2UsIHByZXNlcnZlX3N0YXRlbWVudF9mbGFncyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZV9kb3QoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0X29mX3N0YXRlbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb25kaXRpb25hbCBzdGFydHMgdGhlIHN0YXRlbWVudCBpZiBhcHByb3ByaWF0ZS5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVfd2hpdGVzcGFjZV9hbmRfY29tbWVudHMoY3VycmVudF90b2tlbiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RfdHlwZSA9PT0gJ1RLX1JFU0VSVkVEJyAmJiBpc19zcGVjaWFsX3dvcmQoZmxhZ3MubGFzdF90ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BhY2VfYmVmb3JlX3Rva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBwcmVzZXJ2ZWQgbmV3bGluZXMgYmVmb3JlIGRvdHMgaW4gZ2VuZXJhbFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBuZXdsaW5lcyBvbiBkb3RzIGFmdGVyIGNsb3NlIHBhcmVuIHdoZW4gYnJlYWtfY2hhaW5lZCAtIGZvciBiYXIoKS5iYXooKVxuICAgICAgICAgICAgICAgICAgICBhbGxvd193cmFwX29yX3ByZXNlcnZlZF9uZXdsaW5lKGZsYWdzLmxhc3RfdGV4dCA9PT0gJyknICYmIG9wdC5icmVha19jaGFpbmVkX21ldGhvZHMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZV91bmtub3duKHByZXNlcnZlX3N0YXRlbWVudF9mbGFncykge1xuICAgICAgICAgICAgICAgIHByaW50X3Rva2VuKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90b2tlbi50ZXh0W2N1cnJlbnRfdG9rZW4udGV4dC5sZW5ndGggLSAxXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmV3bGluZShmYWxzZSwgcHJlc2VydmVfc3RhdGVtZW50X2ZsYWdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZV9lb2YoKSB7XG4gICAgICAgICAgICAgICAgLy8gVW53aW5kIGFueSBvcGVuIHN0YXRlbWVudHNcbiAgICAgICAgICAgICAgICB3aGlsZSAoZmxhZ3MubW9kZSA9PT0gTU9ERS5TdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9tb2RlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZV93aGl0ZXNwYWNlX2FuZF9jb21tZW50cyhjdXJyZW50X3Rva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgZnVuY3Rpb24gT3V0cHV0TGluZShwYXJlbnQpIHtcbiAgICAgICAgICAgIHZhciBfY2hhcmFjdGVyX2NvdW50ID0gMDtcbiAgICAgICAgICAgIC8vIHVzZSBpbmRlbnRfY291bnQgYXMgYSBtYXJrZXIgZm9yIGxpbmVzIHRoYXQgaGF2ZSBwcmVzZXJ2ZWQgaW5kZW50YXRpb25cbiAgICAgICAgICAgIHZhciBfaW5kZW50X2NvdW50ID0gLTE7XG5cbiAgICAgICAgICAgIHZhciBfaXRlbXMgPSBbXTtcbiAgICAgICAgICAgIHZhciBfZW1wdHkgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLnNldF9pbmRlbnQgPSBmdW5jdGlvbihsZXZlbCkge1xuICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJfY291bnQgPSBwYXJlbnQuYmFzZUluZGVudExlbmd0aCArIGxldmVsICogcGFyZW50LmluZGVudF9sZW5ndGg7XG4gICAgICAgICAgICAgICAgX2luZGVudF9jb3VudCA9IGxldmVsO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5nZXRfY2hhcmFjdGVyX2NvdW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFyYWN0ZXJfY291bnQ7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLmlzX2VtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9lbXB0eTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMubGFzdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9pdGVtc1tfaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5wdXNoID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBfaXRlbXMucHVzaChpbnB1dCk7XG4gICAgICAgICAgICAgICAgX2NoYXJhY3Rlcl9jb3VudCArPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgX2VtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnBvcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIV9lbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtID0gX2l0ZW1zLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfY2hhcmFjdGVyX2NvdW50IC09IGl0ZW0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBfZW1wdHkgPSBfaXRlbXMubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlX2luZGVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmIChfaW5kZW50X2NvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBfaW5kZW50X2NvdW50IC09IDE7XG4gICAgICAgICAgICAgICAgICAgIF9jaGFyYWN0ZXJfY291bnQgLT0gcGFyZW50LmluZGVudF9sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy50cmltID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMubGFzdCgpID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgX2l0ZW1zLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfY2hhcmFjdGVyX2NvdW50IC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9lbXB0eSA9IF9pdGVtcy5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9pbmRlbnRfY291bnQgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50LmluZGVudF9jYWNoZVtfaW5kZW50X2NvdW50XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gX2l0ZW1zLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIE91dHB1dChpbmRlbnRfc3RyaW5nLCBiYXNlSW5kZW50U3RyaW5nKSB7XG4gICAgICAgICAgICBiYXNlSW5kZW50U3RyaW5nID0gYmFzZUluZGVudFN0cmluZyB8fCAnJztcbiAgICAgICAgICAgIHRoaXMuaW5kZW50X2NhY2hlID0gW2Jhc2VJbmRlbnRTdHJpbmddO1xuICAgICAgICAgICAgdGhpcy5iYXNlSW5kZW50TGVuZ3RoID0gYmFzZUluZGVudFN0cmluZy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmluZGVudF9sZW5ndGggPSBpbmRlbnRfc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMucmF3ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHZhciBsaW5lcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5iYXNlSW5kZW50U3RyaW5nID0gYmFzZUluZGVudFN0cmluZztcbiAgICAgICAgICAgIHRoaXMuaW5kZW50X3N0cmluZyA9IGluZGVudF9zdHJpbmc7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX2xpbmUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50X2xpbmUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zcGFjZV9iZWZvcmVfdG9rZW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy5hZGRfb3V0cHV0bGluZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNfbGluZSA9IHRoaXMuY3VycmVudF9saW5lO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudF9saW5lID0gbmV3IE91dHB1dExpbmUodGhpcyk7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaCh0aGlzLmN1cnJlbnRfbGluZSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBpbml0aWFsaXplXG4gICAgICAgICAgICB0aGlzLmFkZF9vdXRwdXRsaW5lKCk7XG5cblxuICAgICAgICAgICAgdGhpcy5nZXRfbGluZV9udW1iZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGluZXMubGVuZ3RoO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gVXNpbmcgb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nIHRvIGFsbG93IGZvciBsYXRlciBleHBhbnNpb24gb2YgaW5mbyBhYm91dCBlYWNoIGxpbmVcbiAgICAgICAgICAgIHRoaXMuYWRkX25ld19saW5lID0gZnVuY3Rpb24oZm9yY2VfbmV3bGluZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldF9saW5lX251bWJlcigpID09PSAxICYmIHRoaXMuanVzdF9hZGRlZF9uZXdsaW5lKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBuZXdsaW5lIG9uIHN0YXJ0IG9mIGZpbGVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZm9yY2VfbmV3bGluZSB8fCAhdGhpcy5qdXN0X2FkZGVkX25ld2xpbmUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmF3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZF9vdXRwdXRsaW5lKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5nZXRfY29kZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBzd2VldF9jb2RlID0gbGluZXMuam9pbignXFxuJykucmVwbGFjZSgvW1xcclxcblxcdCBdKyQvLCAnJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN3ZWV0X2NvZGU7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnNldF9pbmRlbnQgPSBmdW5jdGlvbihsZXZlbCkge1xuICAgICAgICAgICAgICAgIC8vIE5ldmVyIGluZGVudCB5b3VyIGZpcnN0IG91dHB1dCBpbmRlbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlXG4gICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxldmVsID49IHRoaXMuaW5kZW50X2NhY2hlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnRfY2FjaGUucHVzaCh0aGlzLmluZGVudF9jYWNoZVt0aGlzLmluZGVudF9jYWNoZS5sZW5ndGggLSAxXSArIHRoaXMuaW5kZW50X3N0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRfbGluZS5zZXRfaW5kZW50KGxldmVsKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudF9saW5lLnNldF9pbmRlbnQoMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5hZGRfcmF3X3Rva2VuID0gZnVuY3Rpb24odG9rZW4pIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2VuLm5ld2xpbmVzOyB4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRfb3V0cHV0bGluZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRfbGluZS5wdXNoKHRva2VuLndoaXRlc3BhY2VfYmVmb3JlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRfbGluZS5wdXNoKHRva2VuLnRleHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BhY2VfYmVmb3JlX3Rva2VuID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLmFkZF90b2tlbiA9IGZ1bmN0aW9uKHByaW50YWJsZV90b2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkX3NwYWNlX2JlZm9yZV90b2tlbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudF9saW5lLnB1c2gocHJpbnRhYmxlX3Rva2VuKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuYWRkX3NwYWNlX2JlZm9yZV90b2tlbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNwYWNlX2JlZm9yZV90b2tlbiAmJiAhdGhpcy5qdXN0X2FkZGVkX25ld2xpbmUoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRfbGluZS5wdXNoKCcgJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3BhY2VfYmVmb3JlX3Rva2VuID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnJlbW92ZV9yZWR1bmRhbnRfaW5kZW50YXRpb24gPSBmdW5jdGlvbihmcmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgZWZmZWN0aXZlIGJ1dCBoYXMgc29tZSBpc3N1ZXM6XG4gICAgICAgICAgICAgICAgLy8gICAgIC0gY2FuIGNhdXNlIGxpbmUgd3JhcCB0byBoYXBwZW4gdG9vIHNvb24gZHVlIHRvIGluZGVudCByZW1vdmFsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgIGFmdGVyIHdyYXAgcG9pbnRzIGFyZSBjYWxjdWxhdGVkXG4gICAgICAgICAgICAgICAgLy8gVGhlc2UgaXNzdWVzIGFyZSBtaW5vciBjb21wYXJlZCB0byB1Z2x5IGluZGVudGF0aW9uLlxuXG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lLm11bHRpbGluZV9mcmFtZSB8fFxuICAgICAgICAgICAgICAgICAgICBmcmFtZS5tb2RlID09PSBNT0RFLkZvckluaXRpYWxpemVyIHx8XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lLm1vZGUgPT09IE1PREUuQ29uZGl0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBvbmUgaW5kZW50IGZyb20gZWFjaCBsaW5lIGluc2lkZSB0aGlzIHNlY3Rpb25cbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBmcmFtZS5zdGFydF9saW5lX2luZGV4O1xuXG4gICAgICAgICAgICAgICAgdmFyIG91dHB1dF9sZW5ndGggPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgb3V0cHV0X2xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lc1tpbmRleF0ucmVtb3ZlX2luZGVudCgpO1xuICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMudHJpbSA9IGZ1bmN0aW9uKGVhdF9uZXdsaW5lcykge1xuICAgICAgICAgICAgICAgIGVhdF9uZXdsaW5lcyA9IChlYXRfbmV3bGluZXMgPT09IHVuZGVmaW5lZCkgPyBmYWxzZSA6IGVhdF9uZXdsaW5lcztcblxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudF9saW5lLnRyaW0oaW5kZW50X3N0cmluZywgYmFzZUluZGVudFN0cmluZyk7XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoZWF0X25ld2xpbmVzICYmIGxpbmVzLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50X2xpbmUuaXNfZW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50X2xpbmUgPSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50X2xpbmUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNfbGluZSA9IGxpbmVzLmxlbmd0aCA+IDEgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAyXSA6IG51bGw7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLmp1c3RfYWRkZWRfbmV3bGluZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRfbGluZS5pc19lbXB0eSgpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5qdXN0X2FkZGVkX2JsYW5rbGluZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmp1c3RfYWRkZWRfbmV3bGluZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBzdGFydCBvZiB0aGUgZmlsZSBhbmQgbmV3bGluZSA9IGJsYW5rXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZS5pc19lbXB0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIElucHV0U2Nhbm5lciA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgX2lucHV0ID0gaW5wdXQ7XG4gICAgICAgICAgICB2YXIgX2lucHV0X2xlbmd0aCA9IF9pbnB1dC5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgX3Bvc2l0aW9uID0gMDtcblxuICAgICAgICAgICAgdGhpcy5iYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgX3Bvc2l0aW9uIC09IDE7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLmhhc05leHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3Bvc2l0aW9uIDwgX2lucHV0X2xlbmd0aDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc05leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWwgPSBfaW5wdXQuY2hhckF0KF9wb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIF9wb3NpdGlvbiArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5wZWVrID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4IHx8IDA7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgX2lucHV0X2xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YWwgPSBfaW5wdXQuY2hhckF0KGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMucGVla0NoYXJDb2RlID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gMDtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4IHx8IDA7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgX2lucHV0X2xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YWwgPSBfaW5wdXQuY2hhckNvZGVBdChpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnRlc3QgPSBmdW5jdGlvbihwYXR0ZXJuLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggfHwgMDtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLmxhc3RJbmRleCA9IF9wb3NpdGlvbiArIGluZGV4O1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoX2lucHV0KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMudGVzdENoYXIgPSBmdW5jdGlvbihwYXR0ZXJuLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLnBlZWsoaW5kZXgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgcGF0dGVybi50ZXN0KHZhbCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLm1hdGNoID0gZnVuY3Rpb24ocGF0dGVybikge1xuICAgICAgICAgICAgICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgIHZhciBwYXR0ZXJuX21hdGNoID0gcGF0dGVybi5leGVjKF9pbnB1dCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm5fbWF0Y2ggJiYgcGF0dGVybl9tYXRjaC5pbmRleCA9PT0gX3Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIF9wb3NpdGlvbiArPSBwYXR0ZXJuX21hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX21hdGNoID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm5fbWF0Y2g7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBUb2tlbiA9IGZ1bmN0aW9uKHR5cGUsIHRleHQsIG5ld2xpbmVzLCB3aGl0ZXNwYWNlX2JlZm9yZSwgcGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcblxuICAgICAgICAgICAgLy8gY29tbWVudHNfYmVmb3JlIGFyZVxuICAgICAgICAgICAgLy8gY29tbWVudHMgdGhhdCBoYXZlIGEgbmV3IGxpbmUgYmVmb3JlIHRoZW1cbiAgICAgICAgICAgIC8vIGFuZCBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgbmV3bGluZSBhZnRlclxuICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNldCBvZiBjb21tZW50cyBiZWZvcmVcbiAgICAgICAgICAgIHRoaXMuY29tbWVudHNfYmVmb3JlID0gLyogaW5saW5lIGNvbW1lbnQqLyBbXTtcblxuXG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRzX2FmdGVyID0gW107IC8vIG5vIG5ldyBsaW5lIGJlZm9yZSBhbmQgbmV3bGluZSBhZnRlclxuICAgICAgICAgICAgdGhpcy5uZXdsaW5lcyA9IG5ld2xpbmVzIHx8IDA7XG4gICAgICAgICAgICB0aGlzLndhbnRlZF9uZXdsaW5lID0gbmV3bGluZXMgPiAwO1xuICAgICAgICAgICAgdGhpcy53aGl0ZXNwYWNlX2JlZm9yZSA9IHdoaXRlc3BhY2VfYmVmb3JlIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMub3BlbmVkID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gdG9rZW5pemVyKGlucHV0X3N0cmluZywgb3B0cykge1xuXG4gICAgICAgICAgICB2YXIgd2hpdGVzcGFjZSA9IFwiXFxuXFxyXFx0IFwiLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIHZhciBkaWdpdCA9IC9bMC05XS87XG4gICAgICAgICAgICB2YXIgZGlnaXRfYmluID0gL1swMV0vO1xuICAgICAgICAgICAgdmFyIGRpZ2l0X29jdCA9IC9bMDEyMzQ1NjddLztcbiAgICAgICAgICAgIHZhciBkaWdpdF9oZXggPSAvWzAxMjM0NTY3ODlhYmNkZWZBQkNERUZdLztcblxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbmFibGVfb3BlcmF0b3JzID0gJyE9ICE9PSAlICYgJiYgKiAqKiArIC0gLyA6IDwgPDwgPD0gPT0gPT09ID4gPj0gPj4gPj4+ID8gXiB8IHx8Jy5zcGxpdCgnICcpO1xuICAgICAgICAgICAgdmFyIHB1bmN0ID0gdGhpcy5wb3NpdGlvbmFibGVfb3BlcmF0b3JzLmNvbmNhdChcbiAgICAgICAgICAgICAgICAvLyBub24tcG9zaXRpb25hYmxlIG9wZXJhdG9ycyAtIHRoZXNlIGRvIG5vdCBmb2xsb3cgb3BlcmF0b3IgcG9zaXRpb24gc2V0dGluZ3NcbiAgICAgICAgICAgICAgICAnISAlPSAmPSAqPSAqKj0gKysgKz0gLCAtLSAtPSAvPSA6OiA8PD0gPSA9PiA+Pj0gPj4+PSBePSB8PSB+IC4uLicuc3BsaXQoJyAnKSk7XG5cbiAgICAgICAgICAgIC8vIHdvcmRzIHdoaWNoIHNob3VsZCBhbHdheXMgc3RhcnQgb24gbmV3IGxpbmUuXG4gICAgICAgICAgICB0aGlzLmxpbmVfc3RhcnRlcnMgPSAnY29udGludWUsdHJ5LHRocm93LHJldHVybix2YXIsbGV0LGNvbnN0LGlmLHN3aXRjaCxjYXNlLGRlZmF1bHQsZm9yLHdoaWxlLGJyZWFrLGZ1bmN0aW9uLGltcG9ydCxleHBvcnQnLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICB2YXIgcmVzZXJ2ZWRfd29yZHMgPSB0aGlzLmxpbmVfc3RhcnRlcnMuY29uY2F0KFsnZG8nLCAnaW4nLCAnb2YnLCAnZWxzZScsICdnZXQnLCAnc2V0JywgJ25ldycsICdjYXRjaCcsICdmaW5hbGx5JywgJ3R5cGVvZicsICd5aWVsZCcsICdhc3luYycsICdhd2FpdCcsICdmcm9tJywgJ2FzJ10pO1xuXG4gICAgICAgICAgICAvLyAgLyogLi4uICovIGNvbW1lbnQgZW5kcyB3aXRoIG5lYXJlc3QgKi8gb3IgZW5kIG9mIGZpbGVcbiAgICAgICAgICAgIHZhciBibG9ja19jb21tZW50X3BhdHRlcm4gPSAvKFtcXHNcXFNdKj8pKCg/OlxcKlxcLyl8JCkvZztcblxuICAgICAgICAgICAgLy8gY29tbWVudCBlbmRzIGp1c3QgYmVmb3JlIG5lYXJlc3QgbGluZWZlZWQgb3IgZW5kIG9mIGZpbGVcbiAgICAgICAgICAgIHZhciBjb21tZW50X3BhdHRlcm4gPSAvKFteXFxuXFxyXFx1MjAyOFxcdTIwMjldKikvZztcblxuICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZXNfYmxvY2tfcGF0dGVybiA9IC9cXC9cXCogYmVhdXRpZnkoIFxcdytbOl1cXHcrKSsgXFwqXFwvL2c7XG4gICAgICAgICAgICB2YXIgZGlyZWN0aXZlX3BhdHRlcm4gPSAvIChcXHcrKVs6XShcXHcrKS9nO1xuICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZXNfZW5kX2lnbm9yZV9wYXR0ZXJuID0gLyhbXFxzXFxTXSo/KSgoPzpcXC9cXCpcXHNiZWF1dGlmeVxcc2lnbm9yZTplbmRcXHNcXCpcXC8pfCQpL2c7XG5cbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZV9wYXR0ZXJuID0gLygoPFxcP3BocHw8XFw/PSlbXFxzXFxTXSo/XFw/Pil8KDwlW1xcc1xcU10qPyU+KS9nO1xuXG4gICAgICAgICAgICB2YXIgbl9uZXdsaW5lcywgd2hpdGVzcGFjZV9iZWZvcmVfdG9rZW4sIGluX2h0bWxfY29tbWVudCwgdG9rZW5zO1xuICAgICAgICAgICAgdmFyIGlucHV0O1xuXG4gICAgICAgICAgICB0aGlzLnRva2VuaXplID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgSW5wdXRTY2FubmVyKGlucHV0X3N0cmluZyk7XG4gICAgICAgICAgICAgICAgaW5faHRtbF9jb21tZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdG9rZW5zID0gW107XG5cbiAgICAgICAgICAgICAgICB2YXIgbmV4dCwgbGFzdDtcbiAgICAgICAgICAgICAgICB2YXIgdG9rZW5fdmFsdWVzO1xuICAgICAgICAgICAgICAgIHZhciBvcGVuID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YXIgb3Blbl9zdGFjayA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBjb21tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKCEobGFzdCAmJiBsYXN0LnR5cGUgPT09ICdUS19FT0YnKSkge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbl92YWx1ZXMgPSB0b2tlbml6ZV9uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIG5leHQgPSBuZXcgVG9rZW4odG9rZW5fdmFsdWVzWzFdLCB0b2tlbl92YWx1ZXNbMF0sIG5fbmV3bGluZXMsIHdoaXRlc3BhY2VfYmVmb3JlX3Rva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQudHlwZSA9PT0gJ1RLX0NPTU1FTlQnIHx8IG5leHQudHlwZSA9PT0gJ1RLX0JMT0NLX0NPTU1FTlQnIHx8IG5leHQudHlwZSA9PT0gJ1RLX1VOS05PV04nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC50eXBlID09PSAnVEtfQkxPQ0tfQ09NTUVOVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmRpcmVjdGl2ZXMgPSB0b2tlbl92YWx1ZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5fdmFsdWVzID0gdG9rZW5pemVfbmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG5ldyBUb2tlbih0b2tlbl92YWx1ZXNbMV0sIHRva2VuX3ZhbHVlc1swXSwgbl9uZXdsaW5lcywgd2hpdGVzcGFjZV9iZWZvcmVfdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5jb21tZW50c19iZWZvcmUgPSBjb21tZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC50eXBlID09PSAnVEtfU1RBUlRfQkxPQ0snIHx8IG5leHQudHlwZSA9PT0gJ1RLX1NUQVJUX0VYUFInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0LnBhcmVudCA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuX3N0YWNrLnB1c2gob3Blbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuID0gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgobmV4dC50eXBlID09PSAnVEtfRU5EX0JMT0NLJyB8fCBuZXh0LnR5cGUgPT09ICdUS19FTkRfRVhQUicpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAob3BlbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHQudGV4dCA9PT0gJ10nICYmIG9wZW4udGV4dCA9PT0gJ1snKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXh0LnRleHQgPT09ICcpJyAmJiBvcGVuLnRleHQgPT09ICcoJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dC50ZXh0ID09PSAnfScgJiYgb3Blbi50ZXh0ID09PSAneycpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQucGFyZW50ID0gb3Blbi5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0Lm9wZW5lZCA9IG9wZW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gPSBvcGVuX3N0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2gobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGxhc3QgPSBuZXh0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRfZGlyZWN0aXZlcyh0ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0Lm1hdGNoKGRpcmVjdGl2ZXNfYmxvY2tfcGF0dGVybikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZXMgPSB7fTtcbiAgICAgICAgICAgICAgICBkaXJlY3RpdmVfcGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIHZhciBkaXJlY3RpdmVfbWF0Y2ggPSBkaXJlY3RpdmVfcGF0dGVybi5leGVjKHRleHQpO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGRpcmVjdGl2ZV9tYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzW2RpcmVjdGl2ZV9tYXRjaFsxXV0gPSBkaXJlY3RpdmVfbWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZV9tYXRjaCA9IGRpcmVjdGl2ZV9wYXR0ZXJuLmV4ZWModGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHRva2VuaXplX25leHQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdGluZ19zdHJpbmc7XG4gICAgICAgICAgICAgICAgdmFyIHdoaXRlc3BhY2Vfb25fdGhpc19saW5lID0gW107XG5cbiAgICAgICAgICAgICAgICBuX25ld2xpbmVzID0gMDtcbiAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlX2JlZm9yZV90b2tlbiA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdmFyIGMgPSBpbnB1dC5uZXh0KCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWycnLCAnVEtfRU9GJ107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGxhc3RfdG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdF90b2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHRoZSBzYWtlIG9mIHRva2VuaXppbmcgd2UgY2FuIHByZXRlbmQgdGhhdCB0aGVyZSB3YXMgb24gb3BlbiBicmFjZSB0byBzdGFydFxuICAgICAgICAgICAgICAgICAgICBsYXN0X3Rva2VuID0gbmV3IFRva2VuKCdUS19TVEFSVF9CTE9DSycsICd7Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGluX2FycmF5KGMsIHdoaXRlc3BhY2UpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjb3JuLm5ld2xpbmUudGVzdChjKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYyA9PT0gJ1xcbicgJiYgaW5wdXQucGVlaygtMikgPT09ICdcXHInKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fbmV3bGluZXMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlX29uX3RoaXNfbGluZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZV9vbl90aGlzX2xpbmUucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGMgPSBpbnB1dC5uZXh0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbJycsICdUS19FT0YnXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh3aGl0ZXNwYWNlX29uX3RoaXNfbGluZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZV9iZWZvcmVfdG9rZW4gPSB3aGl0ZXNwYWNlX29uX3RoaXNfbGluZS5qb2luKCcnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZGlnaXQudGVzdChjKSB8fCAoYyA9PT0gJy4nICYmIGlucHV0LnRlc3RDaGFyKGRpZ2l0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFsbG93X2RlY2ltYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWxsb3dfZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbF9kaWdpdCA9IGRpZ2l0O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnMCcgJiYgaW5wdXQudGVzdENoYXIoL1tYeE9vQmJdLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBoZXgvb2N0L2JpbiBudW1iZXIsIG5vIGRlY2ltYWwgb3IgZSwganVzdCBoZXgvb2N0L2JpbiBkaWdpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X2RlY2ltYWwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC50ZXN0Q2hhcigvW0JiXS8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfZGlnaXQgPSBkaWdpdF9iaW47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnRlc3RDaGFyKC9bT29dLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9kaWdpdCA9IGRpZ2l0X29jdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfZGlnaXQgPSBkaWdpdF9oZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjICs9IGlucHV0Lm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnLicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgaGF2ZSBhIGRlY2ltYWwgZm9yIHRoaXMgbGl0ZXJhbCwgZG9uJ3QgYWxsb3cgYW5vdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfZGVjaW1hbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGlzIGZpcnN0IGxvb3Agd2lsbCBydW4uICBJdCBrZWVwcyB0aGUgbG9naWMgc2ltcGxlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZGlnaXRzXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbnB1dC50ZXN0Q2hhcihsb2NhbF9kaWdpdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgKz0gaW5wdXQubmV4dCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dfZGVjaW1hbCAmJiBpbnB1dC5wZWVrKCkgPT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgKz0gaW5wdXQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X2RlY2ltYWwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSA9IDEuZS03IGlzIHZhbGlkLCBzbyB3ZSB0ZXN0IGZvciAuIHRoZW4gZSBpbiBvbmUgbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93X2UgJiYgaW5wdXQudGVzdENoYXIoL1tFZV0vKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgKz0gaW5wdXQubmV4dCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LnRlc3RDaGFyKC9bKy1dLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyArPSBpbnB1dC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X2RlY2ltYWwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbYywgJ1RLX1dPUkQnXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYWNvcm4uaXNJZGVudGlmaWVyU3RhcnQoaW5wdXQucGVla0NoYXJDb2RlKC0xKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmhhc05leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFjb3JuLmlzSWRlbnRpZmllckNoYXIoaW5wdXQucGVla0NoYXJDb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyArPSBpbnB1dC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5oYXNOZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEobGFzdF90b2tlbi50eXBlID09PSAnVEtfRE9UJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0X3Rva2VuLnR5cGUgPT09ICdUS19SRVNFUlZFRCcgJiYgaW5fYXJyYXkobGFzdF90b2tlbi50ZXh0LCBbJ3NldCcsICdnZXQnXSkpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaW5fYXJyYXkoYywgcmVzZXJ2ZWRfd29yZHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ2luJyB8fCBjID09PSAnb2YnKSB7IC8vIGhhY2sgZm9yICdpbicgYW5kICdvZicgb3BlcmF0b3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjLCAnVEtfT1BFUkFUT1InXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbYywgJ1RLX1JFU0VSVkVEJ107XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2MsICdUS19XT1JEJ107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGMgPT09ICcoJyB8fCBjID09PSAnWycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjLCAnVEtfU1RBUlRfRVhQUiddO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjID09PSAnKScgfHwgYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbYywgJ1RLX0VORF9FWFBSJ107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGMgPT09ICd7Jykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2MsICdUS19TVEFSVF9CTE9DSyddO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjID09PSAnfScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjLCAnVEtfRU5EX0JMT0NLJ107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGMgPT09ICc7Jykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2MsICdUS19TRU1JQ09MT04nXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50X21hdGNoO1xuICAgICAgICAgICAgICAgICAgICAvLyBwZWVrIGZvciBjb21tZW50IC8qIC4uLiAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQucGVlaygpID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Lm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfbWF0Y2ggPSBpbnB1dC5tYXRjaChibG9ja19jb21tZW50X3BhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9ICcvKicgKyBjb21tZW50X21hdGNoWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZXMgPSBnZXRfZGlyZWN0aXZlcyhjb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3RpdmVzICYmIGRpcmVjdGl2ZXMuaWdub3JlID09PSAnc3RhcnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudF9tYXRjaCA9IGlucHV0Lm1hdGNoKGRpcmVjdGl2ZXNfZW5kX2lnbm9yZV9wYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICs9IGNvbW1lbnRfbWF0Y2hbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudC5yZXBsYWNlKGFjb3JuLmFsbExpbmVCcmVha3MsICdcXG4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbY29tbWVudCwgJ1RLX0JMT0NLX0NPTU1FTlQnLCBkaXJlY3RpdmVzXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBwZWVrIGZvciBjb21tZW50IC8vIC4uLlxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQucGVlaygpID09PSAnLycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Lm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfbWF0Y2ggPSBpbnB1dC5tYXRjaChjb21tZW50X3BhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9ICcvLycgKyBjb21tZW50X21hdGNoWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjb21tZW50LCAnVEtfQ09NTUVOVCddO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRYbWxSZWdFeHAgPSAvPCgpKFstYS16QS1aOjAtOV8uXSt8e1tcXHNcXFNdKz99fCFcXFtDREFUQVxcW1tcXHNcXFNdKj9cXF1cXF0pKFxccyt7W1xcc1xcU10rP318XFxzK1stYS16QS1aOjAtOV8uXSt8XFxzK1stYS16QS1aOjAtOV8uXStcXHMqPVxccyooJ1teJ10qJ3xcIlteXCJdKlwifHtbXFxzXFxTXSs/fSkpKlxccyooXFwvPylcXHMqPi9nO1xuXG4gICAgICAgICAgICAgICAgaWYgKGMgPT09ICdgJyB8fCBjID09PSBcIidcIiB8fCBjID09PSAnXCInIHx8IC8vIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYyA9PT0gJy8nKSB8fCAvLyByZWdleHBcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcHRzLmU0eCAmJiBjID09PSBcIjxcIiAmJiBpbnB1dC50ZXN0KHN0YXJ0WG1sUmVnRXhwLCAtMSkpIC8vIHhtbFxuICAgICAgICAgICAgICAgICAgICApICYmICggLy8gcmVnZXggYW5kIHhtbCBjYW4gb25seSBhcHBlYXIgaW4gc3BlY2lmaWMgbG9jYXRpb25zIGR1cmluZyBwYXJzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAobGFzdF90b2tlbi50eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGluX2FycmF5KGxhc3RfdG9rZW4udGV4dCwgWydyZXR1cm4nLCAnY2FzZScsICd0aHJvdycsICdlbHNlJywgJ2RvJywgJ3R5cGVvZicsICd5aWVsZCddKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0X3Rva2VuLnR5cGUgPT09ICdUS19FTkRfRVhQUicgJiYgbGFzdF90b2tlbi50ZXh0ID09PSAnKScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3Rva2VuLnBhcmVudCAmJiBsYXN0X3Rva2VuLnBhcmVudC50eXBlID09PSAnVEtfUkVTRVJWRUQnICYmIGluX2FycmF5KGxhc3RfdG9rZW4ucGFyZW50LnRleHQsIFsnaWYnLCAnd2hpbGUnLCAnZm9yJ10pKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGluX2FycmF5KGxhc3RfdG9rZW4udHlwZSwgWydUS19DT01NRU5UJywgJ1RLX1NUQVJUX0VYUFInLCAnVEtfU1RBUlRfQkxPQ0snLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUS19FTkRfQkxPQ0snLCAnVEtfT1BFUkFUT1InLCAnVEtfRVFVQUxTJywgJ1RLX0VPRicsICdUS19TRU1JQ09MT04nLCAnVEtfQ09NTUEnXG4gICAgICAgICAgICAgICAgICAgICAgICBdKSlcbiAgICAgICAgICAgICAgICAgICAgKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZXAgPSBjLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXNjID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNfY2hhcl9lc2NhcGVzID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nX3N0cmluZyA9IGM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlcCA9PT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHJlZ2V4cFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbl9jaGFyX2NsYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5wdXQuaGFzTmV4dCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChlc2MgfHwgaW5fY2hhcl9jbGFzcyB8fCBpbnB1dC5wZWVrKCkgIT09IHNlcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlucHV0LnRlc3RDaGFyKGFjb3JuLm5ld2xpbmUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ19zdHJpbmcgKz0gaW5wdXQucGVlaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXNjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzYyA9IGlucHV0LnBlZWsoKSA9PT0gJ1xcXFwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQucGVlaygpID09PSAnWycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2NoYXJfY2xhc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnBlZWsoKSA9PT0gJ10nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9jaGFyX2NsYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdHMuZTR4ICYmIHNlcCA9PT0gJzwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGU0eCB4bWwgbGl0ZXJhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4bWxSZWdFeHAgPSAvW1xcc1xcU10qPzwoXFwvPykoWy1hLXpBLVo6MC05Xy5dK3x7W1xcc1xcU10rP318IVxcW0NEQVRBXFxbW1xcc1xcU10qP1xcXVxcXSkoXFxzK3tbXFxzXFxTXSs/fXxcXHMrWy1hLXpBLVo6MC05Xy5dK3xcXHMrWy1hLXpBLVo6MC05Xy5dK1xccyo9XFxzKignW14nXSonfFwiW15cIl0qXCJ8e1tcXHNcXFNdKz99KSkqXFxzKihcXC8/KVxccyo+L2c7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5iYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgeG1sU3RyID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBpbnB1dC5tYXRjaChzdGFydFhtbFJlZ0V4cCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmltIHJvb3QgdGFnIHRvIGF0dGVtcHQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdFRhZyA9IG1hdGNoWzJdLnJlcGxhY2UoL157XFxzKy8sICd7JykucmVwbGFjZSgvXFxzK30kLywgJ30nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNDdXJseVJvb3QgPSByb290VGFnLmluZGV4T2YoJ3snKSA9PT0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVwdGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNFbmRUYWcgPSAhIW1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFnTmFtZSA9IG1hdGNoWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNTaW5nbGV0b25UYWcgPSAoISFtYXRjaFttYXRjaC5sZW5ndGggLSAxXSkgfHwgKHRhZ05hbWUuc2xpY2UoMCwgOCkgPT09IFwiIVtDREFUQVtcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTaW5nbGV0b25UYWcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YWdOYW1lID09PSByb290VGFnIHx8IChpc0N1cmx5Um9vdCAmJiB0YWdOYW1lLnJlcGxhY2UoL157XFxzKy8sICd7JykucmVwbGFjZSgvXFxzK30kLywgJ30nKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWRlcHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2RlcHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFN0ciArPSBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRoIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gaW5wdXQubWF0Y2goeG1sUmVnRXhwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGNsb3NlIGNvcnJlY3RseSwga2VlcCB1bmZvcm1hdHRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFN0ciArPSBpbnB1dC5tYXRjaCgvW1xcc1xcU10qL2cpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTdHIgPSB4bWxTdHIucmVwbGFjZShhY29ybi5hbGxMaW5lQnJlYWtzLCAnXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt4bWxTdHIsIFwiVEtfU1RSSU5HXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyc2Vfc3RyaW5nID0gZnVuY3Rpb24oZGVsaW1pdGVyLCBhbGxvd191bmVzY2FwZWRfbmV3bGluZXMsIHN0YXJ0X3N1Yikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlbXBsYXRlIHN0cmluZ3MgY2FuIHRyYXZlcnMgbGluZXMgd2l0aG91dCBlc2NhcGUgY2hhcmFjdGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBzdHJpbmdzIGNhbm5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50X2NoYXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlucHV0Lmhhc05leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2NoYXIgPSBpbnB1dC5wZWVrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGVzYyB8fCAoY3VycmVudF9jaGFyICE9PSBkZWxpbWl0ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb3dfdW5lc2NhcGVkX25ld2xpbmVzIHx8ICFhY29ybi5uZXdsaW5lLnRlc3QoY3VycmVudF9jaGFyKSkpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgXFxyXFxuIGxpbmVicmVha3MgYWZ0ZXIgZXNjYXBlcyBvciBpbiB0ZW1wbGF0ZSBzdHJpbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZXNjIHx8IGFsbG93X3VuZXNjYXBlZF9uZXdsaW5lcykgJiYgYWNvcm4ubmV3bGluZS50ZXN0KGN1cnJlbnRfY2hhcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X2NoYXIgPT09ICdcXHInICYmIGlucHV0LnBlZWsoMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY2hhciA9IGlucHV0LnBlZWsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ19zdHJpbmcgKz0gJ1xcbic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdfc3RyaW5nICs9IGN1cnJlbnRfY2hhcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X2NoYXIgPT09ICd4JyB8fCBjdXJyZW50X2NoYXIgPT09ICd1Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19jaGFyX2VzY2FwZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2MgPSBjdXJyZW50X2NoYXIgPT09ICdcXFxcJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Lm5leHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRfc3ViICYmIHJlc3VsdGluZ19zdHJpbmcuaW5kZXhPZihzdGFydF9zdWIsIHJlc3VsdGluZ19zdHJpbmcubGVuZ3RoIC0gc3RhcnRfc3ViLmxlbmd0aCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsaW1pdGVyID09PSAnYCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9zdHJpbmcoJ30nLCBhbGxvd191bmVzY2FwZWRfbmV3bGluZXMsICdgJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3N0cmluZygnYCcsIGFsbG93X3VuZXNjYXBlZF9uZXdsaW5lcywgJyR7Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5oYXNOZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdfc3RyaW5nICs9IGlucHV0Lm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXAgPT09ICdgJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3N0cmluZygnYCcsIHRydWUsICckeycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9zdHJpbmcoc2VwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNfY2hhcl9lc2NhcGVzICYmIG9wdHMudW5lc2NhcGVfc3RyaW5ncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nX3N0cmluZyA9IHVuZXNjYXBlX3N0cmluZyhyZXN1bHRpbmdfc3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5wZWVrKCkgPT09IHNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nX3N0cmluZyArPSBzZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5uZXh0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXAgPT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2V4cHMgbWF5IGhhdmUgbW9kaWZpZXJzIC9yZWdleHAvTU9EICwgc28gZmV0Y2ggdGhvc2UsIHRvb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgW2dpbV0gYXJlIHZhbGlkLCBidXQgaWYgdGhlIHVzZXIgcHV0cyBpbiBnYXJiYWdlLCBkbyB3aGF0IHdlIGNhbiB0byB0YWtlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbnB1dC5oYXNOZXh0KCkgJiYgYWNvcm4uaXNJZGVudGlmaWVyU3RhcnQoaW5wdXQucGVla0NoYXJDb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ19zdHJpbmcgKz0gaW5wdXQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3Jlc3VsdGluZ19zdHJpbmcsICdUS19TVFJJTkcnXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJyMnKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDAgJiYgaW5wdXQucGVlaygpID09PSAnIScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNoZWJhbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ19zdHJpbmcgPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlucHV0Lmhhc05leHQoKSAmJiBjICE9PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBpbnB1dC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nX3N0cmluZyArPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0cmltKHJlc3VsdGluZ19zdHJpbmcpICsgJ1xcbicsICdUS19VTktOT1dOJ107XG4gICAgICAgICAgICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU3BpZGVybW9ua2V5LXNwZWNpZmljIHNoYXJwIHZhcmlhYmxlcyBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9Fbi9TaGFycF92YXJpYWJsZXNfaW5fSmF2YVNjcmlwdFxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vbXhyLm1vemlsbGEub3JnL21vemlsbGEtY2VudHJhbC9zb3VyY2UvanMvc3JjL2pzc2Nhbi5jcHAgYXJvdW5kIGxpbmUgMTkzNVxuICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcnAgPSAnIyc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5oYXNOZXh0KCkgJiYgaW5wdXQudGVzdENoYXIoZGlnaXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGlucHV0Lm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFycCArPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoaW5wdXQuaGFzTmV4dCgpICYmIGMgIT09ICcjJyAmJiBjICE9PSAnPScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09ICcjJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnBlZWsoKSA9PT0gJ1snICYmIGlucHV0LnBlZWsoMSkgPT09ICddJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJwICs9ICdbXSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Lm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQucGVlaygpID09PSAneycgJiYgaW5wdXQucGVlaygxKSA9PT0gJ30nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcnAgKz0gJ3t9JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtzaGFycCwgJ1RLX1dPUkQnXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjID09PSAnPCcgJiYgKGlucHV0LnBlZWsoKSA9PT0gJz8nIHx8IGlucHV0LnBlZWsoKSA9PT0gJyUnKSkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5iYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZV9tYXRjaCA9IGlucHV0Lm1hdGNoKHRlbXBsYXRlX3BhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVfbWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB0ZW1wbGF0ZV9tYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjLnJlcGxhY2UoYWNvcm4uYWxsTGluZUJyZWFrcywgJ1xcbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjLCAnVEtfU1RSSU5HJ107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJzwnICYmIGlucHV0Lm1hdGNoKC9cXCEtLS9nKSkge1xuICAgICAgICAgICAgICAgICAgICBjID0gJzwhLS0nO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5wdXQuaGFzTmV4dCgpICYmICFpbnB1dC50ZXN0Q2hhcihhY29ybi5uZXdsaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYyArPSBpbnB1dC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW5faHRtbF9jb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjLCAnVEtfQ09NTUVOVCddO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjID09PSAnLScgJiYgaW5faHRtbF9jb21tZW50ICYmIGlucHV0Lm1hdGNoKC8tPi9nKSkge1xuICAgICAgICAgICAgICAgICAgICBpbl9odG1sX2NvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsnLS0+JywgJ1RLX0NPTU1FTlQnXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJy4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5wZWVrKCkgPT09ICcuJyAmJiBpbnB1dC5wZWVrKDEpID09PSAnLicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgKz0gaW5wdXQubmV4dCgpICsgaW5wdXQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjLCAnVEtfT1BFUkFUT1InXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2MsICdUS19ET1QnXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5fYXJyYXkoYywgcHVuY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbnB1dC5oYXNOZXh0KCkgJiYgaW5fYXJyYXkoYyArIGlucHV0LnBlZWsoKSwgcHVuY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjICs9IGlucHV0Lm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXQuaGFzTmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2MsICdUS19DT01NQSddO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc9Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjLCAnVEtfRVFVQUxTJ107XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2MsICdUS19PUEVSQVRPUiddO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjLCAnVEtfVU5LTk9XTiddO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHVuZXNjYXBlX3N0cmluZyhzKSB7XG4gICAgICAgICAgICAgICAgLy8gWW91IHRoaW5rIHRoYXQgYSByZWdleCB3b3VsZCB3b3JrIGZvciB0aGlzXG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHMucmVwbGFjZSgvXFxcXHgoWzAtOWEtZl17Mn0pL2dpLCBmdW5jdGlvbihtYXRjaCwgdmFsKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludCh2YWwsIDE2KSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgZGVhbGluZyB3aXRoICdcXHhmZicsICdcXFxceGZmJywgJ1xcXFxcXHhmZicgbWFrZXMgdGhpcyBtb3JlIGZ1bi5cbiAgICAgICAgICAgICAgICB2YXIgb3V0ID0gJycsXG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSAwO1xuXG4gICAgICAgICAgICAgICAgdmFyIGlucHV0X3NjYW4gPSBuZXcgSW5wdXRTY2FubmVyKHMpO1xuICAgICAgICAgICAgICAgIHZhciBtYXRjaGVkID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChpbnB1dF9zY2FuLmhhc05leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIGFueSB3aGl0ZXNwYWNlLCBub24tc2xhc2ggY2hhcmFjdGVyc1xuICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGtlZXAgc2xhc2ggcGFpcnMuXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBpbnB1dF9zY2FuLm1hdGNoKC8oW1xcc118W15cXFxcXXxcXFxcXFxcXCkrL2cpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gbWF0Y2hlZFswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dF9zY2FuLnBlZWsoKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9zY2FuLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dF9zY2FuLnBlZWsoKSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IGlucHV0X3NjYW4ubWF0Y2goL3goWzAtOUEtRmEtZl17Mn0pL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dF9zY2FuLnBlZWsoKSA9PT0gJ3UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IGlucHV0X3NjYW4ubWF0Y2goL3UoWzAtOUEtRmEtZl17NH0pL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dF9zY2FuLmhhc05leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gaW5wdXRfc2Nhbi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIHNvbWUgZXJyb3IgZGVjb2RpbmcsIHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IHBhcnNlSW50KG1hdGNoZWRbMV0sIDE2KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FwZWQgPiAweDdlICYmIGVzY2FwZWQgPD0gMHhmZiAmJiBtYXRjaGVkWzBdLmluZGV4T2YoJ3gnKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGJhaWwgb3V0IG9uIFxceDdmLi5cXHhmZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZWF2aW5nIHdob2xlIHN0cmluZyBlc2NhcGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGl0J3MgcHJvYmFibHkgY29tcGxldGVseSBiaW5hcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXNjYXBlZCA+PSAweDAwICYmIGVzY2FwZWQgPCAweDIwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVhdmUgMHgwMC4uLjB4MWYgZXNjYXBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnXFxcXCcgKyBtYXRjaGVkWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlc2NhcGVkID09PSAweDIyIHx8IGVzY2FwZWQgPT09IDB4MjcgfHwgZXNjYXBlZCA9PT0gMHg1Yykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZS1xdW90ZSwgYXBvc3Ryb3BoZSwgYmFja3NsYXNoIC0gZXNjYXBlIHRoZXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICdcXFxcJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoZXNjYXBlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGVzY2FwZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBiZWF1dGlmaWVyID0gbmV3IEJlYXV0aWZpZXIoanNfc291cmNlX3RleHQsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gYmVhdXRpZmllci5iZWF1dGlmeSgpO1xuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFkZCBzdXBwb3J0IGZvciBBTUQgKCBodHRwczovL2dpdGh1Yi5jb20vYW1kanMvYW1kanMtYXBpL3dpa2kvQU1EI2RlZmluZWFtZC1wcm9wZXJ0eS0gKVxuICAgICAgICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHsganNfYmVhdXRpZnk6IGpzX2JlYXV0aWZ5IH07XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgLy8gQWRkIHN1cHBvcnQgZm9yIENvbW1vbkpTLiBKdXN0IHB1dCB0aGlzIGZpbGUgc29tZXdoZXJlIG9uIHlvdXIgcmVxdWlyZS5wYXRoc1xuICAgICAgICAvLyBhbmQgeW91IHdpbGwgYmUgYWJsZSB0byBgdmFyIGpzX2JlYXV0aWZ5ID0gcmVxdWlyZShcImJlYXV0aWZ5XCIpLmpzX2JlYXV0aWZ5YC5cbiAgICAgICAgZXhwb3J0cy5qc19iZWF1dGlmeSA9IGpzX2JlYXV0aWZ5O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAvLyBJZiB3ZSdyZSBydW5uaW5nIGEgd2ViIHBhZ2UgYW5kIGRvbid0IGhhdmUgZWl0aGVyIG9mIHRoZSBhYm92ZSwgYWRkIG91ciBvbmUgZ2xvYmFsXG4gICAgICAgIHdpbmRvdy5qc19iZWF1dGlmeSA9IGpzX2JlYXV0aWZ5O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBldmVuIGhhdmUgd2luZG93LCB0cnkgZ2xvYmFsLlxuICAgICAgICBnbG9iYWwuanNfYmVhdXRpZnkgPSBqc19iZWF1dGlmeTtcbiAgICB9XG5cbn0oKSk7IiwiLyoqXG4gKiBAbGljZW5zZVxuICogTG9kYXNoIGxvZGFzaC5jb20vbGljZW5zZSB8IFVuZGVyc2NvcmUuanMgMS44LjMgdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFXG4gKi9cbjsoZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdCl7cmV0dXJuIG4uc2V0KHRbMF0sdFsxXSksbn1mdW5jdGlvbiB0KG4sdCl7cmV0dXJuIG4uYWRkKHQpLG59ZnVuY3Rpb24gcihuLHQscil7c3dpdGNoKHIubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG4uY2FsbCh0KTtjYXNlIDE6cmV0dXJuIG4uY2FsbCh0LHJbMF0pO2Nhc2UgMjpyZXR1cm4gbi5jYWxsKHQsclswXSxyWzFdKTtjYXNlIDM6cmV0dXJuIG4uY2FsbCh0LHJbMF0sclsxXSxyWzJdKX1yZXR1cm4gbi5hcHBseSh0LHIpfWZ1bmN0aW9uIGUobix0LHIsZSl7Zm9yKHZhciB1PS0xLGk9bnVsbD09bj8wOm4ubGVuZ3RoOysrdTxpOyl7dmFyIG89blt1XTt0KGUsbyxyKG8pLG4pfXJldHVybiBlfWZ1bmN0aW9uIHUobix0KXtmb3IodmFyIHI9LTEsZT1udWxsPT1uPzA6bi5sZW5ndGg7KytyPGUmJmZhbHNlIT09dChuW3JdLHIsbik7KTtyZXR1cm4gbn1mdW5jdGlvbiBpKG4sdCl7Zm9yKHZhciByPW51bGw9PW4/MDpuLmxlbmd0aDtyLS0mJmZhbHNlIT09dChuW3JdLHIsbik7KTtcbnJldHVybiBufWZ1bmN0aW9uIG8obix0KXtmb3IodmFyIHI9LTEsZT1udWxsPT1uPzA6bi5sZW5ndGg7KytyPGU7KWlmKCF0KG5bcl0scixuKSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gZihuLHQpe2Zvcih2YXIgcj0tMSxlPW51bGw9PW4/MDpuLmxlbmd0aCx1PTAsaT1bXTsrK3I8ZTspe3ZhciBvPW5bcl07dChvLHIsbikmJihpW3UrK109byl9cmV0dXJuIGl9ZnVuY3Rpb24gYyhuLHQpe3JldHVybiEobnVsbD09bnx8IW4ubGVuZ3RoKSYmLTE8ZChuLHQsMCl9ZnVuY3Rpb24gYShuLHQscil7Zm9yKHZhciBlPS0xLHU9bnVsbD09bj8wOm4ubGVuZ3RoOysrZTx1OylpZihyKHQsbltlXSkpcmV0dXJuIHRydWU7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGwobix0KXtmb3IodmFyIHI9LTEsZT1udWxsPT1uPzA6bi5sZW5ndGgsdT1BcnJheShlKTsrK3I8ZTspdVtyXT10KG5bcl0scixuKTtyZXR1cm4gdX1mdW5jdGlvbiBzKG4sdCl7Zm9yKHZhciByPS0xLGU9dC5sZW5ndGgsdT1uLmxlbmd0aDsrK3I8ZTspblt1K3JdPXRbcl07XG5yZXR1cm4gbn1mdW5jdGlvbiBoKG4sdCxyLGUpe3ZhciB1PS0xLGk9bnVsbD09bj8wOm4ubGVuZ3RoO2ZvcihlJiZpJiYocj1uWysrdV0pOysrdTxpOylyPXQocixuW3VdLHUsbik7cmV0dXJuIHJ9ZnVuY3Rpb24gcChuLHQscixlKXt2YXIgdT1udWxsPT1uPzA6bi5sZW5ndGg7Zm9yKGUmJnUmJihyPW5bLS11XSk7dS0tOylyPXQocixuW3VdLHUsbik7cmV0dXJuIHJ9ZnVuY3Rpb24gXyhuLHQpe2Zvcih2YXIgcj0tMSxlPW51bGw9PW4/MDpuLmxlbmd0aDsrK3I8ZTspaWYodChuW3JdLHIsbikpcmV0dXJuIHRydWU7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHYobix0LHIpe3ZhciBlO3JldHVybiByKG4sZnVuY3Rpb24obixyLHUpe2lmKHQobixyLHUpKXJldHVybiBlPXIsZmFsc2V9KSxlfWZ1bmN0aW9uIGcobix0LHIsZSl7dmFyIHU9bi5sZW5ndGg7Zm9yKHIrPWU/MTotMTtlP3ItLTorK3I8dTspaWYodChuW3JdLHIsbikpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gZChuLHQscil7aWYodD09PXQpbjp7XG4tLXI7Zm9yKHZhciBlPW4ubGVuZ3RoOysrcjxlOylpZihuW3JdPT09dCl7bj1yO2JyZWFrIG59bj0tMX1lbHNlIG49ZyhuLGIscik7cmV0dXJuIG59ZnVuY3Rpb24geShuLHQscixlKXstLXI7Zm9yKHZhciB1PW4ubGVuZ3RoOysrcjx1OylpZihlKG5bcl0sdCkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gYihuKXtyZXR1cm4gbiE9PW59ZnVuY3Rpb24geChuLHQpe3ZhciByPW51bGw9PW4/MDpuLmxlbmd0aDtyZXR1cm4gcj9rKG4sdCkvcjpQfWZ1bmN0aW9uIGoobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P0Y6dFtuXX19ZnVuY3Rpb24gdyhuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PW4/RjpuW3RdfX1mdW5jdGlvbiBtKG4sdCxyLGUsdSl7cmV0dXJuIHUobixmdW5jdGlvbihuLHUsaSl7cj1lPyhlPWZhbHNlLG4pOnQocixuLHUsaSl9KSxyfWZ1bmN0aW9uIEEobix0KXt2YXIgcj1uLmxlbmd0aDtmb3Iobi5zb3J0KHQpO3ItLTspbltyXT1uW3JdLmM7XG5yZXR1cm4gbn1mdW5jdGlvbiBrKG4sdCl7Zm9yKHZhciByLGU9LTEsdT1uLmxlbmd0aDsrK2U8dTspe3ZhciBpPXQobltlXSk7aSE9PUYmJihyPXI9PT1GP2k6citpKX1yZXR1cm4gcn1mdW5jdGlvbiBFKG4sdCl7Zm9yKHZhciByPS0xLGU9QXJyYXkobik7KytyPG47KWVbcl09dChyKTtyZXR1cm4gZX1mdW5jdGlvbiBPKG4sdCl7cmV0dXJuIGwodCxmdW5jdGlvbih0KXtyZXR1cm5bdCxuW3RdXX0pfWZ1bmN0aW9uIFMobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuKHQpfX1mdW5jdGlvbiBJKG4sdCl7cmV0dXJuIGwodCxmdW5jdGlvbih0KXtyZXR1cm4gblt0XX0pfWZ1bmN0aW9uIFIobix0KXtyZXR1cm4gbi5oYXModCl9ZnVuY3Rpb24geihuLHQpe2Zvcih2YXIgcj0tMSxlPW4ubGVuZ3RoOysrcjxlJiYtMTxkKHQsbltyXSwwKTspO3JldHVybiByfWZ1bmN0aW9uIFcobix0KXtmb3IodmFyIHI9bi5sZW5ndGg7ci0tJiYtMTxkKHQsbltyXSwwKTspO3JldHVybiByfWZ1bmN0aW9uIEIobil7XG5yZXR1cm5cIlxcXFxcIitUbltuXX1mdW5jdGlvbiBMKG4pe3ZhciB0PS0xLHI9QXJyYXkobi5zaXplKTtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKG4sZSl7clsrK3RdPVtlLG5dfSkscn1mdW5jdGlvbiBVKG4sdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBuKHQocikpfX1mdW5jdGlvbiBDKG4sdCl7Zm9yKHZhciByPS0xLGU9bi5sZW5ndGgsdT0wLGk9W107KytyPGU7KXt2YXIgbz1uW3JdO28hPT10JiZcIl9fbG9kYXNoX3BsYWNlaG9sZGVyX19cIiE9PW98fChuW3JdPVwiX19sb2Rhc2hfcGxhY2Vob2xkZXJfX1wiLGlbdSsrXT1yKX1yZXR1cm4gaX1mdW5jdGlvbiBEKG4pe3ZhciB0PS0xLHI9QXJyYXkobi5zaXplKTtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKG4pe3JbKyt0XT1ufSkscn1mdW5jdGlvbiBNKG4pe3ZhciB0PS0xLHI9QXJyYXkobi5zaXplKTtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKG4pe3JbKyt0XT1bbixuXX0pLHJ9ZnVuY3Rpb24gVChuKXtpZihCbi50ZXN0KG4pKXtcbmZvcih2YXIgdD16bi5sYXN0SW5kZXg9MDt6bi50ZXN0KG4pOykrK3Q7bj10fWVsc2Ugbj10dChuKTtyZXR1cm4gbn1mdW5jdGlvbiAkKG4pe3JldHVybiBCbi50ZXN0KG4pP24ubWF0Y2goem4pfHxbXTpuLnNwbGl0KFwiXCIpfXZhciBGLE49MS8wLFA9TmFOLFo9W1tcImFyeVwiLDEyOF0sW1wiYmluZFwiLDFdLFtcImJpbmRLZXlcIiwyXSxbXCJjdXJyeVwiLDhdLFtcImN1cnJ5UmlnaHRcIiwxNl0sW1wiZmxpcFwiLDUxMl0sW1wicGFydGlhbFwiLDMyXSxbXCJwYXJ0aWFsUmlnaHRcIiw2NF0sW1wicmVhcmdcIiwyNTZdXSxxPS9cXGJfX3BcXCs9Jyc7L2csVj0vXFxiKF9fcFxcKz0pJydcXCsvZyxLPS8oX19lXFwoLio/XFwpfFxcYl9fdFxcKSlcXCsnJzsvZyxHPS8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxIPS9bJjw+XCInXS9nLEo9UmVnRXhwKEcuc291cmNlKSxZPVJlZ0V4cChILnNvdXJjZSksUT0vPCUtKFtcXHNcXFNdKz8pJT4vZyxYPS88JShbXFxzXFxTXSs/KSU+L2csbm49LzwlPShbXFxzXFxTXSs/KSU+L2csdG49L1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxybj0vXlxcdyokLyxlbj0vXlxcLi8sdW49L1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nLG9uPS9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxmbj1SZWdFeHAob24uc291cmNlKSxjbj0vXlxccyt8XFxzKyQvZyxhbj0vXlxccysvLGxuPS9cXHMrJC8sc249L1xceyg/OlxcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggLitcXF0gXFwqXFwvKT9cXG4/Lyxobj0vXFx7XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAoLispXFxdIFxcKi8scG49Lyw/ICYgLyxfbj0vW15cXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHg3Zl0rL2csdm49L1xcXFwoXFxcXCk/L2csZ249L1xcJFxceyhbXlxcXFx9XSooPzpcXFxcLlteXFxcXH1dKikqKVxcfS9nLGRuPS9cXHcqJC8seW49L15bLStdMHhbMC05YS1mXSskL2ksYm49L14wYlswMV0rJC9pLHhuPS9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC8sam49L14wb1swLTddKyQvaSx3bj0vXig/OjB8WzEtOV1cXGQqKSQvLG1uPS9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nLEFuPS8oJF4pLyxrbj0vWydcXG5cXHJcXHUyMDI4XFx1MjAyOVxcXFxdL2csRW49XCJbXFxcXHVmZTBlXFxcXHVmZTBmXT8oPzpbXFxcXHUwMzAwLVxcXFx1MDM2ZlxcXFx1ZmUyMC1cXFxcdWZlMmZcXFxcdTIwZDAtXFxcXHUyMGZmXXxcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0pPyg/OlxcXFx1MjAwZCg/OlteXFxcXHVkODAwLVxcXFx1ZGZmZl18KD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfXxbXFxcXHVkODAwLVxcXFx1ZGJmZl1bXFxcXHVkYzAwLVxcXFx1ZGZmZl0pW1xcXFx1ZmUwZVxcXFx1ZmUwZl0/KD86W1xcXFx1MDMwMC1cXFxcdTAzNmZcXFxcdWZlMjAtXFxcXHVmZTJmXFxcXHUyMGQwLVxcXFx1MjBmZl18XFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdKT8pKlwiLE9uPVwiKD86W1xcXFx1MjcwMC1cXFxcdTI3YmZdfCg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn18W1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdKVwiK0VuLFNuPVwiKD86W15cXFxcdWQ4MDAtXFxcXHVkZmZmXVtcXFxcdTAzMDAtXFxcXHUwMzZmXFxcXHVmZTIwLVxcXFx1ZmUyZlxcXFx1MjBkMC1cXFxcdTIwZmZdP3xbXFxcXHUwMzAwLVxcXFx1MDM2ZlxcXFx1ZmUyMC1cXFxcdWZlMmZcXFxcdTIwZDAtXFxcXHUyMGZmXXwoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9fFtcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXXxbXFxcXHVkODAwLVxcXFx1ZGZmZl0pXCIsSW49UmVnRXhwKFwiWydcXHUyMDE5XVwiLFwiZ1wiKSxSbj1SZWdFeHAoXCJbXFxcXHUwMzAwLVxcXFx1MDM2ZlxcXFx1ZmUyMC1cXFxcdWZlMmZcXFxcdTIwZDAtXFxcXHUyMGZmXVwiLFwiZ1wiKSx6bj1SZWdFeHAoXCJcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0oPz1cXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0pfFwiK1NuK0VuLFwiZ1wiKSxXbj1SZWdFeHAoW1wiW0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZV0/W2EtelxcXFx4ZGYtXFxcXHhmNlxcXFx4ZjgtXFxcXHhmZl0rKD86WydcXHUyMDE5XSg/OmR8bGx8bXxyZXxzfHR8dmUpKT8oPz1bXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmN1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZlxcXFx1MjAwMC1cXFxcdTIwNmYgXFxcXHRcXFxceDBiXFxcXGZcXFxceGEwXFxcXHVmZWZmXFxcXG5cXFxcclxcXFx1MjAyOFxcXFx1MjAyOVxcXFx1MTY4MFxcXFx1MTgwZVxcXFx1MjAwMFxcXFx1MjAwMVxcXFx1MjAwMlxcXFx1MjAwM1xcXFx1MjAwNFxcXFx1MjAwNVxcXFx1MjAwNlxcXFx1MjAwN1xcXFx1MjAwOFxcXFx1MjAwOVxcXFx1MjAwYVxcXFx1MjAyZlxcXFx1MjA1ZlxcXFx1MzAwMF18W0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZV18JCl8KD86W0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZV18W15cXFxcdWQ4MDAtXFxcXHVkZmZmXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmN1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZlxcXFx1MjAwMC1cXFxcdTIwNmYgXFxcXHRcXFxceDBiXFxcXGZcXFxceGEwXFxcXHVmZWZmXFxcXG5cXFxcclxcXFx1MjAyOFxcXFx1MjAyOVxcXFx1MTY4MFxcXFx1MTgwZVxcXFx1MjAwMFxcXFx1MjAwMVxcXFx1MjAwMlxcXFx1MjAwM1xcXFx1MjAwNFxcXFx1MjAwNVxcXFx1MjAwNlxcXFx1MjAwN1xcXFx1MjAwOFxcXFx1MjAwOVxcXFx1MjAwYVxcXFx1MjAyZlxcXFx1MjA1ZlxcXFx1MzAwMFxcXFxkK1xcXFx1MjcwMC1cXFxcdTI3YmZhLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmZBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGVdKSsoPzpbJ1xcdTIwMTldKD86RHxMTHxNfFJFfFN8VHxWRSkpPyg/PVtcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3XFxcXHgwMC1cXFxceDJmXFxcXHgzYS1cXFxceDQwXFxcXHg1Yi1cXFxceDYwXFxcXHg3Yi1cXFxceGJmXFxcXHUyMDAwLVxcXFx1MjA2ZiBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwXXxbQS1aXFxcXHhjMC1cXFxceGQ2XFxcXHhkOC1cXFxceGRlXSg/OlthLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmZdfFteXFxcXHVkODAwLVxcXFx1ZGZmZlxcXFx4YWNcXFxceGIxXFxcXHhkN1xcXFx4ZjdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmZcXFxcdTIwMDAtXFxcXHUyMDZmIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDBcXFxcZCtcXFxcdTI3MDAtXFxcXHUyN2JmYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmQS1aXFxcXHhjMC1cXFxceGQ2XFxcXHhkOC1cXFxceGRlXSl8JCl8W0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZV0/KD86W2EtelxcXFx4ZGYtXFxcXHhmNlxcXFx4ZjgtXFxcXHhmZl18W15cXFxcdWQ4MDAtXFxcXHVkZmZmXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmN1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZlxcXFx1MjAwMC1cXFxcdTIwNmYgXFxcXHRcXFxceDBiXFxcXGZcXFxceGEwXFxcXHVmZWZmXFxcXG5cXFxcclxcXFx1MjAyOFxcXFx1MjAyOVxcXFx1MTY4MFxcXFx1MTgwZVxcXFx1MjAwMFxcXFx1MjAwMVxcXFx1MjAwMlxcXFx1MjAwM1xcXFx1MjAwNFxcXFx1MjAwNVxcXFx1MjAwNlxcXFx1MjAwN1xcXFx1MjAwOFxcXFx1MjAwOVxcXFx1MjAwYVxcXFx1MjAyZlxcXFx1MjA1ZlxcXFx1MzAwMFxcXFxkK1xcXFx1MjcwMC1cXFxcdTI3YmZhLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmZBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGVdKSsoPzpbJ1xcdTIwMTldKD86ZHxsbHxtfHJlfHN8dHx2ZSkpP3xbQS1aXFxcXHhjMC1cXFxceGQ2XFxcXHhkOC1cXFxceGRlXSsoPzpbJ1xcdTIwMTldKD86RHxMTHxNfFJFfFN8VHxWRSkpP3xcXFxcZCooPzooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXFxcZFRIKVxcXFxiKXxcXFxcZCooPzooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXFxcZHRoKVxcXFxiKXxcXFxcZCtcIixPbl0uam9pbihcInxcIiksXCJnXCIpLEJuPVJlZ0V4cChcIltcXFxcdTIwMGRcXFxcdWQ4MDAtXFxcXHVkZmZmXFxcXHUwMzAwLVxcXFx1MDM2ZlxcXFx1ZmUyMC1cXFxcdWZlMmZcXFxcdTIwZDAtXFxcXHUyMGZmXFxcXHVmZTBlXFxcXHVmZTBmXVwiKSxMbj0vW2Etel1bQS1aXXxbQS1aXXsyLH1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS8sVW49XCJBcnJheSBCdWZmZXIgRGF0YVZpZXcgRGF0ZSBFcnJvciBGbG9hdDMyQXJyYXkgRmxvYXQ2NEFycmF5IEZ1bmN0aW9uIEludDhBcnJheSBJbnQxNkFycmF5IEludDMyQXJyYXkgTWFwIE1hdGggT2JqZWN0IFByb21pc2UgUmVnRXhwIFNldCBTdHJpbmcgU3ltYm9sIFR5cGVFcnJvciBVaW50OEFycmF5IFVpbnQ4Q2xhbXBlZEFycmF5IFVpbnQxNkFycmF5IFVpbnQzMkFycmF5IFdlYWtNYXAgXyBjbGVhclRpbWVvdXQgaXNGaW5pdGUgcGFyc2VJbnQgc2V0VGltZW91dFwiLnNwbGl0KFwiIFwiKSxDbj17fTtcbkNuW1wiW29iamVjdCBGbG9hdDMyQXJyYXldXCJdPUNuW1wiW29iamVjdCBGbG9hdDY0QXJyYXldXCJdPUNuW1wiW29iamVjdCBJbnQ4QXJyYXldXCJdPUNuW1wiW29iamVjdCBJbnQxNkFycmF5XVwiXT1DbltcIltvYmplY3QgSW50MzJBcnJheV1cIl09Q25bXCJbb2JqZWN0IFVpbnQ4QXJyYXldXCJdPUNuW1wiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV1cIl09Q25bXCJbb2JqZWN0IFVpbnQxNkFycmF5XVwiXT1DbltcIltvYmplY3QgVWludDMyQXJyYXldXCJdPXRydWUsQ25bXCJbb2JqZWN0IEFyZ3VtZW50c11cIl09Q25bXCJbb2JqZWN0IEFycmF5XVwiXT1DbltcIltvYmplY3QgQXJyYXlCdWZmZXJdXCJdPUNuW1wiW29iamVjdCBCb29sZWFuXVwiXT1DbltcIltvYmplY3QgRGF0YVZpZXddXCJdPUNuW1wiW29iamVjdCBEYXRlXVwiXT1DbltcIltvYmplY3QgRXJyb3JdXCJdPUNuW1wiW29iamVjdCBGdW5jdGlvbl1cIl09Q25bXCJbb2JqZWN0IE1hcF1cIl09Q25bXCJbb2JqZWN0IE51bWJlcl1cIl09Q25bXCJbb2JqZWN0IE9iamVjdF1cIl09Q25bXCJbb2JqZWN0IFJlZ0V4cF1cIl09Q25bXCJbb2JqZWN0IFNldF1cIl09Q25bXCJbb2JqZWN0IFN0cmluZ11cIl09Q25bXCJbb2JqZWN0IFdlYWtNYXBdXCJdPWZhbHNlO1xudmFyIERuPXt9O0RuW1wiW29iamVjdCBBcmd1bWVudHNdXCJdPURuW1wiW29iamVjdCBBcnJheV1cIl09RG5bXCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiXT1EbltcIltvYmplY3QgRGF0YVZpZXddXCJdPURuW1wiW29iamVjdCBCb29sZWFuXVwiXT1EbltcIltvYmplY3QgRGF0ZV1cIl09RG5bXCJbb2JqZWN0IEZsb2F0MzJBcnJheV1cIl09RG5bXCJbb2JqZWN0IEZsb2F0NjRBcnJheV1cIl09RG5bXCJbb2JqZWN0IEludDhBcnJheV1cIl09RG5bXCJbb2JqZWN0IEludDE2QXJyYXldXCJdPURuW1wiW29iamVjdCBJbnQzMkFycmF5XVwiXT1EbltcIltvYmplY3QgTWFwXVwiXT1EbltcIltvYmplY3QgTnVtYmVyXVwiXT1EbltcIltvYmplY3QgT2JqZWN0XVwiXT1EbltcIltvYmplY3QgUmVnRXhwXVwiXT1EbltcIltvYmplY3QgU2V0XVwiXT1EbltcIltvYmplY3QgU3RyaW5nXVwiXT1EbltcIltvYmplY3QgU3ltYm9sXVwiXT1EbltcIltvYmplY3QgVWludDhBcnJheV1cIl09RG5bXCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XVwiXT1EbltcIltvYmplY3QgVWludDE2QXJyYXldXCJdPURuW1wiW29iamVjdCBVaW50MzJBcnJheV1cIl09dHJ1ZSxcbkRuW1wiW29iamVjdCBFcnJvcl1cIl09RG5bXCJbb2JqZWN0IEZ1bmN0aW9uXVwiXT1EbltcIltvYmplY3QgV2Vha01hcF1cIl09ZmFsc2U7dmFyIE1uLFRuPXtcIlxcXFxcIjpcIlxcXFxcIixcIidcIjpcIidcIixcIlxcblwiOlwiblwiLFwiXFxyXCI6XCJyXCIsXCJcXHUyMDI4XCI6XCJ1MjAyOFwiLFwiXFx1MjAyOVwiOlwidTIwMjlcIn0sJG49cGFyc2VGbG9hdCxGbj1wYXJzZUludCxObj10eXBlb2YgZ2xvYmFsPT1cIm9iamVjdFwiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxQbj10eXBlb2Ygc2VsZj09XCJvYmplY3RcIiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsWm49Tm58fFBufHxGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkscW49dHlwZW9mIGV4cG9ydHM9PVwib2JqZWN0XCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLFZuPXFuJiZ0eXBlb2YgbW9kdWxlPT1cIm9iamVjdFwiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxLbj1WbiYmVm4uZXhwb3J0cz09PXFuLEduPUtuJiZObi5wcm9jZXNzO1xubjp7dHJ5e01uPUduJiZHbi5iaW5kaW5nJiZHbi5iaW5kaW5nKFwidXRpbFwiKTticmVhayBufWNhdGNoKG4pe31Nbj12b2lkIDB9dmFyIEhuPU1uJiZNbi5pc0FycmF5QnVmZmVyLEpuPU1uJiZNbi5pc0RhdGUsWW49TW4mJk1uLmlzTWFwLFFuPU1uJiZNbi5pc1JlZ0V4cCxYbj1NbiYmTW4uaXNTZXQsbnQ9TW4mJk1uLmlzVHlwZWRBcnJheSx0dD1qKFwibGVuZ3RoXCIpLHJ0PXcoe1wiXFx4YzBcIjpcIkFcIixcIlxceGMxXCI6XCJBXCIsXCJcXHhjMlwiOlwiQVwiLFwiXFx4YzNcIjpcIkFcIixcIlxceGM0XCI6XCJBXCIsXCJcXHhjNVwiOlwiQVwiLFwiXFx4ZTBcIjpcImFcIixcIlxceGUxXCI6XCJhXCIsXCJcXHhlMlwiOlwiYVwiLFwiXFx4ZTNcIjpcImFcIixcIlxceGU0XCI6XCJhXCIsXCJcXHhlNVwiOlwiYVwiLFwiXFx4YzdcIjpcIkNcIixcIlxceGU3XCI6XCJjXCIsXCJcXHhkMFwiOlwiRFwiLFwiXFx4ZjBcIjpcImRcIixcIlxceGM4XCI6XCJFXCIsXCJcXHhjOVwiOlwiRVwiLFwiXFx4Y2FcIjpcIkVcIixcIlxceGNiXCI6XCJFXCIsXCJcXHhlOFwiOlwiZVwiLFwiXFx4ZTlcIjpcImVcIixcIlxceGVhXCI6XCJlXCIsXCJcXHhlYlwiOlwiZVwiLFwiXFx4Y2NcIjpcIklcIixcIlxceGNkXCI6XCJJXCIsXCJcXHhjZVwiOlwiSVwiLFxuXCJcXHhjZlwiOlwiSVwiLFwiXFx4ZWNcIjpcImlcIixcIlxceGVkXCI6XCJpXCIsXCJcXHhlZVwiOlwiaVwiLFwiXFx4ZWZcIjpcImlcIixcIlxceGQxXCI6XCJOXCIsXCJcXHhmMVwiOlwiblwiLFwiXFx4ZDJcIjpcIk9cIixcIlxceGQzXCI6XCJPXCIsXCJcXHhkNFwiOlwiT1wiLFwiXFx4ZDVcIjpcIk9cIixcIlxceGQ2XCI6XCJPXCIsXCJcXHhkOFwiOlwiT1wiLFwiXFx4ZjJcIjpcIm9cIixcIlxceGYzXCI6XCJvXCIsXCJcXHhmNFwiOlwib1wiLFwiXFx4ZjVcIjpcIm9cIixcIlxceGY2XCI6XCJvXCIsXCJcXHhmOFwiOlwib1wiLFwiXFx4ZDlcIjpcIlVcIixcIlxceGRhXCI6XCJVXCIsXCJcXHhkYlwiOlwiVVwiLFwiXFx4ZGNcIjpcIlVcIixcIlxceGY5XCI6XCJ1XCIsXCJcXHhmYVwiOlwidVwiLFwiXFx4ZmJcIjpcInVcIixcIlxceGZjXCI6XCJ1XCIsXCJcXHhkZFwiOlwiWVwiLFwiXFx4ZmRcIjpcInlcIixcIlxceGZmXCI6XCJ5XCIsXCJcXHhjNlwiOlwiQWVcIixcIlxceGU2XCI6XCJhZVwiLFwiXFx4ZGVcIjpcIlRoXCIsXCJcXHhmZVwiOlwidGhcIixcIlxceGRmXCI6XCJzc1wiLFwiXFx1MDEwMFwiOlwiQVwiLFwiXFx1MDEwMlwiOlwiQVwiLFwiXFx1MDEwNFwiOlwiQVwiLFwiXFx1MDEwMVwiOlwiYVwiLFwiXFx1MDEwM1wiOlwiYVwiLFwiXFx1MDEwNVwiOlwiYVwiLFwiXFx1MDEwNlwiOlwiQ1wiLFwiXFx1MDEwOFwiOlwiQ1wiLFwiXFx1MDEwYVwiOlwiQ1wiLFxuXCJcXHUwMTBjXCI6XCJDXCIsXCJcXHUwMTA3XCI6XCJjXCIsXCJcXHUwMTA5XCI6XCJjXCIsXCJcXHUwMTBiXCI6XCJjXCIsXCJcXHUwMTBkXCI6XCJjXCIsXCJcXHUwMTBlXCI6XCJEXCIsXCJcXHUwMTEwXCI6XCJEXCIsXCJcXHUwMTBmXCI6XCJkXCIsXCJcXHUwMTExXCI6XCJkXCIsXCJcXHUwMTEyXCI6XCJFXCIsXCJcXHUwMTE0XCI6XCJFXCIsXCJcXHUwMTE2XCI6XCJFXCIsXCJcXHUwMTE4XCI6XCJFXCIsXCJcXHUwMTFhXCI6XCJFXCIsXCJcXHUwMTEzXCI6XCJlXCIsXCJcXHUwMTE1XCI6XCJlXCIsXCJcXHUwMTE3XCI6XCJlXCIsXCJcXHUwMTE5XCI6XCJlXCIsXCJcXHUwMTFiXCI6XCJlXCIsXCJcXHUwMTFjXCI6XCJHXCIsXCJcXHUwMTFlXCI6XCJHXCIsXCJcXHUwMTIwXCI6XCJHXCIsXCJcXHUwMTIyXCI6XCJHXCIsXCJcXHUwMTFkXCI6XCJnXCIsXCJcXHUwMTFmXCI6XCJnXCIsXCJcXHUwMTIxXCI6XCJnXCIsXCJcXHUwMTIzXCI6XCJnXCIsXCJcXHUwMTI0XCI6XCJIXCIsXCJcXHUwMTI2XCI6XCJIXCIsXCJcXHUwMTI1XCI6XCJoXCIsXCJcXHUwMTI3XCI6XCJoXCIsXCJcXHUwMTI4XCI6XCJJXCIsXCJcXHUwMTJhXCI6XCJJXCIsXCJcXHUwMTJjXCI6XCJJXCIsXCJcXHUwMTJlXCI6XCJJXCIsXCJcXHUwMTMwXCI6XCJJXCIsXCJcXHUwMTI5XCI6XCJpXCIsXCJcXHUwMTJiXCI6XCJpXCIsXCJcXHUwMTJkXCI6XCJpXCIsXG5cIlxcdTAxMmZcIjpcImlcIixcIlxcdTAxMzFcIjpcImlcIixcIlxcdTAxMzRcIjpcIkpcIixcIlxcdTAxMzVcIjpcImpcIixcIlxcdTAxMzZcIjpcIktcIixcIlxcdTAxMzdcIjpcImtcIixcIlxcdTAxMzhcIjpcImtcIixcIlxcdTAxMzlcIjpcIkxcIixcIlxcdTAxM2JcIjpcIkxcIixcIlxcdTAxM2RcIjpcIkxcIixcIlxcdTAxM2ZcIjpcIkxcIixcIlxcdTAxNDFcIjpcIkxcIixcIlxcdTAxM2FcIjpcImxcIixcIlxcdTAxM2NcIjpcImxcIixcIlxcdTAxM2VcIjpcImxcIixcIlxcdTAxNDBcIjpcImxcIixcIlxcdTAxNDJcIjpcImxcIixcIlxcdTAxNDNcIjpcIk5cIixcIlxcdTAxNDVcIjpcIk5cIixcIlxcdTAxNDdcIjpcIk5cIixcIlxcdTAxNGFcIjpcIk5cIixcIlxcdTAxNDRcIjpcIm5cIixcIlxcdTAxNDZcIjpcIm5cIixcIlxcdTAxNDhcIjpcIm5cIixcIlxcdTAxNGJcIjpcIm5cIixcIlxcdTAxNGNcIjpcIk9cIixcIlxcdTAxNGVcIjpcIk9cIixcIlxcdTAxNTBcIjpcIk9cIixcIlxcdTAxNGRcIjpcIm9cIixcIlxcdTAxNGZcIjpcIm9cIixcIlxcdTAxNTFcIjpcIm9cIixcIlxcdTAxNTRcIjpcIlJcIixcIlxcdTAxNTZcIjpcIlJcIixcIlxcdTAxNThcIjpcIlJcIixcIlxcdTAxNTVcIjpcInJcIixcIlxcdTAxNTdcIjpcInJcIixcIlxcdTAxNTlcIjpcInJcIixcIlxcdTAxNWFcIjpcIlNcIixcIlxcdTAxNWNcIjpcIlNcIixcblwiXFx1MDE1ZVwiOlwiU1wiLFwiXFx1MDE2MFwiOlwiU1wiLFwiXFx1MDE1YlwiOlwic1wiLFwiXFx1MDE1ZFwiOlwic1wiLFwiXFx1MDE1ZlwiOlwic1wiLFwiXFx1MDE2MVwiOlwic1wiLFwiXFx1MDE2MlwiOlwiVFwiLFwiXFx1MDE2NFwiOlwiVFwiLFwiXFx1MDE2NlwiOlwiVFwiLFwiXFx1MDE2M1wiOlwidFwiLFwiXFx1MDE2NVwiOlwidFwiLFwiXFx1MDE2N1wiOlwidFwiLFwiXFx1MDE2OFwiOlwiVVwiLFwiXFx1MDE2YVwiOlwiVVwiLFwiXFx1MDE2Y1wiOlwiVVwiLFwiXFx1MDE2ZVwiOlwiVVwiLFwiXFx1MDE3MFwiOlwiVVwiLFwiXFx1MDE3MlwiOlwiVVwiLFwiXFx1MDE2OVwiOlwidVwiLFwiXFx1MDE2YlwiOlwidVwiLFwiXFx1MDE2ZFwiOlwidVwiLFwiXFx1MDE2ZlwiOlwidVwiLFwiXFx1MDE3MVwiOlwidVwiLFwiXFx1MDE3M1wiOlwidVwiLFwiXFx1MDE3NFwiOlwiV1wiLFwiXFx1MDE3NVwiOlwid1wiLFwiXFx1MDE3NlwiOlwiWVwiLFwiXFx1MDE3N1wiOlwieVwiLFwiXFx1MDE3OFwiOlwiWVwiLFwiXFx1MDE3OVwiOlwiWlwiLFwiXFx1MDE3YlwiOlwiWlwiLFwiXFx1MDE3ZFwiOlwiWlwiLFwiXFx1MDE3YVwiOlwielwiLFwiXFx1MDE3Y1wiOlwielwiLFwiXFx1MDE3ZVwiOlwielwiLFwiXFx1MDEzMlwiOlwiSUpcIixcIlxcdTAxMzNcIjpcImlqXCIsXCJcXHUwMTUyXCI6XCJPZVwiLFwiXFx1MDE1M1wiOlwib2VcIixcblwiXFx1MDE0OVwiOlwiJ25cIixcIlxcdTAxN2ZcIjpcInNcIn0pLGV0PXcoe1wiJlwiOlwiJmFtcDtcIixcIjxcIjpcIiZsdDtcIixcIj5cIjpcIiZndDtcIiwnXCInOlwiJnF1b3Q7XCIsXCInXCI6XCImIzM5O1wifSksdXQ9dyh7XCImYW1wO1wiOlwiJlwiLFwiJmx0O1wiOlwiPFwiLFwiJmd0O1wiOlwiPlwiLFwiJnF1b3Q7XCI6J1wiJyxcIiYjMzk7XCI6XCInXCJ9KSxpdD1mdW5jdGlvbiB3KEVuKXtmdW5jdGlvbiBPbihuKXtpZih4dShuKSYmIWFmKG4pJiYhKG4gaW5zdGFuY2VvZiBNbikpe2lmKG4gaW5zdGFuY2VvZiB6bilyZXR1cm4gbjtpZihjaS5jYWxsKG4sXCJfX3dyYXBwZWRfX1wiKSlyZXR1cm4gUGUobil9cmV0dXJuIG5ldyB6bihuKX1mdW5jdGlvbiBTbigpe31mdW5jdGlvbiB6bihuLHQpe3RoaXMuX193cmFwcGVkX189bix0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19jaGFpbl9fPSEhdCx0aGlzLl9faW5kZXhfXz0wLHRoaXMuX192YWx1ZXNfXz1GfWZ1bmN0aW9uIE1uKG4pe3RoaXMuX193cmFwcGVkX189bix0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19kaXJfXz0xLFxudGhpcy5fX2ZpbHRlcmVkX189ZmFsc2UsdGhpcy5fX2l0ZXJhdGVlc19fPVtdLHRoaXMuX190YWtlQ291bnRfXz00Mjk0OTY3Mjk1LHRoaXMuX192aWV3c19fPVtdfWZ1bmN0aW9uIFRuKG4pe3ZhciB0PS0xLHI9bnVsbD09bj8wOm4ubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7Kyt0PHI7KXt2YXIgZT1uW3RdO3RoaXMuc2V0KGVbMF0sZVsxXSl9fWZ1bmN0aW9uIE5uKG4pe3ZhciB0PS0xLHI9bnVsbD09bj8wOm4ubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7Kyt0PHI7KXt2YXIgZT1uW3RdO3RoaXMuc2V0KGVbMF0sZVsxXSl9fWZ1bmN0aW9uIFBuKG4pe3ZhciB0PS0xLHI9bnVsbD09bj8wOm4ubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7Kyt0PHI7KXt2YXIgZT1uW3RdO3RoaXMuc2V0KGVbMF0sZVsxXSl9fWZ1bmN0aW9uIHFuKG4pe3ZhciB0PS0xLHI9bnVsbD09bj8wOm4ubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBQbjsrK3Q8cjspdGhpcy5hZGQoblt0XSl9ZnVuY3Rpb24gVm4obil7XG50aGlzLnNpemU9KHRoaXMuX19kYXRhX189bmV3IE5uKG4pKS5zaXplfWZ1bmN0aW9uIEduKG4sdCl7dmFyIHIsZT1hZihuKSx1PSFlJiZjZihuKSxpPSFlJiYhdSYmc2Yobiksbz0hZSYmIXUmJiFpJiZnZihuKSx1PShlPWV8fHV8fGl8fG8pP0Uobi5sZW5ndGgscmkpOltdLGY9dS5sZW5ndGg7Zm9yKHIgaW4gbikhdCYmIWNpLmNhbGwobixyKXx8ZSYmKFwibGVuZ3RoXCI9PXJ8fGkmJihcIm9mZnNldFwiPT1yfHxcInBhcmVudFwiPT1yKXx8byYmKFwiYnVmZmVyXCI9PXJ8fFwiYnl0ZUxlbmd0aFwiPT1yfHxcImJ5dGVPZmZzZXRcIj09cil8fFJlKHIsZikpfHx1LnB1c2gocik7cmV0dXJuIHV9ZnVuY3Rpb24gdHQobil7dmFyIHQ9bi5sZW5ndGg7cmV0dXJuIHQ/bltjcigwLHQtMSldOkZ9ZnVuY3Rpb24gb3Qobix0KXtyZXR1cm4gVGUoTXIobiksZ3QodCwwLG4ubGVuZ3RoKSl9ZnVuY3Rpb24gZnQobil7cmV0dXJuIFRlKE1yKG4pKX1mdW5jdGlvbiBjdChuLHQscil7KHI9PT1GfHxodShuW3RdLHIpKSYmKHIhPT1GfHx0IGluIG4pfHxfdChuLHQscik7XG59ZnVuY3Rpb24gYXQobix0LHIpe3ZhciBlPW5bdF07Y2kuY2FsbChuLHQpJiZodShlLHIpJiYociE9PUZ8fHQgaW4gbil8fF90KG4sdCxyKX1mdW5jdGlvbiBsdChuLHQpe2Zvcih2YXIgcj1uLmxlbmd0aDtyLS07KWlmKGh1KG5bcl1bMF0sdCkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gc3Qobix0LHIsZSl7cmV0dXJuIG9vKG4sZnVuY3Rpb24obix1LGkpe3QoZSxuLHIobiksaSl9KSxlfWZ1bmN0aW9uIGh0KG4sdCl7cmV0dXJuIG4mJlRyKHQsTHUodCksbil9ZnVuY3Rpb24gcHQobix0KXtyZXR1cm4gbiYmVHIodCxVdSh0KSxuKX1mdW5jdGlvbiBfdChuLHQscil7XCJfX3Byb3RvX19cIj09dCYmRWk/RWkobix0LHtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOnRydWUsdmFsdWU6cix3cml0YWJsZTp0cnVlfSk6blt0XT1yfWZ1bmN0aW9uIHZ0KG4sdCl7Zm9yKHZhciByPS0xLGU9dC5sZW5ndGgsdT1IdShlKSxpPW51bGw9PW47KytyPGU7KXVbcl09aT9GOld1KG4sdFtyXSk7cmV0dXJuIHU7XG59ZnVuY3Rpb24gZ3Qobix0LHIpe3JldHVybiBuPT09biYmKHIhPT1GJiYobj1uPD1yP246ciksdCE9PUYmJihuPW4+PXQ/bjp0KSksbn1mdW5jdGlvbiBkdChuLHQscixlLGksbyl7dmFyIGYsYz0xJnQsYT0yJnQsbD00JnQ7aWYociYmKGY9aT9yKG4sZSxpLG8pOnIobikpLGYhPT1GKXJldHVybiBmO2lmKCFidShuKSlyZXR1cm4gbjtpZihlPWFmKG4pKXtpZihmPUVlKG4pLCFjKXJldHVybiBNcihuLGYpfWVsc2V7dmFyIHM9eW8obiksaD1cIltvYmplY3QgRnVuY3Rpb25dXCI9PXN8fFwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl1cIj09cztpZihzZihuKSlyZXR1cm4gV3IobixjKTtpZihcIltvYmplY3QgT2JqZWN0XVwiPT1zfHxcIltvYmplY3QgQXJndW1lbnRzXVwiPT1zfHxoJiYhaSl7aWYoZj1hfHxoP3t9Ok9lKG4pLCFjKXJldHVybiBhP0ZyKG4scHQoZixuKSk6JHIobixodChmLG4pKX1lbHNle2lmKCFEbltzXSlyZXR1cm4gaT9uOnt9O2Y9U2UobixzLGR0LGMpfX1pZihvfHwobz1uZXcgVm4pLFxuaT1vLmdldChuKSlyZXR1cm4gaTtvLnNldChuLGYpO3ZhciBhPWw/YT95ZTpkZTphP1V1Okx1LHA9ZT9GOmEobik7cmV0dXJuIHUocHx8bixmdW5jdGlvbihlLHUpe3AmJih1PWUsZT1uW3VdKSxhdChmLHUsZHQoZSx0LHIsdSxuLG8pKX0pLGZ9ZnVuY3Rpb24geXQobil7dmFyIHQ9THUobik7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBidChyLG4sdCl9fWZ1bmN0aW9uIGJ0KG4sdCxyKXt2YXIgZT1yLmxlbmd0aDtpZihudWxsPT1uKXJldHVybiFlO2ZvcihuPW5pKG4pO2UtLTspe3ZhciB1PXJbZV0saT10W3VdLG89blt1XTtpZihvPT09RiYmISh1IGluIG4pfHwhaShvKSlyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9ZnVuY3Rpb24geHQobix0LHIpe2lmKHR5cGVvZiBuIT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IGVpKFwiRXhwZWN0ZWQgYSBmdW5jdGlvblwiKTtyZXR1cm4gam8oZnVuY3Rpb24oKXtuLmFwcGx5KEYscil9LHQpfWZ1bmN0aW9uIGp0KG4sdCxyLGUpe3ZhciB1PS0xLGk9YyxvPXRydWUsZj1uLmxlbmd0aCxzPVtdLGg9dC5sZW5ndGg7XG5pZighZilyZXR1cm4gcztyJiYodD1sKHQsUyhyKSkpLGU/KGk9YSxvPWZhbHNlKToyMDA8PXQubGVuZ3RoJiYoaT1SLG89ZmFsc2UsdD1uZXcgcW4odCkpO246Zm9yKDsrK3U8Zjspe3ZhciBwPW5bdV0sXz1udWxsPT1yP3A6cihwKSxwPWV8fDAhPT1wP3A6MDtpZihvJiZfPT09Xyl7Zm9yKHZhciB2PWg7di0tOylpZih0W3ZdPT09Xyljb250aW51ZSBuO3MucHVzaChwKX1lbHNlIGkodCxfLGUpfHxzLnB1c2gocCl9cmV0dXJuIHN9ZnVuY3Rpb24gd3Qobix0KXt2YXIgcj10cnVlO3JldHVybiBvbyhuLGZ1bmN0aW9uKG4sZSx1KXtyZXR1cm4gcj0hIXQobixlLHUpfSkscn1mdW5jdGlvbiBtdChuLHQscil7Zm9yKHZhciBlPS0xLHU9bi5sZW5ndGg7KytlPHU7KXt2YXIgaT1uW2VdLG89dChpKTtpZihudWxsIT1vJiYoZj09PUY/bz09PW8mJiFBdShvKTpyKG8sZikpKXZhciBmPW8sYz1pfXJldHVybiBjfWZ1bmN0aW9uIEF0KG4sdCl7dmFyIHI9W107cmV0dXJuIG9vKG4sZnVuY3Rpb24obixlLHUpe1xudChuLGUsdSkmJnIucHVzaChuKX0pLHJ9ZnVuY3Rpb24ga3Qobix0LHIsZSx1KXt2YXIgaT0tMSxvPW4ubGVuZ3RoO2ZvcihyfHwocj1JZSksdXx8KHU9W10pOysraTxvOyl7dmFyIGY9bltpXTswPHQmJnIoZik/MTx0P2t0KGYsdC0xLHIsZSx1KTpzKHUsZik6ZXx8KHVbdS5sZW5ndGhdPWYpfXJldHVybiB1fWZ1bmN0aW9uIEV0KG4sdCl7cmV0dXJuIG4mJmNvKG4sdCxMdSl9ZnVuY3Rpb24gT3Qobix0KXtyZXR1cm4gbiYmYW8obix0LEx1KX1mdW5jdGlvbiBTdChuLHQpe3JldHVybiBmKHQsZnVuY3Rpb24odCl7cmV0dXJuIGd1KG5bdF0pfSl9ZnVuY3Rpb24gSXQobix0KXt0PVJyKHQsbik7Zm9yKHZhciByPTAsZT10Lmxlbmd0aDtudWxsIT1uJiZyPGU7KW49blskZSh0W3IrK10pXTtyZXR1cm4gciYmcj09ZT9uOkZ9ZnVuY3Rpb24gUnQobix0LHIpe3JldHVybiB0PXQobiksYWYobik/dDpzKHQscihuKSl9ZnVuY3Rpb24genQobil7aWYobnVsbD09biluPW49PT1GP1wiW29iamVjdCBVbmRlZmluZWRdXCI6XCJbb2JqZWN0IE51bGxdXCI7ZWxzZSBpZihraSYma2kgaW4gbmkobikpe1xudmFyIHQ9Y2kuY2FsbChuLGtpKSxyPW5ba2ldO3RyeXtuW2tpXT1GO3ZhciBlPXRydWV9Y2F0Y2gobil7fXZhciB1PXNpLmNhbGwobik7ZSYmKHQ/bltraV09cjpkZWxldGUgbltraV0pLG49dX1lbHNlIG49c2kuY2FsbChuKTtyZXR1cm4gbn1mdW5jdGlvbiBXdChuLHQpe3JldHVybiBuPnR9ZnVuY3Rpb24gQnQobix0KXtyZXR1cm4gbnVsbCE9biYmY2kuY2FsbChuLHQpfWZ1bmN0aW9uIEx0KG4sdCl7cmV0dXJuIG51bGwhPW4mJnQgaW4gbmkobil9ZnVuY3Rpb24gVXQobix0LHIpe2Zvcih2YXIgZT1yP2E6Yyx1PW5bMF0ubGVuZ3RoLGk9bi5sZW5ndGgsbz1pLGY9SHUoaSkscz0xLzAsaD1bXTtvLS07KXt2YXIgcD1uW29dO28mJnQmJihwPWwocCxTKHQpKSkscz1NaShwLmxlbmd0aCxzKSxmW29dPSFyJiYodHx8MTIwPD11JiYxMjA8PXAubGVuZ3RoKT9uZXcgcW4obyYmcCk6Rn12YXIgcD1uWzBdLF89LTEsdj1mWzBdO246Zm9yKDsrK188dSYmaC5sZW5ndGg8czspe3ZhciBnPXBbX10sZD10P3QoZyk6ZyxnPXJ8fDAhPT1nP2c6MDtcbmlmKHY/IVIodixkKTohZShoLGQscikpe2ZvcihvPWk7LS1vOyl7dmFyIHk9ZltvXTtpZih5PyFSKHksZCk6IWUobltvXSxkLHIpKWNvbnRpbnVlIG59diYmdi5wdXNoKGQpLGgucHVzaChnKX19cmV0dXJuIGh9ZnVuY3Rpb24gQ3Qobix0LHIpe3ZhciBlPXt9O3JldHVybiBFdChuLGZ1bmN0aW9uKG4sdSxpKXt0KGUscihuKSx1LGkpfSksZX1mdW5jdGlvbiBEdChuLHQsZSl7cmV0dXJuIHQ9UnIodCxuKSxuPTI+dC5sZW5ndGg/bjpJdChuLHZyKHQsMCwtMSkpLHQ9bnVsbD09bj9uOm5bJGUoR2UodCkpXSxudWxsPT10P0Y6cih0LG4sZSl9ZnVuY3Rpb24gTXQobil7cmV0dXJuIHh1KG4pJiZcIltvYmplY3QgQXJndW1lbnRzXVwiPT16dChuKX1mdW5jdGlvbiBUdChuKXtyZXR1cm4geHUobikmJlwiW29iamVjdCBBcnJheUJ1ZmZlcl1cIj09enQobil9ZnVuY3Rpb24gJHQobil7cmV0dXJuIHh1KG4pJiZcIltvYmplY3QgRGF0ZV1cIj09enQobil9ZnVuY3Rpb24gRnQobix0LHIsZSx1KXtpZihuPT09dCl0PXRydWU7ZWxzZSBpZihudWxsPT1ufHxudWxsPT10fHwheHUobikmJiF4dSh0KSl0PW4hPT1uJiZ0IT09dDtlbHNlIG46e1xudmFyIGk9YWYobiksbz1hZih0KSxmPWk/XCJbb2JqZWN0IEFycmF5XVwiOnlvKG4pLGM9bz9cIltvYmplY3QgQXJyYXldXCI6eW8odCksZj1cIltvYmplY3QgQXJndW1lbnRzXVwiPT1mP1wiW29iamVjdCBPYmplY3RdXCI6ZixjPVwiW29iamVjdCBBcmd1bWVudHNdXCI9PWM/XCJbb2JqZWN0IE9iamVjdF1cIjpjLGE9XCJbb2JqZWN0IE9iamVjdF1cIj09ZixvPVwiW29iamVjdCBPYmplY3RdXCI9PWM7aWYoKGM9Zj09YykmJnNmKG4pKXtpZighc2YodCkpe3Q9ZmFsc2U7YnJlYWsgbn1pPXRydWUsYT1mYWxzZX1pZihjJiYhYSl1fHwodT1uZXcgVm4pLHQ9aXx8Z2Yobik/X2Uobix0LHIsZSxGdCx1KTp2ZShuLHQsZixyLGUsRnQsdSk7ZWxzZXtpZighKDEmcikmJihpPWEmJmNpLmNhbGwobixcIl9fd3JhcHBlZF9fXCIpLGY9byYmY2kuY2FsbCh0LFwiX193cmFwcGVkX19cIiksaXx8Zikpe249aT9uLnZhbHVlKCk6bix0PWY/dC52YWx1ZSgpOnQsdXx8KHU9bmV3IFZuKSx0PUZ0KG4sdCxyLGUsdSk7YnJlYWsgbn1pZihjKXQ6aWYodXx8KHU9bmV3IFZuKSxcbmk9MSZyLGY9ZGUobiksbz1mLmxlbmd0aCxjPWRlKHQpLmxlbmd0aCxvPT1jfHxpKXtmb3IoYT1vO2EtLTspe3ZhciBsPWZbYV07aWYoIShpP2wgaW4gdDpjaS5jYWxsKHQsbCkpKXt0PWZhbHNlO2JyZWFrIHR9fWlmKChjPXUuZ2V0KG4pKSYmdS5nZXQodCkpdD1jPT10O2Vsc2V7Yz10cnVlLHUuc2V0KG4sdCksdS5zZXQodCxuKTtmb3IodmFyIHM9aTsrK2E8bzspe3ZhciBsPWZbYV0saD1uW2xdLHA9dFtsXTtpZihlKXZhciBfPWk/ZShwLGgsbCx0LG4sdSk6ZShoLHAsbCxuLHQsdSk7aWYoXz09PUY/aCE9PXAmJiFGdChoLHAscixlLHUpOiFfKXtjPWZhbHNlO2JyZWFrfXN8fChzPVwiY29uc3RydWN0b3JcIj09bCl9YyYmIXMmJihyPW4uY29uc3RydWN0b3IsZT10LmNvbnN0cnVjdG9yLHIhPWUmJlwiY29uc3RydWN0b3JcImluIG4mJlwiY29uc3RydWN0b3JcImluIHQmJiEodHlwZW9mIHI9PVwiZnVuY3Rpb25cIiYmciBpbnN0YW5jZW9mIHImJnR5cGVvZiBlPT1cImZ1bmN0aW9uXCImJmUgaW5zdGFuY2VvZiBlKSYmKGM9ZmFsc2UpKSxcbnUuZGVsZXRlKG4pLHUuZGVsZXRlKHQpLHQ9Y319ZWxzZSB0PWZhbHNlO2Vsc2UgdD1mYWxzZX19cmV0dXJuIHR9ZnVuY3Rpb24gTnQobil7cmV0dXJuIHh1KG4pJiZcIltvYmplY3QgTWFwXVwiPT15byhuKX1mdW5jdGlvbiBQdChuLHQscixlKXt2YXIgdT1yLmxlbmd0aCxpPXUsbz0hZTtpZihudWxsPT1uKXJldHVybiFpO2ZvcihuPW5pKG4pO3UtLTspe3ZhciBmPXJbdV07aWYobyYmZlsyXT9mWzFdIT09bltmWzBdXTohKGZbMF1pbiBuKSlyZXR1cm4gZmFsc2V9Zm9yKDsrK3U8aTspe3ZhciBmPXJbdV0sYz1mWzBdLGE9bltjXSxsPWZbMV07aWYobyYmZlsyXSl7aWYoYT09PUYmJiEoYyBpbiBuKSlyZXR1cm4gZmFsc2V9ZWxzZXtpZihmPW5ldyBWbixlKXZhciBzPWUoYSxsLGMsbix0LGYpO2lmKHM9PT1GPyFGdChsLGEsMyxlLGYpOiFzKXJldHVybiBmYWxzZX19cmV0dXJuIHRydWV9ZnVuY3Rpb24gWnQobil7cmV0dXJuISghYnUobil8fGxpJiZsaSBpbiBuKSYmKGd1KG4pP19pOnhuKS50ZXN0KEZlKG4pKX1mdW5jdGlvbiBxdChuKXtcbnJldHVybiB4dShuKSYmXCJbb2JqZWN0IFJlZ0V4cF1cIj09enQobil9ZnVuY3Rpb24gVnQobil7cmV0dXJuIHh1KG4pJiZcIltvYmplY3QgU2V0XVwiPT15byhuKX1mdW5jdGlvbiBLdChuKXtyZXR1cm4geHUobikmJnl1KG4ubGVuZ3RoKSYmISFDblt6dChuKV19ZnVuY3Rpb24gR3Qobil7cmV0dXJuIHR5cGVvZiBuPT1cImZ1bmN0aW9uXCI/bjpudWxsPT1uP051OnR5cGVvZiBuPT1cIm9iamVjdFwiP2FmKG4pP1h0KG5bMF0sblsxXSk6UXQobik6VnUobil9ZnVuY3Rpb24gSHQobil7aWYoIUxlKG4pKXJldHVybiBDaShuKTt2YXIgdCxyPVtdO2Zvcih0IGluIG5pKG4pKWNpLmNhbGwobix0KSYmXCJjb25zdHJ1Y3RvclwiIT10JiZyLnB1c2godCk7cmV0dXJuIHJ9ZnVuY3Rpb24gSnQobix0KXtyZXR1cm4gbjx0fWZ1bmN0aW9uIFl0KG4sdCl7dmFyIHI9LTEsZT1wdShuKT9IdShuLmxlbmd0aCk6W107cmV0dXJuIG9vKG4sZnVuY3Rpb24obix1LGkpe2VbKytyXT10KG4sdSxpKX0pLGV9ZnVuY3Rpb24gUXQobil7XG52YXIgdD1tZShuKTtyZXR1cm4gMT09dC5sZW5ndGgmJnRbMF1bMl0/VWUodFswXVswXSx0WzBdWzFdKTpmdW5jdGlvbihyKXtyZXR1cm4gcj09PW58fFB0KHIsbix0KX19ZnVuY3Rpb24gWHQobix0KXtyZXR1cm4gV2UobikmJnQ9PT10JiYhYnUodCk/VWUoJGUobiksdCk6ZnVuY3Rpb24ocil7dmFyIGU9V3UocixuKTtyZXR1cm4gZT09PUYmJmU9PT10P0J1KHIsbik6RnQodCxlLDMpfX1mdW5jdGlvbiBucihuLHQscixlLHUpe24hPT10JiZjbyh0LGZ1bmN0aW9uKGksbyl7aWYoYnUoaSkpe3V8fCh1PW5ldyBWbik7dmFyIGY9dSxjPW5bb10sYT10W29dLGw9Zi5nZXQoYSk7aWYobCljdChuLG8sbCk7ZWxzZXt2YXIgbD1lP2UoYyxhLG8rXCJcIixuLHQsZik6RixzPWw9PT1GO2lmKHMpe3ZhciBoPWFmKGEpLHA9IWgmJnNmKGEpLF89IWgmJiFwJiZnZihhKSxsPWE7aHx8cHx8Xz9hZihjKT9sPWM6X3UoYyk/bD1NcihjKTpwPyhzPWZhbHNlLGw9V3IoYSx0cnVlKSk6Xz8ocz1mYWxzZSxsPUxyKGEsdHJ1ZSkpOmw9W106d3UoYSl8fGNmKGEpPyhsPWMsXG5jZihjKT9sPVJ1KGMpOighYnUoYyl8fHImJmd1KGMpKSYmKGw9T2UoYSkpKTpzPWZhbHNlfXMmJihmLnNldChhLGwpLG5yKGwsYSxyLGUsZiksZi5kZWxldGUoYSkpLGN0KG4sbyxsKX19ZWxzZSBmPWU/ZShuW29dLGksbytcIlwiLG4sdCx1KTpGLGY9PT1GJiYoZj1pKSxjdChuLG8sZil9LFV1KX1mdW5jdGlvbiB0cihuLHQpe3ZhciByPW4ubGVuZ3RoO2lmKHIpcmV0dXJuIHQrPTA+dD9yOjAsUmUodCxyKT9uW3RdOkZ9ZnVuY3Rpb24gcnIobix0LHIpe3ZhciBlPS0xO3JldHVybiB0PWwodC5sZW5ndGg/dDpbTnVdLFMoamUoKSkpLG49WXQobixmdW5jdGlvbihuKXtyZXR1cm57YTpsKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQobil9KSxiOisrZSxjOm59fSksQShuLGZ1bmN0aW9uKG4sdCl7dmFyIGU7bjp7ZT0tMTtmb3IodmFyIHU9bi5hLGk9dC5hLG89dS5sZW5ndGgsZj1yLmxlbmd0aDsrK2U8bzspe3ZhciBjPVVyKHVbZV0saVtlXSk7aWYoYyl7ZT1lPj1mP2M6YyooXCJkZXNjXCI9PXJbZV0/LTE6MSk7XG5icmVhayBufX1lPW4uYi10LmJ9cmV0dXJuIGV9KX1mdW5jdGlvbiBlcihuLHQpe3JldHVybiB1cihuLHQsZnVuY3Rpb24odCxyKXtyZXR1cm4gQnUobixyKX0pfWZ1bmN0aW9uIHVyKG4sdCxyKXtmb3IodmFyIGU9LTEsdT10Lmxlbmd0aCxpPXt9OysrZTx1Oyl7dmFyIG89dFtlXSxmPUl0KG4sbyk7cihmLG8pJiZwcihpLFJyKG8sbiksZil9cmV0dXJuIGl9ZnVuY3Rpb24gaXIobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBJdCh0LG4pfX1mdW5jdGlvbiBvcihuLHQscixlKXt2YXIgdT1lP3k6ZCxpPS0xLG89dC5sZW5ndGgsZj1uO2ZvcihuPT09dCYmKHQ9TXIodCkpLHImJihmPWwobixTKHIpKSk7KytpPG87KWZvcih2YXIgYz0wLGE9dFtpXSxhPXI/cihhKTphOy0xPChjPXUoZixhLGMsZSkpOylmIT09biYmd2kuY2FsbChmLGMsMSksd2kuY2FsbChuLGMsMSk7cmV0dXJuIG59ZnVuY3Rpb24gZnIobix0KXtmb3IodmFyIHI9bj90Lmxlbmd0aDowLGU9ci0xO3ItLTspe3ZhciB1PXRbcl07XG5pZihyPT1lfHx1IT09aSl7dmFyIGk9dTtSZSh1KT93aS5jYWxsKG4sdSwxKTptcihuLHUpfX19ZnVuY3Rpb24gY3Iobix0KXtyZXR1cm4gbit6aShGaSgpKih0LW4rMSkpfWZ1bmN0aW9uIGFyKG4sdCl7dmFyIHI9XCJcIjtpZighbnx8MT50fHw5MDA3MTk5MjU0NzQwOTkxPHQpcmV0dXJuIHI7ZG8gdCUyJiYocis9biksKHQ9emkodC8yKSkmJihuKz1uKTt3aGlsZSh0KTtyZXR1cm4gcn1mdW5jdGlvbiBscihuLHQpe3JldHVybiB3byhDZShuLHQsTnUpLG4rXCJcIil9ZnVuY3Rpb24gc3Iobil7cmV0dXJuIHR0KER1KG4pKX1mdW5jdGlvbiBocihuLHQpe3ZhciByPUR1KG4pO3JldHVybiBUZShyLGd0KHQsMCxyLmxlbmd0aCkpfWZ1bmN0aW9uIHByKG4sdCxyLGUpe2lmKCFidShuKSlyZXR1cm4gbjt0PVJyKHQsbik7Zm9yKHZhciB1PS0xLGk9dC5sZW5ndGgsbz1pLTEsZj1uO251bGwhPWYmJisrdTxpOyl7dmFyIGM9JGUodFt1XSksYT1yO2lmKHUhPW8pe3ZhciBsPWZbY10sYT1lP2UobCxjLGYpOkY7XG5hPT09RiYmKGE9YnUobCk/bDpSZSh0W3UrMV0pP1tdOnt9KX1hdChmLGMsYSksZj1mW2NdfXJldHVybiBufWZ1bmN0aW9uIF9yKG4pe3JldHVybiBUZShEdShuKSl9ZnVuY3Rpb24gdnIobix0LHIpe3ZhciBlPS0xLHU9bi5sZW5ndGg7Zm9yKDA+dCYmKHQ9LXQ+dT8wOnUrdCkscj1yPnU/dTpyLDA+ciYmKHIrPXUpLHU9dD5yPzA6ci10Pj4+MCx0Pj4+PTAscj1IdSh1KTsrK2U8dTspcltlXT1uW2UrdF07cmV0dXJuIHJ9ZnVuY3Rpb24gZ3Iobix0KXt2YXIgcjtyZXR1cm4gb28obixmdW5jdGlvbihuLGUsdSl7cmV0dXJuIHI9dChuLGUsdSksIXJ9KSwhIXJ9ZnVuY3Rpb24gZHIobix0LHIpe3ZhciBlPTAsdT1udWxsPT1uP2U6bi5sZW5ndGg7aWYodHlwZW9mIHQ9PVwibnVtYmVyXCImJnQ9PT10JiYyMTQ3NDgzNjQ3Pj11KXtmb3IoO2U8dTspe3ZhciBpPWUrdT4+PjEsbz1uW2ldO251bGwhPT1vJiYhQXUobykmJihyP288PXQ6bzx0KT9lPWkrMTp1PWl9cmV0dXJuIHV9cmV0dXJuIHlyKG4sdCxOdSxyKTtcbn1mdW5jdGlvbiB5cihuLHQscixlKXt0PXIodCk7Zm9yKHZhciB1PTAsaT1udWxsPT1uPzA6bi5sZW5ndGgsbz10IT09dCxmPW51bGw9PT10LGM9QXUodCksYT10PT09Rjt1PGk7KXt2YXIgbD16aSgodStpKS8yKSxzPXIobltsXSksaD1zIT09RixwPW51bGw9PT1zLF89cz09PXMsdj1BdShzKTsobz9lfHxfOmE/XyYmKGV8fGgpOmY/XyYmaCYmKGV8fCFwKTpjP18mJmgmJiFwJiYoZXx8IXYpOnB8fHY/MDplP3M8PXQ6czx0KT91PWwrMTppPWx9cmV0dXJuIE1pKGksNDI5NDk2NzI5NCl9ZnVuY3Rpb24gYnIobix0KXtmb3IodmFyIHI9LTEsZT1uLmxlbmd0aCx1PTAsaT1bXTsrK3I8ZTspe3ZhciBvPW5bcl0sZj10P3Qobyk6bztpZighcnx8IWh1KGYsYykpe3ZhciBjPWY7aVt1KytdPTA9PT1vPzA6b319cmV0dXJuIGl9ZnVuY3Rpb24geHIobil7cmV0dXJuIHR5cGVvZiBuPT1cIm51bWJlclwiP246QXUobik/UDorbn1mdW5jdGlvbiBqcihuKXtpZih0eXBlb2Ygbj09XCJzdHJpbmdcIilyZXR1cm4gbjtcbmlmKGFmKG4pKXJldHVybiBsKG4sanIpK1wiXCI7aWYoQXUobikpcmV0dXJuIHVvP3VvLmNhbGwobik6XCJcIjt2YXIgdD1uK1wiXCI7cmV0dXJuXCIwXCI9PXQmJjEvbj09LU4/XCItMFwiOnR9ZnVuY3Rpb24gd3Iobix0LHIpe3ZhciBlPS0xLHU9YyxpPW4ubGVuZ3RoLG89dHJ1ZSxmPVtdLGw9ZjtpZihyKW89ZmFsc2UsdT1hO2Vsc2UgaWYoMjAwPD1pKXtpZih1PXQ/bnVsbDpwbyhuKSlyZXR1cm4gRCh1KTtvPWZhbHNlLHU9UixsPW5ldyBxbn1lbHNlIGw9dD9bXTpmO246Zm9yKDsrK2U8aTspe3ZhciBzPW5bZV0saD10P3Qocyk6cyxzPXJ8fDAhPT1zP3M6MDtpZihvJiZoPT09aCl7Zm9yKHZhciBwPWwubGVuZ3RoO3AtLTspaWYobFtwXT09PWgpY29udGludWUgbjt0JiZsLnB1c2goaCksZi5wdXNoKHMpfWVsc2UgdShsLGgscil8fChsIT09ZiYmbC5wdXNoKGgpLGYucHVzaChzKSl9cmV0dXJuIGZ9ZnVuY3Rpb24gbXIobix0KXtyZXR1cm4gdD1Scih0LG4pLG49Mj50Lmxlbmd0aD9uOkl0KG4sdnIodCwwLC0xKSksXG5udWxsPT1ufHxkZWxldGUgblskZShHZSh0KSldfWZ1bmN0aW9uIEFyKG4sdCxyLGUpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPWU/dTotMTsoZT9pLS06KytpPHUpJiZ0KG5baV0saSxuKTspO3JldHVybiByP3ZyKG4sZT8wOmksZT9pKzE6dSk6dnIobixlP2krMTowLGU/dTppKX1mdW5jdGlvbiBrcihuLHQpe3ZhciByPW47cmV0dXJuIHIgaW5zdGFuY2VvZiBNbiYmKHI9ci52YWx1ZSgpKSxoKHQsZnVuY3Rpb24obix0KXtyZXR1cm4gdC5mdW5jLmFwcGx5KHQudGhpc0FyZyxzKFtuXSx0LmFyZ3MpKX0scil9ZnVuY3Rpb24gRXIobix0LHIpe3ZhciBlPW4ubGVuZ3RoO2lmKDI+ZSlyZXR1cm4gZT93cihuWzBdKTpbXTtmb3IodmFyIHU9LTEsaT1IdShlKTsrK3U8ZTspZm9yKHZhciBvPW5bdV0sZj0tMTsrK2Y8ZTspZiE9dSYmKGlbdV09anQoaVt1XXx8byxuW2ZdLHQscikpO3JldHVybiB3cihrdChpLDEpLHQscil9ZnVuY3Rpb24gT3Iobix0LHIpe2Zvcih2YXIgZT0tMSx1PW4ubGVuZ3RoLGk9dC5sZW5ndGgsbz17fTsrK2U8dTspcihvLG5bZV0sZTxpP3RbZV06Rik7XG5yZXR1cm4gb31mdW5jdGlvbiBTcihuKXtyZXR1cm4gX3Uobik/bjpbXX1mdW5jdGlvbiBJcihuKXtyZXR1cm4gdHlwZW9mIG49PVwiZnVuY3Rpb25cIj9uOk51fWZ1bmN0aW9uIFJyKG4sdCl7cmV0dXJuIGFmKG4pP246V2Uobix0KT9bbl06bW8oenUobikpfWZ1bmN0aW9uIHpyKG4sdCxyKXt2YXIgZT1uLmxlbmd0aDtyZXR1cm4gcj1yPT09Rj9lOnIsIXQmJnI+PWU/bjp2cihuLHQscil9ZnVuY3Rpb24gV3Iobix0KXtpZih0KXJldHVybiBuLnNsaWNlKCk7dmFyIHI9bi5sZW5ndGgscj15aT95aShyKTpuZXcgbi5jb25zdHJ1Y3RvcihyKTtyZXR1cm4gbi5jb3B5KHIpLHJ9ZnVuY3Rpb24gQnIobil7dmFyIHQ9bmV3IG4uY29uc3RydWN0b3Iobi5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IGRpKHQpLnNldChuZXcgZGkobikpLHR9ZnVuY3Rpb24gTHIobix0KXtyZXR1cm4gbmV3IG4uY29uc3RydWN0b3IodD9CcihuLmJ1ZmZlcik6bi5idWZmZXIsbi5ieXRlT2Zmc2V0LG4ubGVuZ3RoKX1mdW5jdGlvbiBVcihuLHQpe1xuaWYobiE9PXQpe3ZhciByPW4hPT1GLGU9bnVsbD09PW4sdT1uPT09bixpPUF1KG4pLG89dCE9PUYsZj1udWxsPT09dCxjPXQ9PT10LGE9QXUodCk7aWYoIWYmJiFhJiYhaSYmbj50fHxpJiZvJiZjJiYhZiYmIWF8fGUmJm8mJmN8fCFyJiZjfHwhdSlyZXR1cm4gMTtpZighZSYmIWkmJiFhJiZuPHR8fGEmJnImJnUmJiFlJiYhaXx8ZiYmciYmdXx8IW8mJnV8fCFjKXJldHVybi0xfXJldHVybiAwfWZ1bmN0aW9uIENyKG4sdCxyLGUpe3ZhciB1PS0xLGk9bi5sZW5ndGgsbz1yLmxlbmd0aCxmPS0xLGM9dC5sZW5ndGgsYT1EaShpLW8sMCksbD1IdShjK2EpO2ZvcihlPSFlOysrZjxjOylsW2ZdPXRbZl07Zm9yKDsrK3U8bzspKGV8fHU8aSkmJihsW3JbdV1dPW5bdV0pO2Zvcig7YS0tOylsW2YrK109blt1KytdO3JldHVybiBsfWZ1bmN0aW9uIERyKG4sdCxyLGUpe3ZhciB1PS0xLGk9bi5sZW5ndGgsbz0tMSxmPXIubGVuZ3RoLGM9LTEsYT10Lmxlbmd0aCxsPURpKGktZiwwKSxzPUh1KGwrYSk7XG5mb3IoZT0hZTsrK3U8bDspc1t1XT1uW3VdO2ZvcihsPXU7KytjPGE7KXNbbCtjXT10W2NdO2Zvcig7KytvPGY7KShlfHx1PGkpJiYoc1tsK3Jbb11dPW5bdSsrXSk7cmV0dXJuIHN9ZnVuY3Rpb24gTXIobix0KXt2YXIgcj0tMSxlPW4ubGVuZ3RoO2Zvcih0fHwodD1IdShlKSk7KytyPGU7KXRbcl09bltyXTtyZXR1cm4gdH1mdW5jdGlvbiBUcihuLHQscixlKXt2YXIgdT0hcjtyfHwocj17fSk7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGg7KytpPG87KXt2YXIgZj10W2ldLGM9ZT9lKHJbZl0sbltmXSxmLHIsbik6RjtjPT09RiYmKGM9bltmXSksdT9fdChyLGYsYyk6YXQocixmLGMpfXJldHVybiByfWZ1bmN0aW9uICRyKG4sdCl7cmV0dXJuIFRyKG4sdm8obiksdCl9ZnVuY3Rpb24gRnIobix0KXtyZXR1cm4gVHIobixnbyhuKSx0KX1mdW5jdGlvbiBOcihuLHQpe3JldHVybiBmdW5jdGlvbihyLHUpe3ZhciBpPWFmKHIpP2U6c3Qsbz10P3QoKTp7fTtyZXR1cm4gaShyLG4samUodSwyKSxvKTtcbn19ZnVuY3Rpb24gUHIobil7cmV0dXJuIGxyKGZ1bmN0aW9uKHQscil7dmFyIGU9LTEsdT1yLmxlbmd0aCxpPTE8dT9yW3UtMV06RixvPTI8dT9yWzJdOkYsaT0zPG4ubGVuZ3RoJiZ0eXBlb2YgaT09XCJmdW5jdGlvblwiPyh1LS0saSk6Rjtmb3IobyYmemUoclswXSxyWzFdLG8pJiYoaT0zPnU/RjppLHU9MSksdD1uaSh0KTsrK2U8dTspKG89cltlXSkmJm4odCxvLGUsaSk7cmV0dXJuIHR9KX1mdW5jdGlvbiBacihuLHQpe3JldHVybiBmdW5jdGlvbihyLGUpe2lmKG51bGw9PXIpcmV0dXJuIHI7aWYoIXB1KHIpKXJldHVybiBuKHIsZSk7Zm9yKHZhciB1PXIubGVuZ3RoLGk9dD91Oi0xLG89bmkocik7KHQ/aS0tOisraTx1KSYmZmFsc2UhPT1lKG9baV0saSxvKTspO3JldHVybiByfX1mdW5jdGlvbiBxcihuKXtyZXR1cm4gZnVuY3Rpb24odCxyLGUpe3ZhciB1PS0xLGk9bmkodCk7ZT1lKHQpO2Zvcih2YXIgbz1lLmxlbmd0aDtvLS07KXt2YXIgZj1lW24/bzorK3VdO2lmKGZhbHNlPT09cihpW2ZdLGYsaSkpYnJlYWs7XG59cmV0dXJuIHR9fWZ1bmN0aW9uIFZyKG4sdCxyKXtmdW5jdGlvbiBlKCl7cmV0dXJuKHRoaXMmJnRoaXMhPT1abiYmdGhpcyBpbnN0YW5jZW9mIGU/aTpuKS5hcHBseSh1P3I6dGhpcyxhcmd1bWVudHMpfXZhciB1PTEmdCxpPUhyKG4pO3JldHVybiBlfWZ1bmN0aW9uIEtyKG4pe3JldHVybiBmdW5jdGlvbih0KXt0PXp1KHQpO3ZhciByPUJuLnRlc3QodCk/JCh0KTpGLGU9cj9yWzBdOnQuY2hhckF0KDApO3JldHVybiB0PXI/enIociwxKS5qb2luKFwiXCIpOnQuc2xpY2UoMSksZVtuXSgpK3R9fWZ1bmN0aW9uIEdyKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaCgkdShUdSh0KS5yZXBsYWNlKEluLFwiXCIpKSxuLFwiXCIpfX1mdW5jdGlvbiBIcihuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHM7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBuO2Nhc2UgMTpyZXR1cm4gbmV3IG4odFswXSk7Y2FzZSAyOnJldHVybiBuZXcgbih0WzBdLHRbMV0pO2Nhc2UgMzpcbnJldHVybiBuZXcgbih0WzBdLHRbMV0sdFsyXSk7Y2FzZSA0OnJldHVybiBuZXcgbih0WzBdLHRbMV0sdFsyXSx0WzNdKTtjYXNlIDU6cmV0dXJuIG5ldyBuKHRbMF0sdFsxXSx0WzJdLHRbM10sdFs0XSk7Y2FzZSA2OnJldHVybiBuZXcgbih0WzBdLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSk7Y2FzZSA3OnJldHVybiBuZXcgbih0WzBdLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSx0WzZdKX12YXIgcj1pbyhuLnByb3RvdHlwZSksdD1uLmFwcGx5KHIsdCk7cmV0dXJuIGJ1KHQpP3Q6cn19ZnVuY3Rpb24gSnIobix0LGUpe2Z1bmN0aW9uIHUoKXtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCxmPUh1KG8pLGM9byxhPXhlKHUpO2MtLTspZltjXT1hcmd1bWVudHNbY107cmV0dXJuIGM9Mz5vJiZmWzBdIT09YSYmZltvLTFdIT09YT9bXTpDKGYsYSksby09Yy5sZW5ndGgsbzxlP2ZlKG4sdCxYcix1LnBsYWNlaG9sZGVyLEYsZixjLEYsRixlLW8pOnIodGhpcyYmdGhpcyE9PVpuJiZ0aGlzIGluc3RhbmNlb2YgdT9pOm4sdGhpcyxmKTtcbn12YXIgaT1IcihuKTtyZXR1cm4gdX1mdW5jdGlvbiBZcihuKXtyZXR1cm4gZnVuY3Rpb24odCxyLGUpe3ZhciB1PW5pKHQpO2lmKCFwdSh0KSl7dmFyIGk9amUociwzKTt0PUx1KHQpLHI9ZnVuY3Rpb24obil7cmV0dXJuIGkodVtuXSxuLHUpfX1yZXR1cm4gcj1uKHQscixlKSwtMTxyP3VbaT90W3JdOnJdOkZ9fWZ1bmN0aW9uIFFyKG4pe3JldHVybiBnZShmdW5jdGlvbih0KXt2YXIgcj10Lmxlbmd0aCxlPXIsdT16bi5wcm90b3R5cGUudGhydTtmb3IobiYmdC5yZXZlcnNlKCk7ZS0tOyl7dmFyIGk9dFtlXTtpZih0eXBlb2YgaSE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBlaShcIkV4cGVjdGVkIGEgZnVuY3Rpb25cIik7aWYodSYmIW8mJlwid3JhcHBlclwiPT1iZShpKSl2YXIgbz1uZXcgem4oW10sdHJ1ZSl9Zm9yKGU9bz9lOnI7KytlPHI7KXZhciBpPXRbZV0sdT1iZShpKSxmPVwid3JhcHBlclwiPT11P19vKGkpOkYsbz1mJiZCZShmWzBdKSYmNDI0PT1mWzFdJiYhZls0XS5sZW5ndGgmJjE9PWZbOV0/b1tiZShmWzBdKV0uYXBwbHkobyxmWzNdKToxPT1pLmxlbmd0aCYmQmUoaSk/b1t1XSgpOm8udGhydShpKTtcbnJldHVybiBmdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxlPW5bMF07aWYobyYmMT09bi5sZW5ndGgmJmFmKGUpKXJldHVybiBvLnBsYW50KGUpLnZhbHVlKCk7Zm9yKHZhciB1PTAsbj1yP3RbdV0uYXBwbHkodGhpcyxuKTplOysrdTxyOyluPXRbdV0uY2FsbCh0aGlzLG4pO3JldHVybiBufX0pfWZ1bmN0aW9uIFhyKG4sdCxyLGUsdSxpLG8sZixjLGEpe2Z1bmN0aW9uIGwoKXtmb3IodmFyIGQ9YXJndW1lbnRzLmxlbmd0aCx5PUh1KGQpLGI9ZDtiLS07KXlbYl09YXJndW1lbnRzW2JdO2lmKF8pe3ZhciB4LGo9eGUobCksYj15Lmxlbmd0aDtmb3IoeD0wO2ItLTspeVtiXT09PWomJisreH1pZihlJiYoeT1Dcih5LGUsdSxfKSksaSYmKHk9RHIoeSxpLG8sXykpLGQtPXgsXyYmZDxhKXJldHVybiBqPUMoeSxqKSxmZShuLHQsWHIsbC5wbGFjZWhvbGRlcixyLHksaixmLGMsYS1kKTtpZihqPWg/cjp0aGlzLGI9cD9qW25dOm4sZD15Lmxlbmd0aCxmKXt4PXkubGVuZ3RoO2Zvcih2YXIgdz1NaShmLmxlbmd0aCx4KSxtPU1yKHkpO3ctLTspe1xudmFyIEE9Zlt3XTt5W3ddPVJlKEEseCk/bVtBXTpGfX1lbHNlIHYmJjE8ZCYmeS5yZXZlcnNlKCk7cmV0dXJuIHMmJmM8ZCYmKHkubGVuZ3RoPWMpLHRoaXMmJnRoaXMhPT1abiYmdGhpcyBpbnN0YW5jZW9mIGwmJihiPWd8fEhyKGIpKSxiLmFwcGx5KGoseSl9dmFyIHM9MTI4JnQsaD0xJnQscD0yJnQsXz0yNCZ0LHY9NTEyJnQsZz1wP0Y6SHIobik7cmV0dXJuIGx9ZnVuY3Rpb24gbmUobix0KXtyZXR1cm4gZnVuY3Rpb24ocixlKXtyZXR1cm4gQ3QocixuLHQoZSkpfX1mdW5jdGlvbiB0ZShuLHQpe3JldHVybiBmdW5jdGlvbihyLGUpe3ZhciB1O2lmKHI9PT1GJiZlPT09RilyZXR1cm4gdDtpZihyIT09RiYmKHU9ciksZSE9PUYpe2lmKHU9PT1GKXJldHVybiBlO3R5cGVvZiByPT1cInN0cmluZ1wifHx0eXBlb2YgZT09XCJzdHJpbmdcIj8ocj1qcihyKSxlPWpyKGUpKToocj14cihyKSxlPXhyKGUpKSx1PW4ocixlKX1yZXR1cm4gdX19ZnVuY3Rpb24gcmUobil7cmV0dXJuIGdlKGZ1bmN0aW9uKHQpe1xucmV0dXJuIHQ9bCh0LFMoamUoKSkpLGxyKGZ1bmN0aW9uKGUpe3ZhciB1PXRoaXM7cmV0dXJuIG4odCxmdW5jdGlvbihuKXtyZXR1cm4gcihuLHUsZSl9KX0pfSl9ZnVuY3Rpb24gZWUobix0KXt0PXQ9PT1GP1wiIFwiOmpyKHQpO3ZhciByPXQubGVuZ3RoO3JldHVybiAyPnI/cj9hcih0LG4pOnQ6KHI9YXIodCxSaShuL1QodCkpKSxCbi50ZXN0KHQpP3pyKCQociksMCxuKS5qb2luKFwiXCIpOnIuc2xpY2UoMCxuKSl9ZnVuY3Rpb24gdWUobix0LGUsdSl7ZnVuY3Rpb24gaSgpe2Zvcih2YXIgdD0tMSxjPWFyZ3VtZW50cy5sZW5ndGgsYT0tMSxsPXUubGVuZ3RoLHM9SHUobCtjKSxoPXRoaXMmJnRoaXMhPT1abiYmdGhpcyBpbnN0YW5jZW9mIGk/ZjpuOysrYTxsOylzW2FdPXVbYV07Zm9yKDtjLS07KXNbYSsrXT1hcmd1bWVudHNbKyt0XTtyZXR1cm4gcihoLG8/ZTp0aGlzLHMpfXZhciBvPTEmdCxmPUhyKG4pO3JldHVybiBpfWZ1bmN0aW9uIGllKG4pe3JldHVybiBmdW5jdGlvbih0LHIsZSl7XG5lJiZ0eXBlb2YgZSE9XCJudW1iZXJcIiYmemUodCxyLGUpJiYocj1lPUYpLHQ9RXUodCkscj09PUY/KHI9dCx0PTApOnI9RXUociksZT1lPT09Rj90PHI/MTotMTpFdShlKTt2YXIgdT0tMTtyPURpKFJpKChyLXQpLyhlfHwxKSksMCk7Zm9yKHZhciBpPUh1KHIpO3ItLTspaVtuP3I6Kyt1XT10LHQrPWU7cmV0dXJuIGl9fWZ1bmN0aW9uIG9lKG4pe3JldHVybiBmdW5jdGlvbih0LHIpe3JldHVybiB0eXBlb2YgdD09XCJzdHJpbmdcIiYmdHlwZW9mIHI9PVwic3RyaW5nXCJ8fCh0PUl1KHQpLHI9SXUocikpLG4odCxyKX19ZnVuY3Rpb24gZmUobix0LHIsZSx1LGksbyxmLGMsYSl7dmFyIGw9OCZ0LHM9bD9vOkY7bz1sP0Y6bzt2YXIgaD1sP2k6RjtyZXR1cm4gaT1sP0Y6aSx0PSh0fChsPzMyOjY0KSkmfihsPzY0OjMyKSw0JnR8fCh0Jj0tNCksdT1bbix0LHUsaCxzLGksbyxmLGMsYV0scj1yLmFwcGx5KEYsdSksQmUobikmJnhvKHIsdSksci5wbGFjZWhvbGRlcj1lLERlKHIsbix0KX1mdW5jdGlvbiBjZShuKXtcbnZhciB0PVh1W25dO3JldHVybiBmdW5jdGlvbihuLHIpe2lmKG49SXUobikscj1udWxsPT1yPzA6TWkoT3UociksMjkyKSl7dmFyIGU9KHp1KG4pK1wiZVwiKS5zcGxpdChcImVcIiksZT10KGVbMF0rXCJlXCIrKCtlWzFdK3IpKSxlPSh6dShlKStcImVcIikuc3BsaXQoXCJlXCIpO3JldHVybisoZVswXStcImVcIisoK2VbMV0tcikpfXJldHVybiB0KG4pfX1mdW5jdGlvbiBhZShuKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI9eW8odCk7cmV0dXJuXCJbb2JqZWN0IE1hcF1cIj09cj9MKHQpOlwiW29iamVjdCBTZXRdXCI9PXI/TSh0KTpPKHQsbih0KSl9fWZ1bmN0aW9uIGxlKG4sdCxyLGUsdSxpLG8sZil7dmFyIGM9MiZ0O2lmKCFjJiZ0eXBlb2YgbiE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBlaShcIkV4cGVjdGVkIGEgZnVuY3Rpb25cIik7dmFyIGE9ZT9lLmxlbmd0aDowO2lmKGF8fCh0Jj0tOTcsZT11PUYpLG89bz09PUY/bzpEaShPdShvKSwwKSxmPWY9PT1GP2Y6T3UoZiksYS09dT91Lmxlbmd0aDowLDY0JnQpe1xudmFyIGw9ZSxzPXU7ZT11PUZ9dmFyIGg9Yz9GOl9vKG4pO3JldHVybiBpPVtuLHQscixlLHUsbCxzLGksbyxmXSxoJiYocj1pWzFdLG49aFsxXSx0PXJ8bixlPTEyOD09biYmOD09cnx8MTI4PT1uJiYyNTY9PXImJmlbN10ubGVuZ3RoPD1oWzhdfHwzODQ9PW4mJmhbN10ubGVuZ3RoPD1oWzhdJiY4PT1yLDEzMT50fHxlKSYmKDEmbiYmKGlbMl09aFsyXSx0fD0xJnI/MDo0KSwocj1oWzNdKSYmKGU9aVszXSxpWzNdPWU/Q3IoZSxyLGhbNF0pOnIsaVs0XT1lP0MoaVszXSxcIl9fbG9kYXNoX3BsYWNlaG9sZGVyX19cIik6aFs0XSksKHI9aFs1XSkmJihlPWlbNV0saVs1XT1lP0RyKGUscixoWzZdKTpyLGlbNl09ZT9DKGlbNV0sXCJfX2xvZGFzaF9wbGFjZWhvbGRlcl9fXCIpOmhbNl0pLChyPWhbN10pJiYoaVs3XT1yKSwxMjgmbiYmKGlbOF09bnVsbD09aVs4XT9oWzhdOk1pKGlbOF0saFs4XSkpLG51bGw9PWlbOV0mJihpWzldPWhbOV0pLGlbMF09aFswXSxpWzFdPXQpLG49aVswXSx0PWlbMV0sXG5yPWlbMl0sZT1pWzNdLHU9aVs0XSxmPWlbOV09aVs5XT09PUY/Yz8wOm4ubGVuZ3RoOkRpKGlbOV0tYSwwKSwhZiYmMjQmdCYmKHQmPS0yNSksRGUoKGg/bG86eG8pKHQmJjEhPXQ/OD09dHx8MTY9PXQ/SnIobix0LGYpOjMyIT10JiYzMyE9dHx8dS5sZW5ndGg/WHIuYXBwbHkoRixpKTp1ZShuLHQscixlKTpWcihuLHQsciksaSksbix0KX1mdW5jdGlvbiBzZShuLHQscixlKXtyZXR1cm4gbj09PUZ8fGh1KG4saWlbcl0pJiYhY2kuY2FsbChlLHIpP3Q6bn1mdW5jdGlvbiBoZShuLHQscixlLHUsaSl7cmV0dXJuIGJ1KG4pJiZidSh0KSYmKGkuc2V0KHQsbiksbnIobix0LEYsaGUsaSksaS5kZWxldGUodCkpLG59ZnVuY3Rpb24gcGUobil7cmV0dXJuIHd1KG4pP0Y6bn1mdW5jdGlvbiBfZShuLHQscixlLHUsaSl7dmFyIG89MSZyLGY9bi5sZW5ndGgsYz10Lmxlbmd0aDtpZihmIT1jJiYhKG8mJmM+ZikpcmV0dXJuIGZhbHNlO2lmKChjPWkuZ2V0KG4pKSYmaS5nZXQodCkpcmV0dXJuIGM9PXQ7dmFyIGM9LTEsYT10cnVlLGw9MiZyP25ldyBxbjpGO1xuZm9yKGkuc2V0KG4sdCksaS5zZXQodCxuKTsrK2M8Zjspe3ZhciBzPW5bY10saD10W2NdO2lmKGUpdmFyIHA9bz9lKGgscyxjLHQsbixpKTplKHMsaCxjLG4sdCxpKTtpZihwIT09Ril7aWYocCljb250aW51ZTthPWZhbHNlO2JyZWFrfWlmKGwpe2lmKCFfKHQsZnVuY3Rpb24obix0KXtpZighUihsLHQpJiYocz09PW58fHUocyxuLHIsZSxpKSkpcmV0dXJuIGwucHVzaCh0KX0pKXthPWZhbHNlO2JyZWFrfX1lbHNlIGlmKHMhPT1oJiYhdShzLGgscixlLGkpKXthPWZhbHNlO2JyZWFrfX1yZXR1cm4gaS5kZWxldGUobiksaS5kZWxldGUodCksYX1mdW5jdGlvbiB2ZShuLHQscixlLHUsaSxvKXtzd2l0Y2gocil7Y2FzZVwiW29iamVjdCBEYXRhVmlld11cIjppZihuLmJ5dGVMZW5ndGghPXQuYnl0ZUxlbmd0aHx8bi5ieXRlT2Zmc2V0IT10LmJ5dGVPZmZzZXQpYnJlYWs7bj1uLmJ1ZmZlcix0PXQuYnVmZmVyO2Nhc2VcIltvYmplY3QgQXJyYXlCdWZmZXJdXCI6aWYobi5ieXRlTGVuZ3RoIT10LmJ5dGVMZW5ndGh8fCFpKG5ldyBkaShuKSxuZXcgZGkodCkpKWJyZWFrO1xucmV0dXJuIHRydWU7Y2FzZVwiW29iamVjdCBCb29sZWFuXVwiOmNhc2VcIltvYmplY3QgRGF0ZV1cIjpjYXNlXCJbb2JqZWN0IE51bWJlcl1cIjpyZXR1cm4gaHUoK24sK3QpO2Nhc2VcIltvYmplY3QgRXJyb3JdXCI6cmV0dXJuIG4ubmFtZT09dC5uYW1lJiZuLm1lc3NhZ2U9PXQubWVzc2FnZTtjYXNlXCJbb2JqZWN0IFJlZ0V4cF1cIjpjYXNlXCJbb2JqZWN0IFN0cmluZ11cIjpyZXR1cm4gbj09dCtcIlwiO2Nhc2VcIltvYmplY3QgTWFwXVwiOnZhciBmPUw7Y2FzZVwiW29iamVjdCBTZXRdXCI6aWYoZnx8KGY9RCksbi5zaXplIT10LnNpemUmJiEoMSZlKSlicmVhaztyZXR1cm4ocj1vLmdldChuKSk/cj09dDooZXw9MixvLnNldChuLHQpLHQ9X2UoZihuKSxmKHQpLGUsdSxpLG8pLG8uZGVsZXRlKG4pLHQpO2Nhc2VcIltvYmplY3QgU3ltYm9sXVwiOmlmKGVvKXJldHVybiBlby5jYWxsKG4pPT1lby5jYWxsKHQpfXJldHVybiBmYWxzZX1mdW5jdGlvbiBnZShuKXtyZXR1cm4gd28oQ2UobixGLFZlKSxuK1wiXCIpfWZ1bmN0aW9uIGRlKG4pe1xucmV0dXJuIFJ0KG4sTHUsdm8pfWZ1bmN0aW9uIHllKG4pe3JldHVybiBSdChuLFV1LGdvKX1mdW5jdGlvbiBiZShuKXtmb3IodmFyIHQ9bi5uYW1lK1wiXCIscj1KaVt0XSxlPWNpLmNhbGwoSmksdCk/ci5sZW5ndGg6MDtlLS07KXt2YXIgdT1yW2VdLGk9dS5mdW5jO2lmKG51bGw9PWl8fGk9PW4pcmV0dXJuIHUubmFtZX1yZXR1cm4gdH1mdW5jdGlvbiB4ZShuKXtyZXR1cm4oY2kuY2FsbChPbixcInBsYWNlaG9sZGVyXCIpP09uOm4pLnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGplKCl7dmFyIG49T24uaXRlcmF0ZWV8fFB1LG49bj09PVB1P0d0Om47cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTpufWZ1bmN0aW9uIHdlKG4sdCl7dmFyIHI9bi5fX2RhdGFfXyxlPXR5cGVvZiB0O3JldHVybihcInN0cmluZ1wiPT1lfHxcIm51bWJlclwiPT1lfHxcInN5bWJvbFwiPT1lfHxcImJvb2xlYW5cIj09ZT9cIl9fcHJvdG9fX1wiIT09dDpudWxsPT09dCk/clt0eXBlb2YgdD09XCJzdHJpbmdcIj9cInN0cmluZ1wiOlwiaGFzaFwiXTpyLm1hcDtcbn1mdW5jdGlvbiBtZShuKXtmb3IodmFyIHQ9THUobikscj10Lmxlbmd0aDtyLS07KXt2YXIgZT10W3JdLHU9bltlXTt0W3JdPVtlLHUsdT09PXUmJiFidSh1KV19cmV0dXJuIHR9ZnVuY3Rpb24gQWUobix0KXt2YXIgcj1udWxsPT1uP0Y6blt0XTtyZXR1cm4gWnQocik/cjpGfWZ1bmN0aW9uIGtlKG4sdCxyKXt0PVJyKHQsbik7Zm9yKHZhciBlPS0xLHU9dC5sZW5ndGgsaT1mYWxzZTsrK2U8dTspe3ZhciBvPSRlKHRbZV0pO2lmKCEoaT1udWxsIT1uJiZyKG4sbykpKWJyZWFrO249bltvXX1yZXR1cm4gaXx8KytlIT11P2k6KHU9bnVsbD09bj8wOm4ubGVuZ3RoLCEhdSYmeXUodSkmJlJlKG8sdSkmJihhZihuKXx8Y2YobikpKX1mdW5jdGlvbiBFZShuKXt2YXIgdD1uLmxlbmd0aCxyPW4uY29uc3RydWN0b3IodCk7cmV0dXJuIHQmJlwic3RyaW5nXCI9PXR5cGVvZiBuWzBdJiZjaS5jYWxsKG4sXCJpbmRleFwiKSYmKHIuaW5kZXg9bi5pbmRleCxyLmlucHV0PW4uaW5wdXQpLHJ9ZnVuY3Rpb24gT2Uobil7XG5yZXR1cm4gdHlwZW9mIG4uY29uc3RydWN0b3IhPVwiZnVuY3Rpb25cInx8TGUobik/e306aW8oYmkobikpfWZ1bmN0aW9uIFNlKHIsZSx1LGkpe3ZhciBvPXIuY29uc3RydWN0b3I7c3dpdGNoKGUpe2Nhc2VcIltvYmplY3QgQXJyYXlCdWZmZXJdXCI6cmV0dXJuIEJyKHIpO2Nhc2VcIltvYmplY3QgQm9vbGVhbl1cIjpjYXNlXCJbb2JqZWN0IERhdGVdXCI6cmV0dXJuIG5ldyBvKCtyKTtjYXNlXCJbb2JqZWN0IERhdGFWaWV3XVwiOnJldHVybiBlPWk/QnIoci5idWZmZXIpOnIuYnVmZmVyLG5ldyByLmNvbnN0cnVjdG9yKGUsci5ieXRlT2Zmc2V0LHIuYnl0ZUxlbmd0aCk7Y2FzZVwiW29iamVjdCBGbG9hdDMyQXJyYXldXCI6Y2FzZVwiW29iamVjdCBGbG9hdDY0QXJyYXldXCI6Y2FzZVwiW29iamVjdCBJbnQ4QXJyYXldXCI6Y2FzZVwiW29iamVjdCBJbnQxNkFycmF5XVwiOmNhc2VcIltvYmplY3QgSW50MzJBcnJheV1cIjpjYXNlXCJbb2JqZWN0IFVpbnQ4QXJyYXldXCI6Y2FzZVwiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV1cIjpcbmNhc2VcIltvYmplY3QgVWludDE2QXJyYXldXCI6Y2FzZVwiW29iamVjdCBVaW50MzJBcnJheV1cIjpyZXR1cm4gTHIocixpKTtjYXNlXCJbb2JqZWN0IE1hcF1cIjpyZXR1cm4gZT1pP3UoTChyKSwxKTpMKHIpLGgoZSxuLG5ldyByLmNvbnN0cnVjdG9yKTtjYXNlXCJbb2JqZWN0IE51bWJlcl1cIjpjYXNlXCJbb2JqZWN0IFN0cmluZ11cIjpyZXR1cm4gbmV3IG8ocik7Y2FzZVwiW29iamVjdCBSZWdFeHBdXCI6cmV0dXJuIGU9bmV3IHIuY29uc3RydWN0b3Ioci5zb3VyY2UsZG4uZXhlYyhyKSksZS5sYXN0SW5kZXg9ci5sYXN0SW5kZXgsZTtjYXNlXCJbb2JqZWN0IFNldF1cIjpyZXR1cm4gZT1pP3UoRChyKSwxKTpEKHIpLGgoZSx0LG5ldyByLmNvbnN0cnVjdG9yKTtjYXNlXCJbb2JqZWN0IFN5bWJvbF1cIjpyZXR1cm4gZW8/bmkoZW8uY2FsbChyKSk6e319fWZ1bmN0aW9uIEllKG4pe3JldHVybiBhZihuKXx8Y2Yobil8fCEhKG1pJiZuJiZuW21pXSl9ZnVuY3Rpb24gUmUobix0KXtyZXR1cm4gdD1udWxsPT10PzkwMDcxOTkyNTQ3NDA5OTE6dCxcbiEhdCYmKHR5cGVvZiBuPT1cIm51bWJlclwifHx3bi50ZXN0KG4pKSYmLTE8biYmMD09biUxJiZuPHR9ZnVuY3Rpb24gemUobix0LHIpe2lmKCFidShyKSlyZXR1cm4gZmFsc2U7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuISEoXCJudW1iZXJcIj09ZT9wdShyKSYmUmUodCxyLmxlbmd0aCk6XCJzdHJpbmdcIj09ZSYmdCBpbiByKSYmaHUoclt0XSxuKX1mdW5jdGlvbiBXZShuLHQpe2lmKGFmKG4pKXJldHVybiBmYWxzZTt2YXIgcj10eXBlb2YgbjtyZXR1cm4hKFwibnVtYmVyXCIhPXImJlwic3ltYm9sXCIhPXImJlwiYm9vbGVhblwiIT1yJiZudWxsIT1uJiYhQXUobikpfHwocm4udGVzdChuKXx8IXRuLnRlc3Qobil8fG51bGwhPXQmJm4gaW4gbmkodCkpfWZ1bmN0aW9uIEJlKG4pe3ZhciB0PWJlKG4pLHI9T25bdF07cmV0dXJuIHR5cGVvZiByPT1cImZ1bmN0aW9uXCImJnQgaW4gTW4ucHJvdG90eXBlJiYobj09PXJ8fCh0PV9vKHIpLCEhdCYmbj09PXRbMF0pKX1mdW5jdGlvbiBMZShuKXt2YXIgdD1uJiZuLmNvbnN0cnVjdG9yO1xucmV0dXJuIG49PT0odHlwZW9mIHQ9PVwiZnVuY3Rpb25cIiYmdC5wcm90b3R5cGV8fGlpKX1mdW5jdGlvbiBVZShuLHQpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gbnVsbCE9ciYmKHJbbl09PT10JiYodCE9PUZ8fG4gaW4gbmkocikpKX19ZnVuY3Rpb24gQ2Uobix0LGUpe3JldHVybiB0PURpKHQ9PT1GP24ubGVuZ3RoLTE6dCwwKSxmdW5jdGlvbigpe2Zvcih2YXIgdT1hcmd1bWVudHMsaT0tMSxvPURpKHUubGVuZ3RoLXQsMCksZj1IdShvKTsrK2k8bzspZltpXT11W3QraV07Zm9yKGk9LTEsbz1IdSh0KzEpOysraTx0OylvW2ldPXVbaV07cmV0dXJuIG9bdF09ZShmKSxyKG4sdGhpcyxvKX19ZnVuY3Rpb24gRGUobix0LHIpe3ZhciBlPXQrXCJcIjt0PXdvO3ZhciB1LGk9TmU7cmV0dXJuIHU9KHU9ZS5tYXRjaChobikpP3VbMV0uc3BsaXQocG4pOltdLHI9aSh1LHIpLChpPXIubGVuZ3RoKSYmKHU9aS0xLHJbdV09KDE8aT9cIiYgXCI6XCJcIikrclt1XSxyPXIuam9pbigyPGk/XCIsIFwiOlwiIFwiKSxcbmU9ZS5yZXBsYWNlKHNuLFwie1xcbi8qIFt3cmFwcGVkIHdpdGggXCIrcitcIl0gKi9cXG5cIikpLHQobixlKX1mdW5jdGlvbiBNZShuKXt2YXIgdD0wLHI9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1UaSgpLHU9MTYtKGUtcik7aWYocj1lLDA8dSl7aWYoODAwPD0rK3QpcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIHQ9MDtyZXR1cm4gbi5hcHBseShGLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIFRlKG4sdCl7dmFyIHI9LTEsZT1uLmxlbmd0aCx1PWUtMTtmb3IodD10PT09Rj9lOnQ7KytyPHQ7KXt2YXIgZT1jcihyLHUpLGk9bltlXTtuW2VdPW5bcl0sbltyXT1pfXJldHVybiBuLmxlbmd0aD10LG59ZnVuY3Rpb24gJGUobil7aWYodHlwZW9mIG49PVwic3RyaW5nXCJ8fEF1KG4pKXJldHVybiBuO3ZhciB0PW4rXCJcIjtyZXR1cm5cIjBcIj09dCYmMS9uPT0tTj9cIi0wXCI6dH1mdW5jdGlvbiBGZShuKXtpZihudWxsIT1uKXt0cnl7cmV0dXJuIGZpLmNhbGwobil9Y2F0Y2gobil7fXJldHVybiBuK1wiXCJ9cmV0dXJuXCJcIjtcbn1mdW5jdGlvbiBOZShuLHQpe3JldHVybiB1KFosZnVuY3Rpb24ocil7dmFyIGU9XCJfLlwiK3JbMF07dCZyWzFdJiYhYyhuLGUpJiZuLnB1c2goZSl9KSxuLnNvcnQoKX1mdW5jdGlvbiBQZShuKXtpZihuIGluc3RhbmNlb2YgTW4pcmV0dXJuIG4uY2xvbmUoKTt2YXIgdD1uZXcgem4obi5fX3dyYXBwZWRfXyxuLl9fY2hhaW5fXyk7cmV0dXJuIHQuX19hY3Rpb25zX189TXIobi5fX2FjdGlvbnNfXyksdC5fX2luZGV4X189bi5fX2luZGV4X18sdC5fX3ZhbHVlc19fPW4uX192YWx1ZXNfXyx0fWZ1bmN0aW9uIFplKG4sdCxyKXt2YXIgZT1udWxsPT1uPzA6bi5sZW5ndGg7cmV0dXJuIGU/KHI9bnVsbD09cj8wOk91KHIpLDA+ciYmKHI9RGkoZStyLDApKSxnKG4samUodCwzKSxyKSk6LTF9ZnVuY3Rpb24gcWUobix0LHIpe3ZhciBlPW51bGw9PW4/MDpuLmxlbmd0aDtpZighZSlyZXR1cm4tMTt2YXIgdT1lLTE7cmV0dXJuIHIhPT1GJiYodT1PdShyKSx1PTA+cj9EaShlK3UsMCk6TWkodSxlLTEpKSxcbmcobixqZSh0LDMpLHUsdHJ1ZSl9ZnVuY3Rpb24gVmUobil7cmV0dXJuKG51bGw9PW4/MDpuLmxlbmd0aCk/a3QobiwxKTpbXX1mdW5jdGlvbiBLZShuKXtyZXR1cm4gbiYmbi5sZW5ndGg/blswXTpGfWZ1bmN0aW9uIEdlKG4pe3ZhciB0PW51bGw9PW4/MDpuLmxlbmd0aDtyZXR1cm4gdD9uW3QtMV06Rn1mdW5jdGlvbiBIZShuLHQpe3JldHVybiBuJiZuLmxlbmd0aCYmdCYmdC5sZW5ndGg/b3Iobix0KTpufWZ1bmN0aW9uIEplKG4pe3JldHVybiBudWxsPT1uP246TmkuY2FsbChuKX1mdW5jdGlvbiBZZShuKXtpZighbnx8IW4ubGVuZ3RoKXJldHVybltdO3ZhciB0PTA7cmV0dXJuIG49ZihuLGZ1bmN0aW9uKG4pe2lmKF91KG4pKXJldHVybiB0PURpKG4ubGVuZ3RoLHQpLHRydWV9KSxFKHQsZnVuY3Rpb24odCl7cmV0dXJuIGwobixqKHQpKX0pfWZ1bmN0aW9uIFFlKG4sdCl7aWYoIW58fCFuLmxlbmd0aClyZXR1cm5bXTt2YXIgZT1ZZShuKTtyZXR1cm4gbnVsbD09dD9lOmwoZSxmdW5jdGlvbihuKXtcbnJldHVybiByKHQsRixuKX0pfWZ1bmN0aW9uIFhlKG4pe3JldHVybiBuPU9uKG4pLG4uX19jaGFpbl9fPXRydWUsbn1mdW5jdGlvbiBudShuLHQpe3JldHVybiB0KG4pfWZ1bmN0aW9uIHR1KCl7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gcnUobix0KXtyZXR1cm4oYWYobik/dTpvbykobixqZSh0LDMpKX1mdW5jdGlvbiBldShuLHQpe3JldHVybihhZihuKT9pOmZvKShuLGplKHQsMykpfWZ1bmN0aW9uIHV1KG4sdCl7cmV0dXJuKGFmKG4pP2w6WXQpKG4samUodCwzKSl9ZnVuY3Rpb24gaXUobix0LHIpe3JldHVybiB0PXI/Rjp0LHQ9biYmbnVsbD09dD9uLmxlbmd0aDp0LGxlKG4sMTI4LEYsRixGLEYsdCl9ZnVuY3Rpb24gb3Uobix0KXt2YXIgcjtpZih0eXBlb2YgdCE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBlaShcIkV4cGVjdGVkIGEgZnVuY3Rpb25cIik7cmV0dXJuIG49T3UobiksZnVuY3Rpb24oKXtyZXR1cm4gMDwtLW4mJihyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpKSwxPj1uJiYodD1GKSxcbnJ9fWZ1bmN0aW9uIGZ1KG4sdCxyKXtyZXR1cm4gdD1yP0Y6dCxuPWxlKG4sOCxGLEYsRixGLEYsdCksbi5wbGFjZWhvbGRlcj1mdS5wbGFjZWhvbGRlcixufWZ1bmN0aW9uIGN1KG4sdCxyKXtyZXR1cm4gdD1yP0Y6dCxuPWxlKG4sMTYsRixGLEYsRixGLHQpLG4ucGxhY2Vob2xkZXI9Y3UucGxhY2Vob2xkZXIsbn1mdW5jdGlvbiBhdShuLHQscil7ZnVuY3Rpb24gZSh0KXt2YXIgcj1jLGU9YTtyZXR1cm4gYz1hPUYsXz10LHM9bi5hcHBseShlLHIpfWZ1bmN0aW9uIHUobil7dmFyIHI9bi1wO3JldHVybiBuLT1fLHA9PT1GfHxyPj10fHwwPnJ8fGcmJm4+PWx9ZnVuY3Rpb24gaSgpe3ZhciBuPUpvKCk7aWYodShuKSlyZXR1cm4gbyhuKTt2YXIgcixlPWpvO3I9bi1fLG49dC0obi1wKSxyPWc/TWkobixsLXIpOm4saD1lKGkscil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gaD1GLGQmJmM/ZShuKTooYz1hPUYscyl9ZnVuY3Rpb24gZigpe3ZhciBuPUpvKCkscj11KG4pO2lmKGM9YXJndW1lbnRzLFxuYT10aGlzLHA9bixyKXtpZihoPT09RilyZXR1cm4gXz1uPXAsaD1qbyhpLHQpLHY/ZShuKTpzO2lmKGcpcmV0dXJuIGg9am8oaSx0KSxlKHApfXJldHVybiBoPT09RiYmKGg9am8oaSx0KSksc312YXIgYyxhLGwscyxoLHAsXz0wLHY9ZmFsc2UsZz1mYWxzZSxkPXRydWU7aWYodHlwZW9mIG4hPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgZWkoXCJFeHBlY3RlZCBhIGZ1bmN0aW9uXCIpO3JldHVybiB0PUl1KHQpfHwwLGJ1KHIpJiYodj0hIXIubGVhZGluZyxsPShnPVwibWF4V2FpdFwiaW4gcik/RGkoSXUoci5tYXhXYWl0KXx8MCx0KTpsLGQ9XCJ0cmFpbGluZ1wiaW4gcj8hIXIudHJhaWxpbmc6ZCksZi5jYW5jZWw9ZnVuY3Rpb24oKXtoIT09RiYmaG8oaCksXz0wLGM9cD1hPWg9Rn0sZi5mbHVzaD1mdW5jdGlvbigpe3JldHVybiBoPT09Rj9zOm8oSm8oKSl9LGZ9ZnVuY3Rpb24gbHUobix0KXtmdW5jdGlvbiByKCl7dmFyIGU9YXJndW1lbnRzLHU9dD90LmFwcGx5KHRoaXMsZSk6ZVswXSxpPXIuY2FjaGU7cmV0dXJuIGkuaGFzKHUpP2kuZ2V0KHUpOihlPW4uYXBwbHkodGhpcyxlKSxcbnIuY2FjaGU9aS5zZXQodSxlKXx8aSxlKX1pZih0eXBlb2YgbiE9XCJmdW5jdGlvblwifHxudWxsIT10JiZ0eXBlb2YgdCE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBlaShcIkV4cGVjdGVkIGEgZnVuY3Rpb25cIik7cmV0dXJuIHIuY2FjaGU9bmV3KGx1LkNhY2hlfHxQbikscn1mdW5jdGlvbiBzdShuKXtpZih0eXBlb2YgbiE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBlaShcIkV4cGVjdGVkIGEgZnVuY3Rpb25cIik7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAwOnJldHVybiFuLmNhbGwodGhpcyk7Y2FzZSAxOnJldHVybiFuLmNhbGwodGhpcyx0WzBdKTtjYXNlIDI6cmV0dXJuIW4uY2FsbCh0aGlzLHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiFuLmNhbGwodGhpcyx0WzBdLHRbMV0sdFsyXSl9cmV0dXJuIW4uYXBwbHkodGhpcyx0KX19ZnVuY3Rpb24gaHUobix0KXtyZXR1cm4gbj09PXR8fG4hPT1uJiZ0IT09dH1mdW5jdGlvbiBwdShuKXtyZXR1cm4gbnVsbCE9biYmeXUobi5sZW5ndGgpJiYhZ3Uobik7XG59ZnVuY3Rpb24gX3Uobil7cmV0dXJuIHh1KG4pJiZwdShuKX1mdW5jdGlvbiB2dShuKXtpZigheHUobikpcmV0dXJuIGZhbHNlO3ZhciB0PXp0KG4pO3JldHVyblwiW29iamVjdCBFcnJvcl1cIj09dHx8XCJbb2JqZWN0IERPTUV4Y2VwdGlvbl1cIj09dHx8dHlwZW9mIG4ubWVzc2FnZT09XCJzdHJpbmdcIiYmdHlwZW9mIG4ubmFtZT09XCJzdHJpbmdcIiYmIXd1KG4pfWZ1bmN0aW9uIGd1KG4pe3JldHVybiEhYnUobikmJihuPXp0KG4pLFwiW29iamVjdCBGdW5jdGlvbl1cIj09bnx8XCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXVwiPT1ufHxcIltvYmplY3QgQXN5bmNGdW5jdGlvbl1cIj09bnx8XCJbb2JqZWN0IFByb3h5XVwiPT1uKX1mdW5jdGlvbiBkdShuKXtyZXR1cm4gdHlwZW9mIG49PVwibnVtYmVyXCImJm49PU91KG4pfWZ1bmN0aW9uIHl1KG4pe3JldHVybiB0eXBlb2Ygbj09XCJudW1iZXJcIiYmLTE8biYmMD09biUxJiY5MDA3MTk5MjU0NzQwOTkxPj1ufWZ1bmN0aW9uIGJ1KG4pe3ZhciB0PXR5cGVvZiBuO3JldHVybiBudWxsIT1uJiYoXCJvYmplY3RcIj09dHx8XCJmdW5jdGlvblwiPT10KTtcbn1mdW5jdGlvbiB4dShuKXtyZXR1cm4gbnVsbCE9biYmdHlwZW9mIG49PVwib2JqZWN0XCJ9ZnVuY3Rpb24ganUobil7cmV0dXJuIHR5cGVvZiBuPT1cIm51bWJlclwifHx4dShuKSYmXCJbb2JqZWN0IE51bWJlcl1cIj09enQobil9ZnVuY3Rpb24gd3Uobil7cmV0dXJuISgheHUobil8fFwiW29iamVjdCBPYmplY3RdXCIhPXp0KG4pKSYmKG49YmkobiksbnVsbD09PW58fChuPWNpLmNhbGwobixcImNvbnN0cnVjdG9yXCIpJiZuLmNvbnN0cnVjdG9yLHR5cGVvZiBuPT1cImZ1bmN0aW9uXCImJm4gaW5zdGFuY2VvZiBuJiZmaS5jYWxsKG4pPT1oaSkpfWZ1bmN0aW9uIG11KG4pe3JldHVybiB0eXBlb2Ygbj09XCJzdHJpbmdcInx8IWFmKG4pJiZ4dShuKSYmXCJbb2JqZWN0IFN0cmluZ11cIj09enQobil9ZnVuY3Rpb24gQXUobil7cmV0dXJuIHR5cGVvZiBuPT1cInN5bWJvbFwifHx4dShuKSYmXCJbb2JqZWN0IFN5bWJvbF1cIj09enQobil9ZnVuY3Rpb24ga3Uobil7aWYoIW4pcmV0dXJuW107aWYocHUobikpcmV0dXJuIG11KG4pPyQobik6TXIobik7XG5pZihBaSYmbltBaV0pe249bltBaV0oKTtmb3IodmFyIHQscj1bXTshKHQ9bi5uZXh0KCkpLmRvbmU7KXIucHVzaCh0LnZhbHVlKTtyZXR1cm4gcn1yZXR1cm4gdD15byhuKSwoXCJbb2JqZWN0IE1hcF1cIj09dD9MOlwiW29iamVjdCBTZXRdXCI9PXQ/RDpEdSkobil9ZnVuY3Rpb24gRXUobil7cmV0dXJuIG4/KG49SXUobiksbj09PU58fG49PT0tTj8xLjc5NzY5MzEzNDg2MjMxNTdlMzA4KigwPm4/LTE6MSk6bj09PW4/bjowKTowPT09bj9uOjB9ZnVuY3Rpb24gT3Uobil7bj1FdShuKTt2YXIgdD1uJTE7cmV0dXJuIG49PT1uP3Q/bi10Om46MH1mdW5jdGlvbiBTdShuKXtyZXR1cm4gbj9ndChPdShuKSwwLDQyOTQ5NjcyOTUpOjB9ZnVuY3Rpb24gSXUobil7aWYodHlwZW9mIG49PVwibnVtYmVyXCIpcmV0dXJuIG47aWYoQXUobikpcmV0dXJuIFA7aWYoYnUobikmJihuPXR5cGVvZiBuLnZhbHVlT2Y9PVwiZnVuY3Rpb25cIj9uLnZhbHVlT2YoKTpuLG49YnUobik/bitcIlwiOm4pLHR5cGVvZiBuIT1cInN0cmluZ1wiKXJldHVybiAwPT09bj9uOituO1xubj1uLnJlcGxhY2UoY24sXCJcIik7dmFyIHQ9Ym4udGVzdChuKTtyZXR1cm4gdHx8am4udGVzdChuKT9GbihuLnNsaWNlKDIpLHQ/Mjo4KTp5bi50ZXN0KG4pP1A6K259ZnVuY3Rpb24gUnUobil7cmV0dXJuIFRyKG4sVXUobikpfWZ1bmN0aW9uIHp1KG4pe3JldHVybiBudWxsPT1uP1wiXCI6anIobil9ZnVuY3Rpb24gV3Uobix0LHIpe3JldHVybiBuPW51bGw9PW4/RjpJdChuLHQpLG49PT1GP3I6bn1mdW5jdGlvbiBCdShuLHQpe3JldHVybiBudWxsIT1uJiZrZShuLHQsTHQpfWZ1bmN0aW9uIEx1KG4pe3JldHVybiBwdShuKT9HbihuKTpIdChuKX1mdW5jdGlvbiBVdShuKXtpZihwdShuKSluPUduKG4sdHJ1ZSk7ZWxzZSBpZihidShuKSl7dmFyIHQscj1MZShuKSxlPVtdO2Zvcih0IGluIG4pKFwiY29uc3RydWN0b3JcIiE9dHx8IXImJmNpLmNhbGwobix0KSkmJmUucHVzaCh0KTtuPWV9ZWxzZXtpZih0PVtdLG51bGwhPW4pZm9yKHIgaW4gbmkobikpdC5wdXNoKHIpO249dH1yZXR1cm4gbn1mdW5jdGlvbiBDdShuLHQpe1xuaWYobnVsbD09bilyZXR1cm57fTt2YXIgcj1sKHllKG4pLGZ1bmN0aW9uKG4pe3JldHVybltuXX0pO3JldHVybiB0PWplKHQpLHVyKG4scixmdW5jdGlvbihuLHIpe3JldHVybiB0KG4sclswXSl9KX1mdW5jdGlvbiBEdShuKXtyZXR1cm4gbnVsbD09bj9bXTpJKG4sTHUobikpfWZ1bmN0aW9uIE11KG4pe3JldHVybiBOZih6dShuKS50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiBUdShuKXtyZXR1cm4obj16dShuKSkmJm4ucmVwbGFjZShtbixydCkucmVwbGFjZShSbixcIlwiKX1mdW5jdGlvbiAkdShuLHQscil7cmV0dXJuIG49enUobiksdD1yP0Y6dCx0PT09Rj9Mbi50ZXN0KG4pP24ubWF0Y2goV24pfHxbXTpuLm1hdGNoKF9uKXx8W106bi5tYXRjaCh0KXx8W119ZnVuY3Rpb24gRnUobil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG59fWZ1bmN0aW9uIE51KG4pe3JldHVybiBufWZ1bmN0aW9uIFB1KG4pe3JldHVybiBHdCh0eXBlb2Ygbj09XCJmdW5jdGlvblwiP246ZHQobiwxKSl9ZnVuY3Rpb24gWnUobix0LHIpe1xudmFyIGU9THUodCksaT1TdCh0LGUpO251bGwhPXJ8fGJ1KHQpJiYoaS5sZW5ndGh8fCFlLmxlbmd0aCl8fChyPXQsdD1uLG49dGhpcyxpPVN0KHQsTHUodCkpKTt2YXIgbz0hKGJ1KHIpJiZcImNoYWluXCJpbiByJiYhci5jaGFpbiksZj1ndShuKTtyZXR1cm4gdShpLGZ1bmN0aW9uKHIpe3ZhciBlPXRbcl07bltyXT1lLGYmJihuLnByb3RvdHlwZVtyXT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX19jaGFpbl9fO2lmKG98fHQpe3ZhciByPW4odGhpcy5fX3dyYXBwZWRfXyk7cmV0dXJuKHIuX19hY3Rpb25zX189TXIodGhpcy5fX2FjdGlvbnNfXykpLnB1c2goe2Z1bmM6ZSxhcmdzOmFyZ3VtZW50cyx0aGlzQXJnOm59KSxyLl9fY2hhaW5fXz10LHJ9cmV0dXJuIGUuYXBwbHkobixzKFt0aGlzLnZhbHVlKCldLGFyZ3VtZW50cykpfSl9KSxufWZ1bmN0aW9uIHF1KCl7fWZ1bmN0aW9uIFZ1KG4pe3JldHVybiBXZShuKT9qKCRlKG4pKTppcihuKX1mdW5jdGlvbiBLdSgpe3JldHVybltdfWZ1bmN0aW9uIEd1KCl7XG5yZXR1cm4gZmFsc2V9RW49bnVsbD09RW4/Wm46aXQuZGVmYXVsdHMoWm4uT2JqZWN0KCksRW4saXQucGljayhabixVbikpO3ZhciBIdT1Fbi5BcnJheSxKdT1Fbi5EYXRlLFl1PUVuLkVycm9yLFF1PUVuLkZ1bmN0aW9uLFh1PUVuLk1hdGgsbmk9RW4uT2JqZWN0LHRpPUVuLlJlZ0V4cCxyaT1Fbi5TdHJpbmcsZWk9RW4uVHlwZUVycm9yLHVpPUh1LnByb3RvdHlwZSxpaT1uaS5wcm90b3R5cGUsb2k9RW5bXCJfX2NvcmUtanNfc2hhcmVkX19cIl0sZmk9UXUucHJvdG90eXBlLnRvU3RyaW5nLGNpPWlpLmhhc093blByb3BlcnR5LGFpPTAsbGk9ZnVuY3Rpb24oKXt2YXIgbj0vW14uXSskLy5leGVjKG9pJiZvaS5rZXlzJiZvaS5rZXlzLklFX1BST1RPfHxcIlwiKTtyZXR1cm4gbj9cIlN5bWJvbChzcmMpXzEuXCIrbjpcIlwifSgpLHNpPWlpLnRvU3RyaW5nLGhpPWZpLmNhbGwobmkpLHBpPVpuLl8sX2k9dGkoXCJeXCIrZmkuY2FsbChjaSkucmVwbGFjZShvbixcIlxcXFwkJlwiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLFwiJDEuKj9cIikrXCIkXCIpLHZpPUtuP0VuLkJ1ZmZlcjpGLGdpPUVuLlN5bWJvbCxkaT1Fbi5VaW50OEFycmF5LHlpPXZpP3ZpLmY6RixiaT1VKG5pLmdldFByb3RvdHlwZU9mLG5pKSx4aT1uaS5jcmVhdGUsamk9aWkucHJvcGVydHlJc0VudW1lcmFibGUsd2k9dWkuc3BsaWNlLG1pPWdpP2dpLmlzQ29uY2F0U3ByZWFkYWJsZTpGLEFpPWdpP2dpLml0ZXJhdG9yOkYsa2k9Z2k/Z2kudG9TdHJpbmdUYWc6RixFaT1mdW5jdGlvbigpe1xudHJ5e3ZhciBuPUFlKG5pLFwiZGVmaW5lUHJvcGVydHlcIik7cmV0dXJuIG4oe30sXCJcIix7fSksbn1jYXRjaChuKXt9fSgpLE9pPUVuLmNsZWFyVGltZW91dCE9PVpuLmNsZWFyVGltZW91dCYmRW4uY2xlYXJUaW1lb3V0LFNpPUp1JiZKdS5ub3chPT1abi5EYXRlLm5vdyYmSnUubm93LElpPUVuLnNldFRpbWVvdXQhPT1abi5zZXRUaW1lb3V0JiZFbi5zZXRUaW1lb3V0LFJpPVh1LmNlaWwsemk9WHUuZmxvb3IsV2k9bmkuZ2V0T3duUHJvcGVydHlTeW1ib2xzLEJpPXZpP3ZpLmlzQnVmZmVyOkYsTGk9RW4uaXNGaW5pdGUsVWk9dWkuam9pbixDaT1VKG5pLmtleXMsbmkpLERpPVh1Lm1heCxNaT1YdS5taW4sVGk9SnUubm93LCRpPUVuLnBhcnNlSW50LEZpPVh1LnJhbmRvbSxOaT11aS5yZXZlcnNlLFBpPUFlKEVuLFwiRGF0YVZpZXdcIiksWmk9QWUoRW4sXCJNYXBcIikscWk9QWUoRW4sXCJQcm9taXNlXCIpLFZpPUFlKEVuLFwiU2V0XCIpLEtpPUFlKEVuLFwiV2Vha01hcFwiKSxHaT1BZShuaSxcImNyZWF0ZVwiKSxIaT1LaSYmbmV3IEtpLEppPXt9LFlpPUZlKFBpKSxRaT1GZShaaSksWGk9RmUocWkpLG5vPUZlKFZpKSx0bz1GZShLaSkscm89Z2k/Z2kucHJvdG90eXBlOkYsZW89cm8/cm8udmFsdWVPZjpGLHVvPXJvP3JvLnRvU3RyaW5nOkYsaW89ZnVuY3Rpb24oKXtcbmZ1bmN0aW9uIG4oKXt9cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBidSh0KT94aT94aSh0KToobi5wcm90b3R5cGU9dCx0PW5ldyBuLG4ucHJvdG90eXBlPUYsdCk6e319fSgpO09uLnRlbXBsYXRlU2V0dGluZ3M9e2VzY2FwZTpRLGV2YWx1YXRlOlgsaW50ZXJwb2xhdGU6bm4sdmFyaWFibGU6XCJcIixpbXBvcnRzOntfOk9ufX0sT24ucHJvdG90eXBlPVNuLnByb3RvdHlwZSxPbi5wcm90b3R5cGUuY29uc3RydWN0b3I9T24sem4ucHJvdG90eXBlPWlvKFNuLnByb3RvdHlwZSksem4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPXpuLE1uLnByb3RvdHlwZT1pbyhTbi5wcm90b3R5cGUpLE1uLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1NbixUbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPUdpP0dpKG51bGwpOnt9LHRoaXMuc2l6ZT0wfSxUbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKG4pe3JldHVybiBuPXRoaXMuaGFzKG4pJiZkZWxldGUgdGhpcy5fX2RhdGFfX1tuXSxcbnRoaXMuc2l6ZS09bj8xOjAsbn0sVG4ucHJvdG90eXBlLmdldD1mdW5jdGlvbihuKXt2YXIgdD10aGlzLl9fZGF0YV9fO3JldHVybiBHaT8obj10W25dLFwiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfX1wiPT09bj9GOm4pOmNpLmNhbGwodCxuKT90W25dOkZ9LFRuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5fX2RhdGFfXztyZXR1cm4gR2k/dFtuXSE9PUY6Y2kuY2FsbCh0LG4pfSxUbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKG4sdCl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyhuKT8wOjEscltuXT1HaSYmdD09PUY/XCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fXCI6dCx0aGlzfSxObi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfSxObi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuX19kYXRhX187cmV0dXJuIG49bHQodCxuKSwhKDA+bikmJihuPT10Lmxlbmd0aC0xP3QucG9wKCk6d2kuY2FsbCh0LG4sMSksXG4tLXRoaXMuc2l6ZSx0cnVlKX0sTm4ucHJvdG90eXBlLmdldD1mdW5jdGlvbihuKXt2YXIgdD10aGlzLl9fZGF0YV9fO3JldHVybiBuPWx0KHQsbiksMD5uP0Y6dFtuXVsxXX0sTm4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihuKXtyZXR1cm4tMTxsdCh0aGlzLl9fZGF0YV9fLG4pfSxObi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKG4sdCl7dmFyIHI9dGhpcy5fX2RhdGFfXyxlPWx0KHIsbik7cmV0dXJuIDA+ZT8oKyt0aGlzLnNpemUsci5wdXNoKFtuLHRdKSk6cltlXVsxXT10LHRoaXN9LFBuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFRuLG1hcDpuZXcoWml8fE5uKSxzdHJpbmc6bmV3IFRufX0sUG4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbj13ZSh0aGlzLG4pLmRlbGV0ZShuKSx0aGlzLnNpemUtPW4/MTowLG59LFBuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24obil7cmV0dXJuIHdlKHRoaXMsbikuZ2V0KG4pO1xufSxQbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKG4pe3JldHVybiB3ZSh0aGlzLG4pLmhhcyhuKX0sUG4ucHJvdG90eXBlLnNldD1mdW5jdGlvbihuLHQpe3ZhciByPXdlKHRoaXMsbiksZT1yLnNpemU7cmV0dXJuIHIuc2V0KG4sdCksdGhpcy5zaXplKz1yLnNpemU9PWU/MDoxLHRoaXN9LHFuLnByb3RvdHlwZS5hZGQ9cW4ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KG4sXCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fXCIpLHRoaXN9LHFuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKG4pfSxWbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBObix0aGlzLnNpemU9MH0sVm4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihuKXt2YXIgdD10aGlzLl9fZGF0YV9fO3JldHVybiBuPXQuZGVsZXRlKG4pLHRoaXMuc2l6ZT10LnNpemUsbn0sVm4ucHJvdG90eXBlLmdldD1mdW5jdGlvbihuKXtcbnJldHVybiB0aGlzLl9fZGF0YV9fLmdldChuKX0sVm4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMobil9LFZuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24obix0KXt2YXIgcj10aGlzLl9fZGF0YV9fO2lmKHIgaW5zdGFuY2VvZiBObil7dmFyIGU9ci5fX2RhdGFfXztpZighWml8fDE5OT5lLmxlbmd0aClyZXR1cm4gZS5wdXNoKFtuLHRdKSx0aGlzLnNpemU9KytyLnNpemUsdGhpcztyPXRoaXMuX19kYXRhX189bmV3IFBuKGUpfXJldHVybiByLnNldChuLHQpLHRoaXMuc2l6ZT1yLnNpemUsdGhpc307dmFyIG9vPVpyKEV0KSxmbz1acihPdCx0cnVlKSxjbz1xcigpLGFvPXFyKHRydWUpLGxvPUhpP2Z1bmN0aW9uKG4sdCl7cmV0dXJuIEhpLnNldChuLHQpLG59Ok51LHNvPUVpP2Z1bmN0aW9uKG4sdCl7cmV0dXJuIEVpKG4sXCJ0b1N0cmluZ1wiLHtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOkZ1KHQpLHdyaXRhYmxlOnRydWV9KX06TnUsaG89T2l8fGZ1bmN0aW9uKG4pe1xucmV0dXJuIFpuLmNsZWFyVGltZW91dChuKX0scG89VmkmJjEvRChuZXcgVmkoWywtMF0pKVsxXT09Tj9mdW5jdGlvbihuKXtyZXR1cm4gbmV3IFZpKG4pfTpxdSxfbz1IaT9mdW5jdGlvbihuKXtyZXR1cm4gSGkuZ2V0KG4pfTpxdSx2bz1XaT9mdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09bj9bXToobj1uaShuKSxmKFdpKG4pLGZ1bmN0aW9uKHQpe3JldHVybiBqaS5jYWxsKG4sdCl9KSl9Okt1LGdvPVdpP2Z1bmN0aW9uKG4pe2Zvcih2YXIgdD1bXTtuOylzKHQsdm8obikpLG49Ymkobik7cmV0dXJuIHR9Okt1LHlvPXp0OyhQaSYmXCJbb2JqZWN0IERhdGFWaWV3XVwiIT15byhuZXcgUGkobmV3IEFycmF5QnVmZmVyKDEpKSl8fFppJiZcIltvYmplY3QgTWFwXVwiIT15byhuZXcgWmkpfHxxaSYmXCJbb2JqZWN0IFByb21pc2VdXCIhPXlvKHFpLnJlc29sdmUoKSl8fFZpJiZcIltvYmplY3QgU2V0XVwiIT15byhuZXcgVmkpfHxLaSYmXCJbb2JqZWN0IFdlYWtNYXBdXCIhPXlvKG5ldyBLaSkpJiYoeW89ZnVuY3Rpb24obil7XG52YXIgdD16dChuKTtpZihuPShuPVwiW29iamVjdCBPYmplY3RdXCI9PXQ/bi5jb25zdHJ1Y3RvcjpGKT9GZShuKTpcIlwiKXN3aXRjaChuKXtjYXNlIFlpOnJldHVyblwiW29iamVjdCBEYXRhVmlld11cIjtjYXNlIFFpOnJldHVyblwiW29iamVjdCBNYXBdXCI7Y2FzZSBYaTpyZXR1cm5cIltvYmplY3QgUHJvbWlzZV1cIjtjYXNlIG5vOnJldHVyblwiW29iamVjdCBTZXRdXCI7Y2FzZSB0bzpyZXR1cm5cIltvYmplY3QgV2Vha01hcF1cIn1yZXR1cm4gdH0pO3ZhciBibz1vaT9ndTpHdSx4bz1NZShsbyksam89SWl8fGZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuLnNldFRpbWVvdXQobix0KX0sd289TWUoc28pLG1vPWZ1bmN0aW9uKG4pe249bHUobixmdW5jdGlvbihuKXtyZXR1cm4gNTAwPT09dC5zaXplJiZ0LmNsZWFyKCksbn0pO3ZhciB0PW4uY2FjaGU7cmV0dXJuIG59KGZ1bmN0aW9uKG4pe3ZhciB0PVtdO3JldHVybiBlbi50ZXN0KG4pJiZ0LnB1c2goXCJcIiksbi5yZXBsYWNlKHVuLGZ1bmN0aW9uKG4scixlLHUpe1xudC5wdXNoKGU/dS5yZXBsYWNlKHZuLFwiJDFcIik6cnx8bil9KSx0fSksQW89bHIoZnVuY3Rpb24obix0KXtyZXR1cm4gX3Uobik/anQobixrdCh0LDEsX3UsdHJ1ZSkpOltdfSksa289bHIoZnVuY3Rpb24obix0KXt2YXIgcj1HZSh0KTtyZXR1cm4gX3UocikmJihyPUYpLF91KG4pP2p0KG4sa3QodCwxLF91LHRydWUpLGplKHIsMikpOltdfSksRW89bHIoZnVuY3Rpb24obix0KXt2YXIgcj1HZSh0KTtyZXR1cm4gX3UocikmJihyPUYpLF91KG4pP2p0KG4sa3QodCwxLF91LHRydWUpLEYscik6W119KSxPbz1scihmdW5jdGlvbihuKXt2YXIgdD1sKG4sU3IpO3JldHVybiB0Lmxlbmd0aCYmdFswXT09PW5bMF0/VXQodCk6W119KSxTbz1scihmdW5jdGlvbihuKXt2YXIgdD1HZShuKSxyPWwobixTcik7cmV0dXJuIHQ9PT1HZShyKT90PUY6ci5wb3AoKSxyLmxlbmd0aCYmclswXT09PW5bMF0/VXQocixqZSh0LDIpKTpbXX0pLElvPWxyKGZ1bmN0aW9uKG4pe3ZhciB0PUdlKG4pLHI9bChuLFNyKTtyZXR1cm4odD10eXBlb2YgdD09XCJmdW5jdGlvblwiP3Q6RikmJnIucG9wKCksXG5yLmxlbmd0aCYmclswXT09PW5bMF0/VXQocixGLHQpOltdfSksUm89bHIoSGUpLHpvPWdlKGZ1bmN0aW9uKG4sdCl7dmFyIHI9bnVsbD09bj8wOm4ubGVuZ3RoLGU9dnQobix0KTtyZXR1cm4gZnIobixsKHQsZnVuY3Rpb24obil7cmV0dXJuIFJlKG4scik/K246bn0pLnNvcnQoVXIpKSxlfSksV289bHIoZnVuY3Rpb24obil7cmV0dXJuIHdyKGt0KG4sMSxfdSx0cnVlKSl9KSxCbz1scihmdW5jdGlvbihuKXt2YXIgdD1HZShuKTtyZXR1cm4gX3UodCkmJih0PUYpLHdyKGt0KG4sMSxfdSx0cnVlKSxqZSh0LDIpKX0pLExvPWxyKGZ1bmN0aW9uKG4pe3ZhciB0PUdlKG4pLHQ9dHlwZW9mIHQ9PVwiZnVuY3Rpb25cIj90OkY7cmV0dXJuIHdyKGt0KG4sMSxfdSx0cnVlKSxGLHQpfSksVW89bHIoZnVuY3Rpb24obix0KXtyZXR1cm4gX3Uobik/anQobix0KTpbXX0pLENvPWxyKGZ1bmN0aW9uKG4pe3JldHVybiBFcihmKG4sX3UpKX0pLERvPWxyKGZ1bmN0aW9uKG4pe3ZhciB0PUdlKG4pO3JldHVybiBfdSh0KSYmKHQ9RiksXG5FcihmKG4sX3UpLGplKHQsMikpfSksTW89bHIoZnVuY3Rpb24obil7dmFyIHQ9R2UobiksdD10eXBlb2YgdD09XCJmdW5jdGlvblwiP3Q6RjtyZXR1cm4gRXIoZihuLF91KSxGLHQpfSksVG89bHIoWWUpLCRvPWxyKGZ1bmN0aW9uKG4pe3ZhciB0PW4ubGVuZ3RoLHQ9MTx0P25bdC0xXTpGLHQ9dHlwZW9mIHQ9PVwiZnVuY3Rpb25cIj8obi5wb3AoKSx0KTpGO3JldHVybiBRZShuLHQpfSksRm89Z2UoZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdnQodCxuKX12YXIgcj1uLmxlbmd0aCxlPXI/blswXTowLHU9dGhpcy5fX3dyYXBwZWRfXztyZXR1cm4hKDE8cnx8dGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpJiZ1IGluc3RhbmNlb2YgTW4mJlJlKGUpPyh1PXUuc2xpY2UoZSwrZSsocj8xOjApKSx1Ll9fYWN0aW9uc19fLnB1c2goe2Z1bmM6bnUsYXJnczpbdF0sdGhpc0FyZzpGfSksbmV3IHpuKHUsdGhpcy5fX2NoYWluX18pLnRocnUoZnVuY3Rpb24obil7cmV0dXJuIHImJiFuLmxlbmd0aCYmbi5wdXNoKEYpLFxubn0pKTp0aGlzLnRocnUodCl9KSxObz1OcihmdW5jdGlvbihuLHQscil7Y2kuY2FsbChuLHIpPysrbltyXTpfdChuLHIsMSl9KSxQbz1ZcihaZSksWm89WXIocWUpLHFvPU5yKGZ1bmN0aW9uKG4sdCxyKXtjaS5jYWxsKG4scik/bltyXS5wdXNoKHQpOl90KG4scixbdF0pfSksVm89bHIoZnVuY3Rpb24obix0LGUpe3ZhciB1PS0xLGk9dHlwZW9mIHQ9PVwiZnVuY3Rpb25cIixvPXB1KG4pP0h1KG4ubGVuZ3RoKTpbXTtyZXR1cm4gb28obixmdW5jdGlvbihuKXtvWysrdV09aT9yKHQsbixlKTpEdChuLHQsZSl9KSxvfSksS289TnIoZnVuY3Rpb24obix0LHIpe190KG4scix0KX0pLEdvPU5yKGZ1bmN0aW9uKG4sdCxyKXtuW3I/MDoxXS5wdXNoKHQpfSxmdW5jdGlvbigpe3JldHVybltbXSxbXV19KSxIbz1scihmdW5jdGlvbihuLHQpe2lmKG51bGw9PW4pcmV0dXJuW107dmFyIHI9dC5sZW5ndGg7cmV0dXJuIDE8ciYmemUobix0WzBdLHRbMV0pP3Q9W106MjxyJiZ6ZSh0WzBdLHRbMV0sdFsyXSkmJih0PVt0WzBdXSksXG5ycihuLGt0KHQsMSksW10pfSksSm89U2l8fGZ1bmN0aW9uKCl7cmV0dXJuIFpuLkRhdGUubm93KCl9LFlvPWxyKGZ1bmN0aW9uKG4sdCxyKXt2YXIgZT0xO2lmKHIubGVuZ3RoKXZhciB1PUMocix4ZShZbykpLGU9MzJ8ZTtyZXR1cm4gbGUobixlLHQscix1KX0pLFFvPWxyKGZ1bmN0aW9uKG4sdCxyKXt2YXIgZT0zO2lmKHIubGVuZ3RoKXZhciB1PUMocix4ZShRbykpLGU9MzJ8ZTtyZXR1cm4gbGUodCxlLG4scix1KX0pLFhvPWxyKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHh0KG4sMSx0KX0pLG5mPWxyKGZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4geHQobixJdSh0KXx8MCxyKX0pO2x1LkNhY2hlPVBuO3ZhciB0Zj1scihmdW5jdGlvbihuLHQpe3Q9MT09dC5sZW5ndGgmJmFmKHRbMF0pP2wodFswXSxTKGplKCkpKTpsKGt0KHQsMSksUyhqZSgpKSk7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIGxyKGZ1bmN0aW9uKHUpe2Zvcih2YXIgaT0tMSxvPU1pKHUubGVuZ3RoLGUpOysraTxvOyl1W2ldPXRbaV0uY2FsbCh0aGlzLHVbaV0pO1xucmV0dXJuIHIobix0aGlzLHUpfSl9KSxyZj1scihmdW5jdGlvbihuLHQpe3JldHVybiBsZShuLDMyLEYsdCxDKHQseGUocmYpKSl9KSxlZj1scihmdW5jdGlvbihuLHQpe3JldHVybiBsZShuLDY0LEYsdCxDKHQseGUoZWYpKSl9KSx1Zj1nZShmdW5jdGlvbihuLHQpe3JldHVybiBsZShuLDI1NixGLEYsRix0KX0pLG9mPW9lKFd0KSxmZj1vZShmdW5jdGlvbihuLHQpe3JldHVybiBuPj10fSksY2Y9TXQoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9NdDpmdW5jdGlvbihuKXtyZXR1cm4geHUobikmJmNpLmNhbGwobixcImNhbGxlZVwiKSYmIWppLmNhbGwobixcImNhbGxlZVwiKX0sYWY9SHUuaXNBcnJheSxsZj1Ibj9TKEhuKTpUdCxzZj1CaXx8R3UsaGY9Sm4/UyhKbik6JHQscGY9WW4/UyhZbik6TnQsX2Y9UW4/UyhRbik6cXQsdmY9WG4/UyhYbik6VnQsZ2Y9bnQ/UyhudCk6S3QsZGY9b2UoSnQpLHlmPW9lKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG48PXR9KSxiZj1QcihmdW5jdGlvbihuLHQpe1xuaWYoTGUodCl8fHB1KHQpKVRyKHQsTHUodCksbik7ZWxzZSBmb3IodmFyIHIgaW4gdCljaS5jYWxsKHQscikmJmF0KG4scix0W3JdKX0pLHhmPVByKGZ1bmN0aW9uKG4sdCl7VHIodCxVdSh0KSxuKX0pLGpmPVByKGZ1bmN0aW9uKG4sdCxyLGUpe1RyKHQsVXUodCksbixlKX0pLHdmPVByKGZ1bmN0aW9uKG4sdCxyLGUpe1RyKHQsTHUodCksbixlKX0pLG1mPWdlKHZ0KSxBZj1scihmdW5jdGlvbihuKXtyZXR1cm4gbi5wdXNoKEYsc2UpLHIoamYsRixuKX0pLGtmPWxyKGZ1bmN0aW9uKG4pe3JldHVybiBuLnB1c2goRixoZSkscihSZixGLG4pfSksRWY9bmUoZnVuY3Rpb24obix0LHIpe25bdF09cn0sRnUoTnUpKSxPZj1uZShmdW5jdGlvbihuLHQscil7Y2kuY2FsbChuLHQpP25bdF0ucHVzaChyKTpuW3RdPVtyXX0samUpLFNmPWxyKER0KSxJZj1QcihmdW5jdGlvbihuLHQscil7bnIobix0LHIpfSksUmY9UHIoZnVuY3Rpb24obix0LHIsZSl7bnIobix0LHIsZSl9KSx6Zj1nZShmdW5jdGlvbihuLHQpe1xudmFyIHI9e307aWYobnVsbD09bilyZXR1cm4gcjt2YXIgZT1mYWxzZTt0PWwodCxmdW5jdGlvbih0KXtyZXR1cm4gdD1Scih0LG4pLGV8fChlPTE8dC5sZW5ndGgpLHR9KSxUcihuLHllKG4pLHIpLGUmJihyPWR0KHIsNyxwZSkpO2Zvcih2YXIgdT10Lmxlbmd0aDt1LS07KW1yKHIsdFt1XSk7cmV0dXJuIHJ9KSxXZj1nZShmdW5jdGlvbihuLHQpe3JldHVybiBudWxsPT1uP3t9OmVyKG4sdCl9KSxCZj1hZShMdSksTGY9YWUoVXUpLFVmPUdyKGZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gdD10LnRvTG93ZXJDYXNlKCksbisocj9NdSh0KTp0KX0pLENmPUdyKGZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbisocj9cIi1cIjpcIlwiKSt0LnRvTG93ZXJDYXNlKCl9KSxEZj1HcihmdW5jdGlvbihuLHQscil7cmV0dXJuIG4rKHI/XCIgXCI6XCJcIikrdC50b0xvd2VyQ2FzZSgpfSksTWY9S3IoXCJ0b0xvd2VyQ2FzZVwiKSxUZj1HcihmdW5jdGlvbihuLHQscil7cmV0dXJuIG4rKHI/XCJfXCI6XCJcIikrdC50b0xvd2VyQ2FzZSgpO1xufSksJGY9R3IoZnVuY3Rpb24obix0LHIpe3JldHVybiBuKyhyP1wiIFwiOlwiXCIpK05mKHQpfSksRmY9R3IoZnVuY3Rpb24obix0LHIpe3JldHVybiBuKyhyP1wiIFwiOlwiXCIpK3QudG9VcHBlckNhc2UoKX0pLE5mPUtyKFwidG9VcHBlckNhc2VcIiksUGY9bHIoZnVuY3Rpb24obix0KXt0cnl7cmV0dXJuIHIobixGLHQpfWNhdGNoKG4pe3JldHVybiB2dShuKT9uOm5ldyBZdShuKX19KSxaZj1nZShmdW5jdGlvbihuLHQpe3JldHVybiB1KHQsZnVuY3Rpb24odCl7dD0kZSh0KSxfdChuLHQsWW8oblt0XSxuKSl9KSxufSkscWY9UXIoKSxWZj1Rcih0cnVlKSxLZj1scihmdW5jdGlvbihuLHQpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gRHQocixuLHQpfX0pLEdmPWxyKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBEdChuLHIsdCl9fSksSGY9cmUobCksSmY9cmUobyksWWY9cmUoXyksUWY9aWUoKSxYZj1pZSh0cnVlKSxuYz10ZShmdW5jdGlvbihuLHQpe3JldHVybiBuK3R9LDApLHRjPWNlKFwiY2VpbFwiKSxyYz10ZShmdW5jdGlvbihuLHQpe1xucmV0dXJuIG4vdH0sMSksZWM9Y2UoXCJmbG9vclwiKSx1Yz10ZShmdW5jdGlvbihuLHQpe3JldHVybiBuKnR9LDEpLGljPWNlKFwicm91bmRcIiksb2M9dGUoZnVuY3Rpb24obix0KXtyZXR1cm4gbi10fSwwKTtyZXR1cm4gT24uYWZ0ZXI9ZnVuY3Rpb24obix0KXtpZih0eXBlb2YgdCE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBlaShcIkV4cGVjdGVkIGEgZnVuY3Rpb25cIik7cmV0dXJuIG49T3UobiksZnVuY3Rpb24oKXtpZigxPi0tbilyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSxPbi5hcnk9aXUsT24uYXNzaWduPWJmLE9uLmFzc2lnbkluPXhmLE9uLmFzc2lnbkluV2l0aD1qZixPbi5hc3NpZ25XaXRoPXdmLE9uLmF0PW1mLE9uLmJlZm9yZT1vdSxPbi5iaW5kPVlvLE9uLmJpbmRBbGw9WmYsT24uYmluZEtleT1RbyxPbi5jYXN0QXJyYXk9ZnVuY3Rpb24oKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bXTt2YXIgbj1hcmd1bWVudHNbMF07cmV0dXJuIGFmKG4pP246W25dfSxcbk9uLmNoYWluPVhlLE9uLmNodW5rPWZ1bmN0aW9uKG4sdCxyKXtpZih0PShyP3plKG4sdCxyKTp0PT09Rik/MTpEaShPdSh0KSwwKSxyPW51bGw9PW4/MDpuLmxlbmd0aCwhcnx8MT50KXJldHVybltdO2Zvcih2YXIgZT0wLHU9MCxpPUh1KFJpKHIvdCkpO2U8cjspaVt1KytdPXZyKG4sZSxlKz10KTtyZXR1cm4gaX0sT24uY29tcGFjdD1mdW5jdGlvbihuKXtmb3IodmFyIHQ9LTEscj1udWxsPT1uPzA6bi5sZW5ndGgsZT0wLHU9W107Kyt0PHI7KXt2YXIgaT1uW3RdO2kmJih1W2UrK109aSl9cmV0dXJuIHV9LE9uLmNvbmNhdD1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg7aWYoIW4pcmV0dXJuW107Zm9yKHZhciB0PUh1KG4tMSkscj1hcmd1bWVudHNbMF07bi0tOyl0W24tMV09YXJndW1lbnRzW25dO3JldHVybiBzKGFmKHIpP01yKHIpOltyXSxrdCh0LDEpKX0sT24uY29uZD1mdW5jdGlvbihuKXt2YXIgdD1udWxsPT1uPzA6bi5sZW5ndGgsZT1qZSgpO3JldHVybiBuPXQ/bChuLGZ1bmN0aW9uKG4pe1xuaWYoXCJmdW5jdGlvblwiIT10eXBlb2YgblsxXSl0aHJvdyBuZXcgZWkoXCJFeHBlY3RlZCBhIGZ1bmN0aW9uXCIpO3JldHVybltlKG5bMF0pLG5bMV1dfSk6W10sbHIoZnVuY3Rpb24oZSl7Zm9yKHZhciB1PS0xOysrdTx0Oyl7dmFyIGk9blt1XTtpZihyKGlbMF0sdGhpcyxlKSlyZXR1cm4gcihpWzFdLHRoaXMsZSl9fSl9LE9uLmNvbmZvcm1zPWZ1bmN0aW9uKG4pe3JldHVybiB5dChkdChuLDEpKX0sT24uY29uc3RhbnQ9RnUsT24uY291bnRCeT1ObyxPbi5jcmVhdGU9ZnVuY3Rpb24obix0KXt2YXIgcj1pbyhuKTtyZXR1cm4gbnVsbD09dD9yOmh0KHIsdCl9LE9uLmN1cnJ5PWZ1LE9uLmN1cnJ5UmlnaHQ9Y3UsT24uZGVib3VuY2U9YXUsT24uZGVmYXVsdHM9QWYsT24uZGVmYXVsdHNEZWVwPWtmLE9uLmRlZmVyPVhvLE9uLmRlbGF5PW5mLE9uLmRpZmZlcmVuY2U9QW8sT24uZGlmZmVyZW5jZUJ5PWtvLE9uLmRpZmZlcmVuY2VXaXRoPUVvLE9uLmRyb3A9ZnVuY3Rpb24obix0LHIpe3ZhciBlPW51bGw9PW4/MDpuLmxlbmd0aDtcbnJldHVybiBlPyh0PXJ8fHQ9PT1GPzE6T3UodCksdnIobiwwPnQ/MDp0LGUpKTpbXX0sT24uZHJvcFJpZ2h0PWZ1bmN0aW9uKG4sdCxyKXt2YXIgZT1udWxsPT1uPzA6bi5sZW5ndGg7cmV0dXJuIGU/KHQ9cnx8dD09PUY/MTpPdSh0KSx0PWUtdCx2cihuLDAsMD50PzA6dCkpOltdfSxPbi5kcm9wUmlnaHRXaGlsZT1mdW5jdGlvbihuLHQpe3JldHVybiBuJiZuLmxlbmd0aD9BcihuLGplKHQsMyksdHJ1ZSx0cnVlKTpbXX0sT24uZHJvcFdoaWxlPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4ubGVuZ3RoP0FyKG4samUodCwzKSx0cnVlKTpbXX0sT24uZmlsbD1mdW5jdGlvbihuLHQscixlKXt2YXIgdT1udWxsPT1uPzA6bi5sZW5ndGg7aWYoIXUpcmV0dXJuW107Zm9yKHImJnR5cGVvZiByIT1cIm51bWJlclwiJiZ6ZShuLHQscikmJihyPTAsZT11KSx1PW4ubGVuZ3RoLHI9T3UociksMD5yJiYocj0tcj51PzA6dStyKSxlPWU9PT1GfHxlPnU/dTpPdShlKSwwPmUmJihlKz11KSxlPXI+ZT8wOlN1KGUpO3I8ZTspbltyKytdPXQ7XG5yZXR1cm4gbn0sT24uZmlsdGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuKGFmKG4pP2Y6QXQpKG4samUodCwzKSl9LE9uLmZsYXRNYXA9ZnVuY3Rpb24obix0KXtyZXR1cm4ga3QodXUobix0KSwxKX0sT24uZmxhdE1hcERlZXA9ZnVuY3Rpb24obix0KXtyZXR1cm4ga3QodXUobix0KSxOKX0sT24uZmxhdE1hcERlcHRoPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gcj1yPT09Rj8xOk91KHIpLGt0KHV1KG4sdCkscil9LE9uLmZsYXR0ZW49VmUsT24uZmxhdHRlbkRlZXA9ZnVuY3Rpb24obil7cmV0dXJuKG51bGw9PW4/MDpuLmxlbmd0aCk/a3QobixOKTpbXX0sT24uZmxhdHRlbkRlcHRoPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG51bGwhPW4mJm4ubGVuZ3RoPyh0PXQ9PT1GPzE6T3UodCksa3Qobix0KSk6W119LE9uLmZsaXA9ZnVuY3Rpb24obil7cmV0dXJuIGxlKG4sNTEyKX0sT24uZmxvdz1xZixPbi5mbG93UmlnaHQ9VmYsT24uZnJvbVBhaXJzPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdD0tMSxyPW51bGw9PW4/MDpuLmxlbmd0aCxlPXt9OysrdDxyOyl7XG52YXIgdT1uW3RdO2VbdVswXV09dVsxXX1yZXR1cm4gZX0sT24uZnVuY3Rpb25zPWZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT1uP1tdOlN0KG4sTHUobikpfSxPbi5mdW5jdGlvbnNJbj1mdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09bj9bXTpTdChuLFV1KG4pKX0sT24uZ3JvdXBCeT1xbyxPbi5pbml0aWFsPWZ1bmN0aW9uKG4pe3JldHVybihudWxsPT1uPzA6bi5sZW5ndGgpP3ZyKG4sMCwtMSk6W119LE9uLmludGVyc2VjdGlvbj1PbyxPbi5pbnRlcnNlY3Rpb25CeT1TbyxPbi5pbnRlcnNlY3Rpb25XaXRoPUlvLE9uLmludmVydD1FZixPbi5pbnZlcnRCeT1PZixPbi5pbnZva2VNYXA9Vm8sT24uaXRlcmF0ZWU9UHUsT24ua2V5Qnk9S28sT24ua2V5cz1MdSxPbi5rZXlzSW49VXUsT24ubWFwPXV1LE9uLm1hcEtleXM9ZnVuY3Rpb24obix0KXt2YXIgcj17fTtyZXR1cm4gdD1qZSh0LDMpLEV0KG4sZnVuY3Rpb24obixlLHUpe190KHIsdChuLGUsdSksbil9KSxyfSxPbi5tYXBWYWx1ZXM9ZnVuY3Rpb24obix0KXtcbnZhciByPXt9O3JldHVybiB0PWplKHQsMyksRXQobixmdW5jdGlvbihuLGUsdSl7X3QocixlLHQobixlLHUpKX0pLHJ9LE9uLm1hdGNoZXM9ZnVuY3Rpb24obil7cmV0dXJuIFF0KGR0KG4sMSkpfSxPbi5tYXRjaGVzUHJvcGVydHk9ZnVuY3Rpb24obix0KXtyZXR1cm4gWHQobixkdCh0LDEpKX0sT24ubWVtb2l6ZT1sdSxPbi5tZXJnZT1JZixPbi5tZXJnZVdpdGg9UmYsT24ubWV0aG9kPUtmLE9uLm1ldGhvZE9mPUdmLE9uLm1peGluPVp1LE9uLm5lZ2F0ZT1zdSxPbi5udGhBcmc9ZnVuY3Rpb24obil7cmV0dXJuIG49T3UobiksbHIoZnVuY3Rpb24odCl7cmV0dXJuIHRyKHQsbil9KX0sT24ub21pdD16ZixPbi5vbWl0Qnk9ZnVuY3Rpb24obix0KXtyZXR1cm4gQ3UobixzdShqZSh0KSkpfSxPbi5vbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBvdSgyLG4pfSxPbi5vcmRlckJ5PWZ1bmN0aW9uKG4sdCxyLGUpe3JldHVybiBudWxsPT1uP1tdOihhZih0KXx8KHQ9bnVsbD09dD9bXTpbdF0pLFxucj1lP0Y6cixhZihyKXx8KHI9bnVsbD09cj9bXTpbcl0pLHJyKG4sdCxyKSl9LE9uLm92ZXI9SGYsT24ub3ZlckFyZ3M9dGYsT24ub3ZlckV2ZXJ5PUpmLE9uLm92ZXJTb21lPVlmLE9uLnBhcnRpYWw9cmYsT24ucGFydGlhbFJpZ2h0PWVmLE9uLnBhcnRpdGlvbj1HbyxPbi5waWNrPVdmLE9uLnBpY2tCeT1DdSxPbi5wcm9wZXJ0eT1WdSxPbi5wcm9wZXJ0eU9mPWZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09bj9GOkl0KG4sdCl9fSxPbi5wdWxsPVJvLE9uLnB1bGxBbGw9SGUsT24ucHVsbEFsbEJ5PWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbiYmbi5sZW5ndGgmJnQmJnQubGVuZ3RoP29yKG4sdCxqZShyLDIpKTpufSxPbi5wdWxsQWxsV2l0aD1mdW5jdGlvbihuLHQscil7cmV0dXJuIG4mJm4ubGVuZ3RoJiZ0JiZ0Lmxlbmd0aD9vcihuLHQsRixyKTpufSxPbi5wdWxsQXQ9em8sT24ucmFuZ2U9UWYsT24ucmFuZ2VSaWdodD1YZixPbi5yZWFyZz11ZixPbi5yZWplY3Q9ZnVuY3Rpb24obix0KXtcbnJldHVybihhZihuKT9mOkF0KShuLHN1KGplKHQsMykpKX0sT24ucmVtb3ZlPWZ1bmN0aW9uKG4sdCl7dmFyIHI9W107aWYoIW58fCFuLmxlbmd0aClyZXR1cm4gcjt2YXIgZT0tMSx1PVtdLGk9bi5sZW5ndGg7Zm9yKHQ9amUodCwzKTsrK2U8aTspe3ZhciBvPW5bZV07dChvLGUsbikmJihyLnB1c2gobyksdS5wdXNoKGUpKX1yZXR1cm4gZnIobix1KSxyfSxPbi5yZXN0PWZ1bmN0aW9uKG4sdCl7aWYodHlwZW9mIG4hPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgZWkoXCJFeHBlY3RlZCBhIGZ1bmN0aW9uXCIpO3JldHVybiB0PXQ9PT1GP3Q6T3UodCksbHIobix0KX0sT24ucmV2ZXJzZT1KZSxPbi5zYW1wbGVTaXplPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gdD0ocj96ZShuLHQscik6dD09PUYpPzE6T3UodCksKGFmKG4pP290OmhyKShuLHQpfSxPbi5zZXQ9ZnVuY3Rpb24obix0LHIpe3JldHVybiBudWxsPT1uP246cHIobix0LHIpfSxPbi5zZXRXaXRoPWZ1bmN0aW9uKG4sdCxyLGUpe3JldHVybiBlPXR5cGVvZiBlPT1cImZ1bmN0aW9uXCI/ZTpGLFxubnVsbD09bj9uOnByKG4sdCxyLGUpfSxPbi5zaHVmZmxlPWZ1bmN0aW9uKG4pe3JldHVybihhZihuKT9mdDpfcikobil9LE9uLnNsaWNlPWZ1bmN0aW9uKG4sdCxyKXt2YXIgZT1udWxsPT1uPzA6bi5sZW5ndGg7cmV0dXJuIGU/KHImJnR5cGVvZiByIT1cIm51bWJlclwiJiZ6ZShuLHQscik/KHQ9MCxyPWUpOih0PW51bGw9PXQ/MDpPdSh0KSxyPXI9PT1GP2U6T3UocikpLHZyKG4sdCxyKSk6W119LE9uLnNvcnRCeT1IbyxPbi5zb3J0ZWRVbmlxPWZ1bmN0aW9uKG4pe3JldHVybiBuJiZuLmxlbmd0aD9icihuKTpbXX0sT24uc29ydGVkVW5pcUJ5PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4ubGVuZ3RoP2JyKG4samUodCwyKSk6W119LE9uLnNwbGl0PWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gciYmdHlwZW9mIHIhPVwibnVtYmVyXCImJnplKG4sdCxyKSYmKHQ9cj1GKSxyPXI9PT1GPzQyOTQ5NjcyOTU6cj4+PjAscj8obj16dShuKSkmJih0eXBlb2YgdD09XCJzdHJpbmdcInx8bnVsbCE9dCYmIV9mKHQpKSYmKHQ9anIodCksXG4hdCYmQm4udGVzdChuKSk/enIoJChuKSwwLHIpOm4uc3BsaXQodCxyKTpbXX0sT24uc3ByZWFkPWZ1bmN0aW9uKG4sdCl7aWYodHlwZW9mIG4hPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgZWkoXCJFeHBlY3RlZCBhIGZ1bmN0aW9uXCIpO3JldHVybiB0PW51bGw9PXQ/MDpEaShPdSh0KSwwKSxscihmdW5jdGlvbihlKXt2YXIgdT1lW3RdO3JldHVybiBlPXpyKGUsMCx0KSx1JiZzKGUsdSkscihuLHRoaXMsZSl9KX0sT24udGFpbD1mdW5jdGlvbihuKXt2YXIgdD1udWxsPT1uPzA6bi5sZW5ndGg7cmV0dXJuIHQ/dnIobiwxLHQpOltdfSxPbi50YWtlPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbiYmbi5sZW5ndGg/KHQ9cnx8dD09PUY/MTpPdSh0KSx2cihuLDAsMD50PzA6dCkpOltdfSxPbi50YWtlUmlnaHQ9ZnVuY3Rpb24obix0LHIpe3ZhciBlPW51bGw9PW4/MDpuLmxlbmd0aDtyZXR1cm4gZT8odD1yfHx0PT09Rj8xOk91KHQpLHQ9ZS10LHZyKG4sMD50PzA6dCxlKSk6W119LE9uLnRha2VSaWdodFdoaWxlPWZ1bmN0aW9uKG4sdCl7XG5yZXR1cm4gbiYmbi5sZW5ndGg/QXIobixqZSh0LDMpLGZhbHNlLHRydWUpOltdfSxPbi50YWtlV2hpbGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi5sZW5ndGg/QXIobixqZSh0LDMpKTpbXX0sT24udGFwPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQobiksbn0sT24udGhyb3R0bGU9ZnVuY3Rpb24obix0LHIpe3ZhciBlPXRydWUsdT10cnVlO2lmKHR5cGVvZiBuIT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IGVpKFwiRXhwZWN0ZWQgYSBmdW5jdGlvblwiKTtyZXR1cm4gYnUocikmJihlPVwibGVhZGluZ1wiaW4gcj8hIXIubGVhZGluZzplLHU9XCJ0cmFpbGluZ1wiaW4gcj8hIXIudHJhaWxpbmc6dSksYXUobix0LHtsZWFkaW5nOmUsbWF4V2FpdDp0LHRyYWlsaW5nOnV9KX0sT24udGhydT1udSxPbi50b0FycmF5PWt1LE9uLnRvUGFpcnM9QmYsT24udG9QYWlyc0luPUxmLE9uLnRvUGF0aD1mdW5jdGlvbihuKXtyZXR1cm4gYWYobik/bChuLCRlKTpBdShuKT9bbl06TXIobW8oenUobikpKX0sT24udG9QbGFpbk9iamVjdD1SdSxcbk9uLnRyYW5zZm9ybT1mdW5jdGlvbihuLHQscil7dmFyIGU9YWYobiksaT1lfHxzZihuKXx8Z2Yobik7aWYodD1qZSh0LDQpLG51bGw9PXIpe3ZhciBvPW4mJm4uY29uc3RydWN0b3I7cj1pP2U/bmV3IG86W106YnUobikmJmd1KG8pP2lvKGJpKG4pKTp7fX1yZXR1cm4oaT91OkV0KShuLGZ1bmN0aW9uKG4sZSx1KXtyZXR1cm4gdChyLG4sZSx1KX0pLHJ9LE9uLnVuYXJ5PWZ1bmN0aW9uKG4pe3JldHVybiBpdShuLDEpfSxPbi51bmlvbj1XbyxPbi51bmlvbkJ5PUJvLE9uLnVuaW9uV2l0aD1MbyxPbi51bmlxPWZ1bmN0aW9uKG4pe3JldHVybiBuJiZuLmxlbmd0aD93cihuKTpbXX0sT24udW5pcUJ5PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4ubGVuZ3RoP3dyKG4samUodCwyKSk6W119LE9uLnVuaXFXaXRoPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQ9dHlwZW9mIHQ9PVwiZnVuY3Rpb25cIj90OkYsbiYmbi5sZW5ndGg/d3IobixGLHQpOltdfSxPbi51bnNldD1mdW5jdGlvbihuLHQpe3JldHVybiBudWxsPT1ufHxtcihuLHQpO1xufSxPbi51bnppcD1ZZSxPbi51bnppcFdpdGg9UWUsT24udXBkYXRlPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbnVsbD09bj9uOnByKG4sdCxJcihyKShJdChuLHQpKSx2b2lkIDApfSxPbi51cGRhdGVXaXRoPWZ1bmN0aW9uKG4sdCxyLGUpe3JldHVybiBlPXR5cGVvZiBlPT1cImZ1bmN0aW9uXCI/ZTpGLG51bGwhPW4mJihuPXByKG4sdCxJcihyKShJdChuLHQpKSxlKSksbn0sT24udmFsdWVzPUR1LE9uLnZhbHVlc0luPWZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT1uP1tdOkkobixVdShuKSl9LE9uLndpdGhvdXQ9VW8sT24ud29yZHM9JHUsT24ud3JhcD1mdW5jdGlvbihuLHQpe3JldHVybiByZihJcih0KSxuKX0sT24ueG9yPUNvLE9uLnhvckJ5PURvLE9uLnhvcldpdGg9TW8sT24uemlwPVRvLE9uLnppcE9iamVjdD1mdW5jdGlvbihuLHQpe3JldHVybiBPcihufHxbXSx0fHxbXSxhdCl9LE9uLnppcE9iamVjdERlZXA9ZnVuY3Rpb24obix0KXtyZXR1cm4gT3Iobnx8W10sdHx8W10scHIpO1xufSxPbi56aXBXaXRoPSRvLE9uLmVudHJpZXM9QmYsT24uZW50cmllc0luPUxmLE9uLmV4dGVuZD14ZixPbi5leHRlbmRXaXRoPWpmLFp1KE9uLE9uKSxPbi5hZGQ9bmMsT24uYXR0ZW1wdD1QZixPbi5jYW1lbENhc2U9VWYsT24uY2FwaXRhbGl6ZT1NdSxPbi5jZWlsPXRjLE9uLmNsYW1wPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gcj09PUYmJihyPXQsdD1GKSxyIT09RiYmKHI9SXUocikscj1yPT09cj9yOjApLHQhPT1GJiYodD1JdSh0KSx0PXQ9PT10P3Q6MCksZ3QoSXUobiksdCxyKX0sT24uY2xvbmU9ZnVuY3Rpb24obil7cmV0dXJuIGR0KG4sNCl9LE9uLmNsb25lRGVlcD1mdW5jdGlvbihuKXtyZXR1cm4gZHQobiw1KX0sT24uY2xvbmVEZWVwV2l0aD1mdW5jdGlvbihuLHQpe3JldHVybiB0PXR5cGVvZiB0PT1cImZ1bmN0aW9uXCI/dDpGLGR0KG4sNSx0KX0sT24uY2xvbmVXaXRoPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQ9dHlwZW9mIHQ9PVwiZnVuY3Rpb25cIj90OkYsZHQobiw0LHQpfSxcbk9uLmNvbmZvcm1zVG89ZnVuY3Rpb24obix0KXtyZXR1cm4gbnVsbD09dHx8YnQobix0LEx1KHQpKX0sT24uZGVidXJyPVR1LE9uLmRlZmF1bHRUbz1mdW5jdGlvbihuLHQpe3JldHVybiBudWxsPT1ufHxuIT09bj90Om59LE9uLmRpdmlkZT1yYyxPbi5lbmRzV2l0aD1mdW5jdGlvbihuLHQscil7bj16dShuKSx0PWpyKHQpO3ZhciBlPW4ubGVuZ3RoLGU9cj1yPT09Rj9lOmd0KE91KHIpLDAsZSk7cmV0dXJuIHItPXQubGVuZ3RoLDA8PXImJm4uc2xpY2UocixlKT09dH0sT24uZXE9aHUsT24uZXNjYXBlPWZ1bmN0aW9uKG4pe3JldHVybihuPXp1KG4pKSYmWS50ZXN0KG4pP24ucmVwbGFjZShILGV0KTpufSxPbi5lc2NhcGVSZWdFeHA9ZnVuY3Rpb24obil7cmV0dXJuKG49enUobikpJiZmbi50ZXN0KG4pP24ucmVwbGFjZShvbixcIlxcXFwkJlwiKTpufSxPbi5ldmVyeT1mdW5jdGlvbihuLHQscil7dmFyIGU9YWYobik/bzp3dDtyZXR1cm4gciYmemUobix0LHIpJiYodD1GKSxlKG4samUodCwzKSk7XG59LE9uLmZpbmQ9UG8sT24uZmluZEluZGV4PVplLE9uLmZpbmRLZXk9ZnVuY3Rpb24obix0KXtyZXR1cm4gdihuLGplKHQsMyksRXQpfSxPbi5maW5kTGFzdD1abyxPbi5maW5kTGFzdEluZGV4PXFlLE9uLmZpbmRMYXN0S2V5PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHYobixqZSh0LDMpLE90KX0sT24uZmxvb3I9ZWMsT24uZm9yRWFjaD1ydSxPbi5mb3JFYWNoUmlnaHQ9ZXUsT24uZm9ySW49ZnVuY3Rpb24obix0KXtyZXR1cm4gbnVsbD09bj9uOmNvKG4samUodCwzKSxVdSl9LE9uLmZvckluUmlnaHQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gbnVsbD09bj9uOmFvKG4samUodCwzKSxVdSl9LE9uLmZvck93bj1mdW5jdGlvbihuLHQpe3JldHVybiBuJiZFdChuLGplKHQsMykpfSxPbi5mb3JPd25SaWdodD1mdW5jdGlvbihuLHQpe3JldHVybiBuJiZPdChuLGplKHQsMykpfSxPbi5nZXQ9V3UsT24uZ3Q9b2YsT24uZ3RlPWZmLE9uLmhhcz1mdW5jdGlvbihuLHQpe3JldHVybiBudWxsIT1uJiZrZShuLHQsQnQpO1xufSxPbi5oYXNJbj1CdSxPbi5oZWFkPUtlLE9uLmlkZW50aXR5PU51LE9uLmluY2x1ZGVzPWZ1bmN0aW9uKG4sdCxyLGUpe3JldHVybiBuPXB1KG4pP246RHUobikscj1yJiYhZT9PdShyKTowLGU9bi5sZW5ndGgsMD5yJiYocj1EaShlK3IsMCkpLG11KG4pP3I8PWUmJi0xPG4uaW5kZXhPZih0LHIpOiEhZSYmLTE8ZChuLHQscil9LE9uLmluZGV4T2Y9ZnVuY3Rpb24obix0LHIpe3ZhciBlPW51bGw9PW4/MDpuLmxlbmd0aDtyZXR1cm4gZT8ocj1udWxsPT1yPzA6T3UociksMD5yJiYocj1EaShlK3IsMCkpLGQobix0LHIpKTotMX0sT24uaW5SYW5nZT1mdW5jdGlvbihuLHQscil7cmV0dXJuIHQ9RXUodCkscj09PUY/KHI9dCx0PTApOnI9RXUociksbj1JdShuKSxuPj1NaSh0LHIpJiZuPERpKHQscil9LE9uLmludm9rZT1TZixPbi5pc0FyZ3VtZW50cz1jZixPbi5pc0FycmF5PWFmLE9uLmlzQXJyYXlCdWZmZXI9bGYsT24uaXNBcnJheUxpa2U9cHUsT24uaXNBcnJheUxpa2VPYmplY3Q9X3UsXG5Pbi5pc0Jvb2xlYW49ZnVuY3Rpb24obil7cmV0dXJuIHRydWU9PT1ufHxmYWxzZT09PW58fHh1KG4pJiZcIltvYmplY3QgQm9vbGVhbl1cIj09enQobil9LE9uLmlzQnVmZmVyPXNmLE9uLmlzRGF0ZT1oZixPbi5pc0VsZW1lbnQ9ZnVuY3Rpb24obil7cmV0dXJuIHh1KG4pJiYxPT09bi5ub2RlVHlwZSYmIXd1KG4pfSxPbi5pc0VtcHR5PWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRydWU7aWYocHUobikmJihhZihuKXx8dHlwZW9mIG49PVwic3RyaW5nXCJ8fHR5cGVvZiBuLnNwbGljZT09XCJmdW5jdGlvblwifHxzZihuKXx8Z2Yobil8fGNmKG4pKSlyZXR1cm4hbi5sZW5ndGg7dmFyIHQ9eW8obik7aWYoXCJbb2JqZWN0IE1hcF1cIj09dHx8XCJbb2JqZWN0IFNldF1cIj09dClyZXR1cm4hbi5zaXplO2lmKExlKG4pKXJldHVybiFIdChuKS5sZW5ndGg7Zm9yKHZhciByIGluIG4paWYoY2kuY2FsbChuLHIpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX0sT24uaXNFcXVhbD1mdW5jdGlvbihuLHQpe3JldHVybiBGdChuLHQpO1xufSxPbi5pc0VxdWFsV2l0aD1mdW5jdGlvbihuLHQscil7dmFyIGU9KHI9dHlwZW9mIHI9PVwiZnVuY3Rpb25cIj9yOkYpP3Iobix0KTpGO3JldHVybiBlPT09Rj9GdChuLHQsRixyKTohIWV9LE9uLmlzRXJyb3I9dnUsT24uaXNGaW5pdGU9ZnVuY3Rpb24obil7cmV0dXJuIHR5cGVvZiBuPT1cIm51bWJlclwiJiZMaShuKX0sT24uaXNGdW5jdGlvbj1ndSxPbi5pc0ludGVnZXI9ZHUsT24uaXNMZW5ndGg9eXUsT24uaXNNYXA9cGYsT24uaXNNYXRjaD1mdW5jdGlvbihuLHQpe3JldHVybiBuPT09dHx8UHQobix0LG1lKHQpKX0sT24uaXNNYXRjaFdpdGg9ZnVuY3Rpb24obix0LHIpe3JldHVybiByPXR5cGVvZiByPT1cImZ1bmN0aW9uXCI/cjpGLFB0KG4sdCxtZSh0KSxyKX0sT24uaXNOYU49ZnVuY3Rpb24obil7cmV0dXJuIGp1KG4pJiZuIT0rbn0sT24uaXNOYXRpdmU9ZnVuY3Rpb24obil7aWYoYm8obikpdGhyb3cgbmV3IFl1KFwiVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuXCIpO1xucmV0dXJuIFp0KG4pfSxPbi5pc05pbD1mdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09bn0sT24uaXNOdWxsPWZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT09bn0sT24uaXNOdW1iZXI9anUsT24uaXNPYmplY3Q9YnUsT24uaXNPYmplY3RMaWtlPXh1LE9uLmlzUGxhaW5PYmplY3Q9d3UsT24uaXNSZWdFeHA9X2YsT24uaXNTYWZlSW50ZWdlcj1mdW5jdGlvbihuKXtyZXR1cm4gZHUobikmJi05MDA3MTk5MjU0NzQwOTkxPD1uJiY5MDA3MTk5MjU0NzQwOTkxPj1ufSxPbi5pc1NldD12ZixPbi5pc1N0cmluZz1tdSxPbi5pc1N5bWJvbD1BdSxPbi5pc1R5cGVkQXJyYXk9Z2YsT24uaXNVbmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIG49PT1GfSxPbi5pc1dlYWtNYXA9ZnVuY3Rpb24obil7cmV0dXJuIHh1KG4pJiZcIltvYmplY3QgV2Vha01hcF1cIj09eW8obil9LE9uLmlzV2Vha1NldD1mdW5jdGlvbihuKXtyZXR1cm4geHUobikmJlwiW29iamVjdCBXZWFrU2V0XVwiPT16dChuKX0sT24uam9pbj1mdW5jdGlvbihuLHQpe1xucmV0dXJuIG51bGw9PW4/XCJcIjpVaS5jYWxsKG4sdCl9LE9uLmtlYmFiQ2FzZT1DZixPbi5sYXN0PUdlLE9uLmxhc3RJbmRleE9mPWZ1bmN0aW9uKG4sdCxyKXt2YXIgZT1udWxsPT1uPzA6bi5sZW5ndGg7aWYoIWUpcmV0dXJuLTE7dmFyIHU9ZTtpZihyIT09RiYmKHU9T3UociksdT0wPnU/RGkoZSt1LDApOk1pKHUsZS0xKSksdD09PXQpe2ZvcihyPXUrMTtyLS0mJm5bcl0hPT10Oyk7bj1yfWVsc2Ugbj1nKG4sYix1LHRydWUpO3JldHVybiBufSxPbi5sb3dlckNhc2U9RGYsT24ubG93ZXJGaXJzdD1NZixPbi5sdD1kZixPbi5sdGU9eWYsT24ubWF4PWZ1bmN0aW9uKG4pe3JldHVybiBuJiZuLmxlbmd0aD9tdChuLE51LFd0KTpGfSxPbi5tYXhCeT1mdW5jdGlvbihuLHQpe3JldHVybiBuJiZuLmxlbmd0aD9tdChuLGplKHQsMiksV3QpOkZ9LE9uLm1lYW49ZnVuY3Rpb24obil7cmV0dXJuIHgobixOdSl9LE9uLm1lYW5CeT1mdW5jdGlvbihuLHQpe3JldHVybiB4KG4samUodCwyKSl9LE9uLm1pbj1mdW5jdGlvbihuKXtcbnJldHVybiBuJiZuLmxlbmd0aD9tdChuLE51LEp0KTpGfSxPbi5taW5CeT1mdW5jdGlvbihuLHQpe3JldHVybiBuJiZuLmxlbmd0aD9tdChuLGplKHQsMiksSnQpOkZ9LE9uLnN0dWJBcnJheT1LdSxPbi5zdHViRmFsc2U9R3UsT24uc3R1Yk9iamVjdD1mdW5jdGlvbigpe3JldHVybnt9fSxPbi5zdHViU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJcIn0sT24uc3R1YlRydWU9ZnVuY3Rpb24oKXtyZXR1cm4gdHJ1ZX0sT24ubXVsdGlwbHk9dWMsT24ubnRoPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4ubGVuZ3RoP3RyKG4sT3UodCkpOkZ9LE9uLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gWm4uXz09PXRoaXMmJihabi5fPXBpKSx0aGlzfSxPbi5ub29wPXF1LE9uLm5vdz1KbyxPbi5wYWQ9ZnVuY3Rpb24obix0LHIpe249enUobik7dmFyIGU9KHQ9T3UodCkpP1Qobik6MDtyZXR1cm4hdHx8ZT49dD9uOih0PSh0LWUpLzIsZWUoemkodCkscikrbitlZShSaSh0KSxyKSl9LE9uLnBhZEVuZD1mdW5jdGlvbihuLHQscil7XG5uPXp1KG4pO3ZhciBlPSh0PU91KHQpKT9UKG4pOjA7cmV0dXJuIHQmJmU8dD9uK2VlKHQtZSxyKTpufSxPbi5wYWRTdGFydD1mdW5jdGlvbihuLHQscil7bj16dShuKTt2YXIgZT0odD1PdSh0KSk/VChuKTowO3JldHVybiB0JiZlPHQ/ZWUodC1lLHIpK246bn0sT24ucGFyc2VJbnQ9ZnVuY3Rpb24obix0LHIpe3JldHVybiByfHxudWxsPT10P3Q9MDp0JiYodD0rdCksJGkoenUobikucmVwbGFjZShhbixcIlwiKSx0fHwwKX0sT24ucmFuZG9tPWZ1bmN0aW9uKG4sdCxyKXtpZihyJiZ0eXBlb2YgciE9XCJib29sZWFuXCImJnplKG4sdCxyKSYmKHQ9cj1GKSxyPT09RiYmKHR5cGVvZiB0PT1cImJvb2xlYW5cIj8ocj10LHQ9Rik6dHlwZW9mIG49PVwiYm9vbGVhblwiJiYocj1uLG49RikpLG49PT1GJiZ0PT09Rj8obj0wLHQ9MSk6KG49RXUobiksdD09PUY/KHQ9bixuPTApOnQ9RXUodCkpLG4+dCl7dmFyIGU9bjtuPXQsdD1lfXJldHVybiByfHxuJTF8fHQlMT8ocj1GaSgpLE1pKG4rcioodC1uKyRuKFwiMWUtXCIrKChyK1wiXCIpLmxlbmd0aC0xKSkpLHQpKTpjcihuLHQpO1xufSxPbi5yZWR1Y2U9ZnVuY3Rpb24obix0LHIpe3ZhciBlPWFmKG4pP2g6bSx1PTM+YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gZShuLGplKHQsNCkscix1LG9vKX0sT24ucmVkdWNlUmlnaHQ9ZnVuY3Rpb24obix0LHIpe3ZhciBlPWFmKG4pP3A6bSx1PTM+YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gZShuLGplKHQsNCkscix1LGZvKX0sT24ucmVwZWF0PWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gdD0ocj96ZShuLHQscik6dD09PUYpPzE6T3UodCksYXIoenUobiksdCl9LE9uLnJlcGxhY2U9ZnVuY3Rpb24oKXt2YXIgbj1hcmd1bWVudHMsdD16dShuWzBdKTtyZXR1cm4gMz5uLmxlbmd0aD90OnQucmVwbGFjZShuWzFdLG5bMl0pfSxPbi5yZXN1bHQ9ZnVuY3Rpb24obix0LHIpe3Q9UnIodCxuKTt2YXIgZT0tMSx1PXQubGVuZ3RoO2Zvcih1fHwodT0xLG49Rik7KytlPHU7KXt2YXIgaT1udWxsPT1uP0Y6blskZSh0W2VdKV07aT09PUYmJihlPXUsaT1yKSxuPWd1KGkpP2kuY2FsbChuKTppO1xufXJldHVybiBufSxPbi5yb3VuZD1pYyxPbi5ydW5JbkNvbnRleHQ9dyxPbi5zYW1wbGU9ZnVuY3Rpb24obil7cmV0dXJuKGFmKG4pP3R0OnNyKShuKX0sT24uc2l6ZT1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiAwO2lmKHB1KG4pKXJldHVybiBtdShuKT9UKG4pOm4ubGVuZ3RoO3ZhciB0PXlvKG4pO3JldHVyblwiW29iamVjdCBNYXBdXCI9PXR8fFwiW29iamVjdCBTZXRdXCI9PXQ/bi5zaXplOkh0KG4pLmxlbmd0aH0sT24uc25ha2VDYXNlPVRmLE9uLnNvbWU9ZnVuY3Rpb24obix0LHIpe3ZhciBlPWFmKG4pP186Z3I7cmV0dXJuIHImJnplKG4sdCxyKSYmKHQ9RiksZShuLGplKHQsMykpfSxPbi5zb3J0ZWRJbmRleD1mdW5jdGlvbihuLHQpe3JldHVybiBkcihuLHQpfSxPbi5zb3J0ZWRJbmRleEJ5PWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4geXIobix0LGplKHIsMikpfSxPbi5zb3J0ZWRJbmRleE9mPWZ1bmN0aW9uKG4sdCl7dmFyIHI9bnVsbD09bj8wOm4ubGVuZ3RoO2lmKHIpe1xudmFyIGU9ZHIobix0KTtpZihlPHImJmh1KG5bZV0sdCkpcmV0dXJuIGV9cmV0dXJuLTF9LE9uLnNvcnRlZExhc3RJbmRleD1mdW5jdGlvbihuLHQpe3JldHVybiBkcihuLHQsdHJ1ZSl9LE9uLnNvcnRlZExhc3RJbmRleEJ5PWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4geXIobix0LGplKHIsMiksdHJ1ZSl9LE9uLnNvcnRlZExhc3RJbmRleE9mPWZ1bmN0aW9uKG4sdCl7aWYobnVsbD09bj8wOm4ubGVuZ3RoKXt2YXIgcj1kcihuLHQsdHJ1ZSktMTtpZihodShuW3JdLHQpKXJldHVybiByfXJldHVybi0xfSxPbi5zdGFydENhc2U9JGYsT24uc3RhcnRzV2l0aD1mdW5jdGlvbihuLHQscil7cmV0dXJuIG49enUobikscj1udWxsPT1yPzA6Z3QoT3UociksMCxuLmxlbmd0aCksdD1qcih0KSxuLnNsaWNlKHIscit0Lmxlbmd0aCk9PXR9LE9uLnN1YnRyYWN0PW9jLE9uLnN1bT1mdW5jdGlvbihuKXtyZXR1cm4gbiYmbi5sZW5ndGg/ayhuLE51KTowfSxPbi5zdW1CeT1mdW5jdGlvbihuLHQpe3JldHVybiBuJiZuLmxlbmd0aD9rKG4samUodCwyKSk6MDtcbn0sT24udGVtcGxhdGU9ZnVuY3Rpb24obix0LHIpe3ZhciBlPU9uLnRlbXBsYXRlU2V0dGluZ3M7ciYmemUobix0LHIpJiYodD1GKSxuPXp1KG4pLHQ9amYoe30sdCxlLHNlKSxyPWpmKHt9LHQuaW1wb3J0cyxlLmltcG9ydHMsc2UpO3ZhciB1LGksbz1MdShyKSxmPUkocixvKSxjPTA7cj10LmludGVycG9sYXRlfHxBbjt2YXIgYT1cIl9fcCs9J1wiO3I9dGkoKHQuZXNjYXBlfHxBbikuc291cmNlK1wifFwiK3Iuc291cmNlK1wifFwiKyhyPT09bm4/Z246QW4pLnNvdXJjZStcInxcIisodC5ldmFsdWF0ZXx8QW4pLnNvdXJjZStcInwkXCIsXCJnXCIpO3ZhciBsPVwic291cmNlVVJMXCJpbiB0P1wiLy8jIHNvdXJjZVVSTD1cIit0LnNvdXJjZVVSTCtcIlxcblwiOlwiXCI7aWYobi5yZXBsYWNlKHIsZnVuY3Rpb24odCxyLGUsbyxmLGwpe3JldHVybiBlfHwoZT1vKSxhKz1uLnNsaWNlKGMsbCkucmVwbGFjZShrbixCKSxyJiYodT10cnVlLGErPVwiJytfX2UoXCIrcitcIikrJ1wiKSxmJiYoaT10cnVlLGErPVwiJztcIitmK1wiO1xcbl9fcCs9J1wiKSxcbmUmJihhKz1cIicrKChfX3Q9KFwiK2UrXCIpKT09bnVsbD8nJzpfX3QpKydcIiksYz1sK3QubGVuZ3RoLHR9KSxhKz1cIic7XCIsKHQ9dC52YXJpYWJsZSl8fChhPVwid2l0aChvYmope1wiK2ErXCJ9XCIpLGE9KGk/YS5yZXBsYWNlKHEsXCJcIik6YSkucmVwbGFjZShWLFwiJDFcIikucmVwbGFjZShLLFwiJDE7XCIpLGE9XCJmdW5jdGlvbihcIisodHx8XCJvYmpcIikrXCIpe1wiKyh0P1wiXCI6XCJvYmp8fChvYmo9e30pO1wiKStcInZhciBfX3QsX19wPScnXCIrKHU/XCIsX19lPV8uZXNjYXBlXCI6XCJcIikrKGk/XCIsX19qPUFycmF5LnByb3RvdHlwZS5qb2luO2Z1bmN0aW9uIHByaW50KCl7X19wKz1fX2ouY2FsbChhcmd1bWVudHMsJycpfVwiOlwiO1wiKSthK1wicmV0dXJuIF9fcH1cIix0PVBmKGZ1bmN0aW9uKCl7cmV0dXJuIFF1KG8sbCtcInJldHVybiBcIithKS5hcHBseShGLGYpfSksdC5zb3VyY2U9YSx2dSh0KSl0aHJvdyB0O3JldHVybiB0fSxPbi50aW1lcz1mdW5jdGlvbihuLHQpe2lmKG49T3UobiksMT5ufHw5MDA3MTk5MjU0NzQwOTkxPG4pcmV0dXJuW107XG52YXIgcj00Mjk0OTY3Mjk1LGU9TWkobiw0Mjk0OTY3Mjk1KTtmb3IodD1qZSh0KSxuLT00Mjk0OTY3Mjk1LGU9RShlLHQpOysrcjxuOyl0KHIpO3JldHVybiBlfSxPbi50b0Zpbml0ZT1FdSxPbi50b0ludGVnZXI9T3UsT24udG9MZW5ndGg9U3UsT24udG9Mb3dlcj1mdW5jdGlvbihuKXtyZXR1cm4genUobikudG9Mb3dlckNhc2UoKX0sT24udG9OdW1iZXI9SXUsT24udG9TYWZlSW50ZWdlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj9ndChPdShuKSwtOTAwNzE5OTI1NDc0MDk5MSw5MDA3MTk5MjU0NzQwOTkxKTowPT09bj9uOjB9LE9uLnRvU3RyaW5nPXp1LE9uLnRvVXBwZXI9ZnVuY3Rpb24obil7cmV0dXJuIHp1KG4pLnRvVXBwZXJDYXNlKCl9LE9uLnRyaW09ZnVuY3Rpb24obix0LHIpe3JldHVybihuPXp1KG4pKSYmKHJ8fHQ9PT1GKT9uLnJlcGxhY2UoY24sXCJcIik6biYmKHQ9anIodCkpPyhuPSQobikscj0kKHQpLHQ9eihuLHIpLHI9VyhuLHIpKzEsenIobix0LHIpLmpvaW4oXCJcIikpOm47XG59LE9uLnRyaW1FbmQ9ZnVuY3Rpb24obix0LHIpe3JldHVybihuPXp1KG4pKSYmKHJ8fHQ9PT1GKT9uLnJlcGxhY2UobG4sXCJcIik6biYmKHQ9anIodCkpPyhuPSQobiksdD1XKG4sJCh0KSkrMSx6cihuLDAsdCkuam9pbihcIlwiKSk6bn0sT24udHJpbVN0YXJ0PWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4obj16dShuKSkmJihyfHx0PT09Rik/bi5yZXBsYWNlKGFuLFwiXCIpOm4mJih0PWpyKHQpKT8obj0kKG4pLHQ9eihuLCQodCkpLHpyKG4sdCkuam9pbihcIlwiKSk6bn0sT24udHJ1bmNhdGU9ZnVuY3Rpb24obix0KXt2YXIgcj0zMCxlPVwiLi4uXCI7aWYoYnUodCkpdmFyIHU9XCJzZXBhcmF0b3JcImluIHQ/dC5zZXBhcmF0b3I6dSxyPVwibGVuZ3RoXCJpbiB0P091KHQubGVuZ3RoKTpyLGU9XCJvbWlzc2lvblwiaW4gdD9qcih0Lm9taXNzaW9uKTplO249enUobik7dmFyIGk9bi5sZW5ndGg7aWYoQm4udGVzdChuKSl2YXIgbz0kKG4pLGk9by5sZW5ndGg7aWYocj49aSlyZXR1cm4gbjtpZihpPXItVChlKSwxPmkpcmV0dXJuIGU7XG5pZihyPW8/enIobywwLGkpLmpvaW4oXCJcIik6bi5zbGljZSgwLGkpLHU9PT1GKXJldHVybiByK2U7aWYobyYmKGkrPXIubGVuZ3RoLWkpLF9mKHUpKXtpZihuLnNsaWNlKGkpLnNlYXJjaCh1KSl7dmFyIGY9cjtmb3IodS5nbG9iYWx8fCh1PXRpKHUuc291cmNlLHp1KGRuLmV4ZWModSkpK1wiZ1wiKSksdS5sYXN0SW5kZXg9MDtvPXUuZXhlYyhmKTspdmFyIGM9by5pbmRleDtyPXIuc2xpY2UoMCxjPT09Rj9pOmMpfX1lbHNlIG4uaW5kZXhPZihqcih1KSxpKSE9aSYmKHU9ci5sYXN0SW5kZXhPZih1KSwtMTx1JiYocj1yLnNsaWNlKDAsdSkpKTtyZXR1cm4gcitlfSxPbi51bmVzY2FwZT1mdW5jdGlvbihuKXtyZXR1cm4obj16dShuKSkmJkoudGVzdChuKT9uLnJlcGxhY2UoRyx1dCk6bn0sT24udW5pcXVlSWQ9ZnVuY3Rpb24obil7dmFyIHQ9KythaTtyZXR1cm4genUobikrdH0sT24udXBwZXJDYXNlPUZmLE9uLnVwcGVyRmlyc3Q9TmYsT24uZWFjaD1ydSxPbi5lYWNoUmlnaHQ9ZXUsT24uZmlyc3Q9S2UsXG5adShPbixmdW5jdGlvbigpe3ZhciBuPXt9O3JldHVybiBFdChPbixmdW5jdGlvbih0LHIpe2NpLmNhbGwoT24ucHJvdG90eXBlLHIpfHwobltyXT10KX0pLG59KCkse2NoYWluOmZhbHNlfSksT24uVkVSU0lPTj1cIjQuMTcuNFwiLHUoXCJiaW5kIGJpbmRLZXkgY3VycnkgY3VycnlSaWdodCBwYXJ0aWFsIHBhcnRpYWxSaWdodFwiLnNwbGl0KFwiIFwiKSxmdW5jdGlvbihuKXtPbltuXS5wbGFjZWhvbGRlcj1Pbn0pLHUoW1wiZHJvcFwiLFwidGFrZVwiXSxmdW5jdGlvbihuLHQpe01uLnByb3RvdHlwZVtuXT1mdW5jdGlvbihyKXtyPXI9PT1GPzE6RGkoT3UociksMCk7dmFyIGU9dGhpcy5fX2ZpbHRlcmVkX18mJiF0P25ldyBNbih0aGlzKTp0aGlzLmNsb25lKCk7cmV0dXJuIGUuX19maWx0ZXJlZF9fP2UuX190YWtlQ291bnRfXz1NaShyLGUuX190YWtlQ291bnRfXyk6ZS5fX3ZpZXdzX18ucHVzaCh7c2l6ZTpNaShyLDQyOTQ5NjcyOTUpLHR5cGU6bisoMD5lLl9fZGlyX18/XCJSaWdodFwiOlwiXCIpfSksZX0sTW4ucHJvdG90eXBlW24rXCJSaWdodFwiXT1mdW5jdGlvbih0KXtcbnJldHVybiB0aGlzLnJldmVyc2UoKVtuXSh0KS5yZXZlcnNlKCl9fSksdShbXCJmaWx0ZXJcIixcIm1hcFwiLFwidGFrZVdoaWxlXCJdLGZ1bmN0aW9uKG4sdCl7dmFyIHI9dCsxLGU9MT09cnx8Mz09cjtNbi5wcm90b3R5cGVbbl09ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5jbG9uZSgpO3JldHVybiB0Ll9faXRlcmF0ZWVzX18ucHVzaCh7aXRlcmF0ZWU6amUobiwzKSx0eXBlOnJ9KSx0Ll9fZmlsdGVyZWRfXz10Ll9fZmlsdGVyZWRfX3x8ZSx0fX0pLHUoW1wiaGVhZFwiLFwibGFzdFwiXSxmdW5jdGlvbihuLHQpe3ZhciByPVwidGFrZVwiKyh0P1wiUmlnaHRcIjpcIlwiKTtNbi5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tyXSgxKS52YWx1ZSgpWzBdfX0pLHUoW1wiaW5pdGlhbFwiLFwidGFpbFwiXSxmdW5jdGlvbihuLHQpe3ZhciByPVwiZHJvcFwiKyh0P1wiXCI6XCJSaWdodFwiKTtNbi5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IE1uKHRoaXMpOnRoaXNbcl0oMSk7XG59fSksTW4ucHJvdG90eXBlLmNvbXBhY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXIoTnUpfSxNbi5wcm90b3R5cGUuZmluZD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5maWx0ZXIobikuaGVhZCgpfSxNbi5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQobil9LE1uLnByb3RvdHlwZS5pbnZva2VNYXA9bHIoZnVuY3Rpb24obix0KXtyZXR1cm4gdHlwZW9mIG49PVwiZnVuY3Rpb25cIj9uZXcgTW4odGhpcyk6dGhpcy5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIER0KHIsbix0KX0pfSksTW4ucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5maWx0ZXIoc3UoamUobikpKX0sTW4ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKG4sdCl7bj1PdShuKTt2YXIgcj10aGlzO3JldHVybiByLl9fZmlsdGVyZWRfXyYmKDA8bnx8MD50KT9uZXcgTW4ocik6KDA+bj9yPXIudGFrZVJpZ2h0KC1uKTpuJiYocj1yLmRyb3AobikpLFxudCE9PUYmJih0PU91KHQpLHI9MD50P3IuZHJvcFJpZ2h0KC10KTpyLnRha2UodC1uKSkscil9LE1uLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKG4pLnJldmVyc2UoKX0sTW4ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWtlKDQyOTQ5NjcyOTUpfSxFdChNbi5wcm90b3R5cGUsZnVuY3Rpb24obix0KXt2YXIgcj0vXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdCh0KSxlPS9eKD86aGVhZHxsYXN0KSQvLnRlc3QodCksdT1PbltlP1widGFrZVwiKyhcImxhc3RcIj09dD9cIlJpZ2h0XCI6XCJcIik6dF0saT1lfHwvXmZpbmQvLnRlc3QodCk7dSYmKE9uLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobil7cmV0dXJuIG49dS5hcHBseShPbixzKFtuXSxmKSksZSYmaD9uWzBdOm59dmFyIG89dGhpcy5fX3dyYXBwZWRfXyxmPWU/WzFdOmFyZ3VtZW50cyxjPW8gaW5zdGFuY2VvZiBNbixhPWZbMF0sbD1jfHxhZihvKTtcbmwmJnImJnR5cGVvZiBhPT1cImZ1bmN0aW9uXCImJjEhPWEubGVuZ3RoJiYoYz1sPWZhbHNlKTt2YXIgaD10aGlzLl9fY2hhaW5fXyxwPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsYT1pJiYhaCxjPWMmJiFwO3JldHVybiFpJiZsPyhvPWM/bzpuZXcgTW4odGhpcyksbz1uLmFwcGx5KG8sZiksby5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOm51LGFyZ3M6W3RdLHRoaXNBcmc6Rn0pLG5ldyB6bihvLGgpKTphJiZjP24uYXBwbHkodGhpcyxmKToobz10aGlzLnRocnUodCksYT9lP28udmFsdWUoKVswXTpvLnZhbHVlKCk6byl9KX0pLHUoXCJwb3AgcHVzaCBzaGlmdCBzb3J0IHNwbGljZSB1bnNoaWZ0XCIuc3BsaXQoXCIgXCIpLGZ1bmN0aW9uKG4pe3ZhciB0PXVpW25dLHI9L14oPzpwdXNofHNvcnR8dW5zaGlmdCkkLy50ZXN0KG4pP1widGFwXCI6XCJ0aHJ1XCIsZT0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KG4pO09uLnByb3RvdHlwZVtuXT1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cztpZihlJiYhdGhpcy5fX2NoYWluX18pe1xudmFyIHU9dGhpcy52YWx1ZSgpO3JldHVybiB0LmFwcGx5KGFmKHUpP3U6W10sbil9cmV0dXJuIHRoaXNbcl0oZnVuY3Rpb24ocil7cmV0dXJuIHQuYXBwbHkoYWYocik/cjpbXSxuKX0pfX0pLEV0KE1uLnByb3RvdHlwZSxmdW5jdGlvbihuLHQpe3ZhciByPU9uW3RdO2lmKHIpe3ZhciBlPXIubmFtZStcIlwiOyhKaVtlXXx8KEppW2VdPVtdKSkucHVzaCh7bmFtZTp0LGZ1bmM6cn0pfX0pLEppW1hyKEYsMikubmFtZV09W3tuYW1lOlwid3JhcHBlclwiLGZ1bmM6Rn1dLE1uLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBuPW5ldyBNbih0aGlzLl9fd3JhcHBlZF9fKTtyZXR1cm4gbi5fX2FjdGlvbnNfXz1Ncih0aGlzLl9fYWN0aW9uc19fKSxuLl9fZGlyX189dGhpcy5fX2Rpcl9fLG4uX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fLG4uX19pdGVyYXRlZXNfXz1Ncih0aGlzLl9faXRlcmF0ZWVzX18pLG4uX190YWtlQ291bnRfXz10aGlzLl9fdGFrZUNvdW50X18sbi5fX3ZpZXdzX189TXIodGhpcy5fX3ZpZXdzX18pLFxubn0sTW4ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIG49bmV3IE1uKHRoaXMpO24uX19kaXJfXz0tMSxuLl9fZmlsdGVyZWRfXz10cnVlfWVsc2Ugbj10aGlzLmNsb25lKCksbi5fX2Rpcl9fKj0tMTtyZXR1cm4gbn0sTW4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7dmFyIG4sdD10aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCkscj10aGlzLl9fZGlyX18sZT1hZih0KSx1PTA+cixpPWU/dC5sZW5ndGg6MDtuPWk7Zm9yKHZhciBvPXRoaXMuX192aWV3c19fLGY9MCxjPS0xLGE9by5sZW5ndGg7KytjPGE7KXt2YXIgbD1vW2NdLHM9bC5zaXplO3N3aXRjaChsLnR5cGUpe2Nhc2VcImRyb3BcIjpmKz1zO2JyZWFrO2Nhc2VcImRyb3BSaWdodFwiOm4tPXM7YnJlYWs7Y2FzZVwidGFrZVwiOm49TWkobixmK3MpO2JyZWFrO2Nhc2VcInRha2VSaWdodFwiOmY9RGkoZixuLXMpfX1pZihuPXtzdGFydDpmLGVuZDpufSxvPW4uc3RhcnQsZj1uLmVuZCxuPWYtbyxcbm89dT9mOm8tMSxmPXRoaXMuX19pdGVyYXRlZXNfXyxjPWYubGVuZ3RoLGE9MCxsPU1pKG4sdGhpcy5fX3Rha2VDb3VudF9fKSwhZXx8IXUmJmk9PW4mJmw9PW4pcmV0dXJuIGtyKHQsdGhpcy5fX2FjdGlvbnNfXyk7ZT1bXTtuOmZvcig7bi0tJiZhPGw7KXtmb3Iobys9cix1PS0xLGk9dFtvXTsrK3U8Yzspe3ZhciBoPWZbdV0scz1oLnR5cGUsaD0oMCxoLml0ZXJhdGVlKShpKTtpZigyPT1zKWk9aDtlbHNlIGlmKCFoKXtpZigxPT1zKWNvbnRpbnVlIG47YnJlYWsgbn19ZVthKytdPWl9cmV0dXJuIGV9LE9uLnByb3RvdHlwZS5hdD1GbyxPbi5wcm90b3R5cGUuY2hhaW49ZnVuY3Rpb24oKXtyZXR1cm4gWGUodGhpcyl9LE9uLnByb3RvdHlwZS5jb21taXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHpuKHRoaXMudmFsdWUoKSx0aGlzLl9fY2hhaW5fXyl9LE9uLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dGhpcy5fX3ZhbHVlc19fPT09RiYmKHRoaXMuX192YWx1ZXNfXz1rdSh0aGlzLnZhbHVlKCkpKTtcbnZhciBuPXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoO3JldHVybntkb25lOm4sdmFsdWU6bj9GOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXX19LE9uLnByb3RvdHlwZS5wbGFudD1mdW5jdGlvbihuKXtmb3IodmFyIHQscj10aGlzO3IgaW5zdGFuY2VvZiBTbjspe3ZhciBlPVBlKHIpO2UuX19pbmRleF9fPTAsZS5fX3ZhbHVlc19fPUYsdD91Ll9fd3JhcHBlZF9fPWU6dD1lO3ZhciB1PWUscj1yLl9fd3JhcHBlZF9ffXJldHVybiB1Ll9fd3JhcHBlZF9fPW4sdH0sT24ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9fd3JhcHBlZF9fO3JldHVybiBuIGluc3RhbmNlb2YgTW4/KHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoJiYobj1uZXcgTW4odGhpcykpLG49bi5yZXZlcnNlKCksbi5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOm51LGFyZ3M6W0plXSx0aGlzQXJnOkZ9KSxuZXcgem4obix0aGlzLl9fY2hhaW5fXykpOnRoaXMudGhydShKZSk7XG59LE9uLnByb3RvdHlwZS50b0pTT049T24ucHJvdG90eXBlLnZhbHVlT2Y9T24ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGtyKHRoaXMuX193cmFwcGVkX18sdGhpcy5fX2FjdGlvbnNfXyl9LE9uLnByb3RvdHlwZS5maXJzdD1Pbi5wcm90b3R5cGUuaGVhZCxBaSYmKE9uLnByb3RvdHlwZVtBaV09dHUpLE9ufSgpO3R5cGVvZiBkZWZpbmU9PVwiZnVuY3Rpb25cIiYmdHlwZW9mIGRlZmluZS5hbWQ9PVwib2JqZWN0XCImJmRlZmluZS5hbWQ/KFpuLl89aXQsIGRlZmluZShmdW5jdGlvbigpe3JldHVybiBpdH0pKTpWbj8oKFZuLmV4cG9ydHM9aXQpLl89aXQscW4uXz1pdCk6Wm4uXz1pdH0pLmNhbGwodGhpcyk7IiwiKGZ1bmN0aW9uICgpIHtcblxuXHRpZiAodHlwZW9mIHNlbGYgPT09ICd1bmRlZmluZWQnIHx8ICFzZWxmLlByaXNtIHx8ICFzZWxmLmRvY3VtZW50IHx8ICFQcmlzbS5sYW5ndWFnZXMubWFya3VwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0UHJpc20ucGx1Z2lucy5VbmVzY2FwZWRNYXJrdXAgPSB0cnVlO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLWhpZ2hsaWdodGFsbCcsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRlbnYuc2VsZWN0b3IgKz0gXCIsIC5sYW5nLW1hcmt1cCBzY3JpcHRbdHlwZT0ndGV4dC9wbGFpbiddLCAubGFuZ3VhZ2UtbWFya3VwIHNjcmlwdFt0eXBlPSd0ZXh0L3BsYWluJ11cIiArXG5cdFx0ICAgICAgICAgICAgICAgIFwiLCBzY3JpcHRbdHlwZT0ndGV4dC9wbGFpbiddLmxhbmctbWFya3VwLCBzY3JpcHRbdHlwZT0ndGV4dC9wbGFpbiddLmxhbmd1YWdlLW1hcmt1cFwiO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS1zYW5pdHktY2hlY2snLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKGVudi5sYW5ndWFnZSAhPSBcIm1hcmt1cFwiKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGVudi5lbGVtZW50Lm1hdGNoZXMoXCJzY3JpcHRbdHlwZT0ndGV4dC9wbGFpbiddXCIpKSB7XG5cdFx0XHR2YXIgY29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIpO1xuXHRcdFx0dmFyIHByZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG5cblx0XHRcdHByZS5jbGFzc05hbWUgPSBjb2RlLmNsYXNzTmFtZSA9IGVudi5lbGVtZW50LmNsYXNzTmFtZTtcblxuXHRcdFx0ZW52LmNvZGUgPSBlbnYuY29kZS5yZXBsYWNlKC8mbHQ7XFwvc2NyaXB0KD58Jmd0OykvZ2ksIFwiPC9zY3JpXCIgKyBcInB0PlwiKTtcblx0XHRcdGNvZGUudGV4dENvbnRlbnQgPSBlbnYuY29kZTtcblxuXHRcdFx0cHJlLmFwcGVuZENoaWxkKGNvZGUpO1xuXHRcdFx0ZW52LmVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocHJlLCBlbnYuZWxlbWVudCk7XG5cdFx0XHRlbnYuZWxlbWVudCA9IGNvZGU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIHByZSA9IGVudi5lbGVtZW50LnBhcmVudE5vZGU7XG5cdFx0aWYgKCFlbnYuY29kZSAmJiBwcmUgJiYgcHJlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ3ByZScgJiZcblx0XHRcdFx0ZW52LmVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggJiYgZW52LmVsZW1lbnQuY2hpbGROb2Rlc1swXS5ub2RlTmFtZSA9PSBcIiNjb21tZW50XCIpIHtcblx0XHRcdGVudi5lbGVtZW50LnRleHRDb250ZW50ID0gZW52LmNvZGUgPSBlbnYuZWxlbWVudC5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50O1xuXHRcdH1cblx0fSk7XG59KCkpO1xuIiwiXG4vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIEJlZ2luIHByaXNtLWNvcmUuanNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxudmFyIF9zZWxmID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKVxuXHQ/IHdpbmRvdyAgIC8vIGlmIGluIGJyb3dzZXJcblx0OiAoXG5cdFx0KHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlKVxuXHRcdD8gc2VsZiAvLyBpZiBpbiB3b3JrZXJcblx0XHQ6IHt9ICAgLy8gaWYgaW4gbm9kZSBqc1xuXHQpO1xuXG4vKipcbiAqIFByaXNtOiBMaWdodHdlaWdodCwgcm9idXN0LCBlbGVnYW50IHN5bnRheCBoaWdobGlnaHRpbmdcbiAqIE1JVCBsaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwL1xuICogQGF1dGhvciBMZWEgVmVyb3UgaHR0cDovL2xlYS52ZXJvdS5tZVxuICovXG5cbnZhciBQcmlzbSA9IChmdW5jdGlvbigpe1xuXG4vLyBQcml2YXRlIGhlbHBlciB2YXJzXG52YXIgbGFuZyA9IC9cXGJsYW5nKD86dWFnZSk/LShcXHcrKVxcYi9pO1xudmFyIHVuaXF1ZUlkID0gMDtcblxudmFyIF8gPSBfc2VsZi5QcmlzbSA9IHtcblx0dXRpbDoge1xuXHRcdGVuY29kZTogZnVuY3Rpb24gKHRva2Vucykge1xuXHRcdFx0aWYgKHRva2VucyBpbnN0YW5jZW9mIFRva2VuKSB7XG5cdFx0XHRcdHJldHVybiBuZXcgVG9rZW4odG9rZW5zLnR5cGUsIF8udXRpbC5lbmNvZGUodG9rZW5zLmNvbnRlbnQpLCB0b2tlbnMuYWxpYXMpO1xuXHRcdFx0fSBlbHNlIGlmIChfLnV0aWwudHlwZSh0b2tlbnMpID09PSAnQXJyYXknKSB7XG5cdFx0XHRcdHJldHVybiB0b2tlbnMubWFwKF8udXRpbC5lbmNvZGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRva2Vucy5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC9cXHUwMGEwL2csICcgJyk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHR5cGU6IGZ1bmN0aW9uIChvKSB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLm1hdGNoKC9cXFtvYmplY3QgKFxcdyspXFxdLylbMV07XG5cdFx0fSxcblxuXHRcdG9iaklkOiBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHRpZiAoIW9ialsnX19pZCddKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosICdfX2lkJywgeyB2YWx1ZTogKyt1bmlxdWVJZCB9KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvYmpbJ19faWQnXTtcblx0XHR9LFxuXG5cdFx0Ly8gRGVlcCBjbG9uZSBhIGxhbmd1YWdlIGRlZmluaXRpb24gKGUuZy4gdG8gZXh0ZW5kIGl0KVxuXHRcdGNsb25lOiBmdW5jdGlvbiAobykge1xuXHRcdFx0dmFyIHR5cGUgPSBfLnV0aWwudHlwZShvKTtcblxuXHRcdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0XHRcdGNhc2UgJ09iamVjdCc6XG5cdFx0XHRcdFx0dmFyIGNsb25lID0ge307XG5cblx0XHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gbykge1xuXHRcdFx0XHRcdFx0aWYgKG8uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHRcdFx0XHRjbG9uZVtrZXldID0gXy51dGlsLmNsb25lKG9ba2V5XSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGNsb25lO1xuXG5cdFx0XHRcdGNhc2UgJ0FycmF5Jzpcblx0XHRcdFx0XHQvLyBDaGVjayBmb3IgZXhpc3RlbmNlIGZvciBJRThcblx0XHRcdFx0XHRyZXR1cm4gby5tYXAgJiYgby5tYXAoZnVuY3Rpb24odikgeyByZXR1cm4gXy51dGlsLmNsb25lKHYpOyB9KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG87XG5cdFx0fVxuXHR9LFxuXG5cdGxhbmd1YWdlczoge1xuXHRcdGV4dGVuZDogZnVuY3Rpb24gKGlkLCByZWRlZikge1xuXHRcdFx0dmFyIGxhbmcgPSBfLnV0aWwuY2xvbmUoXy5sYW5ndWFnZXNbaWRdKTtcblxuXHRcdFx0Zm9yICh2YXIga2V5IGluIHJlZGVmKSB7XG5cdFx0XHRcdGxhbmdba2V5XSA9IHJlZGVmW2tleV07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBsYW5nO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBJbnNlcnQgYSB0b2tlbiBiZWZvcmUgYW5vdGhlciB0b2tlbiBpbiBhIGxhbmd1YWdlIGxpdGVyYWxcblx0XHQgKiBBcyB0aGlzIG5lZWRzIHRvIHJlY3JlYXRlIHRoZSBvYmplY3QgKHdlIGNhbm5vdCBhY3R1YWxseSBpbnNlcnQgYmVmb3JlIGtleXMgaW4gb2JqZWN0IGxpdGVyYWxzKSxcblx0XHQgKiB3ZSBjYW5ub3QganVzdCBwcm92aWRlIGFuIG9iamVjdCwgd2UgbmVlZCBhbm9iamVjdCBhbmQgYSBrZXkuXG5cdFx0ICogQHBhcmFtIGluc2lkZSBUaGUga2V5IChvciBsYW5ndWFnZSBpZCkgb2YgdGhlIHBhcmVudFxuXHRcdCAqIEBwYXJhbSBiZWZvcmUgVGhlIGtleSB0byBpbnNlcnQgYmVmb3JlLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiBhcHBlbmRzIGluc3RlYWQuXG5cdFx0ICogQHBhcmFtIGluc2VydCBPYmplY3Qgd2l0aCB0aGUga2V5L3ZhbHVlIHBhaXJzIHRvIGluc2VydFxuXHRcdCAqIEBwYXJhbSByb290IFRoZSBvYmplY3QgdGhhdCBjb250YWlucyBgaW5zaWRlYC4gSWYgZXF1YWwgdG8gUHJpc20ubGFuZ3VhZ2VzLCBpdCBjYW4gYmUgb21pdHRlZC5cblx0XHQgKi9cblx0XHRpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uIChpbnNpZGUsIGJlZm9yZSwgaW5zZXJ0LCByb290KSB7XG5cdFx0XHRyb290ID0gcm9vdCB8fCBfLmxhbmd1YWdlcztcblx0XHRcdHZhciBncmFtbWFyID0gcm9vdFtpbnNpZGVdO1xuXG5cdFx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7XG5cdFx0XHRcdGluc2VydCA9IGFyZ3VtZW50c1sxXTtcblxuXHRcdFx0XHRmb3IgKHZhciBuZXdUb2tlbiBpbiBpbnNlcnQpIHtcblx0XHRcdFx0XHRpZiAoaW5zZXJ0Lmhhc093blByb3BlcnR5KG5ld1Rva2VuKSkge1xuXHRcdFx0XHRcdFx0Z3JhbW1hcltuZXdUb2tlbl0gPSBpbnNlcnRbbmV3VG9rZW5dO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBncmFtbWFyO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcmV0ID0ge307XG5cblx0XHRcdGZvciAodmFyIHRva2VuIGluIGdyYW1tYXIpIHtcblxuXHRcdFx0XHRpZiAoZ3JhbW1hci5oYXNPd25Qcm9wZXJ0eSh0b2tlbikpIHtcblxuXHRcdFx0XHRcdGlmICh0b2tlbiA9PSBiZWZvcmUpIHtcblxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgbmV3VG9rZW4gaW4gaW5zZXJ0KSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGluc2VydC5oYXNPd25Qcm9wZXJ0eShuZXdUb2tlbikpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXRbbmV3VG9rZW5dID0gaW5zZXJ0W25ld1Rva2VuXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldFt0b2tlbl0gPSBncmFtbWFyW3Rva2VuXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgcmVmZXJlbmNlcyBpbiBvdGhlciBsYW5ndWFnZSBkZWZpbml0aW9uc1xuXHRcdFx0Xy5sYW5ndWFnZXMuREZTKF8ubGFuZ3VhZ2VzLCBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gcm9vdFtpbnNpZGVdICYmIGtleSAhPSBpbnNpZGUpIHtcblx0XHRcdFx0XHR0aGlzW2tleV0gPSByZXQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gcm9vdFtpbnNpZGVdID0gcmV0O1xuXHRcdH0sXG5cblx0XHQvLyBUcmF2ZXJzZSBhIGxhbmd1YWdlIGRlZmluaXRpb24gd2l0aCBEZXB0aCBGaXJzdCBTZWFyY2hcblx0XHRERlM6IGZ1bmN0aW9uKG8sIGNhbGxiYWNrLCB0eXBlLCB2aXNpdGVkKSB7XG5cdFx0XHR2aXNpdGVkID0gdmlzaXRlZCB8fCB7fTtcblx0XHRcdGZvciAodmFyIGkgaW4gbykge1xuXHRcdFx0XHRpZiAoby5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdFx0XHRcdGNhbGxiYWNrLmNhbGwobywgaSwgb1tpXSwgdHlwZSB8fCBpKTtcblxuXHRcdFx0XHRcdGlmIChfLnV0aWwudHlwZShvW2ldKSA9PT0gJ09iamVjdCcgJiYgIXZpc2l0ZWRbXy51dGlsLm9iaklkKG9baV0pXSkge1xuXHRcdFx0XHRcdFx0dmlzaXRlZFtfLnV0aWwub2JqSWQob1tpXSldID0gdHJ1ZTtcblx0XHRcdFx0XHRcdF8ubGFuZ3VhZ2VzLkRGUyhvW2ldLCBjYWxsYmFjaywgbnVsbCwgdmlzaXRlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKF8udXRpbC50eXBlKG9baV0pID09PSAnQXJyYXknICYmICF2aXNpdGVkW18udXRpbC5vYmpJZChvW2ldKV0pIHtcblx0XHRcdFx0XHRcdHZpc2l0ZWRbXy51dGlsLm9iaklkKG9baV0pXSA9IHRydWU7XG5cdFx0XHRcdFx0XHRfLmxhbmd1YWdlcy5ERlMob1tpXSwgY2FsbGJhY2ssIGksIHZpc2l0ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0cGx1Z2luczoge30sXG5cblx0aGlnaGxpZ2h0QWxsOiBmdW5jdGlvbihhc3luYywgY2FsbGJhY2spIHtcblx0XHR2YXIgZW52ID0ge1xuXHRcdFx0Y2FsbGJhY2s6IGNhbGxiYWNrLFxuXHRcdFx0c2VsZWN0b3I6ICdjb2RlW2NsYXNzKj1cImxhbmd1YWdlLVwiXSwgW2NsYXNzKj1cImxhbmd1YWdlLVwiXSBjb2RlLCBjb2RlW2NsYXNzKj1cImxhbmctXCJdLCBbY2xhc3MqPVwibGFuZy1cIl0gY29kZSdcblx0XHR9O1xuXG5cdFx0Xy5ob29rcy5ydW4oXCJiZWZvcmUtaGlnaGxpZ2h0YWxsXCIsIGVudik7XG5cblx0XHR2YXIgZWxlbWVudHMgPSBlbnYuZWxlbWVudHMgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlbnYuc2VsZWN0b3IpO1xuXG5cdFx0Zm9yICh2YXIgaT0wLCBlbGVtZW50OyBlbGVtZW50ID0gZWxlbWVudHNbaSsrXTspIHtcblx0XHRcdF8uaGlnaGxpZ2h0RWxlbWVudChlbGVtZW50LCBhc3luYyA9PT0gdHJ1ZSwgZW52LmNhbGxiYWNrKTtcblx0XHR9XG5cdH0sXG5cblx0aGlnaGxpZ2h0RWxlbWVudDogZnVuY3Rpb24oZWxlbWVudCwgYXN5bmMsIGNhbGxiYWNrKSB7XG5cdFx0Ly8gRmluZCBsYW5ndWFnZVxuXHRcdHZhciBsYW5ndWFnZSwgZ3JhbW1hciwgcGFyZW50ID0gZWxlbWVudDtcblxuXHRcdHdoaWxlIChwYXJlbnQgJiYgIWxhbmcudGVzdChwYXJlbnQuY2xhc3NOYW1lKSkge1xuXHRcdFx0cGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG5cdFx0fVxuXG5cdFx0aWYgKHBhcmVudCkge1xuXHRcdFx0bGFuZ3VhZ2UgPSAocGFyZW50LmNsYXNzTmFtZS5tYXRjaChsYW5nKSB8fCBbLCcnXSlbMV0udG9Mb3dlckNhc2UoKTtcblx0XHRcdGdyYW1tYXIgPSBfLmxhbmd1YWdlc1tsYW5ndWFnZV07XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IGxhbmd1YWdlIG9uIHRoZSBlbGVtZW50LCBpZiBub3QgcHJlc2VudFxuXHRcdGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZShsYW5nLCAnJykucmVwbGFjZSgvXFxzKy9nLCAnICcpICsgJyBsYW5ndWFnZS0nICsgbGFuZ3VhZ2U7XG5cblx0XHQvLyBTZXQgbGFuZ3VhZ2Ugb24gdGhlIHBhcmVudCwgZm9yIHN0eWxpbmdcblx0XHRwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG5cblx0XHRpZiAoL3ByZS9pLnRlc3QocGFyZW50Lm5vZGVOYW1lKSkge1xuXHRcdFx0cGFyZW50LmNsYXNzTmFtZSA9IHBhcmVudC5jbGFzc05hbWUucmVwbGFjZShsYW5nLCAnJykucmVwbGFjZSgvXFxzKy9nLCAnICcpICsgJyBsYW5ndWFnZS0nICsgbGFuZ3VhZ2U7XG5cdFx0fVxuXG5cdFx0dmFyIGNvZGUgPSBlbGVtZW50LnRleHRDb250ZW50O1xuXG5cdFx0dmFyIGVudiA9IHtcblx0XHRcdGVsZW1lbnQ6IGVsZW1lbnQsXG5cdFx0XHRsYW5ndWFnZTogbGFuZ3VhZ2UsXG5cdFx0XHRncmFtbWFyOiBncmFtbWFyLFxuXHRcdFx0Y29kZTogY29kZVxuXHRcdH07XG5cblx0XHRfLmhvb2tzLnJ1bignYmVmb3JlLXNhbml0eS1jaGVjaycsIGVudik7XG5cblx0XHRpZiAoIWVudi5jb2RlIHx8ICFlbnYuZ3JhbW1hcikge1xuXHRcdFx0aWYgKGVudi5jb2RlKSB7XG5cdFx0XHRcdGVudi5lbGVtZW50LnRleHRDb250ZW50ID0gZW52LmNvZGU7XG5cdFx0XHR9XG5cdFx0XHRfLmhvb2tzLnJ1bignY29tcGxldGUnLCBlbnYpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdF8uaG9va3MucnVuKCdiZWZvcmUtaGlnaGxpZ2h0JywgZW52KTtcblxuXHRcdGlmIChhc3luYyAmJiBfc2VsZi5Xb3JrZXIpIHtcblx0XHRcdHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKF8uZmlsZW5hbWUpO1xuXG5cdFx0XHR3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZXZ0KSB7XG5cdFx0XHRcdGVudi5oaWdobGlnaHRlZENvZGUgPSBldnQuZGF0YTtcblxuXHRcdFx0XHRfLmhvb2tzLnJ1bignYmVmb3JlLWluc2VydCcsIGVudik7XG5cblx0XHRcdFx0ZW52LmVsZW1lbnQuaW5uZXJIVE1MID0gZW52LmhpZ2hsaWdodGVkQ29kZTtcblxuXHRcdFx0XHRjYWxsYmFjayAmJiBjYWxsYmFjay5jYWxsKGVudi5lbGVtZW50KTtcblx0XHRcdFx0Xy5ob29rcy5ydW4oJ2FmdGVyLWhpZ2hsaWdodCcsIGVudik7XG5cdFx0XHRcdF8uaG9va3MucnVuKCdjb21wbGV0ZScsIGVudik7XG5cdFx0XHR9O1xuXG5cdFx0XHR3b3JrZXIucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRsYW5ndWFnZTogZW52Lmxhbmd1YWdlLFxuXHRcdFx0XHRjb2RlOiBlbnYuY29kZSxcblx0XHRcdFx0aW1tZWRpYXRlQ2xvc2U6IHRydWVcblx0XHRcdH0pKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRlbnYuaGlnaGxpZ2h0ZWRDb2RlID0gXy5oaWdobGlnaHQoZW52LmNvZGUsIGVudi5ncmFtbWFyLCBlbnYubGFuZ3VhZ2UpO1xuXG5cdFx0XHRfLmhvb2tzLnJ1bignYmVmb3JlLWluc2VydCcsIGVudik7XG5cblx0XHRcdGVudi5lbGVtZW50LmlubmVySFRNTCA9IGVudi5oaWdobGlnaHRlZENvZGU7XG5cblx0XHRcdGNhbGxiYWNrICYmIGNhbGxiYWNrLmNhbGwoZWxlbWVudCk7XG5cblx0XHRcdF8uaG9va3MucnVuKCdhZnRlci1oaWdobGlnaHQnLCBlbnYpO1xuXHRcdFx0Xy5ob29rcy5ydW4oJ2NvbXBsZXRlJywgZW52KTtcblx0XHR9XG5cdH0sXG5cblx0aGlnaGxpZ2h0OiBmdW5jdGlvbiAodGV4dCwgZ3JhbW1hciwgbGFuZ3VhZ2UpIHtcblx0XHR2YXIgdG9rZW5zID0gXy50b2tlbml6ZSh0ZXh0LCBncmFtbWFyKTtcblx0XHRyZXR1cm4gVG9rZW4uc3RyaW5naWZ5KF8udXRpbC5lbmNvZGUodG9rZW5zKSwgbGFuZ3VhZ2UpO1xuXHR9LFxuXG5cdHRva2VuaXplOiBmdW5jdGlvbih0ZXh0LCBncmFtbWFyLCBsYW5ndWFnZSkge1xuXHRcdHZhciBUb2tlbiA9IF8uVG9rZW47XG5cblx0XHR2YXIgc3RyYXJyID0gW3RleHRdO1xuXG5cdFx0dmFyIHJlc3QgPSBncmFtbWFyLnJlc3Q7XG5cblx0XHRpZiAocmVzdCkge1xuXHRcdFx0Zm9yICh2YXIgdG9rZW4gaW4gcmVzdCkge1xuXHRcdFx0XHRncmFtbWFyW3Rva2VuXSA9IHJlc3RbdG9rZW5dO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgZ3JhbW1hci5yZXN0O1xuXHRcdH1cblxuXHRcdHRva2VubG9vcDogZm9yICh2YXIgdG9rZW4gaW4gZ3JhbW1hcikge1xuXHRcdFx0aWYoIWdyYW1tYXIuaGFzT3duUHJvcGVydHkodG9rZW4pIHx8ICFncmFtbWFyW3Rva2VuXSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHBhdHRlcm5zID0gZ3JhbW1hclt0b2tlbl07XG5cdFx0XHRwYXR0ZXJucyA9IChfLnV0aWwudHlwZShwYXR0ZXJucykgPT09IFwiQXJyYXlcIikgPyBwYXR0ZXJucyA6IFtwYXR0ZXJuc107XG5cblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgcGF0dGVybnMubGVuZ3RoOyArK2opIHtcblx0XHRcdFx0dmFyIHBhdHRlcm4gPSBwYXR0ZXJuc1tqXSxcblx0XHRcdFx0XHRpbnNpZGUgPSBwYXR0ZXJuLmluc2lkZSxcblx0XHRcdFx0XHRsb29rYmVoaW5kID0gISFwYXR0ZXJuLmxvb2tiZWhpbmQsXG5cdFx0XHRcdFx0Z3JlZWR5ID0gISFwYXR0ZXJuLmdyZWVkeSxcblx0XHRcdFx0XHRsb29rYmVoaW5kTGVuZ3RoID0gMCxcblx0XHRcdFx0XHRhbGlhcyA9IHBhdHRlcm4uYWxpYXM7XG5cblx0XHRcdFx0aWYgKGdyZWVkeSAmJiAhcGF0dGVybi5wYXR0ZXJuLmdsb2JhbCkge1xuXHRcdFx0XHRcdC8vIFdpdGhvdXQgdGhlIGdsb2JhbCBmbGFnLCBsYXN0SW5kZXggd29uJ3Qgd29ya1xuXHRcdFx0XHRcdHZhciBmbGFncyA9IHBhdHRlcm4ucGF0dGVybi50b1N0cmluZygpLm1hdGNoKC9baW11eV0qJC8pWzBdO1xuXHRcdFx0XHRcdHBhdHRlcm4ucGF0dGVybiA9IFJlZ0V4cChwYXR0ZXJuLnBhdHRlcm4uc291cmNlLCBmbGFncyArIFwiZ1wiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHBhdHRlcm4gPSBwYXR0ZXJuLnBhdHRlcm4gfHwgcGF0dGVybjtcblxuXHRcdFx0XHQvLyBEb27igJl0IGNhY2hlIGxlbmd0aCBhcyBpdCBjaGFuZ2VzIGR1cmluZyB0aGUgbG9vcFxuXHRcdFx0XHRmb3IgKHZhciBpPTAsIHBvcyA9IDA7IGk8c3RyYXJyLmxlbmd0aDsgcG9zICs9IHN0cmFycltpXS5sZW5ndGgsICsraSkge1xuXG5cdFx0XHRcdFx0dmFyIHN0ciA9IHN0cmFycltpXTtcblxuXHRcdFx0XHRcdGlmIChzdHJhcnIubGVuZ3RoID4gdGV4dC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIFNvbWV0aGluZyB3ZW50IHRlcnJpYmx5IHdyb25nLCBBQk9SVCwgQUJPUlQhXG5cdFx0XHRcdFx0XHRicmVhayB0b2tlbmxvb3A7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHN0ciBpbnN0YW5jZW9mIFRva2VuKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG5cblx0XHRcdFx0XHR2YXIgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoc3RyKSxcblx0XHRcdFx0XHQgICAgZGVsTnVtID0gMTtcblxuXHRcdFx0XHRcdC8vIEdyZWVkeSBwYXR0ZXJucyBjYW4gb3ZlcnJpZGUvcmVtb3ZlIHVwIHRvIHR3byBwcmV2aW91c2x5IG1hdGNoZWQgdG9rZW5zXG5cdFx0XHRcdFx0aWYgKCFtYXRjaCAmJiBncmVlZHkgJiYgaSAhPSBzdHJhcnIubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0cGF0dGVybi5sYXN0SW5kZXggPSBwb3M7XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHBhdHRlcm4uZXhlYyh0ZXh0KTtcblx0XHRcdFx0XHRcdGlmICghbWF0Y2gpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHZhciBmcm9tID0gbWF0Y2guaW5kZXggKyAobG9va2JlaGluZCA/IG1hdGNoWzFdLmxlbmd0aCA6IDApLFxuXHRcdFx0XHRcdFx0ICAgIHRvID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgsXG5cdFx0XHRcdFx0XHQgICAgayA9IGksXG5cdFx0XHRcdFx0XHQgICAgcCA9IHBvcztcblxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgbGVuID0gc3RyYXJyLmxlbmd0aDsgayA8IGxlbiAmJiBwIDwgdG87ICsraykge1xuXHRcdFx0XHRcdFx0XHRwICs9IHN0cmFycltrXS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdC8vIE1vdmUgdGhlIGluZGV4IGkgdG8gdGhlIGVsZW1lbnQgaW4gc3RyYXJyIHRoYXQgaXMgY2xvc2VzdCB0byBmcm9tXG5cdFx0XHRcdFx0XHRcdGlmIChmcm9tID49IHApIHtcblx0XHRcdFx0XHRcdFx0XHQrK2k7XG5cdFx0XHRcdFx0XHRcdFx0cG9zID0gcDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdFx0ICogSWYgc3RyYXJyW2ldIGlzIGEgVG9rZW4sIHRoZW4gdGhlIG1hdGNoIHN0YXJ0cyBpbnNpZGUgYW5vdGhlciBUb2tlbiwgd2hpY2ggaXMgaW52YWxpZFxuXHRcdFx0XHRcdFx0ICogSWYgc3RyYXJyW2sgLSAxXSBpcyBncmVlZHkgd2UgYXJlIGluIGNvbmZsaWN0IHdpdGggYW5vdGhlciBncmVlZHkgcGF0dGVyblxuXHRcdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0XHRpZiAoc3RyYXJyW2ldIGluc3RhbmNlb2YgVG9rZW4gfHwgc3RyYXJyW2sgLSAxXS5ncmVlZHkpIHtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE51bWJlciBvZiB0b2tlbnMgdG8gZGVsZXRlIGFuZCByZXBsYWNlIHdpdGggdGhlIG5ldyBtYXRjaFxuXHRcdFx0XHRcdFx0ZGVsTnVtID0gayAtIGk7XG5cdFx0XHRcdFx0XHRzdHIgPSB0ZXh0LnNsaWNlKHBvcywgcCk7XG5cdFx0XHRcdFx0XHRtYXRjaC5pbmRleCAtPSBwb3M7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFtYXRjaCkge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYobG9va2JlaGluZCkge1xuXHRcdFx0XHRcdFx0bG9va2JlaGluZExlbmd0aCA9IG1hdGNoWzFdLmxlbmd0aDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgZnJvbSA9IG1hdGNoLmluZGV4ICsgbG9va2JlaGluZExlbmd0aCxcblx0XHRcdFx0XHQgICAgbWF0Y2ggPSBtYXRjaFswXS5zbGljZShsb29rYmVoaW5kTGVuZ3RoKSxcblx0XHRcdFx0XHQgICAgdG8gPSBmcm9tICsgbWF0Y2gubGVuZ3RoLFxuXHRcdFx0XHRcdCAgICBiZWZvcmUgPSBzdHIuc2xpY2UoMCwgZnJvbSksXG5cdFx0XHRcdFx0ICAgIGFmdGVyID0gc3RyLnNsaWNlKHRvKTtcblxuXHRcdFx0XHRcdHZhciBhcmdzID0gW2ksIGRlbE51bV07XG5cblx0XHRcdFx0XHRpZiAoYmVmb3JlKSB7XG5cdFx0XHRcdFx0XHRhcmdzLnB1c2goYmVmb3JlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgd3JhcHBlZCA9IG5ldyBUb2tlbih0b2tlbiwgaW5zaWRlPyBfLnRva2VuaXplKG1hdGNoLCBpbnNpZGUpIDogbWF0Y2gsIGFsaWFzLCBtYXRjaCwgZ3JlZWR5KTtcblxuXHRcdFx0XHRcdGFyZ3MucHVzaCh3cmFwcGVkKTtcblxuXHRcdFx0XHRcdGlmIChhZnRlcikge1xuXHRcdFx0XHRcdFx0YXJncy5wdXNoKGFmdGVyKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KHN0cmFyciwgYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyYXJyO1xuXHR9LFxuXG5cdGhvb2tzOiB7XG5cdFx0YWxsOiB7fSxcblxuXHRcdGFkZDogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrKSB7XG5cdFx0XHR2YXIgaG9va3MgPSBfLmhvb2tzLmFsbDtcblxuXHRcdFx0aG9va3NbbmFtZV0gPSBob29rc1tuYW1lXSB8fCBbXTtcblxuXHRcdFx0aG9va3NbbmFtZV0ucHVzaChjYWxsYmFjayk7XG5cdFx0fSxcblxuXHRcdHJ1bjogZnVuY3Rpb24gKG5hbWUsIGVudikge1xuXHRcdFx0dmFyIGNhbGxiYWNrcyA9IF8uaG9va3MuYWxsW25hbWVdO1xuXG5cdFx0XHRpZiAoIWNhbGxiYWNrcyB8fCAhY2FsbGJhY2tzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZvciAodmFyIGk9MCwgY2FsbGJhY2s7IGNhbGxiYWNrID0gY2FsbGJhY2tzW2krK107KSB7XG5cdFx0XHRcdGNhbGxiYWNrKGVudik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG52YXIgVG9rZW4gPSBfLlRva2VuID0gZnVuY3Rpb24odHlwZSwgY29udGVudCwgYWxpYXMsIG1hdGNoZWRTdHIsIGdyZWVkeSkge1xuXHR0aGlzLnR5cGUgPSB0eXBlO1xuXHR0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXHR0aGlzLmFsaWFzID0gYWxpYXM7XG5cdC8vIENvcHkgb2YgdGhlIGZ1bGwgc3RyaW5nIHRoaXMgdG9rZW4gd2FzIGNyZWF0ZWQgZnJvbVxuXHR0aGlzLmxlbmd0aCA9IChtYXRjaGVkU3RyIHx8IFwiXCIpLmxlbmd0aHwwO1xuXHR0aGlzLmdyZWVkeSA9ICEhZ3JlZWR5O1xufTtcblxuVG9rZW4uc3RyaW5naWZ5ID0gZnVuY3Rpb24obywgbGFuZ3VhZ2UsIHBhcmVudCkge1xuXHRpZiAodHlwZW9mIG8gPT0gJ3N0cmluZycpIHtcblx0XHRyZXR1cm4gbztcblx0fVxuXG5cdGlmIChfLnV0aWwudHlwZShvKSA9PT0gJ0FycmF5Jykge1xuXHRcdHJldHVybiBvLm1hcChmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0XHRyZXR1cm4gVG9rZW4uc3RyaW5naWZ5KGVsZW1lbnQsIGxhbmd1YWdlLCBvKTtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdHZhciBlbnYgPSB7XG5cdFx0dHlwZTogby50eXBlLFxuXHRcdGNvbnRlbnQ6IFRva2VuLnN0cmluZ2lmeShvLmNvbnRlbnQsIGxhbmd1YWdlLCBwYXJlbnQpLFxuXHRcdHRhZzogJ3NwYW4nLFxuXHRcdGNsYXNzZXM6IFsndG9rZW4nLCBvLnR5cGVdLFxuXHRcdGF0dHJpYnV0ZXM6IHt9LFxuXHRcdGxhbmd1YWdlOiBsYW5ndWFnZSxcblx0XHRwYXJlbnQ6IHBhcmVudFxuXHR9O1xuXG5cdGlmIChlbnYudHlwZSA9PSAnY29tbWVudCcpIHtcblx0XHRlbnYuYXR0cmlidXRlc1snc3BlbGxjaGVjayddID0gJ3RydWUnO1xuXHR9XG5cblx0aWYgKG8uYWxpYXMpIHtcblx0XHR2YXIgYWxpYXNlcyA9IF8udXRpbC50eXBlKG8uYWxpYXMpID09PSAnQXJyYXknID8gby5hbGlhcyA6IFtvLmFsaWFzXTtcblx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShlbnYuY2xhc3NlcywgYWxpYXNlcyk7XG5cdH1cblxuXHRfLmhvb2tzLnJ1bignd3JhcCcsIGVudik7XG5cblx0dmFyIGF0dHJpYnV0ZXMgPSBPYmplY3Qua2V5cyhlbnYuYXR0cmlidXRlcykubWFwKGZ1bmN0aW9uKG5hbWUpIHtcblx0XHRyZXR1cm4gbmFtZSArICc9XCInICsgKGVudi5hdHRyaWJ1dGVzW25hbWVdIHx8ICcnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JykgKyAnXCInO1xuXHR9KS5qb2luKCcgJyk7XG5cblx0cmV0dXJuICc8JyArIGVudi50YWcgKyAnIGNsYXNzPVwiJyArIGVudi5jbGFzc2VzLmpvaW4oJyAnKSArICdcIicgKyAoYXR0cmlidXRlcyA/ICcgJyArIGF0dHJpYnV0ZXMgOiAnJykgKyAnPicgKyBlbnYuY29udGVudCArICc8LycgKyBlbnYudGFnICsgJz4nO1xuXG59O1xuXG5pZiAoIV9zZWxmLmRvY3VtZW50KSB7XG5cdGlmICghX3NlbGYuYWRkRXZlbnRMaXN0ZW5lcikge1xuXHRcdC8vIGluIE5vZGUuanNcblx0XHRyZXR1cm4gX3NlbGYuUHJpc207XG5cdH1cbiBcdC8vIEluIHdvcmtlclxuXHRfc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZXZ0KSB7XG5cdFx0dmFyIG1lc3NhZ2UgPSBKU09OLnBhcnNlKGV2dC5kYXRhKSxcblx0XHQgICAgbGFuZyA9IG1lc3NhZ2UubGFuZ3VhZ2UsXG5cdFx0ICAgIGNvZGUgPSBtZXNzYWdlLmNvZGUsXG5cdFx0ICAgIGltbWVkaWF0ZUNsb3NlID0gbWVzc2FnZS5pbW1lZGlhdGVDbG9zZTtcblxuXHRcdF9zZWxmLnBvc3RNZXNzYWdlKF8uaGlnaGxpZ2h0KGNvZGUsIF8ubGFuZ3VhZ2VzW2xhbmddLCBsYW5nKSk7XG5cdFx0aWYgKGltbWVkaWF0ZUNsb3NlKSB7XG5cdFx0XHRfc2VsZi5jbG9zZSgpO1xuXHRcdH1cblx0fSwgZmFsc2UpO1xuXG5cdHJldHVybiBfc2VsZi5QcmlzbTtcbn1cblxuLy9HZXQgY3VycmVudCBzY3JpcHQgYW5kIGhpZ2hsaWdodFxudmFyIHNjcmlwdCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgfHwgW10uc2xpY2UuY2FsbChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNjcmlwdFwiKSkucG9wKCk7XG5cbmlmIChzY3JpcHQpIHtcblx0Xy5maWxlbmFtZSA9IHNjcmlwdC5zcmM7XG5cblx0aWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgJiYgIXNjcmlwdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtbWFudWFsJykpIHtcblx0XHRpZihkb2N1bWVudC5yZWFkeVN0YXRlICE9PSBcImxvYWRpbmdcIikge1xuXHRcdFx0aWYgKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcblx0XHRcdFx0d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShfLmhpZ2hsaWdodEFsbCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dChfLmhpZ2hsaWdodEFsbCwgMTYpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBfLmhpZ2hsaWdodEFsbCk7XG5cdFx0fVxuXHR9XG59XG5cbnJldHVybiBfc2VsZi5QcmlzbTtcblxufSkoKTtcblxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdG1vZHVsZS5leHBvcnRzID0gUHJpc207XG59XG5cbi8vIGhhY2sgZm9yIGNvbXBvbmVudHMgdG8gd29yayBjb3JyZWN0bHkgaW4gbm9kZS5qc1xuaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG5cdGdsb2JhbC5QcmlzbSA9IFByaXNtO1xufVxuXG5cbi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQmVnaW4gcHJpc20tbWFya3VwLmpzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cblByaXNtLmxhbmd1YWdlcy5tYXJrdXAgPSB7XG5cdCdjb21tZW50JzogLzwhLS1bXFx3XFxXXSo/LS0+Lyxcblx0J3Byb2xvZyc6IC88XFw/W1xcd1xcV10rP1xcPz4vLFxuXHQnZG9jdHlwZSc6IC88IURPQ1RZUEVbXFx3XFxXXSs/Pi9pLFxuXHQnY2RhdGEnOiAvPCFcXFtDREFUQVxcW1tcXHdcXFddKj9dXT4vaSxcblx0J3RhZyc6IHtcblx0XHRwYXR0ZXJuOiAvPFxcLz8oPyFcXGQpW15cXHM+XFwvPSQ8XSsoPzpcXHMrW15cXHM+XFwvPV0rKD86PSg/OihcInwnKSg/OlxcXFxcXDF8XFxcXD8oPyFcXDEpW1xcd1xcV10pKlxcMXxbXlxccydcIj49XSspKT8pKlxccypcXC8/Pi9pLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3RhZyc6IHtcblx0XHRcdFx0cGF0dGVybjogL148XFwvP1teXFxzPlxcL10rL2ksXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePFxcLz8vLFxuXHRcdFx0XHRcdCduYW1lc3BhY2UnOiAvXlteXFxzPlxcLzpdKzovXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnYXR0ci12YWx1ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLz0oPzooJ3xcIilbXFx3XFxXXSo/KFxcMSl8W15cXHM+XSspL2ksXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bPT5cIiddL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLz8+Lyxcblx0XHRcdCdhdHRyLW5hbWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bXlxccz5cXC9dKy8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCduYW1lc3BhY2UnOiAvXlteXFxzPlxcLzpdKzovXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH1cblx0fSxcblx0J2VudGl0eSc6IC8mIz9bXFxkYS16XXsxLDh9Oy9pXG59O1xuXG4vLyBQbHVnaW4gdG8gbWFrZSBlbnRpdHkgdGl0bGUgc2hvdyB0aGUgcmVhbCBlbnRpdHksIGlkZWEgYnkgUm9tYW4gS29tYXJvdlxuUHJpc20uaG9va3MuYWRkKCd3cmFwJywgZnVuY3Rpb24oZW52KSB7XG5cblx0aWYgKGVudi50eXBlID09PSAnZW50aXR5Jykge1xuXHRcdGVudi5hdHRyaWJ1dGVzWyd0aXRsZSddID0gZW52LmNvbnRlbnQucmVwbGFjZSgvJmFtcDsvLCAnJicpO1xuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLnhtbCA9IFByaXNtLmxhbmd1YWdlcy5tYXJrdXA7XG5QcmlzbS5sYW5ndWFnZXMuaHRtbCA9IFByaXNtLmxhbmd1YWdlcy5tYXJrdXA7XG5QcmlzbS5sYW5ndWFnZXMubWF0aG1sID0gUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cDtcblByaXNtLmxhbmd1YWdlcy5zdmcgPSBQcmlzbS5sYW5ndWFnZXMubWFya3VwO1xuXG5cbi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQmVnaW4gcHJpc20tY3NzLmpzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cblByaXNtLmxhbmd1YWdlcy5jc3MgPSB7XG5cdCdjb21tZW50JzogL1xcL1xcKltcXHdcXFddKj9cXCpcXC8vLFxuXHQnYXRydWxlJzoge1xuXHRcdHBhdHRlcm46IC9AW1xcdy1dKz8uKj8oO3woPz1cXHMqXFx7KSkvaSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdydWxlJzogL0BbXFx3LV0rL1xuXHRcdFx0Ly8gU2VlIHJlc3QgYmVsb3dcblx0XHR9XG5cdH0sXG5cdCd1cmwnOiAvdXJsXFwoKD86KFtcIiddKShcXFxcKD86XFxyXFxufFtcXHdcXFddKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxfC4qPylcXCkvaSxcblx0J3NlbGVjdG9yJzogL1teXFx7XFx9XFxzXVteXFx7XFx9O10qPyg/PVxccypcXHspLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFwifCcpKFxcXFwoPzpcXHJcXG58W1xcd1xcV10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQncHJvcGVydHknOiAvKFxcYnxcXEIpW1xcdy1dKyg/PVxccyo6KS9pLFxuXHQnaW1wb3J0YW50JzogL1xcQiFpbXBvcnRhbnRcXGIvaSxcblx0J2Z1bmN0aW9uJzogL1stYS16MC05XSsoPz1cXCgpL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fTs6XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5jc3NbJ2F0cnVsZSddLmluc2lkZS5yZXN0ID0gUHJpc20udXRpbC5jbG9uZShQcmlzbS5sYW5ndWFnZXMuY3NzKTtcblxuaWYgKFByaXNtLmxhbmd1YWdlcy5tYXJrdXApIHtcblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbWFya3VwJywgJ3RhZycsIHtcblx0XHQnc3R5bGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKDxzdHlsZVtcXHdcXFddKj8+KVtcXHdcXFddKj8oPz08XFwvc3R5bGU+KS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNzcyxcblx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtY3NzJ1xuXHRcdH1cblx0fSk7XG5cdFxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdpbnNpZGUnLCAnYXR0ci12YWx1ZScsIHtcblx0XHQnc3R5bGUtYXR0cic6IHtcblx0XHRcdHBhdHRlcm46IC9cXHMqc3R5bGU9KFwifCcpLio/XFwxL2ksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2F0dHItbmFtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxccypzdHlsZS9pLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC50YWcuaW5zaWRlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxzKj1cXHMqWydcIl18WydcIl1cXHMqJC8sXG5cdFx0XHRcdCdhdHRyLXZhbHVlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8uKy9pLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNzc1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1jc3MnXG5cdFx0fVxuXHR9LCBQcmlzbS5sYW5ndWFnZXMubWFya3VwLnRhZyk7XG59XG5cbi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQmVnaW4gcHJpc20tY2xpa2UuanNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuUHJpc20ubGFuZ3VhZ2VzLmNsaWtlID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpbXFx3XFxXXSo/XFwqXFwvLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSlcXC9cXC8uKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKFxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKCg/OlxcYig/OmNsYXNzfGludGVyZmFjZXxleHRlbmRzfGltcGxlbWVudHN8dHJhaXR8aW5zdGFuY2VvZnxuZXcpXFxzKyl8KD86Y2F0Y2hcXHMrXFwoKSlbYS16MC05X1xcLlxcXFxdKy9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHRwdW5jdHVhdGlvbjogLyhcXC58XFxcXCkvXG5cdFx0fVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoaWZ8ZWxzZXx3aGlsZXxkb3xmb3J8cmV0dXJufGlufGluc3RhbmNlb2Z8ZnVuY3Rpb258bmV3fHRyeXx0aHJvd3xjYXRjaHxmaW5hbGx5fG51bGx8YnJlYWt8Y29udGludWUpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKHRydWV8ZmFsc2UpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1thLXowLTlfXSsoPz1cXCgpL2ksXG5cdCdudW1iZXInOiAvXFxiLT8oPzoweFtcXGRhLWZdK3xcXGQqXFwuP1xcZCsoPzplWystXT9cXGQrKT8pXFxiL2ksXG5cdCdvcGVyYXRvcic6IC8tLT98XFwrXFwrP3whPT89P3w8PT98Pj0/fD09Pz0/fCYmP3xcXHxcXHw/fFxcP3xcXCp8XFwvfH58XFxefCUvLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vXG59O1xuXG5cbi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQmVnaW4gcHJpc20tamF2YXNjcmlwdC5qc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5QcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQna2V5d29yZCc6IC9cXGIoYXN8YXN5bmN8YXdhaXR8YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjb25zdHxjb250aW51ZXxkZWJ1Z2dlcnxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGVudW18ZXhwb3J0fGV4dGVuZHN8ZmluYWxseXxmb3J8ZnJvbXxmdW5jdGlvbnxnZXR8aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW5zdGFuY2VvZnxpbnRlcmZhY2V8bGV0fG5ld3xudWxsfG9mfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJldHVybnxzZXR8c3RhdGljfHN1cGVyfHN3aXRjaHx0aGlzfHRocm93fHRyeXx0eXBlb2Z8dmFyfHZvaWR8d2hpbGV8d2l0aHx5aWVsZClcXGIvLFxuXHQnbnVtYmVyJzogL1xcYi0/KDB4W1xcZEEtRmEtZl0rfDBiWzAxXSt8MG9bMC03XSt8XFxkKlxcLj9cXGQrKFtFZV1bKy1dP1xcZCspP3xOYU58SW5maW5pdHkpXFxiLyxcblx0Ly8gQWxsb3cgZm9yIGFsbCBub24tQVNDSUkgY2hhcmFjdGVycyAoU2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIwMDg0NDQpXG5cdCdmdW5jdGlvbic6IC9bXyRhLXpBLVpcXHhBMC1cXHVGRkZGXVtfJGEtekEtWjAtOVxceEEwLVxcdUZGRkZdKig/PVxcKCkvaSxcblx0J29wZXJhdG9yJzogLy0tP3xcXCtcXCs/fCE9Pz0/fDw9P3w+PT98PT0/PT98JiY/fFxcfFxcfD98XFw/fFxcKlxcKj98XFwvfH58XFxefCV8XFwuezN9L1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCAna2V5d29yZCcsIHtcblx0J3JlZ2V4Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi9dKVxcLyg/IVxcLykoXFxbLis/XXxcXFxcLnxbXi9cXFxcXFxyXFxuXSkrXFwvW2dpbXl1XXswLDV9KD89XFxzKigkfFtcXHJcXG4sLjt9KV0pKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCAnc3RyaW5nJywge1xuXHQndGVtcGxhdGUtc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9gKD86XFxcXFxcXFx8XFxcXD9bXlxcXFxdKSo/YC8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCRcXHtbXn1dK1xcfS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL15cXCRcXHt8XFx9JC8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fVxufSk7XG5cbmlmIChQcmlzbS5sYW5ndWFnZXMubWFya3VwKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ21hcmt1cCcsICd0YWcnLCB7XG5cdFx0J3NjcmlwdCc6IHtcblx0XHRcdHBhdHRlcm46IC8oPHNjcmlwdFtcXHdcXFddKj8+KVtcXHdcXFddKj8oPz08XFwvc2NyaXB0PikvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0LFxuXHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1qYXZhc2NyaXB0J1xuXHRcdH1cblx0fSk7XG59XG5cblByaXNtLmxhbmd1YWdlcy5qcyA9IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0O1xuXG4vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIEJlZ2luIHByaXNtLWZpbGUtaGlnaGxpZ2h0LmpzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdGlmICh0eXBlb2Ygc2VsZiA9PT0gJ3VuZGVmaW5lZCcgfHwgIXNlbGYuUHJpc20gfHwgIXNlbGYuZG9jdW1lbnQgfHwgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRzZWxmLlByaXNtLmZpbGVIaWdobGlnaHQgPSBmdW5jdGlvbigpIHtcblxuXHRcdHZhciBFeHRlbnNpb25zID0ge1xuXHRcdFx0J2pzJzogJ2phdmFzY3JpcHQnLFxuXHRcdFx0J3B5JzogJ3B5dGhvbicsXG5cdFx0XHQncmInOiAncnVieScsXG5cdFx0XHQncHMxJzogJ3Bvd2Vyc2hlbGwnLFxuXHRcdFx0J3BzbTEnOiAncG93ZXJzaGVsbCcsXG5cdFx0XHQnc2gnOiAnYmFzaCcsXG5cdFx0XHQnYmF0JzogJ2JhdGNoJyxcblx0XHRcdCdoJzogJ2MnLFxuXHRcdFx0J3RleCc6ICdsYXRleCdcblx0XHR9O1xuXG5cdFx0aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsgLy8gQ2hlY2sgdG8gcHJldmVudCBlcnJvciBpbiBJRThcblx0XHRcdEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3ByZVtkYXRhLXNyY10nKSkuZm9yRWFjaChmdW5jdGlvbiAocHJlKSB7XG5cdFx0XHRcdHZhciBzcmMgPSBwcmUuZ2V0QXR0cmlidXRlKCdkYXRhLXNyYycpO1xuXG5cdFx0XHRcdHZhciBsYW5ndWFnZSwgcGFyZW50ID0gcHJlO1xuXHRcdFx0XHR2YXIgbGFuZyA9IC9cXGJsYW5nKD86dWFnZSk/LSg/IVxcKikoXFx3KylcXGIvaTtcblx0XHRcdFx0d2hpbGUgKHBhcmVudCAmJiAhbGFuZy50ZXN0KHBhcmVudC5jbGFzc05hbWUpKSB7XG5cdFx0XHRcdFx0cGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRcdFx0bGFuZ3VhZ2UgPSAocHJlLmNsYXNzTmFtZS5tYXRjaChsYW5nKSB8fCBbLCAnJ10pWzFdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFsYW5ndWFnZSkge1xuXHRcdFx0XHRcdHZhciBleHRlbnNpb24gPSAoc3JjLm1hdGNoKC9cXC4oXFx3KykkLykgfHwgWywgJyddKVsxXTtcblx0XHRcdFx0XHRsYW5ndWFnZSA9IEV4dGVuc2lvbnNbZXh0ZW5zaW9uXSB8fCBleHRlbnNpb247XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgY29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvZGUnKTtcblx0XHRcdFx0Y29kZS5jbGFzc05hbWUgPSAnbGFuZ3VhZ2UtJyArIGxhbmd1YWdlO1xuXG5cdFx0XHRcdHByZS50ZXh0Q29udGVudCA9ICcnO1xuXG5cdFx0XHRcdGNvZGUudGV4dENvbnRlbnQgPSAnTG9hZGluZ+KApic7XG5cblx0XHRcdFx0cHJlLmFwcGVuZENoaWxkKGNvZGUpO1xuXG5cdFx0XHRcdHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuXHRcdFx0XHR4aHIub3BlbignR0VUJywgc3JjLCB0cnVlKTtcblxuXHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmICh4aHIucmVhZHlTdGF0ZSA9PSA0KSB7XG5cblx0XHRcdFx0XHRcdGlmICh4aHIuc3RhdHVzIDwgNDAwICYmIHhoci5yZXNwb25zZVRleHQpIHtcblx0XHRcdFx0XHRcdFx0Y29kZS50ZXh0Q29udGVudCA9IHhoci5yZXNwb25zZVRleHQ7XG5cblx0XHRcdFx0XHRcdFx0UHJpc20uaGlnaGxpZ2h0RWxlbWVudChjb2RlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2UgaWYgKHhoci5zdGF0dXMgPj0gNDAwKSB7XG5cdFx0XHRcdFx0XHRcdGNvZGUudGV4dENvbnRlbnQgPSAn4pyWIEVycm9yICcgKyB4aHIuc3RhdHVzICsgJyB3aGlsZSBmZXRjaGluZyBmaWxlOiAnICsgeGhyLnN0YXR1c1RleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29kZS50ZXh0Q29udGVudCA9ICfinJYgRXJyb3I6IEZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgZW1wdHknO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHR4aHIuc2VuZChudWxsKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHR9O1xuXG5cdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBzZWxmLlByaXNtLmZpbGVIaWdobGlnaHQpO1xuXG59KSgpO1xuIiwiZnVuY3Rpb24gc2VsZWN0KGVsZW1lbnQpIHtcbiAgICB2YXIgc2VsZWN0ZWRUZXh0O1xuXG4gICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQubm9kZU5hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgdmFyIGlzUmVhZE9ubHkgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKTtcblxuICAgICAgICBpZiAoIWlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgZWxlbWVudC52YWx1ZS5sZW5ndGgpO1xuXG4gICAgICAgIGlmICghaXNSZWFkT25seSkge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JlYWRvbmx5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSkge1xuICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblxuICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRUZXh0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbGVjdDtcbiIsImZ1bmN0aW9uIEUgKCkge1xuICAvLyBLZWVwIHRoaXMgZW1wdHkgc28gaXQncyBlYXNpZXIgdG8gaW5oZXJpdCBmcm9tXG4gIC8vICh2aWEgaHR0cHM6Ly9naXRodWIuY29tL2xpcHNtYWNrIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9pc3N1ZXMvMylcbn1cblxuRS5wcm90b3R5cGUgPSB7XG4gIG9uOiBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2ssIGN0eCkge1xuICAgIHZhciBlID0gdGhpcy5lIHx8ICh0aGlzLmUgPSB7fSk7XG5cbiAgICAoZVtuYW1lXSB8fCAoZVtuYW1lXSA9IFtdKSkucHVzaCh7XG4gICAgICBmbjogY2FsbGJhY2ssXG4gICAgICBjdHg6IGN0eFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgb25jZTogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBjdHgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gbGlzdGVuZXIgKCkge1xuICAgICAgc2VsZi5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICAgICAgY2FsbGJhY2suYXBwbHkoY3R4LCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBsaXN0ZW5lci5fID0gY2FsbGJhY2tcbiAgICByZXR1cm4gdGhpcy5vbihuYW1lLCBsaXN0ZW5lciwgY3R4KTtcbiAgfSxcblxuICBlbWl0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBkYXRhID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHZhciBldnRBcnIgPSAoKHRoaXMuZSB8fCAodGhpcy5lID0ge30pKVtuYW1lXSB8fCBbXSkuc2xpY2UoKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGxlbiA9IGV2dEFyci5sZW5ndGg7XG5cbiAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgZXZ0QXJyW2ldLmZuLmFwcGx5KGV2dEFycltpXS5jdHgsIGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG9mZjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTtcbiAgICB2YXIgZXZ0cyA9IGVbbmFtZV07XG4gICAgdmFyIGxpdmVFdmVudHMgPSBbXTtcblxuICAgIGlmIChldnRzICYmIGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXZ0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZXZ0c1tpXS5mbiAhPT0gY2FsbGJhY2sgJiYgZXZ0c1tpXS5mbi5fICE9PSBjYWxsYmFjaylcbiAgICAgICAgICBsaXZlRXZlbnRzLnB1c2goZXZ0c1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGV2ZW50IGZyb20gcXVldWUgdG8gcHJldmVudCBtZW1vcnkgbGVha1xuICAgIC8vIFN1Z2dlc3RlZCBieSBodHRwczovL2dpdGh1Yi5jb20vbGF6ZFxuICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9jb21taXQvYzZlYmZhYTliYzk3M2IzM2QxMTBhODRhMzA3NzQyYjdjZjk0Yzk1MyNjb21taXRjb21tZW50LTUwMjQ5MTBcblxuICAgIChsaXZlRXZlbnRzLmxlbmd0aClcbiAgICAgID8gZVtuYW1lXSA9IGxpdmVFdmVudHNcbiAgICAgIDogZGVsZXRlIGVbbmFtZV07XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFO1xuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuZXhwb3J0IGNvbnN0IFBSRUZJWCA9ICdhb24nO1xyXG5cclxuZXhwb3J0IGNvbnN0IEJSRUFLUE9JTlRTID0gWyd4cycsICdzbScsICdtZCcsICdsZycsICd4bCcsICdkeCcsICd0eCddO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyAkZG9jdW1lbnQgfSBmcm9tICcuLi91dGlsaXRpZXMvX2hlbHBlcnMnO1xyXG5cclxuZnVuY3Rpb24gYWN0aXZhdGVCdXR0b25Mb2FkZXIoZTogT2JqZWN0LCBvYmo6IEpRdWVyeSkge1xyXG4gICAgY29uc3QgJHRoaXMgPSAkKG9iaik7XHJcbiAgICAkdGhpcy5hZGRDbGFzcygnZGlzYWJsZWQgc2hvdy1idG4tbG9hZGVyJykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGVhY3RpdmF0ZUJ1dHRvbkxvYWRlcihlOiBPYmplY3QsIG9iajogSlF1ZXJ5KSB7XHJcbiAgICBjb25zdCAkdGhpcyA9ICQob2JqKTtcclxuICAgICR0aGlzLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCBzaG93LWJ0bi1sb2FkZXInKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpO1xyXG59XHJcblxyXG4kZG9jdW1lbnQub24oJ2FjdGl2YXRlQnV0dG9uTG9hZGVyJywgYWN0aXZhdGVCdXR0b25Mb2FkZXIpO1xyXG4kZG9jdW1lbnQub24oJ2RlYWN0aXZhdGVCdXR0b25Mb2FkZXInLCBkZWFjdGl2YXRlQnV0dG9uTG9hZGVyKTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLypcclxuIFRoaXMgaXMgYSBnZW5lcmFsIGluaXRpYWxpemF0aW9uIG9mIFNsaWNrLmpzIGNhcm91c2Vscy5cclxuIERvY3VtZW50YXRpb246IGh0dHA6Ly9rZW53aGVlbGVyLmdpdGh1Yi5pby9zbGljay9cclxuXHJcbiBDdXN0b20gY29uZmlndXJhdGlvbiBpcyBwYXNzZWQgaW4gdXNpbmcgdGhlIGRhdGEtY2Fyb3VzZWwgYXR0cmlidXRlLiBPcHRpb25zIGFyZSBtZXJnZWQgd2l0aCBkZWZhdWx0cyBmb3VuZCBiZWxvdy5cclxuICovXHJcblxyXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ2xvZGFzaCc7XHJcblxyXG5pbXBvcnQgeyBwcmVmaXgsIG9uUmVhZHksICRkb2N1bWVudCB9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycyc7XHJcblxyXG5mdW5jdGlvbiBpbml0aWFsaXplQ2Fyb3VzZWwoKSB7XHJcbiAgICBjb25zdCAkY2Fyb3VzZWxzID0gJCgnW2RhdGEtY2Fyb3VzZWxdJyk7XHJcbiAgICAkY2Fyb3VzZWxzLmVhY2goKGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3QgJGNhcm91c2VsID0gJGNhcm91c2Vscy5lcShpbmRleCksXHJcbiAgICAgICAgICAgICAgJHByZXYgPSAkY2Fyb3VzZWwuZmluZCgnW2RhdGEtanM9XCJjYXJvdXNlbC1wcmV2XCJdJykuZGV0YWNoKCksXHJcbiAgICAgICAgICAgICAgJG5leHQgPSAkY2Fyb3VzZWwuZmluZCgnW2RhdGEtanM9XCJjYXJvdXNlbC1uZXh0XCJdJykuZGV0YWNoKCk7XHJcblxyXG4gICAgICAgICRjYXJvdXNlbFxyXG4gICAgICAgICAgICAub24oJ2luaXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAkY2Fyb3VzZWwuYXBwZW5kKCRwcmV2LCAkbmV4dCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5zbGljayhtZXJnZShcclxuICAgICAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHNwZWVkOiAzMDAsXHJcbiAgICAgICAgICAgICAgICAgICAgZG90czogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBhcnJvd3M6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9iaWxlRmlyc3Q6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Nob3c6IDMsXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpcGVUb1NsaWRlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNsaWRlOiAnW2RhdGEtanM9XCJjYXJvdXNlbC1zbGlkZVwiXScsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJldkFycm93OiAkcHJldixcclxuICAgICAgICAgICAgICAgICAgICBuZXh0QXJyb3c6ICRuZXh0XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgJGNhcm91c2VsLmRhdGEoJ2Nhcm91c2VsJykgfHwge31cclxuICAgICAgICAgICAgKSk7XHJcbiAgICB9KVxyXG4gICAgLnJlbW92ZUF0dHIoJ2RhdGEtY2Fyb3VzZWwnKTtcclxufVxyXG5cclxub25SZWFkeSgoKSA9PiB7XHJcbiAgICBjb25zdCAkY2Fyb3VzZWxzID0gJCgnW2RhdGEtY2Fyb3VzZWxdJyk7XHJcblxyXG4gICAgaWYgKCEhJGNhcm91c2Vscy5sZW5ndGgpIHtcclxuICAgICAgICBpbml0aWFsaXplQ2Fyb3VzZWwoKTtcclxuICAgIH1cclxufSk7XHJcblxyXG4kZG9jdW1lbnQub24oJ2luaXRpYWxpemVDYXJvdXNlbCcsIGluaXRpYWxpemVDYXJvdXNlbCk7XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7ICRkb2N1bWVudCB9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycyc7XHJcblxyXG5mdW5jdGlvbiBvcGVuTmF2KCkge1xyXG4gICAgY29uc3QgJG92ZXJsYXkgPSAkKCcjbXlOYXYnKSxcclxuICAgICAgICAgICRpZnJhbWUgPSAkb3ZlcmxheS5maW5kKCdpZnJhbWUnKTtcclxuICAgICRvdmVybGF5LmNzcygnd2lkdGgnLCAnMTAwJScpO1xyXG4gICAgJGlmcmFtZS5hdHRyKCdzcmMnLCAkaWZyYW1lLmF0dHIoJ3NyYycpICsgJyZhbXA7YXV0b3BsYXk9dHJ1ZScpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9zZU5hdigpIHtcclxuXHJcbiAgICBjb25zdCAkb3ZlcmxheSA9ICQoJyNteU5hdicpLFxyXG4gICAgICAgICAgJGlmcmFtZSA9ICRvdmVybGF5LmZpbmQoJ2lmcmFtZScpO1xyXG4gICAgJGlmcmFtZS5hdHRyKCdzcmMnLCAkaWZyYW1lLmF0dHIoJ3NyYycpLnJlcGxhY2UoJyZhbXA7YXV0b3BsYXk9dHJ1ZScsICcnKSk7XHJcbiAgICAkb3ZlcmxheS5jc3MoJ3dpZHRoJywgJzAlJyk7XHJcbn1cclxuXHJcbiQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuYW9uLXZpZGVvLW92ZXJsYXknLCBvcGVuTmF2KTtcclxuJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5jbG9zZS12aWRlby1vdmVybGF5JywgY2xvc2VOYXYpO1xyXG5cclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHsgJGRvY3VtZW50IH0gZnJvbSAnLi4vdXRpbGl0aWVzL19oZWxwZXJzJztcclxuXHJcbmZ1bmN0aW9uIEFjdGl2YXRlUGFnZUxldmVsTG9hZGVyKCkge1xyXG4gICAgJCgnI3BhZ2Vfb3ZlcmxheScpLnNob3coKTtcclxufVxyXG5cclxuZnVuY3Rpb24gRGVhY3RpdmF0ZVBhZ2VMZXZlbExvYWRlcigpIHtcclxuICAgICQoJyNwYWdlX292ZXJsYXknKS5oaWRlKCk7XHJcbn1cclxuXHJcbiQoZG9jdW1lbnQpLm9uKCdhY3RpdmF0ZVBhZ2VMb2FkZXInLCBBY3RpdmF0ZVBhZ2VMZXZlbExvYWRlcik7XHJcbiQoZG9jdW1lbnQpLm9uKCdkZWFjdGl2YXRlUGFnZUxvYWRlcicsIERlYWN0aXZhdGVQYWdlTGV2ZWxMb2FkZXIpO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyBvblJlc2l6ZSwgb25SZWFkeSwgaXNCcmVha3BvaW50QW5kRG93biwgJGRvY3VtZW50IH0gZnJvbSAnLi4vdXRpbGl0aWVzL19oZWxwZXJzJztcclxuXHJcbmxldCAkc3RlcHMgPSAkKCdbZGF0YS1qcz1cInByb2dyZXNzLXN0ZXBzXCJdJyksXHJcbiAgICBpc1Jlc2l6ZUV2ZW50QXR0YWNoZWQgPSBmYWxzZTtcclxuXHJcbmZ1bmN0aW9uIGFkanVzdCgpOiB2b2lkIHtcclxuICAgICRzdGVwcyA9ICQoJ1tkYXRhLWpzPVwicHJvZ3Jlc3Mtc3RlcHNcIl0nKTtcclxuICAgIGNvbnN0IGlzTW9iaWxlID0gaXNCcmVha3BvaW50QW5kRG93bignbWQnKTtcclxuXHJcbiAgICAkc3RlcHMuZWFjaCgoaW5kZXgsIGVsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgJGVsID0gJChlbCk7XHJcblxyXG4gICAgICAgICRlbC5jc3MoeydtYXJnaW4tdG9wJzogaXNNb2JpbGUgPyAoJGVsLmZpbmQoJ1tkYXRhLWpzPVwicHJvZ3Jlc3Mtc3RlcC1hY3RpdmVcIl0nKS5vdXRlckhlaWdodCgpICsgJ3B4JykgOiAwfSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuaWYgKCEhJHN0ZXBzLmxlbmd0aCkge1xyXG4gICAgb25SZWFkeShhZGp1c3QpO1xyXG4gICAgb25SZXNpemUoYWRqdXN0KTtcclxuICAgIGlzUmVzaXplRXZlbnRBdHRhY2hlZCA9IHRydWU7XHJcbn0gZWxzZSB7XHJcbiAgICAkZG9jdW1lbnQub24oJ2luaXRpYWxpemVQcm9ncmVzc1N0ZXBzJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgYWRqdXN0KCk7XHJcbiAgICAgICAgaWYgKCFpc1Jlc2l6ZUV2ZW50QXR0YWNoZWQpIHtcclxuICAgICAgICAgICAgb25SZXNpemUoYWRqdXN0KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyBwcmVmaXgsICRkb2N1bWVudCB9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycyc7XHJcblxyXG4kZG9jdW1lbnQub24oe1xyXG4gICAgJ3Nob3cuYnMudGFiJzogKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICBjb25zdCAkdGFyZ2V0ID0gJChldnQudGFyZ2V0KTtcclxuICAgICAgICBjb25zdCAkcGFyZW50ID0gJHRhcmdldC5wYXJlbnRzKGAuJHtwcmVmaXgoJ3Byb3ZpZGVyLXJlc3VsdCcpfWApO1xyXG4gICAgICAgIGNvbnN0ICRjb2xsYXBzZSA9ICRwYXJlbnQuZmluZChgLiR7cHJlZml4KCdwcm92aWRlci1tYXBzJyl9YCk7XHJcbiAgICAgICAgY29uc3QgJHRhYnMgPSAkcGFyZW50LmZpbmQoJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXScpO1xyXG5cclxuICAgICAgICAvLyBGaXhlcyBidWcgd2hlcmUgcHJldmlvdXNseSBhY3RpdmF0ZWQgdGFicyBhcmUgbm8gbG9uZ2VyIGNsaWNrYWJsZVxyXG4gICAgICAgICR0YWJzLm5vdCgkdGFyZ2V0KS5yZW1vdmVDbGFzcygnYWN0aXZlJykuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xyXG5cclxuICAgICAgICAkY29sbGFwc2UuY29sbGFwc2UoJ3Nob3cnKTtcclxuICAgIH0sXHJcbiAgICAnaGlkZS5icy5jb2xsYXBzZSc6IChldnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgJHRhcmdldCA9ICQoZXZ0LnRhcmdldCk7XHJcbiAgICAgICAgY29uc3QgJHBhcmVudCA9ICR0YXJnZXQucGFyZW50cyhgLiR7cHJlZml4KCdwcm92aWRlci1yZXN1bHQnKX1gKTtcclxuICAgICAgICBjb25zdCAkdGFicyA9ICRwYXJlbnQuZmluZCgnW2RhdGEtdG9nZ2xlPVwidGFiXCJdJyk7XHJcblxyXG4gICAgICAgICR0YWJzLnJlbW92ZUNsYXNzKCdhY3RpdmUnKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XHJcbiAgICB9XHJcbn0sIGAuJHtwcmVmaXgoJ3Byb3ZpZGVyLXJlc3VsdCcpfWApO1xyXG5cclxuJGRvY3VtZW50Lm9uKHtcclxuICAgICdzaG93LmJzLnRhYic6IChldnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgJHRhcmdldCA9ICQoZXZ0LnRhcmdldCk7XHJcbiAgICAgICAgY29uc3QgJHBhcmVudCA9ICR0YXJnZXQucGFyZW50cyhgLiR7cHJlZml4KCdwcm92aWRlci1yZXN1bHRzJyl9YCk7XHJcbiAgICAgICAgY29uc3QgJGNvbGxhcHNlID0gJHBhcmVudC5maW5kKGAuJHtwcmVmaXgoJ3Byb3ZpZGVyLW1hcHMnKX1gKTtcclxuICAgICAgICBjb25zdCAkdGFicyA9ICRwYXJlbnQuZmluZCgnW2RhdGEtdG9nZ2xlPVwidGFiXCJdJyk7XHJcblxyXG4gICAgICAgIC8vIEZpeGVzIGJ1ZyB3aGVyZSBwcmV2aW91c2x5IGFjdGl2YXRlZCB0YWJzIGFyZSBubyBsb25nZXIgY2xpY2thYmxlXHJcbiAgICAgICAgJHRhYnMubm90KCR0YXJnZXQpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XHJcblxyXG4gICAgICAgICRjb2xsYXBzZS5jb2xsYXBzZSgnc2hvdycpO1xyXG4gICAgfSxcclxuICAgICdoaWRlLmJzLmNvbGxhcHNlJzogKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICBjb25zdCAkdGFyZ2V0ID0gJChldnQudGFyZ2V0KTtcclxuICAgICAgICBjb25zdCAkcGFyZW50ID0gJHRhcmdldC5wYXJlbnRzKGAuJHtwcmVmaXgoJ3Byb3ZpZGVyLXJlc3VsdHMnKX1gKTtcclxuICAgICAgICBjb25zdCAkdGFicyA9ICRwYXJlbnQuZmluZCgnW2RhdGEtdG9nZ2xlPVwidGFiXCJdJyk7XHJcblxyXG4gICAgICAgICR0YWJzLnJlbW92ZUNsYXNzKCdhY3RpdmUnKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XHJcbiAgICB9XHJcbn0sIGAuJHtwcmVmaXgoJ2NvbGxhcHNlJyl9IC4ke3ByZWZpeCgncmVzdWx0Jyl9YCk7XHJcblxyXG4kZG9jdW1lbnQub24oJ2NsaWNrJywgYC4ke3ByZWZpeCgncHJvdmlkZXItcmVzdWx0Jyl9IGlucHV0W3R5cGU9XCJyYWRpb1wiXSwgLiR7cHJlZml4KCdwcm92aWRlci1yZXN1bHRzJyl9IGlucHV0W3R5cGU9XCJyYWRpb1wiXWAsIChldnQ6IEV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCAkdGFyZ2V0ID0gJChldnQudGFyZ2V0KTtcclxuICAgIGNvbnN0ICRwYXJlbnQgPSAkdGFyZ2V0LnBhcmVudHMoYC4ke3ByZWZpeCgncHJvdmlkZXItbG9jYXRpb24nKX1gKTtcclxuXHJcbiAgICAkcGFyZW50LmZpbmQoJ1tkYXRhLXRvZ2dsZV0nKS50cmlnZ2VyKCdjbGljaycpO1xyXG59KTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHsgJGRvY3VtZW50IH0gZnJvbSAnLi4vdXRpbGl0aWVzL19oZWxwZXJzJztcclxuXHJcbiRkb2N1bWVudC5vbignY2xpY2snLCAnW2RhdGEtanM9XCJyZXNwb25zZVwiXScsIChldnQ6IEV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCAkdGFyZ2V0ID0gJChldnQudGFyZ2V0KTtcclxuXHJcbiAgICBpZiAoJHRhcmdldC5pcygnW2RhdGEtanM9XCJyZXNwb25zZVwiXScpKSB7XHJcbiAgICAgICAgJHRhcmdldC5jaGlsZHJlbigpLnRyaWdnZXIoJ2NsaWNrJyk7XHJcbiAgICB9XHJcbn0pO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyRkb2N1bWVudH0gZnJvbSAnLi4vdXRpbGl0aWVzL19oZWxwZXJzJ1xyXG5cclxubGV0ICRzZWFyY2hJbnB1dHMgPSAkKCcjYW9uLXByb3ZpZGVyLXNlYXJjaCwgI2Fvbi1tZWRpY2F0aW9uLXNlYXJjaCcpLm5vdCgnLnR5cGVhaGVhZC1pbml0aWFsaXplZCcpO1xyXG5cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZVR5cGVBaGVhZCgpIHtcclxuICAkc2VhcmNoSW5wdXRzID0gJCgnI2Fvbi1wcm92aWRlci1zZWFyY2gsICNhb24tbWVkaWNhdGlvbi1zZWFyY2gnKS5ub3QoJy50eXBlYWhlYWQtaW5pdGlhbGl6ZWQnKTtcclxuXHJcbiAgICAkc2VhcmNoSW5wdXRzLnR5cGVhaGVhZCh7XHJcbiAgICAgIHNvdXJjZTogWydBZmdoYW5pc3RhbicsICdBbGJhbmlhJywgJ0FsZ2VyaWEnLCAnQW5kb3JyYScsICdBbmdvbGEnLCAnQW5ndWlsbGEnLCAnQW50aWd1YSAmIEJhcmJ1ZGEnLFxyXG4gICAgICAgICAgICAgICAgJ0FyZ2VudGluYScsICdBcm1lbmlhJywgJ0F1c3RyYWxpYScsICdBdXN0cmlhJywgJ0F6ZXJiYWlqYW4nLCAnQmFoYW1hcycsICdCYWhyYWluJyxcclxuICAgICAgICAgICAgICAgICdCYW5nbGFkZXNoJywgJ0JhcmJhZG9zJywgJ0JlbGFydXMnLCAnQmVsZ2l1bScsICdCZWxpemUnLCAnQmVuaW4nLCAnQmVybXVkYScsICdCaHV0YW4nLFxyXG4gICAgICAgICAgICAgICAgJ0JvbGl2aWEnLCAnQm9zbmlhICYgSGVyemVnb3ZpbmEnLCAnQm90c3dhbmEnLCAnQnJhemlsJywgJ0JydW5laSBEYXJ1c3NhbGFtJywgJ0J1bGdhcmlhJyxcclxuICAgICAgICAgICAgICAgICdCdXJraW5hIEZhc28nLCAnTXlhbm1hci9CdXJtYScsICdCdXJ1bmRpJywgJ0NhbWJvZGlhJywgJ0NhbWVyb29uJywgJ0NhbmFkYScsICdDYXBlIFZlcmRlJyxcclxuICAgICAgICAgICAgICAgICdDYXltYW4gSXNsYW5kcycsICdDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMnLCAnQ2hhZCcsICdDaGlsZScsICdDaGluYScsICdDb2xvbWJpYScsICdDb21vcm9zJyxcclxuICAgICAgICAgICAgICAgICdDb25nbycsICdDb3N0YSBSaWNhJywgJ0Nyb2F0aWEnLCAnQ3ViYScsICdDeXBydXMnLCAnQ3plY2ggUmVwdWJsaWMnLFxyXG4gICAgICAgICAgICAgICAgJ0RlbW9jcmF0aWMgUmVwdWJsaWMgb2YgdGhlIENvbmdvJywgJ0Rlbm1hcmsnLCAnRGppYm91dGknLCAnRG9taW5pY2FuIFJlcHVibGljJywgJ0RvbWluaWNhJyxcclxuICAgICAgICAgICAgICAgICdFY3VhZG9yJywgJ0VneXB0JywgJ0VsIFNhbHZhZG9yJywgJ0VxdWF0b3JpYWwgR3VpbmVhJywgJ0VyaXRyZWEnLCAnRXN0b25pYScsICdFdGhpb3BpYScsXHJcbiAgICAgICAgICAgICAgICAnRmlqaScsICdGaW5sYW5kJywgJ0ZyYW5jZScsICdGcmVuY2ggR3VpYW5hJywgJ0dhYm9uJywgJ0dhbWJpYScsICdHZW9yZ2lhJywgJ0dlcm1hbnknLFxyXG4gICAgICAgICAgICAgICAgJ0doYW5hJywgJ0dyZWF0IEJyaXRhaW4nLCAnR3JlZWNlJywgJ0dyZW5hZGEnLCAnR3VhZGVsb3VwZScsICdHdWF0ZW1hbGEnLCAnR3VpbmVhJyxcclxuICAgICAgICAgICAgICAgICdHdWluZWEtQmlzc2F1JywgJ0d1eWFuYScsICdIYWl0aScsICdIb25kdXJhcycsICdIdW5nYXJ5JywgJ0ljZWxhbmQnLCAnSW5kaWEnLFxyXG4gICAgICAgICAgICAgICAgJ0luZG9uZXNpYScsICdJcmFuJywgJ0lyYXEnLCAnSXRhbHknLFxyXG4gICAgICAgICAgICAgICAgJ0phbWFpY2EnLCAnSmFwYW4nLCAnSm9yZGFuJywgJ0themFraHN0YW4nLCAnS2VueWEnLCAnS29zb3ZvJywgJ0t1d2FpdCcsICdMYW9zJyxcclxuICAgICAgICAgICAgICAgICdMYXR2aWEnLCAnTGViYW5vbicsICdMZXNvdGhvJywgJ0xpYmVyaWEnLCAnTGlieWEnLCAnTGllY2h0ZW5zdGVpbicsICdMaXRodWFuaWEnLFxyXG4gICAgICAgICAgICAgICAgJ0x1eGVtYm91cmcnLCAnUmVwdWJsaWMgb2YgTWFjZWRvbmlhJywgJ01hZGFnYXNjYXInLCAnTWFsYXdpJywgJ01hbGF5c2lhJywgJ01hbGRpdmVzJyxcclxuICAgICAgICAgICAgICAgICdNYWxpJywgJ01hbHRhJywgJ01hcnRpbmlxdWUnLCAnTWF1cml0YW5pYScsICdNYXVyaXRpdXMnLCAnTWF5b3R0ZScsICdNZXhpY28nLCAnTW9uYWNvJyxcclxuICAgICAgICAgICAgICAgICdNb25nb2xpYScsICdNb250ZW5lZ3JvJywgJ01vbnRzZXJyYXQnLCAnTW9yb2NjbycsICdNb3phbWJpcXVlJywgJ05hbWliaWEnLCAnTmVwYWwnLFxyXG4gICAgICAgICAgICAgICAgJ05ldGhlcmxhbmRzJywgJ05ldyBaZWFsYW5kJywgJ05pY2FyYWd1YScsICdOaWdlcicsICdOaWdlcmlhJywgJ05vcndheScsICdPbWFuJyxcclxuICAgICAgICAgICAgICAgICdQYWNpZmljIElzbGFuZHMnLCAnUGFraXN0YW4nLCAnUGFuYW1hJywgJ1BhcHVhIE5ldyBHdWluZWEnLCAnUGFyYWd1YXknLCAnUGVydScsXHJcbiAgICAgICAgICAgICAgICAnUGhpbGlwcGluZXMnLCAnUG9sYW5kJywgJ1BvcnR1Z2FsJywgJ1B1ZXJ0byBSaWNvJywgJ1FhdGFyJywgJ1JldW5pb24nLCAnUm9tYW5pYScsXHJcbiAgICAgICAgICAgICAgICAnUnVzc2lhbiBGZWRlcmF0aW9uJywgJ1J3YW5kYScsICdTYWludCBLaXR0cyBhbmQgTmV2aXMnLCAnU2FpbnQgTHVjaWEnLFxyXG4gICAgICAgICAgICAgICAgJ1NhaW50IFZpbmNlbnRcXCdzICYgR3JlbmFkaW5lcycsICdTYW1vYScsICdTYW8gVG9tZSBhbmQgUHJpbmNpcGUnLCAnU2F1ZGkgQXJhYmlhJyxcclxuICAgICAgICAgICAgICAgICdTZW5lZ2FsJywgJ1NlcmJpYScsICdTZXljaGVsbGVzJywgJ1NpZXJyYSBMZW9uZScsICdTaW5nYXBvcmUnLCAnU2xvdmVuaWEnLFxyXG4gICAgICAgICAgICAgICAgJ1NvbG9tb24gSXNsYW5kcycsICdTb21hbGlhJywgJ1NvdXRoIEFmcmljYScsICdTb3V0aCBTdWRhbicsICdTcGFpbicsICdTcmkgTGFua2EnLCAnU3VkYW4nLFxyXG4gICAgICAgICAgICAgICAgJ1N1cmluYW1lJywgJ1N3YXppbGFuZCcsICdTd2VkZW4nLCAnU3dpdHplcmxhbmQnLCAnU3lyaWEnLCAnVGFqaWtpc3RhbicsICdUYW56YW5pYScsXHJcbiAgICAgICAgICAgICAgICAnVGhhaWxhbmQnLCAnVGltb3IgTGVzdGUnLCAnVG9nbycsICdUcmluaWRhZCAmIFRvYmFnbycsICdUdW5pc2lhJywgJ1R1cmtleScsICdUdXJrbWVuaXN0YW4nLFxyXG4gICAgICAgICAgICAgICAgJ1R1cmtzICYgQ2FpY29zIElzbGFuZHMnLCAnVWdhbmRhJywgJ1VrcmFpbmUnLCAnVW5pdGVkIEFyYWIgRW1pcmF0ZXMnLFxyXG4gICAgICAgICAgICAgICAgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSAoVVNBKScsICdVcnVndWF5JywgJ1V6YmVraXN0YW4nLCAnVmVuZXp1ZWxhJywgJ1ZpZXRuYW0nLFxyXG4gICAgICAgICAgICAgICAgJ1ZpcmdpbiBJc2xhbmRzIChVSyknLCAnVmlyZ2luIElzbGFuZHMgKFVTKScsICdZZW1lbicsICdaYW1iaWEnLCAnWmltYmFid2UnXVxyXG4gICAgfSkuYWRkQ2xhc3MoJ3R5cGVhaGVhZC1pbml0aWFsaXplZCcpO1xyXG59XHJcblxyXG5pbml0aWFsaXplVHlwZUFoZWFkKCk7XHJcbiRkb2N1bWVudC5vbignaW5pdGlhbGl6ZVR5cGVBaGVhZCcsIGluaXRpYWxpemVUeXBlQWhlYWQpO1xyXG5cclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHsgZm9jdXMsIG9uU2Nyb2xsU3RvcCwgb25Mb2FkLCAkd2luZG93LCAkZG9jdW1lbnQsICRtYWluIH0gZnJvbSAnLi4vdXRpbGl0aWVzL19oZWxwZXJzJztcclxuXHJcbmxldCBzY3JvbGwgPSAwO1xyXG5cclxuJHdpbmRvdy5vbignaGFzaGNoYW5nZScsICgpID0+IHtcclxuICAgIGNvbnN0IGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcclxuICAgIGxldCAkZWwgPSAkbWFpbi5maW5kKGhhc2gpO1xyXG5cclxuICAgIGlmICghaGFzaCB8fCAhaGFzaC5zbGljZSgxKSB8fCAhJGVsLmxlbmd0aCkge1xyXG4gICAgICAgICRlbCA9ICRtYWluO1xyXG4gICAgfVxyXG5cclxuICAgICR3aW5kb3cuc2Nyb2xsVG9wKHNjcm9sbCk7XHJcblxyXG4gICAgJGVsLnZlbG9jaXR5KCdzY3JvbGwnLCB7XHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgc2Nyb2xsID0gJHdpbmRvdy5zY3JvbGxUb3AoKTtcclxuXHJcbiAgICAgICAgICAgIGZvY3VzKCRlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxuJGRvY3VtZW50Lm9uKCdjbGljaycsICdbaHJlZio9XCIjXCJdJywgKCkgPT4ge1xyXG4gICAgc2Nyb2xsID0gJHdpbmRvdy5zY3JvbGxUb3AoKTtcclxufSk7XHJcblxyXG5pZiAod2luZG93LmxvY2F0aW9uLmhhc2gubGVuZ3RoID4gMSkge1xyXG4gICAgb25TY3JvbGxTdG9wKCgpID0+IHtcclxuICAgICAgICBzY3JvbGwgPSAkd2luZG93LnNjcm9sbFRvcCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgb25Mb2FkKCgpID0+IHtcclxuICAgICAgICBzY3JvbGwgPSAkd2luZG93LnNjcm9sbFRvcCgpO1xyXG5cclxuICAgICAgICAkd2luZG93LnRyaWdnZXIoJ2hhc2hjaGFuZ2UnKTtcclxuICAgIH0pO1xyXG59XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbi8qXHJcbiBJZiB5b3Ugd2FudCBlbGVtZW50cyB0byBiZSBlcXVhbCBpbiBoZWlnaHQgYW5kIGZsZXhib3ggb3IgZml4ZWQgaGVpZ2h0IGFyZW4ndCBvcHRpb25zLlxyXG5cclxuIE9wdGlvbnMgYXJlIHBhc3NlZCB0byBhIHNlcmllcyBvZiBkYXRhIGF0dHJpYnV0ZXMsIG9ubHkgb25lIG9mIHdoaWNoIGlzIHJlcXVpcmVkLlxyXG5cclxuIFBhc3MgYSBzdHJpbmcgdmFsdWUgdG8gZGF0YS1lcXVhbC1ncm91cCBvbiBhbGwgZWxlbWVudHMgdGhhdCB5b3Ugd2FudCB0byBlcXVhbGl6ZS5cclxuXHJcbiBPcHRpb25hbGx5LCB5b3UgbWF5IHVzZSBkYXRhLWVxdWFsLW1pbiBhbmQvb3IgZGF0YS1lcXVhbC1tYXggdG8gdHVybiB0aGlzIGZ1bmN0aW9uYWxpdHkgb24vb2ZmIGF0IGNlcnRhaW4gYnJlYWtwb2ludHMuXHJcblxyXG4gQXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIGlmIHRoZSBlbGVtZW50cyBhcmUgaGlkZGVuIG9uIGxvYWQvcmVzaXplIHRoZXkgd2lsbCBiZSBza2lwcGVkLiBCdXQgdGhhdCBtZWFucyB0aGF0IHlvdSBtYXkgbmVlZCB0byBtYW51YWxseSB0cmlnZ2VyIHRoZSBlcXVhbGl6ZSBmdW5jdGlvbmFsaXR5IG9uIHNwZWNpZmljL2N1c3RvbSBldmVudHMuIFRoZSBleHBvcnRlZCBmdW5jdGlvbiBhY2NlcHRzIGEgc3RyaW5nIHdoaWNoIHNob3VsZCBtYXRjaCB0aGUgZ3JvdXAgbmFtZSwgdGhpcyBhbGxvd3MgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gZmlsdGVyIG91dCBhbGwgb3RoZXIgZWxlbWVudHMsIGFzIGFub3RoZXIgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IGZvckVhY2ggfSBmcm9tICdsb2Rhc2gnO1xyXG5cclxuaW1wb3J0IHsgb25SZWFkeSwgb25SZXNpemUsICRkb2N1bWVudCB9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycyc7XHJcblxyXG5sZXQgJGVscyA9ICQoJ1tkYXRhLWVxdWFsLWdyb3VwXScpO1xyXG5cclxuZnVuY3Rpb24gZXF1YWxpemVHcm91cCgkZ3JvdXA6IEpRdWVyeSk6IHZvaWQge1xyXG4gICAgJGdyb3VwID0gJGdyb3VwLmZpbHRlcignOnZpc2libGUnKTtcclxuXHJcbiAgICBpZiAoISEkZ3JvdXAubGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHRhbGxlc3QgPSAwO1xyXG5cclxuICAgICAgICAkZ3JvdXBcclxuICAgICAgICAgICAgLmNzcyh7J2hlaWdodCc6ICdhdXRvJ30pXHJcbiAgICAgICAgICAgIC5lYWNoKChpbmRleCwgZWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRlbCA9ICQoZWwpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWluID0gJGVsLmRhdGEoJ2VxdWFsLW1pbicpIHx8IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXggPSAkZWwuZGF0YSgnZXF1YWwtbWF4JykgfHwgSW5maW5pdHk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID49IG1pbiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8PSBtYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHQgPSAkZWwub3V0ZXJIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodCA+IHRhbGxlc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFsbGVzdCA9IGhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jc3MoeydoZWlnaHQnOiB0YWxsZXN0IHx8ICdhdXRvJ30pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxpemUoZ3JvdXA6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZXF1YWxpemVHcm91cCgkZWxzLmZpbHRlcihgW2RhdGEtZXF1YWwtZ3JvdXA9JHtncm91cH1dYCkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZXNpemUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBncm91cHMgPSB7fTtcclxuXHJcbiAgICAkZWxzLmVhY2goKGluZGV4LCBlbCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRlbCA9ICQoZWwpO1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gJGVsLmRhdGEoJ2VxdWFsLWdyb3VwJyk7XHJcblxyXG4gICAgICAgIGdyb3Vwc1tncm91cF0gPSAhIWdyb3Vwc1tncm91cF0gPyBncm91cHNbZ3JvdXBdLmFkZCgkZWwpIDogJGVsO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhncm91cHMpLCAoZ3JvdXApID0+IGVxdWFsaXplR3JvdXAoZ3JvdXBzW2dyb3VwXSkpO1xyXG59XHJcblxyXG5pZiAoISEkZWxzLmxlbmd0aCkge1xyXG4gICAgcmVzaXplKCk7XHJcbiAgICBvblJlc2l6ZShyZXNpemUpO1xyXG59XHJcblxyXG4kZG9jdW1lbnQub24oJ2luaXRpYWxpemVFcXVhbEhlaWdodHMnLCBmdW5jdGlvbigpIHtcclxuICAgICRlbHMgPSAkKCdbZGF0YS1lcXVhbC1ncm91cF0nKTtcclxuXHJcbiAgICBpZiAoISEkZWxzLmxlbmd0aCkge1xyXG4gICAgICAgIHJlc2l6ZSgpO1xyXG4gICAgICAgIG9uUmVzaXplKHJlc2l6ZSk7XHJcbiAgICB9XHJcbn0pO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyBwcmVmaXgsICR3aW5kb3csICRodG1sLCAkZG9jdW1lbnQgfSBmcm9tICcuLi91dGlsaXRpZXMvX2hlbHBlcnMnO1xyXG5cclxuJGRvY3VtZW50Lm9uKCdjbGljaycsIGAuJHtwcmVmaXgoJ2ZvbnQtcmVzaXplJyl9YCwgKCkgPT4ge1xyXG4gICAgJGh0bWwudG9nZ2xlQ2xhc3MocHJlZml4KCdmb250LXNpemUtbGcnKSk7XHJcbiAgICAkaHRtbC5vbmUoJ3RyYW5zaXRpb25lbmQgb3RyYW5zaXRpb25lbmQgb1RyYW5zaXRpb25FbmQgbXNUcmFuc2l0aW9uRW5kIHdlYmtpdFRyYW5zaXRpb25FbmQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJHdpbmRvdy50cmlnZ2VyKCdyZXNpemUnKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59KTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLypcclxuIFRoaXMgaXMgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHBsYWNlaG9sZGVyIGxhYmVsIGVsZW1lbnQgd2hpY2ggc3dhcHMgc3RhdGUgb24gZm9jdXMgYW5kIHdoZW4gdGhlIGlucHV0IGhhcyBhIHZhbHVlLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IHByZWZpeCB9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycyc7XHJcblxyXG5jb25zdCAkaW5wdXRzID0gJChgLiR7cHJlZml4KCdwbGFjZWhvbGRlci1sYWJlbCcpfSAuZm9ybS1jb250cm9sYCk7IC8vIFRPRE86IFN3aXRjaCB0byBbZGF0YV1cclxuXHJcbmZ1bmN0aW9uIHRvZ2dsZShlbDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgJGlucHV0ID0gJChlbCk7XHJcblxyXG4gICAgJGlucHV0W2AkeyEhJGlucHV0LnZhbCgpID8gJ2FkZCcgOiAncmVtb3ZlJ31DbGFzc2BdKHByZWZpeCgnaG9sZGluZycpKTtcclxufVxyXG5cclxuaWYgKCEhJGlucHV0cy5sZW5ndGgpIHtcclxuICAgICRpbnB1dHNcclxuICAgICAgICAub24oJ2ZvY3VzIGJsdXIga2V5dXAgY2hhbmdlJywgKGV2dDogRXZlbnQpID0+IHRvZ2dsZShldnQuY3VycmVudFRhcmdldCBhcyBFbGVtZW50KSlcclxuICAgICAgICAuZWFjaCgoaW5kZXgsIGVsKSA9PiB0b2dnbGUoZWwpKTtcclxufVxyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyAkYm9keSB9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycyc7XHJcblxyXG4vKiBUT0RPOiBBZGQgW2RhdGEtYnlwYXNzLXByZXZlbnRdXHJcbiBQcmV2ZW50IGRlZmF1bHQgQm9vdHN0cmFwIGJlaGF2aW9yIGZyb20gd2l0aGluIGJ5IHVzaW5nIGRhdGEtcHJldmVudCBhdHRyaWJ1dGUgYW5kIHBhc3MgdGhlIGV2ZW50IHRvIGJlIHByZXZlbnRlZC5cclxuICovXHJcblxyXG4kYm9keS5vbignY2xpY2snLCAnW2RhdGEtcHJldmVudF0nLCAoZXZ0OiBFdmVudCkgPT4ge1xyXG4gICAgY29uc3QgJHRhcmdldCA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpO1xyXG4gICAgY29uc3QgZXZlbnQgPSAkdGFyZ2V0LmRhdGEoJ3ByZXZlbnQnKTtcclxuICAgIGNvbnN0ICRwYXJlbnQgPSAkKCR0YXJnZXQuY2xvc2VzdChldmVudC5zbGljZShldmVudC5sYXN0SW5kZXhPZignLicpKSkpOyAvLyBFeHRyYSBKUXVlcnkgd3JhcHBlciBkdWUgdG8gYW55W10gdHlwZWQgcmV0dXJuIGRlZmluaXRpb25cclxuXHJcbiAgICAkcGFyZW50Lm9uZShldmVudCwgKGU6IEV2ZW50KSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xyXG59KTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHskZG9jdW1lbnR9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycydcclxuXHJcbmZ1bmN0aW9uIHNob3dQYXNzd29yZCgpOiB2b2lkIHtcclxuICAgJGRvY3VtZW50Lm9uKCdjbGljaycsICdbZGF0YS1zaG93LXBhc3N3b3JkXScsIGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgIGNvbnN0IHNob3dQYXNzd29yZEZvciA9ICQodGhpcykuZGF0YSgnc2hvdy1wYXNzd29yZCcpLFxyXG4gICAgICAgICAgICAgJGxpbmtzID0gJCgnW2RhdGEtc2hvdy1wYXNzd29yZD1cIicgKyBzaG93UGFzc3dvcmRGb3IgKyAnXCJdJyksXHJcbiAgICAgICAgICAgICAkaW5wdXQgPSAkKCcjJyArIHNob3dQYXNzd29yZEZvcik7XHJcbiAgICAgICBpZiAoJGlucHV0LmF0dHIoJ3R5cGUnKSA9PT0gJ3RleHQnKSB7XHJcbiAgICAgICAgICAgICRpbnB1dC5hdHRyKCd0eXBlJywgJ3Bhc3N3b3JkJyk7XHJcbiAgICAgICAgICAgICRsaW5rcy50ZXh0KCdTaG93IFBhc3N3b3JkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJGlucHV0LmF0dHIoJ3R5cGUnLCAndGV4dCcpO1xyXG4gICAgICAgICAgICAkbGlua3MudGV4dCgnSGlkZSBQYXNzd29yZCcpO1xyXG4gICAgICAgIH1cclxuICAgfSk7XHJcbn1cclxuXHJcbnNob3dQYXNzd29yZCgpO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7JGRvY3VtZW50fSBmcm9tICcuLi91dGlsaXRpZXMvX2hlbHBlcnMnXHJcblxyXG5jb25zdCBkZWZhdWx0cyA9IHtcclxuICAgIHBsYWNlbWVudDogJ2JvdHRvbSdcclxufTtcclxuXHJcbiRkb2N1bWVudC5vbignaW5pdGlhbGl6ZVRvb2x0aXBzJywgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCAkdG9vbHRpcHMgPSAkKCdbZGF0YS10b2dnbGU9XCJ0b29sdGlwXCJdJyk7XHJcbiAgICAkdG9vbHRpcHMuZWFjaCgoaW5kZXgsIHRvb2x0aXApID0+IHtcclxuICAgICAgICBjb25zdCAkdG9vbHRpcCA9ICQodG9vbHRpcCk7XHJcbiAgICAgICAgJHRvb2x0aXAudG9vbHRpcChtZXJnZSh7fSwgZGVmYXVsdHMsICR0b29sdGlwLmRhdGEoJ3Rvb2x0aXAnKSkpO1xyXG4gICAgfSk7XHJcbn0pXHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7JGRvY3VtZW50fSBmcm9tICcuLi91dGlsaXRpZXMvX2hlbHBlcnMnXHJcblxyXG4kZG9jdW1lbnQub24oJ2lucHV0JywgJ1tkYXRhLXJlcGFzcy1mb3JdLCBbZGF0YS1yZS1lbnRlcmluZy1mb3JdJywgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCAkdGhpczogSlF1ZXJ5ID0gJCh0aGlzKSxcclxuICAgICAgICAkcGFzc3dvcmRGaWVsZDogSlF1ZXJ5ID0gJHRoaXMuZGF0YSgncmVwYXNzLWZvcicpID8gJCgnIycgKyAkdGhpcy5kYXRhKCdyZXBhc3MtZm9yJykpIDogJCgnIycgKyAkdGhpcy5kYXRhKCdyZS1lbnRlcmluZy1mb3InKSksXHJcbiAgICAgICAgcGFzc1ZhbHVlID0gJHBhc3N3b3JkRmllbGQudmFsKCksXHJcbiAgICAgICAgcmVwYXNzVmFsdWUgPSAkdGhpcy52YWwoKTtcclxuXHJcbiAgICBpZiAocGFzc1ZhbHVlID09PSByZXBhc3NWYWx1ZSAmJiBwYXNzVmFsdWUgIT09ICcnKSB7XHJcbiAgICAgICAgJHRoaXMuY2xvc2VzdCgnLmZvcm0tZ3JvdXAnKS5hZGRDbGFzcygnaXMtdmFsaWQtY2hlY2snKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgJHRoaXMuY2xvc2VzdCgnLmZvcm0tZ3JvdXAnKS5yZW1vdmVDbGFzcygnaXMtdmFsaWQtY2hlY2snKTtcclxuICAgIH1cclxufSk7XHJcblxyXG4kZG9jdW1lbnQub24oJ2lucHV0JywgJ2lucHV0W2lkXScsIGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgJHRoaXMgPSAkKHRoaXMpO1xyXG4gICAgaWYgKCQudHJpbSgkdGhpcy5wcm9wKCdpZCcpKSAhPT0gJycpIHtcclxuICAgICAgICBjb25zdCAkcmVwYXNzRmllbGQ6IEpRdWVyeSA9ICQoJ1tkYXRhLXJlcGFzcy1mb3I9XCInICsgJHRoaXMucHJvcCgnaWQnKSArICdcIl0sIFtkYXRhLXJlLWVudGVyaW5nLWZvcj1cIicgKyAkdGhpcy5wcm9wKCdpZCcpICsgJ1wiXScpO1xyXG4gICAgICAgIGlmICgkcmVwYXNzRmllbGQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXNzVmFsdWUgPSAkdGhpcy52YWwoKSxcclxuICAgICAgICAgICAgICAgICAgICByZXBhc3NWYWx1ZSA9ICRyZXBhc3NGaWVsZC52YWwoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwYXNzVmFsdWUgPT09IHJlcGFzc1ZhbHVlICYmIHBhc3NWYWx1ZSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICRyZXBhc3NGaWVsZC5jbG9zZXN0KCcuZm9ybS1ncm91cCcpLmFkZENsYXNzKCdpcy12YWxpZC1jaGVjaycpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJHJlcGFzc0ZpZWxkLmNsb3Nlc3QoJy5mb3JtLWdyb3VwJykucmVtb3ZlQ2xhc3MoJ2lzLXZhbGlkLWNoZWNrJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyRkb2N1bWVudH0gZnJvbSAnLi4vdXRpbGl0aWVzL19oZWxwZXJzJ1xyXG5cclxuaW50ZXJmYWNlIFZhbGlkYXRpb25SdWxlIHtcclxuICAgIHR5cGU6IHN0cmluZztcclxuICAgIG1ldGhvZDogRnVuY3Rpb25cclxufVxyXG5cclxuXHJcbmNvbnN0IHZhbGlkYXRpb25SdWxlczogVmFsaWRhdGlvblJ1bGVbXSA9IFtcclxuICAgIHtcclxuICAgICAgICAndHlwZSc6ICd1cHBlci1jYXNlLWNoYXJhY3RlcicsXHJcbiAgICAgICAgJ21ldGhvZCc6IGhhc1VwcGVyQ2FzZUNoYXJhY3RlclxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICAndHlwZSc6ICdsb3dlci1jYXNlLWNoYXJhY3RlcicsXHJcbiAgICAgICAgJ21ldGhvZCc6IGhhc0xvd2VyQ2FzZUNoYXJhY3RlclxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICAndHlwZSc6ICdudW1lcmljLWNoYXJhY3RlcicsXHJcbiAgICAgICAgJ21ldGhvZCc6IGhhc051bWJlclxyXG4gICAgfVxyXG5dO1xyXG5cclxuZnVuY3Rpb24gaGFzVXBwZXJDYXNlQ2hhcmFjdGVyKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwYXR0ZXJuID0gL1tBLVpdLztcclxuICAgIHJldHVybiBwYXR0ZXJuLnRlc3Qoc3RyKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFzTG93ZXJDYXNlQ2hhcmFjdGVyKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwYXR0ZXJuID0gL1thLXpdLztcclxuICAgIHJldHVybiBwYXR0ZXJuLnRlc3Qoc3RyKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFzTnVtYmVyKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwYXR0ZXJuID0gL1swLTldLztcclxuICAgIHJldHVybiBwYXR0ZXJuLnRlc3Qoc3RyKTtcclxufVxyXG5cclxuJGRvY3VtZW50Lm9uKCdpbnB1dCcsICdbZGF0YS12YWxpZGF0ZS1wYXNzd29yZC1jb25kaXRpb25zXScsIGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIGNvbnN0ICR0aGlzOiBKUXVlcnkgPSAkKHRoaXMpLFxyXG4gICAgICAgICRpbnB1dDogU3RyaW5nID0gJHRoaXMudmFsKCksXHJcbiAgICAgICAgJGNvbmRpdGlvbnM6IEpRdWVyeSA9ICQoJyMnICsgJHRoaXMuZGF0YSgndmFsaWRhdGUtcGFzc3dvcmQtY29uZGl0aW9ucycpKS5jaGlsZHJlbigpO1xyXG5cclxuICAgICRjb25kaXRpb25zLmVhY2goZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgJGNvbmRpdGlvbiA9ICQodGhpcyk7XHJcbiAgICAgICAgJC5lYWNoKHZhbGlkYXRpb25SdWxlcywgZnVuY3Rpb24oaW5kZXgsIHZhbGlkYXRpb25SdWxlKSB7XHJcbiAgICAgICAgICAgIGlmICgkY29uZGl0aW9uLmhhc0NsYXNzKHZhbGlkYXRpb25SdWxlLnR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblJ1bGUubWV0aG9kKCRpbnB1dCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAkY29uZGl0aW9uLmFkZENsYXNzKCdpcy12YWxpZC1jaGVjaycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAkY29uZGl0aW9uLnJlbW92ZUNsYXNzKCdpcy12YWxpZC1jaGVjaycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICgkY29uZGl0aW9ucy5sZW5ndGggPT09ICRjb25kaXRpb25zLmZpbHRlcignLmlzLXZhbGlkLWNoZWNrJykubGVuZ3RoKSB7XHJcbiAgICAgICAgJHRoaXMuY2xvc2VzdCgnLmZvcm0tZ3JvdXAnKS5hZGRDbGFzcygnaXMtdmFsaWQtY2hlY2snKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgJHRoaXMuY2xvc2VzdCgnLmZvcm0tZ3JvdXAnKS5yZW1vdmVDbGFzcygnaXMtdmFsaWQtY2hlY2snKTtcclxuICAgIH1cclxufSk7XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7JGJvZHl9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycydcclxuXHJcbiRib2R5Lm9uKCdjbGljaycsICdbZGF0YS10b2dnbGU9XCJ0YWJcIl0nLCAoZXZ0OiBFdmVudCkgPT4ge1xyXG4gICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2dC50YXJnZXQpLmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXScpO1xyXG5cclxuICAgICR0YXJnZXRcclxuICAgICAgICAudGFiKCdzaG93JylcclxuICAgICAgICAucGFyZW50cygnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nKVxyXG4gICAgICAgIC5zaWJsaW5ncygnLmNvbGxhcHNlJylcclxuICAgICAgICAuY29sbGFwc2UoJ3Nob3cnKTtcclxuXHJcbiAgICAkKCcuY29sbGFwc2UnLCAkdGFyZ2V0LnBhcmVudHMoJy5hb24tY29sbGFwc2UnKS5zaWJsaW5ncygnLmFvbi1jb2xsYXBzZScpKS5jb2xsYXBzZSgnaGlkZScpO1xyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxufSk7XHJcblxyXG4kYm9keS5vbignc2hvd24uYnMudGFiJywgJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXScsIChldnQ6IEV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCAkdGFyZ2V0ID0gJChldnQudGFyZ2V0KTtcclxuICAgIGxldCB0YXJnZXQgPSAkdGFyZ2V0LmRhdGEoJ3RhcmdldCcpO1xyXG5cclxuICAgIHRhcmdldCA9IHRhcmdldC5yZXBsYWNlKC8tY29udHJvbHMvLCAnJyk7XHJcblxyXG4gICAgJGJvZHkuZmluZChgW2RhdGEtdGFyZ2V0PVwiJHt0YXJnZXR9XCJdYCkudGFiKCdzaG93Jyk7XHJcbn0pO1xyXG5cclxuJGJvZHkub24oJ3Nob3duLmJzLnRhYicsICdbZGF0YS10b2dnbGU9XCJ0YWJcIl0nLCAoZXZ0OiBFdmVudCkgPT4ge1xyXG4gICAgY29uc3QgJHRhcmdldCA9ICQoZXZ0LnRhcmdldCk7XHJcbiAgICBsZXQgdGFyZ2V0ID0gJHRhcmdldC5kYXRhKCd0YXJnZXQnKTtcclxuXHJcbiAgICB0YXJnZXQgPSB0YXJnZXQucmVwbGFjZSgvLShvdXRwdXR8aW5wdXR8cmVtb3ZlKS8sICctY29udHJvbHMtJDEnKTtcclxuXHJcbiAgICAkYm9keS5maW5kKGBbZGF0YS10YXJnZXQ9XCIke3RhcmdldH1cIl1gKS50YWIoJ3Nob3cnKTtcclxufSk7XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7JGRvY3VtZW50fSBmcm9tICcuLi91dGlsaXRpZXMvX2hlbHBlcnMnXHJcblxyXG4kZG9jdW1lbnQub24oJ2NsaWNrJywgJ1tkYXRhLWpzPVwic2VhcmNoLWNsZWFyXCJdJywgZnVuY3Rpb24oKSB7XHJcbiAgICAkKCdbZGF0YS1qcz1cInNlYXJjaFwiXScpLnZhbCgnJyk7XHJcbn0pO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyBvblJlYWR5LCAkZG9jdW1lbnQsICR3aW5kb3cgfSBmcm9tICcuLi91dGlsaXRpZXMvX2hlbHBlcnMnO1xyXG5cclxuZnVuY3Rpb24gYWN0aXZhdGUoKTogdm9pZCB7XHJcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIGNvbnN0ICR0YWJzID0gJCgnW2RhdGEtdG9nZ2xlPVwidGFiXCJdJyk7XHJcbiAgICAgICAgJHRhYnMuZmlsdGVyKGBbZGF0YS10YXJnZXQ9XCIke3dpbmRvdy5sb2NhdGlvbi5oYXNofVwiXSwgW2hyZWYqPVwiJHt3aW5kb3cubG9jYXRpb24uaGFzaH1cIl1gKS50YWIoJ3Nob3cnKTtcclxuICAgIH1cclxufVxyXG5cclxuJGRvY3VtZW50Lm9uKCdhY3RpdmF0ZVJlbGV2YW50VGFiJywgYWN0aXZhdGUpO1xyXG5hY3RpdmF0ZSgpO1xyXG5cclxuLy8gQm9vdHN0cmFwIGRvZXNuJ3QgcHJvcGVybHkgdW5zZXQgdGFicyB3aGljaCBhcmVuJ3QgZ3JvdXBlZCBpbnRvIGEgc2luZ2xlIG5hdlxyXG4kZG9jdW1lbnQub24oJ3Nob3duLmJzLnRhYicsICdbZGF0YS10b2dnbGU9XCJ0YWJcIl0nLCAoKSA9PiB7XHJcbiAgICBjb25zdCAkcGFuZXMgPSAkKCcudGFiLXBhbmUnKTtcclxuICAgICRwYW5lcy5ub3QoJy5hY3RpdmUnKS5lYWNoKChpbmRleCwgZWwpID0+IHtcclxuICAgICAgICAkKGBbZGF0YS10YXJnZXQ9XCIjJHtlbC5pZH1cIl0sIFtocmVmKj1cIiMke2VsLmlkfVwiXWApLnJlbW92ZUNsYXNzKCdhY3RpdmUnKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XHJcbiAgICB9KTtcclxuICAgICR3aW5kb3cucmVzaXplKCk7XHJcbn0pO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG4vLyBFbGVtZW50c1xyXG5pbXBvcnQgJy4vZWxlbWVudHMvX2FuY2hvcic7XHJcbmltcG9ydCAnLi9lbGVtZW50cy9fZXF1YWxpemUnO1xyXG5pbXBvcnQgJy4vZWxlbWVudHMvX2ZvbnQtcmVzaXplJztcclxuaW1wb3J0ICcuL2VsZW1lbnRzL19wbGFjZWhvbGRlci1sYWJlbCc7XHJcbmltcG9ydCAnLi9lbGVtZW50cy9fcHJldmVudCc7XHJcbmltcG9ydCAnLi9lbGVtZW50cy9fdG9vbHRpcCc7XHJcbmltcG9ydCAnLi9lbGVtZW50cy9fc2hvdy1wYXNzd29yZCc7XHJcbmltcG9ydCAnLi9lbGVtZW50cy9fdmFsaWRhdGUtcGFzc3dvcmQtY29uZGl0aW9ucyc7XHJcbmltcG9ydCAnLi9lbGVtZW50cy9fdmFsaWRhdGUtcGFzcy1yZXBhc3MnO1xyXG5cclxuLy8gR3JvdXBzXHJcbmltcG9ydCAnLi9ncm91cHMvX3NlYXJjaCc7XHJcbmltcG9ydCAnLi9ncm91cHMvX3RhYnMnO1xyXG5pbXBvcnQgJy4vZ3JvdXBzL19lZGl0YWJsZS1jb250cm9scyc7XHJcblxyXG4vLyBDb21wb25lbnRzXHJcbmltcG9ydCAnLi9jb21wb25lbnRzL19jYXJvdXNlbCc7XHJcbmltcG9ydCAnLi9jb21wb25lbnRzL19xdWVyeSc7XHJcbmltcG9ydCAnLi9jb21wb25lbnRzL19wcm9ncmVzcy1zdGVwcyc7XHJcbmltcG9ydCAnLi9jb21wb25lbnRzL19wcm92aWRlci1yZXN1bHQnO1xyXG5pbXBvcnQgJy4vY29tcG9uZW50cy9fdHlwZS1haGVhZCc7XHJcbmltcG9ydCAnLi9jb21wb25lbnRzL19vdmVybGF5JztcclxuaW1wb3J0ICcuL2NvbXBvbmVudHMvX3BhZ2UtbGV2ZWwtbG9hZGVyJztcclxuaW1wb3J0ICcuL2NvbXBvbmVudHMvX2J1dHRvbi1sZXZlbC1sb2FkZXInO1xyXG5cclxuLy8gTW9kdWxlc1xyXG5pbXBvcnQgJy4vbW9kdWxlcy9faGVhZGVyJztcclxuaW1wb3J0ICcuL21vZHVsZXMvX2Zvb3Rlcic7XHJcbmltcG9ydCAnLi9tb2R1bGVzL19jaGF0JztcclxuXHJcbi8vIFBhZ2VzXHJcbmltcG9ydCAnLi9wYWdlcy9fc3R5bGUtZ3VpZGUnO1xyXG5pbXBvcnQgJy4vcGFnZXMvX2NsaWVudC1ob21lJztcclxuaW1wb3J0ICcuL3BhZ2VzL19jbGllbnQtdXBkYXRlLWluZm8nO1xyXG5pbXBvcnQgJy4vcGFnZXMvX2FwcG9pbnRtZW50LXVzZS1kaWZmZXJlbnQtbnVtYmVyJztcclxuaW1wb3J0ICcuL3BhZ2VzL19oaWRlLW15LWFjY291bnQtYWxlcnRzJztcclxuaW1wb3J0ICcuL3BhZ2VzL19hZGRfZWRpdF9wcm92aWRlcnMnO1xyXG5pbXBvcnQgJy4vcGFnZXMvX2NvbW11bmljYXRpb24tcHJlZmVyZW5jZXMnO1xyXG5pbXBvcnQgJy4vcGFnZXMvX2FjY291bnRfcG92JztcclxuXHJcbi8vIFRPRE86IFJlbW92ZSwgbm90IG5lZWRlZCBmb3IgcHJvZHVjdGlvbiBzaXRlXHJcbmltcG9ydCAnLi91dGlsaXRpZXMvX3VzZXInO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyBwcmVmaXgsIG9uUmVzaXplLCAkd2luZG93LCAkaHRtbCwgJGRvY3VtZW50IH0gZnJvbSAnLi4vdXRpbGl0aWVzL19oZWxwZXJzJztcclxuXHJcbmxldCAkaGVhZGVyOiBKUXVlcnksXHJcbiAgICAkbmF2VXRpbDogSlF1ZXJ5LFxyXG4gICAgJGNoYXQ6IEpRdWVyeSxcclxuICAgIGNoYXRFdmVudHNBdHRhY2hlZCA9IGZhbHNlO1xyXG5cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZUNoYXRWYXJpYWJsZXMoKSB7XHJcbiAgICAkaGVhZGVyID0gJChgLiR7cHJlZml4KCdoZWFkZXInKX1gKSxcclxuICAgICRuYXZVdGlsID0gJGhlYWRlci5maW5kKCdbZGF0YS1qcz1cIm5hdi11dGlsXCJdJyksXHJcbiAgICAkY2hhdCA9ICQoJ1tkYXRhLWpzPVwiY2hhdFwiXScpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGp1c3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCB3aWR0aCA9ICRjaGF0LmlzKCc6dmlzaWJsZScpID8gJGNoYXQub3V0ZXJXaWR0aCgpIDogMDtcclxuXHJcbiAgICAkaHRtbC5jc3MoeydtYXJnaW4tcmlnaHQnOiBgJHt3aWR0aH1weGB9KTtcclxuXHJcbiAgICAkbmF2VXRpbC5jc3Moe3JpZ2h0OiBgJHt3aWR0aH1weGB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZUNoYXQoKSB7XHJcbiAgICBpbml0aWFsaXplQ2hhdFZhcmlhYmxlcygpO1xyXG5cclxuICAgIGlmICghISRjaGF0Lmxlbmd0aCAmJiAhY2hhdEV2ZW50c0F0dGFjaGVkKSB7XHJcbiAgICAgICAgJGRvY3VtZW50Lm9uKCdjbGljaycsICdbZGF0YS10b2dnbGU9XCJjaGF0XCJdJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAkY2hhdC50b2dnbGVDbGFzcyhwcmVmaXgoJ2hpZGRlbicpKTtcclxuXHJcbiAgICAgICAgICAgICR3aW5kb3cudHJpZ2dlcigncmVzaXplJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG9uUmVzaXplKGFkanVzdCk7XHJcblxyXG4gICAgICAgIGNoYXRFdmVudHNBdHRhY2hlZCA9IHRydWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbmluaXRpYWxpemVDaGF0KCk7XHJcbiRkb2N1bWVudC5vbignaW5pdGlhbGl6ZUhlYWRlcicsIGluaXRpYWxpemVDaGF0KTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHsgb25SZXNpemUsICR3aW5kb3csICRkb2N1bWVudCB9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycyc7XHJcblxyXG5mdW5jdGlvbiBwdXNoRm9vdGVyQmVsb3dWaWV3UG9ydCgpOiB2b2lkIHtcclxuICAgIGNvbnN0ICRmb290ZXIgPSAkKCdmb290ZXInKTtcclxuICAgICRmb290ZXIuY3NzKCdtYXJnaW4tdG9wJywgMCk7XHJcblxyXG4gICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJHdpbmRvdy5oZWlnaHQoKSxcclxuICAgICAgICBmb290ZXJUb3AgPSAkZm9vdGVyLm9mZnNldCgpLnRvcCxcclxuICAgICAgICBkaWZmID0gd2luZG93SGVpZ2h0IC0gZm9vdGVyVG9wO1xyXG4gICAgaWYgKGRpZmYgPiAwKSB7XHJcbiAgICAgICAgJGZvb3Rlci5jc3MoJ21hcmdpbi10b3AnLCAod2luZG93SGVpZ2h0IC0gZm9vdGVyVG9wKSArICdweCcpO1xyXG4gICAgfVxyXG59XHJcblxyXG5pZiAoISEkKCdmb290ZXInKS5sZW5ndGgpIHtcclxuICAgIHB1c2hGb290ZXJCZWxvd1ZpZXdQb3J0KCk7XHJcbiAgICBvblJlc2l6ZShwdXNoRm9vdGVyQmVsb3dWaWV3UG9ydCk7XHJcbn0gZWxzZSB7XHJcbiAgICAkZG9jdW1lbnQub24oJ2luaXRpYWxpemVGb290ZXInLCBwdXNoRm9vdGVyQmVsb3dWaWV3UG9ydCk7XHJcbn1cclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHsgcHJlZml4LCBmb2N1cywgb25SZWFkeSwgb25SZXNpemUsIGlzQnJlYWtwb2ludEFuZERvd24sICRodG1sLCAkbWFpbiwgJGRvY3VtZW50IH0gZnJvbSAnLi4vdXRpbGl0aWVzL19oZWxwZXJzJztcclxuXHJcbmxldCAkaGVhZGVyOiBKUXVlcnksXHJcbiAgICAkbmF2VXRpbDogSlF1ZXJ5LFxyXG4gICAgJHRvb2xiYXI6IEpRdWVyeSxcclxuICAgICRuYXZNYWluOiBKUXVlcnksXHJcbiAgICAkbWVudXM6IEpRdWVyeSxcclxuICAgICRzdWJNZW51czogSlF1ZXJ5LFxyXG4gICAgJHNlYXJjaDogSlF1ZXJ5LFxyXG4gICAgJGNsb3NlOiBKUXVlcnksXHJcbiAgICAkYWNjb3VudDogSlF1ZXJ5LFxyXG4gICAgJGFjY291bnRNZW51czogSlF1ZXJ5LFxyXG4gICAgJGFjY291bnRUb2dnbGU6IEpRdWVyeSxcclxuICAgICRhY2NvdW50VGFiOiBKUXVlcnksXHJcbiAgICAkdXNlckxvZ2dlZEluOiBKUXVlcnksXHJcbiAgICAkbm90aWZpY2F0aW9uczogSlF1ZXJ5LFxyXG4gICAgYWN0aXZlID0gMDtcclxuXHJcbmZ1bmN0aW9uIGluaXRpYWxpemVIZWFkZXJWYXJpYWJsZXMoKSB7XHJcbiAgICAkaGVhZGVyID0gJCgnLmFvbi1oZWFkZXInKTtcclxuICAgICRuYXZVdGlsID0gJGhlYWRlci5maW5kKCdbZGF0YS1qcz1cIm5hdi11dGlsXCJdJyk7XHJcbiAgICAkdG9vbGJhciA9ICRuYXZVdGlsLmZpbmQoJ1tkYXRhLWpzPVwibmF2LXV0aWwtdG9vbGJhclwiXScpO1xyXG4gICAgJG5hdk1haW4gPSAkaGVhZGVyLmZpbmQoJ1tkYXRhLWpzPVwibmF2LW1haW5cIl0nKTtcclxuICAgICRtZW51cyA9ICRoZWFkZXIuZmluZCgnW2RhdGEtanNePVwibWVudS1cIl0nKTtcclxuICAgICRzdWJNZW51cyA9ICRoZWFkZXIuZmluZCgnW2RhdGEtanNePVwic3ViLW1lbnUtXCJdJyk7XHJcbiAgICAkc2VhcmNoID0gJG1lbnVzLmZpbHRlcignW2RhdGEtanM9XCJtZW51LXNlYXJjaFwiXScpO1xyXG4gICAgJGNsb3NlID0gJGhlYWRlci5maW5kKCdbZGF0YS1qcz1cIm1lbnUtY2xvc2VcIl0sIFtkYXRhLWpzPVwic2VhcmNoLWNhbmNlbFwiXScpO1xyXG4gICAgJGFjY291bnQgPSAkbWVudXMuZmlsdGVyKCdbZGF0YS1qcz1cIm1lbnUtYWNjb3VudFwiXScpO1xyXG4gICAgJGFjY291bnRNZW51cyA9ICRoZWFkZXIuZmluZCgnW2RhdGEtanM9XCJhY2NvdW50LWFjdGl2aXR5XCJdLCBbZGF0YS1qcz1cImFjY291bnQtbWVudVwiXScpO1xyXG4gICAgJGFjY291bnRUb2dnbGUgPSAkbmF2VXRpbC5maW5kKCdbZGF0YS10b2dnbGU9XCJhY2NvdW50LWFjdGl2aXR5XCJdJyk7XHJcbiAgICAkYWNjb3VudFRhYiA9ICRuYXZVdGlsLmZpbmQoJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXScpO1xyXG4gICAgJHVzZXJMb2dnZWRJbiA9ICRuYXZVdGlsLmZpbmQoJ1tkYXRhLWpzPVwidXNlci1sb2dnZWQtaW5cIl0nKTtcclxuICAgICRub3RpZmljYXRpb25zID0gJG5hdlV0aWwuZmluZCgnW2RhdGEtanM9XCJ1c2VyLW5vdGlmaWNhdGlvbnNcIl0nKTtcclxuICAgIGFjdGl2ZSA9IDA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkanVzdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0ICRhY3RpdmUgPSAkbWVudXMuZmlsdGVyKCcuc2hvdycpLFxyXG4gICAgICAgICAgYWRqID0ge1xyXG4gICAgICAgICAgICAgICAgdG9wOiAwLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiAwLFxyXG4gICAgICAgICAgICAgICAgbGVmdDogMFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgbGV0IGhhdCA9IDA7XHJcblxyXG4gICAgaWYgKGlzQnJlYWtwb2ludEFuZERvd24oJ21kJykpIHtcclxuICAgICAgICBhZGoudG9wICs9IE1hdGguZmxvb3IoJG5hdk1haW4ub3V0ZXJIZWlnaHQoKSk7XHJcblxyXG4gICAgICAgIGlmICghJG5vdGlmaWNhdGlvbnMuaGFzQ2xhc3MocHJlZml4KCdoaWRkZW4nKSkpIHtcclxuICAgICAgICAgICAgYWRqLnRvcCArPSAoaGF0ID0gTWF0aC5mbG9vcigkbm90aWZpY2F0aW9ucy5vdXRlckhlaWdodCgpKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhZGouYm90dG9tICs9IE1hdGguZmxvb3IoJG5hdlV0aWwub3V0ZXJIZWlnaHQoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFkai5sZWZ0ICs9IE1hdGguZmxvb3IoJG5hdk1haW4ub3V0ZXJXaWR0aCgpKTtcclxuICAgIH1cclxuXHJcbiAgICAkaHRtbC5jc3Moe1xyXG4gICAgICAgICdtYXJnaW4tdG9wJzogYCR7YWRqLnRvcH1weGAsXHJcbiAgICAgICAgJ21hcmdpbi1ib3R0b20nOiBgJHthZGouYm90dG9tfXB4YCxcclxuICAgICAgICAnbWFyZ2luLWxlZnQnOiBgJHthZGoubGVmdH1weGBcclxuICAgIH0pO1xyXG5cclxuICAgICRuYXZVdGlsLmNzcyh7bGVmdDogYCR7YWRqLmxlZnR9cHhgfSk7XHJcblxyXG4gICAgJG5hdk1haW4uY3NzKHt0b3A6IGAke2hhdH1weGB9KTtcclxuXHJcbiAgICAkdXNlckxvZ2dlZEluLmNzcyh7d2lkdGg6ICR0b29sYmFyLm91dGVyV2lkdGgoKX0pO1xyXG5cclxuICAgIGlmICghISRhY3RpdmUubGVuZ3RoKSB7XHJcbiAgICAgICAgcmVzaXplTWVudSgkYWN0aXZlKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY2xvc2VNZW51KCk6IHZvaWQge1xyXG4gICAgY29uc3QgJGFjdGl2ZSA9ICRtZW51cy5maWx0ZXIoJy5zaG93Jyk7XHJcblxyXG4gICAgaWYgKCEhJGFjdGl2ZS5sZW5ndGgpIHtcclxuICAgICAgICAkYWN0aXZlLmNvbGxhcHNlKCdoaWRlJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc2l6ZU1lbnUoJG1lbnU6IEpRdWVyeSk6IHZvaWQge1xyXG4gICAgaWYgKGlzQnJlYWtwb2ludEFuZERvd24oJ21kJykpIHtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG5cclxuICAgICAgICBoZWlnaHQgLT0gJG5hdk1haW4ub3V0ZXJIZWlnaHQoKTtcclxuICAgICAgICBoZWlnaHQgLT0gJHRvb2xiYXIub3V0ZXJIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgaWYgKCEkdXNlckxvZ2dlZEluLmhhc0NsYXNzKHByZWZpeCgnaGlkZGVuJykpKSB7XHJcbiAgICAgICAgICAgIGhlaWdodCAtPSAkdXNlckxvZ2dlZEluLm91dGVySGVpZ2h0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoISRub3RpZmljYXRpb25zLmhhc0NsYXNzKHByZWZpeCgnaGlkZGVuJykpKSB7XHJcbiAgICAgICAgICAgIGhlaWdodCAtPSAkbm90aWZpY2F0aW9ucy5vdXRlckhlaWdodCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQm9vdHN0cmFwIGZ1bmN0aW9uYWxpdHkgY29udHJvbHMgaGVpZ2h0XHJcbiAgICAgICAgJG1lbnUuY3NzKHtcclxuICAgICAgICAgICAgd2lkdGg6ICdhdXRvJyxcclxuICAgICAgICAgICAgJ21pbi1oZWlnaHQnOiBgJHtoZWlnaHR9cHhgLFxyXG4gICAgICAgICAgICAnbWF4LWhlaWdodCc6IGAke2hlaWdodH1weGBcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJHNlYXJjaC5jc3Moe3RvcDogJ2F1dG8nfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgICRtZW51LmNzcyh7XHJcbiAgICAgICAgICAgIHdpZHRoOiAkdG9vbGJhci5vdXRlcldpZHRoKCksXHJcbiAgICAgICAgICAgICdtaW4taGVpZ2h0JzogMCxcclxuICAgICAgICAgICAgJ21heC1oZWlnaHQnOiAnbm9uZSdcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZUhlYWRlcigpIHtcclxuICAgIGluaXRpYWxpemVIZWFkZXJWYXJpYWJsZXMoKTtcclxuICAgICRtZW51cy5vbih7XHJcbiAgICAgICAgJ3Nob3cuYnMuY29sbGFwc2UnOiAoZXZ0OiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCAkdGFyZ2V0ID0gJChldnQudGFyZ2V0KS5ub3QoJHN1Yk1lbnVzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghISR0YXJnZXQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmUrKztcclxuXHJcbiAgICAgICAgICAgICAgICAkaHRtbC5hZGRDbGFzcyhwcmVmaXgoJ2hlYWRlci1tZW51LWFjdGl2ZScpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjbG9zZU1lbnUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXNpemVNZW51KCR0YXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAnc2hvd24uYnMuY29sbGFwc2UnOiAoZXZ0OiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCAkdGFyZ2V0ID0gJChldnQudGFyZ2V0KS5ub3QoJHN1Yk1lbnVzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghISR0YXJnZXQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkaW5wdXQgPSAkdGFyZ2V0LmZpbmQoJ2lucHV0Jyk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9jdXMoISEkaW5wdXQubGVuZ3RoID8gJGlucHV0IDogJHRhcmdldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICdoaWRkZW4uYnMuY29sbGFwc2UnOiAoZXZ0OiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCAkdGFyZ2V0ID0gJChldnQudGFyZ2V0KS5ub3QoJHN1Yk1lbnVzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghISR0YXJnZXQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmUtLTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICRodG1sLnJlbW92ZUNsYXNzKHByZWZpeCgnaGVhZGVyLW1lbnUtYWN0aXZlJykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgJHN1Yk1lbnVzLm9uKCdzaG93LmJzLmNvbGxhcHNlJywgKCkgPT4gJHN1Yk1lbnVzLmZpbHRlcignLnNob3cnKS5jb2xsYXBzZSgnaGlkZScpKTtcclxuXHJcbiAgICAkYWNjb3VudFRvZ2dsZS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgJGFjY291bnQudG9nZ2xlQ2xhc3MocHJlZml4KCdiZy1yZWQnKSk7XHJcblxyXG4gICAgICAgICRhY2NvdW50TWVudXMudG9nZ2xlQ2xhc3MocHJlZml4KCdoaWRkZW4nKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAkYWNjb3VudFRhYi5vbignY2xpY2snLCAoZXZ0OiBFdmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2dC50YXJnZXQpLFxyXG4gICAgICAgICAgICAgIHRhcmdldCA9ICR0YXJnZXQuZGF0YSgndGFyZ2V0JyksXHJcbiAgICAgICAgICAgICAgJHRhYiA9ICQodGFyZ2V0KTtcclxuXHJcbiAgICAgICAgaWYgKCEhJHRhYi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY2xvc2VNZW51KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICsgKHdpbmRvdy5sb2NhdGlvbi5wb3J0ID8gJzonICsgd2luZG93LmxvY2F0aW9uLnBvcnQgOiB1bmRlZmluZWQpICsgJHRhcmdldC5hdHRyKCdocmVmJykgKyB0YXJnZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgJGNsb3NlLm9uKCdjbGljaycsIGNsb3NlTWVudSk7XHJcblxyXG4gICAgJG1haW4ub24oJ2NsaWNrJywgJG1haW4sIGNsb3NlTWVudSk7XHJcblxyXG4gICAgb25SZXNpemUoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRhY3RpdmUgPSAkbWVudXMuZmlsdGVyKCcuc2hvdycpO1xyXG5cclxuICAgICAgICBpZiAoISEkYWN0aXZlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXNpemVNZW51KCRhY3RpdmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWRqdXN0KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBvblJlYWR5KGFkanVzdCk7XHJcbn1cclxuXHJcbmlmICghISQoJy5hb24taGVhZGVyJykubGVuZ3RoKSB7XHJcbiAgICBpbml0aWFsaXplSGVhZGVyKClcclxufSBlbHNlIHtcclxuICAgICRkb2N1bWVudC5vbignaW5pdGlhbGl6ZUhlYWRlcicsIGluaXRpYWxpemVIZWFkZXIpO1xyXG59XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7JGRvY3VtZW50fSBmcm9tICcuLi91dGlsaXRpZXMvX2hlbHBlcnMnXHJcblxyXG4kZG9jdW1lbnQub24oJ2NoYW5nZScsICdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cImFjY291bnQtcG9hLWhhcy1zYW1lLWFkZHJlc3NcIl0nLCBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGlzRGlmZkFkZHJlc3MgPSAkKCdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cImFjY291bnQtcG9hLWhhcy1zYW1lLWFkZHJlc3NcIl0nKS5maWx0ZXIoJzpjaGVja2VkJykudmFsKCkgPT09ICd5ZXMnLFxyXG4gICAgICAgICAgJGRpZmZlcmVudE1haWxpbmdBZGRyZXNzID0gJCgnLm15LXByb2ZpbGUtcG92LWFkZHJlc3Mtcm93Jyk7XHJcblxyXG4gICAgaWYgKGlzRGlmZkFkZHJlc3MpIHtcclxuICAgICAgICAkZGlmZmVyZW50TWFpbGluZ0FkZHJlc3MucmVtb3ZlQ2xhc3MoJ2lzLXZpc2libGUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgJGRpZmZlcmVudE1haWxpbmdBZGRyZXNzLmFkZENsYXNzKCdpcy12aXNpYmxlJyk7XHJcbiAgICB9XHJcbn0pO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyAkZG9jdW1lbnQgfSBmcm9tICcuLi91dGlsaXRpZXMvX2hlbHBlcnMnO1xyXG5cclxuZnVuY3Rpb24gc2hvd0FsbFByb3ZpZGVyTG9jYXRpb25zKCR0aGlzOiBKUXVlcnkpIHtcclxuICAgICR0aGlzLmFkZENsYXNzKCdhbGwtbG9jYXRpb25zLXZpc2libGUnKTtcclxuICAgICR0aGlzLnRleHQoJHRoaXMuZGF0YSgnaGlkZS10ZXh0JykpO1xyXG4gICAgJCgnLmFvbi1wcm92aWRlci1sb2NhdGlvbicsICQoJHRoaXMucGFyZW50cygnLmFvbi1wcm92aWRlci1yZXN1bHQnKVswXSkpLmZhZGVJbigpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoaWRlT3RoZXJMb2NhdGlvbnMoJHRoaXM6IEpRdWVyeSkge1xyXG4gICAgJHRoaXMucmVtb3ZlQ2xhc3MoJ2FsbC1sb2NhdGlvbnMtdmlzaWJsZScpO1xyXG4gICAgJHRoaXMudGV4dCgkdGhpcy5kYXRhKCdzaG93LXRleHQnKSk7XHJcblxyXG4gICAgY29uc3QgJGxvY2F0aW9ucyA9ICQoJy5hb24tcHJvdmlkZXItbG9jYXRpb24nLCAkKCR0aGlzLnBhcmVudHMoJy5hb24tcHJvdmlkZXItcmVzdWx0JylbMF0pKSxcclxuICAgICAgICAgICRjaGVja2VkTG9jYXRpb24gPSAkKCdpbnB1dCcsICRsb2NhdGlvbnMpLmZpbHRlcignOmNoZWNrZWQnKTtcclxuXHJcbiAgICBpZiAoJGNoZWNrZWRMb2NhdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgJGxvY2F0aW9ucy5ub3QoJGNoZWNrZWRMb2NhdGlvbi5wYXJlbnRzKCcuYW9uLXByb3ZpZGVyLWxvY2F0aW9uJykpLmZhZGVPdXQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgJGxvY2F0aW9ucy5ub3QoJzpmaXJzdCcpLmZhZGVPdXQoKTtcclxuICAgIH1cclxufVxyXG5cclxuJGRvY3VtZW50Lm9uKCdjbGljaycsICcudmlldy1hbGwtbG9jYXRpb25zLWxpbmsnLCBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IHNob3VsZFNob3cgPSAhKCQodGhpcykuaGFzQ2xhc3MoJ2FsbC1sb2NhdGlvbnMtdmlzaWJsZScpKVxyXG4gICAgaWYgKHNob3VsZFNob3cpIHtcclxuICAgICAgICBzaG93QWxsUHJvdmlkZXJMb2NhdGlvbnMoJCh0aGlzKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGhpZGVPdGhlckxvY2F0aW9ucygkKHRoaXMpKTtcclxuICAgIH1cclxufSk7XHJcblxyXG5mdW5jdGlvbiBwcm92aWRlclJlc3VsdHNBZGRlZCgpIHtcclxuICAgIGNvbnN0IHZpZXdMb2NhdGlvbnNMaW5rcyA9ICQoJy52aWV3LWFsbC1sb2NhdGlvbnMtbGluaycpO1xyXG4gICAgdmlld0xvY2F0aW9uc0xpbmtzLm5vdCgnLmluaXRpYWxpemVkJykuZWFjaChmdW5jdGlvbihpLCBlKXtcclxuICAgICAgICBjb25zdCAkbG9jYXRpb25zID0gJCgnLmFvbi1wcm92aWRlci1sb2NhdGlvbicsICQoJChlKS5wYXJlbnRzKCcuYW9uLXByb3ZpZGVyLXJlc3VsdCcpWzBdKSksXHJcbiAgICAgICAgICAgICAgJGNoZWNrZWRpbnB1dCA9ICQoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXScsICRsb2NhdGlvbnMpLmZpbHRlcignOmNoZWNrZWQnKTtcclxuXHJcbiAgICAgICAgaWYgKCRjaGVja2VkaW5wdXQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCAkY2hlY2tlZExvY2F0aW9uID0gJGNoZWNrZWRpbnB1dC5wYXJlbnRzKCcuYW9uLXByb3ZpZGVyLWxvY2F0aW9uJykuZmlyc3QoKTtcclxuICAgICAgICAgICAgJGxvY2F0aW9ucy5ub3QoJGNoZWNrZWRMb2NhdGlvbikuaGlkZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICRsb2NhdGlvbnMubm90KCc6Zmlyc3QnKS5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2aWV3TG9jYXRpb25zTGlua3MuYWRkQ2xhc3MoJ2luaXRpYWxpemVkJyk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuJGRvY3VtZW50Lm9uKCdwcm92aWRlclJlc3VsdHNBZGRlZCcsIHByb3ZpZGVyUmVzdWx0c0FkZGVkKTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHskZG9jdW1lbnR9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycydcclxuXHJcblxyXG4kZG9jdW1lbnQub24oJ2NsaWNrJywgJy51c2UtZGlmZmVyZW50LW51bWJlcicsIGZ1bmN0aW9uKGUpIHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICBjb25zdCAkcGFyZW50ID0gJCh0aGlzKS5wYXJlbnRzKCcuYW9uLWFwcG9pbnRtZW50LWNvbmZpcm1lZC1ib3gtY29udGVudHMnKS5maXJzdCgpLFxyXG4gICAgICAgICAgICAkY3VycmVudE51bWJlclNlY3Rpb24gPSAkKCcuYW9uLWFwcG9pbnRtZW50LS1kZXRhaWxzJywgJHBhcmVudCksXHJcbiAgICAgICAgICAgICRkaWZmZXJudE51bWJlcmZvcm0gPSAkKCcuYW9uLXVzZS1kaWZmZXJlbnQtbnVtYmVyLWZvcm0nLCAkcGFyZW50KTtcclxuXHJcbiAgICAkY3VycmVudE51bWJlclNlY3Rpb24uaGlkZSgpO1xyXG4gICAgJGRpZmZlcm50TnVtYmVyZm9ybS5zaG93KCk7XHJcbn0pO1xyXG5cclxuJGRvY3VtZW50Lm9uKCdjbGljaycsICcuYW9uLXVzZS1kaWZmZXJlbnQtbnVtYmVyLWZvcm0gLmFvbi1jdGEnLCBmdW5jdGlvbihlKSB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgY29uc3QgJHBhcmVudCA9ICQodGhpcykucGFyZW50cygnLmFvbi1hcHBvaW50bWVudC1jb25maXJtZWQtYm94LWNvbnRlbnRzJykuZmlyc3QoKSxcclxuICAgICAgICAgICAgJGN1cnJlbnROdW1iZXJTZWN0aW9uID0gJCgnLmFvbi1hcHBvaW50bWVudC0tZGV0YWlscycsICRwYXJlbnQpLFxyXG4gICAgICAgICAgICAkZGlmZmVybnROdW1iZXJmb3JtID0gJCgnLmFvbi11c2UtZGlmZmVyZW50LW51bWJlci1mb3JtJywgJHBhcmVudCk7XHJcblxyXG4gICAgJGN1cnJlbnROdW1iZXJTZWN0aW9uLnNob3coKTtcclxuICAgICRkaWZmZXJudE51bWJlcmZvcm0uaGlkZSgpO1xyXG59KTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHskZG9jdW1lbnR9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycydcclxuXHJcbmxldCAkc3NuRm9ybSA9ICQoJy5zc24tZm9ybScpLFxyXG4gICAgJGV4Y2hhbmdlSURGb3JtID0gJCgnLmV4Y2hhbmdlLWlkLWZvcm0nKSxcclxuICAgICRleGlzdGluZ0FjY291bnRGb3JtQ29udGFpbmVyID0gJCgnLmV4aXN0aW5nLWFjY291bnQtZm9ybS0tY29udGFpbmVyJyksXHJcbiAgICAkY29tbW9uRm9ybUxhc3ROYW1lID0gJCgnLmNvbW1vbi1mb3JtLS1sYXN0LW5hbWUnKSxcclxuICAgICRjb21tb25Gb3JtRG9iQW5kWmlwID0gJCgnLmNvbW1vbi1mb3JtLS1kb2ItemlwJyksXHJcbiAgICAkY3JlYXRlQWNjb3VudEJ1dHRvbkNvbnRhaW5lciA9ICQoJy5jcmVhdGUtYWNjb3VudC1idXR0b24tY29udGFpbmVyJyksXHJcbiAgICAkbG9naW5CdXR0b25Db250YWluZXIgPSAkKCcubG9naW4tYnV0dG9uLWNvbnRhaW5lcicpO1xyXG5cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZVZhcmlhYmxlcygpIHtcclxuICAgICRzc25Gb3JtID0gJCgnLnNzbi1mb3JtJyksXHJcbiAgICAkZXhjaGFuZ2VJREZvcm0gPSAkKCcuZXhjaGFuZ2UtaWQtZm9ybScpLFxyXG4gICAgJGV4aXN0aW5nQWNjb3VudEZvcm1Db250YWluZXIgPSAkKCcuZXhpc3RpbmctYWNjb3VudC1mb3JtLS1jb250YWluZXInKSxcclxuICAgICRjb21tb25Gb3JtTGFzdE5hbWUgPSAkKCcuY29tbW9uLWZvcm0tLWxhc3QtbmFtZScpLFxyXG4gICAgJGNvbW1vbkZvcm1Eb2JBbmRaaXAgPSAkKCcuY29tbW9uLWZvcm0tLWRvYi16aXAnKSxcclxuICAgICRjcmVhdGVBY2NvdW50QnV0dG9uQ29udGFpbmVyID0gJCgnLmNyZWF0ZS1hY2NvdW50LWJ1dHRvbi1jb250YWluZXInKSxcclxuICAgICRsb2dpbkJ1dHRvbkNvbnRhaW5lciA9ICQoJy5sb2dpbi1idXR0b24tY29udGFpbmVyJyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRpc3BsYXlGbGV4KCRlOiBKUXVlcnkpIHtcclxuICAgICRlLmNzcygnZGlzcGxheScsICdmbGV4Jyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVuYWJsZVNTTkZvcm0oKSB7XHJcbiAgICAkZXhjaGFuZ2VJREZvcm0uaGlkZSgpO1xyXG4gICAgJGV4aXN0aW5nQWNjb3VudEZvcm1Db250YWluZXIuaGlkZSgpO1xyXG4gICAgJGxvZ2luQnV0dG9uQ29udGFpbmVyLmhpZGUoKTtcclxuXHJcbiAgICBkaXNwbGF5RmxleCgkc3NuRm9ybSk7XHJcbiAgICBkaXNwbGF5RmxleCgkY29tbW9uRm9ybUxhc3ROYW1lKTtcclxuICAgIGRpc3BsYXlGbGV4KCRjb21tb25Gb3JtRG9iQW5kWmlwKTtcclxuICAgIGRpc3BsYXlGbGV4KCRjcmVhdGVBY2NvdW50QnV0dG9uQ29udGFpbmVyKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZXhjaGFuZ2VJREZvcm0oKSB7XHJcbiAgICAkc3NuRm9ybS5oaWRlKCk7XHJcbiAgICAkZXhpc3RpbmdBY2NvdW50Rm9ybUNvbnRhaW5lci5oaWRlKCk7XHJcbiAgICAkbG9naW5CdXR0b25Db250YWluZXIuaGlkZSgpO1xyXG5cclxuICAgIGRpc3BsYXlGbGV4KCRleGNoYW5nZUlERm9ybSk7XHJcbiAgICBkaXNwbGF5RmxleCgkY29tbW9uRm9ybUxhc3ROYW1lKTtcclxuICAgIGRpc3BsYXlGbGV4KCRjb21tb25Gb3JtRG9iQW5kWmlwKTtcclxuICAgIGRpc3BsYXlGbGV4KCRjcmVhdGVBY2NvdW50QnV0dG9uQ29udGFpbmVyKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZXhpc3RpbmdBY2NvdW50Rm9ybSgpIHtcclxuICAgICRzc25Gb3JtLmhpZGUoKTtcclxuICAgICRleGNoYW5nZUlERm9ybS5oaWRlKCk7XHJcbiAgICAkY29tbW9uRm9ybUxhc3ROYW1lLmhpZGUoKTtcclxuICAgICRjb21tb25Gb3JtRG9iQW5kWmlwLmhpZGUoKTtcclxuICAgICRjcmVhdGVBY2NvdW50QnV0dG9uQ29udGFpbmVyLmhpZGUoKTtcclxuXHJcbiAgICBkaXNwbGF5RmxleCgkZXhpc3RpbmdBY2NvdW50Rm9ybUNvbnRhaW5lcik7XHJcbiAgICBkaXNwbGF5RmxleCgkbG9naW5CdXR0b25Db250YWluZXIpO1xyXG59XHJcblxyXG4kZG9jdW1lbnQub24oJ2NoYW5nZScsICdbdHlwZT1cInJhZGlvXCJdW25hbWU9XCJpZGVudGl0eVwiXScsIGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSAkKCdbdHlwZT1cInJhZGlvXCJdW25hbWU9XCJpZGVudGl0eVwiXScpLmZpbHRlcignOmNoZWNrZWQnKS52YWwoKTtcclxuXHJcbiAgICBpbml0aWFsaXplVmFyaWFibGVzKCk7XHJcblxyXG4gICAgc3dpdGNoIChzZWxlY3RlZE9wdGlvbikge1xyXG4gICAgICAgIGNhc2UgJ3Nzbic6IHtcclxuICAgICAgICAgICAgZW5hYmxlU1NORm9ybSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgJ2V4Y2hhbmdlX2lkJzoge1xyXG4gICAgICAgICAgICBleGNoYW5nZUlERm9ybSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgJ2V4aXN0aW5nX2FjY291bnQnOiB7XHJcbiAgICAgICAgICAgIGV4aXN0aW5nQWNjb3VudEZvcm0oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSk7XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7JGRvY3VtZW50fSBmcm9tICcuLi91dGlsaXRpZXMvX2hlbHBlcnMnXHJcblxyXG4kZG9jdW1lbnQub24oJ2NoYW5nZScsICdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cImRpZmZlcmVudE1haWxpbmdBZGRyZXNzXCJdJywgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBpc0RpZmZBZGRyZXNzID0gJCgnaW5wdXRbdHlwZT1cInJhZGlvXCJdW25hbWU9XCJkaWZmZXJlbnRNYWlsaW5nQWRkcmVzc1wiXScpLmZpbHRlcignOmNoZWNrZWQnKS52YWwoKSA9PT0gJ3llcycsXHJcbiAgICAgICAgICAkZGlmZmVyZW50TWFpbGluZ0FkZHJlc3MgPSAkKCcubWFpbGluZy1hZGRyZXNzLWRpZmZlcmVudCcpO1xyXG5cclxuICAgIGlmIChpc0RpZmZBZGRyZXNzKSB7XHJcbiAgICAgICAgJGRpZmZlcmVudE1haWxpbmdBZGRyZXNzLnNsaWRlRG93bigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAkZGlmZmVyZW50TWFpbGluZ0FkZHJlc3Muc2xpZGVVcCgpO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbiRkb2N1bWVudC5vbignY2hhbmdlJywgJ2lucHV0W3R5cGU9XCJyYWRpb1wiXVtuYW1lPVwiYWRkUE9BXCJdJywgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBpc0FkZGluZ1BPQSA9ICQoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXVtuYW1lPVwiYWRkUE9BXCJdJykuZmlsdGVyKCc6Y2hlY2tlZCcpLnZhbCgpID09PSAneWVzJyxcclxuICAgICAgICAgICRhZGRQT0FEZXRhaWxzID0gJCgnLnBvYS1kZXRhaWxzLWNvbnRhaW5lcicpO1xyXG5cclxuICAgIGlmIChpc0FkZGluZ1BPQSkge1xyXG4gICAgICAgICRhZGRQT0FEZXRhaWxzLnNsaWRlRG93bigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAkYWRkUE9BRGV0YWlscy5zbGlkZVVwKCk7XHJcbiAgICB9XHJcbn0pO1xyXG5cclxuJGRvY3VtZW50Lm9uKCdjaGFuZ2UnLCAnaW5wdXRbdHlwZT1cInJhZGlvXCJdW25hbWU9XCJQT0FIYXNTYW1lQWRkcmVzc1wiXScsIGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgaXNQT0FEaWZmSGFzQWRkcmVzcyA9ICQoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXVtuYW1lPVwiUE9BSGFzU2FtZUFkZHJlc3NcIl0nKS5maWx0ZXIoJzpjaGVja2VkJykudmFsKCkgPT09ICdubycsXHJcbiAgICAgICAgICAkUE9BTWFpbGluZ0FkZHJlc3MgPSAkKCcucG9hLW1haWxpbmctYWRkcmVzcycpO1xyXG5cclxuICAgIGlmIChpc1BPQURpZmZIYXNBZGRyZXNzKSB7XHJcbiAgICAgICAgJFBPQU1haWxpbmdBZGRyZXNzLnNsaWRlRG93bigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAkUE9BTWFpbGluZ0FkZHJlc3Muc2xpZGVVcCgpO1xyXG4gICAgfVxyXG59KTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHskZG9jdW1lbnR9IGZyb20gJy4uL3V0aWxpdGllcy9faGVscGVycydcclxuXHJcbiRkb2N1bWVudC5vbignY2hhbmdlJywgJ2lucHV0W3R5cGU9XCJyYWRpb1wiXVtuYW1lPVwiY2FuLXNlbmQtcGh5c2ljYWwtbWFpbFwiXScsIGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgY2FuU2VuZE1haWwgPSAkKCdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cImNhbi1zZW5kLXBoeXNpY2FsLW1haWxcIl0nKS5maWx0ZXIoJzpjaGVja2VkJykudmFsKCkgPT09ICd5ZXMnLFxyXG4gICAgICAgICAgJG1haWxBZGRyZXNzRm9ybSA9ICQoJy5jb20tcHJlZi1jYW4tc2VuZC1tYWlsLWZvcm0nKTtcclxuXHJcbiAgICBpZiAoY2FuU2VuZE1haWwpIHtcclxuICAgICAgICAkbWFpbEFkZHJlc3NGb3JtLmFkZENsYXNzKCdjYW4tc2VuZC1lbWFpbCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAkbWFpbEFkZHJlc3NGb3JtLnJlbW92ZUNsYXNzKCdjYW4tc2VuZC1lbWFpbCcpO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbiRkb2N1bWVudC5vbignY2hhbmdlJywgJ2lucHV0W3R5cGU9XCJyYWRpb1wiXVtuYW1lPVwiY2FuLWNhbGxcIl0nLCBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGNhbkNhbGwgPSAkKCdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cImNhbi1jYWxsXCJdJykuZmlsdGVyKCc6Y2hlY2tlZCcpLnZhbCgpID09PSAneWVzJyxcclxuICAgICAgICAgICRwaG9uZU5vRm9ybSA9ICQoJy5jb20tcHJlZi1jYW4tY2FsbC1mb3JtJyk7XHJcblxyXG4gICAgaWYgKGNhbkNhbGwpIHtcclxuICAgICAgICAkcGhvbmVOb0Zvcm0uYWRkQ2xhc3MoJ2Nhbi1jYWxsJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgICRwaG9uZU5vRm9ybS5yZW1vdmVDbGFzcygnY2FuLWNhbGwnKTtcclxuICAgIH1cclxufSk7XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7JGRvY3VtZW50fSBmcm9tICcuLi91dGlsaXRpZXMvX2hlbHBlcnMnXHJcblxyXG5mdW5jdGlvbiBoaWRlT3JTaG93QWxlcnRzKCkge1xyXG4gICAgaWYgKCQoJy5oaWRlLW15LWFjY291bnQtYWxlcnRzJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICQoJy5hb24tbWVudS1jb250ZW50IC5hbGVydC5hb24tYWxlcnQnKS5oaWRlKCk7XHJcbiAgICAgICAgJCgnLmFvbi1tZW51LWNvbnRlbnQrLmNhcmQtYmxvY2snKS5oaWRlKCk7XHJcbiAgICAgICAgJCgnLmFvbi1tZW51LWZsYWcnKS5oaWRlKCk7XHJcbiAgICAgICAgJCgnLmFvbi1tZW51LWl0ZW1zJykuc2hvdygpO1xyXG4gICAgICAgICQoJy5hZHYtbmFtZScpLnNob3coKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgJCgnLmFvbi1tZW51LWNvbnRlbnQgLmFsZXJ0LmFvbi1hbGVydCcpLnNob3coKTtcclxuICAgICAgICAkKCcuYW9uLW1lbnUtY29udGVudCsuY2FyZC1ibG9jaycpLnNob3coKTtcclxuICAgICAgICAkKCcuYW9uLW1lbnUtaXRlbXMnKS5oaWRlKCk7XHJcbiAgICAgICAgJCgnLmFvbi1tZW51LWZsYWcnKS5zaG93KCk7XHJcbiAgICB9XHJcbn1cclxuaGlkZU9yU2hvd0FsZXJ0cygpO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyBob29rcyB9IGZyb20gJ3ByaXNtanMnO1xyXG5pbXBvcnQgJ3ByaXNtanMvcGx1Z2lucy91bmVzY2FwZWQtbWFya3VwL3ByaXNtLXVuZXNjYXBlZC1tYXJrdXAnO1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnanMtYmVhdXRpZnknO1xyXG5pbXBvcnQgKiBhcyBDbGlwYm9hcmQgZnJvbSAnY2xpcGJvYXJkJztcclxuXHJcbmltcG9ydCB7IHByZWZpeCwgb25SZWFkeSwgb25SZXNpemUsICRodG1sIH0gZnJvbSAnLi4vdXRpbGl0aWVzL19oZWxwZXJzJztcclxuXHJcbmNvbnN0ICRndWlkZSA9ICQoYC4ke3ByZWZpeCgncGFnZS1zdHlsZS1ndWlkZScpfWApO1xyXG5jb25zdCAkbmF2ID0gJGd1aWRlLmZpbmQoJ1tkYXRhLWV4YW1wbGUtbmF2XScpO1xyXG5jb25zdCAkZXhhbXBsZXMgPSAkZ3VpZGUuZmluZCgnW2RhdGEtZXhhbXBsZV0nKTtcclxuXHJcbmZ1bmN0aW9uIGFkanVzdCgpOiB2b2lkIHtcclxuICAgICRodG1sLmNzcyh7J21hcmdpbi1ib3R0b20nOiAkbmF2Lm91dGVySGVpZ2h0KCl9KTtcclxufVxyXG5cclxuaWYgKCEhJGd1aWRlLmxlbmd0aCkge1xyXG4gICAgJGd1aWRlXHJcbiAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgJ1tkYXRhLWV4YW1wbGVdJywgKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgJGV4YW1wbGVzXHJcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MocHJlZml4KCdleGFtcGxlLWhpZ2hsaWdodCcpKVxyXG4gICAgICAgICAgICAgICAgLmZpbHRlcihgW2RhdGEtZXhhbXBsZT1cIiR7JChldnQudGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1leGFtcGxlXScpLmRhdGEoJ2V4YW1wbGUnKX1cIl1gKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKHByZWZpeCgnZXhhbXBsZS1oaWdobGlnaHQnKSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAub24oJ21vdXNlbGVhdmUnLCAnW2RhdGEtZXhhbXBsZV0nLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICRleGFtcGxlcy5yZW1vdmVDbGFzcyhwcmVmaXgoJ2V4YW1wbGUtaGlnaGxpZ2h0JykpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIG5ldyBDbGlwYm9hcmQoYC4ke3ByZWZpeCgnZXhhbXBsZS1jb3B5Jyl9YCwge1xyXG4gICAgICAgIHRleHQ6ICh0cmlnZ2VyKSA9PiAkKGBbZGF0YS1leGFtcGxlPVwiJHskKHRyaWdnZXIpLmRhdGEoJ2V4YW1wbGUnKX1cIl0gY29kZWApLmRhdGEoJ2NsaXBib2FyZCcpXHJcbiAgICB9KTtcclxuXHJcbiAgICBob29rcy5hZGQoJ2JlZm9yZS1zYW5pdHktY2hlY2snLCAoZW52KSA9PiB7XHJcbiAgICAgICAgaWYgKGVudi5sYW5ndWFnZSA9PT0gJ21hcmt1cCcpIHtcclxuICAgICAgICAgICAgZW52LmVsZW1lbnQudGV4dENvbnRlbnQgPSBlbnYuY29kZSA9IGh0bWwoZW52LmNvZGUsIHtcclxuICAgICAgICAgICAgICAgIHdyYXBfbGluZV9sZW5ndGg6IDAsXHJcbiAgICAgICAgICAgICAgICB1bmZvcm1hdHRlZDogJ25vbmUnXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJChlbnYuZWxlbWVudCkuZGF0YSgnY2xpcGJvYXJkJywgZW52LmNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIG9uUmVzaXplKGFkanVzdCk7XHJcblxyXG4gICAgb25SZWFkeShhZGp1c3QpO1xyXG59XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7IGJpbmQsIGNhbGwsIGRlYm91bmNlLCBmb3JFYWNoLCBpbnZva2VNYXAgfSBmcm9tICdsb2Rhc2gnO1xyXG5cclxuaW1wb3J0IHsgUFJFRklYLCBCUkVBS1BPSU5UUyB9IGZyb20gJy4uL192YXJzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0b0Rhc2hDYXNlKHN0ciA9ICcnKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzdHIudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW1xcc19dL2csICctJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwcmVmaXgoLi4uc3RyaW5nczogc3RyaW5nW10pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHN0cmluZ3MubWFwKChzdHIpID0+IGAke1BSRUZJWH0tJHt0b0Rhc2hDYXNlKHN0cil9YCkuam9pbignICcpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyYW1ldGVycygpOiB7IFtwYXJhbTogc3RyaW5nXTogYW55IH0ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge307XHJcbiAgICBjb25zdCBwYWlycyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNsaWNlKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJz8nKSArIDEpLnNwbGl0KCcmJyk7XHJcblxyXG4gICAgZm9yRWFjaChwYWlycywgKHBhaXIpID0+IHtcclxuICAgICAgICBjb25zdCBoYXNoID0gcGFpci5zcGxpdCgnPScpO1xyXG5cclxuICAgICAgICBwYXJhbXNbaGFzaFswXV0gPSBoYXNoWzFdID8gZGVjb2RlVVJJQ29tcG9uZW50KGhhc2hbMV0pIDogdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbn1cclxuXHJcbmNvbnN0ICRicmVha3BvaW50ID0gJChgIyR7cHJlZml4KCdicmVha3BvaW50Jyl9YCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJlYWtwb2ludCgpIHtcclxuICAgIHJldHVybiAkYnJlYWtwb2ludC5jc3MoJ2ZvbnQtZmFtaWx5Jyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0JyZWFrcG9pbnQoYnJlYWtwb2ludDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gYnJlYWtwb2ludCA9PT0gZ2V0QnJlYWtwb2ludCgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNCcmVha3BvaW50QW5kVXAoYnJlYWtwb2ludDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gQlJFQUtQT0lOVFMuaW5kZXhPZihicmVha3BvaW50KSA8PSBCUkVBS1BPSU5UUy5pbmRleE9mKGdldEJyZWFrcG9pbnQoKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0JyZWFrcG9pbnRBbmREb3duKGJyZWFrcG9pbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEJSRUFLUE9JTlRTLmluZGV4T2YoYnJlYWtwb2ludCkgPj0gQlJFQUtQT0lOVFMuaW5kZXhPZihnZXRCcmVha3BvaW50KCkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9jdXMoJGVsOiBKUXVlcnkpOiB2b2lkIHtcclxuICAgICRlbC50cmlnZ2VyKCdmb2N1cycpO1xyXG5cclxuICAgIGlmICghJGVsLmlzKCc6Zm9jdXMnKSkge1xyXG4gICAgICAgICRlbFxyXG4gICAgICAgICAgICAuYXR0cigndGFiaW5kZXgnLCAnLTEnKVxyXG4gICAgICAgICAgICAudHJpZ2dlcignZm9jdXMnKVxyXG4gICAgICAgICAgICAub25lKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgJGVsLnJlbW92ZUF0dHIoJ3RhYmluZGV4Jyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgc2Nyb2xsU3RvcHBlZCA9IHRydWU7XHJcbmNvbnN0IGNhbGxiYWNrcyA9IHtcclxuICAgIGxvYWQ6IFtdIGFzIEZ1bmN0aW9uW10sXHJcbiAgICByZWFkeTogW10gYXMgRnVuY3Rpb25bXSxcclxuICAgIHJlc2l6ZTogW10gYXMgRnVuY3Rpb25bXSxcclxuICAgIHNjcm9sbDoge1xyXG4gICAgICAgIHN0YXJ0OiBbXSBhcyBGdW5jdGlvbltdLFxyXG4gICAgICAgIGV2ZXJ5OiBbXHJcbiAgICAgICAgICAgIGRlYm91bmNlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGludm9rZU1hcChjYWxsYmFja3Muc2Nyb2xsLnN0b3AsIGNhbGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIHNjcm9sbFN0b3BwZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9LCAyNTApXHJcbiAgICAgICAgXSBhcyBGdW5jdGlvbltdLFxyXG4gICAgICAgIHN0b3A6IFtdIGFzIEZ1bmN0aW9uW11cclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvbkxvYWQoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XHJcbiAgICBpZiAoISFjYWxsYmFja3MubG9hZCkge1xyXG4gICAgICAgIGNhbGxiYWNrcy5sb2FkLnB1c2goY2FsbGJhY2spO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gb25SZWFkeShjYWxsYmFjazogRnVuY3Rpb24pIHtcclxuICAgIGlmICghIWNhbGxiYWNrcy5yZWFkeSkge1xyXG4gICAgICAgIGNhbGxiYWNrcy5yZWFkeS5wdXNoKGNhbGxiYWNrKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG9uUmVzaXplKGNhbGxiYWNrOiBGdW5jdGlvbikge1xyXG4gICAgY2FsbGJhY2tzLnJlc2l6ZS5wdXNoKGNhbGxiYWNrKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG9uU2Nyb2xsU3RhcnQoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XHJcbiAgICBjYWxsYmFja3Muc2Nyb2xsLnN0YXJ0LnB1c2goY2FsbGJhY2spO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gb25TY3JvbGwoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XHJcbiAgICBjYWxsYmFja3Muc2Nyb2xsLmV2ZXJ5LnB1c2goY2FsbGJhY2spO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gb25TY3JvbGxTdG9wKGNhbGxiYWNrOiBGdW5jdGlvbikge1xyXG4gICAgY2FsbGJhY2tzLnNjcm9sbC5zdG9wLnB1c2goY2FsbGJhY2spO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgJHdpbmRvdyA9ICQod2luZG93KTtcclxuXHJcbiR3aW5kb3cub24oe1xyXG4gICAgbG9hZDogKCkgPT4ge1xyXG4gICAgICAgIGludm9rZU1hcChjYWxsYmFja3MubG9hZCwgY2FsbCk7XHJcblxyXG4gICAgICAgIGRlbGV0ZSBjYWxsYmFja3MubG9hZDtcclxuICAgIH0sXHJcbiAgICByZXNpemU6ICgpID0+IHtcclxuICAgICAgICBpbnZva2VNYXAoY2FsbGJhY2tzLnJlc2l6ZSwgY2FsbCk7XHJcbiAgICB9XHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0ICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xyXG5cclxuJGRvY3VtZW50XHJcbiAgICAub24oJ3Njcm9sbCcsICgpID0+IHtcclxuICAgICAgICBpZiAoc2Nyb2xsU3RvcHBlZCkge1xyXG4gICAgICAgICAgICBpbnZva2VNYXAoY2FsbGJhY2tzLnNjcm9sbC5zdGFydCwgY2FsbCk7XHJcblxyXG4gICAgICAgICAgICBzY3JvbGxTdG9wcGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpbnZva2VNYXAoY2FsbGJhY2tzLnNjcm9sbC5ldmVyeSwgY2FsbCk7XHJcbiAgICB9KVxyXG4gICAgLnJlYWR5KCgpID0+IHtcclxuICAgICAgICBpbnZva2VNYXAoY2FsbGJhY2tzLnJlYWR5LCBjYWxsKTtcclxuXHJcbiAgICAgICAgZGVsZXRlIGNhbGxiYWNrcy5yZWFkeTtcclxuICAgIH0pO1xyXG5cclxuZXhwb3J0IGNvbnN0ICRodG1sID0gJChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xyXG5cclxuZXhwb3J0IGNvbnN0ICRib2R5ID0gJChkb2N1bWVudC5ib2R5KTtcclxuXHJcbmV4cG9ydCBjb25zdCAkbWFpbiA9ICQoYCMke3ByZWZpeCgnbWFpbicpfWApO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyBwcmVmaXgsICR3aW5kb3csICRkb2N1bWVudCB9IGZyb20gJy4vX2hlbHBlcnMnO1xyXG5cclxuJGRvY3VtZW50Lm9uKCdjbGljaycsICdbZGF0YS10b2dnbGU9XCJ1c2VyXCJdJywgKCkgPT4ge1xyXG4gICAgY29uc3QgJHVzZXIgPSAkKCdbZGF0YS1qc149XCJ1c2VyXCJdJyk7XHJcbiAgICAkdXNlci50b2dnbGVDbGFzcyhwcmVmaXgoJ2hpZGRlbicpKTtcclxuXHJcbiAgICAkd2luZG93LnRyaWdnZXIoJ3Jlc2l6ZScpO1xyXG59KTtcclxuIl19"}