{"version":3,"file":"static/js/main.b04fd077.js","mappings":"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","sources":["../node_modules/react/index.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/cjs/react.production.min.js","../node_modules/@supabase/postgrest-js/src/PostgrestClient.ts","../node_modules/scheduler/cjs/scheduler.production.min.js","../node_modules/@supabase/postgrest-js/src/PostgrestBuilder.ts","../node_modules/react-qr-scanner/dist/react-qr-scanner.umd.js","../node_modules/@supabase/postgrest-js/src/PostgrestTransformBuilder.ts","../node_modules/react-dom/client.js","../node_modules/@supabase/postgrest-js/src/version.ts","../node_modules/react/jsx-runtime.js","../node_modules/@supabase/postgrest-js/src/PostgrestError.ts","../node_modules/@supabase/node-fetch/browser.js","../node_modules/react-dom/cjs/react-dom.production.min.js","../node_modules/@supabase/postgrest-js/src/PostgrestFilterBuilder.ts","../node_modules/@supabase/postgrest-js/src/constants.ts","../node_modules/@supabase/postgrest-js/src/PostgrestQueryBuilder.ts","../node_modules/scheduler/index.js","../node_modules/react-dom/index.js","../node_modules/@supabase/postgrest-js/src/index.ts","../webpack/bootstrap","../webpack/runtime/create fake namespace object","../webpack/runtime/define property getters","../webpack/runtime/ensure chunk","../webpack/runtime/get javascript chunk filename","../webpack/runtime/get mini-css chunk filename","../webpack/runtime/global","../webpack/runtime/hasOwnProperty shorthand","../webpack/runtime/load script","../webpack/runtime/make namespace object","../webpack/runtime/publicPath","../webpack/runtime/jsonp chunk loading","../node_modules/@remix-run/router/history.ts","../node_modules/@remix-run/router/utils.ts","../node_modules/@remix-run/router/router.ts","../node_modules/react-router/lib/context.ts","../node_modules/react-router/lib/hooks.tsx","../node_modules/react-router/lib/deprecations.ts","../node_modules/react-router/lib/components.tsx","../node_modules/react-router-dom/dom.ts","../node_modules/react-router-dom/index.tsx","../node_modules/@supabase/functions-js/src/types.ts","../node_modules/@supabase/functions-js/src/FunctionsClient.ts","../node_modules/@supabase/functions-js/src/helper.ts","../node_modules/@supabase/postgrest-js/dist/esm/wrapper.mjs","../node_modules/@supabase/realtime-js/src/lib/constants.ts","../node_modules/@supabase/realtime-js/src/lib/transformers.ts","../node_modules/@supabase/realtime-js/src/lib/serializer.ts","../node_modules/@supabase/realtime-js/src/lib/timer.ts","../node_modules/@supabase/realtime-js/src/lib/push.ts","../node_modules/@supabase/realtime-js/src/RealtimePresence.ts","../node_modules/@supabase/realtime-js/src/RealtimeChannel.ts","../node_modules/@supabase/realtime-js/src/RealtimeClient.ts","../node_modules/@supabase/storage-js/src/lib/errors.ts","../node_modules/@supabase/storage-js/src/lib/helpers.ts","../node_modules/@supabase/storage-js/src/lib/fetch.ts","../node_modules/@supabase/storage-js/src/packages/StorageFileApi.ts","../node_modules/@supabase/storage-js/src/lib/version.ts","../node_modules/@supabase/storage-js/src/lib/constants.ts","../node_modules/@supabase/storage-js/src/packages/StorageBucketApi.ts","../node_modules/@supabase/storage-js/src/StorageClient.ts","../node_modules/@supabase/supabase-js/src/lib/constants.ts","../node_modules/@supabase/supabase-js/src/lib/fetch.ts","../node_modules/@supabase/auth-js/src/lib/version.ts","../node_modules/@supabase/auth-js/src/lib/constants.ts","../node_modules/@supabase/auth-js/src/lib/helpers.ts","../node_modules/@supabase/auth-js/src/lib/errors.ts","../node_modules/@supabase/auth-js/src/lib/fetch.ts","../node_modules/@supabase/auth-js/src/GoTrueAdminApi.ts","../node_modules/@supabase/auth-js/src/lib/local-storage.ts","../node_modules/@supabase/auth-js/src/lib/locks.ts","../node_modules/@supabase/auth-js/src/lib/polyfills.ts","../node_modules/@supabase/auth-js/src/GoTrueClient.ts","../node_modules/@supabase/auth-js/src/AuthAdminApi.ts","../node_modules/@supabase/auth-js/src/AuthClient.ts","../node_modules/@supabase/supabase-js/src/lib/SupabaseAuthClient.ts","../node_modules/@supabase/supabase-js/src/SupabaseClient.ts","../node_modules/@supabase/supabase-js/src/lib/helpers.ts","../node_modules/@supabase/supabase-js/src/index.ts","services/client.js","pages/Login.js","../node_modules/@react-aria/utils/dist/packages/@react-aria/utils/src/platform.ts","../node_modules/@react-aria/utils/dist/packages/@react-aria/utils/src/domHelpers.ts","../node_modules/@react-aria/interactions/dist/packages/@react-aria/interactions/src/useFocusVisible.ts","../node_modules/@react-aria/utils/dist/packages/@react-aria/utils/src/isVirtualEvent.ts","../node_modules/@react-aria/utils/dist/packages/@react-aria/utils/src/useLayoutEffect.ts","../node_modules/@react-aria/utils/dist/packages/@react-aria/utils/src/useEffectEvent.ts","../node_modules/@react-aria/interactions/dist/packages/@react-aria/interactions/src/utils.ts","../node_modules/@react-aria/interactions/dist/packages/@react-aria/interactions/src/useFocus.ts","../node_modules/@react-aria/interactions/dist/packages/@react-aria/interactions/src/useFocusWithin.ts","../node_modules/@react-aria/focus/dist/packages/@react-aria/focus/src/useFocusRing.ts","../node_modules/@react-aria/interactions/dist/packages/@react-aria/interactions/src/useHover.ts","../node_modules/@headlessui/react/dist/utils/env.js","../node_modules/@headlessui/react/dist/utils/owner.js","../node_modules/@headlessui/react/dist/utils/micro-task.js","../node_modules/@headlessui/react/dist/utils/disposables.js","../node_modules/@headlessui/react/dist/hooks/use-disposables.js","../node_modules/@headlessui/react/dist/hooks/use-iso-morphic-effect.js","../node_modules/@headlessui/react/dist/hooks/use-latest-value.js","../node_modules/@headlessui/react/dist/hooks/use-event.js","../node_modules/@headlessui/react/dist/hooks/use-active-press.js","../node_modules/@headlessui/react/dist/hooks/use-resolve-button-type.js","../node_modules/@headlessui/react/dist/hooks/use-sync-refs.js","../node_modules/@headlessui/react/dist/hooks/use-transition.js","../node_modules/@headlessui/react/dist/hooks/use-flags.js","../node_modules/@headlessui/react/dist/internal/close-provider.js","../node_modules/@headlessui/react/dist/internal/open-closed.js","../node_modules/@headlessui/react/dist/utils/bugs.js","../node_modules/@headlessui/react/dist/utils/match.js","../node_modules/@headlessui/react/dist/utils/class-names.js","../node_modules/@headlessui/react/dist/utils/render.js","../node_modules/@headlessui/react/dist/utils/start-transition.js","../node_modules/@headlessui/react/dist/components/keyboard.js","../node_modules/@headlessui/react/dist/components/disclosure/disclosure.js","../node_modules/@headlessui/react/dist/hooks/use-element-size.js","../node_modules/@headlessui/react/dist/utils/default-map.js","../node_modules/@headlessui/react/dist/utils/store.js","../node_modules/@headlessui/react/dist/hooks/use-store.js","../node_modules/@headlessui/react/dist/hooks/use-is-top-layer.js","../node_modules/@headlessui/react/dist/hooks/use-inert-others.js","../node_modules/@headlessui/react/dist/utils/focus-management.js","../node_modules/@headlessui/react/dist/utils/platform.js","../node_modules/@headlessui/react/dist/hooks/use-document-event.js","../node_modules/@headlessui/react/dist/hooks/use-outside-click.js","../node_modules/@headlessui/react/dist/hooks/use-window-event.js","../node_modules/@headlessui/react/dist/hooks/use-owner.js","../node_modules/@headlessui/react/dist/hooks/document-overflow/adjust-scrollbar-padding.js","../node_modules/@headlessui/react/dist/hooks/document-overflow/overflow-store.js","../node_modules/@headlessui/react/dist/hooks/document-overflow/handle-ios-locking.js","../node_modules/@headlessui/react/dist/hooks/document-overflow/prevent-scroll.js","../node_modules/@headlessui/react/dist/hooks/use-scroll-lock.js","../node_modules/@headlessui/react/dist/hooks/document-overflow/use-document-overflow.js","../node_modules/@headlessui/react/dist/utils/get-text-value.js","../node_modules/@headlessui/react/dist/hooks/use-text-value.js","../node_modules/@headlessui/react/dist/hooks/use-tracked-pointer.js","../node_modules/@floating-ui/react/dist/floating-ui.react.utils.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs","../node_modules/@floating-ui/react/dist/floating-ui.react.mjs","../node_modules/@headlessui/react/dist/internal/floating.js","../node_modules/@headlessui/react/dist/utils/calculate-active-index.js","../node_modules/@headlessui/react/dist/internal/disabled.js","../node_modules/@headlessui/react/dist/components/description/description.js","../node_modules/@headlessui/react/dist/internal/id.js","../node_modules/@headlessui/react/dist/components/label/label.js","../node_modules/@headlessui/react/dist/hooks/use-server-handoff-complete.js","../node_modules/@headlessui/react/dist/internal/portal-force-root.js","../node_modules/@headlessui/react/dist/components/portal/portal.js","../node_modules/@headlessui/react/dist/hooks/use-on-unmount.js","../node_modules/@headlessui/react/dist/components/menu/menu.js","../node_modules/@headlessui/react/dist/hooks/use-on-disappear.js","../node_modules/@headlessui/react/dist/hooks/use-did-element-move.js","../node_modules/@headlessui/react/dist/hooks/use-tree-walker.js","../node_modules/@heroicons/react/24/outline/esm/BellIcon.js","../node_modules/@heroicons/react/24/outline/esm/Bars3Icon.js","../node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js","pages/Registro.js","DashboardAdmin/Usuarios.js","DashboardAdmin/Reporte.js","DashboardAdmin/Delegaciones.js","pages/DashboardAdmin.js","pages/DashboardDelegacion.js","App.js","index.js"],"sourcesContent":["'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1 {\n url: string\n headers: Record\n schemaName?: SchemaName\n fetch?: Fetch\n\n // TODO: Add back shouldThrowOnError once we figure out the typings\n /**\n * Creates a PostgREST client.\n *\n * @param url - URL of the PostgREST endpoint\n * @param options - Named parameters\n * @param options.headers - Custom headers\n * @param options.schema - Postgres schema to switch to\n * @param options.fetch - Custom fetch\n */\n constructor(\n url: string,\n {\n headers = {},\n schema,\n fetch,\n }: {\n headers?: Record\n schema?: SchemaName\n fetch?: Fetch\n } = {}\n ) {\n this.url = url\n this.headers = { ...DEFAULT_HEADERS, ...headers }\n this.schemaName = schema\n this.fetch = fetch\n }\n\n from<\n TableName extends string & keyof Schema['Tables'],\n Table extends Schema['Tables'][TableName]\n >(relation: TableName): PostgrestQueryBuilder\n from(\n relation: ViewName\n ): PostgrestQueryBuilder\n /**\n * Perform a query on a table or a view.\n *\n * @param relation - The table or view name to query\n */\n from(relation: string): PostgrestQueryBuilder {\n const url = new URL(`${this.url}/${relation}`)\n return new PostgrestQueryBuilder(url, {\n headers: { ...this.headers },\n schema: this.schemaName,\n fetch: this.fetch,\n })\n }\n\n /**\n * Select a schema to query or perform an function (rpc) call.\n *\n * The schema needs to be on the list of exposed schemas inside Supabase.\n *\n * @param schema - The schema to query\n */\n schema(\n schema: DynamicSchema\n ): PostgrestClient<\n Database,\n DynamicSchema,\n Database[DynamicSchema] extends GenericSchema ? Database[DynamicSchema] : any\n > {\n return new PostgrestClient(this.url, {\n headers: this.headers,\n schema,\n fetch: this.fetch,\n })\n }\n\n /**\n * Perform a function call.\n *\n * @param fn - The function name to call\n * @param args - The arguments to pass to the function call\n * @param options - Named parameters\n * @param options.head - When set to `true`, `data` will not be returned.\n * Useful if you only need the count.\n * @param options.get - When set to `true`, the function will be called with\n * read-only access mode.\n * @param options.count - Count algorithm to use to count rows returned by the\n * function. Only applicable for [set-returning\n * functions](https://www.postgresql.org/docs/current/functions-srf.html).\n *\n * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n * hood.\n *\n * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n * statistics under the hood.\n *\n * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n * numbers.\n */\n rpc(\n fn: FnName,\n args: Fn['Args'] = {},\n {\n head = false,\n get = false,\n count,\n }: {\n head?: boolean\n get?: boolean\n count?: 'exact' | 'planned' | 'estimated'\n } = {}\n ): PostgrestFilterBuilder<\n Schema,\n Fn['Returns'] extends any[]\n ? Fn['Returns'][number] extends Record\n ? Fn['Returns'][number]\n : never\n : never,\n Fn['Returns'],\n FnName,\n null\n > {\n let method: 'HEAD' | 'GET' | 'POST'\n const url = new URL(`${this.url}/rpc/${fn}`)\n let body: unknown | undefined\n if (head || get) {\n method = head ? 'HEAD' : 'GET'\n Object.entries(args)\n // params with undefined value needs to be filtered out, otherwise it'll\n // show up as `?param=undefined`\n .filter(([_, value]) => value !== undefined)\n // array values need special syntax\n .map(([name, value]) => [name, Array.isArray(value) ? `{${value.join(',')}}` : `${value}`])\n .forEach(([name, value]) => {\n url.searchParams.append(name, value)\n })\n } else {\n method = 'POST'\n body = args\n }\n\n const headers = { ...this.headers }\n if (count) {\n headers['Prefer'] = `count=${count}`\n }\n\n return new PostgrestFilterBuilder({\n method,\n url,\n headers,\n schema: this.schemaName,\n body,\n fetch: this.fetch,\n allowEmpty: false,\n } as unknown as PostgrestBuilder)\n }\n}\n","/**\n * @license React\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';function f(a,b){var c=a.length;a.push(b);a:for(;0>>1,e=a[d];if(0>>1;dg(C,c))ng(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(ng(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Qa||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","// @ts-ignore\nimport nodeFetch from '@supabase/node-fetch'\n\nimport type { Fetch, PostgrestSingleResponse, PostgrestResponseSuccess } from './types'\nimport PostgrestError from './PostgrestError'\n\nexport default abstract class PostgrestBuilder\n implements\n PromiseLike<\n ThrowOnError extends true ? PostgrestResponseSuccess : PostgrestSingleResponse\n >\n{\n protected method: 'GET' | 'HEAD' | 'POST' | 'PATCH' | 'DELETE'\n protected url: URL\n protected headers: Record\n protected schema?: string\n protected body?: unknown\n protected shouldThrowOnError = false\n protected signal?: AbortSignal\n protected fetch: Fetch\n protected isMaybeSingle: boolean\n\n constructor(builder: PostgrestBuilder) {\n this.method = builder.method\n this.url = builder.url\n this.headers = builder.headers\n this.schema = builder.schema\n this.body = builder.body\n this.shouldThrowOnError = builder.shouldThrowOnError\n this.signal = builder.signal\n this.isMaybeSingle = builder.isMaybeSingle\n\n if (builder.fetch) {\n this.fetch = builder.fetch\n } else if (typeof fetch === 'undefined') {\n this.fetch = nodeFetch\n } else {\n this.fetch = fetch\n }\n }\n\n /**\n * If there's an error with the query, throwOnError will reject the promise by\n * throwing the error instead of returning it as part of a successful response.\n *\n * {@link https://github.com/supabase/supabase-js/issues/92}\n */\n throwOnError(): this & PostgrestBuilder {\n this.shouldThrowOnError = true\n return this as this & PostgrestBuilder\n }\n\n /**\n * Set an HTTP header for the request.\n */\n setHeader(name: string, value: string): this {\n this.headers = { ...this.headers }\n this.headers[name] = value\n return this\n }\n\n then<\n TResult1 = ThrowOnError extends true\n ? PostgrestResponseSuccess\n : PostgrestSingleResponse,\n TResult2 = never\n >(\n onfulfilled?:\n | ((\n value: ThrowOnError extends true\n ? PostgrestResponseSuccess\n : PostgrestSingleResponse\n ) => TResult1 | PromiseLike)\n | undefined\n | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null\n ): PromiseLike {\n // https://postgrest.org/en/stable/api.html#switching-schemas\n if (this.schema === undefined) {\n // skip\n } else if (['GET', 'HEAD'].includes(this.method)) {\n this.headers['Accept-Profile'] = this.schema\n } else {\n this.headers['Content-Profile'] = this.schema\n }\n if (this.method !== 'GET' && this.method !== 'HEAD') {\n this.headers['Content-Type'] = 'application/json'\n }\n\n // NOTE: Invoke w/o `this` to avoid illegal invocation error.\n // https://github.com/supabase/postgrest-js/pull/247\n const _fetch = this.fetch\n let res = _fetch(this.url.toString(), {\n method: this.method,\n headers: this.headers,\n body: JSON.stringify(this.body),\n signal: this.signal,\n }).then(async (res) => {\n let error = null\n let data = null\n let count: number | null = null\n let status = res.status\n let statusText = res.statusText\n\n if (res.ok) {\n if (this.method !== 'HEAD') {\n const body = await res.text()\n if (body === '') {\n // Prefer: return=minimal\n } else if (this.headers['Accept'] === 'text/csv') {\n data = body\n } else if (\n this.headers['Accept'] &&\n this.headers['Accept'].includes('application/vnd.pgrst.plan+text')\n ) {\n data = body\n } else {\n data = JSON.parse(body)\n }\n }\n\n const countHeader = this.headers['Prefer']?.match(/count=(exact|planned|estimated)/)\n const contentRange = res.headers.get('content-range')?.split('/')\n if (countHeader && contentRange && contentRange.length > 1) {\n count = parseInt(contentRange[1])\n }\n\n // Temporary partial fix for https://github.com/supabase/postgrest-js/issues/361\n // Issue persists e.g. for `.insert([...]).select().maybeSingle()`\n if (this.isMaybeSingle && this.method === 'GET' && Array.isArray(data)) {\n if (data.length > 1) {\n error = {\n // https://github.com/PostgREST/postgrest/blob/a867d79c42419af16c18c3fb019eba8df992626f/src/PostgREST/Error.hs#L553\n code: 'PGRST116',\n details: `Results contain ${data.length} rows, application/vnd.pgrst.object+json requires 1 row`,\n hint: null,\n message: 'JSON object requested, multiple (or no) rows returned',\n }\n data = null\n count = null\n status = 406\n statusText = 'Not Acceptable'\n } else if (data.length === 1) {\n data = data[0]\n } else {\n data = null\n }\n }\n } else {\n const body = await res.text()\n\n try {\n error = JSON.parse(body)\n\n // Workaround for https://github.com/supabase/postgrest-js/issues/295\n if (Array.isArray(error) && res.status === 404) {\n data = []\n error = null\n status = 200\n statusText = 'OK'\n }\n } catch {\n // Workaround for https://github.com/supabase/postgrest-js/issues/295\n if (res.status === 404 && body === '') {\n status = 204\n statusText = 'No Content'\n } else {\n error = {\n message: body,\n }\n }\n }\n\n if (error && this.isMaybeSingle && error?.details?.includes('0 rows')) {\n error = null\n status = 200\n statusText = 'OK'\n }\n\n if (error && this.shouldThrowOnError) {\n throw new PostgrestError(error)\n }\n }\n\n const postgrestResponse = {\n error,\n data,\n count,\n status,\n statusText,\n }\n\n return postgrestResponse\n })\n if (!this.shouldThrowOnError) {\n res = res.catch((fetchError) => ({\n error: {\n message: `${fetchError?.name ?? 'FetchError'}: ${fetchError?.message}`,\n details: `${fetchError?.stack ?? ''}`,\n hint: '',\n code: `${fetchError?.code ?? ''}`,\n },\n data: null,\n count: null,\n status: 0,\n statusText: '',\n }))\n }\n\n return res.then(onfulfilled, onrejected)\n }\n}\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('react')) :\n typeof define === 'function' && define.amd ? define(['react'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.RectQrScanner = factory(global.React));\n})(this, (function (React) { 'use strict';\n\n function _interopNamespace(e) {\n if (e && e.__esModule) return e;\n var n = Object.create(null);\n if (e) {\n Object.keys(e).forEach(function (k) {\n if (k !== 'default') {\n var d = Object.getOwnPropertyDescriptor(e, k);\n Object.defineProperty(n, k, d.get ? d : {\n enumerable: true,\n get: function () { return e[k]; }\n });\n }\n });\n }\n n[\"default\"] = e;\n return Object.freeze(n);\n }\n\n var React__namespace = /*#__PURE__*/_interopNamespace(React);\n\n function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n }\n\n function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n }\n\n function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n }\n\n var propTypes = {exports: {}};\n\n var reactIs = {exports: {}};\n\n var reactIs_production_min = {};\n\n /** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\n Symbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\n function z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}reactIs_production_min.AsyncMode=l;reactIs_production_min.ConcurrentMode=m;reactIs_production_min.ContextConsumer=k;reactIs_production_min.ContextProvider=h;reactIs_production_min.Element=c;reactIs_production_min.ForwardRef=n;reactIs_production_min.Fragment=e;reactIs_production_min.Lazy=t;reactIs_production_min.Memo=r;reactIs_production_min.Portal=d;\n reactIs_production_min.Profiler=g;reactIs_production_min.StrictMode=f;reactIs_production_min.Suspense=p;reactIs_production_min.isAsyncMode=function(a){return A(a)||z(a)===l};reactIs_production_min.isConcurrentMode=A;reactIs_production_min.isContextConsumer=function(a){return z(a)===k};reactIs_production_min.isContextProvider=function(a){return z(a)===h};reactIs_production_min.isElement=function(a){return \"object\"===typeof a&&null!==a&&a.$$typeof===c};reactIs_production_min.isForwardRef=function(a){return z(a)===n};reactIs_production_min.isFragment=function(a){return z(a)===e};reactIs_production_min.isLazy=function(a){return z(a)===t};\n reactIs_production_min.isMemo=function(a){return z(a)===r};reactIs_production_min.isPortal=function(a){return z(a)===d};reactIs_production_min.isProfiler=function(a){return z(a)===g};reactIs_production_min.isStrictMode=function(a){return z(a)===f};reactIs_production_min.isSuspense=function(a){return z(a)===p};\n reactIs_production_min.isValidElementType=function(a){return \"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};reactIs_production_min.typeOf=z;\n\n var reactIs_development = {};\n\n /** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n if (process.env.NODE_ENV !== \"production\") {\n (function() {\n\n // The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n // nor polyfill, then a plain number is used for performance.\n var hasSymbol = typeof Symbol === 'function' && Symbol.for;\n var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\n var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\n var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\n var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\n var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\n var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\n var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n // (unstable) APIs that have been removed. Can we remove the symbols?\n\n var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\n var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\n var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\n var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\n var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\n var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\n var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\n var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\n var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\n var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\n var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\n function isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n }\n\n function typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_ASYNC_MODE_TYPE:\n case REACT_CONCURRENT_MODE_TYPE:\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n } // AsyncMode is deprecated along with isAsyncMode\n\n var AsyncMode = REACT_ASYNC_MODE_TYPE;\n var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\n var ContextConsumer = REACT_CONTEXT_TYPE;\n var ContextProvider = REACT_PROVIDER_TYPE;\n var Element = REACT_ELEMENT_TYPE;\n var ForwardRef = REACT_FORWARD_REF_TYPE;\n var Fragment = REACT_FRAGMENT_TYPE;\n var Lazy = REACT_LAZY_TYPE;\n var Memo = REACT_MEMO_TYPE;\n var Portal = REACT_PORTAL_TYPE;\n var Profiler = REACT_PROFILER_TYPE;\n var StrictMode = REACT_STRICT_MODE_TYPE;\n var Suspense = REACT_SUSPENSE_TYPE;\n var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\n function isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n }\n }\n\n return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n }\n function isConcurrentMode(object) {\n return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n }\n function isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n }\n function isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n }\n function isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n function isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n }\n function isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n }\n function isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n }\n function isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n }\n function isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n }\n function isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n }\n function isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n }\n function isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n }\n\n reactIs_development.AsyncMode = AsyncMode;\n reactIs_development.ConcurrentMode = ConcurrentMode;\n reactIs_development.ContextConsumer = ContextConsumer;\n reactIs_development.ContextProvider = ContextProvider;\n reactIs_development.Element = Element;\n reactIs_development.ForwardRef = ForwardRef;\n reactIs_development.Fragment = Fragment;\n reactIs_development.Lazy = Lazy;\n reactIs_development.Memo = Memo;\n reactIs_development.Portal = Portal;\n reactIs_development.Profiler = Profiler;\n reactIs_development.StrictMode = StrictMode;\n reactIs_development.Suspense = Suspense;\n reactIs_development.isAsyncMode = isAsyncMode;\n reactIs_development.isConcurrentMode = isConcurrentMode;\n reactIs_development.isContextConsumer = isContextConsumer;\n reactIs_development.isContextProvider = isContextProvider;\n reactIs_development.isElement = isElement;\n reactIs_development.isForwardRef = isForwardRef;\n reactIs_development.isFragment = isFragment;\n reactIs_development.isLazy = isLazy;\n reactIs_development.isMemo = isMemo;\n reactIs_development.isPortal = isPortal;\n reactIs_development.isProfiler = isProfiler;\n reactIs_development.isStrictMode = isStrictMode;\n reactIs_development.isSuspense = isSuspense;\n reactIs_development.isValidElementType = isValidElementType;\n reactIs_development.typeOf = typeOf;\n })();\n }\n\n if (process.env.NODE_ENV === 'production') {\n reactIs.exports = reactIs_production_min;\n } else {\n reactIs.exports = reactIs_development;\n }\n\n /*\n object-assign\n (c) Sindre Sorhus\n @license MIT\n */\n /* eslint-disable no-unused-vars */\n var getOwnPropertySymbols = Object.getOwnPropertySymbols;\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n var propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\n function toObject(val) {\n \tif (val === null || val === undefined) {\n \t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n \t}\n\n \treturn Object(val);\n }\n\n function shouldUseNative() {\n \ttry {\n \t\tif (!Object.assign) {\n \t\t\treturn false;\n \t\t}\n\n \t\t// Detect buggy property enumeration order in older V8 versions.\n\n \t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n \t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n \t\ttest1[5] = 'de';\n \t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n \t\t\treturn false;\n \t\t}\n\n \t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n \t\tvar test2 = {};\n \t\tfor (var i = 0; i < 10; i++) {\n \t\t\ttest2['_' + String.fromCharCode(i)] = i;\n \t\t}\n \t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n \t\t\treturn test2[n];\n \t\t});\n \t\tif (order2.join('') !== '0123456789') {\n \t\t\treturn false;\n \t\t}\n\n \t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n \t\tvar test3 = {};\n \t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n \t\t\ttest3[letter] = letter;\n \t\t});\n \t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n \t\t\t\t'abcdefghijklmnopqrst') {\n \t\t\treturn false;\n \t\t}\n\n \t\treturn true;\n \t} catch (err) {\n \t\t// We don't expect any of the above to throw, but better to be safe.\n \t\treturn false;\n \t}\n }\n\n var objectAssign = shouldUseNative() ? Object.assign : function (target, source) {\n \tvar from;\n \tvar to = toObject(target);\n \tvar symbols;\n\n \tfor (var s = 1; s < arguments.length; s++) {\n \t\tfrom = Object(arguments[s]);\n\n \t\tfor (var key in from) {\n \t\t\tif (hasOwnProperty.call(from, key)) {\n \t\t\t\tto[key] = from[key];\n \t\t\t}\n \t\t}\n\n \t\tif (getOwnPropertySymbols) {\n \t\t\tsymbols = getOwnPropertySymbols(from);\n \t\t\tfor (var i = 0; i < symbols.length; i++) {\n \t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n \t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n \t\t\t\t}\n \t\t\t}\n \t\t}\n \t}\n\n \treturn to;\n };\n\n /**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n var ReactPropTypesSecret$3 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\n var ReactPropTypesSecret_1 = ReactPropTypesSecret$3;\n\n var has$2 = Function.call.bind(Object.prototype.hasOwnProperty);\n\n /**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n var printWarning$1 = function() {};\n\n if (process.env.NODE_ENV !== 'production') {\n var ReactPropTypesSecret$2 = ReactPropTypesSecret_1;\n var loggedTypeFailures = {};\n var has$1 = has$2;\n\n printWarning$1 = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) { /**/ }\n };\n }\n\n /**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\n function checkPropTypes$1(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (has$1(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +\n 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$2);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning$1(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning$1(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n }\n\n /**\n * Resets warning cache when testing.\n *\n * @private\n */\n checkPropTypes$1.resetWarningCache = function() {\n if (process.env.NODE_ENV !== 'production') {\n loggedTypeFailures = {};\n }\n };\n\n var checkPropTypes_1 = checkPropTypes$1;\n\n /**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n var ReactIs$1 = reactIs.exports;\n var assign = objectAssign;\n\n var ReactPropTypesSecret$1 = ReactPropTypesSecret_1;\n var has = has$2;\n var checkPropTypes = checkPropTypes_1;\n\n var printWarning = function() {};\n\n if (process.env.NODE_ENV !== 'production') {\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n }\n\n function emptyFunctionThatReturnsNull() {\n return null;\n }\n\n var factoryWithTypeCheckers = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bigint: createPrimitiveTypeChecker('bigint'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message, data) {\n this.message = message;\n this.data = data && typeof data === 'object' ? data: {};\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n if (process.env.NODE_ENV !== 'production') {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret$1) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use `PropTypes.checkPropTypes()` to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),\n {expectedType: expectedType}\n );\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret$1);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!ReactIs$1.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n printWarning(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret$1);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var expectedTypes = [];\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret$1);\n if (checkerResult == null) {\n return null;\n }\n if (checkerResult.data && has(checkerResult.data, 'expectedType')) {\n expectedTypes.push(checkerResult.data.expectedType);\n }\n }\n var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function invalidValidatorError(componentName, location, propFullName, key, type) {\n return new PropTypeError(\n (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'\n );\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret$1);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from props.\n var allKeys = assign({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (has(shapeTypes, key) && typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret$1);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes;\n ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n };\n\n /**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n var ReactPropTypesSecret = ReactPropTypesSecret_1;\n\n function emptyFunction() {}\n function emptyFunctionWithReset() {}\n emptyFunctionWithReset.resetWarningCache = emptyFunction;\n\n var factoryWithThrowingShims = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } shim.isRequired = shim;\n function getShim() {\n return shim;\n } // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n };\n\n /**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n if (process.env.NODE_ENV !== 'production') {\n var ReactIs = reactIs.exports;\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n propTypes.exports = factoryWithTypeCheckers(ReactIs.isElement, throwOnDirectAccess);\n } else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n propTypes.exports = factoryWithThrowingShims();\n }\n\n var PropTypes = propTypes.exports;\n\n function decodeBase64(base64, enableUnicode) {\n var binaryString = atob(base64);\n if (enableUnicode) {\n var binaryView = new Uint8Array(binaryString.length);\n for (var i = 0, n = binaryString.length; i < n; ++i) {\n binaryView[i] = binaryString.charCodeAt(i);\n }\n return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));\n }\n return binaryString;\n }\n\n function createURL(base64, sourcemapArg, enableUnicodeArg) {\n var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;\n var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;\n var source = decodeBase64(base64, enableUnicode);\n var start = source.indexOf('\\n', 10) + 1;\n var body = source.substring(start) + (sourcemap ? '\\/\\/# sourceMappingURL=' + sourcemap : '');\n var blob = new Blob([body], { type: 'application/javascript' });\n return URL.createObjectURL(blob);\n }\n\n function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n var url;\n return function WorkerFactory(options) {\n url = url || createURL(base64, sourcemapArg, enableUnicodeArg);\n return new Worker(url, options);\n };\n }\n\n var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoKCXZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9OwoKCWZ1bmN0aW9uIGdldEF1Z21lbnRlZE5hbWVzcGFjZShuKSB7CgkJaWYgKG4uX19lc01vZHVsZSkgcmV0dXJuIG47CgkJdmFyIGEgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdfX2VzTW9kdWxlJywge3ZhbHVlOiB0cnVlfSk7CgkJT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbiAoaykgewoJCQl2YXIgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobiwgayk7CgkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBrLCBkLmdldCA/IGQgOiB7CgkJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgkJCQkJcmV0dXJuIG5ba107CgkJCQl9CgkJCX0pOwoJCX0pOwoJCXJldHVybiBhOwoJfQoKCXZhciBCaW5hcnlCaXRtYXAkMSA9IHt9OwoKCXZhciBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24kMSA9IHt9OwoKCXZhciBFeGNlcHRpb24kMSA9IHt9OwoKCWZ1bmN0aW9uIGZpeFByb3RvKHRhcmdldCwgcHJvdG90eXBlKSB7CgkgIHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjsKCSAgc2V0UHJvdG90eXBlT2YgPyBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvdHlwZSkgOiB0YXJnZXQuX19wcm90b19fID0gcHJvdG90eXBlOwoJfQoJZnVuY3Rpb24gZml4U3RhY2sodGFyZ2V0LCBmbikgewoJICBpZiAoZm4gPT09IHZvaWQgMCkgewoJICAgIGZuID0gdGFyZ2V0LmNvbnN0cnVjdG9yOwoJICB9CgoJICB2YXIgY2FwdHVyZVN0YWNrVHJhY2UgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTsKCSAgY2FwdHVyZVN0YWNrVHJhY2UgJiYgY2FwdHVyZVN0YWNrVHJhY2UodGFyZ2V0LCBmbik7Cgl9CgoJdmFyIF9fZXh0ZW5kcyRrID0gZnVuY3Rpb24gKCkgewoJICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7CgkgICAgICBfX3Byb3RvX186IFtdCgkgICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICBkLl9fcHJvdG9fXyA9IGI7CgkgICAgfSB8fCBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgZm9yICh2YXIgcCBpbiBiKSB7IGlmIChiLmhhc093blByb3BlcnR5KHApKSB7IGRbcF0gPSBiW3BdOyB9IH0KCSAgICB9OwoKCSAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgfTsKCgkgIHJldHVybiBmdW5jdGlvbiAoZCwgYikgewoJICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CgoJICAgIGZ1bmN0aW9uIF9fKCkgewoJICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CgkgICAgfQoKCSAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CgkgIH07Cgl9KCk7CgoJdmFyIEN1c3RvbUVycm9yID0gZnVuY3Rpb24gKF9zdXBlcikgewoJICBfX2V4dGVuZHMkayhDdXN0b21FcnJvciwgX3N1cGVyKTsKCgkgIGZ1bmN0aW9uIEN1c3RvbUVycm9yKG1lc3NhZ2UpIHsKCSAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7CgoJICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UpIHx8IHRoaXM7CgoJICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfdGhpcywgJ25hbWUnLCB7CgkgICAgICB2YWx1ZTogX25ld1RhcmdldC5uYW1lLAoJICAgICAgZW51bWVyYWJsZTogZmFsc2UsCgkgICAgICBjb25maWd1cmFibGU6IHRydWUKCSAgICB9KTsKCSAgICBmaXhQcm90byhfdGhpcywgX25ld1RhcmdldC5wcm90b3R5cGUpOwoJICAgIGZpeFN0YWNrKF90aGlzKTsKCSAgICByZXR1cm4gX3RoaXM7CgkgIH0KCgkgIHJldHVybiBDdXN0b21FcnJvcjsKCX0oRXJyb3IpOwoKCXZhciBfX3NwcmVhZEFycmF5cyA9IGZ1bmN0aW9uICgpIHsKCSAgdmFyIGFyZ3VtZW50cyQxID0gYXJndW1lbnRzOwoKCSAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSB7IHMgKz0gYXJndW1lbnRzJDFbaV0ubGVuZ3RoOyB9CgoJICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspIHsgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspIHsgcltrXSA9IGFbal07IH0gfQoKCSAgcmV0dXJuIHI7Cgl9OwoJZnVuY3Rpb24gY3VzdG9tRXJyb3JGYWN0b3J5KGZuLCBwYXJlbnQpIHsKCSAgaWYgKHBhcmVudCA9PT0gdm9pZCAwKSB7CgkgICAgcGFyZW50ID0gRXJyb3I7CgkgIH0KCgkgIGZ1bmN0aW9uIEN1c3RvbUVycm9yKCkgewoJICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50czsKCgkgICAgdmFyIGFyZ3MgPSBbXTsKCgkgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKCSAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzJDFbX2ldOwoJICAgIH0KCgkgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEN1c3RvbUVycm9yKSkgeyByZXR1cm4gbmV3IChDdXN0b21FcnJvci5iaW5kLmFwcGx5KEN1c3RvbUVycm9yLCBfX3NwcmVhZEFycmF5cyhbdm9pZCAwXSwgYXJncykpKSgpOyB9CgkgICAgcGFyZW50LmFwcGx5KHRoaXMsIGFyZ3MpOwoJICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbmFtZScsIHsKCSAgICAgIHZhbHVlOiBmbi5uYW1lIHx8IHBhcmVudC5uYW1lLAoJICAgICAgZW51bWVyYWJsZTogZmFsc2UsCgkgICAgICBjb25maWd1cmFibGU6IHRydWUKCSAgICB9KTsKCSAgICBmbi5hcHBseSh0aGlzLCBhcmdzKTsKCSAgICBmaXhTdGFjayh0aGlzLCBDdXN0b21FcnJvcik7CgkgIH0KCgkgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDdXN0b21FcnJvciwgewoJICAgIHByb3RvdHlwZTogewoJICAgICAgdmFsdWU6IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSwgewoJICAgICAgICBjb25zdHJ1Y3RvcjogewoJICAgICAgICAgIHZhbHVlOiBDdXN0b21FcnJvciwKCSAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKCSAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKCSAgICAgICAgfQoJICAgICAgfSkKCSAgICB9CgkgIH0pOwoJfQoKCXZhciBjdXN0b21FcnJvciA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHsKCQlfX3Byb3RvX186IG51bGwsCgkJQ3VzdG9tRXJyb3I6IEN1c3RvbUVycm9yLAoJCWN1c3RvbUVycm9yRmFjdG9yeTogY3VzdG9tRXJyb3JGYWN0b3J5Cgl9KTsKCgl2YXIgcmVxdWlyZSQkMCA9IC8qQF9fUFVSRV9fKi9nZXRBdWdtZW50ZWROYW1lc3BhY2UoY3VzdG9tRXJyb3IpOwoKCXZhciBfX2V4dGVuZHMkaiA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7CgkgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8CgkgICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8CgkgICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTsKCSAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgfTsKCSAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9CgkgICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKCSAgICB9OwoJfSkoKTsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGNlcHRpb24kMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJdmFyIHRzX2N1c3RvbV9lcnJvcl8xID0gcmVxdWlyZSQkMDsKCS8qKgoJICogQ3VzdG9tIEVycm9yIGNsYXNzIG9mIHR5cGUgRXhjZXB0aW9uLgoJICovCgl2YXIgRXhjZXB0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewoJICAgIF9fZXh0ZW5kcyRqKEV4Y2VwdGlvbiwgX3N1cGVyKTsKCSAgICAvKioKCSAgICAgKiBBbGxvd3MgRXhjZXB0aW9uIHRvIGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5CgkgICAgICogd2l0aCBzb21lIG1lc3NhZ2UgYW5kIHByb3RvdHlwZSBkZWZpbml0aW9uLgoJICAgICAqLwoJICAgIGZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlKSB7CgkgICAgICAgIGlmIChtZXNzYWdlID09PSB2b2lkIDApIHsgbWVzc2FnZSA9IHVuZGVmaW5lZDsgfQoJICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlKSB8fCB0aGlzOwoJICAgICAgICBfdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKCSAgICAgICAgcmV0dXJuIF90aGlzOwoJICAgIH0KCSAgICBFeGNlcHRpb24ucHJvdG90eXBlLmdldEtpbmQgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHZhciBleCA9IHRoaXMuY29uc3RydWN0b3I7CgkgICAgICAgIHJldHVybiBleC5raW5kOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogSXQncyB0eXBlZCBhcyBzdHJpbmcgc28gaXQgY2FuIGJlIGV4dGVuZGVkIGFuZCBvdmVycmlkZW4uCgkgICAgICovCgkgICAgRXhjZXB0aW9uLmtpbmQgPSAnRXhjZXB0aW9uJzsKCSAgICByZXR1cm4gRXhjZXB0aW9uOwoJfSh0c19jdXN0b21fZXJyb3JfMS5DdXN0b21FcnJvcikpOwoJRXhjZXB0aW9uJDEuZGVmYXVsdCA9IEV4Y2VwdGlvbjsKCgl2YXIgX19leHRlbmRzJGkgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fAoJICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fAoJICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07CgkgICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgIH07CgkgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQoJICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CgkgICAgfTsKCX0pKCk7CglPYmplY3QuZGVmaW5lUHJvcGVydHkoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCXZhciBFeGNlcHRpb25fMSQ5ID0gRXhjZXB0aW9uJDE7CgkvKioKCSAqIEN1c3RvbSBFcnJvciBjbGFzcyBvZiB0eXBlIEV4Y2VwdGlvbi4KCSAqLwoJdmFyIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKCSAgICBfX2V4dGVuZHMkaShJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIF9zdXBlcik7CgkgICAgZnVuY3Rpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkgewoJICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CgkgICAgfQoJICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5raW5kID0gJ0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbic7CgkgICAgcmV0dXJuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKCX0oRXhjZXB0aW9uXzEkOS5kZWZhdWx0KSk7CglJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24kMS5kZWZhdWx0ID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwoKCS8qCgkgKiBDb3B5cmlnaHQgMjAwOSBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCglPYmplY3QuZGVmaW5lUHJvcGVydHkoQmluYXJ5Qml0bWFwJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCXZhciBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSRhID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uJDE7Cgl2YXIgQmluYXJ5Qml0bWFwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIGZ1bmN0aW9uIEJpbmFyeUJpdG1hcChiaW5hcml6ZXIpIHsKCSAgICAgICAgdGhpcy5iaW5hcml6ZXIgPSBiaW5hcml6ZXI7CgkgICAgICAgIGlmIChiaW5hcml6ZXIgPT09IG51bGwpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSRhLmRlZmF1bHQoJ0JpbmFyaXplciBtdXN0IGJlIG5vbi1udWxsLicpOwoJICAgICAgICB9CgkgICAgfQoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gVGhlIHdpZHRoIG9mIHRoZSBiaXRtYXAuCgkgICAgICovCgkgICAgQmluYXJ5Qml0bWFwLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuYmluYXJpemVyLmdldFdpZHRoKCk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIFRoZSBoZWlnaHQgb2YgdGhlIGJpdG1hcC4KCSAgICAgKi8KCSAgICBCaW5hcnlCaXRtYXAucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuYmluYXJpemVyLmdldEhlaWdodCgpOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQ29udmVydHMgb25lIHJvdyBvZiBsdW1pbmFuY2UgZGF0YSB0byAxIGJpdCBkYXRhLiBNYXkgYWN0dWFsbHkgZG8gdGhlIGNvbnZlcnNpb24sIG9yIHJldHVybgoJICAgICAqIGNhY2hlZCBkYXRhLiBDYWxsZXJzIHNob3VsZCBhc3N1bWUgdGhpcyBtZXRob2QgaXMgZXhwZW5zaXZlIGFuZCBjYWxsIGl0IGFzIHNlbGRvbSBhcyBwb3NzaWJsZS4KCSAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgZGVjb2RpbmcgMUQgYmFyY29kZXMgYW5kIG1heSBjaG9vc2UgdG8gYXBwbHkgc2hhcnBlbmluZy4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB5IFRoZSByb3cgdG8gZmV0Y2gsIHdoaWNoIG11c3QgYmUgaW4gWzAsIGJpdG1hcCBoZWlnaHQpCgkgICAgICogQHBhcmFtIHJvdyBBbiBvcHRpb25hbCBwcmVhbGxvY2F0ZWQgYXJyYXkuIElmIG51bGwgb3IgdG9vIHNtYWxsLCBpdCB3aWxsIGJlIGlnbm9yZWQuCgkgICAgICogICAgICAgICAgICBJZiB1c2VkLCB0aGUgQmluYXJpemVyIHdpbGwgY2FsbCBCaXRBcnJheS5jbGVhcigpLiBBbHdheXMgdXNlIHRoZSByZXR1cm5lZCBvYmplY3QuCgkgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2YgYml0cyBmb3IgdGhpcyByb3cgKHRydWUgbWVhbnMgYmxhY2spLgoJICAgICAqIEB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gaWYgcm93IGNhbid0IGJlIGJpbmFyaXplZAoJICAgICAqLwoJICAgIEJpbmFyeUJpdG1hcC5wcm90b3R5cGUuZ2V0QmxhY2tSb3cgPSBmdW5jdGlvbiAoeSAvKmludCovLCByb3cpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuYmluYXJpemVyLmdldEJsYWNrUm93KHksIHJvdyk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBDb252ZXJ0cyBhIDJEIGFycmF5IG9mIGx1bWluYW5jZSBkYXRhIHRvIDEgYml0LiBBcyBhYm92ZSwgYXNzdW1lIHRoaXMgbWV0aG9kIGlzIGV4cGVuc2l2ZQoJICAgICAqIGFuZCBkbyBub3QgY2FsbCBpdCByZXBlYXRlZGx5LiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgZGVjb2RpbmcgMkQgYmFyY29kZXMgYW5kIG1heSBvcgoJICAgICAqIG1heSBub3QgYXBwbHkgc2hhcnBlbmluZy4gVGhlcmVmb3JlLCBhIHJvdyBmcm9tIHRoaXMgbWF0cml4IG1heSBub3QgYmUgaWRlbnRpY2FsIHRvIG9uZQoJICAgICAqIGZldGNoZWQgdXNpbmcgZ2V0QmxhY2tSb3coKSwgc28gZG9uJ3QgbWl4IGFuZCBtYXRjaCBiZXR3ZWVuIHRoZW0uCgkgICAgICoKCSAgICAgKiBAcmV0dXJuIFRoZSAyRCBhcnJheSBvZiBiaXRzIGZvciB0aGUgaW1hZ2UgKHRydWUgbWVhbnMgYmxhY2spLgoJICAgICAqIEB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gaWYgaW1hZ2UgY2FuJ3QgYmUgYmluYXJpemVkIHRvIG1ha2UgYSBtYXRyaXgKCSAgICAgKi8KCSAgICBCaW5hcnlCaXRtYXAucHJvdG90eXBlLmdldEJsYWNrTWF0cml4ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICAvLyBUaGUgbWF0cml4IGlzIGNyZWF0ZWQgb24gZGVtYW5kIHRoZSBmaXJzdCB0aW1lIGl0IGlzIHJlcXVlc3RlZCwgdGhlbiBjYWNoZWQuIFRoZXJlIGFyZSB0d28KCSAgICAgICAgLy8gcmVhc29ucyBmb3IgdGhpczoKCSAgICAgICAgLy8gMS4gVGhpcyB3b3JrIHdpbGwgbmV2ZXIgYmUgZG9uZSBpZiB0aGUgY2FsbGVyIG9ubHkgaW5zdGFsbHMgMUQgUmVhZGVyIG9iamVjdHMsIG9yIGlmIGEKCSAgICAgICAgLy8gICAgMUQgUmVhZGVyIGZpbmRzIGEgYmFyY29kZSBiZWZvcmUgdGhlIDJEIFJlYWRlcnMgcnVuLgoJICAgICAgICAvLyAyLiBUaGlzIHdvcmsgd2lsbCBvbmx5IGJlIGRvbmUgb25jZSBldmVuIGlmIHRoZSBjYWxsZXIgaW5zdGFsbHMgbXVsdGlwbGUgMkQgUmVhZGVycy4KCSAgICAgICAgaWYgKHRoaXMubWF0cml4ID09PSBudWxsIHx8IHRoaXMubWF0cml4ID09PSB1bmRlZmluZWQpIHsKCSAgICAgICAgICAgIHRoaXMubWF0cml4ID0gdGhpcy5iaW5hcml6ZXIuZ2V0QmxhY2tNYXRyaXgoKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gdGhpcy5tYXRyaXg7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhpcyBiaXRtYXAgY2FuIGJlIGNyb3BwZWQuCgkgICAgICovCgkgICAgQmluYXJ5Qml0bWFwLnByb3RvdHlwZS5pc0Nyb3BTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmJpbmFyaXplci5nZXRMdW1pbmFuY2VTb3VyY2UoKS5pc0Nyb3BTdXBwb3J0ZWQoKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IHdpdGggY3JvcHBlZCBpbWFnZSBkYXRhLiBJbXBsZW1lbnRhdGlvbnMgbWF5IGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlCgkgICAgICogb3JpZ2luYWwgZGF0YSByYXRoZXIgdGhhbiBhIGNvcHkuIE9ubHkgY2FsbGFibGUgaWYgaXNDcm9wU3VwcG9ydGVkKCkgaXMgdHJ1ZS4KCSAgICAgKgoJICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUsIHdoaWNoIG11c3QgYmUgaW4gWzAsZ2V0V2lkdGgoKSkKCSAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSwgd2hpY2ggbXVzdCBiZSBpbiBbMCxnZXRIZWlnaHQoKSkKCSAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgdG8gY3JvcC4KCSAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0byBjcm9wLgoJICAgICAqIEByZXR1cm4gQSBjcm9wcGVkIHZlcnNpb24gb2YgdGhpcyBvYmplY3QuCgkgICAgICovCgkgICAgQmluYXJ5Qml0bWFwLnByb3RvdHlwZS5jcm9wID0gZnVuY3Rpb24gKGxlZnQgLyppbnQqLywgdG9wIC8qaW50Ki8sIHdpZHRoIC8qaW50Ki8sIGhlaWdodCAvKmludCovKSB7CgkgICAgICAgIHZhciBuZXdTb3VyY2UgPSB0aGlzLmJpbmFyaXplci5nZXRMdW1pbmFuY2VTb3VyY2UoKS5jcm9wKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCk7CgkgICAgICAgIHJldHVybiBuZXcgQmluYXJ5Qml0bWFwKHRoaXMuYmluYXJpemVyLmNyZWF0ZUJpbmFyaXplcihuZXdTb3VyY2UpKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIGJpdG1hcCBzdXBwb3J0cyBjb3VudGVyLWNsb2Nrd2lzZSByb3RhdGlvbi4KCSAgICAgKi8KCSAgICBCaW5hcnlCaXRtYXAucHJvdG90eXBlLmlzUm90YXRlU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5iaW5hcml6ZXIuZ2V0THVtaW5hbmNlU291cmNlKCkuaXNSb3RhdGVTdXBwb3J0ZWQoKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IHdpdGggcm90YXRlZCBpbWFnZSBkYXRhIGJ5IDkwIGRlZ3JlZXMgY291bnRlcmNsb2Nrd2lzZS4KCSAgICAgKiBPbmx5IGNhbGxhYmxlIGlmIHtAbGluayAjaXNSb3RhdGVTdXBwb3J0ZWQoKX0gaXMgdHJ1ZS4KCSAgICAgKgoJICAgICAqIEByZXR1cm4gQSByb3RhdGVkIHZlcnNpb24gb2YgdGhpcyBvYmplY3QuCgkgICAgICovCgkgICAgQmluYXJ5Qml0bWFwLnByb3RvdHlwZS5yb3RhdGVDb3VudGVyQ2xvY2t3aXNlID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgbmV3U291cmNlID0gdGhpcy5iaW5hcml6ZXIuZ2V0THVtaW5hbmNlU291cmNlKCkucm90YXRlQ291bnRlckNsb2Nrd2lzZSgpOwoJICAgICAgICByZXR1cm4gbmV3IEJpbmFyeUJpdG1hcCh0aGlzLmJpbmFyaXplci5jcmVhdGVCaW5hcml6ZXIobmV3U291cmNlKSk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIHJvdGF0ZWQgaW1hZ2UgZGF0YSBieSA0NSBkZWdyZWVzIGNvdW50ZXJjbG9ja3dpc2UuCgkgICAgICogT25seSBjYWxsYWJsZSBpZiB7QGxpbmsgI2lzUm90YXRlU3VwcG9ydGVkKCl9IGlzIHRydWUuCgkgICAgICoKCSAgICAgKiBAcmV0dXJuIEEgcm90YXRlZCB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0LgoJICAgICAqLwoJICAgIEJpbmFyeUJpdG1hcC5wcm90b3R5cGUucm90YXRlQ291bnRlckNsb2Nrd2lzZTQ1ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgbmV3U291cmNlID0gdGhpcy5iaW5hcml6ZXIuZ2V0THVtaW5hbmNlU291cmNlKCkucm90YXRlQ291bnRlckNsb2Nrd2lzZTQ1KCk7CgkgICAgICAgIHJldHVybiBuZXcgQmluYXJ5Qml0bWFwKHRoaXMuYmluYXJpemVyLmNyZWF0ZUJpbmFyaXplcihuZXdTb3VyY2UpKTsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBCaW5hcnlCaXRtYXAucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB0cnkgewoJICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QmxhY2tNYXRyaXgoKS50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICAgIGNhdGNoIChlIC8qOiBOb3RGb3VuZEV4Y2VwdGlvbiovKSB7CgkgICAgICAgICAgICByZXR1cm4gJyc7CgkgICAgICAgIH0KCSAgICB9OwoJICAgIHJldHVybiBCaW5hcnlCaXRtYXA7Cgl9KCkpOwoJdmFyIF9kZWZhdWx0JDMgPSBCaW5hcnlCaXRtYXAkMS5kZWZhdWx0ID0gQmluYXJ5Qml0bWFwOwoKCXZhciBIeWJyaWRCaW5hcml6ZXIkMSA9IHt9OwoKCXZhciBHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIkMSA9IHt9OwoKCXZhciBCaW5hcml6ZXIkMSA9IHt9OwoKCS8qCgkgKiBDb3B5cmlnaHQgMjAwOSBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCglPYmplY3QuZGVmaW5lUHJvcGVydHkoQmluYXJpemVyJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qKgoJICogVGhpcyBjbGFzcyBoaWVyYXJjaHkgcHJvdmlkZXMgYSBzZXQgb2YgbWV0aG9kcyB0byBjb252ZXJ0IGx1bWluYW5jZSBkYXRhIHRvIDEgYml0IGRhdGEuCgkgKiBJdCBhbGxvd3MgdGhlIGFsZ29yaXRobSB0byB2YXJ5IHBvbHltb3JwaGljYWxseSwgZm9yIGV4YW1wbGUgYWxsb3dpbmcgYSB2ZXJ5IGV4cGVuc2l2ZQoJICogdGhyZXNob2xkaW5nIHRlY2huaXF1ZSBmb3Igc2VydmVycyBhbmQgYSBmYXN0IG9uZSBmb3IgbW9iaWxlLiBJdCBhbHNvIHBlcm1pdHMgdGhlIGltcGxlbWVudGF0aW9uCgkgKiB0byB2YXJ5LCBlLmcuIGEgSk5JIHZlcnNpb24gZm9yIEFuZHJvaWQgYW5kIGEgSmF2YSBmYWxsYmFjayB2ZXJzaW9uIGZvciBvdGhlciBwbGF0Zm9ybXMuCgkgKgoJICogQGF1dGhvciBkc3dpdGtpbkBnb29nbGUuY29tIChEYW5pZWwgU3dpdGtpbikKCSAqLwoJdmFyIEJpbmFyaXplciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBCaW5hcml6ZXIoc291cmNlKSB7CgkgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwoJICAgIH0KCSAgICBCaW5hcml6ZXIucHJvdG90eXBlLmdldEx1bWluYW5jZVNvdXJjZSA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlOwoJICAgIH07CgkgICAgQmluYXJpemVyLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLmdldFdpZHRoKCk7CgkgICAgfTsKCSAgICBCaW5hcml6ZXIucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLmdldEhlaWdodCgpOwoJICAgIH07CgkgICAgcmV0dXJuIEJpbmFyaXplcjsKCX0oKSk7CglCaW5hcml6ZXIkMS5kZWZhdWx0ID0gQmluYXJpemVyOwoKCXZhciBCaXRBcnJheSQxID0ge307CgoJdmFyIEFycmF5cyQxID0ge307CgoJdmFyIFN5c3RlbSQxID0ge307CgoJT2JqZWN0LmRlZmluZVByb3BlcnR5KFN5c3RlbSQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7Cgl2YXIgU3lzdGVtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIGZ1bmN0aW9uIFN5c3RlbSgpIHsKCSAgICB9CgkgICAgLy8gcHVibGljIHN0YXRpYyB2b2lkIGFycmF5Y29weShPYmplY3Qgc3JjLCBpbnQgc3JjUG9zLCBPYmplY3QgZGVzdCwgaW50IGRlc3RQb3MsIGludCBsZW5ndGgpCgkgICAgLyoqCgkgICAgICogTWFrZXMgYSBjb3B5IG9mIGEgYXJyYXkuCgkgICAgICovCgkgICAgU3lzdGVtLmFycmF5Y29weSA9IGZ1bmN0aW9uIChzcmMsIHNyY1BvcywgZGVzdCwgZGVzdFBvcywgbGVuZ3RoKSB7CgkgICAgICAgIC8vIFRPRE86IGJldHRlciB1c2Ugc3BsaXQgb3Igc2V0PwoJICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKCSAgICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107CgkgICAgICAgIH0KCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCgkgICAgICovCgkgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gRGF0ZS5ub3coKTsKCSAgICB9OwoJICAgIHJldHVybiBTeXN0ZW07Cgl9KCkpOwoJU3lzdGVtJDEuZGVmYXVsdCA9IFN5c3RlbTsKCgl2YXIgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uJDEgPSB7fTsKCgl2YXIgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiQxID0ge307CgoJdmFyIF9fZXh0ZW5kcyRoID0gKGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHsKCSAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwKCSAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHwKCSAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9OwoJICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICB9OwoJICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH0KCSAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpOwoJICAgIH07Cgl9KSgpOwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24kMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJdmFyIEV4Y2VwdGlvbl8xJDggPSBFeGNlcHRpb24kMTsKCS8qKgoJICogQ3VzdG9tIEVycm9yIGNsYXNzIG9mIHR5cGUgRXhjZXB0aW9uLgoJICovCgl2YXIgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKCSAgICBfX2V4dGVuZHMkaChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCBfc3VwZXIpOwoJICAgIGZ1bmN0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSB7CgkgICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKCSAgICB9CgkgICAgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5raW5kID0gJ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24nOwoJICAgIHJldHVybiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOwoJfShFeGNlcHRpb25fMSQ4LmRlZmF1bHQpKTsKCUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24kMS5kZWZhdWx0ID0gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsKCgl2YXIgX19leHRlbmRzJGcgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fAoJICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fAoJICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07CgkgICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgIH07CgkgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQoJICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CgkgICAgfTsKCX0pKCk7CglPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCXZhciBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uXzEgPSBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uJDE7CgkvKioKCSAqIEN1c3RvbSBFcnJvciBjbGFzcyBvZiB0eXBlIEV4Y2VwdGlvbi4KCSAqLwoJdmFyIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKCSAgICBfX2V4dGVuZHMkZyhBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sIF9zdXBlcik7CgkgICAgZnVuY3Rpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluZGV4LCBtZXNzYWdlKSB7CgkgICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7IGluZGV4ID0gdW5kZWZpbmVkOyB9CgkgICAgICAgIGlmIChtZXNzYWdlID09PSB2b2lkIDApIHsgbWVzc2FnZSA9IHVuZGVmaW5lZDsgfQoJICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlKSB8fCB0aGlzOwoJICAgICAgICBfdGhpcy5pbmRleCA9IGluZGV4OwoJICAgICAgICBfdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKCSAgICAgICAgcmV0dXJuIF90aGlzOwoJICAgIH0KCSAgICBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24ua2luZCA9ICdBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24nOwoJICAgIHJldHVybiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247Cgl9KEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25fMS5kZWZhdWx0KSk7CglBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24kMS5kZWZhdWx0ID0gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOwoKCXZhciBfX3ZhbHVlcyQ3ID0gKGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7CgkgICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7CgkgICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7CgkgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgcmV0dXJuIHsKCSAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDsKCSAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gIk9iamVjdCBpcyBub3QgaXRlcmFibGUuIiA6ICJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIik7Cgl9OwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5cyQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7Cgl2YXIgU3lzdGVtXzEkNSA9IFN5c3RlbSQxOwoJdmFyIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDkgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24kMTsKCXZhciBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25fMSA9IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiQxOwoJdmFyIEFycmF5cyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBBcnJheXMoKSB7CgkgICAgfQoJICAgIC8qKgoJICAgICAqIEFzc2lnbnMgdGhlIHNwZWNpZmllZCBpbnQgdmFsdWUgdG8gZWFjaCBlbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkKCSAgICAgKiBvZiBpbnRzLgoJICAgICAqCgkgICAgICogQHBhcmFtIGEgdGhlIGFycmF5IHRvIGJlIGZpbGxlZAoJICAgICAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiBhbGwgZWxlbWVudHMgb2YgdGhlIGFycmF5CgkgICAgICovCgkgICAgQXJyYXlzLmZpbGwgPSBmdW5jdGlvbiAoYSwgdmFsKSB7CgkgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQoJICAgICAgICAgICAgYVtpXSA9IHZhbDsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEFzc2lnbnMgdGhlIHNwZWNpZmllZCBpbnQgdmFsdWUgdG8gZWFjaCBlbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQKCSAgICAgKiByYW5nZSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIGludHMuICBUaGUgcmFuZ2UgdG8gYmUgZmlsbGVkCgkgICAgICogZXh0ZW5kcyBmcm9tIGluZGV4IHtAY29kZSBmcm9tSW5kZXh9LCBpbmNsdXNpdmUsIHRvIGluZGV4CgkgICAgICoge0Bjb2RlIHRvSW5kZXh9LCBleGNsdXNpdmUuICAoSWYge0Bjb2RlIGZyb21JbmRleD09dG9JbmRleH0sIHRoZQoJICAgICAqIHJhbmdlIHRvIGJlIGZpbGxlZCBpcyBlbXB0eS4pCgkgICAgICoKCSAgICAgKiBAcGFyYW0gYSB0aGUgYXJyYXkgdG8gYmUgZmlsbGVkCgkgICAgICogQHBhcmFtIGZyb21JbmRleCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgKGluY2x1c2l2ZSkgdG8gYmUKCSAgICAgKiAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZQoJICAgICAqIEBwYXJhbSB0b0luZGV4IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBlbGVtZW50IChleGNsdXNpdmUpIHRvIGJlCgkgICAgICogICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUKCSAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gYWxsIGVsZW1lbnRzIG9mIHRoZSBhcnJheQoJICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBmcm9tSW5kZXggPiB0b0luZGV4fQoJICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHtAY29kZSBmcm9tSW5kZXggPCAwfSBvcgoJICAgICAqICAgICAgICAge0Bjb2RlIHRvSW5kZXggPiBhLmxlbmd0aH0KCSAgICAgKi8KCSAgICBBcnJheXMuZmlsbFdpdGhpbiA9IGZ1bmN0aW9uIChhLCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbCkgewoJICAgICAgICBBcnJheXMucmFuZ2VDaGVjayhhLmxlbmd0aCwgZnJvbUluZGV4LCB0b0luZGV4KTsKCSAgICAgICAgZm9yICh2YXIgaSA9IGZyb21JbmRleDsgaSA8IHRvSW5kZXg7IGkrKykKCSAgICAgICAgICAgIGFbaV0gPSB2YWw7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBDaGVja3MgdGhhdCB7QGNvZGUgZnJvbUluZGV4fSBhbmQge0Bjb2RlIHRvSW5kZXh9IGFyZSBpbgoJICAgICAqIHRoZSByYW5nZSBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGV5IGFyZW4ndC4KCSAgICAgKi8KCSAgICBBcnJheXMucmFuZ2VDaGVjayA9IGZ1bmN0aW9uIChhcnJheUxlbmd0aCwgZnJvbUluZGV4LCB0b0luZGV4KSB7CgkgICAgICAgIGlmIChmcm9tSW5kZXggPiB0b0luZGV4KSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkOS5kZWZhdWx0KCdmcm9tSW5kZXgoJyArIGZyb21JbmRleCArICcpID4gdG9JbmRleCgnICsgdG9JbmRleCArICcpJyk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKGZyb21JbmRleCA8IDApIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25fMS5kZWZhdWx0KGZyb21JbmRleCk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHRvSW5kZXggPiBhcnJheUxlbmd0aCkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbl8xLmRlZmF1bHQodG9JbmRleCk7CgkgICAgICAgIH0KCSAgICB9OwoJICAgIEFycmF5cy5hc0xpc3QgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHZhciBhcmdzID0gW107CgkgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CgkgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIGFyZ3M7CgkgICAgfTsKCSAgICBBcnJheXMuY3JlYXRlID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMsIHZhbHVlKSB7CgkgICAgICAgIHZhciBhcnIgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiByb3dzIH0pOwoJICAgICAgICByZXR1cm4gYXJyLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY29scyB9KS5maWxsKHZhbHVlKTsgfSk7CgkgICAgfTsKCSAgICBBcnJheXMuY3JlYXRlSW50MzJBcnJheSA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzLCB2YWx1ZSkgewoJICAgICAgICB2YXIgYXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogcm93cyB9KTsKCSAgICAgICAgcmV0dXJuIGFyci5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIEludDMyQXJyYXkuZnJvbSh7IGxlbmd0aDogY29scyB9KS5maWxsKHZhbHVlKTsgfSk7CgkgICAgfTsKCSAgICBBcnJheXMuZXF1YWxzID0gZnVuY3Rpb24gKGZpcnN0LCBzZWNvbmQpIHsKCSAgICAgICAgaWYgKCFmaXJzdCkgewoJICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICAgIGlmICghc2Vjb25kKSB7CgkgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKCFmaXJzdC5sZW5ndGgpIHsKCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoIXNlY29uZC5sZW5ndGgpIHsKCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoZmlyc3QubGVuZ3RoICE9PSBzZWNvbmQubGVuZ3RoKSB7CgkgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgIH0KCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aF8xID0gZmlyc3QubGVuZ3RoOyBpIDwgbGVuZ3RoXzE7IGkrKykgewoJICAgICAgICAgICAgaWYgKGZpcnN0W2ldICE9PSBzZWNvbmRbaV0pIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHRydWU7CgkgICAgfTsKCSAgICBBcnJheXMuaGFzaENvZGUgPSBmdW5jdGlvbiAoYSkgewoJICAgICAgICB2YXIgZV8xLCBfYTsKCSAgICAgICAgaWYgKGEgPT09IG51bGwpIHsKCSAgICAgICAgICAgIHJldHVybiAwOwoJICAgICAgICB9CgkgICAgICAgIHZhciByZXN1bHQgPSAxOwoJICAgICAgICB0cnkgewoJICAgICAgICAgICAgZm9yICh2YXIgYV8xID0gX192YWx1ZXMkNyhhKSwgYV8xXzEgPSBhXzEubmV4dCgpOyAhYV8xXzEuZG9uZTsgYV8xXzEgPSBhXzEubmV4dCgpKSB7CgkgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhXzFfMS52YWx1ZTsKCSAgICAgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGVsZW1lbnQ7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH0KCSAgICAgICAgZmluYWxseSB7CgkgICAgICAgICAgICB0cnkgewoJICAgICAgICAgICAgICAgIGlmIChhXzFfMSAmJiAhYV8xXzEuZG9uZSAmJiAoX2EgPSBhXzEucmV0dXJuKSkgX2EuY2FsbChhXzEpOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiByZXN1bHQ7CgkgICAgfTsKCSAgICBBcnJheXMuZmlsbFVpbnQ4QXJyYXkgPSBmdW5jdGlvbiAoYSwgdmFsdWUpIHsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgIT09IGEubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgIGFbaV0gPSB2YWx1ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgQXJyYXlzLmNvcHlPZiA9IGZ1bmN0aW9uIChvcmlnaW5hbCwgbmV3TGVuZ3RoKSB7CgkgICAgICAgIHJldHVybiBvcmlnaW5hbC5zbGljZSgwLCBuZXdMZW5ndGgpOwoJICAgIH07CgkgICAgQXJyYXlzLmNvcHlPZlVpbnQ4QXJyYXkgPSBmdW5jdGlvbiAob3JpZ2luYWwsIG5ld0xlbmd0aCkgewoJICAgICAgICBpZiAob3JpZ2luYWwubGVuZ3RoIDw9IG5ld0xlbmd0aCkgewoJICAgICAgICAgICAgdmFyIG5ld0FycmF5ID0gbmV3IFVpbnQ4QXJyYXkobmV3TGVuZ3RoKTsKCSAgICAgICAgICAgIG5ld0FycmF5LnNldChvcmlnaW5hbCk7CgkgICAgICAgICAgICByZXR1cm4gbmV3QXJyYXk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIG9yaWdpbmFsLnNsaWNlKDAsIG5ld0xlbmd0aCk7CgkgICAgfTsKCSAgICBBcnJheXMuY29weU9mUmFuZ2UgPSBmdW5jdGlvbiAob3JpZ2luYWwsIGZyb20sIHRvKSB7CgkgICAgICAgIHZhciBuZXdMZW5ndGggPSB0byAtIGZyb207CgkgICAgICAgIHZhciBjb3B5ID0gbmV3IEludDMyQXJyYXkobmV3TGVuZ3RoKTsKCSAgICAgICAgU3lzdGVtXzEkNS5kZWZhdWx0LmFycmF5Y29weShvcmlnaW5hbCwgZnJvbSwgY29weSwgMCwgbmV3TGVuZ3RoKTsKCSAgICAgICAgcmV0dXJuIGNvcHk7CgkgICAgfTsKCSAgICAvKgoJICAgICogUmV0dXJucyB0aGUgaW5kZXggb2Ygb2YgdGhlIGVsZW1lbnQgaW4gYSBzb3J0ZWQgYXJyYXkgb3IgKC1uLTEpIHdoZXJlIG4gaXMgdGhlIGluc2VydGlvbiBwb2ludAoJICAgICogZm9yIHRoZSBuZXcgZWxlbWVudC4KCSAgICAqIFBhcmFtZXRlcnM6CgkgICAgKiAgICAgYXIgLSBBIHNvcnRlZCBhcnJheQoJICAgICogICAgIGVsIC0gQW4gZWxlbWVudCB0byBzZWFyY2ggZm9yCgkgICAgKiAgICAgY29tcGFyYXRvciAtIEEgY29tcGFyYXRvciBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIHRha2VzIHR3byBhcmd1bWVudHM6IChhLCBiKSBhbmQgcmV0dXJuczoKCSAgICAqICAgICAgICBhIG5lZ2F0aXZlIG51bWJlciAgaWYgYSBpcyBsZXNzIHRoYW4gYjsKCSAgICAqICAgICAgICAwIGlmIGEgaXMgZXF1YWwgdG8gYjsKCSAgICAqICAgICAgICBhIHBvc2l0aXZlIG51bWJlciBvZiBhIGlzIGdyZWF0ZXIgdGhhbiBiLgoJICAgICogVGhlIGFycmF5IG1heSBjb250YWluIGR1cGxpY2F0ZSBlbGVtZW50cy4gSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgZXF1YWwgZWxlbWVudHMgaW4gdGhlIGFycmF5LAoJICAgICogdGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSB0aGUgaW5kZXggb2YgYW55IG9uZSBvZiB0aGUgZXF1YWwgZWxlbWVudHMuCgkgICAgKgoJICAgICogaHR0cDovL2pzZmlkZGxlLm5ldC9hcnl6aG92L3BrZnN0NTUwLwoJICAgICovCgkgICAgQXJyYXlzLmJpbmFyeVNlYXJjaCA9IGZ1bmN0aW9uIChhciwgZWwsIGNvbXBhcmF0b3IpIHsKCSAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gY29tcGFyYXRvcikgewoJICAgICAgICAgICAgY29tcGFyYXRvciA9IEFycmF5cy5udW1iZXJDb21wYXJhdG9yOwoJICAgICAgICB9CgkgICAgICAgIHZhciBtID0gMDsKCSAgICAgICAgdmFyIG4gPSBhci5sZW5ndGggLSAxOwoJICAgICAgICB3aGlsZSAobSA8PSBuKSB7CgkgICAgICAgICAgICB2YXIgayA9IChuICsgbSkgPj4gMTsKCSAgICAgICAgICAgIHZhciBjbXAgPSBjb21wYXJhdG9yKGVsLCBhcltrXSk7CgkgICAgICAgICAgICBpZiAoY21wID4gMCkgewoJICAgICAgICAgICAgICAgIG0gPSBrICsgMTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApIHsKCSAgICAgICAgICAgICAgICBuID0gayAtIDE7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gLW0gLSAxOwoJICAgIH07CgkgICAgQXJyYXlzLm51bWJlckNvbXBhcmF0b3IgPSBmdW5jdGlvbiAoYSwgYikgewoJICAgICAgICByZXR1cm4gYSAtIGI7CgkgICAgfTsKCSAgICByZXR1cm4gQXJyYXlzOwoJfSgpKTsKCUFycmF5cyQxLmRlZmF1bHQgPSBBcnJheXM7CgoJdmFyIEludGVnZXIkMSA9IHt9OwoKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnRlZ2VyJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qKgoJICogUG9ueWZpbGwgZm9yIEphdmEncyBJbnRlZ2VyIGNsYXNzLgoJICovCgl2YXIgSW50ZWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBJbnRlZ2VyKCkgewoJICAgIH0KCSAgICBJbnRlZ2VyLm51bWJlck9mVHJhaWxpbmdaZXJvcyA9IGZ1bmN0aW9uIChpKSB7CgkgICAgICAgIHZhciB5OwoJICAgICAgICBpZiAoaSA9PT0gMCkKCSAgICAgICAgICAgIHJldHVybiAzMjsKCSAgICAgICAgdmFyIG4gPSAzMTsKCSAgICAgICAgeSA9IGkgPDwgMTY7CgkgICAgICAgIGlmICh5ICE9PSAwKSB7CgkgICAgICAgICAgICBuIC09IDE2OwoJICAgICAgICAgICAgaSA9IHk7CgkgICAgICAgIH0KCSAgICAgICAgeSA9IGkgPDwgODsKCSAgICAgICAgaWYgKHkgIT09IDApIHsKCSAgICAgICAgICAgIG4gLT0gODsKCSAgICAgICAgICAgIGkgPSB5OwoJICAgICAgICB9CgkgICAgICAgIHkgPSBpIDw8IDQ7CgkgICAgICAgIGlmICh5ICE9PSAwKSB7CgkgICAgICAgICAgICBuIC09IDQ7CgkgICAgICAgICAgICBpID0geTsKCSAgICAgICAgfQoJICAgICAgICB5ID0gaSA8PCAyOwoJICAgICAgICBpZiAoeSAhPT0gMCkgewoJICAgICAgICAgICAgbiAtPSAyOwoJICAgICAgICAgICAgaSA9IHk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIG4gLSAoKGkgPDwgMSkgPj4+IDMxKTsKCSAgICB9OwoJICAgIEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3MgPSBmdW5jdGlvbiAoaSkgewoJICAgICAgICAvLyBIRCwgRmlndXJlIDUtNgoJICAgICAgICBpZiAoaSA9PT0gMCkgewoJICAgICAgICAgICAgcmV0dXJuIDMyOwoJICAgICAgICB9CgkgICAgICAgIHZhciBuID0gMTsKCSAgICAgICAgaWYgKGkgPj4+IDE2ID09PSAwKSB7CgkgICAgICAgICAgICBuICs9IDE2OwoJICAgICAgICAgICAgaSA8PD0gMTY7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKGkgPj4+IDI0ID09PSAwKSB7CgkgICAgICAgICAgICBuICs9IDg7CgkgICAgICAgICAgICBpIDw8PSA4OwoJICAgICAgICB9CgkgICAgICAgIGlmIChpID4+PiAyOCA9PT0gMCkgewoJICAgICAgICAgICAgbiArPSA0OwoJICAgICAgICAgICAgaSA8PD0gNDsKCSAgICAgICAgfQoJICAgICAgICBpZiAoaSA+Pj4gMzAgPT09IDApIHsKCSAgICAgICAgICAgIG4gKz0gMjsKCSAgICAgICAgICAgIGkgPDw9IDI7CgkgICAgICAgIH0KCSAgICAgICAgbiAtPSBpID4+PiAzMTsKCSAgICAgICAgcmV0dXJuIG47CgkgICAgfTsKCSAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nID0gZnVuY3Rpb24gKGkpIHsKCSAgICAgICAgcmV0dXJuIGkudG9TdHJpbmcoMTYpOwoJICAgIH07CgkgICAgSW50ZWdlci50b0JpbmFyeVN0cmluZyA9IGZ1bmN0aW9uIChpbnROdW1iZXIpIHsKCSAgICAgICAgcmV0dXJuIFN0cmluZyhwYXJzZUludChTdHJpbmcoaW50TnVtYmVyKSwgMikpOwoJICAgIH07CgkgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9uZS1iaXRzIGluIHRoZSB0d28ncyBjb21wbGVtZW50IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGludCB2YWx1ZS4gVGhpcyBmdW5jdGlvbiBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgdGhlIHBvcHVsYXRpb24gY291bnQuCgkgICAgLy8gUmV0dXJuczoKCSAgICAvLyB0aGUgbnVtYmVyIG9mIG9uZS1iaXRzIGluIHRoZSB0d28ncyBjb21wbGVtZW50IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGludCB2YWx1ZS4KCSAgICBJbnRlZ2VyLmJpdENvdW50ID0gZnVuY3Rpb24gKGkpIHsKCSAgICAgICAgLy8gSEQsIEZpZ3VyZSA1LTIKCSAgICAgICAgaSA9IGkgLSAoKGkgPj4+IDEpICYgMHg1NTU1NTU1NSk7CgkgICAgICAgIGkgPSAoaSAmIDB4MzMzMzMzMzMpICsgKChpID4+PiAyKSAmIDB4MzMzMzMzMzMpOwoJICAgICAgICBpID0gKGkgKyAoaSA+Pj4gNCkpICYgMHgwZjBmMGYwZjsKCSAgICAgICAgaSA9IGkgKyAoaSA+Pj4gOCk7CgkgICAgICAgIGkgPSBpICsgKGkgPj4+IDE2KTsKCSAgICAgICAgcmV0dXJuIGkgJiAweDNmOwoJICAgIH07CgkgICAgSW50ZWdlci50cnVuY0RpdmlzaW9uID0gZnVuY3Rpb24gKGRpdmlkZW5kLCBkaXZpc29yKSB7CgkgICAgICAgIHJldHVybiBNYXRoLnRydW5jKGRpdmlkZW5kIC8gZGl2aXNvcik7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBDb252ZXJ0cyBBIHN0cmluZyB0byBhbiBpbnRlZ2VyLgoJICAgICAqIEBwYXJhbSBzIEEgc3RyaW5nIHRvIGNvbnZlcnQgaW50byBhIG51bWJlci4KCSAgICAgKiBAcGFyYW0gcmFkaXggQSB2YWx1ZSBiZXR3ZWVuIDIgYW5kIDM2IHRoYXQgc3BlY2lmaWVzIHRoZSBiYXNlIG9mIHRoZSBudW1iZXIgaW4gbnVtU3RyaW5nLiBJZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBzdXBwbGllZCwgc3RyaW5ncyB3aXRoIGEgcHJlZml4IG9mICcweCcgYXJlIGNvbnNpZGVyZWQgaGV4YWRlY2ltYWwuIEFsbCBvdGhlciBzdHJpbmdzIGFyZSBjb25zaWRlcmVkIGRlY2ltYWwuCgkgICAgICovCgkgICAgSW50ZWdlci5wYXJzZUludCA9IGZ1bmN0aW9uIChudW0sIHJhZGl4KSB7CgkgICAgICAgIGlmIChyYWRpeCA9PT0gdm9pZCAwKSB7IHJhZGl4ID0gdW5kZWZpbmVkOyB9CgkgICAgICAgIHJldHVybiBwYXJzZUludChudW0sIHJhZGl4KTsKCSAgICB9OwoJICAgIEludGVnZXIuTUlOX1ZBTFVFXzMyX0JJVFMgPSAtMjE0NzQ4MzY0ODsKCSAgICBJbnRlZ2VyLk1BWF9WQUxVRSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSOwoJICAgIHJldHVybiBJbnRlZ2VyOwoJfSgpKTsKCUludGVnZXIkMS5kZWZhdWx0ID0gSW50ZWdlcjsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEJpdEFycmF5JDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcuY29tbW9uIHsqLwoJLyppbXBvcnQgamF2YS51dGlsLkFycmF5czsqLwoJdmFyIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDggPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24kMTsKCXZhciBBcnJheXNfMSQxID0gQXJyYXlzJDE7Cgl2YXIgSW50ZWdlcl8xJDIgPSBJbnRlZ2VyJDE7Cgl2YXIgU3lzdGVtXzEkNCA9IFN5c3RlbSQxOwoJLyoqCgkgKiA8cD5BIHNpbXBsZSwgZmFzdCBhcnJheSBvZiBiaXRzLCByZXByZXNlbnRlZCBjb21wYWN0bHkgYnkgYW4gYXJyYXkgb2YgaW50cyBpbnRlcm5hbGx5LjwvcD4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICovCgl2YXIgQml0QXJyYXkgLyppbXBsZW1lbnRzIENsb25lYWJsZSovID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIC8vIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHsKCSAgICAvLyAgIHRoaXMuc2l6ZSA9IDAKCSAgICAvLyAgIHRoaXMuYml0cyA9IG5ldyBJbnQzMkFycmF5KDEpCgkgICAgLy8gfQoJICAgIC8vIHB1YmxpYyBjb25zdHJ1Y3RvcihzaXplPzogbnVtYmVyIC8qaW50Ki8pIHsKCSAgICAvLyAgIGlmICh1bmRlZmluZWQgPT09IHNpemUpIHsKCSAgICAvLyAgICAgdGhpcy5zaXplID0gMAoJICAgIC8vICAgfSBlbHNlIHsKCSAgICAvLyAgICAgdGhpcy5zaXplID0gc2l6ZQoJICAgIC8vICAgfQoJICAgIC8vICAgdGhpcy5iaXRzID0gdGhpcy5tYWtlQXJyYXkoc2l6ZSkKCSAgICAvLyB9CgkgICAgLy8gRm9yIHRlc3Rpbmcgb25seQoJICAgIGZ1bmN0aW9uIEJpdEFycmF5KHNpemUgLyppbnQqLywgYml0cykgewoJICAgICAgICBpZiAodW5kZWZpbmVkID09PSBzaXplKSB7CgkgICAgICAgICAgICB0aGlzLnNpemUgPSAwOwoJICAgICAgICAgICAgdGhpcy5iaXRzID0gbmV3IEludDMyQXJyYXkoMSk7CgkgICAgICAgIH0KCSAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICB0aGlzLnNpemUgPSBzaXplOwoJICAgICAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gYml0cyB8fCBudWxsID09PSBiaXRzKSB7CgkgICAgICAgICAgICAgICAgdGhpcy5iaXRzID0gQml0QXJyYXkubWFrZUFycmF5KHNpemUpOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgdGhpcy5iaXRzID0gYml0czsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgIH0KCSAgICBCaXRBcnJheS5wcm90b3R5cGUuZ2V0U2l6ZSA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTsKCSAgICB9OwoJICAgIEJpdEFycmF5LnByb3RvdHlwZS5nZXRTaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHRoaXMuc2l6ZSArIDcpIC8gOCk7CgkgICAgfTsKCSAgICBCaXRBcnJheS5wcm90b3R5cGUuZW5zdXJlQ2FwYWNpdHkgPSBmdW5jdGlvbiAoc2l6ZSAvKmludCovKSB7CgkgICAgICAgIGlmIChzaXplID4gdGhpcy5iaXRzLmxlbmd0aCAqIDMyKSB7CgkgICAgICAgICAgICB2YXIgbmV3Qml0cyA9IEJpdEFycmF5Lm1ha2VBcnJheShzaXplKTsKCSAgICAgICAgICAgIFN5c3RlbV8xJDQuZGVmYXVsdC5hcnJheWNvcHkodGhpcy5iaXRzLCAwLCBuZXdCaXRzLCAwLCB0aGlzLmJpdHMubGVuZ3RoKTsKCSAgICAgICAgICAgIHRoaXMuYml0cyA9IG5ld0JpdHM7CgkgICAgICAgIH0KCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEBwYXJhbSBpIGJpdCB0byBnZXQKCSAgICAgKiBAcmV0dXJuIHRydWUgaWZmIGJpdCBpIGlzIHNldAoJICAgICAqLwoJICAgIEJpdEFycmF5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoaSAvKmludCovKSB7CgkgICAgICAgIHJldHVybiAodGhpcy5iaXRzW01hdGguZmxvb3IoaSAvIDMyKV0gJiAoMSA8PCAoaSAmIDB4MUYpKSkgIT09IDA7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBTZXRzIGJpdCBpLgoJICAgICAqCgkgICAgICogQHBhcmFtIGkgYml0IHRvIHNldAoJICAgICAqLwoJICAgIEJpdEFycmF5LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoaSAvKmludCovKSB7CgkgICAgICAgIHRoaXMuYml0c1tNYXRoLmZsb29yKGkgLyAzMildIHw9IDEgPDwgKGkgJiAweDFGKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEZsaXBzIGJpdCBpLgoJICAgICAqCgkgICAgICogQHBhcmFtIGkgYml0IHRvIHNldAoJICAgICAqLwoJICAgIEJpdEFycmF5LnByb3RvdHlwZS5mbGlwID0gZnVuY3Rpb24gKGkgLyppbnQqLykgewoJICAgICAgICB0aGlzLmJpdHNbTWF0aC5mbG9vcihpIC8gMzIpXSBePSAxIDw8IChpICYgMHgxRik7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcGFyYW0gZnJvbSBmaXJzdCBiaXQgdG8gY2hlY2sKCSAgICAgKiBAcmV0dXJuIGluZGV4IG9mIGZpcnN0IGJpdCB0aGF0IGlzIHNldCwgc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gaW5kZXgsIG9yIHNpemUgaWYgbm9uZSBhcmUgc2V0CgkgICAgICogIGF0IG9yIGJleW9uZCB0aGlzIGdpdmVuIGluZGV4CgkgICAgICogQHNlZSAjZ2V0TmV4dFVuc2V0KGludCkKCSAgICAgKi8KCSAgICBCaXRBcnJheS5wcm90b3R5cGUuZ2V0TmV4dFNldCA9IGZ1bmN0aW9uIChmcm9tIC8qaW50Ki8pIHsKCSAgICAgICAgdmFyIHNpemUgPSB0aGlzLnNpemU7CgkgICAgICAgIGlmIChmcm9tID49IHNpemUpIHsKCSAgICAgICAgICAgIHJldHVybiBzaXplOwoJICAgICAgICB9CgkgICAgICAgIHZhciBiaXRzID0gdGhpcy5iaXRzOwoJICAgICAgICB2YXIgYml0c09mZnNldCA9IE1hdGguZmxvb3IoZnJvbSAvIDMyKTsKCSAgICAgICAgdmFyIGN1cnJlbnRCaXRzID0gYml0c1tiaXRzT2Zmc2V0XTsKCSAgICAgICAgLy8gbWFzayBvZmYgbGVzc2VyIGJpdHMgZmlyc3QKCSAgICAgICAgY3VycmVudEJpdHMgJj0gfigoMSA8PCAoZnJvbSAmIDB4MUYpKSAtIDEpOwoJICAgICAgICB2YXIgbGVuZ3RoID0gYml0cy5sZW5ndGg7CgkgICAgICAgIHdoaWxlIChjdXJyZW50Qml0cyA9PT0gMCkgewoJICAgICAgICAgICAgaWYgKCsrYml0c09mZnNldCA9PT0gbGVuZ3RoKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBjdXJyZW50Qml0cyA9IGJpdHNbYml0c09mZnNldF07CgkgICAgICAgIH0KCSAgICAgICAgdmFyIHJlc3VsdCA9IChiaXRzT2Zmc2V0ICogMzIpICsgSW50ZWdlcl8xJDIuZGVmYXVsdC5udW1iZXJPZlRyYWlsaW5nWmVyb3MoY3VycmVudEJpdHMpOwoJICAgICAgICByZXR1cm4gcmVzdWx0ID4gc2l6ZSA/IHNpemUgOiByZXN1bHQ7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcGFyYW0gZnJvbSBpbmRleCB0byBzdGFydCBsb29raW5nIGZvciB1bnNldCBiaXQKCSAgICAgKiBAcmV0dXJuIGluZGV4IG9mIG5leHQgdW5zZXQgYml0LCBvciB7QGNvZGUgc2l6ZX0gaWYgbm9uZSBhcmUgdW5zZXQgdW50aWwgdGhlIGVuZAoJICAgICAqIEBzZWUgI2dldE5leHRTZXQoaW50KQoJICAgICAqLwoJICAgIEJpdEFycmF5LnByb3RvdHlwZS5nZXROZXh0VW5zZXQgPSBmdW5jdGlvbiAoZnJvbSAvKmludCovKSB7CgkgICAgICAgIHZhciBzaXplID0gdGhpcy5zaXplOwoJICAgICAgICBpZiAoZnJvbSA+PSBzaXplKSB7CgkgICAgICAgICAgICByZXR1cm4gc2l6ZTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgYml0cyA9IHRoaXMuYml0czsKCSAgICAgICAgdmFyIGJpdHNPZmZzZXQgPSBNYXRoLmZsb29yKGZyb20gLyAzMik7CgkgICAgICAgIHZhciBjdXJyZW50Qml0cyA9IH5iaXRzW2JpdHNPZmZzZXRdOwoJICAgICAgICAvLyBtYXNrIG9mZiBsZXNzZXIgYml0cyBmaXJzdAoJICAgICAgICBjdXJyZW50Qml0cyAmPSB+KCgxIDw8IChmcm9tICYgMHgxRikpIC0gMSk7CgkgICAgICAgIHZhciBsZW5ndGggPSBiaXRzLmxlbmd0aDsKCSAgICAgICAgd2hpbGUgKGN1cnJlbnRCaXRzID09PSAwKSB7CgkgICAgICAgICAgICBpZiAoKytiaXRzT2Zmc2V0ID09PSBsZW5ndGgpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGN1cnJlbnRCaXRzID0gfmJpdHNbYml0c09mZnNldF07CgkgICAgICAgIH0KCSAgICAgICAgdmFyIHJlc3VsdCA9IChiaXRzT2Zmc2V0ICogMzIpICsgSW50ZWdlcl8xJDIuZGVmYXVsdC5udW1iZXJPZlRyYWlsaW5nWmVyb3MoY3VycmVudEJpdHMpOwoJICAgICAgICByZXR1cm4gcmVzdWx0ID4gc2l6ZSA/IHNpemUgOiByZXN1bHQ7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBTZXRzIGEgYmxvY2sgb2YgMzIgYml0cywgc3RhcnRpbmcgYXQgYml0IGkuCgkgICAgICoKCSAgICAgKiBAcGFyYW0gaSBmaXJzdCBiaXQgdG8gc2V0CgkgICAgICogQHBhcmFtIG5ld0JpdHMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgbmV4dCAzMiBiaXRzLiBOb3RlIGFnYWluIHRoYXQgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdAoJICAgICAqIGNvcnJlc3BvbmRzIHRvIGJpdCBpLCB0aGUgbmV4dC1sZWFzdC1zaWduaWZpY2FudCB0byBpKzEsIGFuZCBzbyBvbi4KCSAgICAgKi8KCSAgICBCaXRBcnJheS5wcm90b3R5cGUuc2V0QnVsayA9IGZ1bmN0aW9uIChpIC8qaW50Ki8sIG5ld0JpdHMgLyppbnQqLykgewoJICAgICAgICB0aGlzLmJpdHNbTWF0aC5mbG9vcihpIC8gMzIpXSA9IG5ld0JpdHM7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBTZXRzIGEgcmFuZ2Ugb2YgYml0cy4KCSAgICAgKgoJICAgICAqIEBwYXJhbSBzdGFydCBzdGFydCBvZiByYW5nZSwgaW5jbHVzaXZlLgoJICAgICAqIEBwYXJhbSBlbmQgZW5kIG9mIHJhbmdlLCBleGNsdXNpdmUKCSAgICAgKi8KCSAgICBCaXRBcnJheS5wcm90b3R5cGUuc2V0UmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQgLyppbnQqLywgZW5kIC8qaW50Ki8pIHsKCSAgICAgICAgaWYgKGVuZCA8IHN0YXJ0IHx8IHN0YXJ0IDwgMCB8fCBlbmQgPiB0aGlzLnNpemUpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSQ4LmRlZmF1bHQoKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoZW5kID09PSBzdGFydCkgewoJICAgICAgICAgICAgcmV0dXJuOwoJICAgICAgICB9CgkgICAgICAgIGVuZC0tOyAvLyB3aWxsIGJlIGVhc2llciB0byB0cmVhdCB0aGlzIGFzIHRoZSBsYXN0IGFjdHVhbGx5IHNldCBiaXQgLS0gaW5jbHVzaXZlCgkgICAgICAgIHZhciBmaXJzdEludCA9IE1hdGguZmxvb3Ioc3RhcnQgLyAzMik7CgkgICAgICAgIHZhciBsYXN0SW50ID0gTWF0aC5mbG9vcihlbmQgLyAzMik7CgkgICAgICAgIHZhciBiaXRzID0gdGhpcy5iaXRzOwoJICAgICAgICBmb3IgKHZhciBpID0gZmlyc3RJbnQ7IGkgPD0gbGFzdEludDsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgZmlyc3RCaXQgPSBpID4gZmlyc3RJbnQgPyAwIDogc3RhcnQgJiAweDFGOwoJICAgICAgICAgICAgdmFyIGxhc3RCaXQgPSBpIDwgbGFzdEludCA/IDMxIDogZW5kICYgMHgxRjsKCSAgICAgICAgICAgIC8vIE9uZXMgZnJvbSBmaXJzdEJpdCB0byBsYXN0Qml0LCBpbmNsdXNpdmUKCSAgICAgICAgICAgIHZhciBtYXNrID0gKDIgPDwgbGFzdEJpdCkgLSAoMSA8PCBmaXJzdEJpdCk7CgkgICAgICAgICAgICBiaXRzW2ldIHw9IG1hc2s7CgkgICAgICAgIH0KCSAgICB9OwoJICAgIC8qKgoJICAgICAqIENsZWFycyBhbGwgYml0cyAoc2V0cyB0byBmYWxzZSkuCgkgICAgICovCgkgICAgQml0QXJyYXkucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgbWF4ID0gdGhpcy5iaXRzLmxlbmd0aDsKCSAgICAgICAgdmFyIGJpdHMgPSB0aGlzLmJpdHM7CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKCSAgICAgICAgICAgIGJpdHNbaV0gPSAwOwoJICAgICAgICB9CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBFZmZpY2llbnQgbWV0aG9kIHRvIGNoZWNrIGlmIGEgcmFuZ2Ugb2YgYml0cyBpcyBzZXQsIG9yIG5vdCBzZXQuCgkgICAgICoKCSAgICAgKiBAcGFyYW0gc3RhcnQgc3RhcnQgb2YgcmFuZ2UsIGluY2x1c2l2ZS4KCSAgICAgKiBAcGFyYW0gZW5kIGVuZCBvZiByYW5nZSwgZXhjbHVzaXZlCgkgICAgICogQHBhcmFtIHZhbHVlIGlmIHRydWUsIGNoZWNrcyB0aGF0IGJpdHMgaW4gcmFuZ2UgYXJlIHNldCwgb3RoZXJ3aXNlIGNoZWNrcyB0aGF0IHRoZXkgYXJlIG5vdCBzZXQKCSAgICAgKiBAcmV0dXJuIHRydWUgaWZmIGFsbCBiaXRzIGFyZSBzZXQgb3Igbm90IHNldCBpbiByYW5nZSwgYWNjb3JkaW5nIHRvIHZhbHVlIGFyZ3VtZW50CgkgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZW5kIGlzIGxlc3MgdGhhbiBzdGFydCBvciB0aGUgcmFuZ2UgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgYXJyYXkKCSAgICAgKi8KCSAgICBCaXRBcnJheS5wcm90b3R5cGUuaXNSYW5nZSA9IGZ1bmN0aW9uIChzdGFydCAvKmludCovLCBlbmQgLyppbnQqLywgdmFsdWUpIHsKCSAgICAgICAgaWYgKGVuZCA8IHN0YXJ0IHx8IHN0YXJ0IDwgMCB8fCBlbmQgPiB0aGlzLnNpemUpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSQ4LmRlZmF1bHQoKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoZW5kID09PSBzdGFydCkgewoJICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGVtcHR5IHJhbmdlIG1hdGNoZXMKCSAgICAgICAgfQoJICAgICAgICBlbmQtLTsgLy8gd2lsbCBiZSBlYXNpZXIgdG8gdHJlYXQgdGhpcyBhcyB0aGUgbGFzdCBhY3R1YWxseSBzZXQgYml0IC0tIGluY2x1c2l2ZQoJICAgICAgICB2YXIgZmlyc3RJbnQgPSBNYXRoLmZsb29yKHN0YXJ0IC8gMzIpOwoJICAgICAgICB2YXIgbGFzdEludCA9IE1hdGguZmxvb3IoZW5kIC8gMzIpOwoJICAgICAgICB2YXIgYml0cyA9IHRoaXMuYml0czsKCSAgICAgICAgZm9yICh2YXIgaSA9IGZpcnN0SW50OyBpIDw9IGxhc3RJbnQ7IGkrKykgewoJICAgICAgICAgICAgdmFyIGZpcnN0Qml0ID0gaSA+IGZpcnN0SW50ID8gMCA6IHN0YXJ0ICYgMHgxRjsKCSAgICAgICAgICAgIHZhciBsYXN0Qml0ID0gaSA8IGxhc3RJbnQgPyAzMSA6IGVuZCAmIDB4MUY7CgkgICAgICAgICAgICAvLyBPbmVzIGZyb20gZmlyc3RCaXQgdG8gbGFzdEJpdCwgaW5jbHVzaXZlCgkgICAgICAgICAgICB2YXIgbWFzayA9ICgyIDw8IGxhc3RCaXQpIC0gKDEgPDwgZmlyc3RCaXQpICYgMHhGRkZGRkZGRjsKCSAgICAgICAgICAgIC8vIFRZUEVTQ1JJUFRQT1JUOiAmIDB4RkZGRkZGRkYgYWRkZWQgdG8gZGlzY2FyZCBhbnl0aGluZyBhZnRlciAzMiBiaXRzLCBhcyBFUyBoYXMgNTMgYml0cwoJICAgICAgICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIHdlJ3JlIGxvb2tpbmcgZm9yIDFzIGFuZCB0aGUgbWFza2VkIGJpdHNbaV0gaXNuJ3QgYWxsIDFzIChpczogdGhhdCwKCSAgICAgICAgICAgIC8vIGVxdWFscyB0aGUgbWFzaywgb3Igd2UncmUgbG9va2luZyBmb3IgMHMgYW5kIHRoZSBtYXNrZWQgcG9ydGlvbiBpcyBub3QgYWxsIDBzCgkgICAgICAgICAgICBpZiAoKGJpdHNbaV0gJiBtYXNrKSAhPT0gKHZhbHVlID8gbWFzayA6IDApKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiB0cnVlOwoJICAgIH07CgkgICAgQml0QXJyYXkucHJvdG90eXBlLmFwcGVuZEJpdCA9IGZ1bmN0aW9uIChiaXQpIHsKCSAgICAgICAgdGhpcy5lbnN1cmVDYXBhY2l0eSh0aGlzLnNpemUgKyAxKTsKCSAgICAgICAgaWYgKGJpdCkgewoJICAgICAgICAgICAgdGhpcy5iaXRzW01hdGguZmxvb3IodGhpcy5zaXplIC8gMzIpXSB8PSAxIDw8ICh0aGlzLnNpemUgJiAweDFGKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLnNpemUrKzsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEFwcGVuZHMgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdHMsIGZyb20gdmFsdWUsIGluIG9yZGVyIGZyb20gbW9zdC1zaWduaWZpY2FudCB0bwoJICAgICAqIGxlYXN0LXNpZ25pZmljYW50LiBGb3IgZXhhbXBsZSwgYXBwZW5kaW5nIDYgYml0cyBmcm9tIDB4MDAwMDAxRSB3aWxsIGFwcGVuZCB0aGUgYml0cwoJICAgICAqIDAsIDEsIDEsIDEsIDEsIDAgaW4gdGhhdCBvcmRlci4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB2YWx1ZSB7QGNvZGUgaW50fSBjb250YWluaW5nIGJpdHMgdG8gYXBwZW5kCgkgICAgICogQHBhcmFtIG51bUJpdHMgYml0cyBmcm9tIHZhbHVlIHRvIGFwcGVuZAoJICAgICAqLwoJICAgIEJpdEFycmF5LnByb3RvdHlwZS5hcHBlbmRCaXRzID0gZnVuY3Rpb24gKHZhbHVlIC8qaW50Ki8sIG51bUJpdHMgLyppbnQqLykgewoJICAgICAgICBpZiAobnVtQml0cyA8IDAgfHwgbnVtQml0cyA+IDMyKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkOC5kZWZhdWx0KCdOdW0gYml0cyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzInKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLmVuc3VyZUNhcGFjaXR5KHRoaXMuc2l6ZSArIG51bUJpdHMpOwoJICAgICAgICAvLyBjb25zdCBhcHBlbmRCaXQgPSB0aGlzLmFwcGVuZEJpdDsKCSAgICAgICAgZm9yICh2YXIgbnVtQml0c0xlZnQgPSBudW1CaXRzOyBudW1CaXRzTGVmdCA+IDA7IG51bUJpdHNMZWZ0LS0pIHsKCSAgICAgICAgICAgIHRoaXMuYXBwZW5kQml0KCgodmFsdWUgPj4gKG51bUJpdHNMZWZ0IC0gMSkpICYgMHgwMSkgPT09IDEpOwoJICAgICAgICB9CgkgICAgfTsKCSAgICBCaXRBcnJheS5wcm90b3R5cGUuYXBwZW5kQml0QXJyYXkgPSBmdW5jdGlvbiAob3RoZXIpIHsKCSAgICAgICAgdmFyIG90aGVyU2l6ZSA9IG90aGVyLnNpemU7CgkgICAgICAgIHRoaXMuZW5zdXJlQ2FwYWNpdHkodGhpcy5zaXplICsgb3RoZXJTaXplKTsKCSAgICAgICAgLy8gY29uc3QgYXBwZW5kQml0ID0gdGhpcy5hcHBlbmRCaXQ7CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3RoZXJTaXplOyBpKyspIHsKCSAgICAgICAgICAgIHRoaXMuYXBwZW5kQml0KG90aGVyLmdldChpKSk7CgkgICAgICAgIH0KCSAgICB9OwoJICAgIEJpdEFycmF5LnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbiAob3RoZXIpIHsKCSAgICAgICAgaWYgKHRoaXMuc2l6ZSAhPT0gb3RoZXIuc2l6ZSkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDguZGVmYXVsdCgnU2l6ZXMgZG9uXCd0IG1hdGNoJyk7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIGJpdHMgPSB0aGlzLmJpdHM7CgkgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGhfMSA9IGJpdHMubGVuZ3RoOyBpIDwgbGVuZ3RoXzE7IGkrKykgewoJICAgICAgICAgICAgLy8gVGhlIGxhc3QgaW50IGNvdWxkIGJlIGluY29tcGxldGUgKGkuZS4gbm90IGhhdmUgMzIgYml0cyBpbgoJICAgICAgICAgICAgLy8gaXQpIGJ1dCB0aGVyZSBpcyBubyBwcm9ibGVtIHNpbmNlIDAgWE9SIDAgPT0gMC4KCSAgICAgICAgICAgIGJpdHNbaV0gXj0gb3RoZXIuYml0c1tpXTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyoqCgkgICAgICoKCSAgICAgKiBAcGFyYW0gYml0T2Zmc2V0IGZpcnN0IGJpdCB0byBzdGFydCB3cml0aW5nCgkgICAgICogQHBhcmFtIGFycmF5IGFycmF5IHRvIHdyaXRlIGludG8uIEJ5dGVzIGFyZSB3cml0dGVuIG1vc3Qtc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdC4gVGhpcyBpcyB0aGUgb3Bwb3NpdGUKCSAgICAgKiAgb2YgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLCB3aGljaCBpcyBleHBvc2VkIGJ5IHtAbGluayAjZ2V0Qml0QXJyYXkoKX0KCSAgICAgKiBAcGFyYW0gb2Zmc2V0IHBvc2l0aW9uIGluIGFycmF5IHRvIHN0YXJ0IHdyaXRpbmcKCSAgICAgKiBAcGFyYW0gbnVtQnl0ZXMgaG93IG1hbnkgYnl0ZXMgdG8gd3JpdGUKCSAgICAgKi8KCSAgICBCaXRBcnJheS5wcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uIChiaXRPZmZzZXQgLyppbnQqLywgYXJyYXksIG9mZnNldCAvKmludCovLCBudW1CeXRlcyAvKmludCovKSB7CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtQnl0ZXM7IGkrKykgewoJICAgICAgICAgICAgdmFyIHRoZUJ5dGUgPSAwOwoJICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHsKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXQoYml0T2Zmc2V0KSkgewoJICAgICAgICAgICAgICAgICAgICB0aGVCeXRlIHw9IDEgPDwgKDcgLSBqKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgYml0T2Zmc2V0Kys7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBhcnJheVtvZmZzZXQgKyBpXSA9IC8qKGJ5dGUpKi8gdGhlQnl0ZTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiB1bmRlcmx5aW5nIGFycmF5IG9mIGludHMuIFRoZSBmaXJzdCBlbGVtZW50IGhvbGRzIHRoZSBmaXJzdCAzMiBiaXRzLCBhbmQgdGhlIGxlYXN0CgkgICAgICogICAgICAgICBzaWduaWZpY2FudCBiaXQgaXMgYml0IDAuCgkgICAgICovCgkgICAgQml0QXJyYXkucHJvdG90eXBlLmdldEJpdEFycmF5ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5iaXRzOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogUmV2ZXJzZXMgYWxsIGJpdHMgaW4gdGhlIGFycmF5LgoJICAgICAqLwoJICAgIEJpdEFycmF5LnByb3RvdHlwZS5yZXZlcnNlID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgbmV3Qml0cyA9IG5ldyBJbnQzMkFycmF5KHRoaXMuYml0cy5sZW5ndGgpOwoJICAgICAgICAvLyByZXZlcnNlIGFsbCBpbnQncyBmaXJzdAoJICAgICAgICB2YXIgbGVuID0gTWF0aC5mbG9vcigodGhpcy5zaXplIC0gMSkgLyAzMik7CgkgICAgICAgIHZhciBvbGRCaXRzTGVuID0gbGVuICsgMTsKCSAgICAgICAgdmFyIGJpdHMgPSB0aGlzLmJpdHM7CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2xkQml0c0xlbjsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgeCA9IGJpdHNbaV07CgkgICAgICAgICAgICB4ID0gKCh4ID4+IDEpICYgMHg1NTU1NTU1NSkgfCAoKHggJiAweDU1NTU1NTU1KSA8PCAxKTsKCSAgICAgICAgICAgIHggPSAoKHggPj4gMikgJiAweDMzMzMzMzMzKSB8ICgoeCAmIDB4MzMzMzMzMzMpIDw8IDIpOwoJICAgICAgICAgICAgeCA9ICgoeCA+PiA0KSAmIDB4MGYwZjBmMGYpIHwgKCh4ICYgMHgwZjBmMGYwZikgPDwgNCk7CgkgICAgICAgICAgICB4ID0gKCh4ID4+IDgpICYgMHgwMGZmMDBmZikgfCAoKHggJiAweDAwZmYwMGZmKSA8PCA4KTsKCSAgICAgICAgICAgIHggPSAoKHggPj4gMTYpICYgMHgwMDAwZmZmZikgfCAoKHggJiAweDAwMDBmZmZmKSA8PCAxNik7CgkgICAgICAgICAgICBuZXdCaXRzW2xlbiAtIGldID0gLyooaW50KSovIHg7CgkgICAgICAgIH0KCSAgICAgICAgLy8gbm93IGNvcnJlY3QgdGhlIGludCdzIGlmIHRoZSBiaXQgc2l6ZSBpc24ndCBhIG11bHRpcGxlIG9mIDMyCgkgICAgICAgIGlmICh0aGlzLnNpemUgIT09IG9sZEJpdHNMZW4gKiAzMikgewoJICAgICAgICAgICAgdmFyIGxlZnRPZmZzZXQgPSBvbGRCaXRzTGVuICogMzIgLSB0aGlzLnNpemU7CgkgICAgICAgICAgICB2YXIgY3VycmVudEludCA9IG5ld0JpdHNbMF0gPj4+IGxlZnRPZmZzZXQ7CgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IG9sZEJpdHNMZW47IGkrKykgewoJICAgICAgICAgICAgICAgIHZhciBuZXh0SW50ID0gbmV3Qml0c1tpXTsKCSAgICAgICAgICAgICAgICBjdXJyZW50SW50IHw9IG5leHRJbnQgPDwgKDMyIC0gbGVmdE9mZnNldCk7CgkgICAgICAgICAgICAgICAgbmV3Qml0c1tpIC0gMV0gPSBjdXJyZW50SW50OwoJICAgICAgICAgICAgICAgIGN1cnJlbnRJbnQgPSBuZXh0SW50ID4+PiBsZWZ0T2Zmc2V0OwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgbmV3Qml0c1tvbGRCaXRzTGVuIC0gMV0gPSBjdXJyZW50SW50OwoJICAgICAgICB9CgkgICAgICAgIHRoaXMuYml0cyA9IG5ld0JpdHM7CgkgICAgfTsKCSAgICBCaXRBcnJheS5tYWtlQXJyYXkgPSBmdW5jdGlvbiAoc2l6ZSAvKmludCovKSB7CgkgICAgICAgIHJldHVybiBuZXcgSW50MzJBcnJheShNYXRoLmZsb29yKChzaXplICsgMzEpIC8gMzIpKTsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBCaXRBcnJheS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG8pIHsKCSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEJpdEFycmF5KSkgewoJICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICAgIHZhciBvdGhlciA9IG87CgkgICAgICAgIHJldHVybiB0aGlzLnNpemUgPT09IG90aGVyLnNpemUgJiYgQXJyYXlzXzEkMS5kZWZhdWx0LmVxdWFscyh0aGlzLmJpdHMsIG90aGVyLmJpdHMpOwoJICAgIH07CgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIEJpdEFycmF5LnByb3RvdHlwZS5oYXNoQ29kZSA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIDMxICogdGhpcy5zaXplICsgQXJyYXlzXzEkMS5kZWZhdWx0Lmhhc2hDb2RlKHRoaXMuYml0cyk7CgkgICAgfTsKCSAgICAvKkBPdmVycmlkZSovCgkgICAgQml0QXJyYXkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgcmVzdWx0ID0gJyc7CgkgICAgICAgIGZvciAodmFyIGkgPSAwLCBzaXplID0gdGhpcy5zaXplOyBpIDwgc2l6ZTsgaSsrKSB7CgkgICAgICAgICAgICBpZiAoKGkgJiAweDA3KSA9PT0gMCkgewoJICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnICc7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5nZXQoaSkgPyAnWCcgOiAnLic7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBCaXRBcnJheS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiBuZXcgQml0QXJyYXkodGhpcy5zaXplLCB0aGlzLmJpdHMuc2xpY2UoKSk7CgkgICAgfTsKCSAgICByZXR1cm4gQml0QXJyYXk7Cgl9KCkpOwoJQml0QXJyYXkkMS5kZWZhdWx0ID0gQml0QXJyYXk7CgoJdmFyIEJpdE1hdHJpeCQxID0ge307CgoJdmFyIFN0cmluZ0J1aWxkZXIkMSA9IHt9OwoKCXZhciBTdHJpbmdVdGlscyQxID0ge307CgoJdmFyIERlY29kZUhpbnRUeXBlJDEgPSB7fTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDkgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KERlY29kZUhpbnRUeXBlJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcgeyovCgkvKioKCSAqIEVuY2Fwc3VsYXRlcyBhIHR5cGUgb2YgaGludCB0aGF0IGEgY2FsbGVyIG1heSBwYXNzIHRvIGEgYmFyY29kZSByZWFkZXIgdG8gaGVscCBpdAoJICogbW9yZSBxdWlja2x5IG9yIGFjY3VyYXRlbHkgZGVjb2RlIGl0LiBJdCBpcyB1cCB0byBpbXBsZW1lbnRhdGlvbnMgdG8gZGVjaWRlIHdoYXQsCgkgKiBpZiBhbnl0aGluZywgdG8gZG8gd2l0aCB0aGUgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZC4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICogQGF1dGhvciBkc3dpdGtpbkBnb29nbGUuY29tIChEYW5pZWwgU3dpdGtpbikKCSAqIEBzZWUgUmVhZGVyI2RlY29kZShCaW5hcnlCaXRtYXAsamF2YS51dGlsLk1hcCkKCSAqLwoJdmFyIERlY29kZUhpbnRUeXBlOwoJKGZ1bmN0aW9uIChEZWNvZGVIaW50VHlwZSkgewoJICAgIC8qKgoJICAgICAqIFVuc3BlY2lmaWVkLCBhcHBsaWNhdGlvbi1zcGVjaWZpYyBoaW50LiBNYXBzIHRvIGFuIHVuc3BlY2lmaWVkIHtAbGluayBPYmplY3R9LgoJICAgICAqLwoJICAgIERlY29kZUhpbnRUeXBlW0RlY29kZUhpbnRUeXBlWyJPVEhFUiJdID0gMF0gPSAiT1RIRVIiOyAvKihPYmplY3QuY2xhc3MpKi8KCSAgICAvKioKCSAgICAgKiBJbWFnZSBpcyBhIHB1cmUgbW9ub2Nocm9tZSBpbWFnZSBvZiBhIGJhcmNvZGUuIERvZXNuJ3QgbWF0dGVyIHdoYXQgaXQgbWFwcyB0bzsKCSAgICAgKiB1c2Uge0BsaW5rIEJvb2xlYW4jVFJVRX0uCgkgICAgICovCgkgICAgRGVjb2RlSGludFR5cGVbRGVjb2RlSGludFR5cGVbIlBVUkVfQkFSQ09ERSJdID0gMV0gPSAiUFVSRV9CQVJDT0RFIjsgLyooVm9pZC5jbGFzcykqLwoJICAgIC8qKgoJICAgICAqIEltYWdlIGlzIGtub3duIHRvIGJlIG9mIG9uZSBvZiBhIGZldyBwb3NzaWJsZSBmb3JtYXRzLgoJICAgICAqIE1hcHMgdG8gYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIEJhcmNvZGVGb3JtYXR9cy4KCSAgICAgKi8KCSAgICBEZWNvZGVIaW50VHlwZVtEZWNvZGVIaW50VHlwZVsiUE9TU0lCTEVfRk9STUFUUyJdID0gMl0gPSAiUE9TU0lCTEVfRk9STUFUUyI7IC8qKExpc3QuY2xhc3MpKi8KCSAgICAvKioKCSAgICAgKiBTcGVuZCBtb3JlIHRpbWUgdG8gdHJ5IHRvIGZpbmQgYSBiYXJjb2RlOyBvcHRpbWl6ZSBmb3IgYWNjdXJhY3ksIG5vdCBzcGVlZC4KCSAgICAgKiBEb2Vzbid0IG1hdHRlciB3aGF0IGl0IG1hcHMgdG87IHVzZSB7QGxpbmsgQm9vbGVhbiNUUlVFfS4KCSAgICAgKi8KCSAgICBEZWNvZGVIaW50VHlwZVtEZWNvZGVIaW50VHlwZVsiVFJZX0hBUkRFUiJdID0gM10gPSAiVFJZX0hBUkRFUiI7IC8qKFZvaWQuY2xhc3MpKi8KCSAgICAvKioKCSAgICAgKiBTcGVjaWZpZXMgd2hhdCBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIHdoZW4gZGVjb2RpbmcsIHdoZXJlIGFwcGxpY2FibGUgKHR5cGUgU3RyaW5nKQoJICAgICAqLwoJICAgIERlY29kZUhpbnRUeXBlW0RlY29kZUhpbnRUeXBlWyJDSEFSQUNURVJfU0VUIl0gPSA0XSA9ICJDSEFSQUNURVJfU0VUIjsgLyooU3RyaW5nLmNsYXNzKSovCgkgICAgLyoqCgkgICAgICogQWxsb3dlZCBsZW5ndGhzIG9mIGVuY29kZWQgZGF0YSAtLSByZWplY3QgYW55dGhpbmcgZWxzZS4gTWFwcyB0byBhbiB7QGNvZGUgSW50MzJBcnJheX0uCgkgICAgICovCgkgICAgRGVjb2RlSGludFR5cGVbRGVjb2RlSGludFR5cGVbIkFMTE9XRURfTEVOR1RIUyJdID0gNV0gPSAiQUxMT1dFRF9MRU5HVEhTIjsgLyooSW50MzJBcnJheS5jbGFzcykqLwoJICAgIC8qKgoJICAgICAqIEFzc3VtZSBDb2RlIDM5IGNvZGVzIGVtcGxveSBhIGNoZWNrIGRpZ2l0LiBEb2Vzbid0IG1hdHRlciB3aGF0IGl0IG1hcHMgdG87CgkgICAgICogdXNlIHtAbGluayBCb29sZWFuI1RSVUV9LgoJICAgICAqLwoJICAgIERlY29kZUhpbnRUeXBlW0RlY29kZUhpbnRUeXBlWyJBU1NVTUVfQ09ERV8zOV9DSEVDS19ESUdJVCJdID0gNl0gPSAiQVNTVU1FX0NPREVfMzlfQ0hFQ0tfRElHSVQiOyAvKihWb2lkLmNsYXNzKSovCgkgICAgLyoqCgkgICAgICogQXNzdW1lIHRoZSBiYXJjb2RlIGlzIGJlaW5nIHByb2Nlc3NlZCBhcyBhIEdTMSBiYXJjb2RlLCBhbmQgbW9kaWZ5IGJlaGF2aW9yIGFzIG5lZWRlZC4KCSAgICAgKiBGb3IgZXhhbXBsZSB0aGlzIGFmZmVjdHMgRk5DMSBoYW5kbGluZyBmb3IgQ29kZSAxMjggKGFrYSBHUzEtMTI4KS4gRG9lc24ndCBtYXR0ZXIgd2hhdCBpdCBtYXBzIHRvOwoJICAgICAqIHVzZSB7QGxpbmsgQm9vbGVhbiNUUlVFfS4KCSAgICAgKi8KCSAgICBEZWNvZGVIaW50VHlwZVtEZWNvZGVIaW50VHlwZVsiQVNTVU1FX0dTMSJdID0gN10gPSAiQVNTVU1FX0dTMSI7IC8qKFZvaWQuY2xhc3MpKi8KCSAgICAvKioKCSAgICAgKiBJZiB0cnVlLCByZXR1cm4gdGhlIHN0YXJ0IGFuZCBlbmQgZGlnaXRzIGluIGEgQ29kYWJhciBiYXJjb2RlIGluc3RlYWQgb2Ygc3RyaXBwaW5nIHRoZW0uIFRoZXkKCSAgICAgKiBhcmUgYWxwaGEsIHdoZXJlYXMgdGhlIHJlc3QgYXJlIG51bWVyaWMuIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIHN0cmlwcGVkLCBidXQgdGhpcyBjYXVzZXMgdGhlbQoJICAgICAqIHRvIG5vdCBiZS4gRG9lc24ndCBtYXR0ZXIgd2hhdCBpdCBtYXBzIHRvOyB1c2Uge0BsaW5rIEJvb2xlYW4jVFJVRX0uCgkgICAgICovCgkgICAgRGVjb2RlSGludFR5cGVbRGVjb2RlSGludFR5cGVbIlJFVFVSTl9DT0RBQkFSX1NUQVJUX0VORCJdID0gOF0gPSAiUkVUVVJOX0NPREFCQVJfU1RBUlRfRU5EIjsgLyooVm9pZC5jbGFzcykqLwoJICAgIC8qKgoJICAgICAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gYmUgbm90aWZpZWQgdmlhIGNhbGxiYWNrIHdoZW4gYSBwb3NzaWJsZSB7QGxpbmsgUmVzdWx0UG9pbnR9CgkgICAgICogaXMgZm91bmQuIE1hcHMgdG8gYSB7QGxpbmsgUmVzdWx0UG9pbnRDYWxsYmFja30uCgkgICAgICovCgkgICAgRGVjb2RlSGludFR5cGVbRGVjb2RlSGludFR5cGVbIk5FRURfUkVTVUxUX1BPSU5UX0NBTExCQUNLIl0gPSA5XSA9ICJORUVEX1JFU1VMVF9QT0lOVF9DQUxMQkFDSyI7IC8qKFJlc3VsdFBvaW50Q2FsbGJhY2suY2xhc3MpKi8KCSAgICAvKioKCSAgICAgKiBBbGxvd2VkIGV4dGVuc2lvbiBsZW5ndGhzIGZvciBFQU4gb3IgVVBDIGJhcmNvZGVzLiBPdGhlciBmb3JtYXRzIHdpbGwgaWdub3JlIHRoaXMuCgkgICAgICogTWFwcyB0byBhbiB7QGNvZGUgSW50MzJBcnJheX0gb2YgdGhlIGFsbG93ZWQgZXh0ZW5zaW9uIGxlbmd0aHMsIGZvciBleGFtcGxlIFsyXSwgWzVdLCBvciBbMiwgNV0uCgkgICAgICogSWYgaXQgaXMgb3B0aW9uYWwgdG8gaGF2ZSBhbiBleHRlbnNpb24sIGRvIG5vdCBzZXQgdGhpcyBoaW50LiBJZiB0aGlzIGlzIHNldCwKCSAgICAgKiBhbmQgYSBVUEMgb3IgRUFOIGJhcmNvZGUgaXMgZm91bmQgYnV0IGFuIGV4dGVuc2lvbiBpcyBub3QsIHRoZW4gbm8gcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQKCSAgICAgKiBhdCBhbGwuCgkgICAgICovCgkgICAgRGVjb2RlSGludFR5cGVbRGVjb2RlSGludFR5cGVbIkFMTE9XRURfRUFOX0VYVEVOU0lPTlMiXSA9IDEwXSA9ICJBTExPV0VEX0VBTl9FWFRFTlNJT05TIjsgLyooSW50MzJBcnJheS5jbGFzcykqLwoJICAgIC8vIEVuZCBvZiBlbnVtZXJhdGlvbiB2YWx1ZXMuCgkgICAgLyoqCgkgICAgICogRGF0YSB0eXBlIHRoZSBoaW50IGlzIGV4cGVjdGluZy4KCSAgICAgKiBBbW9uZyB0aGUgcG9zc2libGUgdmFsdWVzIHRoZSB7QGxpbmsgVm9pZH0gc3RhbmRzIG91dCBhcyBiZWluZyB1c2VkIGZvcgoJICAgICAqIGhpbnRzIHRoYXQgZG8gbm90IGV4cGVjdCBhIHZhbHVlIHRvIGJlIHN1cHBsaWVkIChmbGFnIGhpbnRzKS4gU3VjaCBoaW50cwoJICAgICAqIHdpbGwgcG9zc2libHkgaGF2ZSB0aGVpciB2YWx1ZSBpZ25vcmVkLCBvciByZXBsYWNlZCBieSBhCgkgICAgICoge0BsaW5rIEJvb2xlYW4jVFJVRX0uIEhpbnQgc3VwcGxpZXJzIHNob3VsZCBwcm9iYWJseSB1c2UKCSAgICAgKiB7QGxpbmsgQm9vbGVhbiNUUlVFfSBhcyBkaXJlY3RlZCBieSB0aGUgYWN0dWFsIGhpbnQgZG9jdW1lbnRhdGlvbi4KCSAgICAgKi8KCSAgICAvLyBwcml2YXRlIHZhbHVlVHlwZTogQ2xhc3M8Pz4KCSAgICAvLyBEZWNvZGVIaW50VHlwZSh2YWx1ZVR5cGU6IENsYXNzPD8+KSB7CgkgICAgLy8gICB0aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZQoJICAgIC8vIH0KCSAgICAvLyBwdWJsaWMgZ2V0VmFsdWVUeXBlKCk6IENsYXNzPD8+IHsKCSAgICAvLyAgIHJldHVybiB2YWx1ZVR5cGUKCSAgICAvLyB9Cgl9KShEZWNvZGVIaW50VHlwZSB8fCAoRGVjb2RlSGludFR5cGUgPSB7fSkpOwoJRGVjb2RlSGludFR5cGUkMS5kZWZhdWx0ID0gRGVjb2RlSGludFR5cGU7CgoJdmFyIENoYXJhY3RlclNldEVDSSA9IHt9OwoKCXZhciBGb3JtYXRFeGNlcHRpb24kMSA9IHt9OwoKCXZhciBfX2V4dGVuZHMkZiA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7CgkgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8CgkgICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8CgkgICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTsKCSAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgfTsKCSAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9CgkgICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKCSAgICB9OwoJfSkoKTsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShGb3JtYXRFeGNlcHRpb24kMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJdmFyIEV4Y2VwdGlvbl8xJDcgPSBFeGNlcHRpb24kMTsKCS8qKgoJICogQ3VzdG9tIEVycm9yIGNsYXNzIG9mIHR5cGUgRXhjZXB0aW9uLgoJICovCgl2YXIgRm9ybWF0RXhjZXB0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewoJICAgIF9fZXh0ZW5kcyRmKEZvcm1hdEV4Y2VwdGlvbiwgX3N1cGVyKTsKCSAgICBmdW5jdGlvbiBGb3JtYXRFeGNlcHRpb24oKSB7CgkgICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKCSAgICB9CgkgICAgRm9ybWF0RXhjZXB0aW9uLmdldEZvcm1hdEluc3RhbmNlID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gbmV3IEZvcm1hdEV4Y2VwdGlvbigpOwoJICAgIH07CgkgICAgRm9ybWF0RXhjZXB0aW9uLmtpbmQgPSAnRm9ybWF0RXhjZXB0aW9uJzsKCSAgICByZXR1cm4gRm9ybWF0RXhjZXB0aW9uOwoJfShFeGNlcHRpb25fMSQ3LmRlZmF1bHQpKTsKCUZvcm1hdEV4Y2VwdGlvbiQxLmRlZmF1bHQgPSBGb3JtYXRFeGNlcHRpb247CgoJKGZ1bmN0aW9uIChleHBvcnRzKSB7CgkvKgoJICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJdmFyIF9fdmFsdWVzID0gKGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7CgkgICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7CgkgICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7CgkgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgcmV0dXJuIHsKCSAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDsKCSAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gIk9iamVjdCBpcyBub3QgaXRlcmFibGUuIiA6ICJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIik7Cgl9OwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCWV4cG9ydHMuQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVycyA9IHZvaWQgMDsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcuY29tbW9uIHsqLwoJdmFyIEZvcm1hdEV4Y2VwdGlvbl8xID0gRm9ybWF0RXhjZXB0aW9uJDE7CgkvKmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsqLwoJLyppbXBvcnQgamF2YS51dGlsLk1hcDsqLwoJdmFyIENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnM7CgkoZnVuY3Rpb24gKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMpIHsKCSAgICBDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzW0NoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnNbIkNwNDM3Il0gPSAwXSA9ICJDcDQzNyI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzEiXSA9IDFdID0gIklTTzg4NTlfMSI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzIiXSA9IDJdID0gIklTTzg4NTlfMiI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzMiXSA9IDNdID0gIklTTzg4NTlfMyI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzQiXSA9IDRdID0gIklTTzg4NTlfNCI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzUiXSA9IDVdID0gIklTTzg4NTlfNSI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzYiXSA9IDZdID0gIklTTzg4NTlfNiI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzciXSA9IDddID0gIklTTzg4NTlfNyI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzgiXSA9IDhdID0gIklTTzg4NTlfOCI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzkiXSA9IDldID0gIklTTzg4NTlfOSI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzEwIl0gPSAxMF0gPSAiSVNPODg1OV8xMCI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzExIl0gPSAxMV0gPSAiSVNPODg1OV8xMSI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzEzIl0gPSAxMl0gPSAiSVNPODg1OV8xMyI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzE0Il0gPSAxM10gPSAiSVNPODg1OV8xNCI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzE1Il0gPSAxNF0gPSAiSVNPODg1OV8xNSI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJJU084ODU5XzE2Il0gPSAxNV0gPSAiSVNPODg1OV8xNiI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJTSklTIl0gPSAxNl0gPSAiU0pJUyI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJDcDEyNTAiXSA9IDE3XSA9ICJDcDEyNTAiOwoJICAgIENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnNbQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1siQ3AxMjUxIl0gPSAxOF0gPSAiQ3AxMjUxIjsKCSAgICBDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzW0NoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnNbIkNwMTI1MiJdID0gMTldID0gIkNwMTI1MiI7CgkgICAgQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1tDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzWyJDcDEyNTYiXSA9IDIwXSA9ICJDcDEyNTYiOwoJICAgIENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnNbQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1siVW5pY29kZUJpZ1VubWFya2VkIl0gPSAyMV0gPSAiVW5pY29kZUJpZ1VubWFya2VkIjsKCSAgICBDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzW0NoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnNbIlVURjgiXSA9IDIyXSA9ICJVVEY4IjsKCSAgICBDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzW0NoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnNbIkFTQ0lJIl0gPSAyM10gPSAiQVNDSUkiOwoJICAgIENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnNbQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1siQmlnNSJdID0gMjRdID0gIkJpZzUiOwoJICAgIENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnNbQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1siR0IxODAzMCJdID0gMjVdID0gIkdCMTgwMzAiOwoJICAgIENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnNbQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVyc1siRVVDX0tSIl0gPSAyNl0gPSAiRVVDX0tSIjsKCX0pKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMgPSBleHBvcnRzLkNoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMgfHwgKGV4cG9ydHMuQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVycyA9IHt9KSk7CgkvKioKCSAqIEVuY2Fwc3VsYXRlcyBhIENoYXJhY3RlciBTZXQgRUNJLCBhY2NvcmRpbmcgdG8gIkV4dGVuZGVkIENoYW5uZWwgSW50ZXJwcmV0YXRpb25zIiA1LjMuMS4xCgkgKiBvZiBJU08gMTgwMDQuCgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIENoYXJhY3RlclNldEVDSSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBDaGFyYWN0ZXJTZXRFQ0kodmFsdWVJZGVudGlmaWVyLCB2YWx1ZXNQYXJhbSwgbmFtZSkgewoJICAgICAgICB2YXIgZV8xLCBfYTsKCSAgICAgICAgdmFyIG90aGVyRW5jb2RpbmdOYW1lcyA9IFtdOwoJICAgICAgICBmb3IgKHZhciBfaSA9IDM7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewoJICAgICAgICAgICAgb3RoZXJFbmNvZGluZ05hbWVzW19pIC0gM10gPSBhcmd1bWVudHNbX2ldOwoJICAgICAgICB9CgkgICAgICAgIHRoaXMudmFsdWVJZGVudGlmaWVyID0gdmFsdWVJZGVudGlmaWVyOwoJICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwoJICAgICAgICBpZiAodHlwZW9mIHZhbHVlc1BhcmFtID09PSAnbnVtYmVyJykgewoJICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBJbnQzMkFycmF5LmZyb20oW3ZhbHVlc1BhcmFtXSk7CgkgICAgICAgIH0KCSAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlc1BhcmFtOwoJICAgICAgICB9CgkgICAgICAgIHRoaXMub3RoZXJFbmNvZGluZ05hbWVzID0gb3RoZXJFbmNvZGluZ05hbWVzOwoJICAgICAgICBDaGFyYWN0ZXJTZXRFQ0kuVkFMVUVfSURFTlRJRklFUl9UT19FQ0kuc2V0KHZhbHVlSWRlbnRpZmllciwgdGhpcyk7CgkgICAgICAgIENoYXJhY3RlclNldEVDSS5OQU1FX1RPX0VDSS5zZXQobmFtZSwgdGhpcyk7CgkgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlczsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aF8xID0gdmFsdWVzLmxlbmd0aDsgaSAhPT0gbGVuZ3RoXzE7IGkrKykgewoJICAgICAgICAgICAgdmFyIHYgPSB2YWx1ZXNbaV07CgkgICAgICAgICAgICBDaGFyYWN0ZXJTZXRFQ0kuVkFMVUVTX1RPX0VDSS5zZXQodiwgdGhpcyk7CgkgICAgICAgIH0KCSAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgIGZvciAodmFyIG90aGVyRW5jb2RpbmdOYW1lc18xID0gX192YWx1ZXMob3RoZXJFbmNvZGluZ05hbWVzKSwgb3RoZXJFbmNvZGluZ05hbWVzXzFfMSA9IG90aGVyRW5jb2RpbmdOYW1lc18xLm5leHQoKTsgIW90aGVyRW5jb2RpbmdOYW1lc18xXzEuZG9uZTsgb3RoZXJFbmNvZGluZ05hbWVzXzFfMSA9IG90aGVyRW5jb2RpbmdOYW1lc18xLm5leHQoKSkgewoJICAgICAgICAgICAgICAgIHZhciBvdGhlck5hbWUgPSBvdGhlckVuY29kaW5nTmFtZXNfMV8xLnZhbHVlOwoJICAgICAgICAgICAgICAgIENoYXJhY3RlclNldEVDSS5OQU1FX1RPX0VDSS5zZXQob3RoZXJOYW1lLCB0aGlzKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfQoJICAgICAgICBmaW5hbGx5IHsKCSAgICAgICAgICAgIHRyeSB7CgkgICAgICAgICAgICAgICAgaWYgKG90aGVyRW5jb2RpbmdOYW1lc18xXzEgJiYgIW90aGVyRW5jb2RpbmdOYW1lc18xXzEuZG9uZSAmJiAoX2EgPSBvdGhlckVuY29kaW5nTmFtZXNfMS5yZXR1cm4pKSBfYS5jYWxsKG90aGVyRW5jb2RpbmdOYW1lc18xKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH0KCSAgICAgICAgfQoJICAgIH0KCSAgICAvLyBDaGFyYWN0ZXJTZXRFQ0kodmFsdWU6IG51bWJlciAvKmludCovKSB7CgkgICAgLy8gICB0aGlzKG5ldyBJbnQzMkFycmF5IHt2YWx1ZX0pCgkgICAgLy8gfQoJICAgIC8vIENoYXJhY3RlclNldEVDSSh2YWx1ZTogbnVtYmVyIC8qaW50Ki8sIFN0cmluZy4uLiBvdGhlckVuY29kaW5nTmFtZXMpIHsKCSAgICAvLyAgIHRoaXMudmFsdWVzID0gbmV3IEludDMyQXJyYXkge3ZhbHVlfQoJICAgIC8vICAgdGhpcy5vdGhlckVuY29kaW5nTmFtZXMgPSBvdGhlckVuY29kaW5nTmFtZXMKCSAgICAvLyB9CgkgICAgLy8gQ2hhcmFjdGVyU2V0RUNJKHZhbHVlczogSW50MzJBcnJheSwgU3RyaW5nLi4uIG90aGVyRW5jb2RpbmdOYW1lcykgewoJICAgIC8vICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXMKCSAgICAvLyAgIHRoaXMub3RoZXJFbmNvZGluZ05hbWVzID0gb3RoZXJFbmNvZGluZ05hbWVzCgkgICAgLy8gfQoJICAgIENoYXJhY3RlclNldEVDSS5wcm90b3R5cGUuZ2V0VmFsdWVJZGVudGlmaWVyID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUlkZW50aWZpZXI7CgkgICAgfTsKCSAgICBDaGFyYWN0ZXJTZXRFQ0kucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CgkgICAgfTsKCSAgICBDaGFyYWN0ZXJTZXRFQ0kucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXNbMF07CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcGFyYW0gdmFsdWUgY2hhcmFjdGVyIHNldCBFQ0kgdmFsdWUKCSAgICAgKiBAcmV0dXJuIHtAY29kZSBDaGFyYWN0ZXJTZXRFQ0l9IHJlcHJlc2VudGluZyBFQ0kgb2YgZ2l2ZW4gdmFsdWUsIG9yIG51bGwgaWYgaXQgaXMgbGVnYWwgYnV0CgkgICAgICogICB1bnN1cHBvcnRlZAoJICAgICAqIEB0aHJvd3MgRm9ybWF0RXhjZXB0aW9uIGlmIEVDSSB2YWx1ZSBpcyBpbnZhbGlkCgkgICAgICovCgkgICAgQ2hhcmFjdGVyU2V0RUNJLmdldENoYXJhY3RlclNldEVDSUJ5VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUgLyppbnQqLykgewoJICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IDkwMCkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xLmRlZmF1bHQoJ2luY29yZWN0IHZhbHVlJyk7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIGNoYXJhY3RlclNldCA9IENoYXJhY3RlclNldEVDSS5WQUxVRVNfVE9fRUNJLmdldCh2YWx1ZSk7CgkgICAgICAgIGlmICh1bmRlZmluZWQgPT09IGNoYXJhY3RlclNldCkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xLmRlZmF1bHQoJ2luY29yZWN0IHZhbHVlJyk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIGNoYXJhY3RlclNldDsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEBwYXJhbSBuYW1lIGNoYXJhY3RlciBzZXQgRUNJIGVuY29kaW5nIG5hbWUKCSAgICAgKiBAcmV0dXJuIENoYXJhY3RlclNldEVDSSByZXByZXNlbnRpbmcgRUNJIGZvciBjaGFyYWN0ZXIgZW5jb2RpbmcsIG9yIG51bGwgaWYgaXQgaXMgbGVnYWwKCSAgICAgKiAgIGJ1dCB1bnN1cHBvcnRlZAoJICAgICAqLwoJICAgIENoYXJhY3RlclNldEVDSS5nZXRDaGFyYWN0ZXJTZXRFQ0lCeU5hbWUgPSBmdW5jdGlvbiAobmFtZSkgewoJICAgICAgICB2YXIgY2hhcmFjdGVyU2V0ID0gQ2hhcmFjdGVyU2V0RUNJLk5BTUVfVE9fRUNJLmdldChuYW1lKTsKCSAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gY2hhcmFjdGVyU2V0KSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEuZGVmYXVsdCgnaW5jb3JlY3QgdmFsdWUnKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gY2hhcmFjdGVyU2V0OwoJICAgIH07CgkgICAgQ2hhcmFjdGVyU2V0RUNJLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAobykgewoJICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ2hhcmFjdGVyU2V0RUNJKSkgewoJICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICAgIHZhciBvdGhlciA9IG87CgkgICAgICAgIHJldHVybiB0aGlzLmdldE5hbWUoKSA9PT0gb3RoZXIuZ2V0TmFtZSgpOwoJICAgIH07CgkgICAgQ2hhcmFjdGVyU2V0RUNJLlZBTFVFX0lERU5USUZJRVJfVE9fRUNJID0gbmV3IE1hcCgpOwoJICAgIENoYXJhY3RlclNldEVDSS5WQUxVRVNfVE9fRUNJID0gbmV3IE1hcCgpOwoJICAgIENoYXJhY3RlclNldEVDSS5OQU1FX1RPX0VDSSA9IG5ldyBNYXAoKTsKCSAgICAvLyBFbnVtIG5hbWUgaXMgYSBKYXZhIGVuY29kaW5nIHZhbGlkIGZvciBqYXZhLmxhbmcgYW5kIGphdmEuaW8KCSAgICAvLyBUWVBFU0NSSVBUUE9SVDogY2hhbmdlZCB0aGUgbWFpbiBsYWJlbCBmb3IgSVNPIGFzIHRoZSBUZXh0RW5jb2RlciBkaWQgbm90IHJlY29nbml6ZWQgdGhlbSBpbiB0aGUgZm9ybSBmcm9tIGphdmEKCSAgICAvLyAoZWcgSVNPODg1OV8xIG11c3QgYmUgSVNPODg1OTEgb3IgSVNPODg1OS0xIG9yIElTTy04ODU5LTEpCgkgICAgLy8gbGF0ZXIgb246IHdlbGwsIGV4Y2VwdCAxNiB3aWNoIGRvZXMgbm90IHdvcmsgd2l0aCBJU084ODU5MTYgc28gdXNlZCBJU08tODg1OS0xIGZvcm0gZm9yIGRlZmF1bHQKCSAgICBDaGFyYWN0ZXJTZXRFQ0kuQ3A0MzcgPSBuZXcgQ2hhcmFjdGVyU2V0RUNJKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMuQ3A0MzcsIEludDMyQXJyYXkuZnJvbShbMCwgMl0pLCAnQ3A0MzcnKTsKCSAgICBDaGFyYWN0ZXJTZXRFQ0kuSVNPODg1OV8xID0gbmV3IENoYXJhY3RlclNldEVDSShDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzLklTTzg4NTlfMSwgSW50MzJBcnJheS5mcm9tKFsxLCAzXSksICdJU08tODg1OS0xJywgJ0lTTzg4NTkxJywgJ0lTTzg4NTlfMScpOwoJICAgIENoYXJhY3RlclNldEVDSS5JU084ODU5XzIgPSBuZXcgQ2hhcmFjdGVyU2V0RUNJKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMuSVNPODg1OV8yLCA0LCAnSVNPLTg4NTktMicsICdJU084ODU5MicsICdJU084ODU5XzInKTsKCSAgICBDaGFyYWN0ZXJTZXRFQ0kuSVNPODg1OV8zID0gbmV3IENoYXJhY3RlclNldEVDSShDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzLklTTzg4NTlfMywgNSwgJ0lTTy04ODU5LTMnLCAnSVNPODg1OTMnLCAnSVNPODg1OV8zJyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLklTTzg4NTlfNCA9IG5ldyBDaGFyYWN0ZXJTZXRFQ0koQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVycy5JU084ODU5XzQsIDYsICdJU08tODg1OS00JywgJ0lTTzg4NTk0JywgJ0lTTzg4NTlfNCcpOwoJICAgIENoYXJhY3RlclNldEVDSS5JU084ODU5XzUgPSBuZXcgQ2hhcmFjdGVyU2V0RUNJKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMuSVNPODg1OV81LCA3LCAnSVNPLTg4NTktNScsICdJU084ODU5NScsICdJU084ODU5XzUnKTsKCSAgICBDaGFyYWN0ZXJTZXRFQ0kuSVNPODg1OV82ID0gbmV3IENoYXJhY3RlclNldEVDSShDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzLklTTzg4NTlfNiwgOCwgJ0lTTy04ODU5LTYnLCAnSVNPODg1OTYnLCAnSVNPODg1OV82Jyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLklTTzg4NTlfNyA9IG5ldyBDaGFyYWN0ZXJTZXRFQ0koQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVycy5JU084ODU5XzcsIDksICdJU08tODg1OS03JywgJ0lTTzg4NTk3JywgJ0lTTzg4NTlfNycpOwoJICAgIENoYXJhY3RlclNldEVDSS5JU084ODU5XzggPSBuZXcgQ2hhcmFjdGVyU2V0RUNJKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMuSVNPODg1OV84LCAxMCwgJ0lTTy04ODU5LTgnLCAnSVNPODg1OTgnLCAnSVNPODg1OV84Jyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLklTTzg4NTlfOSA9IG5ldyBDaGFyYWN0ZXJTZXRFQ0koQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVycy5JU084ODU5XzksIDExLCAnSVNPLTg4NTktOScsICdJU084ODU5OScsICdJU084ODU5XzknKTsKCSAgICBDaGFyYWN0ZXJTZXRFQ0kuSVNPODg1OV8xMCA9IG5ldyBDaGFyYWN0ZXJTZXRFQ0koQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVycy5JU084ODU5XzEwLCAxMiwgJ0lTTy04ODU5LTEwJywgJ0lTTzg4NTkxMCcsICdJU084ODU5XzEwJyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLklTTzg4NTlfMTEgPSBuZXcgQ2hhcmFjdGVyU2V0RUNJKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMuSVNPODg1OV8xMSwgMTMsICdJU08tODg1OS0xMScsICdJU084ODU5MTEnLCAnSVNPODg1OV8xMScpOwoJICAgIENoYXJhY3RlclNldEVDSS5JU084ODU5XzEzID0gbmV3IENoYXJhY3RlclNldEVDSShDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzLklTTzg4NTlfMTMsIDE1LCAnSVNPLTg4NTktMTMnLCAnSVNPODg1OTEzJywgJ0lTTzg4NTlfMTMnKTsKCSAgICBDaGFyYWN0ZXJTZXRFQ0kuSVNPODg1OV8xNCA9IG5ldyBDaGFyYWN0ZXJTZXRFQ0koQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVycy5JU084ODU5XzE0LCAxNiwgJ0lTTy04ODU5LTE0JywgJ0lTTzg4NTkxNCcsICdJU084ODU5XzE0Jyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLklTTzg4NTlfMTUgPSBuZXcgQ2hhcmFjdGVyU2V0RUNJKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMuSVNPODg1OV8xNSwgMTcsICdJU08tODg1OS0xNScsICdJU084ODU5MTUnLCAnSVNPODg1OV8xNScpOwoJICAgIENoYXJhY3RlclNldEVDSS5JU084ODU5XzE2ID0gbmV3IENoYXJhY3RlclNldEVDSShDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzLklTTzg4NTlfMTYsIDE4LCAnSVNPLTg4NTktMTYnLCAnSVNPODg1OTE2JywgJ0lTTzg4NTlfMTYnKTsKCSAgICBDaGFyYWN0ZXJTZXRFQ0kuU0pJUyA9IG5ldyBDaGFyYWN0ZXJTZXRFQ0koQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVycy5TSklTLCAyMCwgJ1NKSVMnLCAnU2hpZnRfSklTJyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLkNwMTI1MCA9IG5ldyBDaGFyYWN0ZXJTZXRFQ0koQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVycy5DcDEyNTAsIDIxLCAnQ3AxMjUwJywgJ3dpbmRvd3MtMTI1MCcpOwoJICAgIENoYXJhY3RlclNldEVDSS5DcDEyNTEgPSBuZXcgQ2hhcmFjdGVyU2V0RUNJKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMuQ3AxMjUxLCAyMiwgJ0NwMTI1MScsICd3aW5kb3dzLTEyNTEnKTsKCSAgICBDaGFyYWN0ZXJTZXRFQ0kuQ3AxMjUyID0gbmV3IENoYXJhY3RlclNldEVDSShDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzLkNwMTI1MiwgMjMsICdDcDEyNTInLCAnd2luZG93cy0xMjUyJyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLkNwMTI1NiA9IG5ldyBDaGFyYWN0ZXJTZXRFQ0koQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVycy5DcDEyNTYsIDI0LCAnQ3AxMjU2JywgJ3dpbmRvd3MtMTI1NicpOwoJICAgIENoYXJhY3RlclNldEVDSS5Vbmljb2RlQmlnVW5tYXJrZWQgPSBuZXcgQ2hhcmFjdGVyU2V0RUNJKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMuVW5pY29kZUJpZ1VubWFya2VkLCAyNSwgJ1VuaWNvZGVCaWdVbm1hcmtlZCcsICdVVEYtMTZCRScsICdVbmljb2RlQmlnJyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLlVURjggPSBuZXcgQ2hhcmFjdGVyU2V0RUNJKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMuVVRGOCwgMjYsICdVVEY4JywgJ1VURi04Jyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLkFTQ0lJID0gbmV3IENoYXJhY3RlclNldEVDSShDaGFyYWN0ZXJTZXRWYWx1ZUlkZW50aWZpZXJzLkFTQ0lJLCBJbnQzMkFycmF5LmZyb20oWzI3LCAxNzBdKSwgJ0FTQ0lJJywgJ1VTLUFTQ0lJJyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLkJpZzUgPSBuZXcgQ2hhcmFjdGVyU2V0RUNJKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMuQmlnNSwgMjgsICdCaWc1Jyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLkdCMTgwMzAgPSBuZXcgQ2hhcmFjdGVyU2V0RUNJKENoYXJhY3RlclNldFZhbHVlSWRlbnRpZmllcnMuR0IxODAzMCwgMjksICdHQjE4MDMwJywgJ0dCMjMxMicsICdFVUNfQ04nLCAnR0JLJyk7CgkgICAgQ2hhcmFjdGVyU2V0RUNJLkVVQ19LUiA9IG5ldyBDaGFyYWN0ZXJTZXRFQ0koQ2hhcmFjdGVyU2V0VmFsdWVJZGVudGlmaWVycy5FVUNfS1IsIDMwLCAnRVVDX0tSJywgJ0VVQy1LUicpOwoJICAgIHJldHVybiBDaGFyYWN0ZXJTZXRFQ0k7Cgl9KCkpOwoJZXhwb3J0cy5kZWZhdWx0ID0gQ2hhcmFjdGVyU2V0RUNJOwoKCX0oQ2hhcmFjdGVyU2V0RUNJKSk7CgoJdmFyIFN0cmluZ0VuY29kaW5nJDEgPSB7fTsKCgl2YXIgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24kMSA9IHt9OwoKCXZhciBfX2V4dGVuZHMkZSA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7CgkgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8CgkgICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8CgkgICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTsKCSAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgfTsKCSAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9CgkgICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKCSAgICB9OwoJfSkoKTsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7Cgl2YXIgRXhjZXB0aW9uXzEkNiA9IEV4Y2VwdGlvbiQxOwoJLyoqCgkgKiBDdXN0b20gRXJyb3IgY2xhc3Mgb2YgdHlwZSBFeGNlcHRpb24uCgkgKi8KCXZhciBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKCSAgICBfX2V4dGVuZHMkZShVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwgX3N1cGVyKTsKCSAgICBmdW5jdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKCSAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwoJICAgIH0KCSAgICBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5raW5kID0gJ1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uJzsKCSAgICByZXR1cm4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247Cgl9KEV4Y2VwdGlvbl8xJDYuZGVmYXVsdCkpOwoJVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24kMS5kZWZhdWx0ID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CgoJT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmluZ0VuY29kaW5nJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCXZhciBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbl8xJDEgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiQxOwoJdmFyIENoYXJhY3RlclNldEVDSV8xJDIgPSBDaGFyYWN0ZXJTZXRFQ0k7CgkvKioKCSAqIFJlc3BvbnNpYmxlIGZvciBlbi9kZWNvZGluZyBzdHJpbmdzLgoJICovCgl2YXIgU3RyaW5nRW5jb2RpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgZnVuY3Rpb24gU3RyaW5nRW5jb2RpbmcoKSB7CgkgICAgfQoJICAgIC8qKgoJICAgICAqIERlY29kZXMgc29tZSBVaW50OEFycmF5IHRvIGEgc3RyaW5nIGZvcm1hdC4KCSAgICAgKi8KCSAgICBTdHJpbmdFbmNvZGluZy5kZWNvZGUgPSBmdW5jdGlvbiAoYnl0ZXMsIGVuY29kaW5nKSB7CgkgICAgICAgIHZhciBlbmNvZGluZ05hbWUgPSB0aGlzLmVuY29kaW5nTmFtZShlbmNvZGluZyk7CgkgICAgICAgIGlmICh0aGlzLmN1c3RvbURlY29kZXIpIHsKCSAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbURlY29kZXIoYnl0ZXMsIGVuY29kaW5nTmFtZSk7CgkgICAgICAgIH0KCSAgICAgICAgLy8gSW5jcmVhc2VzIGJyb3dzZXIgc3VwcG9ydC4KCSAgICAgICAgaWYgKHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5zaG91bGREZWNvZGVPbkZhbGxiYWNrKGVuY29kaW5nTmFtZSkpIHsKCSAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY29kZUZhbGxiYWNrKGJ5dGVzLCBlbmNvZGluZ05hbWUpOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmdOYW1lKS5kZWNvZGUoYnl0ZXMpOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQ2hlY2tzIGlmIHRoZSBkZWNvZGluZyBtZXRob2Qgc2hvdWxkIHVzZSB0aGUgZmFsbGJhY2sgZm9yIGRlY29kaW5nCgkgICAgICogb25jZSBOb2RlIFRleHREZWNvZGVyIGRvZXNuJ3Qgc3VwcG9ydCBhbGwgZW5jb2RpbmcgZm9ybWF0cy4KCSAgICAgKgoJICAgICAqIEBwYXJhbSBlbmNvZGluZ05hbWUKCSAgICAgKi8KCSAgICBTdHJpbmdFbmNvZGluZy5zaG91bGREZWNvZGVPbkZhbGxiYWNrID0gZnVuY3Rpb24gKGVuY29kaW5nTmFtZSkgewoJICAgICAgICByZXR1cm4gIVN0cmluZ0VuY29kaW5nLmlzQnJvd3NlcigpICYmIGVuY29kaW5nTmFtZSA9PT0gJ0lTTy04ODU5LTEnOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogRW5jb2RlcyBzb21lIHN0cmluZyBpbnRvIGEgVWludDhBcnJheS4KCSAgICAgKi8KCSAgICBTdHJpbmdFbmNvZGluZy5lbmNvZGUgPSBmdW5jdGlvbiAocywgZW5jb2RpbmcpIHsKCSAgICAgICAgdmFyIGVuY29kaW5nTmFtZSA9IHRoaXMuZW5jb2RpbmdOYW1lKGVuY29kaW5nKTsKCSAgICAgICAgaWYgKHRoaXMuY3VzdG9tRW5jb2RlcikgewoJICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tRW5jb2RlcihzLCBlbmNvZGluZ05hbWUpOwoJICAgICAgICB9CgkgICAgICAgIC8vIEluY3JlYXNlcyBicm93c2VyIHN1cHBvcnQuCgkgICAgICAgIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVGYWxsYmFjayhzKTsKCSAgICAgICAgfQoJICAgICAgICAvLyBUZXh0RW5jb2RlciBvbmx5IGVuY29kZXMgdG8gVVRGOCBieSBkZWZhdWx0IGFzIHNwZWNpZmllZCBieSBlbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcKCSAgICAgICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzKTsKCSAgICB9OwoJICAgIFN0cmluZ0VuY29kaW5nLmlzQnJvd3NlciA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB7fS50b1N0cmluZy5jYWxsKHdpbmRvdykgPT09ICdbb2JqZWN0IFdpbmRvd10nKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBmcm9tIHNvbWUgZW5jb2RpbmcgY2hhcmFjdGVyIHNldC4KCSAgICAgKi8KCSAgICBTdHJpbmdFbmNvZGluZy5lbmNvZGluZ05hbWUgPSBmdW5jdGlvbiAoZW5jb2RpbmcpIHsKCSAgICAgICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycKCSAgICAgICAgICAgID8gZW5jb2RpbmcKCSAgICAgICAgICAgIDogZW5jb2RpbmcuZ2V0TmFtZSgpOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogUmV0dXJucyBjaGFyYWN0ZXIgc2V0IGZyb20gc29tZSBlbmNvZGluZyBjaGFyYWN0ZXIgc2V0LgoJICAgICAqLwoJICAgIFN0cmluZ0VuY29kaW5nLmVuY29kaW5nQ2hhcmFjdGVyU2V0ID0gZnVuY3Rpb24gKGVuY29kaW5nKSB7CgkgICAgICAgIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIENoYXJhY3RlclNldEVDSV8xJDIuZGVmYXVsdCkgewoJICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBDaGFyYWN0ZXJTZXRFQ0lfMSQyLmRlZmF1bHQuZ2V0Q2hhcmFjdGVyU2V0RUNJQnlOYW1lKGVuY29kaW5nKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFJ1bnMgYSBmYWxsYmFjayBmb3IgdGhlIG5hdGl2ZSBkZWNvZGluZyBmdW5jaW9uLgoJICAgICAqLwoJICAgIFN0cmluZ0VuY29kaW5nLmRlY29kZUZhbGxiYWNrID0gZnVuY3Rpb24gKGJ5dGVzLCBlbmNvZGluZykgewoJICAgICAgICB2YXIgY2hhcmFjdGVyU2V0ID0gdGhpcy5lbmNvZGluZ0NoYXJhY3RlclNldChlbmNvZGluZyk7CgkgICAgICAgIGlmIChTdHJpbmdFbmNvZGluZy5pc0RlY29kZUZhbGxiYWNrU3VwcG9ydGVkKGNoYXJhY3RlclNldCkpIHsKCSAgICAgICAgICAgIHZhciBzID0gJyc7CgkgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoXzEgPSBieXRlcy5sZW5ndGg7IGkgPCBsZW5ndGhfMTsgaSsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIGggPSBieXRlc1tpXS50b1N0cmluZygxNik7CgkgICAgICAgICAgICAgICAgaWYgKGgubGVuZ3RoIDwgMikgewoJICAgICAgICAgICAgICAgICAgICBoID0gJzAnICsgaDsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcyArPSAnJScgKyBoOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzKTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoY2hhcmFjdGVyU2V0LmVxdWFscyhDaGFyYWN0ZXJTZXRFQ0lfMSQyLmRlZmF1bHQuVW5pY29kZUJpZ1VubWFya2VkKSkgewoJICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQxNkFycmF5KGJ5dGVzLmJ1ZmZlcikpOwoJICAgICAgICB9CgkgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbl8xJDEuZGVmYXVsdCgiRW5jb2RpbmcgIiArIHRoaXMuZW5jb2RpbmdOYW1lKGVuY29kaW5nKSArICIgbm90IHN1cHBvcnRlZCBieSBmYWxsYmFjay4iKTsKCSAgICB9OwoJICAgIFN0cmluZ0VuY29kaW5nLmlzRGVjb2RlRmFsbGJhY2tTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoY2hhcmFjdGVyU2V0KSB7CgkgICAgICAgIHJldHVybiBjaGFyYWN0ZXJTZXQuZXF1YWxzKENoYXJhY3RlclNldEVDSV8xJDIuZGVmYXVsdC5VVEY4KSB8fAoJICAgICAgICAgICAgY2hhcmFjdGVyU2V0LmVxdWFscyhDaGFyYWN0ZXJTZXRFQ0lfMSQyLmRlZmF1bHQuSVNPODg1OV8xKSB8fAoJICAgICAgICAgICAgY2hhcmFjdGVyU2V0LmVxdWFscyhDaGFyYWN0ZXJTZXRFQ0lfMSQyLmRlZmF1bHQuQVNDSUkpOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogUnVucyBhIGZhbGxiYWNrIGZvciB0aGUgbmF0aXZlIGVuY29kaW5nIGZ1bmNpb24uCgkgICAgICoKCSAgICAgKiBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNzE5Mjg0NS80MzY3NjgzCgkgICAgICovCgkgICAgU3RyaW5nRW5jb2RpbmcuZW5jb2RlRmFsbGJhY2sgPSBmdW5jdGlvbiAocykgewoJICAgICAgICB2YXIgZW5jb2RlZFVSSXN0cmluZyA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHMpKSk7CgkgICAgICAgIHZhciBjaGFyTGlzdCA9IGVuY29kZWRVUklzdHJpbmcuc3BsaXQoJycpOwoJICAgICAgICB2YXIgdWludEFycmF5ID0gW107CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhckxpc3QubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgIHVpbnRBcnJheS5wdXNoKGNoYXJMaXN0W2ldLmNoYXJDb2RlQXQoMCkpOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh1aW50QXJyYXkpOwoJICAgIH07CgkgICAgcmV0dXJuIFN0cmluZ0VuY29kaW5nOwoJfSgpKTsKCVN0cmluZ0VuY29kaW5nJDEuZGVmYXVsdCA9IFN0cmluZ0VuY29kaW5nOwoKCS8qCgkgKiBDb3B5cmlnaHQgKEMpIDIwMTAgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmluZ1V0aWxzJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcuY29tbW9uIHsqLwoJLyppbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OyovCgkvKmltcG9ydCBqYXZhLnV0aWwuTWFwOyovCgl2YXIgRGVjb2RlSGludFR5cGVfMSQzID0gRGVjb2RlSGludFR5cGUkMTsKCXZhciBDaGFyYWN0ZXJTZXRFQ0lfMSQxID0gQ2hhcmFjdGVyU2V0RUNJOwoJdmFyIFN0cmluZ0VuY29kaW5nXzEkMSA9IFN0cmluZ0VuY29kaW5nJDE7CgkvKioKCSAqIENvbW1vbiBzdHJpbmctcmVsYXRlZCBmdW5jdGlvbnMuCgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqIEBhdXRob3IgQWxleCBEdXByZQoJICovCgl2YXIgU3RyaW5nVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgZnVuY3Rpb24gU3RyaW5nVXRpbHMoKSB7CgkgICAgfQoJICAgIC8vIFNISUZUX0pJUy5lcXVhbHNJZ25vcmVDYXNlKFBMQVRGT1JNX0RFRkFVTFRfRU5DT0RJTkcpIHx8CgkgICAgLy8gRVVDX0pQLmVxdWFsc0lnbm9yZUNhc2UoUExBVEZPUk1fREVGQVVMVF9FTkNPRElORyk7CgkgICAgU3RyaW5nVXRpbHMuY2FzdEFzTm9uVXRmOENoYXIgPSBmdW5jdGlvbiAoY29kZSwgZW5jb2RpbmcpIHsKCSAgICAgICAgaWYgKGVuY29kaW5nID09PSB2b2lkIDApIHsgZW5jb2RpbmcgPSBudWxsOyB9CgkgICAgICAgIC8vIElTTyA4ODU5LTEgaXMgdGhlIEphdmEgZGVmYXVsdCBhcyBVVEYtOCBpcyBKYXZhU2NyaXB0cwoJICAgICAgICAvLyB5b3UgY2FuIHNlZSB0aGlzIG1ldGhvZCBhcyBhIEphdmEgdmVyc2lvbiBvZiBTdHJpbmcuZnJvbUNoYXJDb2RlCgkgICAgICAgIHZhciBlID0gZW5jb2RpbmcgPyBlbmNvZGluZy5nZXROYW1lKCkgOiB0aGlzLklTTzg4NTkxOwoJICAgICAgICAvLyB1c2UgcGFzc2VkIGZvcm1hdCAoZnJvbUNoYXJDb2RlIHdpbGwgcmV0dXJuIFVURjggZW5jb2RpbmcpCgkgICAgICAgIHJldHVybiBTdHJpbmdFbmNvZGluZ18xJDEuZGVmYXVsdC5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoW2NvZGVdKSwgZSk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcGFyYW0gYnl0ZXMgYnl0ZXMgZW5jb2RpbmcgYSBzdHJpbmcsIHdob3NlIGVuY29kaW5nIHNob3VsZCBiZSBndWVzc2VkCgkgICAgICogQHBhcmFtIGhpbnRzIGRlY29kZSBoaW50cyBpZiBhcHBsaWNhYmxlCgkgICAgICogQHJldHVybiBuYW1lIG9mIGd1ZXNzZWQgZW5jb2Rpbmc7IGF0IHRoZSBtb21lbnQgd2lsbCBvbmx5IGd1ZXNzIG9uZSBvZjoKCSAgICAgKiAge0BsaW5rICNTSElGVF9KSVN9LCB7QGxpbmsgI1VURjh9LCB7QGxpbmsgI0lTTzg4NTkxfSwgb3IgdGhlIHBsYXRmb3JtCgkgICAgICogIGRlZmF1bHQgZW5jb2RpbmcgaWYgbm9uZSBvZiB0aGVzZSBjYW4gcG9zc2libHkgYmUgY29ycmVjdAoJICAgICAqLwoJICAgIFN0cmluZ1V0aWxzLmd1ZXNzRW5jb2RpbmcgPSBmdW5jdGlvbiAoYnl0ZXMsIGhpbnRzKSB7CgkgICAgICAgIGlmIChoaW50cyAhPT0gbnVsbCAmJiBoaW50cyAhPT0gdW5kZWZpbmVkICYmIHVuZGVmaW5lZCAhPT0gaGludHMuZ2V0KERlY29kZUhpbnRUeXBlXzEkMy5kZWZhdWx0LkNIQVJBQ1RFUl9TRVQpKSB7CgkgICAgICAgICAgICByZXR1cm4gaGludHMuZ2V0KERlY29kZUhpbnRUeXBlXzEkMy5kZWZhdWx0LkNIQVJBQ1RFUl9TRVQpLnRvU3RyaW5nKCk7CgkgICAgICAgIH0KCSAgICAgICAgLy8gRm9yIG5vdywgbWVyZWx5IHRyaWVzIHRvIGRpc3Rpbmd1aXNoIElTTy04ODU5LTEsIFVURi04IGFuZCBTaGlmdF9KSVMsCgkgICAgICAgIC8vIHdoaWNoIHNob3VsZCBiZSBieSBmYXIgdGhlIG1vc3QgY29tbW9uIGVuY29kaW5ncy4KCSAgICAgICAgdmFyIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKCSAgICAgICAgdmFyIGNhbkJlSVNPODg1OTEgPSB0cnVlOwoJICAgICAgICB2YXIgY2FuQmVTaGlmdEpJUyA9IHRydWU7CgkgICAgICAgIHZhciBjYW5CZVVURjggPSB0cnVlOwoJICAgICAgICB2YXIgdXRmOEJ5dGVzTGVmdCA9IDA7CgkgICAgICAgIC8vIGludCB1dGY4TG93Q2hhcnMgPSAwCgkgICAgICAgIHZhciB1dGYyQnl0ZXNDaGFycyA9IDA7CgkgICAgICAgIHZhciB1dGYzQnl0ZXNDaGFycyA9IDA7CgkgICAgICAgIHZhciB1dGY0Qnl0ZXNDaGFycyA9IDA7CgkgICAgICAgIHZhciBzamlzQnl0ZXNMZWZ0ID0gMDsKCSAgICAgICAgLy8gaW50IHNqaXNMb3dDaGFycyA9IDAKCSAgICAgICAgdmFyIHNqaXNLYXRha2FuYUNoYXJzID0gMDsKCSAgICAgICAgLy8gaW50IHNqaXNEb3VibGVCeXRlc0NoYXJzID0gMAoJICAgICAgICB2YXIgc2ppc0N1ckthdGFrYW5hV29yZExlbmd0aCA9IDA7CgkgICAgICAgIHZhciBzamlzQ3VyRG91YmxlQnl0ZXNXb3JkTGVuZ3RoID0gMDsKCSAgICAgICAgdmFyIHNqaXNNYXhLYXRha2FuYVdvcmRMZW5ndGggPSAwOwoJICAgICAgICB2YXIgc2ppc01heERvdWJsZUJ5dGVzV29yZExlbmd0aCA9IDA7CgkgICAgICAgIC8vIGludCBpc29Mb3dDaGFycyA9IDAKCSAgICAgICAgLy8gaW50IGlzb0hpZ2hDaGFycyA9IDAKCSAgICAgICAgdmFyIGlzb0hpZ2hPdGhlciA9IDA7CgkgICAgICAgIHZhciB1dGY4Ym9tID0gYnl0ZXMubGVuZ3RoID4gMyAmJgoJICAgICAgICAgICAgYnl0ZXNbMF0gPT09IC8qKGJ5dGUpICovIDB4RUYgJiYKCSAgICAgICAgICAgIGJ5dGVzWzFdID09PSAvKihieXRlKSAqLyAweEJCICYmCgkgICAgICAgICAgICBieXRlc1syXSA9PT0gLyooYnl0ZSkgKi8gMHhCRjsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGggJiYgKGNhbkJlSVNPODg1OTEgfHwgY2FuQmVTaGlmdEpJUyB8fCBjYW5CZVVURjgpOyBpKyspIHsKCSAgICAgICAgICAgIHZhciB2YWx1ZSA9IGJ5dGVzW2ldICYgMHhGRjsKCSAgICAgICAgICAgIC8vIFVURi04IHN0dWZmCgkgICAgICAgICAgICBpZiAoY2FuQmVVVEY4KSB7CgkgICAgICAgICAgICAgICAgaWYgKHV0ZjhCeXRlc0xlZnQgPiAwKSB7CgkgICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgJiAweDgwKSA9PT0gMCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgY2FuQmVVVEY4ID0gZmFsc2U7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICB1dGY4Qnl0ZXNMZWZ0LS07CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHZhbHVlICYgMHg4MCkgIT09IDApIHsKCSAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSAmIDB4NDApID09PSAwKSB7CgkgICAgICAgICAgICAgICAgICAgICAgICBjYW5CZVVURjggPSBmYWxzZTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjhCeXRlc0xlZnQrKzsKCSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgJiAweDIwKSA9PT0gMCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjJCeXRlc0NoYXJzKys7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGY4Qnl0ZXNMZWZ0Kys7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSAmIDB4MTApID09PSAwKSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjNCeXRlc0NoYXJzKys7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGY4Qnl0ZXNMZWZ0Kys7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgJiAweDA4KSA9PT0gMCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmNEJ5dGVzQ2hhcnMrKzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkJlVVRGOCA9IGZhbHNlOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgfSAvLyBlbHNlIHsKCSAgICAgICAgICAgICAgICAvLyB1dGY4TG93Q2hhcnMrKwoJICAgICAgICAgICAgICAgIC8vIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIC8vIElTTy04ODU5LTEgc3R1ZmYKCSAgICAgICAgICAgIGlmIChjYW5CZUlTTzg4NTkxKSB7CgkgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gMHg3RiAmJiB2YWx1ZSA8IDB4QTApIHsKCSAgICAgICAgICAgICAgICAgICAgY2FuQmVJU084ODU5MSA9IGZhbHNlOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IDB4OUYpIHsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMHhDMCB8fCB2YWx1ZSA9PT0gMHhENyB8fCB2YWx1ZSA9PT0gMHhGNykgewoJICAgICAgICAgICAgICAgICAgICAgICAgaXNvSGlnaE90aGVyKys7CgkgICAgICAgICAgICAgICAgICAgIH0gLy8gZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIC8vIGlzb0hpZ2hDaGFycysrCgkgICAgICAgICAgICAgICAgICAgIC8vIH0KCSAgICAgICAgICAgICAgICB9IC8vIGVsc2UgewoJICAgICAgICAgICAgICAgIC8vIGlzb0xvd0NoYXJzKysKCSAgICAgICAgICAgICAgICAvLyB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICAvLyBTaGlmdF9KSVMgc3R1ZmYKCSAgICAgICAgICAgIGlmIChjYW5CZVNoaWZ0SklTKSB7CgkgICAgICAgICAgICAgICAgaWYgKHNqaXNCeXRlc0xlZnQgPiAwKSB7CgkgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDB4NDAgfHwgdmFsdWUgPT09IDB4N0YgfHwgdmFsdWUgPiAweEZDKSB7CgkgICAgICAgICAgICAgICAgICAgICAgICBjYW5CZVNoaWZ0SklTID0gZmFsc2U7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICBzamlzQnl0ZXNMZWZ0LS07CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09IDB4ODAgfHwgdmFsdWUgPT09IDB4QTAgfHwgdmFsdWUgPiAweEVGKSB7CgkgICAgICAgICAgICAgICAgICAgIGNhbkJlU2hpZnRKSVMgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiAweEEwICYmIHZhbHVlIDwgMHhFMCkgewoJICAgICAgICAgICAgICAgICAgICBzamlzS2F0YWthbmFDaGFycysrOwoJICAgICAgICAgICAgICAgICAgICBzamlzQ3VyRG91YmxlQnl0ZXNXb3JkTGVuZ3RoID0gMDsKCSAgICAgICAgICAgICAgICAgICAgc2ppc0N1ckthdGFrYW5hV29yZExlbmd0aCsrOwoJICAgICAgICAgICAgICAgICAgICBpZiAoc2ppc0N1ckthdGFrYW5hV29yZExlbmd0aCA+IHNqaXNNYXhLYXRha2FuYVdvcmRMZW5ndGgpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHNqaXNNYXhLYXRha2FuYVdvcmRMZW5ndGggPSBzamlzQ3VyS2F0YWthbmFXb3JkTGVuZ3RoOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gMHg3RikgewoJICAgICAgICAgICAgICAgICAgICBzamlzQnl0ZXNMZWZ0Kys7CgkgICAgICAgICAgICAgICAgICAgIC8vIHNqaXNEb3VibGVCeXRlc0NoYXJzKysKCSAgICAgICAgICAgICAgICAgICAgc2ppc0N1ckthdGFrYW5hV29yZExlbmd0aCA9IDA7CgkgICAgICAgICAgICAgICAgICAgIHNqaXNDdXJEb3VibGVCeXRlc1dvcmRMZW5ndGgrKzsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHNqaXNDdXJEb3VibGVCeXRlc1dvcmRMZW5ndGggPiBzamlzTWF4RG91YmxlQnl0ZXNXb3JkTGVuZ3RoKSB7CgkgICAgICAgICAgICAgICAgICAgICAgICBzamlzTWF4RG91YmxlQnl0ZXNXb3JkTGVuZ3RoID0gc2ppc0N1ckRvdWJsZUJ5dGVzV29yZExlbmd0aDsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgLy8gc2ppc0xvd0NoYXJzKysKCSAgICAgICAgICAgICAgICAgICAgc2ppc0N1ckthdGFrYW5hV29yZExlbmd0aCA9IDA7CgkgICAgICAgICAgICAgICAgICAgIHNqaXNDdXJEb3VibGVCeXRlc1dvcmRMZW5ndGggPSAwOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAoY2FuQmVVVEY4ICYmIHV0ZjhCeXRlc0xlZnQgPiAwKSB7CgkgICAgICAgICAgICBjYW5CZVVURjggPSBmYWxzZTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoY2FuQmVTaGlmdEpJUyAmJiBzamlzQnl0ZXNMZWZ0ID4gMCkgewoJICAgICAgICAgICAgY2FuQmVTaGlmdEpJUyA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgICAgIC8vIEVhc3kgLS0gaWYgdGhlcmUgaXMgQk9NIG9yIGF0IGxlYXN0IDEgdmFsaWQgbm90LXNpbmdsZSBieXRlIGNoYXJhY3RlciAoYW5kIG5vIGV2aWRlbmNlIGl0IGNhbid0IGJlIFVURi04KSwgZG9uZQoJICAgICAgICBpZiAoY2FuQmVVVEY4ICYmICh1dGY4Ym9tIHx8IHV0ZjJCeXRlc0NoYXJzICsgdXRmM0J5dGVzQ2hhcnMgKyB1dGY0Qnl0ZXNDaGFycyA+IDApKSB7CgkgICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuVVRGODsKCSAgICAgICAgfQoJICAgICAgICAvLyBFYXN5IC0tIGlmIGFzc3VtaW5nIFNoaWZ0X0pJUyBvciBhdCBsZWFzdCAzIHZhbGlkIGNvbnNlY3V0aXZlIG5vdC1hc2NpaSBjaGFyYWN0ZXJzIChhbmQgbm8gZXZpZGVuY2UgaXQgY2FuJ3QgYmUpLCBkb25lCgkgICAgICAgIGlmIChjYW5CZVNoaWZ0SklTICYmIChTdHJpbmdVdGlscy5BU1NVTUVfU0hJRlRfSklTIHx8IHNqaXNNYXhLYXRha2FuYVdvcmRMZW5ndGggPj0gMyB8fCBzamlzTWF4RG91YmxlQnl0ZXNXb3JkTGVuZ3RoID49IDMpKSB7CgkgICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuU0hJRlRfSklTOwoJICAgICAgICB9CgkgICAgICAgIC8vIERpc3Rpbmd1aXNoaW5nIFNoaWZ0X0pJUyBhbmQgSVNPLTg4NTktMSBjYW4gYmUgYSBsaXR0bGUgdG91Z2ggZm9yIHNob3J0IHdvcmRzLiBUaGUgY3J1ZGUgaGV1cmlzdGljIGlzOgoJICAgICAgICAvLyAtIElmIHdlIHNhdwoJICAgICAgICAvLyAgIC0gb25seSB0d28gY29uc2VjdXRpdmUga2F0YWthbmEgY2hhcnMgaW4gdGhlIHdob2xlIHRleHQsIG9yCgkgICAgICAgIC8vICAgLSBhdCBsZWFzdCAxMCUgb2YgYnl0ZXMgdGhhdCBjb3VsZCBiZSAidXBwZXIiIG5vdC1hbHBoYW51bWVyaWMgTGF0aW4xLAoJICAgICAgICAvLyAtIHRoZW4gd2UgY29uY2x1ZGUgU2hpZnRfSklTLCBlbHNlIElTTy04ODU5LTEKCSAgICAgICAgaWYgKGNhbkJlSVNPODg1OTEgJiYgY2FuQmVTaGlmdEpJUykgewoJICAgICAgICAgICAgcmV0dXJuIChzamlzTWF4S2F0YWthbmFXb3JkTGVuZ3RoID09PSAyICYmIHNqaXNLYXRha2FuYUNoYXJzID09PSAyKSB8fCBpc29IaWdoT3RoZXIgKiAxMCA+PSBsZW5ndGgKCSAgICAgICAgICAgICAgICA/IFN0cmluZ1V0aWxzLlNISUZUX0pJUyA6IFN0cmluZ1V0aWxzLklTTzg4NTkxOwoJICAgICAgICB9CgkgICAgICAgIC8vIE90aGVyd2lzZSwgdHJ5IGluIG9yZGVyIElTTy04ODU5LTEsIFNoaWZ0IEpJUywgVVRGLTggYW5kIGZhbGwgYmFjayB0byBkZWZhdWx0IHBsYXRmb3JtIGVuY29kaW5nCgkgICAgICAgIGlmIChjYW5CZUlTTzg4NTkxKSB7CgkgICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuSVNPODg1OTE7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKGNhbkJlU2hpZnRKSVMpIHsKCSAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5TSElGVF9KSVM7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKGNhbkJlVVRGOCkgewoJICAgICAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLlVURjg7CgkgICAgICAgIH0KCSAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSB0YWtlIGEgd2lsZCBndWVzcyB3aXRoIHBsYXRmb3JtIGVuY29kaW5nCgkgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5QTEFURk9STV9ERUZBVUxUX0VOQ09ESU5HOwoJICAgIH07CgkgICAgLyoqCgkgICAgICoKCSAgICAgKiBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMzQzOTcxMS80MzY3NjgzCgkgICAgICoKCSAgICAgKiBAcGFyYW0gYXBwZW5kIFRoZSBuZXcgc3RyaW5nIHRvIGFwcGVuZC4KCSAgICAgKiBAcGFyYW0gYXJncyBBcmd1bWV0cyB2YWx1ZXMgdG8gYmUgZm9ybWF0ZWQuCgkgICAgICovCgkgICAgU3RyaW5nVXRpbHMuZm9ybWF0ID0gZnVuY3Rpb24gKGFwcGVuZCkgewoJICAgICAgICB2YXIgYXJncyA9IFtdOwoJICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewoJICAgICAgICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgaSA9IC0xOwoJICAgICAgICBmdW5jdGlvbiBjYWxsYmFjayhleHAsIHAwLCBwMSwgcDIsIHAzLCBwNCkgewoJICAgICAgICAgICAgaWYgKGV4cCA9PT0gJyUlJykKCSAgICAgICAgICAgICAgICByZXR1cm4gJyUnOwoJICAgICAgICAgICAgaWYgKGFyZ3NbKytpXSA9PT0gdW5kZWZpbmVkKQoJICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CgkgICAgICAgICAgICBleHAgPSBwMiA/IHBhcnNlSW50KHAyLnN1YnN0cigxKSkgOiB1bmRlZmluZWQ7CgkgICAgICAgICAgICB2YXIgYmFzZSA9IHAzID8gcGFyc2VJbnQocDMuc3Vic3RyKDEpKSA6IHVuZGVmaW5lZDsKCSAgICAgICAgICAgIHZhciB2YWw7CgkgICAgICAgICAgICBzd2l0Y2ggKHA0KSB7CgkgICAgICAgICAgICAgICAgY2FzZSAncyc6CgkgICAgICAgICAgICAgICAgICAgIHZhbCA9IGFyZ3NbaV07CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgJ2MnOgoJICAgICAgICAgICAgICAgICAgICB2YWwgPSBhcmdzW2ldWzBdOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlICdmJzoKCSAgICAgICAgICAgICAgICAgICAgdmFsID0gcGFyc2VGbG9hdChhcmdzW2ldKS50b0ZpeGVkKGV4cCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgJ3AnOgoJICAgICAgICAgICAgICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KGFyZ3NbaV0pLnRvUHJlY2lzaW9uKGV4cCk7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIGNhc2UgJ2UnOgoJICAgICAgICAgICAgICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KGFyZ3NbaV0pLnRvRXhwb25lbnRpYWwoZXhwKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgY2FzZSAneCc6CgkgICAgICAgICAgICAgICAgICAgIHZhbCA9IHBhcnNlSW50KGFyZ3NbaV0pLnRvU3RyaW5nKGJhc2UgPyBiYXNlIDogMTYpOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICBjYXNlICdkJzoKCSAgICAgICAgICAgICAgICAgICAgdmFsID0gcGFyc2VGbG9hdChwYXJzZUludChhcmdzW2ldLCBiYXNlID8gYmFzZSA6IDEwKS50b1ByZWNpc2lvbihleHApKS50b0ZpeGVkKDApOwoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHZhbCA9IHR5cGVvZiB2YWwgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6ICgrdmFsKS50b1N0cmluZyhiYXNlKTsKCSAgICAgICAgICAgIHZhciBzaXplID0gcGFyc2VJbnQocDEpOyAvKiBwYWRkaW5nIHNpemUgKi8KCSAgICAgICAgICAgIHZhciBjaCA9IHAxICYmIChwMVswXSArICcnKSA9PT0gJzAnID8gJzAnIDogJyAnOyAvKiBpc251bGw/ICovCgkgICAgICAgICAgICB3aGlsZSAodmFsLmxlbmd0aCA8IHNpemUpCgkgICAgICAgICAgICAgICAgdmFsID0gcDAgIT09IHVuZGVmaW5lZCA/IHZhbCArIGNoIDogY2ggKyB2YWw7IC8qIGlzbWludXM/ICovCgkgICAgICAgICAgICByZXR1cm4gdmFsOwoJICAgICAgICB9CgkgICAgICAgIHZhciByZWdleCA9IC8lKC0pPygwP1swLTldKyk/KFsuXVswLTldKyk/KFsjXVswLTldKyk/KFtzY2ZwZXhkJV0pL2c7CgkgICAgICAgIHJldHVybiBhcHBlbmQucmVwbGFjZShyZWdleCwgY2FsbGJhY2spOwoJICAgIH07CgkgICAgLyoqCgkgICAgICoKCSAgICAgKi8KCSAgICBTdHJpbmdVdGlscy5nZXRCeXRlcyA9IGZ1bmN0aW9uIChzdHIsIGVuY29kaW5nKSB7CgkgICAgICAgIHJldHVybiBTdHJpbmdFbmNvZGluZ18xJDEuZGVmYXVsdC5lbmNvZGUoc3RyLCBlbmNvZGluZyk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBSZXR1cm5zIHRoZSBjaGFyY29kZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9yIGF0IGluZGV4IHplcm8uCgkgICAgICovCgkgICAgU3RyaW5nVXRpbHMuZ2V0Q2hhckNvZGUgPSBmdW5jdGlvbiAoc3RyLCBpbmRleCkgewoJICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQgMCkgeyBpbmRleCA9IDA7IH0KCSAgICAgICAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KGluZGV4KTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFJldHVybnMgY2hhciBmb3IgZ2l2ZW4gY2hhcmNvZGUKCSAgICAgKi8KCSAgICBTdHJpbmdVdGlscy5nZXRDaGFyQXQgPSBmdW5jdGlvbiAoY2hhckNvZGUpIHsKCSAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpOwoJICAgIH07CgkgICAgU3RyaW5nVXRpbHMuU0hJRlRfSklTID0gQ2hhcmFjdGVyU2V0RUNJXzEkMS5kZWZhdWx0LlNKSVMuZ2V0TmFtZSgpOyAvLyAiU0pJUyIKCSAgICBTdHJpbmdVdGlscy5HQjIzMTIgPSAnR0IyMzEyJzsKCSAgICBTdHJpbmdVdGlscy5JU084ODU5MSA9IENoYXJhY3RlclNldEVDSV8xJDEuZGVmYXVsdC5JU084ODU5XzEuZ2V0TmFtZSgpOyAvLyAiSVNPODg1OV8xIgoJICAgIFN0cmluZ1V0aWxzLkVVQ19KUCA9ICdFVUNfSlAnOwoJICAgIFN0cmluZ1V0aWxzLlVURjggPSBDaGFyYWN0ZXJTZXRFQ0lfMSQxLmRlZmF1bHQuVVRGOC5nZXROYW1lKCk7IC8vICJVVEY4IgoJICAgIFN0cmluZ1V0aWxzLlBMQVRGT1JNX0RFRkFVTFRfRU5DT0RJTkcgPSBTdHJpbmdVdGlscy5VVEY4OyAvLyAiVVRGOCIvL0NoYXJzZXQuZGVmYXVsdENoYXJzZXQoKS5uYW1lKCkKCSAgICBTdHJpbmdVdGlscy5BU1NVTUVfU0hJRlRfSklTID0gZmFsc2U7CgkgICAgcmV0dXJuIFN0cmluZ1V0aWxzOwoJfSgpKTsKCVN0cmluZ1V0aWxzJDEuZGVmYXVsdCA9IFN0cmluZ1V0aWxzOwoKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJpbmdCdWlsZGVyJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCXZhciBTdHJpbmdVdGlsc18xJDEgPSBTdHJpbmdVdGlscyQxOwoJdmFyIFN0cmluZ0J1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgZnVuY3Rpb24gU3RyaW5nQnVpbGRlcih2YWx1ZSkgewoJICAgICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkgeyB2YWx1ZSA9ICcnOyB9CgkgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKCSAgICB9CgkgICAgU3RyaW5nQnVpbGRlci5wcm90b3R5cGUuZW5hYmxlRGVjb2RpbmcgPSBmdW5jdGlvbiAoZW5jb2RpbmcpIHsKCSAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOwoJICAgICAgICByZXR1cm4gdGhpczsKCSAgICB9OwoJICAgIFN0cmluZ0J1aWxkZXIucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIChzKSB7CgkgICAgICAgIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHsKCSAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gcy50b1N0cmluZygpOwoJICAgICAgICB9CgkgICAgICAgIGVsc2UgaWYgKHRoaXMuZW5jb2RpbmcpIHsKCSAgICAgICAgICAgIC8vIHVzZSBwYXNzZWQgZm9ybWF0IChmcm9tQ2hhckNvZGUgd2lsbCByZXR1cm4gVVRGOCBlbmNvZGluZykKCSAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gU3RyaW5nVXRpbHNfMSQxLmRlZmF1bHQuY2FzdEFzTm9uVXRmOENoYXIocywgdGhpcy5lbmNvZGluZyk7CgkgICAgICAgIH0KCSAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAvLyBjb3JyZWN0bHkgY29udmVydHMgZnJvbSBVVEYtOCwgYnV0IG5vdCBvdGhlciBlbmNvZGluZ3MKCSAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShzKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gdGhpczsKCSAgICB9OwoJICAgIFN0cmluZ0J1aWxkZXIucHJvdG90eXBlLmFwcGVuZENoYXJzID0gZnVuY3Rpb24gKHN0ciwgb2Zmc2V0LCBsZW4pIHsKCSAgICAgICAgZm9yICh2YXIgaSA9IG9mZnNldDsgb2Zmc2V0IDwgb2Zmc2V0ICsgbGVuOyBpKyspIHsKCSAgICAgICAgICAgIHRoaXMuYXBwZW5kKHN0cltpXSk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHRoaXM7CgkgICAgfTsKCSAgICBTdHJpbmdCdWlsZGVyLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmxlbmd0aDsKCSAgICB9OwoJICAgIFN0cmluZ0J1aWxkZXIucHJvdG90eXBlLmNoYXJBdCA9IGZ1bmN0aW9uIChuKSB7CgkgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmNoYXJBdChuKTsKCSAgICB9OwoJICAgIFN0cmluZ0J1aWxkZXIucHJvdG90eXBlLmRlbGV0ZUNoYXJBdCA9IGZ1bmN0aW9uIChuKSB7CgkgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnN1YnN0cigwLCBuKSArIHRoaXMudmFsdWUuc3Vic3RyaW5nKG4gKyAxKTsKCSAgICB9OwoJICAgIFN0cmluZ0J1aWxkZXIucHJvdG90eXBlLnNldENoYXJBdCA9IGZ1bmN0aW9uIChuLCBjKSB7CgkgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnN1YnN0cigwLCBuKSArIGMgKyB0aGlzLnZhbHVlLnN1YnN0cihuICsgMSk7CgkgICAgfTsKCSAgICBTdHJpbmdCdWlsZGVyLnByb3RvdHlwZS5zdWJzdHJpbmcgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkgewoJICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAbm90ZSBoZWxwZXIgbWV0aG9kIGZvciBSU1MgRXhwYW5kZWQKCSAgICAgKi8KCSAgICBTdHJpbmdCdWlsZGVyLnByb3RvdHlwZS5zZXRMZW5ndGhUb1plcm8gPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHRoaXMudmFsdWUgPSAnJzsKCSAgICB9OwoJICAgIFN0cmluZ0J1aWxkZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKCSAgICB9OwoJICAgIFN0cmluZ0J1aWxkZXIucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChuLCBjKSB7CgkgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnN1YnN0cigwLCBuKSArIGMgKyB0aGlzLnZhbHVlLnN1YnN0cihuICsgYy5sZW5ndGgpOwoJICAgIH07CgkgICAgcmV0dXJuIFN0cmluZ0J1aWxkZXI7Cgl9KCkpOwoJU3RyaW5nQnVpbGRlciQxLmRlZmF1bHQgPSBTdHJpbmdCdWlsZGVyOwoKCS8qCgkgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCglPYmplY3QuZGVmaW5lUHJvcGVydHkoQml0TWF0cml4JDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcuY29tbW9uIHsqLwoJLyppbXBvcnQgamF2YS51dGlsLkFycmF5czsqLwoJdmFyIEJpdEFycmF5XzEkMSA9IEJpdEFycmF5JDE7Cgl2YXIgU3lzdGVtXzEkMyA9IFN5c3RlbSQxOwoJdmFyIEFycmF5c18xID0gQXJyYXlzJDE7Cgl2YXIgU3RyaW5nQnVpbGRlcl8xJDIgPSBTdHJpbmdCdWlsZGVyJDE7Cgl2YXIgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkNyA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiQxOwoJLyoqCgkgKiA8cD5SZXByZXNlbnRzIGEgMkQgbWF0cml4IG9mIGJpdHMuIEluIGZ1bmN0aW9uIGFyZ3VtZW50cyBiZWxvdywgYW5kIHRocm91Z2hvdXQgdGhlIGNvbW1vbgoJICogbW9kdWxlLCB4IGlzIHRoZSBjb2x1bW4gcG9zaXRpb24sIGFuZCB5IGlzIHRoZSByb3cgcG9zaXRpb24uIFRoZSBvcmRlcmluZyBpcyBhbHdheXMgeCwgeS4KCSAqIFRoZSBvcmlnaW4gaXMgYXQgdGhlIHRvcC1sZWZ0LjwvcD4KCSAqCgkgKiA8cD5JbnRlcm5hbGx5IHRoZSBiaXRzIGFyZSByZXByZXNlbnRlZCBpbiBhIDEtRCBhcnJheSBvZiAzMi1iaXQgaW50cy4gSG93ZXZlciwgZWFjaCByb3cgYmVnaW5zCgkgKiB3aXRoIGEgbmV3IGludC4gVGhpcyBpcyBkb25lIGludGVudGlvbmFsbHkgc28gdGhhdCB3ZSBjYW4gY29weSBvdXQgYSByb3cgaW50byBhIEJpdEFycmF5IHZlcnkKCSAqIGVmZmljaWVudGx5LjwvcD4KCSAqCgkgKiA8cD5UaGUgb3JkZXJpbmcgb2YgYml0cyBpcyByb3ctbWFqb3IuIFdpdGhpbiBlYWNoIGludCwgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIHVzZWQgZmlyc3QsCgkgKiBtZWFuaW5nIHRoZXkgcmVwcmVzZW50IGxvd2VyIHggdmFsdWVzLiBUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBCaXRBcnJheSdzIGltcGxlbWVudGF0aW9uLjwvcD4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICogQGF1dGhvciBkc3dpdGtpbkBnb29nbGUuY29tIChEYW5pZWwgU3dpdGtpbikKCSAqLwoJdmFyIEJpdE1hdHJpeCAvKmltcGxlbWVudHMgQ2xvbmVhYmxlKi8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgLyoqCgkgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBzcXVhcmUge0BsaW5rIEJpdE1hdHJpeH0uCgkgICAgICoKCSAgICAgKiBAcGFyYW0gZGltZW5zaW9uIGhlaWdodCBhbmQgd2lkdGgKCSAgICAgKi8KCSAgICAvLyBwdWJsaWMgY29uc3RydWN0b3IoZGltZW5zaW9uOiBudW1iZXIgLyppbnQqLykgewoJICAgIC8vICAgdGhpcyhkaW1lbnNpb24sIGRpbWVuc2lvbikKCSAgICAvLyB9CgkgICAgLyoqCgkgICAgICogQ3JlYXRlcyBhbiBlbXB0eSB7QGxpbmsgQml0TWF0cml4fS4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB3aWR0aCBiaXQgbWF0cml4IHdpZHRoCgkgICAgICogQHBhcmFtIGhlaWdodCBiaXQgbWF0cml4IGhlaWdodAoJICAgICAqLwoJICAgIC8vIHB1YmxpYyBjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyIC8qaW50Ki8sIGhlaWdodDogbnVtYmVyIC8qaW50Ki8pIHsKCSAgICAvLyAgIGlmICh3aWR0aCA8IDEgfHwgaGVpZ2h0IDwgMSkgewoJICAgIC8vICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCb3RoIGRpbWVuc2lvbnMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIpCgkgICAgLy8gICB9CgkgICAgLy8gICB0aGlzLndpZHRoID0gd2lkdGgKCSAgICAvLyAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0CgkgICAgLy8gICB0aGlzLnJvd1NpemUgPSAod2lkdGggKyAzMSkgLyAzMgoJICAgIC8vICAgYml0cyA9IG5ldyBpbnRbcm93U2l6ZSAqIGhlaWdodF07CgkgICAgLy8gfQoJICAgIGZ1bmN0aW9uIEJpdE1hdHJpeCh3aWR0aCAvKmludCovLCBoZWlnaHQgLyppbnQqLywgcm93U2l6ZSAvKmludCovLCBiaXRzKSB7CgkgICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKCSAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CgkgICAgICAgIHRoaXMucm93U2l6ZSA9IHJvd1NpemU7CgkgICAgICAgIHRoaXMuYml0cyA9IGJpdHM7CgkgICAgICAgIGlmICh1bmRlZmluZWQgPT09IGhlaWdodCB8fCBudWxsID09PSBoZWlnaHQpIHsKCSAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoOwoJICAgICAgICB9CgkgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwoJICAgICAgICBpZiAod2lkdGggPCAxIHx8IGhlaWdodCA8IDEpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSQ3LmRlZmF1bHQoJ0JvdGggZGltZW5zaW9ucyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gcm93U2l6ZSB8fCBudWxsID09PSByb3dTaXplKSB7CgkgICAgICAgICAgICByb3dTaXplID0gTWF0aC5mbG9vcigod2lkdGggKyAzMSkgLyAzMik7CgkgICAgICAgIH0KCSAgICAgICAgdGhpcy5yb3dTaXplID0gcm93U2l6ZTsKCSAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gYml0cyB8fCBudWxsID09PSBiaXRzKSB7CgkgICAgICAgICAgICB0aGlzLmJpdHMgPSBuZXcgSW50MzJBcnJheSh0aGlzLnJvd1NpemUgKiB0aGlzLmhlaWdodCk7CgkgICAgICAgIH0KCSAgICB9CgkgICAgLyoqCgkgICAgICogSW50ZXJwcmV0cyBhIDJEIGFycmF5IG9mIGJvb2xlYW5zIGFzIGEge0BsaW5rIEJpdE1hdHJpeH0sIHdoZXJlICJ0cnVlIiBtZWFucyBhbiAib24iIGJpdC4KCSAgICAgKgoJICAgICAqIEBmdW5jdGlvbiBwYXJzZQoJICAgICAqIEBwYXJhbSBpbWFnZSBiaXRzIG9mIHRoZSBpbWFnZSwgYXMgYSByb3ctbWFqb3IgMkQgYXJyYXkuIEVsZW1lbnRzIGFyZSBhcnJheXMgcmVwcmVzZW50aW5nIHJvd3MKCSAgICAgKiBAcmV0dXJuIHtAbGluayBCaXRNYXRyaXh9IHJlcHJlc2VudGF0aW9uIG9mIGltYWdlCgkgICAgICovCgkgICAgQml0TWF0cml4LnBhcnNlRnJvbUJvb2xlYW5BcnJheSA9IGZ1bmN0aW9uIChpbWFnZSkgewoJICAgICAgICB2YXIgaGVpZ2h0ID0gaW1hZ2UubGVuZ3RoOwoJICAgICAgICB2YXIgd2lkdGggPSBpbWFnZVswXS5sZW5ndGg7CgkgICAgICAgIHZhciBiaXRzID0gbmV3IEJpdE1hdHJpeCh3aWR0aCwgaGVpZ2h0KTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewoJICAgICAgICAgICAgdmFyIGltYWdlSSA9IGltYWdlW2ldOwoJICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CgkgICAgICAgICAgICAgICAgaWYgKGltYWdlSVtqXSkgewoJICAgICAgICAgICAgICAgICAgICBiaXRzLnNldChqLCBpKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIGJpdHM7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKgoJICAgICAqIEBmdW5jdGlvbiBwYXJzZQoJICAgICAqIEBwYXJhbSBzdHJpbmdSZXByZXNlbnRhdGlvbgoJICAgICAqIEBwYXJhbSBzZXRTdHJpbmcKCSAgICAgKiBAcGFyYW0gdW5zZXRTdHJpbmcKCSAgICAgKi8KCSAgICBCaXRNYXRyaXgucGFyc2VGcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZ1JlcHJlc2VudGF0aW9uLCBzZXRTdHJpbmcsIHVuc2V0U3RyaW5nKSB7CgkgICAgICAgIGlmIChzdHJpbmdSZXByZXNlbnRhdGlvbiA9PT0gbnVsbCkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDcuZGVmYXVsdCgnc3RyaW5nUmVwcmVzZW50YXRpb24gY2Fubm90IGJlIG51bGwnKTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgYml0cyA9IG5ldyBBcnJheShzdHJpbmdSZXByZXNlbnRhdGlvbi5sZW5ndGgpOwoJICAgICAgICB2YXIgYml0c1BvcyA9IDA7CgkgICAgICAgIHZhciByb3dTdGFydFBvcyA9IDA7CgkgICAgICAgIHZhciByb3dMZW5ndGggPSAtMTsKCSAgICAgICAgdmFyIG5Sb3dzID0gMDsKCSAgICAgICAgdmFyIHBvcyA9IDA7CgkgICAgICAgIHdoaWxlIChwb3MgPCBzdHJpbmdSZXByZXNlbnRhdGlvbi5sZW5ndGgpIHsKCSAgICAgICAgICAgIGlmIChzdHJpbmdSZXByZXNlbnRhdGlvbi5jaGFyQXQocG9zKSA9PT0gJ1xuJyB8fAoJICAgICAgICAgICAgICAgIHN0cmluZ1JlcHJlc2VudGF0aW9uLmNoYXJBdChwb3MpID09PSAnXHInKSB7CgkgICAgICAgICAgICAgICAgaWYgKGJpdHNQb3MgPiByb3dTdGFydFBvcykgewoJICAgICAgICAgICAgICAgICAgICBpZiAocm93TGVuZ3RoID09PSAtMSkgewoJICAgICAgICAgICAgICAgICAgICAgICAgcm93TGVuZ3RoID0gYml0c1BvcyAtIHJvd1N0YXJ0UG9zOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdHNQb3MgLSByb3dTdGFydFBvcyAhPT0gcm93TGVuZ3RoKSB7CgkgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkNy5kZWZhdWx0KCdyb3cgbGVuZ3RocyBkbyBub3QgbWF0Y2gnKTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICByb3dTdGFydFBvcyA9IGJpdHNQb3M7CgkgICAgICAgICAgICAgICAgICAgIG5Sb3dzKys7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHBvcysrOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZWxzZSBpZiAoc3RyaW5nUmVwcmVzZW50YXRpb24uc3Vic3RyaW5nKHBvcywgcG9zICsgc2V0U3RyaW5nLmxlbmd0aCkgPT09IHNldFN0cmluZykgewoJICAgICAgICAgICAgICAgIHBvcyArPSBzZXRTdHJpbmcubGVuZ3RoOwoJICAgICAgICAgICAgICAgIGJpdHNbYml0c1Bvc10gPSB0cnVlOwoJICAgICAgICAgICAgICAgIGJpdHNQb3MrKzsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGVsc2UgaWYgKHN0cmluZ1JlcHJlc2VudGF0aW9uLnN1YnN0cmluZyhwb3MsIHBvcyArIHVuc2V0U3RyaW5nLmxlbmd0aCkgPT09IHVuc2V0U3RyaW5nKSB7CgkgICAgICAgICAgICAgICAgcG9zICs9IHVuc2V0U3RyaW5nLmxlbmd0aDsKCSAgICAgICAgICAgICAgICBiaXRzW2JpdHNQb3NdID0gZmFsc2U7CgkgICAgICAgICAgICAgICAgYml0c1BvcysrOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDcuZGVmYXVsdCgnaWxsZWdhbCBjaGFyYWN0ZXIgZW5jb3VudGVyZWQ6ICcgKyBzdHJpbmdSZXByZXNlbnRhdGlvbi5zdWJzdHJpbmcocG9zKSk7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgLy8gbm8gRU9MIGF0IGVuZD8KCSAgICAgICAgaWYgKGJpdHNQb3MgPiByb3dTdGFydFBvcykgewoJICAgICAgICAgICAgaWYgKHJvd0xlbmd0aCA9PT0gLTEpIHsKCSAgICAgICAgICAgICAgICByb3dMZW5ndGggPSBiaXRzUG9zIC0gcm93U3RhcnRQb3M7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBlbHNlIGlmIChiaXRzUG9zIC0gcm93U3RhcnRQb3MgIT09IHJvd0xlbmd0aCkgewoJICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSQ3LmRlZmF1bHQoJ3JvdyBsZW5ndGhzIGRvIG5vdCBtYXRjaCcpOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgblJvd3MrKzsKCSAgICAgICAgfQoJICAgICAgICB2YXIgbWF0cml4ID0gbmV3IEJpdE1hdHJpeChyb3dMZW5ndGgsIG5Sb3dzKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaXRzUG9zOyBpKyspIHsKCSAgICAgICAgICAgIGlmIChiaXRzW2ldKSB7CgkgICAgICAgICAgICAgICAgbWF0cml4LnNldChNYXRoLmZsb29yKGkgJSByb3dMZW5ndGgpLCBNYXRoLmZsb29yKGkgLyByb3dMZW5ndGgpKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gbWF0cml4OwoJICAgIH07CgkgICAgLyoqCgkgICAgICogPHA+R2V0cyB0aGUgcmVxdWVzdGVkIGJpdCwgd2hlcmUgdHJ1ZSBtZWFucyBibGFjay48L3A+CgkgICAgICoKCSAgICAgKiBAcGFyYW0geCBUaGUgaG9yaXpvbnRhbCBjb21wb25lbnQgKGkuZS4gd2hpY2ggY29sdW1uKQoJICAgICAqIEBwYXJhbSB5IFRoZSB2ZXJ0aWNhbCBjb21wb25lbnQgKGkuZS4gd2hpY2ggcm93KQoJICAgICAqIEByZXR1cm4gdmFsdWUgb2YgZ2l2ZW4gYml0IGluIG1hdHJpeAoJICAgICAqLwoJICAgIEJpdE1hdHJpeC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHggLyppbnQqLywgeSAvKmludCovKSB7CgkgICAgICAgIHZhciBvZmZzZXQgPSB5ICogdGhpcy5yb3dTaXplICsgTWF0aC5mbG9vcih4IC8gMzIpOwoJICAgICAgICByZXR1cm4gKCh0aGlzLmJpdHNbb2Zmc2V0XSA+Pj4gKHggJiAweDFmKSkgJiAxKSAhPT0gMDsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIDxwPlNldHMgdGhlIGdpdmVuIGJpdCB0byB0cnVlLjwvcD4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB4IFRoZSBob3Jpem9udGFsIGNvbXBvbmVudCAoaS5lLiB3aGljaCBjb2x1bW4pCgkgICAgICogQHBhcmFtIHkgVGhlIHZlcnRpY2FsIGNvbXBvbmVudCAoaS5lLiB3aGljaCByb3cpCgkgICAgICovCgkgICAgQml0TWF0cml4LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoeCAvKmludCovLCB5IC8qaW50Ki8pIHsKCSAgICAgICAgdmFyIG9mZnNldCA9IHkgKiB0aGlzLnJvd1NpemUgKyBNYXRoLmZsb29yKHggLyAzMik7CgkgICAgICAgIHRoaXMuYml0c1tvZmZzZXRdIHw9ICgxIDw8ICh4ICYgMHgxZikpICYgMHhGRkZGRkZGRjsKCSAgICB9OwoJICAgIEJpdE1hdHJpeC5wcm90b3R5cGUudW5zZXQgPSBmdW5jdGlvbiAoeCAvKmludCovLCB5IC8qaW50Ki8pIHsKCSAgICAgICAgdmFyIG9mZnNldCA9IHkgKiB0aGlzLnJvd1NpemUgKyBNYXRoLmZsb29yKHggLyAzMik7CgkgICAgICAgIHRoaXMuYml0c1tvZmZzZXRdICY9IH4oKDEgPDwgKHggJiAweDFmKSkgJiAweEZGRkZGRkZGKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIDxwPkZsaXBzIHRoZSBnaXZlbiBiaXQuPC9wPgoJICAgICAqCgkgICAgICogQHBhcmFtIHggVGhlIGhvcml6b250YWwgY29tcG9uZW50IChpLmUuIHdoaWNoIGNvbHVtbikKCSAgICAgKiBAcGFyYW0geSBUaGUgdmVydGljYWwgY29tcG9uZW50IChpLmUuIHdoaWNoIHJvdykKCSAgICAgKi8KCSAgICBCaXRNYXRyaXgucHJvdG90eXBlLmZsaXAgPSBmdW5jdGlvbiAoeCAvKmludCovLCB5IC8qaW50Ki8pIHsKCSAgICAgICAgdmFyIG9mZnNldCA9IHkgKiB0aGlzLnJvd1NpemUgKyBNYXRoLmZsb29yKHggLyAzMik7CgkgICAgICAgIHRoaXMuYml0c1tvZmZzZXRdIF49ICgoMSA8PCAoeCAmIDB4MWYpKSAmIDB4RkZGRkZGRkYpOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogRXhjbHVzaXZlLW9yIChYT1IpOiBGbGlwIHRoZSBiaXQgaW4gdGhpcyB7QGNvZGUgQml0TWF0cml4fSBpZiB0aGUgY29ycmVzcG9uZGluZwoJICAgICAqIG1hc2sgYml0IGlzIHNldC4KCSAgICAgKgoJICAgICAqIEBwYXJhbSBtYXNrIFhPUiBtYXNrCgkgICAgICovCgkgICAgQml0TWF0cml4LnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbiAobWFzaykgewoJICAgICAgICBpZiAodGhpcy53aWR0aCAhPT0gbWFzay5nZXRXaWR0aCgpIHx8IHRoaXMuaGVpZ2h0ICE9PSBtYXNrLmdldEhlaWdodCgpCgkgICAgICAgICAgICB8fCB0aGlzLnJvd1NpemUgIT09IG1hc2suZ2V0Um93U2l6ZSgpKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkNy5kZWZhdWx0KCdpbnB1dCBtYXRyaXggZGltZW5zaW9ucyBkbyBub3QgbWF0Y2gnKTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgcm93QXJyYXkgPSBuZXcgQml0QXJyYXlfMSQxLmRlZmF1bHQoTWF0aC5mbG9vcih0aGlzLndpZHRoIC8gMzIpICsgMSk7CgkgICAgICAgIHZhciByb3dTaXplID0gdGhpcy5yb3dTaXplOwoJICAgICAgICB2YXIgYml0cyA9IHRoaXMuYml0czsKCSAgICAgICAgZm9yICh2YXIgeSA9IDAsIGhlaWdodCA9IHRoaXMuaGVpZ2h0OyB5IDwgaGVpZ2h0OyB5KyspIHsKCSAgICAgICAgICAgIHZhciBvZmZzZXQgPSB5ICogcm93U2l6ZTsKCSAgICAgICAgICAgIHZhciByb3cgPSBtYXNrLmdldFJvdyh5LCByb3dBcnJheSkuZ2V0Qml0QXJyYXkoKTsKCSAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgcm93U2l6ZTsgeCsrKSB7CgkgICAgICAgICAgICAgICAgYml0c1tvZmZzZXQgKyB4XSBePSByb3dbeF07CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICB9OwoJICAgIC8qKgoJICAgICAqIENsZWFycyBhbGwgYml0cyAoc2V0cyB0byBmYWxzZSkuCgkgICAgICovCgkgICAgQml0TWF0cml4LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGJpdHMgPSB0aGlzLmJpdHM7CgkgICAgICAgIHZhciBtYXggPSBiaXRzLmxlbmd0aDsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXg7IGkrKykgewoJICAgICAgICAgICAgYml0c1tpXSA9IDA7CgkgICAgICAgIH0KCSAgICB9OwoJICAgIC8qKgoJICAgICAqIDxwPlNldHMgYSBzcXVhcmUgcmVnaW9uIG9mIHRoZSBiaXQgbWF0cml4IHRvIHRydWUuPC9wPgoJICAgICAqCgkgICAgICogQHBhcmFtIGxlZnQgVGhlIGhvcml6b250YWwgcG9zaXRpb24gdG8gYmVnaW4gYXQgKGluY2x1c2l2ZSkKCSAgICAgKiBAcGFyYW0gdG9wIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiB0byBiZWdpbiBhdCAoaW5jbHVzaXZlKQoJICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbgoJICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uCgkgICAgICovCgkgICAgQml0TWF0cml4LnByb3RvdHlwZS5zZXRSZWdpb24gPSBmdW5jdGlvbiAobGVmdCAvKmludCovLCB0b3AgLyppbnQqLywgd2lkdGggLyppbnQqLywgaGVpZ2h0IC8qaW50Ki8pIHsKCSAgICAgICAgaWYgKHRvcCA8IDAgfHwgbGVmdCA8IDApIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSQ3LmRlZmF1bHQoJ0xlZnQgYW5kIHRvcCBtdXN0IGJlIG5vbm5lZ2F0aXZlJyk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKGhlaWdodCA8IDEgfHwgd2lkdGggPCAxKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkNy5kZWZhdWx0KCdIZWlnaHQgYW5kIHdpZHRoIG11c3QgYmUgYXQgbGVhc3QgMScpOwoJICAgICAgICB9CgkgICAgICAgIHZhciByaWdodCA9IGxlZnQgKyB3aWR0aDsKCSAgICAgICAgdmFyIGJvdHRvbSA9IHRvcCArIGhlaWdodDsKCSAgICAgICAgaWYgKGJvdHRvbSA+IHRoaXMuaGVpZ2h0IHx8IHJpZ2h0ID4gdGhpcy53aWR0aCkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDcuZGVmYXVsdCgnVGhlIHJlZ2lvbiBtdXN0IGZpdCBpbnNpZGUgdGhlIG1hdHJpeCcpOwoJICAgICAgICB9CgkgICAgICAgIHZhciByb3dTaXplID0gdGhpcy5yb3dTaXplOwoJICAgICAgICB2YXIgYml0cyA9IHRoaXMuYml0czsKCSAgICAgICAgZm9yICh2YXIgeSA9IHRvcDsgeSA8IGJvdHRvbTsgeSsrKSB7CgkgICAgICAgICAgICB2YXIgb2Zmc2V0ID0geSAqIHJvd1NpemU7CgkgICAgICAgICAgICBmb3IgKHZhciB4ID0gbGVmdDsgeCA8IHJpZ2h0OyB4KyspIHsKCSAgICAgICAgICAgICAgICBiaXRzW29mZnNldCArIE1hdGguZmxvb3IoeCAvIDMyKV0gfD0gKCgxIDw8ICh4ICYgMHgxZikpICYgMHhGRkZGRkZGRik7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEEgZmFzdCBtZXRob2QgdG8gcmV0cmlldmUgb25lIHJvdyBvZiBkYXRhIGZyb20gdGhlIG1hdHJpeCBhcyBhIEJpdEFycmF5LgoJICAgICAqCgkgICAgICogQHBhcmFtIHkgVGhlIHJvdyB0byByZXRyaWV2ZQoJICAgICAqIEBwYXJhbSByb3cgQW4gb3B0aW9uYWwgY2FsbGVyLWFsbG9jYXRlZCBCaXRBcnJheSwgd2lsbCBiZSBhbGxvY2F0ZWQgaWYgbnVsbCBvciB0b28gc21hbGwKCSAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHRpbmcgQml0QXJyYXkgLSB0aGlzIHJlZmVyZW5jZSBzaG91bGQgYWx3YXlzIGJlIHVzZWQgZXZlbiB3aGVuIHBhc3NpbmcKCSAgICAgKiAgICAgICAgIHlvdXIgb3duIHJvdwoJICAgICAqLwoJICAgIEJpdE1hdHJpeC5wcm90b3R5cGUuZ2V0Um93ID0gZnVuY3Rpb24gKHkgLyppbnQqLywgcm93KSB7CgkgICAgICAgIGlmIChyb3cgPT09IG51bGwgfHwgcm93ID09PSB1bmRlZmluZWQgfHwgcm93LmdldFNpemUoKSA8IHRoaXMud2lkdGgpIHsKCSAgICAgICAgICAgIHJvdyA9IG5ldyBCaXRBcnJheV8xJDEuZGVmYXVsdCh0aGlzLndpZHRoKTsKCSAgICAgICAgfQoJICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgIHJvdy5jbGVhcigpOwoJICAgICAgICB9CgkgICAgICAgIHZhciByb3dTaXplID0gdGhpcy5yb3dTaXplOwoJICAgICAgICB2YXIgYml0cyA9IHRoaXMuYml0czsKCSAgICAgICAgdmFyIG9mZnNldCA9IHkgKiByb3dTaXplOwoJICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHJvd1NpemU7IHgrKykgewoJICAgICAgICAgICAgcm93LnNldEJ1bGsoeCAqIDMyLCBiaXRzW29mZnNldCArIHhdKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcm93OwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHBhcmFtIHkgcm93IHRvIHNldAoJICAgICAqIEBwYXJhbSByb3cge0BsaW5rIEJpdEFycmF5fSB0byBjb3B5IGZyb20KCSAgICAgKi8KCSAgICBCaXRNYXRyaXgucHJvdG90eXBlLnNldFJvdyA9IGZ1bmN0aW9uICh5IC8qaW50Ki8sIHJvdykgewoJICAgICAgICBTeXN0ZW1fMSQzLmRlZmF1bHQuYXJyYXljb3B5KHJvdy5nZXRCaXRBcnJheSgpLCAwLCB0aGlzLmJpdHMsIHkgKiB0aGlzLnJvd1NpemUsIHRoaXMucm93U2l6ZSk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBNb2RpZmllcyB0aGlzIHtAY29kZSBCaXRNYXRyaXh9IHRvIHJlcHJlc2VudCB0aGUgc2FtZSBidXQgcm90YXRlZCAxODAgZGVncmVlcwoJICAgICAqLwoJICAgIEJpdE1hdHJpeC5wcm90b3R5cGUucm90YXRlMTgwID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgd2lkdGggPSB0aGlzLmdldFdpZHRoKCk7CgkgICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmdldEhlaWdodCgpOwoJICAgICAgICB2YXIgdG9wUm93ID0gbmV3IEJpdEFycmF5XzEkMS5kZWZhdWx0KHdpZHRoKTsKCSAgICAgICAgdmFyIGJvdHRvbVJvdyA9IG5ldyBCaXRBcnJheV8xJDEuZGVmYXVsdCh3aWR0aCk7CgkgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGhfMSA9IE1hdGguZmxvb3IoKGhlaWdodCArIDEpIC8gMik7IGkgPCBsZW5ndGhfMTsgaSsrKSB7CgkgICAgICAgICAgICB0b3BSb3cgPSB0aGlzLmdldFJvdyhpLCB0b3BSb3cpOwoJICAgICAgICAgICAgYm90dG9tUm93ID0gdGhpcy5nZXRSb3coaGVpZ2h0IC0gMSAtIGksIGJvdHRvbVJvdyk7CgkgICAgICAgICAgICB0b3BSb3cucmV2ZXJzZSgpOwoJICAgICAgICAgICAgYm90dG9tUm93LnJldmVyc2UoKTsKCSAgICAgICAgICAgIHRoaXMuc2V0Um93KGksIGJvdHRvbVJvdyk7CgkgICAgICAgICAgICB0aGlzLnNldFJvdyhoZWlnaHQgLSAxIC0gaSwgdG9wUm93KTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgLyoqCgkgICAgICogVGhpcyBpcyB1c2VmdWwgaW4gZGV0ZWN0aW5nIHRoZSBlbmNsb3NpbmcgcmVjdGFuZ2xlIG9mIGEgJ3B1cmUnIGJhcmNvZGUuCgkgICAgICoKCSAgICAgKiBAcmV0dXJuIHtAY29kZSBsZWZ0LHRvcCx3aWR0aCxoZWlnaHR9IGVuY2xvc2luZyByZWN0YW5nbGUgb2YgYWxsIDEgYml0cywgb3IgbnVsbCBpZiBpdCBpcyBhbGwgd2hpdGUKCSAgICAgKi8KCSAgICBCaXRNYXRyaXgucHJvdG90eXBlLmdldEVuY2xvc2luZ1JlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aDsKCSAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuaGVpZ2h0OwoJICAgICAgICB2YXIgcm93U2l6ZSA9IHRoaXMucm93U2l6ZTsKCSAgICAgICAgdmFyIGJpdHMgPSB0aGlzLmJpdHM7CgkgICAgICAgIHZhciBsZWZ0ID0gd2lkdGg7CgkgICAgICAgIHZhciB0b3AgPSBoZWlnaHQ7CgkgICAgICAgIHZhciByaWdodCA9IC0xOwoJICAgICAgICB2YXIgYm90dG9tID0gLTE7CgkgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKCSAgICAgICAgICAgIGZvciAodmFyIHgzMiA9IDA7IHgzMiA8IHJvd1NpemU7IHgzMisrKSB7CgkgICAgICAgICAgICAgICAgdmFyIHRoZUJpdHMgPSBiaXRzW3kgKiByb3dTaXplICsgeDMyXTsKCSAgICAgICAgICAgICAgICBpZiAodGhlQml0cyAhPT0gMCkgewoJICAgICAgICAgICAgICAgICAgICBpZiAoeSA8IHRvcCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0geTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICBpZiAoeSA+IGJvdHRvbSkgewoJICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0geTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICBpZiAoeDMyICogMzIgPCBsZWZ0KSB7CgkgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYml0ID0gMDsKCSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKHRoZUJpdHMgPDwgKDMxIC0gYml0KSkgJiAweEZGRkZGRkZGKSA9PT0gMCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCsrOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh4MzIgKiAzMiArIGJpdCkgPCBsZWZ0KSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHgzMiAqIDMyICsgYml0OwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIGlmICh4MzIgKiAzMiArIDMxID4gcmlnaHQpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiaXQgPSAzMTsKCSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgodGhlQml0cyA+Pj4gYml0KSA9PT0gMCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdC0tOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh4MzIgKiAzMiArIGJpdCkgPiByaWdodCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0geDMyICogMzIgKyBiaXQ7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHJpZ2h0IDwgbGVmdCB8fCBib3R0b20gPCB0b3ApIHsKCSAgICAgICAgICAgIHJldHVybiBudWxsOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBJbnQzMkFycmF5LmZyb20oW2xlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0ICsgMSwgYm90dG9tIC0gdG9wICsgMV0pOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogVGhpcyBpcyB1c2VmdWwgaW4gZGV0ZWN0aW5nIGEgY29ybmVyIG9mIGEgJ3B1cmUnIGJhcmNvZGUuCgkgICAgICoKCSAgICAgKiBAcmV0dXJuIHtAY29kZSB4LHl9IGNvb3JkaW5hdGUgb2YgdG9wLWxlZnQtbW9zdCAxIGJpdCwgb3IgbnVsbCBpZiBpdCBpcyBhbGwgd2hpdGUKCSAgICAgKi8KCSAgICBCaXRNYXRyaXgucHJvdG90eXBlLmdldFRvcExlZnRPbkJpdCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIHJvd1NpemUgPSB0aGlzLnJvd1NpemU7CgkgICAgICAgIHZhciBiaXRzID0gdGhpcy5iaXRzOwoJICAgICAgICB2YXIgYml0c09mZnNldCA9IDA7CgkgICAgICAgIHdoaWxlIChiaXRzT2Zmc2V0IDwgYml0cy5sZW5ndGggJiYgYml0c1tiaXRzT2Zmc2V0XSA9PT0gMCkgewoJICAgICAgICAgICAgYml0c09mZnNldCsrOwoJICAgICAgICB9CgkgICAgICAgIGlmIChiaXRzT2Zmc2V0ID09PSBiaXRzLmxlbmd0aCkgewoJICAgICAgICAgICAgcmV0dXJuIG51bGw7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIHkgPSBiaXRzT2Zmc2V0IC8gcm93U2l6ZTsKCSAgICAgICAgdmFyIHggPSAoYml0c09mZnNldCAlIHJvd1NpemUpICogMzI7CgkgICAgICAgIHZhciB0aGVCaXRzID0gYml0c1tiaXRzT2Zmc2V0XTsKCSAgICAgICAgdmFyIGJpdCA9IDA7CgkgICAgICAgIHdoaWxlICgoKHRoZUJpdHMgPDwgKDMxIC0gYml0KSkgJiAweEZGRkZGRkZGKSA9PT0gMCkgewoJICAgICAgICAgICAgYml0Kys7CgkgICAgICAgIH0KCSAgICAgICAgeCArPSBiaXQ7CgkgICAgICAgIHJldHVybiBJbnQzMkFycmF5LmZyb20oW3gsIHldKTsKCSAgICB9OwoJICAgIEJpdE1hdHJpeC5wcm90b3R5cGUuZ2V0Qm90dG9tUmlnaHRPbkJpdCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIHJvd1NpemUgPSB0aGlzLnJvd1NpemU7CgkgICAgICAgIHZhciBiaXRzID0gdGhpcy5iaXRzOwoJICAgICAgICB2YXIgYml0c09mZnNldCA9IGJpdHMubGVuZ3RoIC0gMTsKCSAgICAgICAgd2hpbGUgKGJpdHNPZmZzZXQgPj0gMCAmJiBiaXRzW2JpdHNPZmZzZXRdID09PSAwKSB7CgkgICAgICAgICAgICBiaXRzT2Zmc2V0LS07CgkgICAgICAgIH0KCSAgICAgICAgaWYgKGJpdHNPZmZzZXQgPCAwKSB7CgkgICAgICAgICAgICByZXR1cm4gbnVsbDsKCSAgICAgICAgfQoJICAgICAgICB2YXIgeSA9IE1hdGguZmxvb3IoYml0c09mZnNldCAvIHJvd1NpemUpOwoJICAgICAgICB2YXIgeCA9IE1hdGguZmxvb3IoYml0c09mZnNldCAlIHJvd1NpemUpICogMzI7CgkgICAgICAgIHZhciB0aGVCaXRzID0gYml0c1tiaXRzT2Zmc2V0XTsKCSAgICAgICAgdmFyIGJpdCA9IDMxOwoJICAgICAgICB3aGlsZSAoKHRoZUJpdHMgPj4+IGJpdCkgPT09IDApIHsKCSAgICAgICAgICAgIGJpdC0tOwoJICAgICAgICB9CgkgICAgICAgIHggKz0gYml0OwoJICAgICAgICByZXR1cm4gSW50MzJBcnJheS5mcm9tKFt4LCB5XSk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgbWF0cml4CgkgICAgICovCgkgICAgQml0TWF0cml4LnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMud2lkdGg7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIFRoZSBoZWlnaHQgb2YgdGhlIG1hdHJpeAoJICAgICAqLwoJICAgIEJpdE1hdHJpeC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5oZWlnaHQ7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIFRoZSByb3cgc2l6ZSBvZiB0aGUgbWF0cml4CgkgICAgICovCgkgICAgQml0TWF0cml4LnByb3RvdHlwZS5nZXRSb3dTaXplID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5yb3dTaXplOwoJICAgIH07CgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIEJpdE1hdHJpeC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG8pIHsKCSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEJpdE1hdHJpeCkpIHsKCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgb3RoZXIgPSBvOwoJICAgICAgICByZXR1cm4gdGhpcy53aWR0aCA9PT0gb3RoZXIud2lkdGggJiYgdGhpcy5oZWlnaHQgPT09IG90aGVyLmhlaWdodCAmJiB0aGlzLnJvd1NpemUgPT09IG90aGVyLnJvd1NpemUgJiYKCSAgICAgICAgICAgIEFycmF5c18xLmRlZmF1bHQuZXF1YWxzKHRoaXMuYml0cywgb3RoZXIuYml0cyk7CgkgICAgfTsKCSAgICAvKkBPdmVycmlkZSovCgkgICAgQml0TWF0cml4LnByb3RvdHlwZS5oYXNoQ29kZSA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGhhc2ggPSB0aGlzLndpZHRoOwoJICAgICAgICBoYXNoID0gMzEgKiBoYXNoICsgdGhpcy53aWR0aDsKCSAgICAgICAgaGFzaCA9IDMxICogaGFzaCArIHRoaXMuaGVpZ2h0OwoJICAgICAgICBoYXNoID0gMzEgKiBoYXNoICsgdGhpcy5yb3dTaXplOwoJICAgICAgICBoYXNoID0gMzEgKiBoYXNoICsgQXJyYXlzXzEuZGVmYXVsdC5oYXNoQ29kZSh0aGlzLmJpdHMpOwoJICAgICAgICByZXR1cm4gaGFzaDsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIHVzaW5nICJYIiBmb3Igc2V0IGFuZCAiICIgZm9yIHVuc2V0IGJpdHMKCSAgICAgKi8KCSAgICAvKkBPdmVycmlkZSovCgkgICAgLy8gcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7CgkgICAgLy8gICByZXR1cm4gdG9TdHJpbmcoIjogIlgsICIgICIpCgkgICAgLy8gfQoJICAgIC8qKgoJICAgICAqIEBwYXJhbSBzZXRTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzZXQgYml0CgkgICAgICogQHBhcmFtIHVuc2V0U3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIHVuc2V0IGJpdAoJICAgICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGVudGlyZSBtYXRyaXggdXRpbGl6aW5nIGdpdmVuIHN0cmluZ3MKCSAgICAgKi8KCSAgICAvLyBwdWJsaWMgdG9TdHJpbmcoc2V0U3RyaW5nOiBzdHJpbmcgPSAiWCAiLCB1bnNldFN0cmluZzogc3RyaW5nID0gIiAgIik6IHN0cmluZyB7CgkgICAgLy8gICByZXR1cm4gdGhpcy5idWlsZFRvU3RyaW5nKHNldFN0cmluZywgdW5zZXRTdHJpbmcsICJcbiIpCgkgICAgLy8gfQoJICAgIC8qKgoJICAgICAqIEBwYXJhbSBzZXRTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzZXQgYml0CgkgICAgICogQHBhcmFtIHVuc2V0U3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIHVuc2V0IGJpdAoJICAgICAqIEBwYXJhbSBsaW5lU2VwYXJhdG9yIG5ld2xpbmUgY2hhcmFjdGVyIGluIHN0cmluZyByZXByZXNlbnRhdGlvbgoJICAgICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGVudGlyZSBtYXRyaXggdXRpbGl6aW5nIGdpdmVuIHN0cmluZ3MgYW5kIGxpbmUgc2VwYXJhdG9yCgkgICAgICogQGRlcHJlY2F0ZWQgY2FsbCB7QGxpbmsgI3RvU3RyaW5nKFN0cmluZyxTdHJpbmcpfSBvbmx5LCB3aGljaCB1c2VzIFxuIGxpbmUgc2VwYXJhdG9yIGFsd2F5cwoJICAgICAqLwoJICAgIC8vIEBEZXByZWNhdGVkCgkgICAgQml0TWF0cml4LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChzZXRTdHJpbmcsIHVuc2V0U3RyaW5nLCBsaW5lU2VwYXJhdG9yKSB7CgkgICAgICAgIGlmIChzZXRTdHJpbmcgPT09IHZvaWQgMCkgeyBzZXRTdHJpbmcgPSAnWCAnOyB9CgkgICAgICAgIGlmICh1bnNldFN0cmluZyA9PT0gdm9pZCAwKSB7IHVuc2V0U3RyaW5nID0gJyAgJzsgfQoJICAgICAgICBpZiAobGluZVNlcGFyYXRvciA9PT0gdm9pZCAwKSB7IGxpbmVTZXBhcmF0b3IgPSAnXG4nOyB9CgkgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVG9TdHJpbmcoc2V0U3RyaW5nLCB1bnNldFN0cmluZywgbGluZVNlcGFyYXRvcik7CgkgICAgfTsKCSAgICBCaXRNYXRyaXgucHJvdG90eXBlLmJ1aWxkVG9TdHJpbmcgPSBmdW5jdGlvbiAoc2V0U3RyaW5nLCB1bnNldFN0cmluZywgbGluZVNlcGFyYXRvcikgewoJICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXJfMSQyLmRlZmF1bHQoKTsKCSAgICAgICAgLy8gcmVzdWx0LmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKCSAgICAgICAgZm9yICh2YXIgeSA9IDAsIGhlaWdodCA9IHRoaXMuaGVpZ2h0OyB5IDwgaGVpZ2h0OyB5KyspIHsKCSAgICAgICAgICAgIGZvciAodmFyIHggPSAwLCB3aWR0aCA9IHRoaXMud2lkdGg7IHggPCB3aWR0aDsgeCsrKSB7CgkgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0aGlzLmdldCh4LCB5KSA/IHNldFN0cmluZyA6IHVuc2V0U3RyaW5nKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZVNlcGFyYXRvcik7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwoJICAgIH07CgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIEJpdE1hdHJpeC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiBuZXcgQml0TWF0cml4KHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCB0aGlzLnJvd1NpemUsIHRoaXMuYml0cy5zbGljZSgpKTsKCSAgICB9OwoJICAgIHJldHVybiBCaXRNYXRyaXg7Cgl9KCkpOwoJQml0TWF0cml4JDEuZGVmYXVsdCA9IEJpdE1hdHJpeDsKCgl2YXIgTm90Rm91bmRFeGNlcHRpb24kMSA9IHt9OwoKCXZhciBfX2V4dGVuZHMkZCA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7CgkgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8CgkgICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8CgkgICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTsKCSAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgfTsKCSAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9CgkgICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKCSAgICB9OwoJfSkoKTsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShOb3RGb3VuZEV4Y2VwdGlvbiQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7Cgl2YXIgRXhjZXB0aW9uXzEkNSA9IEV4Y2VwdGlvbiQxOwoJLyoqCgkgKiBDdXN0b20gRXJyb3IgY2xhc3Mgb2YgdHlwZSBFeGNlcHRpb24uCgkgKi8KCXZhciBOb3RGb3VuZEV4Y2VwdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKCSAgICBfX2V4dGVuZHMkZChOb3RGb3VuZEV4Y2VwdGlvbiwgX3N1cGVyKTsKCSAgICBmdW5jdGlvbiBOb3RGb3VuZEV4Y2VwdGlvbigpIHsKCSAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwoJICAgIH0KCSAgICBOb3RGb3VuZEV4Y2VwdGlvbi5nZXROb3RGb3VuZEluc3RhbmNlID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCk7CgkgICAgfTsKCSAgICBOb3RGb3VuZEV4Y2VwdGlvbi5raW5kID0gJ05vdEZvdW5kRXhjZXB0aW9uJzsKCSAgICByZXR1cm4gTm90Rm91bmRFeGNlcHRpb247Cgl9KEV4Y2VwdGlvbl8xJDUuZGVmYXVsdCkpOwoJTm90Rm91bmRFeGNlcHRpb24kMS5kZWZhdWx0ID0gTm90Rm91bmRFeGNlcHRpb247CgoJLyoKCSAqIENvcHlyaWdodCAyMDA5IFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCXZhciBfX2V4dGVuZHMkYyA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7CgkgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8CgkgICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8CgkgICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTsKCSAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgfTsKCSAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9CgkgICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKCSAgICB9OwoJfSkoKTsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJLypuYW1lc3BhY2UgY29tLmdvb2dsZS56eGluZy5jb21tb24geyovCgl2YXIgQmluYXJpemVyXzEgPSBCaW5hcml6ZXIkMTsKCXZhciBCaXRBcnJheV8xID0gQml0QXJyYXkkMTsKCXZhciBCaXRNYXRyaXhfMSQ1ID0gQml0TWF0cml4JDE7Cgl2YXIgTm90Rm91bmRFeGNlcHRpb25fMSQ2ID0gTm90Rm91bmRFeGNlcHRpb24kMTsKCS8qKgoJICogVGhpcyBCaW5hcml6ZXIgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgb2xkIFpYaW5nIGdsb2JhbCBoaXN0b2dyYW0gYXBwcm9hY2guIEl0IGlzIHN1aXRhYmxlCgkgKiBmb3IgbG93LWVuZCBtb2JpbGUgZGV2aWNlcyB3aGljaCBkb24ndCBoYXZlIGVub3VnaCBDUFUgb3IgbWVtb3J5IHRvIHVzZSBhIGxvY2FsIHRocmVzaG9sZGluZwoJICogYWxnb3JpdGhtLiBIb3dldmVyLCBiZWNhdXNlIGl0IHBpY2tzIGEgZ2xvYmFsIGJsYWNrIHBvaW50LCBpdCBjYW5ub3QgaGFuZGxlIGRpZmZpY3VsdCBzaGFkb3dzCgkgKiBhbmQgZ3JhZGllbnRzLgoJICoKCSAqIEZhc3RlciBtb2JpbGUgZGV2aWNlcyBhbmQgYWxsIGRlc2t0b3AgYXBwbGljYXRpb25zIHNob3VsZCBwcm9iYWJseSB1c2UgSHlicmlkQmluYXJpemVyIGluc3RlYWQuCgkgKgoJICogQGF1dGhvciBkc3dpdGtpbkBnb29nbGUuY29tIChEYW5pZWwgU3dpdGtpbikKCSAqIEBhdXRob3IgU2VhbiBPd2VuCgkgKi8KCXZhciBHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CgkgICAgX19leHRlbmRzJGMoR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLCBfc3VwZXIpOwoJICAgIGZ1bmN0aW9uIEdsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcihzb3VyY2UpIHsKCSAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc291cmNlKSB8fCB0aGlzOwoJICAgICAgICBfdGhpcy5sdW1pbmFuY2VzID0gR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLkVNUFRZOwoJICAgICAgICBfdGhpcy5idWNrZXRzID0gbmV3IEludDMyQXJyYXkoR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLkxVTUlOQU5DRV9CVUNLRVRTKTsKCSAgICAgICAgcmV0dXJuIF90aGlzOwoJICAgIH0KCSAgICAvLyBBcHBsaWVzIHNpbXBsZSBzaGFycGVuaW5nIHRvIHRoZSByb3cgZGF0YSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIHRoZSAxRCBSZWFkZXJzLgoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIucHJvdG90eXBlLmdldEJsYWNrUm93ID0gZnVuY3Rpb24gKHkgLyppbnQqLywgcm93KSB7CgkgICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLmdldEx1bWluYW5jZVNvdXJjZSgpOwoJICAgICAgICB2YXIgd2lkdGggPSBzb3VyY2UuZ2V0V2lkdGgoKTsKCSAgICAgICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkIHx8IHJvdyA9PT0gbnVsbCB8fCByb3cuZ2V0U2l6ZSgpIDwgd2lkdGgpIHsKCSAgICAgICAgICAgIHJvdyA9IG5ldyBCaXRBcnJheV8xLmRlZmF1bHQod2lkdGgpOwoJICAgICAgICB9CgkgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgcm93LmNsZWFyKCk7CgkgICAgICAgIH0KCSAgICAgICAgdGhpcy5pbml0QXJyYXlzKHdpZHRoKTsKCSAgICAgICAgdmFyIGxvY2FsTHVtaW5hbmNlcyA9IHNvdXJjZS5nZXRSb3coeSwgdGhpcy5sdW1pbmFuY2VzKTsKCSAgICAgICAgdmFyIGxvY2FsQnVja2V0cyA9IHRoaXMuYnVja2V0czsKCSAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkgICAgICAgICAgICBsb2NhbEJ1Y2tldHNbKGxvY2FsTHVtaW5hbmNlc1t4XSAmIDB4ZmYpID4+IEdsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5MVU1JTkFOQ0VfU0hJRlRdKys7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIGJsYWNrUG9pbnQgPSBHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuZXN0aW1hdGVCbGFja1BvaW50KGxvY2FsQnVja2V0cyk7CgkgICAgICAgIGlmICh3aWR0aCA8IDMpIHsKCSAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdmVyeSBzbWFsbCBpbWFnZXMKCSAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJICAgICAgICAgICAgICAgIGlmICgobG9jYWxMdW1pbmFuY2VzW3hdICYgMHhmZikgPCBibGFja1BvaW50KSB7CgkgICAgICAgICAgICAgICAgICAgIHJvdy5zZXQoeCk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgdmFyIGxlZnQgPSBsb2NhbEx1bWluYW5jZXNbMF0gJiAweGZmOwoJICAgICAgICAgICAgdmFyIGNlbnRlciA9IGxvY2FsTHVtaW5hbmNlc1sxXSAmIDB4ZmY7CgkgICAgICAgICAgICBmb3IgKHZhciB4ID0gMTsgeCA8IHdpZHRoIC0gMTsgeCsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIHJpZ2h0ID0gbG9jYWxMdW1pbmFuY2VzW3ggKyAxXSAmIDB4ZmY7CgkgICAgICAgICAgICAgICAgLy8gQSBzaW1wbGUgLTEgNCAtMSBib3ggZmlsdGVyIHdpdGggYSB3ZWlnaHQgb2YgMi4KCSAgICAgICAgICAgICAgICBpZiAoKChjZW50ZXIgKiA0KSAtIGxlZnQgLSByaWdodCkgLyAyIDwgYmxhY2tQb2ludCkgewoJICAgICAgICAgICAgICAgICAgICByb3cuc2V0KHgpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBsZWZ0ID0gY2VudGVyOwoJICAgICAgICAgICAgICAgIGNlbnRlciA9IHJpZ2h0OwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiByb3c7CgkgICAgfTsKCSAgICAvLyBEb2VzIG5vdCBzaGFycGVuIHRoZSBkYXRhLCBhcyB0aGlzIGNhbGwgaXMgaW50ZW5kZWQgdG8gb25seSBiZSB1c2VkIGJ5IDJEIFJlYWRlcnMuCgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIEdsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5wcm90b3R5cGUuZ2V0QmxhY2tNYXRyaXggPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLmdldEx1bWluYW5jZVNvdXJjZSgpOwoJICAgICAgICB2YXIgd2lkdGggPSBzb3VyY2UuZ2V0V2lkdGgoKTsKCSAgICAgICAgdmFyIGhlaWdodCA9IHNvdXJjZS5nZXRIZWlnaHQoKTsKCSAgICAgICAgdmFyIG1hdHJpeCA9IG5ldyBCaXRNYXRyaXhfMSQ1LmRlZmF1bHQod2lkdGgsIGhlaWdodCk7CgkgICAgICAgIC8vIFF1aWNrbHkgY2FsY3VsYXRlcyB0aGUgaGlzdG9ncmFtIGJ5IHNhbXBsaW5nIGZvdXIgcm93cyBmcm9tIHRoZSBpbWFnZS4gVGhpcyBwcm92ZWQgdG8gYmUKCSAgICAgICAgLy8gbW9yZSByb2J1c3Qgb24gdGhlIGJsYWNrYm94IHRlc3RzIHRoYW4gc2FtcGxpbmcgYSBkaWFnb25hbCBhcyB3ZSB1c2VkIHRvIGRvLgoJICAgICAgICB0aGlzLmluaXRBcnJheXMod2lkdGgpOwoJICAgICAgICB2YXIgbG9jYWxCdWNrZXRzID0gdGhpcy5idWNrZXRzOwoJICAgICAgICBmb3IgKHZhciB5ID0gMTsgeSA8IDU7IHkrKykgewoJICAgICAgICAgICAgdmFyIHJvdyA9IE1hdGguZmxvb3IoKGhlaWdodCAqIHkpIC8gNSk7CgkgICAgICAgICAgICB2YXIgbG9jYWxMdW1pbmFuY2VzXzEgPSBzb3VyY2UuZ2V0Um93KHJvdywgdGhpcy5sdW1pbmFuY2VzKTsKCSAgICAgICAgICAgIHZhciByaWdodCA9IE1hdGguZmxvb3IoKHdpZHRoICogNCkgLyA1KTsKCSAgICAgICAgICAgIGZvciAodmFyIHggPSBNYXRoLmZsb29yKHdpZHRoIC8gNSk7IHggPCByaWdodDsgeCsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBpeGVsID0gbG9jYWxMdW1pbmFuY2VzXzFbeF0gJiAweGZmOwoJICAgICAgICAgICAgICAgIGxvY2FsQnVja2V0c1twaXhlbCA+PiBHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuTFVNSU5BTkNFX1NISUZUXSsrOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHZhciBibGFja1BvaW50ID0gR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLmVzdGltYXRlQmxhY2tQb2ludChsb2NhbEJ1Y2tldHMpOwoJICAgICAgICAvLyBXZSBkZWxheSByZWFkaW5nIHRoZSBlbnRpcmUgaW1hZ2UgbHVtaW5hbmNlIHVudGlsIHRoZSBibGFjayBwb2ludCBlc3RpbWF0aW9uIHN1Y2NlZWRzLgoJICAgICAgICAvLyBBbHRob3VnaCB3ZSBlbmQgdXAgcmVhZGluZyBmb3VyIHJvd3MgdHdpY2UsIGl0IGlzIGNvbnNpc3RlbnQgd2l0aCBvdXIgbW90dG8gb2YKCSAgICAgICAgLy8gImZhaWwgcXVpY2tseSIgd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciBjb250aW51b3VzIHNjYW5uaW5nLgoJICAgICAgICB2YXIgbG9jYWxMdW1pbmFuY2VzID0gc291cmNlLmdldE1hdHJpeCgpOwoJICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkgICAgICAgICAgICB2YXIgb2Zmc2V0ID0geSAqIHdpZHRoOwoJICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBpeGVsID0gbG9jYWxMdW1pbmFuY2VzW29mZnNldCArIHhdICYgMHhmZjsKCSAgICAgICAgICAgICAgICBpZiAocGl4ZWwgPCBibGFja1BvaW50KSB7CgkgICAgICAgICAgICAgICAgICAgIG1hdHJpeC5zZXQoeCwgeSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBtYXRyaXg7CgkgICAgfTsKCSAgICAvKkBPdmVycmlkZSovCgkgICAgR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLnByb3RvdHlwZS5jcmVhdGVCaW5hcml6ZXIgPSBmdW5jdGlvbiAoc291cmNlKSB7CgkgICAgICAgIHJldHVybiBuZXcgR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyKHNvdXJjZSk7CgkgICAgfTsKCSAgICBHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIucHJvdG90eXBlLmluaXRBcnJheXMgPSBmdW5jdGlvbiAobHVtaW5hbmNlU2l6ZSAvKmludCovKSB7CgkgICAgICAgIGlmICh0aGlzLmx1bWluYW5jZXMubGVuZ3RoIDwgbHVtaW5hbmNlU2l6ZSkgewoJICAgICAgICAgICAgdGhpcy5sdW1pbmFuY2VzID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGx1bWluYW5jZVNpemUpOwoJICAgICAgICB9CgkgICAgICAgIHZhciBidWNrZXRzID0gdGhpcy5idWNrZXRzOwoJICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IEdsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5MVU1JTkFOQ0VfQlVDS0VUUzsgeCsrKSB7CgkgICAgICAgICAgICBidWNrZXRzW3hdID0gMDsKCSAgICAgICAgfQoJICAgIH07CgkgICAgR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLmVzdGltYXRlQmxhY2tQb2ludCA9IGZ1bmN0aW9uIChidWNrZXRzKSB7CgkgICAgICAgIC8vIEZpbmQgdGhlIHRhbGxlc3QgcGVhayBpbiB0aGUgaGlzdG9ncmFtLgoJICAgICAgICB2YXIgbnVtQnVja2V0cyA9IGJ1Y2tldHMubGVuZ3RoOwoJICAgICAgICB2YXIgbWF4QnVja2V0Q291bnQgPSAwOwoJICAgICAgICB2YXIgZmlyc3RQZWFrID0gMDsKCSAgICAgICAgdmFyIGZpcnN0UGVha1NpemUgPSAwOwoJICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IG51bUJ1Y2tldHM7IHgrKykgewoJICAgICAgICAgICAgaWYgKGJ1Y2tldHNbeF0gPiBmaXJzdFBlYWtTaXplKSB7CgkgICAgICAgICAgICAgICAgZmlyc3RQZWFrID0geDsKCSAgICAgICAgICAgICAgICBmaXJzdFBlYWtTaXplID0gYnVja2V0c1t4XTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGlmIChidWNrZXRzW3hdID4gbWF4QnVja2V0Q291bnQpIHsKCSAgICAgICAgICAgICAgICBtYXhCdWNrZXRDb3VudCA9IGJ1Y2tldHNbeF07CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgLy8gRmluZCB0aGUgc2Vjb25kLXRhbGxlc3QgcGVhayB3aGljaCBpcyBzb21ld2hhdCBmYXIgZnJvbSB0aGUgdGFsbGVzdCBwZWFrLgoJICAgICAgICB2YXIgc2Vjb25kUGVhayA9IDA7CgkgICAgICAgIHZhciBzZWNvbmRQZWFrU2NvcmUgPSAwOwoJICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IG51bUJ1Y2tldHM7IHgrKykgewoJICAgICAgICAgICAgdmFyIGRpc3RhbmNlVG9CaWdnZXN0ID0geCAtIGZpcnN0UGVhazsKCSAgICAgICAgICAgIC8vIEVuY291cmFnZSBtb3JlIGRpc3RhbnQgc2Vjb25kIHBlYWtzIGJ5IG11bHRpcGx5aW5nIGJ5IHNxdWFyZSBvZiBkaXN0YW5jZS4KCSAgICAgICAgICAgIHZhciBzY29yZSA9IGJ1Y2tldHNbeF0gKiBkaXN0YW5jZVRvQmlnZ2VzdCAqIGRpc3RhbmNlVG9CaWdnZXN0OwoJICAgICAgICAgICAgaWYgKHNjb3JlID4gc2Vjb25kUGVha1Njb3JlKSB7CgkgICAgICAgICAgICAgICAgc2Vjb25kUGVhayA9IHg7CgkgICAgICAgICAgICAgICAgc2Vjb25kUGVha1Njb3JlID0gc2NvcmU7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgLy8gTWFrZSBzdXJlIGZpcnN0UGVhayBjb3JyZXNwb25kcyB0byB0aGUgYmxhY2sgcGVhay4KCSAgICAgICAgaWYgKGZpcnN0UGVhayA+IHNlY29uZFBlYWspIHsKCSAgICAgICAgICAgIHZhciB0ZW1wID0gZmlyc3RQZWFrOwoJICAgICAgICAgICAgZmlyc3RQZWFrID0gc2Vjb25kUGVhazsKCSAgICAgICAgICAgIHNlY29uZFBlYWsgPSB0ZW1wOwoJICAgICAgICB9CgkgICAgICAgIC8vIElmIHRoZXJlIGlzIHRvbyBsaXR0bGUgY29udHJhc3QgaW4gdGhlIGltYWdlIHRvIHBpY2sgYSBtZWFuaW5nZnVsIGJsYWNrIHBvaW50LCB0aHJvdyByYXRoZXIKCSAgICAgICAgLy8gdGhhbiB3YXN0ZSB0aW1lIHRyeWluZyB0byBkZWNvZGUgdGhlIGltYWdlLCBhbmQgcmlzayBmYWxzZSBwb3NpdGl2ZXMuCgkgICAgICAgIGlmIChzZWNvbmRQZWFrIC0gZmlyc3RQZWFrIDw9IG51bUJ1Y2tldHMgLyAxNikgewoJICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uXzEkNi5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICAgICAgLy8gRmluZCBhIHZhbGxleSBiZXR3ZWVuIHRoZW0gdGhhdCBpcyBsb3cgYW5kIGNsb3NlciB0byB0aGUgd2hpdGUgcGVhay4KCSAgICAgICAgdmFyIGJlc3RWYWxsZXkgPSBzZWNvbmRQZWFrIC0gMTsKCSAgICAgICAgdmFyIGJlc3RWYWxsZXlTY29yZSA9IC0xOwoJICAgICAgICBmb3IgKHZhciB4ID0gc2Vjb25kUGVhayAtIDE7IHggPiBmaXJzdFBlYWs7IHgtLSkgewoJICAgICAgICAgICAgdmFyIGZyb21GaXJzdCA9IHggLSBmaXJzdFBlYWs7CgkgICAgICAgICAgICB2YXIgc2NvcmUgPSBmcm9tRmlyc3QgKiBmcm9tRmlyc3QgKiAoc2Vjb25kUGVhayAtIHgpICogKG1heEJ1Y2tldENvdW50IC0gYnVja2V0c1t4XSk7CgkgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0VmFsbGV5U2NvcmUpIHsKCSAgICAgICAgICAgICAgICBiZXN0VmFsbGV5ID0geDsKCSAgICAgICAgICAgICAgICBiZXN0VmFsbGV5U2NvcmUgPSBzY29yZTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gYmVzdFZhbGxleSA8PCBHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuTFVNSU5BTkNFX1NISUZUOwoJICAgIH07CgkgICAgR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLkxVTUlOQU5DRV9CSVRTID0gNTsKCSAgICBHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuTFVNSU5BTkNFX1NISUZUID0gOCAtIEdsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5MVU1JTkFOQ0VfQklUUzsKCSAgICBHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuTFVNSU5BTkNFX0JVQ0tFVFMgPSAxIDw8IEdsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5MVU1JTkFOQ0VfQklUUzsKCSAgICBHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuRU1QVFkgPSBVaW50OENsYW1wZWRBcnJheS5mcm9tKFswXSk7CgkgICAgcmV0dXJuIEdsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcjsKCX0oQmluYXJpemVyXzEuZGVmYXVsdCkpOwoJR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyJDEuZGVmYXVsdCA9IEdsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcjsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDkgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJdmFyIF9fZXh0ZW5kcyRiID0gKGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHsKCSAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwKCSAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHwKCSAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9OwoJICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICB9OwoJICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH0KCSAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpOwoJICAgIH07Cgl9KSgpOwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEh5YnJpZEJpbmFyaXplciQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7Cgl2YXIgR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyXzEgPSBHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIkMTsKCXZhciBCaXRNYXRyaXhfMSQ0ID0gQml0TWF0cml4JDE7CgkvKioKCSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGxvY2FsIHRocmVzaG9sZGluZyBhbGdvcml0aG0sIHdoaWNoIHdoaWxlIHNsb3dlciB0aGFuIHRoZQoJICogR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLCBpcyBmYWlybHkgZWZmaWNpZW50IGZvciB3aGF0IGl0IGRvZXMuIEl0IGlzIGRlc2lnbmVkIGZvcgoJICogaGlnaCBmcmVxdWVuY3kgaW1hZ2VzIG9mIGJhcmNvZGVzIHdpdGggYmxhY2sgZGF0YSBvbiB3aGl0ZSBiYWNrZ3JvdW5kcy4gRm9yIHRoaXMgYXBwbGljYXRpb24sCgkgKiBpdCBkb2VzIGEgbXVjaCBiZXR0ZXIgam9iIHRoYW4gYSBnbG9iYWwgYmxhY2twb2ludCB3aXRoIHNldmVyZSBzaGFkb3dzIGFuZCBncmFkaWVudHMuCgkgKiBIb3dldmVyIGl0IHRlbmRzIHRvIHByb2R1Y2UgYXJ0aWZhY3RzIG9uIGxvd2VyIGZyZXF1ZW5jeSBpbWFnZXMgYW5kIGlzIHRoZXJlZm9yZSBub3QKCSAqIGEgZ29vZCBnZW5lcmFsIHB1cnBvc2UgYmluYXJpemVyIGZvciB1c2VzIG91dHNpZGUgWlhpbmcuCgkgKgoJICogVGhpcyBjbGFzcyBleHRlbmRzIEdsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciwgdXNpbmcgdGhlIG9sZGVyIGhpc3RvZ3JhbSBhcHByb2FjaCBmb3IgMUQgcmVhZGVycywKCSAqIGFuZCB0aGUgbmV3ZXIgbG9jYWwgYXBwcm9hY2ggZm9yIDJEIHJlYWRlcnMuIDFEIGRlY29kaW5nIHVzaW5nIGEgcGVyLXJvdyBoaXN0b2dyYW0gaXMgYWxyZWFkeQoJICogaW5oZXJlbnRseSBsb2NhbCwgYW5kIG9ubHkgZmFpbHMgZm9yIGhvcml6b250YWwgZ3JhZGllbnRzLiBXZSBjYW4gcmV2aXNpdCB0aGF0IHByb2JsZW0gbGF0ZXIsCgkgKiBidXQgZm9yIG5vdyBpdCB3YXMgbm90IGEgd2luIHRvIHVzZSBsb2NhbCBibG9ja3MgZm9yIDFELgoJICoKCSAqIFRoaXMgQmluYXJpemVyIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUgdW5pdCB0ZXN0cyBhbmQgdGhlIHJlY29tbWVuZGVkIGNsYXNzIGZvciBsaWJyYXJ5IHVzZXJzLgoJICoKCSAqIEBhdXRob3IgZHN3aXRraW5AZ29vZ2xlLmNvbSAoRGFuaWVsIFN3aXRraW4pCgkgKi8KCXZhciBIeWJyaWRCaW5hcml6ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CgkgICAgX19leHRlbmRzJGIoSHlicmlkQmluYXJpemVyLCBfc3VwZXIpOwoJICAgIGZ1bmN0aW9uIEh5YnJpZEJpbmFyaXplcihzb3VyY2UpIHsKCSAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc291cmNlKSB8fCB0aGlzOwoJICAgICAgICBfdGhpcy5tYXRyaXggPSBudWxsOwoJICAgICAgICByZXR1cm4gX3RoaXM7CgkgICAgfQoJICAgIC8qKgoJICAgICAqIENhbGN1bGF0ZXMgdGhlIGZpbmFsIEJpdE1hdHJpeCBvbmNlIGZvciBhbGwgcmVxdWVzdHMuIFRoaXMgY291bGQgYmUgY2FsbGVkIG9uY2UgZnJvbSB0aGUKCSAgICAgKiBjb25zdHJ1Y3RvciBpbnN0ZWFkLCBidXQgdGhlcmUgYXJlIHNvbWUgYWR2YW50YWdlcyB0byBkb2luZyBpdCBsYXppbHksIHN1Y2ggYXMgbWFraW5nCgkgICAgICogcHJvZmlsaW5nIGVhc2llciwgYW5kIG5vdCBkb2luZyBoZWF2eSBsaWZ0aW5nIHdoZW4gY2FsbGVycyBkb24ndCBleHBlY3QgaXQuCgkgICAgICovCgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIEh5YnJpZEJpbmFyaXplci5wcm90b3R5cGUuZ2V0QmxhY2tNYXRyaXggPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIGlmICh0aGlzLm1hdHJpeCAhPT0gbnVsbCkgewoJICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF0cml4OwoJICAgICAgICB9CgkgICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLmdldEx1bWluYW5jZVNvdXJjZSgpOwoJICAgICAgICB2YXIgd2lkdGggPSBzb3VyY2UuZ2V0V2lkdGgoKTsKCSAgICAgICAgdmFyIGhlaWdodCA9IHNvdXJjZS5nZXRIZWlnaHQoKTsKCSAgICAgICAgaWYgKHdpZHRoID49IEh5YnJpZEJpbmFyaXplci5NSU5JTVVNX0RJTUVOU0lPTiAmJiBoZWlnaHQgPj0gSHlicmlkQmluYXJpemVyLk1JTklNVU1fRElNRU5TSU9OKSB7CgkgICAgICAgICAgICB2YXIgbHVtaW5hbmNlcyA9IHNvdXJjZS5nZXRNYXRyaXgoKTsKCSAgICAgICAgICAgIHZhciBzdWJXaWR0aCA9IHdpZHRoID4+IEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFX1BPV0VSOwoJICAgICAgICAgICAgaWYgKCh3aWR0aCAmIEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFX01BU0spICE9PSAwKSB7CgkgICAgICAgICAgICAgICAgc3ViV2lkdGgrKzsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHZhciBzdWJIZWlnaHQgPSBoZWlnaHQgPj4gSHlicmlkQmluYXJpemVyLkJMT0NLX1NJWkVfUE9XRVI7CgkgICAgICAgICAgICBpZiAoKGhlaWdodCAmIEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFX01BU0spICE9PSAwKSB7CgkgICAgICAgICAgICAgICAgc3ViSGVpZ2h0Kys7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICB2YXIgYmxhY2tQb2ludHMgPSBIeWJyaWRCaW5hcml6ZXIuY2FsY3VsYXRlQmxhY2tQb2ludHMobHVtaW5hbmNlcywgc3ViV2lkdGgsIHN1YkhlaWdodCwgd2lkdGgsIGhlaWdodCk7CgkgICAgICAgICAgICB2YXIgbmV3TWF0cml4ID0gbmV3IEJpdE1hdHJpeF8xJDQuZGVmYXVsdCh3aWR0aCwgaGVpZ2h0KTsKCSAgICAgICAgICAgIEh5YnJpZEJpbmFyaXplci5jYWxjdWxhdGVUaHJlc2hvbGRGb3JCbG9jayhsdW1pbmFuY2VzLCBzdWJXaWR0aCwgc3ViSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBibGFja1BvaW50cywgbmV3TWF0cml4KTsKCSAgICAgICAgICAgIHRoaXMubWF0cml4ID0gbmV3TWF0cml4OwoJICAgICAgICB9CgkgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgLy8gSWYgdGhlIGltYWdlIGlzIHRvbyBzbWFsbCwgZmFsbCBiYWNrIHRvIHRoZSBnbG9iYWwgaGlzdG9ncmFtIGFwcHJvYWNoLgoJICAgICAgICAgICAgdGhpcy5tYXRyaXggPSBfc3VwZXIucHJvdG90eXBlLmdldEJsYWNrTWF0cml4LmNhbGwodGhpcyk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHRoaXMubWF0cml4OwoJICAgIH07CgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIEh5YnJpZEJpbmFyaXplci5wcm90b3R5cGUuY3JlYXRlQmluYXJpemVyID0gZnVuY3Rpb24gKHNvdXJjZSkgewoJICAgICAgICByZXR1cm4gbmV3IEh5YnJpZEJpbmFyaXplcihzb3VyY2UpOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogRm9yIGVhY2ggYmxvY2sgaW4gdGhlIGltYWdlLCBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgYmxhY2sgcG9pbnQgdXNpbmcgYSA1eDUgZ3JpZAoJICAgICAqIG9mIHRoZSBibG9ja3MgYXJvdW5kIGl0LiBBbHNvIGhhbmRsZXMgdGhlIGNvcm5lciBjYXNlcyAoZnJhY3Rpb25hbCBibG9ja3MgYXJlIGNvbXB1dGVkIGJhc2VkCgkgICAgICogb24gdGhlIGxhc3QgcGl4ZWxzIGluIHRoZSByb3cvY29sdW1uIHdoaWNoIGFyZSBhbHNvIHVzZWQgaW4gdGhlIHByZXZpb3VzIGJsb2NrKS4KCSAgICAgKi8KCSAgICBIeWJyaWRCaW5hcml6ZXIuY2FsY3VsYXRlVGhyZXNob2xkRm9yQmxvY2sgPSBmdW5jdGlvbiAobHVtaW5hbmNlcywgc3ViV2lkdGggLyppbnQqLywgc3ViSGVpZ2h0IC8qaW50Ki8sIHdpZHRoIC8qaW50Ki8sIGhlaWdodCAvKmludCovLCBibGFja1BvaW50cywgbWF0cml4KSB7CgkgICAgICAgIHZhciBtYXhZT2Zmc2V0ID0gaGVpZ2h0IC0gSHlicmlkQmluYXJpemVyLkJMT0NLX1NJWkU7CgkgICAgICAgIHZhciBtYXhYT2Zmc2V0ID0gd2lkdGggLSBIeWJyaWRCaW5hcml6ZXIuQkxPQ0tfU0laRTsKCSAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBzdWJIZWlnaHQ7IHkrKykgewoJICAgICAgICAgICAgdmFyIHlvZmZzZXQgPSB5IDw8IEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFX1BPV0VSOwoJICAgICAgICAgICAgaWYgKHlvZmZzZXQgPiBtYXhZT2Zmc2V0KSB7CgkgICAgICAgICAgICAgICAgeW9mZnNldCA9IG1heFlPZmZzZXQ7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICB2YXIgdG9wXzEgPSBIeWJyaWRCaW5hcml6ZXIuY2FwKHksIDIsIHN1YkhlaWdodCAtIDMpOwoJICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBzdWJXaWR0aDsgeCsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIHhvZmZzZXQgPSB4IDw8IEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFX1BPV0VSOwoJICAgICAgICAgICAgICAgIGlmICh4b2Zmc2V0ID4gbWF4WE9mZnNldCkgewoJICAgICAgICAgICAgICAgICAgICB4b2Zmc2V0ID0gbWF4WE9mZnNldDsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgdmFyIGxlZnQgPSBIeWJyaWRCaW5hcml6ZXIuY2FwKHgsIDIsIHN1YldpZHRoIC0gMyk7CgkgICAgICAgICAgICAgICAgdmFyIHN1bSA9IDA7CgkgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IC0yOyB6IDw9IDI7IHorKykgewoJICAgICAgICAgICAgICAgICAgICB2YXIgYmxhY2tSb3cgPSBibGFja1BvaW50c1t0b3BfMSArIHpdOwoJICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYmxhY2tSb3dbbGVmdCAtIDJdICsgYmxhY2tSb3dbbGVmdCAtIDFdICsgYmxhY2tSb3dbbGVmdF0gKyBibGFja1Jvd1tsZWZ0ICsgMV0gKyBibGFja1Jvd1tsZWZ0ICsgMl07CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBhdmVyYWdlID0gc3VtIC8gMjU7CgkgICAgICAgICAgICAgICAgSHlicmlkQmluYXJpemVyLnRocmVzaG9sZEJsb2NrKGx1bWluYW5jZXMsIHhvZmZzZXQsIHlvZmZzZXQsIGF2ZXJhZ2UsIHdpZHRoLCBtYXRyaXgpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgfTsKCSAgICBIeWJyaWRCaW5hcml6ZXIuY2FwID0gZnVuY3Rpb24gKHZhbHVlIC8qaW50Ki8sIG1pbiAvKmludCovLCBtYXggLyppbnQqLykgewoJICAgICAgICByZXR1cm4gdmFsdWUgPCBtaW4gPyBtaW4gOiB2YWx1ZSA+IG1heCA/IG1heCA6IHZhbHVlOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQXBwbGllcyBhIHNpbmdsZSB0aHJlc2hvbGQgdG8gYSBibG9jayBvZiBwaXhlbHMuCgkgICAgICovCgkgICAgSHlicmlkQmluYXJpemVyLnRocmVzaG9sZEJsb2NrID0gZnVuY3Rpb24gKGx1bWluYW5jZXMsIHhvZmZzZXQgLyppbnQqLywgeW9mZnNldCAvKmludCovLCB0aHJlc2hvbGQgLyppbnQqLywgc3RyaWRlIC8qaW50Ki8sIG1hdHJpeCkgewoJICAgICAgICBmb3IgKHZhciB5ID0gMCwgb2Zmc2V0ID0geW9mZnNldCAqIHN0cmlkZSArIHhvZmZzZXQ7IHkgPCBIeWJyaWRCaW5hcml6ZXIuQkxPQ0tfU0laRTsgeSsrLCBvZmZzZXQgKz0gc3RyaWRlKSB7CgkgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFOyB4KyspIHsKCSAgICAgICAgICAgICAgICAvLyBDb21wYXJpc29uIG5lZWRzIHRvIGJlIDw9IHNvIHRoYXQgYmxhY2sgPT0gMCBwaXhlbHMgYXJlIGJsYWNrIGV2ZW4gaWYgdGhlIHRocmVzaG9sZCBpcyAwLgoJICAgICAgICAgICAgICAgIGlmICgobHVtaW5hbmNlc1tvZmZzZXQgKyB4XSAmIDB4RkYpIDw9IHRocmVzaG9sZCkgewoJICAgICAgICAgICAgICAgICAgICBtYXRyaXguc2V0KHhvZmZzZXQgKyB4LCB5b2Zmc2V0ICsgeSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBDYWxjdWxhdGVzIGEgc2luZ2xlIGJsYWNrIHBvaW50IGZvciBlYWNoIGJsb2NrIG9mIHBpeGVscyBhbmQgc2F2ZXMgaXQgYXdheS4KCSAgICAgKiBTZWUgdGhlIGZvbGxvd2luZyB0aHJlYWQgZm9yIGEgZGlzY3Vzc2lvbiBvZiB0aGlzIGFsZ29yaXRobToKCSAgICAgKiAgaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3p4aW5nL2Jyb3dzZV90aHJlYWQvdGhyZWFkL2QwNmVmYTJjMzVhN2RkYzAKCSAgICAgKi8KCSAgICBIeWJyaWRCaW5hcml6ZXIuY2FsY3VsYXRlQmxhY2tQb2ludHMgPSBmdW5jdGlvbiAobHVtaW5hbmNlcywgc3ViV2lkdGggLyppbnQqLywgc3ViSGVpZ2h0IC8qaW50Ki8sIHdpZHRoIC8qaW50Ki8sIGhlaWdodCAvKmludCovKSB7CgkgICAgICAgIHZhciBtYXhZT2Zmc2V0ID0gaGVpZ2h0IC0gSHlicmlkQmluYXJpemVyLkJMT0NLX1NJWkU7CgkgICAgICAgIHZhciBtYXhYT2Zmc2V0ID0gd2lkdGggLSBIeWJyaWRCaW5hcml6ZXIuQkxPQ0tfU0laRTsKCSAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOndoaXRlc3BhY2UKCSAgICAgICAgdmFyIGJsYWNrUG9pbnRzID0gbmV3IEFycmF5KHN1YkhlaWdodCk7IC8vIHN1YldpZHRoCgkgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgc3ViSGVpZ2h0OyB5KyspIHsKCSAgICAgICAgICAgIGJsYWNrUG9pbnRzW3ldID0gbmV3IEludDMyQXJyYXkoc3ViV2lkdGgpOwoJICAgICAgICAgICAgdmFyIHlvZmZzZXQgPSB5IDw8IEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFX1BPV0VSOwoJICAgICAgICAgICAgaWYgKHlvZmZzZXQgPiBtYXhZT2Zmc2V0KSB7CgkgICAgICAgICAgICAgICAgeW9mZnNldCA9IG1heFlPZmZzZXQ7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHN1YldpZHRoOyB4KyspIHsKCSAgICAgICAgICAgICAgICB2YXIgeG9mZnNldCA9IHggPDwgSHlicmlkQmluYXJpemVyLkJMT0NLX1NJWkVfUE9XRVI7CgkgICAgICAgICAgICAgICAgaWYgKHhvZmZzZXQgPiBtYXhYT2Zmc2V0KSB7CgkgICAgICAgICAgICAgICAgICAgIHhvZmZzZXQgPSBtYXhYT2Zmc2V0OwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB2YXIgc3VtID0gMDsKCSAgICAgICAgICAgICAgICB2YXIgbWluID0gMHhGRjsKCSAgICAgICAgICAgICAgICB2YXIgbWF4ID0gMDsKCSAgICAgICAgICAgICAgICBmb3IgKHZhciB5eSA9IDAsIG9mZnNldCA9IHlvZmZzZXQgKiB3aWR0aCArIHhvZmZzZXQ7IHl5IDwgSHlicmlkQmluYXJpemVyLkJMT0NLX1NJWkU7IHl5KyssIG9mZnNldCArPSB3aWR0aCkgewoJICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4eCA9IDA7IHh4IDwgSHlicmlkQmluYXJpemVyLkJMT0NLX1NJWkU7IHh4KyspIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwaXhlbCA9IGx1bWluYW5jZXNbb2Zmc2V0ICsgeHhdICYgMHhGRjsKCSAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBwaXhlbDsKCSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIGxvb2tpbmcgZm9yIGdvb2QgY29udHJhc3QKCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbCA8IG1pbikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IHBpeGVsOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsID4gbWF4KSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gcGl4ZWw7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgLy8gc2hvcnQtY2lyY3VpdCBtaW4vbWF4IHRlc3RzIG9uY2UgZHluYW1pYyByYW5nZSBpcyBtZXQKCSAgICAgICAgICAgICAgICAgICAgaWYgKG1heCAtIG1pbiA+IEh5YnJpZEJpbmFyaXplci5NSU5fRFlOQU1JQ19SQU5HRSkgewoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoIHRoZSByZXN0IG9mIHRoZSByb3dzIHF1aWNrbHkKCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeXkrKywgb2Zmc2V0ICs9IHdpZHRoOyB5eSA8IEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFOyB5eSsrLCBvZmZzZXQgKz0gd2lkdGgpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4eCA9IDA7IHh4IDwgSHlicmlkQmluYXJpemVyLkJMT0NLX1NJWkU7IHh4KyspIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGx1bWluYW5jZXNbb2Zmc2V0ICsgeHhdICYgMHhGRjsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgZXN0aW1hdGUgaXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHZhbHVlcyBpbiB0aGUgYmxvY2suCgkgICAgICAgICAgICAgICAgdmFyIGF2ZXJhZ2UgPSBzdW0gPj4gKEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFX1BPV0VSICogMik7CgkgICAgICAgICAgICAgICAgaWYgKG1heCAtIG1pbiA8PSBIeWJyaWRCaW5hcml6ZXIuTUlOX0RZTkFNSUNfUkFOR0UpIHsKCSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdmFyaWF0aW9uIHdpdGhpbiB0aGUgYmxvY2sgaXMgbG93LCBhc3N1bWUgdGhpcyBpcyBhIGJsb2NrIHdpdGggb25seSBsaWdodCBvciBvbmx5CgkgICAgICAgICAgICAgICAgICAgIC8vIGRhcmsgcGl4ZWxzLiBJbiB0aGF0IGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gdXNlIHRoZSBhdmVyYWdlLCBhcyBpdCB3b3VsZCBkaXZpZGUgdGhpcwoJICAgICAgICAgICAgICAgICAgICAvLyBsb3cgY29udHJhc3QgYXJlYSBpbnRvIGJsYWNrIGFuZCB3aGl0ZSBwaXhlbHMsIGVzc2VudGlhbGx5IGNyZWF0aW5nIGRhdGEgb3V0IG9mIG5vaXNlLgoJICAgICAgICAgICAgICAgICAgICAvLwoJICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGJsb2NrIGlzIGxpZ2h0L2JhY2tncm91bmQuIFNpbmNlIG5vIGVzdGltYXRlIGZvcgoJICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGV2ZWwgb2YgZGFyayBwaXhlbHMgZXhpc3RzIGxvY2FsbHksIHVzZSBoYWxmIHRoZSBtaW4gZm9yIHRoZSBibG9jay4KCSAgICAgICAgICAgICAgICAgICAgYXZlcmFnZSA9IG1pbiAvIDI7CgkgICAgICAgICAgICAgICAgICAgIGlmICh5ID4gMCAmJiB4ID4gMCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aGUgIndoaXRlIGJhY2tncm91bmQiIGFzc3VtcHRpb24gZm9yIGJsb2NrcyB0aGF0IGhhdmUgbmVpZ2hib3JzIGJ5IGNvbXBhcmluZwoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBpeGVscyBpbiB0aGlzIGJsb2NrIHRvIHRoZSBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgYmxhY2sgcG9pbnRzLiBUaGlzIGlzIGJhc2VkIG9uCgkgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IGRhcmsgYmFyY29kZSBzeW1ib2xvZ3kgaXMgYWx3YXlzIHN1cnJvdW5kZWQgYnkgc29tZSBhbW91bnQgb2YgbGlnaHQKCSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgZm9yIHdoaWNoIHJlYXNvbmFibGUgYmxhY2sgcG9pbnQgZXN0aW1hdGVzIHdlcmUgbWFkZS4gVGhlIGJwIGVzdGltYXRlZCBhdAoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvdW5kYXJpZXMgaXMgdXNlZCBmb3IgdGhlIGludGVyaW9yLgoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIChtaW4gPCBicCkgaXMgYXJiaXRyYXJ5IGJ1dCB3b3JrcyBiZXR0ZXIgdGhhbiBvdGhlciBoZXVyaXN0aWNzIHRoYXQgd2VyZSB0cmllZC4KCSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdmVyYWdlTmVpZ2hib3JCbGFja1BvaW50ID0gKGJsYWNrUG9pbnRzW3kgLSAxXVt4XSArICgyICogYmxhY2tQb2ludHNbeV1beCAtIDFdKSArIGJsYWNrUG9pbnRzW3kgLSAxXVt4IC0gMV0pIC8gNDsKCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW4gPCBhdmVyYWdlTmVpZ2hib3JCbGFja1BvaW50KSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZSA9IGF2ZXJhZ2VOZWlnaGJvckJsYWNrUG9pbnQ7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgYmxhY2tQb2ludHNbeV1beF0gPSBhdmVyYWdlOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBibGFja1BvaW50czsKCSAgICB9OwoJICAgIC8vIFRoaXMgY2xhc3MgdXNlcyA1eDUgYmxvY2tzIHRvIGNvbXB1dGUgbG9jYWwgbHVtaW5hbmNlLCB3aGVyZSBlYWNoIGJsb2NrIGlzIDh4OCBwaXhlbHMuCgkgICAgLy8gU28gdGhpcyBpcyB0aGUgc21hbGxlc3QgZGltZW5zaW9uIGluIGVhY2ggYXhpcyB3ZSBjYW4gYWNjZXB0LgoJICAgIEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFX1BPV0VSID0gMzsKCSAgICBIeWJyaWRCaW5hcml6ZXIuQkxPQ0tfU0laRSA9IDEgPDwgSHlicmlkQmluYXJpemVyLkJMT0NLX1NJWkVfUE9XRVI7IC8vIC4uLjAxMDAuLi4wMAoJICAgIEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFX01BU0sgPSBIeWJyaWRCaW5hcml6ZXIuQkxPQ0tfU0laRSAtIDE7IC8vIC4uLjAwMTEuLi4xMQoJICAgIEh5YnJpZEJpbmFyaXplci5NSU5JTVVNX0RJTUVOU0lPTiA9IEh5YnJpZEJpbmFyaXplci5CTE9DS19TSVpFICogNTsKCSAgICBIeWJyaWRCaW5hcml6ZXIuTUlOX0RZTkFNSUNfUkFOR0UgPSAyNDsKCSAgICByZXR1cm4gSHlicmlkQmluYXJpemVyOwoJfShHbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXJfMS5kZWZhdWx0KSk7Cgl2YXIgX2RlZmF1bHQkMiA9IEh5YnJpZEJpbmFyaXplciQxLmRlZmF1bHQgPSBIeWJyaWRCaW5hcml6ZXI7CgoJdmFyIFJHQkx1bWluYW5jZVNvdXJjZSQxID0ge307CgoJdmFyIEludmVydGVkTHVtaW5hbmNlU291cmNlJDEgPSB7fTsKCgl2YXIgTHVtaW5hbmNlU291cmNlJDEgPSB7fTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDkgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEx1bWluYW5jZVNvdXJjZSQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7Cgl2YXIgU3RyaW5nQnVpbGRlcl8xJDEgPSBTdHJpbmdCdWlsZGVyJDE7Cgl2YXIgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25fMSA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uJDE7CgkvKm5hbWVzcGFjZSBjb20uZ29vZ2xlLnp4aW5nIHsqLwoJLyoqCgkgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGhpZXJhcmNoeSBpcyB0byBhYnN0cmFjdCBkaWZmZXJlbnQgYml0bWFwIGltcGxlbWVudGF0aW9ucyBhY3Jvc3MKCSAqIHBsYXRmb3JtcyBpbnRvIGEgc3RhbmRhcmQgaW50ZXJmYWNlIGZvciByZXF1ZXN0aW5nIGdyZXlzY2FsZSBsdW1pbmFuY2UgdmFsdWVzLiBUaGUgaW50ZXJmYWNlCgkgKiBvbmx5IHByb3ZpZGVzIGltbXV0YWJsZSBtZXRob2RzOyB0aGVyZWZvcmUgY3JvcCBhbmQgcm90YXRpb24gY3JlYXRlIGNvcGllcy4gVGhpcyBpcyB0byBlbnN1cmUKCSAqIHRoYXQgb25lIFJlYWRlciBkb2VzIG5vdCBtb2RpZnkgdGhlIG9yaWdpbmFsIGx1bWluYW5jZSBzb3VyY2UgYW5kIGxlYXZlIGl0IGluIGFuIHVua25vd24gc3RhdGUKCSAqIGZvciBvdGhlciBSZWFkZXJzIGluIHRoZSBjaGFpbi4KCSAqCgkgKiBAYXV0aG9yIGRzd2l0a2luQGdvb2dsZS5jb20gKERhbmllbCBTd2l0a2luKQoJICovCgl2YXIgTHVtaW5hbmNlU291cmNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIGZ1bmN0aW9uIEx1bWluYW5jZVNvdXJjZSh3aWR0aCAvKmludCovLCBoZWlnaHQgLyppbnQqLykgewoJICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CgkgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwoJICAgIH0KCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgYml0bWFwLgoJICAgICAqLwoJICAgIEx1bWluYW5jZVNvdXJjZS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLndpZHRoOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiBUaGUgaGVpZ2h0IG9mIHRoZSBiaXRtYXAuCgkgICAgICovCgkgICAgTHVtaW5hbmNlU291cmNlLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmhlaWdodDsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIHN1YmNsYXNzIHN1cHBvcnRzIGNyb3BwaW5nLgoJICAgICAqLwoJICAgIEx1bWluYW5jZVNvdXJjZS5wcm90b3R5cGUuaXNDcm9wU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIGNyb3BwZWQgaW1hZ2UgZGF0YS4gSW1wbGVtZW50YXRpb25zIG1heSBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZQoJICAgICAqIG9yaWdpbmFsIGRhdGEgcmF0aGVyIHRoYW4gYSBjb3B5LiBPbmx5IGNhbGxhYmxlIGlmIGlzQ3JvcFN1cHBvcnRlZCgpIGlzIHRydWUuCgkgICAgICoKCSAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlLCB3aGljaCBtdXN0IGJlIGluIFswLGdldFdpZHRoKCkpCgkgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUsIHdoaWNoIG11c3QgYmUgaW4gWzAsZ2V0SGVpZ2h0KCkpCgkgICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNyb3AuCgkgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdG8gY3JvcC4KCSAgICAgKiBAcmV0dXJuIEEgY3JvcHBlZCB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0LgoJICAgICAqLwoJICAgIEx1bWluYW5jZVNvdXJjZS5wcm90b3R5cGUuY3JvcCA9IGZ1bmN0aW9uIChsZWZ0IC8qaW50Ki8sIHRvcCAvKmludCovLCB3aWR0aCAvKmludCovLCBoZWlnaHQgLyppbnQqLykgewoJICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25fMS5kZWZhdWx0KCdUaGlzIGx1bWluYW5jZSBzb3VyY2UgZG9lcyBub3Qgc3VwcG9ydCBjcm9wcGluZy4nKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIHN1YmNsYXNzIHN1cHBvcnRzIGNvdW50ZXItY2xvY2t3aXNlIHJvdGF0aW9uLgoJICAgICAqLwoJICAgIEx1bWluYW5jZVNvdXJjZS5wcm90b3R5cGUuaXNSb3RhdGVTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiBmYWxzZTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IHdpdGggcm90YXRlZCBpbWFnZSBkYXRhIGJ5IDkwIGRlZ3JlZXMgY291bnRlcmNsb2Nrd2lzZS4KCSAgICAgKiBPbmx5IGNhbGxhYmxlIGlmIHtAbGluayAjaXNSb3RhdGVTdXBwb3J0ZWQoKX0gaXMgdHJ1ZS4KCSAgICAgKgoJICAgICAqIEByZXR1cm4gQSByb3RhdGVkIHZlcnNpb24gb2YgdGhpcyBvYmplY3QuCgkgICAgICovCgkgICAgTHVtaW5hbmNlU291cmNlLnByb3RvdHlwZS5yb3RhdGVDb3VudGVyQ2xvY2t3aXNlID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25fMS5kZWZhdWx0KCdUaGlzIGx1bWluYW5jZSBzb3VyY2UgZG9lcyBub3Qgc3VwcG9ydCByb3RhdGlvbiBieSA5MCBkZWdyZWVzLicpOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgd2l0aCByb3RhdGVkIGltYWdlIGRhdGEgYnkgNDUgZGVncmVlcyBjb3VudGVyY2xvY2t3aXNlLgoJICAgICAqIE9ubHkgY2FsbGFibGUgaWYge0BsaW5rICNpc1JvdGF0ZVN1cHBvcnRlZCgpfSBpcyB0cnVlLgoJICAgICAqCgkgICAgICogQHJldHVybiBBIHJvdGF0ZWQgdmVyc2lvbiBvZiB0aGlzIG9iamVjdC4KCSAgICAgKi8KCSAgICBMdW1pbmFuY2VTb3VyY2UucHJvdG90eXBlLnJvdGF0ZUNvdW50ZXJDbG9ja3dpc2U0NSA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uXzEuZGVmYXVsdCgnVGhpcyBsdW1pbmFuY2Ugc291cmNlIGRvZXMgbm90IHN1cHBvcnQgcm90YXRpb24gYnkgNDUgZGVncmVlcy4nKTsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBMdW1pbmFuY2VTb3VyY2UucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgcm93ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHRoaXMud2lkdGgpOwoJICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXJfMSQxLmRlZmF1bHQoKTsKCSAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCB0aGlzLmhlaWdodDsgeSsrKSB7CgkgICAgICAgICAgICB2YXIgc291cmNlUm93ID0gdGhpcy5nZXRSb3coeSwgcm93KTsKCSAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIGx1bWluYW5jZSA9IHNvdXJjZVJvd1t4XSAmIDB4RkY7CgkgICAgICAgICAgICAgICAgdmFyIGMgPSB2b2lkIDA7CgkgICAgICAgICAgICAgICAgaWYgKGx1bWluYW5jZSA8IDB4NDApIHsKCSAgICAgICAgICAgICAgICAgICAgYyA9ICcjJzsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgZWxzZSBpZiAobHVtaW5hbmNlIDwgMHg4MCkgewoJICAgICAgICAgICAgICAgICAgICBjID0gJysnOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBlbHNlIGlmIChsdW1pbmFuY2UgPCAweEMwKSB7CgkgICAgICAgICAgICAgICAgICAgIGMgPSAnLic7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgICAgICAgICBjID0gJyAnOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXG4nKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CgkgICAgfTsKCSAgICByZXR1cm4gTHVtaW5hbmNlU291cmNlOwoJfSgpKTsKCUx1bWluYW5jZVNvdXJjZSQxLmRlZmF1bHQgPSBMdW1pbmFuY2VTb3VyY2U7CgoJLyoKCSAqIENvcHlyaWdodCAyMDA5IFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCXZhciBfX2V4dGVuZHMkYSA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7CgkgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8CgkgICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8CgkgICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTsKCSAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgfTsKCSAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9CgkgICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKCSAgICB9OwoJfSkoKTsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnZlcnRlZEx1bWluYW5jZVNvdXJjZSQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7Cgl2YXIgTHVtaW5hbmNlU291cmNlXzEkMSA9IEx1bWluYW5jZVNvdXJjZSQxOwoJLypuYW1lc3BhY2UgY29tLmdvb2dsZS56eGluZyB7Ki8KCS8qKgoJICogQSB3cmFwcGVyIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBMdW1pbmFuY2VTb3VyY2V9IHdoaWNoIGludmVydHMgdGhlIGx1bWluYW5jZXMgaXQgcmV0dXJucyAtLSBibGFjayBiZWNvbWVzCgkgKiB3aGl0ZSBhbmQgdmljZSB2ZXJzYSwgYW5kIGVhY2ggdmFsdWUgYmVjb21lcyAoMjU1LXZhbHVlKS4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICovCgl2YXIgSW52ZXJ0ZWRMdW1pbmFuY2VTb3VyY2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CgkgICAgX19leHRlbmRzJGEoSW52ZXJ0ZWRMdW1pbmFuY2VTb3VyY2UsIF9zdXBlcik7CgkgICAgZnVuY3Rpb24gSW52ZXJ0ZWRMdW1pbmFuY2VTb3VyY2UoZGVsZWdhdGUpIHsKCSAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGVsZWdhdGUuZ2V0V2lkdGgoKSwgZGVsZWdhdGUuZ2V0SGVpZ2h0KCkpIHx8IHRoaXM7CgkgICAgICAgIF90aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CgkgICAgICAgIHJldHVybiBfdGhpczsKCSAgICB9CgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIEludmVydGVkTHVtaW5hbmNlU291cmNlLnByb3RvdHlwZS5nZXRSb3cgPSBmdW5jdGlvbiAoeSAvKmludCovLCByb3cpIHsKCSAgICAgICAgdmFyIHNvdXJjZVJvdyA9IHRoaXMuZGVsZWdhdGUuZ2V0Um93KHksIHJvdyk7CgkgICAgICAgIHZhciB3aWR0aCA9IHRoaXMuZ2V0V2lkdGgoKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CgkgICAgICAgICAgICBzb3VyY2VSb3dbaV0gPSAvKihieXRlKSovICgyNTUgLSAoc291cmNlUm93W2ldICYgMHhGRikpOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBzb3VyY2VSb3c7CgkgICAgfTsKCSAgICAvKkBPdmVycmlkZSovCgkgICAgSW52ZXJ0ZWRMdW1pbmFuY2VTb3VyY2UucHJvdG90eXBlLmdldE1hdHJpeCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMuZGVsZWdhdGUuZ2V0TWF0cml4KCk7CgkgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmdldFdpZHRoKCkgKiB0aGlzLmdldEhlaWdodCgpOwoJICAgICAgICB2YXIgaW52ZXJ0ZWRNYXRyaXggPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobGVuZ3RoKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJICAgICAgICAgICAgaW52ZXJ0ZWRNYXRyaXhbaV0gPSAvKihieXRlKSovICgyNTUgLSAobWF0cml4W2ldICYgMHhGRikpOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBpbnZlcnRlZE1hdHJpeDsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBJbnZlcnRlZEx1bWluYW5jZVNvdXJjZS5wcm90b3R5cGUuaXNDcm9wU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5pc0Nyb3BTdXBwb3J0ZWQoKTsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBJbnZlcnRlZEx1bWluYW5jZVNvdXJjZS5wcm90b3R5cGUuY3JvcCA9IGZ1bmN0aW9uIChsZWZ0IC8qaW50Ki8sIHRvcCAvKmludCovLCB3aWR0aCAvKmludCovLCBoZWlnaHQgLyppbnQqLykgewoJICAgICAgICByZXR1cm4gbmV3IEludmVydGVkTHVtaW5hbmNlU291cmNlKHRoaXMuZGVsZWdhdGUuY3JvcChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpKTsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBJbnZlcnRlZEx1bWluYW5jZVNvdXJjZS5wcm90b3R5cGUuaXNSb3RhdGVTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmlzUm90YXRlU3VwcG9ydGVkKCk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIG9yaWdpbmFsIGRlbGVnYXRlIHtAbGluayBMdW1pbmFuY2VTb3VyY2V9IHNpbmNlIGludmVydCB1bmRvZXMgaXRzZWxmCgkgICAgICovCgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIEludmVydGVkTHVtaW5hbmNlU291cmNlLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlOwoJICAgIH07CgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIEludmVydGVkTHVtaW5hbmNlU291cmNlLnByb3RvdHlwZS5yb3RhdGVDb3VudGVyQ2xvY2t3aXNlID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gbmV3IEludmVydGVkTHVtaW5hbmNlU291cmNlKHRoaXMuZGVsZWdhdGUucm90YXRlQ291bnRlckNsb2Nrd2lzZSgpKTsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBJbnZlcnRlZEx1bWluYW5jZVNvdXJjZS5wcm90b3R5cGUucm90YXRlQ291bnRlckNsb2Nrd2lzZTQ1ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gbmV3IEludmVydGVkTHVtaW5hbmNlU291cmNlKHRoaXMuZGVsZWdhdGUucm90YXRlQ291bnRlckNsb2Nrd2lzZTQ1KCkpOwoJICAgIH07CgkgICAgcmV0dXJuIEludmVydGVkTHVtaW5hbmNlU291cmNlOwoJfShMdW1pbmFuY2VTb3VyY2VfMSQxLmRlZmF1bHQpKTsKCUludmVydGVkTHVtaW5hbmNlU291cmNlJDEuZGVmYXVsdCA9IEludmVydGVkTHVtaW5hbmNlU291cmNlOwoKCS8qCgkgKiBDb3B5cmlnaHQgMjAwOSBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCgl2YXIgX19leHRlbmRzJDkgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fAoJICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fAoJICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07CgkgICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgIH07CgkgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQoJICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CgkgICAgfTsKCX0pKCk7CglPYmplY3QuZGVmaW5lUHJvcGVydHkoUkdCTHVtaW5hbmNlU291cmNlJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcgeyovCgkgLy8gcmVxdWlyZWQgYmVjYXVzZSBvZiBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmV0d2VlbiBMdW1pbmFuY2VTb3VyY2UgYW5kIEludmVydGVkTHVtaW5hbmNlU291cmNlCgl2YXIgSW52ZXJ0ZWRMdW1pbmFuY2VTb3VyY2VfMSA9IEludmVydGVkTHVtaW5hbmNlU291cmNlJDE7Cgl2YXIgTHVtaW5hbmNlU291cmNlXzEgPSBMdW1pbmFuY2VTb3VyY2UkMTsKCXZhciBTeXN0ZW1fMSQyID0gU3lzdGVtJDE7Cgl2YXIgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkNiA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiQxOwoJLyoqCgkgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaGVscCBkZWNvZGUgaW1hZ2VzIGZyb20gZmlsZXMgd2hpY2ggYXJyaXZlIGFzIFJHQiBkYXRhIGZyb20KCSAqIGFuIEFSR0IgcGl4ZWwgYXJyYXkuIEl0IGRvZXMgbm90IHN1cHBvcnQgcm90YXRpb24uCgkgKgoJICogQGF1dGhvciBkc3dpdGtpbkBnb29nbGUuY29tIChEYW5pZWwgU3dpdGtpbikKCSAqIEBhdXRob3IgQmV0YW1pbm9zCgkgKi8KCXZhciBSR0JMdW1pbmFuY2VTb3VyY2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CgkgICAgX19leHRlbmRzJDkoUkdCTHVtaW5hbmNlU291cmNlLCBfc3VwZXIpOwoJICAgIGZ1bmN0aW9uIFJHQkx1bWluYW5jZVNvdXJjZShsdW1pbmFuY2VzLCB3aWR0aCAvKmludCovLCBoZWlnaHQgLyppbnQqLywgZGF0YVdpZHRoIC8qaW50Ki8sIGRhdGFIZWlnaHQgLyppbnQqLywgbGVmdCAvKmludCovLCB0b3AgLyppbnQqLykgewoJICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB3aWR0aCwgaGVpZ2h0KSB8fCB0aGlzOwoJICAgICAgICBfdGhpcy5kYXRhV2lkdGggPSBkYXRhV2lkdGg7CgkgICAgICAgIF90aGlzLmRhdGFIZWlnaHQgPSBkYXRhSGVpZ2h0OwoJICAgICAgICBfdGhpcy5sZWZ0ID0gbGVmdDsKCSAgICAgICAgX3RoaXMudG9wID0gdG9wOwoJICAgICAgICBpZiAobHVtaW5hbmNlcy5CWVRFU19QRVJfRUxFTUVOVCA9PT0gNCkgeyAvLyBJbnQzMkFycmF5CgkgICAgICAgICAgICB2YXIgc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwoJICAgICAgICAgICAgdmFyIGx1bWluYW5jZXNVaW50OEFycmF5ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHNpemUpOwoJICAgICAgICAgICAgZm9yICh2YXIgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgc2l6ZTsgb2Zmc2V0KyspIHsKCSAgICAgICAgICAgICAgICB2YXIgcGl4ZWwgPSBsdW1pbmFuY2VzW29mZnNldF07CgkgICAgICAgICAgICAgICAgdmFyIHIgPSAocGl4ZWwgPj4gMTYpICYgMHhmZjsgLy8gcmVkCgkgICAgICAgICAgICAgICAgdmFyIGcyID0gKHBpeGVsID4+IDcpICYgMHgxZmU7IC8vIDIgKiBncmVlbgoJICAgICAgICAgICAgICAgIHZhciBiID0gcGl4ZWwgJiAweGZmOyAvLyBibHVlCgkgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGdyZWVuLWZhdm91cmluZyBhdmVyYWdlIGNoZWFwbHkKCSAgICAgICAgICAgICAgICBsdW1pbmFuY2VzVWludDhBcnJheVtvZmZzZXRdID0gLyooYnl0ZSkgKi8gKChyICsgZzIgKyBiKSAvIDQpICYgMHhGRjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIF90aGlzLmx1bWluYW5jZXMgPSBsdW1pbmFuY2VzVWludDhBcnJheTsKCSAgICAgICAgfQoJICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgIF90aGlzLmx1bWluYW5jZXMgPSBsdW1pbmFuY2VzOwoJICAgICAgICB9CgkgICAgICAgIGlmICh1bmRlZmluZWQgPT09IGRhdGFXaWR0aCkgewoJICAgICAgICAgICAgX3RoaXMuZGF0YVdpZHRoID0gd2lkdGg7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gZGF0YUhlaWdodCkgewoJICAgICAgICAgICAgX3RoaXMuZGF0YUhlaWdodCA9IGhlaWdodDsKCSAgICAgICAgfQoJICAgICAgICBpZiAodW5kZWZpbmVkID09PSBsZWZ0KSB7CgkgICAgICAgICAgICBfdGhpcy5sZWZ0ID0gMDsKCSAgICAgICAgfQoJICAgICAgICBpZiAodW5kZWZpbmVkID09PSB0b3ApIHsKCSAgICAgICAgICAgIF90aGlzLnRvcCA9IDA7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKF90aGlzLmxlZnQgKyB3aWR0aCA+IF90aGlzLmRhdGFXaWR0aCB8fCBfdGhpcy50b3AgKyBoZWlnaHQgPiBfdGhpcy5kYXRhSGVpZ2h0KSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkNi5kZWZhdWx0KCdDcm9wIHJlY3RhbmdsZSBkb2VzIG5vdCBmaXQgd2l0aGluIGltYWdlIGRhdGEuJyk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIF90aGlzOwoJICAgIH0KCSAgICAvKkBPdmVycmlkZSovCgkgICAgUkdCTHVtaW5hbmNlU291cmNlLnByb3RvdHlwZS5nZXRSb3cgPSBmdW5jdGlvbiAoeSAvKmludCovLCByb3cpIHsKCSAgICAgICAgaWYgKHkgPCAwIHx8IHkgPj0gdGhpcy5nZXRIZWlnaHQoKSkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDYuZGVmYXVsdCgnUmVxdWVzdGVkIHJvdyBpcyBvdXRzaWRlIHRoZSBpbWFnZTogJyArIHkpOwoJICAgICAgICB9CgkgICAgICAgIHZhciB3aWR0aCA9IHRoaXMuZ2V0V2lkdGgoKTsKCSAgICAgICAgaWYgKHJvdyA9PT0gbnVsbCB8fCByb3cgPT09IHVuZGVmaW5lZCB8fCByb3cubGVuZ3RoIDwgd2lkdGgpIHsKCSAgICAgICAgICAgIHJvdyA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCk7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIG9mZnNldCA9ICh5ICsgdGhpcy50b3ApICogdGhpcy5kYXRhV2lkdGggKyB0aGlzLmxlZnQ7CgkgICAgICAgIFN5c3RlbV8xJDIuZGVmYXVsdC5hcnJheWNvcHkodGhpcy5sdW1pbmFuY2VzLCBvZmZzZXQsIHJvdywgMCwgd2lkdGgpOwoJICAgICAgICByZXR1cm4gcm93OwoJICAgIH07CgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIFJHQkx1bWluYW5jZVNvdXJjZS5wcm90b3R5cGUuZ2V0TWF0cml4ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgd2lkdGggPSB0aGlzLmdldFdpZHRoKCk7CgkgICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmdldEhlaWdodCgpOwoJICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIGFza3MgZm9yIHRoZSBlbnRpcmUgdW5kZXJseWluZyBpbWFnZSwgc2F2ZSB0aGUgY29weSBhbmQgZ2l2ZSB0aGVtIHRoZQoJICAgICAgICAvLyBvcmlnaW5hbCBkYXRhLiBUaGUgZG9jcyBzcGVjaWZpY2FsbHkgd2FybiB0aGF0IHJlc3VsdC5sZW5ndGggbXVzdCBiZSBpZ25vcmVkLgoJICAgICAgICBpZiAod2lkdGggPT09IHRoaXMuZGF0YVdpZHRoICYmIGhlaWdodCA9PT0gdGhpcy5kYXRhSGVpZ2h0KSB7CgkgICAgICAgICAgICByZXR1cm4gdGhpcy5sdW1pbmFuY2VzOwoJICAgICAgICB9CgkgICAgICAgIHZhciBhcmVhID0gd2lkdGggKiBoZWlnaHQ7CgkgICAgICAgIHZhciBtYXRyaXggPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoYXJlYSk7CgkgICAgICAgIHZhciBpbnB1dE9mZnNldCA9IHRoaXMudG9wICogdGhpcy5kYXRhV2lkdGggKyB0aGlzLmxlZnQ7CgkgICAgICAgIC8vIElmIHRoZSB3aWR0aCBtYXRjaGVzIHRoZSBmdWxsIHdpZHRoIG9mIHRoZSB1bmRlcmx5aW5nIGRhdGEsIHBlcmZvcm0gYSBzaW5nbGUgY29weS4KCSAgICAgICAgaWYgKHdpZHRoID09PSB0aGlzLmRhdGFXaWR0aCkgewoJICAgICAgICAgICAgU3lzdGVtXzEkMi5kZWZhdWx0LmFycmF5Y29weSh0aGlzLmx1bWluYW5jZXMsIGlucHV0T2Zmc2V0LCBtYXRyaXgsIDAsIGFyZWEpOwoJICAgICAgICAgICAgcmV0dXJuIG1hdHJpeDsKCSAgICAgICAgfQoJICAgICAgICAvLyBPdGhlcndpc2UgY29weSBvbmUgY3JvcHBlZCByb3cgYXQgYSB0aW1lLgoJICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkgICAgICAgICAgICB2YXIgb3V0cHV0T2Zmc2V0ID0geSAqIHdpZHRoOwoJICAgICAgICAgICAgU3lzdGVtXzEkMi5kZWZhdWx0LmFycmF5Y29weSh0aGlzLmx1bWluYW5jZXMsIGlucHV0T2Zmc2V0LCBtYXRyaXgsIG91dHB1dE9mZnNldCwgd2lkdGgpOwoJICAgICAgICAgICAgaW5wdXRPZmZzZXQgKz0gdGhpcy5kYXRhV2lkdGg7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIG1hdHJpeDsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBSR0JMdW1pbmFuY2VTb3VyY2UucHJvdG90eXBlLmlzQ3JvcFN1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRydWU7CgkgICAgfTsKCSAgICAvKkBPdmVycmlkZSovCgkgICAgUkdCTHVtaW5hbmNlU291cmNlLnByb3RvdHlwZS5jcm9wID0gZnVuY3Rpb24gKGxlZnQgLyppbnQqLywgdG9wIC8qaW50Ki8sIHdpZHRoIC8qaW50Ki8sIGhlaWdodCAvKmludCovKSB7CgkgICAgICAgIHJldHVybiBuZXcgUkdCTHVtaW5hbmNlU291cmNlKHRoaXMubHVtaW5hbmNlcywgd2lkdGgsIGhlaWdodCwgdGhpcy5kYXRhV2lkdGgsIHRoaXMuZGF0YUhlaWdodCwgdGhpcy5sZWZ0ICsgbGVmdCwgdGhpcy50b3AgKyB0b3ApOwoJICAgIH07CgkgICAgUkdCTHVtaW5hbmNlU291cmNlLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiBuZXcgSW52ZXJ0ZWRMdW1pbmFuY2VTb3VyY2VfMS5kZWZhdWx0KHRoaXMpOwoJICAgIH07CgkgICAgcmV0dXJuIFJHQkx1bWluYW5jZVNvdXJjZTsKCX0oTHVtaW5hbmNlU291cmNlXzEuZGVmYXVsdCkpOwoJdmFyIF9kZWZhdWx0JDEgPSBSR0JMdW1pbmFuY2VTb3VyY2UkMS5kZWZhdWx0ID0gUkdCTHVtaW5hbmNlU291cmNlOwoKCXZhciBRUkNvZGVSZWFkZXIkMSA9IHt9OwoKCXZhciBCYXJjb2RlRm9ybWF0JDEgPSB7fTsKCgkvKgoJICogRGlyZWN0IHBvcnQgdG8gVHlwZVNjcmlwdCBvZiBaWGluZyBieSBBZHJpYW4gVG/ImWPEgwoJICovCglPYmplY3QuZGVmaW5lUHJvcGVydHkoQmFyY29kZUZvcm1hdCQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgkvKgoJICogQ29weXJpZ2h0IDIwMDkgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJLypuYW1lc3BhY2UgY29tLmdvb2dsZS56eGluZyB7Ki8KCS8qKgoJICogRW51bWVyYXRlcyBiYXJjb2RlIGZvcm1hdHMga25vd24gdG8gdGhpcyBwYWNrYWdlLiBQbGVhc2Uga2VlcCBhbHBoYWJldGl6ZWQuCgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIEJhcmNvZGVGb3JtYXQ7CgkoZnVuY3Rpb24gKEJhcmNvZGVGb3JtYXQpIHsKCSAgICAvKiogQXp0ZWMgMkQgYmFyY29kZSBmb3JtYXQuICovCgkgICAgQmFyY29kZUZvcm1hdFtCYXJjb2RlRm9ybWF0WyJBWlRFQyJdID0gMF0gPSAiQVpURUMiOwoJICAgIC8qKiBDT0RBQkFSIDFEIGZvcm1hdC4gKi8KCSAgICBCYXJjb2RlRm9ybWF0W0JhcmNvZGVGb3JtYXRbIkNPREFCQVIiXSA9IDFdID0gIkNPREFCQVIiOwoJICAgIC8qKiBDb2RlIDM5IDFEIGZvcm1hdC4gKi8KCSAgICBCYXJjb2RlRm9ybWF0W0JhcmNvZGVGb3JtYXRbIkNPREVfMzkiXSA9IDJdID0gIkNPREVfMzkiOwoJICAgIC8qKiBDb2RlIDkzIDFEIGZvcm1hdC4gKi8KCSAgICBCYXJjb2RlRm9ybWF0W0JhcmNvZGVGb3JtYXRbIkNPREVfOTMiXSA9IDNdID0gIkNPREVfOTMiOwoJICAgIC8qKiBDb2RlIDEyOCAxRCBmb3JtYXQuICovCgkgICAgQmFyY29kZUZvcm1hdFtCYXJjb2RlRm9ybWF0WyJDT0RFXzEyOCJdID0gNF0gPSAiQ09ERV8xMjgiOwoJICAgIC8qKiBEYXRhIE1hdHJpeCAyRCBiYXJjb2RlIGZvcm1hdC4gKi8KCSAgICBCYXJjb2RlRm9ybWF0W0JhcmNvZGVGb3JtYXRbIkRBVEFfTUFUUklYIl0gPSA1XSA9ICJEQVRBX01BVFJJWCI7CgkgICAgLyoqIEVBTi04IDFEIGZvcm1hdC4gKi8KCSAgICBCYXJjb2RlRm9ybWF0W0JhcmNvZGVGb3JtYXRbIkVBTl84Il0gPSA2XSA9ICJFQU5fOCI7CgkgICAgLyoqIEVBTi0xMyAxRCBmb3JtYXQuICovCgkgICAgQmFyY29kZUZvcm1hdFtCYXJjb2RlRm9ybWF0WyJFQU5fMTMiXSA9IDddID0gIkVBTl8xMyI7CgkgICAgLyoqIElURiAoSW50ZXJsZWF2ZWQgVHdvIG9mIEZpdmUpIDFEIGZvcm1hdC4gKi8KCSAgICBCYXJjb2RlRm9ybWF0W0JhcmNvZGVGb3JtYXRbIklURiJdID0gOF0gPSAiSVRGIjsKCSAgICAvKiogTWF4aUNvZGUgMkQgYmFyY29kZSBmb3JtYXQuICovCgkgICAgQmFyY29kZUZvcm1hdFtCYXJjb2RlRm9ybWF0WyJNQVhJQ09ERSJdID0gOV0gPSAiTUFYSUNPREUiOwoJICAgIC8qKiBQREY0MTcgZm9ybWF0LiAqLwoJICAgIEJhcmNvZGVGb3JtYXRbQmFyY29kZUZvcm1hdFsiUERGXzQxNyJdID0gMTBdID0gIlBERl80MTciOwoJICAgIC8qKiBRUiBDb2RlIDJEIGJhcmNvZGUgZm9ybWF0LiAqLwoJICAgIEJhcmNvZGVGb3JtYXRbQmFyY29kZUZvcm1hdFsiUVJfQ09ERSJdID0gMTFdID0gIlFSX0NPREUiOwoJICAgIC8qKiBSU1MgMTQgKi8KCSAgICBCYXJjb2RlRm9ybWF0W0JhcmNvZGVGb3JtYXRbIlJTU18xNCJdID0gMTJdID0gIlJTU18xNCI7CgkgICAgLyoqIFJTUyBFWFBBTkRFRCAqLwoJICAgIEJhcmNvZGVGb3JtYXRbQmFyY29kZUZvcm1hdFsiUlNTX0VYUEFOREVEIl0gPSAxM10gPSAiUlNTX0VYUEFOREVEIjsKCSAgICAvKiogVVBDLUEgMUQgZm9ybWF0LiAqLwoJICAgIEJhcmNvZGVGb3JtYXRbQmFyY29kZUZvcm1hdFsiVVBDX0EiXSA9IDE0XSA9ICJVUENfQSI7CgkgICAgLyoqIFVQQy1FIDFEIGZvcm1hdC4gKi8KCSAgICBCYXJjb2RlRm9ybWF0W0JhcmNvZGVGb3JtYXRbIlVQQ19FIl0gPSAxNV0gPSAiVVBDX0UiOwoJICAgIC8qKiBVUEMvRUFOIGV4dGVuc2lvbiBmb3JtYXQuIE5vdCBhIHN0YW5kLWFsb25lIGZvcm1hdC4gKi8KCSAgICBCYXJjb2RlRm9ybWF0W0JhcmNvZGVGb3JtYXRbIlVQQ19FQU5fRVhURU5TSU9OIl0gPSAxNl0gPSAiVVBDX0VBTl9FWFRFTlNJT04iOwoJfSkoQmFyY29kZUZvcm1hdCB8fCAoQmFyY29kZUZvcm1hdCA9IHt9KSk7CglCYXJjb2RlRm9ybWF0JDEuZGVmYXVsdCA9IEJhcmNvZGVGb3JtYXQ7CgoJdmFyIFJlc3VsdCQxID0ge307CgoJLyoKCSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXN1bHQkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJdmFyIFN5c3RlbV8xJDEgPSBTeXN0ZW0kMTsKCS8qKgoJICogPHA+RW5jYXBzdWxhdGVzIHRoZSByZXN1bHQgb2YgZGVjb2RpbmcgYSBiYXJjb2RlIHdpdGhpbiBhbiBpbWFnZS48L3A+CgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIFJlc3VsdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICAvLyBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSB0ZXh0OiBzdHJpbmcsCgkgICAgLy8gICAgICAgICAgICAgICBVaW50OEFycmF5IHJhd0J5dGVzLAoJICAgIC8vICAgICAgICAgICAgICAgUmVzdWx0UG9jb25zdCByZXN1bHRQb2ludHM6IEludDMyQXJyYXksCgkgICAgLy8gICAgICAgICAgICAgICBCYXJjb2RlRm9ybWF0IGZvcm1hdCkgewoJICAgIC8vICAgdGhpcyh0ZXh0LCByYXdCeXRlcywgcmVzdWx0UG9pbnRzLCBmb3JtYXQsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKQoJICAgIC8vIH0KCSAgICAvLyBwdWJsaWMgY29uc3RydWN0b3IodGV4dDogc3RyaW5nLAoJICAgIC8vICAgICAgICAgICAgICAgVWludDhBcnJheSByYXdCeXRlcywKCSAgICAvLyAgICAgICAgICAgICAgIFJlc3VsdFBvY29uc3QgcmVzdWx0UG9pbnRzOiBJbnQzMkFycmF5LAoJICAgIC8vICAgICAgICAgICAgICAgQmFyY29kZUZvcm1hdCBmb3JtYXQsCgkgICAgLy8gICAgICAgICAgICAgICBsb25nIHRpbWVzdGFtcCkgewoJICAgIC8vICAgdGhpcyh0ZXh0LCByYXdCeXRlcywgcmF3Qnl0ZXMgPT0gbnVsbCA/IDAgOiA4ICogcmF3Qnl0ZXMubGVuZ3RoLAoJICAgIC8vICAgICAgICByZXN1bHRQb2ludHMsIGZvcm1hdCwgdGltZXN0YW1wKQoJICAgIC8vIH0KCSAgICBmdW5jdGlvbiBSZXN1bHQodGV4dCwgcmF3Qnl0ZXMsIG51bUJpdHMsIHJlc3VsdFBvaW50cywgZm9ybWF0LCB0aW1lc3RhbXApIHsKCSAgICAgICAgaWYgKG51bUJpdHMgPT09IHZvaWQgMCkgeyBudW1CaXRzID0gcmF3Qnl0ZXMgPT0gbnVsbCA/IDAgOiA4ICogcmF3Qnl0ZXMubGVuZ3RoOyB9CgkgICAgICAgIGlmICh0aW1lc3RhbXAgPT09IHZvaWQgMCkgeyB0aW1lc3RhbXAgPSBTeXN0ZW1fMSQxLmRlZmF1bHQuY3VycmVudFRpbWVNaWxsaXMoKTsgfQoJICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwoJICAgICAgICB0aGlzLnJhd0J5dGVzID0gcmF3Qnl0ZXM7CgkgICAgICAgIHRoaXMubnVtQml0cyA9IG51bUJpdHM7CgkgICAgICAgIHRoaXMucmVzdWx0UG9pbnRzID0gcmVzdWx0UG9pbnRzOwoJICAgICAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKCSAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CgkgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CgkgICAgICAgIHRoaXMucmF3Qnl0ZXMgPSByYXdCeXRlczsKCSAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gbnVtQml0cyB8fCBudWxsID09PSBudW1CaXRzKSB7CgkgICAgICAgICAgICB0aGlzLm51bUJpdHMgPSAocmF3Qnl0ZXMgPT09IG51bGwgfHwgcmF3Qnl0ZXMgPT09IHVuZGVmaW5lZCkgPyAwIDogOCAqIHJhd0J5dGVzLmxlbmd0aDsKCSAgICAgICAgfQoJICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgIHRoaXMubnVtQml0cyA9IG51bUJpdHM7CgkgICAgICAgIH0KCSAgICAgICAgdGhpcy5yZXN1bHRQb2ludHMgPSByZXN1bHRQb2ludHM7CgkgICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OwoJICAgICAgICB0aGlzLnJlc3VsdE1ldGFkYXRhID0gbnVsbDsKCSAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gdGltZXN0YW1wIHx8IG51bGwgPT09IHRpbWVzdGFtcCkgewoJICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBTeXN0ZW1fMSQxLmRlZmF1bHQuY3VycmVudFRpbWVNaWxsaXMoKTsKCSAgICAgICAgfQoJICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wOwoJICAgICAgICB9CgkgICAgfQoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gcmF3IHRleHQgZW5jb2RlZCBieSB0aGUgYmFyY29kZQoJICAgICAqLwoJICAgIFJlc3VsdC5wcm90b3R5cGUuZ2V0VGV4dCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMudGV4dDsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gcmF3IGJ5dGVzIGVuY29kZWQgYnkgdGhlIGJhcmNvZGUsIGlmIGFwcGxpY2FibGUsIG90aGVyd2lzZSB7QGNvZGUgbnVsbH0KCSAgICAgKi8KCSAgICBSZXN1bHQucHJvdG90eXBlLmdldFJhd0J5dGVzID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5yYXdCeXRlczsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gaG93IG1hbnkgYml0cyBvZiB7QGxpbmsgI2dldFJhd0J5dGVzKCl9IGFyZSB2YWxpZDsgdHlwaWNhbGx5IDggdGltZXMgaXRzIGxlbmd0aAoJICAgICAqIEBzaW5jZSAzLjMuMAoJICAgICAqLwoJICAgIFJlc3VsdC5wcm90b3R5cGUuZ2V0TnVtQml0cyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMubnVtQml0czsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gcG9pbnRzIHJlbGF0ZWQgdG8gdGhlIGJhcmNvZGUgaW4gdGhlIGltYWdlLiBUaGVzZSBhcmUgdHlwaWNhbGx5IHBvaW50cwoJICAgICAqICAgICAgICAgaWRlbnRpZnlpbmcgZmluZGVyIHBhdHRlcm5zIG9yIHRoZSBjb3JuZXJzIG9mIHRoZSBiYXJjb2RlLiBUaGUgZXhhY3QgbWVhbmluZyBpcwoJICAgICAqICAgICAgICAgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgYmFyY29kZSB0aGF0IHdhcyBkZWNvZGVkLgoJICAgICAqLwoJICAgIFJlc3VsdC5wcm90b3R5cGUuZ2V0UmVzdWx0UG9pbnRzID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRQb2ludHM7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIHtAbGluayBCYXJjb2RlRm9ybWF0fSByZXByZXNlbnRpbmcgdGhlIGZvcm1hdCBvZiB0aGUgYmFyY29kZSB0aGF0IHdhcyBkZWNvZGVkCgkgICAgICovCgkgICAgUmVzdWx0LnByb3RvdHlwZS5nZXRCYXJjb2RlRm9ybWF0ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQ7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIHtAbGluayBNYXB9IG1hcHBpbmcge0BsaW5rIFJlc3VsdE1ldGFkYXRhVHlwZX0ga2V5cyB0byB2YWx1ZXMuIE1heSBiZQoJICAgICAqICAge0Bjb2RlIG51bGx9LiBUaGlzIGNvbnRhaW5zIG9wdGlvbmFsIG1ldGFkYXRhIGFib3V0IHdoYXQgd2FzIGRldGVjdGVkIGFib3V0IHRoZSBiYXJjb2RlLAoJICAgICAqICAgbGlrZSBvcmllbnRhdGlvbi4KCSAgICAgKi8KCSAgICBSZXN1bHQucHJvdG90eXBlLmdldFJlc3VsdE1ldGFkYXRhID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRNZXRhZGF0YTsKCSAgICB9OwoJICAgIFJlc3VsdC5wcm90b3R5cGUucHV0TWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZSwgdmFsdWUpIHsKCSAgICAgICAgaWYgKHRoaXMucmVzdWx0TWV0YWRhdGEgPT09IG51bGwpIHsKCSAgICAgICAgICAgIHRoaXMucmVzdWx0TWV0YWRhdGEgPSBuZXcgTWFwKCk7CgkgICAgICAgIH0KCSAgICAgICAgdGhpcy5yZXN1bHRNZXRhZGF0YS5zZXQodHlwZSwgdmFsdWUpOwoJICAgIH07CgkgICAgUmVzdWx0LnByb3RvdHlwZS5wdXRBbGxNZXRhZGF0YSA9IGZ1bmN0aW9uIChtZXRhZGF0YSkgewoJICAgICAgICBpZiAobWV0YWRhdGEgIT09IG51bGwpIHsKCSAgICAgICAgICAgIGlmICh0aGlzLnJlc3VsdE1ldGFkYXRhID09PSBudWxsKSB7CgkgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRNZXRhZGF0YSA9IG1ldGFkYXRhOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRNZXRhZGF0YSA9IG5ldyBNYXAobWV0YWRhdGEpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgfTsKCSAgICBSZXN1bHQucHJvdG90eXBlLmFkZFJlc3VsdFBvaW50cyA9IGZ1bmN0aW9uIChuZXdQb2ludHMpIHsKCSAgICAgICAgdmFyIG9sZFBvaW50cyA9IHRoaXMucmVzdWx0UG9pbnRzOwoJICAgICAgICBpZiAob2xkUG9pbnRzID09PSBudWxsKSB7CgkgICAgICAgICAgICB0aGlzLnJlc3VsdFBvaW50cyA9IG5ld1BvaW50czsKCSAgICAgICAgfQoJICAgICAgICBlbHNlIGlmIChuZXdQb2ludHMgIT09IG51bGwgJiYgbmV3UG9pbnRzLmxlbmd0aCA+IDApIHsKCSAgICAgICAgICAgIHZhciBhbGxQb2ludHMgPSBuZXcgQXJyYXkob2xkUG9pbnRzLmxlbmd0aCArIG5ld1BvaW50cy5sZW5ndGgpOwoJICAgICAgICAgICAgU3lzdGVtXzEkMS5kZWZhdWx0LmFycmF5Y29weShvbGRQb2ludHMsIDAsIGFsbFBvaW50cywgMCwgb2xkUG9pbnRzLmxlbmd0aCk7CgkgICAgICAgICAgICBTeXN0ZW1fMSQxLmRlZmF1bHQuYXJyYXljb3B5KG5ld1BvaW50cywgMCwgYWxsUG9pbnRzLCBvbGRQb2ludHMubGVuZ3RoLCBuZXdQb2ludHMubGVuZ3RoKTsKCSAgICAgICAgICAgIHRoaXMucmVzdWx0UG9pbnRzID0gYWxsUG9pbnRzOwoJICAgICAgICB9CgkgICAgfTsKCSAgICBSZXN1bHQucHJvdG90eXBlLmdldFRpbWVzdGFtcCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMudGltZXN0YW1wOwoJICAgIH07CgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIFJlc3VsdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CgkgICAgfTsKCSAgICByZXR1cm4gUmVzdWx0OwoJfSgpKTsKCVJlc3VsdCQxLmRlZmF1bHQgPSBSZXN1bHQ7CgoJdmFyIFJlc3VsdE1ldGFkYXRhVHlwZSQxID0ge307CgoJLyoKCSAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXN1bHRNZXRhZGF0YVR5cGUkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJLypuYW1lc3BhY2UgY29tLmdvb2dsZS56eGluZyB7Ki8KCS8qKgoJICogUmVwcmVzZW50cyBzb21lIHR5cGUgb2YgbWV0YWRhdGEgYWJvdXQgdGhlIHJlc3VsdCBvZiB0aGUgZGVjb2RpbmcgdGhhdCB0aGUgZGVjb2RlcgoJICogd2lzaGVzIHRvIGNvbW11bmljYXRlIGJhY2sgdG8gdGhlIGNhbGxlci4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICovCgl2YXIgUmVzdWx0TWV0YWRhdGFUeXBlOwoJKGZ1bmN0aW9uIChSZXN1bHRNZXRhZGF0YVR5cGUpIHsKCSAgICAvKioKCSAgICAgKiBVbnNwZWNpZmllZCwgYXBwbGljYXRpb24tc3BlY2lmaWMgbWV0YWRhdGEuIE1hcHMgdG8gYW4gdW5zcGVjaWZpZWQge0BsaW5rIE9iamVjdH0uCgkgICAgICovCgkgICAgUmVzdWx0TWV0YWRhdGFUeXBlW1Jlc3VsdE1ldGFkYXRhVHlwZVsiT1RIRVIiXSA9IDBdID0gIk9USEVSIjsKCSAgICAvKioKCSAgICAgKiBEZW5vdGVzIHRoZSBsaWtlbHkgYXBwcm94aW1hdGUgb3JpZW50YXRpb24gb2YgdGhlIGJhcmNvZGUgaW4gdGhlIGltYWdlLiBUaGlzIHZhbHVlCgkgICAgICogaXMgZ2l2ZW4gYXMgZGVncmVlcyByb3RhdGVkIGNsb2Nrd2lzZSBmcm9tIHRoZSBub3JtYWwsIHVwcmlnaHQgb3JpZW50YXRpb24uCgkgICAgICogRm9yIGV4YW1wbGUgYSAxRCBiYXJjb2RlIHdoaWNoIHdhcyBmb3VuZCBieSByZWFkaW5nIHRvcC10by1ib3R0b20gd291bGQgYmUKCSAgICAgKiBzYWlkIHRvIGhhdmUgb3JpZW50YXRpb24gIjkwIi4gVGhpcyBrZXkgbWFwcyB0byBhbiB7QGxpbmsgSW50ZWdlcn0gd2hvc2UKCSAgICAgKiB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWzAsMzYwKS4KCSAgICAgKi8KCSAgICBSZXN1bHRNZXRhZGF0YVR5cGVbUmVzdWx0TWV0YWRhdGFUeXBlWyJPUklFTlRBVElPTiJdID0gMV0gPSAiT1JJRU5UQVRJT04iOwoJICAgIC8qKgoJICAgICAqIDxwPjJEIGJhcmNvZGUgZm9ybWF0cyB0eXBpY2FsbHkgZW5jb2RlIHRleHQsIGJ1dCBhbGxvdyBmb3IgYSBzb3J0IG9mICdieXRlIG1vZGUnCgkgICAgICogd2hpY2ggaXMgc29tZXRpbWVzIHVzZWQgdG8gZW5jb2RlIGJpbmFyeSBkYXRhLiBXaGlsZSB7QGxpbmsgUmVzdWx0fSBtYWtlcyBhdmFpbGFibGUKCSAgICAgKiB0aGUgY29tcGxldGUgcmF3IGJ5dGVzIGluIHRoZSBiYXJjb2RlIGZvciB0aGVzZSBmb3JtYXRzLCBpdCBkb2VzIG5vdCBvZmZlciB0aGUgYnl0ZXMKCSAgICAgKiBmcm9tIHRoZSBieXRlIHNlZ21lbnRzIGFsb25lLjwvcD4KCSAgICAgKgoJICAgICAqIDxwPlRoaXMgbWFwcyB0byBhIHtAbGluayBqYXZhLnV0aWwuTGlzdH0gb2YgYnl0ZSBhcnJheXMgY29ycmVzcG9uZGluZyB0byB0aGUKCSAgICAgKiByYXcgYnl0ZXMgaW4gdGhlIGJ5dGUgc2VnbWVudHMgaW4gdGhlIGJhcmNvZGUsIGluIG9yZGVyLjwvcD4KCSAgICAgKi8KCSAgICBSZXN1bHRNZXRhZGF0YVR5cGVbUmVzdWx0TWV0YWRhdGFUeXBlWyJCWVRFX1NFR01FTlRTIl0gPSAyXSA9ICJCWVRFX1NFR01FTlRTIjsKCSAgICAvKioKCSAgICAgKiBFcnJvciBjb3JyZWN0aW9uIGxldmVsIHVzZWQsIGlmIGFwcGxpY2FibGUuIFRoZSB2YWx1ZSB0eXBlIGRlcGVuZHMgb24gdGhlCgkgICAgICogZm9ybWF0LCBidXQgaXMgdHlwaWNhbGx5IGEgU3RyaW5nLgoJICAgICAqLwoJICAgIFJlc3VsdE1ldGFkYXRhVHlwZVtSZXN1bHRNZXRhZGF0YVR5cGVbIkVSUk9SX0NPUlJFQ1RJT05fTEVWRUwiXSA9IDNdID0gIkVSUk9SX0NPUlJFQ1RJT05fTEVWRUwiOwoJICAgIC8qKgoJICAgICAqIEZvciBzb21lIHBlcmlvZGljYWxzLCBpbmRpY2F0ZXMgdGhlIGlzc3VlIG51bWJlciBhcyBhbiB7QGxpbmsgSW50ZWdlcn0uCgkgICAgICovCgkgICAgUmVzdWx0TWV0YWRhdGFUeXBlW1Jlc3VsdE1ldGFkYXRhVHlwZVsiSVNTVUVfTlVNQkVSIl0gPSA0XSA9ICJJU1NVRV9OVU1CRVIiOwoJICAgIC8qKgoJICAgICAqIEZvciBzb21lIHByb2R1Y3RzLCBpbmRpY2F0ZXMgdGhlIHN1Z2dlc3RlZCByZXRhaWwgcHJpY2UgaW4gdGhlIGJhcmNvZGUgYXMgYQoJICAgICAqIGZvcm1hdHRlZCB7QGxpbmsgU3RyaW5nfS4KCSAgICAgKi8KCSAgICBSZXN1bHRNZXRhZGF0YVR5cGVbUmVzdWx0TWV0YWRhdGFUeXBlWyJTVUdHRVNURURfUFJJQ0UiXSA9IDVdID0gIlNVR0dFU1RFRF9QUklDRSI7CgkgICAgLyoqCgkgICAgICogRm9yIHNvbWUgcHJvZHVjdHMsIHRoZSBwb3NzaWJsZSBjb3VudHJ5IG9mIG1hbnVmYWN0dXJlIGFzIGEge0BsaW5rIFN0cmluZ30gZGVub3RpbmcgdGhlCgkgICAgICogSVNPIGNvdW50cnkgY29kZS4gU29tZSBtYXAgdG8gbXVsdGlwbGUgcG9zc2libGUgY291bnRyaWVzLCBsaWtlICJVUy9DQSIuCgkgICAgICovCgkgICAgUmVzdWx0TWV0YWRhdGFUeXBlW1Jlc3VsdE1ldGFkYXRhVHlwZVsiUE9TU0lCTEVfQ09VTlRSWSJdID0gNl0gPSAiUE9TU0lCTEVfQ09VTlRSWSI7CgkgICAgLyoqCgkgICAgICogRm9yIHNvbWUgcHJvZHVjdHMsIHRoZSBleHRlbnNpb24gdGV4dAoJICAgICAqLwoJICAgIFJlc3VsdE1ldGFkYXRhVHlwZVtSZXN1bHRNZXRhZGF0YVR5cGVbIlVQQ19FQU5fRVhURU5TSU9OIl0gPSA3XSA9ICJVUENfRUFOX0VYVEVOU0lPTiI7CgkgICAgLyoqCgkgICAgICogUERGNDE3LXNwZWNpZmljIG1ldGFkYXRhCgkgICAgICovCgkgICAgUmVzdWx0TWV0YWRhdGFUeXBlW1Jlc3VsdE1ldGFkYXRhVHlwZVsiUERGNDE3X0VYVFJBX01FVEFEQVRBIl0gPSA4XSA9ICJQREY0MTdfRVhUUkFfTUVUQURBVEEiOwoJICAgIC8qKgoJICAgICAqIElmIHRoZSBjb2RlIGZvcm1hdCBzdXBwb3J0cyBzdHJ1Y3R1cmVkIGFwcGVuZCBhbmQgdGhlIGN1cnJlbnQgc2Nhbm5lZCBjb2RlIGlzIHBhcnQgb2Ygb25lIHRoZW4gdGhlCgkgICAgICogc2VxdWVuY2UgbnVtYmVyIGlzIGdpdmVuIHdpdGggaXQuCgkgICAgICovCgkgICAgUmVzdWx0TWV0YWRhdGFUeXBlW1Jlc3VsdE1ldGFkYXRhVHlwZVsiU1RSVUNUVVJFRF9BUFBFTkRfU0VRVUVOQ0UiXSA9IDldID0gIlNUUlVDVFVSRURfQVBQRU5EX1NFUVVFTkNFIjsKCSAgICAvKioKCSAgICAgKiBJZiB0aGUgY29kZSBmb3JtYXQgc3VwcG9ydHMgc3RydWN0dXJlZCBhcHBlbmQgYW5kIHRoZSBjdXJyZW50IHNjYW5uZWQgY29kZSBpcyBwYXJ0IG9mIG9uZSB0aGVuIHRoZQoJICAgICAqIHBhcml0eSBpcyBnaXZlbiB3aXRoIGl0LgoJICAgICAqLwoJICAgIFJlc3VsdE1ldGFkYXRhVHlwZVtSZXN1bHRNZXRhZGF0YVR5cGVbIlNUUlVDVFVSRURfQVBQRU5EX1BBUklUWSJdID0gMTBdID0gIlNUUlVDVFVSRURfQVBQRU5EX1BBUklUWSI7Cgl9KShSZXN1bHRNZXRhZGF0YVR5cGUgfHwgKFJlc3VsdE1ldGFkYXRhVHlwZSA9IHt9KSk7CglSZXN1bHRNZXRhZGF0YVR5cGUkMS5kZWZhdWx0ID0gUmVzdWx0TWV0YWRhdGFUeXBlOwoKCXZhciBEZWNvZGVyJDEgPSB7fTsKCgl2YXIgQ2hlY2tzdW1FeGNlcHRpb24kMSA9IHt9OwoKCXZhciBfX2V4dGVuZHMkOCA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7CgkgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8CgkgICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8CgkgICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTsKCSAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgfTsKCSAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9CgkgICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKCSAgICB9OwoJfSkoKTsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShDaGVja3N1bUV4Y2VwdGlvbiQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7Cgl2YXIgRXhjZXB0aW9uXzEkNCA9IEV4Y2VwdGlvbiQxOwoJLyoqCgkgKiBDdXN0b20gRXJyb3IgY2xhc3Mgb2YgdHlwZSBFeGNlcHRpb24uCgkgKi8KCXZhciBDaGVja3N1bUV4Y2VwdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKCSAgICBfX2V4dGVuZHMkOChDaGVja3N1bUV4Y2VwdGlvbiwgX3N1cGVyKTsKCSAgICBmdW5jdGlvbiBDaGVja3N1bUV4Y2VwdGlvbigpIHsKCSAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwoJICAgIH0KCSAgICBDaGVja3N1bUV4Y2VwdGlvbi5nZXRDaGVja3N1bUluc3RhbmNlID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gbmV3IENoZWNrc3VtRXhjZXB0aW9uKCk7CgkgICAgfTsKCSAgICBDaGVja3N1bUV4Y2VwdGlvbi5raW5kID0gJ0NoZWNrc3VtRXhjZXB0aW9uJzsKCSAgICByZXR1cm4gQ2hlY2tzdW1FeGNlcHRpb247Cgl9KEV4Y2VwdGlvbl8xJDQuZGVmYXVsdCkpOwoJQ2hlY2tzdW1FeGNlcHRpb24kMS5kZWZhdWx0ID0gQ2hlY2tzdW1FeGNlcHRpb247CgoJdmFyIEdlbmVyaWNHRiQxID0ge307CgoJdmFyIEdlbmVyaWNHRlBvbHkkMSA9IHt9OwoKCXZhciBBYnN0cmFjdEdlbmVyaWNHRiQxID0ge307CgoJLyoKCSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdEdlbmVyaWNHRiQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7Cgl2YXIgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkNSA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiQxOwoJLyoqCgkgKiA8cD5UaGlzIGNsYXNzIGNvbnRhaW5zIHV0aWxpdHkgbWV0aG9kcyBmb3IgcGVyZm9ybWluZyBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBvdmVyCgkgKiB0aGUgR2Fsb2lzIEZpZWxkcy4gT3BlcmF0aW9ucyB1c2UgYSBnaXZlbiBwcmltaXRpdmUgcG9seW5vbWlhbCBpbiBjYWxjdWxhdGlvbnMuPC9wPgoJICoKCSAqIDxwPlRocm91Z2hvdXQgdGhpcyBwYWNrYWdlLCBlbGVtZW50cyBvZiB0aGUgR0YgYXJlIHJlcHJlc2VudGVkIGFzIGFuIHtAY29kZSBpbnR9CgkgKiBmb3IgY29udmVuaWVuY2UgYW5kIHNwZWVkIChidXQgYXQgdGhlIGNvc3Qgb2YgbWVtb3J5KS4KCSAqIDwvcD4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICogQGF1dGhvciBEYXZpZCBPbGl2aWVyCgkgKi8KCXZhciBBYnN0cmFjdEdlbmVyaWNHRiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBBYnN0cmFjdEdlbmVyaWNHRigpIHsKCSAgICB9CgkgICAgLyoqCgkgICAgICogQHJldHVybiAyIHRvIHRoZSBwb3dlciBvZiBhIGluIEdGKHNpemUpCgkgICAgICovCgkgICAgQWJzdHJhY3RHZW5lcmljR0YucHJvdG90eXBlLmV4cCA9IGZ1bmN0aW9uIChhKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmV4cFRhYmxlW2FdOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiBiYXNlIDIgbG9nIG9mIGEgaW4gR0Yoc2l6ZSkKCSAgICAgKi8KCSAgICBBYnN0cmFjdEdlbmVyaWNHRi5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKGEgLyppbnQqLykgewoJICAgICAgICBpZiAoYSA9PT0gMCkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDUuZGVmYXVsdCgpOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiB0aGlzLmxvZ1RhYmxlW2FdOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogSW1wbGVtZW50cyBib3RoIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAtLSB0aGV5IGFyZSB0aGUgc2FtZSBpbiBHRihzaXplKS4KCSAgICAgKgoJICAgICAqIEByZXR1cm4gc3VtL2RpZmZlcmVuY2Ugb2YgYSBhbmQgYgoJICAgICAqLwoJICAgIEFic3RyYWN0R2VuZXJpY0dGLmFkZE9yU3VidHJhY3QgPSBmdW5jdGlvbiAoYSAvKmludCovLCBiIC8qaW50Ki8pIHsKCSAgICAgICAgcmV0dXJuIGEgXiBiOwoJICAgIH07CgkgICAgcmV0dXJuIEFic3RyYWN0R2VuZXJpY0dGOwoJfSgpKTsKCUFic3RyYWN0R2VuZXJpY0dGJDEuZGVmYXVsdCA9IEFic3RyYWN0R2VuZXJpY0dGOwoKCS8qCgkgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCglPYmplY3QuZGVmaW5lUHJvcGVydHkoR2VuZXJpY0dGUG9seSQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgkvKm5hbWVzcGFjZSBjb20uZ29vZ2xlLnp4aW5nLmNvbW1vbi5yZWVkc29sb21vbiB7Ki8KCXZhciBBYnN0cmFjdEdlbmVyaWNHRl8xJDEgPSBBYnN0cmFjdEdlbmVyaWNHRiQxOwoJdmFyIFN5c3RlbV8xID0gU3lzdGVtJDE7Cgl2YXIgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkNCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiQxOwoJLyoqCgkgKiA8cD5SZXByZXNlbnRzIGEgcG9seW5vbWlhbCB3aG9zZSBjb2VmZmljaWVudHMgYXJlIGVsZW1lbnRzIG9mIGEgR0YuCgkgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgaW1tdXRhYmxlLjwvcD4KCSAqCgkgKiA8cD5NdWNoIGNyZWRpdCBpcyBkdWUgdG8gV2lsbGlhbSBSdWNrbGlkZ2Ugc2luY2UgcG9ydGlvbnMgb2YgdGhpcyBjb2RlIGFyZSBhbiBpbmRpcmVjdAoJICogcG9ydCBvZiBoaXMgQysrIFJlZWQtU29sb21vbiBpbXBsZW1lbnRhdGlvbi48L3A+CgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIEdlbmVyaWNHRlBvbHkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgLyoqCgkgICAgICogQHBhcmFtIGZpZWxkIHRoZSB7QGxpbmsgR2VuZXJpY0dGfSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGZpZWxkIHRvIHVzZQoJICAgICAqIHRvIHBlcmZvcm0gY29tcHV0YXRpb25zCgkgICAgICogQHBhcmFtIGNvZWZmaWNpZW50cyBjb2VmZmljaWVudHMgYXMgaW50cyByZXByZXNlbnRpbmcgZWxlbWVudHMgb2YgR0Yoc2l6ZSksIGFycmFuZ2VkCgkgICAgICogZnJvbSBtb3N0IHNpZ25pZmljYW50IChoaWdoZXN0LXBvd2VyIHRlcm0pIGNvZWZmaWNpZW50IHRvIGxlYXN0IHNpZ25pZmljYW50CgkgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYXJndW1lbnQgaXMgbnVsbCBvciBlbXB0eSwKCSAgICAgKiBvciBpZiBsZWFkaW5nIGNvZWZmaWNpZW50IGlzIDAgYW5kIHRoaXMgaXMgbm90IGEKCSAgICAgKiBjb25zdGFudCBwb2x5bm9taWFsICh0aGF0IGlzLCBpdCBpcyBub3QgdGhlIG1vbm9taWFsICIwIikKCSAgICAgKi8KCSAgICBmdW5jdGlvbiBHZW5lcmljR0ZQb2x5KGZpZWxkLCBjb2VmZmljaWVudHMpIHsKCSAgICAgICAgaWYgKGNvZWZmaWNpZW50cy5sZW5ndGggPT09IDApIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSQ0LmRlZmF1bHQoKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CgkgICAgICAgIHZhciBjb2VmZmljaWVudHNMZW5ndGggPSBjb2VmZmljaWVudHMubGVuZ3RoOwoJICAgICAgICBpZiAoY29lZmZpY2llbnRzTGVuZ3RoID4gMSAmJiBjb2VmZmljaWVudHNbMF0gPT09IDApIHsKCSAgICAgICAgICAgIC8vIExlYWRpbmcgdGVybSBtdXN0IGJlIG5vbi16ZXJvIGZvciBhbnl0aGluZyBleGNlcHQgdGhlIGNvbnN0YW50IHBvbHlub21pYWwgIjAiCgkgICAgICAgICAgICB2YXIgZmlyc3ROb25aZXJvID0gMTsKCSAgICAgICAgICAgIHdoaWxlIChmaXJzdE5vblplcm8gPCBjb2VmZmljaWVudHNMZW5ndGggJiYgY29lZmZpY2llbnRzW2ZpcnN0Tm9uWmVyb10gPT09IDApIHsKCSAgICAgICAgICAgICAgICBmaXJzdE5vblplcm8rKzsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGlmIChmaXJzdE5vblplcm8gPT09IGNvZWZmaWNpZW50c0xlbmd0aCkgewoJICAgICAgICAgICAgICAgIHRoaXMuY29lZmZpY2llbnRzID0gSW50MzJBcnJheS5mcm9tKFswXSk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICB0aGlzLmNvZWZmaWNpZW50cyA9IG5ldyBJbnQzMkFycmF5KGNvZWZmaWNpZW50c0xlbmd0aCAtIGZpcnN0Tm9uWmVybyk7CgkgICAgICAgICAgICAgICAgU3lzdGVtXzEuZGVmYXVsdC5hcnJheWNvcHkoY29lZmZpY2llbnRzLCBmaXJzdE5vblplcm8sIHRoaXMuY29lZmZpY2llbnRzLCAwLCB0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGgpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgdGhpcy5jb2VmZmljaWVudHMgPSBjb2VmZmljaWVudHM7CgkgICAgICAgIH0KCSAgICB9CgkgICAgR2VuZXJpY0dGUG9seS5wcm90b3R5cGUuZ2V0Q29lZmZpY2llbnRzID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5jb2VmZmljaWVudHM7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIGRlZ3JlZSBvZiB0aGlzIHBvbHlub21pYWwKCSAgICAgKi8KCSAgICBHZW5lcmljR0ZQb2x5LnByb3RvdHlwZS5nZXREZWdyZWUgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGggLSAxOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiB0cnVlIGlmZiB0aGlzIHBvbHlub21pYWwgaXMgdGhlIG1vbm9taWFsICIwIgoJICAgICAqLwoJICAgIEdlbmVyaWNHRlBvbHkucHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuY29lZmZpY2llbnRzWzBdID09PSAwOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiBjb2VmZmljaWVudCBvZiB4XmRlZ3JlZSB0ZXJtIGluIHRoaXMgcG9seW5vbWlhbAoJICAgICAqLwoJICAgIEdlbmVyaWNHRlBvbHkucHJvdG90eXBlLmdldENvZWZmaWNpZW50ID0gZnVuY3Rpb24gKGRlZ3JlZSAvKmludCovKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmNvZWZmaWNpZW50c1t0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGggLSAxIC0gZGVncmVlXTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gZXZhbHVhdGlvbiBvZiB0aGlzIHBvbHlub21pYWwgYXQgYSBnaXZlbiBwb2ludAoJICAgICAqLwoJICAgIEdlbmVyaWNHRlBvbHkucHJvdG90eXBlLmV2YWx1YXRlQXQgPSBmdW5jdGlvbiAoYSAvKmludCovKSB7CgkgICAgICAgIGlmIChhID09PSAwKSB7CgkgICAgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgeF4wIGNvZWZmaWNpZW50CgkgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb2VmZmljaWVudCgwKTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgY29lZmZpY2llbnRzID0gdGhpcy5jb2VmZmljaWVudHM7CgkgICAgICAgIHZhciByZXN1bHQ7CgkgICAgICAgIGlmIChhID09PSAxKSB7CgkgICAgICAgICAgICAvLyBKdXN0IHRoZSBzdW0gb2YgdGhlIGNvZWZmaWNpZW50cwoJICAgICAgICAgICAgcmVzdWx0ID0gMDsKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGhfMSA9IGNvZWZmaWNpZW50cy5sZW5ndGg7IGkgIT09IGxlbmd0aF8xOyBpKyspIHsKCSAgICAgICAgICAgICAgICB2YXIgY29lZmZpY2llbnQgPSBjb2VmZmljaWVudHNbaV07CgkgICAgICAgICAgICAgICAgcmVzdWx0ID0gQWJzdHJhY3RHZW5lcmljR0ZfMSQxLmRlZmF1bHQuYWRkT3JTdWJ0cmFjdChyZXN1bHQsIGNvZWZmaWNpZW50KTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CgkgICAgICAgIH0KCSAgICAgICAgcmVzdWx0ID0gY29lZmZpY2llbnRzWzBdOwoJICAgICAgICB2YXIgc2l6ZSA9IGNvZWZmaWNpZW50cy5sZW5ndGg7CgkgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZmllbGQ7CgkgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CgkgICAgICAgICAgICByZXN1bHQgPSBBYnN0cmFjdEdlbmVyaWNHRl8xJDEuZGVmYXVsdC5hZGRPclN1YnRyYWN0KGZpZWxkLm11bHRpcGx5KGEsIHJlc3VsdCksIGNvZWZmaWNpZW50c1tpXSk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9OwoJICAgIEdlbmVyaWNHRlBvbHkucHJvdG90eXBlLmFkZE9yU3VidHJhY3QgPSBmdW5jdGlvbiAob3RoZXIpIHsKCSAgICAgICAgaWYgKCF0aGlzLmZpZWxkLmVxdWFscyhvdGhlci5maWVsZCkpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSQ0LmRlZmF1bHQoJ0dlbmVyaWNHRlBvbHlzIGRvIG5vdCBoYXZlIHNhbWUgR2VuZXJpY0dGIGZpZWxkJyk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpIHsKCSAgICAgICAgICAgIHJldHVybiBvdGhlcjsKCSAgICAgICAgfQoJICAgICAgICBpZiAob3RoZXIuaXNaZXJvKCkpIHsKCSAgICAgICAgICAgIHJldHVybiB0aGlzOwoJICAgICAgICB9CgkgICAgICAgIHZhciBzbWFsbGVyQ29lZmZpY2llbnRzID0gdGhpcy5jb2VmZmljaWVudHM7CgkgICAgICAgIHZhciBsYXJnZXJDb2VmZmljaWVudHMgPSBvdGhlci5jb2VmZmljaWVudHM7CgkgICAgICAgIGlmIChzbWFsbGVyQ29lZmZpY2llbnRzLmxlbmd0aCA+IGxhcmdlckNvZWZmaWNpZW50cy5sZW5ndGgpIHsKCSAgICAgICAgICAgIHZhciB0ZW1wID0gc21hbGxlckNvZWZmaWNpZW50czsKCSAgICAgICAgICAgIHNtYWxsZXJDb2VmZmljaWVudHMgPSBsYXJnZXJDb2VmZmljaWVudHM7CgkgICAgICAgICAgICBsYXJnZXJDb2VmZmljaWVudHMgPSB0ZW1wOwoJICAgICAgICB9CgkgICAgICAgIHZhciBzdW1EaWZmID0gbmV3IEludDMyQXJyYXkobGFyZ2VyQ29lZmZpY2llbnRzLmxlbmd0aCk7CgkgICAgICAgIHZhciBsZW5ndGhEaWZmID0gbGFyZ2VyQ29lZmZpY2llbnRzLmxlbmd0aCAtIHNtYWxsZXJDb2VmZmljaWVudHMubGVuZ3RoOwoJICAgICAgICAvLyBDb3B5IGhpZ2gtb3JkZXIgdGVybXMgb25seSBmb3VuZCBpbiBoaWdoZXItZGVncmVlIHBvbHlub21pYWwncyBjb2VmZmljaWVudHMKCSAgICAgICAgU3lzdGVtXzEuZGVmYXVsdC5hcnJheWNvcHkobGFyZ2VyQ29lZmZpY2llbnRzLCAwLCBzdW1EaWZmLCAwLCBsZW5ndGhEaWZmKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IGxlbmd0aERpZmY7IGkgPCBsYXJnZXJDb2VmZmljaWVudHMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgIHN1bURpZmZbaV0gPSBBYnN0cmFjdEdlbmVyaWNHRl8xJDEuZGVmYXVsdC5hZGRPclN1YnRyYWN0KHNtYWxsZXJDb2VmZmljaWVudHNbaSAtIGxlbmd0aERpZmZdLCBsYXJnZXJDb2VmZmljaWVudHNbaV0pOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0dGUG9seSh0aGlzLmZpZWxkLCBzdW1EaWZmKTsKCSAgICB9OwoJICAgIEdlbmVyaWNHRlBvbHkucHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gKG90aGVyKSB7CgkgICAgICAgIGlmICghdGhpcy5maWVsZC5lcXVhbHMob3RoZXIuZmllbGQpKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkNC5kZWZhdWx0KCdHZW5lcmljR0ZQb2x5cyBkbyBub3QgaGF2ZSBzYW1lIEdlbmVyaWNHRiBmaWVsZCcpOwoJICAgICAgICB9CgkgICAgICAgIGlmICh0aGlzLmlzWmVybygpIHx8IG90aGVyLmlzWmVybygpKSB7CgkgICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZC5nZXRaZXJvKCk7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIGFDb2VmZmljaWVudHMgPSB0aGlzLmNvZWZmaWNpZW50czsKCSAgICAgICAgdmFyIGFMZW5ndGggPSBhQ29lZmZpY2llbnRzLmxlbmd0aDsKCSAgICAgICAgdmFyIGJDb2VmZmljaWVudHMgPSBvdGhlci5jb2VmZmljaWVudHM7CgkgICAgICAgIHZhciBiTGVuZ3RoID0gYkNvZWZmaWNpZW50cy5sZW5ndGg7CgkgICAgICAgIHZhciBwcm9kdWN0ID0gbmV3IEludDMyQXJyYXkoYUxlbmd0aCArIGJMZW5ndGggLSAxKTsKCSAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5maWVsZDsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhTGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgIHZhciBhQ29lZmYgPSBhQ29lZmZpY2llbnRzW2ldOwoJICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBiTGVuZ3RoOyBqKyspIHsKCSAgICAgICAgICAgICAgICBwcm9kdWN0W2kgKyBqXSA9IEFic3RyYWN0R2VuZXJpY0dGXzEkMS5kZWZhdWx0LmFkZE9yU3VidHJhY3QocHJvZHVjdFtpICsgal0sIGZpZWxkLm11bHRpcGx5KGFDb2VmZiwgYkNvZWZmaWNpZW50c1tqXSkpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0dGUG9seShmaWVsZCwgcHJvZHVjdCk7CgkgICAgfTsKCSAgICBHZW5lcmljR0ZQb2x5LnByb3RvdHlwZS5tdWx0aXBseVNjYWxhciA9IGZ1bmN0aW9uIChzY2FsYXIgLyppbnQqLykgewoJICAgICAgICBpZiAoc2NhbGFyID09PSAwKSB7CgkgICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZC5nZXRaZXJvKCk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHNjYWxhciA9PT0gMSkgewoJICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIHNpemUgPSB0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGg7CgkgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZmllbGQ7CgkgICAgICAgIHZhciBwcm9kdWN0ID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7CgkgICAgICAgIHZhciBjb2VmZmljaWVudHMgPSB0aGlzLmNvZWZmaWNpZW50czsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCSAgICAgICAgICAgIHByb2R1Y3RbaV0gPSBmaWVsZC5tdWx0aXBseShjb2VmZmljaWVudHNbaV0sIHNjYWxhcik7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljR0ZQb2x5KGZpZWxkLCBwcm9kdWN0KTsKCSAgICB9OwoJICAgIEdlbmVyaWNHRlBvbHkucHJvdG90eXBlLm11bHRpcGx5QnlNb25vbWlhbCA9IGZ1bmN0aW9uIChkZWdyZWUgLyppbnQqLywgY29lZmZpY2llbnQgLyppbnQqLykgewoJICAgICAgICBpZiAoZGVncmVlIDwgMCkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDQuZGVmYXVsdCgpOwoJICAgICAgICB9CgkgICAgICAgIGlmIChjb2VmZmljaWVudCA9PT0gMCkgewoJICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQuZ2V0WmVybygpOwoJICAgICAgICB9CgkgICAgICAgIHZhciBjb2VmZmljaWVudHMgPSB0aGlzLmNvZWZmaWNpZW50czsKCSAgICAgICAgdmFyIHNpemUgPSBjb2VmZmljaWVudHMubGVuZ3RoOwoJICAgICAgICB2YXIgcHJvZHVjdCA9IG5ldyBJbnQzMkFycmF5KHNpemUgKyBkZWdyZWUpOwoJICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmZpZWxkOwoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJICAgICAgICAgICAgcHJvZHVjdFtpXSA9IGZpZWxkLm11bHRpcGx5KGNvZWZmaWNpZW50c1tpXSwgY29lZmZpY2llbnQpOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0dGUG9seShmaWVsZCwgcHJvZHVjdCk7CgkgICAgfTsKCSAgICBHZW5lcmljR0ZQb2x5LnByb3RvdHlwZS5kaXZpZGUgPSBmdW5jdGlvbiAob3RoZXIpIHsKCSAgICAgICAgaWYgKCF0aGlzLmZpZWxkLmVxdWFscyhvdGhlci5maWVsZCkpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSQ0LmRlZmF1bHQoJ0dlbmVyaWNHRlBvbHlzIGRvIG5vdCBoYXZlIHNhbWUgR2VuZXJpY0dGIGZpZWxkJyk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKG90aGVyLmlzWmVybygpKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkNC5kZWZhdWx0KCdEaXZpZGUgYnkgMCcpOwoJICAgICAgICB9CgkgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZmllbGQ7CgkgICAgICAgIHZhciBxdW90aWVudCA9IGZpZWxkLmdldFplcm8oKTsKCSAgICAgICAgdmFyIHJlbWFpbmRlciA9IHRoaXM7CgkgICAgICAgIHZhciBkZW5vbWluYXRvckxlYWRpbmdUZXJtID0gb3RoZXIuZ2V0Q29lZmZpY2llbnQob3RoZXIuZ2V0RGVncmVlKCkpOwoJICAgICAgICB2YXIgaW52ZXJzZURlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPSBmaWVsZC5pbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0pOwoJICAgICAgICB3aGlsZSAocmVtYWluZGVyLmdldERlZ3JlZSgpID49IG90aGVyLmdldERlZ3JlZSgpICYmICFyZW1haW5kZXIuaXNaZXJvKCkpIHsKCSAgICAgICAgICAgIHZhciBkZWdyZWVEaWZmZXJlbmNlID0gcmVtYWluZGVyLmdldERlZ3JlZSgpIC0gb3RoZXIuZ2V0RGVncmVlKCk7CgkgICAgICAgICAgICB2YXIgc2NhbGUgPSBmaWVsZC5tdWx0aXBseShyZW1haW5kZXIuZ2V0Q29lZmZpY2llbnQocmVtYWluZGVyLmdldERlZ3JlZSgpKSwgaW52ZXJzZURlbm9taW5hdG9yTGVhZGluZ1Rlcm0pOwoJICAgICAgICAgICAgdmFyIHRlcm0gPSBvdGhlci5tdWx0aXBseUJ5TW9ub21pYWwoZGVncmVlRGlmZmVyZW5jZSwgc2NhbGUpOwoJICAgICAgICAgICAgdmFyIGl0ZXJhdGlvblF1b3RpZW50ID0gZmllbGQuYnVpbGRNb25vbWlhbChkZWdyZWVEaWZmZXJlbmNlLCBzY2FsZSk7CgkgICAgICAgICAgICBxdW90aWVudCA9IHF1b3RpZW50LmFkZE9yU3VidHJhY3QoaXRlcmF0aW9uUXVvdGllbnQpOwoJICAgICAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLmFkZE9yU3VidHJhY3QodGVybSk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIFtxdW90aWVudCwgcmVtYWluZGVyXTsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBHZW5lcmljR0ZQb2x5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwoJICAgICAgICBmb3IgKHZhciBkZWdyZWUgPSB0aGlzLmdldERlZ3JlZSgpOyBkZWdyZWUgPj0gMDsgZGVncmVlLS0pIHsKCSAgICAgICAgICAgIHZhciBjb2VmZmljaWVudCA9IHRoaXMuZ2V0Q29lZmZpY2llbnQoZGVncmVlKTsKCSAgICAgICAgICAgIGlmIChjb2VmZmljaWVudCAhPT0gMCkgewoJICAgICAgICAgICAgICAgIGlmIChjb2VmZmljaWVudCA8IDApIHsKCSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgLSAnOwoJICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudCA9IC1jb2VmZmljaWVudDsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgKyAnOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIGlmIChkZWdyZWUgPT09IDAgfHwgY29lZmZpY2llbnQgIT09IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgdmFyIGFscGhhUG93ZXIgPSB0aGlzLmZpZWxkLmxvZyhjb2VmZmljaWVudCk7CgkgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYVBvd2VyID09PSAwKSB7CgkgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzEnOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFscGhhUG93ZXIgPT09IDEpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnYSc7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2FeJzsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYVBvd2VyOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIGlmIChkZWdyZWUgIT09IDApIHsKCSAgICAgICAgICAgICAgICAgICAgaWYgKGRlZ3JlZSA9PT0gMSkgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICd4JzsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAneF4nOwoJICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGRlZ3JlZTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcmVzdWx0OwoJICAgIH07CgkgICAgcmV0dXJuIEdlbmVyaWNHRlBvbHk7Cgl9KCkpOwoJR2VuZXJpY0dGUG9seSQxLmRlZmF1bHQgPSBHZW5lcmljR0ZQb2x5OwoKCXZhciBBcml0aG1ldGljRXhjZXB0aW9uJDEgPSB7fTsKCgl2YXIgX19leHRlbmRzJDcgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fAoJICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fAoJICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07CgkgICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgIH07CgkgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQoJICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CgkgICAgfTsKCX0pKCk7CglPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJpdGhtZXRpY0V4Y2VwdGlvbiQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7Cgl2YXIgRXhjZXB0aW9uXzEkMyA9IEV4Y2VwdGlvbiQxOwoJLyoqCgkgKiBDdXN0b20gRXJyb3IgY2xhc3Mgb2YgdHlwZSBFeGNlcHRpb24uCgkgKi8KCXZhciBBcml0aG1ldGljRXhjZXB0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewoJICAgIF9fZXh0ZW5kcyQ3KEFyaXRobWV0aWNFeGNlcHRpb24sIF9zdXBlcik7CgkgICAgZnVuY3Rpb24gQXJpdGhtZXRpY0V4Y2VwdGlvbigpIHsKCSAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwoJICAgIH0KCSAgICBBcml0aG1ldGljRXhjZXB0aW9uLmtpbmQgPSAnQXJpdGhtZXRpY0V4Y2VwdGlvbic7CgkgICAgcmV0dXJuIEFyaXRobWV0aWNFeGNlcHRpb247Cgl9KEV4Y2VwdGlvbl8xJDMuZGVmYXVsdCkpOwoJQXJpdGhtZXRpY0V4Y2VwdGlvbiQxLmRlZmF1bHQgPSBBcml0aG1ldGljRXhjZXB0aW9uOwoKCS8qCgkgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCgl2YXIgX19leHRlbmRzJDYgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fAoJICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fAoJICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07CgkgICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgIH07CgkgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQoJICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CgkgICAgfTsKCX0pKCk7CglPYmplY3QuZGVmaW5lUHJvcGVydHkoR2VuZXJpY0dGJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcuY29tbW9uLnJlZWRzb2xvbW9uIHsqLwoJdmFyIEdlbmVyaWNHRlBvbHlfMSQxID0gR2VuZXJpY0dGUG9seSQxOwoJdmFyIEFic3RyYWN0R2VuZXJpY0dGXzEgPSBBYnN0cmFjdEdlbmVyaWNHRiQxOwoJdmFyIEludGVnZXJfMSQxID0gSW50ZWdlciQxOwoJdmFyIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDMgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24kMTsKCXZhciBBcml0aG1ldGljRXhjZXB0aW9uXzEgPSBBcml0aG1ldGljRXhjZXB0aW9uJDE7CgkvKioKCSAqIDxwPlRoaXMgY2xhc3MgY29udGFpbnMgdXRpbGl0eSBtZXRob2RzIGZvciBwZXJmb3JtaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zIG92ZXIKCSAqIHRoZSBHYWxvaXMgRmllbGRzLiBPcGVyYXRpb25zIHVzZSBhIGdpdmVuIHByaW1pdGl2ZSBwb2x5bm9taWFsIGluIGNhbGN1bGF0aW9ucy48L3A+CgkgKgoJICogPHA+VGhyb3VnaG91dCB0aGlzIHBhY2thZ2UsIGVsZW1lbnRzIG9mIHRoZSBHRiBhcmUgcmVwcmVzZW50ZWQgYXMgYW4ge0Bjb2RlIGludH0KCSAqIGZvciBjb252ZW5pZW5jZSBhbmQgc3BlZWQgKGJ1dCBhdCB0aGUgY29zdCBvZiBtZW1vcnkpLgoJICogPC9wPgoJICoKCSAqIEBhdXRob3IgU2VhbiBPd2VuCgkgKiBAYXV0aG9yIERhdmlkIE9saXZpZXIKCSAqLwoJdmFyIEdlbmVyaWNHRiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKCSAgICBfX2V4dGVuZHMkNihHZW5lcmljR0YsIF9zdXBlcik7CgkgICAgLyoqCgkgICAgICogQ3JlYXRlIGEgcmVwcmVzZW50YXRpb24gb2YgR0Yoc2l6ZSkgdXNpbmcgdGhlIGdpdmVuIHByaW1pdGl2ZSBwb2x5bm9taWFsLgoJICAgICAqCgkgICAgICogQHBhcmFtIHByaW1pdGl2ZSBpcnJlZHVjaWJsZSBwb2x5bm9taWFsIHdob3NlIGNvZWZmaWNpZW50cyBhcmUgcmVwcmVzZW50ZWQgYnkKCSAgICAgKiAgdGhlIGJpdHMgb2YgYW4gaW50LCB3aGVyZSB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IHJlcHJlc2VudHMgdGhlIGNvbnN0YW50CgkgICAgICogIGNvZWZmaWNpZW50CgkgICAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGZpZWxkCgkgICAgICogQHBhcmFtIGIgdGhlIGZhY3RvciBiIGluIHRoZSBnZW5lcmF0b3IgcG9seW5vbWlhbCBjYW4gYmUgMC0gb3IgMS1iYXNlZAoJICAgICAqICAoZyh4KSA9ICh4K2FeYikoeCthXihiKzEpKS4uLih4K2FeKGIrMnQtMSkpKS4KCSAgICAgKiAgSW4gbW9zdCBjYXNlcyBpdCBzaG91bGQgYmUgMSwgYnV0IGZvciBRUiBjb2RlIGl0IGlzIDAuCgkgICAgICovCgkgICAgZnVuY3Rpb24gR2VuZXJpY0dGKHByaW1pdGl2ZSAvKmludCovLCBzaXplIC8qaW50Ki8sIGdlbmVyYXRvckJhc2UgLyppbnQqLykgewoJICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwoJICAgICAgICBfdGhpcy5wcmltaXRpdmUgPSBwcmltaXRpdmU7CgkgICAgICAgIF90aGlzLnNpemUgPSBzaXplOwoJICAgICAgICBfdGhpcy5nZW5lcmF0b3JCYXNlID0gZ2VuZXJhdG9yQmFzZTsKCSAgICAgICAgdmFyIGV4cFRhYmxlID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7CgkgICAgICAgIHZhciB4ID0gMTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCSAgICAgICAgICAgIGV4cFRhYmxlW2ldID0geDsKCSAgICAgICAgICAgIHggKj0gMjsgLy8gd2UncmUgYXNzdW1pbmcgdGhlIGdlbmVyYXRvciBhbHBoYSBpcyAyCgkgICAgICAgICAgICBpZiAoeCA+PSBzaXplKSB7CgkgICAgICAgICAgICAgICAgeCBePSBwcmltaXRpdmU7CgkgICAgICAgICAgICAgICAgeCAmPSBzaXplIC0gMTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBfdGhpcy5leHBUYWJsZSA9IGV4cFRhYmxlOwoJICAgICAgICB2YXIgbG9nVGFibGUgPSBuZXcgSW50MzJBcnJheShzaXplKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7CgkgICAgICAgICAgICBsb2dUYWJsZVtleHBUYWJsZVtpXV0gPSBpOwoJICAgICAgICB9CgkgICAgICAgIF90aGlzLmxvZ1RhYmxlID0gbG9nVGFibGU7CgkgICAgICAgIC8vIGxvZ1RhYmxlWzBdID09IDAgYnV0IHRoaXMgc2hvdWxkIG5ldmVyIGJlIHVzZWQKCSAgICAgICAgX3RoaXMuemVybyA9IG5ldyBHZW5lcmljR0ZQb2x5XzEkMS5kZWZhdWx0KF90aGlzLCBJbnQzMkFycmF5LmZyb20oWzBdKSk7CgkgICAgICAgIF90aGlzLm9uZSA9IG5ldyBHZW5lcmljR0ZQb2x5XzEkMS5kZWZhdWx0KF90aGlzLCBJbnQzMkFycmF5LmZyb20oWzFdKSk7CgkgICAgICAgIHJldHVybiBfdGhpczsKCSAgICB9CgkgICAgR2VuZXJpY0dGLnByb3RvdHlwZS5nZXRaZXJvID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy56ZXJvOwoJICAgIH07CgkgICAgR2VuZXJpY0dGLnByb3RvdHlwZS5nZXRPbmUgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLm9uZTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gdGhlIG1vbm9taWFsIHJlcHJlc2VudGluZyBjb2VmZmljaWVudCAqIHheZGVncmVlCgkgICAgICovCgkgICAgR2VuZXJpY0dGLnByb3RvdHlwZS5idWlsZE1vbm9taWFsID0gZnVuY3Rpb24gKGRlZ3JlZSAvKmludCovLCBjb2VmZmljaWVudCAvKmludCovKSB7CgkgICAgICAgIGlmIChkZWdyZWUgPCAwKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXzEkMy5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKGNvZWZmaWNpZW50ID09PSAwKSB7CgkgICAgICAgICAgICByZXR1cm4gdGhpcy56ZXJvOwoJICAgICAgICB9CgkgICAgICAgIHZhciBjb2VmZmljaWVudHMgPSBuZXcgSW50MzJBcnJheShkZWdyZWUgKyAxKTsKCSAgICAgICAgY29lZmZpY2llbnRzWzBdID0gY29lZmZpY2llbnQ7CgkgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0dGUG9seV8xJDEuZGVmYXVsdCh0aGlzLCBjb2VmZmljaWVudHMpOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIGEKCSAgICAgKi8KCSAgICBHZW5lcmljR0YucHJvdG90eXBlLmludmVyc2UgPSBmdW5jdGlvbiAoYSAvKmludCovKSB7CgkgICAgICAgIGlmIChhID09PSAwKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbl8xLmRlZmF1bHQoKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gdGhpcy5leHBUYWJsZVt0aGlzLnNpemUgLSB0aGlzLmxvZ1RhYmxlW2FdIC0gMV07CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIHByb2R1Y3Qgb2YgYSBhbmQgYiBpbiBHRihzaXplKQoJICAgICAqLwoJICAgIEdlbmVyaWNHRi5wcm90b3R5cGUubXVsdGlwbHkgPSBmdW5jdGlvbiAoYSAvKmludCovLCBiIC8qaW50Ki8pIHsKCSAgICAgICAgaWYgKGEgPT09IDAgfHwgYiA9PT0gMCkgewoJICAgICAgICAgICAgcmV0dXJuIDA7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHRoaXMuZXhwVGFibGVbKHRoaXMubG9nVGFibGVbYV0gKyB0aGlzLmxvZ1RhYmxlW2JdKSAlICh0aGlzLnNpemUgLSAxKV07CgkgICAgfTsKCSAgICBHZW5lcmljR0YucHJvdG90eXBlLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLnNpemU7CgkgICAgfTsKCSAgICBHZW5lcmljR0YucHJvdG90eXBlLmdldEdlbmVyYXRvckJhc2UgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRvckJhc2U7CgkgICAgfTsKCSAgICAvKkBPdmVycmlkZSovCgkgICAgR2VuZXJpY0dGLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuICgnR0YoMHgnICsgSW50ZWdlcl8xJDEuZGVmYXVsdC50b0hleFN0cmluZyh0aGlzLnByaW1pdGl2ZSkgKyAnLCcgKyB0aGlzLnNpemUgKyAnKScpOwoJICAgIH07CgkgICAgR2VuZXJpY0dGLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAobykgewoJICAgICAgICByZXR1cm4gbyA9PT0gdGhpczsKCSAgICB9OwoJICAgIEdlbmVyaWNHRi5BWlRFQ19EQVRBXzEyID0gbmV3IEdlbmVyaWNHRigweDEwNjksIDQwOTYsIDEpOyAvLyB4XjEyICsgeF42ICsgeF41ICsgeF4zICsgMQoJICAgIEdlbmVyaWNHRi5BWlRFQ19EQVRBXzEwID0gbmV3IEdlbmVyaWNHRigweDQwOSwgMTAyNCwgMSk7IC8vIHheMTAgKyB4XjMgKyAxCgkgICAgR2VuZXJpY0dGLkFaVEVDX0RBVEFfNiA9IG5ldyBHZW5lcmljR0YoMHg0MywgNjQsIDEpOyAvLyB4XjYgKyB4ICsgMQoJICAgIEdlbmVyaWNHRi5BWlRFQ19QQVJBTSA9IG5ldyBHZW5lcmljR0YoMHgxMywgMTYsIDEpOyAvLyB4XjQgKyB4ICsgMQoJICAgIEdlbmVyaWNHRi5RUl9DT0RFX0ZJRUxEXzI1NiA9IG5ldyBHZW5lcmljR0YoMHgwMTFkLCAyNTYsIDApOyAvLyB4XjggKyB4XjQgKyB4XjMgKyB4XjIgKyAxCgkgICAgR2VuZXJpY0dGLkRBVEFfTUFUUklYX0ZJRUxEXzI1NiA9IG5ldyBHZW5lcmljR0YoMHgwMTJkLCAyNTYsIDEpOyAvLyB4XjggKyB4XjUgKyB4XjMgKyB4XjIgKyAxCgkgICAgR2VuZXJpY0dGLkFaVEVDX0RBVEFfOCA9IEdlbmVyaWNHRi5EQVRBX01BVFJJWF9GSUVMRF8yNTY7CgkgICAgR2VuZXJpY0dGLk1BWElDT0RFX0ZJRUxEXzY0ID0gR2VuZXJpY0dGLkFaVEVDX0RBVEFfNjsKCSAgICByZXR1cm4gR2VuZXJpY0dGOwoJfShBYnN0cmFjdEdlbmVyaWNHRl8xLmRlZmF1bHQpKTsKCUdlbmVyaWNHRiQxLmRlZmF1bHQgPSBHZW5lcmljR0Y7CgoJdmFyIFJlZWRTb2xvbW9uRGVjb2RlciQxID0ge307CgoJdmFyIFJlZWRTb2xvbW9uRXhjZXB0aW9uJDEgPSB7fTsKCgl2YXIgX19leHRlbmRzJDUgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fAoJICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fAoJICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07CgkgICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgIH07CgkgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQoJICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CgkgICAgfTsKCX0pKCk7CglPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVlZFNvbG9tb25FeGNlcHRpb24kMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJdmFyIEV4Y2VwdGlvbl8xJDIgPSBFeGNlcHRpb24kMTsKCS8qKgoJICogQ3VzdG9tIEVycm9yIGNsYXNzIG9mIHR5cGUgRXhjZXB0aW9uLgoJICovCgl2YXIgUmVlZFNvbG9tb25FeGNlcHRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CgkgICAgX19leHRlbmRzJDUoUmVlZFNvbG9tb25FeGNlcHRpb24sIF9zdXBlcik7CgkgICAgZnVuY3Rpb24gUmVlZFNvbG9tb25FeGNlcHRpb24oKSB7CgkgICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKCSAgICB9CgkgICAgUmVlZFNvbG9tb25FeGNlcHRpb24ua2luZCA9ICdSZWVkU29sb21vbkV4Y2VwdGlvbic7CgkgICAgcmV0dXJuIFJlZWRTb2xvbW9uRXhjZXB0aW9uOwoJfShFeGNlcHRpb25fMSQyLmRlZmF1bHQpKTsKCVJlZWRTb2xvbW9uRXhjZXB0aW9uJDEuZGVmYXVsdCA9IFJlZWRTb2xvbW9uRXhjZXB0aW9uOwoKCXZhciBJbGxlZ2FsU3RhdGVFeGNlcHRpb24kMSA9IHt9OwoKCXZhciBfX2V4dGVuZHMkNCA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7CgkgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8CgkgICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8CgkgICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTsKCSAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgfTsKCSAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9CgkgICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKCSAgICB9OwoJfSkoKTsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbGxlZ2FsU3RhdGVFeGNlcHRpb24kMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJdmFyIEV4Y2VwdGlvbl8xJDEgPSBFeGNlcHRpb24kMTsKCS8qKgoJICogQ3VzdG9tIEVycm9yIGNsYXNzIG9mIHR5cGUgRXhjZXB0aW9uLgoJICovCgl2YXIgSWxsZWdhbFN0YXRlRXhjZXB0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewoJICAgIF9fZXh0ZW5kcyQ0KElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgX3N1cGVyKTsKCSAgICBmdW5jdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7CgkgICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKCSAgICB9CgkgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmtpbmQgPSAnSWxsZWdhbFN0YXRlRXhjZXB0aW9uJzsKCSAgICByZXR1cm4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwoJfShFeGNlcHRpb25fMSQxLmRlZmF1bHQpKTsKCUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbiQxLmRlZmF1bHQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb247CgoJLyoKCSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWVkU29sb21vbkRlY29kZXIkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJLypuYW1lc3BhY2UgY29tLmdvb2dsZS56eGluZy5jb21tb24ucmVlZHNvbG9tb24geyovCgl2YXIgR2VuZXJpY0dGXzEkMSA9IEdlbmVyaWNHRiQxOwoJdmFyIEdlbmVyaWNHRlBvbHlfMSA9IEdlbmVyaWNHRlBvbHkkMTsKCXZhciBSZWVkU29sb21vbkV4Y2VwdGlvbl8xID0gUmVlZFNvbG9tb25FeGNlcHRpb24kMTsKCXZhciBJbGxlZ2FsU3RhdGVFeGNlcHRpb25fMSA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiQxOwoJLyoqCgkgKiA8cD5JbXBsZW1lbnRzIFJlZWQtU29sb21vbiBkZWNvZGluZywgYXMgdGhlIG5hbWUgaW1wbGllcy48L3A+CgkgKgoJICogPHA+VGhlIGFsZ29yaXRobSB3aWxsIG5vdCBiZSBleHBsYWluZWQgaGVyZSwgYnV0IHRoZSBmb2xsb3dpbmcgcmVmZXJlbmNlcyB3ZXJlIGhlbHBmdWwKCSAqIGluIGNyZWF0aW5nIHRoaXMgaW1wbGVtZW50YXRpb246PC9wPgoJICoKCSAqIDx1bD4KCSAqIDxsaT5CcnVjZSBNYWdncy4KCSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3MuY211LmVkdS9hZnMvY3MuY211LmVkdS9wcm9qZWN0L3BzY2ljby1ndXliL3JlYWx3b3JsZC93d3cvcnNfZGVjb2RlLnBzIj4KCSAqICJEZWNvZGluZyBSZWVkLVNvbG9tb24gQ29kZXMiPC9hPiAoc2VlIGRpc2N1c3Npb24gb2YgRm9ybmV5J3MgRm9ybXVsYSk8L2xpPgoJICogPGxpPkouSS4gSGFsbC4gPGEgaHJlZj0id3d3Lm10aC5tc3UuZWR1L35qaGFsbC9jbGFzc2VzL2NvZGVub3Rlcy9HUlMucGRmIj4KCSAqICJDaGFwdGVyIDUuIEdlbmVyYWxpemVkIFJlZWQtU29sb21vbiBDb2RlcyI8L2E+CgkgKiAoc2VlIGRpc2N1c3Npb24gb2YgRXVjbGlkZWFuIGFsZ29yaXRobSk8L2xpPgoJICogPC91bD4KCSAqCgkgKiA8cD5NdWNoIGNyZWRpdCBpcyBkdWUgdG8gV2lsbGlhbSBSdWNrbGlkZ2Ugc2luY2UgcG9ydGlvbnMgb2YgdGhpcyBjb2RlIGFyZSBhbiBpbmRpcmVjdAoJICogcG9ydCBvZiBoaXMgQysrIFJlZWQtU29sb21vbiBpbXBsZW1lbnRhdGlvbi48L3A+CgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqIEBhdXRob3IgV2lsbGlhbSBSdWNrbGlkZ2UKCSAqIEBhdXRob3Igc2FuZm9yZHNxdWlyZXMKCSAqLwoJdmFyIFJlZWRTb2xvbW9uRGVjb2RlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBSZWVkU29sb21vbkRlY29kZXIoZmllbGQpIHsKCSAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwoJICAgIH0KCSAgICAvKioKCSAgICAgKiA8cD5EZWNvZGVzIGdpdmVuIHNldCBvZiByZWNlaXZlZCBjb2Rld29yZHMsIHdoaWNoIGluY2x1ZGUgYm90aCBkYXRhIGFuZCBlcnJvci1jb3JyZWN0aW9uCgkgICAgICogY29kZXdvcmRzLiBSZWFsbHksIHRoaXMgbWVhbnMgaXQgdXNlcyBSZWVkLVNvbG9tb24gdG8gZGV0ZWN0IGFuZCBjb3JyZWN0IGVycm9ycywgaW4tcGxhY2UsCgkgICAgICogaW4gdGhlIGlucHV0LjwvcD4KCSAgICAgKgoJICAgICAqIEBwYXJhbSByZWNlaXZlZCBkYXRhIGFuZCBlcnJvci1jb3JyZWN0aW9uIGNvZGV3b3JkcwoJICAgICAqIEBwYXJhbSB0d29TIG51bWJlciBvZiBlcnJvci1jb3JyZWN0aW9uIGNvZGV3b3JkcyBhdmFpbGFibGUKCSAgICAgKiBAdGhyb3dzIFJlZWRTb2xvbW9uRXhjZXB0aW9uIGlmIGRlY29kaW5nIGZhaWxzIGZvciBhbnkgcmVhc29uCgkgICAgICovCgkgICAgUmVlZFNvbG9tb25EZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAocmVjZWl2ZWQsIHR3b1MgLyppbnQqLykgewoJICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmZpZWxkOwoJICAgICAgICB2YXIgcG9seSA9IG5ldyBHZW5lcmljR0ZQb2x5XzEuZGVmYXVsdChmaWVsZCwgcmVjZWl2ZWQpOwoJICAgICAgICB2YXIgc3luZHJvbWVDb2VmZmljaWVudHMgPSBuZXcgSW50MzJBcnJheSh0d29TKTsKCSAgICAgICAgdmFyIG5vRXJyb3IgPSB0cnVlOwoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR3b1M7IGkrKykgewoJICAgICAgICAgICAgdmFyIGV2YWxSZXN1bHQgPSBwb2x5LmV2YWx1YXRlQXQoZmllbGQuZXhwKGkgKyBmaWVsZC5nZXRHZW5lcmF0b3JCYXNlKCkpKTsKCSAgICAgICAgICAgIHN5bmRyb21lQ29lZmZpY2llbnRzW3N5bmRyb21lQ29lZmZpY2llbnRzLmxlbmd0aCAtIDEgLSBpXSA9IGV2YWxSZXN1bHQ7CgkgICAgICAgICAgICBpZiAoZXZhbFJlc3VsdCAhPT0gMCkgewoJICAgICAgICAgICAgICAgIG5vRXJyb3IgPSBmYWxzZTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBpZiAobm9FcnJvcikgewoJICAgICAgICAgICAgcmV0dXJuOwoJICAgICAgICB9CgkgICAgICAgIHZhciBzeW5kcm9tZSA9IG5ldyBHZW5lcmljR0ZQb2x5XzEuZGVmYXVsdChmaWVsZCwgc3luZHJvbWVDb2VmZmljaWVudHMpOwoJICAgICAgICB2YXIgc2lnbWFPbWVnYSA9IHRoaXMucnVuRXVjbGlkZWFuQWxnb3JpdGhtKGZpZWxkLmJ1aWxkTW9ub21pYWwodHdvUywgMSksIHN5bmRyb21lLCB0d29TKTsKCSAgICAgICAgdmFyIHNpZ21hID0gc2lnbWFPbWVnYVswXTsKCSAgICAgICAgdmFyIG9tZWdhID0gc2lnbWFPbWVnYVsxXTsKCSAgICAgICAgdmFyIGVycm9yTG9jYXRpb25zID0gdGhpcy5maW5kRXJyb3JMb2NhdGlvbnMoc2lnbWEpOwoJICAgICAgICB2YXIgZXJyb3JNYWduaXR1ZGVzID0gdGhpcy5maW5kRXJyb3JNYWduaXR1ZGVzKG9tZWdhLCBlcnJvckxvY2F0aW9ucyk7CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3JMb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IHJlY2VpdmVkLmxlbmd0aCAtIDEgLSBmaWVsZC5sb2coZXJyb3JMb2NhdGlvbnNbaV0pOwoJICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkgewoJICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZWVkU29sb21vbkV4Y2VwdGlvbl8xLmRlZmF1bHQoJ0JhZCBlcnJvciBsb2NhdGlvbicpOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgcmVjZWl2ZWRbcG9zaXRpb25dID0gR2VuZXJpY0dGXzEkMS5kZWZhdWx0LmFkZE9yU3VidHJhY3QocmVjZWl2ZWRbcG9zaXRpb25dLCBlcnJvck1hZ25pdHVkZXNbaV0pOwoJICAgICAgICB9CgkgICAgfTsKCSAgICBSZWVkU29sb21vbkRlY29kZXIucHJvdG90eXBlLnJ1bkV1Y2xpZGVhbkFsZ29yaXRobSA9IGZ1bmN0aW9uIChhLCBiLCBSIC8qaW50Ki8pIHsKCSAgICAgICAgLy8gQXNzdW1lIGEncyBkZWdyZWUgaXMgPj0gYidzCgkgICAgICAgIGlmIChhLmdldERlZ3JlZSgpIDwgYi5nZXREZWdyZWUoKSkgewoJICAgICAgICAgICAgdmFyIHRlbXAgPSBhOwoJICAgICAgICAgICAgYSA9IGI7CgkgICAgICAgICAgICBiID0gdGVtcDsKCSAgICAgICAgfQoJICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmZpZWxkOwoJICAgICAgICB2YXIgckxhc3QgPSBhOwoJICAgICAgICB2YXIgciA9IGI7CgkgICAgICAgIHZhciB0TGFzdCA9IGZpZWxkLmdldFplcm8oKTsKCSAgICAgICAgdmFyIHQgPSBmaWVsZC5nZXRPbmUoKTsKCSAgICAgICAgLy8gUnVuIEV1Y2xpZGVhbiBhbGdvcml0aG0gdW50aWwgcidzIGRlZ3JlZSBpcyBsZXNzIHRoYW4gUi8yCgkgICAgICAgIHdoaWxlIChyLmdldERlZ3JlZSgpID49IChSIC8gMiB8IDApKSB7CgkgICAgICAgICAgICB2YXIgckxhc3RMYXN0ID0gckxhc3Q7CgkgICAgICAgICAgICB2YXIgdExhc3RMYXN0ID0gdExhc3Q7CgkgICAgICAgICAgICByTGFzdCA9IHI7CgkgICAgICAgICAgICB0TGFzdCA9IHQ7CgkgICAgICAgICAgICAvLyBEaXZpZGUgckxhc3RMYXN0IGJ5IHJMYXN0LCB3aXRoIHF1b3RpZW50IGluIHEgYW5kIHJlbWFpbmRlciBpbiByCgkgICAgICAgICAgICBpZiAockxhc3QuaXNaZXJvKCkpIHsKCSAgICAgICAgICAgICAgICAvLyBPb3BzLCBFdWNsaWRlYW4gYWxnb3JpdGhtIGFscmVhZHkgdGVybWluYXRlZD8KCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVlZFNvbG9tb25FeGNlcHRpb25fMS5kZWZhdWx0KCdyX3tpLTF9IHdhcyB6ZXJvJyk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByID0gckxhc3RMYXN0OwoJICAgICAgICAgICAgdmFyIHEgPSBmaWVsZC5nZXRaZXJvKCk7CgkgICAgICAgICAgICB2YXIgZGVub21pbmF0b3JMZWFkaW5nVGVybSA9IHJMYXN0LmdldENvZWZmaWNpZW50KHJMYXN0LmdldERlZ3JlZSgpKTsKCSAgICAgICAgICAgIHZhciBkbHRJbnZlcnNlID0gZmllbGQuaW52ZXJzZShkZW5vbWluYXRvckxlYWRpbmdUZXJtKTsKCSAgICAgICAgICAgIHdoaWxlIChyLmdldERlZ3JlZSgpID49IHJMYXN0LmdldERlZ3JlZSgpICYmICFyLmlzWmVybygpKSB7CgkgICAgICAgICAgICAgICAgdmFyIGRlZ3JlZURpZmYgPSByLmdldERlZ3JlZSgpIC0gckxhc3QuZ2V0RGVncmVlKCk7CgkgICAgICAgICAgICAgICAgdmFyIHNjYWxlID0gZmllbGQubXVsdGlwbHkoci5nZXRDb2VmZmljaWVudChyLmdldERlZ3JlZSgpKSwgZGx0SW52ZXJzZSk7CgkgICAgICAgICAgICAgICAgcSA9IHEuYWRkT3JTdWJ0cmFjdChmaWVsZC5idWlsZE1vbm9taWFsKGRlZ3JlZURpZmYsIHNjYWxlKSk7CgkgICAgICAgICAgICAgICAgciA9IHIuYWRkT3JTdWJ0cmFjdChyTGFzdC5tdWx0aXBseUJ5TW9ub21pYWwoZGVncmVlRGlmZiwgc2NhbGUpKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHQgPSBxLm11bHRpcGx5KHRMYXN0KS5hZGRPclN1YnRyYWN0KHRMYXN0TGFzdCk7CgkgICAgICAgICAgICBpZiAoci5nZXREZWdyZWUoKSA+PSByTGFzdC5nZXREZWdyZWUoKSkgewoJICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb25fMS5kZWZhdWx0KCdEaXZpc2lvbiBhbGdvcml0aG0gZmFpbGVkIHRvIHJlZHVjZSBwb2x5bm9taWFsPycpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHZhciBzaWdtYVRpbGRlQXRaZXJvID0gdC5nZXRDb2VmZmljaWVudCgwKTsKCSAgICAgICAgaWYgKHNpZ21hVGlsZGVBdFplcm8gPT09IDApIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBSZWVkU29sb21vbkV4Y2VwdGlvbl8xLmRlZmF1bHQoJ3NpZ21hVGlsZGUoMCkgd2FzIHplcm8nKTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgaW52ZXJzZSA9IGZpZWxkLmludmVyc2Uoc2lnbWFUaWxkZUF0WmVybyk7CgkgICAgICAgIHZhciBzaWdtYSA9IHQubXVsdGlwbHlTY2FsYXIoaW52ZXJzZSk7CgkgICAgICAgIHZhciBvbWVnYSA9IHIubXVsdGlwbHlTY2FsYXIoaW52ZXJzZSk7CgkgICAgICAgIHJldHVybiBbc2lnbWEsIG9tZWdhXTsKCSAgICB9OwoJICAgIFJlZWRTb2xvbW9uRGVjb2Rlci5wcm90b3R5cGUuZmluZEVycm9yTG9jYXRpb25zID0gZnVuY3Rpb24gKGVycm9yTG9jYXRvcikgewoJICAgICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IGFwcGxpY2F0aW9uIG9mIENoaWVuJ3Mgc2VhcmNoCgkgICAgICAgIHZhciBudW1FcnJvcnMgPSBlcnJvckxvY2F0b3IuZ2V0RGVncmVlKCk7CgkgICAgICAgIGlmIChudW1FcnJvcnMgPT09IDEpIHsgLy8gc2hvcnRjdXQKCSAgICAgICAgICAgIHJldHVybiBJbnQzMkFycmF5LmZyb20oW2Vycm9yTG9jYXRvci5nZXRDb2VmZmljaWVudCgxKV0pOwoJICAgICAgICB9CgkgICAgICAgIHZhciByZXN1bHQgPSBuZXcgSW50MzJBcnJheShudW1FcnJvcnMpOwoJICAgICAgICB2YXIgZSA9IDA7CgkgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZmllbGQ7CgkgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgZmllbGQuZ2V0U2l6ZSgpICYmIGUgPCBudW1FcnJvcnM7IGkrKykgewoJICAgICAgICAgICAgaWYgKGVycm9yTG9jYXRvci5ldmFsdWF0ZUF0KGkpID09PSAwKSB7CgkgICAgICAgICAgICAgICAgcmVzdWx0W2VdID0gZmllbGQuaW52ZXJzZShpKTsKCSAgICAgICAgICAgICAgICBlKys7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgaWYgKGUgIT09IG51bUVycm9ycykgewoJICAgICAgICAgICAgdGhyb3cgbmV3IFJlZWRTb2xvbW9uRXhjZXB0aW9uXzEuZGVmYXVsdCgnRXJyb3IgbG9jYXRvciBkZWdyZWUgZG9lcyBub3QgbWF0Y2ggbnVtYmVyIG9mIHJvb3RzJyk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9OwoJICAgIFJlZWRTb2xvbW9uRGVjb2Rlci5wcm90b3R5cGUuZmluZEVycm9yTWFnbml0dWRlcyA9IGZ1bmN0aW9uIChlcnJvckV2YWx1YXRvciwgZXJyb3JMb2NhdGlvbnMpIHsKCSAgICAgICAgLy8gVGhpcyBpcyBkaXJlY3RseSBhcHBseWluZyBGb3JuZXkncyBGb3JtdWxhCgkgICAgICAgIHZhciBzID0gZXJyb3JMb2NhdGlvbnMubGVuZ3RoOwoJICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkocyk7CgkgICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZmllbGQ7CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgeGlJbnZlcnNlID0gZmllbGQuaW52ZXJzZShlcnJvckxvY2F0aW9uc1tpXSk7CgkgICAgICAgICAgICB2YXIgZGVub21pbmF0b3IgPSAxOwoJICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzOyBqKyspIHsKCSAgICAgICAgICAgICAgICBpZiAoaSAhPT0gaikgewoJICAgICAgICAgICAgICAgICAgICAvLyBkZW5vbWluYXRvciA9IGZpZWxkLm11bHRpcGx5KGRlbm9taW5hdG9yLAoJICAgICAgICAgICAgICAgICAgICAvLyAgICBHZW5lcmljR0YuYWRkT3JTdWJ0cmFjdCgxLCBmaWVsZC5tdWx0aXBseShlcnJvckxvY2F0aW9uc1tqXSwgeGlJbnZlcnNlKSkpCgkgICAgICAgICAgICAgICAgICAgIC8vIEFib3ZlIHNob3VsZCB3b3JrIGJ1dCBmYWlscyBvbiBzb21lIEFwcGxlIGFuZCBMaW51eCBKREtzIGR1ZSB0byBhIEhvdHNwb3QgYnVnLgoJICAgICAgICAgICAgICAgICAgICAvLyBCZWxvdyBpcyBhIGZ1bm55LWxvb2tpbmcgd29ya2Fyb3VuZCBmcm9tIFN0ZXZlbiBQYXJrZXMKCSAgICAgICAgICAgICAgICAgICAgdmFyIHRlcm0gPSBmaWVsZC5tdWx0aXBseShlcnJvckxvY2F0aW9uc1tqXSwgeGlJbnZlcnNlKTsKCSAgICAgICAgICAgICAgICAgICAgdmFyIHRlcm1QbHVzMSA9ICh0ZXJtICYgMHgxKSA9PT0gMCA/IHRlcm0gfCAxIDogdGVybSAmIH4xOwoJICAgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IGZpZWxkLm11bHRpcGx5KGRlbm9taW5hdG9yLCB0ZXJtUGx1czEpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHJlc3VsdFtpXSA9IGZpZWxkLm11bHRpcGx5KGVycm9yRXZhbHVhdG9yLmV2YWx1YXRlQXQoeGlJbnZlcnNlKSwgZmllbGQuaW52ZXJzZShkZW5vbWluYXRvcikpOwoJICAgICAgICAgICAgaWYgKGZpZWxkLmdldEdlbmVyYXRvckJhc2UoKSAhPT0gMCkgewoJICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGZpZWxkLm11bHRpcGx5KHJlc3VsdFtpXSwgeGlJbnZlcnNlKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcmVzdWx0OwoJICAgIH07CgkgICAgcmV0dXJuIFJlZWRTb2xvbW9uRGVjb2RlcjsKCX0oKSk7CglSZWVkU29sb21vbkRlY29kZXIkMS5kZWZhdWx0ID0gUmVlZFNvbG9tb25EZWNvZGVyOwoKCXZhciBCaXRNYXRyaXhQYXJzZXIkMSA9IHt9OwoKCXZhciBWZXJzaW9uJDEgPSB7fTsKCgl2YXIgRm9ybWF0SW5mb3JtYXRpb24kMSA9IHt9OwoKCXZhciBFcnJvckNvcnJlY3Rpb25MZXZlbCA9IHt9OwoKCXZhciBBcmd1bWVudEV4Y2VwdGlvbiQxID0ge307CgoJdmFyIF9fZXh0ZW5kcyQzID0gKGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHsKCSAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwKCSAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHwKCSAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9OwoJICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICB9OwoJICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH0KCSAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpOwoJICAgIH07Cgl9KSgpOwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEFyZ3VtZW50RXhjZXB0aW9uJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCXZhciBFeGNlcHRpb25fMSA9IEV4Y2VwdGlvbiQxOwoJLyoqCgkgKiBDdXN0b20gRXJyb3IgY2xhc3Mgb2YgdHlwZSBFeGNlcHRpb24uCgkgKi8KCXZhciBBcmd1bWVudEV4Y2VwdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKCSAgICBfX2V4dGVuZHMkMyhBcmd1bWVudEV4Y2VwdGlvbiwgX3N1cGVyKTsKCSAgICBmdW5jdGlvbiBBcmd1bWVudEV4Y2VwdGlvbigpIHsKCSAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwoJICAgIH0KCSAgICBBcmd1bWVudEV4Y2VwdGlvbi5raW5kID0gJ0FyZ3VtZW50RXhjZXB0aW9uJzsKCSAgICByZXR1cm4gQXJndW1lbnRFeGNlcHRpb247Cgl9KEV4Y2VwdGlvbl8xLmRlZmF1bHQpKTsKCUFyZ3VtZW50RXhjZXB0aW9uJDEuZGVmYXVsdCA9IEFyZ3VtZW50RXhjZXB0aW9uOwoKCShmdW5jdGlvbiAoZXhwb3J0cykgewoJLyoKCSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CglleHBvcnRzLkVycm9yQ29ycmVjdGlvbkxldmVsVmFsdWVzID0gdm9pZCAwOwoJLypuYW1lc3BhY2UgY29tLmdvb2dsZS56eGluZy5xcmNvZGUuZGVjb2RlciB7Ki8KCXZhciBBcmd1bWVudEV4Y2VwdGlvbl8xID0gQXJndW1lbnRFeGNlcHRpb24kMTsKCXZhciBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiQxOwoJdmFyIEVycm9yQ29ycmVjdGlvbkxldmVsVmFsdWVzOwoJKGZ1bmN0aW9uIChFcnJvckNvcnJlY3Rpb25MZXZlbFZhbHVlcykgewoJICAgIEVycm9yQ29ycmVjdGlvbkxldmVsVmFsdWVzW0Vycm9yQ29ycmVjdGlvbkxldmVsVmFsdWVzWyJMIl0gPSAwXSA9ICJMIjsKCSAgICBFcnJvckNvcnJlY3Rpb25MZXZlbFZhbHVlc1tFcnJvckNvcnJlY3Rpb25MZXZlbFZhbHVlc1siTSJdID0gMV0gPSAiTSI7CgkgICAgRXJyb3JDb3JyZWN0aW9uTGV2ZWxWYWx1ZXNbRXJyb3JDb3JyZWN0aW9uTGV2ZWxWYWx1ZXNbIlEiXSA9IDJdID0gIlEiOwoJICAgIEVycm9yQ29ycmVjdGlvbkxldmVsVmFsdWVzW0Vycm9yQ29ycmVjdGlvbkxldmVsVmFsdWVzWyJIIl0gPSAzXSA9ICJIIjsKCX0pKEVycm9yQ29ycmVjdGlvbkxldmVsVmFsdWVzID0gZXhwb3J0cy5FcnJvckNvcnJlY3Rpb25MZXZlbFZhbHVlcyB8fCAoZXhwb3J0cy5FcnJvckNvcnJlY3Rpb25MZXZlbFZhbHVlcyA9IHt9KSk7CgkvKioKCSAqIDxwPlNlZSBJU08gMTgwMDQ6MjAwNiwgNi41LjEuIFRoaXMgZW51bSBlbmNhcHN1bGF0ZXMgdGhlIGZvdXIgZXJyb3IgY29ycmVjdGlvbiBsZXZlbHMKCSAqIGRlZmluZWQgYnkgdGhlIFFSIGNvZGUgc3RhbmRhcmQuPC9wPgoJICoKCSAqIEBhdXRob3IgU2VhbiBPd2VuCgkgKi8KCXZhciBFcnJvckNvcnJlY3Rpb25MZXZlbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBFcnJvckNvcnJlY3Rpb25MZXZlbCh2YWx1ZSwgc3RyaW5nVmFsdWUsIGJpdHMgLyppbnQqLykgewoJICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgkgICAgICAgIHRoaXMuc3RyaW5nVmFsdWUgPSBzdHJpbmdWYWx1ZTsKCSAgICAgICAgdGhpcy5iaXRzID0gYml0czsKCSAgICAgICAgRXJyb3JDb3JyZWN0aW9uTGV2ZWwuRk9SX0JJVFMuc2V0KGJpdHMsIHRoaXMpOwoJICAgICAgICBFcnJvckNvcnJlY3Rpb25MZXZlbC5GT1JfVkFMVUUuc2V0KHZhbHVlLCB0aGlzKTsKCSAgICB9CgkgICAgRXJyb3JDb3JyZWN0aW9uTGV2ZWwucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKCSAgICB9OwoJICAgIEVycm9yQ29ycmVjdGlvbkxldmVsLnByb3RvdHlwZS5nZXRCaXRzID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5iaXRzOwoJICAgIH07CgkgICAgRXJyb3JDb3JyZWN0aW9uTGV2ZWwuZnJvbVN0cmluZyA9IGZ1bmN0aW9uIChzKSB7CgkgICAgICAgIHN3aXRjaCAocykgewoJICAgICAgICAgICAgY2FzZSAnTCc6IHJldHVybiBFcnJvckNvcnJlY3Rpb25MZXZlbC5MOwoJICAgICAgICAgICAgY2FzZSAnTSc6IHJldHVybiBFcnJvckNvcnJlY3Rpb25MZXZlbC5NOwoJICAgICAgICAgICAgY2FzZSAnUSc6IHJldHVybiBFcnJvckNvcnJlY3Rpb25MZXZlbC5ROwoJICAgICAgICAgICAgY2FzZSAnSCc6IHJldHVybiBFcnJvckNvcnJlY3Rpb25MZXZlbC5IOwoJICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uXzEuZGVmYXVsdChzICsgJ25vdCBhdmFpbGFibGUnKTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgRXJyb3JDb3JyZWN0aW9uTGV2ZWwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdWYWx1ZTsKCSAgICB9OwoJICAgIEVycm9yQ29ycmVjdGlvbkxldmVsLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAobykgewoJICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRXJyb3JDb3JyZWN0aW9uTGV2ZWwpKSB7CgkgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIG90aGVyID0gbzsKCSAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IG90aGVyLnZhbHVlOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHBhcmFtIGJpdHMgaW50IGNvbnRhaW5pbmcgdGhlIHR3byBiaXRzIGVuY29kaW5nIGEgUVIgQ29kZSdzIGVycm9yIGNvcnJlY3Rpb24gbGV2ZWwKCSAgICAgKiBAcmV0dXJuIEVycm9yQ29ycmVjdGlvbkxldmVsIHJlcHJlc2VudGluZyB0aGUgZW5jb2RlZCBlcnJvciBjb3JyZWN0aW9uIGxldmVsCgkgICAgICovCgkgICAgRXJyb3JDb3JyZWN0aW9uTGV2ZWwuZm9yQml0cyA9IGZ1bmN0aW9uIChiaXRzIC8qaW50Ki8pIHsKCSAgICAgICAgaWYgKGJpdHMgPCAwIHx8IGJpdHMgPj0gRXJyb3JDb3JyZWN0aW9uTGV2ZWwuRk9SX0JJVFMuc2l6ZSkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xLmRlZmF1bHQoKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gRXJyb3JDb3JyZWN0aW9uTGV2ZWwuRk9SX0JJVFMuZ2V0KGJpdHMpOwoJICAgIH07CgkgICAgRXJyb3JDb3JyZWN0aW9uTGV2ZWwuRk9SX0JJVFMgPSBuZXcgTWFwKCk7CgkgICAgRXJyb3JDb3JyZWN0aW9uTGV2ZWwuRk9SX1ZBTFVFID0gbmV3IE1hcCgpOwoJICAgIC8qKiBMID0gfjclIGNvcnJlY3Rpb24gKi8KCSAgICBFcnJvckNvcnJlY3Rpb25MZXZlbC5MID0gbmV3IEVycm9yQ29ycmVjdGlvbkxldmVsKEVycm9yQ29ycmVjdGlvbkxldmVsVmFsdWVzLkwsICdMJywgMHgwMSk7CgkgICAgLyoqIE0gPSB+MTUlIGNvcnJlY3Rpb24gKi8KCSAgICBFcnJvckNvcnJlY3Rpb25MZXZlbC5NID0gbmV3IEVycm9yQ29ycmVjdGlvbkxldmVsKEVycm9yQ29ycmVjdGlvbkxldmVsVmFsdWVzLk0sICdNJywgMHgwMCk7CgkgICAgLyoqIFEgPSB+MjUlIGNvcnJlY3Rpb24gKi8KCSAgICBFcnJvckNvcnJlY3Rpb25MZXZlbC5RID0gbmV3IEVycm9yQ29ycmVjdGlvbkxldmVsKEVycm9yQ29ycmVjdGlvbkxldmVsVmFsdWVzLlEsICdRJywgMHgwMyk7CgkgICAgLyoqIEggPSB+MzAlIGNvcnJlY3Rpb24gKi8KCSAgICBFcnJvckNvcnJlY3Rpb25MZXZlbC5IID0gbmV3IEVycm9yQ29ycmVjdGlvbkxldmVsKEVycm9yQ29ycmVjdGlvbkxldmVsVmFsdWVzLkgsICdIJywgMHgwMik7CgkgICAgcmV0dXJuIEVycm9yQ29ycmVjdGlvbkxldmVsOwoJfSgpKTsKCWV4cG9ydHMuZGVmYXVsdCA9IEVycm9yQ29ycmVjdGlvbkxldmVsOwoKCX0oRXJyb3JDb3JyZWN0aW9uTGV2ZWwpKTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJdmFyIF9fdmFsdWVzJDYgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHsKCSAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDsKCSAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTsKCSAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSByZXR1cm4gewoJICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwOwoJICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9OwoJICAgICAgICB9CgkgICAgfTsKCSAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKCX07CglPYmplY3QuZGVmaW5lUHJvcGVydHkoRm9ybWF0SW5mb3JtYXRpb24kMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJLypuYW1lc3BhY2UgY29tLmdvb2dsZS56eGluZy5xcmNvZGUuZGVjb2RlciB7Ki8KCXZhciBFcnJvckNvcnJlY3Rpb25MZXZlbF8xID0gRXJyb3JDb3JyZWN0aW9uTGV2ZWw7Cgl2YXIgSW50ZWdlcl8xID0gSW50ZWdlciQxOwoJLyoqCgkgKiA8cD5FbmNhcHN1bGF0ZXMgYSBRUiBDb2RlJ3MgZm9ybWF0IGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGRhdGEgbWFzayB1c2VkIGFuZAoJICogZXJyb3IgY29ycmVjdGlvbiBsZXZlbC48L3A+CgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqIEBzZWUgRGF0YU1hc2sKCSAqIEBzZWUgRXJyb3JDb3JyZWN0aW9uTGV2ZWwKCSAqLwoJdmFyIEZvcm1hdEluZm9ybWF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIGZ1bmN0aW9uIEZvcm1hdEluZm9ybWF0aW9uKGZvcm1hdEluZm8gLyppbnQqLykgewoJICAgICAgICAvLyBCaXRzIDMsNAoJICAgICAgICB0aGlzLmVycm9yQ29ycmVjdGlvbkxldmVsID0gRXJyb3JDb3JyZWN0aW9uTGV2ZWxfMS5kZWZhdWx0LmZvckJpdHMoKGZvcm1hdEluZm8gPj4gMykgJiAweDAzKTsKCSAgICAgICAgLy8gQm90dG9tIDMgYml0cwoJICAgICAgICB0aGlzLmRhdGFNYXNrID0gLyooYnl0ZSkgKi8gKGZvcm1hdEluZm8gJiAweDA3KTsKCSAgICB9CgkgICAgRm9ybWF0SW5mb3JtYXRpb24ubnVtQml0c0RpZmZlcmluZyA9IGZ1bmN0aW9uIChhIC8qaW50Ki8sIGIgLyppbnQqLykgewoJICAgICAgICByZXR1cm4gSW50ZWdlcl8xLmRlZmF1bHQuYml0Q291bnQoYSBeIGIpOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHBhcmFtIG1hc2tlZEZvcm1hdEluZm8xIGZvcm1hdCBpbmZvIGluZGljYXRvciwgd2l0aCBtYXNrIHN0aWxsIGFwcGxpZWQKCSAgICAgKiBAcGFyYW0gbWFza2VkRm9ybWF0SW5mbzIgc2Vjb25kIGNvcHkgb2Ygc2FtZSBpbmZvOyBib3RoIGFyZSBjaGVja2VkIGF0IHRoZSBzYW1lIHRpbWUKCSAgICAgKiAgdG8gZXN0YWJsaXNoIGJlc3QgbWF0Y2gKCSAgICAgKiBAcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmb3JtYXQgaXQgc3BlY2lmaWVzLCBvciB7QGNvZGUgbnVsbH0KCSAgICAgKiAgaWYgZG9lc24ndCBzZWVtIHRvIG1hdGNoIGFueSBrbm93biBwYXR0ZXJuCgkgICAgICovCgkgICAgRm9ybWF0SW5mb3JtYXRpb24uZGVjb2RlRm9ybWF0SW5mb3JtYXRpb24gPSBmdW5jdGlvbiAobWFza2VkRm9ybWF0SW5mbzEgLyppbnQqLywgbWFza2VkRm9ybWF0SW5mbzIgLyppbnQqLykgewoJICAgICAgICB2YXIgZm9ybWF0SW5mbyA9IEZvcm1hdEluZm9ybWF0aW9uLmRvRGVjb2RlRm9ybWF0SW5mb3JtYXRpb24obWFza2VkRm9ybWF0SW5mbzEsIG1hc2tlZEZvcm1hdEluZm8yKTsKCSAgICAgICAgaWYgKGZvcm1hdEluZm8gIT09IG51bGwpIHsKCSAgICAgICAgICAgIHJldHVybiBmb3JtYXRJbmZvOwoJICAgICAgICB9CgkgICAgICAgIC8vIFNob3VsZCByZXR1cm4gbnVsbCwgYnV0LCBzb21lIFFSIGNvZGVzIGFwcGFyZW50bHkKCSAgICAgICAgLy8gZG8gbm90IG1hc2sgdGhpcyBpbmZvLiBUcnkgYWdhaW4gYnkgYWN0dWFsbHkgbWFza2luZyB0aGUgcGF0dGVybgoJICAgICAgICAvLyBmaXJzdAoJICAgICAgICByZXR1cm4gRm9ybWF0SW5mb3JtYXRpb24uZG9EZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihtYXNrZWRGb3JtYXRJbmZvMSBeIEZvcm1hdEluZm9ybWF0aW9uLkZPUk1BVF9JTkZPX01BU0tfUVIsIG1hc2tlZEZvcm1hdEluZm8yIF4gRm9ybWF0SW5mb3JtYXRpb24uRk9STUFUX0lORk9fTUFTS19RUik7CgkgICAgfTsKCSAgICBGb3JtYXRJbmZvcm1hdGlvbi5kb0RlY29kZUZvcm1hdEluZm9ybWF0aW9uID0gZnVuY3Rpb24gKG1hc2tlZEZvcm1hdEluZm8xIC8qaW50Ki8sIG1hc2tlZEZvcm1hdEluZm8yIC8qaW50Ki8pIHsKCSAgICAgICAgdmFyIGVfMSwgX2E7CgkgICAgICAgIC8vIEZpbmQgdGhlIGludCBpbiBGT1JNQVRfSU5GT19ERUNPREVfTE9PS1VQIHdpdGggZmV3ZXN0IGJpdHMgZGlmZmVyaW5nCgkgICAgICAgIHZhciBiZXN0RGlmZmVyZW5jZSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSOwoJICAgICAgICB2YXIgYmVzdEZvcm1hdEluZm8gPSAwOwoJICAgICAgICB0cnkgewoJICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQ2KEZvcm1hdEluZm9ybWF0aW9uLkZPUk1BVF9JTkZPX0RFQ09ERV9MT09LVVApLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7CgkgICAgICAgICAgICAgICAgdmFyIGRlY29kZUluZm8gPSBfYy52YWx1ZTsKCSAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SW5mbyA9IGRlY29kZUluZm9bMF07CgkgICAgICAgICAgICAgICAgaWYgKHRhcmdldEluZm8gPT09IG1hc2tlZEZvcm1hdEluZm8xIHx8IHRhcmdldEluZm8gPT09IG1hc2tlZEZvcm1hdEluZm8yKSB7CgkgICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIGFuIGV4YWN0IG1hdGNoCgkgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybWF0SW5mb3JtYXRpb24oZGVjb2RlSW5mb1sxXSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIHZhciBiaXRzRGlmZmVyZW5jZSA9IEZvcm1hdEluZm9ybWF0aW9uLm51bUJpdHNEaWZmZXJpbmcobWFza2VkRm9ybWF0SW5mbzEsIHRhcmdldEluZm8pOwoJICAgICAgICAgICAgICAgIGlmIChiaXRzRGlmZmVyZW5jZSA8IGJlc3REaWZmZXJlbmNlKSB7CgkgICAgICAgICAgICAgICAgICAgIGJlc3RGb3JtYXRJbmZvID0gZGVjb2RlSW5mb1sxXTsKCSAgICAgICAgICAgICAgICAgICAgYmVzdERpZmZlcmVuY2UgPSBiaXRzRGlmZmVyZW5jZTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKG1hc2tlZEZvcm1hdEluZm8xICE9PSBtYXNrZWRGb3JtYXRJbmZvMikgewoJICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIHRyeSB0aGUgb3RoZXIgb3B0aW9uCgkgICAgICAgICAgICAgICAgICAgIGJpdHNEaWZmZXJlbmNlID0gRm9ybWF0SW5mb3JtYXRpb24ubnVtQml0c0RpZmZlcmluZyhtYXNrZWRGb3JtYXRJbmZvMiwgdGFyZ2V0SW5mbyk7CgkgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzRGlmZmVyZW5jZSA8IGJlc3REaWZmZXJlbmNlKSB7CgkgICAgICAgICAgICAgICAgICAgICAgICBiZXN0Rm9ybWF0SW5mbyA9IGRlY29kZUluZm9bMV07CgkgICAgICAgICAgICAgICAgICAgICAgICBiZXN0RGlmZmVyZW5jZSA9IGJpdHNEaWZmZXJlbmNlOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9CgkgICAgICAgIGZpbmFsbHkgewoJICAgICAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9CgkgICAgICAgIH0KCSAgICAgICAgLy8gSGFtbWluZyBkaXN0YW5jZSBvZiB0aGUgMzIgbWFza2VkIGNvZGVzIGlzIDcsIGJ5IGNvbnN0cnVjdGlvbiwgc28gPD0gMyBiaXRzCgkgICAgICAgIC8vIGRpZmZlcmluZyBtZWFucyB3ZSBmb3VuZCBhIG1hdGNoCgkgICAgICAgIGlmIChiZXN0RGlmZmVyZW5jZSA8PSAzKSB7CgkgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1hdEluZm9ybWF0aW9uKGJlc3RGb3JtYXRJbmZvKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gbnVsbDsKCSAgICB9OwoJICAgIEZvcm1hdEluZm9ybWF0aW9uLnByb3RvdHlwZS5nZXRFcnJvckNvcnJlY3Rpb25MZXZlbCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JDb3JyZWN0aW9uTGV2ZWw7CgkgICAgfTsKCSAgICBGb3JtYXRJbmZvcm1hdGlvbi5wcm90b3R5cGUuZ2V0RGF0YU1hc2sgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmRhdGFNYXNrOwoJICAgIH07CgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIEZvcm1hdEluZm9ybWF0aW9uLnByb3RvdHlwZS5oYXNoQ29kZSA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuICh0aGlzLmVycm9yQ29ycmVjdGlvbkxldmVsLmdldEJpdHMoKSA8PCAzKSB8IHRoaXMuZGF0YU1hc2s7CgkgICAgfTsKCSAgICAvKkBPdmVycmlkZSovCgkgICAgRm9ybWF0SW5mb3JtYXRpb24ucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChvKSB7CgkgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBGb3JtYXRJbmZvcm1hdGlvbikpIHsKCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgb3RoZXIgPSBvOwoJICAgICAgICByZXR1cm4gdGhpcy5lcnJvckNvcnJlY3Rpb25MZXZlbCA9PT0gb3RoZXIuZXJyb3JDb3JyZWN0aW9uTGV2ZWwgJiYKCSAgICAgICAgICAgIHRoaXMuZGF0YU1hc2sgPT09IG90aGVyLmRhdGFNYXNrOwoJICAgIH07CgkgICAgRm9ybWF0SW5mb3JtYXRpb24uRk9STUFUX0lORk9fTUFTS19RUiA9IDB4NTQxMjsKCSAgICAvKioKCSAgICAgKiBTZWUgSVNPIDE4MDA0OjIwMDYsIEFubmV4IEMsIFRhYmxlIEMuMQoJICAgICAqLwoJICAgIEZvcm1hdEluZm9ybWF0aW9uLkZPUk1BVF9JTkZPX0RFQ09ERV9MT09LVVAgPSBbCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg1NDEyLCAweDAwXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg1MTI1LCAweDAxXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg1RTdDLCAweDAyXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg1QjRCLCAweDAzXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg0NUY5LCAweDA0XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg0MENFLCAweDA1XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg0Rjk3LCAweDA2XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg0QUEwLCAweDA3XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg3N0M0LCAweDA4XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg3MkYzLCAweDA5XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg3REFBLCAweDBBXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg3ODlELCAweDBCXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg2NjJGLCAweDBDXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg2MzE4LCAweDBEXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg2QzQxLCAweDBFXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHg2OTc2LCAweDBGXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgxNjg5LCAweDEwXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgxM0JFLCAweDExXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgxQ0U3LCAweDEyXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgxOUQwLCAweDEzXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgwNzYyLCAweDE0XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgwMjU1LCAweDE1XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgwRDBDLCAweDE2XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgwODNCLCAweDE3XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgzNTVGLCAweDE4XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgzMDY4LCAweDE5XSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgzRjMxLCAweDFBXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgzQTA2LCAweDFCXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgyNEI0LCAweDFDXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgyMTgzLCAweDFEXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgyRURBLCAweDFFXSksCgkgICAgICAgIEludDMyQXJyYXkuZnJvbShbMHgyQkVELCAweDFGXSksCgkgICAgXTsKCSAgICByZXR1cm4gRm9ybWF0SW5mb3JtYXRpb247Cgl9KCkpOwoJRm9ybWF0SW5mb3JtYXRpb24kMS5kZWZhdWx0ID0gRm9ybWF0SW5mb3JtYXRpb247CgoJdmFyIEVDQmxvY2tzJDEgPSB7fTsKCgl2YXIgX192YWx1ZXMkNSA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykgewoJICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwOwoJICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pOwoJICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHJldHVybiB7CgkgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7CgkgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07CgkgICAgICAgIH0KCSAgICB9OwoJICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/ICJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLiIgOiAiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwoJfTsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShFQ0Jsb2NrcyQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgkvKioKCSAqIDxwPkVuY2Fwc3VsYXRlcyBhIHNldCBvZiBlcnJvci1jb3JyZWN0aW9uIGJsb2NrcyBpbiBvbmUgc3ltYm9sIHZlcnNpb24uIE1vc3QgdmVyc2lvbnMgd2lsbAoJICogdXNlIGJsb2NrcyBvZiBkaWZmZXJpbmcgc2l6ZXMgd2l0aGluIG9uZSB2ZXJzaW9uLCBzbywgdGhpcyBlbmNhcHN1bGF0ZXMgdGhlIHBhcmFtZXRlcnMgZm9yCgkgKiBlYWNoIHNldCBvZiBibG9ja3MuIEl0IGFsc28gaG9sZHMgdGhlIG51bWJlciBvZiBlcnJvci1jb3JyZWN0aW9uIGNvZGV3b3JkcyBwZXIgYmxvY2sgc2luY2UgaXQKCSAqIHdpbGwgYmUgdGhlIHNhbWUgYWNyb3NzIGFsbCBibG9ja3Mgd2l0aGluIG9uZSB2ZXJzaW9uLjwvcD4KCSAqLwoJdmFyIEVDQmxvY2tzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIGZ1bmN0aW9uIEVDQmxvY2tzKGVjQ29kZXdvcmRzUGVyQmxvY2sgLyppbnQqLykgewoJICAgICAgICB2YXIgZWNCbG9ja3MgPSBbXTsKCSAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKCSAgICAgICAgICAgIGVjQmxvY2tzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldOwoJICAgICAgICB9CgkgICAgICAgIHRoaXMuZWNDb2Rld29yZHNQZXJCbG9jayA9IGVjQ29kZXdvcmRzUGVyQmxvY2s7CgkgICAgICAgIHRoaXMuZWNCbG9ja3MgPSBlY0Jsb2NrczsKCSAgICB9CgkgICAgRUNCbG9ja3MucHJvdG90eXBlLmdldEVDQ29kZXdvcmRzUGVyQmxvY2sgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmVjQ29kZXdvcmRzUGVyQmxvY2s7CgkgICAgfTsKCSAgICBFQ0Jsb2Nrcy5wcm90b3R5cGUuZ2V0TnVtQmxvY2tzID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgZV8xLCBfYTsKCSAgICAgICAgdmFyIHRvdGFsID0gMDsKCSAgICAgICAgdmFyIGVjQmxvY2tzID0gdGhpcy5lY0Jsb2NrczsKCSAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgIGZvciAodmFyIGVjQmxvY2tzXzEgPSBfX3ZhbHVlcyQ1KGVjQmxvY2tzKSwgZWNCbG9ja3NfMV8xID0gZWNCbG9ja3NfMS5uZXh0KCk7ICFlY0Jsb2Nrc18xXzEuZG9uZTsgZWNCbG9ja3NfMV8xID0gZWNCbG9ja3NfMS5uZXh0KCkpIHsKCSAgICAgICAgICAgICAgICB2YXIgZWNCbG9jayA9IGVjQmxvY2tzXzFfMS52YWx1ZTsKCSAgICAgICAgICAgICAgICB0b3RhbCArPSBlY0Jsb2NrLmdldENvdW50KCk7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH0KCSAgICAgICAgZmluYWxseSB7CgkgICAgICAgICAgICB0cnkgewoJICAgICAgICAgICAgICAgIGlmIChlY0Jsb2Nrc18xXzEgJiYgIWVjQmxvY2tzXzFfMS5kb25lICYmIChfYSA9IGVjQmxvY2tzXzEucmV0dXJuKSkgX2EuY2FsbChlY0Jsb2Nrc18xKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gdG90YWw7CgkgICAgfTsKCSAgICBFQ0Jsb2Nrcy5wcm90b3R5cGUuZ2V0VG90YWxFQ0NvZGV3b3JkcyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuZWNDb2Rld29yZHNQZXJCbG9jayAqIHRoaXMuZ2V0TnVtQmxvY2tzKCk7CgkgICAgfTsKCSAgICBFQ0Jsb2Nrcy5wcm90b3R5cGUuZ2V0RUNCbG9ja3MgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmVjQmxvY2tzOwoJICAgIH07CgkgICAgcmV0dXJuIEVDQmxvY2tzOwoJfSgpKTsKCUVDQmxvY2tzJDEuZGVmYXVsdCA9IEVDQmxvY2tzOwoKCXZhciBFQ0IkMSA9IHt9OwoKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShFQ0IkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJLyoqCgkgKiA8cD5FbmNhcHN1bGF0ZXMgdGhlIHBhcmFtZXRlcnMgZm9yIG9uZSBlcnJvci1jb3JyZWN0aW9uIGJsb2NrIGluIG9uZSBzeW1ib2wgdmVyc2lvbi4KCSAqIFRoaXMgaW5jbHVkZXMgdGhlIG51bWJlciBvZiBkYXRhIGNvZGV3b3JkcywgYW5kIHRoZSBudW1iZXIgb2YgdGltZXMgYSBibG9jayB3aXRoIHRoZXNlCgkgKiBwYXJhbWV0ZXJzIGlzIHVzZWQgY29uc2VjdXRpdmVseSBpbiB0aGUgUVIgY29kZSB2ZXJzaW9uJ3MgZm9ybWF0LjwvcD4KCSAqLwoJdmFyIEVDQiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBFQ0IoY291bnQgLyppbnQqLywgZGF0YUNvZGV3b3JkcyAvKmludCovKSB7CgkgICAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKCSAgICAgICAgdGhpcy5kYXRhQ29kZXdvcmRzID0gZGF0YUNvZGV3b3JkczsKCSAgICB9CgkgICAgRUNCLnByb3RvdHlwZS5nZXRDb3VudCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuY291bnQ7CgkgICAgfTsKCSAgICBFQ0IucHJvdG90eXBlLmdldERhdGFDb2Rld29yZHMgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmRhdGFDb2Rld29yZHM7CgkgICAgfTsKCSAgICByZXR1cm4gRUNCOwoJfSgpKTsKCUVDQiQxLmRlZmF1bHQgPSBFQ0I7CgoJLyoKCSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCXZhciBfX3ZhbHVlcyQ0ID0gKGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7CgkgICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7CgkgICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7CgkgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgcmV0dXJuIHsKCSAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDsKCSAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gIk9iamVjdCBpcyBub3QgaXRlcmFibGUuIiA6ICJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIik7Cgl9OwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KFZlcnNpb24kMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJLypuYW1lc3BhY2UgY29tLmdvb2dsZS56eGluZy5xcmNvZGUuZGVjb2RlciB7Ki8KCXZhciBCaXRNYXRyaXhfMSQzID0gQml0TWF0cml4JDE7Cgl2YXIgRm9ybWF0SW5mb3JtYXRpb25fMSQxID0gRm9ybWF0SW5mb3JtYXRpb24kMTsKCXZhciBFQ0Jsb2Nrc18xID0gRUNCbG9ja3MkMTsKCXZhciBFQ0JfMSA9IEVDQiQxOwoJdmFyIEZvcm1hdEV4Y2VwdGlvbl8xJDIgPSBGb3JtYXRFeGNlcHRpb24kMTsKCXZhciBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSQyID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uJDE7CgkvKioKCSAqIFNlZSBJU08gMTgwMDQ6MjAwNiBBbm5leCBECgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIFZlcnNpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgZnVuY3Rpb24gVmVyc2lvbih2ZXJzaW9uTnVtYmVyIC8qaW50Ki8sIGFsaWdubWVudFBhdHRlcm5DZW50ZXJzKSB7CgkgICAgICAgIHZhciBlXzEsIF9hOwoJICAgICAgICB2YXIgZWNCbG9ja3MgPSBbXTsKCSAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKCSAgICAgICAgICAgIGVjQmxvY2tzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwoJICAgICAgICB9CgkgICAgICAgIHRoaXMudmVyc2lvbk51bWJlciA9IHZlcnNpb25OdW1iZXI7CgkgICAgICAgIHRoaXMuYWxpZ25tZW50UGF0dGVybkNlbnRlcnMgPSBhbGlnbm1lbnRQYXR0ZXJuQ2VudGVyczsKCSAgICAgICAgdGhpcy5lY0Jsb2NrcyA9IGVjQmxvY2tzOwoJICAgICAgICB2YXIgdG90YWwgPSAwOwoJICAgICAgICB2YXIgZWNDb2Rld29yZHMgPSBlY0Jsb2Nrc1swXS5nZXRFQ0NvZGV3b3Jkc1BlckJsb2NrKCk7CgkgICAgICAgIHZhciBlY2JBcnJheSA9IGVjQmxvY2tzWzBdLmdldEVDQmxvY2tzKCk7CgkgICAgICAgIHRyeSB7CgkgICAgICAgICAgICBmb3IgKHZhciBlY2JBcnJheV8xID0gX192YWx1ZXMkNChlY2JBcnJheSksIGVjYkFycmF5XzFfMSA9IGVjYkFycmF5XzEubmV4dCgpOyAhZWNiQXJyYXlfMV8xLmRvbmU7IGVjYkFycmF5XzFfMSA9IGVjYkFycmF5XzEubmV4dCgpKSB7CgkgICAgICAgICAgICAgICAgdmFyIGVjQmxvY2sgPSBlY2JBcnJheV8xXzEudmFsdWU7CgkgICAgICAgICAgICAgICAgdG90YWwgKz0gZWNCbG9jay5nZXRDb3VudCgpICogKGVjQmxvY2suZ2V0RGF0YUNvZGV3b3JkcygpICsgZWNDb2Rld29yZHMpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9CgkgICAgICAgIGZpbmFsbHkgewoJICAgICAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgICAgICBpZiAoZWNiQXJyYXlfMV8xICYmICFlY2JBcnJheV8xXzEuZG9uZSAmJiAoX2EgPSBlY2JBcnJheV8xLnJldHVybikpIF9hLmNhbGwoZWNiQXJyYXlfMSk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9CgkgICAgICAgIH0KCSAgICAgICAgdGhpcy50b3RhbENvZGV3b3JkcyA9IHRvdGFsOwoJICAgIH0KCSAgICBWZXJzaW9uLnByb3RvdHlwZS5nZXRWZXJzaW9uTnVtYmVyID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uTnVtYmVyOwoJICAgIH07CgkgICAgVmVyc2lvbi5wcm90b3R5cGUuZ2V0QWxpZ25tZW50UGF0dGVybkNlbnRlcnMgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmFsaWdubWVudFBhdHRlcm5DZW50ZXJzOwoJICAgIH07CgkgICAgVmVyc2lvbi5wcm90b3R5cGUuZ2V0VG90YWxDb2Rld29yZHMgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLnRvdGFsQ29kZXdvcmRzOwoJICAgIH07CgkgICAgVmVyc2lvbi5wcm90b3R5cGUuZ2V0RGltZW5zaW9uRm9yVmVyc2lvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIDE3ICsgNCAqIHRoaXMudmVyc2lvbk51bWJlcjsKCSAgICB9OwoJICAgIFZlcnNpb24ucHJvdG90eXBlLmdldEVDQmxvY2tzRm9yTGV2ZWwgPSBmdW5jdGlvbiAoZWNMZXZlbCkgewoJICAgICAgICByZXR1cm4gdGhpcy5lY0Jsb2Nrc1tlY0xldmVsLmdldFZhbHVlKCldOwoJICAgICAgICAvLyBUWVBFU0NSSVBUUE9SVDogb3JpZ2luYWwgd2FzIHVzaW5nIG9yZGluYWwsIGFuZCB1c2luZyB0aGUgb3JkZXIgb2YgbGV2ZWxzIGFzIGRlZmluZWQgaW4gRXJyb3JDb3JyZWN0aW9uTGV2ZWwgZW51bSAoTE1RSCkKCSAgICAgICAgLy8gSSB3aWxsIHVzZSB0aGUgZGlyZWN0IHZhbHVlIGZyb20gRXJyb3JDb3JyZWN0aW9uTGV2ZWxWYWx1ZXMgZW51bSB3aGljaCBpbiB0eXBlc2NyaXB0IGdvZXMgdG8gYSBudW1iZXIKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIDxwPkRlZHVjZXMgdmVyc2lvbiBpbmZvcm1hdGlvbiBwdXJlbHkgZnJvbSBRUiBDb2RlIGRpbWVuc2lvbnMuPC9wPgoJICAgICAqCgkgICAgICogQHBhcmFtIGRpbWVuc2lvbiBkaW1lbnNpb24gaW4gbW9kdWxlcwoJICAgICAqIEByZXR1cm4gVmVyc2lvbiBmb3IgYSBRUiBDb2RlIG9mIHRoYXQgZGltZW5zaW9uCgkgICAgICogQHRocm93cyBGb3JtYXRFeGNlcHRpb24gaWYgZGltZW5zaW9uIGlzIG5vdCAxIG1vZCA0CgkgICAgICovCgkgICAgVmVyc2lvbi5nZXRQcm92aXNpb25hbFZlcnNpb25Gb3JEaW1lbnNpb24gPSBmdW5jdGlvbiAoZGltZW5zaW9uIC8qaW50Ki8pIHsKCSAgICAgICAgaWYgKGRpbWVuc2lvbiAlIDQgIT09IDEpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb25fMSQyLmRlZmF1bHQoKTsKCSAgICAgICAgfQoJICAgICAgICB0cnkgewoJICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmVyc2lvbkZvck51bWJlcigoZGltZW5zaW9uIC0gMTcpIC8gNCk7CgkgICAgICAgIH0KCSAgICAgICAgY2F0Y2ggKGlnbm9yZWQgLyo6IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiovKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEkMi5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICB9OwoJICAgIFZlcnNpb24uZ2V0VmVyc2lvbkZvck51bWJlciA9IGZ1bmN0aW9uICh2ZXJzaW9uTnVtYmVyIC8qaW50Ki8pIHsKCSAgICAgICAgaWYgKHZlcnNpb25OdW1iZXIgPCAxIHx8IHZlcnNpb25OdW1iZXIgPiA0MCkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDIuZGVmYXVsdCgpOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBWZXJzaW9uLlZFUlNJT05TW3ZlcnNpb25OdW1iZXIgLSAxXTsKCSAgICB9OwoJICAgIFZlcnNpb24uZGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uID0gZnVuY3Rpb24gKHZlcnNpb25CaXRzIC8qaW50Ki8pIHsKCSAgICAgICAgdmFyIGJlc3REaWZmZXJlbmNlID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7CgkgICAgICAgIHZhciBiZXN0VmVyc2lvbiA9IDA7CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgVmVyc2lvbi5WRVJTSU9OX0RFQ09ERV9JTkZPLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgdGFyZ2V0VmVyc2lvbiA9IFZlcnNpb24uVkVSU0lPTl9ERUNPREVfSU5GT1tpXTsKCSAgICAgICAgICAgIC8vIERvIHRoZSB2ZXJzaW9uIGluZm8gYml0cyBtYXRjaCBleGFjdGx5PyBkb25lLgoJICAgICAgICAgICAgaWYgKHRhcmdldFZlcnNpb24gPT09IHZlcnNpb25CaXRzKSB7CgkgICAgICAgICAgICAgICAgcmV0dXJuIFZlcnNpb24uZ2V0VmVyc2lvbkZvck51bWJlcihpICsgNyk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICAvLyBPdGhlcndpc2Ugc2VlIGlmIHRoaXMgaXMgdGhlIGNsb3Nlc3QgdG8gYSByZWFsIHZlcnNpb24gaW5mbyBiaXQgc3RyaW5nCgkgICAgICAgICAgICAvLyB3ZSBoYXZlIHNlZW4gc28gZmFyCgkgICAgICAgICAgICB2YXIgYml0c0RpZmZlcmVuY2UgPSBGb3JtYXRJbmZvcm1hdGlvbl8xJDEuZGVmYXVsdC5udW1CaXRzRGlmZmVyaW5nKHZlcnNpb25CaXRzLCB0YXJnZXRWZXJzaW9uKTsKCSAgICAgICAgICAgIGlmIChiaXRzRGlmZmVyZW5jZSA8IGJlc3REaWZmZXJlbmNlKSB7CgkgICAgICAgICAgICAgICAgYmVzdFZlcnNpb24gPSBpICsgNzsKCSAgICAgICAgICAgICAgICBiZXN0RGlmZmVyZW5jZSA9IGJpdHNEaWZmZXJlbmNlOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIC8vIFdlIGNhbiB0b2xlcmF0ZSB1cCB0byAzIGJpdHMgb2YgZXJyb3Igc2luY2Ugbm8gdHdvIHZlcnNpb24gaW5mbyBjb2Rld29yZHMgd2lsbAoJICAgICAgICAvLyBkaWZmZXIgaW4gbGVzcyB0aGFuIDggYml0cy4KCSAgICAgICAgaWYgKGJlc3REaWZmZXJlbmNlIDw9IDMpIHsKCSAgICAgICAgICAgIHJldHVybiBWZXJzaW9uLmdldFZlcnNpb25Gb3JOdW1iZXIoYmVzdFZlcnNpb24pOwoJICAgICAgICB9CgkgICAgICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGEgY2xvc2UgZW5vdWdoIG1hdGNoLCBmYWlsCgkgICAgICAgIHJldHVybiBudWxsOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogU2VlIElTTyAxODAwNDoyMDA2IEFubmV4IEUKCSAgICAgKi8KCSAgICBWZXJzaW9uLnByb3RvdHlwZS5idWlsZEZ1bmN0aW9uUGF0dGVybiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuZ2V0RGltZW5zaW9uRm9yVmVyc2lvbigpOwoJICAgICAgICB2YXIgYml0TWF0cml4ID0gbmV3IEJpdE1hdHJpeF8xJDMuZGVmYXVsdChkaW1lbnNpb24pOwoJICAgICAgICAvLyBUb3AgbGVmdCBmaW5kZXIgcGF0dGVybiArIHNlcGFyYXRvciArIGZvcm1hdAoJICAgICAgICBiaXRNYXRyaXguc2V0UmVnaW9uKDAsIDAsIDksIDkpOwoJICAgICAgICAvLyBUb3AgcmlnaHQgZmluZGVyIHBhdHRlcm4gKyBzZXBhcmF0b3IgKyBmb3JtYXQKCSAgICAgICAgYml0TWF0cml4LnNldFJlZ2lvbihkaW1lbnNpb24gLSA4LCAwLCA4LCA5KTsKCSAgICAgICAgLy8gQm90dG9tIGxlZnQgZmluZGVyIHBhdHRlcm4gKyBzZXBhcmF0b3IgKyBmb3JtYXQKCSAgICAgICAgYml0TWF0cml4LnNldFJlZ2lvbigwLCBkaW1lbnNpb24gLSA4LCA5LCA4KTsKCSAgICAgICAgLy8gQWxpZ25tZW50IHBhdHRlcm5zCgkgICAgICAgIHZhciBtYXggPSB0aGlzLmFsaWdubWVudFBhdHRlcm5DZW50ZXJzLmxlbmd0aDsKCSAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBtYXg7IHgrKykgewoJICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmFsaWdubWVudFBhdHRlcm5DZW50ZXJzW3hdIC0gMjsKCSAgICAgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgbWF4OyB5KyspIHsKCSAgICAgICAgICAgICAgICBpZiAoKHggPT09IDAgJiYgKHkgPT09IDAgfHwgeSA9PT0gbWF4IC0gMSkpIHx8ICh4ID09PSBtYXggLSAxICYmIHkgPT09IDApKSB7CgkgICAgICAgICAgICAgICAgICAgIC8vIE5vIGFsaWdubWVudCBwYXR0ZXJucyBuZWFyIHRoZSB0aHJlZSBmaW5kZXIgcGF0dGVybnMKCSAgICAgICAgICAgICAgICAgICAgY29udGludWU7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIGJpdE1hdHJpeC5zZXRSZWdpb24odGhpcy5hbGlnbm1lbnRQYXR0ZXJuQ2VudGVyc1t5XSAtIDIsIGksIDUsIDUpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIC8vIFZlcnRpY2FsIHRpbWluZyBwYXR0ZXJuCgkgICAgICAgIGJpdE1hdHJpeC5zZXRSZWdpb24oNiwgOSwgMSwgZGltZW5zaW9uIC0gMTcpOwoJICAgICAgICAvLyBIb3Jpem9udGFsIHRpbWluZyBwYXR0ZXJuCgkgICAgICAgIGJpdE1hdHJpeC5zZXRSZWdpb24oOSwgNiwgZGltZW5zaW9uIC0gMTcsIDEpOwoJICAgICAgICBpZiAodGhpcy52ZXJzaW9uTnVtYmVyID4gNikgewoJICAgICAgICAgICAgLy8gVmVyc2lvbiBpbmZvLCB0b3AgcmlnaHQKCSAgICAgICAgICAgIGJpdE1hdHJpeC5zZXRSZWdpb24oZGltZW5zaW9uIC0gMTEsIDAsIDMsIDYpOwoJICAgICAgICAgICAgLy8gVmVyc2lvbiBpbmZvLCBib3R0b20gbGVmdAoJICAgICAgICAgICAgYml0TWF0cml4LnNldFJlZ2lvbigwLCBkaW1lbnNpb24gLSAxMSwgNiwgMyk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIGJpdE1hdHJpeDsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBWZXJzaW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuICcnICsgdGhpcy52ZXJzaW9uTnVtYmVyOwoJICAgIH07CgkgICAgLyoqCgkgICAgICAgKiBTZWUgSVNPIDE4MDA0OjIwMDYgQW5uZXggRC4KCSAgICAgICAqIEVsZW1lbnQgaSByZXByZXNlbnRzIHRoZSByYXcgdmVyc2lvbiBiaXRzIHRoYXQgc3BlY2lmeSB2ZXJzaW9uIGkgKyA3CgkgICAgICAgKi8KCSAgICBWZXJzaW9uLlZFUlNJT05fREVDT0RFX0lORk8gPSBJbnQzMkFycmF5LmZyb20oWwoJICAgICAgICAweDA3Qzk0LCAweDA4NUJDLCAweDA5QTk5LCAweDBBNEQzLCAweDBCQkY2LAoJICAgICAgICAweDBDNzYyLCAweDBEODQ3LCAweDBFNjBELCAweDBGOTI4LCAweDEwQjc4LAoJICAgICAgICAweDExNDVELCAweDEyQTE3LCAweDEzNTMyLCAweDE0OUE2LCAweDE1NjgzLAoJICAgICAgICAweDE2OEM5LCAweDE3N0VDLCAweDE4RUM0LCAweDE5MUUxLCAweDFBRkFCLAoJICAgICAgICAweDFCMDhFLCAweDFDQzFBLCAweDFEMzNGLCAweDFFRDc1LCAweDFGMjUwLAoJICAgICAgICAweDIwOUQ1LCAweDIxNkYwLCAweDIyOEJBLCAweDIzNzlGLCAweDI0QjBCLAoJICAgICAgICAweDI1NDJFLCAweDI2QTY0LCAweDI3NTQxLCAweDI4QzY5CgkgICAgXSk7CgkgICAgLyoqCgkgICAgICAgKiBTZWUgSVNPIDE4MDA0OjIwMDYgNi41LjEgVGFibGUgOQoJICAgICAgICovCgkgICAgVmVyc2lvbi5WRVJTSU9OUyA9IFsKCSAgICAgICAgbmV3IFZlcnNpb24oMSwgbmV3IEludDMyQXJyYXkoMCksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoNywgbmV3IEVDQl8xLmRlZmF1bHQoMSwgMTkpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgxMCwgbmV3IEVDQl8xLmRlZmF1bHQoMSwgMTYpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgxMywgbmV3IEVDQl8xLmRlZmF1bHQoMSwgMTMpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgxNywgbmV3IEVDQl8xLmRlZmF1bHQoMSwgOSkpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oMiwgSW50MzJBcnJheS5mcm9tKFs2LCAxOF0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDEwLCBuZXcgRUNCXzEuZGVmYXVsdCgxLCAzNCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDE2LCBuZXcgRUNCXzEuZGVmYXVsdCgxLCAyOCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDIyLCBuZXcgRUNCXzEuZGVmYXVsdCgxLCAyMikpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI4LCBuZXcgRUNCXzEuZGVmYXVsdCgxLCAxNikpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oMywgSW50MzJBcnJheS5mcm9tKFs2LCAyMl0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDE1LCBuZXcgRUNCXzEuZGVmYXVsdCgxLCA1NSkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI2LCBuZXcgRUNCXzEuZGVmYXVsdCgxLCA0NCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDE4LCBuZXcgRUNCXzEuZGVmYXVsdCgyLCAxNykpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDIyLCBuZXcgRUNCXzEuZGVmYXVsdCgyLCAxMykpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oNCwgSW50MzJBcnJheS5mcm9tKFs2LCAyNl0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDIwLCBuZXcgRUNCXzEuZGVmYXVsdCgxLCA4MCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDE4LCBuZXcgRUNCXzEuZGVmYXVsdCgyLCAzMikpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI2LCBuZXcgRUNCXzEuZGVmYXVsdCgyLCAyNCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDE2LCBuZXcgRUNCXzEuZGVmYXVsdCg0LCA5KSkpLAoJICAgICAgICBuZXcgVmVyc2lvbig1LCBJbnQzMkFycmF5LmZyb20oWzYsIDMwXSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjYsIG5ldyBFQ0JfMS5kZWZhdWx0KDEsIDEwOCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI0LCBuZXcgRUNCXzEuZGVmYXVsdCgyLCA0MykpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDE4LCBuZXcgRUNCXzEuZGVmYXVsdCgyLCAxNSksIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDE2KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjIsIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDExKSwgbmV3IEVDQl8xLmRlZmF1bHQoMiwgMTIpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDYsIEludDMyQXJyYXkuZnJvbShbNiwgMzRdKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgxOCwgbmV3IEVDQl8xLmRlZmF1bHQoMiwgNjgpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgxNiwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMjcpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyNCwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTkpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTUpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDcsIEludDMyQXJyYXkuZnJvbShbNiwgMjIsIDM4XSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjAsIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDc4KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMTgsIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDMxKSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMTgsIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDE0KSwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTUpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyNiwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTMpLCBuZXcgRUNCXzEuZGVmYXVsdCgxLCAxNCkpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oOCwgSW50MzJBcnJheS5mcm9tKFs2LCAyNCwgNDJdKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyNCwgbmV3IEVDQl8xLmRlZmF1bHQoMiwgOTcpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyMiwgbmV3IEVDQl8xLmRlZmF1bHQoMiwgMzgpLCBuZXcgRUNCXzEuZGVmYXVsdCgyLCAzOSkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDIyLCBuZXcgRUNCXzEuZGVmYXVsdCg0LCAxOCksIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDE5KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjYsIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDE0KSwgbmV3IEVDQl8xLmRlZmF1bHQoMiwgMTUpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDksIEludDMyQXJyYXkuZnJvbShbNiwgMjYsIDQ2XSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDExNikpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDIyLCBuZXcgRUNCXzEuZGVmYXVsdCgzLCAzNiksIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDM3KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjAsIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDE2KSwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTcpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyNCwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTIpLCBuZXcgRUNCXzEuZGVmYXVsdCg0LCAxMykpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oMTAsIEludDMyQXJyYXkuZnJvbShbNiwgMjgsIDUwXSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMTgsIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDY4KSwgbmV3IEVDQl8xLmRlZmF1bHQoMiwgNjkpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyNiwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgNDMpLCBuZXcgRUNCXzEuZGVmYXVsdCgxLCA0NCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI0LCBuZXcgRUNCXzEuZGVmYXVsdCg2LCAxOSksIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDIwKSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDYsIDE1KSwgbmV3IEVDQl8xLmRlZmF1bHQoMiwgMTYpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDExLCBJbnQzMkFycmF5LmZyb20oWzYsIDMwLCA1NF0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDIwLCBuZXcgRUNCXzEuZGVmYXVsdCg0LCA4MSkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCgxLCA1MCksIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDUxKSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDIyKSwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMjMpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyNCwgbmV3IEVDQl8xLmRlZmF1bHQoMywgMTIpLCBuZXcgRUNCXzEuZGVmYXVsdCg4LCAxMykpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oMTIsIEludDMyQXJyYXkuZnJvbShbNiwgMzIsIDU4XSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjQsIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDkyKSwgbmV3IEVDQl8xLmRlZmF1bHQoMiwgOTMpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyMiwgbmV3IEVDQl8xLmRlZmF1bHQoNiwgMzYpLCBuZXcgRUNCXzEuZGVmYXVsdCgyLCAzNykpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI2LCBuZXcgRUNCXzEuZGVmYXVsdCg0LCAyMCksIG5ldyBFQ0JfMS5kZWZhdWx0KDYsIDIxKSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDcsIDE0KSwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTUpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDEzLCBJbnQzMkFycmF5LmZyb20oWzYsIDM0LCA2Ml0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI2LCBuZXcgRUNCXzEuZGVmYXVsdCg0LCAxMDcpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyMiwgbmV3IEVDQl8xLmRlZmF1bHQoOCwgMzcpLCBuZXcgRUNCXzEuZGVmYXVsdCgxLCAzOCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI0LCBuZXcgRUNCXzEuZGVmYXVsdCg4LCAyMCksIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDIxKSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjIsIG5ldyBFQ0JfMS5kZWZhdWx0KDEyLCAxMSksIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDEyKSkpLAoJICAgICAgICBuZXcgVmVyc2lvbigxNCwgSW50MzJBcnJheS5mcm9tKFs2LCAyNiwgNDYsIDY2XSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDMsIDExNSksIG5ldyBFQ0JfMS5kZWZhdWx0KDEsIDExNikpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI0LCBuZXcgRUNCXzEuZGVmYXVsdCg0LCA0MCksIG5ldyBFQ0JfMS5kZWZhdWx0KDUsIDQxKSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjAsIG5ldyBFQ0JfMS5kZWZhdWx0KDExLCAxNiksIG5ldyBFQ0JfMS5kZWZhdWx0KDUsIDE3KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjQsIG5ldyBFQ0JfMS5kZWZhdWx0KDExLCAxMiksIG5ldyBFQ0JfMS5kZWZhdWx0KDUsIDEzKSkpLAoJICAgICAgICBuZXcgVmVyc2lvbigxNSwgSW50MzJBcnJheS5mcm9tKFs2LCAyNiwgNDgsIDcwXSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjIsIG5ldyBFQ0JfMS5kZWZhdWx0KDUsIDg3KSwgbmV3IEVDQl8xLmRlZmF1bHQoMSwgODgpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyNCwgbmV3IEVDQl8xLmRlZmF1bHQoNSwgNDEpLCBuZXcgRUNCXzEuZGVmYXVsdCg1LCA0MikpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCg1LCAyNCksIG5ldyBFQ0JfMS5kZWZhdWx0KDcsIDI1KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjQsIG5ldyBFQ0JfMS5kZWZhdWx0KDExLCAxMiksIG5ldyBFQ0JfMS5kZWZhdWx0KDcsIDEzKSkpLAoJICAgICAgICBuZXcgVmVyc2lvbigxNiwgSW50MzJBcnJheS5mcm9tKFs2LCAyNiwgNTAsIDc0XSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjQsIG5ldyBFQ0JfMS5kZWZhdWx0KDUsIDk4KSwgbmV3IEVDQl8xLmRlZmF1bHQoMSwgOTkpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoNywgNDUpLCBuZXcgRUNCXzEuZGVmYXVsdCgzLCA0NikpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI0LCBuZXcgRUNCXzEuZGVmYXVsdCgxNSwgMTkpLCBuZXcgRUNCXzEuZGVmYXVsdCgyLCAyMCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCgzLCAxNSksIG5ldyBFQ0JfMS5kZWZhdWx0KDEzLCAxNikpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oMTcsIEludDMyQXJyYXkuZnJvbShbNiwgMzAsIDU0LCA3OF0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI4LCBuZXcgRUNCXzEuZGVmYXVsdCgxLCAxMDcpLCBuZXcgRUNCXzEuZGVmYXVsdCg1LCAxMDgpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMTAsIDQ2KSwgbmV3IEVDQl8xLmRlZmF1bHQoMSwgNDcpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMSwgMjIpLCBuZXcgRUNCXzEuZGVmYXVsdCgxNSwgMjMpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMiwgMTQpLCBuZXcgRUNCXzEuZGVmYXVsdCgxNywgMTUpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDE4LCBJbnQzMkFycmF5LmZyb20oWzYsIDMwLCA1NiwgODJdKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoNSwgMTIwKSwgbmV3IEVDQl8xLmRlZmF1bHQoMSwgMTIxKSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjYsIG5ldyBFQ0JfMS5kZWZhdWx0KDksIDQzKSwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgNDQpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMTcsIDIyKSwgbmV3IEVDQl8xLmRlZmF1bHQoMSwgMjMpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMiwgMTQpLCBuZXcgRUNCXzEuZGVmYXVsdCgxOSwgMTUpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDE5LCBJbnQzMkFycmF5LmZyb20oWzYsIDMwLCA1OCwgODZdKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMywgMTEzKSwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTE0KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjYsIG5ldyBFQ0JfMS5kZWZhdWx0KDMsIDQ0KSwgbmV3IEVDQl8xLmRlZmF1bHQoMTEsIDQ1KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjYsIG5ldyBFQ0JfMS5kZWZhdWx0KDE3LCAyMSksIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDIyKSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjYsIG5ldyBFQ0JfMS5kZWZhdWx0KDksIDEzKSwgbmV3IEVDQl8xLmRlZmF1bHQoMTYsIDE0KSkpLAoJICAgICAgICBuZXcgVmVyc2lvbigyMCwgSW50MzJBcnJheS5mcm9tKFs2LCAzNCwgNjIsIDkwXSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDMsIDEwNyksIG5ldyBFQ0JfMS5kZWZhdWx0KDUsIDEwOCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI2LCBuZXcgRUNCXzEuZGVmYXVsdCgzLCA0MSksIG5ldyBFQ0JfMS5kZWZhdWx0KDEzLCA0MikpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCgxNSwgMjQpLCBuZXcgRUNCXzEuZGVmYXVsdCg1LCAyNSkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI4LCBuZXcgRUNCXzEuZGVmYXVsdCgxNSwgMTUpLCBuZXcgRUNCXzEuZGVmYXVsdCgxMCwgMTYpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDIxLCBJbnQzMkFycmF5LmZyb20oWzYsIDI4LCA1MCwgNzIsIDk0XSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDExNiksIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDExNykpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI2LCBuZXcgRUNCXzEuZGVmYXVsdCgxNywgNDIpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMTcsIDIyKSwgbmV3IEVDQl8xLmRlZmF1bHQoNiwgMjMpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMTksIDE2KSwgbmV3IEVDQl8xLmRlZmF1bHQoNiwgMTcpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDIyLCBJbnQzMkFycmF5LmZyb20oWzYsIDI2LCA1MCwgNzQsIDk4XSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDExMSksIG5ldyBFQ0JfMS5kZWZhdWx0KDcsIDExMikpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI4LCBuZXcgRUNCXzEuZGVmYXVsdCgxNywgNDYpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoNywgMjQpLCBuZXcgRUNCXzEuZGVmYXVsdCgxNiwgMjUpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyNCwgbmV3IEVDQl8xLmRlZmF1bHQoMzQsIDEzKSkpLAoJICAgICAgICBuZXcgVmVyc2lvbigyMywgSW50MzJBcnJheS5mcm9tKFs2LCAzMCwgNTQsIDc4LCAxMDJdKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTIxKSwgbmV3IEVDQl8xLmRlZmF1bHQoNSwgMTIyKSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDQ3KSwgbmV3IEVDQl8xLmRlZmF1bHQoMTQsIDQ4KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDExLCAyNCksIG5ldyBFQ0JfMS5kZWZhdWx0KDE0LCAyNSkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCgxNiwgMTUpLCBuZXcgRUNCXzEuZGVmYXVsdCgxNCwgMTYpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDI0LCBJbnQzMkFycmF5LmZyb20oWzYsIDI4LCA1NCwgODAsIDEwNl0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCg2LCAxMTcpLCBuZXcgRUNCXzEuZGVmYXVsdCg0LCAxMTgpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoNiwgNDUpLCBuZXcgRUNCXzEuZGVmYXVsdCgxNCwgNDYpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMTEsIDI0KSwgbmV3IEVDQl8xLmRlZmF1bHQoMTYsIDI1KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDMwLCAxNiksIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDE3KSkpLAoJICAgICAgICBuZXcgVmVyc2lvbigyNSwgSW50MzJBcnJheS5mcm9tKFs2LCAzMiwgNTgsIDg0LCAxMTBdKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyNiwgbmV3IEVDQl8xLmRlZmF1bHQoOCwgMTA2KSwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTA3KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDgsIDQ3KSwgbmV3IEVDQl8xLmRlZmF1bHQoMTMsIDQ4KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDcsIDI0KSwgbmV3IEVDQl8xLmRlZmF1bHQoMjIsIDI1KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDIyLCAxNSksIG5ldyBFQ0JfMS5kZWZhdWx0KDEzLCAxNikpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oMjYsIEludDMyQXJyYXkuZnJvbShbNiwgMzAsIDU4LCA4NiwgMTE0XSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDEwLCAxMTQpLCBuZXcgRUNCXzEuZGVmYXVsdCgyLCAxMTUpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMTksIDQ2KSwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgNDcpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMjgsIDIyKSwgbmV3IEVDQl8xLmRlZmF1bHQoNiwgMjMpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMzMsIDE2KSwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTcpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDI3LCBJbnQzMkFycmF5LmZyb20oWzYsIDM0LCA2MiwgOTAsIDExOF0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCg4LCAxMjIpLCBuZXcgRUNCXzEuZGVmYXVsdCg0LCAxMjMpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMjIsIDQ1KSwgbmV3IEVDQl8xLmRlZmF1bHQoMywgNDYpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoOCwgMjMpLCBuZXcgRUNCXzEuZGVmYXVsdCgyNiwgMjQpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMTIsIDE1KSwgbmV3IEVDQl8xLmRlZmF1bHQoMjgsIDE2KSkpLAoJICAgICAgICBuZXcgVmVyc2lvbigyOCwgSW50MzJBcnJheS5mcm9tKFs2LCAyNiwgNTAsIDc0LCA5OCwgMTIyXSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDMsIDExNyksIG5ldyBFQ0JfMS5kZWZhdWx0KDEwLCAxMTgpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMywgNDUpLCBuZXcgRUNCXzEuZGVmYXVsdCgyMywgNDYpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMjQpLCBuZXcgRUNCXzEuZGVmYXVsdCgzMSwgMjUpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMTEsIDE1KSwgbmV3IEVDQl8xLmRlZmF1bHQoMzEsIDE2KSkpLAoJICAgICAgICBuZXcgVmVyc2lvbigyOSwgSW50MzJBcnJheS5mcm9tKFs2LCAzMCwgNTQsIDc4LCAxMDIsIDEyNl0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCg3LCAxMTYpLCBuZXcgRUNCXzEuZGVmYXVsdCg3LCAxMTcpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMjEsIDQ1KSwgbmV3IEVDQl8xLmRlZmF1bHQoNywgNDYpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMSwgMjMpLCBuZXcgRUNCXzEuZGVmYXVsdCgzNywgMjQpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMTksIDE1KSwgbmV3IEVDQl8xLmRlZmF1bHQoMjYsIDE2KSkpLAoJICAgICAgICBuZXcgVmVyc2lvbigzMCwgSW50MzJBcnJheS5mcm9tKFs2LCAyNiwgNTIsIDc4LCAxMDQsIDEzMF0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCg1LCAxMTUpLCBuZXcgRUNCXzEuZGVmYXVsdCgxMCwgMTE2KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDE5LCA0NyksIG5ldyBFQ0JfMS5kZWZhdWx0KDEwLCA0OCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCgxNSwgMjQpLCBuZXcgRUNCXzEuZGVmYXVsdCgyNSwgMjUpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMjMsIDE1KSwgbmV3IEVDQl8xLmRlZmF1bHQoMjUsIDE2KSkpLAoJICAgICAgICBuZXcgVmVyc2lvbigzMSwgSW50MzJBcnJheS5mcm9tKFs2LCAzMCwgNTYsIDgyLCAxMDgsIDEzNF0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCgxMywgMTE1KSwgbmV3IEVDQl8xLmRlZmF1bHQoMywgMTE2KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDIsIDQ2KSwgbmV3IEVDQl8xLmRlZmF1bHQoMjksIDQ3KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDQyLCAyNCksIG5ldyBFQ0JfMS5kZWZhdWx0KDEsIDI1KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDIzLCAxNSksIG5ldyBFQ0JfMS5kZWZhdWx0KDI4LCAxNikpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oMzIsIEludDMyQXJyYXkuZnJvbShbNiwgMzQsIDYwLCA4NiwgMTEyLCAxMzhdKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMTcsIDExNSkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI4LCBuZXcgRUNCXzEuZGVmYXVsdCgxMCwgNDYpLCBuZXcgRUNCXzEuZGVmYXVsdCgyMywgNDcpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMTAsIDI0KSwgbmV3IEVDQl8xLmRlZmF1bHQoMzUsIDI1KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDE5LCAxNSksIG5ldyBFQ0JfMS5kZWZhdWx0KDM1LCAxNikpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oMzMsIEludDMyQXJyYXkuZnJvbShbNiwgMzAsIDU4LCA4NiwgMTE0LCAxNDJdKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMTcsIDExNSksIG5ldyBFQ0JfMS5kZWZhdWx0KDEsIDExNikpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI4LCBuZXcgRUNCXzEuZGVmYXVsdCgxNCwgNDYpLCBuZXcgRUNCXzEuZGVmYXVsdCgyMSwgNDcpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMjksIDI0KSwgbmV3IEVDQl8xLmRlZmF1bHQoMTksIDI1KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDExLCAxNSksIG5ldyBFQ0JfMS5kZWZhdWx0KDQ2LCAxNikpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oMzQsIEludDMyQXJyYXkuZnJvbShbNiwgMzQsIDYyLCA5MCwgMTE4LCAxNDZdKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMTMsIDExNSksIG5ldyBFQ0JfMS5kZWZhdWx0KDYsIDExNikpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI4LCBuZXcgRUNCXzEuZGVmYXVsdCgxNCwgNDYpLCBuZXcgRUNCXzEuZGVmYXVsdCgyMywgNDcpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoNDQsIDI0KSwgbmV3IEVDQl8xLmRlZmF1bHQoNywgMjUpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoNTksIDE2KSwgbmV3IEVDQl8xLmRlZmF1bHQoMSwgMTcpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDM1LCBJbnQzMkFycmF5LmZyb20oWzYsIDMwLCA1NCwgNzgsIDEwMiwgMTI2LCAxNTBdKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMTIsIDEyMSksIG5ldyBFQ0JfMS5kZWZhdWx0KDcsIDEyMikpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI4LCBuZXcgRUNCXzEuZGVmYXVsdCgxMiwgNDcpLCBuZXcgRUNCXzEuZGVmYXVsdCgyNiwgNDgpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMzksIDI0KSwgbmV3IEVDQl8xLmRlZmF1bHQoMTQsIDI1KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDIyLCAxNSksIG5ldyBFQ0JfMS5kZWZhdWx0KDQxLCAxNikpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oMzYsIEludDMyQXJyYXkuZnJvbShbNiwgMjQsIDUwLCA3NiwgMTAyLCAxMjgsIDE1NF0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCg2LCAxMjEpLCBuZXcgRUNCXzEuZGVmYXVsdCgxNCwgMTIyKSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDYsIDQ3KSwgbmV3IEVDQl8xLmRlZmF1bHQoMzQsIDQ4KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDQ2LCAyNCksIG5ldyBFQ0JfMS5kZWZhdWx0KDEwLCAyNSkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCgyLCAxNSksIG5ldyBFQ0JfMS5kZWZhdWx0KDY0LCAxNikpKSwKCSAgICAgICAgbmV3IFZlcnNpb24oMzcsIEludDMyQXJyYXkuZnJvbShbNiwgMjgsIDU0LCA4MCwgMTA2LCAxMzIsIDE1OF0pLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCgxNywgMTIyKSwgbmV3IEVDQl8xLmRlZmF1bHQoNCwgMTIzKSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMjgsIG5ldyBFQ0JfMS5kZWZhdWx0KDI5LCA0NiksIG5ldyBFQ0JfMS5kZWZhdWx0KDE0LCA0NykpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCg0OSwgMjQpLCBuZXcgRUNCXzEuZGVmYXVsdCgxMCwgMjUpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMjQsIDE1KSwgbmV3IEVDQl8xLmRlZmF1bHQoNDYsIDE2KSkpLAoJICAgICAgICBuZXcgVmVyc2lvbigzOCwgSW50MzJBcnJheS5mcm9tKFs2LCAzMiwgNTgsIDg0LCAxMTAsIDEzNiwgMTYyXSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDEyMiksIG5ldyBFQ0JfMS5kZWZhdWx0KDE4LCAxMjMpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMTMsIDQ2KSwgbmV3IEVDQl8xLmRlZmF1bHQoMzIsIDQ3KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDQ4LCAyNCksIG5ldyBFQ0JfMS5kZWZhdWx0KDE0LCAyNSkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCg0MiwgMTUpLCBuZXcgRUNCXzEuZGVmYXVsdCgzMiwgMTYpKSksCgkgICAgICAgIG5ldyBWZXJzaW9uKDM5LCBJbnQzMkFycmF5LmZyb20oWzYsIDI2LCA1NCwgODIsIDExMCwgMTM4LCAxNjZdKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMjAsIDExNyksIG5ldyBFQ0JfMS5kZWZhdWx0KDQsIDExOCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDI4LCBuZXcgRUNCXzEuZGVmYXVsdCg0MCwgNDcpLCBuZXcgRUNCXzEuZGVmYXVsdCg3LCA0OCkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCg0MywgMjQpLCBuZXcgRUNCXzEuZGVmYXVsdCgyMiwgMjUpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgzMCwgbmV3IEVDQl8xLmRlZmF1bHQoMTAsIDE1KSwgbmV3IEVDQl8xLmRlZmF1bHQoNjcsIDE2KSkpLAoJICAgICAgICBuZXcgVmVyc2lvbig0MCwgSW50MzJBcnJheS5mcm9tKFs2LCAzMCwgNTgsIDg2LCAxMTQsIDE0MiwgMTcwXSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDE5LCAxMTgpLCBuZXcgRUNCXzEuZGVmYXVsdCg2LCAxMTkpKSwgbmV3IEVDQmxvY2tzXzEuZGVmYXVsdCgyOCwgbmV3IEVDQl8xLmRlZmF1bHQoMTgsIDQ3KSwgbmV3IEVDQl8xLmRlZmF1bHQoMzEsIDQ4KSksIG5ldyBFQ0Jsb2Nrc18xLmRlZmF1bHQoMzAsIG5ldyBFQ0JfMS5kZWZhdWx0KDM0LCAyNCksIG5ldyBFQ0JfMS5kZWZhdWx0KDM0LCAyNSkpLCBuZXcgRUNCbG9ja3NfMS5kZWZhdWx0KDMwLCBuZXcgRUNCXzEuZGVmYXVsdCgyMCwgMTUpLCBuZXcgRUNCXzEuZGVmYXVsdCg2MSwgMTYpKSkKCSAgICBdOwoJICAgIHJldHVybiBWZXJzaW9uOwoJfSgpKTsKCVZlcnNpb24kMS5kZWZhdWx0ID0gVmVyc2lvbjsKCgl2YXIgRGF0YU1hc2sgPSB7fTsKCgkoZnVuY3Rpb24gKGV4cG9ydHMpIHsKCS8qCgkgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCglPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJZXhwb3J0cy5EYXRhTWFza1ZhbHVlcyA9IHZvaWQgMDsKCXZhciBEYXRhTWFza1ZhbHVlczsKCShmdW5jdGlvbiAoRGF0YU1hc2tWYWx1ZXMpIHsKCSAgICBEYXRhTWFza1ZhbHVlc1tEYXRhTWFza1ZhbHVlc1siREFUQV9NQVNLXzAwMCJdID0gMF0gPSAiREFUQV9NQVNLXzAwMCI7CgkgICAgRGF0YU1hc2tWYWx1ZXNbRGF0YU1hc2tWYWx1ZXNbIkRBVEFfTUFTS18wMDEiXSA9IDFdID0gIkRBVEFfTUFTS18wMDEiOwoJICAgIERhdGFNYXNrVmFsdWVzW0RhdGFNYXNrVmFsdWVzWyJEQVRBX01BU0tfMDEwIl0gPSAyXSA9ICJEQVRBX01BU0tfMDEwIjsKCSAgICBEYXRhTWFza1ZhbHVlc1tEYXRhTWFza1ZhbHVlc1siREFUQV9NQVNLXzAxMSJdID0gM10gPSAiREFUQV9NQVNLXzAxMSI7CgkgICAgRGF0YU1hc2tWYWx1ZXNbRGF0YU1hc2tWYWx1ZXNbIkRBVEFfTUFTS18xMDAiXSA9IDRdID0gIkRBVEFfTUFTS18xMDAiOwoJICAgIERhdGFNYXNrVmFsdWVzW0RhdGFNYXNrVmFsdWVzWyJEQVRBX01BU0tfMTAxIl0gPSA1XSA9ICJEQVRBX01BU0tfMTAxIjsKCSAgICBEYXRhTWFza1ZhbHVlc1tEYXRhTWFza1ZhbHVlc1siREFUQV9NQVNLXzExMCJdID0gNl0gPSAiREFUQV9NQVNLXzExMCI7CgkgICAgRGF0YU1hc2tWYWx1ZXNbRGF0YU1hc2tWYWx1ZXNbIkRBVEFfTUFTS18xMTEiXSA9IDddID0gIkRBVEFfTUFTS18xMTEiOwoJfSkoRGF0YU1hc2tWYWx1ZXMgPSBleHBvcnRzLkRhdGFNYXNrVmFsdWVzIHx8IChleHBvcnRzLkRhdGFNYXNrVmFsdWVzID0ge30pKTsKCS8qKgoJICogPHA+RW5jYXBzdWxhdGVzIGRhdGEgbWFza3MgZm9yIHRoZSBkYXRhIGJpdHMgaW4gYSBRUiBjb2RlLCBwZXIgSVNPIDE4MDA0OjIwMDYgNi44LiBJbXBsZW1lbnRhdGlvbnMKCSAqIG9mIHRoaXMgY2xhc3MgY2FuIHVuLW1hc2sgYSByYXcgQml0TWF0cml4LiBGb3Igc2ltcGxpY2l0eSwgdGhleSB3aWxsIHVubWFzayB0aGUgZW50aXJlIEJpdE1hdHJpeCwKCSAqIGluY2x1ZGluZyBhcmVhcyB1c2VkIGZvciBmaW5kZXIgcGF0dGVybnMsIHRpbWluZyBwYXR0ZXJucywgZXRjLiBUaGVzZSBhcmVhcyBzaG91bGQgYmUgdW51c2VkCgkgKiBhZnRlciB0aGUgcG9pbnQgdGhleSBhcmUgdW5tYXNrZWQgYW55d2F5LjwvcD4KCSAqCgkgKiA8cD5Ob3RlIHRoYXQgdGhlIGRpYWdyYW0gaW4gc2VjdGlvbiA2LjguMSBpcyBtaXNsZWFkaW5nIHNpbmNlIGl0IGluZGljYXRlcyB0aGF0IGkgaXMgY29sdW1uIHBvc2l0aW9uCgkgKiBhbmQgaiBpcyByb3cgcG9zaXRpb24uIEluIGZhY3QsIGFzIHRoZSB0ZXh0IHNheXMsIGkgaXMgcm93IHBvc2l0aW9uIGFuZCBqIGlzIGNvbHVtbiBwb3NpdGlvbi48L3A+CgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIERhdGFNYXNrID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIC8vIFNlZSBJU08gMTgwMDQ6MjAwNiA2LjguMQoJICAgIGZ1bmN0aW9uIERhdGFNYXNrKHZhbHVlLCBpc01hc2tlZCkgewoJICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgkgICAgICAgIHRoaXMuaXNNYXNrZWQgPSBpc01hc2tlZDsKCSAgICB9CgkgICAgLy8gRW5kIG9mIGVudW0gY29uc3RhbnRzLgoJICAgIC8qKgoJICAgICAqIDxwPkltcGxlbWVudGF0aW9ucyBvZiB0aGlzIG1ldGhvZCByZXZlcnNlIHRoZSBkYXRhIG1hc2tpbmcgcHJvY2VzcyBhcHBsaWVkIHRvIGEgUVIgQ29kZSBhbmQKCSAgICAgKiBtYWtlIGl0cyBiaXRzIHJlYWR5IHRvIHJlYWQuPC9wPgoJICAgICAqCgkgICAgICogQHBhcmFtIGJpdHMgcmVwcmVzZW50YXRpb24gb2YgUVIgQ29kZSBiaXRzCgkgICAgICogQHBhcmFtIGRpbWVuc2lvbiBkaW1lbnNpb24gb2YgUVIgQ29kZSwgcmVwcmVzZW50ZWQgYnkgYml0cywgYmVpbmcgdW5tYXNrZWQKCSAgICAgKi8KCSAgICBEYXRhTWFzay5wcm90b3R5cGUudW5tYXNrQml0TWF0cml4ID0gZnVuY3Rpb24gKGJpdHMsIGRpbWVuc2lvbiAvKmludCovKSB7CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyBpKyspIHsKCSAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGltZW5zaW9uOyBqKyspIHsKCSAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01hc2tlZChpLCBqKSkgewoJICAgICAgICAgICAgICAgICAgICBiaXRzLmZsaXAoaiwgaSk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgfTsKCSAgICBEYXRhTWFzay52YWx1ZXMgPSBuZXcgTWFwKFsKCSAgICAgICAgLyoqCgkgICAgICAgICAqIDAwMDogbWFzayBiaXRzIGZvciB3aGljaCAoeCArIHkpIG1vZCAyID09IDAKCSAgICAgICAgICovCgkgICAgICAgIFtEYXRhTWFza1ZhbHVlcy5EQVRBX01BU0tfMDAwLCBuZXcgRGF0YU1hc2soRGF0YU1hc2tWYWx1ZXMuREFUQV9NQVNLXzAwMCwgZnVuY3Rpb24gKGkgLyppbnQqLywgaiAvKmludCovKSB7IHJldHVybiAoKGkgKyBqKSAmIDB4MDEpID09PSAwOyB9KV0sCgkgICAgICAgIC8qKgoJICAgICAgICAgKiAwMDE6IG1hc2sgYml0cyBmb3Igd2hpY2ggeCBtb2QgMiA9PSAwCgkgICAgICAgICAqLwoJICAgICAgICBbRGF0YU1hc2tWYWx1ZXMuREFUQV9NQVNLXzAwMSwgbmV3IERhdGFNYXNrKERhdGFNYXNrVmFsdWVzLkRBVEFfTUFTS18wMDEsIGZ1bmN0aW9uIChpIC8qaW50Ki8sIGogLyppbnQqLykgeyByZXR1cm4gKGkgJiAweDAxKSA9PT0gMDsgfSldLAoJICAgICAgICAvKioKCSAgICAgICAgICogMDEwOiBtYXNrIGJpdHMgZm9yIHdoaWNoIHkgbW9kIDMgPT0gMAoJICAgICAgICAgKi8KCSAgICAgICAgW0RhdGFNYXNrVmFsdWVzLkRBVEFfTUFTS18wMTAsIG5ldyBEYXRhTWFzayhEYXRhTWFza1ZhbHVlcy5EQVRBX01BU0tfMDEwLCBmdW5jdGlvbiAoaSAvKmludCovLCBqIC8qaW50Ki8pIHsgcmV0dXJuIGogJSAzID09PSAwOyB9KV0sCgkgICAgICAgIC8qKgoJICAgICAgICAgKiAwMTE6IG1hc2sgYml0cyBmb3Igd2hpY2ggKHggKyB5KSBtb2QgMyA9PSAwCgkgICAgICAgICAqLwoJICAgICAgICBbRGF0YU1hc2tWYWx1ZXMuREFUQV9NQVNLXzAxMSwgbmV3IERhdGFNYXNrKERhdGFNYXNrVmFsdWVzLkRBVEFfTUFTS18wMTEsIGZ1bmN0aW9uIChpIC8qaW50Ki8sIGogLyppbnQqLykgeyByZXR1cm4gKGkgKyBqKSAlIDMgPT09IDA7IH0pXSwKCSAgICAgICAgLyoqCgkgICAgICAgICAqIDEwMDogbWFzayBiaXRzIGZvciB3aGljaCAoeC8yICsgeS8zKSBtb2QgMiA9PSAwCgkgICAgICAgICAqLwoJICAgICAgICBbRGF0YU1hc2tWYWx1ZXMuREFUQV9NQVNLXzEwMCwgbmV3IERhdGFNYXNrKERhdGFNYXNrVmFsdWVzLkRBVEFfTUFTS18xMDAsIGZ1bmN0aW9uIChpIC8qaW50Ki8sIGogLyppbnQqLykgeyByZXR1cm4gKChNYXRoLmZsb29yKGkgLyAyKSArIE1hdGguZmxvb3IoaiAvIDMpKSAmIDB4MDEpID09PSAwOyB9KV0sCgkgICAgICAgIC8qKgoJICAgICAgICAgKiAxMDE6IG1hc2sgYml0cyBmb3Igd2hpY2ggeHkgbW9kIDIgKyB4eSBtb2QgMyA9PSAwCgkgICAgICAgICAqIGVxdWl2YWxlbnRseSwgc3VjaCB0aGF0IHh5IG1vZCA2ID09IDAKCSAgICAgICAgICovCgkgICAgICAgIFtEYXRhTWFza1ZhbHVlcy5EQVRBX01BU0tfMTAxLCBuZXcgRGF0YU1hc2soRGF0YU1hc2tWYWx1ZXMuREFUQV9NQVNLXzEwMSwgZnVuY3Rpb24gKGkgLyppbnQqLywgaiAvKmludCovKSB7IHJldHVybiAoaSAqIGopICUgNiA9PT0gMDsgfSldLAoJICAgICAgICAvKioKCSAgICAgICAgICogMTEwOiBtYXNrIGJpdHMgZm9yIHdoaWNoICh4eSBtb2QgMiArIHh5IG1vZCAzKSBtb2QgMiA9PSAwCgkgICAgICAgICAqIGVxdWl2YWxlbnRseSwgc3VjaCB0aGF0IHh5IG1vZCA2IDwgMwoJICAgICAgICAgKi8KCSAgICAgICAgW0RhdGFNYXNrVmFsdWVzLkRBVEFfTUFTS18xMTAsIG5ldyBEYXRhTWFzayhEYXRhTWFza1ZhbHVlcy5EQVRBX01BU0tfMTEwLCBmdW5jdGlvbiAoaSAvKmludCovLCBqIC8qaW50Ki8pIHsgcmV0dXJuICgoaSAqIGopICUgNikgPCAzOyB9KV0sCgkgICAgICAgIC8qKgoJICAgICAgICAgKiAxMTE6IG1hc2sgYml0cyBmb3Igd2hpY2ggKCh4K3kpbW9kIDIgKyB4eSBtb2QgMykgbW9kIDIgPT0gMAoJICAgICAgICAgKiBlcXVpdmFsZW50bHksIHN1Y2ggdGhhdCAoeCArIHkgKyB4eSBtb2QgMykgbW9kIDIgPT0gMAoJICAgICAgICAgKi8KCSAgICAgICAgW0RhdGFNYXNrVmFsdWVzLkRBVEFfTUFTS18xMTEsIG5ldyBEYXRhTWFzayhEYXRhTWFza1ZhbHVlcy5EQVRBX01BU0tfMTExLCBmdW5jdGlvbiAoaSAvKmludCovLCBqIC8qaW50Ki8pIHsgcmV0dXJuICgoaSArIGogKyAoKGkgKiBqKSAlIDMpKSAmIDB4MDEpID09PSAwOyB9KV0sCgkgICAgXSk7CgkgICAgcmV0dXJuIERhdGFNYXNrOwoJfSgpKTsKCWV4cG9ydHMuZGVmYXVsdCA9IERhdGFNYXNrOwoKCX0oRGF0YU1hc2spKTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEJpdE1hdHJpeFBhcnNlciQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7Cgl2YXIgVmVyc2lvbl8xJDEgPSBWZXJzaW9uJDE7Cgl2YXIgRm9ybWF0SW5mb3JtYXRpb25fMSA9IEZvcm1hdEluZm9ybWF0aW9uJDE7Cgl2YXIgRGF0YU1hc2tfMSA9IERhdGFNYXNrOwoJdmFyIEZvcm1hdEV4Y2VwdGlvbl8xJDEgPSBGb3JtYXRFeGNlcHRpb24kMTsKCS8qKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIEJpdE1hdHJpeFBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICAvKioKCSAgICAgKiBAcGFyYW0gYml0TWF0cml4IHtAbGluayBCaXRNYXRyaXh9IHRvIHBhcnNlCgkgICAgICogQHRocm93cyBGb3JtYXRFeGNlcHRpb24gaWYgZGltZW5zaW9uIGlzIG5vdCA+PSAyMSBhbmQgMSBtb2QgNAoJICAgICAqLwoJICAgIGZ1bmN0aW9uIEJpdE1hdHJpeFBhcnNlcihiaXRNYXRyaXgpIHsKCSAgICAgICAgdmFyIGRpbWVuc2lvbiA9IGJpdE1hdHJpeC5nZXRIZWlnaHQoKTsKCSAgICAgICAgaWYgKGRpbWVuc2lvbiA8IDIxIHx8IChkaW1lbnNpb24gJiAweDAzKSAhPT0gMSkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xJDEuZGVmYXVsdCgpOwoJICAgICAgICB9CgkgICAgICAgIHRoaXMuYml0TWF0cml4ID0gYml0TWF0cml4OwoJICAgIH0KCSAgICAvKioKCSAgICAgKiA8cD5SZWFkcyBmb3JtYXQgaW5mb3JtYXRpb24gZnJvbSBvbmUgb2YgaXRzIHR3byBsb2NhdGlvbnMgd2l0aGluIHRoZSBRUiBDb2RlLjwvcD4KCSAgICAgKgoJICAgICAqIEByZXR1cm4ge0BsaW5rIEZvcm1hdEluZm9ybWF0aW9ufSBlbmNhcHN1bGF0aW5nIHRoZSBRUiBDb2RlJ3MgZm9ybWF0IGluZm8KCSAgICAgKiBAdGhyb3dzIEZvcm1hdEV4Y2VwdGlvbiBpZiBib3RoIGZvcm1hdCBpbmZvcm1hdGlvbiBsb2NhdGlvbnMgY2Fubm90IGJlIHBhcnNlZCBhcwoJICAgICAqIHRoZSB2YWxpZCBlbmNvZGluZyBvZiBmb3JtYXQgaW5mb3JtYXRpb24KCSAgICAgKi8KCSAgICBCaXRNYXRyaXhQYXJzZXIucHJvdG90eXBlLnJlYWRGb3JtYXRJbmZvcm1hdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgaWYgKHRoaXMucGFyc2VkRm9ybWF0SW5mbyAhPT0gbnVsbCAmJiB0aGlzLnBhcnNlZEZvcm1hdEluZm8gIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkRm9ybWF0SW5mbzsKCSAgICAgICAgfQoJICAgICAgICAvLyBSZWFkIHRvcC1sZWZ0IGZvcm1hdCBpbmZvIGJpdHMKCSAgICAgICAgdmFyIGZvcm1hdEluZm9CaXRzMSA9IDA7CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKSB7CgkgICAgICAgICAgICBmb3JtYXRJbmZvQml0czEgPSB0aGlzLmNvcHlCaXQoaSwgOCwgZm9ybWF0SW5mb0JpdHMxKTsKCSAgICAgICAgfQoJICAgICAgICAvLyAuLiBhbmQgc2tpcCBhIGJpdCBpbiB0aGUgdGltaW5nIHBhdHRlcm4gLi4uCgkgICAgICAgIGZvcm1hdEluZm9CaXRzMSA9IHRoaXMuY29weUJpdCg3LCA4LCBmb3JtYXRJbmZvQml0czEpOwoJICAgICAgICBmb3JtYXRJbmZvQml0czEgPSB0aGlzLmNvcHlCaXQoOCwgOCwgZm9ybWF0SW5mb0JpdHMxKTsKCSAgICAgICAgZm9ybWF0SW5mb0JpdHMxID0gdGhpcy5jb3B5Qml0KDgsIDcsIGZvcm1hdEluZm9CaXRzMSk7CgkgICAgICAgIC8vIC4uIGFuZCBza2lwIGEgYml0IGluIHRoZSB0aW1pbmcgcGF0dGVybiAuLi4KCSAgICAgICAgZm9yICh2YXIgaiA9IDU7IGogPj0gMDsgai0tKSB7CgkgICAgICAgICAgICBmb3JtYXRJbmZvQml0czEgPSB0aGlzLmNvcHlCaXQoOCwgaiwgZm9ybWF0SW5mb0JpdHMxKTsKCSAgICAgICAgfQoJICAgICAgICAvLyBSZWFkIHRoZSB0b3AtcmlnaHQvYm90dG9tLWxlZnQgcGF0dGVybiB0b28KCSAgICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuYml0TWF0cml4LmdldEhlaWdodCgpOwoJICAgICAgICB2YXIgZm9ybWF0SW5mb0JpdHMyID0gMDsKCSAgICAgICAgdmFyIGpNaW4gPSBkaW1lbnNpb24gLSA3OwoJICAgICAgICBmb3IgKHZhciBqID0gZGltZW5zaW9uIC0gMTsgaiA+PSBqTWluOyBqLS0pIHsKCSAgICAgICAgICAgIGZvcm1hdEluZm9CaXRzMiA9IHRoaXMuY29weUJpdCg4LCBqLCBmb3JtYXRJbmZvQml0czIpOwoJICAgICAgICB9CgkgICAgICAgIGZvciAodmFyIGkgPSBkaW1lbnNpb24gLSA4OyBpIDwgZGltZW5zaW9uOyBpKyspIHsKCSAgICAgICAgICAgIGZvcm1hdEluZm9CaXRzMiA9IHRoaXMuY29weUJpdChpLCA4LCBmb3JtYXRJbmZvQml0czIpOwoJICAgICAgICB9CgkgICAgICAgIHRoaXMucGFyc2VkRm9ybWF0SW5mbyA9IEZvcm1hdEluZm9ybWF0aW9uXzEuZGVmYXVsdC5kZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihmb3JtYXRJbmZvQml0czEsIGZvcm1hdEluZm9CaXRzMik7CgkgICAgICAgIGlmICh0aGlzLnBhcnNlZEZvcm1hdEluZm8gIT09IG51bGwpIHsKCSAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlZEZvcm1hdEluZm87CgkgICAgICAgIH0KCSAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xJDEuZGVmYXVsdCgpOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogPHA+UmVhZHMgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIG9uZSBvZiBpdHMgdHdvIGxvY2F0aW9ucyB3aXRoaW4gdGhlIFFSIENvZGUuPC9wPgoJICAgICAqCgkgICAgICogQHJldHVybiB7QGxpbmsgVmVyc2lvbn0gZW5jYXBzdWxhdGluZyB0aGUgUVIgQ29kZSdzIHZlcnNpb24KCSAgICAgKiBAdGhyb3dzIEZvcm1hdEV4Y2VwdGlvbiBpZiBib3RoIHZlcnNpb24gaW5mb3JtYXRpb24gbG9jYXRpb25zIGNhbm5vdCBiZSBwYXJzZWQgYXMKCSAgICAgKiB0aGUgdmFsaWQgZW5jb2Rpbmcgb2YgdmVyc2lvbiBpbmZvcm1hdGlvbgoJICAgICAqLwoJICAgIEJpdE1hdHJpeFBhcnNlci5wcm90b3R5cGUucmVhZFZlcnNpb24gPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIGlmICh0aGlzLnBhcnNlZFZlcnNpb24gIT09IG51bGwgJiYgdGhpcy5wYXJzZWRWZXJzaW9uICE9PSB1bmRlZmluZWQpIHsKCSAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlZFZlcnNpb247CgkgICAgICAgIH0KCSAgICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuYml0TWF0cml4LmdldEhlaWdodCgpOwoJICAgICAgICB2YXIgcHJvdmlzaW9uYWxWZXJzaW9uID0gTWF0aC5mbG9vcigoZGltZW5zaW9uIC0gMTcpIC8gNCk7CgkgICAgICAgIGlmIChwcm92aXNpb25hbFZlcnNpb24gPD0gNikgewoJICAgICAgICAgICAgcmV0dXJuIFZlcnNpb25fMSQxLmRlZmF1bHQuZ2V0VmVyc2lvbkZvck51bWJlcihwcm92aXNpb25hbFZlcnNpb24pOwoJICAgICAgICB9CgkgICAgICAgIC8vIFJlYWQgdG9wLXJpZ2h0IHZlcnNpb24gaW5mbzogMyB3aWRlIGJ5IDYgdGFsbAoJICAgICAgICB2YXIgdmVyc2lvbkJpdHMgPSAwOwoJICAgICAgICB2YXIgaWpNaW4gPSBkaW1lbnNpb24gLSAxMTsKCSAgICAgICAgZm9yICh2YXIgaiA9IDU7IGogPj0gMDsgai0tKSB7CgkgICAgICAgICAgICBmb3IgKHZhciBpID0gZGltZW5zaW9uIC0gOTsgaSA+PSBpak1pbjsgaS0tKSB7CgkgICAgICAgICAgICAgICAgdmVyc2lvbkJpdHMgPSB0aGlzLmNvcHlCaXQoaSwgaiwgdmVyc2lvbkJpdHMpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHZhciB0aGVQYXJzZWRWZXJzaW9uID0gVmVyc2lvbl8xJDEuZGVmYXVsdC5kZWNvZGVWZXJzaW9uSW5mb3JtYXRpb24odmVyc2lvbkJpdHMpOwoJICAgICAgICBpZiAodGhlUGFyc2VkVmVyc2lvbiAhPT0gbnVsbCAmJiB0aGVQYXJzZWRWZXJzaW9uLmdldERpbWVuc2lvbkZvclZlcnNpb24oKSA9PT0gZGltZW5zaW9uKSB7CgkgICAgICAgICAgICB0aGlzLnBhcnNlZFZlcnNpb24gPSB0aGVQYXJzZWRWZXJzaW9uOwoJICAgICAgICAgICAgcmV0dXJuIHRoZVBhcnNlZFZlcnNpb247CgkgICAgICAgIH0KCSAgICAgICAgLy8gSG1tLCBmYWlsZWQuIFRyeSBib3R0b20gbGVmdDogNiB3aWRlIGJ5IDMgdGFsbAoJICAgICAgICB2ZXJzaW9uQml0cyA9IDA7CgkgICAgICAgIGZvciAodmFyIGkgPSA1OyBpID49IDA7IGktLSkgewoJICAgICAgICAgICAgZm9yICh2YXIgaiA9IGRpbWVuc2lvbiAtIDk7IGogPj0gaWpNaW47IGotLSkgewoJICAgICAgICAgICAgICAgIHZlcnNpb25CaXRzID0gdGhpcy5jb3B5Qml0KGksIGosIHZlcnNpb25CaXRzKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICB0aGVQYXJzZWRWZXJzaW9uID0gVmVyc2lvbl8xJDEuZGVmYXVsdC5kZWNvZGVWZXJzaW9uSW5mb3JtYXRpb24odmVyc2lvbkJpdHMpOwoJICAgICAgICBpZiAodGhlUGFyc2VkVmVyc2lvbiAhPT0gbnVsbCAmJiB0aGVQYXJzZWRWZXJzaW9uLmdldERpbWVuc2lvbkZvclZlcnNpb24oKSA9PT0gZGltZW5zaW9uKSB7CgkgICAgICAgICAgICB0aGlzLnBhcnNlZFZlcnNpb24gPSB0aGVQYXJzZWRWZXJzaW9uOwoJICAgICAgICAgICAgcmV0dXJuIHRoZVBhcnNlZFZlcnNpb247CgkgICAgICAgIH0KCSAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xJDEuZGVmYXVsdCgpOwoJICAgIH07CgkgICAgQml0TWF0cml4UGFyc2VyLnByb3RvdHlwZS5jb3B5Qml0ID0gZnVuY3Rpb24gKGkgLyppbnQqLywgaiAvKmludCovLCB2ZXJzaW9uQml0cyAvKmludCovKSB7CgkgICAgICAgIHZhciBiaXQgPSB0aGlzLmlzTWlycm9yID8gdGhpcy5iaXRNYXRyaXguZ2V0KGosIGkpIDogdGhpcy5iaXRNYXRyaXguZ2V0KGksIGopOwoJICAgICAgICByZXR1cm4gYml0ID8gKHZlcnNpb25CaXRzIDw8IDEpIHwgMHgxIDogdmVyc2lvbkJpdHMgPDwgMTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIDxwPlJlYWRzIHRoZSBiaXRzIGluIHRoZSB7QGxpbmsgQml0TWF0cml4fSByZXByZXNlbnRpbmcgdGhlIGZpbmRlciBwYXR0ZXJuIGluIHRoZQoJICAgICAqIGNvcnJlY3Qgb3JkZXIgaW4gb3JkZXIgdG8gcmVjb25zdHJ1Y3QgdGhlIGNvZGV3b3JkcyBieXRlcyBjb250YWluZWQgd2l0aGluIHRoZQoJICAgICAqIFFSIENvZGUuPC9wPgoJICAgICAqCgkgICAgICogQHJldHVybiBieXRlcyBlbmNvZGVkIHdpdGhpbiB0aGUgUVIgQ29kZQoJICAgICAqIEB0aHJvd3MgRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBleGFjdCBudW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQgaXMgbm90IHJlYWQKCSAgICAgKi8KCSAgICBCaXRNYXRyaXhQYXJzZXIucHJvdG90eXBlLnJlYWRDb2Rld29yZHMgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHZhciBmb3JtYXRJbmZvID0gdGhpcy5yZWFkRm9ybWF0SW5mb3JtYXRpb24oKTsKCSAgICAgICAgdmFyIHZlcnNpb24gPSB0aGlzLnJlYWRWZXJzaW9uKCk7CgkgICAgICAgIC8vIEdldCB0aGUgZGF0YSBtYXNrIGZvciB0aGUgZm9ybWF0IHVzZWQgaW4gdGhpcyBRUiBDb2RlLiBUaGlzIHdpbGwgZXhjbHVkZQoJICAgICAgICAvLyBzb21lIGJpdHMgZnJvbSByZWFkaW5nIGFzIHdlIHdpbmQgdGhyb3VnaCB0aGUgYml0IG1hdHJpeC4KCSAgICAgICAgdmFyIGRhdGFNYXNrID0gRGF0YU1hc2tfMS5kZWZhdWx0LnZhbHVlcy5nZXQoZm9ybWF0SW5mby5nZXREYXRhTWFzaygpKTsKCSAgICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuYml0TWF0cml4LmdldEhlaWdodCgpOwoJICAgICAgICBkYXRhTWFzay51bm1hc2tCaXRNYXRyaXgodGhpcy5iaXRNYXRyaXgsIGRpbWVuc2lvbik7CgkgICAgICAgIHZhciBmdW5jdGlvblBhdHRlcm4gPSB2ZXJzaW9uLmJ1aWxkRnVuY3Rpb25QYXR0ZXJuKCk7CgkgICAgICAgIHZhciByZWFkaW5nVXAgPSB0cnVlOwoJICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkodmVyc2lvbi5nZXRUb3RhbENvZGV3b3JkcygpKTsKCSAgICAgICAgdmFyIHJlc3VsdE9mZnNldCA9IDA7CgkgICAgICAgIHZhciBjdXJyZW50Qnl0ZSA9IDA7CgkgICAgICAgIHZhciBiaXRzUmVhZCA9IDA7CgkgICAgICAgIC8vIFJlYWQgY29sdW1ucyBpbiBwYWlycywgZnJvbSByaWdodCB0byBsZWZ0CgkgICAgICAgIGZvciAodmFyIGogPSBkaW1lbnNpb24gLSAxOyBqID4gMDsgaiAtPSAyKSB7CgkgICAgICAgICAgICBpZiAoaiA9PT0gNikgewoJICAgICAgICAgICAgICAgIC8vIFNraXAgd2hvbGUgY29sdW1uIHdpdGggdmVydGljYWwgYWxpZ25tZW50IHBhdHRlcm4KCSAgICAgICAgICAgICAgICAvLyBzYXZlcyB0aW1lIGFuZCBtYWtlcyB0aGUgb3RoZXIgY29kZSBwcm9jZWVkIG1vcmUgY2xlYW5seQoJICAgICAgICAgICAgICAgIGotLTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIC8vIFJlYWQgYWx0ZXJuYXRpbmdseSBmcm9tIGJvdHRvbSB0byB0b3AgdGhlbiB0b3AgdG8gYm90dG9tCgkgICAgICAgICAgICBmb3IgKHZhciBjb3VudCA9IDA7IGNvdW50IDwgZGltZW5zaW9uOyBjb3VudCsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIGkgPSByZWFkaW5nVXAgPyBkaW1lbnNpb24gLSAxIC0gY291bnQgOiBjb3VudDsKCSAgICAgICAgICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCAyOyBjb2wrKykgewoJICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYml0cyBjb3ZlcmVkIGJ5IHRoZSBmdW5jdGlvbiBwYXR0ZXJuCgkgICAgICAgICAgICAgICAgICAgIGlmICghZnVuY3Rpb25QYXR0ZXJuLmdldChqIC0gY29sLCBpKSkgewoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCBhIGJpdAoJICAgICAgICAgICAgICAgICAgICAgICAgYml0c1JlYWQrKzsKCSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCeXRlIDw8PSAxOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYml0TWF0cml4LmdldChqIC0gY29sLCBpKSkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSd2ZSBtYWRlIGEgd2hvbGUgYnl0ZSwgc2F2ZSBpdCBvZmYKCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzUmVhZCA9PT0gOCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtyZXN1bHRPZmZzZXQrK10gPSAvKihieXRlKSAqLyBjdXJyZW50Qnl0ZTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzUmVhZCA9IDA7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ5dGUgPSAwOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgcmVhZGluZ1VwID0gIXJlYWRpbmdVcDsgLy8gcmVhZGluZ1VwIF49IHRydWU7IC8vIHJlYWRpbmdVcCA9ICFyZWFkaW5nVXA7IC8vIHN3aXRjaCBkaXJlY3Rpb25zCgkgICAgICAgIH0KCSAgICAgICAgaWYgKHJlc3VsdE9mZnNldCAhPT0gdmVyc2lvbi5nZXRUb3RhbENvZGV3b3JkcygpKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEkMS5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFJldmVydCB0aGUgbWFzayByZW1vdmFsIGRvbmUgd2hpbGUgcmVhZGluZyB0aGUgY29kZSB3b3Jkcy4gVGhlIGJpdCBtYXRyaXggc2hvdWxkIHJldmVydCB0byBpdHMgb3JpZ2luYWwgc3RhdGUuCgkgICAgICovCgkgICAgQml0TWF0cml4UGFyc2VyLnByb3RvdHlwZS5yZW1hc2sgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIGlmICh0aGlzLnBhcnNlZEZvcm1hdEluZm8gPT09IG51bGwpIHsKCSAgICAgICAgICAgIHJldHVybjsgLy8gV2UgaGF2ZSBubyBmb3JtYXQgaW5mb3JtYXRpb24sIGFuZCBoYXZlIG5vIGRhdGEgbWFzawoJICAgICAgICB9CgkgICAgICAgIHZhciBkYXRhTWFzayA9IERhdGFNYXNrXzEuZGVmYXVsdC52YWx1ZXNbdGhpcy5wYXJzZWRGb3JtYXRJbmZvLmdldERhdGFNYXNrKCldOwoJICAgICAgICB2YXIgZGltZW5zaW9uID0gdGhpcy5iaXRNYXRyaXguZ2V0SGVpZ2h0KCk7CgkgICAgICAgIGRhdGFNYXNrLnVubWFza0JpdE1hdHJpeCh0aGlzLmJpdE1hdHJpeCwgZGltZW5zaW9uKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFByZXBhcmUgdGhlIHBhcnNlciBmb3IgYSBtaXJyb3JlZCBvcGVyYXRpb24uCgkgICAgICogVGhpcyBmbGFnIGhhcyBlZmZlY3Qgb25seSBvbiB0aGUge0BsaW5rICNyZWFkRm9ybWF0SW5mb3JtYXRpb24oKX0gYW5kIHRoZQoJICAgICAqIHtAbGluayAjcmVhZFZlcnNpb24oKX0uIEJlZm9yZSBwcm9jZWVkaW5nIHdpdGgge0BsaW5rICNyZWFkQ29kZXdvcmRzKCl9IHRoZQoJICAgICAqIHtAbGluayAjbWlycm9yKCl9IG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkLgoJICAgICAqCgkgICAgICogQHBhcmFtIG1pcnJvciBXaGV0aGVyIHRvIHJlYWQgdmVyc2lvbiBhbmQgZm9ybWF0IGluZm9ybWF0aW9uIG1pcnJvcmVkLgoJICAgICAqLwoJICAgIEJpdE1hdHJpeFBhcnNlci5wcm90b3R5cGUuc2V0TWlycm9yID0gZnVuY3Rpb24gKGlzTWlycm9yKSB7CgkgICAgICAgIHRoaXMucGFyc2VkVmVyc2lvbiA9IG51bGw7CgkgICAgICAgIHRoaXMucGFyc2VkRm9ybWF0SW5mbyA9IG51bGw7CgkgICAgICAgIHRoaXMuaXNNaXJyb3IgPSBpc01pcnJvcjsKCSAgICB9OwoJICAgIC8qKiBNaXJyb3IgdGhlIGJpdCBtYXRyaXggaW4gb3JkZXIgdG8gYXR0ZW1wdCBhIHNlY29uZCByZWFkaW5nLiAqLwoJICAgIEJpdE1hdHJpeFBhcnNlci5wcm90b3R5cGUubWlycm9yID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgYml0TWF0cml4ID0gdGhpcy5iaXRNYXRyaXg7CgkgICAgICAgIGZvciAodmFyIHggPSAwLCB3aWR0aCA9IGJpdE1hdHJpeC5nZXRXaWR0aCgpOyB4IDwgd2lkdGg7IHgrKykgewoJICAgICAgICAgICAgZm9yICh2YXIgeSA9IHggKyAxLCBoZWlnaHQgPSBiaXRNYXRyaXguZ2V0SGVpZ2h0KCk7IHkgPCBoZWlnaHQ7IHkrKykgewoJICAgICAgICAgICAgICAgIGlmIChiaXRNYXRyaXguZ2V0KHgsIHkpICE9PSBiaXRNYXRyaXguZ2V0KHksIHgpKSB7CgkgICAgICAgICAgICAgICAgICAgIGJpdE1hdHJpeC5mbGlwKHksIHgpOwoJICAgICAgICAgICAgICAgICAgICBiaXRNYXRyaXguZmxpcCh4LCB5KTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICB9OwoJICAgIHJldHVybiBCaXRNYXRyaXhQYXJzZXI7Cgl9KCkpOwoJQml0TWF0cml4UGFyc2VyJDEuZGVmYXVsdCA9IEJpdE1hdHJpeFBhcnNlcjsKCgl2YXIgRGF0YUJsb2NrJDEgPSB7fTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJdmFyIF9fdmFsdWVzJDMgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHsKCSAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDsKCSAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTsKCSAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSByZXR1cm4gewoJICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwOwoJICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9OwoJICAgICAgICB9CgkgICAgfTsKCSAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKCX07CglPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0YUJsb2NrJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCXZhciBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSQxID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uJDE7CgkvKioKCSAqIDxwPkVuY2Fwc3VsYXRlcyBhIGJsb2NrIG9mIGRhdGEgd2l0aGluIGEgUVIgQ29kZS4gUVIgQ29kZXMgbWF5IHNwbGl0IHRoZWlyIGRhdGEgaW50bwoJICogbXVsdGlwbGUgYmxvY2tzLCBlYWNoIG9mIHdoaWNoIGlzIGEgdW5pdCBvZiBkYXRhIGFuZCBlcnJvci1jb3JyZWN0aW9uIGNvZGV3b3Jkcy4gRWFjaAoJICogaXMgcmVwcmVzZW50ZWQgYnkgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy48L3A+CgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIERhdGFCbG9jayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBEYXRhQmxvY2sobnVtRGF0YUNvZGV3b3JkcyAvKmludCovLCBjb2Rld29yZHMpIHsKCSAgICAgICAgdGhpcy5udW1EYXRhQ29kZXdvcmRzID0gbnVtRGF0YUNvZGV3b3JkczsKCSAgICAgICAgdGhpcy5jb2Rld29yZHMgPSBjb2Rld29yZHM7CgkgICAgfQoJICAgIC8qKgoJICAgICAqIDxwPldoZW4gUVIgQ29kZXMgdXNlIG11bHRpcGxlIGRhdGEgYmxvY2tzLCB0aGV5IGFyZSBhY3R1YWxseSBpbnRlcmxlYXZlZC4KCSAgICAgKiBUaGF0IGlzLCB0aGUgZmlyc3QgYnl0ZSBvZiBkYXRhIGJsb2NrIDEgdG8gbiBpcyB3cml0dGVuLCB0aGVuIHRoZSBzZWNvbmQgYnl0ZXMsIGFuZCBzbyBvbi4gVGhpcwoJICAgICAqIG1ldGhvZCB3aWxsIHNlcGFyYXRlIHRoZSBkYXRhIGludG8gb3JpZ2luYWwgYmxvY2tzLjwvcD4KCSAgICAgKgoJICAgICAqIEBwYXJhbSByYXdDb2Rld29yZHMgYnl0ZXMgYXMgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBRUiBDb2RlCgkgICAgICogQHBhcmFtIHZlcnNpb24gdmVyc2lvbiBvZiB0aGUgUVIgQ29kZQoJICAgICAqIEBwYXJhbSBlY0xldmVsIGVycm9yLWNvcnJlY3Rpb24gbGV2ZWwgb2YgdGhlIFFSIENvZGUKCSAgICAgKiBAcmV0dXJuIERhdGFCbG9ja3MgY29udGFpbmluZyBvcmlnaW5hbCBieXRlcywgImRlLWludGVybGVhdmVkIiBmcm9tIHJlcHJlc2VudGF0aW9uIGluIHRoZQoJICAgICAqICAgICAgICAgUVIgQ29kZQoJICAgICAqLwoJICAgIERhdGFCbG9jay5nZXREYXRhQmxvY2tzID0gZnVuY3Rpb24gKHJhd0NvZGV3b3JkcywgdmVyc2lvbiwgZWNMZXZlbCkgewoJICAgICAgICB2YXIgZV8xLCBfYSwgZV8yLCBfYjsKCSAgICAgICAgaWYgKHJhd0NvZGV3b3Jkcy5sZW5ndGggIT09IHZlcnNpb24uZ2V0VG90YWxDb2Rld29yZHMoKSkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xJDEuZGVmYXVsdCgpOwoJICAgICAgICB9CgkgICAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIG51bWJlciBhbmQgc2l6ZSBvZiBkYXRhIGJsb2NrcyB1c2VkIGJ5IHRoaXMgdmVyc2lvbiBhbmQKCSAgICAgICAgLy8gZXJyb3IgY29ycmVjdGlvbiBsZXZlbAoJICAgICAgICB2YXIgZWNCbG9ja3MgPSB2ZXJzaW9uLmdldEVDQmxvY2tzRm9yTGV2ZWwoZWNMZXZlbCk7CgkgICAgICAgIC8vIEZpcnN0IGNvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBibG9ja3MKCSAgICAgICAgdmFyIHRvdGFsQmxvY2tzID0gMDsKCSAgICAgICAgdmFyIGVjQmxvY2tBcnJheSA9IGVjQmxvY2tzLmdldEVDQmxvY2tzKCk7CgkgICAgICAgIHRyeSB7CgkgICAgICAgICAgICBmb3IgKHZhciBlY0Jsb2NrQXJyYXlfMSA9IF9fdmFsdWVzJDMoZWNCbG9ja0FycmF5KSwgZWNCbG9ja0FycmF5XzFfMSA9IGVjQmxvY2tBcnJheV8xLm5leHQoKTsgIWVjQmxvY2tBcnJheV8xXzEuZG9uZTsgZWNCbG9ja0FycmF5XzFfMSA9IGVjQmxvY2tBcnJheV8xLm5leHQoKSkgewoJICAgICAgICAgICAgICAgIHZhciBlY0Jsb2NrID0gZWNCbG9ja0FycmF5XzFfMS52YWx1ZTsKCSAgICAgICAgICAgICAgICB0b3RhbEJsb2NrcyArPSBlY0Jsb2NrLmdldENvdW50KCk7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH0KCSAgICAgICAgZmluYWxseSB7CgkgICAgICAgICAgICB0cnkgewoJICAgICAgICAgICAgICAgIGlmIChlY0Jsb2NrQXJyYXlfMV8xICYmICFlY0Jsb2NrQXJyYXlfMV8xLmRvbmUgJiYgKF9hID0gZWNCbG9ja0FycmF5XzEucmV0dXJuKSkgX2EuY2FsbChlY0Jsb2NrQXJyYXlfMSk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9CgkgICAgICAgIH0KCSAgICAgICAgLy8gTm93IGVzdGFibGlzaCBEYXRhQmxvY2tzIG9mIHRoZSBhcHByb3ByaWF0ZSBzaXplIGFuZCBudW1iZXIgb2YgZGF0YSBjb2Rld29yZHMKCSAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheSh0b3RhbEJsb2Nrcyk7CgkgICAgICAgIHZhciBudW1SZXN1bHRCbG9ja3MgPSAwOwoJICAgICAgICB0cnkgewoJICAgICAgICAgICAgZm9yICh2YXIgZWNCbG9ja0FycmF5XzIgPSBfX3ZhbHVlcyQzKGVjQmxvY2tBcnJheSksIGVjQmxvY2tBcnJheV8yXzEgPSBlY0Jsb2NrQXJyYXlfMi5uZXh0KCk7ICFlY0Jsb2NrQXJyYXlfMl8xLmRvbmU7IGVjQmxvY2tBcnJheV8yXzEgPSBlY0Jsb2NrQXJyYXlfMi5uZXh0KCkpIHsKCSAgICAgICAgICAgICAgICB2YXIgZWNCbG9jayA9IGVjQmxvY2tBcnJheV8yXzEudmFsdWU7CgkgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlY0Jsb2NrLmdldENvdW50KCk7IGkrKykgewoJICAgICAgICAgICAgICAgICAgICB2YXIgbnVtRGF0YUNvZGV3b3JkcyA9IGVjQmxvY2suZ2V0RGF0YUNvZGV3b3JkcygpOwoJICAgICAgICAgICAgICAgICAgICB2YXIgbnVtQmxvY2tDb2Rld29yZHMgPSBlY0Jsb2Nrcy5nZXRFQ0NvZGV3b3Jkc1BlckJsb2NrKCkgKyBudW1EYXRhQ29kZXdvcmRzOwoJICAgICAgICAgICAgICAgICAgICByZXN1bHRbbnVtUmVzdWx0QmxvY2tzKytdID0gbmV3IERhdGFCbG9jayhudW1EYXRhQ29kZXdvcmRzLCBuZXcgVWludDhBcnJheShudW1CbG9ja0NvZGV3b3JkcykpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfQoJICAgICAgICBmaW5hbGx5IHsKCSAgICAgICAgICAgIHRyeSB7CgkgICAgICAgICAgICAgICAgaWYgKGVjQmxvY2tBcnJheV8yXzEgJiYgIWVjQmxvY2tBcnJheV8yXzEuZG9uZSAmJiAoX2IgPSBlY0Jsb2NrQXJyYXlfMi5yZXR1cm4pKSBfYi5jYWxsKGVjQmxvY2tBcnJheV8yKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH0KCSAgICAgICAgfQoJICAgICAgICAvLyBBbGwgYmxvY2tzIGhhdmUgdGhlIHNhbWUgYW1vdW50IG9mIGRhdGEsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IG4KCSAgICAgICAgLy8gKHdoZXJlIG4gbWF5IGJlIDApIGhhdmUgMSBtb3JlIGJ5dGUuIEZpZ3VyZSBvdXQgd2hlcmUgdGhlc2Ugc3RhcnQuCgkgICAgICAgIHZhciBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMgPSByZXN1bHRbMF0uY29kZXdvcmRzLmxlbmd0aDsKCSAgICAgICAgdmFyIGxvbmdlckJsb2Nrc1N0YXJ0QXQgPSByZXN1bHQubGVuZ3RoIC0gMTsKCSAgICAgICAgLy8gVFlQRVNDUklQVFBPUlQ6IGNoZWNrIGxlbmd0aCBpcyBjb3JyZWN0IGhlcmUKCSAgICAgICAgd2hpbGUgKGxvbmdlckJsb2Nrc1N0YXJ0QXQgPj0gMCkgewoJICAgICAgICAgICAgdmFyIG51bUNvZGV3b3JkcyA9IHJlc3VsdFtsb25nZXJCbG9ja3NTdGFydEF0XS5jb2Rld29yZHMubGVuZ3RoOwoJICAgICAgICAgICAgaWYgKG51bUNvZGV3b3JkcyA9PT0gc2hvcnRlckJsb2Nrc1RvdGFsQ29kZXdvcmRzKSB7CgkgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBsb25nZXJCbG9ja3NTdGFydEF0LS07CgkgICAgICAgIH0KCSAgICAgICAgbG9uZ2VyQmxvY2tzU3RhcnRBdCsrOwoJICAgICAgICB2YXIgc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHMgPSBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMgLSBlY0Jsb2Nrcy5nZXRFQ0NvZGV3b3Jkc1BlckJsb2NrKCk7CgkgICAgICAgIC8vIFRoZSBsYXN0IGVsZW1lbnRzIG9mIHJlc3VsdCBtYXkgYmUgMSBlbGVtZW50IGxvbmdlcgoJICAgICAgICAvLyBmaXJzdCBmaWxsIG91dCBhcyBtYW55IGVsZW1lbnRzIGFzIGFsbCBvZiB0aGVtIGhhdmUKCSAgICAgICAgdmFyIHJhd0NvZGV3b3Jkc09mZnNldCA9IDA7CgkgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkrKykgewoJICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1SZXN1bHRCbG9ja3M7IGorKykgewoJICAgICAgICAgICAgICAgIHJlc3VsdFtqXS5jb2Rld29yZHNbaV0gPSByYXdDb2Rld29yZHNbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIC8vIEZpbGwgb3V0IHRoZSBsYXN0IGRhdGEgYmxvY2sgaW4gdGhlIGxvbmdlciBvbmVzCgkgICAgICAgIGZvciAodmFyIGogPSBsb25nZXJCbG9ja3NTdGFydEF0OyBqIDwgbnVtUmVzdWx0QmxvY2tzOyBqKyspIHsKCSAgICAgICAgICAgIHJlc3VsdFtqXS5jb2Rld29yZHNbc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHNdID0gcmF3Q29kZXdvcmRzW3Jhd0NvZGV3b3Jkc09mZnNldCsrXTsKCSAgICAgICAgfQoJICAgICAgICAvLyBOb3cgYWRkIGluIGVycm9yIGNvcnJlY3Rpb24gYmxvY2tzCgkgICAgICAgIHZhciBtYXggPSByZXN1bHRbMF0uY29kZXdvcmRzLmxlbmd0aDsKCSAgICAgICAgZm9yICh2YXIgaSA9IHNob3J0ZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzOyBpIDwgbWF4OyBpKyspIHsKCSAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtUmVzdWx0QmxvY2tzOyBqKyspIHsKCSAgICAgICAgICAgICAgICB2YXIgaU9mZnNldCA9IGogPCBsb25nZXJCbG9ja3NTdGFydEF0ID8gaSA6IGkgKyAxOwoJICAgICAgICAgICAgICAgIHJlc3VsdFtqXS5jb2Rld29yZHNbaU9mZnNldF0gPSByYXdDb2Rld29yZHNbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiByZXN1bHQ7CgkgICAgfTsKCSAgICBEYXRhQmxvY2sucHJvdG90eXBlLmdldE51bURhdGFDb2Rld29yZHMgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLm51bURhdGFDb2Rld29yZHM7CgkgICAgfTsKCSAgICBEYXRhQmxvY2sucHJvdG90eXBlLmdldENvZGV3b3JkcyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuY29kZXdvcmRzOwoJICAgIH07CgkgICAgcmV0dXJuIERhdGFCbG9jazsKCX0oKSk7CglEYXRhQmxvY2skMS5kZWZhdWx0ID0gRGF0YUJsb2NrOwoKCXZhciBEZWNvZGVkQml0U3RyZWFtUGFyc2VyJDEgPSB7fTsKCgl2YXIgQml0U291cmNlJDEgPSB7fTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEJpdFNvdXJjZSQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgkvKm5hbWVzcGFjZSBjb20uZ29vZ2xlLnp4aW5nLmNvbW1vbiB7Ki8KCXZhciBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMSA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiQxOwoJLyoqCgkgKiA8cD5UaGlzIHByb3ZpZGVzIGFuIGVhc3kgYWJzdHJhY3Rpb24gdG8gcmVhZCBiaXRzIGF0IGEgdGltZSBmcm9tIGEgc2VxdWVuY2Ugb2YgYnl0ZXMsIHdoZXJlIHRoZQoJICogbnVtYmVyIG9mIGJpdHMgcmVhZCBpcyBub3Qgb2Z0ZW4gYSBtdWx0aXBsZSBvZiA4LjwvcD4KCSAqCgkgKiA8cD5UaGlzIGNsYXNzIGlzIHRocmVhZC1zYWZlIGJ1dCBub3QgcmVlbnRyYW50IC0tIHVubGVzcyB0aGUgY2FsbGVyIG1vZGlmaWVzIHRoZSBieXRlcyBhcnJheQoJICogaXQgcGFzc2VkIGluLCBpbiB3aGljaCBjYXNlIGFsbCBiZXRzIGFyZSBvZmYuPC9wPgoJICoKCSAqIEBhdXRob3IgU2VhbiBPd2VuCgkgKi8KCXZhciBCaXRTb3VyY2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgLyoqCgkgICAgICogQHBhcmFtIGJ5dGVzIGJ5dGVzIGZyb20gd2hpY2ggdGhpcyB3aWxsIHJlYWQgYml0cy4gQml0cyB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgZmlyc3QgYnl0ZSBmaXJzdC4KCSAgICAgKiBCaXRzIGFyZSByZWFkIHdpdGhpbiBhIGJ5dGUgZnJvbSBtb3N0LXNpZ25pZmljYW50IHRvIGxlYXN0LXNpZ25pZmljYW50IGJpdC4KCSAgICAgKi8KCSAgICBmdW5jdGlvbiBCaXRTb3VyY2UoYnl0ZXMpIHsKCSAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOwoJICAgICAgICB0aGlzLmJ5dGVPZmZzZXQgPSAwOwoJICAgICAgICB0aGlzLmJpdE9mZnNldCA9IDA7CgkgICAgfQoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gaW5kZXggb2YgbmV4dCBiaXQgaW4gY3VycmVudCBieXRlIHdoaWNoIHdvdWxkIGJlIHJlYWQgYnkgdGhlIG5leHQgY2FsbCB0byB7QGxpbmsgI3JlYWRCaXRzKGludCl9LgoJICAgICAqLwoJICAgIEJpdFNvdXJjZS5wcm90b3R5cGUuZ2V0Qml0T2Zmc2V0ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5iaXRPZmZzZXQ7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIGluZGV4IG9mIG5leHQgYnl0ZSBpbiBpbnB1dCBieXRlIGFycmF5IHdoaWNoIHdvdWxkIGJlIHJlYWQgYnkgdGhlIG5leHQgY2FsbCB0byB7QGxpbmsgI3JlYWRCaXRzKGludCl9LgoJICAgICAqLwoJICAgIEJpdFNvdXJjZS5wcm90b3R5cGUuZ2V0Qnl0ZU9mZnNldCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldDsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEBwYXJhbSBudW1CaXRzIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKCSAgICAgKiBAcmV0dXJuIGludCByZXByZXNlbnRpbmcgdGhlIGJpdHMgcmVhZC4gVGhlIGJpdHMgd2lsbCBhcHBlYXIgYXMgdGhlIGxlYXN0LXNpZ25pZmljYW50CgkgICAgICogICAgICAgICBiaXRzIG9mIHRoZSBpbnQKCSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBudW1CaXRzIGlzbid0IGluIFsxLDMyXSBvciBtb3JlIHRoYW4gaXMgYXZhaWxhYmxlCgkgICAgICovCgkgICAgQml0U291cmNlLnByb3RvdHlwZS5yZWFkQml0cyA9IGZ1bmN0aW9uIChudW1CaXRzIC8qaW50Ki8pIHsKCSAgICAgICAgaWYgKG51bUJpdHMgPCAxIHx8IG51bUJpdHMgPiAzMiB8fCBudW1CaXRzID4gdGhpcy5hdmFpbGFibGUoKSkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xLmRlZmF1bHQoJycgKyBudW1CaXRzKTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgcmVzdWx0ID0gMDsKCSAgICAgICAgdmFyIGJpdE9mZnNldCA9IHRoaXMuYml0T2Zmc2V0OwoJICAgICAgICB2YXIgYnl0ZU9mZnNldCA9IHRoaXMuYnl0ZU9mZnNldDsKCSAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlczsKCSAgICAgICAgLy8gRmlyc3QsIHJlYWQgcmVtYWluZGVyIGZyb20gY3VycmVudCBieXRlCgkgICAgICAgIGlmIChiaXRPZmZzZXQgPiAwKSB7CgkgICAgICAgICAgICB2YXIgYml0c0xlZnQgPSA4IC0gYml0T2Zmc2V0OwoJICAgICAgICAgICAgdmFyIHRvUmVhZCA9IG51bUJpdHMgPCBiaXRzTGVmdCA/IG51bUJpdHMgOiBiaXRzTGVmdDsKCSAgICAgICAgICAgIHZhciBiaXRzVG9Ob3RSZWFkID0gYml0c0xlZnQgLSB0b1JlYWQ7CgkgICAgICAgICAgICB2YXIgbWFzayA9ICgweEZGID4+ICg4IC0gdG9SZWFkKSkgPDwgYml0c1RvTm90UmVhZDsKCSAgICAgICAgICAgIHJlc3VsdCA9IChieXRlc1tieXRlT2Zmc2V0XSAmIG1hc2spID4+IGJpdHNUb05vdFJlYWQ7CgkgICAgICAgICAgICBudW1CaXRzIC09IHRvUmVhZDsKCSAgICAgICAgICAgIGJpdE9mZnNldCArPSB0b1JlYWQ7CgkgICAgICAgICAgICBpZiAoYml0T2Zmc2V0ID09PSA4KSB7CgkgICAgICAgICAgICAgICAgYml0T2Zmc2V0ID0gMDsKCSAgICAgICAgICAgICAgICBieXRlT2Zmc2V0Kys7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgLy8gTmV4dCByZWFkIHdob2xlIGJ5dGVzCgkgICAgICAgIGlmIChudW1CaXRzID4gMCkgewoJICAgICAgICAgICAgd2hpbGUgKG51bUJpdHMgPj0gOCkgewoJICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgfCAoYnl0ZXNbYnl0ZU9mZnNldF0gJiAweEZGKTsKCSAgICAgICAgICAgICAgICBieXRlT2Zmc2V0Kys7CgkgICAgICAgICAgICAgICAgbnVtQml0cyAtPSA4OwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgLy8gRmluYWxseSByZWFkIGEgcGFydGlhbCBieXRlCgkgICAgICAgICAgICBpZiAobnVtQml0cyA+IDApIHsKCSAgICAgICAgICAgICAgICB2YXIgYml0c1RvTm90UmVhZCA9IDggLSBudW1CaXRzOwoJICAgICAgICAgICAgICAgIHZhciBtYXNrID0gKDB4RkYgPj4gYml0c1RvTm90UmVhZCkgPDwgYml0c1RvTm90UmVhZDsKCSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IG51bUJpdHMpIHwgKChieXRlc1tieXRlT2Zmc2V0XSAmIG1hc2spID4+IGJpdHNUb05vdFJlYWQpOwoJICAgICAgICAgICAgICAgIGJpdE9mZnNldCArPSBudW1CaXRzOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHRoaXMuYml0T2Zmc2V0ID0gYml0T2Zmc2V0OwoJICAgICAgICB0aGlzLmJ5dGVPZmZzZXQgPSBieXRlT2Zmc2V0OwoJICAgICAgICByZXR1cm4gcmVzdWx0OwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiBudW1iZXIgb2YgYml0cyB0aGF0IGNhbiBiZSByZWFkIHN1Y2Nlc3NmdWxseQoJICAgICAqLwoJICAgIEJpdFNvdXJjZS5wcm90b3R5cGUuYXZhaWxhYmxlID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gOCAqICh0aGlzLmJ5dGVzLmxlbmd0aCAtIHRoaXMuYnl0ZU9mZnNldCkgLSB0aGlzLmJpdE9mZnNldDsKCSAgICB9OwoJICAgIHJldHVybiBCaXRTb3VyY2U7Cgl9KCkpOwoJQml0U291cmNlJDEuZGVmYXVsdCA9IEJpdFNvdXJjZTsKCgl2YXIgRGVjb2RlclJlc3VsdCQxID0ge307CgoJLyoKCSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWNvZGVyUmVzdWx0JDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcuY29tbW9uIHsqLwoJLyppbXBvcnQgamF2YS51dGlsLkxpc3Q7Ki8KCS8qKgoJICogPHA+RW5jYXBzdWxhdGVzIHRoZSByZXN1bHQgb2YgZGVjb2RpbmcgYSBtYXRyaXggb2YgYml0cy4gVGhpcyB0eXBpY2FsbHkKCSAqIGFwcGxpZXMgdG8gMkQgYmFyY29kZSBmb3JtYXRzLiBGb3Igbm93IGl0IGNvbnRhaW5zIHRoZSByYXcgYnl0ZXMgb2J0YWluZWQsCgkgKiBhcyB3ZWxsIGFzIGEgU3RyaW5nIGludGVycHJldGF0aW9uIG9mIHRob3NlIGJ5dGVzLCBpZiBhcHBsaWNhYmxlLjwvcD4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICovCgl2YXIgRGVjb2RlclJlc3VsdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICAvLyBwdWJsaWMgY29uc3RydWN0b3IocmF3Qnl0ZXM6IFVpbnQ4QXJyYXksCgkgICAgLy8gICAgICAgICAgICAgICAgICAgICAgdGV4dDogc3RyaW5nLAoJICAgIC8vICAgICAgICAgICAgICAgICAgICAgIExpc3Q8VWludDhBcnJheT4gYnl0ZVNlZ21lbnRzLAoJICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlY0xldmVsKSB7CgkgICAgLy8gICB0aGlzKHJhd0J5dGVzLCB0ZXh0LCBieXRlU2VnbWVudHMsIGVjTGV2ZWwsIC0xLCAtMSkKCSAgICAvLyB9CgkgICAgZnVuY3Rpb24gRGVjb2RlclJlc3VsdChyYXdCeXRlcywgdGV4dCwgYnl0ZVNlZ21lbnRzLCBlY0xldmVsLCBzdHJ1Y3R1cmVkQXBwZW5kU2VxdWVuY2VOdW1iZXIsIHN0cnVjdHVyZWRBcHBlbmRQYXJpdHkpIHsKCSAgICAgICAgaWYgKHN0cnVjdHVyZWRBcHBlbmRTZXF1ZW5jZU51bWJlciA9PT0gdm9pZCAwKSB7IHN0cnVjdHVyZWRBcHBlbmRTZXF1ZW5jZU51bWJlciA9IC0xOyB9CgkgICAgICAgIGlmIChzdHJ1Y3R1cmVkQXBwZW5kUGFyaXR5ID09PSB2b2lkIDApIHsgc3RydWN0dXJlZEFwcGVuZFBhcml0eSA9IC0xOyB9CgkgICAgICAgIHRoaXMucmF3Qnl0ZXMgPSByYXdCeXRlczsKCSAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKCSAgICAgICAgdGhpcy5ieXRlU2VnbWVudHMgPSBieXRlU2VnbWVudHM7CgkgICAgICAgIHRoaXMuZWNMZXZlbCA9IGVjTGV2ZWw7CgkgICAgICAgIHRoaXMuc3RydWN0dXJlZEFwcGVuZFNlcXVlbmNlTnVtYmVyID0gc3RydWN0dXJlZEFwcGVuZFNlcXVlbmNlTnVtYmVyOwoJICAgICAgICB0aGlzLnN0cnVjdHVyZWRBcHBlbmRQYXJpdHkgPSBzdHJ1Y3R1cmVkQXBwZW5kUGFyaXR5OwoJICAgICAgICB0aGlzLm51bUJpdHMgPSAocmF3Qnl0ZXMgPT09IHVuZGVmaW5lZCB8fCByYXdCeXRlcyA9PT0gbnVsbCkgPyAwIDogOCAqIHJhd0J5dGVzLmxlbmd0aDsKCSAgICB9CgkgICAgLyoqCgkgICAgICogQHJldHVybiByYXcgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgYXBwbGljYWJsZQoJICAgICAqLwoJICAgIERlY29kZXJSZXN1bHQucHJvdG90eXBlLmdldFJhd0J5dGVzID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5yYXdCeXRlczsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gaG93IG1hbnkgYml0cyBvZiB7QGxpbmsgI2dldFJhd0J5dGVzKCl9IGFyZSB2YWxpZDsgdHlwaWNhbGx5IDggdGltZXMgaXRzIGxlbmd0aAoJICAgICAqIEBzaW5jZSAzLjMuMAoJICAgICAqLwoJICAgIERlY29kZXJSZXN1bHQucHJvdG90eXBlLmdldE51bUJpdHMgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLm51bUJpdHM7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcGFyYW0gbnVtQml0cyBvdmVycmlkZXMgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgYXJlIHZhbGlkIGluIHtAbGluayAjZ2V0UmF3Qnl0ZXMoKX0KCSAgICAgKiBAc2luY2UgMy4zLjAKCSAgICAgKi8KCSAgICBEZWNvZGVyUmVzdWx0LnByb3RvdHlwZS5zZXROdW1CaXRzID0gZnVuY3Rpb24gKG51bUJpdHMgLyppbnQqLykgewoJICAgICAgICB0aGlzLm51bUJpdHMgPSBudW1CaXRzOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHQKCSAgICAgKi8KCSAgICBEZWNvZGVyUmVzdWx0LnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy50ZXh0OwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiBsaXN0IG9mIGJ5dGUgc2VnbWVudHMgaW4gdGhlIHJlc3VsdCwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBhcHBsaWNhYmxlCgkgICAgICovCgkgICAgRGVjb2RlclJlc3VsdC5wcm90b3R5cGUuZ2V0Qnl0ZVNlZ21lbnRzID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5ieXRlU2VnbWVudHM7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIG5hbWUgb2YgZXJyb3IgY29ycmVjdGlvbiBsZXZlbCB1c2VkLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGFwcGxpY2FibGUKCSAgICAgKi8KCSAgICBEZWNvZGVyUmVzdWx0LnByb3RvdHlwZS5nZXRFQ0xldmVsID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5lY0xldmVsOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiBudW1iZXIgb2YgZXJyb3JzIGNvcnJlY3RlZCwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBhcHBsaWNhYmxlCgkgICAgICovCgkgICAgRGVjb2RlclJlc3VsdC5wcm90b3R5cGUuZ2V0RXJyb3JzQ29ycmVjdGVkID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5lcnJvcnNDb3JyZWN0ZWQ7CgkgICAgfTsKCSAgICBEZWNvZGVyUmVzdWx0LnByb3RvdHlwZS5zZXRFcnJvcnNDb3JyZWN0ZWQgPSBmdW5jdGlvbiAoZXJyb3JzQ29ycmVjdGVkIC8qSW50ZWdlciovKSB7CgkgICAgICAgIHRoaXMuZXJyb3JzQ29ycmVjdGVkID0gZXJyb3JzQ29ycmVjdGVkOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiBudW1iZXIgb2YgZXJhc3VyZXMgY29ycmVjdGVkLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGFwcGxpY2FibGUKCSAgICAgKi8KCSAgICBEZWNvZGVyUmVzdWx0LnByb3RvdHlwZS5nZXRFcmFzdXJlcyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuZXJhc3VyZXM7CgkgICAgfTsKCSAgICBEZWNvZGVyUmVzdWx0LnByb3RvdHlwZS5zZXRFcmFzdXJlcyA9IGZ1bmN0aW9uIChlcmFzdXJlcyAvKkludGVnZXIqLykgewoJICAgICAgICB0aGlzLmVyYXN1cmVzID0gZXJhc3VyZXM7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIGFyYml0cmFyeSBhZGRpdGlvbmFsIG1ldGFkYXRhCgkgICAgICovCgkgICAgRGVjb2RlclJlc3VsdC5wcm90b3R5cGUuZ2V0T3RoZXIgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLm90aGVyOwoJICAgIH07CgkgICAgRGVjb2RlclJlc3VsdC5wcm90b3R5cGUuc2V0T3RoZXIgPSBmdW5jdGlvbiAob3RoZXIpIHsKCSAgICAgICAgdGhpcy5vdGhlciA9IG90aGVyOwoJICAgIH07CgkgICAgRGVjb2RlclJlc3VsdC5wcm90b3R5cGUuaGFzU3RydWN0dXJlZEFwcGVuZCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlZEFwcGVuZFBhcml0eSA+PSAwICYmIHRoaXMuc3RydWN0dXJlZEFwcGVuZFNlcXVlbmNlTnVtYmVyID49IDA7CgkgICAgfTsKCSAgICBEZWNvZGVyUmVzdWx0LnByb3RvdHlwZS5nZXRTdHJ1Y3R1cmVkQXBwZW5kUGFyaXR5ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5zdHJ1Y3R1cmVkQXBwZW5kUGFyaXR5OwoJICAgIH07CgkgICAgRGVjb2RlclJlc3VsdC5wcm90b3R5cGUuZ2V0U3RydWN0dXJlZEFwcGVuZFNlcXVlbmNlTnVtYmVyID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5zdHJ1Y3R1cmVkQXBwZW5kU2VxdWVuY2VOdW1iZXI7CgkgICAgfTsKCSAgICByZXR1cm4gRGVjb2RlclJlc3VsdDsKCX0oKSk7CglEZWNvZGVyUmVzdWx0JDEuZGVmYXVsdCA9IERlY29kZXJSZXN1bHQ7CgoJdmFyIE1vZGUgPSB7fTsKCgkoZnVuY3Rpb24gKGV4cG9ydHMpIHsKCS8qCgkgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCglPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJZXhwb3J0cy5Nb2RlVmFsdWVzID0gdm9pZCAwOwoJdmFyIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl8xID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uJDE7Cgl2YXIgTW9kZVZhbHVlczsKCShmdW5jdGlvbiAoTW9kZVZhbHVlcykgewoJICAgIE1vZGVWYWx1ZXNbTW9kZVZhbHVlc1siVEVSTUlOQVRPUiJdID0gMF0gPSAiVEVSTUlOQVRPUiI7CgkgICAgTW9kZVZhbHVlc1tNb2RlVmFsdWVzWyJOVU1FUklDIl0gPSAxXSA9ICJOVU1FUklDIjsKCSAgICBNb2RlVmFsdWVzW01vZGVWYWx1ZXNbIkFMUEhBTlVNRVJJQyJdID0gMl0gPSAiQUxQSEFOVU1FUklDIjsKCSAgICBNb2RlVmFsdWVzW01vZGVWYWx1ZXNbIlNUUlVDVFVSRURfQVBQRU5EIl0gPSAzXSA9ICJTVFJVQ1RVUkVEX0FQUEVORCI7CgkgICAgTW9kZVZhbHVlc1tNb2RlVmFsdWVzWyJCWVRFIl0gPSA0XSA9ICJCWVRFIjsKCSAgICBNb2RlVmFsdWVzW01vZGVWYWx1ZXNbIkVDSSJdID0gNV0gPSAiRUNJIjsKCSAgICBNb2RlVmFsdWVzW01vZGVWYWx1ZXNbIktBTkpJIl0gPSA2XSA9ICJLQU5KSSI7CgkgICAgTW9kZVZhbHVlc1tNb2RlVmFsdWVzWyJGTkMxX0ZJUlNUX1BPU0lUSU9OIl0gPSA3XSA9ICJGTkMxX0ZJUlNUX1BPU0lUSU9OIjsKCSAgICBNb2RlVmFsdWVzW01vZGVWYWx1ZXNbIkZOQzFfU0VDT05EX1BPU0lUSU9OIl0gPSA4XSA9ICJGTkMxX1NFQ09ORF9QT1NJVElPTiI7CgkgICAgLyoqIFNlZSBHQlQgMTgyODQtMjAwMDsgIkhhbnppIiBpcyBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG1vZGUgbmFtZS4gKi8KCSAgICBNb2RlVmFsdWVzW01vZGVWYWx1ZXNbIkhBTlpJIl0gPSA5XSA9ICJIQU5aSSI7Cgl9KShNb2RlVmFsdWVzID0gZXhwb3J0cy5Nb2RlVmFsdWVzIHx8IChleHBvcnRzLk1vZGVWYWx1ZXMgPSB7fSkpOwoJLyoqCgkgKiA8cD5TZWUgSVNPIDE4MDA0OjIwMDYsIDYuNC4xLCBUYWJsZXMgMiBhbmQgMy4gVGhpcyBlbnVtIGVuY2Fwc3VsYXRlcyB0aGUgdmFyaW91cyBtb2RlcyBpbiB3aGljaAoJICogZGF0YSBjYW4gYmUgZW5jb2RlZCB0byBiaXRzIGluIHRoZSBRUiBjb2RlIHN0YW5kYXJkLjwvcD4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICovCgl2YXIgTW9kZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBNb2RlKHZhbHVlLCBzdHJpbmdWYWx1ZSwgY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMsIGJpdHMgLyppbnQqLykgewoJICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CgkgICAgICAgIHRoaXMuc3RyaW5nVmFsdWUgPSBzdHJpbmdWYWx1ZTsKCSAgICAgICAgdGhpcy5jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9ucyA9IGNoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zOwoJICAgICAgICB0aGlzLmJpdHMgPSBiaXRzOwoJICAgICAgICBNb2RlLkZPUl9CSVRTLnNldChiaXRzLCB0aGlzKTsKCSAgICAgICAgTW9kZS5GT1JfVkFMVUUuc2V0KHZhbHVlLCB0aGlzKTsKCSAgICB9CgkgICAgLyoqCgkgICAgICogQHBhcmFtIGJpdHMgZm91ciBiaXRzIGVuY29kaW5nIGEgUVIgQ29kZSBkYXRhIG1vZGUKCSAgICAgKiBAcmV0dXJuIE1vZGUgZW5jb2RlZCBieSB0aGVzZSBiaXRzCgkgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYml0cyBkbyBub3QgY29ycmVzcG9uZCB0byBhIGtub3duIG1vZGUKCSAgICAgKi8KCSAgICBNb2RlLmZvckJpdHMgPSBmdW5jdGlvbiAoYml0cyAvKmludCovKSB7CgkgICAgICAgIHZhciBtb2RlID0gTW9kZS5GT1JfQklUUy5nZXQoYml0cyk7CgkgICAgICAgIGlmICh1bmRlZmluZWQgPT09IG1vZGUpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIG1vZGU7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcGFyYW0gdmVyc2lvbiB2ZXJzaW9uIGluIHF1ZXN0aW9uCgkgICAgICogQHJldHVybiBudW1iZXIgb2YgYml0cyB1c2VkLCBpbiB0aGlzIFFSIENvZGUgc3ltYm9sIHtAbGluayBWZXJzaW9ufSwgdG8gZW5jb2RlIHRoZQoJICAgICAqICAgICAgICAgY291bnQgb2YgY2hhcmFjdGVycyB0aGF0IHdpbGwgZm9sbG93IGVuY29kZWQgaW4gdGhpcyBNb2RlCgkgICAgICovCgkgICAgTW9kZS5wcm90b3R5cGUuZ2V0Q2hhcmFjdGVyQ291bnRCaXRzID0gZnVuY3Rpb24gKHZlcnNpb24pIHsKCSAgICAgICAgdmFyIHZlcnNpb25OdW1iZXIgPSB2ZXJzaW9uLmdldFZlcnNpb25OdW1iZXIoKTsKCSAgICAgICAgdmFyIG9mZnNldDsKCSAgICAgICAgaWYgKHZlcnNpb25OdW1iZXIgPD0gOSkgewoJICAgICAgICAgICAgb2Zmc2V0ID0gMDsKCSAgICAgICAgfQoJICAgICAgICBlbHNlIGlmICh2ZXJzaW9uTnVtYmVyIDw9IDI2KSB7CgkgICAgICAgICAgICBvZmZzZXQgPSAxOwoJICAgICAgICB9CgkgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgb2Zmc2V0ID0gMjsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uc1tvZmZzZXRdOwoJICAgIH07CgkgICAgTW9kZS5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwoJICAgIH07CgkgICAgTW9kZS5wcm90b3R5cGUuZ2V0Qml0cyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuYml0czsKCSAgICB9OwoJICAgIE1vZGUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChvKSB7CgkgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNb2RlKSkgewoJICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICAgIHZhciBvdGhlciA9IG87CgkgICAgICAgIHJldHVybiB0aGlzLnZhbHVlID09PSBvdGhlci52YWx1ZTsKCSAgICB9OwoJICAgIE1vZGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdWYWx1ZTsKCSAgICB9OwoJICAgIE1vZGUuRk9SX0JJVFMgPSBuZXcgTWFwKCk7CgkgICAgTW9kZS5GT1JfVkFMVUUgPSBuZXcgTWFwKCk7CgkgICAgTW9kZS5URVJNSU5BVE9SID0gbmV3IE1vZGUoTW9kZVZhbHVlcy5URVJNSU5BVE9SLCAnVEVSTUlOQVRPUicsIEludDMyQXJyYXkuZnJvbShbMCwgMCwgMF0pLCAweDAwKTsgLy8gTm90IHJlYWxseSBhIG1vZGUuLi4KCSAgICBNb2RlLk5VTUVSSUMgPSBuZXcgTW9kZShNb2RlVmFsdWVzLk5VTUVSSUMsICdOVU1FUklDJywgSW50MzJBcnJheS5mcm9tKFsxMCwgMTIsIDE0XSksIDB4MDEpOwoJICAgIE1vZGUuQUxQSEFOVU1FUklDID0gbmV3IE1vZGUoTW9kZVZhbHVlcy5BTFBIQU5VTUVSSUMsICdBTFBIQU5VTUVSSUMnLCBJbnQzMkFycmF5LmZyb20oWzksIDExLCAxM10pLCAweDAyKTsKCSAgICBNb2RlLlNUUlVDVFVSRURfQVBQRU5EID0gbmV3IE1vZGUoTW9kZVZhbHVlcy5TVFJVQ1RVUkVEX0FQUEVORCwgJ1NUUlVDVFVSRURfQVBQRU5EJywgSW50MzJBcnJheS5mcm9tKFswLCAwLCAwXSksIDB4MDMpOyAvLyBOb3Qgc3VwcG9ydGVkCgkgICAgTW9kZS5CWVRFID0gbmV3IE1vZGUoTW9kZVZhbHVlcy5CWVRFLCAnQllURScsIEludDMyQXJyYXkuZnJvbShbOCwgMTYsIDE2XSksIDB4MDQpOwoJICAgIE1vZGUuRUNJID0gbmV3IE1vZGUoTW9kZVZhbHVlcy5FQ0ksICdFQ0knLCBJbnQzMkFycmF5LmZyb20oWzAsIDAsIDBdKSwgMHgwNyk7IC8vIGNoYXJhY3RlciBjb3VudHMgZG9uJ3QgYXBwbHkKCSAgICBNb2RlLktBTkpJID0gbmV3IE1vZGUoTW9kZVZhbHVlcy5LQU5KSSwgJ0tBTkpJJywgSW50MzJBcnJheS5mcm9tKFs4LCAxMCwgMTJdKSwgMHgwOCk7CgkgICAgTW9kZS5GTkMxX0ZJUlNUX1BPU0lUSU9OID0gbmV3IE1vZGUoTW9kZVZhbHVlcy5GTkMxX0ZJUlNUX1BPU0lUSU9OLCAnRk5DMV9GSVJTVF9QT1NJVElPTicsIEludDMyQXJyYXkuZnJvbShbMCwgMCwgMF0pLCAweDA1KTsKCSAgICBNb2RlLkZOQzFfU0VDT05EX1BPU0lUSU9OID0gbmV3IE1vZGUoTW9kZVZhbHVlcy5GTkMxX1NFQ09ORF9QT1NJVElPTiwgJ0ZOQzFfU0VDT05EX1BPU0lUSU9OJywgSW50MzJBcnJheS5mcm9tKFswLCAwLCAwXSksIDB4MDkpOwoJICAgIC8qKiBTZWUgR0JUIDE4Mjg0LTIwMDA7ICJIYW56aSIgaXMgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBtb2RlIG5hbWUuICovCgkgICAgTW9kZS5IQU5aSSA9IG5ldyBNb2RlKE1vZGVWYWx1ZXMuSEFOWkksICdIQU5aSScsIEludDMyQXJyYXkuZnJvbShbOCwgMTAsIDEyXSksIDB4MEQpOwoJICAgIHJldHVybiBNb2RlOwoJfSgpKTsKCWV4cG9ydHMuZGVmYXVsdCA9IE1vZGU7CgoJfShNb2RlKSk7CgoJLyoKCSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWNvZGVkQml0U3RyZWFtUGFyc2VyJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcucXJjb2RlLmRlY29kZXIgeyovCgl2YXIgQml0U291cmNlXzEgPSBCaXRTb3VyY2UkMTsKCXZhciBDaGFyYWN0ZXJTZXRFQ0lfMSA9IENoYXJhY3RlclNldEVDSTsKCXZhciBEZWNvZGVyUmVzdWx0XzEgPSBEZWNvZGVyUmVzdWx0JDE7Cgl2YXIgU3RyaW5nVXRpbHNfMSA9IFN0cmluZ1V0aWxzJDE7Cgl2YXIgRm9ybWF0RXhjZXB0aW9uXzEgPSBGb3JtYXRFeGNlcHRpb24kMTsKCXZhciBTdHJpbmdCdWlsZGVyXzEgPSBTdHJpbmdCdWlsZGVyJDE7Cgl2YXIgU3RyaW5nRW5jb2RpbmdfMSA9IFN0cmluZ0VuY29kaW5nJDE7Cgl2YXIgTW9kZV8xID0gTW9kZTsKCS8qaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsqLwoJLyppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsqLwoJLyppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ki8KCS8qaW1wb3J0IGphdmEudXRpbC5MaXN0OyovCgkvKmltcG9ydCBqYXZhLnV0aWwuTWFwOyovCgkvKioKCSAqIDxwPlFSIENvZGVzIGNhbiBlbmNvZGUgdGV4dCBhcyBiaXRzIGluIG9uZSBvZiBzZXZlcmFsIG1vZGVzLCBhbmQgY2FuIHVzZSBtdWx0aXBsZSBtb2RlcwoJICogaW4gb25lIFFSIENvZGUuIFRoaXMgY2xhc3MgZGVjb2RlcyB0aGUgYml0cyBiYWNrIGludG8gdGV4dC48L3A+CgkgKgoJICogPHA+U2VlIElTTyAxODAwNDoyMDA2LCA2LjQuMyAtIDYuNC43PC9wPgoJICoKCSAqIEBhdXRob3IgU2VhbiBPd2VuCgkgKi8KCXZhciBEZWNvZGVkQml0U3RyZWFtUGFyc2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIGZ1bmN0aW9uIERlY29kZWRCaXRTdHJlYW1QYXJzZXIoKSB7CgkgICAgfQoJICAgIERlY29kZWRCaXRTdHJlYW1QYXJzZXIuZGVjb2RlID0gZnVuY3Rpb24gKGJ5dGVzLCB2ZXJzaW9uLCBlY0xldmVsLCBoaW50cykgewoJICAgICAgICB2YXIgYml0cyA9IG5ldyBCaXRTb3VyY2VfMS5kZWZhdWx0KGJ5dGVzKTsKCSAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyXzEuZGVmYXVsdCgpOwoJICAgICAgICB2YXIgYnl0ZVNlZ21lbnRzID0gbmV3IEFycmF5KCk7IC8vIDEKCSAgICAgICAgLy8gVFlQRVNDUklQVFBPUlQ6IEkgZG8gbm90IHVzZSBjb25zdHJ1Y3RvciB3aXRoIHNpemUgMSBhcyBpbiBvcmlnaW5hbCBKYXZhIG1lYW5zIGNhcGFjaXR5IGFuZCB0aGUgYXJyYXkgbGVuZ3RoIGlzIGNoZWNrZWQgYmVsb3cKCSAgICAgICAgdmFyIHN5bWJvbFNlcXVlbmNlID0gLTE7CgkgICAgICAgIHZhciBwYXJpdHlEYXRhID0gLTE7CgkgICAgICAgIHRyeSB7CgkgICAgICAgICAgICB2YXIgY3VycmVudENoYXJhY3RlclNldEVDSSA9IG51bGw7CgkgICAgICAgICAgICB2YXIgZmMxSW5FZmZlY3QgPSBmYWxzZTsKCSAgICAgICAgICAgIHZhciBtb2RlID0gdm9pZCAwOwoJICAgICAgICAgICAgZG8gewoJICAgICAgICAgICAgICAgIC8vIFdoaWxlIHN0aWxsIGFub3RoZXIgc2VnbWVudCB0byByZWFkLi4uCgkgICAgICAgICAgICAgICAgaWYgKGJpdHMuYXZhaWxhYmxlKCkgPCA0KSB7CgkgICAgICAgICAgICAgICAgICAgIC8vIE9LLCBhc3N1bWUgd2UncmUgZG9uZS4gUmVhbGx5LCBhIFRFUk1JTkFUT1IgbW9kZSBzaG91bGQgaGF2ZSBiZWVuIHJlY29yZGVkIGhlcmUKCSAgICAgICAgICAgICAgICAgICAgbW9kZSA9IE1vZGVfMS5kZWZhdWx0LlRFUk1JTkFUT1I7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgICAgICAgICB2YXIgbW9kZUJpdHMgPSBiaXRzLnJlYWRCaXRzKDQpOwoJICAgICAgICAgICAgICAgICAgICBtb2RlID0gTW9kZV8xLmRlZmF1bHQuZm9yQml0cyhtb2RlQml0cyk7IC8vIG1vZGUgaXMgZW5jb2RlZCBieSA0IGJpdHMKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7CgkgICAgICAgICAgICAgICAgICAgIGNhc2UgTW9kZV8xLmRlZmF1bHQuVEVSTUlOQVRPUjoKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIE1vZGVfMS5kZWZhdWx0LkZOQzFfRklSU1RfUE9TSVRJT046CgkgICAgICAgICAgICAgICAgICAgIGNhc2UgTW9kZV8xLmRlZmF1bHQuRk5DMV9TRUNPTkRfUE9TSVRJT046CgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBsaXR0bGUgd2l0aCBGTkMxIGV4Y2VwdCBhbHRlciB0aGUgcGFyc2VkIHJlc3VsdCBhIGJpdCBhY2NvcmRpbmcgdG8gdGhlIHNwZWMKCSAgICAgICAgICAgICAgICAgICAgICAgIGZjMUluRWZmZWN0ID0gdHJ1ZTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBjYXNlIE1vZGVfMS5kZWZhdWx0LlNUUlVDVFVSRURfQVBQRU5EOgoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMuYXZhaWxhYmxlKCkgPCAxNikgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXF1ZW5jZSBudW1iZXIgYW5kIHBhcml0eSBpcyBhZGRlZCBsYXRlciB0byB0aGUgcmVzdWx0IG1ldGFkYXRhCgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIG5leHQgOCBiaXRzIChzeW1ib2wgc2VxdWVuY2UgIykgYW5kIDggYml0cyAoZGF0YTogcGFyaXR5KSwgdGhlbiBjb250aW51ZQoJICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sU2VxdWVuY2UgPSBiaXRzLnJlYWRCaXRzKDgpOwoJICAgICAgICAgICAgICAgICAgICAgICAgcGFyaXR5RGF0YSA9IGJpdHMucmVhZEJpdHMoOCk7CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSBNb2RlXzEuZGVmYXVsdC5FQ0k6CgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBkb2Vzbid0IGFwcGx5IHRvIEVDSQoJICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5wYXJzZUVDSVZhbHVlKGJpdHMpOwoJICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENoYXJhY3RlclNldEVDSSA9IENoYXJhY3RlclNldEVDSV8xLmRlZmF1bHQuZ2V0Q2hhcmFjdGVyU2V0RUNJQnlWYWx1ZSh2YWx1ZSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudENoYXJhY3RlclNldEVDSSA9PT0gbnVsbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgY2FzZSBNb2RlXzEuZGVmYXVsdC5IQU5aSToKCSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGhhbmRsZSBIYW56aSBtb2RlIHdoaWNoIGRvZXMgbm90IHN0YXJ0IHdpdGggY2hhcmFjdGVyIGNvdW50CgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGluZXNlIG1vZGUgY29udGFpbnMgYSBzdWIgc2V0IGluZGljYXRvciByaWdodCBhZnRlciBtb2RlIGluZGljYXRvcgoJICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YnNldCA9IGJpdHMucmVhZEJpdHMoNCk7CgkgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRIYW56aSA9IGJpdHMucmVhZEJpdHMobW9kZS5nZXRDaGFyYWN0ZXJDb3VudEJpdHModmVyc2lvbikpOwoJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnNldCA9PT0gRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5HQjIzMTJfU1VCU0VUKSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5kZWNvZGVIYW56aVNlZ21lbnQoYml0cywgcmVzdWx0LCBjb3VudEhhbnppKTsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gIk5vcm1hbCIgUVIgY29kZSBtb2RlczoKCSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvdyBtYW55IGNoYXJhY3RlcnMgd2lsbCBmb2xsb3csIGVuY29kZWQgaW4gdGhpcyBtb2RlPwoJICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gYml0cy5yZWFkQml0cyhtb2RlLmdldENoYXJhY3RlckNvdW50Qml0cyh2ZXJzaW9uKSk7CgkgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vZGVfMS5kZWZhdWx0Lk5VTUVSSUM6CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZWRCaXRTdHJlYW1QYXJzZXIuZGVjb2RlTnVtZXJpY1NlZ21lbnQoYml0cywgcmVzdWx0LCBjb3VudCk7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW9kZV8xLmRlZmF1bHQuQUxQSEFOVU1FUklDOgoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmRlY29kZUFscGhhbnVtZXJpY1NlZ21lbnQoYml0cywgcmVzdWx0LCBjb3VudCwgZmMxSW5FZmZlY3QpOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vZGVfMS5kZWZhdWx0LkJZVEU6CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZWRCaXRTdHJlYW1QYXJzZXIuZGVjb2RlQnl0ZVNlZ21lbnQoYml0cywgcmVzdWx0LCBjb3VudCwgY3VycmVudENoYXJhY3RlclNldEVDSSwgYnl0ZVNlZ21lbnRzLCBoaW50cyk7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW9kZV8xLmRlZmF1bHQuS0FOSkk6CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZWRCaXRTdHJlYW1QYXJzZXIuZGVjb2RlS2FuamlTZWdtZW50KGJpdHMsIHJlc3VsdCwgY291bnQpOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEuZGVmYXVsdCgpOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSB3aGlsZSAobW9kZSAhPT0gTW9kZV8xLmRlZmF1bHQuVEVSTUlOQVRPUik7CgkgICAgICAgIH0KCSAgICAgICAgY2F0Y2ggKGlhZSAvKjogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKi8pIHsKCSAgICAgICAgICAgIC8vIGZyb20gcmVhZEJpdHMoKSBjYWxscwoJICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xLmRlZmF1bHQoKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gbmV3IERlY29kZXJSZXN1bHRfMS5kZWZhdWx0KGJ5dGVzLCByZXN1bHQudG9TdHJpbmcoKSwgYnl0ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBieXRlU2VnbWVudHMsIGVjTGV2ZWwgPT09IG51bGwgPyBudWxsIDogZWNMZXZlbC50b1N0cmluZygpLCBzeW1ib2xTZXF1ZW5jZSwgcGFyaXR5RGF0YSk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBTZWUgc3BlY2lmaWNhdGlvbiBHQlQgMTgyODQtMjAwMAoJICAgICAqLwoJICAgIERlY29kZWRCaXRTdHJlYW1QYXJzZXIuZGVjb2RlSGFuemlTZWdtZW50ID0gZnVuY3Rpb24gKGJpdHMsIHJlc3VsdCwgY291bnQgLyppbnQqLykgewoJICAgICAgICAvLyBEb24ndCBjcmFzaCB0cnlpbmcgdG8gcmVhZCBtb3JlIGJpdHMgdGhhbiB3ZSBoYXZlIGF2YWlsYWJsZS4KCSAgICAgICAgaWYgKGNvdW50ICogMTMgPiBiaXRzLmF2YWlsYWJsZSgpKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEuZGVmYXVsdCgpOwoJICAgICAgICB9CgkgICAgICAgIC8vIEVhY2ggY2hhcmFjdGVyIHdpbGwgcmVxdWlyZSAyIGJ5dGVzLiBSZWFkIHRoZSBjaGFyYWN0ZXJzIGFzIDItYnl0ZSBwYWlycwoJICAgICAgICAvLyBhbmQgZGVjb2RlIGFzIEdCMjMxMiBhZnRlcndhcmRzCgkgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSgyICogY291bnQpOwoJICAgICAgICB2YXIgb2Zmc2V0ID0gMDsKCSAgICAgICAgd2hpbGUgKGNvdW50ID4gMCkgewoJICAgICAgICAgICAgLy8gRWFjaCAxMyBiaXRzIGVuY29kZXMgYSAyLWJ5dGUgY2hhcmFjdGVyCgkgICAgICAgICAgICB2YXIgdHdvQnl0ZXMgPSBiaXRzLnJlYWRCaXRzKDEzKTsKCSAgICAgICAgICAgIHZhciBhc3NlbWJsZWRUd29CeXRlcyA9ICgoKHR3b0J5dGVzIC8gMHgwNjApIDw8IDgpICYgMHhGRkZGRkZGRikgfCAodHdvQnl0ZXMgJSAweDA2MCk7CgkgICAgICAgICAgICBpZiAoYXNzZW1ibGVkVHdvQnl0ZXMgPCAweDAwM0JGKSB7CgkgICAgICAgICAgICAgICAgLy8gSW4gdGhlIDB4QTFBMSB0byAweEFBRkUgcmFuZ2UKCSAgICAgICAgICAgICAgICBhc3NlbWJsZWRUd29CeXRlcyArPSAweDBBMUExOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgLy8gSW4gdGhlIDB4QjBBMSB0byAweEZBRkUgcmFuZ2UKCSAgICAgICAgICAgICAgICBhc3NlbWJsZWRUd29CeXRlcyArPSAweDBBNkExOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gPSAvKihieXRlKSAqLyAoKGFzc2VtYmxlZFR3b0J5dGVzID4+IDgpICYgMHhGRik7CgkgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgMV0gPSAvKihieXRlKSAqLyAoYXNzZW1ibGVkVHdvQnl0ZXMgJiAweEZGKTsKCSAgICAgICAgICAgIG9mZnNldCArPSAyOwoJICAgICAgICAgICAgY291bnQtLTsKCSAgICAgICAgfQoJICAgICAgICB0cnkgewoJICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmdFbmNvZGluZ18xLmRlZmF1bHQuZGVjb2RlKGJ1ZmZlciwgU3RyaW5nVXRpbHNfMS5kZWZhdWx0LkdCMjMxMikpOwoJICAgICAgICAgICAgLy8gVFlQRVNDUklQVFBPUlQ6IFRPRE86IGltcGxlbWVudCBHQjIzMTIgZGVjb2RlLiBTdHJpbmdWaWV3IGZyb20gTUROIGNvdWxkIGJlIGEgc3RhcnRpbmcgcG9pbnQKCSAgICAgICAgfQoJICAgICAgICBjYXRjaCAoaWdub3JlZCAvKjogVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiovKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEuZGVmYXVsdChpZ25vcmVkKTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5kZWNvZGVLYW5qaVNlZ21lbnQgPSBmdW5jdGlvbiAoYml0cywgcmVzdWx0LCBjb3VudCAvKmludCovKSB7CgkgICAgICAgIC8vIERvbid0IGNyYXNoIHRyeWluZyB0byByZWFkIG1vcmUgYml0cyB0aGFuIHdlIGhhdmUgYXZhaWxhYmxlLgoJICAgICAgICBpZiAoY291bnQgKiAxMyA+IGJpdHMuYXZhaWxhYmxlKCkpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICAgICAgLy8gRWFjaCBjaGFyYWN0ZXIgd2lsbCByZXF1aXJlIDIgYnl0ZXMuIFJlYWQgdGhlIGNoYXJhY3RlcnMgYXMgMi1ieXRlIHBhaXJzCgkgICAgICAgIC8vIGFuZCBkZWNvZGUgYXMgU2hpZnRfSklTIGFmdGVyd2FyZHMKCSAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDIgKiBjb3VudCk7CgkgICAgICAgIHZhciBvZmZzZXQgPSAwOwoJICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB7CgkgICAgICAgICAgICAvLyBFYWNoIDEzIGJpdHMgZW5jb2RlcyBhIDItYnl0ZSBjaGFyYWN0ZXIKCSAgICAgICAgICAgIHZhciB0d29CeXRlcyA9IGJpdHMucmVhZEJpdHMoMTMpOwoJICAgICAgICAgICAgdmFyIGFzc2VtYmxlZFR3b0J5dGVzID0gKCgodHdvQnl0ZXMgLyAweDBDMCkgPDwgOCkgJiAweEZGRkZGRkZGKSB8ICh0d29CeXRlcyAlIDB4MEMwKTsKCSAgICAgICAgICAgIGlmIChhc3NlbWJsZWRUd29CeXRlcyA8IDB4MDFGMDApIHsKCSAgICAgICAgICAgICAgICAvLyBJbiB0aGUgMHg4MTQwIHRvIDB4OUZGQyByYW5nZQoJICAgICAgICAgICAgICAgIGFzc2VtYmxlZFR3b0J5dGVzICs9IDB4MDgxNDA7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICAvLyBJbiB0aGUgMHhFMDQwIHRvIDB4RUJCRiByYW5nZQoJICAgICAgICAgICAgICAgIGFzc2VtYmxlZFR3b0J5dGVzICs9IDB4MEMxNDA7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSA9IC8qKGJ5dGUpICovIChhc3NlbWJsZWRUd29CeXRlcyA+PiA4KTsKCSAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQgKyAxXSA9IC8qKGJ5dGUpICovIGFzc2VtYmxlZFR3b0J5dGVzOwoJICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CgkgICAgICAgICAgICBjb3VudC0tOwoJICAgICAgICB9CgkgICAgICAgIC8vIFNoaWZ0X0pJUyBtYXkgbm90IGJlIHN1cHBvcnRlZCBpbiBzb21lIGVudmlyb25tZW50czoKCSAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nRW5jb2RpbmdfMS5kZWZhdWx0LmRlY29kZShidWZmZXIsIFN0cmluZ1V0aWxzXzEuZGVmYXVsdC5TSElGVF9KSVMpKTsKCSAgICAgICAgICAgIC8vIFRZUEVTQ1JJUFRQT1JUOiBUT0RPOiBpbXBsZW1lbnQgU0hJRlRfSklTIGRlY29kZS4gU3RyaW5nVmlldyBmcm9tIE1ETiBjb3VsZCBiZSBhIHN0YXJ0aW5nIHBvaW50CgkgICAgICAgIH0KCSAgICAgICAgY2F0Y2ggKGlnbm9yZWQgLyo6IFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24qLykgewoJICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xLmRlZmF1bHQoaWdub3JlZCk7CgkgICAgICAgIH0KCSAgICB9OwoJICAgIERlY29kZWRCaXRTdHJlYW1QYXJzZXIuZGVjb2RlQnl0ZVNlZ21lbnQgPSBmdW5jdGlvbiAoYml0cywgcmVzdWx0LCBjb3VudCAvKmludCovLCBjdXJyZW50Q2hhcmFjdGVyU2V0RUNJLCBieXRlU2VnbWVudHMsIGhpbnRzKSB7CgkgICAgICAgIC8vIERvbid0IGNyYXNoIHRyeWluZyB0byByZWFkIG1vcmUgYml0cyB0aGFuIHdlIGhhdmUgYXZhaWxhYmxlLgoJICAgICAgICBpZiAoOCAqIGNvdW50ID4gYml0cy5hdmFpbGFibGUoKSkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xLmRlZmF1bHQoKTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgcmVhZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoY291bnQpOwoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCSAgICAgICAgICAgIHJlYWRCeXRlc1tpXSA9IC8qKGJ5dGUpICovIGJpdHMucmVhZEJpdHMoOCk7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIGVuY29kaW5nOwoJICAgICAgICBpZiAoY3VycmVudENoYXJhY3RlclNldEVDSSA9PT0gbnVsbCkgewoJICAgICAgICAgICAgLy8gVGhlIHNwZWMgaXNuJ3QgY2xlYXIgb24gdGhpcyBtb2RlOyBzZWUKCSAgICAgICAgICAgIC8vIHNlY3Rpb24gNi40LjU6IHQgZG9lcyBub3Qgc2F5IHdoaWNoIGVuY29kaW5nIHRvIGFzc3VtaW5nCgkgICAgICAgICAgICAvLyB1cG9uIGRlY29kaW5nLiBJIGhhdmUgc2VlbiBJU08tODg1OS0xIHVzZWQgYXMgd2VsbCBhcwoJICAgICAgICAgICAgLy8gU2hpZnRfSklTIC0tIHdpdGhvdXQgYW55dGhpbmcgbGlrZSBhbiBFQ0kgZGVzaWduYXRvciB0bwoJICAgICAgICAgICAgLy8gZ2l2ZSBhIGhpbnQuCgkgICAgICAgICAgICBlbmNvZGluZyA9IFN0cmluZ1V0aWxzXzEuZGVmYXVsdC5ndWVzc0VuY29kaW5nKHJlYWRCeXRlcywgaGludHMpOwoJICAgICAgICB9CgkgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgZW5jb2RpbmcgPSBjdXJyZW50Q2hhcmFjdGVyU2V0RUNJLmdldE5hbWUoKTsKCSAgICAgICAgfQoJICAgICAgICB0cnkgewoJICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmdFbmNvZGluZ18xLmRlZmF1bHQuZGVjb2RlKHJlYWRCeXRlcywgZW5jb2RpbmcpKTsKCSAgICAgICAgfQoJICAgICAgICBjYXRjaCAoaWdub3JlZCAvKjogVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiovKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEuZGVmYXVsdChpZ25vcmVkKTsKCSAgICAgICAgfQoJICAgICAgICBieXRlU2VnbWVudHMucHVzaChyZWFkQnl0ZXMpOwoJICAgIH07CgkgICAgRGVjb2RlZEJpdFN0cmVhbVBhcnNlci50b0FscGhhTnVtZXJpY0NoYXIgPSBmdW5jdGlvbiAodmFsdWUgLyppbnQqLykgewoJICAgICAgICBpZiAodmFsdWUgPj0gRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5BTFBIQU5VTUVSSUNfQ0hBUlMubGVuZ3RoKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEuZGVmYXVsdCgpOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBEZWNvZGVkQml0U3RyZWFtUGFyc2VyLkFMUEhBTlVNRVJJQ19DSEFSU1t2YWx1ZV07CgkgICAgfTsKCSAgICBEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmRlY29kZUFscGhhbnVtZXJpY1NlZ21lbnQgPSBmdW5jdGlvbiAoYml0cywgcmVzdWx0LCBjb3VudCAvKmludCovLCBmYzFJbkVmZmVjdCkgewoJICAgICAgICAvLyBSZWFkIHR3byBjaGFyYWN0ZXJzIGF0IGEgdGltZQoJICAgICAgICB2YXIgc3RhcnQgPSByZXN1bHQubGVuZ3RoKCk7CgkgICAgICAgIHdoaWxlIChjb3VudCA+IDEpIHsKCSAgICAgICAgICAgIGlmIChiaXRzLmF2YWlsYWJsZSgpIDwgMTEpIHsKCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEuZGVmYXVsdCgpOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIG5leHRUd29DaGFyc0JpdHMgPSBiaXRzLnJlYWRCaXRzKDExKTsKCSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoRGVjb2RlZEJpdFN0cmVhbVBhcnNlci50b0FscGhhTnVtZXJpY0NoYXIoTWF0aC5mbG9vcihuZXh0VHdvQ2hhcnNCaXRzIC8gNDUpKSk7CgkgICAgICAgICAgICByZXN1bHQuYXBwZW5kKERlY29kZWRCaXRTdHJlYW1QYXJzZXIudG9BbHBoYU51bWVyaWNDaGFyKG5leHRUd29DaGFyc0JpdHMgJSA0NSkpOwoJICAgICAgICAgICAgY291bnQgLT0gMjsKCSAgICAgICAgfQoJICAgICAgICBpZiAoY291bnQgPT09IDEpIHsKCSAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogb25lIGNoYXJhY3RlciBsZWZ0CgkgICAgICAgICAgICBpZiAoYml0cy5hdmFpbGFibGUoKSA8IDYpIHsKCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEuZGVmYXVsdCgpOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChEZWNvZGVkQml0U3RyZWFtUGFyc2VyLnRvQWxwaGFOdW1lcmljQ2hhcihiaXRzLnJlYWRCaXRzKDYpKSk7CgkgICAgICAgIH0KCSAgICAgICAgLy8gU2VlIHNlY3Rpb24gNi40LjguMSwgNi40LjguMgoJICAgICAgICBpZiAoZmMxSW5FZmZlY3QpIHsKCSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFzc2FnZSB0aGUgcmVzdWx0IGEgYml0IGlmIGluIGFuIEZOQzEgbW9kZToKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IHJlc3VsdC5sZW5ndGgoKTsgaSsrKSB7CgkgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jaGFyQXQoaSkgPT09ICclJykgewoJICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHJlc3VsdC5sZW5ndGgoKSAtIDEgJiYgcmVzdWx0LmNoYXJBdChpICsgMSkgPT09ICclJykgewoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gJSUgaXMgcmVuZGVyZWQgYXMgJQoJICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRlbGV0ZUNoYXJBdChpICsgMSk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBhbHBoYSBtb2RlLCAlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gRk5DMSBzZXBhcmF0b3IgMHgxRAoJICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldENoYXJBdChpLCBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MUQpKTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgIH07CgkgICAgRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5kZWNvZGVOdW1lcmljU2VnbWVudCA9IGZ1bmN0aW9uIChiaXRzLCByZXN1bHQsIGNvdW50IC8qaW50Ki8pIHsKCSAgICAgICAgLy8gUmVhZCB0aHJlZSBkaWdpdHMgYXQgYSB0aW1lCgkgICAgICAgIHdoaWxlIChjb3VudCA+PSAzKSB7CgkgICAgICAgICAgICAvLyBFYWNoIDEwIGJpdHMgZW5jb2RlcyB0aHJlZSBkaWdpdHMKCSAgICAgICAgICAgIGlmIChiaXRzLmF2YWlsYWJsZSgpIDwgMTApIHsKCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEuZGVmYXVsdCgpOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIHRocmVlRGlnaXRzQml0cyA9IGJpdHMucmVhZEJpdHMoMTApOwoJICAgICAgICAgICAgaWYgKHRocmVlRGlnaXRzQml0cyA+PSAxMDAwKSB7CgkgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xLmRlZmF1bHQoKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoRGVjb2RlZEJpdFN0cmVhbVBhcnNlci50b0FscGhhTnVtZXJpY0NoYXIoTWF0aC5mbG9vcih0aHJlZURpZ2l0c0JpdHMgLyAxMDApKSk7CgkgICAgICAgICAgICByZXN1bHQuYXBwZW5kKERlY29kZWRCaXRTdHJlYW1QYXJzZXIudG9BbHBoYU51bWVyaWNDaGFyKE1hdGguZmxvb3IodGhyZWVEaWdpdHNCaXRzIC8gMTApICUgMTApKTsKCSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoRGVjb2RlZEJpdFN0cmVhbVBhcnNlci50b0FscGhhTnVtZXJpY0NoYXIodGhyZWVEaWdpdHNCaXRzICUgMTApKTsKCSAgICAgICAgICAgIGNvdW50IC09IDM7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKGNvdW50ID09PSAyKSB7CgkgICAgICAgICAgICAvLyBUd28gZGlnaXRzIGxlZnQgb3ZlciB0byByZWFkLCBlbmNvZGVkIGluIDcgYml0cwoJICAgICAgICAgICAgaWYgKGJpdHMuYXZhaWxhYmxlKCkgPCA3KSB7CgkgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xLmRlZmF1bHQoKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHZhciB0d29EaWdpdHNCaXRzID0gYml0cy5yZWFkQml0cyg3KTsKCSAgICAgICAgICAgIGlmICh0d29EaWdpdHNCaXRzID49IDEwMCkgewoJICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICByZXN1bHQuYXBwZW5kKERlY29kZWRCaXRTdHJlYW1QYXJzZXIudG9BbHBoYU51bWVyaWNDaGFyKE1hdGguZmxvb3IodHdvRGlnaXRzQml0cyAvIDEwKSkpOwoJICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChEZWNvZGVkQml0U3RyZWFtUGFyc2VyLnRvQWxwaGFOdW1lcmljQ2hhcih0d29EaWdpdHNCaXRzICUgMTApKTsKCSAgICAgICAgfQoJICAgICAgICBlbHNlIGlmIChjb3VudCA9PT0gMSkgewoJICAgICAgICAgICAgLy8gT25lIGRpZ2l0IGxlZnQgb3ZlciB0byByZWFkCgkgICAgICAgICAgICBpZiAoYml0cy5hdmFpbGFibGUoKSA8IDQpIHsKCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uXzEuZGVmYXVsdCgpOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdmFyIGRpZ2l0Qml0cyA9IGJpdHMucmVhZEJpdHMoNCk7CgkgICAgICAgICAgICBpZiAoZGlnaXRCaXRzID49IDEwKSB7CgkgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xLmRlZmF1bHQoKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoRGVjb2RlZEJpdFN0cmVhbVBhcnNlci50b0FscGhhTnVtZXJpY0NoYXIoZGlnaXRCaXRzKSk7CgkgICAgICAgIH0KCSAgICB9OwoJICAgIERlY29kZWRCaXRTdHJlYW1QYXJzZXIucGFyc2VFQ0lWYWx1ZSA9IGZ1bmN0aW9uIChiaXRzKSB7CgkgICAgICAgIHZhciBmaXJzdEJ5dGUgPSBiaXRzLnJlYWRCaXRzKDgpOwoJICAgICAgICBpZiAoKGZpcnN0Qnl0ZSAmIDB4ODApID09PSAwKSB7CgkgICAgICAgICAgICAvLyBqdXN0IG9uZSBieXRlCgkgICAgICAgICAgICByZXR1cm4gZmlyc3RCeXRlICYgMHg3RjsKCSAgICAgICAgfQoJICAgICAgICBpZiAoKGZpcnN0Qnl0ZSAmIDB4QzApID09PSAweDgwKSB7CgkgICAgICAgICAgICAvLyB0d28gYnl0ZXMKCSAgICAgICAgICAgIHZhciBzZWNvbmRCeXRlID0gYml0cy5yZWFkQml0cyg4KTsKCSAgICAgICAgICAgIHJldHVybiAoKChmaXJzdEJ5dGUgJiAweDNGKSA8PCA4KSAmIDB4RkZGRkZGRkYpIHwgc2Vjb25kQnl0ZTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoKGZpcnN0Qnl0ZSAmIDB4RTApID09PSAweEMwKSB7CgkgICAgICAgICAgICAvLyB0aHJlZSBieXRlcwoJICAgICAgICAgICAgdmFyIHNlY29uZFRoaXJkQnl0ZXMgPSBiaXRzLnJlYWRCaXRzKDE2KTsKCSAgICAgICAgICAgIHJldHVybiAoKChmaXJzdEJ5dGUgJiAweDFGKSA8PCAxNikgJiAweEZGRkZGRkZGKSB8IHNlY29uZFRoaXJkQnl0ZXM7CgkgICAgICAgIH0KCSAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbl8xLmRlZmF1bHQoKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFNlZSBJU08gMTgwMDQ6MjAwNiwgNi40LjQgVGFibGUgNQoJICAgICAqLwoJICAgIERlY29kZWRCaXRTdHJlYW1QYXJzZXIuQUxQSEFOVU1FUklDX0NIQVJTID0gJzAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAkJSorLS4vOic7CgkgICAgRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5HQjIzMTJfU1VCU0VUID0gMTsKCSAgICByZXR1cm4gRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjsKCX0oKSk7CglEZWNvZGVkQml0U3RyZWFtUGFyc2VyJDEuZGVmYXVsdCA9IERlY29kZWRCaXRTdHJlYW1QYXJzZXI7CgoJdmFyIFFSQ29kZURlY29kZXJNZXRhRGF0YSQxID0ge307CgoJLyoKCSAqIENvcHlyaWdodCAyMDEzIFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShRUkNvZGVEZWNvZGVyTWV0YURhdGEkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJLyoqCgkgKiBNZXRhLWRhdGEgY29udGFpbmVyIGZvciBRUiBDb2RlIGRlY29kaW5nLiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBtYXkgYmUgdXNlZCB0byBjb252ZXkgaW5mb3JtYXRpb24gYmFjayB0byB0aGUKCSAqIGRlY29kaW5nIGNhbGxlci4gQ2FsbGVycyBhcmUgZXhwZWN0ZWQgdG8gcHJvY2VzcyB0aGlzLgoJICoKCSAqIEBzZWUgY29tLmdvb2dsZS56eGluZy5jb21tb24uRGVjb2RlclJlc3VsdCNnZXRPdGhlcigpCgkgKi8KCXZhciBRUkNvZGVEZWNvZGVyTWV0YURhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgZnVuY3Rpb24gUVJDb2RlRGVjb2Rlck1ldGFEYXRhKG1pcnJvcmVkKSB7CgkgICAgICAgIHRoaXMubWlycm9yZWQgPSBtaXJyb3JlZDsKCSAgICB9CgkgICAgLyoqCgkgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBRUiBDb2RlIHdhcyBtaXJyb3JlZC4KCSAgICAgKi8KCSAgICBRUkNvZGVEZWNvZGVyTWV0YURhdGEucHJvdG90eXBlLmlzTWlycm9yZWQgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLm1pcnJvcmVkOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQXBwbHkgdGhlIHJlc3VsdCBwb2ludHMnIG9yZGVyIGNvcnJlY3Rpb24gZHVlIHRvIG1pcnJvcmluZy4KCSAgICAgKgoJICAgICAqIEBwYXJhbSBwb2ludHMgQXJyYXkgb2YgcG9pbnRzIHRvIGFwcGx5IG1pcnJvciBjb3JyZWN0aW9uIHRvLgoJICAgICAqLwoJICAgIFFSQ29kZURlY29kZXJNZXRhRGF0YS5wcm90b3R5cGUuYXBwbHlNaXJyb3JlZENvcnJlY3Rpb24gPSBmdW5jdGlvbiAocG9pbnRzKSB7CgkgICAgICAgIGlmICghdGhpcy5taXJyb3JlZCB8fCBwb2ludHMgPT09IG51bGwgfHwgcG9pbnRzLmxlbmd0aCA8IDMpIHsKCSAgICAgICAgICAgIHJldHVybjsKCSAgICAgICAgfQoJICAgICAgICB2YXIgYm90dG9tTGVmdCA9IHBvaW50c1swXTsKCSAgICAgICAgcG9pbnRzWzBdID0gcG9pbnRzWzJdOwoJICAgICAgICBwb2ludHNbMl0gPSBib3R0b21MZWZ0OwoJICAgICAgICAvLyBObyBuZWVkIHRvICdmaXgnIHRvcC1sZWZ0IGFuZCBhbGlnbm1lbnQgcGF0dGVybi4KCSAgICB9OwoJICAgIHJldHVybiBRUkNvZGVEZWNvZGVyTWV0YURhdGE7Cgl9KCkpOwoJUVJDb2RlRGVjb2Rlck1ldGFEYXRhJDEuZGVmYXVsdCA9IFFSQ29kZURlY29kZXJNZXRhRGF0YTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJdmFyIF9fdmFsdWVzJDIgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHsKCSAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDsKCSAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTsKCSAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSByZXR1cm4gewoJICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7CgkgICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwOwoJICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9OwoJICAgICAgICB9CgkgICAgfTsKCSAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKCX07CglPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVjb2RlciQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgkvKm5hbWVzcGFjZSBjb20uZ29vZ2xlLnp4aW5nLnFyY29kZS5kZWNvZGVyIHsqLwoJdmFyIENoZWNrc3VtRXhjZXB0aW9uXzEgPSBDaGVja3N1bUV4Y2VwdGlvbiQxOwoJdmFyIEJpdE1hdHJpeF8xJDIgPSBCaXRNYXRyaXgkMTsKCXZhciBHZW5lcmljR0ZfMSA9IEdlbmVyaWNHRiQxOwoJdmFyIFJlZWRTb2xvbW9uRGVjb2Rlcl8xID0gUmVlZFNvbG9tb25EZWNvZGVyJDE7Cgl2YXIgQml0TWF0cml4UGFyc2VyXzEgPSBCaXRNYXRyaXhQYXJzZXIkMTsKCXZhciBEYXRhQmxvY2tfMSA9IERhdGFCbG9jayQxOwoJdmFyIERlY29kZWRCaXRTdHJlYW1QYXJzZXJfMSA9IERlY29kZWRCaXRTdHJlYW1QYXJzZXIkMTsKCXZhciBRUkNvZGVEZWNvZGVyTWV0YURhdGFfMSQxID0gUVJDb2RlRGVjb2Rlck1ldGFEYXRhJDE7CgkvKmltcG9ydCBqYXZhLnV0aWwuTWFwOyovCgkvKioKCSAqIDxwPlRoZSBtYWluIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgUVIgQ29kZSBkZWNvZGluZyAtLSBhcyBvcHBvc2VkIHRvIGxvY2F0aW5nIGFuZCBleHRyYWN0aW5nCgkgKiB0aGUgUVIgQ29kZSBmcm9tIGFuIGltYWdlLjwvcD4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICovCgl2YXIgRGVjb2RlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBEZWNvZGVyKCkgewoJICAgICAgICB0aGlzLnJzRGVjb2RlciA9IG5ldyBSZWVkU29sb21vbkRlY29kZXJfMS5kZWZhdWx0KEdlbmVyaWNHRl8xLmRlZmF1bHQuUVJfQ09ERV9GSUVMRF8yNTYpOwoJICAgIH0KCSAgICAvLyBwdWJsaWMgZGVjb2RlKGltYWdlOiBib29sZWFuW11bXSk6IERlY29kZXJSZXN1bHQgLyp0aHJvd3MgQ2hlY2tzdW1FeGNlcHRpb24sIEZvcm1hdEV4Y2VwdGlvbiovIHsKCSAgICAvLyAgIHJldHVybiBkZWNvZGUoaW1hZ2UsIG51bGwpCgkgICAgLy8gfQoJICAgIC8qKgoJICAgICAqIDxwPkNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbiBkZWNvZGUgYSBRUiBDb2RlIHJlcHJlc2VudGVkIGFzIGEgMkQgYXJyYXkgb2YgYm9vbGVhbnMuCgkgICAgICogInRydWUiIGlzIHRha2VuIHRvIG1lYW4gYSBibGFjayBtb2R1bGUuPC9wPgoJICAgICAqCgkgICAgICogQHBhcmFtIGltYWdlIGJvb2xlYW5zIHJlcHJlc2VudGluZyB3aGl0ZS9ibGFjayBRUiBDb2RlIG1vZHVsZXMKCSAgICAgKiBAcGFyYW0gaGludHMgZGVjb2RpbmcgaGludHMgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBpbmZsdWVuY2UgZGVjb2RpbmcKCSAgICAgKiBAcmV0dXJuIHRleHQgYW5kIGJ5dGVzIGVuY29kZWQgd2l0aGluIHRoZSBRUiBDb2RlCgkgICAgICogQHRocm93cyBGb3JtYXRFeGNlcHRpb24gaWYgdGhlIFFSIENvZGUgY2Fubm90IGJlIGRlY29kZWQKCSAgICAgKiBAdGhyb3dzIENoZWNrc3VtRXhjZXB0aW9uIGlmIGVycm9yIGNvcnJlY3Rpb24gZmFpbHMKCSAgICAgKi8KCSAgICBEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGVCb29sZWFuQXJyYXkgPSBmdW5jdGlvbiAoaW1hZ2UsIGhpbnRzKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmRlY29kZUJpdE1hdHJpeChCaXRNYXRyaXhfMSQyLmRlZmF1bHQucGFyc2VGcm9tQm9vbGVhbkFycmF5KGltYWdlKSwgaGludHMpOwoJICAgIH07CgkgICAgLy8gcHVibGljIGRlY29kZUJpdE1hdHJpeChiaXRzOiBCaXRNYXRyaXgpOiBEZWNvZGVyUmVzdWx0IC8qdGhyb3dzIENoZWNrc3VtRXhjZXB0aW9uLCBGb3JtYXRFeGNlcHRpb24qLyB7CgkgICAgLy8gICByZXR1cm4gZGVjb2RlKGJpdHMsIG51bGwpCgkgICAgLy8gfQoJICAgIC8qKgoJICAgICAqIDxwPkRlY29kZXMgYSBRUiBDb2RlIHJlcHJlc2VudGVkIGFzIGEge0BsaW5rIEJpdE1hdHJpeH0uIEEgMSBvciAidHJ1ZSIgaXMgdGFrZW4gdG8gbWVhbiBhIGJsYWNrIG1vZHVsZS48L3A+CgkgICAgICoKCSAgICAgKiBAcGFyYW0gYml0cyBib29sZWFucyByZXByZXNlbnRpbmcgd2hpdGUvYmxhY2sgUVIgQ29kZSBtb2R1bGVzCgkgICAgICogQHBhcmFtIGhpbnRzIGRlY29kaW5nIGhpbnRzIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gaW5mbHVlbmNlIGRlY29kaW5nCgkgICAgICogQHJldHVybiB0ZXh0IGFuZCBieXRlcyBlbmNvZGVkIHdpdGhpbiB0aGUgUVIgQ29kZQoJICAgICAqIEB0aHJvd3MgRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBRUiBDb2RlIGNhbm5vdCBiZSBkZWNvZGVkCgkgICAgICogQHRocm93cyBDaGVja3N1bUV4Y2VwdGlvbiBpZiBlcnJvciBjb3JyZWN0aW9uIGZhaWxzCgkgICAgICovCgkgICAgRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlQml0TWF0cml4ID0gZnVuY3Rpb24gKGJpdHMsIGhpbnRzKSB7CgkgICAgICAgIC8vIENvbnN0cnVjdCBhIHBhcnNlciBhbmQgcmVhZCB2ZXJzaW9uLCBlcnJvci1jb3JyZWN0aW9uIGxldmVsCgkgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgQml0TWF0cml4UGFyc2VyXzEuZGVmYXVsdChiaXRzKTsKCSAgICAgICAgdmFyIGV4ID0gbnVsbDsKCSAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY29kZUJpdE1hdHJpeFBhcnNlcihwYXJzZXIsIGhpbnRzKTsKCSAgICAgICAgfQoJICAgICAgICBjYXRjaCAoZSAvKjogRm9ybWF0RXhjZXB0aW9uLCBDaGVja3N1bUV4Y2VwdGlvbiovKSB7CgkgICAgICAgICAgICBleCA9IGU7CgkgICAgICAgIH0KCSAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgIC8vIFJldmVydCB0aGUgYml0IG1hdHJpeAoJICAgICAgICAgICAgcGFyc2VyLnJlbWFzaygpOwoJICAgICAgICAgICAgLy8gV2lsbCBiZSBhdHRlbXB0aW5nIGEgbWlycm9yZWQgcmVhZGluZyBvZiB0aGUgdmVyc2lvbiBhbmQgZm9ybWF0IGluZm8uCgkgICAgICAgICAgICBwYXJzZXIuc2V0TWlycm9yKHRydWUpOwoJICAgICAgICAgICAgLy8gUHJlZW1wdGl2ZWx5IHJlYWQgdGhlIHZlcnNpb24uCgkgICAgICAgICAgICBwYXJzZXIucmVhZFZlcnNpb24oKTsKCSAgICAgICAgICAgIC8vIFByZWVtcHRpdmVseSByZWFkIHRoZSBmb3JtYXQgaW5mb3JtYXRpb24uCgkgICAgICAgICAgICBwYXJzZXIucmVhZEZvcm1hdEluZm9ybWF0aW9uKCk7CgkgICAgICAgICAgICAvKgoJICAgICAgICAgICAgICogU2luY2Ugd2UncmUgaGVyZSwgdGhpcyBtZWFucyB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBkZXRlY3RlZCBzb21lIGtpbmQKCSAgICAgICAgICAgICAqIG9mIHZlcnNpb24gYW5kIGZvcm1hdCBpbmZvcm1hdGlvbiB3aGVuIG1pcnJvcmVkLiBUaGlzIGlzIGEgZ29vZCBzaWduLAoJICAgICAgICAgICAgICogdGhhdCB0aGUgUVIgY29kZSBtYXkgYmUgbWlycm9yZWQsIGFuZCB3ZSBzaG91bGQgdHJ5IG9uY2UgbW9yZSB3aXRoIGEKCSAgICAgICAgICAgICAqIG1pcnJvcmVkIGNvbnRlbnQuCgkgICAgICAgICAgICAgKi8KCSAgICAgICAgICAgIC8vIFByZXBhcmUgZm9yIGEgbWlycm9yZWQgcmVhZGluZy4KCSAgICAgICAgICAgIHBhcnNlci5taXJyb3IoKTsKCSAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmRlY29kZUJpdE1hdHJpeFBhcnNlcihwYXJzZXIsIGhpbnRzKTsKCSAgICAgICAgICAgIC8vIFN1Y2Nlc3MhIE5vdGlmeSB0aGUgY2FsbGVyIHRoYXQgdGhlIGNvZGUgd2FzIG1pcnJvcmVkLgoJICAgICAgICAgICAgcmVzdWx0LnNldE90aGVyKG5ldyBRUkNvZGVEZWNvZGVyTWV0YURhdGFfMSQxLmRlZmF1bHQodHJ1ZSkpOwoJICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICAgICAgfQoJICAgICAgICBjYXRjaCAoZSAvKkZvcm1hdEV4Y2VwdGlvbiB8IENoZWNrc3VtRXhjZXB0aW9uKi8pIHsKCSAgICAgICAgICAgIC8vIFRocm93IHRoZSBleGNlcHRpb24gZnJvbSB0aGUgb3JpZ2luYWwgcmVhZGluZwoJICAgICAgICAgICAgaWYgKGV4ICE9PSBudWxsKSB7CgkgICAgICAgICAgICAgICAgdGhyb3cgZXg7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICB0aHJvdyBlOwoJICAgICAgICB9CgkgICAgfTsKCSAgICBEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGVCaXRNYXRyaXhQYXJzZXIgPSBmdW5jdGlvbiAocGFyc2VyLCBoaW50cykgewoJICAgICAgICB2YXIgZV8xLCBfYSwgZV8yLCBfYjsKCSAgICAgICAgdmFyIHZlcnNpb24gPSBwYXJzZXIucmVhZFZlcnNpb24oKTsKCSAgICAgICAgdmFyIGVjTGV2ZWwgPSBwYXJzZXIucmVhZEZvcm1hdEluZm9ybWF0aW9uKCkuZ2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKTsKCSAgICAgICAgLy8gUmVhZCBjb2Rld29yZHMKCSAgICAgICAgdmFyIGNvZGV3b3JkcyA9IHBhcnNlci5yZWFkQ29kZXdvcmRzKCk7CgkgICAgICAgIC8vIFNlcGFyYXRlIGludG8gZGF0YSBibG9ja3MKCSAgICAgICAgdmFyIGRhdGFCbG9ja3MgPSBEYXRhQmxvY2tfMS5kZWZhdWx0LmdldERhdGFCbG9ja3MoY29kZXdvcmRzLCB2ZXJzaW9uLCBlY0xldmVsKTsKCSAgICAgICAgLy8gQ291bnQgdG90YWwgbnVtYmVyIG9mIGRhdGEgYnl0ZXMKCSAgICAgICAgdmFyIHRvdGFsQnl0ZXMgPSAwOwoJICAgICAgICB0cnkgewoJICAgICAgICAgICAgZm9yICh2YXIgZGF0YUJsb2Nrc18xID0gX192YWx1ZXMkMihkYXRhQmxvY2tzKSwgZGF0YUJsb2Nrc18xXzEgPSBkYXRhQmxvY2tzXzEubmV4dCgpOyAhZGF0YUJsb2Nrc18xXzEuZG9uZTsgZGF0YUJsb2Nrc18xXzEgPSBkYXRhQmxvY2tzXzEubmV4dCgpKSB7CgkgICAgICAgICAgICAgICAgdmFyIGRhdGFCbG9jayA9IGRhdGFCbG9ja3NfMV8xLnZhbHVlOwoJICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YUJsb2NrLmdldE51bURhdGFDb2Rld29yZHMoKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfQoJICAgICAgICBmaW5hbGx5IHsKCSAgICAgICAgICAgIHRyeSB7CgkgICAgICAgICAgICAgICAgaWYgKGRhdGFCbG9ja3NfMV8xICYmICFkYXRhQmxvY2tzXzFfMS5kb25lICYmIChfYSA9IGRhdGFCbG9ja3NfMS5yZXR1cm4pKSBfYS5jYWxsKGRhdGFCbG9ja3NfMSk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9CgkgICAgICAgIH0KCSAgICAgICAgdmFyIHJlc3VsdEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodG90YWxCeXRlcyk7CgkgICAgICAgIHZhciByZXN1bHRPZmZzZXQgPSAwOwoJICAgICAgICB0cnkgewoJICAgICAgICAgICAgLy8gRXJyb3ItY29ycmVjdCBhbmQgY29weSBkYXRhIGJsb2NrcyB0b2dldGhlciBpbnRvIGEgc3RyZWFtIG9mIGJ5dGVzCgkgICAgICAgICAgICBmb3IgKHZhciBkYXRhQmxvY2tzXzIgPSBfX3ZhbHVlcyQyKGRhdGFCbG9ja3MpLCBkYXRhQmxvY2tzXzJfMSA9IGRhdGFCbG9ja3NfMi5uZXh0KCk7ICFkYXRhQmxvY2tzXzJfMS5kb25lOyBkYXRhQmxvY2tzXzJfMSA9IGRhdGFCbG9ja3NfMi5uZXh0KCkpIHsKCSAgICAgICAgICAgICAgICB2YXIgZGF0YUJsb2NrID0gZGF0YUJsb2Nrc18yXzEudmFsdWU7CgkgICAgICAgICAgICAgICAgdmFyIGNvZGV3b3JkQnl0ZXMgPSBkYXRhQmxvY2suZ2V0Q29kZXdvcmRzKCk7CgkgICAgICAgICAgICAgICAgdmFyIG51bURhdGFDb2Rld29yZHMgPSBkYXRhQmxvY2suZ2V0TnVtRGF0YUNvZGV3b3JkcygpOwoJICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdEVycm9ycyhjb2Rld29yZEJ5dGVzLCBudW1EYXRhQ29kZXdvcmRzKTsKCSAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bURhdGFDb2Rld29yZHM7IGkrKykgewoJICAgICAgICAgICAgICAgICAgICByZXN1bHRCeXRlc1tyZXN1bHRPZmZzZXQrK10gPSBjb2Rld29yZEJ5dGVzW2ldOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfQoJICAgICAgICBmaW5hbGx5IHsKCSAgICAgICAgICAgIHRyeSB7CgkgICAgICAgICAgICAgICAgaWYgKGRhdGFCbG9ja3NfMl8xICYmICFkYXRhQmxvY2tzXzJfMS5kb25lICYmIChfYiA9IGRhdGFCbG9ja3NfMi5yZXR1cm4pKSBfYi5jYWxsKGRhdGFCbG9ja3NfMik7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9CgkgICAgICAgIH0KCSAgICAgICAgLy8gRGVjb2RlIHRoZSBjb250ZW50cyBvZiB0aGF0IHN0cmVhbSBvZiBieXRlcwoJICAgICAgICByZXR1cm4gRGVjb2RlZEJpdFN0cmVhbVBhcnNlcl8xLmRlZmF1bHQuZGVjb2RlKHJlc3VsdEJ5dGVzLCB2ZXJzaW9uLCBlY0xldmVsLCBoaW50cyk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiA8cD5HaXZlbiBkYXRhIGFuZCBlcnJvci1jb3JyZWN0aW9uIGNvZGV3b3JkcyByZWNlaXZlZCwgcG9zc2libHkgY29ycnVwdGVkIGJ5IGVycm9ycywgYXR0ZW1wdHMgdG8KCSAgICAgKiBjb3JyZWN0IHRoZSBlcnJvcnMgaW4tcGxhY2UgdXNpbmcgUmVlZC1Tb2xvbW9uIGVycm9yIGNvcnJlY3Rpb24uPC9wPgoJICAgICAqCgkgICAgICogQHBhcmFtIGNvZGV3b3JkQnl0ZXMgZGF0YSBhbmQgZXJyb3IgY29ycmVjdGlvbiBjb2Rld29yZHMKCSAgICAgKiBAcGFyYW0gbnVtRGF0YUNvZGV3b3JkcyBudW1iZXIgb2YgY29kZXdvcmRzIHRoYXQgYXJlIGRhdGEgYnl0ZXMKCSAgICAgKiBAdGhyb3dzIENoZWNrc3VtRXhjZXB0aW9uIGlmIGVycm9yIGNvcnJlY3Rpb24gZmFpbHMKCSAgICAgKi8KCSAgICBEZWNvZGVyLnByb3RvdHlwZS5jb3JyZWN0RXJyb3JzID0gZnVuY3Rpb24gKGNvZGV3b3JkQnl0ZXMsIG51bURhdGFDb2Rld29yZHMgLyppbnQqLykgewoJICAgICAgICAvLyBjb25zdCBudW1Db2Rld29yZHMgPSBjb2Rld29yZEJ5dGVzLmxlbmd0aDsKCSAgICAgICAgLy8gRmlyc3QgcmVhZCBpbnRvIGFuIGFycmF5IG9mIGludHMKCSAgICAgICAgdmFyIGNvZGV3b3Jkc0ludHMgPSBuZXcgSW50MzJBcnJheShjb2Rld29yZEJ5dGVzKTsKCSAgICAgICAgLy8gVFlQRVNDUklQVFBPUlQ6IG5vdCByZWFseSBuZWNlc3NhcnkgdG8gdHJhbnNmb3JtIHRvIGludHM/IGNvdWxkIHJlZGVzaWduIGV2ZXJ5dGhpbmcgdG8gd29yayB3aXRoIHVuc2lnbmVkIGJ5dGVzPwoJICAgICAgICAvLyBjb25zdCBjb2Rld29yZHNJbnRzID0gbmV3IEludDMyQXJyYXkobnVtQ29kZXdvcmRzKQoJICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvZGV3b3JkczsgaSsrKSB7CgkgICAgICAgIC8vICAgY29kZXdvcmRzSW50c1tpXSA9IGNvZGV3b3JkQnl0ZXNbaV0gJiAweEZGCgkgICAgICAgIC8vIH0KCSAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgIHRoaXMucnNEZWNvZGVyLmRlY29kZShjb2Rld29yZHNJbnRzLCBjb2Rld29yZEJ5dGVzLmxlbmd0aCAtIG51bURhdGFDb2Rld29yZHMpOwoJICAgICAgICB9CgkgICAgICAgIGNhdGNoIChpZ25vcmVkIC8qOiBSZWVkU29sb21vbkV4Y2VwdGlvbiovKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgQ2hlY2tzdW1FeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICAgICAgLy8gQ29weSBiYWNrIGludG8gYXJyYXkgb2YgYnl0ZXMgLS0gb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBieXRlcyB0aGF0IHdlcmUgZGF0YQoJICAgICAgICAvLyBXZSBkb24ndCBjYXJlIGFib3V0IGVycm9ycyBpbiB0aGUgZXJyb3ItY29ycmVjdGlvbiBjb2Rld29yZHMKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1EYXRhQ29kZXdvcmRzOyBpKyspIHsKCSAgICAgICAgICAgIGNvZGV3b3JkQnl0ZXNbaV0gPSAvKihieXRlKSAqLyBjb2Rld29yZHNJbnRzW2ldOwoJICAgICAgICB9CgkgICAgfTsKCSAgICByZXR1cm4gRGVjb2RlcjsKCX0oKSk7CglEZWNvZGVyJDEuZGVmYXVsdCA9IERlY29kZXI7CgoJdmFyIERldGVjdG9yJDEgPSB7fTsKCgl2YXIgTWF0aFV0aWxzJDEgPSB7fTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMTIgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hdGhVdGlscyQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgkvKm5hbWVzcGFjZSBjb20uZ29vZ2xlLnp4aW5nLmNvbW1vbi5kZXRlY3RvciB7Ki8KCS8qKgoJICogR2VuZXJhbCBtYXRoLXJlbGF0ZWQgYW5kIG51bWVyaWMgdXRpbGl0eSBmdW5jdGlvbnMuCgkgKi8KCXZhciBNYXRoVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgZnVuY3Rpb24gTWF0aFV0aWxzKCkgewoJICAgIH0KCSAgICAvKioKCSAgICAgKiBFbmRzIHVwIGJlaW5nIGEgYml0IGZhc3RlciB0aGFuIHtAbGluayBNYXRoI3JvdW5kKGZsb2F0KX0uIFRoaXMgbWVyZWx5IHJvdW5kcyBpdHMKCSAgICAgKiBhcmd1bWVudCB0byB0aGUgbmVhcmVzdCBpbnQsIHdoZXJlIHguNSByb3VuZHMgdXAgdG8geCsxLiBTZW1hbnRpY3Mgb2YgdGhpcyBzaG9ydGN1dAoJICAgICAqIGRpZmZlciBzbGlnaHRseSBmcm9tIHtAbGluayBNYXRoI3JvdW5kKGZsb2F0KX0gaW4gdGhhdCBoYWxmIHJvdW5kcyBkb3duIGZvciBuZWdhdGl2ZQoJICAgICAqIHZhbHVlcy4gLTIuNSByb3VuZHMgdG8gLTMsIG5vdCAtMi4gRm9yIHB1cnBvc2VzIGhlcmUgaXQgbWFrZXMgbm8gZGlmZmVyZW5jZS4KCSAgICAgKgoJICAgICAqIEBwYXJhbSBkIHJlYWwgdmFsdWUgdG8gcm91bmQKCSAgICAgKiBAcmV0dXJuIG5lYXJlc3Qge0Bjb2RlIGludH0KCSAgICAgKi8KCSAgICBNYXRoVXRpbHMucm91bmQgPSBmdW5jdGlvbiAoZCAvKmZsb2F0Ki8pIHsKCSAgICAgICAgaWYgKE5hTiA9PT0gZCkKCSAgICAgICAgICAgIHJldHVybiAwOwoJICAgICAgICBpZiAoZCA8PSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUikKCSAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjsKCSAgICAgICAgaWYgKGQgPj0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpCgkgICAgICAgICAgICByZXR1cm4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7CgkgICAgICAgIHJldHVybiAvKihpbnQpICovIChkICsgKGQgPCAwLjAgPyAtMC41IDogMC41KSkgfCAwOwoJICAgIH07CgkgICAgLy8gVFlQRVNDUklQVFBPUlQ6IG1heWJlIHJlbW92ZSByb3VuZCBtZXRob2QgYW5kIGNhbGwgZGlyZWN0bHkgTWF0aC5yb3VuZCwgaXQgbG9va3MgbGlrZSBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIGpzCgkgICAgLyoqCgkgICAgICogQHBhcmFtIGFYIHBvaW50IEEgeCBjb29yZGluYXRlCgkgICAgICogQHBhcmFtIGFZIHBvaW50IEEgeSBjb29yZGluYXRlCgkgICAgICogQHBhcmFtIGJYIHBvaW50IEIgeCBjb29yZGluYXRlCgkgICAgICogQHBhcmFtIGJZIHBvaW50IEIgeSBjb29yZGluYXRlCgkgICAgICogQHJldHVybiBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiBwb2ludHMgQSBhbmQgQgoJICAgICAqLwoJICAgIE1hdGhVdGlscy5kaXN0YW5jZSA9IGZ1bmN0aW9uIChhWCAvKmZsb2F0fGludCovLCBhWSAvKmZsb2F0fGludCovLCBiWCAvKmZsb2F0fGludCovLCBiWSAvKmZsb2F0fGludCovKSB7CgkgICAgICAgIHZhciB4RGlmZiA9IGFYIC0gYlg7CgkgICAgICAgIHZhciB5RGlmZiA9IGFZIC0gYlk7CgkgICAgICAgIHJldHVybiAvKihmbG9hdCkgKi8gTWF0aC5zcXJ0KHhEaWZmICogeERpZmYgKyB5RGlmZiAqIHlEaWZmKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEBwYXJhbSBhWCBwb2ludCBBIHggY29vcmRpbmF0ZQoJICAgICAqIEBwYXJhbSBhWSBwb2ludCBBIHkgY29vcmRpbmF0ZQoJICAgICAqIEBwYXJhbSBiWCBwb2ludCBCIHggY29vcmRpbmF0ZQoJICAgICAqIEBwYXJhbSBiWSBwb2ludCBCIHkgY29vcmRpbmF0ZQoJICAgICAqIEByZXR1cm4gRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gcG9pbnRzIEEgYW5kIEIKCSAgICAgKi8KCSAgICAvLyBwdWJsaWMgc3RhdGljIGRpc3RhbmNlKGFYOiBudW1iZXIgLyppbnQqLywgYVk6IG51bWJlciAvKmludCovLCBiWDogbnVtYmVyIC8qaW50Ki8sIGJZOiBudW1iZXIgLyppbnQqLyk6IGZsb2F0IHsKCSAgICAvLyAgIGNvbnN0IHhEaWZmID0gYVggLSBiWAoJICAgIC8vICAgY29uc3QgeURpZmYgPSBhWSAtIGJZCgkgICAgLy8gICByZXR1cm4gKGZsb2F0KSBNYXRoLnNxcnQoeERpZmYgKiB4RGlmZiArIHlEaWZmICogeURpZmYpOwoJICAgIC8vIH0KCSAgICAvKioKCSAgICAgKiBAcGFyYW0gYXJyYXkgdmFsdWVzIHRvIHN1bQoJICAgICAqIEByZXR1cm4gc3VtIG9mIHZhbHVlcyBpbiBhcnJheQoJICAgICAqLwoJICAgIE1hdGhVdGlscy5zdW0gPSBmdW5jdGlvbiAoYXJyYXkpIHsKCSAgICAgICAgdmFyIGNvdW50ID0gMDsKCSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aF8xID0gYXJyYXkubGVuZ3RoOyBpICE9PSBsZW5ndGhfMTsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgYSA9IGFycmF5W2ldOwoJICAgICAgICAgICAgY291bnQgKz0gYTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gY291bnQ7CgkgICAgfTsKCSAgICByZXR1cm4gTWF0aFV0aWxzOwoJfSgpKTsKCU1hdGhVdGlscyQxLmRlZmF1bHQgPSBNYXRoVXRpbHM7CgoJdmFyIERldGVjdG9yUmVzdWx0JDEgPSB7fTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KERldGVjdG9yUmVzdWx0JDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qKgoJICogPHA+RW5jYXBzdWxhdGVzIHRoZSByZXN1bHQgb2YgZGV0ZWN0aW5nIGEgYmFyY29kZSBpbiBhbiBpbWFnZS4gVGhpcyBpbmNsdWRlcyB0aGUgcmF3CgkgKiBtYXRyaXggb2YgYmxhY2svd2hpdGUgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJhcmNvZGUsIGFuZCBwb3NzaWJseSBwb2ludHMgb2YgaW50ZXJlc3QKCSAqIGluIHRoZSBpbWFnZSwgbGlrZSB0aGUgbG9jYXRpb24gb2YgZmluZGVyIHBhdHRlcm5zIG9yIGNvcm5lcnMgb2YgdGhlIGJhcmNvZGUgaW4gdGhlIGltYWdlLjwvcD4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICovCgl2YXIgRGV0ZWN0b3JSZXN1bHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgZnVuY3Rpb24gRGV0ZWN0b3JSZXN1bHQoYml0cywgcG9pbnRzKSB7CgkgICAgICAgIHRoaXMuYml0cyA9IGJpdHM7CgkgICAgICAgIHRoaXMucG9pbnRzID0gcG9pbnRzOwoJICAgIH0KCSAgICBEZXRlY3RvclJlc3VsdC5wcm90b3R5cGUuZ2V0Qml0cyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuYml0czsKCSAgICB9OwoJICAgIERldGVjdG9yUmVzdWx0LnByb3RvdHlwZS5nZXRQb2ludHMgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLnBvaW50czsKCSAgICB9OwoJICAgIHJldHVybiBEZXRlY3RvclJlc3VsdDsKCX0oKSk7CglEZXRlY3RvclJlc3VsdCQxLmRlZmF1bHQgPSBEZXRlY3RvclJlc3VsdDsKCgl2YXIgR3JpZFNhbXBsZXJJbnN0YW5jZSQxID0ge307CgoJdmFyIERlZmF1bHRHcmlkU2FtcGxlciQxID0ge307CgoJdmFyIEdyaWRTYW1wbGVyJDEgPSB7fTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEdyaWRTYW1wbGVyJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCXZhciBOb3RGb3VuZEV4Y2VwdGlvbl8xJDUgPSBOb3RGb3VuZEV4Y2VwdGlvbiQxOwoJLyoqCgkgKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBjbGFzcyBjYW4sIGdpdmVuIGxvY2F0aW9ucyBvZiBmaW5kZXIgcGF0dGVybnMgZm9yIGEgUVIgY29kZSBpbiBhbgoJICogaW1hZ2UsIHNhbXBsZSB0aGUgcmlnaHQgcG9pbnRzIGluIHRoZSBpbWFnZSB0byByZWNvbnN0cnVjdCB0aGUgUVIgY29kZSwgYWNjb3VudGluZyBmb3IKCSAqIHBlcnNwZWN0aXZlIGRpc3RvcnRpb24uIEl0IGlzIGFic3RyYWN0ZWQgc2luY2UgaXQgaXMgcmVsYXRpdmVseSBleHBlbnNpdmUgYW5kIHNob3VsZCBiZSBhbGxvd2VkCgkgKiB0byB0YWtlIGFkdmFudGFnZSBvZiBwbGF0Zm9ybS1zcGVjaWZpYyBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb25zLCBsaWtlIFN1bidzIEphdmEgQWR2YW5jZWQKCSAqIEltYWdpbmcgbGlicmFyeSwgYnV0IHdoaWNoIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIG90aGVyIGVudmlyb25tZW50cyBzdWNoIGFzIEoyTUUsIGFuZCB2aWNlCgkgKiB2ZXJzYS4KCSAqCgkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlZCBjYW4gYmUgY29udHJvbGxlZCBieSBjYWxsaW5nIHtAbGluayAjc2V0R3JpZFNhbXBsZXIoR3JpZFNhbXBsZXIpfQoJICogd2l0aCBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UuCgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIEdyaWRTYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIGZ1bmN0aW9uIEdyaWRTYW1wbGVyKCkgewoJICAgIH0KCSAgICAvKioKCSAgICAgKiA8cD5DaGVja3MgYSBzZXQgb2YgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIHRyYW5zZm9ybWVkIHRvIHNhbXBsZSBwb2ludHMgb24gYW4gaW1hZ2UgYWdhaW5zdAoJICAgICAqIHRoZSBpbWFnZSdzIGRpbWVuc2lvbnMgdG8gc2VlIGlmIHRoZSBwb2ludCBhcmUgZXZlbiB3aXRoaW4gdGhlIGltYWdlLjwvcD4KCSAgICAgKgoJICAgICAqIDxwPlRoaXMgbWV0aG9kIHdpbGwgYWN0dWFsbHkgIm51ZGdlIiB0aGUgZW5kcG9pbnRzIGJhY2sgb250byB0aGUgaW1hZ2UgaWYgdGhleSBhcmUgZm91bmQgdG8gYmUKCSAgICAgKiBiYXJlbHkgKGxlc3MgdGhhbiAxIHBpeGVsKSBvZmYgdGhlIGltYWdlLiBUaGlzIGFjY291bnRzIGZvciBpbXBlcmZlY3QgZGV0ZWN0aW9uIG9mIGZpbmRlcgoJICAgICAqIHBhdHRlcm5zIGluIGFuIGltYWdlIHdoZXJlIHRoZSBRUiBDb2RlIHJ1bnMgYWxsIHRoZSB3YXkgdG8gdGhlIGltYWdlIGJvcmRlci48L3A+CgkgICAgICoKCSAgICAgKiA8cD5Gb3IgZWZmaWNpZW5jeSwgdGhlIG1ldGhvZCB3aWxsIGNoZWNrIHBvaW50cyBmcm9tIGVpdGhlciBlbmQgb2YgdGhlIGxpbmUgdW50aWwgb25lIGlzIGZvdW5kCgkgICAgICogdG8gYmUgd2l0aGluIHRoZSBpbWFnZS4gQmVjYXVzZSB0aGUgc2V0IG9mIHBvaW50cyBhcmUgYXNzdW1lZCB0byBiZSBsaW5lYXIsIHRoaXMgaXMgdmFsaWQuPC9wPgoJICAgICAqCgkgICAgICogQHBhcmFtIGltYWdlIGltYWdlIGludG8gd2hpY2ggdGhlIHBvaW50cyBzaG91bGQgbWFwCgkgICAgICogQHBhcmFtIHBvaW50cyBhY3R1YWwgcG9pbnRzIGluIHgxLHkxLC4uLix4bix5biBmb3JtCgkgICAgICogQHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBlbmRwb2ludCBpcyBsaWVzIG91dHNpZGUgdGhlIGltYWdlIGJvdW5kYXJpZXMKCSAgICAgKi8KCSAgICBHcmlkU2FtcGxlci5jaGVja0FuZE51ZGdlUG9pbnRzID0gZnVuY3Rpb24gKGltYWdlLCBwb2ludHMpIHsKCSAgICAgICAgdmFyIHdpZHRoID0gaW1hZ2UuZ2V0V2lkdGgoKTsKCSAgICAgICAgdmFyIGhlaWdodCA9IGltYWdlLmdldEhlaWdodCgpOwoJICAgICAgICAvLyBDaGVjayBhbmQgbnVkZ2UgcG9pbnRzIGZyb20gc3RhcnQgdW50aWwgd2Ugc2VlIHNvbWUgdGhhdCBhcmUgT0s6CgkgICAgICAgIHZhciBudWRnZWQgPSB0cnVlOwoJICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBwb2ludHMubGVuZ3RoICYmIG51ZGdlZDsgb2Zmc2V0ICs9IDIpIHsKCSAgICAgICAgICAgIHZhciB4ID0gTWF0aC5mbG9vcihwb2ludHNbb2Zmc2V0XSk7CgkgICAgICAgICAgICB2YXIgeSA9IE1hdGguZmxvb3IocG9pbnRzW29mZnNldCArIDFdKTsKCSAgICAgICAgICAgIGlmICh4IDwgLTEgfHwgeCA+IHdpZHRoIHx8IHkgPCAtMSB8fCB5ID4gaGVpZ2h0KSB7CgkgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uXzEkNS5kZWZhdWx0KCk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBudWRnZWQgPSBmYWxzZTsKCSAgICAgICAgICAgIGlmICh4ID09PSAtMSkgewoJICAgICAgICAgICAgICAgIHBvaW50c1tvZmZzZXRdID0gMC4wOwoJICAgICAgICAgICAgICAgIG51ZGdlZCA9IHRydWU7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBlbHNlIGlmICh4ID09PSB3aWR0aCkgewoJICAgICAgICAgICAgICAgIHBvaW50c1tvZmZzZXRdID0gd2lkdGggLSAxOwoJICAgICAgICAgICAgICAgIG51ZGdlZCA9IHRydWU7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBpZiAoeSA9PT0gLTEpIHsKCSAgICAgICAgICAgICAgICBwb2ludHNbb2Zmc2V0ICsgMV0gPSAwLjA7CgkgICAgICAgICAgICAgICAgbnVkZ2VkID0gdHJ1ZTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGVsc2UgaWYgKHkgPT09IGhlaWdodCkgewoJICAgICAgICAgICAgICAgIHBvaW50c1tvZmZzZXQgKyAxXSA9IGhlaWdodCAtIDE7CgkgICAgICAgICAgICAgICAgbnVkZ2VkID0gdHJ1ZTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICAvLyBDaGVjayBhbmQgbnVkZ2UgcG9pbnRzIGZyb20gZW5kOgoJICAgICAgICBudWRnZWQgPSB0cnVlOwoJICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSBwb2ludHMubGVuZ3RoIC0gMjsgb2Zmc2V0ID49IDAgJiYgbnVkZ2VkOyBvZmZzZXQgLT0gMikgewoJICAgICAgICAgICAgdmFyIHggPSBNYXRoLmZsb29yKHBvaW50c1tvZmZzZXRdKTsKCSAgICAgICAgICAgIHZhciB5ID0gTWF0aC5mbG9vcihwb2ludHNbb2Zmc2V0ICsgMV0pOwoJICAgICAgICAgICAgaWYgKHggPCAtMSB8fCB4ID4gd2lkdGggfHwgeSA8IC0xIHx8IHkgPiBoZWlnaHQpIHsKCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb25fMSQ1LmRlZmF1bHQoKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIG51ZGdlZCA9IGZhbHNlOwoJICAgICAgICAgICAgaWYgKHggPT09IC0xKSB7CgkgICAgICAgICAgICAgICAgcG9pbnRzW29mZnNldF0gPSAwLjA7CgkgICAgICAgICAgICAgICAgbnVkZ2VkID0gdHJ1ZTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGVsc2UgaWYgKHggPT09IHdpZHRoKSB7CgkgICAgICAgICAgICAgICAgcG9pbnRzW29mZnNldF0gPSB3aWR0aCAtIDE7CgkgICAgICAgICAgICAgICAgbnVkZ2VkID0gdHJ1ZTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGlmICh5ID09PSAtMSkgewoJICAgICAgICAgICAgICAgIHBvaW50c1tvZmZzZXQgKyAxXSA9IDAuMDsKCSAgICAgICAgICAgICAgICBudWRnZWQgPSB0cnVlOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZWxzZSBpZiAoeSA9PT0gaGVpZ2h0KSB7CgkgICAgICAgICAgICAgICAgcG9pbnRzW29mZnNldCArIDFdID0gaGVpZ2h0IC0gMTsKCSAgICAgICAgICAgICAgICBudWRnZWQgPSB0cnVlOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgfTsKCSAgICByZXR1cm4gR3JpZFNhbXBsZXI7Cgl9KCkpOwoJR3JpZFNhbXBsZXIkMS5kZWZhdWx0ID0gR3JpZFNhbXBsZXI7CgoJdmFyIFBlcnNwZWN0aXZlVHJhbnNmb3JtJDEgPSB7fTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KFBlcnNwZWN0aXZlVHJhbnNmb3JtJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcuY29tbW9uIHsqLwoJLyoqCgkgKiA8cD5UaGlzIGNsYXNzIGltcGxlbWVudHMgYSBwZXJzcGVjdGl2ZSB0cmFuc2Zvcm0gaW4gdHdvIGRpbWVuc2lvbnMuIEdpdmVuIGZvdXIgc291cmNlIGFuZCBmb3VyCgkgKiBkZXN0aW5hdGlvbiBwb2ludHMsIGl0IHdpbGwgY29tcHV0ZSB0aGUgdHJhbnNmb3JtYXRpb24gaW1wbGllZCBiZXR3ZWVuIHRoZW0uIFRoZSBjb2RlIGlzIGJhc2VkCgkgKiBkaXJlY3RseSB1cG9uIHNlY3Rpb24gMy40LjIgb2YgR2VvcmdlIFdvbGJlcmcncyAiRGlnaXRhbCBJbWFnZSBXYXJwaW5nIjsgc2VlIHBhZ2VzIDU0LTU2LjwvcD4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICovCgl2YXIgUGVyc3BlY3RpdmVUcmFuc2Zvcm0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgZnVuY3Rpb24gUGVyc3BlY3RpdmVUcmFuc2Zvcm0oYTExIC8qZmxvYXQqLywgYTIxIC8qZmxvYXQqLywgYTMxIC8qZmxvYXQqLywgYTEyIC8qZmxvYXQqLywgYTIyIC8qZmxvYXQqLywgYTMyIC8qZmxvYXQqLywgYTEzIC8qZmxvYXQqLywgYTIzIC8qZmxvYXQqLywgYTMzIC8qZmxvYXQqLykgewoJICAgICAgICB0aGlzLmExMSA9IGExMTsKCSAgICAgICAgdGhpcy5hMjEgPSBhMjE7CgkgICAgICAgIHRoaXMuYTMxID0gYTMxOwoJICAgICAgICB0aGlzLmExMiA9IGExMjsKCSAgICAgICAgdGhpcy5hMjIgPSBhMjI7CgkgICAgICAgIHRoaXMuYTMyID0gYTMyOwoJICAgICAgICB0aGlzLmExMyA9IGExMzsKCSAgICAgICAgdGhpcy5hMjMgPSBhMjM7CgkgICAgICAgIHRoaXMuYTMzID0gYTMzOwoJICAgIH0KCSAgICBQZXJzcGVjdGl2ZVRyYW5zZm9ybS5xdWFkcmlsYXRlcmFsVG9RdWFkcmlsYXRlcmFsID0gZnVuY3Rpb24gKHgwIC8qZmxvYXQqLywgeTAgLypmbG9hdCovLCB4MSAvKmZsb2F0Ki8sIHkxIC8qZmxvYXQqLywgeDIgLypmbG9hdCovLCB5MiAvKmZsb2F0Ki8sIHgzIC8qZmxvYXQqLywgeTMgLypmbG9hdCovLCB4MHAgLypmbG9hdCovLCB5MHAgLypmbG9hdCovLCB4MXAgLypmbG9hdCovLCB5MXAgLypmbG9hdCovLCB4MnAgLypmbG9hdCovLCB5MnAgLypmbG9hdCovLCB4M3AgLypmbG9hdCovLCB5M3AgLypmbG9hdCovKSB7CgkgICAgICAgIHZhciBxVG9TID0gUGVyc3BlY3RpdmVUcmFuc2Zvcm0ucXVhZHJpbGF0ZXJhbFRvU3F1YXJlKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5Myk7CgkgICAgICAgIHZhciBzVG9RID0gUGVyc3BlY3RpdmVUcmFuc2Zvcm0uc3F1YXJlVG9RdWFkcmlsYXRlcmFsKHgwcCwgeTBwLCB4MXAsIHkxcCwgeDJwLCB5MnAsIHgzcCwgeTNwKTsKCSAgICAgICAgcmV0dXJuIHNUb1EudGltZXMocVRvUyk7CgkgICAgfTsKCSAgICBQZXJzcGVjdGl2ZVRyYW5zZm9ybS5wcm90b3R5cGUudHJhbnNmb3JtUG9pbnRzID0gZnVuY3Rpb24gKHBvaW50cykgewoJICAgICAgICB2YXIgbWF4ID0gcG9pbnRzLmxlbmd0aDsKCSAgICAgICAgdmFyIGExMSA9IHRoaXMuYTExOwoJICAgICAgICB2YXIgYTEyID0gdGhpcy5hMTI7CgkgICAgICAgIHZhciBhMTMgPSB0aGlzLmExMzsKCSAgICAgICAgdmFyIGEyMSA9IHRoaXMuYTIxOwoJICAgICAgICB2YXIgYTIyID0gdGhpcy5hMjI7CgkgICAgICAgIHZhciBhMjMgPSB0aGlzLmEyMzsKCSAgICAgICAgdmFyIGEzMSA9IHRoaXMuYTMxOwoJICAgICAgICB2YXIgYTMyID0gdGhpcy5hMzI7CgkgICAgICAgIHZhciBhMzMgPSB0aGlzLmEzMzsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXg7IGkgKz0gMikgewoJICAgICAgICAgICAgdmFyIHggPSBwb2ludHNbaV07CgkgICAgICAgICAgICB2YXIgeSA9IHBvaW50c1tpICsgMV07CgkgICAgICAgICAgICB2YXIgZGVub21pbmF0b3IgPSBhMTMgKiB4ICsgYTIzICogeSArIGEzMzsKCSAgICAgICAgICAgIHBvaW50c1tpXSA9IChhMTEgKiB4ICsgYTIxICogeSArIGEzMSkgLyBkZW5vbWluYXRvcjsKCSAgICAgICAgICAgIHBvaW50c1tpICsgMV0gPSAoYTEyICogeCArIGEyMiAqIHkgKyBhMzIpIC8gZGVub21pbmF0b3I7CgkgICAgICAgIH0KCSAgICB9OwoJICAgIFBlcnNwZWN0aXZlVHJhbnNmb3JtLnByb3RvdHlwZS50cmFuc2Zvcm1Qb2ludHNXaXRoVmFsdWVzID0gZnVuY3Rpb24gKHhWYWx1ZXMsIHlWYWx1ZXMpIHsKCSAgICAgICAgdmFyIGExMSA9IHRoaXMuYTExOwoJICAgICAgICB2YXIgYTEyID0gdGhpcy5hMTI7CgkgICAgICAgIHZhciBhMTMgPSB0aGlzLmExMzsKCSAgICAgICAgdmFyIGEyMSA9IHRoaXMuYTIxOwoJICAgICAgICB2YXIgYTIyID0gdGhpcy5hMjI7CgkgICAgICAgIHZhciBhMjMgPSB0aGlzLmEyMzsKCSAgICAgICAgdmFyIGEzMSA9IHRoaXMuYTMxOwoJICAgICAgICB2YXIgYTMyID0gdGhpcy5hMzI7CgkgICAgICAgIHZhciBhMzMgPSB0aGlzLmEzMzsKCSAgICAgICAgdmFyIG4gPSB4VmFsdWVzLmxlbmd0aDsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKCSAgICAgICAgICAgIHZhciB4ID0geFZhbHVlc1tpXTsKCSAgICAgICAgICAgIHZhciB5ID0geVZhbHVlc1tpXTsKCSAgICAgICAgICAgIHZhciBkZW5vbWluYXRvciA9IGExMyAqIHggKyBhMjMgKiB5ICsgYTMzOwoJICAgICAgICAgICAgeFZhbHVlc1tpXSA9IChhMTEgKiB4ICsgYTIxICogeSArIGEzMSkgLyBkZW5vbWluYXRvcjsKCSAgICAgICAgICAgIHlWYWx1ZXNbaV0gPSAoYTEyICogeCArIGEyMiAqIHkgKyBhMzIpIC8gZGVub21pbmF0b3I7CgkgICAgICAgIH0KCSAgICB9OwoJICAgIFBlcnNwZWN0aXZlVHJhbnNmb3JtLnNxdWFyZVRvUXVhZHJpbGF0ZXJhbCA9IGZ1bmN0aW9uICh4MCAvKmZsb2F0Ki8sIHkwIC8qZmxvYXQqLywgeDEgLypmbG9hdCovLCB5MSAvKmZsb2F0Ki8sIHgyIC8qZmxvYXQqLywgeTIgLypmbG9hdCovLCB4MyAvKmZsb2F0Ki8sIHkzIC8qZmxvYXQqLykgewoJICAgICAgICB2YXIgZHgzID0geDAgLSB4MSArIHgyIC0geDM7CgkgICAgICAgIHZhciBkeTMgPSB5MCAtIHkxICsgeTIgLSB5MzsKCSAgICAgICAgaWYgKGR4MyA9PT0gMC4wICYmIGR5MyA9PT0gMC4wKSB7CgkgICAgICAgICAgICAvLyBBZmZpbmUKCSAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc3BlY3RpdmVUcmFuc2Zvcm0oeDEgLSB4MCwgeDIgLSB4MSwgeDAsIHkxIC0geTAsIHkyIC0geTEsIHkwLCAwLjAsIDAuMCwgMS4wKTsKCSAgICAgICAgfQoJICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgIHZhciBkeDEgPSB4MSAtIHgyOwoJICAgICAgICAgICAgdmFyIGR4MiA9IHgzIC0geDI7CgkgICAgICAgICAgICB2YXIgZHkxID0geTEgLSB5MjsKCSAgICAgICAgICAgIHZhciBkeTIgPSB5MyAtIHkyOwoJICAgICAgICAgICAgdmFyIGRlbm9taW5hdG9yID0gZHgxICogZHkyIC0gZHgyICogZHkxOwoJICAgICAgICAgICAgdmFyIGExMyA9IChkeDMgKiBkeTIgLSBkeDIgKiBkeTMpIC8gZGVub21pbmF0b3I7CgkgICAgICAgICAgICB2YXIgYTIzID0gKGR4MSAqIGR5MyAtIGR4MyAqIGR5MSkgLyBkZW5vbWluYXRvcjsKCSAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc3BlY3RpdmVUcmFuc2Zvcm0oeDEgLSB4MCArIGExMyAqIHgxLCB4MyAtIHgwICsgYTIzICogeDMsIHgwLCB5MSAtIHkwICsgYTEzICogeTEsIHkzIC0geTAgKyBhMjMgKiB5MywgeTAsIGExMywgYTIzLCAxLjApOwoJICAgICAgICB9CgkgICAgfTsKCSAgICBQZXJzcGVjdGl2ZVRyYW5zZm9ybS5xdWFkcmlsYXRlcmFsVG9TcXVhcmUgPSBmdW5jdGlvbiAoeDAgLypmbG9hdCovLCB5MCAvKmZsb2F0Ki8sIHgxIC8qZmxvYXQqLywgeTEgLypmbG9hdCovLCB4MiAvKmZsb2F0Ki8sIHkyIC8qZmxvYXQqLywgeDMgLypmbG9hdCovLCB5MyAvKmZsb2F0Ki8pIHsKCSAgICAgICAgLy8gSGVyZSwgdGhlIGFkam9pbnQgc2VydmVzIGFzIHRoZSBpbnZlcnNlOgoJICAgICAgICByZXR1cm4gUGVyc3BlY3RpdmVUcmFuc2Zvcm0uc3F1YXJlVG9RdWFkcmlsYXRlcmFsKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MykuYnVpbGRBZGpvaW50KCk7CgkgICAgfTsKCSAgICBQZXJzcGVjdGl2ZVRyYW5zZm9ybS5wcm90b3R5cGUuYnVpbGRBZGpvaW50ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICAvLyBBZGpvaW50IGlzIHRoZSB0cmFuc3Bvc2Ugb2YgdGhlIGNvZmFjdG9yIG1hdHJpeDoKCSAgICAgICAgcmV0dXJuIG5ldyBQZXJzcGVjdGl2ZVRyYW5zZm9ybSh0aGlzLmEyMiAqIHRoaXMuYTMzIC0gdGhpcy5hMjMgKiB0aGlzLmEzMiwgdGhpcy5hMjMgKiB0aGlzLmEzMSAtIHRoaXMuYTIxICogdGhpcy5hMzMsIHRoaXMuYTIxICogdGhpcy5hMzIgLSB0aGlzLmEyMiAqIHRoaXMuYTMxLCB0aGlzLmExMyAqIHRoaXMuYTMyIC0gdGhpcy5hMTIgKiB0aGlzLmEzMywgdGhpcy5hMTEgKiB0aGlzLmEzMyAtIHRoaXMuYTEzICogdGhpcy5hMzEsIHRoaXMuYTEyICogdGhpcy5hMzEgLSB0aGlzLmExMSAqIHRoaXMuYTMyLCB0aGlzLmExMiAqIHRoaXMuYTIzIC0gdGhpcy5hMTMgKiB0aGlzLmEyMiwgdGhpcy5hMTMgKiB0aGlzLmEyMSAtIHRoaXMuYTExICogdGhpcy5hMjMsIHRoaXMuYTExICogdGhpcy5hMjIgLSB0aGlzLmExMiAqIHRoaXMuYTIxKTsKCSAgICB9OwoJICAgIFBlcnNwZWN0aXZlVHJhbnNmb3JtLnByb3RvdHlwZS50aW1lcyA9IGZ1bmN0aW9uIChvdGhlcikgewoJICAgICAgICByZXR1cm4gbmV3IFBlcnNwZWN0aXZlVHJhbnNmb3JtKHRoaXMuYTExICogb3RoZXIuYTExICsgdGhpcy5hMjEgKiBvdGhlci5hMTIgKyB0aGlzLmEzMSAqIG90aGVyLmExMywgdGhpcy5hMTEgKiBvdGhlci5hMjEgKyB0aGlzLmEyMSAqIG90aGVyLmEyMiArIHRoaXMuYTMxICogb3RoZXIuYTIzLCB0aGlzLmExMSAqIG90aGVyLmEzMSArIHRoaXMuYTIxICogb3RoZXIuYTMyICsgdGhpcy5hMzEgKiBvdGhlci5hMzMsIHRoaXMuYTEyICogb3RoZXIuYTExICsgdGhpcy5hMjIgKiBvdGhlci5hMTIgKyB0aGlzLmEzMiAqIG90aGVyLmExMywgdGhpcy5hMTIgKiBvdGhlci5hMjEgKyB0aGlzLmEyMiAqIG90aGVyLmEyMiArIHRoaXMuYTMyICogb3RoZXIuYTIzLCB0aGlzLmExMiAqIG90aGVyLmEzMSArIHRoaXMuYTIyICogb3RoZXIuYTMyICsgdGhpcy5hMzIgKiBvdGhlci5hMzMsIHRoaXMuYTEzICogb3RoZXIuYTExICsgdGhpcy5hMjMgKiBvdGhlci5hMTIgKyB0aGlzLmEzMyAqIG90aGVyLmExMywgdGhpcy5hMTMgKiBvdGhlci5hMjEgKyB0aGlzLmEyMyAqIG90aGVyLmEyMiArIHRoaXMuYTMzICogb3RoZXIuYTIzLCB0aGlzLmExMyAqIG90aGVyLmEzMSArIHRoaXMuYTIzICogb3RoZXIuYTMyICsgdGhpcy5hMzMgKiBvdGhlci5hMzMpOwoJICAgIH07CgkgICAgcmV0dXJuIFBlcnNwZWN0aXZlVHJhbnNmb3JtOwoJfSgpKTsKCVBlcnNwZWN0aXZlVHJhbnNmb3JtJDEuZGVmYXVsdCA9IFBlcnNwZWN0aXZlVHJhbnNmb3JtOwoKCS8qCgkgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCgl2YXIgX19leHRlbmRzJDIgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fAoJICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fAoJICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07CgkgICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgIH07CgkgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQoJICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CgkgICAgfTsKCX0pKCk7CglPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVmYXVsdEdyaWRTYW1wbGVyJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcuY29tbW9uIHsqLwoJdmFyIEdyaWRTYW1wbGVyXzEgPSBHcmlkU2FtcGxlciQxOwoJdmFyIEJpdE1hdHJpeF8xJDEgPSBCaXRNYXRyaXgkMTsKCXZhciBQZXJzcGVjdGl2ZVRyYW5zZm9ybV8xJDEgPSBQZXJzcGVjdGl2ZVRyYW5zZm9ybSQxOwoJdmFyIE5vdEZvdW5kRXhjZXB0aW9uXzEkNCA9IE5vdEZvdW5kRXhjZXB0aW9uJDE7CgkvKioKCSAqIEBhdXRob3IgU2VhbiBPd2VuCgkgKi8KCXZhciBEZWZhdWx0R3JpZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CgkgICAgX19leHRlbmRzJDIoRGVmYXVsdEdyaWRTYW1wbGVyLCBfc3VwZXIpOwoJICAgIGZ1bmN0aW9uIERlZmF1bHRHcmlkU2FtcGxlcigpIHsKCSAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwoJICAgIH0KCSAgICAvKkBPdmVycmlkZSovCgkgICAgRGVmYXVsdEdyaWRTYW1wbGVyLnByb3RvdHlwZS5zYW1wbGVHcmlkID0gZnVuY3Rpb24gKGltYWdlLCBkaW1lbnNpb25YIC8qaW50Ki8sIGRpbWVuc2lvblkgLyppbnQqLywgcDFUb1ggLypmbG9hdCovLCBwMVRvWSAvKmZsb2F0Ki8sIHAyVG9YIC8qZmxvYXQqLywgcDJUb1kgLypmbG9hdCovLCBwM1RvWCAvKmZsb2F0Ki8sIHAzVG9ZIC8qZmxvYXQqLywgcDRUb1ggLypmbG9hdCovLCBwNFRvWSAvKmZsb2F0Ki8sIHAxRnJvbVggLypmbG9hdCovLCBwMUZyb21ZIC8qZmxvYXQqLywgcDJGcm9tWCAvKmZsb2F0Ki8sIHAyRnJvbVkgLypmbG9hdCovLCBwM0Zyb21YIC8qZmxvYXQqLywgcDNGcm9tWSAvKmZsb2F0Ki8sIHA0RnJvbVggLypmbG9hdCovLCBwNEZyb21ZIC8qZmxvYXQqLykgewoJICAgICAgICB2YXIgdHJhbnNmb3JtID0gUGVyc3BlY3RpdmVUcmFuc2Zvcm1fMSQxLmRlZmF1bHQucXVhZHJpbGF0ZXJhbFRvUXVhZHJpbGF0ZXJhbChwMVRvWCwgcDFUb1ksIHAyVG9YLCBwMlRvWSwgcDNUb1gsIHAzVG9ZLCBwNFRvWCwgcDRUb1ksIHAxRnJvbVgsIHAxRnJvbVksIHAyRnJvbVgsIHAyRnJvbVksIHAzRnJvbVgsIHAzRnJvbVksIHA0RnJvbVgsIHA0RnJvbVkpOwoJICAgICAgICByZXR1cm4gdGhpcy5zYW1wbGVHcmlkV2l0aFRyYW5zZm9ybShpbWFnZSwgZGltZW5zaW9uWCwgZGltZW5zaW9uWSwgdHJhbnNmb3JtKTsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBEZWZhdWx0R3JpZFNhbXBsZXIucHJvdG90eXBlLnNhbXBsZUdyaWRXaXRoVHJhbnNmb3JtID0gZnVuY3Rpb24gKGltYWdlLCBkaW1lbnNpb25YIC8qaW50Ki8sIGRpbWVuc2lvblkgLyppbnQqLywgdHJhbnNmb3JtKSB7CgkgICAgICAgIGlmIChkaW1lbnNpb25YIDw9IDAgfHwgZGltZW5zaW9uWSA8PSAwKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb25fMSQ0LmRlZmF1bHQoKTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgYml0cyA9IG5ldyBCaXRNYXRyaXhfMSQxLmRlZmF1bHQoZGltZW5zaW9uWCwgZGltZW5zaW9uWSk7CgkgICAgICAgIHZhciBwb2ludHMgPSBuZXcgRmxvYXQzMkFycmF5KDIgKiBkaW1lbnNpb25YKTsKCSAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBkaW1lbnNpb25ZOyB5KyspIHsKCSAgICAgICAgICAgIHZhciBtYXggPSBwb2ludHMubGVuZ3RoOwoJICAgICAgICAgICAgdmFyIGlWYWx1ZSA9IHkgKyAwLjU7CgkgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IG1heDsgeCArPSAyKSB7CgkgICAgICAgICAgICAgICAgcG9pbnRzW3hdID0gKHggLyAyKSArIDAuNTsKCSAgICAgICAgICAgICAgICBwb2ludHNbeCArIDFdID0gaVZhbHVlOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgdHJhbnNmb3JtLnRyYW5zZm9ybVBvaW50cyhwb2ludHMpOwoJICAgICAgICAgICAgLy8gUXVpY2sgY2hlY2sgdG8gc2VlIGlmIHBvaW50cyB0cmFuc2Zvcm1lZCB0byBzb21ldGhpbmcgaW5zaWRlIHRoZSBpbWFnZQoJICAgICAgICAgICAgLy8gc3VmZmljaWVudCB0byBjaGVjayB0aGUgZW5kcG9pbnRzCgkgICAgICAgICAgICBHcmlkU2FtcGxlcl8xLmRlZmF1bHQuY2hlY2tBbmROdWRnZVBvaW50cyhpbWFnZSwgcG9pbnRzKTsKCSAgICAgICAgICAgIHRyeSB7CgkgICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBtYXg7IHggKz0gMikgewoJICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UuZ2V0KE1hdGguZmxvb3IocG9pbnRzW3hdKSwgTWF0aC5mbG9vcihwb2ludHNbeCArIDFdKSkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJsYWNrKC1pc2gpIHBpeGVsCgkgICAgICAgICAgICAgICAgICAgICAgICBiaXRzLnNldCh4IC8gMiwgeSk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBjYXRjaCAoYWlvb2JlIC8qOiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24qLykgewoJICAgICAgICAgICAgICAgIC8vIFRoaXMgZmVlbHMgd3JvbmcsIGJ1dCwgc29tZXRpbWVzIGlmIHRoZSBmaW5kZXIgcGF0dGVybnMgYXJlIG1pc2lkZW50aWZpZWQsIHRoZSByZXN1bHRpbmcKCSAgICAgICAgICAgICAgICAvLyB0cmFuc2Zvcm0gZ2V0cyAidHdpc3RlZCIgc3VjaCB0aGF0IGl0IG1hcHMgYSBzdHJhaWdodCBsaW5lIG9mIHBvaW50cyB0byBhIHNldCBvZiBwb2ludHMKCSAgICAgICAgICAgICAgICAvLyB3aG9zZSBlbmRwb2ludHMgYXJlIGluIGJvdW5kcywgYnV0IG90aGVycyBhcmUgbm90LiBUaGVyZSBpcyBwcm9iYWJseSBzb21lIG1hdGhlbWF0aWNhbAoJICAgICAgICAgICAgICAgIC8vIHdheSB0byBkZXRlY3QgdGhpcyBhYm91dCB0aGUgdHJhbnNmb3JtYXRpb24gdGhhdCBJIGRvbid0IGtub3cgeWV0LgoJICAgICAgICAgICAgICAgIC8vIFRoaXMgcmVzdWx0cyBpbiBhbiB1Z2x5IHJ1bnRpbWUgZXhjZXB0aW9uIGRlc3BpdGUgb3VyIGNsZXZlciBjaGVja3MgYWJvdmUgLS0gY2FuJ3QgaGF2ZQoJICAgICAgICAgICAgICAgIC8vIHRoYXQuIFdlIGNvdWxkIGNoZWNrIGVhY2ggcG9pbnQncyBjb29yZGluYXRlcyBidXQgdGhhdCBmZWVscyBkdXBsaWNhdGl2ZS4gV2Ugc2V0dGxlIGZvcgoJICAgICAgICAgICAgICAgIC8vIGNhdGNoaW5nIGFuZCB3cmFwcGluZyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uCgkgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uXzEkNC5kZWZhdWx0KCk7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIGJpdHM7CgkgICAgfTsKCSAgICByZXR1cm4gRGVmYXVsdEdyaWRTYW1wbGVyOwoJfShHcmlkU2FtcGxlcl8xLmRlZmF1bHQpKTsKCURlZmF1bHRHcmlkU2FtcGxlciQxLmRlZmF1bHQgPSBEZWZhdWx0R3JpZFNhbXBsZXI7CgoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEdyaWRTYW1wbGVySW5zdGFuY2UkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJdmFyIERlZmF1bHRHcmlkU2FtcGxlcl8xID0gRGVmYXVsdEdyaWRTYW1wbGVyJDE7Cgl2YXIgR3JpZFNhbXBsZXJJbnN0YW5jZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBHcmlkU2FtcGxlckluc3RhbmNlKCkgewoJICAgIH0KCSAgICAvKioKCSAgICAgKiBTZXRzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBHcmlkU2FtcGxlciB1c2VkIGJ5IHRoZSBsaWJyYXJ5LiBPbmUgZ2xvYmFsCgkgICAgICogaW5zdGFuY2UgaXMgc3RvcmVkLCB3aGljaCBtYXkgc291bmQgcHJvYmxlbWF0aWMuIEJ1dCwgdGhlIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkCgkgICAgICogb3VnaHQgdG8gYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBlbnRpcmUgcGxhdGZvcm0sIGFuZCBhbGwgdXNlcyBvZiB0aGlzIGxpYnJhcnkKCSAgICAgKiBpbiB0aGUgd2hvbGUgbGlmZXRpbWUgb2YgdGhlIEpWTS4gRm9yIGluc3RhbmNlLCBhbiBBbmRyb2lkIGFjdGl2aXR5IGNhbiBzd2FwIGluCgkgICAgICogYW4gaW1wbGVtZW50YXRpb24gdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgbmF0aXZlIHBsYXRmb3JtIGxpYnJhcmllcy4KCSAgICAgKgoJICAgICAqIEBwYXJhbSBuZXdHcmlkU2FtcGxlciBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgb2JqZWN0IHRvIGluc3RhbGwuCgkgICAgICovCgkgICAgR3JpZFNhbXBsZXJJbnN0YW5jZS5zZXRHcmlkU2FtcGxlciA9IGZ1bmN0aW9uIChuZXdHcmlkU2FtcGxlcikgewoJICAgICAgICBHcmlkU2FtcGxlckluc3RhbmNlLmdyaWRTYW1wbGVyID0gbmV3R3JpZFNhbXBsZXI7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIEdyaWRTYW1wbGVyCgkgICAgICovCgkgICAgR3JpZFNhbXBsZXJJbnN0YW5jZS5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIEdyaWRTYW1wbGVySW5zdGFuY2UuZ3JpZFNhbXBsZXI7CgkgICAgfTsKCSAgICBHcmlkU2FtcGxlckluc3RhbmNlLmdyaWRTYW1wbGVyID0gbmV3IERlZmF1bHRHcmlkU2FtcGxlcl8xLmRlZmF1bHQoKTsKCSAgICByZXR1cm4gR3JpZFNhbXBsZXJJbnN0YW5jZTsKCX0oKSk7CglHcmlkU2FtcGxlckluc3RhbmNlJDEuZGVmYXVsdCA9IEdyaWRTYW1wbGVySW5zdGFuY2U7CgoJdmFyIFJlc3VsdFBvaW50JDEgPSB7fTsKCgl2YXIgRmxvYXQkMSA9IHt9OwoKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShGbG9hdCQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgkvKioKCSAqIFBvbnlmaWxsIGZvciBKYXZhJ3MgRmxvYXQgY2xhc3MuCgkgKi8KCXZhciBGbG9hdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBGbG9hdCgpIHsKCSAgICB9CgkgICAgLyoqCgkgICAgICogU2luY1RTIGhhcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gaW50IGFuZCBmbG9hdCwgdGhlcmUncyBhbGwgbnVtYmVycywKCSAgICAgKiB0aGlzIGlzIHVzZWQgb25seSB0byBwb2x5ZmlsbCBKYXZhIGNvZGUuCgkgICAgICovCgkgICAgRmxvYXQuZmxvYXRUb0ludEJpdHMgPSBmdW5jdGlvbiAoZikgewoJICAgICAgICByZXR1cm4gZjsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFRoZSBmbG9hdCBtYXggdmFsdWUgaW4gSlMgaXMgdGhlIG51bWJlciBtYXggdmFsdWUuCgkgICAgICovCgkgICAgRmxvYXQuTUFYX1ZBTFVFID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7CgkgICAgcmV0dXJuIEZsb2F0OwoJfSgpKTsKCUZsb2F0JDEuZGVmYXVsdCA9IEZsb2F0OwoKCS8qCgkgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCglPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVzdWx0UG9pbnQkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJLypuYW1lc3BhY2UgY29tLmdvb2dsZS56eGluZyB7Ki8KCXZhciBNYXRoVXRpbHNfMSQxID0gTWF0aFV0aWxzJDE7Cgl2YXIgRmxvYXRfMSA9IEZsb2F0JDE7CgkvKioKCSAqIDxwPkVuY2Fwc3VsYXRlcyBhIHBvaW50IG9mIGludGVyZXN0IGluIGFuIGltYWdlIGNvbnRhaW5pbmcgYSBiYXJjb2RlLiBUeXBpY2FsbHksIHRoaXMKCSAqIHdvdWxkIGJlIHRoZSBsb2NhdGlvbiBvZiBhIGZpbmRlciBwYXR0ZXJuIG9yIHRoZSBjb3JuZXIgb2YgdGhlIGJhcmNvZGUsIGZvciBleGFtcGxlLjwvcD4KCSAqCgkgKiBAYXV0aG9yIFNlYW4gT3dlbgoJICovCgl2YXIgUmVzdWx0UG9pbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgZnVuY3Rpb24gUmVzdWx0UG9pbnQoeCwgeSkgewoJICAgICAgICB0aGlzLnggPSB4OwoJICAgICAgICB0aGlzLnkgPSB5OwoJICAgIH0KCSAgICBSZXN1bHRQb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMueDsKCSAgICB9OwoJICAgIFJlc3VsdFBvaW50LnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy55OwoJICAgIH07CgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIFJlc3VsdFBvaW50LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAob3RoZXIpIHsKCSAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgUmVzdWx0UG9pbnQpIHsKCSAgICAgICAgICAgIHZhciBvdGhlclBvaW50ID0gb3RoZXI7CgkgICAgICAgICAgICByZXR1cm4gdGhpcy54ID09PSBvdGhlclBvaW50LnggJiYgdGhpcy55ID09PSBvdGhlclBvaW50Lnk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgIH07CgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIFJlc3VsdFBvaW50LnByb3RvdHlwZS5oYXNoQ29kZSA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIDMxICogRmxvYXRfMS5kZWZhdWx0LmZsb2F0VG9JbnRCaXRzKHRoaXMueCkgKyBGbG9hdF8xLmRlZmF1bHQuZmxvYXRUb0ludEJpdHModGhpcy55KTsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBSZXN1bHRQb2ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiAnKCcgKyB0aGlzLnggKyAnLCcgKyB0aGlzLnkgKyAnKSc7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBPcmRlcnMgYW4gYXJyYXkgb2YgdGhyZWUgUmVzdWx0UG9pbnRzIGluIGFuIG9yZGVyIFtBLEIsQ10gc3VjaCB0aGF0IEFCIGlzIGxlc3MgdGhhbiBBQwoJICAgICAqIGFuZCBCQyBpcyBsZXNzIHRoYW4gQUMsIGFuZCB0aGUgYW5nbGUgYmV0d2VlbiBCQyBhbmQgQkEgaXMgbGVzcyB0aGFuIDE4MCBkZWdyZWVzLgoJICAgICAqCgkgICAgICogQHBhcmFtIHBhdHRlcm5zIGFycmF5IG9mIHRocmVlIHtAY29kZSBSZXN1bHRQb2ludH0gdG8gb3JkZXIKCSAgICAgKi8KCSAgICBSZXN1bHRQb2ludC5vcmRlckJlc3RQYXR0ZXJucyA9IGZ1bmN0aW9uIChwYXR0ZXJucykgewoJICAgICAgICAvLyBGaW5kIGRpc3RhbmNlcyBiZXR3ZWVuIHBhdHRlcm4gY2VudGVycwoJICAgICAgICB2YXIgemVyb09uZURpc3RhbmNlID0gdGhpcy5kaXN0YW5jZShwYXR0ZXJuc1swXSwgcGF0dGVybnNbMV0pOwoJICAgICAgICB2YXIgb25lVHdvRGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlKHBhdHRlcm5zWzFdLCBwYXR0ZXJuc1syXSk7CgkgICAgICAgIHZhciB6ZXJvVHdvRGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlKHBhdHRlcm5zWzBdLCBwYXR0ZXJuc1syXSk7CgkgICAgICAgIHZhciBwb2ludEE7CgkgICAgICAgIHZhciBwb2ludEI7CgkgICAgICAgIHZhciBwb2ludEM7CgkgICAgICAgIC8vIEFzc3VtZSBvbmUgY2xvc2VzdCB0byBvdGhlciB0d28gaXMgQjsgQSBhbmQgQyB3aWxsIGp1c3QgYmUgZ3Vlc3NlcyBhdCBmaXJzdAoJICAgICAgICBpZiAob25lVHdvRGlzdGFuY2UgPj0gemVyb09uZURpc3RhbmNlICYmIG9uZVR3b0Rpc3RhbmNlID49IHplcm9Ud29EaXN0YW5jZSkgewoJICAgICAgICAgICAgcG9pbnRCID0gcGF0dGVybnNbMF07CgkgICAgICAgICAgICBwb2ludEEgPSBwYXR0ZXJuc1sxXTsKCSAgICAgICAgICAgIHBvaW50QyA9IHBhdHRlcm5zWzJdOwoJICAgICAgICB9CgkgICAgICAgIGVsc2UgaWYgKHplcm9Ud29EaXN0YW5jZSA+PSBvbmVUd29EaXN0YW5jZSAmJiB6ZXJvVHdvRGlzdGFuY2UgPj0gemVyb09uZURpc3RhbmNlKSB7CgkgICAgICAgICAgICBwb2ludEIgPSBwYXR0ZXJuc1sxXTsKCSAgICAgICAgICAgIHBvaW50QSA9IHBhdHRlcm5zWzBdOwoJICAgICAgICAgICAgcG9pbnRDID0gcGF0dGVybnNbMl07CgkgICAgICAgIH0KCSAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICBwb2ludEIgPSBwYXR0ZXJuc1syXTsKCSAgICAgICAgICAgIHBvaW50QSA9IHBhdHRlcm5zWzBdOwoJICAgICAgICAgICAgcG9pbnRDID0gcGF0dGVybnNbMV07CgkgICAgICAgIH0KCSAgICAgICAgLy8gVXNlIGNyb3NzIHByb2R1Y3QgdG8gZmlndXJlIG91dCB3aGV0aGVyIEEgYW5kIEMgYXJlIGNvcnJlY3Qgb3IgZmxpcHBlZC4KCSAgICAgICAgLy8gVGhpcyBhc2tzIHdoZXRoZXIgQkMgeCBCQSBoYXMgYSBwb3NpdGl2ZSB6IGNvbXBvbmVudCwgd2hpY2ggaXMgdGhlIGFycmFuZ2VtZW50CgkgICAgICAgIC8vIHdlIHdhbnQgZm9yIEEsIEIsIEMuIElmIGl0J3MgbmVnYXRpdmUsIHRoZW4gd2UndmUgZ290IGl0IGZsaXBwZWQgYXJvdW5kIGFuZAoJICAgICAgICAvLyBzaG91bGQgc3dhcCBBIGFuZCBDLgoJICAgICAgICBpZiAodGhpcy5jcm9zc1Byb2R1Y3RaKHBvaW50QSwgcG9pbnRCLCBwb2ludEMpIDwgMC4wKSB7CgkgICAgICAgICAgICB2YXIgdGVtcCA9IHBvaW50QTsKCSAgICAgICAgICAgIHBvaW50QSA9IHBvaW50QzsKCSAgICAgICAgICAgIHBvaW50QyA9IHRlbXA7CgkgICAgICAgIH0KCSAgICAgICAgcGF0dGVybnNbMF0gPSBwb2ludEE7CgkgICAgICAgIHBhdHRlcm5zWzFdID0gcG9pbnRCOwoJICAgICAgICBwYXR0ZXJuc1syXSA9IHBvaW50QzsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEBwYXJhbSBwYXR0ZXJuMSBmaXJzdCBwYXR0ZXJuCgkgICAgICogQHBhcmFtIHBhdHRlcm4yIHNlY29uZCBwYXR0ZXJuCgkgICAgICogQHJldHVybiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMKCSAgICAgKi8KCSAgICBSZXN1bHRQb2ludC5kaXN0YW5jZSA9IGZ1bmN0aW9uIChwYXR0ZXJuMSwgcGF0dGVybjIpIHsKCSAgICAgICAgcmV0dXJuIE1hdGhVdGlsc18xJDEuZGVmYXVsdC5kaXN0YW5jZShwYXR0ZXJuMS54LCBwYXR0ZXJuMS55LCBwYXR0ZXJuMi54LCBwYXR0ZXJuMi55KTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIFJldHVybnMgdGhlIHogY29tcG9uZW50IG9mIHRoZSBjcm9zcyBwcm9kdWN0IGJldHdlZW4gdmVjdG9ycyBCQyBhbmQgQkEuCgkgICAgICovCgkgICAgUmVzdWx0UG9pbnQuY3Jvc3NQcm9kdWN0WiA9IGZ1bmN0aW9uIChwb2ludEEsIHBvaW50QiwgcG9pbnRDKSB7CgkgICAgICAgIHZhciBiWCA9IHBvaW50Qi54OwoJICAgICAgICB2YXIgYlkgPSBwb2ludEIueTsKCSAgICAgICAgcmV0dXJuICgocG9pbnRDLnggLSBiWCkgKiAocG9pbnRBLnkgLSBiWSkpIC0gKChwb2ludEMueSAtIGJZKSAqIChwb2ludEEueCAtIGJYKSk7CgkgICAgfTsKCSAgICByZXR1cm4gUmVzdWx0UG9pbnQ7Cgl9KCkpOwoJUmVzdWx0UG9pbnQkMS5kZWZhdWx0ID0gUmVzdWx0UG9pbnQ7CgoJdmFyIEFsaWdubWVudFBhdHRlcm5GaW5kZXIkMSA9IHt9OwoKCXZhciBBbGlnbm1lbnRQYXR0ZXJuJDEgPSB7fTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJdmFyIF9fZXh0ZW5kcyQxID0gKGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHsKCSAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwKCSAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHwKCSAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9OwoJICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTsKCSAgICB9OwoJICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikgewoJICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH0KCSAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpOwoJICAgIH07Cgl9KSgpOwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEFsaWdubWVudFBhdHRlcm4kMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJLypuYW1lc3BhY2UgY29tLmdvb2dsZS56eGluZy5xcmNvZGUuZGV0ZWN0b3IgeyovCgl2YXIgUmVzdWx0UG9pbnRfMSQzID0gUmVzdWx0UG9pbnQkMTsKCS8qKgoJICogPHA+RW5jYXBzdWxhdGVzIGFuIGFsaWdubWVudCBwYXR0ZXJuLCB3aGljaCBhcmUgdGhlIHNtYWxsZXIgc3F1YXJlIHBhdHRlcm5zIGZvdW5kIGluCgkgKiBhbGwgYnV0IHRoZSBzaW1wbGVzdCBRUiBDb2Rlcy48L3A+CgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIEFsaWdubWVudFBhdHRlcm4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CgkgICAgX19leHRlbmRzJDEoQWxpZ25tZW50UGF0dGVybiwgX3N1cGVyKTsKCSAgICBmdW5jdGlvbiBBbGlnbm1lbnRQYXR0ZXJuKHBvc1ggLypmbG9hdCovLCBwb3NZIC8qZmxvYXQqLywgZXN0aW1hdGVkTW9kdWxlU2l6ZSAvKmZsb2F0Ki8pIHsKCSAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zWCwgcG9zWSkgfHwgdGhpczsKCSAgICAgICAgX3RoaXMuZXN0aW1hdGVkTW9kdWxlU2l6ZSA9IGVzdGltYXRlZE1vZHVsZVNpemU7CgkgICAgICAgIHJldHVybiBfdGhpczsKCSAgICB9CgkgICAgLyoqCgkgICAgICogPHA+RGV0ZXJtaW5lcyBpZiB0aGlzIGFsaWdubWVudCBwYXR0ZXJuICJhYm91dCBlcXVhbHMiIGFuIGFsaWdubWVudCBwYXR0ZXJuIGF0IHRoZSBzdGF0ZWQKCSAgICAgKiBwb3NpdGlvbiBhbmQgc2l6ZSAtLSBtZWFuaW5nLCBpdCBpcyBhdCBuZWFybHkgdGhlIHNhbWUgY2VudGVyIHdpdGggbmVhcmx5IHRoZSBzYW1lIHNpemUuPC9wPgoJICAgICAqLwoJICAgIEFsaWdubWVudFBhdHRlcm4ucHJvdG90eXBlLmFib3V0RXF1YWxzID0gZnVuY3Rpb24gKG1vZHVsZVNpemUgLypmbG9hdCovLCBpIC8qZmxvYXQqLywgaiAvKmZsb2F0Ki8pIHsKCSAgICAgICAgaWYgKE1hdGguYWJzKGkgLSB0aGlzLmdldFkoKSkgPD0gbW9kdWxlU2l6ZSAmJiBNYXRoLmFicyhqIC0gdGhpcy5nZXRYKCkpIDw9IG1vZHVsZVNpemUpIHsKCSAgICAgICAgICAgIHZhciBtb2R1bGVTaXplRGlmZiA9IE1hdGguYWJzKG1vZHVsZVNpemUgLSB0aGlzLmVzdGltYXRlZE1vZHVsZVNpemUpOwoJICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVNpemVEaWZmIDw9IDEuMCB8fCBtb2R1bGVTaXplRGlmZiA8PSB0aGlzLmVzdGltYXRlZE1vZHVsZVNpemU7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQ29tYmluZXMgdGhpcyBvYmplY3QncyBjdXJyZW50IGVzdGltYXRlIG9mIGEgZmluZGVyIHBhdHRlcm4gcG9zaXRpb24gYW5kIG1vZHVsZSBzaXplCgkgICAgICogd2l0aCBhIG5ldyBlc3RpbWF0ZS4gSXQgcmV0dXJucyBhIG5ldyB7QGNvZGUgRmluZGVyUGF0dGVybn0gY29udGFpbmluZyBhbiBhdmVyYWdlIG9mIHRoZSB0d28uCgkgICAgICovCgkgICAgQWxpZ25tZW50UGF0dGVybi5wcm90b3R5cGUuY29tYmluZUVzdGltYXRlID0gZnVuY3Rpb24gKGkgLypmbG9hdCovLCBqIC8qZmxvYXQqLywgbmV3TW9kdWxlU2l6ZSAvKmZsb2F0Ki8pIHsKCSAgICAgICAgdmFyIGNvbWJpbmVkWCA9ICh0aGlzLmdldFgoKSArIGopIC8gMi4wOwoJICAgICAgICB2YXIgY29tYmluZWRZID0gKHRoaXMuZ2V0WSgpICsgaSkgLyAyLjA7CgkgICAgICAgIHZhciBjb21iaW5lZE1vZHVsZVNpemUgPSAodGhpcy5lc3RpbWF0ZWRNb2R1bGVTaXplICsgbmV3TW9kdWxlU2l6ZSkgLyAyLjA7CgkgICAgICAgIHJldHVybiBuZXcgQWxpZ25tZW50UGF0dGVybihjb21iaW5lZFgsIGNvbWJpbmVkWSwgY29tYmluZWRNb2R1bGVTaXplKTsKCSAgICB9OwoJICAgIHJldHVybiBBbGlnbm1lbnRQYXR0ZXJuOwoJfShSZXN1bHRQb2ludF8xJDMuZGVmYXVsdCkpOwoJQWxpZ25tZW50UGF0dGVybiQxLmRlZmF1bHQgPSBBbGlnbm1lbnRQYXR0ZXJuOwoKCS8qCgkgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCgl2YXIgX192YWx1ZXMkMSA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykgewoJICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwOwoJICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pOwoJICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHJldHVybiB7CgkgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7CgkgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07CgkgICAgICAgIH0KCSAgICB9OwoJICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/ICJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLiIgOiAiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwoJfTsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShBbGlnbm1lbnRQYXR0ZXJuRmluZGVyJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCXZhciBBbGlnbm1lbnRQYXR0ZXJuXzEgPSBBbGlnbm1lbnRQYXR0ZXJuJDE7Cgl2YXIgTm90Rm91bmRFeGNlcHRpb25fMSQzID0gTm90Rm91bmRFeGNlcHRpb24kMTsKCS8qaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ki8KCS8qaW1wb3J0IGphdmEudXRpbC5MaXN0OyovCgkvKioKCSAqIDxwPlRoaXMgY2xhc3MgYXR0ZW1wdHMgdG8gZmluZCBhbGlnbm1lbnQgcGF0dGVybnMgaW4gYSBRUiBDb2RlLiBBbGlnbm1lbnQgcGF0dGVybnMgbG9vayBsaWtlIGZpbmRlcgoJICogcGF0dGVybnMgYnV0IGFyZSBzbWFsbGVyIGFuZCBhcHBlYXIgYXQgcmVndWxhciBpbnRlcnZhbHMgdGhyb3VnaG91dCB0aGUgaW1hZ2UuPC9wPgoJICoKCSAqIDxwPkF0IHRoZSBtb21lbnQgdGhpcyBvbmx5IGxvb2tzIGZvciB0aGUgYm90dG9tLXJpZ2h0IGFsaWdubWVudCBwYXR0ZXJuLjwvcD4KCSAqCgkgKiA8cD5UaGlzIGlzIG1vc3RseSBhIHNpbXBsaWZpZWQgY29weSBvZiB7QGxpbmsgRmluZGVyUGF0dGVybkZpbmRlcn0uIEl0IGlzIGNvcGllZCwKCSAqIHBhc3RlZCBhbmQgc3RyaXBwZWQgZG93biBoZXJlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlIGJ1dCBkb2VzIHVuZm9ydHVuYXRlbHkgZHVwbGljYXRlCgkgKiBzb21lIGNvZGUuPC9wPgoJICoKCSAqIDxwPlRoaXMgY2xhc3MgaXMgdGhyZWFkLXNhZmUgYnV0IG5vdCByZWVudHJhbnQuIEVhY2ggdGhyZWFkIG11c3QgYWxsb2NhdGUgaXRzIG93biBvYmplY3QuPC9wPgoJICoKCSAqIEBhdXRob3IgU2VhbiBPd2VuCgkgKi8KCXZhciBBbGlnbm1lbnRQYXR0ZXJuRmluZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIC8qKgoJICAgICAqIDxwPkNyZWF0ZXMgYSBmaW5kZXIgdGhhdCB3aWxsIGxvb2sgaW4gYSBwb3J0aW9uIG9mIHRoZSB3aG9sZSBpbWFnZS48L3A+CgkgICAgICoKCSAgICAgKiBAcGFyYW0gaW1hZ2UgaW1hZ2UgdG8gc2VhcmNoCgkgICAgICogQHBhcmFtIHN0YXJ0WCBsZWZ0IGNvbHVtbiBmcm9tIHdoaWNoIHRvIHN0YXJ0IHNlYXJjaGluZwoJICAgICAqIEBwYXJhbSBzdGFydFkgdG9wIHJvdyBmcm9tIHdoaWNoIHRvIHN0YXJ0IHNlYXJjaGluZwoJICAgICAqIEBwYXJhbSB3aWR0aCB3aWR0aCBvZiByZWdpb24gdG8gc2VhcmNoCgkgICAgICogQHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgcmVnaW9uIHRvIHNlYXJjaAoJICAgICAqIEBwYXJhbSBtb2R1bGVTaXplIGVzdGltYXRlZCBtb2R1bGUgc2l6ZSBzbyBmYXIKCSAgICAgKi8KCSAgICBmdW5jdGlvbiBBbGlnbm1lbnRQYXR0ZXJuRmluZGVyKGltYWdlLCBzdGFydFggLyppbnQqLywgc3RhcnRZIC8qaW50Ki8sIHdpZHRoIC8qaW50Ki8sIGhlaWdodCAvKmludCovLCBtb2R1bGVTaXplIC8qZmxvYXQqLywgcmVzdWx0UG9pbnRDYWxsYmFjaykgewoJICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7CgkgICAgICAgIHRoaXMuc3RhcnRYID0gc3RhcnRYOwoJICAgICAgICB0aGlzLnN0YXJ0WSA9IHN0YXJ0WTsKCSAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwoJICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKCSAgICAgICAgdGhpcy5tb2R1bGVTaXplID0gbW9kdWxlU2l6ZTsKCSAgICAgICAgdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrID0gcmVzdWx0UG9pbnRDYWxsYmFjazsKCSAgICAgICAgdGhpcy5wb3NzaWJsZUNlbnRlcnMgPSBbXTsgLy8gbmV3IEFycmF5PGFueT4oNSkpCgkgICAgICAgIC8vIFRZUEVTQ1JJUFRQT1JUOiBhcnJheSBpbml0aWFsaXphdGlvbiB3aXRob3V0IHNpemUgYXMgdGhlIGxlbmd0aCBpcyBjaGVja2VkIGJlbG93CgkgICAgICAgIHRoaXMuY3Jvc3NDaGVja1N0YXRlQ291bnQgPSBuZXcgSW50MzJBcnJheSgzKTsKCSAgICB9CgkgICAgLyoqCgkgICAgICogPHA+VGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gZmluZCB0aGUgYm90dG9tLXJpZ2h0IGFsaWdubWVudCBwYXR0ZXJuIGluIHRoZSBpbWFnZS4gSXQgaXMgYSBiaXQgbWVzc3kgc2luY2UKCSAgICAgKiBpdCdzIHByZXR0eSBwZXJmb3JtYW5jZS1jcml0aWNhbCBhbmQgc28gaXMgd3JpdHRlbiB0byBiZSBmYXN0IGZvcmVtb3N0LjwvcD4KCSAgICAgKgoJICAgICAqIEByZXR1cm4ge0BsaW5rIEFsaWdubWVudFBhdHRlcm59IGlmIGZvdW5kCgkgICAgICogQHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiBpZiBub3QgZm91bmQKCSAgICAgKi8KCSAgICBBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgc3RhcnRYID0gdGhpcy5zdGFydFg7CgkgICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodDsKCSAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aDsKCSAgICAgICAgdmFyIG1heEogPSBzdGFydFggKyB3aWR0aDsKCSAgICAgICAgdmFyIG1pZGRsZUkgPSB0aGlzLnN0YXJ0WSArIChoZWlnaHQgLyAyKTsKCSAgICAgICAgLy8gV2UgYXJlIGxvb2tpbmcgZm9yIGJsYWNrL3doaXRlL2JsYWNrIG1vZHVsZXMgaW4gMToxOjEgcmF0aW8KCSAgICAgICAgLy8gdGhpcyB0cmFja3MgdGhlIG51bWJlciBvZiBibGFjay93aGl0ZS9ibGFjayBtb2R1bGVzIHNlZW4gc28gZmFyCgkgICAgICAgIHZhciBzdGF0ZUNvdW50ID0gbmV3IEludDMyQXJyYXkoMyk7CgkgICAgICAgIHZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7CgkgICAgICAgIGZvciAodmFyIGlHZW4gPSAwOyBpR2VuIDwgaGVpZ2h0OyBpR2VuKyspIHsKCSAgICAgICAgICAgIC8vIFNlYXJjaCBmcm9tIG1pZGRsZSBvdXR3YXJkcwoJICAgICAgICAgICAgdmFyIGkgPSBtaWRkbGVJICsgKChpR2VuICYgMHgwMSkgPT09IDAgPyBNYXRoLmZsb29yKChpR2VuICsgMSkgLyAyKSA6IC1NYXRoLmZsb29yKChpR2VuICsgMSkgLyAyKSk7CgkgICAgICAgICAgICBzdGF0ZUNvdW50WzBdID0gMDsKCSAgICAgICAgICAgIHN0YXRlQ291bnRbMV0gPSAwOwoJICAgICAgICAgICAgc3RhdGVDb3VudFsyXSA9IDA7CgkgICAgICAgICAgICB2YXIgaiA9IHN0YXJ0WDsKCSAgICAgICAgICAgIC8vIEJ1cm4gb2ZmIGxlYWRpbmcgd2hpdGUgcGl4ZWxzIGJlZm9yZSBhbnl0aGluZyBlbHNlOyBpZiB3ZSBzdGFydCBpbiB0aGUgbWlkZGxlIG9mCgkgICAgICAgICAgICAvLyBhIHdoaXRlIHJ1biwgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGNvdW50IGl0cyBsZW5ndGgsIHNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhlCgkgICAgICAgICAgICAvLyB3aGl0ZSBydW4gY29udGludWVkIHRvIHRoZSBsZWZ0IG9mIHRoZSBzdGFydCBwb2ludAoJICAgICAgICAgICAgd2hpbGUgKGogPCBtYXhKICYmICFpbWFnZS5nZXQoaiwgaSkpIHsKCSAgICAgICAgICAgICAgICBqKys7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gMDsKCSAgICAgICAgICAgIHdoaWxlIChqIDwgbWF4SikgewoJICAgICAgICAgICAgICAgIGlmIChpbWFnZS5nZXQoaiwgaSkpIHsKCSAgICAgICAgICAgICAgICAgICAgLy8gQmxhY2sgcGl4ZWwKCSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gMSkgeyAvLyBDb3VudGluZyBibGFjayBwaXhlbHMKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMV0rKzsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gQ291bnRpbmcgd2hpdGUgcGl4ZWxzCgkgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlID09PSAyKSB7IC8vIEEgd2lubmVyPwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpKSB7IC8vIFllcwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlybWVkID0gdGhpcy5oYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBqKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpcm1lZCAhPT0gbnVsbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpcm1lZDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzBdID0gc3RhdGVDb3VudFsyXTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzFdID0gMTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzJdID0gMDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSAxOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFsrK2N1cnJlbnRTdGF0ZV0rKzsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBlbHNlIHsgLy8gV2hpdGUgcGl4ZWwKCSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gMSkgeyAvLyBDb3VudGluZyBibGFjayBwaXhlbHMKCSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSsrOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbY3VycmVudFN0YXRlXSsrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBqKys7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBpZiAodGhpcy5mb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSkgewoJICAgICAgICAgICAgICAgIHZhciBjb25maXJtZWQgPSB0aGlzLmhhbmRsZVBvc3NpYmxlQ2VudGVyKHN0YXRlQ291bnQsIGksIG1heEopOwoJICAgICAgICAgICAgICAgIGlmIChjb25maXJtZWQgIT09IG51bGwpIHsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpcm1lZDsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgLy8gSG1tLCBub3RoaW5nIHdlIHNhdyB3YXMgb2JzZXJ2ZWQgYW5kIGNvbmZpcm1lZCB0d2ljZS4gSWYgd2UgaGFkCgkgICAgICAgIC8vIGFueSBndWVzcyBhdCBhbGwsIHJldHVybiBpdC4KCSAgICAgICAgaWYgKHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aCAhPT0gMCkgewoJICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zc2libGVDZW50ZXJzWzBdOwoJICAgICAgICB9CgkgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbl8xJDMuZGVmYXVsdCgpOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogR2l2ZW4gYSBjb3VudCBvZiBibGFjay93aGl0ZS9ibGFjayBwaXhlbHMganVzdCBzZWVuIGFuZCBhbiBlbmQgcG9zaXRpb24sCgkgICAgICogZmlndXJlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGlzIGJsYWNrL3doaXRlL2JsYWNrIHJ1bi4KCSAgICAgKi8KCSAgICBBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmNlbnRlckZyb21FbmQgPSBmdW5jdGlvbiAoc3RhdGVDb3VudCwgZW5kIC8qaW50Ki8pIHsKCSAgICAgICAgcmV0dXJuIChlbmQgLSBzdGF0ZUNvdW50WzJdKSAtIHN0YXRlQ291bnRbMV0gLyAyLjA7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcGFyYW0gc3RhdGVDb3VudCBjb3VudCBvZiBibGFjay93aGl0ZS9ibGFjayBwaXhlbHMganVzdCByZWFkCgkgICAgICogQHJldHVybiB0cnVlIGlmZiB0aGUgcHJvcG9ydGlvbnMgb2YgdGhlIGNvdW50cyBpcyBjbG9zZSBlbm91Z2ggdG8gdGhlIDEvMS8xIHJhdGlvcwoJICAgICAqICAgICAgICAgdXNlZCBieSBhbGlnbm1lbnQgcGF0dGVybnMgdG8gYmUgY29uc2lkZXJlZCBhIG1hdGNoCgkgICAgICovCgkgICAgQWxpZ25tZW50UGF0dGVybkZpbmRlci5wcm90b3R5cGUuZm91bmRQYXR0ZXJuQ3Jvc3MgPSBmdW5jdGlvbiAoc3RhdGVDb3VudCkgewoJICAgICAgICB2YXIgbW9kdWxlU2l6ZSA9IHRoaXMubW9kdWxlU2l6ZTsKCSAgICAgICAgdmFyIG1heFZhcmlhbmNlID0gbW9kdWxlU2l6ZSAvIDIuMDsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHsKCSAgICAgICAgICAgIGlmIChNYXRoLmFicyhtb2R1bGVTaXplIC0gc3RhdGVDb3VudFtpXSkgPj0gbWF4VmFyaWFuY2UpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHRydWU7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiA8cD5BZnRlciBhIGhvcml6b250YWwgc2NhbiBmaW5kcyBhIHBvdGVudGlhbCBhbGlnbm1lbnQgcGF0dGVybiwgdGhpcyBtZXRob2QKCSAgICAgKiAiY3Jvc3MtY2hlY2tzIiBieSBzY2FubmluZyBkb3duIHZlcnRpY2FsbHkgdGhyb3VnaCB0aGUgY2VudGVyIG9mIHRoZSBwb3NzaWJsZQoJICAgICAqIGFsaWdubWVudCBwYXR0ZXJuIHRvIHNlZSBpZiB0aGUgc2FtZSBwcm9wb3J0aW9uIGlzIGRldGVjdGVkLjwvcD4KCSAgICAgKgoJICAgICAqIEBwYXJhbSBzdGFydEkgcm93IHdoZXJlIGFuIGFsaWdubWVudCBwYXR0ZXJuIHdhcyBkZXRlY3RlZAoJICAgICAqIEBwYXJhbSBjZW50ZXJKIGNlbnRlciBvZiB0aGUgc2VjdGlvbiB0aGF0IGFwcGVhcnMgdG8gY3Jvc3MgYW4gYWxpZ25tZW50IHBhdHRlcm4KCSAgICAgKiBAcGFyYW0gbWF4Q291bnQgbWF4aW11bSByZWFzb25hYmxlIG51bWJlciBvZiBtb2R1bGVzIHRoYXQgc2hvdWxkIGJlCgkgICAgICogb2JzZXJ2ZWQgaW4gYW55IHJlYWRpbmcgc3RhdGUsIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIHRoZSBob3Jpem9udGFsIHNjYW4KCSAgICAgKiBAcmV0dXJuIHZlcnRpY2FsIGNlbnRlciBvZiBhbGlnbm1lbnQgcGF0dGVybiwgb3Ige0BsaW5rIEZsb2F0I05hTn0gaWYgbm90IGZvdW5kCgkgICAgICovCgkgICAgQWxpZ25tZW50UGF0dGVybkZpbmRlci5wcm90b3R5cGUuY3Jvc3NDaGVja1ZlcnRpY2FsID0gZnVuY3Rpb24gKHN0YXJ0SSAvKmludCovLCBjZW50ZXJKIC8qaW50Ki8sIG1heENvdW50IC8qaW50Ki8sIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsIC8qaW50Ki8pIHsKCSAgICAgICAgdmFyIGltYWdlID0gdGhpcy5pbWFnZTsKCSAgICAgICAgdmFyIG1heEkgPSBpbWFnZS5nZXRIZWlnaHQoKTsKCSAgICAgICAgdmFyIHN0YXRlQ291bnQgPSB0aGlzLmNyb3NzQ2hlY2tTdGF0ZUNvdW50OwoJICAgICAgICBzdGF0ZUNvdW50WzBdID0gMDsKCSAgICAgICAgc3RhdGVDb3VudFsxXSA9IDA7CgkgICAgICAgIHN0YXRlQ291bnRbMl0gPSAwOwoJICAgICAgICAvLyBTdGFydCBjb3VudGluZyB1cCBmcm9tIGNlbnRlcgoJICAgICAgICB2YXIgaSA9IHN0YXJ0STsKCSAgICAgICAgd2hpbGUgKGkgPj0gMCAmJiBpbWFnZS5nZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFsxXSsrOwoJICAgICAgICAgICAgaS0tOwoJICAgICAgICB9CgkgICAgICAgIC8vIElmIGFscmVhZHkgdG9vIG1hbnkgbW9kdWxlcyBpbiB0aGlzIHN0YXRlIG9yIHJhbiBvZmYgdGhlIGVkZ2U6CgkgICAgICAgIGlmIChpIDwgMCB8fCBzdGF0ZUNvdW50WzFdID4gbWF4Q291bnQpIHsKCSAgICAgICAgICAgIHJldHVybiBOYU47CgkgICAgICAgIH0KCSAgICAgICAgd2hpbGUgKGkgPj0gMCAmJiAhaW1hZ2UuZ2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbMF0gPD0gbWF4Q291bnQpIHsKCSAgICAgICAgICAgIHN0YXRlQ291bnRbMF0rKzsKCSAgICAgICAgICAgIGktLTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoc3RhdGVDb3VudFswXSA+IG1heENvdW50KSB7CgkgICAgICAgICAgICByZXR1cm4gTmFOOwoJICAgICAgICB9CgkgICAgICAgIC8vIE5vdyBhbHNvIGNvdW50IGRvd24gZnJvbSBjZW50ZXIKCSAgICAgICAgaSA9IHN0YXJ0SSArIDE7CgkgICAgICAgIHdoaWxlIChpIDwgbWF4SSAmJiBpbWFnZS5nZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFsxXSsrOwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICB9CgkgICAgICAgIGlmIChpID09PSBtYXhJIHx8IHN0YXRlQ291bnRbMV0gPiBtYXhDb3VudCkgewoJICAgICAgICAgICAgcmV0dXJuIE5hTjsKCSAgICAgICAgfQoJICAgICAgICB3aGlsZSAoaSA8IG1heEkgJiYgIWltYWdlLmdldChjZW50ZXJKLCBpKSAmJiBzdGF0ZUNvdW50WzJdIDw9IG1heENvdW50KSB7CgkgICAgICAgICAgICBzdGF0ZUNvdW50WzJdKys7CgkgICAgICAgICAgICBpKys7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHN0YXRlQ291bnRbMl0gPiBtYXhDb3VudCkgewoJICAgICAgICAgICAgcmV0dXJuIE5hTjsKCSAgICAgICAgfQoJICAgICAgICB2YXIgc3RhdGVDb3VudFRvdGFsID0gc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdOwoJICAgICAgICBpZiAoNSAqIE1hdGguYWJzKHN0YXRlQ291bnRUb3RhbCAtIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSA+PSAyICogb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpIHsKCSAgICAgICAgICAgIHJldHVybiBOYU47CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkgPyBBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmNlbnRlckZyb21FbmQoc3RhdGVDb3VudCwgaSkgOiBOYU47CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiA8cD5UaGlzIGlzIGNhbGxlZCB3aGVuIGEgaG9yaXpvbnRhbCBzY2FuIGZpbmRzIGEgcG9zc2libGUgYWxpZ25tZW50IHBhdHRlcm4uIEl0IHdpbGwKCSAgICAgKiBjcm9zcyBjaGVjayB3aXRoIGEgdmVydGljYWwgc2NhbiwgYW5kIGlmIHN1Y2Nlc3NmdWwsIHdpbGwgc2VlIGlmIHRoaXMgcGF0dGVybiBoYWQgYmVlbgoJICAgICAqIGZvdW5kIG9uIGEgcHJldmlvdXMgaG9yaXpvbnRhbCBzY2FuLiBJZiBzbywgd2UgY29uc2lkZXIgaXQgY29uZmlybWVkIGFuZCBjb25jbHVkZSB3ZSBoYXZlCgkgICAgICogZm91bmQgdGhlIGFsaWdubWVudCBwYXR0ZXJuLjwvcD4KCSAgICAgKgoJICAgICAqIEBwYXJhbSBzdGF0ZUNvdW50IHJlYWRpbmcgc3RhdGUgbW9kdWxlIGNvdW50cyBmcm9tIGhvcml6b250YWwgc2NhbgoJICAgICAqIEBwYXJhbSBpIHJvdyB3aGVyZSBhbGlnbm1lbnQgcGF0dGVybiBtYXkgYmUgZm91bmQKCSAgICAgKiBAcGFyYW0gaiBlbmQgb2YgcG9zc2libGUgYWxpZ25tZW50IHBhdHRlcm4gaW4gcm93CgkgICAgICogQHJldHVybiB7QGxpbmsgQWxpZ25tZW50UGF0dGVybn0gaWYgd2UgaGF2ZSBmb3VuZCB0aGUgc2FtZSBwYXR0ZXJuIHR3aWNlLCBvciBudWxsIGlmIG5vdAoJICAgICAqLwoJICAgIEFsaWdubWVudFBhdHRlcm5GaW5kZXIucHJvdG90eXBlLmhhbmRsZVBvc3NpYmxlQ2VudGVyID0gZnVuY3Rpb24gKHN0YXRlQ291bnQsIGkgLyppbnQqLywgaiAvKmludCovKSB7CgkgICAgICAgIHZhciBlXzEsIF9hOwoJICAgICAgICB2YXIgc3RhdGVDb3VudFRvdGFsID0gc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdOwoJICAgICAgICB2YXIgY2VudGVySiA9IEFsaWdubWVudFBhdHRlcm5GaW5kZXIuY2VudGVyRnJvbUVuZChzdGF0ZUNvdW50LCBqKTsKCSAgICAgICAgdmFyIGNlbnRlckkgPSB0aGlzLmNyb3NzQ2hlY2tWZXJ0aWNhbChpLCAvKihpbnQpICovIGNlbnRlckosIDIgKiBzdGF0ZUNvdW50WzFdLCBzdGF0ZUNvdW50VG90YWwpOwoJICAgICAgICBpZiAoIWlzTmFOKGNlbnRlckkpKSB7CgkgICAgICAgICAgICB2YXIgZXN0aW1hdGVkTW9kdWxlU2l6ZSA9IChzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl0pIC8gMy4wOwoJICAgICAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDEodGhpcy5wb3NzaWJsZUNlbnRlcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7CgkgICAgICAgICAgICAgICAgICAgIHZhciBjZW50ZXIgPSBfYy52YWx1ZTsKCSAgICAgICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgYWJvdXQgdGhlIHNhbWUgY2VudGVyIGFuZCBtb2R1bGUgc2l6ZToKCSAgICAgICAgICAgICAgICAgICAgaWYgKGNlbnRlci5hYm91dEVxdWFscyhlc3RpbWF0ZWRNb2R1bGVTaXplLCBjZW50ZXJJLCBjZW50ZXJKKSkgewoJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbnRlci5jb21iaW5lRXN0aW1hdGUoY2VudGVySSwgY2VudGVySiwgZXN0aW1hdGVkTW9kdWxlU2l6ZSk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfQoJICAgICAgICAgICAgZmluYWxseSB7CgkgICAgICAgICAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICAvLyBIYWRuJ3QgZm91bmQgdGhpcyBiZWZvcmU7IHNhdmUgaXQKCSAgICAgICAgICAgIHZhciBwb2ludCA9IG5ldyBBbGlnbm1lbnRQYXR0ZXJuXzEuZGVmYXVsdChjZW50ZXJKLCBjZW50ZXJJLCBlc3RpbWF0ZWRNb2R1bGVTaXplKTsKCSAgICAgICAgICAgIHRoaXMucG9zc2libGVDZW50ZXJzLnB1c2gocG9pbnQpOwoJICAgICAgICAgICAgaWYgKHRoaXMucmVzdWx0UG9pbnRDYWxsYmFjayAhPT0gbnVsbCAmJiB0aGlzLnJlc3VsdFBvaW50Q2FsbGJhY2sgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0UG9pbnRDYWxsYmFjay5mb3VuZFBvc3NpYmxlUmVzdWx0UG9pbnQocG9pbnQpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBudWxsOwoJICAgIH07CgkgICAgcmV0dXJuIEFsaWdubWVudFBhdHRlcm5GaW5kZXI7Cgl9KCkpOwoJQWxpZ25tZW50UGF0dGVybkZpbmRlciQxLmRlZmF1bHQgPSBBbGlnbm1lbnRQYXR0ZXJuRmluZGVyOwoKCXZhciBGaW5kZXJQYXR0ZXJuRmluZGVyJDEgPSB7fTsKCgl2YXIgRmluZGVyUGF0dGVybiQxID0ge307CgoJLyoKCSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKCSAqCgkgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKCSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KCSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoJICoKCSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgkgKgoJICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQoJICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKCSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgoJICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAoJICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgkgKi8KCXZhciBfX2V4dGVuZHMgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkgewoJICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHsKCSAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fAoJICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fAoJICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07CgkgICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpOwoJICAgIH07CgkgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7CgkgICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CgkgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQoJICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CgkgICAgfTsKCX0pKCk7CglPYmplY3QuZGVmaW5lUHJvcGVydHkoRmluZGVyUGF0dGVybiQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgkvKm5hbWVzcGFjZSBjb20uZ29vZ2xlLnp4aW5nLnFyY29kZS5kZXRlY3RvciB7Ki8KCXZhciBSZXN1bHRQb2ludF8xJDIgPSBSZXN1bHRQb2ludCQxOwoJLyoqCgkgKiA8cD5FbmNhcHN1bGF0ZXMgYSBmaW5kZXIgcGF0dGVybiwgd2hpY2ggYXJlIHRoZSB0aHJlZSBzcXVhcmUgcGF0dGVybnMgZm91bmQgaW4KCSAqIHRoZSBjb3JuZXJzIG9mIFFSIENvZGVzLiBJdCBhbHNvIGVuY2Fwc3VsYXRlcyBhIGNvdW50IG9mIHNpbWlsYXIgZmluZGVyIHBhdHRlcm5zLAoJICogYXMgYSBjb252ZW5pZW5jZSB0byB0aGUgZmluZGVyJ3MgYm9va2tlZXBpbmcuPC9wPgoJICoKCSAqIEBhdXRob3IgU2VhbiBPd2VuCgkgKi8KCXZhciBGaW5kZXJQYXR0ZXJuID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewoJICAgIF9fZXh0ZW5kcyhGaW5kZXJQYXR0ZXJuLCBfc3VwZXIpOwoJICAgIC8vIEZpbmRlclBhdHRlcm4ocG9zWDogbnVtYmVyLypmbG9hdCovLCBwb3NZOiBudW1iZXIvKmZsb2F0Ki8sIGVzdGltYXRlZE1vZHVsZVNpemU6IG51bWJlci8qZmxvYXQqLykgewoJICAgIC8vICAgdGhpcyhwb3NYLCBwb3NZLCBlc3RpbWF0ZWRNb2R1bGVTaXplLCAxKQoJICAgIC8vIH0KCSAgICBmdW5jdGlvbiBGaW5kZXJQYXR0ZXJuKHBvc1ggLypmbG9hdCovLCBwb3NZIC8qZmxvYXQqLywgZXN0aW1hdGVkTW9kdWxlU2l6ZSAvKmZsb2F0Ki8sIGNvdW50IC8qaW50Ki8pIHsKCSAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zWCwgcG9zWSkgfHwgdGhpczsKCSAgICAgICAgX3RoaXMuZXN0aW1hdGVkTW9kdWxlU2l6ZSA9IGVzdGltYXRlZE1vZHVsZVNpemU7CgkgICAgICAgIF90aGlzLmNvdW50ID0gY291bnQ7CgkgICAgICAgIGlmICh1bmRlZmluZWQgPT09IGNvdW50KSB7CgkgICAgICAgICAgICBfdGhpcy5jb3VudCA9IDE7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIF90aGlzOwoJICAgIH0KCSAgICBGaW5kZXJQYXR0ZXJuLnByb3RvdHlwZS5nZXRFc3RpbWF0ZWRNb2R1bGVTaXplID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRNb2R1bGVTaXplOwoJICAgIH07CgkgICAgRmluZGVyUGF0dGVybi5wcm90b3R5cGUuZ2V0Q291bnQgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmNvdW50OwoJICAgIH07CgkgICAgLyoKCSAgICB2b2lkIGluY3JlbWVudENvdW50KCkgewoJICAgICAgdGhpcy5jb3VudCsrCgkgICAgfQoJICAgICAqLwoJICAgIC8qKgoJICAgICAqIDxwPkRldGVybWluZXMgaWYgdGhpcyBmaW5kZXIgcGF0dGVybiAiYWJvdXQgZXF1YWxzIiBhIGZpbmRlciBwYXR0ZXJuIGF0IHRoZSBzdGF0ZWQKCSAgICAgKiBwb3NpdGlvbiBhbmQgc2l6ZSAtLSBtZWFuaW5nLCBpdCBpcyBhdCBuZWFybHkgdGhlIHNhbWUgY2VudGVyIHdpdGggbmVhcmx5IHRoZSBzYW1lIHNpemUuPC9wPgoJICAgICAqLwoJICAgIEZpbmRlclBhdHRlcm4ucHJvdG90eXBlLmFib3V0RXF1YWxzID0gZnVuY3Rpb24gKG1vZHVsZVNpemUgLypmbG9hdCovLCBpIC8qZmxvYXQqLywgaiAvKmZsb2F0Ki8pIHsKCSAgICAgICAgaWYgKE1hdGguYWJzKGkgLSB0aGlzLmdldFkoKSkgPD0gbW9kdWxlU2l6ZSAmJiBNYXRoLmFicyhqIC0gdGhpcy5nZXRYKCkpIDw9IG1vZHVsZVNpemUpIHsKCSAgICAgICAgICAgIHZhciBtb2R1bGVTaXplRGlmZiA9IE1hdGguYWJzKG1vZHVsZVNpemUgLSB0aGlzLmVzdGltYXRlZE1vZHVsZVNpemUpOwoJICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVNpemVEaWZmIDw9IDEuMCB8fCBtb2R1bGVTaXplRGlmZiA8PSB0aGlzLmVzdGltYXRlZE1vZHVsZVNpemU7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQ29tYmluZXMgdGhpcyBvYmplY3QncyBjdXJyZW50IGVzdGltYXRlIG9mIGEgZmluZGVyIHBhdHRlcm4gcG9zaXRpb24gYW5kIG1vZHVsZSBzaXplCgkgICAgICogd2l0aCBhIG5ldyBlc3RpbWF0ZS4gSXQgcmV0dXJucyBhIG5ldyB7QGNvZGUgRmluZGVyUGF0dGVybn0gY29udGFpbmluZyBhIHdlaWdodGVkIGF2ZXJhZ2UKCSAgICAgKiBiYXNlZCBvbiBjb3VudC4KCSAgICAgKi8KCSAgICBGaW5kZXJQYXR0ZXJuLnByb3RvdHlwZS5jb21iaW5lRXN0aW1hdGUgPSBmdW5jdGlvbiAoaSAvKmZsb2F0Ki8sIGogLypmbG9hdCovLCBuZXdNb2R1bGVTaXplIC8qZmxvYXQqLykgewoJICAgICAgICB2YXIgY29tYmluZWRDb3VudCA9IHRoaXMuY291bnQgKyAxOwoJICAgICAgICB2YXIgY29tYmluZWRYID0gKHRoaXMuY291bnQgKiB0aGlzLmdldFgoKSArIGopIC8gY29tYmluZWRDb3VudDsKCSAgICAgICAgdmFyIGNvbWJpbmVkWSA9ICh0aGlzLmNvdW50ICogdGhpcy5nZXRZKCkgKyBpKSAvIGNvbWJpbmVkQ291bnQ7CgkgICAgICAgIHZhciBjb21iaW5lZE1vZHVsZVNpemUgPSAodGhpcy5jb3VudCAqIHRoaXMuZXN0aW1hdGVkTW9kdWxlU2l6ZSArIG5ld01vZHVsZVNpemUpIC8gY29tYmluZWRDb3VudDsKCSAgICAgICAgcmV0dXJuIG5ldyBGaW5kZXJQYXR0ZXJuKGNvbWJpbmVkWCwgY29tYmluZWRZLCBjb21iaW5lZE1vZHVsZVNpemUsIGNvbWJpbmVkQ291bnQpOwoJICAgIH07CgkgICAgcmV0dXJuIEZpbmRlclBhdHRlcm47Cgl9KFJlc3VsdFBvaW50XzEkMi5kZWZhdWx0KSk7CglGaW5kZXJQYXR0ZXJuJDEuZGVmYXVsdCA9IEZpbmRlclBhdHRlcm47CgoJdmFyIEZpbmRlclBhdHRlcm5JbmZvJDEgPSB7fTsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEZpbmRlclBhdHRlcm5JbmZvJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qKgoJICogPHA+RW5jYXBzdWxhdGVzIGluZm9ybWF0aW9uIGFib3V0IGZpbmRlciBwYXR0ZXJucyBpbiBhbiBpbWFnZSwgaW5jbHVkaW5nIHRoZSBsb2NhdGlvbiBvZgoJICogdGhlIHRocmVlIGZpbmRlciBwYXR0ZXJucywgYW5kIHRoZWlyIGVzdGltYXRlZCBtb2R1bGUgc2l6ZS48L3A+CgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIEZpbmRlclBhdHRlcm5JbmZvID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIGZ1bmN0aW9uIEZpbmRlclBhdHRlcm5JbmZvKHBhdHRlcm5DZW50ZXJzKSB7CgkgICAgICAgIHRoaXMuYm90dG9tTGVmdCA9IHBhdHRlcm5DZW50ZXJzWzBdOwoJICAgICAgICB0aGlzLnRvcExlZnQgPSBwYXR0ZXJuQ2VudGVyc1sxXTsKCSAgICAgICAgdGhpcy50b3BSaWdodCA9IHBhdHRlcm5DZW50ZXJzWzJdOwoJICAgIH0KCSAgICBGaW5kZXJQYXR0ZXJuSW5mby5wcm90b3R5cGUuZ2V0Qm90dG9tTGVmdCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuYm90dG9tTGVmdDsKCSAgICB9OwoJICAgIEZpbmRlclBhdHRlcm5JbmZvLnByb3RvdHlwZS5nZXRUb3BMZWZ0ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy50b3BMZWZ0OwoJICAgIH07CgkgICAgRmluZGVyUGF0dGVybkluZm8ucHJvdG90eXBlLmdldFRvcFJpZ2h0ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy50b3BSaWdodDsKCSAgICB9OwoJICAgIHJldHVybiBGaW5kZXJQYXR0ZXJuSW5mbzsKCX0oKSk7CglGaW5kZXJQYXR0ZXJuSW5mbyQxLmRlZmF1bHQgPSBGaW5kZXJQYXR0ZXJuSW5mbzsKCgkvKgoJICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycwoJICoKCSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoJICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgoJICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgkgKgoJICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCSAqCgkgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCgkgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAoJICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCgkgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCgkgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCSAqLwoJdmFyIF9fdmFsdWVzID0gKGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7CgkgICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7CgkgICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7CgkgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgcmV0dXJuIHsKCSAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDsKCSAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gIk9iamVjdCBpcyBub3QgaXRlcmFibGUuIiA6ICJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIik7Cgl9OwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEZpbmRlclBhdHRlcm5GaW5kZXIkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJLypuYW1lc3BhY2UgY29tLmdvb2dsZS56eGluZy5xcmNvZGUuZGV0ZWN0b3IgeyovCgl2YXIgRGVjb2RlSGludFR5cGVfMSQyID0gRGVjb2RlSGludFR5cGUkMTsKCXZhciBSZXN1bHRQb2ludF8xJDEgPSBSZXN1bHRQb2ludCQxOwoJdmFyIEZpbmRlclBhdHRlcm5fMSA9IEZpbmRlclBhdHRlcm4kMTsKCXZhciBGaW5kZXJQYXR0ZXJuSW5mb18xID0gRmluZGVyUGF0dGVybkluZm8kMTsKCXZhciBOb3RGb3VuZEV4Y2VwdGlvbl8xJDIgPSBOb3RGb3VuZEV4Y2VwdGlvbiQxOwoJLyppbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ki8KCS8qaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ki8KCS8qaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsqLwoJLyppbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ki8KCS8qaW1wb3J0IGphdmEudXRpbC5MaXN0OyovCgkvKmltcG9ydCBqYXZhLnV0aWwuTWFwOyovCgkvKioKCSAqIDxwPlRoaXMgY2xhc3MgYXR0ZW1wdHMgdG8gZmluZCBmaW5kZXIgcGF0dGVybnMgaW4gYSBRUiBDb2RlLiBGaW5kZXIgcGF0dGVybnMgYXJlIHRoZSBzcXVhcmUKCSAqIG1hcmtlcnMgYXQgdGhyZWUgY29ybmVycyBvZiBhIFFSIENvZGUuPC9wPgoJICoKCSAqIDxwPlRoaXMgY2xhc3MgaXMgdGhyZWFkLXNhZmUgYnV0IG5vdCByZWVudHJhbnQuIEVhY2ggdGhyZWFkIG11c3QgYWxsb2NhdGUgaXRzIG93biBvYmplY3QuCgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIEZpbmRlclBhdHRlcm5GaW5kZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CgkgICAgLyoqCgkgICAgICogPHA+Q3JlYXRlcyBhIGZpbmRlciB0aGF0IHdpbGwgc2VhcmNoIHRoZSBpbWFnZSBmb3IgdGhyZWUgZmluZGVyIHBhdHRlcm5zLjwvcD4KCSAgICAgKgoJICAgICAqIEBwYXJhbSBpbWFnZSBpbWFnZSB0byBzZWFyY2gKCSAgICAgKi8KCSAgICAvLyBwdWJsaWMgY29uc3RydWN0b3IoaW1hZ2U6IEJpdE1hdHJpeCkgewoJICAgIC8vICAgdGhpcyhpbWFnZSwgbnVsbCkKCSAgICAvLyB9CgkgICAgZnVuY3Rpb24gRmluZGVyUGF0dGVybkZpbmRlcihpbWFnZSwgcmVzdWx0UG9pbnRDYWxsYmFjaykgewoJICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7CgkgICAgICAgIHRoaXMucmVzdWx0UG9pbnRDYWxsYmFjayA9IHJlc3VsdFBvaW50Q2FsbGJhY2s7CgkgICAgICAgIHRoaXMucG9zc2libGVDZW50ZXJzID0gW107CgkgICAgICAgIHRoaXMuY3Jvc3NDaGVja1N0YXRlQ291bnQgPSBuZXcgSW50MzJBcnJheSg1KTsKCSAgICAgICAgdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrID0gcmVzdWx0UG9pbnRDYWxsYmFjazsKCSAgICB9CgkgICAgRmluZGVyUGF0dGVybkZpbmRlci5wcm90b3R5cGUuZ2V0SW1hZ2UgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmltYWdlOwoJICAgIH07CgkgICAgRmluZGVyUGF0dGVybkZpbmRlci5wcm90b3R5cGUuZ2V0UG9zc2libGVDZW50ZXJzID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5wb3NzaWJsZUNlbnRlcnM7CgkgICAgfTsKCSAgICBGaW5kZXJQYXR0ZXJuRmluZGVyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKGhpbnRzKSB7CgkgICAgICAgIHZhciB0cnlIYXJkZXIgPSAoaGludHMgIT09IG51bGwgJiYgaGludHMgIT09IHVuZGVmaW5lZCkgJiYgdW5kZWZpbmVkICE9PSBoaW50cy5nZXQoRGVjb2RlSGludFR5cGVfMSQyLmRlZmF1bHQuVFJZX0hBUkRFUik7CgkgICAgICAgIHZhciBwdXJlQmFyY29kZSA9IChoaW50cyAhPT0gbnVsbCAmJiBoaW50cyAhPT0gdW5kZWZpbmVkKSAmJiB1bmRlZmluZWQgIT09IGhpbnRzLmdldChEZWNvZGVIaW50VHlwZV8xJDIuZGVmYXVsdC5QVVJFX0JBUkNPREUpOwoJICAgICAgICB2YXIgaW1hZ2UgPSB0aGlzLmltYWdlOwoJICAgICAgICB2YXIgbWF4SSA9IGltYWdlLmdldEhlaWdodCgpOwoJICAgICAgICB2YXIgbWF4SiA9IGltYWdlLmdldFdpZHRoKCk7CgkgICAgICAgIC8vIFdlIGFyZSBsb29raW5nIGZvciBibGFjay93aGl0ZS9ibGFjay93aGl0ZS9ibGFjayBtb2R1bGVzIGluCgkgICAgICAgIC8vIDE6MTozOjE6MSByYXRpbzsgdGhpcyB0cmFja3MgdGhlIG51bWJlciBvZiBzdWNoIG1vZHVsZXMgc2VlbiBzbyBmYXIKCSAgICAgICAgLy8gTGV0J3MgYXNzdW1lIHRoYXQgdGhlIG1heGltdW0gdmVyc2lvbiBRUiBDb2RlIHdlIHN1cHBvcnQgdGFrZXMgdXAgMS80IHRoZSBoZWlnaHQgb2YgdGhlCgkgICAgICAgIC8vIGltYWdlLCBhbmQgdGhlbiBhY2NvdW50IGZvciB0aGUgY2VudGVyIGJlaW5nIDMgbW9kdWxlcyBpbiBzaXplLiBUaGlzIGdpdmVzIHRoZSBzbWFsbGVzdAoJICAgICAgICAvLyBudW1iZXIgb2YgcGl4ZWxzIHRoZSBjZW50ZXIgY291bGQgYmUsIHNvIHNraXAgdGhpcyBvZnRlbi4gV2hlbiB0cnlpbmcgaGFyZGVyLCBsb29rIGZvciBhbGwKCSAgICAgICAgLy8gUVIgdmVyc2lvbnMgcmVnYXJkbGVzcyBvZiBob3cgZGVuc2UgdGhleSBhcmUuCgkgICAgICAgIHZhciBpU2tpcCA9IE1hdGguZmxvb3IoKDMgKiBtYXhJKSAvICg0ICogRmluZGVyUGF0dGVybkZpbmRlci5NQVhfTU9EVUxFUykpOwoJICAgICAgICBpZiAoaVNraXAgPCBGaW5kZXJQYXR0ZXJuRmluZGVyLk1JTl9TS0lQIHx8IHRyeUhhcmRlcikgewoJICAgICAgICAgICAgaVNraXAgPSBGaW5kZXJQYXR0ZXJuRmluZGVyLk1JTl9TS0lQOwoJICAgICAgICB9CgkgICAgICAgIHZhciBkb25lID0gZmFsc2U7CgkgICAgICAgIHZhciBzdGF0ZUNvdW50ID0gbmV3IEludDMyQXJyYXkoNSk7CgkgICAgICAgIGZvciAodmFyIGkgPSBpU2tpcCAtIDE7IGkgPCBtYXhJICYmICFkb25lOyBpICs9IGlTa2lwKSB7CgkgICAgICAgICAgICAvLyBHZXQgYSByb3cgb2YgYmxhY2svd2hpdGUgdmFsdWVzCgkgICAgICAgICAgICBzdGF0ZUNvdW50WzBdID0gMDsKCSAgICAgICAgICAgIHN0YXRlQ291bnRbMV0gPSAwOwoJICAgICAgICAgICAgc3RhdGVDb3VudFsyXSA9IDA7CgkgICAgICAgICAgICBzdGF0ZUNvdW50WzNdID0gMDsKCSAgICAgICAgICAgIHN0YXRlQ291bnRbNF0gPSAwOwoJICAgICAgICAgICAgdmFyIGN1cnJlbnRTdGF0ZSA9IDA7CgkgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1heEo7IGorKykgewoJICAgICAgICAgICAgICAgIGlmIChpbWFnZS5nZXQoaiwgaSkpIHsKCSAgICAgICAgICAgICAgICAgICAgLy8gQmxhY2sgcGl4ZWwKCSAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50U3RhdGUgJiAxKSA9PT0gMSkgeyAvLyBDb3VudGluZyB3aGl0ZSBwaXhlbHMKCSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSsrOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbY3VycmVudFN0YXRlXSsrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBlbHNlIHsgLy8gV2hpdGUgcGl4ZWwKCSAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50U3RhdGUgJiAxKSA9PT0gMCkgeyAvLyBDb3VudGluZyBibGFjayBwaXhlbHMKCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT09IDQpIHsgLy8gQSB3aW5uZXI/CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZpbmRlclBhdHRlcm5GaW5kZXIuZm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkpIHsgLy8gWWVzCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maXJtZWQgPSB0aGlzLmhhbmRsZVBvc3NpYmxlQ2VudGVyKHN0YXRlQ291bnQsIGksIGosIHB1cmVCYXJjb2RlKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpcm1lZCA9PT0gdHJ1ZSkgewoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgZXhhbWluaW5nIGV2ZXJ5IG90aGVyIGxpbmUuIENoZWNraW5nIGVhY2ggbGluZSB0dXJuZWQgb3V0IHRvIGJlIHRvbwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZW5zaXZlIGFuZCBkaWRuJ3QgaW1wcm92ZSBwZXJmb3JtYW5jZS4KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTa2lwID0gMjsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1NraXBwZWQgPT09IHRydWUpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdGhpcy5oYXZlTXVsdGlwbHlDb25maXJtZWRDZW50ZXJzKCk7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93U2tpcCA9IHRoaXMuZmluZFJvd1NraXAoKTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93U2tpcCA+IHN0YXRlQ291bnRbMl0pIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCByb3dzIGJldHdlZW4gcm93IG9mIGxvd2VyIGNvbmZpcm1lZCBjZW50ZXIKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRvcCBvZiBwcmVzdW1lZCB0aGlyZCBjb25maXJtZWQgY2VudGVyCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBiYWNrIHVwIGEgYml0IHRvIGdldCBhIGZ1bGwgY2hhbmNlIG9mIGRldGVjdGluZwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCwgZW50aXJlIHdpZHRoIG9mIGNlbnRlciBvZiBmaW5kZXIgcGF0dGVybgoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGJ5IHJvd1NraXAsIGJ1dCBiYWNrIG9mZiBieSBzdGF0ZUNvdW50WzJdIChzaXplIG9mIGxhc3QgY2VudGVyCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHBhdHRlcm4gd2Ugc2F3KSB0byBiZSBjb25zZXJ2YXRpdmUsIGFuZCBhbHNvIGJhY2sgb2ZmIGJ5IGlTa2lwIHdoaWNoCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGFib3V0IHRvIGJlIHJlLWFkZGVkCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gcm93U2tpcCAtIHN0YXRlQ291bnRbMl0gLSBpU2tpcDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IG1heEogLSAxOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMF0gPSBzdGF0ZUNvdW50WzJdOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFsxXSA9IHN0YXRlQ291bnRbM107CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzJdID0gc3RhdGVDb3VudFs0XTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbM10gPSAxOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFs0XSA9IDA7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSAzOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgc3RhdGUgdG8gc3RhcnQgbG9va2luZyBhZ2FpbgoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSAwOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzBdID0gMDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFsxXSA9IDA7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMl0gPSAwOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzNdID0gMDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFs0XSA9IDA7CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBObywgc2hpZnQgY291bnRzIGJhY2sgYnkgdHdvCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMF0gPSBzdGF0ZUNvdW50WzJdOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzFdID0gc3RhdGVDb3VudFszXTsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFsyXSA9IHN0YXRlQ291bnRbNF07CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbM10gPSAxOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzRdID0gMDsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gMzsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WysrY3VycmVudFN0YXRlXSsrOwoJICAgICAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBDb3VudGluZyB3aGl0ZSBwaXhlbHMKCSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbY3VycmVudFN0YXRlXSsrOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgaWYgKEZpbmRlclBhdHRlcm5GaW5kZXIuZm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkpIHsKCSAgICAgICAgICAgICAgICB2YXIgY29uZmlybWVkID0gdGhpcy5oYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBtYXhKLCBwdXJlQmFyY29kZSk7CgkgICAgICAgICAgICAgICAgaWYgKGNvbmZpcm1lZCA9PT0gdHJ1ZSkgewoJICAgICAgICAgICAgICAgICAgICBpU2tpcCA9IHN0YXRlQ291bnRbMF07CgkgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1NraXBwZWQpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIGEgdGhpcmQgb25lCgkgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdGhpcy5oYXZlTXVsdGlwbHlDb25maXJtZWRDZW50ZXJzKCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgdmFyIHBhdHRlcm5JbmZvID0gdGhpcy5zZWxlY3RCZXN0UGF0dGVybnMoKTsKCSAgICAgICAgUmVzdWx0UG9pbnRfMSQxLmRlZmF1bHQub3JkZXJCZXN0UGF0dGVybnMocGF0dGVybkluZm8pOwoJICAgICAgICByZXR1cm4gbmV3IEZpbmRlclBhdHRlcm5JbmZvXzEuZGVmYXVsdChwYXR0ZXJuSW5mbyk7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBHaXZlbiBhIGNvdW50IG9mIGJsYWNrL3doaXRlL2JsYWNrL3doaXRlL2JsYWNrIHBpeGVscyBqdXN0IHNlZW4gYW5kIGFuIGVuZCBwb3NpdGlvbiwKCSAgICAgKiBmaWd1cmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoaXMgcnVuLgoJICAgICAqLwoJICAgIEZpbmRlclBhdHRlcm5GaW5kZXIuY2VudGVyRnJvbUVuZCA9IGZ1bmN0aW9uIChzdGF0ZUNvdW50LCBlbmQgLyppbnQqLykgewoJICAgICAgICByZXR1cm4gKGVuZCAtIHN0YXRlQ291bnRbNF0gLSBzdGF0ZUNvdW50WzNdKSAtIHN0YXRlQ291bnRbMl0gLyAyLjA7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcGFyYW0gc3RhdGVDb3VudCBjb3VudCBvZiBibGFjay93aGl0ZS9ibGFjay93aGl0ZS9ibGFjayBwaXhlbHMganVzdCByZWFkCgkgICAgICogQHJldHVybiB0cnVlIGlmZiB0aGUgcHJvcG9ydGlvbnMgb2YgdGhlIGNvdW50cyBpcyBjbG9zZSBlbm91Z2ggdG8gdGhlIDEvMS8zLzEvMSByYXRpb3MKCSAgICAgKiAgICAgICAgIHVzZWQgYnkgZmluZGVyIHBhdHRlcm5zIHRvIGJlIGNvbnNpZGVyZWQgYSBtYXRjaAoJICAgICAqLwoJICAgIEZpbmRlclBhdHRlcm5GaW5kZXIuZm91bmRQYXR0ZXJuQ3Jvc3MgPSBmdW5jdGlvbiAoc3RhdGVDb3VudCkgewoJICAgICAgICB2YXIgdG90YWxNb2R1bGVTaXplID0gMDsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKyspIHsKCSAgICAgICAgICAgIHZhciBjb3VudCA9IHN0YXRlQ291bnRbaV07CgkgICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICB0b3RhbE1vZHVsZVNpemUgKz0gY291bnQ7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHRvdGFsTW9kdWxlU2l6ZSA8IDcpIHsKCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgbW9kdWxlU2l6ZSA9IHRvdGFsTW9kdWxlU2l6ZSAvIDcuMDsKCSAgICAgICAgdmFyIG1heFZhcmlhbmNlID0gbW9kdWxlU2l6ZSAvIDIuMDsKCSAgICAgICAgLy8gQWxsb3cgbGVzcyB0aGFuIDUwJSB2YXJpYW5jZSBmcm9tIDEtMS0zLTEtMSBwcm9wb3J0aW9ucwoJICAgICAgICByZXR1cm4gTWF0aC5hYnMobW9kdWxlU2l6ZSAtIHN0YXRlQ291bnRbMF0pIDwgbWF4VmFyaWFuY2UgJiYKCSAgICAgICAgICAgIE1hdGguYWJzKG1vZHVsZVNpemUgLSBzdGF0ZUNvdW50WzFdKSA8IG1heFZhcmlhbmNlICYmCgkgICAgICAgICAgICBNYXRoLmFicygzLjAgKiBtb2R1bGVTaXplIC0gc3RhdGVDb3VudFsyXSkgPCAzICogbWF4VmFyaWFuY2UgJiYKCSAgICAgICAgICAgIE1hdGguYWJzKG1vZHVsZVNpemUgLSBzdGF0ZUNvdW50WzNdKSA8IG1heFZhcmlhbmNlICYmCgkgICAgICAgICAgICBNYXRoLmFicyhtb2R1bGVTaXplIC0gc3RhdGVDb3VudFs0XSkgPCBtYXhWYXJpYW5jZTsKCSAgICB9OwoJICAgIEZpbmRlclBhdHRlcm5GaW5kZXIucHJvdG90eXBlLmdldENyb3NzQ2hlY2tTdGF0ZUNvdW50ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgY3Jvc3NDaGVja1N0YXRlQ291bnQgPSB0aGlzLmNyb3NzQ2hlY2tTdGF0ZUNvdW50OwoJICAgICAgICBjcm9zc0NoZWNrU3RhdGVDb3VudFswXSA9IDA7CgkgICAgICAgIGNyb3NzQ2hlY2tTdGF0ZUNvdW50WzFdID0gMDsKCSAgICAgICAgY3Jvc3NDaGVja1N0YXRlQ291bnRbMl0gPSAwOwoJICAgICAgICBjcm9zc0NoZWNrU3RhdGVDb3VudFszXSA9IDA7CgkgICAgICAgIGNyb3NzQ2hlY2tTdGF0ZUNvdW50WzRdID0gMDsKCSAgICAgICAgcmV0dXJuIGNyb3NzQ2hlY2tTdGF0ZUNvdW50OwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQWZ0ZXIgYSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBzY2FuIGZpbmRzIGEgcG90ZW50aWFsIGZpbmRlciBwYXR0ZXJuLCB0aGlzIG1ldGhvZAoJICAgICAqICJjcm9zcy1jcm9zcy1jcm9zcy1jaGVja3MiIGJ5IHNjYW5uaW5nIGRvd24gZGlhZ29uYWxseSB0aHJvdWdoIHRoZSBjZW50ZXIgb2YgdGhlIHBvc3NpYmxlCgkgICAgICogZmluZGVyIHBhdHRlcm4gdG8gc2VlIGlmIHRoZSBzYW1lIHByb3BvcnRpb24gaXMgZGV0ZWN0ZWQuCgkgICAgICoKCSAgICAgKiBAcGFyYW0gc3RhcnRJIHJvdyB3aGVyZSBhIGZpbmRlciBwYXR0ZXJuIHdhcyBkZXRlY3RlZAoJICAgICAqIEBwYXJhbSBjZW50ZXJKIGNlbnRlciBvZiB0aGUgc2VjdGlvbiB0aGF0IGFwcGVhcnMgdG8gY3Jvc3MgYSBmaW5kZXIgcGF0dGVybgoJICAgICAqIEBwYXJhbSBtYXhDb3VudCBtYXhpbXVtIHJlYXNvbmFibGUgbnVtYmVyIG9mIG1vZHVsZXMgdGhhdCBzaG91bGQgYmUKCSAgICAgKiAgb2JzZXJ2ZWQgaW4gYW55IHJlYWRpbmcgc3RhdGUsIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIHRoZSBob3Jpem9udGFsIHNjYW4KCSAgICAgKiBAcGFyYW0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwgVGhlIG9yaWdpbmFsIHN0YXRlIGNvdW50IHRvdGFsLgoJICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwcm9wb3J0aW9ucyBhcmUgd2l0aGluZyBleHBlY3RlZCBsaW1pdHMKCSAgICAgKi8KCSAgICBGaW5kZXJQYXR0ZXJuRmluZGVyLnByb3RvdHlwZS5jcm9zc0NoZWNrRGlhZ29uYWwgPSBmdW5jdGlvbiAoc3RhcnRJIC8qaW50Ki8sIGNlbnRlckogLyppbnQqLywgbWF4Q291bnQgLyppbnQqLywgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwgLyppbnQqLykgewoJICAgICAgICB2YXIgc3RhdGVDb3VudCA9IHRoaXMuZ2V0Q3Jvc3NDaGVja1N0YXRlQ291bnQoKTsKCSAgICAgICAgLy8gU3RhcnQgY291bnRpbmcgdXAsIGxlZnQgZnJvbSBjZW50ZXIgZmluZGluZyBibGFjayBjZW50ZXIgbWFzcwoJICAgICAgICB2YXIgaSA9IDA7CgkgICAgICAgIHZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7CgkgICAgICAgIHdoaWxlIChzdGFydEkgPj0gaSAmJiBjZW50ZXJKID49IGkgJiYgaW1hZ2UuZ2V0KGNlbnRlckogLSBpLCBzdGFydEkgLSBpKSkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFsyXSsrOwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICB9CgkgICAgICAgIGlmIChzdGFydEkgPCBpIHx8IGNlbnRlckogPCBpKSB7CgkgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgIH0KCSAgICAgICAgLy8gQ29udGludWUgdXAsIGxlZnQgZmluZGluZyB3aGl0ZSBzcGFjZQoJICAgICAgICB3aGlsZSAoc3RhcnRJID49IGkgJiYgY2VudGVySiA+PSBpICYmICFpbWFnZS5nZXQoY2VudGVySiAtIGksIHN0YXJ0SSAtIGkpICYmCgkgICAgICAgICAgICBzdGF0ZUNvdW50WzFdIDw9IG1heENvdW50KSB7CgkgICAgICAgICAgICBzdGF0ZUNvdW50WzFdKys7CgkgICAgICAgICAgICBpKys7CgkgICAgICAgIH0KCSAgICAgICAgLy8gSWYgYWxyZWFkeSB0b28gbWFueSBtb2R1bGVzIGluIHRoaXMgc3RhdGUgb3IgcmFuIG9mZiB0aGUgZWRnZToKCSAgICAgICAgaWYgKHN0YXJ0SSA8IGkgfHwgY2VudGVySiA8IGkgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KSB7CgkgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgIH0KCSAgICAgICAgLy8gQ29udGludWUgdXAsIGxlZnQgZmluZGluZyBibGFjayBib3JkZXIKCSAgICAgICAgd2hpbGUgKHN0YXJ0SSA+PSBpICYmIGNlbnRlckogPj0gaSAmJiBpbWFnZS5nZXQoY2VudGVySiAtIGksIHN0YXJ0SSAtIGkpICYmCgkgICAgICAgICAgICBzdGF0ZUNvdW50WzBdIDw9IG1heENvdW50KSB7CgkgICAgICAgICAgICBzdGF0ZUNvdW50WzBdKys7CgkgICAgICAgICAgICBpKys7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHN0YXRlQ291bnRbMF0gPiBtYXhDb3VudCkgewoJICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICAgIHZhciBtYXhJID0gaW1hZ2UuZ2V0SGVpZ2h0KCk7CgkgICAgICAgIHZhciBtYXhKID0gaW1hZ2UuZ2V0V2lkdGgoKTsKCSAgICAgICAgLy8gTm93IGFsc28gY291bnQgZG93biwgcmlnaHQgZnJvbSBjZW50ZXIKCSAgICAgICAgaSA9IDE7CgkgICAgICAgIHdoaWxlIChzdGFydEkgKyBpIDwgbWF4SSAmJiBjZW50ZXJKICsgaSA8IG1heEogJiYgaW1hZ2UuZ2V0KGNlbnRlckogKyBpLCBzdGFydEkgKyBpKSkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFsyXSsrOwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICB9CgkgICAgICAgIC8vIFJhbiBvZmYgdGhlIGVkZ2U/CgkgICAgICAgIGlmIChzdGFydEkgKyBpID49IG1heEkgfHwgY2VudGVySiArIGkgPj0gbWF4SikgewoJICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICAgIHdoaWxlIChzdGFydEkgKyBpIDwgbWF4SSAmJiBjZW50ZXJKICsgaSA8IG1heEogJiYgIWltYWdlLmdldChjZW50ZXJKICsgaSwgc3RhcnRJICsgaSkgJiYKCSAgICAgICAgICAgIHN0YXRlQ291bnRbM10gPCBtYXhDb3VudCkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFszXSsrOwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICB9CgkgICAgICAgIGlmIChzdGFydEkgKyBpID49IG1heEkgfHwgY2VudGVySiArIGkgPj0gbWF4SiB8fCBzdGF0ZUNvdW50WzNdID49IG1heENvdW50KSB7CgkgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgIH0KCSAgICAgICAgd2hpbGUgKHN0YXJ0SSArIGkgPCBtYXhJICYmIGNlbnRlckogKyBpIDwgbWF4SiAmJiBpbWFnZS5nZXQoY2VudGVySiArIGksIHN0YXJ0SSArIGkpICYmCgkgICAgICAgICAgICBzdGF0ZUNvdW50WzRdIDwgbWF4Q291bnQpIHsKCSAgICAgICAgICAgIHN0YXRlQ291bnRbNF0rKzsKCSAgICAgICAgICAgIGkrKzsKCSAgICAgICAgfQoJICAgICAgICBpZiAoc3RhdGVDb3VudFs0XSA+PSBtYXhDb3VudCkgewoJICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgZmluZGVyLXBhdHRlcm4tbGlrZSBzZWN0aW9uLCBidXQgaXRzIHNpemUgaXMgbW9yZSB0aGFuIDEwMCUgZGlmZmVyZW50IHRoYW4KCSAgICAgICAgLy8gdGhlIG9yaWdpbmFsLCBhc3N1bWUgaXQncyBhIGZhbHNlIHBvc2l0aXZlCgkgICAgICAgIHZhciBzdGF0ZUNvdW50VG90YWwgPSBzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl0gKyBzdGF0ZUNvdW50WzNdICsgc3RhdGVDb3VudFs0XTsKCSAgICAgICAgcmV0dXJuIE1hdGguYWJzKHN0YXRlQ291bnRUb3RhbCAtIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSA8IDIgKiBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCAmJgoJICAgICAgICAgICAgRmluZGVyUGF0dGVybkZpbmRlci5mb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIDxwPkFmdGVyIGEgaG9yaXpvbnRhbCBzY2FuIGZpbmRzIGEgcG90ZW50aWFsIGZpbmRlciBwYXR0ZXJuLCB0aGlzIG1ldGhvZAoJICAgICAqICJjcm9zcy1jaGVja3MiIGJ5IHNjYW5uaW5nIGRvd24gdmVydGljYWxseSB0aHJvdWdoIHRoZSBjZW50ZXIgb2YgdGhlIHBvc3NpYmxlCgkgICAgICogZmluZGVyIHBhdHRlcm4gdG8gc2VlIGlmIHRoZSBzYW1lIHByb3BvcnRpb24gaXMgZGV0ZWN0ZWQuPC9wPgoJICAgICAqCgkgICAgICogQHBhcmFtIHN0YXJ0SSByb3cgd2hlcmUgYSBmaW5kZXIgcGF0dGVybiB3YXMgZGV0ZWN0ZWQKCSAgICAgKiBAcGFyYW0gY2VudGVySiBjZW50ZXIgb2YgdGhlIHNlY3Rpb24gdGhhdCBhcHBlYXJzIHRvIGNyb3NzIGEgZmluZGVyIHBhdHRlcm4KCSAgICAgKiBAcGFyYW0gbWF4Q291bnQgbWF4aW11bSByZWFzb25hYmxlIG51bWJlciBvZiBtb2R1bGVzIHRoYXQgc2hvdWxkIGJlCgkgICAgICogb2JzZXJ2ZWQgaW4gYW55IHJlYWRpbmcgc3RhdGUsIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIHRoZSBob3Jpem9udGFsIHNjYW4KCSAgICAgKiBAcmV0dXJuIHZlcnRpY2FsIGNlbnRlciBvZiBmaW5kZXIgcGF0dGVybiwgb3Ige0BsaW5rIEZsb2F0I05hTn0gaWYgbm90IGZvdW5kCgkgICAgICovCgkgICAgRmluZGVyUGF0dGVybkZpbmRlci5wcm90b3R5cGUuY3Jvc3NDaGVja1ZlcnRpY2FsID0gZnVuY3Rpb24gKHN0YXJ0SSAvKmludCovLCBjZW50ZXJKIC8qaW50Ki8sIG1heENvdW50IC8qaW50Ki8sIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsIC8qaW50Ki8pIHsKCSAgICAgICAgdmFyIGltYWdlID0gdGhpcy5pbWFnZTsKCSAgICAgICAgdmFyIG1heEkgPSBpbWFnZS5nZXRIZWlnaHQoKTsKCSAgICAgICAgdmFyIHN0YXRlQ291bnQgPSB0aGlzLmdldENyb3NzQ2hlY2tTdGF0ZUNvdW50KCk7CgkgICAgICAgIC8vIFN0YXJ0IGNvdW50aW5nIHVwIGZyb20gY2VudGVyCgkgICAgICAgIHZhciBpID0gc3RhcnRJOwoJICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGltYWdlLmdldChjZW50ZXJKLCBpKSkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFsyXSsrOwoJICAgICAgICAgICAgaS0tOwoJICAgICAgICB9CgkgICAgICAgIGlmIChpIDwgMCkgewoJICAgICAgICAgICAgcmV0dXJuIE5hTjsKCSAgICAgICAgfQoJICAgICAgICB3aGlsZSAoaSA+PSAwICYmICFpbWFnZS5nZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFsxXSsrOwoJICAgICAgICAgICAgaS0tOwoJICAgICAgICB9CgkgICAgICAgIC8vIElmIGFscmVhZHkgdG9vIG1hbnkgbW9kdWxlcyBpbiB0aGlzIHN0YXRlIG9yIHJhbiBvZmYgdGhlIGVkZ2U6CgkgICAgICAgIGlmIChpIDwgMCB8fCBzdGF0ZUNvdW50WzFdID4gbWF4Q291bnQpIHsKCSAgICAgICAgICAgIHJldHVybiBOYU47CgkgICAgICAgIH0KCSAgICAgICAgd2hpbGUgKGkgPj0gMCAmJiBpbWFnZS5nZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFswXSA8PSBtYXhDb3VudCkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFswXSsrOwoJICAgICAgICAgICAgaS0tOwoJICAgICAgICB9CgkgICAgICAgIGlmIChzdGF0ZUNvdW50WzBdID4gbWF4Q291bnQpIHsKCSAgICAgICAgICAgIHJldHVybiBOYU47CgkgICAgICAgIH0KCSAgICAgICAgLy8gTm93IGFsc28gY291bnQgZG93biBmcm9tIGNlbnRlcgoJICAgICAgICBpID0gc3RhcnRJICsgMTsKCSAgICAgICAgd2hpbGUgKGkgPCBtYXhJICYmIGltYWdlLmdldChjZW50ZXJKLCBpKSkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFsyXSsrOwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICB9CgkgICAgICAgIGlmIChpID09PSBtYXhJKSB7CgkgICAgICAgICAgICByZXR1cm4gTmFOOwoJICAgICAgICB9CgkgICAgICAgIHdoaWxlIChpIDwgbWF4SSAmJiAhaW1hZ2UuZ2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbM10gPCBtYXhDb3VudCkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFszXSsrOwoJICAgICAgICAgICAgaSsrOwoJICAgICAgICB9CgkgICAgICAgIGlmIChpID09PSBtYXhJIHx8IHN0YXRlQ291bnRbM10gPj0gbWF4Q291bnQpIHsKCSAgICAgICAgICAgIHJldHVybiBOYU47CgkgICAgICAgIH0KCSAgICAgICAgd2hpbGUgKGkgPCBtYXhJICYmIGltYWdlLmdldChjZW50ZXJKLCBpKSAmJiBzdGF0ZUNvdW50WzRdIDwgbWF4Q291bnQpIHsKCSAgICAgICAgICAgIHN0YXRlQ291bnRbNF0rKzsKCSAgICAgICAgICAgIGkrKzsKCSAgICAgICAgfQoJICAgICAgICBpZiAoc3RhdGVDb3VudFs0XSA+PSBtYXhDb3VudCkgewoJICAgICAgICAgICAgcmV0dXJuIE5hTjsKCSAgICAgICAgfQoJICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIGZpbmRlci1wYXR0ZXJuLWxpa2Ugc2VjdGlvbiwgYnV0IGl0cyBzaXplIGlzIG1vcmUgdGhhbiA0MCUgZGlmZmVyZW50IHRoYW4KCSAgICAgICAgLy8gdGhlIG9yaWdpbmFsLCBhc3N1bWUgaXQncyBhIGZhbHNlIHBvc2l0aXZlCgkgICAgICAgIHZhciBzdGF0ZUNvdW50VG90YWwgPSBzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl0gKyBzdGF0ZUNvdW50WzNdICsKCSAgICAgICAgICAgIHN0YXRlQ291bnRbNF07CgkgICAgICAgIGlmICg1ICogTWF0aC5hYnMoc3RhdGVDb3VudFRvdGFsIC0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpID49IDIgKiBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgewoJICAgICAgICAgICAgcmV0dXJuIE5hTjsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gRmluZGVyUGF0dGVybkZpbmRlci5mb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSA/IEZpbmRlclBhdHRlcm5GaW5kZXIuY2VudGVyRnJvbUVuZChzdGF0ZUNvdW50LCBpKSA6IE5hTjsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIDxwPkxpa2Uge0BsaW5rICNjcm9zc0NoZWNrVmVydGljYWwoaW50LCBpbnQsIGludCwgaW50KX0sIGFuZCBpbiBmYWN0IGlzIGJhc2ljYWxseSBpZGVudGljYWwsCgkgICAgICogZXhjZXB0IGl0IHJlYWRzIGhvcml6b250YWxseSBpbnN0ZWFkIG9mIHZlcnRpY2FsbHkuIFRoaXMgaXMgdXNlZCB0byBjcm9zcy1jcm9zcwoJICAgICAqIGNoZWNrIGEgdmVydGljYWwgY3Jvc3MgY2hlY2sgYW5kIGxvY2F0ZSB0aGUgcmVhbCBjZW50ZXIgb2YgdGhlIGFsaWdubWVudCBwYXR0ZXJuLjwvcD4KCSAgICAgKi8KCSAgICBGaW5kZXJQYXR0ZXJuRmluZGVyLnByb3RvdHlwZS5jcm9zc0NoZWNrSG9yaXpvbnRhbCA9IGZ1bmN0aW9uIChzdGFydEogLyppbnQqLywgY2VudGVySSAvKmludCovLCBtYXhDb3VudCAvKmludCovLCBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCAvKmludCovKSB7CgkgICAgICAgIHZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7CgkgICAgICAgIHZhciBtYXhKID0gaW1hZ2UuZ2V0V2lkdGgoKTsKCSAgICAgICAgdmFyIHN0YXRlQ291bnQgPSB0aGlzLmdldENyb3NzQ2hlY2tTdGF0ZUNvdW50KCk7CgkgICAgICAgIHZhciBqID0gc3RhcnRKOwoJICAgICAgICB3aGlsZSAoaiA+PSAwICYmIGltYWdlLmdldChqLCBjZW50ZXJJKSkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFsyXSsrOwoJICAgICAgICAgICAgai0tOwoJICAgICAgICB9CgkgICAgICAgIGlmIChqIDwgMCkgewoJICAgICAgICAgICAgcmV0dXJuIE5hTjsKCSAgICAgICAgfQoJICAgICAgICB3aGlsZSAoaiA+PSAwICYmICFpbWFnZS5nZXQoaiwgY2VudGVySSkgJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFsxXSsrOwoJICAgICAgICAgICAgai0tOwoJICAgICAgICB9CgkgICAgICAgIGlmIChqIDwgMCB8fCBzdGF0ZUNvdW50WzFdID4gbWF4Q291bnQpIHsKCSAgICAgICAgICAgIHJldHVybiBOYU47CgkgICAgICAgIH0KCSAgICAgICAgd2hpbGUgKGogPj0gMCAmJiBpbWFnZS5nZXQoaiwgY2VudGVySSkgJiYgc3RhdGVDb3VudFswXSA8PSBtYXhDb3VudCkgewoJICAgICAgICAgICAgc3RhdGVDb3VudFswXSsrOwoJICAgICAgICAgICAgai0tOwoJICAgICAgICB9CgkgICAgICAgIGlmIChzdGF0ZUNvdW50WzBdID4gbWF4Q291bnQpIHsKCSAgICAgICAgICAgIHJldHVybiBOYU47CgkgICAgICAgIH0KCSAgICAgICAgaiA9IHN0YXJ0SiArIDE7CgkgICAgICAgIHdoaWxlIChqIDwgbWF4SiAmJiBpbWFnZS5nZXQoaiwgY2VudGVySSkpIHsKCSAgICAgICAgICAgIHN0YXRlQ291bnRbMl0rKzsKCSAgICAgICAgICAgIGorKzsKCSAgICAgICAgfQoJICAgICAgICBpZiAoaiA9PT0gbWF4SikgewoJICAgICAgICAgICAgcmV0dXJuIE5hTjsKCSAgICAgICAgfQoJICAgICAgICB3aGlsZSAoaiA8IG1heEogJiYgIWltYWdlLmdldChqLCBjZW50ZXJJKSAmJiBzdGF0ZUNvdW50WzNdIDwgbWF4Q291bnQpIHsKCSAgICAgICAgICAgIHN0YXRlQ291bnRbM10rKzsKCSAgICAgICAgICAgIGorKzsKCSAgICAgICAgfQoJICAgICAgICBpZiAoaiA9PT0gbWF4SiB8fCBzdGF0ZUNvdW50WzNdID49IG1heENvdW50KSB7CgkgICAgICAgICAgICByZXR1cm4gTmFOOwoJICAgICAgICB9CgkgICAgICAgIHdoaWxlIChqIDwgbWF4SiAmJiBpbWFnZS5nZXQoaiwgY2VudGVySSkgJiYgc3RhdGVDb3VudFs0XSA8IG1heENvdW50KSB7CgkgICAgICAgICAgICBzdGF0ZUNvdW50WzRdKys7CgkgICAgICAgICAgICBqKys7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHN0YXRlQ291bnRbNF0gPj0gbWF4Q291bnQpIHsKCSAgICAgICAgICAgIHJldHVybiBOYU47CgkgICAgICAgIH0KCSAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBmaW5kZXItcGF0dGVybi1saWtlIHNlY3Rpb24sIGJ1dCBpdHMgc2l6ZSBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCB0aGFuCgkgICAgICAgIC8vIHRoZSBvcmlnaW5hbCwgYXNzdW1lIGl0J3MgYSBmYWxzZSBwb3NpdGl2ZQoJICAgICAgICB2YXIgc3RhdGVDb3VudFRvdGFsID0gc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdICsgc3RhdGVDb3VudFszXSArCgkgICAgICAgICAgICBzdGF0ZUNvdW50WzRdOwoJICAgICAgICBpZiAoNSAqIE1hdGguYWJzKHN0YXRlQ291bnRUb3RhbCAtIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSA+PSBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgewoJICAgICAgICAgICAgcmV0dXJuIE5hTjsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gRmluZGVyUGF0dGVybkZpbmRlci5mb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSA/IEZpbmRlclBhdHRlcm5GaW5kZXIuY2VudGVyRnJvbUVuZChzdGF0ZUNvdW50LCBqKSA6IE5hTjsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIDxwPlRoaXMgaXMgY2FsbGVkIHdoZW4gYSBob3Jpem9udGFsIHNjYW4gZmluZHMgYSBwb3NzaWJsZSBhbGlnbm1lbnQgcGF0dGVybi4gSXQgd2lsbAoJICAgICAqIGNyb3NzIGNoZWNrIHdpdGggYSB2ZXJ0aWNhbCBzY2FuLCBhbmQgaWYgc3VjY2Vzc2Z1bCwgd2lsbCwgYWgsIGNyb3NzLWNyb3NzLWNoZWNrCgkgICAgICogd2l0aCBhbm90aGVyIGhvcml6b250YWwgc2Nhbi4gVGhpcyBpcyBuZWVkZWQgcHJpbWFyaWx5IHRvIGxvY2F0ZSB0aGUgcmVhbCBob3Jpem9udGFsCgkgICAgICogY2VudGVyIG9mIHRoZSBwYXR0ZXJuIGluIGNhc2VzIG9mIGV4dHJlbWUgc2tldy4KCSAgICAgKiBBbmQgdGhlbiB3ZSBjcm9zcy1jcm9zcy1jcm9zcyBjaGVjayB3aXRoIGFub3RoZXIgZGlhZ29uYWwgc2Nhbi48L3A+CgkgICAgICoKCSAgICAgKiA8cD5JZiB0aGF0IHN1Y2NlZWRzIHRoZSBmaW5kZXIgcGF0dGVybiBsb2NhdGlvbiBpcyBhZGRlZCB0byBhIGxpc3QgdGhhdCB0cmFja3MKCSAgICAgKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbG9jYXRpb24gaGFzIGJlZW4gbmVhcmx5LW1hdGNoZWQgYXMgYSBmaW5kZXIgcGF0dGVybi4KCSAgICAgKiBFYWNoIGFkZGl0aW9uYWwgZmluZCBpcyBtb3JlIGV2aWRlbmNlIHRoYXQgdGhlIGxvY2F0aW9uIGlzIGluIGZhY3QgYSBmaW5kZXIKCSAgICAgKiBwYXR0ZXJuIGNlbnRlcgoJICAgICAqCgkgICAgICogQHBhcmFtIHN0YXRlQ291bnQgcmVhZGluZyBzdGF0ZSBtb2R1bGUgY291bnRzIGZyb20gaG9yaXpvbnRhbCBzY2FuCgkgICAgICogQHBhcmFtIGkgcm93IHdoZXJlIGZpbmRlciBwYXR0ZXJuIG1heSBiZSBmb3VuZAoJICAgICAqIEBwYXJhbSBqIGVuZCBvZiBwb3NzaWJsZSBmaW5kZXIgcGF0dGVybiBpbiByb3cKCSAgICAgKiBAcGFyYW0gcHVyZUJhcmNvZGUgdHJ1ZSBpZiBpbiAicHVyZSBiYXJjb2RlIiBtb2RlCgkgICAgICogQHJldHVybiB0cnVlIGlmIGEgZmluZGVyIHBhdHRlcm4gY2FuZGlkYXRlIHdhcyBmb3VuZCB0aGlzIHRpbWUKCSAgICAgKi8KCSAgICBGaW5kZXJQYXR0ZXJuRmluZGVyLnByb3RvdHlwZS5oYW5kbGVQb3NzaWJsZUNlbnRlciA9IGZ1bmN0aW9uIChzdGF0ZUNvdW50LCBpIC8qaW50Ki8sIGogLyppbnQqLywgcHVyZUJhcmNvZGUpIHsKCSAgICAgICAgdmFyIHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXSArIHN0YXRlQ291bnRbM10gKwoJICAgICAgICAgICAgc3RhdGVDb3VudFs0XTsKCSAgICAgICAgdmFyIGNlbnRlckogPSBGaW5kZXJQYXR0ZXJuRmluZGVyLmNlbnRlckZyb21FbmQoc3RhdGVDb3VudCwgaik7CgkgICAgICAgIHZhciBjZW50ZXJJID0gdGhpcy5jcm9zc0NoZWNrVmVydGljYWwoaSwgLyooaW50KSAqLyBNYXRoLmZsb29yKGNlbnRlckopLCBzdGF0ZUNvdW50WzJdLCBzdGF0ZUNvdW50VG90YWwpOwoJICAgICAgICBpZiAoIWlzTmFOKGNlbnRlckkpKSB7CgkgICAgICAgICAgICAvLyBSZS1jcm9zcyBjaGVjawoJICAgICAgICAgICAgY2VudGVySiA9IHRoaXMuY3Jvc3NDaGVja0hvcml6b250YWwoLyooaW50KSAqLyBNYXRoLmZsb29yKGNlbnRlckopLCAvKihpbnQpICovIE1hdGguZmxvb3IoY2VudGVySSksIHN0YXRlQ291bnRbMl0sIHN0YXRlQ291bnRUb3RhbCk7CgkgICAgICAgICAgICBpZiAoIWlzTmFOKGNlbnRlckopICYmCgkgICAgICAgICAgICAgICAgKCFwdXJlQmFyY29kZSB8fCB0aGlzLmNyb3NzQ2hlY2tEaWFnb25hbCgvKihpbnQpICovIE1hdGguZmxvb3IoY2VudGVySSksIC8qKGludCkgKi8gTWF0aC5mbG9vcihjZW50ZXJKKSwgc3RhdGVDb3VudFsyXSwgc3RhdGVDb3VudFRvdGFsKSkpIHsKCSAgICAgICAgICAgICAgICB2YXIgZXN0aW1hdGVkTW9kdWxlU2l6ZSA9IHN0YXRlQ291bnRUb3RhbCAvIDcuMDsKCSAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTsKCSAgICAgICAgICAgICAgICB2YXIgcG9zc2libGVDZW50ZXJzID0gdGhpcy5wb3NzaWJsZUNlbnRlcnM7CgkgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwLCBsZW5ndGhfMSA9IHBvc3NpYmxlQ2VudGVycy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoXzE7IGluZGV4KyspIHsKCSAgICAgICAgICAgICAgICAgICAgdmFyIGNlbnRlciA9IHBvc3NpYmxlQ2VudGVyc1tpbmRleF07CgkgICAgICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIGFib3V0IHRoZSBzYW1lIGNlbnRlciBhbmQgbW9kdWxlIHNpemU6CgkgICAgICAgICAgICAgICAgICAgIGlmIChjZW50ZXIuYWJvdXRFcXVhbHMoZXN0aW1hdGVkTW9kdWxlU2l6ZSwgY2VudGVySSwgY2VudGVySikpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQ2VudGVyc1tpbmRleF0gPSBjZW50ZXIuY29tYmluZUVzdGltYXRlKGNlbnRlckksIGNlbnRlckosIGVzdGltYXRlZE1vZHVsZVNpemUpOwoJICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwoJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgcG9pbnQgPSBuZXcgRmluZGVyUGF0dGVybl8xLmRlZmF1bHQoY2VudGVySiwgY2VudGVySSwgZXN0aW1hdGVkTW9kdWxlU2l6ZSk7CgkgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQ2VudGVycy5wdXNoKHBvaW50KTsKCSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzdWx0UG9pbnRDYWxsYmFjayAhPT0gbnVsbCAmJiB0aGlzLnJlc3VsdFBvaW50Q2FsbGJhY2sgIT09IHVuZGVmaW5lZCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrLmZvdW5kUG9zc2libGVSZXN1bHRQb2ludChwb2ludCk7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogQHJldHVybiBudW1iZXIgb2Ygcm93cyB3ZSBjb3VsZCBzYWZlbHkgc2tpcCBkdXJpbmcgc2Nhbm5pbmcsIGJhc2VkIG9uIHRoZSBmaXJzdAoJICAgICAqICAgICAgICAgdHdvIGZpbmRlciBwYXR0ZXJucyB0aGF0IGhhdmUgYmVlbiBsb2NhdGVkLiBJbiBzb21lIGNhc2VzIHRoZWlyIHBvc2l0aW9uIHdpbGwKCSAgICAgKiAgICAgICAgIGFsbG93IHVzIHRvIGluZmVyIHRoYXQgdGhlIHRoaXJkIHBhdHRlcm4gbXVzdCBsaWUgYmVsb3cgYSBjZXJ0YWluIHBvaW50IGZhcnRoZXIKCSAgICAgKiAgICAgICAgIGRvd24gaW4gdGhlIGltYWdlLgoJICAgICAqLwoJICAgIEZpbmRlclBhdHRlcm5GaW5kZXIucHJvdG90eXBlLmZpbmRSb3dTa2lwID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgZV8xLCBfYTsKCSAgICAgICAgdmFyIG1heCA9IHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aDsKCSAgICAgICAgaWYgKG1heCA8PSAxKSB7CgkgICAgICAgICAgICByZXR1cm4gMDsKCSAgICAgICAgfQoJICAgICAgICB2YXIgZmlyc3RDb25maXJtZWRDZW50ZXIgPSBudWxsOwoJICAgICAgICB0cnkgewoJICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyh0aGlzLnBvc3NpYmxlQ2VudGVycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHsKCSAgICAgICAgICAgICAgICB2YXIgY2VudGVyID0gX2MudmFsdWU7CgkgICAgICAgICAgICAgICAgaWYgKGNlbnRlci5nZXRDb3VudCgpID49IEZpbmRlclBhdHRlcm5GaW5kZXIuQ0VOVEVSX1FVT1JVTSkgewoJICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb25maXJtZWRDZW50ZXIgPT0gbnVsbCkgewoJICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb25maXJtZWRDZW50ZXIgPSBjZW50ZXI7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHR3byBjb25maXJtZWQgY2VudGVycwoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93IGZhciBkb3duIGNhbiB3ZSBza2lwIGJlZm9yZSByZXN1bWluZyBsb29raW5nIGZvciB0aGUgbmV4dAoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0dGVybj8gSW4gdGhlIHdvcnN0IGNhc2UsIG9ubHkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKCSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVuY2UgaW4gdGhlIHggLyB5IGNvb3JkaW5hdGVzIG9mIHRoZSB0d28gY2VudGVycy4KCSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgeW91IGZpbmQgdG9wIGxlZnQgbGFzdC4KCSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzU2tpcHBlZCA9IHRydWU7CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLyooaW50KSAqLyBNYXRoLmZsb29yKChNYXRoLmFicyhmaXJzdENvbmZpcm1lZENlbnRlci5nZXRYKCkgLSBjZW50ZXIuZ2V0WCgpKSAtCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoZmlyc3RDb25maXJtZWRDZW50ZXIuZ2V0WSgpIC0gY2VudGVyLmdldFkoKSkpIC8gMik7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH0KCSAgICAgICAgZmluYWxseSB7CgkgICAgICAgICAgICB0cnkgewoJICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gMDsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgd2UgaGF2ZSBmb3VuZCBhdCBsZWFzdCAzIGZpbmRlciBwYXR0ZXJucyB0aGF0IGhhdmUgYmVlbiBkZXRlY3RlZAoJICAgICAqICAgICAgICAgYXQgbGVhc3Qge0BsaW5rICNDRU5URVJfUVVPUlVNfSB0aW1lcyBlYWNoLCBhbmQsIHRoZSBlc3RpbWF0ZWQgbW9kdWxlIHNpemUgb2YgdGhlCgkgICAgICogICAgICAgICBjYW5kaWRhdGVzIGlzICJwcmV0dHkgc2ltaWxhciIKCSAgICAgKi8KCSAgICBGaW5kZXJQYXR0ZXJuRmluZGVyLnByb3RvdHlwZS5oYXZlTXVsdGlwbHlDb25maXJtZWRDZW50ZXJzID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgZV8yLCBfYSwgZV8zLCBfYjsKCSAgICAgICAgdmFyIGNvbmZpcm1lZENvdW50ID0gMDsKCSAgICAgICAgdmFyIHRvdGFsTW9kdWxlU2l6ZSA9IDAuMDsKCSAgICAgICAgdmFyIG1heCA9IHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aDsKCSAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgIGZvciAodmFyIF9jID0gX192YWx1ZXModGhpcy5wb3NzaWJsZUNlbnRlcnMpLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSBfZC52YWx1ZTsKCSAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5nZXRDb3VudCgpID49IEZpbmRlclBhdHRlcm5GaW5kZXIuQ0VOVEVSX1FVT1JVTSkgewoJICAgICAgICAgICAgICAgICAgICBjb25maXJtZWRDb3VudCsrOwoJICAgICAgICAgICAgICAgICAgICB0b3RhbE1vZHVsZVNpemUgKz0gcGF0dGVybi5nZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9CgkgICAgICAgIGZpbmFsbHkgewoJICAgICAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgICAgICBpZiAoX2QgJiYgIV9kLmRvbmUgJiYgKF9hID0gX2MucmV0dXJuKSkgX2EuY2FsbChfYyk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9CgkgICAgICAgIH0KCSAgICAgICAgaWYgKGNvbmZpcm1lZENvdW50IDwgMykgewoJICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICAgIC8vIE9LLCB3ZSBoYXZlIGF0IGxlYXN0IDMgY29uZmlybWVkIGNlbnRlcnMsIGJ1dCwgaXQncyBwb3NzaWJsZSB0aGF0IG9uZSBpcyBhICJmYWxzZSBwb3NpdGl2ZSIKCSAgICAgICAgLy8gYW5kIHRoYXQgd2UgbmVlZCB0byBrZWVwIGxvb2tpbmcuIFdlIGRldGVjdCB0aGlzIGJ5IGFza2luZyBpZiB0aGUgZXN0aW1hdGVkIG1vZHVsZSBzaXplcwoJICAgICAgICAvLyB2YXJ5IHRvbyBtdWNoLiBXZSBhcmJpdHJhcmlseSBzYXkgdGhhdCB3aGVuIHRoZSB0b3RhbCBkZXZpYXRpb24gZnJvbSBhdmVyYWdlIGV4Y2VlZHMKCSAgICAgICAgLy8gNSUgb2YgdGhlIHRvdGFsIG1vZHVsZSBzaXplIGVzdGltYXRlcywgaXQncyB0b28gbXVjaC4KCSAgICAgICAgdmFyIGF2ZXJhZ2UgPSB0b3RhbE1vZHVsZVNpemUgLyBtYXg7CgkgICAgICAgIHZhciB0b3RhbERldmlhdGlvbiA9IDAuMDsKCSAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgIGZvciAodmFyIF9lID0gX192YWx1ZXModGhpcy5wb3NzaWJsZUNlbnRlcnMpLCBfZiA9IF9lLm5leHQoKTsgIV9mLmRvbmU7IF9mID0gX2UubmV4dCgpKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSBfZi52YWx1ZTsKCSAgICAgICAgICAgICAgICB0b3RhbERldmlhdGlvbiArPSBNYXRoLmFicyhwYXR0ZXJuLmdldEVzdGltYXRlZE1vZHVsZVNpemUoKSAtIGF2ZXJhZ2UpOwoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIGNhdGNoIChlXzNfMSkgeyBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OyB9CgkgICAgICAgIGZpbmFsbHkgewoJICAgICAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgICAgICBpZiAoX2YgJiYgIV9mLmRvbmUgJiYgKF9iID0gX2UucmV0dXJuKSkgX2IuY2FsbChfZSk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOyB9CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHRvdGFsRGV2aWF0aW9uIDw9IDAuMDUgKiB0b3RhbE1vZHVsZVNpemU7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBAcmV0dXJuIHRoZSAzIGJlc3Qge0BsaW5rIEZpbmRlclBhdHRlcm59cyBmcm9tIG91ciBsaXN0IG9mIGNhbmRpZGF0ZXMuIFRoZSAiYmVzdCIgYXJlCgkgICAgICogICAgICAgICB0aG9zZSB0aGF0IGhhdmUgYmVlbiBkZXRlY3RlZCBhdCBsZWFzdCB7QGxpbmsgI0NFTlRFUl9RVU9SVU19IHRpbWVzLCBhbmQgd2hvc2UgbW9kdWxlCgkgICAgICogICAgICAgICBzaXplIGRpZmZlcnMgZnJvbSB0aGUgYXZlcmFnZSBhbW9uZyB0aG9zZSBwYXR0ZXJucyB0aGUgbGVhc3QKCSAgICAgKiBAdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIGlmIDMgc3VjaCBmaW5kZXIgcGF0dGVybnMgZG8gbm90IGV4aXN0CgkgICAgICovCgkgICAgRmluZGVyUGF0dGVybkZpbmRlci5wcm90b3R5cGUuc2VsZWN0QmVzdFBhdHRlcm5zID0gZnVuY3Rpb24gKCkgewoJICAgICAgICB2YXIgZV80LCBfYSwgZV81LCBfYjsKCSAgICAgICAgdmFyIHN0YXJ0U2l6ZSA9IHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aDsKCSAgICAgICAgaWYgKHN0YXJ0U2l6ZSA8IDMpIHsKCSAgICAgICAgICAgIC8vIENvdWxkbid0IGZpbmQgZW5vdWdoIGZpbmRlciBwYXR0ZXJucwoJICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uXzEkMi5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIHBvc3NpYmxlQ2VudGVycyA9IHRoaXMucG9zc2libGVDZW50ZXJzOwoJICAgICAgICB2YXIgYXZlcmFnZTsKCSAgICAgICAgLy8gRmlsdGVyIG91dGxpZXIgcG9zc2liaWxpdGllcyB3aG9zZSBtb2R1bGUgc2l6ZSBpcyB0b28gZGlmZmVyZW50CgkgICAgICAgIGlmIChzdGFydFNpemUgPiAzKSB7CgkgICAgICAgICAgICAvLyBCdXQgd2UgY2FuIG9ubHkgYWZmb3JkIHRvIGRvIHNvIGlmIHdlIGhhdmUgYXQgbGVhc3QgNCBwb3NzaWJpbGl0aWVzIHRvIGNob29zZSBmcm9tCgkgICAgICAgICAgICB2YXIgdG90YWxNb2R1bGVTaXplID0gMC4wOwoJICAgICAgICAgICAgdmFyIHNxdWFyZSA9IDAuMDsKCSAgICAgICAgICAgIHRyeSB7CgkgICAgICAgICAgICAgICAgZm9yICh2YXIgX2MgPSBfX3ZhbHVlcyh0aGlzLnBvc3NpYmxlQ2VudGVycyksIF9kID0gX2MubmV4dCgpOyAhX2QuZG9uZTsgX2QgPSBfYy5uZXh0KCkpIHsKCSAgICAgICAgICAgICAgICAgICAgdmFyIGNlbnRlciA9IF9kLnZhbHVlOwoJICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IGNlbnRlci5nZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCk7CgkgICAgICAgICAgICAgICAgICAgIHRvdGFsTW9kdWxlU2l6ZSArPSBzaXplOwoJICAgICAgICAgICAgICAgICAgICBzcXVhcmUgKz0gc2l6ZSAqIHNpemU7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgY2F0Y2ggKGVfNF8xKSB7IGVfNCA9IHsgZXJyb3I6IGVfNF8xIH07IH0KCSAgICAgICAgICAgIGZpbmFsbHkgewoJICAgICAgICAgICAgICAgIHRyeSB7CgkgICAgICAgICAgICAgICAgICAgIGlmIChfZCAmJiAhX2QuZG9uZSAmJiAoX2EgPSBfYy5yZXR1cm4pKSBfYS5jYWxsKF9jKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjsgfQoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgYXZlcmFnZSA9IHRvdGFsTW9kdWxlU2l6ZSAvIHN0YXJ0U2l6ZTsKCSAgICAgICAgICAgIHZhciBzdGREZXYgPSBNYXRoLnNxcnQoc3F1YXJlIC8gc3RhcnRTaXplIC0gYXZlcmFnZSAqIGF2ZXJhZ2UpOwoJICAgICAgICAgICAgcG9zc2libGVDZW50ZXJzLnNvcnQoCgkgICAgICAgICAgICAvKioKCSAgICAgICAgICAgICAqIDxwPk9yZGVycyBieSBmdXJ0aGVzdCBmcm9tIGF2ZXJhZ2U8L3A+CgkgICAgICAgICAgICAgKi8KCSAgICAgICAgICAgIC8vIEZ1cnRoZXN0RnJvbUF2ZXJhZ2VDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxGaW5kZXJQYXR0ZXJuPgoJICAgICAgICAgICAgZnVuY3Rpb24gKGNlbnRlcjEsIGNlbnRlcjIpIHsKCSAgICAgICAgICAgICAgICB2YXIgZEEgPSBNYXRoLmFicyhjZW50ZXIyLmdldEVzdGltYXRlZE1vZHVsZVNpemUoKSAtIGF2ZXJhZ2UpOwoJICAgICAgICAgICAgICAgIHZhciBkQiA9IE1hdGguYWJzKGNlbnRlcjEuZ2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpIC0gYXZlcmFnZSk7CgkgICAgICAgICAgICAgICAgcmV0dXJuIGRBIDwgZEIgPyAtMSA6IGRBID4gZEIgPyAxIDogMDsKCSAgICAgICAgICAgIH0pOwoJICAgICAgICAgICAgdmFyIGxpbWl0ID0gTWF0aC5tYXgoMC4yICogYXZlcmFnZSwgc3RkRGV2KTsKCSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zc2libGVDZW50ZXJzLmxlbmd0aCAmJiBwb3NzaWJsZUNlbnRlcnMubGVuZ3RoID4gMzsgaSsrKSB7CgkgICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSBwb3NzaWJsZUNlbnRlcnNbaV07CgkgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHBhdHRlcm4uZ2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpIC0gYXZlcmFnZSkgPiBsaW1pdCkgewoJICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUNlbnRlcnMuc3BsaWNlKGksIDEpOwoJICAgICAgICAgICAgICAgICAgICBpLS07CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIGlmIChwb3NzaWJsZUNlbnRlcnMubGVuZ3RoID4gMykgewoJICAgICAgICAgICAgLy8gVGhyb3cgYXdheSBhbGwgYnV0IHRob3NlIGZpcnN0IHNpemUgY2FuZGlkYXRlIHBvaW50cyB3ZSBmb3VuZC4KCSAgICAgICAgICAgIHZhciB0b3RhbE1vZHVsZVNpemUgPSAwLjA7CgkgICAgICAgICAgICB0cnkgewoJICAgICAgICAgICAgICAgIGZvciAodmFyIHBvc3NpYmxlQ2VudGVyc18xID0gX192YWx1ZXMocG9zc2libGVDZW50ZXJzKSwgcG9zc2libGVDZW50ZXJzXzFfMSA9IHBvc3NpYmxlQ2VudGVyc18xLm5leHQoKTsgIXBvc3NpYmxlQ2VudGVyc18xXzEuZG9uZTsgcG9zc2libGVDZW50ZXJzXzFfMSA9IHBvc3NpYmxlQ2VudGVyc18xLm5leHQoKSkgewoJICAgICAgICAgICAgICAgICAgICB2YXIgcG9zc2libGVDZW50ZXIgPSBwb3NzaWJsZUNlbnRlcnNfMV8xLnZhbHVlOwoJICAgICAgICAgICAgICAgICAgICB0b3RhbE1vZHVsZVNpemUgKz0gcG9zc2libGVDZW50ZXIuZ2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGNhdGNoIChlXzVfMSkgeyBlXzUgPSB7IGVycm9yOiBlXzVfMSB9OyB9CgkgICAgICAgICAgICBmaW5hbGx5IHsKCSAgICAgICAgICAgICAgICB0cnkgewoJICAgICAgICAgICAgICAgICAgICBpZiAocG9zc2libGVDZW50ZXJzXzFfMSAmJiAhcG9zc2libGVDZW50ZXJzXzFfMS5kb25lICYmIChfYiA9IHBvc3NpYmxlQ2VudGVyc18xLnJldHVybikpIF9iLmNhbGwocG9zc2libGVDZW50ZXJzXzEpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNSkgdGhyb3cgZV81LmVycm9yOyB9CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBhdmVyYWdlID0gdG90YWxNb2R1bGVTaXplIC8gcG9zc2libGVDZW50ZXJzLmxlbmd0aDsKCSAgICAgICAgICAgIHBvc3NpYmxlQ2VudGVycy5zb3J0KAoJICAgICAgICAgICAgLyoqCgkgICAgICAgICAgICAgKiA8cD5PcmRlcnMgYnkge0BsaW5rIEZpbmRlclBhdHRlcm4jZ2V0Q291bnQoKX0sIGRlc2NlbmRpbmcuPC9wPgoJICAgICAgICAgICAgICovCgkgICAgICAgICAgICAvLyBDZW50ZXJDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxGaW5kZXJQYXR0ZXJuPgoJICAgICAgICAgICAgZnVuY3Rpb24gKGNlbnRlcjEsIGNlbnRlcjIpIHsKCSAgICAgICAgICAgICAgICBpZiAoY2VudGVyMi5nZXRDb3VudCgpID09PSBjZW50ZXIxLmdldENvdW50KCkpIHsKCSAgICAgICAgICAgICAgICAgICAgdmFyIGRBID0gTWF0aC5hYnMoY2VudGVyMi5nZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCkgLSBhdmVyYWdlKTsKCSAgICAgICAgICAgICAgICAgICAgdmFyIGRCID0gTWF0aC5hYnMoY2VudGVyMS5nZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCkgLSBhdmVyYWdlKTsKCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRBIDwgZEIgPyAxIDogZEEgPiBkQiA/IC0xIDogMDsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAgICAgICAgIHJldHVybiBjZW50ZXIyLmdldENvdW50KCkgLSBjZW50ZXIxLmdldENvdW50KCk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfSk7CgkgICAgICAgICAgICBwb3NzaWJsZUNlbnRlcnMuc3BsaWNlKDMpOyAvLyB0aGlzIGlzIG5vdCByZWFseSBuZWNlc3NhcnkgYXMgd2Ugb25seSByZXR1cm4gZmlyc3QgMyBhbnl3YXkKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gWwoJICAgICAgICAgICAgcG9zc2libGVDZW50ZXJzWzBdLAoJICAgICAgICAgICAgcG9zc2libGVDZW50ZXJzWzFdLAoJICAgICAgICAgICAgcG9zc2libGVDZW50ZXJzWzJdCgkgICAgICAgIF07CgkgICAgfTsKCSAgICBGaW5kZXJQYXR0ZXJuRmluZGVyLkNFTlRFUl9RVU9SVU0gPSAyOwoJICAgIEZpbmRlclBhdHRlcm5GaW5kZXIuTUlOX1NLSVAgPSAzOyAvLyAxIHBpeGVsL21vZHVsZSB0aW1lcyAzIG1vZHVsZXMvY2VudGVyCgkgICAgRmluZGVyUGF0dGVybkZpbmRlci5NQVhfTU9EVUxFUyA9IDU3OyAvLyBzdXBwb3J0IHVwIHRvIHZlcnNpb24gMTAgZm9yIG1vYmlsZSBjbGllbnRzCgkgICAgcmV0dXJuIEZpbmRlclBhdHRlcm5GaW5kZXI7Cgl9KCkpOwoJRmluZGVyUGF0dGVybkZpbmRlciQxLmRlZmF1bHQgPSBGaW5kZXJQYXR0ZXJuRmluZGVyOwoKCS8qCgkgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCglPYmplY3QuZGVmaW5lUHJvcGVydHkoRGV0ZWN0b3IkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoJdmFyIE1hdGhVdGlsc18xID0gTWF0aFV0aWxzJDE7Cgl2YXIgRGV0ZWN0b3JSZXN1bHRfMSA9IERldGVjdG9yUmVzdWx0JDE7CgkvLyBpbXBvcnQgR3JpZFNhbXBsZXIgZnJvbSAnLi4vLi4vY29tbW9uL0dyaWRTYW1wbGVyJzsKCXZhciBHcmlkU2FtcGxlckluc3RhbmNlXzEgPSBHcmlkU2FtcGxlckluc3RhbmNlJDE7Cgl2YXIgUGVyc3BlY3RpdmVUcmFuc2Zvcm1fMSA9IFBlcnNwZWN0aXZlVHJhbnNmb3JtJDE7Cgl2YXIgRGVjb2RlSGludFR5cGVfMSQxID0gRGVjb2RlSGludFR5cGUkMTsKCXZhciBOb3RGb3VuZEV4Y2VwdGlvbl8xJDEgPSBOb3RGb3VuZEV4Y2VwdGlvbiQxOwoJdmFyIFJlc3VsdFBvaW50XzEgPSBSZXN1bHRQb2ludCQxOwoJdmFyIFZlcnNpb25fMSA9IFZlcnNpb24kMTsKCXZhciBBbGlnbm1lbnRQYXR0ZXJuRmluZGVyXzEgPSBBbGlnbm1lbnRQYXR0ZXJuRmluZGVyJDE7Cgl2YXIgRmluZGVyUGF0dGVybkZpbmRlcl8xID0gRmluZGVyUGF0dGVybkZpbmRlciQxOwoJLyppbXBvcnQgamF2YS51dGlsLk1hcDsqLwoJLyoqCgkgKiA8cD5FbmNhcHN1bGF0ZXMgbG9naWMgdGhhdCBjYW4gZGV0ZWN0IGEgUVIgQ29kZSBpbiBhbiBpbWFnZSwgZXZlbiBpZiB0aGUgUVIgQ29kZQoJICogaXMgcm90YXRlZCBvciBza2V3ZWQsIG9yIHBhcnRpYWxseSBvYnNjdXJlZC48L3A+CgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIERldGVjdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewoJICAgIGZ1bmN0aW9uIERldGVjdG9yKGltYWdlKSB7CgkgICAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKCSAgICB9CgkgICAgRGV0ZWN0b3IucHJvdG90eXBlLmdldEltYWdlID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5pbWFnZTsKCSAgICB9OwoJICAgIERldGVjdG9yLnByb3RvdHlwZS5nZXRSZXN1bHRQb2ludENhbGxiYWNrID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogPHA+RGV0ZWN0cyBhIFFSIENvZGUgaW4gYW4gaW1hZ2UuPC9wPgoJICAgICAqCgkgICAgICogQHJldHVybiB7QGxpbmsgRGV0ZWN0b3JSZXN1bHR9IGVuY2Fwc3VsYXRpbmcgcmVzdWx0cyBvZiBkZXRlY3RpbmcgYSBRUiBDb2RlCgkgICAgICogQHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiBpZiBRUiBDb2RlIGNhbm5vdCBiZSBmb3VuZAoJICAgICAqIEB0aHJvd3MgRm9ybWF0RXhjZXB0aW9uIGlmIGEgUVIgQ29kZSBjYW5ub3QgYmUgZGVjb2RlZAoJICAgICAqLwoJICAgIC8vIHB1YmxpYyBkZXRlY3QoKTogRGV0ZWN0b3JSZXN1bHQgLyp0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24sIEZvcm1hdEV4Y2VwdGlvbiovIHsKCSAgICAvLyAgIHJldHVybiBkZXRlY3QobnVsbCkKCSAgICAvLyB9CgkgICAgLyoqCgkgICAgICogPHA+RGV0ZWN0cyBhIFFSIENvZGUgaW4gYW4gaW1hZ2UuPC9wPgoJICAgICAqCgkgICAgICogQHBhcmFtIGhpbnRzIG9wdGlvbmFsIGhpbnRzIHRvIGRldGVjdG9yCgkgICAgICogQHJldHVybiB7QGxpbmsgRGV0ZWN0b3JSZXN1bHR9IGVuY2Fwc3VsYXRpbmcgcmVzdWx0cyBvZiBkZXRlY3RpbmcgYSBRUiBDb2RlCgkgICAgICogQHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiBpZiBRUiBDb2RlIGNhbm5vdCBiZSBmb3VuZAoJICAgICAqIEB0aHJvd3MgRm9ybWF0RXhjZXB0aW9uIGlmIGEgUVIgQ29kZSBjYW5ub3QgYmUgZGVjb2RlZAoJICAgICAqLwoJICAgIERldGVjdG9yLnByb3RvdHlwZS5kZXRlY3QgPSBmdW5jdGlvbiAoaGludHMpIHsKCSAgICAgICAgdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrID0gKGhpbnRzID09PSBudWxsIHx8IGhpbnRzID09PSB1bmRlZmluZWQpID8gbnVsbCA6CgkgICAgICAgICAgICAvKihSZXN1bHRQb2ludENhbGxiYWNrKSAqLyBoaW50cy5nZXQoRGVjb2RlSGludFR5cGVfMSQxLmRlZmF1bHQuTkVFRF9SRVNVTFRfUE9JTlRfQ0FMTEJBQ0spOwoJICAgICAgICB2YXIgZmluZGVyID0gbmV3IEZpbmRlclBhdHRlcm5GaW5kZXJfMS5kZWZhdWx0KHRoaXMuaW1hZ2UsIHRoaXMucmVzdWx0UG9pbnRDYWxsYmFjayk7CgkgICAgICAgIHZhciBpbmZvID0gZmluZGVyLmZpbmQoaGludHMpOwoJICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRmluZGVyUGF0dGVybkluZm8oaW5mbyk7CgkgICAgfTsKCSAgICBEZXRlY3Rvci5wcm90b3R5cGUucHJvY2Vzc0ZpbmRlclBhdHRlcm5JbmZvID0gZnVuY3Rpb24gKGluZm8pIHsKCSAgICAgICAgdmFyIHRvcExlZnQgPSBpbmZvLmdldFRvcExlZnQoKTsKCSAgICAgICAgdmFyIHRvcFJpZ2h0ID0gaW5mby5nZXRUb3BSaWdodCgpOwoJICAgICAgICB2YXIgYm90dG9tTGVmdCA9IGluZm8uZ2V0Qm90dG9tTGVmdCgpOwoJICAgICAgICB2YXIgbW9kdWxlU2l6ZSA9IHRoaXMuY2FsY3VsYXRlTW9kdWxlU2l6ZSh0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCk7CgkgICAgICAgIGlmIChtb2R1bGVTaXplIDwgMS4wKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb25fMSQxLmRlZmF1bHQoJ05vIHBhdHRlcm4gZm91bmQgaW4gcHJvY2Nlc3MgZmluZGVyLicpOwoJICAgICAgICB9CgkgICAgICAgIHZhciBkaW1lbnNpb24gPSBEZXRlY3Rvci5jb21wdXRlRGltZW5zaW9uKHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBtb2R1bGVTaXplKTsKCSAgICAgICAgdmFyIHByb3Zpc2lvbmFsVmVyc2lvbiA9IFZlcnNpb25fMS5kZWZhdWx0LmdldFByb3Zpc2lvbmFsVmVyc2lvbkZvckRpbWVuc2lvbihkaW1lbnNpb24pOwoJICAgICAgICB2YXIgbW9kdWxlc0JldHdlZW5GUENlbnRlcnMgPSBwcm92aXNpb25hbFZlcnNpb24uZ2V0RGltZW5zaW9uRm9yVmVyc2lvbigpIC0gNzsKCSAgICAgICAgdmFyIGFsaWdubWVudFBhdHRlcm4gPSBudWxsOwoJICAgICAgICAvLyBBbnl0aGluZyBhYm92ZSB2ZXJzaW9uIDEgaGFzIGFuIGFsaWdubWVudCBwYXR0ZXJuCgkgICAgICAgIGlmIChwcm92aXNpb25hbFZlcnNpb24uZ2V0QWxpZ25tZW50UGF0dGVybkNlbnRlcnMoKS5sZW5ndGggPiAwKSB7CgkgICAgICAgICAgICAvLyBHdWVzcyB3aGVyZSBhICJib3R0b20gcmlnaHQiIGZpbmRlciBwYXR0ZXJuIHdvdWxkIGhhdmUgYmVlbgoJICAgICAgICAgICAgdmFyIGJvdHRvbVJpZ2h0WCA9IHRvcFJpZ2h0LmdldFgoKSAtIHRvcExlZnQuZ2V0WCgpICsgYm90dG9tTGVmdC5nZXRYKCk7CgkgICAgICAgICAgICB2YXIgYm90dG9tUmlnaHRZID0gdG9wUmlnaHQuZ2V0WSgpIC0gdG9wTGVmdC5nZXRZKCkgKyBib3R0b21MZWZ0LmdldFkoKTsKCSAgICAgICAgICAgIC8vIEVzdGltYXRlIHRoYXQgYWxpZ25tZW50IHBhdHRlcm4gaXMgY2xvc2VyIGJ5IDMgbW9kdWxlcwoJICAgICAgICAgICAgLy8gZnJvbSAiYm90dG9tIHJpZ2h0IiB0byBrbm93biB0b3AgbGVmdCBsb2NhdGlvbgoJICAgICAgICAgICAgdmFyIGNvcnJlY3Rpb25Ub1RvcExlZnQgPSAxLjAgLSAzLjAgLyBtb2R1bGVzQmV0d2VlbkZQQ2VudGVyczsKCSAgICAgICAgICAgIHZhciBlc3RBbGlnbm1lbnRYID0gLyooaW50KSAqLyBNYXRoLmZsb29yKHRvcExlZnQuZ2V0WCgpICsgY29ycmVjdGlvblRvVG9wTGVmdCAqIChib3R0b21SaWdodFggLSB0b3BMZWZ0LmdldFgoKSkpOwoJICAgICAgICAgICAgdmFyIGVzdEFsaWdubWVudFkgPSAvKihpbnQpICovIE1hdGguZmxvb3IodG9wTGVmdC5nZXRZKCkgKyBjb3JyZWN0aW9uVG9Ub3BMZWZ0ICogKGJvdHRvbVJpZ2h0WSAtIHRvcExlZnQuZ2V0WSgpKSk7CgkgICAgICAgICAgICAvLyBLaW5kIG9mIGFyYml0cmFyeSAtLSBleHBhbmQgc2VhcmNoIHJhZGl1cyBiZWZvcmUgZ2l2aW5nIHVwCgkgICAgICAgICAgICBmb3IgKHZhciBpID0gNDsgaSA8PSAxNjsgaSA8PD0gMSkgewoJICAgICAgICAgICAgICAgIHRyeSB7CgkgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudFBhdHRlcm4gPSB0aGlzLmZpbmRBbGlnbm1lbnRJblJlZ2lvbihtb2R1bGVTaXplLCBlc3RBbGlnbm1lbnRYLCBlc3RBbGlnbm1lbnRZLCBpKTsKCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIGNhdGNoIChyZSAvKk5vdEZvdW5kRXhjZXB0aW9uKi8pIHsKCSAgICAgICAgICAgICAgICAgICAgaWYgKCEocmUgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbl8xJDEuZGVmYXVsdCkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIC8vIHRyeSBuZXh0IHJvdW5kCgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYWxpZ25tZW50IHBhdHRlcm4uLi4gd2VsbCB0cnkgYW55d2F5IHdpdGhvdXQgaXQKCSAgICAgICAgfQoJICAgICAgICB2YXIgdHJhbnNmb3JtID0gRGV0ZWN0b3IuY3JlYXRlVHJhbnNmb3JtKHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBhbGlnbm1lbnRQYXR0ZXJuLCBkaW1lbnNpb24pOwoJICAgICAgICB2YXIgYml0cyA9IERldGVjdG9yLnNhbXBsZUdyaWQodGhpcy5pbWFnZSwgdHJhbnNmb3JtLCBkaW1lbnNpb24pOwoJICAgICAgICB2YXIgcG9pbnRzOwoJICAgICAgICBpZiAoYWxpZ25tZW50UGF0dGVybiA9PT0gbnVsbCkgewoJICAgICAgICAgICAgcG9pbnRzID0gW2JvdHRvbUxlZnQsIHRvcExlZnQsIHRvcFJpZ2h0XTsKCSAgICAgICAgfQoJICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgIHBvaW50cyA9IFtib3R0b21MZWZ0LCB0b3BMZWZ0LCB0b3BSaWdodCwgYWxpZ25tZW50UGF0dGVybl07CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIG5ldyBEZXRlY3RvclJlc3VsdF8xLmRlZmF1bHQoYml0cywgcG9pbnRzKTsKCSAgICB9OwoJICAgIERldGVjdG9yLmNyZWF0ZVRyYW5zZm9ybSA9IGZ1bmN0aW9uICh0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYWxpZ25tZW50UGF0dGVybiwgZGltZW5zaW9uIC8qaW50Ki8pIHsKCSAgICAgICAgdmFyIGRpbU1pbnVzVGhyZWUgPSBkaW1lbnNpb24gLSAzLjU7CgkgICAgICAgIHZhciBib3R0b21SaWdodFg7IC8qZmxvYXQqLwoJICAgICAgICB2YXIgYm90dG9tUmlnaHRZOyAvKmZsb2F0Ki8KCSAgICAgICAgdmFyIHNvdXJjZUJvdHRvbVJpZ2h0WDsgLypmbG9hdCovCgkgICAgICAgIHZhciBzb3VyY2VCb3R0b21SaWdodFk7IC8qZmxvYXQqLwoJICAgICAgICBpZiAoYWxpZ25tZW50UGF0dGVybiAhPT0gbnVsbCkgewoJICAgICAgICAgICAgYm90dG9tUmlnaHRYID0gYWxpZ25tZW50UGF0dGVybi5nZXRYKCk7CgkgICAgICAgICAgICBib3R0b21SaWdodFkgPSBhbGlnbm1lbnRQYXR0ZXJuLmdldFkoKTsKCSAgICAgICAgICAgIHNvdXJjZUJvdHRvbVJpZ2h0WCA9IGRpbU1pbnVzVGhyZWUgLSAzLjA7CgkgICAgICAgICAgICBzb3VyY2VCb3R0b21SaWdodFkgPSBzb3VyY2VCb3R0b21SaWdodFg7CgkgICAgICAgIH0KCSAgICAgICAgZWxzZSB7CgkgICAgICAgICAgICAvLyBEb24ndCBoYXZlIGFuIGFsaWdubWVudCBwYXR0ZXJuLCBqdXN0IG1ha2UgdXAgdGhlIGJvdHRvbS1yaWdodCBwb2ludAoJICAgICAgICAgICAgYm90dG9tUmlnaHRYID0gKHRvcFJpZ2h0LmdldFgoKSAtIHRvcExlZnQuZ2V0WCgpKSArIGJvdHRvbUxlZnQuZ2V0WCgpOwoJICAgICAgICAgICAgYm90dG9tUmlnaHRZID0gKHRvcFJpZ2h0LmdldFkoKSAtIHRvcExlZnQuZ2V0WSgpKSArIGJvdHRvbUxlZnQuZ2V0WSgpOwoJICAgICAgICAgICAgc291cmNlQm90dG9tUmlnaHRYID0gZGltTWludXNUaHJlZTsKCSAgICAgICAgICAgIHNvdXJjZUJvdHRvbVJpZ2h0WSA9IGRpbU1pbnVzVGhyZWU7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIFBlcnNwZWN0aXZlVHJhbnNmb3JtXzEuZGVmYXVsdC5xdWFkcmlsYXRlcmFsVG9RdWFkcmlsYXRlcmFsKDMuNSwgMy41LCBkaW1NaW51c1RocmVlLCAzLjUsIHNvdXJjZUJvdHRvbVJpZ2h0WCwgc291cmNlQm90dG9tUmlnaHRZLCAzLjUsIGRpbU1pbnVzVGhyZWUsIHRvcExlZnQuZ2V0WCgpLCB0b3BMZWZ0LmdldFkoKSwgdG9wUmlnaHQuZ2V0WCgpLCB0b3BSaWdodC5nZXRZKCksIGJvdHRvbVJpZ2h0WCwgYm90dG9tUmlnaHRZLCBib3R0b21MZWZ0LmdldFgoKSwgYm90dG9tTGVmdC5nZXRZKCkpOwoJICAgIH07CgkgICAgRGV0ZWN0b3Iuc2FtcGxlR3JpZCA9IGZ1bmN0aW9uIChpbWFnZSwgdHJhbnNmb3JtLCBkaW1lbnNpb24gLyppbnQqLykgewoJICAgICAgICB2YXIgc2FtcGxlciA9IEdyaWRTYW1wbGVySW5zdGFuY2VfMS5kZWZhdWx0LmdldEluc3RhbmNlKCk7CgkgICAgICAgIHJldHVybiBzYW1wbGVyLnNhbXBsZUdyaWRXaXRoVHJhbnNmb3JtKGltYWdlLCBkaW1lbnNpb24sIGRpbWVuc2lvbiwgdHJhbnNmb3JtKTsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIDxwPkNvbXB1dGVzIHRoZSBkaW1lbnNpb24gKG51bWJlciBvZiBtb2R1bGVzIG9uIGEgc2l6ZSkgb2YgdGhlIFFSIENvZGUgYmFzZWQgb24gdGhlIHBvc2l0aW9uCgkgICAgICogb2YgdGhlIGZpbmRlciBwYXR0ZXJucyBhbmQgZXN0aW1hdGVkIG1vZHVsZSBzaXplLjwvcD4KCSAgICAgKi8KCSAgICBEZXRlY3Rvci5jb21wdXRlRGltZW5zaW9uID0gZnVuY3Rpb24gKHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBtb2R1bGVTaXplIC8qZmxvYXQqLykgewoJICAgICAgICB2YXIgdGx0ckNlbnRlcnNEaW1lbnNpb24gPSBNYXRoVXRpbHNfMS5kZWZhdWx0LnJvdW5kKFJlc3VsdFBvaW50XzEuZGVmYXVsdC5kaXN0YW5jZSh0b3BMZWZ0LCB0b3BSaWdodCkgLyBtb2R1bGVTaXplKTsKCSAgICAgICAgdmFyIHRsYmxDZW50ZXJzRGltZW5zaW9uID0gTWF0aFV0aWxzXzEuZGVmYXVsdC5yb3VuZChSZXN1bHRQb2ludF8xLmRlZmF1bHQuZGlzdGFuY2UodG9wTGVmdCwgYm90dG9tTGVmdCkgLyBtb2R1bGVTaXplKTsKCSAgICAgICAgdmFyIGRpbWVuc2lvbiA9IE1hdGguZmxvb3IoKHRsdHJDZW50ZXJzRGltZW5zaW9uICsgdGxibENlbnRlcnNEaW1lbnNpb24pIC8gMikgKyA3OwoJICAgICAgICBzd2l0Y2ggKGRpbWVuc2lvbiAmIDB4MDMpIHsgLy8gbW9kIDQKCSAgICAgICAgICAgIGNhc2UgMDoKCSAgICAgICAgICAgICAgICBkaW1lbnNpb24rKzsKCSAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIC8vIDE/IGRvIG5vdGhpbmcKCSAgICAgICAgICAgIGNhc2UgMjoKCSAgICAgICAgICAgICAgICBkaW1lbnNpb24tLTsKCSAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgIGNhc2UgMzoKCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb25fMSQxLmRlZmF1bHQoJ0RpbWVuc2lvbnMgY291bGQgYmUgbm90IGZvdW5kLicpOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBkaW1lbnNpb247CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiA8cD5Db21wdXRlcyBhbiBhdmVyYWdlIGVzdGltYXRlZCBtb2R1bGUgc2l6ZSBiYXNlZCBvbiBlc3RpbWF0ZWQgZGVyaXZlZCBmcm9tIHRoZSBwb3NpdGlvbnMKCSAgICAgKiBvZiB0aGUgdGhyZWUgZmluZGVyIHBhdHRlcm5zLjwvcD4KCSAgICAgKgoJICAgICAqIEBwYXJhbSB0b3BMZWZ0IGRldGVjdGVkIHRvcC1sZWZ0IGZpbmRlciBwYXR0ZXJuIGNlbnRlcgoJICAgICAqIEBwYXJhbSB0b3BSaWdodCBkZXRlY3RlZCB0b3AtcmlnaHQgZmluZGVyIHBhdHRlcm4gY2VudGVyCgkgICAgICogQHBhcmFtIGJvdHRvbUxlZnQgZGV0ZWN0ZWQgYm90dG9tLWxlZnQgZmluZGVyIHBhdHRlcm4gY2VudGVyCgkgICAgICogQHJldHVybiBlc3RpbWF0ZWQgbW9kdWxlIHNpemUKCSAgICAgKi8KCSAgICBEZXRlY3Rvci5wcm90b3R5cGUuY2FsY3VsYXRlTW9kdWxlU2l6ZSA9IGZ1bmN0aW9uICh0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCkgewoJICAgICAgICAvLyBUYWtlIHRoZSBhdmVyYWdlCgkgICAgICAgIHJldHVybiAodGhpcy5jYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5KHRvcExlZnQsIHRvcFJpZ2h0KSArCgkgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU1vZHVsZVNpemVPbmVXYXkodG9wTGVmdCwgYm90dG9tTGVmdCkpIC8gMi4wOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogPHA+RXN0aW1hdGVzIG1vZHVsZSBzaXplIGJhc2VkIG9uIHR3byBmaW5kZXIgcGF0dGVybnMgLS0gaXQgdXNlcwoJICAgICAqIHtAbGluayAjc2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuQm90aFdheXMoaW50LCBpbnQsIGludCwgaW50KX0gdG8gZmlndXJlIHRoZQoJICAgICAqIHdpZHRoIG9mIGVhY2gsIG1lYXN1cmluZyBhbG9uZyB0aGUgYXhpcyBiZXR3ZWVuIHRoZWlyIGNlbnRlcnMuPC9wPgoJICAgICAqLwoJICAgIERldGVjdG9yLnByb3RvdHlwZS5jYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5ID0gZnVuY3Rpb24gKHBhdHRlcm4sIG90aGVyUGF0dGVybikgewoJICAgICAgICB2YXIgbW9kdWxlU2l6ZUVzdDEgPSB0aGlzLnNpemVPZkJsYWNrV2hpdGVCbGFja1J1bkJvdGhXYXlzKC8qKGludCkgKi8gTWF0aC5mbG9vcihwYXR0ZXJuLmdldFgoKSksIAoJICAgICAgICAvKihpbnQpICovIE1hdGguZmxvb3IocGF0dGVybi5nZXRZKCkpLCAKCSAgICAgICAgLyooaW50KSAqLyBNYXRoLmZsb29yKG90aGVyUGF0dGVybi5nZXRYKCkpLCAKCSAgICAgICAgLyooaW50KSAqLyBNYXRoLmZsb29yKG90aGVyUGF0dGVybi5nZXRZKCkpKTsKCSAgICAgICAgdmFyIG1vZHVsZVNpemVFc3QyID0gdGhpcy5zaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cygvKihpbnQpICovIE1hdGguZmxvb3Iob3RoZXJQYXR0ZXJuLmdldFgoKSksIAoJICAgICAgICAvKihpbnQpICovIE1hdGguZmxvb3Iob3RoZXJQYXR0ZXJuLmdldFkoKSksIAoJICAgICAgICAvKihpbnQpICovIE1hdGguZmxvb3IocGF0dGVybi5nZXRYKCkpLCAKCSAgICAgICAgLyooaW50KSAqLyBNYXRoLmZsb29yKHBhdHRlcm4uZ2V0WSgpKSk7CgkgICAgICAgIGlmIChpc05hTihtb2R1bGVTaXplRXN0MSkpIHsKCSAgICAgICAgICAgIHJldHVybiBtb2R1bGVTaXplRXN0MiAvIDcuMDsKCSAgICAgICAgfQoJICAgICAgICBpZiAoaXNOYU4obW9kdWxlU2l6ZUVzdDIpKSB7CgkgICAgICAgICAgICByZXR1cm4gbW9kdWxlU2l6ZUVzdDEgLyA3LjA7CgkgICAgICAgIH0KCSAgICAgICAgLy8gQXZlcmFnZSB0aGVtLCBhbmQgZGl2aWRlIGJ5IDcgc2luY2Ugd2UndmUgY291bnRlZCB0aGUgd2lkdGggb2YgMyBibGFjayBtb2R1bGVzLAoJICAgICAgICAvLyBhbmQgMSB3aGl0ZSBhbmQgMSBibGFjayBtb2R1bGUgb24gZWl0aGVyIHNpZGUuIEVyZ28sIGRpdmlkZSBzdW0gYnkgMTQuCgkgICAgICAgIHJldHVybiAobW9kdWxlU2l6ZUVzdDEgKyBtb2R1bGVTaXplRXN0MikgLyAxNC4wOwoJICAgIH07CgkgICAgLyoqCgkgICAgICogU2VlIHtAbGluayAjc2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuKGludCwgaW50LCBpbnQsIGludCl9OyBjb21wdXRlcyB0aGUgdG90YWwgd2lkdGggb2YKCSAgICAgKiBhIGZpbmRlciBwYXR0ZXJuIGJ5IGxvb2tpbmcgZm9yIGEgYmxhY2std2hpdGUtYmxhY2sgcnVuIGZyb20gdGhlIGNlbnRlciBpbiB0aGUgZGlyZWN0aW9uCgkgICAgICogb2YgYW5vdGhlciBwb2ludCAoYW5vdGhlciBmaW5kZXIgcGF0dGVybiBjZW50ZXIpLCBhbmQgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiB0b28uCgkgICAgICovCgkgICAgRGV0ZWN0b3IucHJvdG90eXBlLnNpemVPZkJsYWNrV2hpdGVCbGFja1J1bkJvdGhXYXlzID0gZnVuY3Rpb24gKGZyb21YIC8qaW50Ki8sIGZyb21ZIC8qaW50Ki8sIHRvWCAvKmludCovLCB0b1kgLyppbnQqLykgewoJICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5zaXplT2ZCbGFja1doaXRlQmxhY2tSdW4oZnJvbVgsIGZyb21ZLCB0b1gsIHRvWSk7CgkgICAgICAgIC8vIE5vdyBjb3VudCBvdGhlciB3YXkgLS0gZG9uJ3QgcnVuIG9mZiBpbWFnZSB0aG91Z2ggb2YgY291cnNlCgkgICAgICAgIHZhciBzY2FsZSA9IDEuMDsKCSAgICAgICAgdmFyIG90aGVyVG9YID0gZnJvbVggLSAodG9YIC0gZnJvbVgpOwoJICAgICAgICBpZiAob3RoZXJUb1ggPCAwKSB7CgkgICAgICAgICAgICBzY2FsZSA9IGZyb21YIC8gLyooZmxvYXQpICovIChmcm9tWCAtIG90aGVyVG9YKTsKCSAgICAgICAgICAgIG90aGVyVG9YID0gMDsKCSAgICAgICAgfQoJICAgICAgICBlbHNlIGlmIChvdGhlclRvWCA+PSB0aGlzLmltYWdlLmdldFdpZHRoKCkpIHsKCSAgICAgICAgICAgIHNjYWxlID0gKHRoaXMuaW1hZ2UuZ2V0V2lkdGgoKSAtIDEgLSBmcm9tWCkgLyAvKihmbG9hdCkgKi8gKG90aGVyVG9YIC0gZnJvbVgpOwoJICAgICAgICAgICAgb3RoZXJUb1ggPSB0aGlzLmltYWdlLmdldFdpZHRoKCkgLSAxOwoJICAgICAgICB9CgkgICAgICAgIHZhciBvdGhlclRvWSA9IC8qKGludCkgKi8gTWF0aC5mbG9vcihmcm9tWSAtICh0b1kgLSBmcm9tWSkgKiBzY2FsZSk7CgkgICAgICAgIHNjYWxlID0gMS4wOwoJICAgICAgICBpZiAob3RoZXJUb1kgPCAwKSB7CgkgICAgICAgICAgICBzY2FsZSA9IGZyb21ZIC8gLyooZmxvYXQpICovIChmcm9tWSAtIG90aGVyVG9ZKTsKCSAgICAgICAgICAgIG90aGVyVG9ZID0gMDsKCSAgICAgICAgfQoJICAgICAgICBlbHNlIGlmIChvdGhlclRvWSA+PSB0aGlzLmltYWdlLmdldEhlaWdodCgpKSB7CgkgICAgICAgICAgICBzY2FsZSA9ICh0aGlzLmltYWdlLmdldEhlaWdodCgpIC0gMSAtIGZyb21ZKSAvIC8qKGZsb2F0KSAqLyAob3RoZXJUb1kgLSBmcm9tWSk7CgkgICAgICAgICAgICBvdGhlclRvWSA9IHRoaXMuaW1hZ2UuZ2V0SGVpZ2h0KCkgLSAxOwoJICAgICAgICB9CgkgICAgICAgIG90aGVyVG9YID0gLyooaW50KSAqLyBNYXRoLmZsb29yKGZyb21YICsgKG90aGVyVG9YIC0gZnJvbVgpICogc2NhbGUpOwoJICAgICAgICByZXN1bHQgKz0gdGhpcy5zaXplT2ZCbGFja1doaXRlQmxhY2tSdW4oZnJvbVgsIGZyb21ZLCBvdGhlclRvWCwgb3RoZXJUb1kpOwoJICAgICAgICAvLyBNaWRkbGUgcGl4ZWwgaXMgZG91YmxlLWNvdW50ZWQgdGhpcyB3YXk7IHN1YnRyYWN0IDEKCSAgICAgICAgcmV0dXJuIHJlc3VsdCAtIDEuMDsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIDxwPlRoaXMgbWV0aG9kIHRyYWNlcyBhIGxpbmUgZnJvbSBhIHBvaW50IGluIHRoZSBpbWFnZSwgaW4gdGhlIGRpcmVjdGlvbiB0b3dhcmRzIGFub3RoZXIgcG9pbnQuCgkgICAgICogSXQgYmVnaW5zIGluIGEgYmxhY2sgcmVnaW9uLCBhbmQga2VlcHMgZ29pbmcgdW50aWwgaXQgZmluZHMgd2hpdGUsIHRoZW4gYmxhY2ssIHRoZW4gd2hpdGUgYWdhaW4uCgkgICAgICogSXQgcmVwb3J0cyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgc3RhcnQgdG8gdGhpcyBwb2ludC48L3A+CgkgICAgICoKCSAgICAgKiA8cD5UaGlzIGlzIHVzZWQgd2hlbiBmaWd1cmluZyBvdXQgaG93IHdpZGUgYSBmaW5kZXIgcGF0dGVybiBpcywgd2hlbiB0aGUgZmluZGVyIHBhdHRlcm4KCSAgICAgKiBtYXkgYmUgc2tld2VkIG9yIHJvdGF0ZWQuPC9wPgoJICAgICAqLwoJICAgIERldGVjdG9yLnByb3RvdHlwZS5zaXplT2ZCbGFja1doaXRlQmxhY2tSdW4gPSBmdW5jdGlvbiAoZnJvbVggLyppbnQqLywgZnJvbVkgLyppbnQqLywgdG9YIC8qaW50Ki8sIHRvWSAvKmludCovKSB7CgkgICAgICAgIC8vIE1pbGQgdmFyaWFudCBvZiBCcmVzZW5oYW0ncyBhbGdvcml0aG0KCSAgICAgICAgLy8gc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnJlc2VuaGFtJ3NfbGluZV9hbGdvcml0aG0KCSAgICAgICAgdmFyIHN0ZWVwID0gTWF0aC5hYnModG9ZIC0gZnJvbVkpID4gTWF0aC5hYnModG9YIC0gZnJvbVgpOwoJICAgICAgICBpZiAoc3RlZXApIHsKCSAgICAgICAgICAgIHZhciB0ZW1wID0gZnJvbVg7CgkgICAgICAgICAgICBmcm9tWCA9IGZyb21ZOwoJICAgICAgICAgICAgZnJvbVkgPSB0ZW1wOwoJICAgICAgICAgICAgdGVtcCA9IHRvWDsKCSAgICAgICAgICAgIHRvWCA9IHRvWTsKCSAgICAgICAgICAgIHRvWSA9IHRlbXA7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIGR4ID0gTWF0aC5hYnModG9YIC0gZnJvbVgpOwoJICAgICAgICB2YXIgZHkgPSBNYXRoLmFicyh0b1kgLSBmcm9tWSk7CgkgICAgICAgIHZhciBlcnJvciA9IC1keCAvIDI7CgkgICAgICAgIHZhciB4c3RlcCA9IGZyb21YIDwgdG9YID8gMSA6IC0xOwoJICAgICAgICB2YXIgeXN0ZXAgPSBmcm9tWSA8IHRvWSA/IDEgOiAtMTsKCSAgICAgICAgLy8gSW4gYmxhY2sgcGl4ZWxzLCBsb29raW5nIGZvciB3aGl0ZSwgZmlyc3Qgb3Igc2Vjb25kIHRpbWUuCgkgICAgICAgIHZhciBzdGF0ZSA9IDA7CgkgICAgICAgIC8vIExvb3AgdXAgdW50aWwgeCA9PSB0b1gsIGJ1dCBub3QgYmV5b25kCgkgICAgICAgIHZhciB4TGltaXQgPSB0b1ggKyB4c3RlcDsKCSAgICAgICAgZm9yICh2YXIgeCA9IGZyb21YLCB5ID0gZnJvbVk7IHggIT09IHhMaW1pdDsgeCArPSB4c3RlcCkgewoJICAgICAgICAgICAgdmFyIHJlYWxYID0gc3RlZXAgPyB5IDogeDsKCSAgICAgICAgICAgIHZhciByZWFsWSA9IHN0ZWVwID8geCA6IHk7CgkgICAgICAgICAgICAvLyBEb2VzIGN1cnJlbnQgcGl4ZWwgbWVhbiB3ZSBoYXZlIG1vdmVkIHdoaXRlIHRvIGJsYWNrIG9yIHZpY2UgdmVyc2E/CgkgICAgICAgICAgICAvLyBTY2FubmluZyBibGFjayBpbiBzdGF0ZSAwLDIgYW5kIHdoaXRlIGluIHN0YXRlIDEsIHNvIGlmIHdlIGZpbmQgdGhlIHdyb25nCgkgICAgICAgICAgICAvLyBjb2xvciwgYWR2YW5jZSB0byBuZXh0IHN0YXRlIG9yIGVuZCBpZiB3ZSBhcmUgaW4gc3RhdGUgMiBhbHJlYWR5CgkgICAgICAgICAgICBpZiAoKHN0YXRlID09PSAxKSA9PT0gdGhpcy5pbWFnZS5nZXQocmVhbFgsIHJlYWxZKSkgewoJICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMikgewoJICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aFV0aWxzXzEuZGVmYXVsdC5kaXN0YW5jZSh4LCB5LCBmcm9tWCwgZnJvbVkpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBzdGF0ZSsrOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZXJyb3IgKz0gZHk7CgkgICAgICAgICAgICBpZiAoZXJyb3IgPiAwKSB7CgkgICAgICAgICAgICAgICAgaWYgKHkgPT09IHRvWSkgewoJICAgICAgICAgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgeSArPSB5c3RlcDsKCSAgICAgICAgICAgICAgICBlcnJvciAtPSBkeDsKCSAgICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICAvLyBGb3VuZCBibGFjay13aGl0ZS1ibGFjazsgZ2l2ZSB0aGUgYmVuZWZpdCBvZiB0aGUgZG91YnQgdGhhdCB0aGUgbmV4dCBwaXhlbCBvdXRzaWRlIHRoZSBpbWFnZQoJICAgICAgICAvLyBpcyAid2hpdGUiIHNvIHRoaXMgbGFzdCBwb2ludCBhdCAodG9YK3hTdGVwLHRvWSkgaXMgdGhlIHJpZ2h0IGVuZGluZy4gVGhpcyBpcyByZWFsbHkgYQoJICAgICAgICAvLyBzbWFsbCBhcHByb3hpbWF0aW9uOyAodG9YK3hTdGVwLHRvWSt5U3RlcCkgbWlnaHQgYmUgcmVhbGx5IGNvcnJlY3QuIElnbm9yZSB0aGlzLgoJICAgICAgICBpZiAoc3RhdGUgPT09IDIpIHsKCSAgICAgICAgICAgIHJldHVybiBNYXRoVXRpbHNfMS5kZWZhdWx0LmRpc3RhbmNlKHRvWCArIHhzdGVwLCB0b1ksIGZyb21YLCBmcm9tWSk7CgkgICAgICAgIH0KCSAgICAgICAgLy8gZWxzZSB3ZSBkaWRuJ3QgZmluZCBldmVuIGJsYWNrLXdoaXRlLWJsYWNrOyBubyBlc3RpbWF0ZSBpcyByZWFsbHkgcG9zc2libGUKCSAgICAgICAgcmV0dXJuIE5hTjsKCSAgICB9OwoJICAgIC8qKgoJICAgICAqIDxwPkF0dGVtcHRzIHRvIGxvY2F0ZSBhbiBhbGlnbm1lbnQgcGF0dGVybiBpbiBhIGxpbWl0ZWQgcmVnaW9uIG9mIHRoZSBpbWFnZSwgd2hpY2ggaXMKCSAgICAgKiBndWVzc2VkIHRvIGNvbnRhaW4gaXQuIFRoaXMgbWV0aG9kIHVzZXMge0BsaW5rIEFsaWdubWVudFBhdHRlcm59LjwvcD4KCSAgICAgKgoJICAgICAqIEBwYXJhbSBvdmVyYWxsRXN0TW9kdWxlU2l6ZSBlc3RpbWF0ZWQgbW9kdWxlIHNpemUgc28gZmFyCgkgICAgICogQHBhcmFtIGVzdEFsaWdubWVudFggeCBjb29yZGluYXRlIG9mIGNlbnRlciBvZiBhcmVhIHByb2JhYmx5IGNvbnRhaW5pbmcgYWxpZ25tZW50IHBhdHRlcm4KCSAgICAgKiBAcGFyYW0gZXN0QWxpZ25tZW50WSB5IGNvb3JkaW5hdGUgb2YgYWJvdmUKCSAgICAgKiBAcGFyYW0gYWxsb3dhbmNlRmFjdG9yIG51bWJlciBvZiBwaXhlbHMgaW4gYWxsIGRpcmVjdGlvbnMgdG8gc2VhcmNoIGZyb20gdGhlIGNlbnRlcgoJICAgICAqIEByZXR1cm4ge0BsaW5rIEFsaWdubWVudFBhdHRlcm59IGlmIGZvdW5kLCBvciBudWxsIG90aGVyd2lzZQoJICAgICAqIEB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnMgZHVyaW5nIGRldGVjdGlvbgoJICAgICAqLwoJICAgIERldGVjdG9yLnByb3RvdHlwZS5maW5kQWxpZ25tZW50SW5SZWdpb24gPSBmdW5jdGlvbiAob3ZlcmFsbEVzdE1vZHVsZVNpemUgLypmbG9hdCovLCBlc3RBbGlnbm1lbnRYIC8qaW50Ki8sIGVzdEFsaWdubWVudFkgLyppbnQqLywgYWxsb3dhbmNlRmFjdG9yIC8qZmxvYXQqLykgewoJICAgICAgICAvLyBMb29rIGZvciBhbiBhbGlnbm1lbnQgcGF0dGVybiAoMyBtb2R1bGVzIGluIHNpemUpIGFyb3VuZCB3aGVyZSBpdAoJICAgICAgICAvLyBzaG91bGQgYmUKCSAgICAgICAgdmFyIGFsbG93YW5jZSA9IC8qKGludCkgKi8gTWF0aC5mbG9vcihhbGxvd2FuY2VGYWN0b3IgKiBvdmVyYWxsRXN0TW9kdWxlU2l6ZSk7CgkgICAgICAgIHZhciBhbGlnbm1lbnRBcmVhTGVmdFggPSBNYXRoLm1heCgwLCBlc3RBbGlnbm1lbnRYIC0gYWxsb3dhbmNlKTsKCSAgICAgICAgdmFyIGFsaWdubWVudEFyZWFSaWdodFggPSBNYXRoLm1pbih0aGlzLmltYWdlLmdldFdpZHRoKCkgLSAxLCBlc3RBbGlnbm1lbnRYICsgYWxsb3dhbmNlKTsKCSAgICAgICAgaWYgKGFsaWdubWVudEFyZWFSaWdodFggLSBhbGlnbm1lbnRBcmVhTGVmdFggPCBvdmVyYWxsRXN0TW9kdWxlU2l6ZSAqIDMpIHsKCSAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbl8xJDEuZGVmYXVsdCgnQWxpZ25tZW50IHRvcCBleGNlZWRzIGVzdGltYXRlZCBtb2R1bGUgc2l6ZS4nKTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgYWxpZ25tZW50QXJlYVRvcFkgPSBNYXRoLm1heCgwLCBlc3RBbGlnbm1lbnRZIC0gYWxsb3dhbmNlKTsKCSAgICAgICAgdmFyIGFsaWdubWVudEFyZWFCb3R0b21ZID0gTWF0aC5taW4odGhpcy5pbWFnZS5nZXRIZWlnaHQoKSAtIDEsIGVzdEFsaWdubWVudFkgKyBhbGxvd2FuY2UpOwoJICAgICAgICBpZiAoYWxpZ25tZW50QXJlYUJvdHRvbVkgLSBhbGlnbm1lbnRBcmVhVG9wWSA8IG92ZXJhbGxFc3RNb2R1bGVTaXplICogMykgewoJICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uXzEkMS5kZWZhdWx0KCdBbGlnbm1lbnQgYm90dG9tIGV4Y2VlZHMgZXN0aW1hdGVkIG1vZHVsZSBzaXplLicpOwoJICAgICAgICB9CgkgICAgICAgIHZhciBhbGlnbm1lbnRGaW5kZXIgPSBuZXcgQWxpZ25tZW50UGF0dGVybkZpbmRlcl8xLmRlZmF1bHQodGhpcy5pbWFnZSwgYWxpZ25tZW50QXJlYUxlZnRYLCBhbGlnbm1lbnRBcmVhVG9wWSwgYWxpZ25tZW50QXJlYVJpZ2h0WCAtIGFsaWdubWVudEFyZWFMZWZ0WCwgYWxpZ25tZW50QXJlYUJvdHRvbVkgLSBhbGlnbm1lbnRBcmVhVG9wWSwgb3ZlcmFsbEVzdE1vZHVsZVNpemUsIHRoaXMucmVzdWx0UG9pbnRDYWxsYmFjayk7CgkgICAgICAgIHJldHVybiBhbGlnbm1lbnRGaW5kZXIuZmluZCgpOwoJICAgIH07CgkgICAgcmV0dXJuIERldGVjdG9yOwoJfSgpKTsKCURldGVjdG9yJDEuZGVmYXVsdCA9IERldGVjdG9yOwoKCS8qCgkgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCgkgKgoJICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CgkgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCgkgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCSAqCgkgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoJICoKCSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKCSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCgkgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KCSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKCSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoJICovCglPYmplY3QuZGVmaW5lUHJvcGVydHkoUVJDb2RlUmVhZGVyJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCS8qbmFtZXNwYWNlIGNvbS5nb29nbGUuenhpbmcucXJjb2RlIHsqLwoJdmFyIEJhcmNvZGVGb3JtYXRfMSA9IEJhcmNvZGVGb3JtYXQkMTsKCXZhciBCaXRNYXRyaXhfMSA9IEJpdE1hdHJpeCQxOwoJdmFyIERlY29kZUhpbnRUeXBlXzEgPSBEZWNvZGVIaW50VHlwZSQxOwoJdmFyIE5vdEZvdW5kRXhjZXB0aW9uXzEgPSBOb3RGb3VuZEV4Y2VwdGlvbiQxOwoJdmFyIFJlc3VsdF8xID0gUmVzdWx0JDE7Cgl2YXIgUmVzdWx0TWV0YWRhdGFUeXBlXzEgPSBSZXN1bHRNZXRhZGF0YVR5cGUkMTsKCS8vIGltcG9ydCBEZXRlY3RvclJlc3VsdCBmcm9tICcuLi9jb21tb24vRGV0ZWN0b3JSZXN1bHQnOwoJdmFyIERlY29kZXJfMSA9IERlY29kZXIkMTsKCXZhciBRUkNvZGVEZWNvZGVyTWV0YURhdGFfMSA9IFFSQ29kZURlY29kZXJNZXRhRGF0YSQxOwoJdmFyIERldGVjdG9yXzEgPSBEZXRlY3RvciQxOwoJLyppbXBvcnQgamF2YS51dGlsLkxpc3Q7Ki8KCS8qaW1wb3J0IGphdmEudXRpbC5NYXA7Ki8KCS8qKgoJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gZGV0ZWN0IGFuZCBkZWNvZGUgUVIgQ29kZXMgaW4gYW4gaW1hZ2UuCgkgKgoJICogQGF1dGhvciBTZWFuIE93ZW4KCSAqLwoJdmFyIFFSQ29kZVJlYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKCSAgICBmdW5jdGlvbiBRUkNvZGVSZWFkZXIoKSB7CgkgICAgICAgIHRoaXMuZGVjb2RlciA9IG5ldyBEZWNvZGVyXzEuZGVmYXVsdCgpOwoJICAgIH0KCSAgICBRUkNvZGVSZWFkZXIucHJvdG90eXBlLmdldERlY29kZXIgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAgIHJldHVybiB0aGlzLmRlY29kZXI7CgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBMb2NhdGVzIGFuZCBkZWNvZGVzIGEgUVIgY29kZSBpbiBhbiBpbWFnZS4KCSAgICAgKgoJICAgICAqIEByZXR1cm4gYSByZXByZXNlbnRpbmc6IHN0cmluZyB0aGUgY29udGVudCBlbmNvZGVkIGJ5IHRoZSBRUiBjb2RlCgkgICAgICogQHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhIFFSIGNvZGUgY2Fubm90IGJlIGZvdW5kCgkgICAgICogQHRocm93cyBGb3JtYXRFeGNlcHRpb24gaWYgYSBRUiBjb2RlIGNhbm5vdCBiZSBkZWNvZGVkCgkgICAgICogQHRocm93cyBDaGVja3N1bUV4Y2VwdGlvbiBpZiBlcnJvciBjb3JyZWN0aW9uIGZhaWxzCgkgICAgICovCgkgICAgLypAT3ZlcnJpZGUqLwoJICAgIC8vIHB1YmxpYyBkZWNvZGUoaW1hZ2U6IEJpbmFyeUJpdG1hcCk6IFJlc3VsdCAvKnRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiwgQ2hlY2tzdW1FeGNlcHRpb24sIEZvcm1hdEV4Y2VwdGlvbiAqLyB7CgkgICAgLy8gICByZXR1cm4gdGhpcy5kZWNvZGUoaW1hZ2UsIG51bGwpCgkgICAgLy8gfQoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBRUkNvZGVSZWFkZXIucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChpbWFnZSwgaGludHMpIHsKCSAgICAgICAgdmFyIGRlY29kZXJSZXN1bHQ7CgkgICAgICAgIHZhciBwb2ludHM7CgkgICAgICAgIGlmIChoaW50cyAhPT0gdW5kZWZpbmVkICYmIGhpbnRzICE9PSBudWxsICYmIHVuZGVmaW5lZCAhPT0gaGludHMuZ2V0KERlY29kZUhpbnRUeXBlXzEuZGVmYXVsdC5QVVJFX0JBUkNPREUpKSB7CgkgICAgICAgICAgICB2YXIgYml0cyA9IFFSQ29kZVJlYWRlci5leHRyYWN0UHVyZUJpdHMoaW1hZ2UuZ2V0QmxhY2tNYXRyaXgoKSk7CgkgICAgICAgICAgICBkZWNvZGVyUmVzdWx0ID0gdGhpcy5kZWNvZGVyLmRlY29kZUJpdE1hdHJpeChiaXRzLCBoaW50cyk7CgkgICAgICAgICAgICBwb2ludHMgPSBRUkNvZGVSZWFkZXIuTk9fUE9JTlRTOwoJICAgICAgICB9CgkgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgdmFyIGRldGVjdG9yUmVzdWx0ID0gbmV3IERldGVjdG9yXzEuZGVmYXVsdChpbWFnZS5nZXRCbGFja01hdHJpeCgpKS5kZXRlY3QoaGludHMpOwoJICAgICAgICAgICAgZGVjb2RlclJlc3VsdCA9IHRoaXMuZGVjb2Rlci5kZWNvZGVCaXRNYXRyaXgoZGV0ZWN0b3JSZXN1bHQuZ2V0Qml0cygpLCBoaW50cyk7CgkgICAgICAgICAgICBwb2ludHMgPSBkZXRlY3RvclJlc3VsdC5nZXRQb2ludHMoKTsKCSAgICAgICAgfQoJICAgICAgICAvLyBJZiB0aGUgY29kZSB3YXMgbWlycm9yZWQ6IHN3YXAgdGhlIGJvdHRvbS1sZWZ0IGFuZCB0aGUgdG9wLXJpZ2h0IHBvaW50cy4KCSAgICAgICAgaWYgKGRlY29kZXJSZXN1bHQuZ2V0T3RoZXIoKSBpbnN0YW5jZW9mIFFSQ29kZURlY29kZXJNZXRhRGF0YV8xLmRlZmF1bHQpIHsKCSAgICAgICAgICAgIGRlY29kZXJSZXN1bHQuZ2V0T3RoZXIoKS5hcHBseU1pcnJvcmVkQ29ycmVjdGlvbihwb2ludHMpOwoJICAgICAgICB9CgkgICAgICAgIHZhciByZXN1bHQgPSBuZXcgUmVzdWx0XzEuZGVmYXVsdChkZWNvZGVyUmVzdWx0LmdldFRleHQoKSwgZGVjb2RlclJlc3VsdC5nZXRSYXdCeXRlcygpLCB1bmRlZmluZWQsIHBvaW50cywgQmFyY29kZUZvcm1hdF8xLmRlZmF1bHQuUVJfQ09ERSwgdW5kZWZpbmVkKTsKCSAgICAgICAgdmFyIGJ5dGVTZWdtZW50cyA9IGRlY29kZXJSZXN1bHQuZ2V0Qnl0ZVNlZ21lbnRzKCk7CgkgICAgICAgIGlmIChieXRlU2VnbWVudHMgIT09IG51bGwpIHsKCSAgICAgICAgICAgIHJlc3VsdC5wdXRNZXRhZGF0YShSZXN1bHRNZXRhZGF0YVR5cGVfMS5kZWZhdWx0LkJZVEVfU0VHTUVOVFMsIGJ5dGVTZWdtZW50cyk7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIGVjTGV2ZWwgPSBkZWNvZGVyUmVzdWx0LmdldEVDTGV2ZWwoKTsKCSAgICAgICAgaWYgKGVjTGV2ZWwgIT09IG51bGwpIHsKCSAgICAgICAgICAgIHJlc3VsdC5wdXRNZXRhZGF0YShSZXN1bHRNZXRhZGF0YVR5cGVfMS5kZWZhdWx0LkVSUk9SX0NPUlJFQ1RJT05fTEVWRUwsIGVjTGV2ZWwpOwoJICAgICAgICB9CgkgICAgICAgIGlmIChkZWNvZGVyUmVzdWx0Lmhhc1N0cnVjdHVyZWRBcHBlbmQoKSkgewoJICAgICAgICAgICAgcmVzdWx0LnB1dE1ldGFkYXRhKFJlc3VsdE1ldGFkYXRhVHlwZV8xLmRlZmF1bHQuU1RSVUNUVVJFRF9BUFBFTkRfU0VRVUVOQ0UsIGRlY29kZXJSZXN1bHQuZ2V0U3RydWN0dXJlZEFwcGVuZFNlcXVlbmNlTnVtYmVyKCkpOwoJICAgICAgICAgICAgcmVzdWx0LnB1dE1ldGFkYXRhKFJlc3VsdE1ldGFkYXRhVHlwZV8xLmRlZmF1bHQuU1RSVUNUVVJFRF9BUFBFTkRfUEFSSVRZLCBkZWNvZGVyUmVzdWx0LmdldFN0cnVjdHVyZWRBcHBlbmRQYXJpdHkoKSk7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICB9OwoJICAgIC8qQE92ZXJyaWRlKi8KCSAgICBRUkNvZGVSZWFkZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICAvLyBkbyBub3RoaW5nCgkgICAgfTsKCSAgICAvKioKCSAgICAgKiBUaGlzIG1ldGhvZCBkZXRlY3RzIGEgY29kZSBpbiBhICJwdXJlIiBpbWFnZSAtLSB0aGF0IGlzLCBwdXJlIG1vbm9jaHJvbWUgaW1hZ2UKCSAgICAgKiB3aGljaCBjb250YWlucyBvbmx5IGFuIHVucm90YXRlZCwgdW5za2V3ZWQsIGltYWdlIG9mIGEgY29kZSwgd2l0aCBzb21lIHdoaXRlIGJvcmRlcgoJICAgICAqIGFyb3VuZCBpdC4gVGhpcyBpcyBhIHNwZWNpYWxpemVkIG1ldGhvZCB0aGF0IHdvcmtzIGV4Y2VwdGlvbmFsbHkgZmFzdCBpbiB0aGlzIHNwZWNpYWwKCSAgICAgKiBjYXNlLgoJICAgICAqCgkgICAgICogQHNlZSBjb20uZ29vZ2xlLnp4aW5nLmRhdGFtYXRyaXguRGF0YU1hdHJpeFJlYWRlciNleHRyYWN0UHVyZUJpdHMoQml0TWF0cml4KQoJICAgICAqLwoJICAgIFFSQ29kZVJlYWRlci5leHRyYWN0UHVyZUJpdHMgPSBmdW5jdGlvbiAoaW1hZ2UpIHsKCSAgICAgICAgdmFyIGxlZnRUb3BCbGFjayA9IGltYWdlLmdldFRvcExlZnRPbkJpdCgpOwoJICAgICAgICB2YXIgcmlnaHRCb3R0b21CbGFjayA9IGltYWdlLmdldEJvdHRvbVJpZ2h0T25CaXQoKTsKCSAgICAgICAgaWYgKGxlZnRUb3BCbGFjayA9PT0gbnVsbCB8fCByaWdodEJvdHRvbUJsYWNrID09PSBudWxsKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIG1vZHVsZVNpemUgPSB0aGlzLm1vZHVsZVNpemUobGVmdFRvcEJsYWNrLCBpbWFnZSk7CgkgICAgICAgIHZhciB0b3AgPSBsZWZ0VG9wQmxhY2tbMV07CgkgICAgICAgIHZhciBib3R0b20gPSByaWdodEJvdHRvbUJsYWNrWzFdOwoJICAgICAgICB2YXIgbGVmdCA9IGxlZnRUb3BCbGFja1swXTsKCSAgICAgICAgdmFyIHJpZ2h0ID0gcmlnaHRCb3R0b21CbGFja1swXTsKCSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIQoJICAgICAgICBpZiAobGVmdCA+PSByaWdodCB8fCB0b3AgPj0gYm90dG9tKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKGJvdHRvbSAtIHRvcCAhPT0gcmlnaHQgLSBsZWZ0KSB7CgkgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UsIHdoZXJlIGJvdHRvbS1yaWdodCBtb2R1bGUgd2Fzbid0IGJsYWNrIHNvIHdlIGZvdW5kIHNvbWV0aGluZyBlbHNlIGluIHRoZSBsYXN0IHJvdwoJICAgICAgICAgICAgLy8gQXNzdW1lIGl0J3MgYSBzcXVhcmUsIHNvIHVzZSBoZWlnaHQgYXMgdGhlIHdpZHRoCgkgICAgICAgICAgICByaWdodCA9IGxlZnQgKyAoYm90dG9tIC0gdG9wKTsKCSAgICAgICAgICAgIGlmIChyaWdodCA+PSBpbWFnZS5nZXRXaWR0aCgpKSB7CgkgICAgICAgICAgICAgICAgLy8gQWJvcnQgaWYgdGhhdCB3b3VsZCBub3QgbWFrZSBzZW5zZSAtLSBvZmYgaW1hZ2UKCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgdmFyIG1hdHJpeFdpZHRoID0gTWF0aC5yb3VuZCgocmlnaHQgLSBsZWZ0ICsgMSkgLyBtb2R1bGVTaXplKTsKCSAgICAgICAgdmFyIG1hdHJpeEhlaWdodCA9IE1hdGgucm91bmQoKGJvdHRvbSAtIHRvcCArIDEpIC8gbW9kdWxlU2l6ZSk7CgkgICAgICAgIGlmIChtYXRyaXhXaWR0aCA8PSAwIHx8IG1hdHJpeEhlaWdodCA8PSAwKSB7CgkgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKG1hdHJpeEhlaWdodCAhPT0gbWF0cml4V2lkdGgpIHsKCSAgICAgICAgICAgIC8vIE9ubHkgcG9zc2libHkgZGVjb2RlIHNxdWFyZSByZWdpb25zCgkgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgIH0KCSAgICAgICAgLy8gUHVzaCBpbiB0aGUgImJvcmRlciIgYnkgaGFsZiB0aGUgbW9kdWxlIHdpZHRoIHNvIHRoYXQgd2Ugc3RhcnQKCSAgICAgICAgLy8gc2FtcGxpbmcgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbW9kdWxlLiBKdXN0IGluIGNhc2UgdGhlIGltYWdlIGlzIGEKCSAgICAgICAgLy8gbGl0dGxlIG9mZiwgdGhpcyB3aWxsIGhlbHAgcmVjb3Zlci4KCSAgICAgICAgdmFyIG51ZGdlID0gLyooaW50KSAqLyBNYXRoLmZsb29yKG1vZHVsZVNpemUgLyAyLjApOwoJICAgICAgICB0b3AgKz0gbnVkZ2U7CgkgICAgICAgIGxlZnQgKz0gbnVkZ2U7CgkgICAgICAgIC8vIEJ1dCBjYXJlZnVsIHRoYXQgdGhpcyBkb2VzIG5vdCBzYW1wbGUgb2ZmIHRoZSBlZGdlCgkgICAgICAgIC8vICJyaWdodCIgaXMgdGhlIGZhcnRoZXN0LXJpZ2h0IHZhbGlkIHBpeGVsIGxvY2F0aW9uIC0tIHJpZ2h0KzEgaXMgbm90IG5lY2Vzc2FyaWx5CgkgICAgICAgIC8vIFRoaXMgaXMgcG9zaXRpdmUgYnkgaG93IG11Y2ggdGhlIGlubmVyIHggbG9vcCBiZWxvdyB3b3VsZCBiZSB0b28gbGFyZ2UKCSAgICAgICAgdmFyIG51ZGdlZFRvb0ZhclJpZ2h0ID0gbGVmdCArIC8qKGludCkgKi8gTWF0aC5mbG9vcigobWF0cml4V2lkdGggLSAxKSAqIG1vZHVsZVNpemUpIC0gcmlnaHQ7CgkgICAgICAgIGlmIChudWRnZWRUb29GYXJSaWdodCA+IDApIHsKCSAgICAgICAgICAgIGlmIChudWRnZWRUb29GYXJSaWdodCA+IG51ZGdlKSB7CgkgICAgICAgICAgICAgICAgLy8gTmVpdGhlciB3YXkgZml0czsgYWJvcnQKCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBsZWZ0IC09IG51ZGdlZFRvb0ZhclJpZ2h0OwoJICAgICAgICB9CgkgICAgICAgIC8vIFNlZSBsb2dpYyBhYm92ZQoJICAgICAgICB2YXIgbnVkZ2VkVG9vRmFyRG93biA9IHRvcCArIC8qKGludCkgKi8gTWF0aC5mbG9vcigobWF0cml4SGVpZ2h0IC0gMSkgKiBtb2R1bGVTaXplKSAtIGJvdHRvbTsKCSAgICAgICAgaWYgKG51ZGdlZFRvb0ZhckRvd24gPiAwKSB7CgkgICAgICAgICAgICBpZiAobnVkZ2VkVG9vRmFyRG93biA+IG51ZGdlKSB7CgkgICAgICAgICAgICAgICAgLy8gTmVpdGhlciB3YXkgZml0czsgYWJvcnQKCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb25fMS5kZWZhdWx0KCk7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICB0b3AgLT0gbnVkZ2VkVG9vRmFyRG93bjsKCSAgICAgICAgfQoJICAgICAgICAvLyBOb3cganVzdCByZWFkIG9mZiB0aGUgYml0cwoJICAgICAgICB2YXIgYml0cyA9IG5ldyBCaXRNYXRyaXhfMS5kZWZhdWx0KG1hdHJpeFdpZHRoLCBtYXRyaXhIZWlnaHQpOwoJICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IG1hdHJpeEhlaWdodDsgeSsrKSB7CgkgICAgICAgICAgICB2YXIgaU9mZnNldCA9IHRvcCArIC8qKGludCkgKi8gTWF0aC5mbG9vcih5ICogbW9kdWxlU2l6ZSk7CgkgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IG1hdHJpeFdpZHRoOyB4KyspIHsKCSAgICAgICAgICAgICAgICBpZiAoaW1hZ2UuZ2V0KGxlZnQgKyAvKihpbnQpICovIE1hdGguZmxvb3IoeCAqIG1vZHVsZVNpemUpLCBpT2Zmc2V0KSkgewoJICAgICAgICAgICAgICAgICAgICBiaXRzLnNldCh4LCB5KTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIGJpdHM7CgkgICAgfTsKCSAgICBRUkNvZGVSZWFkZXIubW9kdWxlU2l6ZSA9IGZ1bmN0aW9uIChsZWZ0VG9wQmxhY2ssIGltYWdlKSB7CgkgICAgICAgIHZhciBoZWlnaHQgPSBpbWFnZS5nZXRIZWlnaHQoKTsKCSAgICAgICAgdmFyIHdpZHRoID0gaW1hZ2UuZ2V0V2lkdGgoKTsKCSAgICAgICAgdmFyIHggPSBsZWZ0VG9wQmxhY2tbMF07CgkgICAgICAgIHZhciB5ID0gbGVmdFRvcEJsYWNrWzFdOwoJICAgICAgICB2YXIgaW5CbGFjayA9IHRydWU7CgkgICAgICAgIHZhciB0cmFuc2l0aW9ucyA9IDA7CgkgICAgICAgIHdoaWxlICh4IDwgd2lkdGggJiYgeSA8IGhlaWdodCkgewoJICAgICAgICAgICAgaWYgKGluQmxhY2sgIT09IGltYWdlLmdldCh4LCB5KSkgewoJICAgICAgICAgICAgICAgIGlmICgrK3RyYW5zaXRpb25zID09PSA1KSB7CgkgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBpbkJsYWNrID0gIWluQmxhY2s7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICB4Kys7CgkgICAgICAgICAgICB5Kys7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHggPT09IHdpZHRoIHx8IHkgPT09IGhlaWdodCkgewoJICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uXzEuZGVmYXVsdCgpOwoJICAgICAgICB9CgkgICAgICAgIHJldHVybiAoeCAtIGxlZnRUb3BCbGFja1swXSkgLyA3LjA7CgkgICAgfTsKCSAgICBRUkNvZGVSZWFkZXIuTk9fUE9JTlRTID0gbmV3IEFycmF5KCk7CgkgICAgcmV0dXJuIFFSQ29kZVJlYWRlcjsKCX0oKSk7Cgl2YXIgX2RlZmF1bHQgPSBRUkNvZGVSZWFkZXIkMS5kZWZhdWx0ID0gUVJDb2RlUmVhZGVyOwoKCXZhciB0b0dyYXlzY2FsZUJ1ZmZlciA9IGZ1bmN0aW9uIHRvR3JheXNjYWxlQnVmZmVyKGltYWdlQnVmZmVyLCB3aWR0aCwgaGVpZ2h0KSB7CgkgIHZhciBncmF5c2NhbGVCdWZmZXIgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQpOwoKCSAgZm9yICh2YXIgaSA9IDAsIGogPSAwLCBsZW5ndGhfMSA9IGltYWdlQnVmZmVyLmxlbmd0aDsgaSA8IGxlbmd0aF8xOyBpICs9IDQsIGorKykgewoJICAgIHZhciBncmF5ID0gdm9pZCAwOwoJICAgIHZhciBhbHBoYSA9IGltYWdlQnVmZmVyW2kgKyAzXTsgLy8gVGhlIGNvbG9yIG9mIGZ1bGx5LXRyYW5zcGFyZW50IHBpeGVscyBpcyBpcnJlbGV2YW50LiBUaGV5IGFyZSBvZnRlbiwgdGVjaG5pY2FsbHksIGZ1bGx5LXRyYW5zcGFyZW50CgkgICAgLy8gYmxhY2sgKDAgYWxwaGEsIGFuZCB0aGVuIDAgUkdCKS4gVGhleSBhcmUgb2Z0ZW4gdXNlZCwgb2YgY291cnNlIGFzIHRoZSAid2hpdGUiIGFyZWEgaW4gYQoJICAgIC8vIGJhcmNvZGUgaW1hZ2UuIEZvcmNlIGFueSBzdWNoIHBpeGVsIHRvIGJlIHdoaXRlOgoKCSAgICBpZiAoYWxwaGEgPT09IDApIHsKCSAgICAgIGdyYXkgPSAweEZGOwoJICAgIH0gZWxzZSB7CgkgICAgICB2YXIgcGl4ZWxSID0gaW1hZ2VCdWZmZXJbaV07CgkgICAgICB2YXIgcGl4ZWxHID0gaW1hZ2VCdWZmZXJbaSArIDFdOwoJICAgICAgdmFyIHBpeGVsQiA9IGltYWdlQnVmZmVyW2kgKyAyXTsgLy8gLjI5OVIgKyAwLjU4N0cgKyAwLjExNEIgKFlVVi9ZSVEgZm9yIFBBTCBhbmQgTlRTQyksCgkgICAgICAvLyAoMzA2KlIpID4+IDEwIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gUiowLjI5OSwgYW5kIHNvIG9uLgoJICAgICAgLy8gMHgyMDAgPj4gMTAgaXMgMC41LCBpdCBpbXBsZW1lbnRzIHJvdW5kaW5nLgoKCSAgICAgIGdyYXkgPSAzMDYgKiBwaXhlbFIgKyA2MDEgKiBwaXhlbEcgKyAxMTcgKiBwaXhlbEIgKyAweDIwMCA+PiAxMDsKCSAgICB9CgoJICAgIGdyYXlzY2FsZUJ1ZmZlcltqXSA9IGdyYXk7CgkgIH0KCgkgIHJldHVybiBncmF5c2NhbGVCdWZmZXI7Cgl9OwoKCXZhciByZWFkZXIgPSBuZXcgX2RlZmF1bHQoKTsKCXNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7CgkgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzCgkgIHRyeSB7CgkgICAgdmFyIGx1bWluYW5jZXMgPSB0b0dyYXlzY2FsZUJ1ZmZlcihlLmRhdGEuZGF0YSwgZS5kYXRhLndpZHRoLCBlLmRhdGEuaGVpZ2h0KTsKCSAgICB2YXIgbHVtaW5hbmNlU291cmNlID0gbmV3IF9kZWZhdWx0JDEobHVtaW5hbmNlcywgZS5kYXRhLndpZHRoLCBlLmRhdGEuaGVpZ2h0KTsKCSAgICB2YXIgaHlicmlkQmluYXJpemVyID0gbmV3IF9kZWZhdWx0JDIobHVtaW5hbmNlU291cmNlKTsKCSAgICB2YXIgYmluYXJ5Qml0bWFwID0gbmV3IF9kZWZhdWx0JDMoaHlicmlkQmluYXJpemVyKTsKCSAgICB2YXIgZGVjb2RlZCA9IHJlYWRlci5kZWNvZGUoYmluYXJ5Qml0bWFwKTsKCSAgICBwb3N0TWVzc2FnZShkZWNvZGVkKTsKCSAgfSBjYXRjaCAoZXJyKSB7CgkgICAgcG9zdE1lc3NhZ2UobnVsbCk7CgkgIH0KCX0pOwoKfSkoKTsKCg==', null, false);\n /* eslint-enable */\n\n var _excluded = [\"constraints\", \"onError\", \"onLoad\", \"onScan\", \"resolution\", \"qrArea\"];\n\n function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\n function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\n var createWorker = function createWorker() {\n return new WorkerFactory();\n };\n\n var stopMediaStream = function stopMediaStream(stream) {\n if (stream) {\n if (stream.getVideoTracks && stream.getAudioTracks) {\n stream.getVideoTracks().forEach(function (track) {\n stream.removeTrack(track);\n track.stop();\n });\n stream.getAudioTracks().forEach(function (track) {\n stream.removeTrack(track);\n track.stop();\n });\n } else {\n stream.stop();\n }\n }\n };\n\n var Reader = function Reader(props) {\n var constraints = props.constraints,\n onError = props.onError,\n onLoad = props.onLoad,\n onScan = props.onScan,\n resolution = props.resolution,\n qrArea = props.qrArea,\n other = _objectWithoutProperties(props, _excluded);\n\n var streamRef = React__namespace.useRef(null);\n var videoEl = React__namespace.useRef(null);\n var canvasEl = React__namespace.useRef(document.createElement(\"canvas\"));\n var ctxRef = React__namespace.useRef(null);\n var requestRef = React__namespace.useRef();\n\n var _React$useState = React__namespace.useState(null),\n _React$useState2 = _slicedToArray(_React$useState, 2),\n src = _React$useState2[0],\n setSrc = _React$useState2[1];\n\n var isProcessingRef = React__namespace.useRef(false);\n var workerRef = React__namespace.useRef();\n React__namespace.useEffect(function () {\n workerRef.current = createWorker();\n var worker = workerRef.current;\n\n worker.onmessage = function (e) {\n if (onScan) onScan(e.data ? _objectSpread(_objectSpread({}, e.data), {}, {\n canvas: canvasEl.current\n }) : null);\n isProcessingRef.current = false;\n };\n\n return function () {\n worker.terminate();\n };\n }, [onScan]);\n var qrAreaStr = JSON.stringify(qrArea);\n var check = React__namespace.useCallback(function () {\n var qrArea = JSON.parse(qrAreaStr);\n var worker = workerRef.current;\n var videoIsPlaying = videoEl.current && videoEl.current.readyState === videoEl.current.HAVE_ENOUGH_DATA;\n\n if (!isProcessingRef.current && videoIsPlaying) {\n isProcessingRef.current = true; // Get image/video dimensions\n\n var width = videoEl.current.videoWidth;\n var height = videoEl.current.videoHeight;\n var greatestSize = width > height ? width : height;\n var ratio = Math.floor(resolution / greatestSize * 100) / 100;\n height = Math.floor(ratio * height);\n width = Math.floor(ratio * width);\n canvasEl.current.width = width;\n canvasEl.current.height = height;\n ctxRef.current = canvasEl.current.getContext(\"2d\");\n ctxRef.current.drawImage(videoEl.current, 0, 0, width, height);\n var imageData;\n\n if (qrArea && qrArea.length === 2 && qrArea[0] > 0 && qrArea[1] > 0) {\n imageData = ctxRef.current.getImageData(Math.floor((width - qrArea[0]) / 2), Math.floor((height - qrArea[1]) / 2), qrArea[0], qrArea[1]);\n } else {\n imageData = ctxRef.current.getImageData(0, 0, width, height);\n } // Send data to web-worker\n\n\n worker.postMessage(imageData);\n }\n\n requestRef.current = requestAnimationFrame(check);\n }, [resolution, qrAreaStr]);\n var constraintsStr = JSON.stringify(constraints);\n React__namespace.useEffect(function () {\n var constraints = JSON.parse(constraintsStr);\n var isSubscribed = true;\n navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {\n if (!isSubscribed) {\n stopMediaStream(stream);\n } else {\n streamRef.current = stream;\n\n try {\n if (videoEl.current) {\n videoEl.current.srcObject = stream;\n videoEl.current.setAttribute(\"playsinline\", true); // required to tell iOS safari we don't want fullscreen\n }\n } catch (error) {\n setSrc(window.URL.createObjectURL(stream));\n }\n\n if (onLoad) onLoad();\n requestRef.current = requestAnimationFrame(check);\n }\n })[\"catch\"](function (error) {\n return isSubscribed ? onError(error) : null;\n });\n return function () {\n cancelAnimationFrame(requestRef.current);\n isSubscribed = false;\n stopMediaStream(streamRef.current);\n\n if (src) {\n window.URL.revokeObjectURL(src);\n }\n };\n }, [check, constraintsStr, onError, onLoad, src]);\n return /*#__PURE__*/React__namespace.createElement(\"video\", _extends({\n autoPlay: true,\n playsInline: true,\n src: src,\n ref: videoEl\n }, other));\n };\n\n Reader.propTypes = {\n constraints: PropTypes.object,\n onError: PropTypes.func.isRequired,\n onLoad: PropTypes.func,\n onScan: PropTypes.func.isRequired,\n resolution: PropTypes.number,\n qrArea: PropTypes.array\n };\n Reader.defaultProps = {\n constraints: {\n audio: false,\n video: true\n },\n resolution: 640,\n qrArea: []\n };\n\n return Reader;\n\n}));\n","import PostgrestBuilder from './PostgrestBuilder'\nimport { GetResult } from './select-query-parser/result'\nimport { GenericSchema } from './types'\n\nexport default class PostgrestTransformBuilder<\n Schema extends GenericSchema,\n Row extends Record,\n Result,\n RelationName = unknown,\n Relationships = unknown\n> extends PostgrestBuilder {\n /**\n * Perform a SELECT on the query result.\n *\n * By default, `.insert()`, `.update()`, `.upsert()`, and `.delete()` do not\n * return modified rows. By calling this method, modified rows are returned in\n * `data`.\n *\n * @param columns - The columns to retrieve, separated by commas\n */\n select<\n Query extends string = '*',\n NewResultOne = GetResult\n >(\n columns?: Query\n ): PostgrestTransformBuilder {\n // Remove whitespaces except when quoted\n let quoted = false\n const cleanedColumns = (columns ?? '*')\n .split('')\n .map((c) => {\n if (/\\s/.test(c) && !quoted) {\n return ''\n }\n if (c === '\"') {\n quoted = !quoted\n }\n return c\n })\n .join('')\n this.url.searchParams.set('select', cleanedColumns)\n if (this.headers['Prefer']) {\n this.headers['Prefer'] += ','\n }\n this.headers['Prefer'] += 'return=representation'\n return this as unknown as PostgrestTransformBuilder<\n Schema,\n Row,\n NewResultOne[],\n RelationName,\n Relationships\n >\n }\n\n order(\n column: ColumnName,\n options?: { ascending?: boolean; nullsFirst?: boolean; referencedTable?: undefined }\n ): this\n order(\n column: string,\n options?: { ascending?: boolean; nullsFirst?: boolean; referencedTable?: string }\n ): this\n /**\n * @deprecated Use `options.referencedTable` instead of `options.foreignTable`\n */\n order(\n column: ColumnName,\n options?: { ascending?: boolean; nullsFirst?: boolean; foreignTable?: undefined }\n ): this\n /**\n * @deprecated Use `options.referencedTable` instead of `options.foreignTable`\n */\n order(\n column: string,\n options?: { ascending?: boolean; nullsFirst?: boolean; foreignTable?: string }\n ): this\n /**\n * Order the query result by `column`.\n *\n * You can call this method multiple times to order by multiple columns.\n *\n * You can order referenced tables, but it only affects the ordering of the\n * parent table if you use `!inner` in the query.\n *\n * @param column - The column to order by\n * @param options - Named parameters\n * @param options.ascending - If `true`, the result will be in ascending order\n * @param options.nullsFirst - If `true`, `null`s appear first. If `false`,\n * `null`s appear last.\n * @param options.referencedTable - Set this to order a referenced table by\n * its columns\n * @param options.foreignTable - Deprecated, use `options.referencedTable`\n * instead\n */\n order(\n column: string,\n {\n ascending = true,\n nullsFirst,\n foreignTable,\n referencedTable = foreignTable,\n }: {\n ascending?: boolean\n nullsFirst?: boolean\n foreignTable?: string\n referencedTable?: string\n } = {}\n ): this {\n const key = referencedTable ? `${referencedTable}.order` : 'order'\n const existingOrder = this.url.searchParams.get(key)\n\n this.url.searchParams.set(\n key,\n `${existingOrder ? `${existingOrder},` : ''}${column}.${ascending ? 'asc' : 'desc'}${\n nullsFirst === undefined ? '' : nullsFirst ? '.nullsfirst' : '.nullslast'\n }`\n )\n return this\n }\n\n /**\n * Limit the query result by `count`.\n *\n * @param count - The maximum number of rows to return\n * @param options - Named parameters\n * @param options.referencedTable - Set this to limit rows of referenced\n * tables instead of the parent table\n * @param options.foreignTable - Deprecated, use `options.referencedTable`\n * instead\n */\n limit(\n count: number,\n {\n foreignTable,\n referencedTable = foreignTable,\n }: { foreignTable?: string; referencedTable?: string } = {}\n ): this {\n const key = typeof referencedTable === 'undefined' ? 'limit' : `${referencedTable}.limit`\n this.url.searchParams.set(key, `${count}`)\n return this\n }\n\n /**\n * Limit the query result by starting at an offset `from` and ending at the offset `to`.\n * Only records within this range are returned.\n * This respects the query order and if there is no order clause the range could behave unexpectedly.\n * The `from` and `to` values are 0-based and inclusive: `range(1, 3)` will include the second, third\n * and fourth rows of the query.\n *\n * @param from - The starting index from which to limit the result\n * @param to - The last index to which to limit the result\n * @param options - Named parameters\n * @param options.referencedTable - Set this to limit rows of referenced\n * tables instead of the parent table\n * @param options.foreignTable - Deprecated, use `options.referencedTable`\n * instead\n */\n range(\n from: number,\n to: number,\n {\n foreignTable,\n referencedTable = foreignTable,\n }: { foreignTable?: string; referencedTable?: string } = {}\n ): this {\n const keyOffset =\n typeof referencedTable === 'undefined' ? 'offset' : `${referencedTable}.offset`\n const keyLimit = typeof referencedTable === 'undefined' ? 'limit' : `${referencedTable}.limit`\n this.url.searchParams.set(keyOffset, `${from}`)\n // Range is inclusive, so add 1\n this.url.searchParams.set(keyLimit, `${to - from + 1}`)\n return this\n }\n\n /**\n * Set the AbortSignal for the fetch request.\n *\n * @param signal - The AbortSignal to use for the fetch request\n */\n abortSignal(signal: AbortSignal): this {\n this.signal = signal\n return this\n }\n\n /**\n * Return `data` as a single object instead of an array of objects.\n *\n * Query result must be one row (e.g. using `.limit(1)`), otherwise this\n * returns an error.\n */\n single<\n ResultOne = Result extends (infer ResultOne)[] ? ResultOne : never\n >(): PostgrestBuilder {\n this.headers['Accept'] = 'application/vnd.pgrst.object+json'\n return this as unknown as PostgrestBuilder\n }\n\n /**\n * Return `data` as a single object instead of an array of objects.\n *\n * Query result must be zero or one row (e.g. using `.limit(1)`), otherwise\n * this returns an error.\n */\n maybeSingle<\n ResultOne = Result extends (infer ResultOne)[] ? ResultOne : never\n >(): PostgrestBuilder {\n // Temporary partial fix for https://github.com/supabase/postgrest-js/issues/361\n // Issue persists e.g. for `.insert([...]).select().maybeSingle()`\n if (this.method === 'GET') {\n this.headers['Accept'] = 'application/json'\n } else {\n this.headers['Accept'] = 'application/vnd.pgrst.object+json'\n }\n this.isMaybeSingle = true\n return this as unknown as PostgrestBuilder\n }\n\n /**\n * Return `data` as a string in CSV format.\n */\n csv(): PostgrestBuilder {\n this.headers['Accept'] = 'text/csv'\n return this as unknown as PostgrestBuilder\n }\n\n /**\n * Return `data` as an object in [GeoJSON](https://geojson.org) format.\n */\n geojson(): PostgrestBuilder> {\n this.headers['Accept'] = 'application/geo+json'\n return this as unknown as PostgrestBuilder>\n }\n\n /**\n * Return `data` as the EXPLAIN plan for the query.\n *\n * You need to enable the\n * [db_plan_enabled](https://supabase.com/docs/guides/database/debugging-performance#enabling-explain)\n * setting before using this method.\n *\n * @param options - Named parameters\n *\n * @param options.analyze - If `true`, the query will be executed and the\n * actual run time will be returned\n *\n * @param options.verbose - If `true`, the query identifier will be returned\n * and `data` will include the output columns of the query\n *\n * @param options.settings - If `true`, include information on configuration\n * parameters that affect query planning\n *\n * @param options.buffers - If `true`, include information on buffer usage\n *\n * @param options.wal - If `true`, include information on WAL record generation\n *\n * @param options.format - The format of the output, can be `\"text\"` (default)\n * or `\"json\"`\n */\n explain({\n analyze = false,\n verbose = false,\n settings = false,\n buffers = false,\n wal = false,\n format = 'text',\n }: {\n analyze?: boolean\n verbose?: boolean\n settings?: boolean\n buffers?: boolean\n wal?: boolean\n format?: 'json' | 'text'\n } = {}): PostgrestBuilder[]> | PostgrestBuilder {\n const options = [\n analyze ? 'analyze' : null,\n verbose ? 'verbose' : null,\n settings ? 'settings' : null,\n buffers ? 'buffers' : null,\n wal ? 'wal' : null,\n ]\n .filter(Boolean)\n .join('|')\n // An Accept header can carry multiple media types but postgrest-js always sends one\n const forMediatype = this.headers['Accept'] ?? 'application/json'\n this.headers[\n 'Accept'\n ] = `application/vnd.pgrst.plan+${format}; for=\"${forMediatype}\"; options=${options};`\n if (format === 'json') return this as unknown as PostgrestBuilder[]>\n else return this as unknown as PostgrestBuilder\n }\n\n /**\n * Rollback the query.\n *\n * `data` will still be returned, but the query is not committed.\n */\n rollback(): this {\n if ((this.headers['Prefer'] ?? '').trim().length > 0) {\n this.headers['Prefer'] += ',tx=rollback'\n } else {\n this.headers['Prefer'] = 'tx=rollback'\n }\n return this\n }\n\n /**\n * Override the type of the returned `data`.\n *\n * @typeParam NewResult - The new result type to override with\n */\n returns(): PostgrestTransformBuilder<\n Schema,\n Row,\n NewResult,\n RelationName,\n Relationships\n > {\n return this as unknown as PostgrestTransformBuilder<\n Schema,\n Row,\n NewResult,\n RelationName,\n Relationships\n >\n }\n}\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","export const version = '1.18.1'\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * Error format\n *\n * {@link https://postgrest.org/en/stable/api.html?highlight=options#errors-and-http-status-codes}\n */\nexport default class PostgrestError extends Error {\n details: string\n hint: string\n code: string\n\n constructor(context: { message: string; details: string; hint: string; code: string }) {\n super(context.message)\n this.name = 'PostgrestError'\n this.details = context.details\n this.hint = context.hint\n this.code = context.code\n }\n}\n","\"use strict\";\n\n// ref: https://github.com/tc39/proposal-global\nvar getGlobal = function() {\n // the only reliable means to get the global object is\n // `Function('return this')()`\n // However, this causes CSP violations in Chrome apps.\n if (typeof self !== 'undefined') { return self; }\n if (typeof window !== 'undefined') { return window; }\n if (typeof global !== 'undefined') { return global; }\n throw new Error('unable to locate global object');\n}\n\nvar globalObject = getGlobal();\n\nexport const fetch = globalObject.fetch;\n\nexport default globalObject.fetch.bind(globalObject);\n\nexport const Headers = globalObject.Headers;\nexport const Request = globalObject.Request;\nexport const Response = globalObject.Response;\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ba=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;cb}return!1}function q(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new q(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new q(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new q(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new q(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new q(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new q(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new q(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new q(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new q(a,5,!1,a.toLowerCase(),null,!1,!1)});var pa=/[\\-:]([a-z])/g;function qa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(pa,\nqa);z[b]=new q(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(pa,qa);z[b]=new q(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(pa,qa);z[b]=new q(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new q(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new q(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new q(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ra(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"\")&&(k=k.replace(\"\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{La=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ka(a):\"\"}\nfunction Na(a){switch(a.tag){case 5:return Ka(a.type);case 16:return Ka(\"Lazy\");case 13:return Ka(\"Suspense\");case 19:return Ka(\"SuspenseList\");case 0:case 2:case 15:return a=Ma(a.type,!1),a;case 11:return a=Ma(a.type.render,!1),a;case 1:return a=Ma(a.type,!0),a;default:return\"\"}}\nfunction Oa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case va:return\"Fragment\";case ua:return\"Portal\";case xa:return\"Profiler\";case wa:return\"StrictMode\";case Ca:return\"Suspense\";case Da:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Aa:return(a.displayName||\"Context\")+\".Consumer\";case ya:return(a._context.displayName||\"Context\")+\".Provider\";case Ba:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ea:return b=a.displayName||null,null!==b?b:Oa(a.type)||\"Memo\";case Fa:b=a._payload;a=a._init;try{return Oa(a(b))}catch(c){}}return null}\nfunction Pa(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Oa(b);case 8:return b===wa?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Qa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ra(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Sa(a){var b=Ra(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Ta(a){a._valueTracker||(a._valueTracker=Sa(a))}function Ua(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ra(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Va(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Wa(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Xa(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Qa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function Ya(a,b){b=b.checked;null!=b&&ra(a,\"checked\",b,!1)}\nfunction Za(a,b){Ya(a,b);var c=Qa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?$a(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&$a(a,b.type,Qa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction ab(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction $a(a,b,c){if(\"number\"!==b||Va(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var bb=Array.isArray;\nfunction cb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e\"+b.valueOf().toString()+\"\";for(b=jb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction lb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar mb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},nb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(mb).forEach(function(a){nb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);mb[b]=mb[a]})});function ob(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||mb.hasOwnProperty(a)&&mb[a]?(\"\"+b).trim():b+\"px\"}\nfunction pb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=ob(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var qb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction rb(a,b){if(b){if(qb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction sb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var tb=null;function ub(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var vb=null,wb=null,xb=null;\nfunction yb(a){if(a=zb(a)){if(\"function\"!==typeof vb)throw Error(p(280));var b=a.stateNode;b&&(b=Ab(b),vb(a.stateNode,a.type,b))}}function Bb(a){wb?xb?xb.push(a):xb=[a]:wb=a}function Cb(){if(wb){var a=wb,b=xb;xb=wb=null;yb(a);if(b)for(a=0;a>>=0;return 0===a?32:31-(mc(a)/nc|0)|0}var oc=64,pc=4194304;\nfunction qc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function rc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=qc(h):(f&=g,0!==f&&(d=qc(f)))}else g=c&~e,0!==g?d=qc(g):0!==f&&(d=qc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0c;c++)b.push(a);return b}function wc(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-lc(b);a[b]=c}\nfunction xc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0=Xd),$d=String.fromCharCode(32),ae=!1;\nfunction be(a,b){switch(a){case \"keyup\":return-1!==Vd.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function ce(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var de=!1;function ee(a,b){switch(a){case \"compositionend\":return ce(b);case \"keypress\":if(32!==b.which)return null;ae=!0;return $d;case \"textInput\":return a=b.data,a===$d&&ae?null:a;default:return null}}\nfunction fe(a,b){if(de)return\"compositionend\"===a||!Wd&&be(a,b)?(a=id(),hd=gd=fd=null,de=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Ee(c)}}function Ge(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Ge(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction He(){for(var a=window,b=Va();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Va(a.document)}return b}function Ie(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Je(a){var b=He(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Ge(c.ownerDocument.documentElement,c)){if(null!==d&&Ie(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Fe(c,f);var g=Fe(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Le=null,Me=null,Ne=null,Oe=!1;\nfunction Pe(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Oe||null==Le||Le!==Va(d)||(d=Le,\"selectionStart\"in d&&Ie(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Ne&&De(Ne,d)||(Ne=d,d=je(Me,\"onSelect\"),0Nf||(a.current=Mf[Nf],Mf[Nf]=null,Nf--)}function H(a,b){Nf++;Mf[Nf]=a.current;a.current=b}var Pf={},I=Of(Pf),Qf=Of(!1),Rf=Pf;function Sf(a,b){var c=a.type.contextTypes;if(!c)return Pf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Tf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Uf(){G(Qf);G(I)}function Vf(a,b,c){if(I.current!==Pf)throw Error(p(168));H(I,b);H(Qf,c)}function Wf(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Pa(a)||\"Unknown\",e));return A({},c,d)}\nfunction Xf(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Pf;Rf=I.current;H(I,a);H(Qf,Qf.current);return!0}function Yf(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=Wf(a,b,Rf),d.__reactInternalMemoizedMergedChildContext=a,G(Qf),G(I),H(I,a)):G(Qf);H(Qf,c)}var Zf=null,$f=!1,ag=!1;function bg(a){null===Zf?Zf=[a]:Zf.push(a)}function cg(a){$f=!0;bg(a)}\nfunction dg(){if(!ag&&null!==Zf){ag=!0;var a=0,b=E;try{var c=Zf;for(E=1;a>=g;e-=g;Rg=1<<32-lc(b)+e|c<r?(x=m,m=null):x=m.sibling;var t=u(e,m,h[r],k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,r);null===n?l=t:n.sibling=t;n=t;m=x}if(r===h.length)return c(e,m),N&&Tg(e,r),l;if(null===m){for(;rr?(x=n,n=null):x=n.sibling;var v=u(e,n,t.value,k);if(null===v){null===n&&(n=x);break}a&&n&&null===v.alternate&&b(e,n);g=f(v,g,r);null===m?l=v:m.sibling=v;m=v;n=x}if(t.done)return c(e,\nn),N&&Tg(e,r),l;if(null===n){for(;!t.done;r++,t=h.next())t=w(e,t.value,k),null!==t&&(g=f(t,g,r),null===m?l=t:m.sibling=t,m=t);N&&Tg(e,r);return l}for(n=d(e,n);!t.done;r++,t=h.next())t=y(n,e,r,t.value,k),null!==t&&(a&&null!==t.alternate&&n.delete(null===t.key?r:t.key),g=f(t,g,r),null===m?l=t:m.sibling=t,m=t);a&&n.forEach(function(a){return b(e,a)});N&&Tg(e,r);return l}function C(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===va&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case ta:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===va){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Fa&&kh(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=ih(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===va?(d=qh(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=oh(f.type,f.key,f.props,null,a.mode,h),h.ref=ih(a,d,f),h.return=a,a=h)}return g(a);case ua:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=ph(f,a.mode,h);d.return=a;a=d}return g(a);case Fa:return l=f._init,C(a,d,l(f._payload),h)}if(bb(f))return n(a,d,f,h);if(Ia(f))return v(a,d,f,h);jh(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=nh(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return C}var rh=lh(!0),sh=lh(!1),th={},uh=Of(th),vh=Of(th),wh=Of(th);function xh(a){if(a===th)throw Error(p(174));return a}function yh(a,b){H(wh,b);H(vh,a);H(uh,th);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:ib(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=ib(b,a)}G(uh);H(uh,b)}function zh(){G(uh);G(vh);G(wh)}\nfunction Ah(a){xh(wh.current);var b=xh(uh.current);var c=ib(b,a.type);b!==c&&(H(vh,a),H(uh,c))}function Bh(a){vh.current===a&&(G(uh),G(vh))}var P=Of(0);\nfunction Ch(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||\"$?\"===c.data||\"$!\"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&128))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var Dh=[];\nfunction Eh(){for(var a=0;ac?c:4;a(!0);var d=Gh.transition;Gh.transition={};try{a(!1),b()}finally{E=c,Gh.transition=d}}function ti(){return Uh().memoizedState}function ui(a,b,c){var d=Dg(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};vi(a)?wi(b,c):(xi(a,b,c),c=M(),a=Eg(a,d,c),null!==a&&yi(a,b,d))}\nfunction gi(a,b,c){var d=Dg(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(vi(a))wi(b,e);else{xi(a,b,e);var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(Ce(h,g))return}catch(k){}finally{}c=M();a=Eg(a,d,c);null!==a&&yi(a,b,d)}}function vi(a){var b=a.alternate;return a===Q||null!==b&&b===Q}\nfunction wi(a,b){Jh=Ih=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function xi(a,b,c){null!==J&&0!==(a.mode&1)&&0===(K&2)?(a=b.interleaved,null===a?(c.next=c,null===qg?qg=[b]:qg.push(b)):(c.next=a.next,a.next=c),b.interleaved=c):(a=b.pending,null===a?c.next=c:(c.next=a.next,a.next=c),b.pending=c)}function yi(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;yc(a,c)}}\nvar Rh={readContext:pg,useCallback:U,useContext:U,useEffect:U,useImperativeHandle:U,useInsertionEffect:U,useLayoutEffect:U,useMemo:U,useReducer:U,useRef:U,useState:U,useDebugValue:U,useDeferredValue:U,useTransition:U,useMutableSource:U,useSyncExternalStore:U,useId:U,unstable_isNewReconciler:!1},Oh={readContext:pg,useCallback:function(a,b){Th().memoizedState=[a,void 0===b?null:b];return a},useContext:pg,useEffect:ki,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ii(4194308,\n4,ni.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ii(4194308,4,a,b)},useInsertionEffect:function(a,b){return ii(4,2,a,b)},useMemo:function(a,b){var c=Th();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=ui.bind(null,Q,a);return[d.memoizedState,a]},useRef:function(a){var b=\nTh();a={current:a};return b.memoizedState=a},useState:fi,useDebugValue:pi,useDeferredValue:function(a){var b=fi(a),c=b[0],d=b[1];ki(function(){var b=Gh.transition;Gh.transition={};try{d(a)}finally{Gh.transition=b}},[a]);return c},useTransition:function(){var a=fi(!1),b=a[0];a=si.bind(null,a[1]);Th().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=Q,e=Th();if(N){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===J)throw Error(p(349));\n0!==(Hh&30)||di(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;ki(ai.bind(null,d,f,a),[a]);d.flags|=2048;bi(9,ci.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Th(),b=J.identifierPrefix;if(N){var c=Sg;var d=Rg;c=(d&~(1<<32-lc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Kh++;0\\x3c/script>\",a=a.removeChild(a.firstChild)):\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):\n(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[If]=b;a[Jf]=d;Li(a,b,!1,!1);b.stateNode=a;a:{g=sb(c,d);switch(c){case \"dialog\":F(\"cancel\",a);F(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":F(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;eTi&&(b.flags|=128,d=!0,Pi(f,!1),b.lanes=4194304)}else{if(!d)if(a=Ch(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,\nnull!==c&&(b.updateQueue=c,b.flags|=4),Pi(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!N)return V(b),null}else 2*D()-f.renderingStartTime>Ti&&1073741824!==c&&(b.flags|=128,d=!0,Pi(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=b,f.tail=b.sibling,f.renderingStartTime=D(),b.sibling=null,c=P.current,H(P,d?c&1|2:c&1),b;V(b);return null;case 22:case 23:return Ui(),d=null!==\nb.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(Vi&1073741824)&&(V(b),b.subtreeFlags&6&&(b.flags|=8192)):V(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}var Wi=sa.ReactCurrentOwner,og=!1;function Xi(a,b,c,d){b.child=null===a?sh(b,null,c,d):rh(b,a.child,c,d)}\nfunction Yi(a,b,c,d,e){c=c.render;var f=b.ref;ng(b,e);d=Nh(a,b,c,d,f,e);c=Sh();if(null!==a&&!og)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Zi(a,b,e);N&&c&&Vg(b);b.flags|=1;Xi(a,b,d,e);return b.child}\nfunction $i(a,b,c,d,e){if(null===a){var f=c.type;if(\"function\"===typeof f&&!aj(f)&&void 0===f.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=f,bj(a,b,f,d,e);a=oh(c.type,null,d,b,b.mode,e);a.ref=b.ref;a.return=b;return b.child=a}f=a.child;if(0===(a.lanes&e)){var g=f.memoizedProps;c=c.compare;c=null!==c?c:De;if(c(g,d)&&a.ref===b.ref)return Zi(a,b,e)}b.flags|=1;a=mh(f,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction bj(a,b,c,d,e){if(null!==a&&De(a.memoizedProps,d)&&a.ref===b.ref)if(og=!1,0!==(a.lanes&e))0!==(a.flags&131072)&&(og=!0);else return b.lanes=a.lanes,Zi(a,b,e);return cj(a,b,c,d,e)}\nfunction dj(a,b,c){var d=b.pendingProps,e=d.children,f=null!==a?a.memoizedState:null;if(\"hidden\"===d.mode)if(0===(b.mode&1))b.memoizedState={baseLanes:0,cachePool:null},H(ej,Vi),Vi|=c;else if(0!==(c&1073741824))b.memoizedState={baseLanes:0,cachePool:null},d=null!==f?f.baseLanes:c,H(ej,Vi),Vi|=d;else return a=null!==f?f.baseLanes|c:c,b.lanes=b.childLanes=1073741824,b.memoizedState={baseLanes:a,cachePool:null},b.updateQueue=null,H(ej,Vi),Vi|=a,null;else null!==f?(d=f.baseLanes|c,b.memoizedState=null):\nd=c,H(ej,Vi),Vi|=d;Xi(a,b,e,c);return b.child}function fj(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.flags|=512,b.flags|=2097152}function cj(a,b,c,d,e){var f=Tf(c)?Rf:I.current;f=Sf(b,f);ng(b,e);c=Nh(a,b,c,d,f,e);d=Sh();if(null!==a&&!og)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Zi(a,b,e);N&&d&&Vg(b);b.flags|=1;Xi(a,b,c,e);return b.child}\nfunction gj(a,b,c,d,e){if(Tf(c)){var f=!0;Xf(b)}else f=!1;ng(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2),Hg(b,c,d),Jg(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=pg(l):(l=Tf(c)?Rf:I.current,l=Sf(b,l));var m=c.getDerivedStateFromProps,w=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;w||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\n\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Ig(b,g,d,l);rg=!1;var u=b.memoizedState;g.state=u;yg(b,d,g,e);k=b.memoizedState;h!==d||u!==k||Qf.current||rg?(\"function\"===typeof m&&(Cg(b,c,m,d),k=b.memoizedState),(h=rg||Gg(b,c,h,d,u,k,l))?(w||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===\ntypeof g.componentDidMount&&(b.flags|=4194308)):(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),d=!1)}else{g=b.stateNode;tg(a,b);h=b.memoizedProps;l=b.type===b.elementType?h:fg(b.type,h);g.props=l;w=b.pendingProps;u=g.context;k=c.contextType;\"object\"===typeof k&&null!==k?k=pg(k):(k=Tf(c)?Rf:I.current,k=Sf(b,k));var y=c.getDerivedStateFromProps;(m=\"function\"===\ntypeof y||\"function\"===typeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==w||u!==k)&&Ig(b,g,d,k);rg=!1;u=b.memoizedState;g.state=u;yg(b,d,g,e);var n=b.memoizedState;h!==w||u!==n||Qf.current||rg?(\"function\"===typeof y&&(Cg(b,c,y,d),n=b.memoizedState),(l=rg||Gg(b,c,l,d,u,n,k)||!1)?(m||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&\ng.componentWillUpdate(d,n,k),\"function\"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,n,k)),\"function\"===typeof g.componentDidUpdate&&(b.flags|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.flags|=1024)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&u===a.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&u===a.memoizedState||(b.flags|=1024),b.memoizedProps=d,b.memoizedState=n),g.props=d,g.state=n,g.context=\nk,d=l):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&u===a.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&u===a.memoizedState||(b.flags|=1024),d=!1)}return hj(a,b,c,d,f,e)}\nfunction hj(a,b,c,d,e,f){fj(a,b);var g=0!==(b.flags&128);if(!d&&!g)return e&&Yf(b,c,!1),Zi(a,b,f);d=b.stateNode;Wi.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.flags|=1;null!==a&&g?(b.child=rh(b,a.child,null,f),b.child=rh(b,null,h,f)):Xi(a,b,h,f);b.memoizedState=d.state;e&&Yf(b,c,!0);return b.child}function ij(a){var b=a.stateNode;b.pendingContext?Vf(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Vf(a,b.context,!1);yh(a,b.containerInfo)}\nfunction jj(a,b,c,d,e){gh();hh(e);b.flags|=256;Xi(a,b,c,d);return b.child}var kj={dehydrated:null,treeContext:null,retryLane:0};function lj(a){return{baseLanes:a,cachePool:null}}\nfunction mj(a,b,c){var d=b.pendingProps,e=P.current,f=!1,g=0!==(b.flags&128),h;(h=g)||(h=null!==a&&null===a.memoizedState?!1:0!==(e&2));if(h)f=!0,b.flags&=-129;else if(null===a||null!==a.memoizedState)e|=1;H(P,e&1);if(null===a){dh(b);a=b.memoizedState;if(null!==a&&(a=a.dehydrated,null!==a))return 0===(b.mode&1)?b.lanes=1:\"$!\"===a.data?b.lanes=8:b.lanes=1073741824,null;e=d.children;a=d.fallback;return f?(d=b.mode,f=b.child,e={mode:\"hidden\",children:e},0===(d&1)&&null!==f?(f.childLanes=0,f.pendingProps=\ne):f=nj(e,d,0,null),a=qh(a,d,c,null),f.return=b,a.return=b,f.sibling=a,b.child=f,b.child.memoizedState=lj(c),b.memoizedState=kj,a):oj(b,e)}e=a.memoizedState;if(null!==e){h=e.dehydrated;if(null!==h){if(g){if(b.flags&256)return b.flags&=-257,pj(a,b,c,Error(p(422)));if(null!==b.memoizedState)return b.child=a.child,b.flags|=128,null;f=d.fallback;e=b.mode;d=nj({mode:\"visible\",children:d.children},e,0,null);f=qh(f,e,c,null);f.flags|=2;d.return=b;f.return=b;d.sibling=f;b.child=d;0!==(b.mode&1)&&rh(b,a.child,\nnull,c);b.child.memoizedState=lj(c);b.memoizedState=kj;return f}if(0===(b.mode&1))b=pj(a,b,c,null);else if(\"$!\"===h.data)b=pj(a,b,c,Error(p(419)));else if(d=0!==(c&a.childLanes),og||d){d=J;if(null!==d){switch(c&-c){case 4:f=2;break;case 16:f=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:f=32;break;case 536870912:f=\n268435456;break;default:f=0}d=0!==(f&(d.suspendedLanes|c))?0:f;0!==d&&d!==e.retryLane&&(e.retryLane=d,Eg(a,d,-1))}Si();b=pj(a,b,c,Error(p(421)))}else\"$?\"===h.data?(b.flags|=128,b.child=a.child,b=qj.bind(null,a),h._reactRetry=b,b=null):(c=e.treeContext,Yg=Ff(h.nextSibling),Xg=b,N=!0,Zg=null,null!==c&&(Og[Pg++]=Rg,Og[Pg++]=Sg,Og[Pg++]=Qg,Rg=c.id,Sg=c.overflow,Qg=b),b=oj(b,b.pendingProps.children),b.flags|=4096);return b}if(f)return d=rj(a,b,d.children,d.fallback,c),f=b.child,e=a.child.memoizedState,\nf.memoizedState=null===e?lj(c):{baseLanes:e.baseLanes|c,cachePool:null},f.childLanes=a.childLanes&~c,b.memoizedState=kj,d;c=sj(a,b,d.children,c);b.memoizedState=null;return c}if(f)return d=rj(a,b,d.children,d.fallback,c),f=b.child,e=a.child.memoizedState,f.memoizedState=null===e?lj(c):{baseLanes:e.baseLanes|c,cachePool:null},f.childLanes=a.childLanes&~c,b.memoizedState=kj,d;c=sj(a,b,d.children,c);b.memoizedState=null;return c}\nfunction oj(a,b){b=nj({mode:\"visible\",children:b},a.mode,0,null);b.return=a;return a.child=b}function sj(a,b,c,d){var e=a.child;a=e.sibling;c=mh(e,{mode:\"visible\",children:c});0===(b.mode&1)&&(c.lanes=d);c.return=b;c.sibling=null;null!==a&&(d=b.deletions,null===d?(b.deletions=[a],b.flags|=16):d.push(a));return b.child=c}\nfunction rj(a,b,c,d,e){var f=b.mode;a=a.child;var g=a.sibling,h={mode:\"hidden\",children:c};0===(f&1)&&b.child!==a?(c=b.child,c.childLanes=0,c.pendingProps=h,b.deletions=null):(c=mh(a,h),c.subtreeFlags=a.subtreeFlags&14680064);null!==g?d=mh(g,d):(d=qh(d,f,e,null),d.flags|=2);d.return=b;c.return=b;c.sibling=d;b.child=c;return d}function pj(a,b,c,d){null!==d&&hh(d);rh(b,a.child,null,c);a=oj(b,b.pendingProps.children);a.flags|=2;b.memoizedState=null;return a}\nfunction tj(a,b,c){a.lanes|=b;var d=a.alternate;null!==d&&(d.lanes|=b);mg(a.return,b,c)}function uj(a,b,c,d,e){var f=a.memoizedState;null===f?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailMode:e}:(f.isBackwards=b,f.rendering=null,f.renderingStartTime=0,f.last=d,f.tail=c,f.tailMode=e)}\nfunction vj(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;Xi(a,b,d.children,c);d=P.current;if(0!==(d&2))d=d&1|2,b.flags|=128;else{if(null!==a&&0!==(a.flags&128))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&tj(a,c,b);else if(19===a.tag)tj(a,c,b);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}H(P,d);if(0===(b.mode&1))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===Ch(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);uj(b,!1,e,c,f);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===Ch(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}uj(b,!0,c,null,f);break;case \"together\":uj(b,!1,null,null,void 0);break;default:b.memoizedState=null}return b.child}\nfunction Zi(a,b,c){null!==a&&(b.dependencies=a.dependencies);zg|=b.lanes;if(0===(c&b.childLanes))return null;if(null!==a&&b.child!==a.child)throw Error(p(153));if(null!==b.child){a=b.child;c=mh(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=mh(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}\nfunction wj(a,b,c){switch(b.tag){case 3:ij(b);gh();break;case 5:Ah(b);break;case 1:Tf(b.type)&&Xf(b);break;case 4:yh(b,b.stateNode.containerInfo);break;case 10:var d=b.type._context,e=b.memoizedProps.value;H(gg,d._currentValue);d._currentValue=e;break;case 13:d=b.memoizedState;if(null!==d){if(null!==d.dehydrated)return H(P,P.current&1),b.flags|=128,null;if(0!==(c&b.child.childLanes))return mj(a,b,c);H(P,P.current&1);a=Zi(a,b,c);return null!==a?a.sibling:null}H(P,P.current&1);break;case 19:d=0!==(c&\nb.childLanes);if(0!==(a.flags&128)){if(d)return vj(a,b,c);b.flags|=128}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);H(P,P.current);if(d)break;else return null;case 22:case 23:return b.lanes=0,dj(a,b,c)}return Zi(a,b,c)}\nfunction xj(a,b){Wg(b);switch(b.tag){case 1:return Tf(b.type)&&Uf(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return zh(),G(Qf),G(I),Eh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Bh(b),null;case 13:G(P);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));gh()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return G(P),null;case 4:return zh(),null;case 10:return lg(b.type._context),null;case 22:case 23:return Ui(),\nnull;case 24:return null;default:return null}}var yj=!1,zj=!1,Aj=\"function\"===typeof WeakSet?WeakSet:Set,X=null;function Bj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){Cj(a,b,d)}else c.current=null}function Dj(a,b,c){try{c()}catch(d){Cj(a,b,d)}}var Ej=!1;\nfunction Fj(a,b){a=He();if(Ie(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(O){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,w=a,u=null;b:for(;;){for(var y;;){w!==c||0!==e&&3!==w.nodeType||(h=g+e);w!==f||0!==d&&3!==w.nodeType||(k=g+d);3===w.nodeType&&(g+=w.nodeValue.length);\nif(null===(y=w.firstChild))break;u=w;w=y}for(;;){if(w===a)break b;u===c&&++l===e&&(h=g);u===f&&++m===d&&(k=g);if(null!==(y=w.nextSibling))break;w=u;u=w.parentNode}w=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;xf={focusedElem:a,selectionRange:c};for(X=b;null!==X;)if(b=X,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,X=a;else for(;null!==X;){b=X;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;case 1:if(null!==\nn){var v=n.memoizedProps,C=n.memoizedState,t=b.stateNode,r=t.getSnapshotBeforeUpdate(b.elementType===b.type?v:fg(b.type,v),C);t.__reactInternalSnapshotBeforeUpdate=r}break;case 3:var x=b.stateNode.containerInfo;if(1===x.nodeType)x.textContent=\"\";else if(9===x.nodeType){var B=x.body;null!=B&&(B.textContent=\"\")}break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(O){Cj(b,b.return,O)}a=b.sibling;if(null!==a){a.return=b.return;X=a;break}X=b.return}n=Ej;Ej=!1;return n}\nfunction Gj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Dj(b,c,f)}e=e.next}while(e!==d)}}function Hj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Ij(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Jj(a,b,c){if(ic&&\"function\"===typeof ic.onCommitFiberUnmount)try{ic.onCommitFiberUnmount(hc,b)}catch(g){}switch(b.tag){case 0:case 11:case 14:case 15:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a=a.next;do{var e=d,f=e.destroy;e=e.tag;void 0!==f&&(0!==(e&2)?Dj(b,c,f):0!==(e&4)&&Dj(b,c,f));d=d.next}while(d!==a)}break;case 1:Bj(b,c);a=b.stateNode;if(\"function\"===typeof a.componentWillUnmount)try{a.props=b.memoizedProps,a.state=b.memoizedState,a.componentWillUnmount()}catch(g){Cj(b,\nc,g)}break;case 5:Bj(b,c);break;case 4:Kj(a,b,c)}}function Lj(a){var b=a.alternate;null!==b&&(a.alternate=null,Lj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[If],delete b[Jf],delete b[jf],delete b[Kf],delete b[Lf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Mj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Nj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Mj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Oj(a){a:{for(var b=a.return;null!==b;){if(Mj(b))break a;b=b.return}throw Error(p(160));}var c=b;switch(c.tag){case 5:b=c.stateNode;c.flags&32&&(lb(b,\"\"),c.flags&=-33);c=Nj(a);Pj(a,c,b);break;case 3:case 4:b=c.stateNode.containerInfo;c=Nj(a);Qj(a,c,b);break;default:throw Error(p(161));}}\nfunction Qj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=wf));else if(4!==d&&(a=a.child,null!==a))for(Qj(a,b,c),a=a.sibling;null!==a;)Qj(a,b,c),a=a.sibling}\nfunction Pj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Pj(a,b,c),a=a.sibling;null!==a;)Pj(a,b,c),a=a.sibling}\nfunction Kj(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(p(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=a,k=d,l=c,m=k;;)if(Jj(h,m,l),null!==m.child&&4!==m.tag)m.child.return=m,m=m.child;else{if(m===k)break a;for(;null===m.sibling;){if(null===m.return||m.return===k)break a;m=m.return}m.sibling.return=m.return;m=m.sibling}g?(h=\nf,k=d.stateNode,8===h.nodeType?h.parentNode.removeChild(k):h.removeChild(k)):f.removeChild(d.stateNode)}else if(18===d.tag)g?(h=f,k=d.stateNode,8===h.nodeType?Ef(h.parentNode,k):1===h.nodeType&&Ef(h,k),Yc(h)):Ef(f,d.stateNode);else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Jj(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&\n(e=!1)}d.sibling.return=d.return;d=d.sibling}}\nfunction Rj(a,b){switch(b.tag){case 0:case 11:case 14:case 15:Gj(3,b,b.return);Hj(3,b);Gj(5,b,b.return);return;case 1:return;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){\"input\"===a&&\"radio\"===d.type&&null!=d.name&&Ya(c,d);sb(a,e);b=sb(a,d);for(e=0;ee&&(e=g);d&=~f}d=e;d=D()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*bk(d/1960))-d;if(10a?16:a;if(null===lk)var d=!1;else{a=lk;lk=null;mk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(X=a.current;null!==X;){var f=X,g=f.child;if(0!==(X.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;kD()-Vj?Ak(a,0):hk|=c);tk(a,b)}function Ok(a,b){0===b&&(0===(a.mode&1)?b=1:(b=pc,pc<<=1,0===(pc&130023424)&&(pc=4194304)));var c=M();a=rk(a,b);null!==a&&(wc(a,b,c),tk(a,c))}function qj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Ok(a,c)}\nfunction Tj(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Ok(a,c)}var Lk;\nLk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Qf.current)og=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return og=!1,wj(a,b,c);og=0!==(a.flags&131072)?!0:!1}else og=!1,N&&0!==(b.flags&1048576)&&Ug(b,Ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2);a=b.pendingProps;var e=Sf(b,I.current);ng(b,c);e=Nh(null,b,d,a,e,c);var f=Sh();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?\n(b.tag=1,b.memoizedState=null,b.updateQueue=null,Tf(d)?(f=!0,Xf(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,sg(b),e.updater=Fg,b.stateNode=e,e._reactInternals=b,Jg(b,d,a,c),b=hj(null,b,d,!0,f,c)):(b.tag=0,N&&f&&Vg(b),Xi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Pk(d);a=fg(d,a);switch(e){case 0:b=cj(null,b,d,a,c);break a;case 1:b=gj(null,b,\nd,a,c);break a;case 11:b=Yi(null,b,d,a,c);break a;case 14:b=$i(null,b,d,fg(d.type,a),c);break a}throw Error(p(306,d,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:fg(d,e),cj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:fg(d,e),gj(a,b,d,e,c);case 3:a:{ij(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;tg(a,b);yg(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,\ncache:g.cache,transitions:g.transitions},b.updateQueue.baseState=f,b.memoizedState=f,b.flags&256){e=Error(p(423));b=jj(a,b,d,c,e);break a}else if(d!==e){e=Error(p(424));b=jj(a,b,d,c,e);break a}else for(Yg=Ff(b.stateNode.containerInfo.firstChild),Xg=b,N=!0,Zg=null,c=sh(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{gh();if(d===e){b=Zi(a,b,c);break a}Xi(a,b,d,c)}b=b.child}return b;case 5:return Ah(b),null===a&&dh(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,\nyf(d,e)?g=null:null!==f&&yf(d,f)&&(b.flags|=32),fj(a,b),Xi(a,b,g,c),b.child;case 6:return null===a&&dh(b),null;case 13:return mj(a,b,c);case 4:return yh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=rh(b,null,d,c):Xi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:fg(d,e),Yi(a,b,d,e,c);case 7:return Xi(a,b,b.pendingProps,c),b.child;case 8:return Xi(a,b,b.pendingProps.children,c),b.child;case 12:return Xi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=\nb.type._context;e=b.pendingProps;f=b.memoizedProps;g=e.value;H(gg,d._currentValue);d._currentValue=g;if(null!==f)if(Ce(f.value,g)){if(f.children===e.children&&!Qf.current){b=Zi(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=ug(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=\nc;k=f.alternate;null!==k&&(k.lanes|=c);mg(f.return,c,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);mg(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Xi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,\nng(b,c),e=pg(e),d=d(e),b.flags|=1,Xi(a,b,d,c),b.child;case 14:return d=b.type,e=fg(d,b.pendingProps),e=fg(d.type,e),$i(a,b,d,e,c);case 15:return bj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:fg(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2),b.tag=1,Tf(d)?(a=!0,Xf(b)):a=!1,ng(b,c),Hg(b,d,e),Jg(b,d,e,c),hj(null,b,d,!0,a,c);case 19:return vj(a,b,c);case 22:return dj(a,b,c)}throw Error(p(156,b.tag));};function vk(a,b){return Yb(a,b)}\nfunction Qk(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function ah(a,b,c,d){return new Qk(a,b,c,d)}function aj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Pk(a){if(\"function\"===typeof a)return aj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Ba)return 11;if(a===Ea)return 14}return 2}\nfunction mh(a,b){var c=a.alternate;null===c?(c=ah(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction oh(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)aj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case va:return qh(c.children,e,f,b);case wa:g=8;e|=8;break;case xa:return a=ah(12,c,b,e|2),a.elementType=xa,a.lanes=f,a;case Ca:return a=ah(13,c,b,e),a.elementType=Ca,a.lanes=f,a;case Da:return a=ah(19,c,b,e),a.elementType=Da,a.lanes=f,a;case Ga:return nj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case ya:g=10;break a;case Aa:g=9;break a;case Ba:g=11;\nbreak a;case Ea:g=14;break a;case Fa:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=ah(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function qh(a,b,c,d){a=ah(7,a,d,b);a.lanes=c;return a}function nj(a,b,c,d){a=ah(22,a,d,b);a.elementType=Ga;a.lanes=c;a.stateNode={};return a}function nh(a,b,c){a=ah(6,a,null,b);a.lanes=c;return a}\nfunction ph(a,b,c){b=ah(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction Rk(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=vc(0);this.expirationTimes=vc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=vc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function Sk(a,b,c,d,e,f,g,h,k){a=new Rk(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=ah(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null};sg(f);return a}function Tk(a,b,c){var d=3 = Path extends `${string}->>${string}`\n ? true\n : false\n\n// Match relationship filters with `table.column` syntax and resolve underlying\n// column value. If not matched, fallback to generic type.\n// TODO: Validate the relationship itself ala select-query-parser. Currently we\n// assume that all tables have valid relationships to each other, despite\n// nonexistent foreign keys.\ntype ResolveFilterValue<\n Schema extends GenericSchema,\n Row extends Record,\n ColumnName extends string\n> = ColumnName extends `${infer RelationshipTable}.${infer Remainder}`\n ? Remainder extends `${infer _}.${infer _}`\n ? ResolveFilterValue\n : ResolveFilterRelationshipValue\n : ColumnName extends keyof Row\n ? Row[ColumnName]\n : // If the column selection is a jsonpath like `data->value` or `data->>value` we attempt to match\n // the expected type with the parsed custom json type\n IsStringOperator extends true\n ? string\n : JsonPathToType> extends infer JsonPathValue\n ? JsonPathValue extends never\n ? never\n : JsonPathValue\n : never\n\ntype ResolveFilterRelationshipValue<\n Schema extends GenericSchema,\n RelationshipTable extends string,\n RelationshipColumn extends string\n> = Schema['Tables'] & Schema['Views'] extends infer TablesAndViews\n ? RelationshipTable extends keyof TablesAndViews\n ? 'Row' extends keyof TablesAndViews[RelationshipTable]\n ? RelationshipColumn extends keyof TablesAndViews[RelationshipTable]['Row']\n ? TablesAndViews[RelationshipTable]['Row'][RelationshipColumn]\n : unknown\n : unknown\n : unknown\n : never\n\nexport default class PostgrestFilterBuilder<\n Schema extends GenericSchema,\n Row extends Record,\n Result,\n RelationName = unknown,\n Relationships = unknown\n> extends PostgrestTransformBuilder {\n /**\n * Match only rows where `column` is equal to `value`.\n *\n * To check if the value of `column` is NULL, you should use `.is()` instead.\n *\n * @param column - The column to filter on\n * @param value - The value to filter with\n */\n eq(\n column: ColumnName,\n value: ResolveFilterValue extends never\n ? NonNullable\n : // We want to infer the type before wrapping it into a `NonNullable` to avoid too deep\n // type resolution error\n ResolveFilterValue extends infer ResolvedFilterValue\n ? NonNullable\n : // We should never enter this case as all the branches are covered above\n never\n ): this {\n this.url.searchParams.append(column, `eq.${value}`)\n return this\n }\n\n /**\n * Match only rows where `column` is not equal to `value`.\n *\n * @param column - The column to filter on\n * @param value - The value to filter with\n */\n neq(\n column: ColumnName,\n value: ResolveFilterValue extends never\n ? unknown\n : ResolveFilterValue extends infer ResolvedFilterValue\n ? ResolvedFilterValue\n : never\n ): this {\n this.url.searchParams.append(column, `neq.${value}`)\n return this\n }\n\n gt(column: ColumnName, value: Row[ColumnName]): this\n gt(column: string, value: unknown): this\n /**\n * Match only rows where `column` is greater than `value`.\n *\n * @param column - The column to filter on\n * @param value - The value to filter with\n */\n gt(column: string, value: unknown): this {\n this.url.searchParams.append(column, `gt.${value}`)\n return this\n }\n\n gte(column: ColumnName, value: Row[ColumnName]): this\n gte(column: string, value: unknown): this\n /**\n * Match only rows where `column` is greater than or equal to `value`.\n *\n * @param column - The column to filter on\n * @param value - The value to filter with\n */\n gte(column: string, value: unknown): this {\n this.url.searchParams.append(column, `gte.${value}`)\n return this\n }\n\n lt(column: ColumnName, value: Row[ColumnName]): this\n lt(column: string, value: unknown): this\n /**\n * Match only rows where `column` is less than `value`.\n *\n * @param column - The column to filter on\n * @param value - The value to filter with\n */\n lt(column: string, value: unknown): this {\n this.url.searchParams.append(column, `lt.${value}`)\n return this\n }\n\n lte(column: ColumnName, value: Row[ColumnName]): this\n lte(column: string, value: unknown): this\n /**\n * Match only rows where `column` is less than or equal to `value`.\n *\n * @param column - The column to filter on\n * @param value - The value to filter with\n */\n lte(column: string, value: unknown): this {\n this.url.searchParams.append(column, `lte.${value}`)\n return this\n }\n\n like(column: ColumnName, pattern: string): this\n like(column: string, pattern: string): this\n /**\n * Match only rows where `column` matches `pattern` case-sensitively.\n *\n * @param column - The column to filter on\n * @param pattern - The pattern to match with\n */\n like(column: string, pattern: string): this {\n this.url.searchParams.append(column, `like.${pattern}`)\n return this\n }\n\n likeAllOf(\n column: ColumnName,\n patterns: readonly string[]\n ): this\n likeAllOf(column: string, patterns: readonly string[]): this\n /**\n * Match only rows where `column` matches all of `patterns` case-sensitively.\n *\n * @param column - The column to filter on\n * @param patterns - The patterns to match with\n */\n likeAllOf(column: string, patterns: readonly string[]): this {\n this.url.searchParams.append(column, `like(all).{${patterns.join(',')}}`)\n return this\n }\n\n likeAnyOf(\n column: ColumnName,\n patterns: readonly string[]\n ): this\n likeAnyOf(column: string, patterns: readonly string[]): this\n /**\n * Match only rows where `column` matches any of `patterns` case-sensitively.\n *\n * @param column - The column to filter on\n * @param patterns - The patterns to match with\n */\n likeAnyOf(column: string, patterns: readonly string[]): this {\n this.url.searchParams.append(column, `like(any).{${patterns.join(',')}}`)\n return this\n }\n\n ilike(column: ColumnName, pattern: string): this\n ilike(column: string, pattern: string): this\n /**\n * Match only rows where `column` matches `pattern` case-insensitively.\n *\n * @param column - The column to filter on\n * @param pattern - The pattern to match with\n */\n ilike(column: string, pattern: string): this {\n this.url.searchParams.append(column, `ilike.${pattern}`)\n return this\n }\n\n ilikeAllOf(\n column: ColumnName,\n patterns: readonly string[]\n ): this\n ilikeAllOf(column: string, patterns: readonly string[]): this\n /**\n * Match only rows where `column` matches all of `patterns` case-insensitively.\n *\n * @param column - The column to filter on\n * @param patterns - The patterns to match with\n */\n ilikeAllOf(column: string, patterns: readonly string[]): this {\n this.url.searchParams.append(column, `ilike(all).{${patterns.join(',')}}`)\n return this\n }\n\n ilikeAnyOf(\n column: ColumnName,\n patterns: readonly string[]\n ): this\n ilikeAnyOf(column: string, patterns: readonly string[]): this\n /**\n * Match only rows where `column` matches any of `patterns` case-insensitively.\n *\n * @param column - The column to filter on\n * @param patterns - The patterns to match with\n */\n ilikeAnyOf(column: string, patterns: readonly string[]): this {\n this.url.searchParams.append(column, `ilike(any).{${patterns.join(',')}}`)\n return this\n }\n\n is(\n column: ColumnName,\n value: Row[ColumnName] & (boolean | null)\n ): this\n is(column: string, value: boolean | null): this\n /**\n * Match only rows where `column` IS `value`.\n *\n * For non-boolean columns, this is only relevant for checking if the value of\n * `column` is NULL by setting `value` to `null`.\n *\n * For boolean columns, you can also set `value` to `true` or `false` and it\n * will behave the same way as `.eq()`.\n *\n * @param column - The column to filter on\n * @param value - The value to filter with\n */\n is(column: string, value: boolean | null): this {\n this.url.searchParams.append(column, `is.${value}`)\n return this\n }\n\n /**\n * Match only rows where `column` is included in the `values` array.\n *\n * @param column - The column to filter on\n * @param values - The values array to filter with\n */\n in(\n column: ColumnName,\n values: ReadonlyArray<\n ResolveFilterValue extends never\n ? unknown\n : // We want to infer the type before wrapping it into a `NonNullable` to avoid too deep\n // type resolution error\n ResolveFilterValue extends infer ResolvedFilterValue\n ? ResolvedFilterValue\n : // We should never enter this case as all the branches are covered above\n never\n >\n ): this {\n const cleanedValues = Array.from(new Set(values))\n .map((s) => {\n // handle postgrest reserved characters\n // https://postgrest.org/en/v7.0.0/api.html#reserved-characters\n if (typeof s === 'string' && new RegExp('[,()]').test(s)) return `\"${s}\"`\n else return `${s}`\n })\n .join(',')\n this.url.searchParams.append(column, `in.(${cleanedValues})`)\n return this\n }\n\n contains(\n column: ColumnName,\n value: string | ReadonlyArray | Record\n ): this\n contains(column: string, value: string | readonly unknown[] | Record): this\n /**\n * Only relevant for jsonb, array, and range columns. Match only rows where\n * `column` contains every element appearing in `value`.\n *\n * @param column - The jsonb, array, or range column to filter on\n * @param value - The jsonb, array, or range value to filter with\n */\n contains(column: string, value: string | readonly unknown[] | Record): this {\n if (typeof value === 'string') {\n // range types can be inclusive '[', ']' or exclusive '(', ')' so just\n // keep it simple and accept a string\n this.url.searchParams.append(column, `cs.${value}`)\n } else if (Array.isArray(value)) {\n // array\n this.url.searchParams.append(column, `cs.{${value.join(',')}}`)\n } else {\n // json\n this.url.searchParams.append(column, `cs.${JSON.stringify(value)}`)\n }\n return this\n }\n\n containedBy(\n column: ColumnName,\n value: string | ReadonlyArray | Record\n ): this\n containedBy(column: string, value: string | readonly unknown[] | Record): this\n /**\n * Only relevant for jsonb, array, and range columns. Match only rows where\n * every element appearing in `column` is contained by `value`.\n *\n * @param column - The jsonb, array, or range column to filter on\n * @param value - The jsonb, array, or range value to filter with\n */\n containedBy(column: string, value: string | readonly unknown[] | Record): this {\n if (typeof value === 'string') {\n // range\n this.url.searchParams.append(column, `cd.${value}`)\n } else if (Array.isArray(value)) {\n // array\n this.url.searchParams.append(column, `cd.{${value.join(',')}}`)\n } else {\n // json\n this.url.searchParams.append(column, `cd.${JSON.stringify(value)}`)\n }\n return this\n }\n\n rangeGt(column: ColumnName, range: string): this\n rangeGt(column: string, range: string): this\n /**\n * Only relevant for range columns. Match only rows where every element in\n * `column` is greater than any element in `range`.\n *\n * @param column - The range column to filter on\n * @param range - The range to filter with\n */\n rangeGt(column: string, range: string): this {\n this.url.searchParams.append(column, `sr.${range}`)\n return this\n }\n\n rangeGte(column: ColumnName, range: string): this\n rangeGte(column: string, range: string): this\n /**\n * Only relevant for range columns. Match only rows where every element in\n * `column` is either contained in `range` or greater than any element in\n * `range`.\n *\n * @param column - The range column to filter on\n * @param range - The range to filter with\n */\n rangeGte(column: string, range: string): this {\n this.url.searchParams.append(column, `nxl.${range}`)\n return this\n }\n\n rangeLt(column: ColumnName, range: string): this\n rangeLt(column: string, range: string): this\n /**\n * Only relevant for range columns. Match only rows where every element in\n * `column` is less than any element in `range`.\n *\n * @param column - The range column to filter on\n * @param range - The range to filter with\n */\n rangeLt(column: string, range: string): this {\n this.url.searchParams.append(column, `sl.${range}`)\n return this\n }\n\n rangeLte(column: ColumnName, range: string): this\n rangeLte(column: string, range: string): this\n /**\n * Only relevant for range columns. Match only rows where every element in\n * `column` is either contained in `range` or less than any element in\n * `range`.\n *\n * @param column - The range column to filter on\n * @param range - The range to filter with\n */\n rangeLte(column: string, range: string): this {\n this.url.searchParams.append(column, `nxr.${range}`)\n return this\n }\n\n rangeAdjacent(column: ColumnName, range: string): this\n rangeAdjacent(column: string, range: string): this\n /**\n * Only relevant for range columns. Match only rows where `column` is\n * mutually exclusive to `range` and there can be no element between the two\n * ranges.\n *\n * @param column - The range column to filter on\n * @param range - The range to filter with\n */\n rangeAdjacent(column: string, range: string): this {\n this.url.searchParams.append(column, `adj.${range}`)\n return this\n }\n\n overlaps(\n column: ColumnName,\n value: string | ReadonlyArray\n ): this\n overlaps(column: string, value: string | readonly unknown[]): this\n /**\n * Only relevant for array and range columns. Match only rows where\n * `column` and `value` have an element in common.\n *\n * @param column - The array or range column to filter on\n * @param value - The array or range value to filter with\n */\n overlaps(column: string, value: string | readonly unknown[]): this {\n if (typeof value === 'string') {\n // range\n this.url.searchParams.append(column, `ov.${value}`)\n } else {\n // array\n this.url.searchParams.append(column, `ov.{${value.join(',')}}`)\n }\n return this\n }\n\n textSearch(\n column: ColumnName,\n query: string,\n options?: { config?: string; type?: 'plain' | 'phrase' | 'websearch' }\n ): this\n textSearch(\n column: string,\n query: string,\n options?: { config?: string; type?: 'plain' | 'phrase' | 'websearch' }\n ): this\n /**\n * Only relevant for text and tsvector columns. Match only rows where\n * `column` matches the query string in `query`.\n *\n * @param column - The text or tsvector column to filter on\n * @param query - The query text to match with\n * @param options - Named parameters\n * @param options.config - The text search configuration to use\n * @param options.type - Change how the `query` text is interpreted\n */\n textSearch(\n column: string,\n query: string,\n { config, type }: { config?: string; type?: 'plain' | 'phrase' | 'websearch' } = {}\n ): this {\n let typePart = ''\n if (type === 'plain') {\n typePart = 'pl'\n } else if (type === 'phrase') {\n typePart = 'ph'\n } else if (type === 'websearch') {\n typePart = 'w'\n }\n const configPart = config === undefined ? '' : `(${config})`\n this.url.searchParams.append(column, `${typePart}fts${configPart}.${query}`)\n return this\n }\n\n match(query: Record): this\n match(query: Record): this\n /**\n * Match only rows where each column in `query` keys is equal to its\n * associated value. Shorthand for multiple `.eq()`s.\n *\n * @param query - The object to filter with, with column names as keys mapped\n * to their filter values\n */\n match(query: Record): this {\n Object.entries(query).forEach(([column, value]) => {\n this.url.searchParams.append(column, `eq.${value}`)\n })\n return this\n }\n\n not(\n column: ColumnName,\n operator: FilterOperator,\n value: Row[ColumnName]\n ): this\n not(column: string, operator: string, value: unknown): this\n /**\n * Match only rows which doesn't satisfy the filter.\n *\n * Unlike most filters, `opearator` and `value` are used as-is and need to\n * follow [PostgREST\n * syntax](https://postgrest.org/en/stable/api.html#operators). You also need\n * to make sure they are properly sanitized.\n *\n * @param column - The column to filter on\n * @param operator - The operator to be negated to filter with, following\n * PostgREST syntax\n * @param value - The value to filter with, following PostgREST syntax\n */\n not(column: string, operator: string, value: unknown): this {\n this.url.searchParams.append(column, `not.${operator}.${value}`)\n return this\n }\n\n /**\n * Match only rows which satisfy at least one of the filters.\n *\n * Unlike most filters, `filters` is used as-is and needs to follow [PostgREST\n * syntax](https://postgrest.org/en/stable/api.html#operators). You also need\n * to make sure it's properly sanitized.\n *\n * It's currently not possible to do an `.or()` filter across multiple tables.\n *\n * @param filters - The filters to use, following PostgREST syntax\n * @param options - Named parameters\n * @param options.referencedTable - Set this to filter on referenced tables\n * instead of the parent table\n * @param options.foreignTable - Deprecated, use `referencedTable` instead\n */\n or(\n filters: string,\n {\n foreignTable,\n referencedTable = foreignTable,\n }: { foreignTable?: string; referencedTable?: string } = {}\n ): this {\n const key = referencedTable ? `${referencedTable}.or` : 'or'\n this.url.searchParams.append(key, `(${filters})`)\n return this\n }\n\n filter(\n column: ColumnName,\n operator: `${'' | 'not.'}${FilterOperator}`,\n value: unknown\n ): this\n filter(column: string, operator: string, value: unknown): this\n /**\n * Match only rows which satisfy the filter. This is an escape hatch - you\n * should use the specific filter methods wherever possible.\n *\n * Unlike most filters, `opearator` and `value` are used as-is and need to\n * follow [PostgREST\n * syntax](https://postgrest.org/en/stable/api.html#operators). You also need\n * to make sure they are properly sanitized.\n *\n * @param column - The column to filter on\n * @param operator - The operator to filter with, following PostgREST syntax\n * @param value - The value to filter with, following PostgREST syntax\n */\n filter(column: string, operator: string, value: unknown): this {\n this.url.searchParams.append(column, `${operator}.${value}`)\n return this\n }\n}\n","import { version } from './version'\nexport const DEFAULT_HEADERS = { 'X-Client-Info': `postgrest-js/${version}` }\n","import PostgrestBuilder from './PostgrestBuilder'\nimport PostgrestFilterBuilder from './PostgrestFilterBuilder'\nimport { GetResult } from './select-query-parser/result'\nimport { Fetch, GenericSchema, GenericTable, GenericView } from './types'\n\nexport default class PostgrestQueryBuilder<\n Schema extends GenericSchema,\n Relation extends GenericTable | GenericView,\n RelationName = unknown,\n Relationships = Relation extends { Relationships: infer R } ? R : unknown\n> {\n url: URL\n headers: Record\n schema?: string\n signal?: AbortSignal\n fetch?: Fetch\n\n constructor(\n url: URL,\n {\n headers = {},\n schema,\n fetch,\n }: {\n headers?: Record\n schema?: string\n fetch?: Fetch\n }\n ) {\n this.url = url\n this.headers = headers\n this.schema = schema\n this.fetch = fetch\n }\n\n /**\n * Perform a SELECT query on the table or view.\n *\n * @param columns - The columns to retrieve, separated by commas. Columns can be renamed when returned with `customName:columnName`\n *\n * @param options - Named parameters\n *\n * @param options.head - When set to `true`, `data` will not be returned.\n * Useful if you only need the count.\n *\n * @param options.count - Count algorithm to use to count rows in the table or view.\n *\n * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n * hood.\n *\n * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n * statistics under the hood.\n *\n * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n * numbers.\n */\n select<\n Query extends string = '*',\n ResultOne = GetResult\n >(\n columns?: Query,\n {\n head = false,\n count,\n }: {\n head?: boolean\n count?: 'exact' | 'planned' | 'estimated'\n } = {}\n ): PostgrestFilterBuilder {\n const method = head ? 'HEAD' : 'GET'\n // Remove whitespaces except when quoted\n let quoted = false\n const cleanedColumns = (columns ?? '*')\n .split('')\n .map((c) => {\n if (/\\s/.test(c) && !quoted) {\n return ''\n }\n if (c === '\"') {\n quoted = !quoted\n }\n return c\n })\n .join('')\n this.url.searchParams.set('select', cleanedColumns)\n if (count) {\n this.headers['Prefer'] = `count=${count}`\n }\n\n return new PostgrestFilterBuilder({\n method,\n url: this.url,\n headers: this.headers,\n schema: this.schema,\n fetch: this.fetch,\n allowEmpty: false,\n } as unknown as PostgrestBuilder)\n }\n\n // TODO(v3): Make `defaultToNull` consistent for both single & bulk inserts.\n insert(\n values: Row,\n options?: {\n count?: 'exact' | 'planned' | 'estimated'\n }\n ): PostgrestFilterBuilder\n insert(\n values: Row[],\n options?: {\n count?: 'exact' | 'planned' | 'estimated'\n defaultToNull?: boolean\n }\n ): PostgrestFilterBuilder\n /**\n * Perform an INSERT into the table or view.\n *\n * By default, inserted rows are not returned. To return it, chain the call\n * with `.select()`.\n *\n * @param values - The values to insert. Pass an object to insert a single row\n * or an array to insert multiple rows.\n *\n * @param options - Named parameters\n *\n * @param options.count - Count algorithm to use to count inserted rows.\n *\n * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n * hood.\n *\n * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n * statistics under the hood.\n *\n * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n * numbers.\n *\n * @param options.defaultToNull - Make missing fields default to `null`.\n * Otherwise, use the default value for the column. Only applies for bulk\n * inserts.\n */\n insert(\n values: Row | Row[],\n {\n count,\n defaultToNull = true,\n }: {\n count?: 'exact' | 'planned' | 'estimated'\n defaultToNull?: boolean\n } = {}\n ): PostgrestFilterBuilder {\n const method = 'POST'\n\n const prefersHeaders = []\n if (this.headers['Prefer']) {\n prefersHeaders.push(this.headers['Prefer'])\n }\n if (count) {\n prefersHeaders.push(`count=${count}`)\n }\n if (!defaultToNull) {\n prefersHeaders.push('missing=default')\n }\n this.headers['Prefer'] = prefersHeaders.join(',')\n\n if (Array.isArray(values)) {\n const columns = values.reduce((acc, x) => acc.concat(Object.keys(x)), [] as string[])\n if (columns.length > 0) {\n const uniqueColumns = [...new Set(columns)].map((column) => `\"${column}\"`)\n this.url.searchParams.set('columns', uniqueColumns.join(','))\n }\n }\n\n return new PostgrestFilterBuilder({\n method,\n url: this.url,\n headers: this.headers,\n schema: this.schema,\n body: values,\n fetch: this.fetch,\n allowEmpty: false,\n } as unknown as PostgrestBuilder)\n }\n\n // TODO(v3): Make `defaultToNull` consistent for both single & bulk upserts.\n upsert(\n values: Row,\n options?: {\n onConflict?: string\n ignoreDuplicates?: boolean\n count?: 'exact' | 'planned' | 'estimated'\n }\n ): PostgrestFilterBuilder\n upsert(\n values: Row[],\n options?: {\n onConflict?: string\n ignoreDuplicates?: boolean\n count?: 'exact' | 'planned' | 'estimated'\n defaultToNull?: boolean\n }\n ): PostgrestFilterBuilder\n /**\n * Perform an UPSERT on the table or view. Depending on the column(s) passed\n * to `onConflict`, `.upsert()` allows you to perform the equivalent of\n * `.insert()` if a row with the corresponding `onConflict` columns doesn't\n * exist, or if it does exist, perform an alternative action depending on\n * `ignoreDuplicates`.\n *\n * By default, upserted rows are not returned. To return it, chain the call\n * with `.select()`.\n *\n * @param values - The values to upsert with. Pass an object to upsert a\n * single row or an array to upsert multiple rows.\n *\n * @param options - Named parameters\n *\n * @param options.onConflict - Comma-separated UNIQUE column(s) to specify how\n * duplicate rows are determined. Two rows are duplicates if all the\n * `onConflict` columns are equal.\n *\n * @param options.ignoreDuplicates - If `true`, duplicate rows are ignored. If\n * `false`, duplicate rows are merged with existing rows.\n *\n * @param options.count - Count algorithm to use to count upserted rows.\n *\n * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n * hood.\n *\n * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n * statistics under the hood.\n *\n * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n * numbers.\n *\n * @param options.defaultToNull - Make missing fields default to `null`.\n * Otherwise, use the default value for the column. This only applies when\n * inserting new rows, not when merging with existing rows under\n * `ignoreDuplicates: false`. This also only applies when doing bulk upserts.\n */\n upsert(\n values: Row | Row[],\n {\n onConflict,\n ignoreDuplicates = false,\n count,\n defaultToNull = true,\n }: {\n onConflict?: string\n ignoreDuplicates?: boolean\n count?: 'exact' | 'planned' | 'estimated'\n defaultToNull?: boolean\n } = {}\n ): PostgrestFilterBuilder {\n const method = 'POST'\n\n const prefersHeaders = [`resolution=${ignoreDuplicates ? 'ignore' : 'merge'}-duplicates`]\n\n if (onConflict !== undefined) this.url.searchParams.set('on_conflict', onConflict)\n if (this.headers['Prefer']) {\n prefersHeaders.push(this.headers['Prefer'])\n }\n if (count) {\n prefersHeaders.push(`count=${count}`)\n }\n if (!defaultToNull) {\n prefersHeaders.push('missing=default')\n }\n this.headers['Prefer'] = prefersHeaders.join(',')\n\n if (Array.isArray(values)) {\n const columns = values.reduce((acc, x) => acc.concat(Object.keys(x)), [] as string[])\n if (columns.length > 0) {\n const uniqueColumns = [...new Set(columns)].map((column) => `\"${column}\"`)\n this.url.searchParams.set('columns', uniqueColumns.join(','))\n }\n }\n\n return new PostgrestFilterBuilder({\n method,\n url: this.url,\n headers: this.headers,\n schema: this.schema,\n body: values,\n fetch: this.fetch,\n allowEmpty: false,\n } as unknown as PostgrestBuilder)\n }\n\n /**\n * Perform an UPDATE on the table or view.\n *\n * By default, updated rows are not returned. To return it, chain the call\n * with `.select()` after filters.\n *\n * @param values - The values to update with\n *\n * @param options - Named parameters\n *\n * @param options.count - Count algorithm to use to count updated rows.\n *\n * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n * hood.\n *\n * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n * statistics under the hood.\n *\n * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n * numbers.\n */\n update(\n values: Row,\n {\n count,\n }: {\n count?: 'exact' | 'planned' | 'estimated'\n } = {}\n ): PostgrestFilterBuilder {\n const method = 'PATCH'\n const prefersHeaders = []\n if (this.headers['Prefer']) {\n prefersHeaders.push(this.headers['Prefer'])\n }\n if (count) {\n prefersHeaders.push(`count=${count}`)\n }\n this.headers['Prefer'] = prefersHeaders.join(',')\n\n return new PostgrestFilterBuilder({\n method,\n url: this.url,\n headers: this.headers,\n schema: this.schema,\n body: values,\n fetch: this.fetch,\n allowEmpty: false,\n } as unknown as PostgrestBuilder)\n }\n\n /**\n * Perform a DELETE on the table or view.\n *\n * By default, deleted rows are not returned. To return it, chain the call\n * with `.select()` after filters.\n *\n * @param options - Named parameters\n *\n * @param options.count - Count algorithm to use to count deleted rows.\n *\n * `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n * hood.\n *\n * `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n * statistics under the hood.\n *\n * `\"estimated\"`: Uses exact count for low numbers and planned count for high\n * numbers.\n */\n delete({\n count,\n }: {\n count?: 'exact' | 'planned' | 'estimated'\n } = {}): PostgrestFilterBuilder {\n const method = 'DELETE'\n const prefersHeaders = []\n if (count) {\n prefersHeaders.push(`count=${count}`)\n }\n if (this.headers['Prefer']) {\n prefersHeaders.unshift(this.headers['Prefer'])\n }\n this.headers['Prefer'] = prefersHeaders.join(',')\n\n return new PostgrestFilterBuilder({\n method,\n url: this.url,\n headers: this.headers,\n schema: this.schema,\n fetch: this.fetch,\n allowEmpty: false,\n } as unknown as PostgrestBuilder)\n }\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n","// Always update wrapper.mjs when updating this file.\nimport PostgrestClient from './PostgrestClient'\nimport PostgrestQueryBuilder from './PostgrestQueryBuilder'\nimport PostgrestFilterBuilder from './PostgrestFilterBuilder'\nimport PostgrestTransformBuilder from './PostgrestTransformBuilder'\nimport PostgrestBuilder from './PostgrestBuilder'\nimport PostgrestError from './PostgrestError'\n\nexport {\n PostgrestClient,\n PostgrestQueryBuilder,\n PostgrestFilterBuilder,\n PostgrestTransformBuilder,\n PostgrestBuilder,\n PostgrestError,\n}\nexport default {\n PostgrestClient,\n PostgrestQueryBuilder,\n PostgrestFilterBuilder,\n PostgrestTransformBuilder,\n PostgrestBuilder,\n PostgrestError,\n}\nexport type {\n PostgrestResponse,\n PostgrestResponseFailure,\n PostgrestResponseSuccess,\n PostgrestSingleResponse,\n PostgrestMaybeSingleResponse,\n} from './types'\n// https://github.com/supabase/postgrest-js/issues/551\n// To be replaced with a helper type that only uses public types\nexport type { GetResult as UnstableGetResult } from './select-query-parser/result'\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + \"742eebe4\" + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"delegaciones-copaci:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkdelegaciones_copaci\"] = self[\"webpackChunkdelegaciones_copaci\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Actions represent the type of change to a location value.\n */\nexport enum Action {\n /**\n * A POP indicates a change to an arbitrary index in the history stack, such\n * as a back or forward navigation. It does not describe the direction of the\n * navigation, only that the current index changed.\n *\n * Note: This is the default action for newly created history objects.\n */\n Pop = \"POP\",\n\n /**\n * A PUSH indicates a new entry being added to the history stack, such as when\n * a link is clicked and a new page loads. When this happens, all subsequent\n * entries in the stack are lost.\n */\n Push = \"PUSH\",\n\n /**\n * A REPLACE indicates the entry at the current index in the history stack\n * being replaced by a new one.\n */\n Replace = \"REPLACE\",\n}\n\n/**\n * The pathname, search, and hash values of a URL.\n */\nexport interface Path {\n /**\n * A URL pathname, beginning with a /.\n */\n pathname: string;\n\n /**\n * A URL search string, beginning with a ?.\n */\n search: string;\n\n /**\n * A URL fragment identifier, beginning with a #.\n */\n hash: string;\n}\n\n// TODO: (v7) Change the Location generic default from `any` to `unknown` and\n// remove Remix `useLocation` wrapper.\n\n/**\n * An entry in a history stack. A location contains information about the\n * URL path, as well as possibly some arbitrary state and a key.\n */\nexport interface Location extends Path {\n /**\n * A value of arbitrary data associated with this location.\n */\n state: State;\n\n /**\n * A unique string associated with this location. May be used to safely store\n * and retrieve data in some other storage API, like `localStorage`.\n *\n * Note: This value is always \"default\" on the initial location.\n */\n key: string;\n}\n\n/**\n * A change to the current location.\n */\nexport interface Update {\n /**\n * The action that triggered the change.\n */\n action: Action;\n\n /**\n * The new location.\n */\n location: Location;\n\n /**\n * The delta between this location and the former location in the history stack\n */\n delta: number | null;\n}\n\n/**\n * A function that receives notifications about location changes.\n */\nexport interface Listener {\n (update: Update): void;\n}\n\n/**\n * Describes a location that is the destination of some navigation, either via\n * `history.push` or `history.replace`. This may be either a URL or the pieces\n * of a URL path.\n */\nexport type To = string | Partial;\n\n/**\n * A history is an interface to the navigation stack. The history serves as the\n * source of truth for the current location, as well as provides a set of\n * methods that may be used to change it.\n *\n * It is similar to the DOM's `window.history` object, but with a smaller, more\n * focused API.\n */\nexport interface History {\n /**\n * The last action that modified the current location. This will always be\n * Action.Pop when a history instance is first created. This value is mutable.\n */\n readonly action: Action;\n\n /**\n * The current location. This value is mutable.\n */\n readonly location: Location;\n\n /**\n * Returns a valid href for the given `to` value that may be used as\n * the value of an attribute.\n *\n * @param to - The destination URL\n */\n createHref(to: To): string;\n\n /**\n * Returns a URL for the given `to` value\n *\n * @param to - The destination URL\n */\n createURL(to: To): URL;\n\n /**\n * Encode a location the same way window.history would do (no-op for memory\n * history) so we ensure our PUSH/REPLACE navigations for data routers\n * behave the same as POP\n *\n * @param to Unencoded path\n */\n encodeLocation(to: To): Path;\n\n /**\n * Pushes a new location onto the history stack, increasing its length by one.\n * If there were any entries in the stack after the current one, they are\n * lost.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n push(to: To, state?: any): void;\n\n /**\n * Replaces the current location in the history stack with a new one. The\n * location that was replaced will no longer be available.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n replace(to: To, state?: any): void;\n\n /**\n * Navigates `n` entries backward/forward in the history stack relative to the\n * current index. For example, a \"back\" navigation would use go(-1).\n *\n * @param delta - The delta in the stack index\n */\n go(delta: number): void;\n\n /**\n * Sets up a listener that will be called whenever the current location\n * changes.\n *\n * @param listener - A function that will be called when the location changes\n * @returns unlisten - A function that may be used to stop listening\n */\n listen(listener: Listener): () => void;\n}\n\ntype HistoryState = {\n usr: any;\n key?: string;\n idx: number;\n};\n\nconst PopStateEventType = \"popstate\";\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Memory History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A user-supplied object that describes a location. Used when providing\n * entries to `createMemoryHistory` via its `initialEntries` option.\n */\nexport type InitialEntry = string | Partial;\n\nexport type MemoryHistoryOptions = {\n initialEntries?: InitialEntry[];\n initialIndex?: number;\n v5Compat?: boolean;\n};\n\n/**\n * A memory history stores locations in memory. This is useful in stateful\n * environments where there is no web browser, such as node tests or React\n * Native.\n */\nexport interface MemoryHistory extends History {\n /**\n * The current index in the history stack.\n */\n readonly index: number;\n}\n\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\nexport function createMemoryHistory(\n options: MemoryHistoryOptions = {}\n): MemoryHistory {\n let { initialEntries = [\"/\"], initialIndex, v5Compat = false } = options;\n let entries: Location[]; // Declare so we can access from createMemoryLocation\n entries = initialEntries.map((entry, index) =>\n createMemoryLocation(\n entry,\n typeof entry === \"string\" ? null : entry.state,\n index === 0 ? \"default\" : undefined\n )\n );\n let index = clampIndex(\n initialIndex == null ? entries.length - 1 : initialIndex\n );\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n function clampIndex(n: number): number {\n return Math.min(Math.max(n, 0), entries.length - 1);\n }\n function getCurrentLocation(): Location {\n return entries[index];\n }\n function createMemoryLocation(\n to: To,\n state: any = null,\n key?: string\n ): Location {\n let location = createLocation(\n entries ? getCurrentLocation().pathname : \"/\",\n to,\n state,\n key\n );\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in memory history: ${JSON.stringify(\n to\n )}`\n );\n return location;\n }\n\n function createHref(to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n let history: MemoryHistory = {\n get index() {\n return index;\n },\n get action() {\n return action;\n },\n get location() {\n return getCurrentLocation();\n },\n createHref,\n createURL(to) {\n return new URL(createHref(to), \"http://localhost\");\n },\n encodeLocation(to: To) {\n let path = typeof to === \"string\" ? parsePath(to) : to;\n return {\n pathname: path.pathname || \"\",\n search: path.search || \"\",\n hash: path.hash || \"\",\n };\n },\n push(to, state) {\n action = Action.Push;\n let nextLocation = createMemoryLocation(to, state);\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 1 });\n }\n },\n replace(to, state) {\n action = Action.Replace;\n let nextLocation = createMemoryLocation(to, state);\n entries[index] = nextLocation;\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 0 });\n }\n },\n go(delta) {\n action = Action.Pop;\n let nextIndex = clampIndex(index + delta);\n let nextLocation = entries[nextIndex];\n index = nextIndex;\n if (listener) {\n listener({ action, location: nextLocation, delta });\n }\n },\n listen(fn: Listener) {\n listener = fn;\n return () => {\n listener = null;\n };\n },\n };\n\n return history;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Browser History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A browser history stores the current location in regular URLs in a web\n * browser environment. This is the standard for most web apps and provides the\n * cleanest URLs the browser's address bar.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#browserhistory\n */\nexport interface BrowserHistory extends UrlHistory {}\n\nexport type BrowserHistoryOptions = UrlHistoryOptions;\n\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\nexport function createBrowserHistory(\n options: BrowserHistoryOptions = {}\n): BrowserHistory {\n function createBrowserLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let { pathname, search, hash } = window.location;\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createBrowserHref(window: Window, to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n return getUrlBasedHistory(\n createBrowserLocation,\n createBrowserHref,\n null,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hash History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A hash history stores the current location in the fragment identifier portion\n * of the URL in a web browser environment.\n *\n * This is ideal for apps that do not control the server for some reason\n * (because the fragment identifier is never sent to the server), including some\n * shared hosting environments that do not provide fine-grained controls over\n * which pages are served at which URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#hashhistory\n */\nexport interface HashHistory extends UrlHistory {}\n\nexport type HashHistoryOptions = UrlHistoryOptions;\n\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don't want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\nexport function createHashHistory(\n options: HashHistoryOptions = {}\n): HashHistory {\n function createHashLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n } = parsePath(window.location.hash.substr(1));\n\n // Hash URL should always have a leading / just like window.location.pathname\n // does, so if an app ends up at a route like /#something then we add a\n // leading slash so all of our path-matching behaves the same as if it would\n // in a browser router. This is particularly important when there exists a\n // root splat route () since that matches internally against\n // \"/*\" and we'd expect /#something to 404 in a hash router app.\n if (!pathname.startsWith(\"/\") && !pathname.startsWith(\".\")) {\n pathname = \"/\" + pathname;\n }\n\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createHashHref(window: Window, to: To) {\n let base = window.document.querySelector(\"base\");\n let href = \"\";\n\n if (base && base.getAttribute(\"href\")) {\n let url = window.location.href;\n let hashIndex = url.indexOf(\"#\");\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n\n return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n }\n\n function validateHashLocation(location: Location, to: To) {\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in hash history.push(${JSON.stringify(\n to\n )})`\n );\n }\n\n return getUrlBasedHistory(\n createHashLocation,\n createHashHref,\n validateHashLocation,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region UTILS\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @private\n */\nexport function invariant(value: boolean, message?: string): asserts value;\nexport function invariant(\n value: T | null | undefined,\n message?: string\n): asserts value is T;\nexport function invariant(value: any, message?: string) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\n\nexport function warning(cond: any, message: string) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== \"undefined\") console.warn(message);\n\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience, so you can more easily\n // find the source for a warning that appears in the console by\n // enabling \"pause on exceptions\" in your JavaScript debugger.\n throw new Error(message);\n // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\n\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n\n/**\n * For browser-based histories, we combine the state and key into an object\n */\nfunction getHistoryState(location: Location, index: number): HistoryState {\n return {\n usr: location.state,\n key: location.key,\n idx: index,\n };\n}\n\n/**\n * Creates a Location object with a unique key from the given Path\n */\nexport function createLocation(\n current: string | Location,\n to: To,\n state: any = null,\n key?: string\n): Readonly {\n let location: Readonly = {\n pathname: typeof current === \"string\" ? current : current.pathname,\n search: \"\",\n hash: \"\",\n ...(typeof to === \"string\" ? parsePath(to) : to),\n state,\n // TODO: This could be cleaned up. push/replace should probably just take\n // full Locations now and avoid the need to run through this flow at all\n // But that's a pretty big refactor to the current test suite so going to\n // keep as is for the time being and just let any incoming keys take precedence\n key: (to && (to as Location).key) || key || createKey(),\n };\n return location;\n}\n\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\nexport function createPath({\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n}: Partial) {\n if (search && search !== \"?\")\n pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\")\n pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\n\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\nexport function parsePath(path: string): Partial {\n let parsedPath: Partial = {};\n\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n\n if (path) {\n parsedPath.pathname = path;\n }\n }\n\n return parsedPath;\n}\n\nexport interface UrlHistory extends History {}\n\nexport type UrlHistoryOptions = {\n window?: Window;\n v5Compat?: boolean;\n};\n\nfunction getUrlBasedHistory(\n getLocation: (window: Window, globalHistory: Window[\"history\"]) => Location,\n createHref: (window: Window, to: To) => string,\n validateLocation: ((location: Location, to: To) => void) | null,\n options: UrlHistoryOptions = {}\n): UrlHistory {\n let { window = document.defaultView!, v5Compat = false } = options;\n let globalHistory = window.history;\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n let index = getIndex()!;\n // Index should only be null when we initialize. If not, it's because the\n // user called history.pushState or history.replaceState directly, in which\n // case we should log a warning as it will result in bugs.\n if (index == null) {\n index = 0;\n globalHistory.replaceState({ ...globalHistory.state, idx: index }, \"\");\n }\n\n function getIndex(): number {\n let state = globalHistory.state || { idx: null };\n return state.idx;\n }\n\n function handlePop() {\n action = Action.Pop;\n let nextIndex = getIndex();\n let delta = nextIndex == null ? null : nextIndex - index;\n index = nextIndex;\n if (listener) {\n listener({ action, location: history.location, delta });\n }\n }\n\n function push(to: To, state?: any) {\n action = Action.Push;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex() + 1;\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n\n // try...catch because iOS limits us to 100 pushState calls :/\n try {\n globalHistory.pushState(historyState, \"\", url);\n } catch (error) {\n // If the exception is because `state` can't be serialized, let that throw\n // outwards just like a replace call would so the dev knows the cause\n // https://html.spec.whatwg.org/multipage/nav-history-apis.html#shared-history-push/replace-state-steps\n // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal\n if (error instanceof DOMException && error.name === \"DataCloneError\") {\n throw error;\n }\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 1 });\n }\n }\n\n function replace(to: To, state?: any) {\n action = Action.Replace;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex();\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n globalHistory.replaceState(historyState, \"\", url);\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 0 });\n }\n }\n\n function createURL(to: To): URL {\n // window.location.origin is \"null\" (the literal string value) in Firefox\n // under certain conditions, notably when serving from a local HTML file\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n let base =\n window.location.origin !== \"null\"\n ? window.location.origin\n : window.location.href;\n\n let href = typeof to === \"string\" ? to : createPath(to);\n // Treating this as a full URL will strip any trailing spaces so we need to\n // pre-encode them since they might be part of a matching splat param from\n // an ancestor route\n href = href.replace(/ $/, \"%20\");\n invariant(\n base,\n `No window.location.(origin|href) available to create URL for href: ${href}`\n );\n return new URL(href, base);\n }\n\n let history: History = {\n get action() {\n return action;\n },\n get location() {\n return getLocation(window, globalHistory);\n },\n listen(fn: Listener) {\n if (listener) {\n throw new Error(\"A history only accepts one active listener\");\n }\n window.addEventListener(PopStateEventType, handlePop);\n listener = fn;\n\n return () => {\n window.removeEventListener(PopStateEventType, handlePop);\n listener = null;\n };\n },\n createHref(to) {\n return createHref(window, to);\n },\n createURL,\n encodeLocation(to) {\n // Encode a Location the same way window.location would\n let url = createURL(to);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n };\n },\n push,\n replace,\n go(n) {\n return globalHistory.go(n);\n },\n };\n\n return history;\n}\n\n//#endregion\n","import type { Location, Path, To } from \"./history\";\nimport { invariant, parsePath, warning } from \"./history\";\n\n/**\n * Map of routeId -> data returned from a loader/action/error\n */\nexport interface RouteData {\n [routeId: string]: any;\n}\n\nexport enum ResultType {\n data = \"data\",\n deferred = \"deferred\",\n redirect = \"redirect\",\n error = \"error\",\n}\n\n/**\n * Successful result from a loader or action\n */\nexport interface SuccessResult {\n type: ResultType.data;\n data: unknown;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Successful defer() result from a loader or action\n */\nexport interface DeferredResult {\n type: ResultType.deferred;\n deferredData: DeferredData;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Redirect result from a loader or action\n */\nexport interface RedirectResult {\n type: ResultType.redirect;\n // We keep the raw Response for redirects so we can return it verbatim\n response: Response;\n}\n\n/**\n * Unsuccessful result from a loader or action\n */\nexport interface ErrorResult {\n type: ResultType.error;\n error: unknown;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Result from a loader or action - potentially successful or unsuccessful\n */\nexport type DataResult =\n | SuccessResult\n | DeferredResult\n | RedirectResult\n | ErrorResult;\n\ntype LowerCaseFormMethod = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\ntype UpperCaseFormMethod = Uppercase;\n\n/**\n * Users can specify either lowercase or uppercase form methods on `
`,\n * useSubmit(), ``, etc.\n */\nexport type HTMLFormMethod = LowerCaseFormMethod | UpperCaseFormMethod;\n\n/**\n * Active navigation/fetcher form methods are exposed in lowercase on the\n * RouterState\n */\nexport type FormMethod = LowerCaseFormMethod;\nexport type MutationFormMethod = Exclude;\n\n/**\n * In v7, active navigation/fetcher form methods are exposed in uppercase on the\n * RouterState. This is to align with the normalization done via fetch().\n */\nexport type V7_FormMethod = UpperCaseFormMethod;\nexport type V7_MutationFormMethod = Exclude;\n\nexport type FormEncType =\n | \"application/x-www-form-urlencoded\"\n | \"multipart/form-data\"\n | \"application/json\"\n | \"text/plain\";\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\n/**\n * @private\n * Internal interface to pass around for action submissions, not intended for\n * external consumption\n */\nexport type Submission =\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: FormData;\n json: undefined;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: JsonValue;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: undefined;\n text: string;\n };\n\n/**\n * @private\n * Arguments passed to route loader/action functions. Same for now but we keep\n * this as a private implementation detail in case they diverge in the future.\n */\ninterface DataFunctionArgs {\n request: Request;\n params: Params;\n context?: Context;\n}\n\n// TODO: (v7) Change the defaults from any to unknown in and remove Remix wrappers:\n// ActionFunction, ActionFunctionArgs, LoaderFunction, LoaderFunctionArgs\n// Also, make them a type alias instead of an interface\n\n/**\n * Arguments passed to loader functions\n */\nexport interface LoaderFunctionArgs\n extends DataFunctionArgs {}\n\n/**\n * Arguments passed to action functions\n */\nexport interface ActionFunctionArgs\n extends DataFunctionArgs {}\n\n/**\n * Loaders and actions can return anything except `undefined` (`null` is a\n * valid return value if there is no data to return). Responses are preferred\n * and will ease any future migration to Remix\n */\ntype DataFunctionValue = Response | NonNullable | null;\n\ntype DataFunctionReturnValue = Promise | DataFunctionValue;\n\n/**\n * Route loader function signature\n */\nexport type LoaderFunction = {\n (\n args: LoaderFunctionArgs,\n handlerCtx?: unknown\n ): DataFunctionReturnValue;\n} & { hydrate?: boolean };\n\n/**\n * Route action function signature\n */\nexport interface ActionFunction {\n (\n args: ActionFunctionArgs,\n handlerCtx?: unknown\n ): DataFunctionReturnValue;\n}\n\n/**\n * Arguments passed to shouldRevalidate function\n */\nexport interface ShouldRevalidateFunctionArgs {\n currentUrl: URL;\n currentParams: AgnosticDataRouteMatch[\"params\"];\n nextUrl: URL;\n nextParams: AgnosticDataRouteMatch[\"params\"];\n formMethod?: Submission[\"formMethod\"];\n formAction?: Submission[\"formAction\"];\n formEncType?: Submission[\"formEncType\"];\n text?: Submission[\"text\"];\n formData?: Submission[\"formData\"];\n json?: Submission[\"json\"];\n actionStatus?: number;\n actionResult?: any;\n defaultShouldRevalidate: boolean;\n}\n\n/**\n * Route shouldRevalidate function signature. This runs after any submission\n * (navigation or fetcher), so we flatten the navigation/fetcher submission\n * onto the arguments. It shouldn't matter whether it came from a navigation\n * or a fetcher, what really matters is the URLs and the formData since loaders\n * have to re-run based on the data models that were potentially mutated.\n */\nexport interface ShouldRevalidateFunction {\n (args: ShouldRevalidateFunctionArgs): boolean;\n}\n\n/**\n * Function provided by the framework-aware layers to set `hasErrorBoundary`\n * from the framework-aware `errorElement` prop\n *\n * @deprecated Use `mapRouteProperties` instead\n */\nexport interface DetectErrorBoundaryFunction {\n (route: AgnosticRouteObject): boolean;\n}\n\nexport interface DataStrategyMatch\n extends AgnosticRouteMatch {\n shouldLoad: boolean;\n resolve: (\n handlerOverride?: (\n handler: (ctx?: unknown) => DataFunctionReturnValue\n ) => DataFunctionReturnValue\n ) => Promise;\n}\n\nexport interface DataStrategyFunctionArgs\n extends DataFunctionArgs {\n matches: DataStrategyMatch[];\n fetcherKey: string | null;\n}\n\n/**\n * Result from a loader or action called via dataStrategy\n */\nexport interface DataStrategyResult {\n type: \"data\" | \"error\";\n result: unknown; // data, Error, Response, DeferredData, DataWithResponseInit\n}\n\nexport interface DataStrategyFunction {\n (args: DataStrategyFunctionArgs): Promise>;\n}\n\nexport type AgnosticPatchRoutesOnNavigationFunctionArgs<\n O extends AgnosticRouteObject = AgnosticRouteObject,\n M extends AgnosticRouteMatch = AgnosticRouteMatch\n> = {\n signal: AbortSignal;\n path: string;\n matches: M[];\n patch: (routeId: string | null, children: O[]) => void;\n};\n\nexport type AgnosticPatchRoutesOnNavigationFunction<\n O extends AgnosticRouteObject = AgnosticRouteObject,\n M extends AgnosticRouteMatch = AgnosticRouteMatch\n> = (\n opts: AgnosticPatchRoutesOnNavigationFunctionArgs\n) => void | Promise;\n\n/**\n * Function provided by the framework-aware layers to set any framework-specific\n * properties from framework-agnostic properties\n */\nexport interface MapRoutePropertiesFunction {\n (route: AgnosticRouteObject): {\n hasErrorBoundary: boolean;\n } & Record;\n}\n\n/**\n * Keys we cannot change from within a lazy() function. We spread all other keys\n * onto the route. Either they're meaningful to the router, or they'll get\n * ignored.\n */\nexport type ImmutableRouteKey =\n | \"lazy\"\n | \"caseSensitive\"\n | \"path\"\n | \"id\"\n | \"index\"\n | \"children\";\n\nexport const immutableRouteKeys = new Set([\n \"lazy\",\n \"caseSensitive\",\n \"path\",\n \"id\",\n \"index\",\n \"children\",\n]);\n\ntype RequireOne = Exclude<\n {\n [K in keyof T]: K extends Key ? Omit & Required> : never;\n }[keyof T],\n undefined\n>;\n\n/**\n * lazy() function to load a route definition, which can add non-matching\n * related properties to a route\n */\nexport interface LazyRouteFunction {\n (): Promise>>;\n}\n\n/**\n * Base RouteObject with common props shared by all types of routes\n */\ntype AgnosticBaseRouteObject = {\n caseSensitive?: boolean;\n path?: string;\n id?: string;\n loader?: LoaderFunction | boolean;\n action?: ActionFunction | boolean;\n hasErrorBoundary?: boolean;\n shouldRevalidate?: ShouldRevalidateFunction;\n handle?: any;\n lazy?: LazyRouteFunction;\n};\n\n/**\n * Index routes must not have children\n */\nexport type AgnosticIndexRouteObject = AgnosticBaseRouteObject & {\n children?: undefined;\n index: true;\n};\n\n/**\n * Non-index routes may have children, but cannot have index\n */\nexport type AgnosticNonIndexRouteObject = AgnosticBaseRouteObject & {\n children?: AgnosticRouteObject[];\n index?: false;\n};\n\n/**\n * A route object represents a logical route, with (optionally) its child\n * routes organized in a tree-like structure.\n */\nexport type AgnosticRouteObject =\n | AgnosticIndexRouteObject\n | AgnosticNonIndexRouteObject;\n\nexport type AgnosticDataIndexRouteObject = AgnosticIndexRouteObject & {\n id: string;\n};\n\nexport type AgnosticDataNonIndexRouteObject = AgnosticNonIndexRouteObject & {\n children?: AgnosticDataRouteObject[];\n id: string;\n};\n\n/**\n * A data route object, which is just a RouteObject with a required unique ID\n */\nexport type AgnosticDataRouteObject =\n | AgnosticDataIndexRouteObject\n | AgnosticDataNonIndexRouteObject;\n\nexport type RouteManifest = Record;\n\n// Recursive helper for finding path parameters in the absence of wildcards\ntype _PathParam =\n // split path into individual path segments\n Path extends `${infer L}/${infer R}`\n ? _PathParam | _PathParam\n : // find params after `:`\n Path extends `:${infer Param}`\n ? Param extends `${infer Optional}?`\n ? Optional\n : Param\n : // otherwise, there aren't any params present\n never;\n\n/**\n * Examples:\n * \"/a/b/*\" -> \"*\"\n * \":a\" -> \"a\"\n * \"/a/:b\" -> \"b\"\n * \"/a/blahblahblah:b\" -> \"b\"\n * \"/:a/:b\" -> \"a\" | \"b\"\n * \"/:a/b/:c/*\" -> \"a\" | \"c\" | \"*\"\n */\nexport type PathParam =\n // check if path is just a wildcard\n Path extends \"*\" | \"/*\"\n ? \"*\"\n : // look for wildcard at the end of the path\n Path extends `${infer Rest}/*`\n ? \"*\" | _PathParam\n : // look for params in the absence of wildcards\n _PathParam;\n\n// Attempt to parse the given string segment. If it fails, then just return the\n// plain string type as a default fallback. Otherwise, return the union of the\n// parsed string literals that were referenced as dynamic segments in the route.\nexport type ParamParseKey =\n // if you could not find path params, fallback to `string`\n [PathParam] extends [never] ? string : PathParam;\n\n/**\n * The parameters that were parsed from the URL path.\n */\nexport type Params = {\n readonly [key in Key]: string | undefined;\n};\n\n/**\n * A RouteMatch contains info about how a route matched a URL.\n */\nexport interface AgnosticRouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The route object that was used to match.\n */\n route: RouteObjectType;\n}\n\nexport interface AgnosticDataRouteMatch\n extends AgnosticRouteMatch {}\n\nfunction isIndexRoute(\n route: AgnosticRouteObject\n): route is AgnosticIndexRouteObject {\n return route.index === true;\n}\n\n// Walk the route tree generating unique IDs where necessary, so we are working\n// solely with AgnosticDataRouteObject's within the Router\nexport function convertRoutesToDataRoutes(\n routes: AgnosticRouteObject[],\n mapRouteProperties: MapRoutePropertiesFunction,\n parentPath: string[] = [],\n manifest: RouteManifest = {}\n): AgnosticDataRouteObject[] {\n return routes.map((route, index) => {\n let treePath = [...parentPath, String(index)];\n let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n invariant(\n route.index !== true || !route.children,\n `Cannot specify children on an index route`\n );\n invariant(\n !manifest[id],\n `Found a route id collision on id \"${id}\". Route ` +\n \"id's must be globally unique within Data Router usages\"\n );\n\n if (isIndexRoute(route)) {\n let indexRoute: AgnosticDataIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n };\n manifest[id] = indexRoute;\n return indexRoute;\n } else {\n let pathOrLayoutRoute: AgnosticDataNonIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n children: undefined,\n };\n manifest[id] = pathOrLayoutRoute;\n\n if (route.children) {\n pathOrLayoutRoute.children = convertRoutesToDataRoutes(\n route.children,\n mapRouteProperties,\n treePath,\n manifest\n );\n }\n\n return pathOrLayoutRoute;\n }\n });\n}\n\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/v6/utils/match-routes\n */\nexport function matchRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n locationArg: Partial | string,\n basename = \"/\"\n): AgnosticRouteMatch[] | null {\n return matchRoutesImpl(routes, locationArg, basename, false);\n}\n\nexport function matchRoutesImpl<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n locationArg: Partial | string,\n basename: string,\n allowPartial: boolean\n): AgnosticRouteMatch[] | null {\n let location =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n let pathname = stripBasename(location.pathname || \"/\", basename);\n\n if (pathname == null) {\n return null;\n }\n\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n\n let matches = null;\n for (let i = 0; matches == null && i < branches.length; ++i) {\n // Incoming pathnames are generally encoded from either window.location\n // or from router.navigate, but we want to match against the unencoded\n // paths in the route definitions. Memory router locations won't be\n // encoded here but there also shouldn't be anything to decode so this\n // should be a safe operation. This avoids needing matchRoutes to be\n // history-aware.\n let decoded = decodePath(pathname);\n matches = matchRouteBranch(\n branches[i],\n decoded,\n allowPartial\n );\n }\n\n return matches;\n}\n\nexport interface UIMatch {\n id: string;\n pathname: string;\n params: AgnosticRouteMatch[\"params\"];\n data: Data;\n handle: Handle;\n}\n\nexport function convertRouteMatchToUiMatch(\n match: AgnosticDataRouteMatch,\n loaderData: RouteData\n): UIMatch {\n let { route, pathname, params } = match;\n return {\n id: route.id,\n pathname,\n params,\n data: loaderData[route.id],\n handle: route.handle,\n };\n}\n\ninterface RouteMeta<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n relativePath: string;\n caseSensitive: boolean;\n childrenIndex: number;\n route: RouteObjectType;\n}\n\ninterface RouteBranch<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n path: string;\n score: number;\n routesMeta: RouteMeta[];\n}\n\nfunction flattenRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n branches: RouteBranch[] = [],\n parentsMeta: RouteMeta[] = [],\n parentPath = \"\"\n): RouteBranch[] {\n let flattenRoute = (\n route: RouteObjectType,\n index: number,\n relativePath?: string\n ) => {\n let meta: RouteMeta = {\n relativePath:\n relativePath === undefined ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route,\n };\n\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(\n meta.relativePath.startsWith(parentPath),\n `Absolute route path \"${meta.relativePath}\" nested under path ` +\n `\"${parentPath}\" is not valid. An absolute child route path ` +\n `must start with the combined path of all its parent routes.`\n );\n\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n\n // Add the children before adding this route to the array, so we traverse the\n // route tree depth-first and child routes appear before their parents in\n // the \"flattened\" version.\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true,\n `Index routes must not have child routes. Please remove ` +\n `all child routes from route path \"${path}\".`\n );\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n\n // Routes without a path shouldn't ever match by themselves unless they are\n // index routes, so don't add them to the list of possible branches.\n if (route.path == null && !route.index) {\n return;\n }\n\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta,\n });\n };\n routes.forEach((route, index) => {\n // coarse-grain check for optional params\n if (route.path === \"\" || !route.path?.includes(\"?\")) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n\n return branches;\n}\n\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\nfunction explodeOptionalSegments(path: string): string[] {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n\n let [first, ...rest] = segments;\n\n // Optional path segments are denoted by a trailing `?`\n let isOptional = first.endsWith(\"?\");\n // Compute the corresponding required segment: `foo?` -> `foo`\n let required = first.replace(/\\?$/, \"\");\n\n if (rest.length === 0) {\n // Intepret empty string as omitting an optional segment\n // `[\"one\", \"\", \"three\"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n return isOptional ? [required, \"\"] : [required];\n }\n\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n\n let result: string[] = [];\n\n // All child paths with the prefix. Do this for all children before the\n // optional version for all children, so we get consistent ordering where the\n // parent optional aspect is preferred as required. Otherwise, we can get\n // child sections interspersed where deeper optional segments are higher than\n // parent optional segments, where for example, /:two would explode _earlier_\n // then /:one. By always including the parent as required _for all children_\n // first, we avoid this issue\n result.push(\n ...restExploded.map((subpath) =>\n subpath === \"\" ? required : [required, subpath].join(\"/\")\n )\n );\n\n // Then, if this is an optional value, add all child versions without\n if (isOptional) {\n result.push(...restExploded);\n }\n\n // for absolute paths, ensure `/` instead of empty segment\n return result.map((exploded) =>\n path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded\n );\n}\n\nfunction rankRouteBranches(branches: RouteBranch[]): void {\n branches.sort((a, b) =>\n a.score !== b.score\n ? b.score - a.score // Higher score first\n : compareIndexes(\n a.routesMeta.map((meta) => meta.childrenIndex),\n b.routesMeta.map((meta) => meta.childrenIndex)\n )\n );\n}\n\nconst paramRe = /^:[\\w-]+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s: string) => s === \"*\";\n\nfunction computeScore(path: string, index: boolean | undefined): number {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n\n if (index) {\n initialScore += indexRouteValue;\n }\n\n return segments\n .filter((s) => !isSplat(s))\n .reduce(\n (score, segment) =>\n score +\n (paramRe.test(segment)\n ? dynamicSegmentValue\n : segment === \"\"\n ? emptySegmentValue\n : staticSegmentValue),\n initialScore\n );\n}\n\nfunction compareIndexes(a: number[], b: number[]): number {\n let siblings =\n a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n\n return siblings\n ? // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1]\n : // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0;\n}\n\nfunction matchRouteBranch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n branch: RouteBranch,\n pathname: string,\n allowPartial = false\n): AgnosticRouteMatch[] | null {\n let { routesMeta } = branch;\n\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches: AgnosticRouteMatch[] = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname =\n matchedPathname === \"/\"\n ? pathname\n : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath(\n { path: meta.relativePath, caseSensitive: meta.caseSensitive, end },\n remainingPathname\n );\n\n let route = meta.route;\n\n if (\n !match &&\n end &&\n allowPartial &&\n !routesMeta[routesMeta.length - 1].route.index\n ) {\n match = matchPath(\n {\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end: false,\n },\n remainingPathname\n );\n }\n\n if (!match) {\n return null;\n }\n\n Object.assign(matchedParams, match.params);\n\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams as Params,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(\n joinPaths([matchedPathname, match.pathnameBase])\n ),\n route,\n });\n\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n\n return matches;\n}\n\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/v6/utils/generate-path\n */\nexport function generatePath(\n originalPath: Path,\n params: {\n [key in PathParam]: string | null;\n } = {} as any\n): string {\n let path: string = originalPath;\n if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n warning(\n false,\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n path = path.replace(/\\*$/, \"/*\") as Path;\n }\n\n // ensure `/` is added at the beginning if the path is absolute\n const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n\n const stringify = (p: any) =>\n p == null ? \"\" : typeof p === \"string\" ? p : String(p);\n\n const segments = path\n .split(/\\/+/)\n .map((segment, index, array) => {\n const isLastSegment = index === array.length - 1;\n\n // only apply the splat if it's the last segment\n if (isLastSegment && segment === \"*\") {\n const star = \"*\" as PathParam;\n // Apply the splat\n return stringify(params[star]);\n }\n\n const keyMatch = segment.match(/^:([\\w-]+)(\\??)$/);\n if (keyMatch) {\n const [, key, optional] = keyMatch;\n let param = params[key as PathParam];\n invariant(optional === \"?\" || param != null, `Missing \":${key}\" param`);\n return stringify(param);\n }\n\n // Remove any optional markers from optional static segments\n return segment.replace(/\\?$/g, \"\");\n })\n // Remove empty segments\n .filter((segment) => !!segment);\n\n return prefix + segments.join(\"/\");\n}\n\n/**\n * A PathPattern is used to match on some portion of a URL pathname.\n */\nexport interface PathPattern {\n /**\n * A string to match against a URL pathname. May contain `:id`-style segments\n * to indicate placeholders for dynamic parameters. May also end with `/*` to\n * indicate matching the rest of the URL pathname.\n */\n path: Path;\n /**\n * Should be `true` if the static portions of the `path` should be matched in\n * the same case.\n */\n caseSensitive?: boolean;\n /**\n * Should be `true` if this pattern should match the entire URL pathname.\n */\n end?: boolean;\n}\n\n/**\n * A PathMatch contains info about how a PathPattern matched on a URL pathname.\n */\nexport interface PathMatch {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The pattern that was used to match.\n */\n pattern: PathPattern;\n}\n\ntype Mutable = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/v6/utils/match-path\n */\nexport function matchPath<\n ParamKey extends ParamParseKey,\n Path extends string\n>(\n pattern: PathPattern | Path,\n pathname: string\n): PathMatch | null {\n if (typeof pattern === \"string\") {\n pattern = { path: pattern, caseSensitive: false, end: true };\n }\n\n let [matcher, compiledParams] = compilePath(\n pattern.path,\n pattern.caseSensitive,\n pattern.end\n );\n\n let match = pathname.match(matcher);\n if (!match) return null;\n\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params: Params = compiledParams.reduce>(\n (memo, { paramName, isOptional }, index) => {\n // We need to compute the pathnameBase here using the raw splat value\n // instead of using params[\"*\"] later because it will be decoded then\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname\n .slice(0, matchedPathname.length - splatValue.length)\n .replace(/(.)\\/+$/, \"$1\");\n }\n\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo[paramName] = undefined;\n } else {\n memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n }\n return memo;\n },\n {}\n );\n\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern,\n };\n}\n\ntype CompiledPathParam = { paramName: string; isOptional?: boolean };\n\nfunction compilePath(\n path: string,\n caseSensitive = false,\n end = true\n): [RegExp, CompiledPathParam[]] {\n warning(\n path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"),\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n\n let params: CompiledPathParam[] = [];\n let regexpSource =\n \"^\" +\n path\n .replace(/\\/*\\*?$/, \"\") // Ignore trailing / and /*, we'll handle it below\n .replace(/^\\/*/, \"/\") // Make sure it has a leading /\n .replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\") // Escape special regex chars\n .replace(\n /\\/:([\\w-]+)(\\?)?/g,\n (_: string, paramName: string, isOptional) => {\n params.push({ paramName, isOptional: isOptional != null });\n return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n }\n );\n\n if (path.endsWith(\"*\")) {\n params.push({ paramName: \"*\" });\n regexpSource +=\n path === \"*\" || path === \"/*\"\n ? \"(.*)$\" // Already matched the initial /, just match the rest\n : \"(?:\\\\/(.+)|\\\\/*)$\"; // Don't include the / in params[\"*\"]\n } else if (end) {\n // When matching to the end, ignore trailing slashes\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n // If our path is non-empty and contains anything beyond an initial slash,\n // then we have _some_ form of path in our regex, so we should expect to\n // match only if we find the end of this path segment. Look for an optional\n // non-captured trailing slash (to match a portion of the URL) or the end\n // of the path (if we've matched to the end). We used to do this with a\n // word boundary but that gives false positives on routes like\n // /user-preferences since `-` counts as a word boundary.\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else {\n // Nothing to match for \"\" or \"/\"\n }\n\n let matcher = new RegExp(regexpSource, caseSensitive ? undefined : \"i\");\n\n return [matcher, params];\n}\n\nexport function decodePath(value: string) {\n try {\n return value\n .split(\"/\")\n .map((v) => decodeURIComponent(v).replace(/\\//g, \"%2F\"))\n .join(\"/\");\n } catch (error) {\n warning(\n false,\n `The URL path \"${value}\" could not be decoded because it is is a ` +\n `malformed URL segment. This is probably due to a bad percent ` +\n `encoding (${error}).`\n );\n\n return value;\n }\n}\n\n/**\n * @private\n */\nexport function stripBasename(\n pathname: string,\n basename: string\n): string | null {\n if (basename === \"/\") return pathname;\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n let startIndex = basename.endsWith(\"/\")\n ? basename.length - 1\n : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n // pathname does not start with basename/\n return null;\n }\n\n return pathname.slice(startIndex) || \"/\";\n}\n\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/v6/utils/resolve-path\n */\nexport function resolvePath(to: To, fromPathname = \"/\"): Path {\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\",\n } = typeof to === \"string\" ? parsePath(to) : to;\n\n let pathname = toPathname\n ? toPathname.startsWith(\"/\")\n ? toPathname\n : resolvePathname(toPathname, fromPathname)\n : fromPathname;\n\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash),\n };\n}\n\nfunction resolvePathname(relativePath: string, fromPathname: string): string {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n\n relativeSegments.forEach((segment) => {\n if (segment === \"..\") {\n // Keep the root \"\" segment so the pathname starts at /\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\n\nfunction getInvalidPathError(\n char: string,\n field: string,\n dest: string,\n path: Partial\n) {\n return (\n `Cannot include a '${char}' character in a manually specified ` +\n `\\`to.${field}\\` field [${JSON.stringify(\n path\n )}]. Please separate it out to the ` +\n `\\`to.${dest}\\` field. Alternatively you may provide the full path as ` +\n `a string in and the router will parse it for you.`\n );\n}\n\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don't\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same. Both of the following examples should link back to the root:\n *\n * \n * \n * \n *\n * \n * \n * }> // <-- Does not contribute\n * // <-- Does not contribute\n * \n * \n */\nexport function getPathContributingMatches<\n T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[]) {\n return matches.filter(\n (match, index) =>\n index === 0 || (match.route.path && match.route.path.length > 0)\n );\n}\n\n// Return the array of pathnames for the current route matches - used to\n// generate the routePathnames input for resolveTo()\nexport function getResolveToMatches<\n T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[], v7_relativeSplatPath: boolean) {\n let pathMatches = getPathContributingMatches(matches);\n\n // When v7_relativeSplatPath is enabled, use the full pathname for the leaf\n // match so we include splat values for \".\" links. See:\n // https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329\n if (v7_relativeSplatPath) {\n return pathMatches.map((match, idx) =>\n idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase\n );\n }\n\n return pathMatches.map((match) => match.pathnameBase);\n}\n\n/**\n * @private\n */\nexport function resolveTo(\n toArg: To,\n routePathnames: string[],\n locationPathname: string,\n isPathRelative = false\n): Path {\n let to: Partial;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = { ...toArg };\n\n invariant(\n !to.pathname || !to.pathname.includes(\"?\"),\n getInvalidPathError(\"?\", \"pathname\", \"search\", to)\n );\n invariant(\n !to.pathname || !to.pathname.includes(\"#\"),\n getInvalidPathError(\"#\", \"pathname\", \"hash\", to)\n );\n invariant(\n !to.search || !to.search.includes(\"#\"),\n getInvalidPathError(\"#\", \"search\", \"hash\", to)\n );\n }\n\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n\n let from: string;\n\n // Routing is relative to the current pathname if explicitly requested.\n //\n // If a pathname is explicitly provided in `to`, it should be relative to the\n // route context. This is explained in `Note on `` values` in our\n // migration guide from v5 as a means of disambiguation between `to` values\n // that begin with `/` and those that do not. However, this is problematic for\n // `to` values that do not provide a pathname. `to` can simply be a search or\n // hash string, in which case we should assume that the navigation is relative\n // to the current location's pathname and *not* the route pathname.\n if (toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n\n // With relative=\"route\" (the default), each leading .. segment means\n // \"go up one route\" instead of \"go up one URL segment\". This is a key\n // difference from how works and a major reason we call this a\n // \"to\" value instead of a \"href\".\n if (!isPathRelative && toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n\n to.pathname = toSegments.join(\"/\");\n }\n\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n\n let path = resolvePath(to, from);\n\n // Ensure the pathname has a trailing slash if the original \"to\" had one\n let hasExplicitTrailingSlash =\n toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n // Or if this was a link to the current path which has a trailing slash\n let hasCurrentTrailingSlash =\n (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (\n !path.pathname.endsWith(\"/\") &&\n (hasExplicitTrailingSlash || hasCurrentTrailingSlash)\n ) {\n path.pathname += \"/\";\n }\n\n return path;\n}\n\n/**\n * @private\n */\nexport function getToPathname(to: To): string | undefined {\n // Empty strings should be treated the same as / paths\n return to === \"\" || (to as Path).pathname === \"\"\n ? \"/\"\n : typeof to === \"string\"\n ? parsePath(to).pathname\n : to.pathname;\n}\n\n/**\n * @private\n */\nexport const joinPaths = (paths: string[]): string =>\n paths.join(\"/\").replace(/\\/\\/+/g, \"/\");\n\n/**\n * @private\n */\nexport const normalizePathname = (pathname: string): string =>\n pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\n\n/**\n * @private\n */\nexport const normalizeSearch = (search: string): string =>\n !search || search === \"?\"\n ? \"\"\n : search.startsWith(\"?\")\n ? search\n : \"?\" + search;\n\n/**\n * @private\n */\nexport const normalizeHash = (hash: string): string =>\n !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\n\nexport type JsonFunction = (\n data: Data,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n *\n * @deprecated The `json` method is deprecated in favor of returning raw objects.\n * This method will be removed in v7.\n */\nexport const json: JsonFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n let headers = new Headers(responseInit.headers);\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n\n return new Response(JSON.stringify(data), {\n ...responseInit,\n headers,\n });\n};\n\nexport class DataWithResponseInit {\n type: string = \"DataWithResponseInit\";\n data: D;\n init: ResponseInit | null;\n\n constructor(data: D, init?: ResponseInit) {\n this.data = data;\n this.init = init || null;\n }\n}\n\n/**\n * Create \"responses\" that contain `status`/`headers` without forcing\n * serialization into an actual `Response` - used by Remix single fetch\n */\nexport function data(data: D, init?: number | ResponseInit) {\n return new DataWithResponseInit(\n data,\n typeof init === \"number\" ? { status: init } : init\n );\n}\n\nexport interface TrackedPromise extends Promise {\n _tracked?: boolean;\n _data?: any;\n _error?: any;\n}\n\nexport class AbortedDeferredError extends Error {}\n\nexport class DeferredData {\n private pendingKeysSet: Set = new Set();\n private controller: AbortController;\n private abortPromise: Promise;\n private unlistenAbortSignal: () => void;\n private subscribers: Set<(aborted: boolean, settledKey?: string) => void> =\n new Set();\n data: Record;\n init?: ResponseInit;\n deferredKeys: string[] = [];\n\n constructor(data: Record, responseInit?: ResponseInit) {\n invariant(\n data && typeof data === \"object\" && !Array.isArray(data),\n \"defer() only accepts plain objects\"\n );\n\n // Set up an AbortController + Promise we can race against to exit early\n // cancellation\n let reject: (e: AbortedDeferredError) => void;\n this.abortPromise = new Promise((_, r) => (reject = r));\n this.controller = new AbortController();\n let onAbort = () =>\n reject(new AbortedDeferredError(\"Deferred data aborted\"));\n this.unlistenAbortSignal = () =>\n this.controller.signal.removeEventListener(\"abort\", onAbort);\n this.controller.signal.addEventListener(\"abort\", onAbort);\n\n this.data = Object.entries(data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: this.trackPromise(key, value),\n }),\n {}\n );\n\n if (this.done) {\n // All incoming values were resolved\n this.unlistenAbortSignal();\n }\n\n this.init = responseInit;\n }\n\n private trackPromise(\n key: string,\n value: Promise | unknown\n ): TrackedPromise | unknown {\n if (!(value instanceof Promise)) {\n return value;\n }\n\n this.deferredKeys.push(key);\n this.pendingKeysSet.add(key);\n\n // We store a little wrapper promise that will be extended with\n // _data/_error props upon resolve/reject\n let promise: TrackedPromise = Promise.race([value, this.abortPromise]).then(\n (data) => this.onSettle(promise, key, undefined, data as unknown),\n (error) => this.onSettle(promise, key, error as unknown)\n );\n\n // Register rejection listeners to avoid uncaught promise rejections on\n // errors or aborted deferred values\n promise.catch(() => {});\n\n Object.defineProperty(promise, \"_tracked\", { get: () => true });\n return promise;\n }\n\n private onSettle(\n promise: TrackedPromise,\n key: string,\n error: unknown,\n data?: unknown\n ): unknown {\n if (\n this.controller.signal.aborted &&\n error instanceof AbortedDeferredError\n ) {\n this.unlistenAbortSignal();\n Object.defineProperty(promise, \"_error\", { get: () => error });\n return Promise.reject(error);\n }\n\n this.pendingKeysSet.delete(key);\n\n if (this.done) {\n // Nothing left to abort!\n this.unlistenAbortSignal();\n }\n\n // If the promise was resolved/rejected with undefined, we'll throw an error as you\n // should always resolve with a value or null\n if (error === undefined && data === undefined) {\n let undefinedError = new Error(\n `Deferred data for key \"${key}\" resolved/rejected with \\`undefined\\`, ` +\n `you must resolve/reject with a value or \\`null\\`.`\n );\n Object.defineProperty(promise, \"_error\", { get: () => undefinedError });\n this.emit(false, key);\n return Promise.reject(undefinedError);\n }\n\n if (data === undefined) {\n Object.defineProperty(promise, \"_error\", { get: () => error });\n this.emit(false, key);\n return Promise.reject(error);\n }\n\n Object.defineProperty(promise, \"_data\", { get: () => data });\n this.emit(false, key);\n return data;\n }\n\n private emit(aborted: boolean, settledKey?: string) {\n this.subscribers.forEach((subscriber) => subscriber(aborted, settledKey));\n }\n\n subscribe(fn: (aborted: boolean, settledKey?: string) => void) {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n cancel() {\n this.controller.abort();\n this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n this.emit(true);\n }\n\n async resolveData(signal: AbortSignal) {\n let aborted = false;\n if (!this.done) {\n let onAbort = () => this.cancel();\n signal.addEventListener(\"abort\", onAbort);\n aborted = await new Promise((resolve) => {\n this.subscribe((aborted) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (aborted || this.done) {\n resolve(aborted);\n }\n });\n });\n }\n return aborted;\n }\n\n get done() {\n return this.pendingKeysSet.size === 0;\n }\n\n get unwrappedData() {\n invariant(\n this.data !== null && this.done,\n \"Can only unwrap data on initialized and settled deferreds\"\n );\n\n return Object.entries(this.data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: unwrapTrackedPromise(value),\n }),\n {}\n );\n }\n\n get pendingKeys() {\n return Array.from(this.pendingKeysSet);\n }\n}\n\nfunction isTrackedPromise(value: any): value is TrackedPromise {\n return (\n value instanceof Promise && (value as TrackedPromise)._tracked === true\n );\n}\n\nfunction unwrapTrackedPromise(value: any) {\n if (!isTrackedPromise(value)) {\n return value;\n }\n\n if (value._error) {\n throw value._error;\n }\n return value._data;\n}\n\nexport type DeferFunction = (\n data: Record,\n init?: number | ResponseInit\n) => DeferredData;\n\n/**\n * @deprecated The `defer` method is deprecated in favor of returning raw\n * objects. This method will be removed in v7.\n */\nexport const defer: DeferFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n return new DeferredData(data, responseInit);\n};\n\nexport type RedirectFunction = (\n url: string,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirect: RedirectFunction = (url, init = 302) => {\n let responseInit = init;\n if (typeof responseInit === \"number\") {\n responseInit = { status: responseInit };\n } else if (typeof responseInit.status === \"undefined\") {\n responseInit.status = 302;\n }\n\n let headers = new Headers(responseInit.headers);\n headers.set(\"Location\", url);\n\n return new Response(null, {\n ...responseInit,\n headers,\n });\n};\n\n/**\n * A redirect response that will force a document reload to the new location.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirectDocument: RedirectFunction = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Reload-Document\", \"true\");\n return response;\n};\n\n/**\n * A redirect response that will perform a `history.replaceState` instead of a\n * `history.pushState` for client-side navigation redirects.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const replace: RedirectFunction = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Replace\", \"true\");\n return response;\n};\n\nexport type ErrorResponse = {\n status: number;\n statusText: string;\n data: any;\n};\n\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n *\n * We don't export the class for public use since it's an implementation\n * detail, but we export the interface above so folks can build their own\n * abstractions around instances via isRouteErrorResponse()\n */\nexport class ErrorResponseImpl implements ErrorResponse {\n status: number;\n statusText: string;\n data: any;\n private error?: Error;\n private internal: boolean;\n\n constructor(\n status: number,\n statusText: string | undefined,\n data: any,\n internal = false\n ) {\n this.status = status;\n this.statusText = statusText || \"\";\n this.internal = internal;\n if (data instanceof Error) {\n this.data = data.toString();\n this.error = data;\n } else {\n this.data = data;\n }\n }\n}\n\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\nexport function isRouteErrorResponse(error: any): error is ErrorResponse {\n return (\n error != null &&\n typeof error.status === \"number\" &&\n typeof error.statusText === \"string\" &&\n typeof error.internal === \"boolean\" &&\n \"data\" in error\n );\n}\n","import type { History, Location, Path, To } from \"./history\";\nimport {\n Action as HistoryAction,\n createLocation,\n createPath,\n invariant,\n parsePath,\n warning,\n} from \"./history\";\nimport type {\n AgnosticDataRouteMatch,\n AgnosticDataRouteObject,\n DataStrategyMatch,\n AgnosticRouteObject,\n DataResult,\n DataStrategyFunction,\n DataStrategyFunctionArgs,\n DeferredData,\n DeferredResult,\n DetectErrorBoundaryFunction,\n ErrorResult,\n FormEncType,\n FormMethod,\n HTMLFormMethod,\n DataStrategyResult,\n ImmutableRouteKey,\n MapRoutePropertiesFunction,\n MutationFormMethod,\n RedirectResult,\n RouteData,\n RouteManifest,\n ShouldRevalidateFunctionArgs,\n Submission,\n SuccessResult,\n UIMatch,\n V7_FormMethod,\n V7_MutationFormMethod,\n AgnosticPatchRoutesOnNavigationFunction,\n DataWithResponseInit,\n} from \"./utils\";\nimport {\n ErrorResponseImpl,\n ResultType,\n convertRouteMatchToUiMatch,\n convertRoutesToDataRoutes,\n getPathContributingMatches,\n getResolveToMatches,\n immutableRouteKeys,\n isRouteErrorResponse,\n joinPaths,\n matchRoutes,\n matchRoutesImpl,\n resolveTo,\n stripBasename,\n} from \"./utils\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A Router instance manages all navigation and data loading/mutations\n */\nexport interface Router {\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the basename for the router\n */\n get basename(): RouterInit[\"basename\"];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the future config for the router\n */\n get future(): FutureConfig;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the current state of the router\n */\n get state(): RouterState;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the routes for this router instance\n */\n get routes(): AgnosticDataRouteObject[];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the window associated with the router\n */\n get window(): RouterInit[\"window\"];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Initialize the router, including adding history listeners and kicking off\n * initial data fetches. Returns a function to cleanup listeners and abort\n * any in-progress loads\n */\n initialize(): Router;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Subscribe to router.state updates\n *\n * @param fn function to call with the new state\n */\n subscribe(fn: RouterSubscriber): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Enable scroll restoration behavior in the router\n *\n * @param savedScrollPositions Object that will manage positions, in case\n * it's being restored from sessionStorage\n * @param getScrollPosition Function to get the active Y scroll position\n * @param getKey Function to get the key to use for restoration\n */\n enableScrollRestoration(\n savedScrollPositions: Record,\n getScrollPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Navigate forward/backward in the history stack\n * @param to Delta to move in the history stack\n */\n navigate(to: number): Promise;\n\n /**\n * Navigate to the given path\n * @param to Path to navigate to\n * @param opts Navigation options (method, submission, etc.)\n */\n navigate(to: To | null, opts?: RouterNavigateOptions): Promise;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a fetcher load/submission\n *\n * @param key Fetcher key\n * @param routeId Route that owns the fetcher\n * @param href href to fetch\n * @param opts Fetcher options, (method, submission, etc.)\n */\n fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a revalidation of all current route loaders and fetcher loads\n */\n revalidate(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to create an href for the given location\n * @param location\n */\n createHref(location: Location | URL): string;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to URL encode a destination path according to the internal\n * history implementation\n * @param to\n */\n encodeLocation(to: To): Path;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get/create a fetcher for the given key\n * @param key\n */\n getFetcher(key: string): Fetcher;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete the fetcher for a given key\n * @param key\n */\n deleteFetcher(key: string): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Cleanup listeners and abort any in-progress loads\n */\n dispose(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get a navigation blocker\n * @param key The identifier for the blocker\n * @param fn The blocker function implementation\n */\n getBlocker(key: string, fn: BlockerFunction): Blocker;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete a navigation blocker\n * @param key The identifier for the blocker\n */\n deleteBlocker(key: string): void;\n\n /**\n * @internal\n * PRIVATE DO NOT USE\n *\n * Patch additional children routes into an existing parent route\n * @param routeId The parent route id or a callback function accepting `patch`\n * to perform batch patching\n * @param children The additional children routes\n */\n patchRoutes(routeId: string | null, children: AgnosticRouteObject[]): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * HMR needs to pass in-flight route updates to React Router\n * TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute)\n */\n _internalSetRoutes(routes: AgnosticRouteObject[]): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal fetch AbortControllers accessed by unit tests\n */\n _internalFetchControllers: Map;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal pending DeferredData instances accessed by unit tests\n */\n _internalActiveDeferreds: Map;\n}\n\n/**\n * State maintained internally by the router. During a navigation, all states\n * reflect the the \"old\" location unless otherwise noted.\n */\nexport interface RouterState {\n /**\n * The action of the most recent navigation\n */\n historyAction: HistoryAction;\n\n /**\n * The current location reflected by the router\n */\n location: Location;\n\n /**\n * The current set of route matches\n */\n matches: AgnosticDataRouteMatch[];\n\n /**\n * Tracks whether we've completed our initial data load\n */\n initialized: boolean;\n\n /**\n * Current scroll position we should start at for a new view\n * - number -> scroll position to restore to\n * - false -> do not restore scroll at all (used during submissions)\n * - null -> don't have a saved position, scroll to hash or top of page\n */\n restoreScrollPosition: number | false | null;\n\n /**\n * Indicate whether this navigation should skip resetting the scroll position\n * if we are unable to restore the scroll position\n */\n preventScrollReset: boolean;\n\n /**\n * Tracks the state of the current navigation\n */\n navigation: Navigation;\n\n /**\n * Tracks any in-progress revalidations\n */\n revalidation: RevalidationState;\n\n /**\n * Data from the loaders for the current matches\n */\n loaderData: RouteData;\n\n /**\n * Data from the action for the current matches\n */\n actionData: RouteData | null;\n\n /**\n * Errors caught from loaders for the current matches\n */\n errors: RouteData | null;\n\n /**\n * Map of current fetchers\n */\n fetchers: Map;\n\n /**\n * Map of current blockers\n */\n blockers: Map;\n}\n\n/**\n * Data that can be passed into hydrate a Router from SSR\n */\nexport type HydrationState = Partial<\n Pick\n>;\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface FutureConfig {\n v7_fetcherPersist: boolean;\n v7_normalizeFormMethod: boolean;\n v7_partialHydration: boolean;\n v7_prependBasename: boolean;\n v7_relativeSplatPath: boolean;\n v7_skipActionErrorRevalidation: boolean;\n}\n\n/**\n * Initialization options for createRouter\n */\nexport interface RouterInit {\n routes: AgnosticRouteObject[];\n history: History;\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n future?: Partial;\n hydrationData?: HydrationState;\n window?: Window;\n dataStrategy?: DataStrategyFunction;\n patchRoutesOnNavigation?: AgnosticPatchRoutesOnNavigationFunction;\n}\n\n/**\n * State returned from a server-side query() call\n */\nexport interface StaticHandlerContext {\n basename: Router[\"basename\"];\n location: RouterState[\"location\"];\n matches: RouterState[\"matches\"];\n loaderData: RouterState[\"loaderData\"];\n actionData: RouterState[\"actionData\"];\n errors: RouterState[\"errors\"];\n statusCode: number;\n loaderHeaders: Record;\n actionHeaders: Record;\n activeDeferreds: Record | null;\n _deepestRenderedBoundaryId?: string | null;\n}\n\n/**\n * A StaticHandler instance manages a singular SSR navigation/fetch event\n */\nexport interface StaticHandler {\n dataRoutes: AgnosticDataRouteObject[];\n query(\n request: Request,\n opts?: {\n requestContext?: unknown;\n skipLoaderErrorBubbling?: boolean;\n dataStrategy?: DataStrategyFunction;\n }\n ): Promise;\n queryRoute(\n request: Request,\n opts?: {\n routeId?: string;\n requestContext?: unknown;\n dataStrategy?: DataStrategyFunction;\n }\n ): Promise;\n}\n\ntype ViewTransitionOpts = {\n currentLocation: Location;\n nextLocation: Location;\n};\n\n/**\n * Subscriber function signature for changes to router state\n */\nexport interface RouterSubscriber {\n (\n state: RouterState,\n opts: {\n deletedFetchers: string[];\n viewTransitionOpts?: ViewTransitionOpts;\n flushSync: boolean;\n }\n ): void;\n}\n\n/**\n * Function signature for determining the key to be used in scroll restoration\n * for a given location\n */\nexport interface GetScrollRestorationKeyFunction {\n (location: Location, matches: UIMatch[]): string | null;\n}\n\n/**\n * Function signature for determining the current scroll position\n */\nexport interface GetScrollPositionFunction {\n (): number;\n}\n\nexport type RelativeRoutingType = \"route\" | \"path\";\n\n// Allowed for any navigation or fetch\ntype BaseNavigateOrFetchOptions = {\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n flushSync?: boolean;\n};\n\n// Only allowed for navigations\ntype BaseNavigateOptions = BaseNavigateOrFetchOptions & {\n replace?: boolean;\n state?: any;\n fromRouteId?: string;\n viewTransition?: boolean;\n};\n\n// Only allowed for submission navigations\ntype BaseSubmissionOptions = {\n formMethod?: HTMLFormMethod;\n formEncType?: FormEncType;\n} & (\n | { formData: FormData; body?: undefined }\n | { formData?: undefined; body: any }\n);\n\n/**\n * Options for a navigate() call for a normal (non-submission) navigation\n */\ntype LinkNavigateOptions = BaseNavigateOptions;\n\n/**\n * Options for a navigate() call for a submission navigation\n */\ntype SubmissionNavigateOptions = BaseNavigateOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to navigate() for a navigation\n */\nexport type RouterNavigateOptions =\n | LinkNavigateOptions\n | SubmissionNavigateOptions;\n\n/**\n * Options for a fetch() load\n */\ntype LoadFetchOptions = BaseNavigateOrFetchOptions;\n\n/**\n * Options for a fetch() submission\n */\ntype SubmitFetchOptions = BaseNavigateOrFetchOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to fetch()\n */\nexport type RouterFetchOptions = LoadFetchOptions | SubmitFetchOptions;\n\n/**\n * Potential states for state.navigation\n */\nexport type NavigationStates = {\n Idle: {\n state: \"idle\";\n location: undefined;\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n formData: undefined;\n json: undefined;\n text: undefined;\n };\n Loading: {\n state: \"loading\";\n location: Location;\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n text: Submission[\"text\"] | undefined;\n };\n Submitting: {\n state: \"submitting\";\n location: Location;\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n text: Submission[\"text\"];\n };\n};\n\nexport type Navigation = NavigationStates[keyof NavigationStates];\n\nexport type RevalidationState = \"idle\" | \"loading\";\n\n/**\n * Potential states for fetchers\n */\ntype FetcherStates = {\n Idle: {\n state: \"idle\";\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n text: undefined;\n formData: undefined;\n json: undefined;\n data: TData | undefined;\n };\n Loading: {\n state: \"loading\";\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n text: Submission[\"text\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n data: TData | undefined;\n };\n Submitting: {\n state: \"submitting\";\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n text: Submission[\"text\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n data: TData | undefined;\n };\n};\n\nexport type Fetcher =\n FetcherStates[keyof FetcherStates];\n\ninterface BlockerBlocked {\n state: \"blocked\";\n reset(): void;\n proceed(): void;\n location: Location;\n}\n\ninterface BlockerUnblocked {\n state: \"unblocked\";\n reset: undefined;\n proceed: undefined;\n location: undefined;\n}\n\ninterface BlockerProceeding {\n state: \"proceeding\";\n reset: undefined;\n proceed: undefined;\n location: Location;\n}\n\nexport type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;\n\nexport type BlockerFunction = (args: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n}) => boolean;\n\ninterface ShortCircuitable {\n /**\n * startNavigation does not need to complete the navigation because we\n * redirected or got interrupted\n */\n shortCircuited?: boolean;\n}\n\ntype PendingActionResult = [string, SuccessResult | ErrorResult];\n\ninterface HandleActionResult extends ShortCircuitable {\n /**\n * Route matches which may have been updated from fog of war discovery\n */\n matches?: RouterState[\"matches\"];\n /**\n * Tuple for the returned or thrown value from the current action. The routeId\n * is the action route for success and the bubbled boundary route for errors.\n */\n pendingActionResult?: PendingActionResult;\n}\n\ninterface HandleLoadersResult extends ShortCircuitable {\n /**\n * Route matches which may have been updated from fog of war discovery\n */\n matches?: RouterState[\"matches\"];\n /**\n * loaderData returned from the current set of loaders\n */\n loaderData?: RouterState[\"loaderData\"];\n /**\n * errors thrown from the current set of loaders\n */\n errors?: RouterState[\"errors\"];\n}\n\n/**\n * Cached info for active fetcher.load() instances so they can participate\n * in revalidation\n */\ninterface FetchLoadMatch {\n routeId: string;\n path: string;\n}\n\n/**\n * Identified fetcher.load() calls that need to be revalidated\n */\ninterface RevalidatingFetcher extends FetchLoadMatch {\n key: string;\n match: AgnosticDataRouteMatch | null;\n matches: AgnosticDataRouteMatch[] | null;\n controller: AbortController | null;\n}\n\nconst validMutationMethodsArr: MutationFormMethod[] = [\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n];\nconst validMutationMethods = new Set(\n validMutationMethodsArr\n);\n\nconst validRequestMethodsArr: FormMethod[] = [\n \"get\",\n ...validMutationMethodsArr,\n];\nconst validRequestMethods = new Set(validRequestMethodsArr);\n\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\n\nexport const IDLE_NAVIGATION: NavigationStates[\"Idle\"] = {\n state: \"idle\",\n location: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_FETCHER: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n data: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_BLOCKER: BlockerUnblocked = {\n state: \"unblocked\",\n proceed: undefined,\n reset: undefined,\n location: undefined,\n};\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\nconst defaultMapRouteProperties: MapRoutePropertiesFunction = (route) => ({\n hasErrorBoundary: Boolean(route.hasErrorBoundary),\n});\n\nconst TRANSITIONS_STORAGE_KEY = \"remix-router-transitions\";\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create a router and listen to history POP navigations\n */\nexport function createRouter(init: RouterInit): Router {\n const routerWindow = init.window\n ? init.window\n : typeof window !== \"undefined\"\n ? window\n : undefined;\n const isBrowser =\n typeof routerWindow !== \"undefined\" &&\n typeof routerWindow.document !== \"undefined\" &&\n typeof routerWindow.document.createElement !== \"undefined\";\n const isServer = !isBrowser;\n\n invariant(\n init.routes.length > 0,\n \"You must provide a non-empty routes array to createRouter\"\n );\n\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (init.mapRouteProperties) {\n mapRouteProperties = init.mapRouteProperties;\n } else if (init.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = init.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n\n // Routes keyed by ID\n let manifest: RouteManifest = {};\n // Routes in tree format for matching\n let dataRoutes = convertRoutesToDataRoutes(\n init.routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n let inFlightDataRoutes: AgnosticDataRouteObject[] | undefined;\n let basename = init.basename || \"/\";\n let dataStrategyImpl = init.dataStrategy || defaultDataStrategy;\n let patchRoutesOnNavigationImpl = init.patchRoutesOnNavigation;\n\n // Config driven behavior flags\n let future: FutureConfig = {\n v7_fetcherPersist: false,\n v7_normalizeFormMethod: false,\n v7_partialHydration: false,\n v7_prependBasename: false,\n v7_relativeSplatPath: false,\n v7_skipActionErrorRevalidation: false,\n ...init.future,\n };\n // Cleanup function for history\n let unlistenHistory: (() => void) | null = null;\n // Externally-provided functions to call on all state changes\n let subscribers = new Set();\n // Externally-provided object to hold scroll restoration locations during routing\n let savedScrollPositions: Record | null = null;\n // Externally-provided function to get scroll restoration keys\n let getScrollRestorationKey: GetScrollRestorationKeyFunction | null = null;\n // Externally-provided function to get current scroll position\n let getScrollPosition: GetScrollPositionFunction | null = null;\n // One-time flag to control the initial hydration scroll restoration. Because\n // we don't get the saved positions from until _after_\n // the initial render, we need to manually trigger a separate updateState to\n // send along the restoreScrollPosition\n // Set to true if we have `hydrationData` since we assume we were SSR'd and that\n // SSR did the initial scroll restoration.\n let initialScrollRestored = init.hydrationData != null;\n\n let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n let initialMatchesIsFOW = false;\n let initialErrors: RouteData | null = null;\n\n if (initialMatches == null && !patchRoutesOnNavigationImpl) {\n // If we do not match a user-provided-route, fall back to the root\n // to allow the error boundary to take over\n let error = getInternalRouterError(404, {\n pathname: init.history.location.pathname,\n });\n let { matches, route } = getShortCircuitMatches(dataRoutes);\n initialMatches = matches;\n initialErrors = { [route.id]: error };\n }\n\n // In SPA apps, if the user provided a patchRoutesOnNavigation implementation and\n // our initial match is a splat route, clear them out so we run through lazy\n // discovery on hydration in case there's a more accurate lazy route match.\n // In SSR apps (with `hydrationData`), we expect that the server will send\n // up the proper matched routes so we don't want to run lazy discovery on\n // initial hydration and want to hydrate into the splat route.\n if (initialMatches && !init.hydrationData) {\n let fogOfWar = checkFogOfWar(\n initialMatches,\n dataRoutes,\n init.history.location.pathname\n );\n if (fogOfWar.active) {\n initialMatches = null;\n }\n }\n\n let initialized: boolean;\n if (!initialMatches) {\n initialized = false;\n initialMatches = [];\n\n // If partial hydration and fog of war is enabled, we will be running\n // `patchRoutesOnNavigation` during hydration so include any partial matches as\n // the initial matches so we can properly render `HydrateFallback`'s\n if (future.v7_partialHydration) {\n let fogOfWar = checkFogOfWar(\n null,\n dataRoutes,\n init.history.location.pathname\n );\n if (fogOfWar.active && fogOfWar.matches) {\n initialMatchesIsFOW = true;\n initialMatches = fogOfWar.matches;\n }\n }\n } else if (initialMatches.some((m) => m.route.lazy)) {\n // All initialMatches need to be loaded before we're ready. If we have lazy\n // functions around still then we'll need to run them in initialize()\n initialized = false;\n } else if (!initialMatches.some((m) => m.route.loader)) {\n // If we've got no loaders to run, then we're good to go\n initialized = true;\n } else if (future.v7_partialHydration) {\n // If partial hydration is enabled, we're initialized so long as we were\n // provided with hydrationData for every route with a loader, and no loaders\n // were marked for explicit hydration\n let loaderData = init.hydrationData ? init.hydrationData.loaderData : null;\n let errors = init.hydrationData ? init.hydrationData.errors : null;\n // If errors exist, don't consider routes below the boundary\n if (errors) {\n let idx = initialMatches.findIndex(\n (m) => errors![m.route.id] !== undefined\n );\n initialized = initialMatches\n .slice(0, idx + 1)\n .every((m) => !shouldLoadRouteOnHydration(m.route, loaderData, errors));\n } else {\n initialized = initialMatches.every(\n (m) => !shouldLoadRouteOnHydration(m.route, loaderData, errors)\n );\n }\n } else {\n // Without partial hydration - we're initialized if we were provided any\n // hydrationData - which is expected to be complete\n initialized = init.hydrationData != null;\n }\n\n let router: Router;\n let state: RouterState = {\n historyAction: init.history.action,\n location: init.history.location,\n matches: initialMatches,\n initialized,\n navigation: IDLE_NAVIGATION,\n // Don't restore on initial updateState() if we were SSR'd\n restoreScrollPosition: init.hydrationData != null ? false : null,\n preventScrollReset: false,\n revalidation: \"idle\",\n loaderData: (init.hydrationData && init.hydrationData.loaderData) || {},\n actionData: (init.hydrationData && init.hydrationData.actionData) || null,\n errors: (init.hydrationData && init.hydrationData.errors) || initialErrors,\n fetchers: new Map(),\n blockers: new Map(),\n };\n\n // -- Stateful internal variables to manage navigations --\n // Current navigation in progress (to be committed in completeNavigation)\n let pendingAction: HistoryAction = HistoryAction.Pop;\n\n // Should the current navigation prevent the scroll reset if scroll cannot\n // be restored?\n let pendingPreventScrollReset = false;\n\n // AbortController for the active navigation\n let pendingNavigationController: AbortController | null;\n\n // Should the current navigation enable document.startViewTransition?\n let pendingViewTransitionEnabled = false;\n\n // Store applied view transitions so we can apply them on POP\n let appliedViewTransitions: Map> = new Map<\n string,\n Set\n >();\n\n // Cleanup function for persisting applied transitions to sessionStorage\n let removePageHideEventListener: (() => void) | null = null;\n\n // We use this to avoid touching history in completeNavigation if a\n // revalidation is entirely uninterrupted\n let isUninterruptedRevalidation = false;\n\n // Use this internal flag to force revalidation of all loaders:\n // - submissions (completed or interrupted)\n // - useRevalidator()\n // - X-Remix-Revalidate (from redirect)\n let isRevalidationRequired = false;\n\n // Use this internal array to capture routes that require revalidation due\n // to a cancelled deferred on action submission\n let cancelledDeferredRoutes: string[] = [];\n\n // Use this internal array to capture fetcher loads that were cancelled by an\n // action navigation and require revalidation\n let cancelledFetcherLoads: Set = new Set();\n\n // AbortControllers for any in-flight fetchers\n let fetchControllers = new Map();\n\n // Track loads based on the order in which they started\n let incrementingLoadId = 0;\n\n // Track the outstanding pending navigation data load to be compared against\n // the globally incrementing load when a fetcher load lands after a completed\n // navigation\n let pendingNavigationLoadId = -1;\n\n // Fetchers that triggered data reloads as a result of their actions\n let fetchReloadIds = new Map();\n\n // Fetchers that triggered redirect navigations\n let fetchRedirectIds = new Set();\n\n // Most recent href/match for fetcher.load calls for fetchers\n let fetchLoadMatches = new Map();\n\n // Ref-count mounted fetchers so we know when it's ok to clean them up\n let activeFetchers = new Map();\n\n // Fetchers that have requested a delete when using v7_fetcherPersist,\n // they'll be officially removed after they return to idle\n let deletedFetchers = new Set();\n\n // Store DeferredData instances for active route matches. When a\n // route loader returns defer() we stick one in here. Then, when a nested\n // promise resolves we update loaderData. If a new navigation starts we\n // cancel active deferreds for eliminated routes.\n let activeDeferreds = new Map();\n\n // Store blocker functions in a separate Map outside of router state since\n // we don't need to update UI state if they change\n let blockerFunctions = new Map();\n\n // Map of pending patchRoutesOnNavigation() promises (keyed by path/matches) so\n // that we only kick them off once for a given combo\n let pendingPatchRoutes = new Map<\n string,\n ReturnType\n >();\n\n // Flag to ignore the next history update, so we can revert the URL change on\n // a POP navigation that was blocked by the user without touching router state\n let unblockBlockerHistoryUpdate: (() => void) | undefined = undefined;\n\n // Initialize the router, all side effects should be kicked off from here.\n // Implemented as a Fluent API for ease of:\n // let router = createRouter(init).initialize();\n function initialize() {\n // If history informs us of a POP navigation, start the navigation but do not update\n // state. We'll update our own state once the navigation completes\n unlistenHistory = init.history.listen(\n ({ action: historyAction, location, delta }) => {\n // Ignore this event if it was just us resetting the URL from a\n // blocked POP navigation\n if (unblockBlockerHistoryUpdate) {\n unblockBlockerHistoryUpdate();\n unblockBlockerHistoryUpdate = undefined;\n return;\n }\n\n warning(\n blockerFunctions.size === 0 || delta != null,\n \"You are trying to use a blocker on a POP navigation to a location \" +\n \"that was not created by @remix-run/router. This will fail silently in \" +\n \"production. This can happen if you are navigating outside the router \" +\n \"via `window.history.pushState`/`window.location.hash` instead of using \" +\n \"router navigation APIs. This can also happen if you are using \" +\n \"createHashRouter and the user manually changes the URL.\"\n );\n\n let blockerKey = shouldBlockNavigation({\n currentLocation: state.location,\n nextLocation: location,\n historyAction,\n });\n\n if (blockerKey && delta != null) {\n // Restore the URL to match the current UI, but don't update router state\n let nextHistoryUpdatePromise = new Promise((resolve) => {\n unblockBlockerHistoryUpdate = resolve;\n });\n init.history.go(delta * -1);\n\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location,\n });\n // Re-do the same POP navigation we just blocked, after the url\n // restoration is also complete. See:\n // https://github.com/remix-run/react-router/issues/11613\n nextHistoryUpdatePromise.then(() => init.history.go(delta));\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return startNavigation(historyAction, location);\n }\n );\n\n if (isBrowser) {\n // FIXME: This feels gross. How can we cleanup the lines between\n // scrollRestoration/appliedTransitions persistance?\n restoreAppliedTransitions(routerWindow, appliedViewTransitions);\n let _saveAppliedTransitions = () =>\n persistAppliedTransitions(routerWindow, appliedViewTransitions);\n routerWindow.addEventListener(\"pagehide\", _saveAppliedTransitions);\n removePageHideEventListener = () =>\n routerWindow.removeEventListener(\"pagehide\", _saveAppliedTransitions);\n }\n\n // Kick off initial data load if needed. Use Pop to avoid modifying history\n // Note we don't do any handling of lazy here. For SPA's it'll get handled\n // in the normal navigation flow. For SSR it's expected that lazy modules are\n // resolved prior to router creation since we can't go into a fallbackElement\n // UI for SSR'd apps\n if (!state.initialized) {\n startNavigation(HistoryAction.Pop, state.location, {\n initialHydration: true,\n });\n }\n\n return router;\n }\n\n // Clean up a router and it's side effects\n function dispose() {\n if (unlistenHistory) {\n unlistenHistory();\n }\n if (removePageHideEventListener) {\n removePageHideEventListener();\n }\n subscribers.clear();\n pendingNavigationController && pendingNavigationController.abort();\n state.fetchers.forEach((_, key) => deleteFetcher(key));\n state.blockers.forEach((_, key) => deleteBlocker(key));\n }\n\n // Subscribe to state updates for the router\n function subscribe(fn: RouterSubscriber) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n }\n\n // Update our state and notify the calling context of the change\n function updateState(\n newState: Partial,\n opts: {\n flushSync?: boolean;\n viewTransitionOpts?: ViewTransitionOpts;\n } = {}\n ): void {\n state = {\n ...state,\n ...newState,\n };\n\n // Prep fetcher cleanup so we can tell the UI which fetcher data entries\n // can be removed\n let completedFetchers: string[] = [];\n let deletedFetchersKeys: string[] = [];\n\n if (future.v7_fetcherPersist) {\n state.fetchers.forEach((fetcher, key) => {\n if (fetcher.state === \"idle\") {\n if (deletedFetchers.has(key)) {\n // Unmounted from the UI and can be totally removed\n deletedFetchersKeys.push(key);\n } else {\n // Returned to idle but still mounted in the UI, so semi-remains for\n // revalidations and such\n completedFetchers.push(key);\n }\n }\n });\n }\n\n // Remove any lingering deleted fetchers that have already been removed\n // from state.fetchers\n deletedFetchers.forEach((key) => {\n if (!state.fetchers.has(key) && !fetchControllers.has(key)) {\n deletedFetchersKeys.push(key);\n }\n });\n\n // Iterate over a local copy so that if flushSync is used and we end up\n // removing and adding a new subscriber due to the useCallback dependencies,\n // we don't get ourselves into a loop calling the new subscriber immediately\n [...subscribers].forEach((subscriber) =>\n subscriber(state, {\n deletedFetchers: deletedFetchersKeys,\n viewTransitionOpts: opts.viewTransitionOpts,\n flushSync: opts.flushSync === true,\n })\n );\n\n // Remove idle fetchers from state since we only care about in-flight fetchers.\n if (future.v7_fetcherPersist) {\n completedFetchers.forEach((key) => state.fetchers.delete(key));\n deletedFetchersKeys.forEach((key) => deleteFetcher(key));\n } else {\n // We already called deleteFetcher() on these, can remove them from this\n // Set now that we've handed the keys off to the data layer\n deletedFetchersKeys.forEach((key) => deletedFetchers.delete(key));\n }\n }\n\n // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n // and setting state.[historyAction/location/matches] to the new route.\n // - Location is a required param\n // - Navigation will always be set to IDLE_NAVIGATION\n // - Can pass any other state in newState\n function completeNavigation(\n location: Location,\n newState: Partial>,\n { flushSync }: { flushSync?: boolean } = {}\n ): void {\n // Deduce if we're in a loading/actionReload state:\n // - We have committed actionData in the store\n // - The current navigation was a mutation submission\n // - We're past the submitting state and into the loading state\n // - The location being loaded is not the result of a redirect\n let isActionReload =\n state.actionData != null &&\n state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n state.navigation.state === \"loading\" &&\n location.state?._isRedirect !== true;\n\n let actionData: RouteData | null;\n if (newState.actionData) {\n if (Object.keys(newState.actionData).length > 0) {\n actionData = newState.actionData;\n } else {\n // Empty actionData -> clear prior actionData due to an action error\n actionData = null;\n }\n } else if (isActionReload) {\n // Keep the current data if we're wrapping up the action reload\n actionData = state.actionData;\n } else {\n // Clear actionData on any other completed navigations\n actionData = null;\n }\n\n // Always preserve any existing loaderData from re-used routes\n let loaderData = newState.loaderData\n ? mergeLoaderData(\n state.loaderData,\n newState.loaderData,\n newState.matches || [],\n newState.errors\n )\n : state.loaderData;\n\n // On a successful navigation we can assume we got through all blockers\n // so we can start fresh\n let blockers = state.blockers;\n if (blockers.size > 0) {\n blockers = new Map(blockers);\n blockers.forEach((_, k) => blockers.set(k, IDLE_BLOCKER));\n }\n\n // Always respect the user flag. Otherwise don't reset on mutation\n // submission navigations unless they redirect\n let preventScrollReset =\n pendingPreventScrollReset === true ||\n (state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n location.state?._isRedirect !== true);\n\n // Commit any in-flight routes at the end of the HMR revalidation \"navigation\"\n if (inFlightDataRoutes) {\n dataRoutes = inFlightDataRoutes;\n inFlightDataRoutes = undefined;\n }\n\n if (isUninterruptedRevalidation) {\n // If this was an uninterrupted revalidation then do not touch history\n } else if (pendingAction === HistoryAction.Pop) {\n // Do nothing for POP - URL has already been updated\n } else if (pendingAction === HistoryAction.Push) {\n init.history.push(location, location.state);\n } else if (pendingAction === HistoryAction.Replace) {\n init.history.replace(location, location.state);\n }\n\n let viewTransitionOpts: ViewTransitionOpts | undefined;\n\n // On POP, enable transitions if they were enabled on the original navigation\n if (pendingAction === HistoryAction.Pop) {\n // Forward takes precedence so they behave like the original navigation\n let priorPaths = appliedViewTransitions.get(state.location.pathname);\n if (priorPaths && priorPaths.has(location.pathname)) {\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location,\n };\n } else if (appliedViewTransitions.has(location.pathname)) {\n // If we don't have a previous forward nav, assume we're popping back to\n // the new location and enable if that location previously enabled\n viewTransitionOpts = {\n currentLocation: location,\n nextLocation: state.location,\n };\n }\n } else if (pendingViewTransitionEnabled) {\n // Store the applied transition on PUSH/REPLACE\n let toPaths = appliedViewTransitions.get(state.location.pathname);\n if (toPaths) {\n toPaths.add(location.pathname);\n } else {\n toPaths = new Set([location.pathname]);\n appliedViewTransitions.set(state.location.pathname, toPaths);\n }\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location,\n };\n }\n\n updateState(\n {\n ...newState, // matches, errors, fetchers go through as-is\n actionData,\n loaderData,\n historyAction: pendingAction,\n location,\n initialized: true,\n navigation: IDLE_NAVIGATION,\n revalidation: \"idle\",\n restoreScrollPosition: getSavedScrollPosition(\n location,\n newState.matches || state.matches\n ),\n preventScrollReset,\n blockers,\n },\n {\n viewTransitionOpts,\n flushSync: flushSync === true,\n }\n );\n\n // Reset stateful navigation vars\n pendingAction = HistoryAction.Pop;\n pendingPreventScrollReset = false;\n pendingViewTransitionEnabled = false;\n isUninterruptedRevalidation = false;\n isRevalidationRequired = false;\n cancelledDeferredRoutes = [];\n }\n\n // Trigger a navigation event, which can either be a numerical POP or a PUSH\n // replace with an optional submission\n async function navigate(\n to: number | To | null,\n opts?: RouterNavigateOptions\n ): Promise {\n if (typeof to === \"number\") {\n init.history.go(to);\n return;\n }\n\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n to,\n future.v7_relativeSplatPath,\n opts?.fromRouteId,\n opts?.relative\n );\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n false,\n normalizedPath,\n opts\n );\n\n let currentLocation = state.location;\n let nextLocation = createLocation(state.location, path, opts && opts.state);\n\n // When using navigate as a PUSH/REPLACE we aren't reading an already-encoded\n // URL from window.location, so we need to encode it here so the behavior\n // remains the same as POP and non-data-router usages. new URL() does all\n // the same encoding we'd get from a history.pushState/window.location read\n // without having to touch history\n nextLocation = {\n ...nextLocation,\n ...init.history.encodeLocation(nextLocation),\n };\n\n let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n\n let historyAction = HistoryAction.Push;\n\n if (userReplace === true) {\n historyAction = HistoryAction.Replace;\n } else if (userReplace === false) {\n // no-op\n } else if (\n submission != null &&\n isMutationMethod(submission.formMethod) &&\n submission.formAction === state.location.pathname + state.location.search\n ) {\n // By default on submissions to the current location we REPLACE so that\n // users don't have to double-click the back button to get to the prior\n // location. If the user redirects to a different location from the\n // action/loader this will be ignored and the redirect will be a PUSH\n historyAction = HistoryAction.Replace;\n }\n\n let preventScrollReset =\n opts && \"preventScrollReset\" in opts\n ? opts.preventScrollReset === true\n : undefined;\n\n let flushSync = (opts && opts.flushSync) === true;\n\n let blockerKey = shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n });\n\n if (blockerKey) {\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location: nextLocation,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location: nextLocation,\n });\n // Send the same navigation through\n navigate(to, opts);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return await startNavigation(historyAction, nextLocation, {\n submission,\n // Send through the formData serialization error if we have one so we can\n // render at the right error boundary after we match routes\n pendingError: error,\n preventScrollReset,\n replace: opts && opts.replace,\n enableViewTransition: opts && opts.viewTransition,\n flushSync,\n });\n }\n\n // Revalidate all current loaders. If a navigation is in progress or if this\n // is interrupted by a navigation, allow this to \"succeed\" by calling all\n // loaders during the next loader round\n function revalidate() {\n interruptActiveLoads();\n updateState({ revalidation: \"loading\" });\n\n // If we're currently submitting an action, we don't need to start a new\n // navigation, we'll just let the follow up loader execution call all loaders\n if (state.navigation.state === \"submitting\") {\n return;\n }\n\n // If we're currently in an idle state, start a new navigation for the current\n // action/location and mark it as uninterrupted, which will skip the history\n // update in completeNavigation\n if (state.navigation.state === \"idle\") {\n startNavigation(state.historyAction, state.location, {\n startUninterruptedRevalidation: true,\n });\n return;\n }\n\n // Otherwise, if we're currently in a loading state, just start a new\n // navigation to the navigation.location but do not trigger an uninterrupted\n // revalidation so that history correctly updates once the navigation completes\n startNavigation(\n pendingAction || state.historyAction,\n state.navigation.location,\n {\n overrideNavigation: state.navigation,\n // Proxy through any rending view transition\n enableViewTransition: pendingViewTransitionEnabled === true,\n }\n );\n }\n\n // Start a navigation to the given action/location. Can optionally provide a\n // overrideNavigation which will override the normalLoad in the case of a redirect\n // navigation\n async function startNavigation(\n historyAction: HistoryAction,\n location: Location,\n opts?: {\n initialHydration?: boolean;\n submission?: Submission;\n fetcherSubmission?: Submission;\n overrideNavigation?: Navigation;\n pendingError?: ErrorResponseImpl;\n startUninterruptedRevalidation?: boolean;\n preventScrollReset?: boolean;\n replace?: boolean;\n enableViewTransition?: boolean;\n flushSync?: boolean;\n }\n ): Promise {\n // Abort any in-progress navigations and start a new one. Unset any ongoing\n // uninterrupted revalidations unless told otherwise, since we want this\n // new navigation to update history normally\n pendingNavigationController && pendingNavigationController.abort();\n pendingNavigationController = null;\n pendingAction = historyAction;\n isUninterruptedRevalidation =\n (opts && opts.startUninterruptedRevalidation) === true;\n\n // Save the current scroll position every time we start a new navigation,\n // and track whether we should reset scroll on completion\n saveScrollPosition(state.location, state.matches);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let loadingNavigation = opts && opts.overrideNavigation;\n let matches =\n opts?.initialHydration &&\n state.matches &&\n state.matches.length > 0 &&\n !initialMatchesIsFOW\n ? // `matchRoutes()` has already been called if we're in here via `router.initialize()`\n state.matches\n : matchRoutes(routesToUse, location, basename);\n let flushSync = (opts && opts.flushSync) === true;\n\n let fogOfWar = checkFogOfWar(matches, routesToUse, location.pathname);\n if (fogOfWar.active && fogOfWar.matches) {\n matches = fogOfWar.matches;\n }\n\n // Short circuit with a 404 on the root error boundary if we match nothing\n if (!matches) {\n let { error, notFoundMatches, route } = handleNavigational404(\n location.pathname\n );\n completeNavigation(\n location,\n {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error,\n },\n },\n { flushSync }\n );\n return;\n }\n\n // Short circuit if it's only a hash change and not a revalidation or\n // mutation submission.\n //\n // Ignore on initial page loads because since the initial hydration will always\n // be \"same hash\". For example, on /page#hash and submit a \n // which will default to a navigation to /page\n if (\n state.initialized &&\n !isRevalidationRequired &&\n isHashChangeOnly(state.location, location) &&\n !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))\n ) {\n completeNavigation(location, { matches }, { flushSync });\n return;\n }\n\n // Create a controller/Request for this navigation\n pendingNavigationController = new AbortController();\n let request = createClientSideRequest(\n init.history,\n location,\n pendingNavigationController.signal,\n opts && opts.submission\n );\n let pendingActionResult: PendingActionResult | undefined;\n\n if (opts && opts.pendingError) {\n // If we have a pendingError, it means the user attempted a GET submission\n // with binary FormData so assign here and skip to handleLoaders. That\n // way we handle calling loaders above the boundary etc. It's not really\n // different from an actionError in that sense.\n pendingActionResult = [\n findNearestBoundary(matches).route.id,\n { type: ResultType.error, error: opts.pendingError },\n ];\n } else if (\n opts &&\n opts.submission &&\n isMutationMethod(opts.submission.formMethod)\n ) {\n // Call action if we received an action submission\n let actionResult = await handleAction(\n request,\n location,\n opts.submission,\n matches,\n fogOfWar.active,\n { replace: opts.replace, flushSync }\n );\n\n if (actionResult.shortCircuited) {\n return;\n }\n\n // If we received a 404 from handleAction, it's because we couldn't lazily\n // discover the destination route so we don't want to call loaders\n if (actionResult.pendingActionResult) {\n let [routeId, result] = actionResult.pendingActionResult;\n if (\n isErrorResult(result) &&\n isRouteErrorResponse(result.error) &&\n result.error.status === 404\n ) {\n pendingNavigationController = null;\n\n completeNavigation(location, {\n matches: actionResult.matches,\n loaderData: {},\n errors: {\n [routeId]: result.error,\n },\n });\n return;\n }\n }\n\n matches = actionResult.matches || matches;\n pendingActionResult = actionResult.pendingActionResult;\n loadingNavigation = getLoadingNavigation(location, opts.submission);\n flushSync = false;\n // No need to do fog of war matching again on loader execution\n fogOfWar.active = false;\n\n // Create a GET request for the loaders\n request = createClientSideRequest(\n init.history,\n request.url,\n request.signal\n );\n }\n\n // Call loaders\n let {\n shortCircuited,\n matches: updatedMatches,\n loaderData,\n errors,\n } = await handleLoaders(\n request,\n location,\n matches,\n fogOfWar.active,\n loadingNavigation,\n opts && opts.submission,\n opts && opts.fetcherSubmission,\n opts && opts.replace,\n opts && opts.initialHydration === true,\n flushSync,\n pendingActionResult\n );\n\n if (shortCircuited) {\n return;\n }\n\n // Clean up now that the action/loaders have completed. Don't clean up if\n // we short circuited because pendingNavigationController will have already\n // been assigned to a new controller for the next navigation\n pendingNavigationController = null;\n\n completeNavigation(location, {\n matches: updatedMatches || matches,\n ...getActionDataForCommit(pendingActionResult),\n loaderData,\n errors,\n });\n }\n\n // Call the action matched by the leaf route for this navigation and handle\n // redirects/errors\n async function handleAction(\n request: Request,\n location: Location,\n submission: Submission,\n matches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n opts: { replace?: boolean; flushSync?: boolean } = {}\n ): Promise {\n interruptActiveLoads();\n\n // Put us in a submitting state\n let navigation = getSubmittingNavigation(location, submission);\n updateState({ navigation }, { flushSync: opts.flushSync === true });\n\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n matches,\n location.pathname,\n request.signal\n );\n if (discoverResult.type === \"aborted\") {\n return { shortCircuited: true };\n } else if (discoverResult.type === \"error\") {\n let boundaryId = findNearestBoundary(discoverResult.partialMatches)\n .route.id;\n return {\n matches: discoverResult.partialMatches,\n pendingActionResult: [\n boundaryId,\n {\n type: ResultType.error,\n error: discoverResult.error,\n },\n ],\n };\n } else if (!discoverResult.matches) {\n let { notFoundMatches, error, route } = handleNavigational404(\n location.pathname\n );\n return {\n matches: notFoundMatches,\n pendingActionResult: [\n route.id,\n {\n type: ResultType.error,\n error,\n },\n ],\n };\n } else {\n matches = discoverResult.matches;\n }\n }\n\n // Call our action and get the result\n let result: DataResult;\n let actionMatch = getTargetMatch(matches, location);\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n result = {\n type: ResultType.error,\n error: getInternalRouterError(405, {\n method: request.method,\n pathname: location.pathname,\n routeId: actionMatch.route.id,\n }),\n };\n } else {\n let results = await callDataStrategy(\n \"action\",\n state,\n request,\n [actionMatch],\n matches,\n null\n );\n result = results[actionMatch.route.id];\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n }\n\n if (isRedirectResult(result)) {\n let replace: boolean;\n if (opts && opts.replace != null) {\n replace = opts.replace;\n } else {\n // If the user didn't explicity indicate replace behavior, replace if\n // we redirected to the exact same location we're currently at to avoid\n // double back-buttons\n let location = normalizeRedirectLocation(\n result.response.headers.get(\"Location\")!,\n new URL(request.url),\n basename\n );\n replace = location === state.location.pathname + state.location.search;\n }\n await startRedirectNavigation(request, result, true, {\n submission,\n replace,\n });\n return { shortCircuited: true };\n }\n\n if (isDeferredResult(result)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n\n // By default, all submissions to the current location are REPLACE\n // navigations, but if the action threw an error that'll be rendered in\n // an errorElement, we fall back to PUSH so that the user can use the\n // back button to get back to the pre-submission form location to try\n // again\n if ((opts && opts.replace) !== true) {\n pendingAction = HistoryAction.Push;\n }\n\n return {\n matches,\n pendingActionResult: [boundaryMatch.route.id, result],\n };\n }\n\n return {\n matches,\n pendingActionResult: [actionMatch.route.id, result],\n };\n }\n\n // Call all applicable loaders for the given matches, handling redirects,\n // errors, etc.\n async function handleLoaders(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n overrideNavigation?: Navigation,\n submission?: Submission,\n fetcherSubmission?: Submission,\n replace?: boolean,\n initialHydration?: boolean,\n flushSync?: boolean,\n pendingActionResult?: PendingActionResult\n ): Promise {\n // Figure out the right navigation we want to use for data loading\n let loadingNavigation =\n overrideNavigation || getLoadingNavigation(location, submission);\n\n // If this was a redirect from an action we don't have a \"submission\" but\n // we have it on the loading navigation so use that if available\n let activeSubmission =\n submission ||\n fetcherSubmission ||\n getSubmissionFromNavigation(loadingNavigation);\n\n // If this is an uninterrupted revalidation, we remain in our current idle\n // state. If not, we need to switch to our loading state and load data,\n // preserving any new action data or existing action data (in the case of\n // a revalidation interrupting an actionReload)\n // If we have partialHydration enabled, then don't update the state for the\n // initial data load since it's not a \"navigation\"\n let shouldUpdateNavigationState =\n !isUninterruptedRevalidation &&\n (!future.v7_partialHydration || !initialHydration);\n\n // When fog of war is enabled, we enter our `loading` state earlier so we\n // can discover new routes during the `loading` state. We skip this if\n // we've already run actions since we would have done our matching already.\n // If the children() function threw then, we want to proceed with the\n // partial matches it discovered.\n if (isFogOfWar) {\n if (shouldUpdateNavigationState) {\n let actionData = getUpdatedActionData(pendingActionResult);\n updateState(\n {\n navigation: loadingNavigation,\n ...(actionData !== undefined ? { actionData } : {}),\n },\n {\n flushSync,\n }\n );\n }\n\n let discoverResult = await discoverRoutes(\n matches,\n location.pathname,\n request.signal\n );\n\n if (discoverResult.type === \"aborted\") {\n return { shortCircuited: true };\n } else if (discoverResult.type === \"error\") {\n let boundaryId = findNearestBoundary(discoverResult.partialMatches)\n .route.id;\n return {\n matches: discoverResult.partialMatches,\n loaderData: {},\n errors: {\n [boundaryId]: discoverResult.error,\n },\n };\n } else if (!discoverResult.matches) {\n let { error, notFoundMatches, route } = handleNavigational404(\n location.pathname\n );\n return {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error,\n },\n };\n } else {\n matches = discoverResult.matches;\n }\n }\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n activeSubmission,\n location,\n future.v7_partialHydration && initialHydration === true,\n future.v7_skipActionErrorRevalidation,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n deletedFetchers,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n pendingActionResult\n );\n\n // Cancel pending deferreds for no-longer-matched routes or routes we're\n // about to reload. Note that if this is an action reload we would have\n // already cancelled all pending deferreds so this would be a no-op\n cancelActiveDeferreds(\n (routeId) =>\n !(matches && matches.some((m) => m.route.id === routeId)) ||\n (matchesToLoad && matchesToLoad.some((m) => m.route.id === routeId))\n );\n\n pendingNavigationLoadId = ++incrementingLoadId;\n\n // Short circuit if we have no loaders to run\n if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n let updatedFetchers = markFetchRedirectsDone();\n completeNavigation(\n location,\n {\n matches,\n loaderData: {},\n // Commit pending error if we're short circuiting\n errors:\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? { [pendingActionResult[0]]: pendingActionResult[1].error }\n : null,\n ...getActionDataForCommit(pendingActionResult),\n ...(updatedFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n },\n { flushSync }\n );\n return { shortCircuited: true };\n }\n\n if (shouldUpdateNavigationState) {\n let updates: Partial = {};\n if (!isFogOfWar) {\n // Only update navigation/actionNData if we didn't already do it above\n updates.navigation = loadingNavigation;\n let actionData = getUpdatedActionData(pendingActionResult);\n if (actionData !== undefined) {\n updates.actionData = actionData;\n }\n }\n if (revalidatingFetchers.length > 0) {\n updates.fetchers = getUpdatedRevalidatingFetchers(revalidatingFetchers);\n }\n updateState(updates, { flushSync });\n }\n\n revalidatingFetchers.forEach((rf) => {\n abortFetcher(rf.key);\n if (rf.controller) {\n // Fetchers use an independent AbortController so that aborting a fetcher\n // (via deleteFetcher) does not abort the triggering navigation that\n // triggered the revalidation\n fetchControllers.set(rf.key, rf.controller);\n }\n });\n\n // Proxy navigation abort through to revalidation fetchers\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((f) => abortFetcher(f.key));\n if (pendingNavigationController) {\n pendingNavigationController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n\n let { loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n request\n );\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n\n // Clean up _after_ loaders have completed. Don't clean up if we short\n // circuited because fetchControllers would have been aborted and\n // reassigned to new controllers for the next navigation\n if (pendingNavigationController) {\n pendingNavigationController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n\n revalidatingFetchers.forEach((rf) => fetchControllers.delete(rf.key));\n\n // If any loaders returned a redirect Response, start a new REPLACE navigation\n let redirect = findRedirect(loaderResults);\n if (redirect) {\n await startRedirectNavigation(request, redirect.result, true, {\n replace,\n });\n return { shortCircuited: true };\n }\n\n redirect = findRedirect(fetcherResults);\n if (redirect) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n fetchRedirectIds.add(redirect.key);\n await startRedirectNavigation(request, redirect.result, true, {\n replace,\n });\n return { shortCircuited: true };\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n matches,\n loaderResults,\n pendingActionResult,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Wire up subscribers to update loaderData as promises settle\n activeDeferreds.forEach((deferredData, routeId) => {\n deferredData.subscribe((aborted) => {\n // Note: No need to updateState here since the TrackedPromise on\n // loaderData is stable across resolve/reject\n // Remove this instance if we were aborted or if promises have settled\n if (aborted || deferredData.done) {\n activeDeferreds.delete(routeId);\n }\n });\n });\n\n // Preserve SSR errors during partial hydration\n if (future.v7_partialHydration && initialHydration && state.errors) {\n errors = { ...state.errors, ...errors };\n }\n\n let updatedFetchers = markFetchRedirectsDone();\n let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n let shouldUpdateFetchers =\n updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n\n return {\n matches,\n loaderData,\n errors,\n ...(shouldUpdateFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n };\n }\n\n function getUpdatedActionData(\n pendingActionResult: PendingActionResult | undefined\n ): Record | null | undefined {\n if (pendingActionResult && !isErrorResult(pendingActionResult[1])) {\n // This is cast to `any` currently because `RouteData`uses any and it\n // would be a breaking change to use any.\n // TODO: v7 - change `RouteData` to use `unknown` instead of `any`\n return {\n [pendingActionResult[0]]: pendingActionResult[1].data as any,\n };\n } else if (state.actionData) {\n if (Object.keys(state.actionData).length === 0) {\n return null;\n } else {\n return state.actionData;\n }\n }\n }\n\n function getUpdatedRevalidatingFetchers(\n revalidatingFetchers: RevalidatingFetcher[]\n ) {\n revalidatingFetchers.forEach((rf) => {\n let fetcher = state.fetchers.get(rf.key);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n fetcher ? fetcher.data : undefined\n );\n state.fetchers.set(rf.key, revalidatingFetcher);\n });\n return new Map(state.fetchers);\n }\n\n // Trigger a fetcher load/submit for the given fetcher key\n function fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ) {\n if (isServer) {\n throw new Error(\n \"router.fetch() was called during the server render, but it shouldn't be. \" +\n \"You are likely calling a useFetcher() method in the body of your component. \" +\n \"Try moving it to a useEffect or a callback.\"\n );\n }\n\n abortFetcher(key);\n\n let flushSync = (opts && opts.flushSync) === true;\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n href,\n future.v7_relativeSplatPath,\n routeId,\n opts?.relative\n );\n let matches = matchRoutes(routesToUse, normalizedPath, basename);\n\n let fogOfWar = checkFogOfWar(matches, routesToUse, normalizedPath);\n if (fogOfWar.active && fogOfWar.matches) {\n matches = fogOfWar.matches;\n }\n\n if (!matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: normalizedPath }),\n { flushSync }\n );\n return;\n }\n\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n true,\n normalizedPath,\n opts\n );\n\n if (error) {\n setFetcherError(key, routeId, error, { flushSync });\n return;\n }\n\n let match = getTargetMatch(matches, path);\n\n let preventScrollReset = (opts && opts.preventScrollReset) === true;\n\n if (submission && isMutationMethod(submission.formMethod)) {\n handleFetcherAction(\n key,\n routeId,\n path,\n match,\n matches,\n fogOfWar.active,\n flushSync,\n preventScrollReset,\n submission\n );\n return;\n }\n\n // Store off the match so we can call it's shouldRevalidate on subsequent\n // revalidations\n fetchLoadMatches.set(key, { routeId, path });\n handleFetcherLoader(\n key,\n routeId,\n path,\n match,\n matches,\n fogOfWar.active,\n flushSync,\n preventScrollReset,\n submission\n );\n }\n\n // Call the action for the matched fetcher.submit(), and then handle redirects,\n // errors, and revalidation\n async function handleFetcherAction(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n requestMatches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n flushSync: boolean,\n preventScrollReset: boolean,\n submission: Submission\n ) {\n interruptActiveLoads();\n fetchLoadMatches.delete(key);\n\n function detectAndHandle405Error(m: AgnosticDataRouteMatch) {\n if (!m.route.action && !m.route.lazy) {\n let error = getInternalRouterError(405, {\n method: submission.formMethod,\n pathname: path,\n routeId: routeId,\n });\n setFetcherError(key, routeId, error, { flushSync });\n return true;\n }\n return false;\n }\n\n if (!isFogOfWar && detectAndHandle405Error(match)) {\n return;\n }\n\n // Put this fetcher into it's submitting state\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), {\n flushSync,\n });\n\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal,\n submission\n );\n\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n requestMatches,\n new URL(fetchRequest.url).pathname,\n fetchRequest.signal\n );\n\n if (discoverResult.type === \"aborted\") {\n return;\n } else if (discoverResult.type === \"error\") {\n setFetcherError(key, routeId, discoverResult.error, { flushSync });\n return;\n } else if (!discoverResult.matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: path }),\n { flushSync }\n );\n return;\n } else {\n requestMatches = discoverResult.matches;\n match = getTargetMatch(requestMatches, path);\n\n if (detectAndHandle405Error(match)) {\n return;\n }\n }\n }\n\n // Call the action for the fetcher\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let actionResults = await callDataStrategy(\n \"action\",\n state,\n fetchRequest,\n [match],\n requestMatches,\n key\n );\n let actionResult = actionResults[match.route.id];\n\n if (fetchRequest.signal.aborted) {\n // We can delete this so long as we weren't aborted by our own fetcher\n // re-submit which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n return;\n }\n\n // When using v7_fetcherPersist, we don't want errors bubbling up to the UI\n // or redirects processed for unmounted fetchers so we just revert them to\n // idle\n if (future.v7_fetcherPersist && deletedFetchers.has(key)) {\n if (isRedirectResult(actionResult) || isErrorResult(actionResult)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n // Let SuccessResult's fall through for revalidation\n } else {\n if (isRedirectResult(actionResult)) {\n fetchControllers.delete(key);\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our action started, so that\n // should take precedence over this redirect navigation. We already\n // set isRevalidationRequired so all loaders for the new route should\n // fire unless opted out via shouldRevalidate\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n updateFetcherState(key, getLoadingFetcher(submission));\n return startRedirectNavigation(fetchRequest, actionResult, false, {\n fetcherSubmission: submission,\n preventScrollReset,\n });\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(actionResult)) {\n setFetcherError(key, routeId, actionResult.error);\n return;\n }\n }\n\n if (isDeferredResult(actionResult)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n // Start the data load for current matches, or the next location if we're\n // in the middle of a navigation\n let nextLocation = state.navigation.location || state.location;\n let revalidationRequest = createClientSideRequest(\n init.history,\n nextLocation,\n abortController.signal\n );\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let matches =\n state.navigation.state !== \"idle\"\n ? matchRoutes(routesToUse, state.navigation.location, basename)\n : state.matches;\n\n invariant(matches, \"Didn't find any matches after fetcher action\");\n\n let loadId = ++incrementingLoadId;\n fetchReloadIds.set(key, loadId);\n\n let loadFetcher = getLoadingFetcher(submission, actionResult.data);\n state.fetchers.set(key, loadFetcher);\n\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n submission,\n nextLocation,\n false,\n future.v7_skipActionErrorRevalidation,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n deletedFetchers,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n [match.route.id, actionResult]\n );\n\n // Put all revalidating fetchers into the loading state, except for the\n // current fetcher which we want to keep in it's current loading state which\n // contains it's action submission info + action data\n revalidatingFetchers\n .filter((rf) => rf.key !== key)\n .forEach((rf) => {\n let staleKey = rf.key;\n let existingFetcher = state.fetchers.get(staleKey);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n existingFetcher ? existingFetcher.data : undefined\n );\n state.fetchers.set(staleKey, revalidatingFetcher);\n abortFetcher(staleKey);\n if (rf.controller) {\n fetchControllers.set(staleKey, rf.controller);\n }\n });\n\n updateState({ fetchers: new Map(state.fetchers) });\n\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((rf) => abortFetcher(rf.key));\n\n abortController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n let { loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n revalidationRequest\n );\n\n if (abortController.signal.aborted) {\n return;\n }\n\n abortController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n fetchReloadIds.delete(key);\n fetchControllers.delete(key);\n revalidatingFetchers.forEach((r) => fetchControllers.delete(r.key));\n\n let redirect = findRedirect(loaderResults);\n if (redirect) {\n return startRedirectNavigation(\n revalidationRequest,\n redirect.result,\n false,\n { preventScrollReset }\n );\n }\n\n redirect = findRedirect(fetcherResults);\n if (redirect) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n fetchRedirectIds.add(redirect.key);\n return startRedirectNavigation(\n revalidationRequest,\n redirect.result,\n false,\n { preventScrollReset }\n );\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n matches,\n loaderResults,\n undefined,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Since we let revalidations complete even if the submitting fetcher was\n // deleted, only put it back to idle if it hasn't been deleted\n if (state.fetchers.has(key)) {\n let doneFetcher = getDoneFetcher(actionResult.data);\n state.fetchers.set(key, doneFetcher);\n }\n\n abortStaleFetchLoads(loadId);\n\n // If we are currently in a navigation loading state and this fetcher is\n // more recent than the navigation, we want the newer data so abort the\n // navigation and complete it with the fetcher data\n if (\n state.navigation.state === \"loading\" &&\n loadId > pendingNavigationLoadId\n ) {\n invariant(pendingAction, \"Expected pending action\");\n pendingNavigationController && pendingNavigationController.abort();\n\n completeNavigation(state.navigation.location, {\n matches,\n loaderData,\n errors,\n fetchers: new Map(state.fetchers),\n });\n } else {\n // otherwise just update with the fetcher data, preserving any existing\n // loaderData for loaders that did not need to reload. We have to\n // manually merge here since we aren't going through completeNavigation\n updateState({\n errors,\n loaderData: mergeLoaderData(\n state.loaderData,\n loaderData,\n matches,\n errors\n ),\n fetchers: new Map(state.fetchers),\n });\n isRevalidationRequired = false;\n }\n }\n\n // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n async function handleFetcherLoader(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n matches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n flushSync: boolean,\n preventScrollReset: boolean,\n submission?: Submission\n ) {\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(\n key,\n getLoadingFetcher(\n submission,\n existingFetcher ? existingFetcher.data : undefined\n ),\n { flushSync }\n );\n\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal\n );\n\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n matches,\n new URL(fetchRequest.url).pathname,\n fetchRequest.signal\n );\n\n if (discoverResult.type === \"aborted\") {\n return;\n } else if (discoverResult.type === \"error\") {\n setFetcherError(key, routeId, discoverResult.error, { flushSync });\n return;\n } else if (!discoverResult.matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: path }),\n { flushSync }\n );\n return;\n } else {\n matches = discoverResult.matches;\n match = getTargetMatch(matches, path);\n }\n }\n\n // Call the loader for this fetcher route match\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let results = await callDataStrategy(\n \"loader\",\n state,\n fetchRequest,\n [match],\n matches,\n key\n );\n let result = results[match.route.id];\n\n // Deferred isn't supported for fetcher loads, await everything and treat it\n // as a normal load. resolveDeferredData will return undefined if this\n // fetcher gets aborted, so we just leave result untouched and short circuit\n // below if that happens\n if (isDeferredResult(result)) {\n result =\n (await resolveDeferredData(result, fetchRequest.signal, true)) ||\n result;\n }\n\n // We can delete this so long as we weren't aborted by our our own fetcher\n // re-load which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n\n if (fetchRequest.signal.aborted) {\n return;\n }\n\n // We don't want errors bubbling up or redirects followed for unmounted\n // fetchers, so short circuit here if it was removed from the UI\n if (deletedFetchers.has(key)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n\n // If the loader threw a redirect Response, start a new REPLACE navigation\n if (isRedirectResult(result)) {\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our loader started, so that\n // should take precedence over this redirect navigation\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n await startRedirectNavigation(fetchRequest, result, false, {\n preventScrollReset,\n });\n return;\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(result)) {\n setFetcherError(key, routeId, result.error);\n return;\n }\n\n invariant(!isDeferredResult(result), \"Unhandled fetcher deferred data\");\n\n // Put the fetcher back into an idle state\n updateFetcherState(key, getDoneFetcher(result.data));\n }\n\n /**\n * Utility function to handle redirects returned from an action or loader.\n * Normally, a redirect \"replaces\" the navigation that triggered it. So, for\n * example:\n *\n * - user is on /a\n * - user clicks a link to /b\n * - loader for /b redirects to /c\n *\n * In a non-JS app the browser would track the in-flight navigation to /b and\n * then replace it with /c when it encountered the redirect response. In\n * the end it would only ever update the URL bar with /c.\n *\n * In client-side routing using pushState/replaceState, we aim to emulate\n * this behavior and we also do not update history until the end of the\n * navigation (including processed redirects). This means that we never\n * actually touch history until we've processed redirects, so we just use\n * the history action from the original navigation (PUSH or REPLACE).\n */\n async function startRedirectNavigation(\n request: Request,\n redirect: RedirectResult,\n isNavigation: boolean,\n {\n submission,\n fetcherSubmission,\n preventScrollReset,\n replace,\n }: {\n submission?: Submission;\n fetcherSubmission?: Submission;\n preventScrollReset?: boolean;\n replace?: boolean;\n } = {}\n ) {\n if (redirect.response.headers.has(\"X-Remix-Revalidate\")) {\n isRevalidationRequired = true;\n }\n\n let location = redirect.response.headers.get(\"Location\");\n invariant(location, \"Expected a Location header on the redirect Response\");\n location = normalizeRedirectLocation(\n location,\n new URL(request.url),\n basename\n );\n let redirectLocation = createLocation(state.location, location, {\n _isRedirect: true,\n });\n\n if (isBrowser) {\n let isDocumentReload = false;\n\n if (redirect.response.headers.has(\"X-Remix-Reload-Document\")) {\n // Hard reload if the response contained X-Remix-Reload-Document\n isDocumentReload = true;\n } else if (ABSOLUTE_URL_REGEX.test(location)) {\n const url = init.history.createURL(location);\n isDocumentReload =\n // Hard reload if it's an absolute URL to a new origin\n url.origin !== routerWindow.location.origin ||\n // Hard reload if it's an absolute URL that does not match our basename\n stripBasename(url.pathname, basename) == null;\n }\n\n if (isDocumentReload) {\n if (replace) {\n routerWindow.location.replace(location);\n } else {\n routerWindow.location.assign(location);\n }\n return;\n }\n }\n\n // There's no need to abort on redirects, since we don't detect the\n // redirect until the action/loaders have settled\n pendingNavigationController = null;\n\n let redirectHistoryAction =\n replace === true || redirect.response.headers.has(\"X-Remix-Replace\")\n ? HistoryAction.Replace\n : HistoryAction.Push;\n\n // Use the incoming submission if provided, fallback on the active one in\n // state.navigation\n let { formMethod, formAction, formEncType } = state.navigation;\n if (\n !submission &&\n !fetcherSubmission &&\n formMethod &&\n formAction &&\n formEncType\n ) {\n submission = getSubmissionFromNavigation(state.navigation);\n }\n\n // If this was a 307/308 submission we want to preserve the HTTP method and\n // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n // redirected location\n let activeSubmission = submission || fetcherSubmission;\n if (\n redirectPreserveMethodStatusCodes.has(redirect.response.status) &&\n activeSubmission &&\n isMutationMethod(activeSubmission.formMethod)\n ) {\n await startNavigation(redirectHistoryAction, redirectLocation, {\n submission: {\n ...activeSubmission,\n formAction: location,\n },\n // Preserve these flags across redirects\n preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n enableViewTransition: isNavigation\n ? pendingViewTransitionEnabled\n : undefined,\n });\n } else {\n // If we have a navigation submission, we will preserve it through the\n // redirect navigation\n let overrideNavigation = getLoadingNavigation(\n redirectLocation,\n submission\n );\n await startNavigation(redirectHistoryAction, redirectLocation, {\n overrideNavigation,\n // Send fetcher submissions through for shouldRevalidate\n fetcherSubmission,\n // Preserve these flags across redirects\n preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n enableViewTransition: isNavigation\n ? pendingViewTransitionEnabled\n : undefined,\n });\n }\n }\n\n // Utility wrapper for calling dataStrategy client-side without having to\n // pass around the manifest, mapRouteProperties, etc.\n async function callDataStrategy(\n type: \"loader\" | \"action\",\n state: RouterState,\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n fetcherKey: string | null\n ): Promise> {\n let results: Record;\n let dataResults: Record = {};\n try {\n results = await callDataStrategyImpl(\n dataStrategyImpl,\n type,\n state,\n request,\n matchesToLoad,\n matches,\n fetcherKey,\n manifest,\n mapRouteProperties\n );\n } catch (e) {\n // If the outer dataStrategy method throws, just return the error for all\n // matches - and it'll naturally bubble to the root\n matchesToLoad.forEach((m) => {\n dataResults[m.route.id] = {\n type: ResultType.error,\n error: e,\n };\n });\n return dataResults;\n }\n\n for (let [routeId, result] of Object.entries(results)) {\n if (isRedirectDataStrategyResultResult(result)) {\n let response = result.result as Response;\n dataResults[routeId] = {\n type: ResultType.redirect,\n response: normalizeRelativeRoutingRedirectResponse(\n response,\n request,\n routeId,\n matches,\n basename,\n future.v7_relativeSplatPath\n ),\n };\n } else {\n dataResults[routeId] = await convertDataStrategyResultToDataResult(\n result\n );\n }\n }\n\n return dataResults;\n }\n\n async function callLoadersAndMaybeResolveData(\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n fetchersToLoad: RevalidatingFetcher[],\n request: Request\n ) {\n let currentMatches = state.matches;\n\n // Kick off loaders and fetchers in parallel\n let loaderResultsPromise = callDataStrategy(\n \"loader\",\n state,\n request,\n matchesToLoad,\n matches,\n null\n );\n\n let fetcherResultsPromise = Promise.all(\n fetchersToLoad.map(async (f) => {\n if (f.matches && f.match && f.controller) {\n let results = await callDataStrategy(\n \"loader\",\n state,\n createClientSideRequest(init.history, f.path, f.controller.signal),\n [f.match],\n f.matches,\n f.key\n );\n let result = results[f.match.route.id];\n // Fetcher results are keyed by fetcher key from here on out, not routeId\n return { [f.key]: result };\n } else {\n return Promise.resolve({\n [f.key]: {\n type: ResultType.error,\n error: getInternalRouterError(404, {\n pathname: f.path,\n }),\n } as ErrorResult,\n });\n }\n })\n );\n\n let loaderResults = await loaderResultsPromise;\n let fetcherResults = (await fetcherResultsPromise).reduce(\n (acc, r) => Object.assign(acc, r),\n {}\n );\n\n await Promise.all([\n resolveNavigationDeferredResults(\n matches,\n loaderResults,\n request.signal,\n currentMatches,\n state.loaderData\n ),\n resolveFetcherDeferredResults(matches, fetcherResults, fetchersToLoad),\n ]);\n\n return {\n loaderResults,\n fetcherResults,\n };\n }\n\n function interruptActiveLoads() {\n // Every interruption triggers a revalidation\n isRevalidationRequired = true;\n\n // Cancel pending route-level deferreds and mark cancelled routes for\n // revalidation\n cancelledDeferredRoutes.push(...cancelActiveDeferreds());\n\n // Abort in-flight fetcher loads\n fetchLoadMatches.forEach((_, key) => {\n if (fetchControllers.has(key)) {\n cancelledFetcherLoads.add(key);\n }\n abortFetcher(key);\n });\n }\n\n function updateFetcherState(\n key: string,\n fetcher: Fetcher,\n opts: { flushSync?: boolean } = {}\n ) {\n state.fetchers.set(key, fetcher);\n updateState(\n { fetchers: new Map(state.fetchers) },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n\n function setFetcherError(\n key: string,\n routeId: string,\n error: any,\n opts: { flushSync?: boolean } = {}\n ) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n deleteFetcher(key);\n updateState(\n {\n errors: {\n [boundaryMatch.route.id]: error,\n },\n fetchers: new Map(state.fetchers),\n },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n\n function getFetcher(key: string): Fetcher {\n activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1);\n // If this fetcher was previously marked for deletion, unmark it since we\n // have a new instance\n if (deletedFetchers.has(key)) {\n deletedFetchers.delete(key);\n }\n return state.fetchers.get(key) || IDLE_FETCHER;\n }\n\n function deleteFetcher(key: string): void {\n let fetcher = state.fetchers.get(key);\n // Don't abort the controller if this is a deletion of a fetcher.submit()\n // in it's loading phase since - we don't want to abort the corresponding\n // revalidation and want them to complete and land\n if (\n fetchControllers.has(key) &&\n !(fetcher && fetcher.state === \"loading\" && fetchReloadIds.has(key))\n ) {\n abortFetcher(key);\n }\n fetchLoadMatches.delete(key);\n fetchReloadIds.delete(key);\n fetchRedirectIds.delete(key);\n\n // If we opted into the flag we can clear this now since we're calling\n // deleteFetcher() at the end of updateState() and we've already handed the\n // deleted fetcher keys off to the data layer.\n // If not, we're eagerly calling deleteFetcher() and we need to keep this\n // Set populated until the next updateState call, and we'll clear\n // `deletedFetchers` then\n if (future.v7_fetcherPersist) {\n deletedFetchers.delete(key);\n }\n\n cancelledFetcherLoads.delete(key);\n state.fetchers.delete(key);\n }\n\n function deleteFetcherAndUpdateState(key: string): void {\n let count = (activeFetchers.get(key) || 0) - 1;\n if (count <= 0) {\n activeFetchers.delete(key);\n deletedFetchers.add(key);\n if (!future.v7_fetcherPersist) {\n deleteFetcher(key);\n }\n } else {\n activeFetchers.set(key, count);\n }\n\n updateState({ fetchers: new Map(state.fetchers) });\n }\n\n function abortFetcher(key: string) {\n let controller = fetchControllers.get(key);\n if (controller) {\n controller.abort();\n fetchControllers.delete(key);\n }\n }\n\n function markFetchersDone(keys: string[]) {\n for (let key of keys) {\n let fetcher = getFetcher(key);\n let doneFetcher = getDoneFetcher(fetcher.data);\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n function markFetchRedirectsDone(): boolean {\n let doneKeys = [];\n let updatedFetchers = false;\n for (let key of fetchRedirectIds) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n fetchRedirectIds.delete(key);\n doneKeys.push(key);\n updatedFetchers = true;\n }\n }\n markFetchersDone(doneKeys);\n return updatedFetchers;\n }\n\n function abortStaleFetchLoads(landedId: number): boolean {\n let yeetedKeys = [];\n for (let [key, id] of fetchReloadIds) {\n if (id < landedId) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n abortFetcher(key);\n fetchReloadIds.delete(key);\n yeetedKeys.push(key);\n }\n }\n }\n markFetchersDone(yeetedKeys);\n return yeetedKeys.length > 0;\n }\n\n function getBlocker(key: string, fn: BlockerFunction) {\n let blocker: Blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n if (blockerFunctions.get(key) !== fn) {\n blockerFunctions.set(key, fn);\n }\n\n return blocker;\n }\n\n function deleteBlocker(key: string) {\n state.blockers.delete(key);\n blockerFunctions.delete(key);\n }\n\n // Utility function to update blockers, ensuring valid state transitions\n function updateBlocker(key: string, newBlocker: Blocker) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n // Poor mans state machine :)\n // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n invariant(\n (blocker.state === \"unblocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"proceeding\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"unblocked\") ||\n (blocker.state === \"proceeding\" && newBlocker.state === \"unblocked\"),\n `Invalid blocker state transition: ${blocker.state} -> ${newBlocker.state}`\n );\n\n let blockers = new Map(state.blockers);\n blockers.set(key, newBlocker);\n updateState({ blockers });\n }\n\n function shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n }: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n }): string | undefined {\n if (blockerFunctions.size === 0) {\n return;\n }\n\n // We ony support a single active blocker at the moment since we don't have\n // any compelling use cases for multi-blocker yet\n if (blockerFunctions.size > 1) {\n warning(false, \"A router only supports one blocker at a time\");\n }\n\n let entries = Array.from(blockerFunctions.entries());\n let [blockerKey, blockerFunction] = entries[entries.length - 1];\n let blocker = state.blockers.get(blockerKey);\n\n if (blocker && blocker.state === \"proceeding\") {\n // If the blocker is currently proceeding, we don't need to re-check\n // it and can let this navigation continue\n return;\n }\n\n // At this point, we know we're unblocked/blocked so we need to check the\n // user-provided blocker function\n if (blockerFunction({ currentLocation, nextLocation, historyAction })) {\n return blockerKey;\n }\n }\n\n function handleNavigational404(pathname: string) {\n let error = getInternalRouterError(404, { pathname });\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let { matches, route } = getShortCircuitMatches(routesToUse);\n\n // Cancel all pending deferred on 404s since we don't keep any routes\n cancelActiveDeferreds();\n\n return { notFoundMatches: matches, route, error };\n }\n\n function cancelActiveDeferreds(\n predicate?: (routeId: string) => boolean\n ): string[] {\n let cancelledRouteIds: string[] = [];\n activeDeferreds.forEach((dfd, routeId) => {\n if (!predicate || predicate(routeId)) {\n // Cancel the deferred - but do not remove from activeDeferreds here -\n // we rely on the subscribers to do that so our tests can assert proper\n // cleanup via _internalActiveDeferreds\n dfd.cancel();\n cancelledRouteIds.push(routeId);\n activeDeferreds.delete(routeId);\n }\n });\n return cancelledRouteIds;\n }\n\n // Opt in to capturing and reporting scroll positions during navigations,\n // used by the component\n function enableScrollRestoration(\n positions: Record,\n getPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ) {\n savedScrollPositions = positions;\n getScrollPosition = getPosition;\n getScrollRestorationKey = getKey || null;\n\n // Perform initial hydration scroll restoration, since we miss the boat on\n // the initial updateState() because we've not yet rendered \n // and therefore have no savedScrollPositions available\n if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n initialScrollRestored = true;\n let y = getSavedScrollPosition(state.location, state.matches);\n if (y != null) {\n updateState({ restoreScrollPosition: y });\n }\n }\n\n return () => {\n savedScrollPositions = null;\n getScrollPosition = null;\n getScrollRestorationKey = null;\n };\n }\n\n function getScrollKey(location: Location, matches: AgnosticDataRouteMatch[]) {\n if (getScrollRestorationKey) {\n let key = getScrollRestorationKey(\n location,\n matches.map((m) => convertRouteMatchToUiMatch(m, state.loaderData))\n );\n return key || location.key;\n }\n return location.key;\n }\n\n function saveScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): void {\n if (savedScrollPositions && getScrollPosition) {\n let key = getScrollKey(location, matches);\n savedScrollPositions[key] = getScrollPosition();\n }\n }\n\n function getSavedScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): number | null {\n if (savedScrollPositions) {\n let key = getScrollKey(location, matches);\n let y = savedScrollPositions[key];\n if (typeof y === \"number\") {\n return y;\n }\n }\n return null;\n }\n\n function checkFogOfWar(\n matches: AgnosticDataRouteMatch[] | null,\n routesToUse: AgnosticDataRouteObject[],\n pathname: string\n ): { active: boolean; matches: AgnosticDataRouteMatch[] | null } {\n if (patchRoutesOnNavigationImpl) {\n if (!matches) {\n let fogMatches = matchRoutesImpl(\n routesToUse,\n pathname,\n basename,\n true\n );\n\n return { active: true, matches: fogMatches || [] };\n } else {\n if (Object.keys(matches[0].params).length > 0) {\n // If we matched a dynamic param or a splat, it might only be because\n // we haven't yet discovered other routes that would match with a\n // higher score. Call patchRoutesOnNavigation just to be sure\n let partialMatches = matchRoutesImpl(\n routesToUse,\n pathname,\n basename,\n true\n );\n return { active: true, matches: partialMatches };\n }\n }\n }\n\n return { active: false, matches: null };\n }\n\n type DiscoverRoutesSuccessResult = {\n type: \"success\";\n matches: AgnosticDataRouteMatch[] | null;\n };\n type DiscoverRoutesErrorResult = {\n type: \"error\";\n error: any;\n partialMatches: AgnosticDataRouteMatch[];\n };\n type DiscoverRoutesAbortedResult = { type: \"aborted\" };\n type DiscoverRoutesResult =\n | DiscoverRoutesSuccessResult\n | DiscoverRoutesErrorResult\n | DiscoverRoutesAbortedResult;\n\n async function discoverRoutes(\n matches: AgnosticDataRouteMatch[],\n pathname: string,\n signal: AbortSignal\n ): Promise {\n if (!patchRoutesOnNavigationImpl) {\n return { type: \"success\", matches };\n }\n\n let partialMatches: AgnosticDataRouteMatch[] | null = matches;\n while (true) {\n let isNonHMR = inFlightDataRoutes == null;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let localManifest = manifest;\n try {\n await patchRoutesOnNavigationImpl({\n signal,\n path: pathname,\n matches: partialMatches,\n patch: (routeId, children) => {\n if (signal.aborted) return;\n patchRoutesImpl(\n routeId,\n children,\n routesToUse,\n localManifest,\n mapRouteProperties\n );\n },\n });\n } catch (e) {\n return { type: \"error\", error: e, partialMatches };\n } finally {\n // If we are not in the middle of an HMR revalidation and we changed the\n // routes, provide a new identity so when we `updateState` at the end of\n // this navigation/fetch `router.routes` will be a new identity and\n // trigger a re-run of memoized `router.routes` dependencies.\n // HMR will already update the identity and reflow when it lands\n // `inFlightDataRoutes` in `completeNavigation`\n if (isNonHMR && !signal.aborted) {\n dataRoutes = [...dataRoutes];\n }\n }\n\n if (signal.aborted) {\n return { type: \"aborted\" };\n }\n\n let newMatches = matchRoutes(routesToUse, pathname, basename);\n if (newMatches) {\n return { type: \"success\", matches: newMatches };\n }\n\n let newPartialMatches = matchRoutesImpl(\n routesToUse,\n pathname,\n basename,\n true\n );\n\n // Avoid loops if the second pass results in the same partial matches\n if (\n !newPartialMatches ||\n (partialMatches.length === newPartialMatches.length &&\n partialMatches.every(\n (m, i) => m.route.id === newPartialMatches![i].route.id\n ))\n ) {\n return { type: \"success\", matches: null };\n }\n\n partialMatches = newPartialMatches;\n }\n }\n\n function _internalSetRoutes(newRoutes: AgnosticDataRouteObject[]) {\n manifest = {};\n inFlightDataRoutes = convertRoutesToDataRoutes(\n newRoutes,\n mapRouteProperties,\n undefined,\n manifest\n );\n }\n\n function patchRoutes(\n routeId: string | null,\n children: AgnosticRouteObject[]\n ): void {\n let isNonHMR = inFlightDataRoutes == null;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n patchRoutesImpl(\n routeId,\n children,\n routesToUse,\n manifest,\n mapRouteProperties\n );\n\n // If we are not in the middle of an HMR revalidation and we changed the\n // routes, provide a new identity and trigger a reflow via `updateState`\n // to re-run memoized `router.routes` dependencies.\n // HMR will already update the identity and reflow when it lands\n // `inFlightDataRoutes` in `completeNavigation`\n if (isNonHMR) {\n dataRoutes = [...dataRoutes];\n updateState({});\n }\n }\n\n router = {\n get basename() {\n return basename;\n },\n get future() {\n return future;\n },\n get state() {\n return state;\n },\n get routes() {\n return dataRoutes;\n },\n get window() {\n return routerWindow;\n },\n initialize,\n subscribe,\n enableScrollRestoration,\n navigate,\n fetch,\n revalidate,\n // Passthrough to history-aware createHref used by useHref so we get proper\n // hash-aware URLs in DOM paths\n createHref: (to: To) => init.history.createHref(to),\n encodeLocation: (to: To) => init.history.encodeLocation(to),\n getFetcher,\n deleteFetcher: deleteFetcherAndUpdateState,\n dispose,\n getBlocker,\n deleteBlocker,\n patchRoutes,\n _internalFetchControllers: fetchControllers,\n _internalActiveDeferreds: activeDeferreds,\n // TODO: Remove setRoutes, it's temporary to avoid dealing with\n // updating the tree while validating the update algorithm.\n _internalSetRoutes,\n };\n\n return router;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\n\nexport const UNSAFE_DEFERRED_SYMBOL = Symbol(\"deferred\");\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface StaticHandlerFutureConfig {\n v7_relativeSplatPath: boolean;\n v7_throwAbortReason: boolean;\n}\n\nexport interface CreateStaticHandlerOptions {\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n future?: Partial;\n}\n\nexport function createStaticHandler(\n routes: AgnosticRouteObject[],\n opts?: CreateStaticHandlerOptions\n): StaticHandler {\n invariant(\n routes.length > 0,\n \"You must provide a non-empty routes array to createStaticHandler\"\n );\n\n let manifest: RouteManifest = {};\n let basename = (opts ? opts.basename : null) || \"/\";\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (opts?.mapRouteProperties) {\n mapRouteProperties = opts.mapRouteProperties;\n } else if (opts?.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = opts.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n // Config driven behavior flags\n let future: StaticHandlerFutureConfig = {\n v7_relativeSplatPath: false,\n v7_throwAbortReason: false,\n ...(opts ? opts.future : null),\n };\n\n let dataRoutes = convertRoutesToDataRoutes(\n routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n\n /**\n * The query() method is intended for document requests, in which we want to\n * call an optional action and potentially multiple loaders for all nested\n * routes. It returns a StaticHandlerContext object, which is very similar\n * to the router state (location, loaderData, actionData, errors, etc.) and\n * also adds SSR-specific information such as the statusCode and headers\n * from action/loaders Responses.\n *\n * It _should_ never throw and should report all errors through the\n * returned context.errors object, properly associating errors to their error\n * boundary. Additionally, it tracks _deepestRenderedBoundaryId which can be\n * used to emulate React error boundaries during SSr by performing a second\n * pass only down to the boundaryId.\n *\n * The one exception where we do not return a StaticHandlerContext is when a\n * redirect response is returned or thrown from any action/loader. We\n * propagate that out and return the raw Response so the HTTP server can\n * return it directly.\n *\n * - `opts.requestContext` is an optional server context that will be passed\n * to actions/loaders in the `context` parameter\n * - `opts.skipLoaderErrorBubbling` is an optional parameter that will prevent\n * the bubbling of errors which allows single-fetch-type implementations\n * where the client will handle the bubbling and we may need to return data\n * for the handling route\n */\n async function query(\n request: Request,\n {\n requestContext,\n skipLoaderErrorBubbling,\n dataStrategy,\n }: {\n requestContext?: unknown;\n skipLoaderErrorBubbling?: boolean;\n dataStrategy?: DataStrategyFunction;\n } = {}\n ): Promise {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\") {\n let error = getInternalRouterError(405, { method });\n let { matches: methodNotAllowedMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: methodNotAllowedMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n } else if (!matches) {\n let error = getInternalRouterError(404, { pathname: location.pathname });\n let { matches: notFoundMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: notFoundMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n dataStrategy || null,\n skipLoaderErrorBubbling === true,\n null\n );\n if (isResponse(result)) {\n return result;\n }\n\n // When returning StaticHandlerContext, we patch back in the location here\n // since we need it for React Context. But this helps keep our submit and\n // loadRouteData operating on a Request instead of a Location\n return { location, basename, ...result };\n }\n\n /**\n * The queryRoute() method is intended for targeted route requests, either\n * for fetch ?_data requests or resource route requests. In this case, we\n * are only ever calling a single action or loader, and we are returning the\n * returned value directly. In most cases, this will be a Response returned\n * from the action/loader, but it may be a primitive or other value as well -\n * and in such cases the calling context should handle that accordingly.\n *\n * We do respect the throw/return differentiation, so if an action/loader\n * throws, then this method will throw the value. This is important so we\n * can do proper boundary identification in Remix where a thrown Response\n * must go to the Catch Boundary but a returned Response is happy-path.\n *\n * One thing to note is that any Router-initiated Errors that make sense\n * to associate with a status code will be thrown as an ErrorResponse\n * instance which include the raw Error, such that the calling context can\n * serialize the error as they see fit while including the proper response\n * code. Examples here are 404 and 405 errors that occur prior to reaching\n * any user-defined loaders.\n *\n * - `opts.routeId` allows you to specify the specific route handler to call.\n * If not provided the handler will determine the proper route by matching\n * against `request.url`\n * - `opts.requestContext` is an optional server context that will be passed\n * to actions/loaders in the `context` parameter\n */\n async function queryRoute(\n request: Request,\n {\n routeId,\n requestContext,\n dataStrategy,\n }: {\n requestContext?: unknown;\n routeId?: string;\n dataStrategy?: DataStrategyFunction;\n } = {}\n ): Promise {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\" && method !== \"OPTIONS\") {\n throw getInternalRouterError(405, { method });\n } else if (!matches) {\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let match = routeId\n ? matches.find((m) => m.route.id === routeId)\n : getTargetMatch(matches, location);\n\n if (routeId && !match) {\n throw getInternalRouterError(403, {\n pathname: location.pathname,\n routeId,\n });\n } else if (!match) {\n // This should never hit I don't think?\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n dataStrategy || null,\n false,\n match\n );\n\n if (isResponse(result)) {\n return result;\n }\n\n let error = result.errors ? Object.values(result.errors)[0] : undefined;\n if (error !== undefined) {\n // If we got back result.errors, that means the loader/action threw\n // _something_ that wasn't a Response, but it's not guaranteed/required\n // to be an `instanceof Error` either, so we have to use throw here to\n // preserve the \"error\" state outside of queryImpl.\n throw error;\n }\n\n // Pick off the right state value to return\n if (result.actionData) {\n return Object.values(result.actionData)[0];\n }\n\n if (result.loaderData) {\n let data = Object.values(result.loaderData)[0];\n if (result.activeDeferreds?.[match.route.id]) {\n data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n }\n return data;\n }\n\n return undefined;\n }\n\n async function queryImpl(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n routeMatch: AgnosticDataRouteMatch | null\n ): Promise | Response> {\n invariant(\n request.signal,\n \"query()/queryRoute() requests must contain an AbortController signal\"\n );\n\n try {\n if (isMutationMethod(request.method.toLowerCase())) {\n let result = await submit(\n request,\n matches,\n routeMatch || getTargetMatch(matches, location),\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n routeMatch != null\n );\n return result;\n }\n\n let result = await loadRouteData(\n request,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n routeMatch\n );\n return isResponse(result)\n ? result\n : {\n ...result,\n actionData: null,\n actionHeaders: {},\n };\n } catch (e) {\n // If the user threw/returned a Response in callLoaderOrAction for a\n // `queryRoute` call, we throw the `DataStrategyResult` to bail out early\n // and then return or throw the raw Response here accordingly\n if (isDataStrategyResult(e) && isResponse(e.result)) {\n if (e.type === ResultType.error) {\n throw e.result;\n }\n return e.result;\n }\n // Redirects are always returned since they don't propagate to catch\n // boundaries\n if (isRedirectResponse(e)) {\n return e;\n }\n throw e;\n }\n }\n\n async function submit(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n actionMatch: AgnosticDataRouteMatch,\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n isRouteRequest: boolean\n ): Promise | Response> {\n let result: DataResult;\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n let error = getInternalRouterError(405, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: actionMatch.route.id,\n });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n } else {\n let results = await callDataStrategy(\n \"action\",\n request,\n [actionMatch],\n matches,\n isRouteRequest,\n requestContext,\n dataStrategy\n );\n result = results[actionMatch.route.id];\n\n if (request.signal.aborted) {\n throwStaticHandlerAbortedError(request, isRouteRequest, future);\n }\n }\n\n if (isRedirectResult(result)) {\n // Uhhhh - this should never happen, we should always throw these from\n // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n // can get back on the \"throw all redirect responses\" train here should\n // this ever happen :/\n throw new Response(null, {\n status: result.response.status,\n headers: {\n Location: result.response.headers.get(\"Location\")!,\n },\n });\n }\n\n if (isDeferredResult(result)) {\n let error = getInternalRouterError(400, { type: \"defer-action\" });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n }\n\n if (isRouteRequest) {\n // Note: This should only be non-Response values if we get here, since\n // isRouteRequest should throw any Response received in callLoaderOrAction\n if (isErrorResult(result)) {\n throw result.error;\n }\n\n return {\n matches: [actionMatch],\n loaderData: {},\n actionData: { [actionMatch.route.id]: result.data },\n errors: null,\n // Note: statusCode + headers are unused here since queryRoute will\n // return the raw Response or value\n statusCode: 200,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n // Create a GET request for the loaders\n let loaderRequest = new Request(request.url, {\n headers: request.headers,\n redirect: request.redirect,\n signal: request.signal,\n });\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = skipLoaderErrorBubbling\n ? actionMatch\n : findNearestBoundary(matches, actionMatch.route.id);\n\n let context = await loadRouteData(\n loaderRequest,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n null,\n [boundaryMatch.route.id, result]\n );\n\n // action status codes take precedence over loader status codes\n return {\n ...context,\n statusCode: isRouteErrorResponse(result.error)\n ? result.error.status\n : result.statusCode != null\n ? result.statusCode\n : 500,\n actionData: null,\n actionHeaders: {\n ...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),\n },\n };\n }\n\n let context = await loadRouteData(\n loaderRequest,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n null\n );\n\n return {\n ...context,\n actionData: {\n [actionMatch.route.id]: result.data,\n },\n // action status codes take precedence over loader status codes\n ...(result.statusCode ? { statusCode: result.statusCode } : {}),\n actionHeaders: result.headers\n ? { [actionMatch.route.id]: result.headers }\n : {},\n };\n }\n\n async function loadRouteData(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n routeMatch: AgnosticDataRouteMatch | null,\n pendingActionResult?: PendingActionResult\n ): Promise<\n | Omit<\n StaticHandlerContext,\n \"location\" | \"basename\" | \"actionData\" | \"actionHeaders\"\n >\n | Response\n > {\n let isRouteRequest = routeMatch != null;\n\n // Short circuit if we have no loaders to run (queryRoute())\n if (\n isRouteRequest &&\n !routeMatch?.route.loader &&\n !routeMatch?.route.lazy\n ) {\n throw getInternalRouterError(400, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: routeMatch?.route.id,\n });\n }\n\n let requestMatches = routeMatch\n ? [routeMatch]\n : pendingActionResult && isErrorResult(pendingActionResult[1])\n ? getLoaderMatchesUntilBoundary(matches, pendingActionResult[0])\n : matches;\n let matchesToLoad = requestMatches.filter(\n (m) => m.route.loader || m.route.lazy\n );\n\n // Short circuit if we have no loaders to run (query())\n if (matchesToLoad.length === 0) {\n return {\n matches,\n // Add a null for all matched routes for proper revalidation on the client\n loaderData: matches.reduce(\n (acc, m) => Object.assign(acc, { [m.route.id]: null }),\n {}\n ),\n errors:\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? {\n [pendingActionResult[0]]: pendingActionResult[1].error,\n }\n : null,\n statusCode: 200,\n loaderHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let results = await callDataStrategy(\n \"loader\",\n request,\n matchesToLoad,\n matches,\n isRouteRequest,\n requestContext,\n dataStrategy\n );\n\n if (request.signal.aborted) {\n throwStaticHandlerAbortedError(request, isRouteRequest, future);\n }\n\n // Process and commit output from loaders\n let activeDeferreds = new Map();\n let context = processRouteLoaderData(\n matches,\n results,\n pendingActionResult,\n activeDeferreds,\n skipLoaderErrorBubbling\n );\n\n // Add a null for any non-loader matches for proper revalidation on the client\n let executedLoaders = new Set(\n matchesToLoad.map((match) => match.route.id)\n );\n matches.forEach((match) => {\n if (!executedLoaders.has(match.route.id)) {\n context.loaderData[match.route.id] = null;\n }\n });\n\n return {\n ...context,\n matches,\n activeDeferreds:\n activeDeferreds.size > 0\n ? Object.fromEntries(activeDeferreds.entries())\n : null,\n };\n }\n\n // Utility wrapper for calling dataStrategy server-side without having to\n // pass around the manifest, mapRouteProperties, etc.\n async function callDataStrategy(\n type: \"loader\" | \"action\",\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n isRouteRequest: boolean,\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null\n ): Promise> {\n let results = await callDataStrategyImpl(\n dataStrategy || defaultDataStrategy,\n type,\n null,\n request,\n matchesToLoad,\n matches,\n null,\n manifest,\n mapRouteProperties,\n requestContext\n );\n\n let dataResults: Record = {};\n await Promise.all(\n matches.map(async (match) => {\n if (!(match.route.id in results)) {\n return;\n }\n let result = results[match.route.id];\n if (isRedirectDataStrategyResultResult(result)) {\n let response = result.result as Response;\n // Throw redirects and let the server handle them with an HTTP redirect\n throw normalizeRelativeRoutingRedirectResponse(\n response,\n request,\n match.route.id,\n matches,\n basename,\n future.v7_relativeSplatPath\n );\n }\n if (isResponse(result.result) && isRouteRequest) {\n // For SSR single-route requests, we want to hand Responses back\n // directly without unwrapping\n throw result;\n }\n\n dataResults[match.route.id] =\n await convertDataStrategyResultToDataResult(result);\n })\n );\n return dataResults;\n }\n\n return {\n dataRoutes,\n query,\n queryRoute,\n };\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\nexport function getStaticContextFromError(\n routes: AgnosticDataRouteObject[],\n context: StaticHandlerContext,\n error: any\n) {\n let newContext: StaticHandlerContext = {\n ...context,\n statusCode: isRouteErrorResponse(error) ? error.status : 500,\n errors: {\n [context._deepestRenderedBoundaryId || routes[0].id]: error,\n },\n };\n return newContext;\n}\n\nfunction throwStaticHandlerAbortedError(\n request: Request,\n isRouteRequest: boolean,\n future: StaticHandlerFutureConfig\n) {\n if (future.v7_throwAbortReason && request.signal.reason !== undefined) {\n throw request.signal.reason;\n }\n\n let method = isRouteRequest ? \"queryRoute\" : \"query\";\n throw new Error(`${method}() call aborted: ${request.method} ${request.url}`);\n}\n\nfunction isSubmissionNavigation(\n opts: BaseNavigateOrFetchOptions\n): opts is SubmissionNavigateOptions {\n return (\n opts != null &&\n ((\"formData\" in opts && opts.formData != null) ||\n (\"body\" in opts && opts.body !== undefined))\n );\n}\n\nfunction normalizeTo(\n location: Path,\n matches: AgnosticDataRouteMatch[],\n basename: string,\n prependBasename: boolean,\n to: To | null,\n v7_relativeSplatPath: boolean,\n fromRouteId?: string,\n relative?: RelativeRoutingType\n) {\n let contextualMatches: AgnosticDataRouteMatch[];\n let activeRouteMatch: AgnosticDataRouteMatch | undefined;\n if (fromRouteId) {\n // Grab matches up to the calling route so our route-relative logic is\n // relative to the correct source route\n contextualMatches = [];\n for (let match of matches) {\n contextualMatches.push(match);\n if (match.route.id === fromRouteId) {\n activeRouteMatch = match;\n break;\n }\n }\n } else {\n contextualMatches = matches;\n activeRouteMatch = matches[matches.length - 1];\n }\n\n // Resolve the relative path\n let path = resolveTo(\n to ? to : \".\",\n getResolveToMatches(contextualMatches, v7_relativeSplatPath),\n stripBasename(location.pathname, basename) || location.pathname,\n relative === \"path\"\n );\n\n // When `to` is not specified we inherit search/hash from the current\n // location, unlike when to=\".\" and we just inherit the path.\n // See https://github.com/remix-run/remix/issues/927\n if (to == null) {\n path.search = location.search;\n path.hash = location.hash;\n }\n\n // Account for `?index` params when routing to the current location\n if ((to == null || to === \"\" || to === \".\") && activeRouteMatch) {\n let nakedIndex = hasNakedIndexQuery(path.search);\n if (activeRouteMatch.route.index && !nakedIndex) {\n // Add one when we're targeting an index route\n path.search = path.search\n ? path.search.replace(/^\\?/, \"?index&\")\n : \"?index\";\n } else if (!activeRouteMatch.route.index && nakedIndex) {\n // Remove existing ones when we're not\n let params = new URLSearchParams(path.search);\n let indexValues = params.getAll(\"index\");\n params.delete(\"index\");\n indexValues.filter((v) => v).forEach((v) => params.append(\"index\", v));\n let qs = params.toString();\n path.search = qs ? `?${qs}` : \"\";\n }\n }\n\n // If we're operating within a basename, prepend it to the pathname. If\n // this is a root navigation, then just use the raw basename which allows\n // the basename to have full control over the presence of a trailing slash\n // on root actions\n if (prependBasename && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n\n return createPath(path);\n}\n\n// Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\nfunction normalizeNavigateOptions(\n normalizeFormMethod: boolean,\n isFetcher: boolean,\n path: string,\n opts?: BaseNavigateOrFetchOptions\n): {\n path: string;\n submission?: Submission;\n error?: ErrorResponseImpl;\n} {\n // Return location verbatim on non-submission navigations\n if (!opts || !isSubmissionNavigation(opts)) {\n return { path };\n }\n\n if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n return {\n path,\n error: getInternalRouterError(405, { method: opts.formMethod }),\n };\n }\n\n let getInvalidBodyError = () => ({\n path,\n error: getInternalRouterError(400, { type: \"invalid-body\" }),\n });\n\n // Create a Submission on non-GET navigations\n let rawFormMethod = opts.formMethod || \"get\";\n let formMethod = normalizeFormMethod\n ? (rawFormMethod.toUpperCase() as V7_FormMethod)\n : (rawFormMethod.toLowerCase() as FormMethod);\n let formAction = stripHashFromPath(path);\n\n if (opts.body !== undefined) {\n if (opts.formEncType === \"text/plain\") {\n // text only support POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n let text =\n typeof opts.body === \"string\"\n ? opts.body\n : opts.body instanceof FormData ||\n opts.body instanceof URLSearchParams\n ? // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data\n Array.from(opts.body.entries()).reduce(\n (acc, [name, value]) => `${acc}${name}=${value}\\n`,\n \"\"\n )\n : String(opts.body);\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json: undefined,\n text,\n },\n };\n } else if (opts.formEncType === \"application/json\") {\n // json only supports POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n try {\n let json =\n typeof opts.body === \"string\" ? JSON.parse(opts.body) : opts.body;\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json,\n text: undefined,\n },\n };\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n }\n\n invariant(\n typeof FormData === \"function\",\n \"FormData is not available in this environment\"\n );\n\n let searchParams: URLSearchParams;\n let formData: FormData;\n\n if (opts.formData) {\n searchParams = convertFormDataToSearchParams(opts.formData);\n formData = opts.formData;\n } else if (opts.body instanceof FormData) {\n searchParams = convertFormDataToSearchParams(opts.body);\n formData = opts.body;\n } else if (opts.body instanceof URLSearchParams) {\n searchParams = opts.body;\n formData = convertSearchParamsToFormData(searchParams);\n } else if (opts.body == null) {\n searchParams = new URLSearchParams();\n formData = new FormData();\n } else {\n try {\n searchParams = new URLSearchParams(opts.body);\n formData = convertSearchParamsToFormData(searchParams);\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n\n let submission: Submission = {\n formMethod,\n formAction,\n formEncType:\n (opts && opts.formEncType) || \"application/x-www-form-urlencoded\",\n formData,\n json: undefined,\n text: undefined,\n };\n\n if (isMutationMethod(submission.formMethod)) {\n return { path, submission };\n }\n\n // Flatten submission onto URLSearchParams for GET submissions\n let parsedPath = parsePath(path);\n // On GET navigation submissions we can drop the ?index param from the\n // resulting location since all loaders will run. But fetcher GET submissions\n // only run a single loader so we need to preserve any incoming ?index params\n if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n searchParams.append(\"index\", \"\");\n }\n parsedPath.search = `?${searchParams}`;\n\n return { path: createPath(parsedPath), submission };\n}\n\n// Filter out all routes at/below any caught error as they aren't going to\n// render so we don't need to load them\nfunction getLoaderMatchesUntilBoundary(\n matches: AgnosticDataRouteMatch[],\n boundaryId: string,\n includeBoundary = false\n) {\n let index = matches.findIndex((m) => m.route.id === boundaryId);\n if (index >= 0) {\n return matches.slice(0, includeBoundary ? index + 1 : index);\n }\n return matches;\n}\n\nfunction getMatchesToLoad(\n history: History,\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n submission: Submission | undefined,\n location: Location,\n initialHydration: boolean,\n skipActionErrorRevalidation: boolean,\n isRevalidationRequired: boolean,\n cancelledDeferredRoutes: string[],\n cancelledFetcherLoads: Set,\n deletedFetchers: Set,\n fetchLoadMatches: Map,\n fetchRedirectIds: Set,\n routesToUse: AgnosticDataRouteObject[],\n basename: string | undefined,\n pendingActionResult?: PendingActionResult\n): [AgnosticDataRouteMatch[], RevalidatingFetcher[]] {\n let actionResult = pendingActionResult\n ? isErrorResult(pendingActionResult[1])\n ? pendingActionResult[1].error\n : pendingActionResult[1].data\n : undefined;\n let currentUrl = history.createURL(state.location);\n let nextUrl = history.createURL(location);\n\n // Pick navigation matches that are net-new or qualify for revalidation\n let boundaryMatches = matches;\n if (initialHydration && state.errors) {\n // On initial hydration, only consider matches up to _and including_ the boundary.\n // This is inclusive to handle cases where a server loader ran successfully,\n // a child server loader bubbled up to this route, but this route has\n // `clientLoader.hydrate` so we want to still run the `clientLoader` so that\n // we have a complete version of `loaderData`\n boundaryMatches = getLoaderMatchesUntilBoundary(\n matches,\n Object.keys(state.errors)[0],\n true\n );\n } else if (pendingActionResult && isErrorResult(pendingActionResult[1])) {\n // If an action threw an error, we call loaders up to, but not including the\n // boundary\n boundaryMatches = getLoaderMatchesUntilBoundary(\n matches,\n pendingActionResult[0]\n );\n }\n\n // Don't revalidate loaders by default after action 4xx/5xx responses\n // when the flag is enabled. They can still opt-into revalidation via\n // `shouldRevalidate` via `actionResult`\n let actionStatus = pendingActionResult\n ? pendingActionResult[1].statusCode\n : undefined;\n let shouldSkipRevalidation =\n skipActionErrorRevalidation && actionStatus && actionStatus >= 400;\n\n let navigationMatches = boundaryMatches.filter((match, index) => {\n let { route } = match;\n if (route.lazy) {\n // We haven't loaded this route yet so we don't know if it's got a loader!\n return true;\n }\n\n if (route.loader == null) {\n return false;\n }\n\n if (initialHydration) {\n return shouldLoadRouteOnHydration(route, state.loaderData, state.errors);\n }\n\n // Always call the loader on new route instances and pending defer cancellations\n if (\n isNewLoader(state.loaderData, state.matches[index], match) ||\n cancelledDeferredRoutes.some((id) => id === match.route.id)\n ) {\n return true;\n }\n\n // This is the default implementation for when we revalidate. If the route\n // provides it's own implementation, then we give them full control but\n // provide this value so they can leverage it if needed after they check\n // their own specific use cases\n let currentRouteMatch = state.matches[index];\n let nextRouteMatch = match;\n\n return shouldRevalidateLoader(match, {\n currentUrl,\n currentParams: currentRouteMatch.params,\n nextUrl,\n nextParams: nextRouteMatch.params,\n ...submission,\n actionResult,\n actionStatus,\n defaultShouldRevalidate: shouldSkipRevalidation\n ? false\n : // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n isRevalidationRequired ||\n currentUrl.pathname + currentUrl.search ===\n nextUrl.pathname + nextUrl.search ||\n // Search params affect all loaders\n currentUrl.search !== nextUrl.search ||\n isNewRouteInstance(currentRouteMatch, nextRouteMatch),\n });\n });\n\n // Pick fetcher.loads that need to be revalidated\n let revalidatingFetchers: RevalidatingFetcher[] = [];\n fetchLoadMatches.forEach((f, key) => {\n // Don't revalidate:\n // - on initial hydration (shouldn't be any fetchers then anyway)\n // - if fetcher won't be present in the subsequent render\n // - no longer matches the URL (v7_fetcherPersist=false)\n // - was unmounted but persisted due to v7_fetcherPersist=true\n if (\n initialHydration ||\n !matches.some((m) => m.route.id === f.routeId) ||\n deletedFetchers.has(key)\n ) {\n return;\n }\n\n let fetcherMatches = matchRoutes(routesToUse, f.path, basename);\n\n // If the fetcher path no longer matches, push it in with null matches so\n // we can trigger a 404 in callLoadersAndMaybeResolveData. Note this is\n // currently only a use-case for Remix HMR where the route tree can change\n // at runtime and remove a route previously loaded via a fetcher\n if (!fetcherMatches) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: null,\n match: null,\n controller: null,\n });\n return;\n }\n\n // Revalidating fetchers are decoupled from the route matches since they\n // load from a static href. They revalidate based on explicit revalidation\n // (submission, useRevalidator, or X-Remix-Revalidate)\n let fetcher = state.fetchers.get(key);\n let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n\n let shouldRevalidate = false;\n if (fetchRedirectIds.has(key)) {\n // Never trigger a revalidation of an actively redirecting fetcher\n shouldRevalidate = false;\n } else if (cancelledFetcherLoads.has(key)) {\n // Always mark for revalidation if the fetcher was cancelled\n cancelledFetcherLoads.delete(key);\n shouldRevalidate = true;\n } else if (\n fetcher &&\n fetcher.state !== \"idle\" &&\n fetcher.data === undefined\n ) {\n // If the fetcher hasn't ever completed loading yet, then this isn't a\n // revalidation, it would just be a brand new load if an explicit\n // revalidation is required\n shouldRevalidate = isRevalidationRequired;\n } else {\n // Otherwise fall back on any user-defined shouldRevalidate, defaulting\n // to explicit revalidations only\n shouldRevalidate = shouldRevalidateLoader(fetcherMatch, {\n currentUrl,\n currentParams: state.matches[state.matches.length - 1].params,\n nextUrl,\n nextParams: matches[matches.length - 1].params,\n ...submission,\n actionResult,\n actionStatus,\n defaultShouldRevalidate: shouldSkipRevalidation\n ? false\n : isRevalidationRequired,\n });\n }\n\n if (shouldRevalidate) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: fetcherMatches,\n match: fetcherMatch,\n controller: new AbortController(),\n });\n }\n });\n\n return [navigationMatches, revalidatingFetchers];\n}\n\nfunction shouldLoadRouteOnHydration(\n route: AgnosticDataRouteObject,\n loaderData: RouteData | null | undefined,\n errors: RouteData | null | undefined\n) {\n // We dunno if we have a loader - gotta find out!\n if (route.lazy) {\n return true;\n }\n\n // No loader, nothing to initialize\n if (!route.loader) {\n return false;\n }\n\n let hasData = loaderData != null && loaderData[route.id] !== undefined;\n let hasError = errors != null && errors[route.id] !== undefined;\n\n // Don't run if we error'd during SSR\n if (!hasData && hasError) {\n return false;\n }\n\n // Explicitly opting-in to running on hydration\n if (typeof route.loader === \"function\" && route.loader.hydrate === true) {\n return true;\n }\n\n // Otherwise, run if we're not yet initialized with anything\n return !hasData && !hasError;\n}\n\nfunction isNewLoader(\n currentLoaderData: RouteData,\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let isNew =\n // [a] -> [a, b]\n !currentMatch ||\n // [a, b] -> [a, c]\n match.route.id !== currentMatch.route.id;\n\n // Handle the case that we don't have data for a re-used route, potentially\n // from a prior error or from a cancelled pending deferred\n let isMissingData = currentLoaderData[match.route.id] === undefined;\n\n // Always load if this is a net-new route or we don't yet have data\n return isNew || isMissingData;\n}\n\nfunction isNewRouteInstance(\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let currentPath = currentMatch.route.path;\n return (\n // param change for this match, /users/123 -> /users/456\n currentMatch.pathname !== match.pathname ||\n // splat param changed, which is not present in match.path\n // e.g. /files/images/avatar.jpg -> files/finances.xls\n (currentPath != null &&\n currentPath.endsWith(\"*\") &&\n currentMatch.params[\"*\"] !== match.params[\"*\"])\n );\n}\n\nfunction shouldRevalidateLoader(\n loaderMatch: AgnosticDataRouteMatch,\n arg: ShouldRevalidateFunctionArgs\n) {\n if (loaderMatch.route.shouldRevalidate) {\n let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n if (typeof routeChoice === \"boolean\") {\n return routeChoice;\n }\n }\n\n return arg.defaultShouldRevalidate;\n}\n\nfunction patchRoutesImpl(\n routeId: string | null,\n children: AgnosticRouteObject[],\n routesToUse: AgnosticDataRouteObject[],\n manifest: RouteManifest,\n mapRouteProperties: MapRoutePropertiesFunction\n) {\n let childrenToPatch: AgnosticDataRouteObject[];\n if (routeId) {\n let route = manifest[routeId];\n invariant(\n route,\n `No route found to patch children into: routeId = ${routeId}`\n );\n if (!route.children) {\n route.children = [];\n }\n childrenToPatch = route.children;\n } else {\n childrenToPatch = routesToUse;\n }\n\n // Don't patch in routes we already know about so that `patch` is idempotent\n // to simplify user-land code. This is useful because we re-call the\n // `patchRoutesOnNavigation` function for matched routes with params.\n let uniqueChildren = children.filter(\n (newRoute) =>\n !childrenToPatch.some((existingRoute) =>\n isSameRoute(newRoute, existingRoute)\n )\n );\n\n let newRoutes = convertRoutesToDataRoutes(\n uniqueChildren,\n mapRouteProperties,\n [routeId || \"_\", \"patch\", String(childrenToPatch?.length || \"0\")],\n manifest\n );\n\n childrenToPatch.push(...newRoutes);\n}\n\nfunction isSameRoute(\n newRoute: AgnosticRouteObject,\n existingRoute: AgnosticRouteObject\n): boolean {\n // Most optimal check is by id\n if (\n \"id\" in newRoute &&\n \"id\" in existingRoute &&\n newRoute.id === existingRoute.id\n ) {\n return true;\n }\n\n // Second is by pathing differences\n if (\n !(\n newRoute.index === existingRoute.index &&\n newRoute.path === existingRoute.path &&\n newRoute.caseSensitive === existingRoute.caseSensitive\n )\n ) {\n return false;\n }\n\n // Pathless layout routes are trickier since we need to check children.\n // If they have no children then they're the same as far as we can tell\n if (\n (!newRoute.children || newRoute.children.length === 0) &&\n (!existingRoute.children || existingRoute.children.length === 0)\n ) {\n return true;\n }\n\n // Otherwise, we look to see if every child in the new route is already\n // represented in the existing route's children\n return newRoute.children!.every((aChild, i) =>\n existingRoute.children?.some((bChild) => isSameRoute(aChild, bChild))\n );\n}\n\n/**\n * Execute route.lazy() methods to lazily load route modules (loader, action,\n * shouldRevalidate) and update the routeManifest in place which shares objects\n * with dataRoutes so those get updated as well.\n */\nasync function loadLazyRouteModule(\n route: AgnosticDataRouteObject,\n mapRouteProperties: MapRoutePropertiesFunction,\n manifest: RouteManifest\n) {\n if (!route.lazy) {\n return;\n }\n\n let lazyRoute = await route.lazy();\n\n // If the lazy route function was executed and removed by another parallel\n // call then we can return - first lazy() to finish wins because the return\n // value of lazy is expected to be static\n if (!route.lazy) {\n return;\n }\n\n let routeToUpdate = manifest[route.id];\n invariant(routeToUpdate, \"No route found in manifest\");\n\n // Update the route in place. This should be safe because there's no way\n // we could yet be sitting on this route as we can't get there without\n // resolving lazy() first.\n //\n // This is different than the HMR \"update\" use-case where we may actively be\n // on the route being updated. The main concern boils down to \"does this\n // mutation affect any ongoing navigations or any current state.matches\n // values?\". If not, it should be safe to update in place.\n let routeUpdates: Record = {};\n for (let lazyRouteProperty in lazyRoute) {\n let staticRouteValue =\n routeToUpdate[lazyRouteProperty as keyof typeof routeToUpdate];\n\n let isPropertyStaticallyDefined =\n staticRouteValue !== undefined &&\n // This property isn't static since it should always be updated based\n // on the route updates\n lazyRouteProperty !== \"hasErrorBoundary\";\n\n warning(\n !isPropertyStaticallyDefined,\n `Route \"${routeToUpdate.id}\" has a static property \"${lazyRouteProperty}\" ` +\n `defined but its lazy function is also returning a value for this property. ` +\n `The lazy route property \"${lazyRouteProperty}\" will be ignored.`\n );\n\n if (\n !isPropertyStaticallyDefined &&\n !immutableRouteKeys.has(lazyRouteProperty as ImmutableRouteKey)\n ) {\n routeUpdates[lazyRouteProperty] =\n lazyRoute[lazyRouteProperty as keyof typeof lazyRoute];\n }\n }\n\n // Mutate the route with the provided updates. Do this first so we pass\n // the updated version to mapRouteProperties\n Object.assign(routeToUpdate, routeUpdates);\n\n // Mutate the `hasErrorBoundary` property on the route based on the route\n // updates and remove the `lazy` function so we don't resolve the lazy\n // route again.\n Object.assign(routeToUpdate, {\n // To keep things framework agnostic, we use the provided\n // `mapRouteProperties` (or wrapped `detectErrorBoundary`) function to\n // set the framework-aware properties (`element`/`hasErrorBoundary`) since\n // the logic will differ between frameworks.\n ...mapRouteProperties(routeToUpdate),\n lazy: undefined,\n });\n}\n\n// Default implementation of `dataStrategy` which fetches all loaders in parallel\nasync function defaultDataStrategy({\n matches,\n}: DataStrategyFunctionArgs): ReturnType {\n let matchesToLoad = matches.filter((m) => m.shouldLoad);\n let results = await Promise.all(matchesToLoad.map((m) => m.resolve()));\n return results.reduce(\n (acc, result, i) =>\n Object.assign(acc, { [matchesToLoad[i].route.id]: result }),\n {}\n );\n}\n\nasync function callDataStrategyImpl(\n dataStrategyImpl: DataStrategyFunction,\n type: \"loader\" | \"action\",\n state: RouterState | null,\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n fetcherKey: string | null,\n manifest: RouteManifest,\n mapRouteProperties: MapRoutePropertiesFunction,\n requestContext?: unknown\n): Promise> {\n let loadRouteDefinitionsPromises = matches.map((m) =>\n m.route.lazy\n ? loadLazyRouteModule(m.route, mapRouteProperties, manifest)\n : undefined\n );\n\n let dsMatches = matches.map((match, i) => {\n let loadRoutePromise = loadRouteDefinitionsPromises[i];\n let shouldLoad = matchesToLoad.some((m) => m.route.id === match.route.id);\n // `resolve` encapsulates route.lazy(), executing the loader/action,\n // and mapping return values/thrown errors to a `DataStrategyResult`. Users\n // can pass a callback to take fine-grained control over the execution\n // of the loader/action\n let resolve: DataStrategyMatch[\"resolve\"] = async (handlerOverride) => {\n if (\n handlerOverride &&\n request.method === \"GET\" &&\n (match.route.lazy || match.route.loader)\n ) {\n shouldLoad = true;\n }\n return shouldLoad\n ? callLoaderOrAction(\n type,\n request,\n match,\n loadRoutePromise,\n handlerOverride,\n requestContext\n )\n : Promise.resolve({ type: ResultType.data, result: undefined });\n };\n\n return {\n ...match,\n shouldLoad,\n resolve,\n };\n });\n\n // Send all matches here to allow for a middleware-type implementation.\n // handler will be a no-op for unneeded routes and we filter those results\n // back out below.\n let results = await dataStrategyImpl({\n matches: dsMatches,\n request,\n params: matches[0].params,\n fetcherKey,\n context: requestContext,\n });\n\n // Wait for all routes to load here but 'swallow the error since we want\n // it to bubble up from the `await loadRoutePromise` in `callLoaderOrAction` -\n // called from `match.resolve()`\n try {\n await Promise.all(loadRouteDefinitionsPromises);\n } catch (e) {\n // No-op\n }\n\n return results;\n}\n\n// Default logic for calling a loader/action is the user has no specified a dataStrategy\nasync function callLoaderOrAction(\n type: \"loader\" | \"action\",\n request: Request,\n match: AgnosticDataRouteMatch,\n loadRoutePromise: Promise | undefined,\n handlerOverride: Parameters[0],\n staticContext?: unknown\n): Promise {\n let result: DataStrategyResult;\n let onReject: (() => void) | undefined;\n\n let runHandler = (\n handler: AgnosticRouteObject[\"loader\"] | AgnosticRouteObject[\"action\"]\n ): Promise => {\n // Setup a promise we can race against so that abort signals short circuit\n let reject: () => void;\n // This will never resolve so safe to type it as Promise to\n // satisfy the function return value\n let abortPromise = new Promise((_, r) => (reject = r));\n onReject = () => reject();\n request.signal.addEventListener(\"abort\", onReject);\n\n let actualHandler = (ctx?: unknown) => {\n if (typeof handler !== \"function\") {\n return Promise.reject(\n new Error(\n `You cannot call the handler for a route which defines a boolean ` +\n `\"${type}\" [routeId: ${match.route.id}]`\n )\n );\n }\n return handler(\n {\n request,\n params: match.params,\n context: staticContext,\n },\n ...(ctx !== undefined ? [ctx] : [])\n );\n };\n\n let handlerPromise: Promise = (async () => {\n try {\n let val = await (handlerOverride\n ? handlerOverride((ctx: unknown) => actualHandler(ctx))\n : actualHandler());\n return { type: \"data\", result: val };\n } catch (e) {\n return { type: \"error\", result: e };\n }\n })();\n\n return Promise.race([handlerPromise, abortPromise]);\n };\n\n try {\n let handler = match.route[type];\n\n // If we have a route.lazy promise, await that first\n if (loadRoutePromise) {\n if (handler) {\n // Run statically defined handler in parallel with lazy()\n let handlerError;\n let [value] = await Promise.all([\n // If the handler throws, don't let it immediately bubble out,\n // since we need to let the lazy() execution finish so we know if this\n // route has a boundary that can handle the error\n runHandler(handler).catch((e) => {\n handlerError = e;\n }),\n loadRoutePromise,\n ]);\n if (handlerError !== undefined) {\n throw handlerError;\n }\n result = value!;\n } else {\n // Load lazy route module, then run any returned handler\n await loadRoutePromise;\n\n handler = match.route[type];\n if (handler) {\n // Handler still runs even if we got interrupted to maintain consistency\n // with un-abortable behavior of handler execution on non-lazy or\n // previously-lazy-loaded routes\n result = await runHandler(handler);\n } else if (type === \"action\") {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(405, {\n method: request.method,\n pathname,\n routeId: match.route.id,\n });\n } else {\n // lazy() route has no loader to run. Short circuit here so we don't\n // hit the invariant below that errors on returning undefined.\n return { type: ResultType.data, result: undefined };\n }\n }\n } else if (!handler) {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(404, {\n pathname,\n });\n } else {\n result = await runHandler(handler);\n }\n\n invariant(\n result.result !== undefined,\n `You defined ${type === \"action\" ? \"an action\" : \"a loader\"} for route ` +\n `\"${match.route.id}\" but didn't return anything from your \\`${type}\\` ` +\n `function. Please return a value or \\`null\\`.`\n );\n } catch (e) {\n // We should already be catching and converting normal handler executions to\n // DataStrategyResults and returning them, so anything that throws here is an\n // unexpected error we still need to wrap\n return { type: ResultType.error, result: e };\n } finally {\n if (onReject) {\n request.signal.removeEventListener(\"abort\", onReject);\n }\n }\n\n return result;\n}\n\nasync function convertDataStrategyResultToDataResult(\n dataStrategyResult: DataStrategyResult\n): Promise {\n let { result, type } = dataStrategyResult;\n\n if (isResponse(result)) {\n let data: any;\n\n try {\n let contentType = result.headers.get(\"Content-Type\");\n // Check between word boundaries instead of startsWith() due to the last\n // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n if (result.body == null) {\n data = null;\n } else {\n data = await result.json();\n }\n } else {\n data = await result.text();\n }\n } catch (e) {\n return { type: ResultType.error, error: e };\n }\n\n if (type === ResultType.error) {\n return {\n type: ResultType.error,\n error: new ErrorResponseImpl(result.status, result.statusText, data),\n statusCode: result.status,\n headers: result.headers,\n };\n }\n\n return {\n type: ResultType.data,\n data,\n statusCode: result.status,\n headers: result.headers,\n };\n }\n\n if (type === ResultType.error) {\n if (isDataWithResponseInit(result)) {\n if (result.data instanceof Error) {\n return {\n type: ResultType.error,\n error: result.data,\n statusCode: result.init?.status,\n headers: result.init?.headers\n ? new Headers(result.init.headers)\n : undefined,\n };\n }\n\n // Convert thrown data() to ErrorResponse instances\n return {\n type: ResultType.error,\n error: new ErrorResponseImpl(\n result.init?.status || 500,\n undefined,\n result.data\n ),\n statusCode: isRouteErrorResponse(result) ? result.status : undefined,\n headers: result.init?.headers\n ? new Headers(result.init.headers)\n : undefined,\n };\n }\n return {\n type: ResultType.error,\n error: result,\n statusCode: isRouteErrorResponse(result) ? result.status : undefined,\n };\n }\n\n if (isDeferredData(result)) {\n return {\n type: ResultType.deferred,\n deferredData: result,\n statusCode: result.init?.status,\n headers: result.init?.headers && new Headers(result.init.headers),\n };\n }\n\n if (isDataWithResponseInit(result)) {\n return {\n type: ResultType.data,\n data: result.data,\n statusCode: result.init?.status,\n headers: result.init?.headers\n ? new Headers(result.init.headers)\n : undefined,\n };\n }\n\n return { type: ResultType.data, data: result };\n}\n\n// Support relative routing in internal redirects\nfunction normalizeRelativeRoutingRedirectResponse(\n response: Response,\n request: Request,\n routeId: string,\n matches: AgnosticDataRouteMatch[],\n basename: string,\n v7_relativeSplatPath: boolean\n) {\n let location = response.headers.get(\"Location\");\n invariant(\n location,\n \"Redirects returned/thrown from loaders/actions must have a Location header\"\n );\n\n if (!ABSOLUTE_URL_REGEX.test(location)) {\n let trimmedMatches = matches.slice(\n 0,\n matches.findIndex((m) => m.route.id === routeId) + 1\n );\n location = normalizeTo(\n new URL(request.url),\n trimmedMatches,\n basename,\n true,\n location,\n v7_relativeSplatPath\n );\n response.headers.set(\"Location\", location);\n }\n\n return response;\n}\n\nfunction normalizeRedirectLocation(\n location: string,\n currentUrl: URL,\n basename: string\n): string {\n if (ABSOLUTE_URL_REGEX.test(location)) {\n // Strip off the protocol+origin for same-origin + same-basename absolute redirects\n let normalizedLocation = location;\n let url = normalizedLocation.startsWith(\"//\")\n ? new URL(currentUrl.protocol + normalizedLocation)\n : new URL(normalizedLocation);\n let isSameBasename = stripBasename(url.pathname, basename) != null;\n if (url.origin === currentUrl.origin && isSameBasename) {\n return url.pathname + url.search + url.hash;\n }\n }\n return location;\n}\n\n// Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches. During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\nfunction createClientSideRequest(\n history: History,\n location: string | Location,\n signal: AbortSignal,\n submission?: Submission\n): Request {\n let url = history.createURL(stripHashFromPath(location)).toString();\n let init: RequestInit = { signal };\n\n if (submission && isMutationMethod(submission.formMethod)) {\n let { formMethod, formEncType } = submission;\n // Didn't think we needed this but it turns out unlike other methods, patch\n // won't be properly normalized to uppercase and results in a 405 error.\n // See: https://fetch.spec.whatwg.org/#concept-method\n init.method = formMethod.toUpperCase();\n\n if (formEncType === \"application/json\") {\n init.headers = new Headers({ \"Content-Type\": formEncType });\n init.body = JSON.stringify(submission.json);\n } else if (formEncType === \"text/plain\") {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.text;\n } else if (\n formEncType === \"application/x-www-form-urlencoded\" &&\n submission.formData\n ) {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = convertFormDataToSearchParams(submission.formData);\n } else {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.formData;\n }\n }\n\n return new Request(url, init);\n}\n\nfunction convertFormDataToSearchParams(formData: FormData): URLSearchParams {\n let searchParams = new URLSearchParams();\n\n for (let [key, value] of formData.entries()) {\n // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n searchParams.append(key, typeof value === \"string\" ? value : value.name);\n }\n\n return searchParams;\n}\n\nfunction convertSearchParamsToFormData(\n searchParams: URLSearchParams\n): FormData {\n let formData = new FormData();\n for (let [key, value] of searchParams.entries()) {\n formData.append(key, value);\n }\n return formData;\n}\n\nfunction processRouteLoaderData(\n matches: AgnosticDataRouteMatch[],\n results: Record,\n pendingActionResult: PendingActionResult | undefined,\n activeDeferreds: Map,\n skipLoaderErrorBubbling: boolean\n): {\n loaderData: RouterState[\"loaderData\"];\n errors: RouterState[\"errors\"] | null;\n statusCode: number;\n loaderHeaders: Record;\n} {\n // Fill in loaderData/errors from our loaders\n let loaderData: RouterState[\"loaderData\"] = {};\n let errors: RouterState[\"errors\"] | null = null;\n let statusCode: number | undefined;\n let foundError = false;\n let loaderHeaders: Record = {};\n let pendingError =\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? pendingActionResult[1].error\n : undefined;\n\n // Process loader results into state.loaderData/state.errors\n matches.forEach((match) => {\n if (!(match.route.id in results)) {\n return;\n }\n let id = match.route.id;\n let result = results[id];\n invariant(\n !isRedirectResult(result),\n \"Cannot handle redirect results in processLoaderData\"\n );\n if (isErrorResult(result)) {\n let error = result.error;\n // If we have a pending action error, we report it at the highest-route\n // that throws a loader error, and then clear it out to indicate that\n // it was consumed\n if (pendingError !== undefined) {\n error = pendingError;\n pendingError = undefined;\n }\n\n errors = errors || {};\n\n if (skipLoaderErrorBubbling) {\n errors[id] = error;\n } else {\n // Look upwards from the matched route for the closest ancestor error\n // boundary, defaulting to the root match. Prefer higher error values\n // if lower errors bubble to the same boundary\n let boundaryMatch = findNearestBoundary(matches, id);\n if (errors[boundaryMatch.route.id] == null) {\n errors[boundaryMatch.route.id] = error;\n }\n }\n\n // Clear our any prior loaderData for the throwing route\n loaderData[id] = undefined;\n\n // Once we find our first (highest) error, we set the status code and\n // prevent deeper status codes from overriding\n if (!foundError) {\n foundError = true;\n statusCode = isRouteErrorResponse(result.error)\n ? result.error.status\n : 500;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n if (isDeferredResult(result)) {\n activeDeferreds.set(id, result.deferredData);\n loaderData[id] = result.deferredData.data;\n // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n if (\n result.statusCode != null &&\n result.statusCode !== 200 &&\n !foundError\n ) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n loaderData[id] = result.data;\n // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n if (result.statusCode && result.statusCode !== 200 && !foundError) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n }\n }\n });\n\n // If we didn't consume the pending action error (i.e., all loaders\n // resolved), then consume it here. Also clear out any loaderData for the\n // throwing route\n if (pendingError !== undefined && pendingActionResult) {\n errors = { [pendingActionResult[0]]: pendingError };\n loaderData[pendingActionResult[0]] = undefined;\n }\n\n return {\n loaderData,\n errors,\n statusCode: statusCode || 200,\n loaderHeaders,\n };\n}\n\nfunction processLoaderData(\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n results: Record,\n pendingActionResult: PendingActionResult | undefined,\n revalidatingFetchers: RevalidatingFetcher[],\n fetcherResults: Record,\n activeDeferreds: Map\n): {\n loaderData: RouterState[\"loaderData\"];\n errors?: RouterState[\"errors\"];\n} {\n let { loaderData, errors } = processRouteLoaderData(\n matches,\n results,\n pendingActionResult,\n activeDeferreds,\n false // This method is only called client side so we always want to bubble\n );\n\n // Process results from our revalidating fetchers\n revalidatingFetchers.forEach((rf) => {\n let { key, match, controller } = rf;\n let result = fetcherResults[key];\n invariant(result, \"Did not find corresponding fetcher result\");\n\n // Process fetcher non-redirect errors\n if (controller && controller.signal.aborted) {\n // Nothing to do for aborted fetchers\n return;\n } else if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, match?.route.id);\n if (!(errors && errors[boundaryMatch.route.id])) {\n errors = {\n ...errors,\n [boundaryMatch.route.id]: result.error,\n };\n }\n state.fetchers.delete(key);\n } else if (isRedirectResult(result)) {\n // Should never get here, redirects should get processed above, but we\n // keep this to type narrow to a success result in the else\n invariant(false, \"Unhandled fetcher revalidation redirect\");\n } else if (isDeferredResult(result)) {\n // Should never get here, deferred data should be awaited for fetchers\n // in resolveDeferredResults\n invariant(false, \"Unhandled fetcher deferred data\");\n } else {\n let doneFetcher = getDoneFetcher(result.data);\n state.fetchers.set(key, doneFetcher);\n }\n });\n\n return { loaderData, errors };\n}\n\nfunction mergeLoaderData(\n loaderData: RouteData,\n newLoaderData: RouteData,\n matches: AgnosticDataRouteMatch[],\n errors: RouteData | null | undefined\n): RouteData {\n let mergedLoaderData = { ...newLoaderData };\n for (let match of matches) {\n let id = match.route.id;\n if (newLoaderData.hasOwnProperty(id)) {\n if (newLoaderData[id] !== undefined) {\n mergedLoaderData[id] = newLoaderData[id];\n } else {\n // No-op - this is so we ignore existing data if we have a key in the\n // incoming object with an undefined value, which is how we unset a prior\n // loaderData if we encounter a loader error\n }\n } else if (loaderData[id] !== undefined && match.route.loader) {\n // Preserve existing keys not included in newLoaderData and where a loader\n // wasn't removed by HMR\n mergedLoaderData[id] = loaderData[id];\n }\n\n if (errors && errors.hasOwnProperty(id)) {\n // Don't keep any loader data below the boundary\n break;\n }\n }\n return mergedLoaderData;\n}\n\nfunction getActionDataForCommit(\n pendingActionResult: PendingActionResult | undefined\n) {\n if (!pendingActionResult) {\n return {};\n }\n return isErrorResult(pendingActionResult[1])\n ? {\n // Clear out prior actionData on errors\n actionData: {},\n }\n : {\n actionData: {\n [pendingActionResult[0]]: pendingActionResult[1].data,\n },\n };\n}\n\n// Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\nfunction findNearestBoundary(\n matches: AgnosticDataRouteMatch[],\n routeId?: string\n): AgnosticDataRouteMatch {\n let eligibleMatches = routeId\n ? matches.slice(0, matches.findIndex((m) => m.route.id === routeId) + 1)\n : [...matches];\n return (\n eligibleMatches.reverse().find((m) => m.route.hasErrorBoundary === true) ||\n matches[0]\n );\n}\n\nfunction getShortCircuitMatches(routes: AgnosticDataRouteObject[]): {\n matches: AgnosticDataRouteMatch[];\n route: AgnosticDataRouteObject;\n} {\n // Prefer a root layout route if present, otherwise shim in a route object\n let route =\n routes.length === 1\n ? routes[0]\n : routes.find((r) => r.index || !r.path || r.path === \"/\") || {\n id: `__shim-error-route__`,\n };\n\n return {\n matches: [\n {\n params: {},\n pathname: \"\",\n pathnameBase: \"\",\n route,\n },\n ],\n route,\n };\n}\n\nfunction getInternalRouterError(\n status: number,\n {\n pathname,\n routeId,\n method,\n type,\n message,\n }: {\n pathname?: string;\n routeId?: string;\n method?: string;\n type?: \"defer-action\" | \"invalid-body\";\n message?: string;\n } = {}\n) {\n let statusText = \"Unknown Server Error\";\n let errorMessage = \"Unknown @remix-run/router error\";\n\n if (status === 400) {\n statusText = \"Bad Request\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method} request to \"${pathname}\" but ` +\n `did not provide a \\`loader\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (type === \"defer-action\") {\n errorMessage = \"defer() is not supported in actions\";\n } else if (type === \"invalid-body\") {\n errorMessage = \"Unable to encode submission body\";\n }\n } else if (status === 403) {\n statusText = \"Forbidden\";\n errorMessage = `Route \"${routeId}\" does not match URL \"${pathname}\"`;\n } else if (status === 404) {\n statusText = \"Not Found\";\n errorMessage = `No route matches URL \"${pathname}\"`;\n } else if (status === 405) {\n statusText = \"Method Not Allowed\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method.toUpperCase()} request to \"${pathname}\" but ` +\n `did not provide an \\`action\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (method) {\n errorMessage = `Invalid request method \"${method.toUpperCase()}\"`;\n }\n }\n\n return new ErrorResponseImpl(\n status || 500,\n statusText,\n new Error(errorMessage),\n true\n );\n}\n\n// Find any returned redirect errors, starting from the lowest match\nfunction findRedirect(\n results: Record\n): { key: string; result: RedirectResult } | undefined {\n let entries = Object.entries(results);\n for (let i = entries.length - 1; i >= 0; i--) {\n let [key, result] = entries[i];\n if (isRedirectResult(result)) {\n return { key, result };\n }\n }\n}\n\nfunction stripHashFromPath(path: To) {\n let parsedPath = typeof path === \"string\" ? parsePath(path) : path;\n return createPath({ ...parsedPath, hash: \"\" });\n}\n\nfunction isHashChangeOnly(a: Location, b: Location): boolean {\n if (a.pathname !== b.pathname || a.search !== b.search) {\n return false;\n }\n\n if (a.hash === \"\") {\n // /page -> /page#hash\n return b.hash !== \"\";\n } else if (a.hash === b.hash) {\n // /page#hash -> /page#hash\n return true;\n } else if (b.hash !== \"\") {\n // /page#hash -> /page#other\n return true;\n }\n\n // If the hash is removed the browser will re-perform a request to the server\n // /page#hash -> /page\n return false;\n}\n\nfunction isPromise(val: unknown): val is Promise {\n return typeof val === \"object\" && val != null && \"then\" in val;\n}\n\nfunction isDataStrategyResult(result: unknown): result is DataStrategyResult {\n return (\n result != null &&\n typeof result === \"object\" &&\n \"type\" in result &&\n \"result\" in result &&\n (result.type === ResultType.data || result.type === ResultType.error)\n );\n}\n\nfunction isRedirectDataStrategyResultResult(result: DataStrategyResult) {\n return (\n isResponse(result.result) && redirectStatusCodes.has(result.result.status)\n );\n}\n\nfunction isDeferredResult(result: DataResult): result is DeferredResult {\n return result.type === ResultType.deferred;\n}\n\nfunction isErrorResult(result: DataResult): result is ErrorResult {\n return result.type === ResultType.error;\n}\n\nfunction isRedirectResult(result?: DataResult): result is RedirectResult {\n return (result && result.type) === ResultType.redirect;\n}\n\nexport function isDataWithResponseInit(\n value: any\n): value is DataWithResponseInit {\n return (\n typeof value === \"object\" &&\n value != null &&\n \"type\" in value &&\n \"data\" in value &&\n \"init\" in value &&\n value.type === \"DataWithResponseInit\"\n );\n}\n\nexport function isDeferredData(value: any): value is DeferredData {\n let deferred: DeferredData = value;\n return (\n deferred &&\n typeof deferred === \"object\" &&\n typeof deferred.data === \"object\" &&\n typeof deferred.subscribe === \"function\" &&\n typeof deferred.cancel === \"function\" &&\n typeof deferred.resolveData === \"function\"\n );\n}\n\nfunction isResponse(value: any): value is Response {\n return (\n value != null &&\n typeof value.status === \"number\" &&\n typeof value.statusText === \"string\" &&\n typeof value.headers === \"object\" &&\n typeof value.body !== \"undefined\"\n );\n}\n\nfunction isRedirectResponse(result: any): result is Response {\n if (!isResponse(result)) {\n return false;\n }\n\n let status = result.status;\n let location = result.headers.get(\"Location\");\n return status >= 300 && status <= 399 && location != null;\n}\n\nfunction isValidMethod(method: string): method is FormMethod | V7_FormMethod {\n return validRequestMethods.has(method.toLowerCase() as FormMethod);\n}\n\nfunction isMutationMethod(\n method: string\n): method is MutationFormMethod | V7_MutationFormMethod {\n return validMutationMethods.has(method.toLowerCase() as MutationFormMethod);\n}\n\nasync function resolveNavigationDeferredResults(\n matches: (AgnosticDataRouteMatch | null)[],\n results: Record,\n signal: AbortSignal,\n currentMatches: AgnosticDataRouteMatch[],\n currentLoaderData: RouteData\n) {\n let entries = Object.entries(results);\n for (let index = 0; index < entries.length; index++) {\n let [routeId, result] = entries[index];\n let match = matches.find((m) => m?.route.id === routeId);\n // If we don't have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n if (!match) {\n continue;\n }\n\n let currentMatch = currentMatches.find(\n (m) => m.route.id === match!.route.id\n );\n let isRevalidatingLoader =\n currentMatch != null &&\n !isNewRouteInstance(currentMatch, match) &&\n (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n\n if (isDeferredResult(result) && isRevalidatingLoader) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they'll get aborted\n // there if needed\n await resolveDeferredData(result, signal, false).then((result) => {\n if (result) {\n results[routeId] = result;\n }\n });\n }\n }\n}\n\nasync function resolveFetcherDeferredResults(\n matches: (AgnosticDataRouteMatch | null)[],\n results: Record,\n revalidatingFetchers: RevalidatingFetcher[]\n) {\n for (let index = 0; index < revalidatingFetchers.length; index++) {\n let { key, routeId, controller } = revalidatingFetchers[index];\n let result = results[key];\n let match = matches.find((m) => m?.route.id === routeId);\n // If we don't have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n if (!match) {\n continue;\n }\n\n if (isDeferredResult(result)) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they'll get aborted\n // there if needed\n invariant(\n controller,\n \"Expected an AbortController for revalidating fetcher deferred result\"\n );\n await resolveDeferredData(result, controller.signal, true).then(\n (result) => {\n if (result) {\n results[key] = result;\n }\n }\n );\n }\n }\n}\n\nasync function resolveDeferredData(\n result: DeferredResult,\n signal: AbortSignal,\n unwrap = false\n): Promise {\n let aborted = await result.deferredData.resolveData(signal);\n if (aborted) {\n return;\n }\n\n if (unwrap) {\n try {\n return {\n type: ResultType.data,\n data: result.deferredData.unwrappedData,\n };\n } catch (e) {\n // Handle any TrackedPromise._error values encountered while unwrapping\n return {\n type: ResultType.error,\n error: e,\n };\n }\n }\n\n return {\n type: ResultType.data,\n data: result.deferredData.data,\n };\n}\n\nfunction hasNakedIndexQuery(search: string): boolean {\n return new URLSearchParams(search).getAll(\"index\").some((v) => v === \"\");\n}\n\nfunction getTargetMatch(\n matches: AgnosticDataRouteMatch[],\n location: Location | string\n) {\n let search =\n typeof location === \"string\" ? parsePath(location).search : location.search;\n if (\n matches[matches.length - 1].route.index &&\n hasNakedIndexQuery(search || \"\")\n ) {\n // Return the leaf index route when index is present\n return matches[matches.length - 1];\n }\n // Otherwise grab the deepest \"path contributing\" match (ignoring index and\n // pathless layout routes)\n let pathMatches = getPathContributingMatches(matches);\n return pathMatches[pathMatches.length - 1];\n}\n\nfunction getSubmissionFromNavigation(\n navigation: Navigation\n): Submission | undefined {\n let { formMethod, formAction, formEncType, text, formData, json } =\n navigation;\n if (!formMethod || !formAction || !formEncType) {\n return;\n }\n\n if (text != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json: undefined,\n text,\n };\n } else if (formData != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData,\n json: undefined,\n text: undefined,\n };\n } else if (json !== undefined) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json,\n text: undefined,\n };\n }\n}\n\nfunction getLoadingNavigation(\n location: Location,\n submission?: Submission\n): NavigationStates[\"Loading\"] {\n if (submission) {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n } else {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n };\n return navigation;\n }\n}\n\nfunction getSubmittingNavigation(\n location: Location,\n submission: Submission\n): NavigationStates[\"Submitting\"] {\n let navigation: NavigationStates[\"Submitting\"] = {\n state: \"submitting\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n}\n\nfunction getLoadingFetcher(\n submission?: Submission,\n data?: Fetcher[\"data\"]\n): FetcherStates[\"Loading\"] {\n if (submission) {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data,\n };\n return fetcher;\n } else {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n };\n return fetcher;\n }\n}\n\nfunction getSubmittingFetcher(\n submission: Submission,\n existingFetcher?: Fetcher\n): FetcherStates[\"Submitting\"] {\n let fetcher: FetcherStates[\"Submitting\"] = {\n state: \"submitting\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data: existingFetcher ? existingFetcher.data : undefined,\n };\n return fetcher;\n}\n\nfunction getDoneFetcher(data: Fetcher[\"data\"]): FetcherStates[\"Idle\"] {\n let fetcher: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n };\n return fetcher;\n}\n\nfunction restoreAppliedTransitions(\n _window: Window,\n transitions: Map>\n) {\n try {\n let sessionPositions = _window.sessionStorage.getItem(\n TRANSITIONS_STORAGE_KEY\n );\n if (sessionPositions) {\n let json = JSON.parse(sessionPositions);\n for (let [k, v] of Object.entries(json || {})) {\n if (v && Array.isArray(v)) {\n transitions.set(k, new Set(v || []));\n }\n }\n }\n } catch (e) {\n // no-op, use default empty object\n }\n}\n\nfunction persistAppliedTransitions(\n _window: Window,\n transitions: Map>\n) {\n if (transitions.size > 0) {\n let json: Record = {};\n for (let [k, v] of transitions) {\n json[k] = [...v];\n }\n try {\n _window.sessionStorage.setItem(\n TRANSITIONS_STORAGE_KEY,\n JSON.stringify(json)\n );\n } catch (error) {\n warning(\n false,\n `Failed to save applied view transitions in sessionStorage (${error}).`\n );\n }\n }\n}\n//#endregion\n","import * as React from \"react\";\nimport type {\n AgnosticIndexRouteObject,\n AgnosticNonIndexRouteObject,\n AgnosticRouteMatch,\n History,\n LazyRouteFunction,\n Location,\n Action as NavigationType,\n RelativeRoutingType,\n Router,\n StaticHandlerContext,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\n\n// Create react-specific types from the agnostic types in @remix-run/router to\n// export from react-router\nexport interface IndexRouteObject {\n caseSensitive?: AgnosticIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticIndexRouteObject[\"path\"];\n id?: AgnosticIndexRouteObject[\"id\"];\n loader?: AgnosticIndexRouteObject[\"loader\"];\n action?: AgnosticIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticIndexRouteObject[\"handle\"];\n index: true;\n children?: undefined;\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction;\n}\n\nexport interface NonIndexRouteObject {\n caseSensitive?: AgnosticNonIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticNonIndexRouteObject[\"path\"];\n id?: AgnosticNonIndexRouteObject[\"id\"];\n loader?: AgnosticNonIndexRouteObject[\"loader\"];\n action?: AgnosticNonIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticNonIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticNonIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticNonIndexRouteObject[\"handle\"];\n index?: false;\n children?: RouteObject[];\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction;\n}\n\nexport type RouteObject = IndexRouteObject | NonIndexRouteObject;\n\nexport type DataRouteObject = RouteObject & {\n children?: DataRouteObject[];\n id: string;\n};\n\nexport interface RouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends RouteObject = RouteObject\n> extends AgnosticRouteMatch {}\n\nexport interface DataRouteMatch extends RouteMatch {}\n\nexport interface DataRouterContextObject\n // Omit `future` since those can be pulled from the `router`\n // `NavigationContext` needs future since it doesn't have a `router` in all cases\n extends Omit {\n router: Router;\n staticContext?: StaticHandlerContext;\n}\n\nexport const DataRouterContext =\n React.createContext(null);\nif (__DEV__) {\n DataRouterContext.displayName = \"DataRouter\";\n}\n\nexport const DataRouterStateContext = React.createContext<\n Router[\"state\"] | null\n>(null);\nif (__DEV__) {\n DataRouterStateContext.displayName = \"DataRouterState\";\n}\n\nexport const AwaitContext = React.createContext(null);\nif (__DEV__) {\n AwaitContext.displayName = \"Await\";\n}\n\nexport interface NavigateOptions {\n replace?: boolean;\n state?: any;\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n flushSync?: boolean;\n viewTransition?: boolean;\n}\n\n/**\n * A Navigator is a \"location changer\"; it's how you get to different locations.\n *\n * Every history instance conforms to the Navigator interface, but the\n * distinction is useful primarily when it comes to the low-level `` API\n * where both the location and a navigator must be provided separately in order\n * to avoid \"tearing\" that may occur in a suspense-enabled app if the action\n * and/or location were to be read directly from the history instance.\n */\nexport interface Navigator {\n createHref: History[\"createHref\"];\n // Optional for backwards-compat with Router/HistoryRouter usage (edge case)\n encodeLocation?: History[\"encodeLocation\"];\n go: History[\"go\"];\n push(to: To, state?: any, opts?: NavigateOptions): void;\n replace(to: To, state?: any, opts?: NavigateOptions): void;\n}\n\ninterface NavigationContextObject {\n basename: string;\n navigator: Navigator;\n static: boolean;\n future: {\n v7_relativeSplatPath: boolean;\n };\n}\n\nexport const NavigationContext = React.createContext(\n null!\n);\n\nif (__DEV__) {\n NavigationContext.displayName = \"Navigation\";\n}\n\ninterface LocationContextObject {\n location: Location;\n navigationType: NavigationType;\n}\n\nexport const LocationContext = React.createContext(\n null!\n);\n\nif (__DEV__) {\n LocationContext.displayName = \"Location\";\n}\n\nexport interface RouteContextObject {\n outlet: React.ReactElement | null;\n matches: RouteMatch[];\n isDataRoute: boolean;\n}\n\nexport const RouteContext = React.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false,\n});\n\nif (__DEV__) {\n RouteContext.displayName = \"Route\";\n}\n\nexport const RouteErrorContext = React.createContext(null);\n\nif (__DEV__) {\n RouteErrorContext.displayName = \"RouteError\";\n}\n","import * as React from \"react\";\nimport type {\n AgnosticRouteMatch,\n Blocker,\n BlockerFunction,\n Location,\n ParamParseKey,\n Params,\n Path,\n PathMatch,\n PathPattern,\n RelativeRoutingType,\n Router as RemixRouter,\n RevalidationState,\n To,\n UIMatch,\n} from \"@remix-run/router\";\nimport {\n IDLE_BLOCKER,\n Action as NavigationType,\n UNSAFE_convertRouteMatchToUiMatch as convertRouteMatchToUiMatch,\n UNSAFE_decodePath as decodePath,\n UNSAFE_getResolveToMatches as getResolveToMatches,\n UNSAFE_invariant as invariant,\n isRouteErrorResponse,\n joinPaths,\n matchPath,\n matchRoutes,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\n\nimport type {\n DataRouteMatch,\n NavigateOptions,\n RouteContextObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n RouteErrorContext,\n} from \"./context\";\n\n/**\n * Returns the full href for the given \"to\" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/v6/hooks/use-href\n */\nexport function useHref(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useHref() may be used only in the context of a component.`\n );\n\n let { basename, navigator } = React.useContext(NavigationContext);\n let { hash, pathname, search } = useResolvedPath(to, { relative });\n\n let joinedPathname = pathname;\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to creating the href. If this is a root navigation, then just use the raw\n // basename which allows the basename to have full control over the presence\n // of a trailing slash on root links\n if (basename !== \"/\") {\n joinedPathname =\n pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n\n return navigator.createHref({ pathname: joinedPathname, search, hash });\n}\n\n/**\n * Returns true if this component is a descendant of a ``.\n *\n * @see https://reactrouter.com/v6/hooks/use-in-router-context\n */\nexport function useInRouterContext(): boolean {\n return React.useContext(LocationContext) != null;\n}\n\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you're using this it may mean you're doing some of your own\n * \"routing\" in your app, and we'd like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/v6/hooks/use-location\n */\nexport function useLocation(): Location {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useLocation() may be used only in the context of a component.`\n );\n\n return React.useContext(LocationContext).location;\n}\n\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/v6/hooks/use-navigation-type\n */\nexport function useNavigationType(): NavigationType {\n return React.useContext(LocationContext).navigationType;\n}\n\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know \"active\" state, e.g.\n * ``.\n *\n * @see https://reactrouter.com/v6/hooks/use-match\n */\nexport function useMatch<\n ParamKey extends ParamParseKey,\n Path extends string\n>(pattern: PathPattern | Path): PathMatch | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useMatch() may be used only in the context of a component.`\n );\n\n let { pathname } = useLocation();\n return React.useMemo(\n () => matchPath(pattern, decodePath(pathname)),\n [pathname, pattern]\n );\n}\n\n/**\n * The interface for the navigate() function returned from useNavigate().\n */\nexport interface NavigateFunction {\n (to: To, options?: NavigateOptions): void;\n (delta: number): void;\n}\n\nconst navigateEffectWarning =\n `You should call navigate() in a React.useEffect(), not when ` +\n `your component is first rendered.`;\n\n// Mute warnings for calls to useNavigate in SSR environments\nfunction useIsomorphicLayoutEffect(\n cb: Parameters[0]\n) {\n let isStatic = React.useContext(NavigationContext).static;\n if (!isStatic) {\n // We should be able to get rid of this once react 18.3 is released\n // See: https://github.com/facebook/react/pull/26395\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(cb);\n }\n}\n\n/**\n * Returns an imperative method for changing the location. Used by ``s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/v6/hooks/use-navigate\n */\nexport function useNavigate(): NavigateFunction {\n let { isDataRoute } = React.useContext(RouteContext);\n // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\n\nfunction useNavigateUnstable(): NavigateFunction {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useNavigate() may be used only in the context of a component.`\n );\n\n let dataRouterContext = React.useContext(DataRouterContext);\n let { basename, future, navigator } = React.useContext(NavigationContext);\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n\n let routePathnamesJson = JSON.stringify(\n getResolveToMatches(matches, future.v7_relativeSplatPath)\n );\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our history listener yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n\n let path = resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n options.relative === \"path\"\n );\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to handing off to history (but only if we're not in a data router,\n // otherwise it'll prepend the basename inside of the router).\n // If this is a root navigation, then we navigate to the raw basename\n // which allows the basename to have full control over the presence of a\n // trailing slash on root links\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\"\n ? basename\n : joinPaths([basename, path.pathname]);\n }\n\n (!!options.replace ? navigator.replace : navigator.push)(\n path,\n options.state,\n options\n );\n },\n [\n basename,\n navigator,\n routePathnamesJson,\n locationPathname,\n dataRouterContext,\n ]\n );\n\n return navigate;\n}\n\nconst OutletContext = React.createContext(null);\n\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/v6/hooks/use-outlet-context\n */\nexport function useOutletContext(): Context {\n return React.useContext(OutletContext) as Context;\n}\n\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by `` to render child routes.\n *\n * @see https://reactrouter.com/v6/hooks/use-outlet\n */\nexport function useOutlet(context?: unknown): React.ReactElement | null {\n let outlet = React.useContext(RouteContext).outlet;\n if (outlet) {\n return (\n {outlet}\n );\n }\n return outlet;\n}\n\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/v6/hooks/use-params\n */\nexport function useParams<\n ParamsOrKey extends string | Record = string\n>(): Readonly<\n [ParamsOrKey] extends [string] ? Params : Partial\n> {\n let { matches } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? (routeMatch.params as any) : {};\n}\n\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/v6/hooks/use-resolved-path\n */\nexport function useResolvedPath(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): Path {\n let { future } = React.useContext(NavigationContext);\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let routePathnamesJson = JSON.stringify(\n getResolveToMatches(matches, future.v7_relativeSplatPath)\n );\n\n return React.useMemo(\n () =>\n resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n relative === \"path\"\n ),\n [to, routePathnamesJson, locationPathname, relative]\n );\n}\n\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an `` to render their child route's\n * element.\n *\n * @see https://reactrouter.com/v6/hooks/use-routes\n */\nexport function useRoutes(\n routes: RouteObject[],\n locationArg?: Partial | string\n): React.ReactElement | null {\n return useRoutesImpl(routes, locationArg);\n}\n\n// Internal implementation with accept optional param for RouterProvider usage\nexport function useRoutesImpl(\n routes: RouteObject[],\n locationArg?: Partial | string,\n dataRouterState?: RemixRouter[\"state\"],\n future?: RemixRouter[\"future\"]\n): React.ReactElement | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useRoutes() may be used only in the context of a component.`\n );\n\n let { navigator, static: isStatic } = React.useContext(NavigationContext);\n let { matches: parentMatches } = React.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n let parentRoute = routeMatch && routeMatch.route;\n\n if (__DEV__) {\n // You won't get a warning about 2 different under a \n // without a trailing *, but this is a best-effort warning anyway since we\n // cannot even give the warning unless they land at the parent route.\n //\n // Example:\n //\n // \n // {/* This route path MUST end with /* because otherwise\n // it will never match /blog/post/123 */}\n // } />\n // } />\n // \n //\n // function Blog() {\n // return (\n // \n // } />\n // \n // );\n // }\n let parentPath = (parentRoute && parentRoute.path) || \"\";\n warningOnce(\n parentPathname,\n !parentRoute || parentPath.endsWith(\"*\"),\n `You rendered descendant (or called \\`useRoutes()\\`) at ` +\n `\"${parentPathname}\" (under ) but the ` +\n `parent route path has no trailing \"*\". This means if you navigate ` +\n `deeper, the parent won't match anymore and therefore the child ` +\n `routes will never render.\\n\\n` +\n `Please change the parent to .`\n );\n }\n\n let locationFromContext = useLocation();\n\n let location;\n if (locationArg) {\n let parsedLocationArg =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n invariant(\n parentPathnameBase === \"/\" ||\n parsedLocationArg.pathname?.startsWith(parentPathnameBase),\n `When overriding the location using \\`\\` or \\`useRoutes(routes, location)\\`, ` +\n `the location pathname must begin with the portion of the URL pathname that was ` +\n `matched by all parent routes. The current pathname base is \"${parentPathnameBase}\" ` +\n `but pathname \"${parsedLocationArg.pathname}\" was given in the \\`location\\` prop.`\n );\n\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n\n let pathname = location.pathname || \"/\";\n\n let remainingPathname = pathname;\n if (parentPathnameBase !== \"/\") {\n // Determine the remaining pathname by removing the # of URL segments the\n // parentPathnameBase has, instead of removing based on character count.\n // This is because we can't guarantee that incoming/outgoing encodings/\n // decodings will match exactly.\n // We decode paths before matching on a per-segment basis with\n // decodeURIComponent(), but we re-encode pathnames via `new URL()` so they\n // match what `window.location.pathname` would reflect. Those don't 100%\n // align when it comes to encoded URI characters such as % and &.\n //\n // So we may end up with:\n // pathname: \"/descendant/a%25b/match\"\n // parentPathnameBase: \"/descendant/a%b\"\n //\n // And the direct substring removal approach won't work :/\n let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n }\n\n let matches =\n !isStatic &&\n dataRouterState &&\n dataRouterState.matches &&\n dataRouterState.matches.length > 0\n ? (dataRouterState.matches as AgnosticRouteMatch[])\n : matchRoutes(routes, { pathname: remainingPathname });\n\n if (__DEV__) {\n warning(\n parentRoute || matches != null,\n `No routes matched location \"${location.pathname}${location.search}${location.hash}\" `\n );\n\n warning(\n matches == null ||\n matches[matches.length - 1].route.element !== undefined ||\n matches[matches.length - 1].route.Component !== undefined ||\n matches[matches.length - 1].route.lazy !== undefined,\n `Matched leaf route at location \"${location.pathname}${location.search}${location.hash}\" ` +\n `does not have an element or Component. This means it will render an with a ` +\n `null value by default resulting in an \"empty\" page.`\n );\n }\n\n let renderedMatches = _renderMatches(\n matches &&\n matches.map((match) =>\n Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathname).pathname\n : match.pathname,\n ]),\n pathnameBase:\n match.pathnameBase === \"/\"\n ? parentPathnameBase\n : joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathnameBase).pathname\n : match.pathnameBase,\n ]),\n })\n ),\n parentMatches,\n dataRouterState,\n future\n );\n\n // When a user passes in a `locationArg`, the associated routes need to\n // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n // to use the scoped location instead of the global location.\n if (locationArg && renderedMatches) {\n return (\n \n {renderedMatches}\n \n );\n }\n\n return renderedMatches;\n}\n\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error)\n ? `${error.status} ${error.statusText}`\n : error instanceof Error\n ? error.message\n : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = { padding: \"0.5rem\", backgroundColor: lightgrey };\n let codeStyles = { padding: \"2px 4px\", backgroundColor: lightgrey };\n\n let devInfo = null;\n if (__DEV__) {\n console.error(\n \"Error handled by React Router default ErrorBoundary:\",\n error\n );\n\n devInfo = (\n <>\n

💿 Hey developer 👋

\n

\n You can provide a way better UX than this when your app throws errors\n by providing your own ErrorBoundary or{\" \"}\n errorElement prop on your route.\n

\n \n );\n }\n\n return (\n <>\n

Unexpected Application Error!

\n

{message}

\n {stack ?
{stack}
: null}\n {devInfo}\n \n );\n}\n\nconst defaultErrorElement = ;\n\ntype RenderErrorBoundaryProps = React.PropsWithChildren<{\n location: Location;\n revalidation: RevalidationState;\n error: any;\n component: React.ReactNode;\n routeContext: RouteContextObject;\n}>;\n\ntype RenderErrorBoundaryState = {\n location: Location;\n revalidation: RevalidationState;\n error: any;\n};\n\nexport class RenderErrorBoundary extends React.Component<\n RenderErrorBoundaryProps,\n RenderErrorBoundaryState\n> {\n constructor(props: RenderErrorBoundaryProps) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error,\n };\n }\n\n static getDerivedStateFromError(error: any) {\n return { error: error };\n }\n\n static getDerivedStateFromProps(\n props: RenderErrorBoundaryProps,\n state: RenderErrorBoundaryState\n ) {\n // When we get into an error state, the user will likely click \"back\" to the\n // previous page that didn't have an error. Because this wraps the entire\n // application, that will have no effect--the error page continues to display.\n // This gives us a mechanism to recover from the error when the location changes.\n //\n // Whether we're in an error state or not, we update the location in state\n // so that when we are in an error state, it gets reset when a new location\n // comes in and the user recovers from the error.\n if (\n state.location !== props.location ||\n (state.revalidation !== \"idle\" && props.revalidation === \"idle\")\n ) {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation,\n };\n }\n\n // If we're not changing locations, preserve the location but still surface\n // any new errors that may come through. We retain the existing error, we do\n // this because the error provided from the app state may be cleared without\n // the location changing.\n return {\n error: props.error !== undefined ? props.error : state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation,\n };\n }\n\n componentDidCatch(error: any, errorInfo: any) {\n console.error(\n \"React Router caught the following error during render\",\n error,\n errorInfo\n );\n }\n\n render() {\n return this.state.error !== undefined ? (\n \n \n \n ) : (\n this.props.children\n );\n }\n}\n\ninterface RenderedRouteProps {\n routeContext: RouteContextObject;\n match: RouteMatch;\n children: React.ReactNode | null;\n}\n\nfunction RenderedRoute({ routeContext, match, children }: RenderedRouteProps) {\n let dataRouterContext = React.useContext(DataRouterContext);\n\n // Track how deep we got in our render pass to emulate SSR componentDidCatch\n // in a DataStaticRouter\n if (\n dataRouterContext &&\n dataRouterContext.static &&\n dataRouterContext.staticContext &&\n (match.route.errorElement || match.route.ErrorBoundary)\n ) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n\n return (\n \n {children}\n \n );\n}\n\nexport function _renderMatches(\n matches: RouteMatch[] | null,\n parentMatches: RouteMatch[] = [],\n dataRouterState: RemixRouter[\"state\"] | null = null,\n future: RemixRouter[\"future\"] | null = null\n): React.ReactElement | null {\n if (matches == null) {\n if (!dataRouterState) {\n return null;\n }\n\n if (dataRouterState.errors) {\n // Don't bail if we have data router errors so we can render them in the\n // boundary. Use the pre-matched (or shimmed) matches\n matches = dataRouterState.matches as DataRouteMatch[];\n } else if (\n future?.v7_partialHydration &&\n parentMatches.length === 0 &&\n !dataRouterState.initialized &&\n dataRouterState.matches.length > 0\n ) {\n // Don't bail if we're initializing with partial hydration and we have\n // router matches. That means we're actively running `patchRoutesOnNavigation`\n // so we should render down the partial matches to the appropriate\n // `HydrateFallback`. We only do this if `parentMatches` is empty so it\n // only impacts the root matches for `RouterProvider` and no descendant\n // ``\n matches = dataRouterState.matches as DataRouteMatch[];\n } else {\n return null;\n }\n }\n\n let renderedMatches = matches;\n\n // If we have data errors, trim matches to the highest error boundary\n let errors = dataRouterState?.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex(\n (m) => m.route.id && errors?.[m.route.id] !== undefined\n );\n invariant(\n errorIndex >= 0,\n `Could not find a matching route for errors on route IDs: ${Object.keys(\n errors\n ).join(\",\")}`\n );\n renderedMatches = renderedMatches.slice(\n 0,\n Math.min(renderedMatches.length, errorIndex + 1)\n );\n }\n\n // If we're in a partial hydration mode, detect if we need to render down to\n // a given HydrateFallback while we load the rest of the hydration data\n let renderFallback = false;\n let fallbackIndex = -1;\n if (dataRouterState && future && future.v7_partialHydration) {\n for (let i = 0; i < renderedMatches.length; i++) {\n let match = renderedMatches[i];\n // Track the deepest fallback up until the first route without data\n if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n fallbackIndex = i;\n }\n\n if (match.route.id) {\n let { loaderData, errors } = dataRouterState;\n let needsToRunLoader =\n match.route.loader &&\n loaderData[match.route.id] === undefined &&\n (!errors || errors[match.route.id] === undefined);\n if (match.route.lazy || needsToRunLoader) {\n // We found the first route that's not ready to render (waiting on\n // lazy, or has a loader that hasn't run yet). Flag that we need to\n // render a fallback and render up until the appropriate fallback\n renderFallback = true;\n if (fallbackIndex >= 0) {\n renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n } else {\n renderedMatches = [renderedMatches[0]];\n }\n break;\n }\n }\n }\n }\n\n return renderedMatches.reduceRight((outlet, match, index) => {\n // Only data routers handle errors/fallbacks\n let error: any;\n let shouldRenderHydrateFallback = false;\n let errorElement: React.ReactNode | null = null;\n let hydrateFallbackElement: React.ReactNode | null = null;\n if (dataRouterState) {\n error = errors && match.route.id ? errors[match.route.id] : undefined;\n errorElement = match.route.errorElement || defaultErrorElement;\n\n if (renderFallback) {\n if (fallbackIndex < 0 && index === 0) {\n warningOnce(\n \"route-fallback\",\n false,\n \"No `HydrateFallback` element provided to render during initial hydration\"\n );\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = null;\n } else if (fallbackIndex === index) {\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n }\n }\n }\n\n let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children: React.ReactNode;\n if (error) {\n children = errorElement;\n } else if (shouldRenderHydrateFallback) {\n children = hydrateFallbackElement;\n } else if (match.route.Component) {\n // Note: This is a de-optimized path since React won't re-use the\n // ReactElement since it's identity changes with each new\n // React.createElement call. We keep this so folks can use\n // `` in `` but generally `Component`\n // usage is only advised in `RouterProvider` when we can convert it to\n // `element` ahead of time.\n children = ;\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return (\n \n );\n };\n // Only wrap in an error boundary within data router usages when we have an\n // ErrorBoundary/errorElement on this route. Otherwise let it bubble up to\n // an ancestor ErrorBoundary/errorElement\n return dataRouterState &&\n (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? (\n \n ) : (\n getChildren()\n );\n }, null as React.ReactElement | null);\n}\n\nenum DataRouterHook {\n UseBlocker = \"useBlocker\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n}\n\nenum DataRouterStateHook {\n UseBlocker = \"useBlocker\",\n UseLoaderData = \"useLoaderData\",\n UseActionData = \"useActionData\",\n UseRouteError = \"useRouteError\",\n UseNavigation = \"useNavigation\",\n UseRouteLoaderData = \"useRouteLoaderData\",\n UseMatches = \"useMatches\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n UseRouteId = \"useRouteId\",\n}\n\nfunction getDataRouterConsoleError(\n hookName: DataRouterHook | DataRouterStateHook\n) {\n return `${hookName} must be used within a data router. See https://reactrouter.com/v6/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n let ctx = React.useContext(DataRouterContext);\n invariant(ctx, getDataRouterConsoleError(hookName));\n return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n let state = React.useContext(DataRouterStateContext);\n invariant(state, getDataRouterConsoleError(hookName));\n return state;\n}\n\nfunction useRouteContext(hookName: DataRouterStateHook) {\n let route = React.useContext(RouteContext);\n invariant(route, getDataRouterConsoleError(hookName));\n return route;\n}\n\n// Internal version with hookName-aware debugging\nfunction useCurrentRouteId(hookName: DataRouterStateHook) {\n let route = useRouteContext(hookName);\n let thisRoute = route.matches[route.matches.length - 1];\n invariant(\n thisRoute.route.id,\n `${hookName} can only be used on routes that contain a unique \"id\"`\n );\n return thisRoute.route.id;\n}\n\n/**\n * Returns the ID for the nearest contextual route\n */\nexport function useRouteId() {\n return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n\n/**\n * Returns the current navigation, defaulting to an \"idle\" navigation when\n * no navigation is in progress\n */\nexport function useNavigation() {\n let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n return state.navigation;\n}\n\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */\nexport function useRevalidator() {\n let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n return React.useMemo(\n () => ({\n revalidate: dataRouterContext.router.revalidate,\n state: state.revalidation,\n }),\n [dataRouterContext.router.revalidate, state.revalidation]\n );\n}\n\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route \"handle\" property\n */\nexport function useMatches(): UIMatch[] {\n let { matches, loaderData } = useDataRouterState(\n DataRouterStateHook.UseMatches\n );\n return React.useMemo(\n () => matches.map((m) => convertRouteMatchToUiMatch(m, loaderData)),\n [matches, loaderData]\n );\n}\n\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */\nexport function useLoaderData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n\n if (state.errors && state.errors[routeId] != null) {\n console.error(\n `You cannot \\`useLoaderData\\` in an errorElement (routeId: ${routeId})`\n );\n return undefined;\n }\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the loaderData for the given routeId\n */\nexport function useRouteLoaderData(routeId: string): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the action data for the nearest ancestor Route action\n */\nexport function useActionData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseActionData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n return state.actionData ? state.actionData[routeId] : undefined;\n}\n\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error. This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */\nexport function useRouteError(): unknown {\n let error = React.useContext(RouteErrorContext);\n let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);\n\n // If this was a render error, we put it in a RouteError context inside\n // of RenderErrorBoundary\n if (error !== undefined) {\n return error;\n }\n\n // Otherwise look for errors from our data router state\n return state.errors?.[routeId];\n}\n\n/**\n * Returns the happy-path data from the nearest ancestor `` value\n */\nexport function useAsyncValue(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._data;\n}\n\n/**\n * Returns the error from the nearest ancestor `` value\n */\nexport function useAsyncError(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._error;\n}\n\nlet blockerId = 0;\n\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation. Mostly used to avoid\n * using half-filled form data. This does not handle hard-reloads or\n * cross-origin navigations.\n */\nexport function useBlocker(shouldBlock: boolean | BlockerFunction): Blocker {\n let { router, basename } = useDataRouterContext(DataRouterHook.UseBlocker);\n let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n\n let [blockerKey, setBlockerKey] = React.useState(\"\");\n let blockerFunction = React.useCallback(\n (arg) => {\n if (typeof shouldBlock !== \"function\") {\n return !!shouldBlock;\n }\n if (basename === \"/\") {\n return shouldBlock(arg);\n }\n\n // If they provided us a function and we've got an active basename, strip\n // it from the locations we expose to the user to match the behavior of\n // useLocation\n let { currentLocation, nextLocation, historyAction } = arg;\n return shouldBlock({\n currentLocation: {\n ...currentLocation,\n pathname:\n stripBasename(currentLocation.pathname, basename) ||\n currentLocation.pathname,\n },\n nextLocation: {\n ...nextLocation,\n pathname:\n stripBasename(nextLocation.pathname, basename) ||\n nextLocation.pathname,\n },\n historyAction,\n });\n },\n [basename, shouldBlock]\n );\n\n // This effect is in charge of blocker key assignment and deletion (which is\n // tightly coupled to the key)\n React.useEffect(() => {\n let key = String(++blockerId);\n setBlockerKey(key);\n return () => router.deleteBlocker(key);\n }, [router]);\n\n // This effect handles assigning the blockerFunction. This is to handle\n // unstable blocker function identities, and happens only after the prior\n // effect so we don't get an orphaned blockerFunction in the router with a\n // key of \"\". Until then we just have the IDLE_BLOCKER.\n React.useEffect(() => {\n if (blockerKey !== \"\") {\n router.getBlocker(blockerKey, blockerFunction);\n }\n }, [router, blockerKey, blockerFunction]);\n\n // Prefer the blocker from `state` not `router.state` since DataRouterContext\n // is memoized so this ensures we update on blocker state updates\n return blockerKey && state.blockers.has(blockerKey)\n ? state.blockers.get(blockerKey)!\n : IDLE_BLOCKER;\n}\n\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */\nfunction useNavigateStable(): NavigateFunction {\n let { router } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our router subscriber yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, { fromRouteId: id, ...options });\n }\n },\n [router, id]\n );\n\n return navigate;\n}\n\nconst alreadyWarned: Record = {};\n\nfunction warningOnce(key: string, cond: boolean, message: string) {\n if (!cond && !alreadyWarned[key]) {\n alreadyWarned[key] = true;\n warning(false, message);\n }\n}\n","import type { FutureConfig as RouterFutureConfig } from \"@remix-run/router\";\nimport type { FutureConfig as RenderFutureConfig } from \"./components\";\n\nconst alreadyWarned: { [key: string]: boolean } = {};\n\nexport function warnOnce(key: string, message: string): void {\n if (__DEV__ && !alreadyWarned[message]) {\n alreadyWarned[message] = true;\n console.warn(message);\n }\n}\n\nconst logDeprecation = (flag: string, msg: string, link: string) =>\n warnOnce(\n flag,\n `⚠️ React Router Future Flag Warning: ${msg}. ` +\n `You can use the \\`${flag}\\` future flag to opt-in early. ` +\n `For more information, see ${link}.`\n );\n\nexport function logV6DeprecationWarnings(\n renderFuture: Partial | undefined,\n routerFuture?: Omit\n) {\n if (renderFuture?.v7_startTransition === undefined) {\n logDeprecation(\n \"v7_startTransition\",\n \"React Router will begin wrapping state updates in `React.startTransition` in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_starttransition\"\n );\n }\n\n if (\n renderFuture?.v7_relativeSplatPath === undefined &&\n (!routerFuture || !routerFuture.v7_relativeSplatPath)\n ) {\n logDeprecation(\n \"v7_relativeSplatPath\",\n \"Relative route resolution within Splat routes is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath\"\n );\n }\n\n if (routerFuture) {\n if (routerFuture.v7_fetcherPersist === undefined) {\n logDeprecation(\n \"v7_fetcherPersist\",\n \"The persistence behavior of fetchers is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_fetcherpersist\"\n );\n }\n\n if (routerFuture.v7_normalizeFormMethod === undefined) {\n logDeprecation(\n \"v7_normalizeFormMethod\",\n \"Casing of `formMethod` fields is being normalized to uppercase in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_normalizeformmethod\"\n );\n }\n\n if (routerFuture.v7_partialHydration === undefined) {\n logDeprecation(\n \"v7_partialHydration\",\n \"`RouterProvider` hydration behavior is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_partialhydration\"\n );\n }\n\n if (routerFuture.v7_skipActionErrorRevalidation === undefined) {\n logDeprecation(\n \"v7_skipActionErrorRevalidation\",\n \"The revalidation behavior after 4xx/5xx `action` responses is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_skipactionerrorrevalidation\"\n );\n }\n }\n}\n","import type {\n InitialEntry,\n LazyRouteFunction,\n Location,\n MemoryHistory,\n RelativeRoutingType,\n Router as RemixRouter,\n RouterState,\n RouterSubscriber,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\nimport {\n AbortedDeferredError,\n Action as NavigationType,\n createMemoryHistory,\n UNSAFE_getResolveToMatches as getResolveToMatches,\n UNSAFE_invariant as invariant,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\nimport * as React from \"react\";\n\nimport type {\n DataRouteObject,\n IndexRouteObject,\n Navigator,\n NonIndexRouteObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n} from \"./context\";\nimport {\n _renderMatches,\n useAsyncValue,\n useInRouterContext,\n useLocation,\n useNavigate,\n useOutlet,\n useRoutes,\n useRoutesImpl,\n} from \"./hooks\";\nimport { logV6DeprecationWarnings } from \"./deprecations\";\n\nexport interface FutureConfig {\n v7_relativeSplatPath: boolean;\n v7_startTransition: boolean;\n}\n\nexport interface RouterProviderProps {\n fallbackElement?: React.ReactNode;\n router: RemixRouter;\n // Only accept future flags relevant to rendering behavior\n // routing flags should be accessed via router.future\n future?: Partial>;\n}\n\n/**\n Webpack + React 17 fails to compile on any of the following because webpack\n complains that `startTransition` doesn't exist in `React`:\n * import { startTransition } from \"react\"\n * import * as React from from \"react\";\n \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n * import * as React from from \"react\";\n \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n Moving it to a constant such as the following solves the Webpack/React 17 issue:\n * import * as React from from \"react\";\n const START_TRANSITION = \"startTransition\";\n START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n However, that introduces webpack/terser minification issues in production builds\n in React 18 where minification/obfuscation ends up removing the call of\n React.startTransition entirely from the first half of the ternary. Grabbing\n this exported reference once up front resolves that issue.\n\n See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = React[START_TRANSITION];\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nexport function RouterProvider({\n fallbackElement,\n router,\n future,\n}: RouterProviderProps): React.ReactElement {\n let [state, setStateImpl] = React.useState(router.state);\n let { v7_startTransition } = future || {};\n\n let setState = React.useCallback(\n (newState: RouterState) => {\n if (v7_startTransition && startTransitionImpl) {\n startTransitionImpl(() => setStateImpl(newState));\n } else {\n setStateImpl(newState);\n }\n },\n [setStateImpl, v7_startTransition]\n );\n\n // Need to use a layout effect here so we are subscribed early enough to\n // pick up on any render-driven redirects/navigations (useEffect/)\n React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n\n React.useEffect(() => {\n warning(\n fallbackElement == null || !router.future.v7_partialHydration,\n \"`` is deprecated when using \" +\n \"`v7_partialHydration`, use a `HydrateFallback` component instead\"\n );\n // Only log this once on initial mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let navigator = React.useMemo((): Navigator => {\n return {\n createHref: router.createHref,\n encodeLocation: router.encodeLocation,\n go: (n) => router.navigate(n),\n push: (to, state, opts) =>\n router.navigate(to, {\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n replace: (to, state, opts) =>\n router.navigate(to, {\n replace: true,\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n };\n }, [router]);\n\n let basename = router.basename || \"/\";\n\n let dataRouterContext = React.useMemo(\n () => ({\n router,\n navigator,\n static: false,\n basename,\n }),\n [router, navigator, basename]\n );\n\n React.useEffect(\n () => logV6DeprecationWarnings(future, router.future),\n [router, future]\n );\n\n // The fragment and {null} here are important! We need them to keep React 18's\n // useId happy when we are server-rendering since we may have a