@dbx-tools/shared-core 0.6.82 → 0.6.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -40
- package/index.ts +2 -3
- package/lib/index.d.ts +2 -3
- package/lib/index.js +2 -3
- package/lib/src/context.d.ts +64 -0
- package/lib/src/context.js +148 -0
- package/lib/src/object.d.ts +2 -2
- package/lib/src/object.js +3 -3
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/context.ts +164 -0
- package/src/object.ts +4 -3
- package/lib/src/env.d.ts +0 -101
- package/lib/src/env.js +0 -153
- package/src/env.ts +0 -177
package/lib/src/object.js
CHANGED
|
@@ -116,7 +116,7 @@ function sequenceSources(...sources) {
|
|
|
116
116
|
for (const source of sources) {
|
|
117
117
|
if (source == null || (isCollection(source) && isEmpty(source)))
|
|
118
118
|
continue;
|
|
119
|
-
sourceIterables.push(values(source));
|
|
119
|
+
sourceIterables.push(isContainer(source) ? values(source) : [source]);
|
|
120
120
|
}
|
|
121
121
|
return sourceIterables;
|
|
122
122
|
}
|
|
@@ -785,7 +785,7 @@ export function toStableKey(value, seen = new Set()) {
|
|
|
785
785
|
*
|
|
786
786
|
* @example
|
|
787
787
|
* return {
|
|
788
|
-
* ...optional("appId",
|
|
788
|
+
* ...optional("appId", configuredAppId),
|
|
789
789
|
* ...optional("endpoint", config.endpoint),
|
|
790
790
|
* };
|
|
791
791
|
*/
|
|
@@ -1180,4 +1180,4 @@ export function deepEqual(a, b, comparator) {
|
|
|
1180
1180
|
}
|
|
1181
1181
|
return true;
|
|
1182
1182
|
}
|
|
1183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUEwQkgsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxXQUFXLENBQWMsS0FBbUI7SUFDMUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBY0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFjLEtBQWM7SUFDdEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxHQUFHLElBQUksS0FBSyxZQUFZLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixVQUF5RCxFQUN6RCxPQUFpQztJQUVqQyxTQUFTLEtBQUssQ0FBQyxLQUFjLEVBQUUsSUFBbUI7UUFDaEQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FB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TUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7SUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7SUFDeEQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDaEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoRSxJQUNFLENBQUMsU0FBUyxDQUNQLENBQTZCLENBQUMsR0FBRyxDQUFDLEVBQ2xDLENBQTZCLENBQUMsR0FBRyxDQUFDLEVBQ25DLFVBQVUsQ0FDWCxFQUNELENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZXBlbmRlbmN5LWZyZWUgb2JqZWN0ICsgaXRlcmFibGUgdXRpbGl0aWVzLlxuICpcbiAqIFZhbHVlIGd1YXJkcyAvIGNvZXJjaW9ucyAvIHNoYXBlIHR5cGVzOiB7QGxpbmsgaXNSZWNvcmR9IG5hcnJvd3MgcGFyc2VkIEpTT05cbiAqIHRvIGEgcmVjb3JkLCB7QGxpbmsgdG9OdW1iZXJ9IGNvZXJjZXMgYSBoYW5kLXR5cGVkIG51bWVyYWwsIHtAbGluayB0b0Jvb2xlYW59XG4gKiBjb2VyY2VzIGxvb3NlIHRydXRoeS9mYWxzeSB2YWx1ZXMsIHtAbGluayB0b0R1cmF0aW9ufSBwYXJzZXMgYDFoMzBtYCAvXG4gKiBgMiBtaWxsaXNlY29uZHNgIHRvIG1pbGxpcywge0BsaW5rIHRvRGF0ZX0gY29lcmNlcyBhIGRhdGUvSVNPIHN0cmluZy9lcG9jaFxuICogbnVtYmVyL3JlbGF0aXZlIGR1cmF0aW9uIChgdG9EYXRlYCBhbmQgYHRvRHVyYXRpb25gIGZhbGwgYmFjayB0byBlYWNoIG90aGVyLCBzb1xuICogZWl0aGVyIGFjY2VwdHMgYm90aCByZWFkaW5ncyksIHtAbGluayBvcHRpb25hbH1cbiAqIHNwcmVhZHMgYSBmaWVsZCBvbmx5IHdoZW4gaXQgaXMgcHJlc2VudCwge0BsaW5rIGRlZXBFcXVhbH0gY29tcGFyZXNcbiAqIHN0cnVjdHVyYWxseSwge0BsaW5rIGlzU2VyaWFsaXphYmxlVmFsdWV9IHJlamVjdHMgYW55dGhpbmcgYSBKU09OIHJvdW5kIHRyaXBcbiAqIHdvdWxkIGxvc2Ugb3IgY29lcmNlLCB7QGxpbmsgdG9TdGFibGVLZXl9IGNhbm9uaWNhbGl6ZXMgYSB2YWx1ZSBzbyBhbiBpZGVudGl0eVxuICogY2FuIGJlIGRlcml2ZWQgZnJvbSBpdCwgYW5kIHtAbGluayBOYW1lTGlrZX0ve0BsaW5rIE5vbkZ1bmN0aW9uS2V5c30gZGVzY3JpYmVcbiAqIG9iamVjdCBzaGFwZXMuXG4gKlxuICogSXRlcmFibGUgaGVscGVyczoge0BsaW5rIGdlbmVyYXRvcn0gZmxhdHRlbnMgbWl4ZWQgYXJndW1lbnRzOyB7QGxpbmsgc2VxdWVuY2V9XG4gKiB3cmFwcyBzb3VyY2UocykgaW4gYSBsYXp5LCBgQXJyYXlgLWNvbXBhdGlibGUge0BsaW5rIFNlcXVlbmNlfS4gRXZlcnlcbiAqIHRyYW5zZm9ybS90ZXJtaW5hbCBpcyBhIHN0YW5kYWxvbmUgZnVuY3Rpb24gb3BlcmF0aW5nIG9uIHBsYWluIHtAbGlua1xuICogQ29udGFpbmVyfXMgKHNlZSB7QGxpbmsgbWFwfSwge0BsaW5rIGZpbHRlcn0sIHtAbGluayBncm91cH0sIC4uLik7IHRoZSB7QGxpbmtcbiAqIFNlcXVlbmNlfSBtZXRob2RzIGFyZSB0aGluIGZvcndhcmRlcnMgb3ZlciB0aGVtIHNvIHRoZSBzYW1lIGxvZ2ljIGJhY2tzIGJvdGhcbiAqIHRoZSBmcmVlLWZ1bmN0aW9uIGFuZCB0aGUgZmx1ZW50L2NoYWluZWQgc3R5bGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG4vKiogTGF6eSBzZXF1ZW5jZSBvdmVyIGl0ZXJhYmxlIHNvdXJjZShzKS4gU2VlIHtAbGluayBzZXF1ZW5jZX0uICovXG5leHBvcnQgdHlwZSBTZXF1ZW5jZTxUPiA9IFNlcXVlbmNlSW1wbDxUPjtcblxudHlwZSBTZXF1ZW5jZVNvdXJjZTxUPiA9IEl0ZXJhYmxlPFQ+IHwgUmVhZG9ubHlNYXA8dW5rbm93biwgVD4gfCBPbmVPck1hbnk8VD4gfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgbm9uLXNjYWxhciB7QGxpbmsgSXRlcmFibGV9IC0gb25lIHRvIHRyZWF0IGFzIGEgY29sbGVjdGlvbiBvZiBlbGVtZW50c1xuICogcmF0aGVyIHRoYW4gYSBzY2FsYXIuIHtAbGluayBpc0NvbnRhaW5lcn0gbmFycm93cyB0byB0aGlzLCBleGNsdWRpbmcgc3RyaW5ncyxcbiAqIGBTdHJpbmdgL2BSZWdFeHBgIG9iamVjdHMsIGFuZCBmdW5jdGlvbnMuIHtAbGluayBDb2xsZWN0aW9ufSBpcyB0aGUgZWFnZXJseS1cbiAqIHNpemVkIHN1YnNldC4gVGhlIGVsZW1lbnQgZGVmYXVsdHMgdG8gYHVua25vd25gIHNvIGFueSBgQ29sbGVjdGlvbmAgaXNcbiAqIGFzc2lnbmFibGUgdG8gYSBiYXJlIGBDb250YWluZXJgLlxuICovXG5leHBvcnQgdHlwZSBDb250YWluZXI8VCA9IHVua25vd24+ID0gSXRlcmFibGU8VD47XG5cbi8qKlxuICogQSBidWlsdC1pbiwgZWFnZXJseS1zaXplZCB7QGxpbmsgQ29udGFpbmVyfTogYW4ge0BsaW5rIEFycmF5fSwge0BsaW5rIFNldH0sIG9yXG4gKiB7QGxpbmsgTWFwfSAod2hvc2UgKnZhbHVlcyogYXJlIGBUYCAtIGEgTWFwIGl0ZXJhdGVzIGBba2V5LCB2YWx1ZV1gIGVudHJpZXMsXG4gKiBzbyBpdHMgZWxlbWVudCB0eXBlIGRpZmZlcnMsIGJ1dCBpdHMgdmFsdWUgdHlwZSBpcyBgVGApLiBBbGwgc2hhcmUgYSBjaGVhcFxuICogZW1wdGluZXNzIGNoZWNrICh7QGxpbmsgaXNFbXB0eX0pLlxuICovXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uPFQ+ID0gUmVhZG9ubHlBcnJheTxUPiB8IFJlYWRvbmx5U2V0PFQ+IHwgUmVhZG9ubHlNYXA8dW5rbm93biwgVD47XG5cbmV4cG9ydCB0eXBlIE9uZU9yTWFueTxUPiA9IFtULCAuLi5UW11dO1xuXG4vKiogTmFycm93IGEgcmVhZG9ubHkgYXJyYXkgdG8gYSBub24tZW1wdHkge0BsaW5rIE9uZU9yTWFueX0gdHVwbGUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPbmVPck1hbnk8VCA9IHVua25vd24+KHZhbHVlOiByZWFkb25seSBUW10pOiB2YWx1ZSBpcyBPbmVPck1hbnk8VD4ge1xuICByZXR1cm4gdmFsdWUubGVuZ3RoID4gMDtcbn1cblxuLyoqIEEgc291cmNlIGFjY2VwdGVkIGJ5IGEgdmFyaWFkaWMgb3A6IGEge0BsaW5rIENvbnRhaW5lcn0gb2YgYFRgLCBvciBub3RoaW5nLiAqL1xudHlwZSBTb3VyY2U8VD4gPSBDb250YWluZXI8VD4gfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEVsZW1lbnQgdHlwZSBvZiBhIHtAbGluayBncm91cH0gYnVja2V0IGFycmF5OiB3aGVuIHRoZSBwcmVkaWNhdGUgYFBgIGlzIGEgdHlwZVxuICogZ3VhcmQgKGB2YWx1ZSBpcyBTYCksIHRoZSBidWNrZXQgaXMgbmFycm93ZWQgdG8gYFMgJiBUYDsgb3RoZXJ3aXNlIGl0IHN0YXlzIGBUYC5cbiAqL1xudHlwZSBHcm91cFZhbHVlPFQsIFA+ID0gUCBleHRlbmRzICh2YWx1ZTogYW55LCAuLi5yZXN0OiBhbnlbXSkgPT4gdmFsdWUgaXMgaW5mZXIgUyA/IFMgJiBUIDogVDtcblxuLyoqIEEgbWFwIG9mIGdyb3VwIG5hbWUgLT4gcHJlZGljYXRlLCBhcyBhY2NlcHRlZCBieSB7QGxpbmsgZ3JvdXB9LiAqL1xudHlwZSBHcm91cFByZWRpY2F0ZXM8VD4gPSBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4+O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIGEge0BsaW5rIENvbGxlY3Rpb259OiBhbiB7QGxpbmsgQXJyYXl9LCB7QGxpbmsgU2V0fSwgb3JcbiAqIHtAbGluayBNYXB9LiBOYXJyb3dzIGB2YWx1ZWAgc28gaXRzIGVsZW1lbnQvdmFsdWUgdHlwZSBpcyB0cmVhdGVkIGFzIGBUYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IChvciBNYXAgdmFsdWUpIHR5cGUgYXNzZXJ0ZWQgZm9yIHRoZSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCAobmFycm93aW5nIGB2YWx1ZWAgdG8ge0BsaW5rIENvbGxlY3Rpb259PGBUYD4pIGZvciBhXG4gKiAgIGJ1aWx0LWluIGFycmF5L3NldC9tYXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbGxlY3Rpb248VCA9IHVua25vd24+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29sbGVjdGlvbjxUPiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCB8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcDtcbn1cblxuLyoqXG4gKiBgdHJ1ZWAgd2hlbiBhIHtAbGluayBDb2xsZWN0aW9ufSBoYXMgbm8gZWxlbWVudHMuIFVzZXMgYGxlbmd0aGAgZm9yIGFycmF5c1xuICogYW5kIGBzaXplYCBmb3Ige0BsaW5rIFNldH0ve0BsaW5rIE1hcH0uXG4gKlxuICogQHBhcmFtIGNvbGxlY3Rpb24gLSBUaGUgYXJyYXksIHNldCwgb3IgbWFwIHRvIHRlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KFxuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uPHVua25vd24+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM/OiB7IHJlY3Vyc2l2ZT86IGJvb2xlYW4gfSxcbik6IGJvb2xlYW4ge1xuICBmdW5jdGlvbiB2aXNpdCh2YWx1ZTogdW5rbm93biwgc2Vlbj86IFNldDx1bmtub3duPik6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgaWYgKHNlZW4/Lmhhcyh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgICAgc2Vlbj8uYWRkKHZhbHVlKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID09PSAwIHx8IChzZWVuID8gdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHZpc2l0KGl0ZW0sIHNlZW4pKSA6IGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc2l6ZSA9PT0gMCB8fCAoc2VlbiA/IFsuLi52YWx1ZV0uZXZlcnkoKGl0ZW0pID0+IHZpc2l0KGl0ZW0sIHNlZW4pKSA6IGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlLnNpemUgPT09IDAgfHxcbiAgICAgICAgICAoc2VlbiA/IFsuLi52YWx1ZS52YWx1ZXMoKV0uZXZlcnkoKGl0ZW0pID0+IHZpc2l0KGl0ZW0sIHNlZW4pKSA6IGZhbHNlKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoc2Vlbikge1xuICAgICAgICByZXR1cm4ga2V5cy5ldmVyeSgoa2V5KSA9PiB2aXNpdCgodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sIHNlZW4pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmlzaXQoY29sbGVjdGlvbiwgb3B0aW9ucz8ucmVjdXJzaXZlID8gbmV3IFNldCgpIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgc291cmNlIHRvIGFuIGl0ZXJhYmxlIG9mIGl0cyBgVGAgdmFsdWVzLCBzbyBNYXBzIGFyZSB0cmVhdGVkXG4gKiB1bmlmb3JtbHkgd2l0aCBhcnJheXMvc2V0czogYSB7QGxpbmsgTWFwfSB5aWVsZHMgaXRzICp2YWx1ZXMqIChtYXRjaGluZ1xuICoge0BsaW5rIENvbGxlY3Rpb259J3MgdmFsdWUtdHlwZWQgYFRgKSwgYW55IG90aGVyIGl0ZXJhYmxlIHlpZWxkcyBpdHNlbGYuIFRoaXNcbiAqIGlzIHdoYXQge0BsaW5rIHNlcXVlbmNlfSBjb25zdW1lcywgc28gYSBgTWFwYCBjb250cmlidXRlcyB2YWx1ZXMgZXZlcnl3aGVyZVxuICogcmF0aGVyIHRoYW4gYFtrZXksIHZhbHVlXWAgZW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlczxUPihzb3VyY2U6IEl0ZXJhYmxlPFQ+IHwgUmVhZG9ubHlNYXA8dW5rbm93biwgVD4pOiBJdGVyYWJsZTxUPiB7XG4gIHJldHVybiBzb3VyY2UgaW5zdGFuY2VvZiBNYXAgPyBzb3VyY2UudmFsdWVzKCkgOiAoc291cmNlIGFzIEl0ZXJhYmxlPFQ+KTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBhIHtAbGluayBDb250YWluZXJ9IC0gYW4gaXRlcmFibGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvbGxlY3Rpb25cbiAqIHJhdGhlciB0aGFuIGEgc2NhbGFyLlxuICpcbiAqIERlbGliZXJhdGVseSBleGNsdWRlcyB2YWx1ZXMgdGhhdCBhcmUgdGVjaG5pY2FsbHkgaXRlcmFibGUgYnV0IHNob3VsZCBiZVxuICogdHJlYXRlZCBhcyBzY2FsYXJzIGhlcmUgLSBzdHJpbmdzLCBgU3RyaW5nYC9gUmVnRXhwYCBvYmplY3RzLCBhbmQgZnVuY3Rpb25zIC1cbiAqIHNvIGEgbG9uZSBzdHJpbmcgaXMgbmV2ZXIgc3ByZWFkIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCB0eXBlIGFzc2VydGVkIGZvciB0aGUgaXRlcmFibGUuXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMgYHRydWVgIChuYXJyb3dpbmcgYHZhbHVlYCB0byB7QGxpbmsgQ29udGFpbmVyfTxgVGA+KSBmb3IgYSBub24tc3RyaW5nXG4gKiAgIGl0ZXJhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb250YWluZXI8VCA9IHVua25vd24+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29udGFpbmVyPFQ+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiICYmXG4gICAgISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgJiZcbiAgICAhKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSAmJlxuICAgIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyB7IFtTeW1ib2wuaXRlcmF0b3JdPzogdW5rbm93biB9KVtTeW1ib2wuaXRlcmF0b3JdID09PSBcImZ1bmN0aW9uXCJcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2VxdWVuY2VTb3VyY2VzPFQ+KC4uLnNvdXJjZXM6IFNlcXVlbmNlU291cmNlPFQ+W10pOiBJdGVyYWJsZTxUPltdIHtcbiAgY29uc3Qgc291cmNlSXRlcmFibGVzOiBJdGVyYWJsZTxUPltdID0gW107XG4gIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICBpZiAoc291cmNlID09IG51bGwgfHwgKGlzQ29sbGVjdGlvbihzb3VyY2UpICYmIGlzRW1wdHkoc291cmNlKSkpIGNvbnRpbnVlO1xuICAgIHNvdXJjZUl0ZXJhYmxlcy5wdXNoKHZhbHVlcyhzb3VyY2UpKTtcbiAgfVxuICByZXR1cm4gc291cmNlSXRlcmFibGVzO1xufVxuXG4vKipcbiAqIEZsYXR0ZW5zIG5lc3RlZCBhcnJheXMgZm9yIHtAbGluayBmbGF0fS4gTm9uLWFycmF5IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBhXG4gKiBzaW5nbGUtZWxlbWVudCBpdGVyYWJsZTsgZGVwdGggZGVjcmVtZW50cyBwZXIgYXJyYXkgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5WYWx1ZSh2YWx1ZTogdW5rbm93biwgZGVwdGg6IG51bWJlcik6IEl0ZXJhYmxlPHVua25vd24+IHtcbiAgaWYgKGRlcHRoID4gMCAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IG5leHREZXB0aCA9IE51bWJlci5pc0Zpbml0ZShkZXB0aCkgPyBkZXB0aCAtIDEgOiBkZXB0aDtcbiAgICByZXR1cm4ge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHlpZWxkKiBmbGF0dGVuVmFsdWUoaXRlbSwgbmV4dERlcHRoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gW3ZhbHVlXTtcbn1cblxuLyoqIFdyYXAgYSBwZXItZWxlbWVudCB0cmFuc2Zvcm0gKGVhY2ggZWxlbWVudCAtPiBhbiBpdGVyYWJsZSkgYXMgYSBsYXp5IHtAbGluayBTZXF1ZW5jZX0uICovXG5mdW5jdGlvbiBkZXJpdmU8VCwgVT4oXG4gIHNvdXJjZTogSXRlcmFibGU8VD4sXG4gIGZuOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IEl0ZXJhYmxlPFU+LFxuKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNvdXJjZSkgeWllbGQqIGZuKHZhbHVlLCBpbmRleCsrKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIExpa2Uge0BsaW5rIGRlcml2ZX0sIGJ1dCB5aWVsZHMgb25lIHZhbHVlIHBlciBzb3VyY2UgZWxlbWVudCAobm8gd3JhcHBlciBpdGVyYWJsZSkuICovXG5mdW5jdGlvbiBkZXJpdmVPbmU8VCwgVT4oc291cmNlOiBJdGVyYWJsZTxUPiwgZm46ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSk6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHlpZWxkIGZuKHZhbHVlLCBpbmRleCsrKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLm1hcGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjb250YWluZXIgdG8gbWFwIChudWxsaXNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSkuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBDYWxsZWQgcGVyIGVsZW1lbnQgd2l0aCBpdHMgaW5kZXg7IGl0cyByZXN1bHQgaXMgZW1pdHRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcDxULCBVPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUsXG4pOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBkZXJpdmVPbmUoc2VxdWVuY2Uoc291cmNlKSwgY2FsbGJhY2spO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIEEgdHlwZS1ndWFyZCBwcmVkaWNhdGUgbmFycm93cyB0aGUgcmVzdWx0aW5nIGVsZW1lbnQgdHlwZS5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGNvbnRhaW5lciB0byBmaWx0ZXIgKG51bGxpc2ggeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlKS5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBLZWVwcyBlbGVtZW50cyBmb3Igd2hpY2ggaXQgcmV0dXJucyBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBTZXF1ZW5jZTxTPjtcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFNlcXVlbmNlPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcjxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogU2VxdWVuY2U8VD4ge1xuICByZXR1cm4gZGVyaXZlKHNlcXVlbmNlKHNvdXJjZSksIGZ1bmN0aW9uKiAodmFsdWUsIGluZGV4KSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSB5aWVsZCB2YWx1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHRoZSBzb3VyY2VzIGFuZCB5aWVsZHMgb25seSBlbGVtZW50cyB0aGF0IGFyZSBub3QgYG51bGxgIG9yXG4gKiBgdW5kZWZpbmVkYCwgbmFycm93aW5nIHRoZSBlbGVtZW50IHR5cGUgdG8ge0BsaW5rIE5vbk51bGxhYmxlfTxgVGA+LlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk51bGw8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxOb25OdWxsYWJsZTxUPj4ge1xuICByZXR1cm4gZmlsdGVyKHNlcXVlbmNlKC4uLnNvdXJjZXMpLCAodmFsdWUpOiB2YWx1ZSBpcyBOb25OdWxsYWJsZTxUPiA9PiB2YWx1ZSAhPSBudWxsKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZsYXRNYXBgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY29udGFpbmVyIHRvIG1hcCAobnVsbGlzaCB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UpLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gUmV0dXJucyBhIHZhbHVlIG9yIGFycmF5IG9mIHZhbHVlcywgZmxhdHRlbmVkIG9uZSBsZXZlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXRNYXA8VCwgVT4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVIHwgUmVhZG9ubHlBcnJheTxVPixcbik6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIGRlcml2ZShzZXF1ZW5jZShzb3VyY2UpLCBmdW5jdGlvbiogKHZhbHVlLCBpbmRleCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlLCBpbmRleCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkgeWllbGQqIHJlc3VsdDtcbiAgICBlbHNlIHlpZWxkIHJlc3VsdCBhcyBVO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZsYXRgIChhcnJheXMgb25seSkuIGBkZXB0aGAgbGVhZHMgc28gdGhlXG4gKiBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljOyB1c2UgYGRlcHRoIDwgMWAgZm9yIGEgbm8tb3AgcGFzc3Rocm91Z2guXG4gKlxuICogQHBhcmFtIGRlcHRoIC0gSG93IG1hbnkgYXJyYXkgbGV2ZWxzIHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUsIHRoZW4gZmxhdHRlbiAobnVsbGlzaCBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXQ8VD4oZGVwdGg6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKC4uLnNvdXJjZXMpO1xuICBpZiAoZGVwdGggPCAxKSByZXR1cm4gc3JjO1xuICByZXR1cm4gZGVyaXZlKHNyYywgKHZhbHVlKSA9PiBmbGF0dGVuVmFsdWUodmFsdWUsIGRlcHRoKSkgYXMgU2VxdWVuY2U8VD47XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHRoZSBzb3VyY2VzLCB0aGVuIGxhemlseSB5aWVsZHMgdmFsdWVzIGluIGVuY291bnRlciBvcmRlcixcbiAqIHNraXBwaW5nIGEgdmFsdWUgb25seSB3aGVuIGFuIGVxdWFsIG9uZSB3YXMgYWxyZWFkeSB5aWVsZGVkIChgU2V0YCAvXG4gKiBTYW1lVmFsdWVaZXJvKS4gVW5pcXVlbmVzcyBpcyBjaGVja2VkIHBlciBlbGVtZW50IGFzIGl0IGlzIGNvbnN1bWVkLlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RpbmN0PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxUPigpO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogWWllbGRzIGBzb3VyY2VgLCB0aGVuIGVhY2ggYXBwZW5kZWQgYGl0ZW1gIGluIG9yZGVyIChhcnJheXMgc3ByZWFkIG9uZSBsZXZlbCksXG4gKiBtaXJyb3JpbmcgYEFycmF5LnByb3RvdHlwZS5jb25jYXRgLiBgaXRlbXNgIGFyZSBzY2FsYXIgdmFsdWVzL2FycmF5cywgbm90XG4gKiBjb250YWluZXJzLCBzbyBgc291cmNlYCBzdGF5cyBhIHNpbmdsZSBsZWFkaW5nIGFyZ3VtZW50LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgbGVhZGluZyBjb250YWluZXIgKG51bGxpc2ggeWllbGRzIGp1c3QgdGhlIGl0ZW1zKS5cbiAqIEBwYXJhbSBpdGVtcyAtIFZhbHVlcyAob3IgYXJyYXlzIG9mIHZhbHVlcykgYXBwZW5kZWQgYWZ0ZXIgdGhlIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIC4uLml0ZW1zOiByZWFkb25seSAoVCB8IFJlYWRvbmx5QXJyYXk8VD4pW11cbik6IFNlcXVlbmNlPFQ+IHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2Uoc291cmNlKTtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHNyYztcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICB5aWVsZCogc3JjO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB5aWVsZCogaXRlbTtcbiAgICAgICAgZWxzZSB5aWVsZCBpdGVtIGFzIFQ7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogWWllbGRzIGF0IG1vc3QgYGNvdW50YCBlbGVtZW50cyBmcm9tIHRoZSBmcm9udCBvZiB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMuXG4gKiBgY291bnRgIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEBwYXJhbSBjb3VudCAtIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHlpZWxkIChgPD0gMGAgeWllbGRzIG5vbmUpLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFrZTxUPihjb3VudDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgaWYgKGNvdW50IDw9IDApIHJldHVybiBlbXB0eVNlcXVlbmNlIGFzIFNlcXVlbmNlPFQ+O1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgdGFrZW4gPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICAgIGlmICgrK3Rha2VuID49IGNvdW50KSByZXR1cm47XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogU3BsaXRzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIG9uZSBhcnJheSBwZXIgbmFtZWQgcHJlZGljYXRlLiBDb25zdW1lc1xuICogdGhlIGlucHV0IG9uY2UsIHJvdXRpbmcgZWFjaCBlbGVtZW50IHRvIHRoZSBGSVJTVCBwcmVkaWNhdGUgaXQgc2F0aXNmaWVzIChzb1xuICogZ3JvdXBzIGFyZSBkaXNqb2ludCk7IGVsZW1lbnRzIG1hdGNoaW5nIG5vIHByZWRpY2F0ZSBhcmUgZHJvcHBlZC4gVHlwZS1ndWFyZFxuICogcHJlZGljYXRlcyBuYXJyb3cgdGhlaXIgZ3JvdXAncyBlbGVtZW50IHR5cGUgKHNlZSB7QGxpbmsgR3JvdXBWYWx1ZX0pLlxuICogYHByZWRpY2F0ZXNgIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEB0eXBlUGFyYW0gRyAtIFRoZSBtYXAgb2YgZ3JvdXAgbmFtZSAtPiBwcmVkaWNhdGUuXG4gKiBAcGFyYW0gcHJlZGljYXRlcyAtIE5hbWVkIHByZWRpY2F0ZXM7IGV2YWx1YXRlZCBpbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMsIGVhY2ggYW4gYXJyYXkgb2YgaXRzIGdyb3VwJ3MgZWxlbWVudHMuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgY29uc3QgeyBzdHJpbmdzLCBmbnMgfSA9IGdyb3VwKHsgc3RyaW5nczogaXNTdHJpbmcsIGZuczogaXNGdW5jdGlvbiB9LCB4cyk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cDxULCBHIGV4dGVuZHMgR3JvdXBQcmVkaWNhdGVzPFQ+PihcbiAgcHJlZGljYXRlczogRyxcbiAgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W11cbik6IHsgW0sgaW4ga2V5b2YgR106IEdyb3VwVmFsdWU8VCwgR1tLXT5bXSB9IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByZWRpY2F0ZXMpIGFzIChrZXlvZiBHKVtdO1xuICBjb25zdCBidWNrZXRzID0gbmV3IE1hcDxrZXlvZiBHLCBUW10+KGtleXMubWFwKChrZXkpID0+IFtrZXksIFtdXSkpO1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKC4uLnNvdXJjZXMpKSB7XG4gICAgY29uc3QgaSA9IGluZGV4Kys7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHByZWRpY2F0ZXNba2V5XSEodmFsdWUsIGkpKSB7XG4gICAgICAgIGJ1Y2tldHMuZ2V0KGtleSkhLnB1c2godmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgeyBbSyBpbiBrZXlvZiBHXTogR3JvdXBWYWx1ZTxULCBHW0tdPltdIH07XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICByZXN1bHRba2V5XSA9IGJ1Y2tldHMuZ2V0KGtleSkhIGFzIEdyb3VwVmFsdWU8VCwgR1t0eXBlb2Yga2V5XT5bXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyBlbGVtZW50cyB1bnRpbCBhIG1hdGNoLiBBIHR5cGUgZ3VhcmQgbmFycm93cyB0aGUgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogUyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmQ8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maW5kTGFzdGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyB0aGUgZnVsbCBzb3VyY2UuIEEgdHlwZSBndWFyZCBuYXJyb3dzIHRoZSByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogUyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBtYXRjaDogVCB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIG1hdGNoID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIGVsZW1lbnRzIHVudGlsIGEgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kSW5kZXg8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RJbmRleGAsIG92ZXIgYSBzaW5nbGVcbiAqIHtAbGluayBDb250YWluZXJ9LiBDb25zdW1lcyB0aGUgZnVsbCBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdEluZGV4PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgbWF0Y2ggPSAtMTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSBtYXRjaCA9IGluZGV4O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuc29tZWAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBTaG9ydC1jaXJjdWl0cyBvbiB0aGUgZmlyc3QgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb21lPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIFNob3J0LWNpcmN1aXRzIG9uIHRoZSBmaXJzdCBmYWlsdXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlcnk8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBib29sZWFuO1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuO1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBpZiAoIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIHRoZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoPFQ+KHNvdXJjZTogU291cmNlPFQ+LCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgY2FsbGJhY2sodmFsdWUsIGluZGV4KyspO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuYXRgIG92ZXIgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzLlxuICogTm9uLW5lZ2F0aXZlIGluZGljZXMgc2NhbiBsYXppbHk7IG5lZ2F0aXZlIGluZGljZXMgbWF0ZXJpYWxpemUgZmlyc3QuIGBpbmRleGBcbiAqIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEBwYXJhbSBpbmRleCAtIFplcm8tYmFzZWQgcG9zaXRpb247IG5lZ2F0aXZlIGNvdW50cyBmcm9tIHRoZSBlbmQuXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdDxUPihpbmRleDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIHRvQXJyYXkoc3JjKS5hdChpbmRleCk7XG4gIGxldCBpID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICBpZiAoaSsrID09PSBpbmRleCkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b09uZU9yTWFueTxUPihpbnB1dDogVCB8IE9uZU9yTWFueTxUPik6IE9uZU9yTWFueTxUPiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IGlucHV0IDogW2lucHV0XTtcbn1cblxuLyoqXG4gKiBNYXRlcmlhbGl6ZXMgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzIGludG8gYSBuZXcgYXJyYXkuIENvbnN1bWVzIHNpbmdsZS1wYXNzXG4gKiBzb3VyY2VzLlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXk8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiByZWFkb25seSBUW10ge1xuICByZXR1cm4gWy4uLnNlcXVlbmNlKC4uLnNvdXJjZXMpXTtcbn1cblxuLyoqXG4gKiBMYXp5IGl0ZXJhYmxlIHNlcXVlbmNlIHdpdGggYEFycmF5YC1jb21wYXRpYmxlIHRyYW5zZm9ybXMgYW5kIHRlcm1pbmFsXG4gKiBtZXRob2RzLiBTaW5nbGUtcGFzcyBieSBkZWZhdWx0OyBjYWxsIHtAbGluayBTZXF1ZW5jZUltcGwuY2FjaGV9IHRvIHJldGFpblxuICogcHVsbGVkIHZhbHVlcyBmb3IgcmUtaXRlcmF0aW9uLiBCdWlsdCBmb3IgZ2VuZXJhdG9ycyBhbmQgb3RoZXIgc291cmNlcyB3aGVyZVxuICogYSBzZWNvbmQgcGFzcyBpcyBub3QgZ3VhcmFudGVlZC5cbiAqXG4gKiBUaGUgbWV0aG9kcyBmb3J3YXJkIHRvIHRoZSBzdGFuZGFsb25lIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIC0gc2VlIGVhY2hcbiAqIG1ldGhvZCdzIGBAc2VlYCAtIHNvIHRoZSBmcmVlLWZ1bmN0aW9uIGFuZCBjaGFpbmVkIHN0eWxlcyBzaGFyZSBvbmUgaW1wbC5cbiAqL1xuY2xhc3MgU2VxdWVuY2VJbXBsPFQ+IHtcbiAgcHJpdmF0ZSBpdGVyYXRvcj86IEl0ZXJhdG9yPFQ+O1xuICBwcml2YXRlIGV4aGF1c3RlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZTogSXRlcmFibGU8VD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBidWZmZXI6IFRbXSB8IHVuZGVmaW5lZCxcbiAgICBzdGF0ZTogeyByZWFkb25seSBleGhhdXN0ZWQ/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5leGhhdXN0ZWQgPSBzdGF0ZS5leGhhdXN0ZWQgPz8gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGdldCBjYWNoaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEFkdmFuY2UgdGhlIHVuZGVybHlpbmcgc291cmNlIG9uY2UsIGNyZWF0aW5nIHRoZSBpdGVyYXRvciBvbiBmaXJzdCB1c2UuICovXG4gIHByaXZhdGUgcHVsbCgpOiBJdGVyYXRvclJlc3VsdDxUPiB7XG4gICAgdGhpcy5pdGVyYXRvciA/Pz0gdGhpcy5zb3VyY2VbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIHJldHVybiB0aGlzLml0ZXJhdG9yLm5leHQoKTtcbiAgfVxuXG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYXRvcjxUPiB7XG4gICAgaWYgKCF0aGlzLmNhY2hpbmcpIHtcbiAgICAgIGlmICh0aGlzLmV4aGF1c3RlZCkgcmV0dXJuO1xuICAgICAgZm9yIChsZXQgbmV4dCA9IHRoaXMucHVsbCgpOyAhbmV4dC5kb25lOyBuZXh0ID0gdGhpcy5wdWxsKCkpIHtcbiAgICAgICAgeWllbGQgbmV4dC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhoYXVzdGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FjaGVkOiBpdGVyYXRlIGxpa2UgYSBsaXN0LiBBbHdheXMgcmVwbGF5IHRoZSBidWZmZXIgZnJvbSB0aGUgc3RhcnQsXG4gICAgICAvLyBleHRlbmRpbmcgaXQgZnJvbSB0aGUgc291cmNlIG9uIGRlbWFuZCB1bnRpbCBleGhhdXN0ZWQuIEEgYnJva2VuIGxvb3BcbiAgICAgIC8vIGxlYXZlcyB0aGUgYnVmZmVyIGludGFjdCwgc28gdGhlIG5leHQgaXRlcmF0aW9uIHN0YXJ0cyBvdmVyIGZyb20gdGhlXG4gICAgICAvLyBiZWdpbm5pbmcuXG4gICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlciE7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoaW5kZXggPCBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgeWllbGQgYnVmZmVyW2luZGV4KytdITtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5leGhhdXN0ZWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMucHVsbCgpO1xuICAgICAgICBpZiAobmV4dC5kb25lKSB7XG4gICAgICAgICAgdGhpcy5leGhhdXN0ZWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIucHVzaChuZXh0LnZhbHVlKTtcbiAgICAgICAgeWllbGQgbmV4dC52YWx1ZTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgbWFwfSAqL1xuICBtYXA8VT4oY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSk6IFNlcXVlbmNlPFU+IHtcbiAgICByZXR1cm4gbWFwKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaWx0ZXJ9ICovXG4gIGZpbHRlcjxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiBTZXF1ZW5jZTxTPjtcbiAgZmlsdGVyKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogU2VxdWVuY2U8VD47XG4gIGZpbHRlcihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZmlsdGVyKHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgbm9uTnVsbH0gKi9cbiAgbm9uTnVsbCgpOiBTZXF1ZW5jZTxOb25OdWxsYWJsZTxUPj4ge1xuICAgIHJldHVybiBub25OdWxsKHRoaXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZsYXRNYXB9ICovXG4gIGZsYXRNYXA8VT4oY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSB8IFJlYWRvbmx5QXJyYXk8VT4pOiBTZXF1ZW5jZTxVPiB7XG4gICAgcmV0dXJuIGZsYXRNYXAodGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZsYXR9ICovXG4gIGZsYXQoZGVwdGggPSAxKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiBmbGF0KGRlcHRoLCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBkaXN0aW5jdH0gKi9cbiAgZGlzdGluY3QoKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiBkaXN0aW5jdCh0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBjb25jYXR9ICovXG4gIGNvbmNhdCguLi5pdGVtczogcmVhZG9ubHkgKFQgfCBSZWFkb25seUFycmF5PFQ+KVtdKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiBjb25jYXQodGhpcywgLi4uaXRlbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExhemlseSB5aWVsZHMgdGhpcyBzZXF1ZW5jZSBmb2xsb3dlZCBieSBlYWNoIGl0ZXJhYmxlIGBzb3VyY2VgIGluIG9yZGVyLlxuICAgKiBMaWtlIHtAbGluayBjb25jYXR9LCBidXQgZm9yIGl0ZXJhYmxlIHNvdXJjZXMgKGdlbmVyYXRvcnMsIG90aGVyIHNlcXVlbmNlcyxcbiAgICogYFNldGAsIGBNYXBgLCBldGMuKSByYXRoZXIgdGhhbiBzY2FsYXIgdmFsdWVzIG9yIGFycmF5cy4gQSB7QGxpbmsgTWFwfVxuICAgKiBzb3VyY2UgY29udHJpYnV0ZXMgaXRzIHZhbHVlcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgc2VxdWVuY2V9XG4gICAqL1xuICBqb2luKC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNlcXVlbmNlU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gICAgY29uc3Qgc291cmNlSXRlcmFibGVzID0gc2VxdWVuY2VTb3VyY2VzKHRoaXMsIC4uLnNvdXJjZXMpO1xuICAgIHJldHVybiBzZXF1ZW5jZVNvdXJjZXMubGVuZ3RoID09PSAwID8gdGhpcyA6IHNlcXVlbmNlKC4uLnNvdXJjZUl0ZXJhYmxlcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgdGFrZX0gKi9cbiAgdGFrZShjb3VudDogbnVtYmVyKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiB0YWtlKGNvdW50LCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBncm91cH0gKi9cbiAgZ3JvdXA8RyBleHRlbmRzIEdyb3VwUHJlZGljYXRlczxUPj4ocHJlZGljYXRlczogRyk6IHsgW0sgaW4ga2V5b2YgR106IEdyb3VwVmFsdWU8VCwgR1tLXT5bXSB9IHtcbiAgICByZXR1cm4gZ3JvdXAocHJlZGljYXRlcywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNhY2hlZCwgcmUtaXRlcmFibGUgdmlldyBvZiB0aGlzIHNlcXVlbmNlLiBBbiBhbHJlYWR5LWNhY2hpbmdcbiAgICogc2VxdWVuY2UgcmV0dXJucyBpdHNlbGY7IG90aGVyd2lzZSB0aGlzIG9uZS1wYXNzIHNlcXVlbmNlIGlzIHdyYXBwZWQgaW4gYVxuICAgKiBuZXcgaW5zdGFuY2UgdGhhdCByZXRhaW5zIHB1bGxlZCB2YWx1ZXMuIEl0ZXJhdGUgdGhlIHJldHVybmVkIGluc3RhbmNlLCBub3RcbiAgICogdGhlIG9yaWdpbmFsLCB0byBhdm9pZCBjb21wZXRpbmcgZm9yIHRoZSBzYW1lIHNpbmdsZS1wYXNzIHNvdXJjZS5cbiAgICovXG4gIGNhY2hlKCk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5jYWNoaW5nID8gdGhpcyA6IG5ldyBTZXF1ZW5jZUltcGwodGhpcywgW10pO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmR9ICovXG4gIGZpbmQ8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogUyB8IHVuZGVmaW5lZDtcbiAgZmluZChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQ7XG4gIGZpbmQocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZmluZCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRMYXN0fSAqL1xuICBmaW5kTGFzdDxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiBTIHwgdW5kZWZpbmVkO1xuICBmaW5kTGFzdChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQ7XG4gIGZpbmRMYXN0KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZpbmRMYXN0KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZEluZGV4fSAqL1xuICBmaW5kSW5kZXgocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBmaW5kSW5kZXgodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kTGFzdEluZGV4fSAqL1xuICBmaW5kTGFzdEluZGV4KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZmluZExhc3RJbmRleCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIHNvbWV9ICovXG4gIHNvbWUocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc29tZSh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGV2ZXJ5fSAodGhlIGBTIGV4dGVuZHMgVGAgb3ZlcmxvYWQgbmFycm93cyBhdCBjb21waWxlIHRpbWUgb25seSkuICovXG4gIGV2ZXJ5PFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IHRoaXMgaXMgU2VxdWVuY2U8Uz47XG4gIGV2ZXJ5KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbjtcbiAgZXZlcnkocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZlcnkodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmb3JFYWNofSAqL1xuICBmb3JFYWNoKGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBmb3JFYWNoKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBhdH0gKi9cbiAgYXQoaW5kZXg6IG51bWJlcik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBhdChpbmRleCwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogTWF0ZXJpYWxpemUgdGhlIHNlcXVlbmNlIGludG8gYSBuZXcgYXJyYXkuIENvbnN1bWVzIGEgc2luZ2xlLXBhc3Mgc291cmNlOyBhXG4gICAqIGNhY2hlZCwgZXhoYXVzdGVkIHNlcXVlbmNlIGNvcGllcyBpdHMgYnVmZmVyIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayB0b0FycmF5fVxuICAgKi9cbiAgdG9BcnJheSgpOiByZWFkb25seSBUW10ge1xuICAgIGlmICh0aGlzLmNhY2hpbmcgJiYgdGhpcy5leGhhdXN0ZWQpIHJldHVybiBbLi4udGhpcy5idWZmZXIhXTtcbiAgICByZXR1cm4gdG9BcnJheSh0aGlzKTtcbiAgfVxufVxuXG4vKiogU2hhcmVkIGVtcHR5IHNlcXVlbmNlIHNpbmdsZXRvbiwgcmV1c2FibGUgZm9yIGFueSBlbGVtZW50IHR5cGUuICovXG5jb25zdCBlbXB0eVNlcXVlbmNlOiBTZXF1ZW5jZTxuZXZlcj4gPSBuZXcgU2VxdWVuY2VJbXBsKFtdLCB1bmRlZmluZWQsIHtcbiAgZXhoYXVzdGVkOiB0cnVlLFxufSk7XG5cbi8qKlxuICogV3JhcCBvbmUgb3IgbW9yZSBpdGVyYWJsZSBgc291cmNlc2AgaW4gYSBzaW5nbGUgbGF6eSB7QGxpbmsgU2VxdWVuY2V9LFxuICogaXRlcmF0ZWQgaW4gb3JkZXIuIGBudWxsYC9gdW5kZWZpbmVkYCBzb3VyY2VzIGFyZSBza2lwcGVkOyB3aGVuIG5vdGhpbmdcbiAqIHJlbWFpbnMgKGV2ZXJ5IHNvdXJjZSBvbWl0dGVkLCBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBhbiBlbXB0eSBhcnJheSAvXG4gKiBgU2V0YCAvIGBNYXBgKSwge0BsaW5rIGVtcHR5U2VxdWVuY2V9IGlzIHJldHVybmVkLiBUaGUgcmVzdWx0IGlzIHNpbmdsZS1wYXNzXG4gKiAtIGNhbGwgYC5jYWNoZSgpYCB0byBtYWtlIGl0IHJlLWl0ZXJhYmxlLlxuICpcbiAqIEEge0BsaW5rIE1hcH0gc291cmNlIGNvbnRyaWJ1dGVzIGl0cyB2YWx1ZXMgKHNlZSB7QGxpbmsgdmFsdWVzfSksIGNvbnNpc3RlbnRcbiAqIHdpdGgge0BsaW5rIENvbGxlY3Rpb259J3MgdmFsdWUtdHlwZWQgYFRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgdHlwZSBvZiB0aGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0gc291cmNlcyAtIEl0ZXJhYmxlcyB0byBjb25jYXRlbmF0ZSwgaW4gb3JkZXIgKGBNYXBgIHNvdXJjZXMgdXNlIHZhbHVlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW5jZTxUPiguLi5zb3VyY2VzOiByZWFkb25seSBTZXF1ZW5jZVNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICAvLyBTa2lwIG51bGxpc2ggc291cmNlcyBhbmQga25vd24tZW1wdHkgY29sbGVjdGlvbnM7IG5vcm1hbGl6ZSB0aGUgcmVzdCB0b1xuICAvLyB0aGVpciB2YWx1ZXMgc28gYSBNYXAgY29udHJpYnV0ZXMgdmFsdWVzIHJhdGhlciB0aGFuIFtrZXksIHZhbHVlXSBlbnRyaWVzLlxuICBjb25zdCBzb3VyY2VJdGVyYWJsZXMgPSBzZXF1ZW5jZVNvdXJjZXMoLi4uc291cmNlcyk7XG4gIGlmIChzb3VyY2VJdGVyYWJsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZW1wdHlTZXF1ZW5jZSBhcyBTZXF1ZW5jZTxUPjtcbiAgLy8gUmV1c2UgYW4gZXhpc3Rpbmcgc2VxdWVuY2UgYXMtaXMgcmF0aGVyIHRoYW4gcmUtd3JhcHBpbmcgaXQuXG4gIGlmIChzb3VyY2VJdGVyYWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3Qgb25seSA9IHNvdXJjZUl0ZXJhYmxlc1swXSE7XG4gICAgcmV0dXJuIG9ubHkgaW5zdGFuY2VvZiBTZXF1ZW5jZUltcGwgPyAob25seSBhcyBTZXF1ZW5jZTxUPikgOiBuZXcgU2VxdWVuY2VJbXBsKG9ubHksIHVuZGVmaW5lZCk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTZXF1ZW5jZUltcGwoXG4gICAge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VJdGVyYWJsZXMpIHlpZWxkKiBzb3VyY2U7XG4gICAgICB9LFxuICAgIH0sXG4gICAgdW5kZWZpbmVkLFxuICApO1xufVxuXG4vKipcbiAqIEZsYXR0ZW5zIGEgbWl4IG9mIHNpbmdsZSBpdGVtcyBhbmQgaXRlcmFibGVzIGludG8gb25lIGxhenkge0BsaW5rIEdlbmVyYXRvcn0uXG4gKlxuICogQXJndW1lbnRzIGFyZSBlbWl0dGVkIGluIG9yZGVyOiBgbnVsbGAvYHVuZGVmaW5lZGAgYXJlIHNraXBwZWQsIG5vbi1zdHJpbmdcbiAqIGl0ZXJhYmxlcyAocGVyIHtAbGluayBpc0NvbnRhaW5lcn0pIGFyZSB5aWVsZGVkIGVsZW1lbnQtYnktZWxlbWVudCwgYW5kXG4gKiBhbnl0aGluZyBlbHNlIChpbmNsdWRpbmcgc3RyaW5ncykgaXMgeWllbGRlZCBhcyBhIHNpbmdsZSBpdGVtLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgdHlwZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yLlxuICogQHBhcmFtIGl0ZW1zIC0gSXRlbXMgYW5kL29yIGl0ZXJhYmxlcyB0byBmbGF0dGVuLCBpbiBvcmRlci5cbiAqIEByZXR1cm5zIEEgZ2VuZXJhdG9yIG92ZXIgdGhlIGZsYXR0ZW5lZCBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBnZW5lcmF0b3I8VD4oXG4gIC4uLml0ZW1zOiByZWFkb25seSAoVCB8IEl0ZXJhYmxlPFQ+IHwgbnVsbCB8IHVuZGVmaW5lZClbXVxuKTogR2VuZXJhdG9yPFQ+IHtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgaWYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKGlzQ29udGFpbmVyKGl0ZW0pKSB7XG4gICAgICB5aWVsZCogaXRlbTtcbiAgICB9IGVsc2Uge1xuICAgICAgeWllbGQgaXRlbTtcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBPYmplY3QgdmFsdWUgZ3VhcmRzLCBjb2VyY2lvbnMsIGFuZCBzdHJ1Y3R1cmFsIGVxdWFsaXR5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE1pbmltYWwgc2hhcGUgZm9yIG9iamVjdHMgdGhhdCBleHBvc2UgYW4gb3B0aW9uYWwgYG5hbWVgIChlLmcuIEFwcEtpdCBwbHVnaW5zKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZUxpa2Uge1xuICBuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBOb25GdW5jdGlvbktleXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBuZXZlciA6IEs7XG59W2tleW9mIFRdO1xuXG4vKipcbiAqIE5hcnJvdyBgdmFsdWVgIHRvIGEgcGxhaW4gKG5vbi1hcnJheSkgb2JqZWN0LiBVc2UgYXMgYSB0eXBlIGd1YXJkXG4gKiBiZWZvcmUgaW5kZXhpbmcgaW50byAvIG11dGF0aW5nIHBhcnNlZCBKU09OIHNvIHRoZSBhY2Nlc3MgaXNcbiAqIHR5cGUtc2FmZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaWYgKGlzUmVjb3JkKHBhcnNlZCkpIHBhcnNlZC5mb28gPSAxO1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vKiogQSBKU09OIHNjYWxhci4gYHVuZGVmaW5lZGAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCAtIGBKU09OLnN0cmluZ2lmeWAgZHJvcHMgaXQuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVQcmltaXRpdmUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcblxuLyoqXG4gKiBBbnkgdmFsdWUgdGhhdCBzdXJ2aXZlcyBhIGBKU09OLnN0cmluZ2lmeWAvYEpTT04ucGFyc2VgIHJvdW5kIHRyaXAgdW5jaGFuZ2VkLlxuICpcbiAqIFVzZSBpdCBpbnN0ZWFkIG9mIGB1bmtub3duYCBvbiBhIGJvdW5kYXJ5IHRoYXQgd2lsbCBzZXJpYWxpemUgaXRzIGlucHV0IC0gYVxuICogbWVzc2FnZSBwYXlsb2FkLCBhIGNhY2hlIGVudHJ5LCBhIGNvbmZpZyBibG9iIHdyaXR0ZW4gdG8gZGlzayAtIHNvIGEgYERhdGVgLFxuICogYSBgTWFwYCwgb3IgYSBjbGFzcyBpbnN0YW5jZSBpcyBhIGNvbXBpbGUgZXJyb3IgYXQgdGhlIGNhbGwgc2l0ZSByYXRoZXIgdGhhbiBhXG4gKiByZWNlaXZlciBxdWlldGx5IGdldHRpbmcgYSBzdHJpbmcgb3IgYHt9YC4ge0BsaW5rIGlzU2VyaWFsaXphYmxlVmFsdWV9IGlzIHRoZVxuICogcnVudGltZSBoYWxmLCBmb3IgaW5wdXQgdGhlIGNvbXBpbGVyIGNhbm5vdCB2b3VjaCBmb3IuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVZhbHVlID1cbiAgU2VyaWFsaXphYmxlUHJpbWl0aXZlIHwgU2VyaWFsaXphYmxlVmFsdWVbXSB8IHsgW2tleTogc3RyaW5nXTogU2VyaWFsaXphYmxlVmFsdWUgfTtcblxuLyoqXG4gKiBUcnVlIHdoZW4gYHZhbHVlYCBzdXJ2aXZlcyBhIEpTT04gcm91bmQgdHJpcCB3aXRoIG5vIGxvc3MgYW5kIG5vIGNvZXJjaW9uLlxuICpcbiAqIFN0cmljdGVyIHRoYW4gXCJgSlNPTi5zdHJpbmdpZnlgIGRpZCBub3QgdGhyb3dcIiwgYmVjYXVzZSB0aGF0IHN1Y2NlZWRzIHdoaWxlXG4gKiBzaWxlbnRseSBDSEFOR0lORyB0aGUgdmFsdWU6IGEgYERhdGVgIGJlY29tZXMgYSBzdHJpbmcsIGBOYU5gIGFuZCBgSW5maW5pdHlgXG4gKiBiZWNvbWUgYG51bGxgLCBhIGBNYXBgIGJlY29tZXMgYHt9YCwgYW5kIGB1bmRlZmluZWRgIGRpc2FwcGVhcnMgZnJvbSBhbiBvYmplY3RcbiAqIG9yIHR1cm5zIGludG8gYG51bGxgIGluc2lkZSBhbiBhcnJheS4gRWFjaCBvZiB0aG9zZSByZWFjaGVzIHRoZSBmYXIgc2lkZSBhc1xuICogc29tZXRoaW5nIG90aGVyIHRoYW4gd2hhdCB3YXMgc2VudCwgc28gYWxsIG9mIHRoZW0gYXJlIHJlamVjdGVkIGhlcmUuXG4gKlxuICogUmVqZWN0ZWQ6IG5vbi1maW5pdGUgbnVtYmVycywgYHVuZGVmaW5lZGAsIGZ1bmN0aW9ucywgc3ltYm9scywgYmlnaW50cywgY2xhc3NcbiAqIGluc3RhbmNlcyBhbmQgYW55dGhpbmcgZWxzZSB3aXRoIGEgcHJvdG90eXBlIG90aGVyIHRoYW4gYE9iamVjdC5wcm90b3R5cGVgIG9yXG4gKiBgbnVsbGAgKGBEYXRlYCwgYE1hcGAsIGBTZXRgLCBgUmVnRXhwYCwgYEJ1ZmZlcmApLCBhbmQgYW55IG9iamVjdCBncmFwaFxuICogY29udGFpbmluZyBhIGN5Y2xlLiBBY2NlcHRlZDogc3RyaW5ncywgYm9vbGVhbnMsIGBudWxsYCwgZmluaXRlIG51bWJlcnMsIHBsYWluXG4gKiBvYmplY3RzLCBhcnJheXMsIGFuZCBuZXN0aW5ncyBvZiB0aG9zZS5cbiAqXG4gKiBOYXJyb3dzIHRvIHtAbGluayBTZXJpYWxpemFibGVWYWx1ZX0gcmF0aGVyIHRoYW4gYXNzZXJ0aW5nLCBzbyBpdCBhbHNvIHNlcnZlc1xuICogYXMgdGhlIHZhbGlkYXRvciBmb3IgdW50cnVzdGVkIGlucHV0IC0gYSByZXF1ZXN0IGJvZHksIGEgZGVjb2RlZCBub3RpZmljYXRpb25cbiAqIHBheWxvYWQgLSB3aGVyZSB0aGUgYW5zd2VyIHNob3VsZCBiZSBhIDQwMCBhbmQgbm90IGEgdGhyb3cuIE5ldmVyIHRocm93cy5cbiAqXG4gKiBEaXN0aW5jdCBmcm9tIHtAbGluayBkZWVwRXF1YWx9J3Mgbm90aW9uIG9mIGNvbXBhcmFibGU6IHRoYXQgb25lIEhBTkRMRVNcbiAqIGBEYXRlYC9gTWFwYC9gU2V0YCBzdHJ1Y3R1cmFsbHksIHdoaWxlIHRoaXMgb25lIHJlamVjdHMgdGhlbSBwcmVjaXNlbHkgYmVjYXVzZVxuICogSlNPTiBjYW5ub3QgY2FycnkgdGhlbS5cbiAqXG4gKiBAcGFyYW0gYW5jZXN0b3JzIEN5Y2xlLWRldGVjdGlvbiBzZXQgZm9yIHRoZSByZWN1cnNpdmUgd2Fsay4gSW50ZXJuYWw7IGNhbGxlcnNcbiAqICAgcGFzcyBvbmUgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlzU2VyaWFsaXphYmxlVmFsdWUoeyBhOiBbMSwgXCJ4XCIsIG51bGxdIH0pOyAvLyB0cnVlXG4gKiBpc1NlcmlhbGl6YWJsZVZhbHVlKHsgYXQ6IG5ldyBEYXRlKCkgfSk7ICAgIC8vIGZhbHNlIC0gd291bGQgYmVjb21lIGEgc3RyaW5nXG4gKiBpc1NlcmlhbGl6YWJsZVZhbHVlKE51bWJlci5OYU4pOyAgICAgICAgICAgIC8vIGZhbHNlIC0gd291bGQgYmVjb21lIG51bGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VyaWFsaXphYmxlVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBhbmNlc3RvcnM6IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpLFxuKTogdmFsdWUgaXMgU2VyaWFsaXphYmxlVmFsdWUge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0cnVlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgcHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBhbmNlc3RvcnMuYWRkKHZhbHVlKTtcbiAgY29uc3QgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgID8gdmFsdWUuZXZlcnkoKGVudHJ5KSA9PiBpc1NlcmlhbGl6YWJsZVZhbHVlKGVudHJ5LCBhbmNlc3RvcnMpKVxuICAgIDogT2JqZWN0LnZhbHVlcyh2YWx1ZSkuZXZlcnkoKGVudHJ5KSA9PiBpc1NlcmlhbGl6YWJsZVZhbHVlKGVudHJ5LCBhbmNlc3RvcnMpKTtcbiAgYW5jZXN0b3JzLmRlbGV0ZSh2YWx1ZSk7XG4gIHJldHVybiB2YWxpZDtcbn1cblxuLyoqXG4gKiBDYW5vbmljYWwgc3RyaW5nIGZvciBhIHN0cnVjdHVyZWQgdmFsdWUsIGZvciBkZXJpdmluZyBhIFNUQUJMRSBJREVOVElUWSBmcm9tXG4gKiBpdCAtIGFuIGFkdmlzb3J5LWxvY2sgaWQsIGEgY2hhbm5lbCBuYW1lLCBhIGNhY2hlIGtleS5cbiAqXG4gKiBUaGUgZ3VhcmFudGVlIGlzIHR3by13YXksIHdoaWNoIGlzIHdoYXQgbWFrZXMgaXQgc2FmZSB0byBoYXNoOiB2YWx1ZXMgdGhhdFxuICogc2hvdWxkIHNoYXJlIGFuIGlkZW50aXR5IHByb2R1Y2UgdGhlIHNhbWUgc3RyaW5nIChvYmplY3Qga2V5IG9yZGVyIGRvZXMgbm90XG4gKiBtYXR0ZXIpLCBhbmQgdmFsdWVzIHRoYXQgc2hvdWxkIG5vdCBhcmUgbmV2ZXIgY29uZmxhdGVkLiBFdmVyeSB0b2tlbiBjYXJyaWVzXG4gKiBpdHMgdHlwZSwgc28gYDFgIGFuZCBgXCIxXCJgIGRpZmZlcjsgYSBzdHJpbmcgY2FycmllcyBpdHMgbGVuZ3RoLCBzb1xuICogYFtcImFcIiwgXCJiY1wiXWAgYW5kIGBbXCJhYlwiLCBcImNcIl1gIGRpZmZlcjsgYXJyYXlzIGtlZXAgb3JkZXIgd2hpbGUgb2JqZWN0IGtleXNcbiAqIGFyZSBzb3J0ZWQuXG4gKlxuICogYEpTT04uc3RyaW5naWZ5YCBjYW5ub3QgZG8gdGhpcyBqb2IgLSBrZXkgb3JkZXIgbGVha3MgaW4sIGB1bmRlZmluZWRgIHZhbmlzaGVzLFxuICogYDFgIGFuZCBgXCIxXCJgIGNvbGxpZGUgYWZ0ZXIgcXVvdGluZyBpcyBzdHJpcHBlZCwgYW5kIGEgY3ljbGUgdGhyb3dzIGFcbiAqIGBUeXBlRXJyb3JgIG5hbWluZyBuZWl0aGVyIHRoZSB2YWx1ZSBub3IgdGhlIGNhbGxlcidzIGludGVudC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgc3RyaWN0IHdoZXJlIGEgc2lsZW50IGFuc3dlciB3b3VsZCBiZSBhIFdST05HIGlkZW50aXR5IHJhdGhlclxuICogdGhhbiBhIG1pc3Npbmcgb25lLCBzaW5jZSB0d28gY2FsbGVycyBkaXNhZ3JlZWluZyBhYm91dCBhIGxvY2sgb3IgYSBjaGFubmVsIGlzXG4gKiBpbnZpc2libGUgdW50aWwgaXQgY29ycnVwdHMgc29tZXRoaW5nLiBUaHJvd3MgYFR5cGVFcnJvcmAgb24gYSBjeWNsZSwgb24gYVxuICogbm9uLWZpbml0ZSBudW1iZXIgKGBOYU5gIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYsIHNvIGl0IGNhbm5vdCBoYXZlIGEgc3RhYmxlXG4gKiBpZGVudGl0eSksIGFuZCBvbiBhIGBmdW5jdGlvbmAgb3IgYHN5bWJvbGAgKG5vIG1lYW5pbmdmdWwgdmFsdWUgaWRlbnRpdHkpLlxuICogYHVuZGVmaW5lZGAgYW5kIGBudWxsYCBhcmUgYWNjZXB0ZWQgYXMgZGlzdGluY3QgdG9rZW5zLlxuICpcbiAqIGBEYXRlYCBpcyBjYW5vbmljYWxpemVkIGJ5IGluc3RhbnQsIHVubGlrZSB0aGUgaGFzaCBjYW5vbmljYWxpemVyIGluXG4gKiBgLi9oYXNoLnRzYCwgd2hpY2ggZm9sZHMgZXZlcnkgYERhdGVgIG9udG8gb25lIHRva2VuLiBQcmVmZXIgdGhpcyBmdW5jdGlvbiB3aGVuXG4gKiBkaXN0aW5jdG5lc3MgaXMgYSBjb3JyZWN0bmVzcyByZXF1aXJlbWVudDsgcHJlZmVyIGBoYXNoLmZudkhhc2hgIHdoZW4gYSBzaG9ydCxcbiAqIGNvbGxpc2lvbi10b2xlcmFudCBkaWdlc3QgaXMgZW5vdWdoLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjYW5vbmljYWxpemUuXG4gKiBAcGFyYW0gc2VlbiAtIEN5Y2xlLWRldGVjdGlvbiBzZXQgZm9yIHRoZSByZWN1cnNpdmUgd2Fsay4gSW50ZXJuYWw7IGNhbGxlcnNcbiAqICAgcGFzcyBvbmUgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvU3RhYmxlS2V5KHsgYTogMSwgYjogMiB9KSA9PT0gdG9TdGFibGVLZXkoeyBiOiAyLCBhOiAxIH0pOyAvLyB0cnVlXG4gKiB0b1N0YWJsZUtleSgxKSAhPT0gdG9TdGFibGVLZXkoXCIxXCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1N0YWJsZUtleSh2YWx1ZTogdW5rbm93biwgc2VlbjogU2V0PG9iamVjdD4gPSBuZXcgU2V0KCkpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBcIm51bGxcIjtcblxuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIC8vIExlbmd0aC1wcmVmaXhlZCBzbyBjb25jYXRlbmF0ZWQgbmVpZ2hib3VycyBjYW5ub3QgYmUgcmUtc3BsaXRcbiAgICAgIC8vIGRpZmZlcmVudGx5OiBgW1wiYVwiLFwiYmNcIl1gIGFuZCBgW1wiYWJcIixcImNcIl1gIG11c3Qgbm90IGFncmVlLlxuICAgICAgcmV0dXJuIGBzdHJpbmc6JHt2YWx1ZS5sZW5ndGh9OiR7dmFsdWV9YDtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIGBib29sZWFuOiR7dmFsdWV9YDtcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICByZXR1cm4gYGJpZ2ludDoke3ZhbHVlfWA7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RhYmxlIGtleXMgcmVxdWlyZSBmaW5pdGUgbnVtYmVyc1wiKTtcbiAgICAgIC8vIGAtMCA9PT0gMGAgYnV0IHRoZXkgc3RyaW5naWZ5IGRpZmZlcmVudGx5LCBzbyBwaWNrIG9uZSBzcGVsbGluZy5cbiAgICAgIHJldHVybiBgbnVtYmVyOiR7T2JqZWN0LmlzKHZhbHVlLCAtMCkgPyBcIi0wXCIgOiB2YWx1ZX1gO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN0YWJsZSBrZXlzIGNhbm5vdCBjb250YWluIGN5Y2xlc1wiKTtcbiAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBgZGF0ZToke3ZhbHVlLnRvSVNPU3RyaW5nKCl9YDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGBhcnJheTpbJHt2YWx1ZS5tYXAoKGl0ZW0pID0+IHRvU3RhYmxlS2V5KGl0ZW0sIHNlZW4pKS5qb2luKFwiLFwiKX1dYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAvLyBTb3J0ZWQgYnkgY2Fub25pY2FsIGZvcm0sIHNvIGluc2VydGlvbiBvcmRlciBkb2VzIG5vdCBsZWFrLlxuICAgICAgICAgIHJldHVybiBgc2V0Olske1suLi52YWx1ZV1cbiAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IHRvU3RhYmxlS2V5KGl0ZW0sIHNlZW4pKVxuICAgICAgICAgICAgLnNvcnQoKVxuICAgICAgICAgICAgLmpvaW4oXCIsXCIpfV1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJpZXM6IEl0ZXJhYmxlPFt1bmtub3duLCB1bmtub3duXT4gPVxuICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTWFwID8gdmFsdWUgOiBPYmplY3QuZW50cmllcyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBgJHt2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IFwibWFwXCIgOiBcIm9iamVjdFwifTp7JHtbLi4uZW50cmllc11cbiAgICAgICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gYCR7dG9TdGFibGVLZXkoa2V5LCBzZWVuKX09JHt0b1N0YWJsZUtleShpdGVtLCBzZWVuKX1gKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAuam9pbihcIixcIil9fWA7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZWVuLmRlbGV0ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCBzdGFibGUga2V5IHR5cGU6ICR7dHlwZW9mIHZhbHVlfWApO1xuICB9XG59XG5cbi8qKlxuICogYHsgW2tleV06IHZhbHVlIH1gIHdoZW4gYHZhbHVlYCBpcyBwcmVzZW50LCBvdGhlcndpc2UgYHVuZGVmaW5lZGAgLSBzbyBhblxuICogYWJzZW50IG9wdGlvbmFsIGZpZWxkIHN0YXlzIEFCU0VOVCB3aGVuIHNwcmVhZCwgcmF0aGVyIHRoYW4gYmVjb21pbmcgYW5cbiAqIGV4cGxpY2l0IGB1bmRlZmluZWRgIHRoYXQgYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYCByZWplY3RzLlxuICpcbiAqIFNwZWxsaW5nIHRoYXQgaW5saW5lIGNvc3RzIGEgcmVwZWF0ZWQsIGRvdWJsZS1ldmFsdWF0ZWQgdGVybmFyeSBwZXIgZmllbGRcbiAqIChgLi4uKHYgPyB7IGtleTogdiB9IDoge30pYCksIHdoaWNoIGlzIGhvdyBjb25maWcgcmVzb2x2ZXJzIGVuZCB1cCBjb21wdXRpbmdcbiAqIHRoZSBzYW1lIHZhbHVlIHR3aWNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiByZXR1cm4ge1xuICogICAuLi5vcHRpb25hbChcImFwcElkXCIsIGVudi50ZXh0KFwiTUlDUk9TT0ZUX0FQUF9JRFwiKSksXG4gKiAgIC4uLm9wdGlvbmFsKFwiZW5kcG9pbnRcIiwgY29uZmlnLmVuZHBvaW50KSxcbiAqIH07XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbDxLIGV4dGVuZHMgc3RyaW5nLCBWPihcbiAga2V5OiBLLFxuICB2YWx1ZTogViB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8SywgVj4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICh7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxLLCBWPik7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHRvTnVtYmVyfS5cbiAqXG4gKiBCb3RoIHN3aXRjaGVzIHR1cm4gT0ZGIGEgbGVuaWVuY3kgdGhhdCBpcyBoZWxwZnVsIGZvciBhIGhhbmQtdHlwZWQgc2V0dGluZyBidXRcbiAqIHdyb25nIHdoZW4gdGhlIHN0cmluZydzIG90aGVyIGNoYXJhY3RlcnMgY2FycnkgbWVhbmluZy4ge0BsaW5rIHRvRGF0ZX0gYW5kXG4gKiB7QGxpbmsgdG9EdXJhdGlvbn0gZGlzYWJsZSBib3RoLCBzaW5jZSBhIHNwYWNlIGluc2lkZSBgMjAyNiAwOCAwMmAgaXMgYSBmaWVsZFxuICogc2VwYXJhdG9yIGFuZCBhIHBlcmNlbnQgaGFzIG5vIGVwb2NoIG9yIG1pbGxpc2Vjb25kIHJlYWRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9OdW1iZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgaW50ZXJuYWwgZGlnaXQtZ3JvdXAgc2VwYXJhdG9ycyBhcmUgc3RyaXBwZWQsIHNvIGBcIjEsMDAwXCJgIGFuZFxuICAgKiBgXCIxIDAwMFwiYCByZWFkIGFzIGAxMDAwYC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBQbGFjZW1lbnQgaXMgbm90IHZhbGlkYXRlZCB3aGVuIGVuYWJsZWQsIHNvIGBcIjEsMDAsMFwiYCBhbHNvIHJlYWRzIGFzIGAxMDAwYC5cbiAgICogRGlzYWJsZSBpdCB3aGVuIHdoaXRlc3BhY2Ugb3IgYSBjb21tYSBkZWxpbWl0cyBGSUVMRFMgcmF0aGVyIHRoYW4gZ3JvdXBpbmdcbiAgICogZGlnaXRzLCBiZWNhdXNlIHN0cmlwcGluZyB0aGVtIHNpbGVudGx5IGZ1c2VzIHRob3NlIGZpZWxkcyBpbnRvIG9uZSBudW1iZXIuXG4gICAqL1xuICBzZXBhcmF0b3JzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB0cmFpbGluZyBwZXJjZW50IHNpZ24gZGl2aWRlcyB0aGUgcmVzdWx0IGJ5IGAxMDBgLCBzbyBgXCIyNSVcImAgcmVhZHNcbiAgICogYXMgYDAuMjVgLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIERpc2FibGUgaXQgd2hlcmUgYSBwZXJjZW50YWdlIGhhcyBubyBtZWFuaW5nLCBzbyBgXCIyNSVcImAgaXMgYSBtaXNzIHJhdGhlclxuICAgKiB0aGFuIGEgbnVtYmVyIHR3byBvcmRlcnMgb2YgbWFnbml0dWRlIGF3YXkgZnJvbSB3aGF0IHRoZSB0ZXh0IHNheXMuXG4gICAqL1xuICBwZXJjZW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYSBsb29zZSBudW1lcmljIHZhbHVlIHRvIGEgcmVhbCwgRklOSVRFIGBudW1iZXJgLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0XG4gKiBjYXJyaWVzIG5vIG51bWVyaWMgbWVhbmluZy5cbiAqXG4gKiBUaGUgb25lIHBsYWNlIGEgaGFuZC10eXBlZCBudW1iZXIgaXMgaW50ZXJwcmV0ZWQsIGFsb25nc2lkZSB7QGxpbmsgdG9Cb29sZWFufSxcbiAqIHtAbGluayB0b0RhdGV9LCBhbmQge0BsaW5rIHRvRHVyYXRpb259LiBSZWFjaCBmb3IgaXQgaW5zdGVhZCBvZiBgTnVtYmVyKHgpYCBvciBhXG4gKiBoYW5kLXJvbGxlZCBudW1lcmljIHJlZ2V4OiBiYXJlIGBOdW1iZXJgIG1hcHMgYFwiXCJgLCBgbnVsbGAsIGBbXWAsIGFuZFxuICogd2hpdGVzcGFjZSB0byBgMGAgYW5kIGFueXRoaW5nIGVsc2UgdG8gYE5hTmAsIHNvIGEgY2FsbGVyIGhhcyB0byByZS1jaGVjayB0aGVcbiAqIHJlc3VsdCBldmVyeSB0aW1lLCBhbmQgYWQgaG9jIHJlZ2V4ZXMgdGVuZCB0byBkcmlmdCBpbiB3aGF0IHRoZXkgYWNjZXB0LlxuICpcbiAqIEFjY2VwdHM6IGEgZmluaXRlIGBudW1iZXJgOyBhIGBiaWdpbnRgOyBvciBhIGRlY2ltYWwgc3RyaW5nIHdpdGggYW4gb3B0aW9uYWxcbiAqIGxlYWRpbmcgc2lnbiwgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlLCB3aGl0ZXNwYWNlIGFmdGVyIHRoZSBzaWduLFxuICogZGlnaXQtZ3JvdXAgc2VwYXJhdG9ycyAoYFwiMSwwMDBcImAsIGBcIjEgMDAwXCJgKSwgYSBiYXJlIGZyYWN0aW9uIChgXCIuNVwiYCksIGFcbiAqIHRyYWlsaW5nIHBvaW50IChgXCIxLlwiYCksIHNjaWVudGlmaWMgbm90YXRpb24gKGBcIjFlM1wiYCksIGFuZCBhbiBvcHRpb25hbFxuICogdHJhaWxpbmcgcGVyY2VudCBzaWduIChgXCIyNSVcImAsIGBcIjEuNSAlXCJgKS4gQSB0cmFpbGluZyBgJWAgZGl2aWRlcyB0aGUgcGFyc2VkXG4gKiB2YWx1ZSBieSBgMTAwYCwgc28gYFwiMjUlXCJgIGJlY29tZXMgYDAuMjVgLlxuICpcbiAqIFNlcGFyYXRvcnMgYXJlIHN0cmlwcGVkIHdpdGhvdXQgdmFsaWRhdGluZyB0aGVpciBwbGFjZW1lbnQsIHNvIGBcIjEsMDAsMFwiYCByZWFkc1xuICogYXMgYDEwMDBgOyB0aGlzIGlzIGEgY29lcmNpb24gZm9yIGhhbmQtdHlwZWQgY29uZmlndXJhdGlvbiwgbm90IGEgbG9jYWxlLWF3YXJlXG4gKiB2YWxpZGF0b3IuIEFueXRoaW5nIGVsc2UsIGluY2x1ZGluZyBgTmFOYCwgYEluZmluaXR5YCwgYW4gZW1wdHkgb3JcbiAqIHdoaXRlc3BhY2Utb25seSBzdHJpbmcsIGBudWxsYCwgYHVuZGVmaW5lZGAsIGEgYm9vbGVhbiwgbXVsdGlwbGUgc2lnbnMsXG4gKiBtYWxmb3JtZWQgZXhwb25lbnRzLCBtaXNwbGFjZWQgcGVyY2VudCBzaWducywgb3IgYFwiMTJweFwiYCwgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHJhdGhlciB0aGFuIHRocm93aW5nLCBtYXRjaGluZyB0aGUgb3RoZXIgY29lcmNpb25zLCBzbyBpdFxuICogY29tcG9zZXMgbmF0dXJhbGx5IHdpdGggYD8/YCBmYWxsYmFja3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvTnVtYmVyKFwiMSwwMDBcIik7ICAgLy8gMTAwMFxuICogdG9OdW1iZXIoXCIgLTIuNSBcIik7ICAvLyAtMi41XG4gKiB0b051bWJlcihcIjFlM1wiKTsgICAgIC8vIDEwMDBcbiAqIHRvTnVtYmVyKFwiMTIuNSAlXCIpOyAgLy8gMC4xMjVcbiAqIHRvTnVtYmVyKFwiXCIpOyAgICAgICAgLy8gdW5kZWZpbmVkICAoTnVtYmVyKFwiXCIpIHdvdWxkIGJlIDApXG4gKiB0b051bWJlcihcIjEycHhcIik7ICAgIC8vIHVuZGVmaW5lZFxuICogdG9OdW1iZXIoXCIxIDAwMFwiLCB7IHNlcGFyYXRvcnM6IGZhbHNlIH0pOyAvLyB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb051bWJlck9wdGlvbnMgPSB7fSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgIHJldHVybiB0b051bWJlcihOdW1iZXIodmFsdWUpLCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAvLyBTdHJpcCBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlLCB3aGl0ZXNwYWNlIGFmdGVyIGEgbGVhZGluZyBzaWduLCBkaWdpdC1ncm91cFxuICAgIC8vIHNlcGFyYXRvcnMgKGJvdGggYCxgIGFuZCB0aGUgc3BhY2UgaW4gYFwiMSAwMDBcImApLCBsZWF2aW5nIGEgYmFyZSBudW1lcmFsIGZvclxuICAgIC8vIHRoZSBzaGFwZSB0ZXN0IGJlbG93IHRvIGFjY2VwdCBvciByZWplY3QuXG4gICAgY29uc3QgdGV4dCA9IHZhbHVlLnJlcGxhY2UoXG4gICAgICBvcHRpb25zLnNlcGFyYXRvcnMgPT09IGZhbHNlID8gLyheXFxzK3xcXHMrJCkvZyA6IC8oXlxccyt8XFxzKyR8KD88PV5bKy1dKVxccyt8KD88PVxcZClcXHMrfCwpL2csXG4gICAgICBcIlwiLFxuICAgICk7XG4gICAgaWYgKHRleHQpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGV4dC5tYXRjaCgvXihbKy1dPyg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzplWystXT9cXGQrKT8pKCUpPyQvaSk7XG4gICAgICBpZiAobWF0Y2ggJiYgIShtYXRjaFsyXSAmJiBvcHRpb25zLnBlcmNlbnQgPT09IGZhbHNlKSkge1xuICAgICAgICBjb25zdCBudW1iZXIgPSBOdW1iZXIobWF0Y2hbMV0pO1xuICAgICAgICByZXR1cm4gdG9OdW1iZXIobWF0Y2hbMl0gPyBudW1iZXIgLyAxMDAgOiBudW1iZXIsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBBIGJveGVkIGBOdW1iZXJgLCBvciBhbnl0aGluZyB3aXRoIGEgbnVtZXJpYyBgdG9TdHJpbmdgLiBgU3RyaW5nKHZhbHVlKWBcbiAgICAvLyByb3V0ZXMgaXQgYmFjayB0aHJvdWdoIHRoZSBzdHJpbmcgYnJhbmNoLCB3aGljaCByZWplY3RzIHdoYXQgaXMgbm90IG51bWVyaWMuXG4gICAgcmV0dXJuIHRvTnVtYmVyKFN0cmluZyh2YWx1ZSksIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgYm9vbGVhbi1pc2ggdmFsdWUgdG8gYSByZWFsIGBib29sZWFuYCwgb3IgYHVuZGVmaW5lZGBcbiAqIHdoZW4gaXQgY2FuJ3QgYmUgaW50ZXJwcmV0ZWQuIFJlY29nbml6ZXMgYHRydWVgL2B0YC9gb25gL2AxYC9geWVzYC9geWBcbiAqIGFuZCB0aGVpciBuZWdhdGl2ZXMgKGNhc2UtIGFuZCB3aGl0ZXNwYWNlLWluc2Vuc2l0aXZlIGZvciBzdHJpbmdzKSwgYXNcbiAqIHdlbGwgYXMgdGhlIG51bWJlcnMgYDFgIGFuZCBgMGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PT0gXCJ0cnVlXCIgfHxcbiAgICAgIHZhbHVlID09IFwidFwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJvblwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCIxXCIgfHxcbiAgICAgIHZhbHVlID09PSBcInllc1wiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJ5XCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB2YWx1ZSA9PT0gXCJmYWxzZVwiIHx8XG4gICAgICB2YWx1ZSA9PSBcImZcIiB8fFxuICAgICAgdmFsdWUgPT09IFwib2ZmXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIjBcIiB8fFxuICAgICAgdmFsdWUgPT09IFwibm9cIiB8fFxuICAgICAgdmFsdWUgPT09IFwiblwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmICh2YWx1ZSA9PT0gMSkgcmV0dXJuIHRydWU7XG4gICAgZWxzZSBpZiAodmFsdWUgPT09IDApIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIExhcmdlc3QgdmFsdWUgcmVhZCBhcyBlcG9jaCBTRUNPTkRTIHJhdGhlciB0aGFuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBgMWUxMWAgc2Vjb25kcyBpcyB0aGUgeWVhciA1MTM4IGFuZCBgMWUxMWAgbXMgaXMgMTk3My0wMy0wMywgc28gZXZlcnkgdmFsdWUgYVxuICogY2FsbGVyIHJlYWxpc3RpY2FsbHkgbWVhbnMgYXMgbWlsbGlzIGlzIGFib3ZlIHRoZSBsaW5lIGFuZCBldmVyeSB2YWx1ZSB0aGV5XG4gKiBtZWFuIGFzIHNlY29uZHMgaXMgYmVsb3cgaXQuIFRoZSBhbWJpZ3VpdHkgaXMgdW5hdm9pZGFibGUgLSB0aGUgdHdvIHVuaXRzIHNoYXJlXG4gKiBhIG51bWJlciBsaW5lIC0gc28gdGhlIHNwbGl0IGlzIHBsYWNlZCB3aGVyZSBuZWl0aGVyIHNpZGUgaGFzIGEgcGxhdXNpYmxlXG4gKiBjbGFpbS5cbiAqL1xuY29uc3QgU0VDT05EU19DRUlMSU5HID0gMWUxMTtcblxuLyoqXG4gKiBBIG51bWJlciBmb3Ige0BsaW5rIHRvRGF0ZX0gYW5kIHtAbGluayB0b0R1cmF0aW9ufSwgcmVhZCB3aXRoIG5vbmUgb2ZcbiAqIHtAbGluayB0b051bWJlcn0ncyBzdHJpbmcgbGVuaWVuY2llcy5cbiAqXG4gKiBCb3RoIGxlbmllbmNpZXMgYXJlIGFjdGl2ZWx5IGhhcm1mdWwgaGVyZS4gQSBzcGFjZSBvciBjb21tYSBzZXBhcmF0ZXMgRklFTERTIGluXG4gKiBhIGRhdGUgKGAyMDI2IDA4IDAyYCB3b3VsZCBmdXNlIGludG8gdGhlIGVwb2NoIGAyMDI2MDgwMmApLCBhbmQgYSBwZXJjZW50YWdlIGhhc1xuICogbm8gcmVhZGluZyBhcyBhbiBpbnN0YW50IG9yIGEgbGVuZ3RoIG9mIHRpbWUsIHNvIGAyNSVgIG11c3QgYmUgYSBtaXNzIHJhdGhlclxuICogdGhhbiBgMjUwbXNgLlxuICovXG5mdW5jdGlvbiB0b0JhcmVOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdG9OdW1iZXIodmFsdWUsIHsgc2VwYXJhdG9yczogZmFsc2UsIHBlcmNlbnQ6IGZhbHNlIH0pO1xufVxuXG4vKipcbiAqIE1pbGxpc2Vjb25kcyBwZXIgdW5pdCwga2V5ZWQgYnkgU0lOR1VMQVIgYWxpYXMuIHtAbGluayB0b0R1cmF0aW9ufSByZXRyaWVzIGFcbiAqIGxvb2t1cCB3aXRob3V0IGEgdHJhaWxpbmcgYHNgLCBzbyBldmVyeSBwbHVyYWwgc3BlbGxpbmcgaXMgY292ZXJlZCB3aXRob3V0XG4gKiBsaXN0aW5nIGl0IChgbXNgIGlzIGFscmVhZHkgc2luZ3VsYXIsIGhlbmNlIGl0cyBvd24gZW50cnkpLlxuICpcbiAqIGBtYCBpcyBNSU5VVEVTIGFuZCBtb250aHMgbmVlZCBgbW9gLCBmb2xsb3dpbmcgdGhlIG5lYXItdW5pdmVyc2FsIGNvbnZlbnRpb25cbiAqIChgbXNgLCBgZGF0ZWAsIGNyb24gcHJvc2UpOyBtb250aCBhbmQgeWVhciBhcmUgY2FsZW5kYXIgYXBwcm94aW1hdGlvbnMgKDMwIC9cbiAqIDM2NSBkYXlzKSBiZWNhdXNlIGEgZHVyYXRpb24gaGFzIG5vIGFuY2hvciBkYXRlIHRvIGJlIGV4YWN0IGFnYWluc3QuXG4gKi9cbmNvbnN0IERVUkFUSU9OX1VOSVRTOiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFttczogbnVtYmVyLCBhbGlhc2VzOiByZWFkb25seSBzdHJpbmdbXV0+ID0gW1xuICBbMSwgW1wibXNcIiwgXCJtc2VjXCIsIFwibWlsbGlzZWNvbmRcIiwgXCJtaWxsaVwiXV0sXG4gIFsxMDAwLCBbXCJzXCIsIFwic2VjXCIsIFwic2Vjb25kXCJdXSxcbiAgWzYwXzAwMCwgW1wibVwiLCBcIm1pblwiLCBcIm1pbnV0ZVwiXV0sXG4gIFszXzYwMF8wMDAsIFtcImhcIiwgXCJoclwiLCBcImhvdXJcIl1dLFxuICBbODZfNDAwXzAwMCwgW1wiZFwiLCBcImRheVwiXV0sXG4gIFs2MDRfODAwXzAwMCwgW1wid1wiLCBcIndrXCIsIFwid2Vla1wiXV0sXG4gIFsyXzU5Ml8wMDBfMDAwLCBbXCJtb1wiLCBcIm1vblwiLCBcIm1vbnRoXCJdXSxcbiAgWzMxXzUzNl8wMDBfMDAwLCBbXCJ5XCIsIFwieXJcIiwgXCJ5ZWFyXCJdXSxcbl07XG5cbmNvbnN0IERVUkFUSU9OX1VOSVRfTVM6IFJlYWRvbmx5TWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoXG4gIERVUkFUSU9OX1VOSVRTLmZsYXRNYXAoKFttcywgYWxpYXNlc10pID0+IGFsaWFzZXMubWFwKChhbGlhcykgPT4gW2FsaWFzLCBtc10gYXMgY29uc3QpKSxcbik7XG5cbi8qKiBPbmUgYDxhbW91bnQ+PHVuaXQ+YCB0ZXJtIGluc2lkZSBhIGR1cmF0aW9uIHN0cmluZy4gKi9cbmNvbnN0IERVUkFUSU9OX1RFUk0gPSAvKFsrLV0/KShcXGQrKD86XFwuXFxkKyk/KVxccyooW2Etel0rKS9nO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b0RhdGV9LlxuICpcbiAqIFRoZSBtaXJyb3Igb2Yge0BsaW5rIFRvRHVyYXRpb25PcHRpb25zfTogZWFjaCBmdW5jdGlvbiBjYW4gZmFsbCBiYWNrIHRvIHRoZVxuICogb3RoZXIsIHNvIGVhY2ggaGFzIG9uZSBzd2l0Y2ggdHVybmluZyB0aGF0IGZhbGxiYWNrIG9mZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb0RhdGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB7QGxpbmsgdG9EdXJhdGlvbn0gZXhwcmVzc2lvbiBpcyByZWFkIGFzIGFuIGluc3RhbnQgcmVsYXRpdmUgdG9cbiAgICogbm93LCBzbyBgLTdkYCBhbmQgYDcgZGF5cyBhZ29gIGJlY29tZSBgbm93IC0gNyBkYXlzYC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBTZXQgYGZhbHNlYCB3aGVuIHRoZSB2YWx1ZSBtdXN0IGJlIGEgcmVhbCBkYXRlIGFuZCBhIHJlbGF0aXZlIGV4cHJlc3Npb25cbiAgICogc2hvdWxkIGJlIGEgbWlzcyAtIGEgc3RvcmVkIHRpbWVzdGFtcCwgYSB1c2VyLXN1cHBsaWVkIGBEYXRlYCBoZWFkZXIsIGFuXG4gICAqIGBleHBpcmVzX2F0YCBmaWVsZCAtIHNpbmNlIGEgZHVyYXRpb24gc2lsZW50bHkgcmVzb2x2aW5nIGFnYWluc3QgdGhlIGN1cnJlbnRcbiAgICogY2xvY2sgbWFrZXMgdGhlIHNhbWUgaW5wdXQgbWVhbiBzb21ldGhpbmcgZGlmZmVyZW50IG9uIGV2ZXJ5IGNhbGwuIEFsc28gd2hhdFxuICAgKiB7QGxpbmsgdG9EdXJhdGlvbn0gcGFzc2VzIHdoZW4gaXQgcmVjdXJzZXMsIHNvIHRoZSB0d28gY2Fubm90IGJvdW5jZSBhIHZhbHVlXG4gICAqIGJldHdlZW4gdGhlbSBmb3JldmVyLlxuICAgKi9cbiAgcGFyc2VEdXJhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHRvRHVyYXRpb259LlxuICpcbiAqIFRoZSBtaXJyb3Igb2Yge0BsaW5rIFRvRGF0ZU9wdGlvbnN9OiBlYWNoIGZ1bmN0aW9uIGNhbiBmYWxsIGJhY2sgdG8gdGhlIG90aGVyLFxuICogc28gZWFjaCBoYXMgb25lIHN3aXRjaCB0dXJuaW5nIHRoYXQgZmFsbGJhY2sgb2ZmLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvRHVyYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB7QGxpbmsgdG9EYXRlfSB2YWx1ZSBpcyByZWFkIGFzIHRoZSBzaWduZWQgb2Zmc2V0IGZyb20gbm93LCBzb1xuICAgKiBgMjAyNi0wOC0wMmAgYmVjb21lcyBob3dldmVyIGxvbmcgdW50aWwgKG9yIHNpbmNlKSB0aGF0IGluc3RhbnQuIERlZmF1bHRzIHRvXG4gICAqIGB0cnVlYC5cbiAgICpcbiAgICogU2V0IGBmYWxzZWAgd2hlbiBvbmx5IGEgbGVuZ3RoIG9mIHRpbWUgaXMgbWVhbmluZ2Z1bCAtIGEgdGltZW91dCwgYSBwb2xsXG4gICAqIGludGVydmFsLCBhIGNhY2hlIFRUTCAtIGJlY2F1c2UgYSBkYXRlIHdvdWxkIG90aGVyd2lzZSB5aWVsZCBhIHBsYXVzaWJsZSBidXRcbiAgICogd3JvbmcgbnVtYmVyIHRoYXQgYWxzbyBkcmlmdHMgd2l0aCB0aGUgY2xvY2suIEFsc28gd2hhdCB7QGxpbmsgdG9EYXRlfSBwYXNzZXNcbiAgICogd2hlbiBpdCByZWN1cnNlcy5cbiAgICovXG4gIHBhcnNlRGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgZHVyYXRpb24gdG8gTUlMTElTRUNPTkRTLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbid0IGJlXG4gKiBpbnRlcnByZXRlZC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbGVuaWVudCwgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgYXJlIHR5cGVkIGJ5IGhhbmQgaW50byBlbnYgdmFycyxcbiAqIENMSSBmbGFncywgYW5kIGNvbmZpZyBmaWxlczogd2hpdGVzcGFjZSBiZXR3ZWVuIGFtb3VudCBhbmQgdW5pdCBpcyBvcHRpb25hbCBhbmRcbiAqIHVubGltaXRlZCwgdW5pdHMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHBsdXJhbHMgYW5kIHRoZSBjb21tb24gYWJicmV2aWF0aW9ucyBhcmVcbiAqIGVxdWl2YWxlbnQgKGAybXNgID09PSBgMiBtaWxsaXNlY29uZHNgLCBgMWhgID09PSBgMSBocmAgPT09IGAxIEhvdXJgKSwgYGFuZGAgYW5kXG4gKiB0aG91c2FuZHMgc2VwYXJhdG9ycyBhcmUgaWdub3JlZCAoYDEsNTAwIG1zYCwgYDEgaG91ciBhbmQgMzAgbWludXRlc2ApLCBhbmRcbiAqIHRlcm1zIGNvbXBvc2UgKGAxaDMwbWApLiBBIHBsYWluIGBudW1iZXJgIHBhc3NlcyB0aHJvdWdoIGFzIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBTaWducyBhcmUgc3VwcG9ydGVkIHNvIGEgZHVyYXRpb24gY2FuIGV4cHJlc3MgYW4gT0ZGU0VUIHJhdGhlciB0aGFuIG9ubHkgYVxuICogbGVuZ3RoOiBhIGxlYWRpbmcgYC1gIChvciBhIHRyYWlsaW5nIGBhZ29gKSBtYWtlcyB0aGUgcmVzdWx0IG5lZ2F0aXZlLCBhbmQgYW5cbiAqIHVuc2lnbmVkIHRlcm0gaW5oZXJpdHMgdGhlIHByZXZpb3VzIHRlcm0ncyBzaWduLCBzbyBgLTFoMzBtYCBpcyAtOTAgbWludXRlc1xuICogcmF0aGVyIHRoYW4gLTYwICsgMzAuIHtAbGluayB0b0RhdGV9IHVzZXMgdGhhdCB0byB0dXJuIGAtN2RgIC8gYDcgZGF5cyBhZ29gXG4gKiBpbnRvIGFuIGluc3RhbnQgcmVsYXRpdmUgdG8gbm93LlxuICpcbiAqIEFuIFVOS05PV04gdW5pdCBmYWlscyB0aGUgd2hvbGUgcGFyc2UgcmF0aGVyIHRoYW4gYmVpbmcgc2tpcHBlZCAtIGAxIGZvcnRuaWdodGBcbiAqIHJldHVybmluZyBgMWAgc2lsZW50bHkgd291bGQgYmUgd29yc2UgdGhhbiByZXR1cm5pbmcgbm90aGluZyAtIHdoaWNoIGlzIGFsc29cbiAqIHdoYXQga2VlcHMge0BsaW5rIHRvRGF0ZX0gZnJvbSBtaXN0YWtpbmcgYDEgSmFuIDIwMjZgIGZvciBhIGR1cmF0aW9uLlxuICpcbiAqIEEgdmFsdWUgdGhhdCBpcyBub3QgYSBkdXJhdGlvbiBhdCBhbGwgaXMgb2ZmZXJlZCB0byB7QGxpbmsgdG9EYXRlfSBhbmQsIHdoZW4gaXRcbiAqIElTIGEgZGF0ZSwgcmVhZCBhcyB0aGUgc2lnbmVkIG9mZnNldCBmcm9tIG5vdyAoYGRhdGUgLSBub3dgKSwgd2hpY2ggbWFrZXMgdGhlXG4gKiB0d28gZnVuY3Rpb25zIGludmVyc2VzOiBhIHBhc3QgaW5zdGFudCBpcyBuZWdhdGl2ZSwgYSBmdXR1cmUgb25lIHBvc2l0aXZlLlxuICogYG9wdGlvbnMucGFyc2VEYXRlOiBmYWxzZWAgdHVybnMgdGhhdCBvZmYgd2hlbiBvbmx5IGEgbGVuZ3RoIG9mIHRpbWUgbWFrZXNcbiAqIHNlbnNlIC0gc2VlIHtAbGluayBUb0R1cmF0aW9uT3B0aW9uc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvRHVyYXRpb24oXCIzMHNcIik7ICAgICAgICAgICAgICAgICAgICAvLyAzMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIxIGhvdXIgMzAgbWludXRlc1wiKTsgICAgICAvLyA1XzQwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCItNyBkYXlzXCIpOyAgICAgICAgICAgICAgICAvLyAtNjA0XzgwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIyIHdlZWtzIGFnb1wiKTsgICAgICAgICAgICAvLyAtMV8yMDlfNjAwXzAwMFxuICogdG9EdXJhdGlvbihcIjIwMjYtMDgtMDJcIik7ICAgICAgICAgICAgIC8vIG1zIGZyb20gbm93IHRvIHRoYXQgaW5zdGFudFxuICogdG9EdXJhdGlvbihcIjIwMjYtMDgtMDJcIiwgeyBwYXJzZURhdGU6IGZhbHNlIH0pOyAvLyB1bmRlZmluZWRcbiAqIHRvRHVyYXRpb24oXCJzb29uXCIpOyAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRHVyYXRpb24odmFsdWU6IHVua25vd24sIG9wdGlvbnM6IFRvRHVyYXRpb25PcHRpb25zID0ge30pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAvLyBBIGJhcmUgbnVtYmVyIGlzIGFscmVhZHkgbWlsbGlzZWNvbmRzLCB0aGUgc2FtZSByZWFkaW5nIGB0b0RhdGVgIGdpdmVzIGFuXG4gIC8vIGVwb2NoIHZhbHVlLCBzbyB0aGlzIG11c3QgcnVuIGJlZm9yZSBhbnkgZGF0ZSBpbnRlcnByZXRhdGlvbi5cbiAgY29uc3QgbnVtID0gdG9CYXJlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbnVtO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMucGFyc2VEYXRlID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGRhdGVBc0R1cmF0aW9uKHZhbHVlKTtcbiAgfVxuICBsZXQgdGV4dCA9IHZhbHVlXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZUFsbCgvWyxfXS9nLCBcIlwiKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJhbmRcXGIvZywgXCIgXCIpXG4gICAgLnRyaW0oKTtcbiAgbGV0IG5lZ2F0ZSA9IGZhbHNlO1xuICBpZiAodGV4dC5lbmRzV2l0aChcImFnb1wiKSkge1xuICAgIG5lZ2F0ZSA9IHRydWU7XG4gICAgdGV4dCA9IHRleHQuc2xpY2UoMCwgLVwiYWdvXCIubGVuZ3RoKTtcbiAgfVxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eaW5cXGIvLCBcIlwiKS50cmltKCk7XG4gIGlmICghdGV4dCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCB0ZXJtcyA9IFsuLi50ZXh0Lm1hdGNoQWxsKERVUkFUSU9OX1RFUk0pXTtcbiAgaWYgKHRlcm1zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gIH1cblxuICAvLyBFdmVyeXRoaW5nIG91dHNpZGUgdGhlIG1hdGNoZWQgdGVybXMgbXVzdCBiZSBzZXBhcmF0b3JzIG9ubHk7IG90aGVyd2lzZSB0aGVcbiAgLy8gc3RyaW5nIGlzIHNvbWV0aGluZyBlbHNlIHRoYXQgbWVyZWx5IENPTlRBSU5TIGEgZHVyYXRpb24tc2hhcGVkIGZyYWdtZW50LlxuICBsZXQgbGVmdG92ZXIgPSB0ZXh0O1xuICBmb3IgKGNvbnN0IHRlcm0gb2YgdGVybXMpIGxlZnRvdmVyID0gbGVmdG92ZXIucmVwbGFjZSh0ZXJtWzBdLCBcIiBcIik7XG4gIGlmIChsZWZ0b3Zlci50cmltKCkpIHtcbiAgICAvLyBBIGR1cmF0aW9uLXNoYXBlZCBmcmFnbWVudCBpbnNpZGUgb3RoZXIgdGV4dCBpcyB1c3VhbGx5IGEgREFURSAtIGBcIjIwMjYtMDgtMDJcImBcbiAgICAvLyBtYXRjaGVzIHR3byB0ZXJtcyBhbmQgbGVhdmVzIHNlcGFyYXRvcnMgYmVoaW5kLlxuICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gIH1cblxuICBsZXQgdG90YWwgPSAwO1xuICBsZXQgc2lnbiA9IDE7XG4gIGZvciAoY29uc3QgWywgZXhwbGljaXRTaWduLCBhbW91bnQsIHVuaXRdIG9mIHRlcm1zKSB7XG4gICAgaWYgKGV4cGxpY2l0U2lnbikgc2lnbiA9IGV4cGxpY2l0U2lnbiA9PT0gXCItXCIgPyAtMSA6IDE7XG4gICAgY29uc3QgdW5pdE1zID0gRFVSQVRJT05fVU5JVF9NUy5nZXQodW5pdCkgPz8gRFVSQVRJT05fVU5JVF9NUy5nZXQodW5pdC5yZXBsYWNlKC9zJC8sIFwiXCIpKTtcbiAgICBpZiAodW5pdE1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gICAgfVxuICAgIHRvdGFsICs9IHNpZ24gKiBOdW1iZXIoYW1vdW50KSAqIHVuaXRNcztcbiAgfVxuICByZXR1cm4gbmVnYXRlID8gLXRvdGFsIDogdG90YWw7XG59XG5cbi8qKlxuICogQSBkYXRlIHJlYWQgYXMgdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSBub3cgKGBkYXRlIC0gbm93YCksIHdoaWNoIGlzIHdoYXQgbWFrZXNcbiAqIHtAbGluayB0b0R1cmF0aW9ufSBhbmQge0BsaW5rIHRvRGF0ZX0gaW52ZXJzZXMgb2YgZWFjaCBvdGhlci4gUmVjdXJzZXMgd2l0aFxuICogZHVyYXRpb24gcGFyc2luZyBESVNBQkxFRCBzbyB0aGUgdHdvIGNhbm5vdCBoYW5kIGEgdmFsdWUgYmFjayBhbmQgZm9ydGhcbiAqIGZvcmV2ZXIuXG4gKi9cbmZ1bmN0aW9uIGRhdGVBc0R1cmF0aW9uKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGF0ZSA9IHRvRGF0ZSh2YWx1ZSwgeyBwYXJzZUR1cmF0aW9uOiBmYWxzZSB9KTtcbiAgcmV0dXJuIGRhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGRhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYSBsb29zZSBkYXRlLWlzaCB2YWx1ZSB0byBhIHJlYWwgYERhdGVgLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbid0IGJlXG4gKiBpbnRlcnByZXRlZC4gQWNjZXB0cywgaW4gdGhpcyBvcmRlcjpcbiAqXG4gKiAgIC0gYSBgRGF0ZWAgKHBhc3NlZCB0aHJvdWdoOyBhbiBpbnZhbGlkIG9uZSBpcyBhIG1pc3MpO1xuICogICAtIGFuIGVwb2NoIE5VTUJFUiBvciBudW1lcmljIHN0cmluZywgaW4gc2Vjb25kcyBvciBtaWxsaXNlY29uZHMgKHNlZVxuICogICAgIHtAbGluayBTRUNPTkRTX0NFSUxJTkd9KTtcbiAqICAgLSBgbm93YCAoYW5kIGl0cyBgdG9kYXlgIHNwZWxsaW5nKSwgZm9yIHRoZSBjdXJyZW50IGluc3RhbnQ7XG4gKiAgIC0gYSB7QGxpbmsgdG9EdXJhdGlvbn0gZXhwcmVzc2lvbiwgcmVzb2x2ZWQgUkVMQVRJVkUgVE8gTk9XLCBzbyBgLTdkYCxcbiAqICAgICBgNyBkYXlzIGFnb2AsIGFuZCBgaW4gMzAgbWludXRlc2AgYXJlIGFsbCB2YWxpZCBpbnN0YW50cztcbiAqICAgLSBhbnl0aGluZyBgRGF0ZS5wYXJzZWAgdW5kZXJzdGFuZHMgKGAyMDI2LTA4LTAyYCwgYW4gSVNPL1VUQyBpbnN0YW50KS5cbiAqXG4gKiBUaGUgZXBvY2ggdW5pdCBpbmZlcmVuY2UgaXMgdGhlIHJlYXNvbiB0aGlzIGV4aXN0cyByYXRoZXIgdGhhblxuICogYG5ldyBEYXRlKHZhbHVlKWA6IGEgYmFyZSBlcG9jaCBhcnJpdmVzIGFzIGEgU1RSSU5HIGZyb20gYW4gZW52IHZhciBvciBhIENMSVxuICogZmxhZyBhcyBvZnRlbiBhcyBpdCBhcnJpdmVzIGFzIGEgbnVtYmVyIChgZGF0ZSArJXNgLCBhIEpTT04gZmllbGQsIGEgY29waWVkIGxvZ1xuICogbGluZSksIGFuZCBgRGF0ZS5wYXJzZShcIjE3ODU2OTc4OTlcIilgIHJlYWRzIHRoYXQgYXMgYSBZRUFSLCBzaWxlbnRseSBsYW5kaW5nXG4gKiAxLjcgYmlsbGlvbiB5ZWFycyBvdXQuIE51bWVyaWMgc3RyaW5ncyBhcmUgdGhlcmVmb3JlIHJvdXRlZCB0byB0aGUgZXBvY2ggcGF0aCxcbiAqIG5ldmVyIHRvIGBEYXRlLnBhcnNlYC5cbiAqXG4gKiBUaGUgZHVyYXRpb24gZmFsbGJhY2sgcnVucyBMQVNULCBhZnRlciBgRGF0ZS5wYXJzZWAsIHNvIGEgcmVhbCBkYXRlIGlzIG5ldmVyXG4gKiBtaXN0YWtlbiBmb3IgYW4gb2Zmc2V0LiBgb3B0aW9ucy5wYXJzZUR1cmF0aW9uOiBmYWxzZWAgcmVtb3ZlcyBpdCBlbnRpcmVseSB3aGVuXG4gKiB0aGUgdmFsdWUgbXVzdCBiZSBhbiBhYnNvbHV0ZSBpbnN0YW50IC0gc2VlIHtAbGluayBUb0RhdGVPcHRpb25zfS5cbiAqXG4gKiBMaWtlIHtAbGluayB0b0Jvb2xlYW59IHRoaXMgTkVWRVIgdGhyb3dzIGFuZCByZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhbnl0aGluZ1xuICogdW5pbnRlcnByZXRhYmxlLCBzbyBhIGNhbGxlciBkZWNpZGVzIHdoZXRoZXIgYSBiYWQgdmFsdWUgaXMgZmF0YWwsIGEgd2FybmluZyxcbiAqIG9yIGEgZmFsbGJhY2suXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvRGF0ZShcIm5vd1wiKTsgICAgICAgICAgICAgICAvLyB0aGlzIGluc3RhbnRcbiAqIHRvRGF0ZShcIjIwMjYtMDgtMDJcIik7ICAgICAgICAvLyAyMDI2LTA4LTAyVDAwOjAwOjAwLjAwMFpcbiAqIHRvRGF0ZShcIjE3ODU2OTc4OTlcIik7ICAgICAgICAvLyBzZWNvbmRzIC0+IDIwMjYtMDgtMDJULi4uXG4gKiB0b0RhdGUoMTc4NTY5Nzg5OTAwMCk7ICAgICAgIC8vIG1pbGxpcyAgLT4gdGhlIHNhbWUgaW5zdGFudFxuICogdG9EYXRlKFwiMzAgZGF5cyBhZ29cIik7ICAgICAgIC8vIG5vdyAtIDMwZFxuICogdG9EYXRlKFwiMzAgZGF5cyBhZ29cIiwgeyBwYXJzZUR1cmF0aW9uOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKiB0b0RhdGUoXCJub3BlXCIpOyAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0RhdGUodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IFRvRGF0ZU9wdGlvbnMgPSB7fSk6IERhdGUgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gIH1cblxuICBjb25zdCBlcG9jaE1zID0gdG9FcG9jaE1zKHZhbHVlKTtcbiAgaWYgKGVwb2NoTXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGZyb21NcyhlcG9jaE1zKTtcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHRleHQgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHRleHQgPT09IFwibm93XCIgfHwgdGV4dCA9PT0gXCJ0b2RheVwiKSByZXR1cm4gbmV3IERhdGUoKTtcblxuICBjb25zdCBwYXJzZWQgPSBEYXRlLnBhcnNlKHZhbHVlLnRyaW0oKSk7XG4gIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZCkpIHJldHVybiBuZXcgRGF0ZShwYXJzZWQpO1xuXG4gIGlmIChvcHRpb25zLnBhcnNlRHVyYXRpb24gPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBSZWN1cnNlcyB3aXRoIGRhdGUgcGFyc2luZyBESVNBQkxFRCBzbyB0aGUgdHdvIGNhbm5vdCBoYW5kIGEgdmFsdWUgYmFjayBhbmRcbiAgLy8gZm9ydGggZm9yZXZlci5cbiAgY29uc3Qgb2Zmc2V0TXMgPSB0b0R1cmF0aW9uKHZhbHVlLCB7IHBhcnNlRGF0ZTogZmFsc2UgfSk7XG4gIHJldHVybiBvZmZzZXRNcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZnJvbU1zKERhdGUubm93KCkgKyBvZmZzZXRNcyk7XG59XG5cbi8qKiBBIGBEYXRlYCBmb3IgZXBvY2ggYG1zYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBvdXQgb2YgcmVwcmVzZW50YWJsZSByYW5nZS4gKi9cbmZ1bmN0aW9uIGZyb21NcyhtczogbnVtYmVyKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShtcyk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogZGF0ZTtcbn1cblxuLyoqXG4gKiBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIGEgbnVtZXJpYyB2YWx1ZS9zdHJpbmcsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IG9uZSxcbiAqIGFwcGx5aW5nIHRoZSBzZWNvbmRzLXZzLW1pbGxpcyBpbmZlcmVuY2UgYXQge0BsaW5rIFNFQ09ORFNfQ0VJTElOR30uXG4gKi9cbmZ1bmN0aW9uIHRvRXBvY2hNcyh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG51bWVyaWMgPSB0b0JhcmVOdW1iZXIodmFsdWUpO1xuICBpZiAobnVtZXJpYyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5hYnMobnVtZXJpYykgPCBTRUNPTkRTX0NFSUxJTkcgPyBudW1lcmljICogMTAwMCA6IG51bWVyaWM7XG59XG5cbi8qKlxuICogU3RydWN0dXJhbCBkZWVwLWVxdWFsaXR5IHdpdGggYW4gb3B0aW9uYWwgY3VzdG9tIGNvbXBhcmF0b3IuXG4gKlxuICoge0BsaW5rIGRlZXBFcXVhbH0gbWlycm9ycyB0aGUgc2VtYW50aWNzIG9mIHRoZSBgZmFzdC1kZWVwLWVxdWFsYFxuICogcGFja2FnZSAoaGFuZGxlZDogbmVzdGVkIHBsYWluIG9iamVjdHMvYXJyYXlzLCBgTWFwYCwgYFNldGAsIGBEYXRlYCxcbiAqIGBSZWdFeHBgLCB0eXBlZCBhcnJheXMsIGBOYU5gLCBhbmQgYCswYC9gLTBgIHRyZWF0ZWQgYXMgZXF1YWwpIGJ1dCBpc1xuICogZGVwZW5kZW5jeS1mcmVlIHNvIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCBrZWVwcyBubyBydW50aW1lIGRlcHMuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBjb21wYXJhdG9yYCBzaG9ydC1jaXJjdWl0cyB0aGUgc3RydWN0dXJhbCB3YWxrIGF0IGFueVxuICogbm9kZTogcmV0dXJuIGB0cnVlYC9gZmFsc2VgIHRvIGZvcmNlIHRoZSByZXN1bHQgZm9yIHRoYXQgcGFpciwgb3JcbiAqIGB1bmRlZmluZWRgIHRvIGRlZmVyIHRvIHRoZSBidWlsdC1pbiBjb21wYXJpc29uLiBJdCBpcyBpbnZva2VkIGZvciB0aGVcbiAqIHJvb3QgcGFpciBhbmQgcmVjdXJzaXZlbHkgZm9yIGVhY2ggbmVzdGVkIHBhaXIsIHNvIGEgY2FsbGVyIGNhbiwgZS5nLixcbiAqIGNvbXBhcmUgdHdvIGRvbWFpbiBvYmplY3RzIGJ5IGlkIHdoaWxlIGxldHRpbmcgZXZlcnl0aGluZyBlbHNlIGZhbGxcbiAqIGJhY2sgdG8gc3RydWN0dXJhbCBlcXVhbGl0eS5cbiAqXG4gKiBAZXhhbXBsZVxuICogZGVlcEVxdWFsKHsgYTogMSB9LCB7IGE6IDEgfSk7ICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBkZWVwRXF1YWwoWzEsIDJdLCBbMSwgMl0pOyAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBkZWVwRXF1YWwoYSwgYiwgKHgsIHkpID0+XG4gKiAgIGlzRW50aXR5KHgpICYmIGlzRW50aXR5KHkpID8geC5pZCA9PT0geS5pZCA6IHVuZGVmaW5lZCk7XG4gKi9cbmV4cG9ydCB0eXBlIERlZXBFcXVhbENvbXBhcmF0b3IgPSAoYTogdW5rbm93biwgYjogdW5rbm93bikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChhOiB1bmtub3duLCBiOiB1bmtub3duLCBjb21wYXJhdG9yPzogRGVlcEVxdWFsQ29tcGFyYXRvcik6IGJvb2xlYW4ge1xuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGNvbnN0IGRlY2lkZWQgPSBjb21wYXJhdG9yKGEsIGIpO1xuICAgIGlmIChkZWNpZGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWNpZGVkO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiB8fCBhID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiIHx8IGIgPT09IG51bGwpIHtcbiAgICAvLyBOYU4gaXMgdGhlIG9ubHkgdmFsdWUgbm90IGVxdWFsIHRvIGl0c2VsZiB1bmRlciBgPT09YC5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG5cbiAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd25bXTtcbiAgICBpZiAoYS5sZW5ndGggIT09IGJBcnIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiQXJyW2ldLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgYk1hcCA9IGIgYXMgTWFwPHVua25vd24sIHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJNYXAuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICAgIGlmICghYk1hcC5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFkZWVwRXF1YWwodmFsdWUsIGJNYXAuZ2V0KGtleSksIGNvbXBhcmF0b3IpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBiU2V0ID0gYiBhcyBTZXQ8dW5rbm93bj47XG4gICAgaWYgKGEuc2l6ZSAhPT0gYlNldC5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhKSB7XG4gICAgICBpZiAoIWJTZXQuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gKGIgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICBjb25zdCBiUmUgPSBiIGFzIFJlZ0V4cDtcbiAgICByZXR1cm4gYS5zb3VyY2UgPT09IGJSZS5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYlJlLmZsYWdzO1xuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiAhKGEgaW5zdGFuY2VvZiBEYXRhVmlldykpIHtcbiAgICBjb25zdCBhQXJyID0gYSBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd24gYXMgQXJyYXlMaWtlPG51bWJlcj47XG4gICAgaWYgKGFBcnIubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFBcnJbaV0gIT09IGJBcnJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgYUtleXMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgIWRlZXBFcXVhbChcbiAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgIChiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICBjb21wYXJhdG9yLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
|
|
1183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUEyQkgsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxXQUFXLENBQWMsS0FBbUI7SUFDMUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBY0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFjLEtBQWM7SUFDdEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxHQUFHLElBQUksS0FBSyxZQUFZLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixVQUF5RCxFQUN6RCxPQUFpQztJQUVqQyxTQUFTLEtBQUssQ0FBQyxLQUFjLEVBQUUsSUFBbUI7UUFDaEQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FB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QUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2hFLElBQ0UsQ0FBQyxTQUFTLENBQ1AsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbEMsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbkMsVUFBVSxDQUNYLEVBQ0QsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlcGVuZGVuY3ktZnJlZSBvYmplY3QgKyBpdGVyYWJsZSB1dGlsaXRpZXMuXG4gKlxuICogVmFsdWUgZ3VhcmRzIC8gY29lcmNpb25zIC8gc2hhcGUgdHlwZXM6IHtAbGluayBpc1JlY29yZH0gbmFycm93cyBwYXJzZWQgSlNPTlxuICogdG8gYSByZWNvcmQsIHtAbGluayB0b051bWJlcn0gY29lcmNlcyBhIGhhbmQtdHlwZWQgbnVtZXJhbCwge0BsaW5rIHRvQm9vbGVhbn1cbiAqIGNvZXJjZXMgbG9vc2UgdHJ1dGh5L2ZhbHN5IHZhbHVlcywge0BsaW5rIHRvRHVyYXRpb259IHBhcnNlcyBgMWgzMG1gIC9cbiAqIGAyIG1pbGxpc2Vjb25kc2AgdG8gbWlsbGlzLCB7QGxpbmsgdG9EYXRlfSBjb2VyY2VzIGEgZGF0ZS9JU08gc3RyaW5nL2Vwb2NoXG4gKiBudW1iZXIvcmVsYXRpdmUgZHVyYXRpb24gKGB0b0RhdGVgIGFuZCBgdG9EdXJhdGlvbmAgZmFsbCBiYWNrIHRvIGVhY2ggb3RoZXIsIHNvXG4gKiBlaXRoZXIgYWNjZXB0cyBib3RoIHJlYWRpbmdzKSwge0BsaW5rIG9wdGlvbmFsfVxuICogc3ByZWFkcyBhIGZpZWxkIG9ubHkgd2hlbiBpdCBpcyBwcmVzZW50LCB7QGxpbmsgZGVlcEVxdWFsfSBjb21wYXJlc1xuICogc3RydWN0dXJhbGx5LCB7QGxpbmsgaXNTZXJpYWxpemFibGVWYWx1ZX0gcmVqZWN0cyBhbnl0aGluZyBhIEpTT04gcm91bmQgdHJpcFxuICogd291bGQgbG9zZSBvciBjb2VyY2UsIHtAbGluayB0b1N0YWJsZUtleX0gY2Fub25pY2FsaXplcyBhIHZhbHVlIHNvIGFuIGlkZW50aXR5XG4gKiBjYW4gYmUgZGVyaXZlZCBmcm9tIGl0LCBhbmQge0BsaW5rIE5hbWVMaWtlfS97QGxpbmsgTm9uRnVuY3Rpb25LZXlzfSBkZXNjcmliZVxuICogb2JqZWN0IHNoYXBlcy5cbiAqXG4gKiBJdGVyYWJsZSBoZWxwZXJzOiB7QGxpbmsgZ2VuZXJhdG9yfSBmbGF0dGVucyBtaXhlZCBhcmd1bWVudHM7IHtAbGluayBzZXF1ZW5jZX1cbiAqIHdyYXBzIHNvdXJjZShzKSBpbiBhIGxhenksIGBBcnJheWAtY29tcGF0aWJsZSB7QGxpbmsgU2VxdWVuY2V9LiBFdmVyeVxuICogdHJhbnNmb3JtL3Rlcm1pbmFsIGlzIGEgc3RhbmRhbG9uZSBmdW5jdGlvbiBvcGVyYXRpbmcgb24gcGxhaW4ge0BsaW5rXG4gKiBDb250YWluZXJ9cyAoc2VlIHtAbGluayBtYXB9LCB7QGxpbmsgZmlsdGVyfSwge0BsaW5rIGdyb3VwfSwgLi4uKTsgdGhlIHtAbGlua1xuICogU2VxdWVuY2V9IG1ldGhvZHMgYXJlIHRoaW4gZm9yd2FyZGVycyBvdmVyIHRoZW0gc28gdGhlIHNhbWUgbG9naWMgYmFja3MgYm90aFxuICogdGhlIGZyZWUtZnVuY3Rpb24gYW5kIHRoZSBmbHVlbnQvY2hhaW5lZCBzdHlsZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKiBMYXp5IHNlcXVlbmNlIG92ZXIgaXRlcmFibGUgc291cmNlKHMpLiBTZWUge0BsaW5rIHNlcXVlbmNlfS4gKi9cbmV4cG9ydCB0eXBlIFNlcXVlbmNlPFQ+ID0gU2VxdWVuY2VJbXBsPFQ+O1xuXG50eXBlIFNlcXVlbmNlU291cmNlPFQ+ID1cbiAgSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPiB8IE9uZU9yTWFueTxUPiB8IEV4dHJhY3Q8VCwgc3RyaW5nPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBub24tc2NhbGFyIHtAbGluayBJdGVyYWJsZX0gLSBvbmUgdG8gdHJlYXQgYXMgYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzXG4gKiByYXRoZXIgdGhhbiBhIHNjYWxhci4ge0BsaW5rIGlzQ29udGFpbmVyfSBuYXJyb3dzIHRvIHRoaXMsIGV4Y2x1ZGluZyBzdHJpbmdzLFxuICogYFN0cmluZ2AvYFJlZ0V4cGAgb2JqZWN0cywgYW5kIGZ1bmN0aW9ucy4ge0BsaW5rIENvbGxlY3Rpb259IGlzIHRoZSBlYWdlcmx5LVxuICogc2l6ZWQgc3Vic2V0LiBUaGUgZWxlbWVudCBkZWZhdWx0cyB0byBgdW5rbm93bmAgc28gYW55IGBDb2xsZWN0aW9uYCBpc1xuICogYXNzaWduYWJsZSB0byBhIGJhcmUgYENvbnRhaW5lcmAuXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRhaW5lcjxUID0gdW5rbm93bj4gPSBJdGVyYWJsZTxUPjtcblxuLyoqXG4gKiBBIGJ1aWx0LWluLCBlYWdlcmx5LXNpemVkIHtAbGluayBDb250YWluZXJ9OiBhbiB7QGxpbmsgQXJyYXl9LCB7QGxpbmsgU2V0fSwgb3JcbiAqIHtAbGluayBNYXB9ICh3aG9zZSAqdmFsdWVzKiBhcmUgYFRgIC0gYSBNYXAgaXRlcmF0ZXMgYFtrZXksIHZhbHVlXWAgZW50cmllcyxcbiAqIHNvIGl0cyBlbGVtZW50IHR5cGUgZGlmZmVycywgYnV0IGl0cyB2YWx1ZSB0eXBlIGlzIGBUYCkuIEFsbCBzaGFyZSBhIGNoZWFwXG4gKiBlbXB0aW5lc3MgY2hlY2sgKHtAbGluayBpc0VtcHR5fSkuXG4gKi9cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb248VD4gPSBSZWFkb25seUFycmF5PFQ+IHwgUmVhZG9ubHlTZXQ8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPjtcblxuZXhwb3J0IHR5cGUgT25lT3JNYW55PFQ+ID0gW1QsIC4uLlRbXV07XG5cbi8qKiBOYXJyb3cgYSByZWFkb25seSBhcnJheSB0byBhIG5vbi1lbXB0eSB7QGxpbmsgT25lT3JNYW55fSB0dXBsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09uZU9yTWFueTxUID0gdW5rbm93bj4odmFsdWU6IHJlYWRvbmx5IFRbXSk6IHZhbHVlIGlzIE9uZU9yTWFueTxUPiB7XG4gIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwO1xufVxuXG4vKiogQSBzb3VyY2UgYWNjZXB0ZWQgYnkgYSB2YXJpYWRpYyBvcDogYSB7QGxpbmsgQ29udGFpbmVyfSBvZiBgVGAsIG9yIG5vdGhpbmcuICovXG50eXBlIFNvdXJjZTxUPiA9IENvbnRhaW5lcjxUPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRWxlbWVudCB0eXBlIG9mIGEge0BsaW5rIGdyb3VwfSBidWNrZXQgYXJyYXk6IHdoZW4gdGhlIHByZWRpY2F0ZSBgUGAgaXMgYSB0eXBlXG4gKiBndWFyZCAoYHZhbHVlIGlzIFNgKSwgdGhlIGJ1Y2tldCBpcyBuYXJyb3dlZCB0byBgUyAmIFRgOyBvdGhlcndpc2UgaXQgc3RheXMgYFRgLlxuICovXG50eXBlIEdyb3VwVmFsdWU8VCwgUD4gPSBQIGV4dGVuZHMgKHZhbHVlOiBhbnksIC4uLnJlc3Q6IGFueVtdKSA9PiB2YWx1ZSBpcyBpbmZlciBTID8gUyAmIFQgOiBUO1xuXG4vKiogQSBtYXAgb2YgZ3JvdXAgbmFtZSAtPiBwcmVkaWNhdGUsIGFzIGFjY2VwdGVkIGJ5IHtAbGluayBncm91cH0uICovXG50eXBlIEdyb3VwUHJlZGljYXRlczxUPiA9IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbj47XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYSB7QGxpbmsgQ29sbGVjdGlvbn06IGFuIHtAbGluayBBcnJheX0sIHtAbGluayBTZXR9LCBvclxuICoge0BsaW5rIE1hcH0uIE5hcnJvd3MgYHZhbHVlYCBzbyBpdHMgZWxlbWVudC92YWx1ZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYFRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgKG9yIE1hcCB2YWx1ZSkgdHlwZSBhc3NlcnRlZCBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMgYHRydWVgIChuYXJyb3dpbmcgYHZhbHVlYCB0byB7QGxpbmsgQ29sbGVjdGlvbn08YFRgPikgZm9yIGFcbiAqICAgYnVpbHQtaW4gYXJyYXkvc2V0L21hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sbGVjdGlvbjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb2xsZWN0aW9uPFQ+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0IHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwO1xufVxuXG4vKipcbiAqIGB0cnVlYCB3aGVuIGEge0BsaW5rIENvbGxlY3Rpb259IGhhcyBubyBlbGVtZW50cy4gVXNlcyBgbGVuZ3RoYCBmb3IgYXJyYXlzXG4gKiBhbmQgYHNpemVgIGZvciB7QGxpbmsgU2V0fS97QGxpbmsgTWFwfS5cbiAqXG4gKiBAcGFyYW0gY29sbGVjdGlvbiAtIFRoZSBhcnJheSwgc2V0LCBvciBtYXAgdG8gdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb248dW5rbm93bj4gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9LFxuKTogYm9vbGVhbiB7XG4gIGZ1bmN0aW9uIHZpc2l0KHZhbHVlOiB1bmtub3duLCBzZWVuPzogU2V0PHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoc2Vlbj8uaGFzKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgICBzZWVuPy5hZGQodmFsdWUpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPT09IDAgfHwgKHNlZW4gPyB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zaXplID09PSAwIHx8IChzZWVuID8gWy4uLnZhbHVlXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdmFsdWUuc2l6ZSA9PT0gMCB8fFxuICAgICAgICAgIChzZWVuID8gWy4uLnZhbHVlLnZhbHVlcygpXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChzZWVuKSB7XG4gICAgICAgIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+IHZpc2l0KCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSwgc2VlbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB2aXNpdChjb2xsZWN0aW9uLCBvcHRpb25zPy5yZWN1cnNpdmUgPyBuZXcgU2V0KCkgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzb3VyY2UgdG8gYW4gaXRlcmFibGUgb2YgaXRzIGBUYCB2YWx1ZXMsIHNvIE1hcHMgYXJlIHRyZWF0ZWRcbiAqIHVuaWZvcm1seSB3aXRoIGFycmF5cy9zZXRzOiBhIHtAbGluayBNYXB9IHlpZWxkcyBpdHMgKnZhbHVlcyogKG1hdGNoaW5nXG4gKiB7QGxpbmsgQ29sbGVjdGlvbn0ncyB2YWx1ZS10eXBlZCBgVGApLCBhbnkgb3RoZXIgaXRlcmFibGUgeWllbGRzIGl0c2VsZi4gVGhpc1xuICogaXMgd2hhdCB7QGxpbmsgc2VxdWVuY2V9IGNvbnN1bWVzLCBzbyBhIGBNYXBgIGNvbnRyaWJ1dGVzIHZhbHVlcyBldmVyeXdoZXJlXG4gKiByYXRoZXIgdGhhbiBgW2tleSwgdmFsdWVdYCBlbnRyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVzPFQ+KHNvdXJjZTogSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPik6IEl0ZXJhYmxlPFQ+IHtcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIE1hcCA/IHNvdXJjZS52YWx1ZXMoKSA6IChzb3VyY2UgYXMgSXRlcmFibGU8VD4pO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIGEge0BsaW5rIENvbnRhaW5lcn0gLSBhbiBpdGVyYWJsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29sbGVjdGlvblxuICogcmF0aGVyIHRoYW4gYSBzY2FsYXIuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGV4Y2x1ZGVzIHZhbHVlcyB0aGF0IGFyZSB0ZWNobmljYWxseSBpdGVyYWJsZSBidXQgc2hvdWxkIGJlXG4gKiB0cmVhdGVkIGFzIHNjYWxhcnMgaGVyZSAtIHN0cmluZ3MsIGBTdHJpbmdgL2BSZWdFeHBgIG9iamVjdHMsIGFuZCBmdW5jdGlvbnMgLVxuICogc28gYSBsb25lIHN0cmluZyBpcyBuZXZlciBzcHJlYWQgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rlci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgYXNzZXJ0ZWQgZm9yIHRoZSBpdGVyYWJsZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgKG5hcnJvd2luZyBgdmFsdWVgIHRvIHtAbGluayBDb250YWluZXJ9PGBUYD4pIGZvciBhIG5vbi1zdHJpbmdcbiAqICAgaXRlcmFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRhaW5lcjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb250YWluZXI8VD4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiZcbiAgICAhKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSAmJlxuICAgICEodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApICYmXG4gICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgW1N5bWJvbC5pdGVyYXRvcl0/OiB1bmtub3duIH0pW1N5bWJvbC5pdGVyYXRvcl0gPT09IFwiZnVuY3Rpb25cIlxuICApO1xufVxuXG5mdW5jdGlvbiBzZXF1ZW5jZVNvdXJjZXM8VD4oLi4uc291cmNlczogU2VxdWVuY2VTb3VyY2U8VD5bXSk6IEl0ZXJhYmxlPFQ+W10ge1xuICBjb25zdCBzb3VyY2VJdGVyYWJsZXM6IEl0ZXJhYmxlPFQ+W10gPSBbXTtcbiAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fCAoaXNDb2xsZWN0aW9uKHNvdXJjZSkgJiYgaXNFbXB0eShzb3VyY2UpKSkgY29udGludWU7XG4gICAgc291cmNlSXRlcmFibGVzLnB1c2goaXNDb250YWluZXI8VD4oc291cmNlKSA/IHZhbHVlcyhzb3VyY2UpIDogW3NvdXJjZSBhcyBUXSk7XG4gIH1cbiAgcmV0dXJuIHNvdXJjZUl0ZXJhYmxlcztcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBuZXN0ZWQgYXJyYXlzIGZvciB7QGxpbmsgZmxhdH0uIE5vbi1hcnJheSB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgYVxuICogc2luZ2xlLWVsZW1lbnQgaXRlcmFibGU7IGRlcHRoIGRlY3JlbWVudHMgcGVyIGFycmF5IGxldmVsLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuVmFsdWUodmFsdWU6IHVua25vd24sIGRlcHRoOiBudW1iZXIpOiBJdGVyYWJsZTx1bmtub3duPiB7XG4gIGlmIChkZXB0aCA+IDAgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBuZXh0RGVwdGggPSBOdW1iZXIuaXNGaW5pdGUoZGVwdGgpID8gZGVwdGggLSAxIDogZGVwdGg7XG4gICAgcmV0dXJuIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB5aWVsZCogZmxhdHRlblZhbHVlKGl0ZW0sIG5leHREZXB0aCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIFt2YWx1ZV07XG59XG5cbi8qKiBXcmFwIGEgcGVyLWVsZW1lbnQgdHJhbnNmb3JtIChlYWNoIGVsZW1lbnQgLT4gYW4gaXRlcmFibGUpIGFzIGEgbGF6eSB7QGxpbmsgU2VxdWVuY2V9LiAqL1xuZnVuY3Rpb24gZGVyaXZlPFQsIFU+KFxuICBzb3VyY2U6IEl0ZXJhYmxlPFQ+LFxuICBmbjogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBJdGVyYWJsZTxVPixcbik6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHlpZWxkKiBmbih2YWx1ZSwgaW5kZXgrKyk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKiBMaWtlIHtAbGluayBkZXJpdmV9LCBidXQgeWllbGRzIG9uZSB2YWx1ZSBwZXIgc291cmNlIGVsZW1lbnQgKG5vIHdyYXBwZXIgaXRlcmFibGUpLiAqL1xuZnVuY3Rpb24gZGVyaXZlT25lPFQsIFU+KHNvdXJjZTogSXRlcmFibGU8VD4sIGZuOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc291cmNlKSB5aWVsZCBmbih2YWx1ZSwgaW5kZXgrKyk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5tYXBgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY29udGFpbmVyIHRvIG1hcCAobnVsbGlzaCB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UpLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGVkIHBlciBlbGVtZW50IHdpdGggaXRzIGluZGV4OyBpdHMgcmVzdWx0IGlzIGVtaXR0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXA8VCwgVT4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVLFxuKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gZGVyaXZlT25lKHNlcXVlbmNlKHNvdXJjZSksIGNhbGxiYWNrKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBBIHR5cGUtZ3VhcmQgcHJlZGljYXRlIG5hcnJvd3MgdGhlIHJlc3VsdGluZyBlbGVtZW50IHR5cGUuXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjb250YWluZXIgdG8gZmlsdGVyIChudWxsaXNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSkuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gS2VlcHMgZWxlbWVudHMgZm9yIHdoaWNoIGl0IHJldHVybnMgYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogU2VxdWVuY2U8Uz47XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBTZXF1ZW5jZTxUPjtcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFNlcXVlbmNlPFQ+IHtcbiAgcmV0dXJuIGRlcml2ZShzZXF1ZW5jZShzb3VyY2UpLCBmdW5jdGlvbiogKHZhbHVlLCBpbmRleCkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgeWllbGQgdmFsdWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlcyB0aGUgc291cmNlcyBhbmQgeWllbGRzIG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgbm90IGBudWxsYCBvclxuICogYHVuZGVmaW5lZGAsIG5hcnJvd2luZyB0aGUgZWxlbWVudCB0eXBlIHRvIHtAbGluayBOb25OdWxsYWJsZX08YFRgPi5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub25OdWxsPFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8Tm9uTnVsbGFibGU8VD4+IHtcbiAgcmV0dXJuIGZpbHRlcihzZXF1ZW5jZSguLi5zb3VyY2VzKSwgKHZhbHVlKTogdmFsdWUgaXMgTm9uTnVsbGFibGU8VD4gPT4gdmFsdWUgIT0gbnVsbCk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mbGF0TWFwYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGNvbnRhaW5lciB0byBtYXAgKG51bGxpc2ggeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlKS5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFJldHVybnMgYSB2YWx1ZSBvciBhcnJheSBvZiB2YWx1ZXMsIGZsYXR0ZW5lZCBvbmUgbGV2ZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0TWFwPFQsIFU+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSB8IFJlYWRvbmx5QXJyYXk8VT4sXG4pOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBkZXJpdmUoc2VxdWVuY2Uoc291cmNlKSwgZnVuY3Rpb24qICh2YWx1ZSwgaW5kZXgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHlpZWxkKiByZXN1bHQ7XG4gICAgZWxzZSB5aWVsZCByZXN1bHQgYXMgVTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mbGF0YCAoYXJyYXlzIG9ubHkpLiBgZGVwdGhgIGxlYWRzIHNvIHRoZVxuICogc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYzsgdXNlIGBkZXB0aCA8IDFgIGZvciBhIG5vLW9wIHBhc3N0aHJvdWdoLlxuICpcbiAqIEBwYXJhbSBkZXB0aCAtIEhvdyBtYW55IGFycmF5IGxldmVscyB0byBmbGF0dGVuLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlLCB0aGVuIGZsYXR0ZW4gKG51bGxpc2ggc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0PFQ+KGRlcHRoOiBudW1iZXIsIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgaWYgKGRlcHRoIDwgMSkgcmV0dXJuIHNyYztcbiAgcmV0dXJuIGRlcml2ZShzcmMsICh2YWx1ZSkgPT4gZmxhdHRlblZhbHVlKHZhbHVlLCBkZXB0aCkpIGFzIFNlcXVlbmNlPFQ+O1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlcyB0aGUgc291cmNlcywgdGhlbiBsYXppbHkgeWllbGRzIHZhbHVlcyBpbiBlbmNvdW50ZXIgb3JkZXIsXG4gKiBza2lwcGluZyBhIHZhbHVlIG9ubHkgd2hlbiBhbiBlcXVhbCBvbmUgd2FzIGFscmVhZHkgeWllbGRlZCAoYFNldGAgL1xuICogU2FtZVZhbHVlWmVybykuIFVuaXF1ZW5lc3MgaXMgY2hlY2tlZCBwZXIgZWxlbWVudCBhcyBpdCBpcyBjb25zdW1lZC5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0aW5jdDxUPiguLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8VD4oKTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFlpZWxkcyBgc291cmNlYCwgdGhlbiBlYWNoIGFwcGVuZGVkIGBpdGVtYCBpbiBvcmRlciAoYXJyYXlzIHNwcmVhZCBvbmUgbGV2ZWwpLFxuICogbWlycm9yaW5nIGBBcnJheS5wcm90b3R5cGUuY29uY2F0YC4gYGl0ZW1zYCBhcmUgc2NhbGFyIHZhbHVlcy9hcnJheXMsIG5vdFxuICogY29udGFpbmVycywgc28gYHNvdXJjZWAgc3RheXMgYSBzaW5nbGUgbGVhZGluZyBhcmd1bWVudC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGxlYWRpbmcgY29udGFpbmVyIChudWxsaXNoIHlpZWxkcyBqdXN0IHRoZSBpdGVtcykuXG4gKiBAcGFyYW0gaXRlbXMgLSBWYWx1ZXMgKG9yIGFycmF5cyBvZiB2YWx1ZXMpIGFwcGVuZGVkIGFmdGVyIHRoZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQ8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICAuLi5pdGVtczogcmVhZG9ubHkgKFQgfCBSZWFkb25seUFycmF5PFQ+KVtdXG4pOiBTZXF1ZW5jZTxUPiB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKHNvdXJjZSk7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHJldHVybiBzcmM7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgeWllbGQqIHNyYztcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkgeWllbGQqIGl0ZW07XG4gICAgICAgIGVsc2UgeWllbGQgaXRlbSBhcyBUO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFlpZWxkcyBhdCBtb3N0IGBjb3VudGAgZWxlbWVudHMgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzLlxuICogYGNvdW50YCBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAcGFyYW0gY291bnQgLSBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byB5aWVsZCAoYDw9IDBgIHlpZWxkcyBub25lKS5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRha2U8VD4oY291bnQ6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIGlmIChjb3VudCA8PSAwKSByZXR1cm4gZW1wdHlTZXF1ZW5jZSBhcyBTZXF1ZW5jZTxUPjtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgbGV0IHRha2VuID0gMDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgICBpZiAoKyt0YWtlbiA+PSBjb3VudCkgcmV0dXJuO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0cyB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMgaW50byBvbmUgYXJyYXkgcGVyIG5hbWVkIHByZWRpY2F0ZS4gQ29uc3VtZXNcbiAqIHRoZSBpbnB1dCBvbmNlLCByb3V0aW5nIGVhY2ggZWxlbWVudCB0byB0aGUgRklSU1QgcHJlZGljYXRlIGl0IHNhdGlzZmllcyAoc29cbiAqIGdyb3VwcyBhcmUgZGlzam9pbnQpOyBlbGVtZW50cyBtYXRjaGluZyBubyBwcmVkaWNhdGUgYXJlIGRyb3BwZWQuIFR5cGUtZ3VhcmRcbiAqIHByZWRpY2F0ZXMgbmFycm93IHRoZWlyIGdyb3VwJ3MgZWxlbWVudCB0eXBlIChzZWUge0BsaW5rIEdyb3VwVmFsdWV9KS5cbiAqIGBwcmVkaWNhdGVzYCBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAdHlwZVBhcmFtIEcgLSBUaGUgbWFwIG9mIGdyb3VwIG5hbWUgLT4gcHJlZGljYXRlLlxuICogQHBhcmFtIHByZWRpY2F0ZXMgLSBOYW1lZCBwcmVkaWNhdGVzOyBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIuXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzLCBlYWNoIGFuIGFycmF5IG9mIGl0cyBncm91cCdzIGVsZW1lbnRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGNvbnN0IHsgc3RyaW5ncywgZm5zIH0gPSBncm91cCh7IHN0cmluZ3M6IGlzU3RyaW5nLCBmbnM6IGlzRnVuY3Rpb24gfSwgeHMpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXA8VCwgRyBleHRlbmRzIEdyb3VwUHJlZGljYXRlczxUPj4oXG4gIHByZWRpY2F0ZXM6IEcsXG4gIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdXG4pOiB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcmVkaWNhdGVzKSBhcyAoa2V5b2YgRylbXTtcbiAgY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8a2V5b2YgRywgVFtdPihrZXlzLm1hcCgoa2V5KSA9PiBba2V5LCBbXV0pKTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZSguLi5zb3VyY2VzKSkge1xuICAgIGNvbnN0IGkgPSBpbmRleCsrO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChwcmVkaWNhdGVzW2tleV0hKHZhbHVlLCBpKSkge1xuICAgICAgICBidWNrZXRzLmdldChrZXkpIS5wdXNoKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHt9IGFzIHsgW0sgaW4ga2V5b2YgR106IEdyb3VwVmFsdWU8VCwgR1tLXT5bXSB9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgcmVzdWx0W2tleV0gPSBidWNrZXRzLmdldChrZXkpISBhcyBHcm91cFZhbHVlPFQsIEdbdHlwZW9mIGtleV0+W107XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgZWxlbWVudHMgdW50aWwgYSBtYXRjaC4gQSB0eXBlIGd1YXJkIG5hcnJvd3MgdGhlIHJldHVybiB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZDxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IFMgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgdGhlIGZ1bGwgc291cmNlLiBBIHR5cGUgZ3VhcmQgbmFycm93cyB0aGUgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IFMgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgbWF0Y2g6IFQgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSBtYXRjaCA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBtYXRjaDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyBlbGVtZW50cyB1bnRpbCBhIG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEluZGV4PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCkpIHJldHVybiBpbmRleDtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0SW5kZXhgLCBvdmVyIGEgc2luZ2xlXG4gKiB7QGxpbmsgQ29udGFpbmVyfS4gQ29uc3VtZXMgdGhlIGZ1bGwgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RJbmRleDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IG1hdGNoID0gLTE7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgbWF0Y2ggPSBpbmRleDtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiBtYXRjaDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLnNvbWVgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogU2hvcnQtY2lyY3VpdHMgb24gdGhlIGZpcnN0IG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29tZTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5ldmVyeWAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBTaG9ydC1jaXJjdWl0cyBvbiB0aGUgZmlyc3QgZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogYm9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBldmVyeTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBldmVyeTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgaWYgKCFwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyB0aGUgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yRWFjaDxUPihzb3VyY2U6IFNvdXJjZTxUPiwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIGNhbGxiYWNrKHZhbHVlLCBpbmRleCsrKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmF0YCBvdmVyIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcy5cbiAqIE5vbi1uZWdhdGl2ZSBpbmRpY2VzIHNjYW4gbGF6aWx5OyBuZWdhdGl2ZSBpbmRpY2VzIG1hdGVyaWFsaXplIGZpcnN0LiBgaW5kZXhgXG4gKiBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAcGFyYW0gaW5kZXggLSBaZXJvLWJhc2VkIHBvc2l0aW9uOyBuZWdhdGl2ZSBjb3VudHMgZnJvbSB0aGUgZW5kLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXQ8VD4oaW5kZXg6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIGlmIChpbmRleCA8IDApIHJldHVybiB0b0FycmF5KHNyYykuYXQoaW5kZXgpO1xuICBsZXQgaSA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgaWYgKGkrKyA9PT0gaW5kZXgpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9PbmVPck1hbnk8VD4oaW5wdXQ6IFQgfCBPbmVPck1hbnk8VD4pOiBPbmVPck1hbnk8VD4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF07XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemVzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBzaW5nbGUtcGFzc1xuICogc291cmNlcy5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogcmVhZG9ubHkgVFtdIHtcbiAgcmV0dXJuIFsuLi5zZXF1ZW5jZSguLi5zb3VyY2VzKV07XG59XG5cbi8qKlxuICogTGF6eSBpdGVyYWJsZSBzZXF1ZW5jZSB3aXRoIGBBcnJheWAtY29tcGF0aWJsZSB0cmFuc2Zvcm1zIGFuZCB0ZXJtaW5hbFxuICogbWV0aG9kcy4gU2luZ2xlLXBhc3MgYnkgZGVmYXVsdDsgY2FsbCB7QGxpbmsgU2VxdWVuY2VJbXBsLmNhY2hlfSB0byByZXRhaW5cbiAqIHB1bGxlZCB2YWx1ZXMgZm9yIHJlLWl0ZXJhdGlvbi4gQnVpbHQgZm9yIGdlbmVyYXRvcnMgYW5kIG90aGVyIHNvdXJjZXMgd2hlcmVcbiAqIGEgc2Vjb25kIHBhc3MgaXMgbm90IGd1YXJhbnRlZWQuXG4gKlxuICogVGhlIG1ldGhvZHMgZm9yd2FyZCB0byB0aGUgc3RhbmRhbG9uZSBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSAtIHNlZSBlYWNoXG4gKiBtZXRob2QncyBgQHNlZWAgLSBzbyB0aGUgZnJlZS1mdW5jdGlvbiBhbmQgY2hhaW5lZCBzdHlsZXMgc2hhcmUgb25lIGltcGwuXG4gKi9cbmNsYXNzIFNlcXVlbmNlSW1wbDxUPiB7XG4gIHByaXZhdGUgaXRlcmF0b3I/OiBJdGVyYXRvcjxUPjtcbiAgcHJpdmF0ZSBleGhhdXN0ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2U6IEl0ZXJhYmxlPFQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBUW10gfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IHsgcmVhZG9ubHkgZXhoYXVzdGVkPzogYm9vbGVhbiB9ID0ge30sXG4gICkge1xuICAgIHRoaXMuZXhoYXVzdGVkID0gc3RhdGUuZXhoYXVzdGVkID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FjaGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBZHZhbmNlIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBvbmNlLCBjcmVhdGluZyB0aGUgaXRlcmF0b3Igb24gZmlyc3QgdXNlLiAqL1xuICBwcml2YXRlIHB1bGwoKTogSXRlcmF0b3JSZXN1bHQ8VD4ge1xuICAgIHRoaXMuaXRlcmF0b3IgPz89IHRoaXMuc291cmNlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICByZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gIH1cblxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VD4ge1xuICAgIGlmICghdGhpcy5jYWNoaW5nKSB7XG4gICAgICBpZiAodGhpcy5leGhhdXN0ZWQpIHJldHVybjtcbiAgICAgIGZvciAobGV0IG5leHQgPSB0aGlzLnB1bGwoKTsgIW5leHQuZG9uZTsgbmV4dCA9IHRoaXMucHVsbCgpKSB7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICB9XG4gICAgICB0aGlzLmV4aGF1c3RlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhY2hlZDogaXRlcmF0ZSBsaWtlIGEgbGlzdC4gQWx3YXlzIHJlcGxheSB0aGUgYnVmZmVyIGZyb20gdGhlIHN0YXJ0LFxuICAgICAgLy8gZXh0ZW5kaW5nIGl0IGZyb20gdGhlIHNvdXJjZSBvbiBkZW1hbmQgdW50aWwgZXhoYXVzdGVkLiBBIGJyb2tlbiBsb29wXG4gICAgICAvLyBsZWF2ZXMgdGhlIGJ1ZmZlciBpbnRhY3QsIHNvIHRoZSBuZXh0IGl0ZXJhdGlvbiBzdGFydHMgb3ZlciBmcm9tIHRoZVxuICAgICAgLy8gYmVnaW5uaW5nLlxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIhO1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKGluZGV4IDwgYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIHlpZWxkIGJ1ZmZlcltpbmRleCsrXSE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhoYXVzdGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnB1bGwoKTtcbiAgICAgICAgaWYgKG5leHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuZXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLnB1c2gobmV4dC52YWx1ZSk7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG1hcH0gKi9cbiAgbWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBTZXF1ZW5jZTxVPiB7XG4gICAgcmV0dXJuIG1hcCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmlsdGVyfSAqL1xuICBmaWx0ZXI8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogU2VxdWVuY2U8Uz47XG4gIGZpbHRlcihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFNlcXVlbmNlPFQ+O1xuICBmaWx0ZXIocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGZpbHRlcih0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG5vbk51bGx9ICovXG4gIG5vbk51bGwoKTogU2VxdWVuY2U8Tm9uTnVsbGFibGU8VD4+IHtcbiAgICByZXR1cm4gbm9uTnVsbCh0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0TWFwfSAqL1xuICBmbGF0TWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUgfCBSZWFkb25seUFycmF5PFU+KTogU2VxdWVuY2U8VT4ge1xuICAgIHJldHVybiBmbGF0TWFwKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0fSAqL1xuICBmbGF0KGRlcHRoID0gMSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZmxhdChkZXB0aCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZGlzdGluY3R9ICovXG4gIGRpc3RpbmN0KCk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZGlzdGluY3QodGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgY29uY2F0fSAqL1xuICBjb25jYXQoLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgUmVhZG9ubHlBcnJheTxUPilbXSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gY29uY2F0KHRoaXMsIC4uLml0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXppbHkgeWllbGRzIHRoaXMgc2VxdWVuY2UgZm9sbG93ZWQgYnkgZWFjaCBpdGVyYWJsZSBgc291cmNlYCBpbiBvcmRlci5cbiAgICogTGlrZSB7QGxpbmsgY29uY2F0fSwgYnV0IGZvciBpdGVyYWJsZSBzb3VyY2VzIChnZW5lcmF0b3JzLCBvdGhlciBzZXF1ZW5jZXMsXG4gICAqIGBTZXRgLCBgTWFwYCwgZXRjLikgcmF0aGVyIHRoYW4gc2NhbGFyIHZhbHVlcyBvciBhcnJheXMuIEEge0BsaW5rIE1hcH1cbiAgICogc291cmNlIGNvbnRyaWJ1dGVzIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHNlcXVlbmNlfVxuICAgKi9cbiAgam9pbiguLi5zb3VyY2VzOiByZWFkb25seSBTZXF1ZW5jZVNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICAgIGNvbnN0IHNvdXJjZUl0ZXJhYmxlcyA9IHNlcXVlbmNlU291cmNlcyh0aGlzLCAuLi5zb3VyY2VzKTtcbiAgICByZXR1cm4gc2VxdWVuY2VTb3VyY2VzLmxlbmd0aCA9PT0gMCA/IHRoaXMgOiBzZXF1ZW5jZSguLi5zb3VyY2VJdGVyYWJsZXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIHRha2V9ICovXG4gIHRha2UoY291bnQ6IG51bWJlcik6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gdGFrZShjb3VudCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZ3JvdXB9ICovXG4gIGdyb3VwPEcgZXh0ZW5kcyBHcm91cFByZWRpY2F0ZXM8VD4+KHByZWRpY2F0ZXM6IEcpOiB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfSB7XG4gICAgcmV0dXJuIGdyb3VwKHByZWRpY2F0ZXMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjYWNoZWQsIHJlLWl0ZXJhYmxlIHZpZXcgb2YgdGhpcyBzZXF1ZW5jZS4gQW4gYWxyZWFkeS1jYWNoaW5nXG4gICAqIHNlcXVlbmNlIHJldHVybnMgaXRzZWxmOyBvdGhlcndpc2UgdGhpcyBvbmUtcGFzcyBzZXF1ZW5jZSBpcyB3cmFwcGVkIGluIGFcbiAgICogbmV3IGluc3RhbmNlIHRoYXQgcmV0YWlucyBwdWxsZWQgdmFsdWVzLiBJdGVyYXRlIHRoZSByZXR1cm5lZCBpbnN0YW5jZSwgbm90XG4gICAqIHRoZSBvcmlnaW5hbCwgdG8gYXZvaWQgY29tcGV0aW5nIGZvciB0aGUgc2FtZSBzaW5nbGUtcGFzcyBzb3VyY2UuXG4gICAqL1xuICBjYWNoZSgpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGluZyA/IHRoaXMgOiBuZXcgU2VxdWVuY2VJbXBsKHRoaXMsIFtdKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kfSAqL1xuICBmaW5kPFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFMgfCB1bmRlZmluZWQ7XG4gIGZpbmQocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZpbmQodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kTGFzdH0gKi9cbiAgZmluZExhc3Q8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogUyB8IHVuZGVmaW5lZDtcbiAgZmluZExhc3QocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kTGFzdChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmaW5kTGFzdCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRJbmRleH0gKi9cbiAgZmluZEluZGV4KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZmluZEluZGV4KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZExhc3RJbmRleH0gKi9cbiAgZmluZExhc3RJbmRleChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGZpbmRMYXN0SW5kZXgodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBzb21lfSAqL1xuICBzb21lKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNvbWUodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBldmVyeX0gKHRoZSBgUyBleHRlbmRzIFRgIG92ZXJsb2FkIG5hcnJvd3MgYXQgY29tcGlsZSB0aW1lIG9ubHkpLiAqL1xuICBldmVyeTxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiB0aGlzIGlzIFNlcXVlbmNlPFM+O1xuICBldmVyeShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW47XG4gIGV2ZXJ5KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZXJ5KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZm9yRWFjaH0gKi9cbiAgZm9yRWFjaChjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgZm9yRWFjaCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgYXR9ICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYXQoaW5kZXgsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBzZXF1ZW5jZSBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBhIHNpbmdsZS1wYXNzIHNvdXJjZTsgYVxuICAgKiBjYWNoZWQsIGV4aGF1c3RlZCBzZXF1ZW5jZSBjb3BpZXMgaXRzIGJ1ZmZlciBkaXJlY3RseS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgdG9BcnJheX1cbiAgICovXG4gIHRvQXJyYXkoKTogcmVhZG9ubHkgVFtdIHtcbiAgICBpZiAodGhpcy5jYWNoaW5nICYmIHRoaXMuZXhoYXVzdGVkKSByZXR1cm4gWy4uLnRoaXMuYnVmZmVyIV07XG4gICAgcmV0dXJuIHRvQXJyYXkodGhpcyk7XG4gIH1cbn1cblxuLyoqIFNoYXJlZCBlbXB0eSBzZXF1ZW5jZSBzaW5nbGV0b24sIHJldXNhYmxlIGZvciBhbnkgZWxlbWVudCB0eXBlLiAqL1xuY29uc3QgZW1wdHlTZXF1ZW5jZTogU2VxdWVuY2U8bmV2ZXI+ID0gbmV3IFNlcXVlbmNlSW1wbChbXSwgdW5kZWZpbmVkLCB7XG4gIGV4aGF1c3RlZDogdHJ1ZSxcbn0pO1xuXG4vKipcbiAqIFdyYXAgb25lIG9yIG1vcmUgaXRlcmFibGUgYHNvdXJjZXNgIGluIGEgc2luZ2xlIGxhenkge0BsaW5rIFNlcXVlbmNlfSxcbiAqIGl0ZXJhdGVkIGluIG9yZGVyLiBgbnVsbGAvYHVuZGVmaW5lZGAgc291cmNlcyBhcmUgc2tpcHBlZDsgd2hlbiBub3RoaW5nXG4gKiByZW1haW5zIChldmVyeSBzb3VyY2Ugb21pdHRlZCwgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgYW4gZW1wdHkgYXJyYXkgL1xuICogYFNldGAgLyBgTWFwYCksIHtAbGluayBlbXB0eVNlcXVlbmNlfSBpcyByZXR1cm5lZC4gVGhlIHJlc3VsdCBpcyBzaW5nbGUtcGFzc1xuICogLSBjYWxsIGAuY2FjaGUoKWAgdG8gbWFrZSBpdCByZS1pdGVyYWJsZS5cbiAqXG4gKiBBIHtAbGluayBNYXB9IHNvdXJjZSBjb250cmlidXRlcyBpdHMgdmFsdWVzIChzZWUge0BsaW5rIHZhbHVlc30pLCBjb25zaXN0ZW50XG4gKiB3aXRoIHtAbGluayBDb2xsZWN0aW9ufSdzIHZhbHVlLXR5cGVkIGBUYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHNvdXJjZXMgLSBJdGVyYWJsZXMgdG8gY29uY2F0ZW5hdGUsIGluIG9yZGVyIChgTWFwYCBzb3VyY2VzIHVzZSB2YWx1ZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2U8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU2VxdWVuY2VTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgLy8gU2tpcCBudWxsaXNoIHNvdXJjZXMgYW5kIGtub3duLWVtcHR5IGNvbGxlY3Rpb25zOyBub3JtYWxpemUgdGhlIHJlc3QgdG9cbiAgLy8gdGhlaXIgdmFsdWVzIHNvIGEgTWFwIGNvbnRyaWJ1dGVzIHZhbHVlcyByYXRoZXIgdGhhbiBba2V5LCB2YWx1ZV0gZW50cmllcy5cbiAgY29uc3Qgc291cmNlSXRlcmFibGVzID0gc2VxdWVuY2VTb3VyY2VzKC4uLnNvdXJjZXMpO1xuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGVtcHR5U2VxdWVuY2UgYXMgU2VxdWVuY2U8VD47XG4gIC8vIFJldXNlIGFuIGV4aXN0aW5nIHNlcXVlbmNlIGFzLWlzIHJhdGhlciB0aGFuIHJlLXdyYXBwaW5nIGl0LlxuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG9ubHkgPSBzb3VyY2VJdGVyYWJsZXNbMF0hO1xuICAgIHJldHVybiBvbmx5IGluc3RhbmNlb2YgU2VxdWVuY2VJbXBsID8gKG9ubHkgYXMgU2VxdWVuY2U8VD4pIDogbmV3IFNlcXVlbmNlSW1wbChvbmx5LCB1bmRlZmluZWQpO1xuICB9XG4gIHJldHVybiBuZXcgU2VxdWVuY2VJbXBsKFxuICAgIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlSXRlcmFibGVzKSB5aWVsZCogc291cmNlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHVuZGVmaW5lZCxcbiAgKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBhIG1peCBvZiBzaW5nbGUgaXRlbXMgYW5kIGl0ZXJhYmxlcyBpbnRvIG9uZSBsYXp5IHtAbGluayBHZW5lcmF0b3J9LlxuICpcbiAqIEFyZ3VtZW50cyBhcmUgZW1pdHRlZCBpbiBvcmRlcjogYG51bGxgL2B1bmRlZmluZWRgIGFyZSBza2lwcGVkLCBub24tc3RyaW5nXG4gKiBpdGVyYWJsZXMgKHBlciB7QGxpbmsgaXNDb250YWluZXJ9KSBhcmUgeWllbGRlZCBlbGVtZW50LWJ5LWVsZW1lbnQsIGFuZFxuICogYW55dGhpbmcgZWxzZSAoaW5jbHVkaW5nIHN0cmluZ3MpIGlzIHlpZWxkZWQgYXMgYSBzaW5nbGUgaXRlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvci5cbiAqIEBwYXJhbSBpdGVtcyAtIEl0ZW1zIGFuZC9vciBpdGVyYWJsZXMgdG8gZmxhdHRlbiwgaW4gb3JkZXIuXG4gKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvdmVyIHRoZSBmbGF0dGVuZWQgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2VuZXJhdG9yPFQ+KFxuICAuLi5pdGVtczogcmVhZG9ubHkgKFQgfCBJdGVyYWJsZTxUPiB8IG51bGwgfCB1bmRlZmluZWQpW11cbik6IEdlbmVyYXRvcjxUPiB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGlmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChpc0NvbnRhaW5lcihpdGVtKSkge1xuICAgICAgeWllbGQqIGl0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHlpZWxkIGl0ZW07XG4gICAgfVxuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gT2JqZWN0IHZhbHVlIGd1YXJkcywgY29lcmNpb25zLCBhbmQgc3RydWN0dXJhbCBlcXVhbGl0eVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNaW5pbWFsIHNoYXBlIGZvciBvYmplY3RzIHRoYXQgZXhwb3NlIGFuIG9wdGlvbmFsIGBuYW1lYCAoZS5nLiBBcHBLaXQgcGx1Z2lucykuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVMaWtlIHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTm9uRnVuY3Rpb25LZXlzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gbmV2ZXIgOiBLO1xufVtrZXlvZiBUXTtcblxuLyoqXG4gKiBOYXJyb3cgYHZhbHVlYCB0byBhIHBsYWluIChub24tYXJyYXkpIG9iamVjdC4gVXNlIGFzIGEgdHlwZSBndWFyZFxuICogYmVmb3JlIGluZGV4aW5nIGludG8gLyBtdXRhdGluZyBwYXJzZWQgSlNPTiBzbyB0aGUgYWNjZXNzIGlzXG4gKiB0eXBlLXNhZmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlmIChpc1JlY29yZChwYXJzZWQpKSBwYXJzZWQuZm9vID0gMTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqIEEgSlNPTiBzY2FsYXIuIGB1bmRlZmluZWRgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgLSBgSlNPTi5zdHJpbmdpZnlgIGRyb3BzIGl0LiAqL1xuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlUHJpbWl0aXZlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG5cbi8qKlxuICogQW55IHZhbHVlIHRoYXQgc3Vydml2ZXMgYSBgSlNPTi5zdHJpbmdpZnlgL2BKU09OLnBhcnNlYCByb3VuZCB0cmlwIHVuY2hhbmdlZC5cbiAqXG4gKiBVc2UgaXQgaW5zdGVhZCBvZiBgdW5rbm93bmAgb24gYSBib3VuZGFyeSB0aGF0IHdpbGwgc2VyaWFsaXplIGl0cyBpbnB1dCAtIGFcbiAqIG1lc3NhZ2UgcGF5bG9hZCwgYSBjYWNoZSBlbnRyeSwgYSBjb25maWcgYmxvYiB3cml0dGVuIHRvIGRpc2sgLSBzbyBhIGBEYXRlYCxcbiAqIGEgYE1hcGAsIG9yIGEgY2xhc3MgaW5zdGFuY2UgaXMgYSBjb21waWxlIGVycm9yIGF0IHRoZSBjYWxsIHNpdGUgcmF0aGVyIHRoYW4gYVxuICogcmVjZWl2ZXIgcXVpZXRseSBnZXR0aW5nIGEgc3RyaW5nIG9yIGB7fWAuIHtAbGluayBpc1NlcmlhbGl6YWJsZVZhbHVlfSBpcyB0aGVcbiAqIHJ1bnRpbWUgaGFsZiwgZm9yIGlucHV0IHRoZSBjb21waWxlciBjYW5ub3Qgdm91Y2ggZm9yLlxuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9XG4gIFNlcmlhbGl6YWJsZVByaW1pdGl2ZSB8IFNlcmlhbGl6YWJsZVZhbHVlW10gfCB7IFtrZXk6IHN0cmluZ106IFNlcmlhbGl6YWJsZVZhbHVlIH07XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGB2YWx1ZWAgc3Vydml2ZXMgYSBKU09OIHJvdW5kIHRyaXAgd2l0aCBubyBsb3NzIGFuZCBubyBjb2VyY2lvbi5cbiAqXG4gKiBTdHJpY3RlciB0aGFuIFwiYEpTT04uc3RyaW5naWZ5YCBkaWQgbm90IHRocm93XCIsIGJlY2F1c2UgdGhhdCBzdWNjZWVkcyB3aGlsZVxuICogc2lsZW50bHkgQ0hBTkdJTkcgdGhlIHZhbHVlOiBhIGBEYXRlYCBiZWNvbWVzIGEgc3RyaW5nLCBgTmFOYCBhbmQgYEluZmluaXR5YFxuICogYmVjb21lIGBudWxsYCwgYSBgTWFwYCBiZWNvbWVzIGB7fWAsIGFuZCBgdW5kZWZpbmVkYCBkaXNhcHBlYXJzIGZyb20gYW4gb2JqZWN0XG4gKiBvciB0dXJucyBpbnRvIGBudWxsYCBpbnNpZGUgYW4gYXJyYXkuIEVhY2ggb2YgdGhvc2UgcmVhY2hlcyB0aGUgZmFyIHNpZGUgYXNcbiAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoYXQgd2FzIHNlbnQsIHNvIGFsbCBvZiB0aGVtIGFyZSByZWplY3RlZCBoZXJlLlxuICpcbiAqIFJlamVjdGVkOiBub24tZmluaXRlIG51bWJlcnMsIGB1bmRlZmluZWRgLCBmdW5jdGlvbnMsIHN5bWJvbHMsIGJpZ2ludHMsIGNsYXNzXG4gKiBpbnN0YW5jZXMgYW5kIGFueXRoaW5nIGVsc2Ugd2l0aCBhIHByb3RvdHlwZSBvdGhlciB0aGFuIGBPYmplY3QucHJvdG90eXBlYCBvclxuICogYG51bGxgIChgRGF0ZWAsIGBNYXBgLCBgU2V0YCwgYFJlZ0V4cGAsIGBCdWZmZXJgKSwgYW5kIGFueSBvYmplY3QgZ3JhcGhcbiAqIGNvbnRhaW5pbmcgYSBjeWNsZS4gQWNjZXB0ZWQ6IHN0cmluZ3MsIGJvb2xlYW5zLCBgbnVsbGAsIGZpbml0ZSBudW1iZXJzLCBwbGFpblxuICogb2JqZWN0cywgYXJyYXlzLCBhbmQgbmVzdGluZ3Mgb2YgdGhvc2UuXG4gKlxuICogTmFycm93cyB0byB7QGxpbmsgU2VyaWFsaXphYmxlVmFsdWV9IHJhdGhlciB0aGFuIGFzc2VydGluZywgc28gaXQgYWxzbyBzZXJ2ZXNcbiAqIGFzIHRoZSB2YWxpZGF0b3IgZm9yIHVudHJ1c3RlZCBpbnB1dCAtIGEgcmVxdWVzdCBib2R5LCBhIGRlY29kZWQgbm90aWZpY2F0aW9uXG4gKiBwYXlsb2FkIC0gd2hlcmUgdGhlIGFuc3dlciBzaG91bGQgYmUgYSA0MDAgYW5kIG5vdCBhIHRocm93LiBOZXZlciB0aHJvd3MuXG4gKlxuICogRGlzdGluY3QgZnJvbSB7QGxpbmsgZGVlcEVxdWFsfSdzIG5vdGlvbiBvZiBjb21wYXJhYmxlOiB0aGF0IG9uZSBIQU5ETEVTXG4gKiBgRGF0ZWAvYE1hcGAvYFNldGAgc3RydWN0dXJhbGx5LCB3aGlsZSB0aGlzIG9uZSByZWplY3RzIHRoZW0gcHJlY2lzZWx5IGJlY2F1c2VcbiAqIEpTT04gY2Fubm90IGNhcnJ5IHRoZW0uXG4gKlxuICogQHBhcmFtIGFuY2VzdG9ycyBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpc1NlcmlhbGl6YWJsZVZhbHVlKHsgYTogWzEsIFwieFwiLCBudWxsXSB9KTsgLy8gdHJ1ZVxuICogaXNTZXJpYWxpemFibGVWYWx1ZSh7IGF0OiBuZXcgRGF0ZSgpIH0pOyAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBhIHN0cmluZ1xuICogaXNTZXJpYWxpemFibGVWYWx1ZShOdW1iZXIuTmFOKTsgICAgICAgICAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcmlhbGl6YWJsZVZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHZhbHVlIGlzIFNlcmlhbGl6YWJsZVZhbHVlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGFuY2VzdG9ycy5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSk7XG4gIGNvbnN0IHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICA/IHZhbHVlLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSlcbiAgICA6IE9iamVjdC52YWx1ZXModmFsdWUpLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSk7XG4gIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpO1xuICByZXR1cm4gdmFsaWQ7XG59XG5cbi8qKlxuICogQ2Fub25pY2FsIHN0cmluZyBmb3IgYSBzdHJ1Y3R1cmVkIHZhbHVlLCBmb3IgZGVyaXZpbmcgYSBTVEFCTEUgSURFTlRJVFkgZnJvbVxuICogaXQgLSBhbiBhZHZpc29yeS1sb2NrIGlkLCBhIGNoYW5uZWwgbmFtZSwgYSBjYWNoZSBrZXkuXG4gKlxuICogVGhlIGd1YXJhbnRlZSBpcyB0d28td2F5LCB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHNhZmUgdG8gaGFzaDogdmFsdWVzIHRoYXRcbiAqIHNob3VsZCBzaGFyZSBhbiBpZGVudGl0eSBwcm9kdWNlIHRoZSBzYW1lIHN0cmluZyAob2JqZWN0IGtleSBvcmRlciBkb2VzIG5vdFxuICogbWF0dGVyKSwgYW5kIHZhbHVlcyB0aGF0IHNob3VsZCBub3QgYXJlIG5ldmVyIGNvbmZsYXRlZC4gRXZlcnkgdG9rZW4gY2Fycmllc1xuICogaXRzIHR5cGUsIHNvIGAxYCBhbmQgYFwiMVwiYCBkaWZmZXI7IGEgc3RyaW5nIGNhcnJpZXMgaXRzIGxlbmd0aCwgc29cbiAqIGBbXCJhXCIsIFwiYmNcIl1gIGFuZCBgW1wiYWJcIiwgXCJjXCJdYCBkaWZmZXI7IGFycmF5cyBrZWVwIG9yZGVyIHdoaWxlIG9iamVjdCBrZXlzXG4gKiBhcmUgc29ydGVkLlxuICpcbiAqIGBKU09OLnN0cmluZ2lmeWAgY2Fubm90IGRvIHRoaXMgam9iIC0ga2V5IG9yZGVyIGxlYWtzIGluLCBgdW5kZWZpbmVkYCB2YW5pc2hlcyxcbiAqIGAxYCBhbmQgYFwiMVwiYCBjb2xsaWRlIGFmdGVyIHF1b3RpbmcgaXMgc3RyaXBwZWQsIGFuZCBhIGN5Y2xlIHRocm93cyBhXG4gKiBgVHlwZUVycm9yYCBuYW1pbmcgbmVpdGhlciB0aGUgdmFsdWUgbm9yIHRoZSBjYWxsZXIncyBpbnRlbnQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IHN0cmljdCB3aGVyZSBhIHNpbGVudCBhbnN3ZXIgd291bGQgYmUgYSBXUk9ORyBpZGVudGl0eSByYXRoZXJcbiAqIHRoYW4gYSBtaXNzaW5nIG9uZSwgc2luY2UgdHdvIGNhbGxlcnMgZGlzYWdyZWVpbmcgYWJvdXQgYSBsb2NrIG9yIGEgY2hhbm5lbCBpc1xuICogaW52aXNpYmxlIHVudGlsIGl0IGNvcnJ1cHRzIHNvbWV0aGluZy4gVGhyb3dzIGBUeXBlRXJyb3JgIG9uIGEgY3ljbGUsIG9uIGFcbiAqIG5vbi1maW5pdGUgbnVtYmVyIChgTmFOYCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLCBzbyBpdCBjYW5ub3QgaGF2ZSBhIHN0YWJsZVxuICogaWRlbnRpdHkpLCBhbmQgb24gYSBgZnVuY3Rpb25gIG9yIGBzeW1ib2xgIChubyBtZWFuaW5nZnVsIHZhbHVlIGlkZW50aXR5KS5cbiAqIGB1bmRlZmluZWRgIGFuZCBgbnVsbGAgYXJlIGFjY2VwdGVkIGFzIGRpc3RpbmN0IHRva2Vucy5cbiAqXG4gKiBgRGF0ZWAgaXMgY2Fub25pY2FsaXplZCBieSBpbnN0YW50LCB1bmxpa2UgdGhlIGhhc2ggY2Fub25pY2FsaXplciBpblxuICogYC4vaGFzaC50c2AsIHdoaWNoIGZvbGRzIGV2ZXJ5IGBEYXRlYCBvbnRvIG9uZSB0b2tlbi4gUHJlZmVyIHRoaXMgZnVuY3Rpb24gd2hlblxuICogZGlzdGluY3RuZXNzIGlzIGEgY29ycmVjdG5lc3MgcmVxdWlyZW1lbnQ7IHByZWZlciBgaGFzaC5mbnZIYXNoYCB3aGVuIGEgc2hvcnQsXG4gKiBjb2xsaXNpb24tdG9sZXJhbnQgZGlnZXN0IGlzIGVub3VnaC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2Fub25pY2FsaXplLlxuICogQHBhcmFtIHNlZW4gLSBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b1N0YWJsZUtleSh7IGE6IDEsIGI6IDIgfSkgPT09IHRvU3RhYmxlS2V5KHsgYjogMiwgYTogMSB9KTsgLy8gdHJ1ZVxuICogdG9TdGFibGVLZXkoMSkgIT09IHRvU3RhYmxlS2V5KFwiMVwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TdGFibGVLZXkodmFsdWU6IHVua25vd24sIHNlZW46IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gXCJudWxsXCI7XG5cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAvLyBMZW5ndGgtcHJlZml4ZWQgc28gY29uY2F0ZW5hdGVkIG5laWdoYm91cnMgY2Fubm90IGJlIHJlLXNwbGl0XG4gICAgICAvLyBkaWZmZXJlbnRseTogYFtcImFcIixcImJjXCJdYCBhbmQgYFtcImFiXCIsXCJjXCJdYCBtdXN0IG5vdCBhZ3JlZS5cbiAgICAgIHJldHVybiBgc3RyaW5nOiR7dmFsdWUubGVuZ3RofToke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBgYm9vbGVhbjoke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIGBiaWdpbnQ6JHt2YWx1ZX1gO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN0YWJsZSBrZXlzIHJlcXVpcmUgZmluaXRlIG51bWJlcnNcIik7XG4gICAgICAvLyBgLTAgPT09IDBgIGJ1dCB0aGV5IHN0cmluZ2lmeSBkaWZmZXJlbnRseSwgc28gcGljayBvbmUgc3BlbGxpbmcuXG4gICAgICByZXR1cm4gYG51bWJlcjoke09iamVjdC5pcyh2YWx1ZSwgLTApID8gXCItMFwiIDogdmFsdWV9YDtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdGFibGUga2V5cyBjYW5ub3QgY29udGFpbiBjeWNsZXNcIik7XG4gICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gYGRhdGU6JHt2YWx1ZS50b0lTT1N0cmluZygpfWA7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBgYXJyYXk6WyR7dmFsdWUubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSkuam9pbihcIixcIil9XWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgLy8gU29ydGVkIGJ5IGNhbm9uaWNhbCBmb3JtLCBzbyBpbnNlcnRpb24gb3JkZXIgZG9lcyBub3QgbGVhay5cbiAgICAgICAgICByZXR1cm4gYHNldDpbJHtbLi4udmFsdWVdXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSlcbiAgICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAgIC5qb2luKFwiLFwiKX1dYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyaWVzOiBJdGVyYWJsZTxbdW5rbm93biwgdW5rbm93bl0+ID1cbiAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IHZhbHVlIDogT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICAgICAgICByZXR1cm4gYCR7dmFsdWUgaW5zdGFuY2VvZiBNYXAgPyBcIm1hcFwiIDogXCJvYmplY3RcIn06eyR7Wy4uLmVudHJpZXNdXG4gICAgICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IGAke3RvU3RhYmxlS2V5KGtleSwgc2Vlbil9PSR7dG9TdGFibGVLZXkoaXRlbSwgc2Vlbil9YClcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgLmpvaW4oXCIsXCIpfX1gO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vlbi5kZWxldGUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgc3RhYmxlIGtleSB0eXBlOiAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIGB7IFtrZXldOiB2YWx1ZSB9YCB3aGVuIGB2YWx1ZWAgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgIC0gc28gYW5cbiAqIGFic2VudCBvcHRpb25hbCBmaWVsZCBzdGF5cyBBQlNFTlQgd2hlbiBzcHJlYWQsIHJhdGhlciB0aGFuIGJlY29taW5nIGFuXG4gKiBleHBsaWNpdCBgdW5kZWZpbmVkYCB0aGF0IGBleGFjdE9wdGlvbmFsUHJvcGVydHlUeXBlc2AgcmVqZWN0cy5cbiAqXG4gKiBTcGVsbGluZyB0aGF0IGlubGluZSBjb3N0cyBhIHJlcGVhdGVkLCBkb3VibGUtZXZhbHVhdGVkIHRlcm5hcnkgcGVyIGZpZWxkXG4gKiAoYC4uLih2ID8geyBrZXk6IHYgfSA6IHt9KWApLCB3aGljaCBpcyBob3cgY29uZmlnIHJlc29sdmVycyBlbmQgdXAgY29tcHV0aW5nXG4gKiB0aGUgc2FtZSB2YWx1ZSB0d2ljZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogcmV0dXJuIHtcbiAqICAgLi4ub3B0aW9uYWwoXCJhcHBJZFwiLCBjb25maWd1cmVkQXBwSWQpLFxuICogICAuLi5vcHRpb25hbChcImVuZHBvaW50XCIsIGNvbmZpZy5lbmRwb2ludCksXG4gKiB9O1xuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWw8SyBleHRlbmRzIHN0cmluZywgVj4oXG4gIGtleTogSyxcbiAgdmFsdWU6IFYgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPEssIFY+IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAoeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8SywgVj4pO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b051bWJlcn0uXG4gKlxuICogQm90aCBzd2l0Y2hlcyB0dXJuIE9GRiBhIGxlbmllbmN5IHRoYXQgaXMgaGVscGZ1bCBmb3IgYSBoYW5kLXR5cGVkIHNldHRpbmcgYnV0XG4gKiB3cm9uZyB3aGVuIHRoZSBzdHJpbmcncyBvdGhlciBjaGFyYWN0ZXJzIGNhcnJ5IG1lYW5pbmcuIHtAbGluayB0b0RhdGV9IGFuZFxuICoge0BsaW5rIHRvRHVyYXRpb259IGRpc2FibGUgYm90aCwgc2luY2UgYSBzcGFjZSBpbnNpZGUgYDIwMjYgMDggMDJgIGlzIGEgZmllbGRcbiAqIHNlcGFyYXRvciBhbmQgYSBwZXJjZW50IGhhcyBubyBlcG9jaCBvciBtaWxsaXNlY29uZCByZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvTnVtYmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGludGVybmFsIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgYXJlIHN0cmlwcGVkLCBzbyBgXCIxLDAwMFwiYCBhbmRcbiAgICogYFwiMSAwMDBcImAgcmVhZCBhcyBgMTAwMGAuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogUGxhY2VtZW50IGlzIG5vdCB2YWxpZGF0ZWQgd2hlbiBlbmFibGVkLCBzbyBgXCIxLDAwLDBcImAgYWxzbyByZWFkcyBhcyBgMTAwMGAuXG4gICAqIERpc2FibGUgaXQgd2hlbiB3aGl0ZXNwYWNlIG9yIGEgY29tbWEgZGVsaW1pdHMgRklFTERTIHJhdGhlciB0aGFuIGdyb3VwaW5nXG4gICAqIGRpZ2l0cywgYmVjYXVzZSBzdHJpcHBpbmcgdGhlbSBzaWxlbnRseSBmdXNlcyB0aG9zZSBmaWVsZHMgaW50byBvbmUgbnVtYmVyLlxuICAgKi9cbiAgc2VwYXJhdG9ycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgdHJhaWxpbmcgcGVyY2VudCBzaWduIGRpdmlkZXMgdGhlIHJlc3VsdCBieSBgMTAwYCwgc28gYFwiMjUlXCJgIHJlYWRzXG4gICAqIGFzIGAwLjI1YC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBEaXNhYmxlIGl0IHdoZXJlIGEgcGVyY2VudGFnZSBoYXMgbm8gbWVhbmluZywgc28gYFwiMjUlXCJgIGlzIGEgbWlzcyByYXRoZXJcbiAgICogdGhhbiBhIG51bWJlciB0d28gb3JkZXJzIG9mIG1hZ25pdHVkZSBhd2F5IGZyb20gd2hhdCB0aGUgdGV4dCBzYXlzLlxuICAgKi9cbiAgcGVyY2VudD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgbnVtZXJpYyB2YWx1ZSB0byBhIHJlYWwsIEZJTklURSBgbnVtYmVyYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdFxuICogY2FycmllcyBubyBudW1lcmljIG1lYW5pbmcuXG4gKlxuICogVGhlIG9uZSBwbGFjZSBhIGhhbmQtdHlwZWQgbnVtYmVyIGlzIGludGVycHJldGVkLCBhbG9uZ3NpZGUge0BsaW5rIHRvQm9vbGVhbn0sXG4gKiB7QGxpbmsgdG9EYXRlfSwgYW5kIHtAbGluayB0b0R1cmF0aW9ufS4gUmVhY2ggZm9yIGl0IGluc3RlYWQgb2YgYE51bWJlcih4KWAgb3IgYVxuICogaGFuZC1yb2xsZWQgbnVtZXJpYyByZWdleDogYmFyZSBgTnVtYmVyYCBtYXBzIGBcIlwiYCwgYG51bGxgLCBgW11gLCBhbmRcbiAqIHdoaXRlc3BhY2UgdG8gYDBgIGFuZCBhbnl0aGluZyBlbHNlIHRvIGBOYU5gLCBzbyBhIGNhbGxlciBoYXMgdG8gcmUtY2hlY2sgdGhlXG4gKiByZXN1bHQgZXZlcnkgdGltZSwgYW5kIGFkIGhvYyByZWdleGVzIHRlbmQgdG8gZHJpZnQgaW4gd2hhdCB0aGV5IGFjY2VwdC5cbiAqXG4gKiBBY2NlcHRzOiBhIGZpbml0ZSBgbnVtYmVyYDsgYSBgYmlnaW50YDsgb3IgYSBkZWNpbWFsIHN0cmluZyB3aXRoIGFuIG9wdGlvbmFsXG4gKiBsZWFkaW5nIHNpZ24sIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciB0aGUgc2lnbixcbiAqIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgKGBcIjEsMDAwXCJgLCBgXCIxIDAwMFwiYCksIGEgYmFyZSBmcmFjdGlvbiAoYFwiLjVcImApLCBhXG4gKiB0cmFpbGluZyBwb2ludCAoYFwiMS5cImApLCBzY2llbnRpZmljIG5vdGF0aW9uIChgXCIxZTNcImApLCBhbmQgYW4gb3B0aW9uYWxcbiAqIHRyYWlsaW5nIHBlcmNlbnQgc2lnbiAoYFwiMjUlXCJgLCBgXCIxLjUgJVwiYCkuIEEgdHJhaWxpbmcgYCVgIGRpdmlkZXMgdGhlIHBhcnNlZFxuICogdmFsdWUgYnkgYDEwMGAsIHNvIGBcIjI1JVwiYCBiZWNvbWVzIGAwLjI1YC5cbiAqXG4gKiBTZXBhcmF0b3JzIGFyZSBzdHJpcHBlZCB3aXRob3V0IHZhbGlkYXRpbmcgdGhlaXIgcGxhY2VtZW50LCBzbyBgXCIxLDAwLDBcImAgcmVhZHNcbiAqIGFzIGAxMDAwYDsgdGhpcyBpcyBhIGNvZXJjaW9uIGZvciBoYW5kLXR5cGVkIGNvbmZpZ3VyYXRpb24sIG5vdCBhIGxvY2FsZS1hd2FyZVxuICogdmFsaWRhdG9yLiBBbnl0aGluZyBlbHNlLCBpbmNsdWRpbmcgYE5hTmAsIGBJbmZpbml0eWAsIGFuIGVtcHR5IG9yXG4gKiB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5nLCBgbnVsbGAsIGB1bmRlZmluZWRgLCBhIGJvb2xlYW4sIG11bHRpcGxlIHNpZ25zLFxuICogbWFsZm9ybWVkIGV4cG9uZW50cywgbWlzcGxhY2VkIHBlcmNlbnQgc2lnbnMsIG9yIGBcIjEycHhcImAsIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCByYXRoZXIgdGhhbiB0aHJvd2luZywgbWF0Y2hpbmcgdGhlIG90aGVyIGNvZXJjaW9ucywgc28gaXRcbiAqIGNvbXBvc2VzIG5hdHVyYWxseSB3aXRoIGA/P2AgZmFsbGJhY2tzLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b051bWJlcihcIjEsMDAwXCIpOyAgIC8vIDEwMDBcbiAqIHRvTnVtYmVyKFwiIC0yLjUgXCIpOyAgLy8gLTIuNVxuICogdG9OdW1iZXIoXCIxZTNcIik7ICAgICAvLyAxMDAwXG4gKiB0b051bWJlcihcIjEyLjUgJVwiKTsgIC8vIDAuMTI1XG4gKiB0b051bWJlcihcIlwiKTsgICAgICAgIC8vIHVuZGVmaW5lZCAgKE51bWJlcihcIlwiKSB3b3VsZCBiZSAwKVxuICogdG9OdW1iZXIoXCIxMnB4XCIpOyAgICAvLyB1bmRlZmluZWRcbiAqIHRvTnVtYmVyKFwiMSAwMDBcIiwgeyBzZXBhcmF0b3JzOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcih2YWx1ZTogdW5rbm93biwgb3B0aW9uczogVG9OdW1iZXJPcHRpb25zID0ge30pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICByZXR1cm4gdG9OdW1iZXIoTnVtYmVyKHZhbHVlKSwgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgLy8gU3RyaXAgc3Vycm91bmRpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciBhIGxlYWRpbmcgc2lnbiwgZGlnaXQtZ3JvdXBcbiAgICAvLyBzZXBhcmF0b3JzIChib3RoIGAsYCBhbmQgdGhlIHNwYWNlIGluIGBcIjEgMDAwXCJgKSwgbGVhdmluZyBhIGJhcmUgbnVtZXJhbCBmb3JcbiAgICAvLyB0aGUgc2hhcGUgdGVzdCBiZWxvdyB0byBhY2NlcHQgb3IgcmVqZWN0LlxuICAgIGNvbnN0IHRleHQgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgb3B0aW9ucy5zZXBhcmF0b3JzID09PSBmYWxzZSA/IC8oXlxccyt8XFxzKyQpL2cgOiAvKF5cXHMrfFxccyskfCg/PD1eWystXSlcXHMrfCg/PD1cXGQpXFxzK3wsKS9nLFxuICAgICAgXCJcIixcbiAgICApO1xuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL14oWystXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KSglKT8kL2kpO1xuICAgICAgaWYgKG1hdGNoICYmICEobWF0Y2hbMl0gJiYgb3B0aW9ucy5wZXJjZW50ID09PSBmYWxzZSkpIHtcbiAgICAgICAgY29uc3QgbnVtYmVyID0gTnVtYmVyKG1hdGNoWzFdKTtcbiAgICAgICAgcmV0dXJuIHRvTnVtYmVyKG1hdGNoWzJdID8gbnVtYmVyIC8gMTAwIDogbnVtYmVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gQSBib3hlZCBgTnVtYmVyYCwgb3IgYW55dGhpbmcgd2l0aCBhIG51bWVyaWMgYHRvU3RyaW5nYC4gYFN0cmluZyh2YWx1ZSlgXG4gICAgLy8gcm91dGVzIGl0IGJhY2sgdGhyb3VnaCB0aGUgc3RyaW5nIGJyYW5jaCwgd2hpY2ggcmVqZWN0cyB3aGF0IGlzIG5vdCBudW1lcmljLlxuICAgIHJldHVybiB0b051bWJlcihTdHJpbmcodmFsdWUpLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGJvb2xlYW4taXNoIHZhbHVlIHRvIGEgcmVhbCBgYm9vbGVhbmAsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIGl0IGNhbid0IGJlIGludGVycHJldGVkLiBSZWNvZ25pemVzIGB0cnVlYC9gdGAvYG9uYC9gMWAvYHllc2AvYHlgXG4gKiBhbmQgdGhlaXIgbmVnYXRpdmVzIChjYXNlLSBhbmQgd2hpdGVzcGFjZS1pbnNlbnNpdGl2ZSBmb3Igc3RyaW5ncyksIGFzXG4gKiB3ZWxsIGFzIHRoZSBudW1iZXJzIGAxYCBhbmQgYDBgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Cb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT09IFwidHJ1ZVwiIHx8XG4gICAgICB2YWx1ZSA9PSBcInRcIiB8fFxuICAgICAgdmFsdWUgPT09IFwib25cIiB8fFxuICAgICAgdmFsdWUgPT09IFwiMVwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJ5ZXNcIiB8fFxuICAgICAgdmFsdWUgPT09IFwieVwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdmFsdWUgPT09IFwiZmFsc2VcIiB8fFxuICAgICAgdmFsdWUgPT0gXCJmXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm9mZlwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCIwXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5vXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5cIlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiB0cnVlO1xuICAgIGVsc2UgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBMYXJnZXN0IHZhbHVlIHJlYWQgYXMgZXBvY2ggU0VDT05EUyByYXRoZXIgdGhhbiBtaWxsaXNlY29uZHMuXG4gKlxuICogYDFlMTFgIHNlY29uZHMgaXMgdGhlIHllYXIgNTEzOCBhbmQgYDFlMTFgIG1zIGlzIDE5NzMtMDMtMDMsIHNvIGV2ZXJ5IHZhbHVlIGFcbiAqIGNhbGxlciByZWFsaXN0aWNhbGx5IG1lYW5zIGFzIG1pbGxpcyBpcyBhYm92ZSB0aGUgbGluZSBhbmQgZXZlcnkgdmFsdWUgdGhleVxuICogbWVhbiBhcyBzZWNvbmRzIGlzIGJlbG93IGl0LiBUaGUgYW1iaWd1aXR5IGlzIHVuYXZvaWRhYmxlIC0gdGhlIHR3byB1bml0cyBzaGFyZVxuICogYSBudW1iZXIgbGluZSAtIHNvIHRoZSBzcGxpdCBpcyBwbGFjZWQgd2hlcmUgbmVpdGhlciBzaWRlIGhhcyBhIHBsYXVzaWJsZVxuICogY2xhaW0uXG4gKi9cbmNvbnN0IFNFQ09ORFNfQ0VJTElORyA9IDFlMTE7XG5cbi8qKlxuICogQSBudW1iZXIgZm9yIHtAbGluayB0b0RhdGV9IGFuZCB7QGxpbmsgdG9EdXJhdGlvbn0sIHJlYWQgd2l0aCBub25lIG9mXG4gKiB7QGxpbmsgdG9OdW1iZXJ9J3Mgc3RyaW5nIGxlbmllbmNpZXMuXG4gKlxuICogQm90aCBsZW5pZW5jaWVzIGFyZSBhY3RpdmVseSBoYXJtZnVsIGhlcmUuIEEgc3BhY2Ugb3IgY29tbWEgc2VwYXJhdGVzIEZJRUxEUyBpblxuICogYSBkYXRlIChgMjAyNiAwOCAwMmAgd291bGQgZnVzZSBpbnRvIHRoZSBlcG9jaCBgMjAyNjA4MDJgKSwgYW5kIGEgcGVyY2VudGFnZSBoYXNcbiAqIG5vIHJlYWRpbmcgYXMgYW4gaW5zdGFudCBvciBhIGxlbmd0aCBvZiB0aW1lLCBzbyBgMjUlYCBtdXN0IGJlIGEgbWlzcyByYXRoZXJcbiAqIHRoYW4gYDI1MG1zYC5cbiAqL1xuZnVuY3Rpb24gdG9CYXJlTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlLCB7IHNlcGFyYXRvcnM6IGZhbHNlLCBwZXJjZW50OiBmYWxzZSB9KTtcbn1cblxuLyoqXG4gKiBNaWxsaXNlY29uZHMgcGVyIHVuaXQsIGtleWVkIGJ5IFNJTkdVTEFSIGFsaWFzLiB7QGxpbmsgdG9EdXJhdGlvbn0gcmV0cmllcyBhXG4gKiBsb29rdXAgd2l0aG91dCBhIHRyYWlsaW5nIGBzYCwgc28gZXZlcnkgcGx1cmFsIHNwZWxsaW5nIGlzIGNvdmVyZWQgd2l0aG91dFxuICogbGlzdGluZyBpdCAoYG1zYCBpcyBhbHJlYWR5IHNpbmd1bGFyLCBoZW5jZSBpdHMgb3duIGVudHJ5KS5cbiAqXG4gKiBgbWAgaXMgTUlOVVRFUyBhbmQgbW9udGhzIG5lZWQgYG1vYCwgZm9sbG93aW5nIHRoZSBuZWFyLXVuaXZlcnNhbCBjb252ZW50aW9uXG4gKiAoYG1zYCwgYGRhdGVgLCBjcm9uIHByb3NlKTsgbW9udGggYW5kIHllYXIgYXJlIGNhbGVuZGFyIGFwcHJveGltYXRpb25zICgzMCAvXG4gKiAzNjUgZGF5cykgYmVjYXVzZSBhIGR1cmF0aW9uIGhhcyBubyBhbmNob3IgZGF0ZSB0byBiZSBleGFjdCBhZ2FpbnN0LlxuICovXG5jb25zdCBEVVJBVElPTl9VTklUUzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbbXM6IG51bWJlciwgYWxpYXNlczogcmVhZG9ubHkgc3RyaW5nW11dPiA9IFtcbiAgWzEsIFtcIm1zXCIsIFwibXNlY1wiLCBcIm1pbGxpc2Vjb25kXCIsIFwibWlsbGlcIl1dLFxuICBbMTAwMCwgW1wic1wiLCBcInNlY1wiLCBcInNlY29uZFwiXV0sXG4gIFs2MF8wMDAsIFtcIm1cIiwgXCJtaW5cIiwgXCJtaW51dGVcIl1dLFxuICBbM182MDBfMDAwLCBbXCJoXCIsIFwiaHJcIiwgXCJob3VyXCJdXSxcbiAgWzg2XzQwMF8wMDAsIFtcImRcIiwgXCJkYXlcIl1dLFxuICBbNjA0XzgwMF8wMDAsIFtcIndcIiwgXCJ3a1wiLCBcIndlZWtcIl1dLFxuICBbMl81OTJfMDAwXzAwMCwgW1wibW9cIiwgXCJtb25cIiwgXCJtb250aFwiXV0sXG4gIFszMV81MzZfMDAwXzAwMCwgW1wieVwiLCBcInlyXCIsIFwieWVhclwiXV0sXG5dO1xuXG5jb25zdCBEVVJBVElPTl9VTklUX01TOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKFxuICBEVVJBVElPTl9VTklUUy5mbGF0TWFwKChbbXMsIGFsaWFzZXNdKSA9PiBhbGlhc2VzLm1hcCgoYWxpYXMpID0+IFthbGlhcywgbXNdIGFzIGNvbnN0KSksXG4pO1xuXG4vKiogT25lIGA8YW1vdW50Pjx1bml0PmAgdGVybSBpbnNpZGUgYSBkdXJhdGlvbiBzdHJpbmcuICovXG5jb25zdCBEVVJBVElPTl9URVJNID0gLyhbKy1dPykoXFxkKyg/OlxcLlxcZCspPylcXHMqKFthLXpdKykvZztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdG9EYXRlfS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0R1cmF0aW9uT3B0aW9uc306IGVhY2ggZnVuY3Rpb24gY2FuIGZhbGwgYmFjayB0byB0aGVcbiAqIG90aGVyLCBzbyBlYWNoIGhhcyBvbmUgc3dpdGNoIHR1cm5pbmcgdGhhdCBmYWxsYmFjayBvZmYuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9EYXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24gaXMgcmVhZCBhcyBhbiBpbnN0YW50IHJlbGF0aXZlIHRvXG4gICAqIG5vdywgc28gYC03ZGAgYW5kIGA3IGRheXMgYWdvYCBiZWNvbWUgYG5vdyAtIDcgZGF5c2AuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogU2V0IGBmYWxzZWAgd2hlbiB0aGUgdmFsdWUgbXVzdCBiZSBhIHJlYWwgZGF0ZSBhbmQgYSByZWxhdGl2ZSBleHByZXNzaW9uXG4gICAqIHNob3VsZCBiZSBhIG1pc3MgLSBhIHN0b3JlZCB0aW1lc3RhbXAsIGEgdXNlci1zdXBwbGllZCBgRGF0ZWAgaGVhZGVyLCBhblxuICAgKiBgZXhwaXJlc19hdGAgZmllbGQgLSBzaW5jZSBhIGR1cmF0aW9uIHNpbGVudGx5IHJlc29sdmluZyBhZ2FpbnN0IHRoZSBjdXJyZW50XG4gICAqIGNsb2NrIG1ha2VzIHRoZSBzYW1lIGlucHV0IG1lYW4gc29tZXRoaW5nIGRpZmZlcmVudCBvbiBldmVyeSBjYWxsLiBBbHNvIHdoYXRcbiAgICoge0BsaW5rIHRvRHVyYXRpb259IHBhc3NlcyB3aGVuIGl0IHJlY3Vyc2VzLCBzbyB0aGUgdHdvIGNhbm5vdCBib3VuY2UgYSB2YWx1ZVxuICAgKiBiZXR3ZWVuIHRoZW0gZm9yZXZlci5cbiAgICovXG4gIHBhcnNlRHVyYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b0R1cmF0aW9ufS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0RhdGVPcHRpb25zfTogZWFjaCBmdW5jdGlvbiBjYW4gZmFsbCBiYWNrIHRvIHRoZSBvdGhlcixcbiAqIHNvIGVhY2ggaGFzIG9uZSBzd2l0Y2ggdHVybmluZyB0aGF0IGZhbGxiYWNrIG9mZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb0R1cmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRGF0ZX0gdmFsdWUgaXMgcmVhZCBhcyB0aGUgc2lnbmVkIG9mZnNldCBmcm9tIG5vdywgc29cbiAgICogYDIwMjYtMDgtMDJgIGJlY29tZXMgaG93ZXZlciBsb25nIHVudGlsIChvciBzaW5jZSkgdGhhdCBpbnN0YW50LiBEZWZhdWx0cyB0b1xuICAgKiBgdHJ1ZWAuXG4gICAqXG4gICAqIFNldCBgZmFsc2VgIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIGlzIG1lYW5pbmdmdWwgLSBhIHRpbWVvdXQsIGEgcG9sbFxuICAgKiBpbnRlcnZhbCwgYSBjYWNoZSBUVEwgLSBiZWNhdXNlIGEgZGF0ZSB3b3VsZCBvdGhlcndpc2UgeWllbGQgYSBwbGF1c2libGUgYnV0XG4gICAqIHdyb25nIG51bWJlciB0aGF0IGFsc28gZHJpZnRzIHdpdGggdGhlIGNsb2NrLiBBbHNvIHdoYXQge0BsaW5rIHRvRGF0ZX0gcGFzc2VzXG4gICAqIHdoZW4gaXQgcmVjdXJzZXMuXG4gICAqL1xuICBwYXJzZURhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGR1cmF0aW9uIHRvIE1JTExJU0VDT05EUywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGxlbmllbnQsIGJlY2F1c2UgdGhlc2UgdmFsdWVzIGFyZSB0eXBlZCBieSBoYW5kIGludG8gZW52IHZhcnMsXG4gKiBDTEkgZmxhZ3MsIGFuZCBjb25maWcgZmlsZXM6IHdoaXRlc3BhY2UgYmV0d2VlbiBhbW91bnQgYW5kIHVuaXQgaXMgb3B0aW9uYWwgYW5kXG4gKiB1bmxpbWl0ZWQsIHVuaXRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBwbHVyYWxzIGFuZCB0aGUgY29tbW9uIGFiYnJldmlhdGlvbnMgYXJlXG4gKiBlcXVpdmFsZW50IChgMm1zYCA9PT0gYDIgbWlsbGlzZWNvbmRzYCwgYDFoYCA9PT0gYDEgaHJgID09PSBgMSBIb3VyYCksIGBhbmRgIGFuZFxuICogdGhvdXNhbmRzIHNlcGFyYXRvcnMgYXJlIGlnbm9yZWQgKGAxLDUwMCBtc2AsIGAxIGhvdXIgYW5kIDMwIG1pbnV0ZXNgKSwgYW5kXG4gKiB0ZXJtcyBjb21wb3NlIChgMWgzMG1gKS4gQSBwbGFpbiBgbnVtYmVyYCBwYXNzZXMgdGhyb3VnaCBhcyBtaWxsaXNlY29uZHMuXG4gKlxuICogU2lnbnMgYXJlIHN1cHBvcnRlZCBzbyBhIGR1cmF0aW9uIGNhbiBleHByZXNzIGFuIE9GRlNFVCByYXRoZXIgdGhhbiBvbmx5IGFcbiAqIGxlbmd0aDogYSBsZWFkaW5nIGAtYCAob3IgYSB0cmFpbGluZyBgYWdvYCkgbWFrZXMgdGhlIHJlc3VsdCBuZWdhdGl2ZSwgYW5kIGFuXG4gKiB1bnNpZ25lZCB0ZXJtIGluaGVyaXRzIHRoZSBwcmV2aW91cyB0ZXJtJ3Mgc2lnbiwgc28gYC0xaDMwbWAgaXMgLTkwIG1pbnV0ZXNcbiAqIHJhdGhlciB0aGFuIC02MCArIDMwLiB7QGxpbmsgdG9EYXRlfSB1c2VzIHRoYXQgdG8gdHVybiBgLTdkYCAvIGA3IGRheXMgYWdvYFxuICogaW50byBhbiBpbnN0YW50IHJlbGF0aXZlIHRvIG5vdy5cbiAqXG4gKiBBbiBVTktOT1dOIHVuaXQgZmFpbHMgdGhlIHdob2xlIHBhcnNlIHJhdGhlciB0aGFuIGJlaW5nIHNraXBwZWQgLSBgMSBmb3J0bmlnaHRgXG4gKiByZXR1cm5pbmcgYDFgIHNpbGVudGx5IHdvdWxkIGJlIHdvcnNlIHRoYW4gcmV0dXJuaW5nIG5vdGhpbmcgLSB3aGljaCBpcyBhbHNvXG4gKiB3aGF0IGtlZXBzIHtAbGluayB0b0RhdGV9IGZyb20gbWlzdGFraW5nIGAxIEphbiAyMDI2YCBmb3IgYSBkdXJhdGlvbi5cbiAqXG4gKiBBIHZhbHVlIHRoYXQgaXMgbm90IGEgZHVyYXRpb24gYXQgYWxsIGlzIG9mZmVyZWQgdG8ge0BsaW5rIHRvRGF0ZX0gYW5kLCB3aGVuIGl0XG4gKiBJUyBhIGRhdGUsIHJlYWQgYXMgdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSBub3cgKGBkYXRlIC0gbm93YCksIHdoaWNoIG1ha2VzIHRoZVxuICogdHdvIGZ1bmN0aW9ucyBpbnZlcnNlczogYSBwYXN0IGluc3RhbnQgaXMgbmVnYXRpdmUsIGEgZnV0dXJlIG9uZSBwb3NpdGl2ZS5cbiAqIGBvcHRpb25zLnBhcnNlRGF0ZTogZmFsc2VgIHR1cm5zIHRoYXQgb2ZmIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIG1ha2VzXG4gKiBzZW5zZSAtIHNlZSB7QGxpbmsgVG9EdXJhdGlvbk9wdGlvbnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0R1cmF0aW9uKFwiMzBzXCIpOyAgICAgICAgICAgICAgICAgICAgLy8gMzBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMSBob3VyIDMwIG1pbnV0ZXNcIik7ICAgICAgLy8gNV80MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiLTcgZGF5c1wiKTsgICAgICAgICAgICAgICAgLy8gLTYwNF84MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMiB3ZWVrcyBhZ29cIik7ICAgICAgICAgICAgLy8gLTFfMjA5XzYwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgICAgICAvLyBtcyBmcm9tIG5vdyB0byB0aGF0IGluc3RhbnRcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIsIHsgcGFyc2VEYXRlOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKiB0b0R1cmF0aW9uKFwic29vblwiKTsgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0R1cmF0aW9uKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0R1cmF0aW9uT3B0aW9ucyA9IHt9KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgLy8gQSBiYXJlIG51bWJlciBpcyBhbHJlYWR5IG1pbGxpc2Vjb25kcywgdGhlIHNhbWUgcmVhZGluZyBgdG9EYXRlYCBnaXZlcyBhblxuICAvLyBlcG9jaCB2YWx1ZSwgc28gdGhpcyBtdXN0IHJ1biBiZWZvcmUgYW55IGRhdGUgaW50ZXJwcmV0YXRpb24uXG4gIGNvbnN0IG51bSA9IHRvQmFyZU51bWJlcih2YWx1ZSk7XG4gIGlmIChudW0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gIH1cbiAgbGV0IHRleHQgPSB2YWx1ZVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2VBbGwoL1ssX10vZywgXCJcIilcbiAgICAucmVwbGFjZUFsbCgvXFxiYW5kXFxiL2csIFwiIFwiKVxuICAgIC50cmltKCk7XG4gIGxldCBuZWdhdGUgPSBmYWxzZTtcbiAgaWYgKHRleHQuZW5kc1dpdGgoXCJhZ29cIikpIHtcbiAgICBuZWdhdGUgPSB0cnVlO1xuICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIC1cImFnb1wiLmxlbmd0aCk7XG4gIH1cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXmluXFxiLywgXCJcIikudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdGVybXMgPSBbLi4udGV4dC5tYXRjaEFsbChEVVJBVElPTl9URVJNKV07XG4gIGlmICh0ZXJtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgLy8gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBtYXRjaGVkIHRlcm1zIG11c3QgYmUgc2VwYXJhdG9ycyBvbmx5OyBvdGhlcndpc2UgdGhlXG4gIC8vIHN0cmluZyBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IG1lcmVseSBDT05UQUlOUyBhIGR1cmF0aW9uLXNoYXBlZCBmcmFnbWVudC5cbiAgbGV0IGxlZnRvdmVyID0gdGV4dDtcbiAgZm9yIChjb25zdCB0ZXJtIG9mIHRlcm1zKSBsZWZ0b3ZlciA9IGxlZnRvdmVyLnJlcGxhY2UodGVybVswXSwgXCIgXCIpO1xuICBpZiAobGVmdG92ZXIudHJpbSgpKSB7XG4gICAgLy8gQSBkdXJhdGlvbi1zaGFwZWQgZnJhZ21lbnQgaW5zaWRlIG90aGVyIHRleHQgaXMgdXN1YWxseSBhIERBVEUgLSBgXCIyMDI2LTA4LTAyXCJgXG4gICAgLy8gbWF0Y2hlcyB0d28gdGVybXMgYW5kIGxlYXZlcyBzZXBhcmF0b3JzIGJlaGluZC5cbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgbGV0IHRvdGFsID0gMDtcbiAgbGV0IHNpZ24gPSAxO1xuICBmb3IgKGNvbnN0IFssIGV4cGxpY2l0U2lnbiwgYW1vdW50LCB1bml0XSBvZiB0ZXJtcykge1xuICAgIGlmIChleHBsaWNpdFNpZ24pIHNpZ24gPSBleHBsaWNpdFNpZ24gPT09IFwiLVwiID8gLTEgOiAxO1xuICAgIGNvbnN0IHVuaXRNcyA9IERVUkFUSU9OX1VOSVRfTVMuZ2V0KHVuaXQpID8/IERVUkFUSU9OX1VOSVRfTVMuZ2V0KHVuaXQucmVwbGFjZSgvcyQvLCBcIlwiKSk7XG4gICAgaWYgKHVuaXRNcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICAgIH1cbiAgICB0b3RhbCArPSBzaWduICogTnVtYmVyKGFtb3VudCkgKiB1bml0TXM7XG4gIH1cbiAgcmV0dXJuIG5lZ2F0ZSA/IC10b3RhbCA6IHRvdGFsO1xufVxuXG4vKipcbiAqIEEgZGF0ZSByZWFkIGFzIHRoZSBzaWduZWQgb2Zmc2V0IGZyb20gbm93IChgZGF0ZSAtIG5vd2ApLCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gKiB7QGxpbmsgdG9EdXJhdGlvbn0gYW5kIHtAbGluayB0b0RhdGV9IGludmVyc2VzIG9mIGVhY2ggb3RoZXIuIFJlY3Vyc2VzIHdpdGhcbiAqIGR1cmF0aW9uIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kIGZvcnRoXG4gKiBmb3JldmVyLlxuICovXG5mdW5jdGlvbiBkYXRlQXNEdXJhdGlvbih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGUgPSB0b0RhdGUodmFsdWUsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7XG4gIHJldHVybiBkYXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkYXRlLmdldFRpbWUoKSAtIERhdGUubm93KCk7XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgZGF0ZS1pc2ggdmFsdWUgdG8gYSByZWFsIGBEYXRlYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuIEFjY2VwdHMsIGluIHRoaXMgb3JkZXI6XG4gKlxuICogICAtIGEgYERhdGVgIChwYXNzZWQgdGhyb3VnaDsgYW4gaW52YWxpZCBvbmUgaXMgYSBtaXNzKTtcbiAqICAgLSBhbiBlcG9jaCBOVU1CRVIgb3IgbnVtZXJpYyBzdHJpbmcsIGluIHNlY29uZHMgb3IgbWlsbGlzZWNvbmRzIChzZWVcbiAqICAgICB7QGxpbmsgU0VDT05EU19DRUlMSU5HfSk7XG4gKiAgIC0gYG5vd2AgKGFuZCBpdHMgYHRvZGF5YCBzcGVsbGluZyksIGZvciB0aGUgY3VycmVudCBpbnN0YW50O1xuICogICAtIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24sIHJlc29sdmVkIFJFTEFUSVZFIFRPIE5PVywgc28gYC03ZGAsXG4gKiAgICAgYDcgZGF5cyBhZ29gLCBhbmQgYGluIDMwIG1pbnV0ZXNgIGFyZSBhbGwgdmFsaWQgaW5zdGFudHM7XG4gKiAgIC0gYW55dGhpbmcgYERhdGUucGFyc2VgIHVuZGVyc3RhbmRzIChgMjAyNi0wOC0wMmAsIGFuIElTTy9VVEMgaW5zdGFudCkuXG4gKlxuICogVGhlIGVwb2NoIHVuaXQgaW5mZXJlbmNlIGlzIHRoZSByZWFzb24gdGhpcyBleGlzdHMgcmF0aGVyIHRoYW5cbiAqIGBuZXcgRGF0ZSh2YWx1ZSlgOiBhIGJhcmUgZXBvY2ggYXJyaXZlcyBhcyBhIFNUUklORyBmcm9tIGFuIGVudiB2YXIgb3IgYSBDTElcbiAqIGZsYWcgYXMgb2Z0ZW4gYXMgaXQgYXJyaXZlcyBhcyBhIG51bWJlciAoYGRhdGUgKyVzYCwgYSBKU09OIGZpZWxkLCBhIGNvcGllZCBsb2dcbiAqIGxpbmUpLCBhbmQgYERhdGUucGFyc2UoXCIxNzg1Njk3ODk5XCIpYCByZWFkcyB0aGF0IGFzIGEgWUVBUiwgc2lsZW50bHkgbGFuZGluZ1xuICogMS43IGJpbGxpb24geWVhcnMgb3V0LiBOdW1lcmljIHN0cmluZ3MgYXJlIHRoZXJlZm9yZSByb3V0ZWQgdG8gdGhlIGVwb2NoIHBhdGgsXG4gKiBuZXZlciB0byBgRGF0ZS5wYXJzZWAuXG4gKlxuICogVGhlIGR1cmF0aW9uIGZhbGxiYWNrIHJ1bnMgTEFTVCwgYWZ0ZXIgYERhdGUucGFyc2VgLCBzbyBhIHJlYWwgZGF0ZSBpcyBuZXZlclxuICogbWlzdGFrZW4gZm9yIGFuIG9mZnNldC4gYG9wdGlvbnMucGFyc2VEdXJhdGlvbjogZmFsc2VgIHJlbW92ZXMgaXQgZW50aXJlbHkgd2hlblxuICogdGhlIHZhbHVlIG11c3QgYmUgYW4gYWJzb2x1dGUgaW5zdGFudCAtIHNlZSB7QGxpbmsgVG9EYXRlT3B0aW9uc30uXG4gKlxuICogTGlrZSB7QGxpbmsgdG9Cb29sZWFufSB0aGlzIE5FVkVSIHRocm93cyBhbmQgcmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYW55dGhpbmdcbiAqIHVuaW50ZXJwcmV0YWJsZSwgc28gYSBjYWxsZXIgZGVjaWRlcyB3aGV0aGVyIGEgYmFkIHZhbHVlIGlzIGZhdGFsLCBhIHdhcm5pbmcsXG4gKiBvciBhIGZhbGxiYWNrLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0RhdGUoXCJub3dcIik7ICAgICAgICAgICAgICAgLy8gdGhpcyBpbnN0YW50XG4gKiB0b0RhdGUoXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgLy8gMjAyNi0wOC0wMlQwMDowMDowMC4wMDBaXG4gKiB0b0RhdGUoXCIxNzg1Njk3ODk5XCIpOyAgICAgICAgLy8gc2Vjb25kcyAtPiAyMDI2LTA4LTAyVC4uLlxuICogdG9EYXRlKDE3ODU2OTc4OTkwMDApOyAgICAgICAvLyBtaWxsaXMgIC0+IHRoZSBzYW1lIGluc3RhbnRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIpOyAgICAgICAvLyBub3cgLSAzMGRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7IC8vIHVuZGVmaW5lZFxuICogdG9EYXRlKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0RhdGVPcHRpb25zID0ge30pOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXBvY2hNcyA9IHRvRXBvY2hNcyh2YWx1ZSk7XG4gIGlmIChlcG9jaE1zICE9PSB1bmRlZmluZWQpIHJldHVybiBmcm9tTXMoZXBvY2hNcyk7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCB0ZXh0ID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0ZXh0ID09PSBcIm5vd1wiIHx8IHRleHQgPT09IFwidG9kYXlcIikgcmV0dXJuIG5ldyBEYXRlKCk7XG5cbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh2YWx1ZS50cmltKCkpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQpKSByZXR1cm4gbmV3IERhdGUocGFyc2VkKTtcblxuICBpZiAob3B0aW9ucy5wYXJzZUR1cmF0aW9uID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gUmVjdXJzZXMgd2l0aCBkYXRlIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kXG4gIC8vIGZvcnRoIGZvcmV2ZXIuXG4gIGNvbnN0IG9mZnNldE1zID0gdG9EdXJhdGlvbih2YWx1ZSwgeyBwYXJzZURhdGU6IGZhbHNlIH0pO1xuICByZXR1cm4gb2Zmc2V0TXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGZyb21NcyhEYXRlLm5vdygpICsgb2Zmc2V0TXMpO1xufVxuXG4vKiogQSBgRGF0ZWAgZm9yIGVwb2NoIGBtc2AsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgb3V0IG9mIHJlcHJlc2VudGFibGUgcmFuZ2UuICovXG5mdW5jdGlvbiBmcm9tTXMobXM6IG51bWJlcik6IERhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUobXMpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IGRhdGU7XG59XG5cbi8qKlxuICogRXBvY2ggbWlsbGlzZWNvbmRzIGZvciBhIG51bWVyaWMgdmFsdWUvc3RyaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vdCBvbmUsXG4gKiBhcHBseWluZyB0aGUgc2Vjb25kcy12cy1taWxsaXMgaW5mZXJlbmNlIGF0IHtAbGluayBTRUNPTkRTX0NFSUxJTkd9LlxuICovXG5mdW5jdGlvbiB0b0Vwb2NoTXModmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBudW1lcmljID0gdG9CYXJlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGguYWJzKG51bWVyaWMpIDwgU0VDT05EU19DRUlMSU5HID8gbnVtZXJpYyAqIDEwMDAgOiBudW1lcmljO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcC1lcXVhbGl0eSB3aXRoIGFuIG9wdGlvbmFsIGN1c3RvbSBjb21wYXJhdG9yLlxuICpcbiAqIHtAbGluayBkZWVwRXF1YWx9IG1pcnJvcnMgdGhlIHNlbWFudGljcyBvZiB0aGUgYGZhc3QtZGVlcC1lcXVhbGBcbiAqIHBhY2thZ2UgKGhhbmRsZWQ6IG5lc3RlZCBwbGFpbiBvYmplY3RzL2FycmF5cywgYE1hcGAsIGBTZXRgLCBgRGF0ZWAsXG4gKiBgUmVnRXhwYCwgdHlwZWQgYXJyYXlzLCBgTmFOYCwgYW5kIGArMGAvYC0wYCB0cmVhdGVkIGFzIGVxdWFsKSBidXQgaXNcbiAqIGRlcGVuZGVuY3ktZnJlZSBzbyBgQGRieC10b29scy9zaGFyZWQtY29yZWAga2VlcHMgbm8gcnVudGltZSBkZXBzLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgY29tcGFyYXRvcmAgc2hvcnQtY2lyY3VpdHMgdGhlIHN0cnVjdHVyYWwgd2FsayBhdCBhbnlcbiAqIG5vZGU6IHJldHVybiBgdHJ1ZWAvYGZhbHNlYCB0byBmb3JjZSB0aGUgcmVzdWx0IGZvciB0aGF0IHBhaXIsIG9yXG4gKiBgdW5kZWZpbmVkYCB0byBkZWZlciB0byB0aGUgYnVpbHQtaW4gY29tcGFyaXNvbi4gSXQgaXMgaW52b2tlZCBmb3IgdGhlXG4gKiByb290IHBhaXIgYW5kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIG5lc3RlZCBwYWlyLCBzbyBhIGNhbGxlciBjYW4sIGUuZy4sXG4gKiBjb21wYXJlIHR3byBkb21haW4gb2JqZWN0cyBieSBpZCB3aGlsZSBsZXR0aW5nIGV2ZXJ5dGhpbmcgZWxzZSBmYWxsXG4gKiBiYWNrIHRvIHN0cnVjdHVyYWwgZXF1YWxpdHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGRlZXBFcXVhbCh7IGE6IDEgfSwgeyBhOiAxIH0pOyAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKFsxLCAyXSwgWzEsIDJdKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKGEsIGIsICh4LCB5KSA9PlxuICogICBpc0VudGl0eSh4KSAmJiBpc0VudGl0eSh5KSA/IHguaWQgPT09IHkuaWQgOiB1bmRlZmluZWQpO1xuICovXG5leHBvcnQgdHlwZSBEZWVwRXF1YWxDb21wYXJhdG9yID0gKGE6IHVua25vd24sIGI6IHVua25vd24pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwoYTogdW5rbm93biwgYjogdW5rbm93biwgY29tcGFyYXRvcj86IERlZXBFcXVhbENvbXBhcmF0b3IpOiBib29sZWFuIHtcbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICBjb25zdCBkZWNpZGVkID0gY29tcGFyYXRvcihhLCBiKTtcbiAgICBpZiAoZGVjaWRlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZGVjaWRlZDtcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgYSA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gXCJvYmplY3RcIiB8fCBiID09PSBudWxsKSB7XG4gICAgLy8gTmFOIGlzIHRoZSBvbmx5IHZhbHVlIG5vdCBlcXVhbCB0byBpdHNlbGYgdW5kZXIgYD09PWAuXG4gICAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbiAgfVxuXG4gIGlmIChhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICBjb25zdCBiQXJyID0gYiBhcyB1bmtub3duW107XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYkFycltpXSwgY29tcGFyYXRvcikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGNvbnN0IGJNYXAgPSBiIGFzIE1hcDx1bmtub3duLCB1bmtub3duPjtcbiAgICBpZiAoYS5zaXplICE9PSBiTWFwLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgICBpZiAoIWJNYXAuaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghZGVlcEVxdWFsKHZhbHVlLCBiTWFwLmdldChrZXkpLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgY29uc3QgYlNldCA9IGIgYXMgU2V0PHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJTZXQuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYSkge1xuICAgICAgaWYgKCFiU2V0Lmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IChiIGFzIERhdGUpLmdldFRpbWUoKTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgY29uc3QgYlJlID0gYiBhcyBSZWdFeHA7XG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiUmUuc291cmNlICYmIGEuZmxhZ3MgPT09IGJSZS5mbGFncztcbiAgfVxuXG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgIShhIGluc3RhbmNlb2YgRGF0YVZpZXcpKSB7XG4gICAgY29uc3QgYUFyciA9IGEgYXMgdW5rbm93biBhcyBBcnJheUxpa2U8bnVtYmVyPjtcbiAgICBjb25zdCBiQXJyID0gYiBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGlmIChhQXJyLmxlbmd0aCAhPT0gYkFyci5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhQXJyW2ldICE9PSBiQXJyW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IG9mIGFLZXlzKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChcbiAgICAgICFkZWVwRXF1YWwoXG4gICAgICAgIChhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICAoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICAgY29tcGFyYXRvcixcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/async.ts","../src/brand.ts","../src/
|
|
1
|
+
{"root":["../src/async.ts","../src/brand.ts","../src/context.ts","../src/error.ts","../src/execution.ts","../src/function.ts","../src/hash.ts","../src/http.ts","../src/json.ts","../src/log.ts","../src/net.ts","../src/object.ts","../src/pattern.ts","../src/predicate.ts","../src/string.ts","../src/token.ts","../index.ts"],"version":"5.9.3"}
|