@whereby.com/camera-effects 0.0.0-canary-20260209135141 → 1.0.1
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/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/legacy-esm.js +2 -2
- package/package.json +3 -3
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/brick-720p.jpg +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/bubbles.mp4 +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/cabin-720p.jpg +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/clay.png +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/concrete-720p.jpg +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/day-720p.png +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/focus.png +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/glow.png +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/haven.png +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/neon.mp4 +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/night-720p.png +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/pulse.png +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/studio.png +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/backgrounds/sunrise-720p.png +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/tflite/models/segm_full_v679.tflite +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/tflite/models/segm_lite_v681.tflite +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/tflite/models/selfiesegmentation_mlkit-256x256-2021_01_19-v1215.f16.tflite +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/tflite/tflite-simd.wasm +0 -0
- /package/dist/cdn/{v0-0-0-canary-20260209135141-canary → v1-0-1}/assets/tflite/tflite.wasm +0 -0
package/dist/index.cjs
CHANGED
|
@@ -646,7 +646,7 @@ function createCanvas(width, height) {
|
|
|
646
646
|
}
|
|
647
647
|
}
|
|
648
648
|
|
|
649
|
-
const CDN_BASE_URL = "https://cdn.srv.whereby.com/camera-effects/
|
|
649
|
+
const CDN_BASE_URL = "https://cdn.srv.whereby.com/camera-effects/v1-0-1";
|
|
650
650
|
const getAssetUrl = (path) => {
|
|
651
651
|
{
|
|
652
652
|
return `${CDN_BASE_URL}/${path}`;
|
|
@@ -1859,7 +1859,7 @@ class ProcessorProxy extends eventsExports.EventEmitter {
|
|
|
1859
1859
|
}
|
|
1860
1860
|
}
|
|
1861
1861
|
|
|
1862
|
-
var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKHdhc21GZWF0dXJlRGV0ZWN0KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdCA6IG51bGw7CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uDQoNCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkNCiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSA0KICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQ0KICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUg0KICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQogICAgLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqLw0KDQoNCiAgICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQ0KICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9DQogICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHsNCiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7DQogICAgICAgIHJldHVybiBlLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlOw0KICAgIH07CgogICAgdmFyIGV2ZW50cyA9IHtleHBvcnRzOiB7fX07CgogICAgdmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbDsKICAgIHZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nCiAgICAgID8gUi5hcHBseQogICAgICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7CiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpOwogICAgICB9OwoKICAgIHZhciBSZWZsZWN0T3duS2V5czsKICAgIGlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXM7CiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KQogICAgICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpOwogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykgewogICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTsKICAgIH0KCiAgICB2YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkgewogICAgICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpOwogICAgfQogICAgZXZlbnRzLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7CiAgICBldmVudHMuZXhwb3J0cy5vbmNlID0gb25jZTsKCiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLngKICAgIEV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkOwoKICAgIC8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZQogICAgLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy4KICAgIHZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7CgogICAgZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpOwogICAgICB9CiAgICB9CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7CiAgICAgIH0KICAgIH0pOwoKICAgIEV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHwKICAgICAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHsKICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfQoKICAgICAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDsKICAgIH07CgogICAgLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzCiAgICAvLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC4KICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHsKICAgICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTsKICAgICAgfQogICAgICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7CiAgICAgIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7CiAgICB9CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7CiAgICAgIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTsKCiAgICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7CiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkKICAgICAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpOwogICAgICBlbHNlIGlmICghZG9FcnJvcikKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuCiAgICAgIGlmIChkb0Vycm9yKSB7CiAgICAgICAgdmFyIGVyOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApCiAgICAgICAgICBlciA9IGFyZ3NbMF07CiAgICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvdwogICAgICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4KICAgICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudAogICAgICAgIH0KICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyCiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7CiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjsKICAgICAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50CiAgICAgIH0KCiAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoOwogICAgICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkKICAgICAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHsKICAgICAgdmFyIG07CiAgICAgIHZhciBldmVudHM7CiAgICAgIHZhciBleGlzdGluZzsKCiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSAibmV3TGlzdGVuZXIiISBCZWZvcmUKICAgICAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCAibmV3TGlzdGVuZXIiLgogICAgICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7CgogICAgICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZQogICAgICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdAogICAgICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdOwogICAgICB9CgogICAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LgogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7CiAgICAgICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50OwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LgogICAgICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPQogICAgICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTsKICAgICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC4KICAgICAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHsKICAgICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrCiAgICAgICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTsKICAgICAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7CiAgICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlOwogICAgICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmcKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheAogICAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTsKICAgICAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnOwogICAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0OwogICAgICAgICAgdy50eXBlID0gdHlwZTsKICAgICAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7CiAgICAgICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpOwogICAgICAgIH07CgogICAgZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7CiAgICAgIGlmICghdGhpcy5maXJlZCkgewogICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pOwogICAgICAgIHRoaXMuZmlyZWQgPSB0cnVlOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7CiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikgewogICAgICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTsKICAgICAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTsKICAgICAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkOwogICAgICByZXR1cm4gd3JhcHBlZDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKCiAgICAvLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9CiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyOwoKICAgICAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTsKICAgICAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikgewogICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdOwogICAgICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcG9zaXRpb24gPSAtMTsKCiAgICAgICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyOwogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKQogICAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKQogICAgICAgICAgICAgIGxpc3Quc2hpZnQoKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKQogICAgICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07CgogICAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0KICAgICAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkgewogICAgICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdAogICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHMKICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBrZXkgPSBrZXlzW2ldOwogICAgICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CgogICAgICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTsKICAgICAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgLy8gTElGTyBvcmRlcgogICAgICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwoKICAgIGZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHsKICAgICAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzOwoKICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwogICAgICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykKICAgICAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07CgogICAgICByZXR1cm4gdW53cmFwID8KICAgICAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpOwogICAgICB9CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7CiAgICBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHsKICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKCiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdOwogICAgfTsKCiAgICBmdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikgewogICAgICB2YXIgY29weSA9IG5ldyBBcnJheShuKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpCiAgICAgICAgY29weVtpXSA9IGFycltpXTsKICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7CiAgICAgIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykKICAgICAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTsKICAgICAgbGlzdC5wb3AoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7CiAgICAgIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7CiAgICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTsKICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTsKICAgICAgICB9CiAgICAgICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHsKICAgICAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlCiAgICAgICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS4KICAgICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykgewogICAgICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZQogICAgICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS4KICAgICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpOwogICAgICAgICAgfQogICAgICAgICAgbGlzdGVuZXIoYXJnKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTsKICAgICAgfQogICAgfQoKICAgIHZhciBldmVudHNFeHBvcnRzID0gZXZlbnRzLmV4cG9ydHM7CgogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICBpZiAoc2VsZi5kb2N1bWVudCkgewogICAgICAgICAgICBjb25zdCBjYW52YXMgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2VsZi5PZmZzY3JlZW5DYW52YXMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IENETl9CQVNFX1VSTCA9ICJodHRwczovL2Nkbi5zcnYud2hlcmVieS5jb20vY2FtZXJhLWVmZmVjdHMvdjAtMC0wLWNhbmFyeS0yMDI2MDIwOTEzNTE0MS1jYW5hcnkiOwogICAgY29uc3QgZ2V0QXNzZXRVcmwgPSAocGF0aCkgPT4gewogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGAke0NETl9CQVNFX1VSTH0vJHtwYXRofWA7CiAgICAgICAgfQogICAgfTsKICAgIGNvbnN0IGFzc2V0VXJscyA9IHsKICAgICAgICB0ZmxpdGU6IHsKICAgICAgICAgICAgd2FzbTogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvdGZsaXRlLndhc20iKSAsCiAgICAgICAgICAgIHdhc21TaW1kOiBnZXRBc3NldFVybCgiYXNzZXRzL3RmbGl0ZS90ZmxpdGUtc2ltZC53YXNtIikgLAogICAgICAgIH0sCiAgICAgICAgbW9kZWxzOiB7CiAgICAgICAgICAgIHNlZ21MaXRlOiBnZXRBc3NldFVybCgiYXNzZXRzL3RmbGl0ZS9tb2RlbHMvc2VnbV9saXRlX3Y2ODEudGZsaXRlIikgLAogICAgICAgICAgICBzZWdtRnVsbDogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvbW9kZWxzL3NlZ21fZnVsbF92Njc5LnRmbGl0ZSIpICwKICAgICAgICAgICAgbWxraXQ6IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL21vZGVscy9zZWxmaWVzZWdtZW50YXRpb25fbWxraXQtMjU2eDI1Ni0yMDIxXzAxXzE5LXYxMjE1LmYxNi50ZmxpdGUiKQogICAgICAgICAgICAgICAgLAogICAgICAgIH19OwoKICAgIGNvbnN0IGxvYWRUZmxpdGVNb2R1bGUgPSAoaXNTaW1kKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICBjb25zdCBjcmVhdGVUZmxpdGVNb2R1bGUgPSBpc1NpbWQKICAgICAgICAgICAgPyB5aWVsZCBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRmbGl0ZVNpbWQ7IH0pLnRoZW4oKG0pID0+IG0uZGVmYXVsdCkKICAgICAgICAgICAgOiB5aWVsZCBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRmbGl0ZTsgfSkudGhlbigobSkgPT4gbS5kZWZhdWx0KTsKICAgICAgICByZXR1cm4gY3JlYXRlVGZsaXRlTW9kdWxlOwogICAgfSk7CiAgICBjb25zdCBnZXRNb2RlbFVybCA9IChtb2RlbElkKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAobW9kZWxJZCkgewogICAgICAgICAgICAgICAgY2FzZSAibWVldGxpdGUiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBhc3NldFVybHMubW9kZWxzLnNlZ21MaXRlOwogICAgICAgICAgICAgICAgY2FzZSAibWVldGZ1bGwiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBhc3NldFVybHMubW9kZWxzLnNlZ21GdWxsOwogICAgICAgICAgICAgICAgY2FzZSAibWxraXQiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBhc3NldFVybHMubW9kZWxzLm1sa2l0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CiAgICBjb25zdCBnZXRXYXNtVXJsID0gKGlzU2ltZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gaXNTaW1kID8gYXNzZXRVcmxzLnRmbGl0ZS53YXNtU2ltZCA6IGFzc2V0VXJscy50ZmxpdGUud2FzbTsKICAgICAgICB9CiAgICB9KTsKICAgIGNvbnN0IFNFR01FTlRBVElPTk1PREVMX1RZUEVfQkFDS0dST1VORF9QRVJTT04gPSAxOwogICAgY29uc3QgU0VHTUVOVEFUSU9OTU9ERUxfVFlQRV9QRVJTT04gPSAyOwogICAgY29uc3QgcmVzb2x2ZUFzc2V0VXJsID0gKHVybCkgPT4gewogICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCgiaHR0cDovLyIpIHx8IHVybC5zdGFydHNXaXRoKCJodHRwczovLyIpIHx8IHVybC5zdGFydHNXaXRoKCJibG9iOiIpIHx8IHVybC5zdGFydHNXaXRoKCJkYXRhOiIpKSB7CiAgICAgICAgICAgIHJldHVybiB1cmw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgVVJMKHVybCwgKF9kb2N1bWVudEN1cnJlbnRTY3JpcHQgJiYgX2RvY3VtZW50Q3VycmVudFNjcmlwdC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdTQ1JJUFQnICYmIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQuc3JjIHx8IG5ldyBVUkwoJ1Byb2Nlc3NvclByb3h5Lndvcmtlci5qcycsIGRvY3VtZW50LmJhc2VVUkkpLmhyZWYpKS5ocmVmOwogICAgfTsKICAgIGNvbnN0IG1vZGVscyA9IHsKICAgICAgICBtZWV0bGl0ZTogewogICAgICAgICAgICBpZDogIm1lZXRsaXRlIiwKICAgICAgICAgICAgdHlwZTogU0VHTUVOVEFUSU9OTU9ERUxfVFlQRV9CQUNLR1JPVU5EX1BFUlNPTiwKICAgICAgICB9LAogICAgICAgIG1lZXRmdWxsOiB7CiAgICAgICAgICAgIGlkOiAibWVldGZ1bGwiLAogICAgICAgICAgICB0eXBlOiBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OLAogICAgICAgIH0sCiAgICAgICAgbWxraXQ6IHsKICAgICAgICAgICAgaWQ6ICJtbGtpdCIsCiAgICAgICAgICAgIHR5cGU6IFNFR01FTlRBVElPTk1PREVMX1RZUEVfUEVSU09OLAogICAgICAgIH0sCiAgICB9OwogICAgbGV0IF90ZmxpdGUgPSBudWxsOwogICAgY29uc3QgbG9hZFRGTGl0ZSA9ICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgIGlmIChfdGZsaXRlKQogICAgICAgICAgICByZXR1cm4gX3RmbGl0ZTsKICAgICAgICBjb25zdCBzaW1kSXNTdXBwb3J0ZWQgPSB5aWVsZCB3YXNtRmVhdHVyZURldGVjdC5zaW1kKCk7CiAgICAgICAgY29uc3QgY3JlYXRlVGZsaXRlTW9kdWxlID0geWllbGQgbG9hZFRmbGl0ZU1vZHVsZShzaW1kSXNTdXBwb3J0ZWQpOwogICAgICAgIGNvbnN0IHdhc21VcmwgPSB5aWVsZCBnZXRXYXNtVXJsKHNpbWRJc1N1cHBvcnRlZCk7CiAgICAgICAgX3RmbGl0ZSA9IHlpZWxkIGNyZWF0ZVRmbGl0ZU1vZHVsZSh7CiAgICAgICAgICAgIGxvY2F0ZUZpbGUocGF0aCkgewogICAgICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoIi53YXNtIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFzc2V0VXJsKHdhc21VcmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgICAgICAgIH0sCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIF90ZmxpdGU7CiAgICB9KTsKICAgIGxldCBfY3VycmVudE1vZGVsQW5kSW5mbzsKICAgIGNvbnN0IGxvYWRTZWdtZW50YXRpb25Nb2RlbCA9IChzZWdtZW50YXRpb25Nb2RlbElkKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICBjb25zdCBtb2RlbCA9IG1vZGVsc1tzZWdtZW50YXRpb25Nb2RlbElkXTsKICAgICAgICBjb25zdCBtb2RlbFVybCA9IHJlc29sdmVBc3NldFVybCh5aWVsZCBnZXRNb2RlbFVybChtb2RlbC5pZCkpOwogICAgICAgIGNvbnN0IHRmbGl0ZSA9IHlpZWxkIGxvYWRURkxpdGUoKTsKICAgICAgICBpZiAoKF9jdXJyZW50TW9kZWxBbmRJbmZvID09PSBudWxsIHx8IF9jdXJyZW50TW9kZWxBbmRJbmZvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY3VycmVudE1vZGVsQW5kSW5mby51cmwpID09PSBtb2RlbFVybCkKICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50TW9kZWxBbmRJbmZvOwogICAgICAgIGNvbnN0IG1vZGVsUmVzcG9uc2UgPSB5aWVsZCBmZXRjaChtb2RlbFVybCk7CiAgICAgICAgY29uc3QgbW9kZWxCdWZmZXIgPSB5aWVsZCBtb2RlbFJlc3BvbnNlLmFycmF5QnVmZmVyKCk7CiAgICAgICAgY29uc3QgbW9kZWxCdWZmZXJPZmZzZXQgPSB0ZmxpdGUuX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0KCk7CiAgICAgICAgdGZsaXRlLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkobW9kZWxCdWZmZXIpLCBtb2RlbEJ1ZmZlck9mZnNldCk7CiAgICAgICAgdGZsaXRlLl9sb2FkTW9kZWwobW9kZWxCdWZmZXIuYnl0ZUxlbmd0aCk7CiAgICAgICAgY29uc3QgaW5wdXRIZWlnaHQgPSB0ZmxpdGUuX2dldElucHV0SGVpZ2h0KCk7CiAgICAgICAgY29uc3QgaW5wdXRXaWR0aCA9IHRmbGl0ZS5fZ2V0SW5wdXRXaWR0aCgpOwogICAgICAgIGNvbnN0IGlucHV0TWVtb3J5T2Zmc2V0ID0gdGZsaXRlLl9nZXRJbnB1dE1lbW9yeU9mZnNldCgpIC8gNDsKICAgICAgICBjb25zdCBvdXRwdXRNZW1vcnlPZmZzZXQgPSB0ZmxpdGUuX2dldE91dHB1dE1lbW9yeU9mZnNldCgpIC8gNDsKICAgICAgICBjb25zdCBzZWdtZW50YXRpb25QaXhlbENvdW50ID0gaW5wdXRXaWR0aCAqIGlucHV0SGVpZ2h0OwogICAgICAgIHRmbGl0ZS5fcnVuSW5mZXJlbmNlKCk7CiAgICAgICAgX2N1cnJlbnRNb2RlbEFuZEluZm8gPSB7CiAgICAgICAgICAgIHRmbGl0ZSwKICAgICAgICAgICAgbW9kZWwsCiAgICAgICAgICAgIHVybDogbW9kZWxVcmwsCiAgICAgICAgICAgIGlucHV0SGVpZ2h0LAogICAgICAgICAgICBpbnB1dFdpZHRoLAogICAgICAgICAgICBpbnB1dE1lbW9yeU9mZnNldCwKICAgICAgICAgICAgb3V0cHV0TWVtb3J5T2Zmc2V0LAogICAgICAgICAgICBzZWdtZW50YXRpb25QaXhlbENvdW50LAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIF9jdXJyZW50TW9kZWxBbmRJbmZvOwogICAgfSk7CgogICAgY29uc3QgYmFzZUNhbnZhc1BhcmFtcyA9IHsKICAgICAgICBtYXNrT3BlcmF0aW9uOiAiY29weSIsCiAgICAgICAgbWFza0ZpbHRlcjogImJsdXIoNHB4KSIsCiAgICAgICAgcGVyc29uT3BlcmF0aW9uOiAic291cmNlLWluIiwKICAgICAgICBwZXJzb25GaWx0ZXI6ICJub25lIiwKICAgICAgICBiYWNrZ3JvdW5kT3BlcmF0aW9uOiAiZGVzdGluYXRpb24tb3ZlciIsCiAgICAgICAgYmFja2dyb3VuZEZpbHRlcjogIm5vbmUiLAogICAgfTsKICAgIGZ1bmN0aW9uIGdldEJsdXJDYW52YXNQYXJhbXMoYW1vdW50KSB7CiAgICAgICAgc3dpdGNoIChhbW91bnQpIHsKICAgICAgICAgICAgY2FzZSAic2xpZ2h0IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgYmFja2dyb3VuZEZpbHRlcjogImJsdXIoNHB4KSIsIGNyb3A6IDQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiaGVhdnkiOiB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ2FudmFzUGFyYW1zKSwgeyBtYXNrRmlsdGVyOiAiYmx1cig4cHgpIiwgYmFja2dyb3VuZEZpbHRlcjogImJsdXIoMTZweCkiLCBjcm9wOiAxNiB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ2FudmFzUGFyYW1zKSwgeyBtYXNrRmlsdGVyOiAiYmx1cig4cHgpIiwgYmFja2dyb3VuZEZpbHRlcjogImJsdXIoOHB4KSIsIGNyb3A6IDggfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRDYW52YXNQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgaWYgKHBhcmFtcy5iYWNrZ3JvdW5kQmx1cikKICAgICAgICAgICAgcmV0dXJuIGdldEJsdXJDYW52YXNQYXJhbXMocGFyYW1zLmJhY2tncm91bmRCbHVyLmFtb3VudCk7CiAgICAgICAgcmV0dXJuIGJhc2VDYW52YXNQYXJhbXM7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVDYW52YXNFbmdpbmUodmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIHNldHVwLCBlZmZlY3RDYW52YXMsIHBhcmFtcykgewogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgIGNvbnN0IHsgdGZsaXRlLCBtb2RlbDogc2VnbWVudGF0aW9uTW9kZWwsIGlucHV0SGVpZ2h0LCBpbnB1dFdpZHRoLCBpbnB1dE1lbW9yeU9mZnNldCwgb3V0cHV0TWVtb3J5T2Zmc2V0LCBzZWdtZW50YXRpb25QaXhlbENvdW50LCB9ID0geWllbGQgbG9hZFNlZ21lbnRhdGlvbk1vZGVsKHNldHVwLnNlZ21lbnRhdGlvbk1vZGVsSWQpOwogICAgICAgICAgICBsZXQgY2FudmFzUGFyYW1zID0gZ2V0Q2FudmFzUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRhdGlvbkNhbnZhcyA9IGNyZWF0ZUNhbnZhcyhpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCk7CiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRhdGlvbkN0eCA9IHNlZ21lbnRhdGlvbkNhbnZhcy5nZXRDb250ZXh0KCIyZCIsIHsKICAgICAgICAgICAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRhdGlvbk1hc2sgPSBuZXcgSW1hZ2VEYXRhKGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0KTsKICAgICAgICAgICAgbGV0IGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBudWxsOwogICAgICAgICAgICBsZXQgYmFja2dyb3VuZERpbWVuc2lvbnMgPSB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTsKICAgICAgICAgICAgY29uc3QgdmlkZW9Bc3BlY3RSYXRpbyA9IHZpZGVvV2lkdGggLyB2aWRlb0hlaWdodDsKICAgICAgICAgICAgbGV0IGNyb3BYID0gMDsKICAgICAgICAgICAgbGV0IGNyb3BZID0gMDsKICAgICAgICAgICAgY29uc3QgdXBkYXRlQ3JvcCA9ICgpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGNyb3AgPSBjYW52YXNQYXJhbXMuY3JvcCB8fCAwOwogICAgICAgICAgICAgICAgaWYgKGNyb3ApIHsKICAgICAgICAgICAgICAgICAgICBjcm9wWCA9IHZpZGVvQXNwZWN0UmF0aW8gPiAxID8gTWF0aC5yb3VuZChjcm9wICogdmlkZW9Bc3BlY3RSYXRpbykgOiBjcm9wOwogICAgICAgICAgICAgICAgICAgIGNyb3BZID0gdmlkZW9Bc3BlY3RSYXRpbyA8IDEgPyBNYXRoLnJvdW5kKGNyb3AgLyB2aWRlb0FzcGVjdFJhdGlvKSA6IGNyb3A7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjcm9wWCA9IDA7CiAgICAgICAgICAgICAgICAgICAgY3JvcFkgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGRhdGVDcm9wKCk7CiAgICAgICAgICAgIGNvbnN0IGVmZmVjdEN0eCA9IGVmZmVjdENhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgZWZmZWN0Q3R4LAogICAgICAgICAgICAgICAgdXBkYXRlQmFja2dyb3VuZEZyYW1lKGZyYW1lLCBkaW1lbnNpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudEJhY2tncm91bmRGcmFtZSA9IGZyYW1lOwogICAgICAgICAgICAgICAgICAgIGlmIChkaW1lbnNpb25zKQogICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kRGltZW5zaW9ucyA9IGRpbWVuc2lvbnM7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdXBkYXRlUGFyYW1zKHVwZGF0ZWRQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBjYW52YXNQYXJhbXMgPSBnZXRDYW52YXNQYXJhbXModXBkYXRlZFBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ3JvcCgpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHByb2Nlc3NGcmFtZShmcmFtZSkgewogICAgICAgICAgICAgICAgICAgIHNlZ21lbnRhdGlvbkN0eC5kcmF3SW1hZ2UoZnJhbWUsIDAsIDAsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCAwLCAwLCBpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gc2VnbWVudGF0aW9uQ3R4LmdldEltYWdlRGF0YSgwLCAwLCBpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50YXRpb25QaXhlbENvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlLkhFQVBGMzJbaW5wdXRNZW1vcnlPZmZzZXQgKyBpICogM10gPSBpbWFnZURhdGEuZGF0YVtpICogNF0gLyAyNTU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZS5IRUFQRjMyW2lucHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDMgKyAxXSA9IGltYWdlRGF0YS5kYXRhW2kgKiA0ICsgMV0gLyAyNTU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZS5IRUFQRjMyW2lucHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDMgKyAyXSA9IGltYWdlRGF0YS5kYXRhW2kgKiA0ICsgMl0gLyAyNTU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRmbGl0ZS5fcnVuSW5mZXJlbmNlKCk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50YXRpb25QaXhlbENvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRhdGlvbk1vZGVsLnR5cGUgPT09IFNFR01FTlRBVElPTk1PREVMX1RZUEVfQkFDS0dST1VORF9QRVJTT04pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmQgPSB0ZmxpdGUuSEVBUEYzMltvdXRwdXRNZW1vcnlPZmZzZXQgKyBpICogMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZXJzb24gPSB0ZmxpdGUuSEVBUEYzMltvdXRwdXRNZW1vcnlPZmZzZXQgKyBpICogMiArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hpZnQgPSBNYXRoLm1heChiYWNrZ3JvdW5kLCBwZXJzb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZEV4cCA9IE1hdGguZXhwKGJhY2tncm91bmQgLSBzaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZXJzb25FeHAgPSBNYXRoLmV4cChwZXJzb24gLSBzaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25NYXNrLmRhdGFbaSAqIDQgKyAzXSA9ICgyNTUgKiBwZXJzb25FeHApIC8gKGJhY2tncm91bmRFeHAgKyBwZXJzb25FeHApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlZ21lbnRhdGlvbk1vZGVsLnR5cGUgPT09IFNFR01FTlRBVElPTk1PREVMX1RZUEVfUEVSU09OKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZXJzb24gPSB0ZmxpdGUuSEVBUEYzMltvdXRwdXRNZW1vcnlPZmZzZXQgKyBpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRhdGlvbk1hc2suZGF0YVtpICogNCArIDNdID0gMjU1ICogcGVyc29uOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNlZ21lbnRhdGlvbkN0eC5wdXRJbWFnZURhdGEoc2VnbWVudGF0aW9uTWFzaywgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5tYXNrT3BlcmF0aW9uOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSBjYW52YXNQYXJhbXMubWFza0ZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZHJhd0ltYWdlKHNlZ21lbnRhdGlvbkNhbnZhcywgMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQsIDAsIDAsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gY2FudmFzUGFyYW1zLnBlcnNvbk9wZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZmlsdGVyID0gY2FudmFzUGFyYW1zLnBlcnNvbkZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZHJhd0ltYWdlKGZyYW1lLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gY2FudmFzUGFyYW1zLmJhY2tncm91bmRPcGVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmZpbHRlciA9IGNhbnZhc1BhcmFtcy5iYWNrZ3JvdW5kRmlsdGVyOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoY3VycmVudEJhY2tncm91bmRGcmFtZSwgYmFja2dyb3VuZERpbWVuc2lvbnMueCwgYmFja2dyb3VuZERpbWVuc2lvbnMueSwgYmFja2dyb3VuZERpbWVuc2lvbnMud2lkdGgsIGJhY2tncm91bmREaW1lbnNpb25zLmhlaWdodCwgMCwgMCwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShmcmFtZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjcm9wWCB8fCBjcm9wWSkgewogICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gInNvdXJjZS1vdmVyIjsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmZpbHRlciA9ICJub25lIjsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShlZmZlY3RDYW52YXMsIGNyb3BYLCBjcm9wWSwgdmlkZW9XaWR0aCAtIGNyb3BYICogMiwgdmlkZW9IZWlnaHQgLSBjcm9wWSAqIDIsIDAsIDAsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlzcG9zZSgpIHsgfSwKICAgICAgICAgICAgfTsKICAgICAgICB9KTsKICAgIH0KCiAgICBjb25zdCBnbHNsID0gU3RyaW5nLnJhdzsKICAgIGZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIpIHsKICAgICAgICBjb25zdCBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpOwogICAgICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwogICAgICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7CiAgICAgICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgaWYgKCFnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBsaW5rIFdlYkdMIHByb2dyYW06ICR7Z2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSl9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9ncmFtOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpIHsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcik7CiAgICAgICAgY29uc3QgcG9zaXRpb25BdHRyaWJ1dGVMb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJhX3Bvc2l0aW9uIik7CiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb25BdHRyaWJ1dGVMb2NhdGlvbik7CiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHBvc2l0aW9uQnVmZmVyKTsKICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMCwgMCk7CiAgICAgICAgY29uc3QgdGV4Q29vcmRBdHRyaWJ1dGVMb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJhX3RleENvb3JkIik7CiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGV4Q29vcmRBdHRyaWJ1dGVMb2NhdGlvbik7CiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRleENvb3JkQnVmZmVyKTsKICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMCwgMCk7CiAgICAgICAgcmV0dXJuIHByb2dyYW07CiAgICB9CiAgICBmdW5jdGlvbiBjb21waWxlU2hhZGVyKGdsLCBzaGFkZXJUeXBlLCBzaGFkZXJTb3VyY2UpIHsKICAgICAgICBjb25zdCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7CiAgICAgICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc2hhZGVyU291cmNlKTsKICAgICAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7CiAgICAgICAgaWYgKCFnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgY29tcGlsZSBzaGFkZXI6ICR7Z2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2hhZGVyOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlVGV4dHVyZShnbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIG1pbkZpbHRlciA9IGdsLk5FQVJFU1QsIG1hZ0ZpbHRlciA9IGdsLk5FQVJFU1QpIHsKICAgICAgICBjb25zdCB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOwogICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpOwogICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBtaW5GaWx0ZXIpOwogICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBtYWdGaWx0ZXIpOwogICAgICAgIGdsLnRleFN0b3JhZ2UyRChnbC5URVhUVVJFXzJELCAxLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgcmV0dXJuIHRleHR1cmU7CiAgICB9CgogICAgZnVuY3Rpb24gZ2VuZXJhdGVPcHRpbWl6ZWRHYXVzc2lhbktlcm5lbChzaWdtYSkgewogICAgICAgIGNvbnN0IGcgPSAoeCkgPT4gTWF0aC5leHAoLSh4ICogeCkgLyAoMiAqIHNpZ21hICogc2lnbWEpKTsKICAgICAgICBjb25zdCBudW1iZXJzID0gW107CiAgICAgICAgbGV0IHggPSAwOwogICAgICAgIGxldCBjdXJyZW50U3VtID0gMDsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICBjb25zdCBuID0gZyh4KTsKICAgICAgICAgICAgY29uc3QgbmV4dFN1bSA9IGN1cnJlbnRTdW0gKyAoY3VycmVudFN1bSA/IG4gKiAyIDogbik7CiAgICAgICAgICAgIGlmIChjdXJyZW50U3VtICYmIG4gLyBuZXh0U3VtIDwgMC4wMSAmJiBudW1iZXJzLmxlbmd0aCAlIDIpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY3VycmVudFN1bSA9IG5leHRTdW07CiAgICAgICAgICAgIG51bWJlcnMucHVzaChuKTsKICAgICAgICAgICAgeCsrOwogICAgICAgIH0KICAgICAgICBjb25zdCB3ZWlnaHRzID0gbnVtYmVycy5tYXAoKG4pID0+IG4gLyBjdXJyZW50U3VtKTsKICAgICAgICBjb25zdCBvcHRpbWl6ZWRXZWlnaHRzID0gW3dlaWdodHNbMF1dOwogICAgICAgIGNvbnN0IG9wdGltaXplZFBvc2l0aW9ucyA9IFswXTsKICAgICAgICBpZiAod2VpZ2h0cy5sZW5ndGggPj0gMyAmJiB3ZWlnaHRzLmxlbmd0aCAlIDIgPT09IDEpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB3ZWlnaHRzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgICAgICAgICBjb25zdCB3MSA9IHdlaWdodHNbaV07CiAgICAgICAgICAgICAgICBjb25zdCB3MiA9IHdlaWdodHNbaSArIDFdOwogICAgICAgICAgICAgICAgY29uc3QgdyA9IHcxICsgdzI7CiAgICAgICAgICAgICAgICBjb25zdCBwID0gdzIgLyAodzEgKyB3Mik7CiAgICAgICAgICAgICAgICBvcHRpbWl6ZWRXZWlnaHRzLnB1c2godyk7CiAgICAgICAgICAgICAgICBvcHRpbWl6ZWRQb3NpdGlvbnMucHVzaChpICsgcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgd2VpZ2h0czogb3B0aW1pemVkV2VpZ2h0cywKICAgICAgICAgICAgcG9zaXRpb25zOiBvcHRpbWl6ZWRQb3NpdGlvbnMsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmx1clBhc3MoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBwZXJzb25NYXNrVGV4dHVyZSwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKSB7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbnB1dEZyYW1lOwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfcGVyc29uTWFzazsKICAgICAgICB1bmlmb3JtIGZsb2F0IHVfd2VpZ2h0WzIwXTsKICAgICAgICB1bmlmb3JtIGZsb2F0IHVfb2Zmc2V0WzIwXTsKICAgICAgICB1bmlmb3JtIGludCB1X2tzaXplOwogICAgICAgIHVuaWZvcm0gdmVjMiB1X3RleGVsU2l6ZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICB2ZWM0IGNlbnRlckNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpOwogICAgICAgICAgICBmbG9hdCBwZXJzb25NYXNrID0gdGV4dHVyZSh1X3BlcnNvbk1hc2ssIHZfdGV4Q29vcmQpLmE7CiAgICAgICAgICAgIHZlYzQgZnJhbWVDb2xvciA9IGNlbnRlckNvbG9yICogdV93ZWlnaHRbMF0gKiAoMS4wIC0gcGVyc29uTWFzayk7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdV9rc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAgICB2ZWMyIG9mZnNldCA9IHZlYzIodV9vZmZzZXRbaV0pICogdV90ZXhlbFNpemU7CiAgICAgICAgICAgICAgICB2ZWMyIHRleENvb3JkID0gdl90ZXhDb29yZCArIG9mZnNldDsKICAgICAgICAgICAgICAgIGZyYW1lQ29sb3IgKz0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHRleENvb3JkKSAqIHVfd2VpZ2h0W2ldICoKICAgICAgICAgICAgICAgICAgICAoMS4wIC0gdGV4dHVyZSh1X3BlcnNvbk1hc2ssIHRleENvb3JkKS5hKTsKICAgICAgICAgICAgICAgIHRleENvb3JkID0gdl90ZXhDb29yZCAtIG9mZnNldDsKICAgICAgICAgICAgICAgIGZyYW1lQ29sb3IgKz0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHRleENvb3JkKSAqIHVfd2VpZ2h0W2ldICoKICAgICAgICAgICAgICAgICAgICAoMS4wIC0gdGV4dHVyZSh1X3BlcnNvbk1hc2ssIHRleENvb3JkKS5hKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXRDb2xvciA9IHZlYzQoZnJhbWVDb2xvci5yZ2IgKyAoMS4wIC0gZnJhbWVDb2xvci5hKSAqIGNlbnRlckNvbG9yLnJnYiwgMS4wKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCBzY2FsZSA9IHBhcmFtcy5iYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZSB8fCAwLjI7CiAgICAgICAgY29uc3QgYmx1cnJlZEJhY2tncm91bmRXaWR0aCA9IE1hdGgucm91bmQob3V0cHV0V2lkdGggKiBzY2FsZSk7CiAgICAgICAgY29uc3QgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQgPSBNYXRoLnJvdW5kKG91dHB1dEhlaWdodCAqIHNjYWxlKTsKICAgICAgICBjb25zdCB0ZXhlbFdpZHRoID0gMSAvIGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGg7CiAgICAgICAgY29uc3QgdGV4ZWxIZWlnaHQgPSAxIC8gYmx1cnJlZEJhY2tncm91bmRIZWlnaHQ7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0RnJhbWVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9pbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgcGVyc29uTWFza0xvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X3BlcnNvbk1hc2siKTsKICAgICAgICBjb25zdCB0ZXhlbFNpemVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV90ZXhlbFNpemUiKTsKICAgICAgICBjb25zdCB3ZWlnaHRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV93ZWlnaHQiKTsKICAgICAgICBjb25zdCBvZmZzZXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9vZmZzZXQiKTsKICAgICAgICBjb25zdCBrZXJuZWxzaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfa3NpemUiKTsKICAgICAgICBjb25zdCB0ZXh0dXJlMSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHQkE4LCBibHVycmVkQmFja2dyb3VuZFdpZHRoLCBibHVycmVkQmFja2dyb3VuZEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTElORUFSKTsKICAgICAgICBjb25zdCB0ZXh0dXJlMiA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHQkE4LCBibHVycmVkQmFja2dyb3VuZFdpZHRoLCBibHVycmVkQmFja2dyb3VuZEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTElORUFSKTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlcjEgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIxKTsKICAgICAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUxLCAwKTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlcjIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUyLCAwKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShwZXJzb25NYXNrTG9jYXRpb24sIDEpOwogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUtlcm5lbChrZXJuZWwgPSAiNXg1IikgewogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBpZiAoa2VybmVsID09PSAiOXg5IikgewogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGtlcm5lbHNpemVMb2NhdGlvbiwgNSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KHdlaWdodExvY2F0aW9uLCBbMC4yMjcwMjcwMjcsIDAuMTk0NTk0NTk0NiwgMC4xMjE2MjE2MjE2LCAwLjA1NDA1NDA1NDEsIDAuMDE2MjE2MjE2Ml0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAuMCwgMS4wLCAyLjAsIDMuMCwgNC4wXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiOXg5byIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDMpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWzAuMjczNDM3NSwgMC4zMjgxMjUsIDAuMDM1MTU2MjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMzMzMzMzMzMzMzMzMzMzMywgMy4xMTExMTExMTExMTExMTFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICI3eDciKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCA0KTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjMxMjUsIDAuMjM0Mzc1LCAwLjA5Mzc1LCAwLjAxNTYyNV0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAuMCwgMS4wLCAyLjAsIDMuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjV4NSIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDMpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWzAuMzcxNSwgMC4yNSwgMC4wNjI1XSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KG9mZnNldExvY2F0aW9uLCBbMC4wLCAxLjAsIDIuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjN4MyIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDIpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWzAuNSwgMC4yNV0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAuMCwgMS4wXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiMTAxbyIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDYpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAuMDgyNDkzMDA3Nzc3NTA3NywgMC4xNTcwODUxMDE1MzcxMDkzLCAwLjEyOTA5Mjk5NzQ4OTYxNjA2LCAwLjA5MDYxNjU3ODEwNzk3MDc1LAogICAgICAgICAgICAgICAgICAgIDAuMDU0MjcxMjcxODI1MTAwNDQsIDAuMDI3Njg3NTQ3MTUxNDQ5NTQ0LAogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KG9mZnNldExvY2F0aW9uLCBbMCwgMS40ODUxNDg1MTQ4NTE0ODUxLCAzLjQ2NTM0NjUzNDY1MzQ2NTMsIDUuNDQ1NTQ0NTU0NDU1NDQ2LCA3LjQyNTc0MjU3NDI1NzQyNiwgOS40MDU5NDA1OTQwNTk0MDVdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICIxNzFvIikgewogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGtlcm5lbHNpemVMb2NhdGlvbiwgNyk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KHdlaWdodExvY2F0aW9uLCBbCiAgICAgICAgICAgICAgICAgICAgMC4wNjQ2NTIxODAwNTgxMTE4NSwgMC4xMjU1OTczNTg2MTMyOTI3LCAwLjExMTgwNjAyNDU0Njk3MDk5LCAwLjA5MDY3MzQ1NzI2OTk2MTA3LAogICAgICAgICAgICAgICAgICAgIDAuMDY2OTc3MTIxMzEyMDc5NzEsIDAuMDQ1MDQ2NDI2NzE4OTY0MjUsIDAuMDI3NTczNTIxNTA5Njc1Mjc4LAogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KG9mZnNldExvY2F0aW9uLCBbCiAgICAgICAgICAgICAgICAgICAgMCwgMS40OTEyMjgwNzAxNzU0Mzg4LCAzLjQ3OTUzMjE2Mzc0MjY5MDQsIDUuNDY3ODM2MjU3MzA5OTQxNSwgNy40NTYxNDAzNTA4NzcxOTMsIDkuNDQ0NDQ0NDQ0NDQ0NDQ1LAogICAgICAgICAgICAgICAgICAgIDExLjQzMjc0ODUzODAxMTY5NiwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbC5zdGFydHNXaXRoKCJvZyIpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzID0gcGFyc2VGbG9hdChrZXJuZWwuc3Vic3RyaW5nKDIpKTsKICAgICAgICAgICAgICAgIGNvbnN0IHsgd2VpZ2h0cywgcG9zaXRpb25zIH0gPSBnZW5lcmF0ZU9wdGltaXplZEdhdXNzaWFuS2VybmVsKHMpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGtlcm5lbHNpemVMb2NhdGlvbiwgd2VpZ2h0cy5sZW5ndGgpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgd2VpZ2h0cyk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KG9mZnNldExvY2F0aW9uLCBwb3NpdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBudW1QYXNzZXMgPSAxOwogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICAgICAgdXBkYXRlS2VybmVsKHBhcmFtcy5rZXJuZWwpOwogICAgICAgICAgICBudW1QYXNzZXMgPSBwYXJhbXMubnVtUGFzc2VzIHx8IDE7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQpOwogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRGcmFtZUxvY2F0aW9uLCAwKTsKICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHBlcnNvbk1hc2tUZXh0dXJlKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1QYXNzZXM7IGkrKykgewogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHRleGVsU2l6ZUxvY2F0aW9uLCAwLCB0ZXhlbEhlaWdodCk7CiAgICAgICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTsKICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTIpOwogICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZTEpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMik7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMmYodGV4ZWxTaXplTG9jYXRpb24sIHRleGVsV2lkdGgsIDApOwogICAgICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcjIpOwogICAgICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlMik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgICAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIxKTsKICAgICAgICAgICAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTEpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZW5kZXIsCiAgICAgICAgICAgIHVwZGF0ZVBhcmFtcywKICAgICAgICAgICAgY2xlYW5VcCwKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gYnVpbGRCbGVuZFBhc3MoZ2wsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKSB7CiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgaW4gdmVjMiBhX3Bvc2l0aW9uOwogICAgICAgIGluIHZlYzIgYV90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X3RleENvb3JkOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgLy8gRmxpcHBpbmcgWSBpcyByZXF1aXJlZCB3aGVuIHJlbmRlcmluZyB0byBjYW52YXMKICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24gKiB2ZWMyKDEuMCwgLTEuMCksIDAuMCwgMS4wKTsKICAgICAgICAgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbnB1dEZyYW1lOwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfcGVyc29uTWFzazsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2JsdXJyZWRJbnB1dEZyYW1lOwogICAgICAgIHVuaWZvcm0gdmVjMiB1X2NvdmVyYWdlOwogICAgICAgIGluIHZlYzIgdl90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjNCBvdXRDb2xvcjsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIHZlYzMgY29sb3IgPSB0ZXh0dXJlKHVfaW5wdXRGcmFtZSwgdl90ZXhDb29yZCkucmdiOwogICAgICAgICAgICB2ZWMzIGJsdXJyZWRDb2xvciA9IHRleHR1cmUodV9ibHVycmVkSW5wdXRGcmFtZSwgdl90ZXhDb29yZCkucmdiOwogICAgICAgICAgICBmbG9hdCBwZXJzb25NYXNrID0gdGV4dHVyZSh1X3BlcnNvbk1hc2ssIHZfdGV4Q29vcmQpLmE7CiAgICAgICAgICAgIHBlcnNvbk1hc2sgPSBzbW9vdGhzdGVwKHVfY292ZXJhZ2UueCwgdV9jb3ZlcmFnZS55LCBwZXJzb25NYXNrKTsKICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KG1peChibHVycmVkQ29sb3IsIGNvbG9yLCBwZXJzb25NYXNrKSwgMS4wKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKTsKICAgICAgICBjb25zdCBpbnB1dEZyYW1lTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRGcmFtZSIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgYmx1cnJlZElucHV0RnJhbWUgPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfYmx1cnJlZElucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBjb3ZlcmFnZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2NvdmVyYWdlIik7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRGcmFtZUxvY2F0aW9uLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBnbC51bmlmb3JtMWkoYmx1cnJlZElucHV0RnJhbWUsIDIpOwogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgY29uc3QgY292ZXJhZ2UgPSBwYXJhbXMuY292ZXJhZ2UgfHwgWzAsIDFdOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoY292ZXJhZ2VMb2NhdGlvbiwgY292ZXJhZ2VbMF0sIGNvdmVyYWdlWzFdKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTsKICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZW5kZXIsCiAgICAgICAgICAgIHVwZGF0ZVBhcmFtcywKICAgICAgICAgICAgY2xlYW5VcCwKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gYnVpbGRCYWNrZ3JvdW5kQmx1clN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGxldCBibHVyUGFzcyA9IGJ1aWxkQmx1clBhc3MoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBwZXJzb25NYXNrVGV4dHVyZSwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICBjb25zdCBibGVuZFBhc3MgPSBidWlsZEJsZW5kUGFzcyhnbCwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBwYXJhbXMpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgYmx1clBhc3MucmVuZGVyKCk7CiAgICAgICAgICAgIGJsZW5kUGFzcy5yZW5kZXIoKTsKICAgICAgICB9CiAgICAgICAgbGV0IGN1cnJlbnRSZXNhbXBsZVNjYWxlID0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlOwogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICAgICAgaWYgKGN1cnJlbnRSZXNhbXBsZVNjYWxlICE9PSBwYXJhbXMuYmFja2dyb3VuZFJlc2FtcGxlU2NhbGUpIHsKICAgICAgICAgICAgICAgIGJsdXJQYXNzLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgIGJsdXJQYXNzID0gYnVpbGRCbHVyUGFzcyhnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBwYXJhbXMpOwogICAgICAgICAgICAgICAgY3VycmVudFJlc2FtcGxlU2NhbGUgPSBwYXJhbXMuYmFja2dyb3VuZFJlc2FtcGxlU2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmx1clBhc3MudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgICAgIGJsZW5kUGFzcy51cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgICAgICAgICAgYmxlbmRQYXNzLmNsZWFuVXAoKTsKICAgICAgICAgICAgYmx1clBhc3MuY2xlYW5VcCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZW5kZXIsCiAgICAgICAgICAgIHVwZGF0ZVBhcmFtcywKICAgICAgICAgICAgY2xlYW5VcCwKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkQmFja2dyb3VuZEltYWdlU3RhZ2UoZ2wsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIGJhY2tncm91bmRJbWFnZSwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKSB7CiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgdW5pZm9ybSB2ZWMyIHVfYmFja2dyb3VuZFNjYWxlOwogICAgICAgIHVuaWZvcm0gdmVjMiB1X2JhY2tncm91bmRPZmZzZXQ7CiAgICAgICAgaW4gdmVjMiBhX3Bvc2l0aW9uOwogICAgICAgIGluIHZlYzIgYV90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X3RleENvb3JkOwogICAgICAgIG91dCB2ZWMyIHZfYmFja2dyb3VuZENvb3JkOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgLy8gRmxpcHBpbmcgWSBmb3IgY2FudmFzCiAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChhX3Bvc2l0aW9uICogdmVjMigxLjAsIC0xLjApLCAwLjAsIDEuMCk7CiAgICAgICAgICAgIHZfdGV4Q29vcmQgPSBhX3RleENvb3JkOwogICAgICAgICAgICB2X2JhY2tncm91bmRDb29yZCA9IGFfdGV4Q29vcmQgKiB1X2JhY2tncm91bmRTY2FsZSArIHVfYmFja2dyb3VuZE9mZnNldDsKICAgICAgICB9YDsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0RnJhbWU7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9wZXJzb25NYXNrOwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfYmFja2dyb3VuZDsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9jb3ZlcmFnZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgaW4gdmVjMiB2X2JhY2tncm91bmRDb29yZDsKICAgICAgICBvdXQgdmVjNCBvdXRDb2xvcjsKCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICB2ZWMzIGZyYW1lQ29sb3IgPSB0ZXh0dXJlKHVfaW5wdXRGcmFtZSwgdl90ZXhDb29yZCkucmdiOwogICAgICAgICAgICB2ZWMzIGJhY2tncm91bmRDb2xvciA9IHRleHR1cmUodV9iYWNrZ3JvdW5kLCB2X2JhY2tncm91bmRDb29yZCkucmdiOwogICAgICAgICAgICBmbG9hdCBwZXJzb25NYXNrID0gdGV4dHVyZSh1X3BlcnNvbk1hc2ssIHZfdGV4Q29vcmQpLmE7CiAgICAgICAgICAgIHBlcnNvbk1hc2sgPSBzbW9vdGhzdGVwKHVfY292ZXJhZ2UueCwgdV9jb3ZlcmFnZS55LCBwZXJzb25NYXNrKTsKICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KGZyYW1lQ29sb3IgKiBwZXJzb25NYXNrICsgYmFja2dyb3VuZENvbG9yICogKDEuMCAtIHBlcnNvbk1hc2spLCAxLjApOwogICAgICAgIH1gOwogICAgICAgIGNvbnN0IG91dHB1dFJhdGlvID0gb3V0cHV0V2lkdGggLyBvdXRwdXRIZWlnaHQ7CiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQaXBsZWxpbmVTdGFnZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgY29uc3QgYmFja2dyb3VuZFNjYWxlTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfYmFja2dyb3VuZFNjYWxlIik7CiAgICAgICAgY29uc3QgYmFja2dyb3VuZE9mZnNldExvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JhY2tncm91bmRPZmZzZXQiKTsKICAgICAgICBjb25zdCBpbnB1dEZyYW1lTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRGcmFtZSIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgYmFja2dyb3VuZExvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JhY2tncm91bmQiKTsKICAgICAgICBjb25zdCBjb3ZlcmFnZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2NvdmVyYWdlIik7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZFNjYWxlTG9jYXRpb24sIDEsIDEpOwogICAgICAgIGdsLnVuaWZvcm0yZihiYWNrZ3JvdW5kT2Zmc2V0TG9jYXRpb24sIDAsIDApOwogICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDApOwogICAgICAgIGdsLnVuaWZvcm0xaShwZXJzb25NYXNrTG9jYXRpb24sIDEpOwogICAgICAgIGxldCBiYWNrZ3JvdW5kVGV4dHVyZSA9IG51bGw7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHBlcnNvbk1hc2tUZXh0dXJlKTsKICAgICAgICAgICAgaWYgKGJhY2tncm91bmRUZXh0dXJlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUyKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGJhY2tncm91bmRUZXh0dXJlKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShiYWNrZ3JvdW5kTG9jYXRpb24sIDIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBpbml0QmFja2dyb3VuZEltYWdlKGJhY2tncm91bmRJbWFnZSkgewogICAgICAgICAgICBjb25zdCBzb3VyY2VXaWR0aCA9IGJhY2tncm91bmRJbWFnZS5uYXR1cmFsV2lkdGggfHwgYmFja2dyb3VuZEltYWdlLnZpZGVvV2lkdGggfHwgYmFja2dyb3VuZEltYWdlLndpZHRoOwogICAgICAgICAgICBjb25zdCBzb3VyY2VIZWlnaHQgPSBiYWNrZ3JvdW5kSW1hZ2UubmF0dXJhbEhlaWdodCB8fCBiYWNrZ3JvdW5kSW1hZ2UudmlkZW9IZWlnaHQgfHwgYmFja2dyb3VuZEltYWdlLmhlaWdodDsKICAgICAgICAgICAgYmFja2dyb3VuZFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgc291cmNlV2lkdGgsIHNvdXJjZUhlaWdodCwgZ2wuTElORUFSLCBnbC5MSU5FQVIpOwogICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGJhY2tncm91bmRJbWFnZSk7CiAgICAgICAgICAgIGxldCB4T2Zmc2V0ID0gMDsKICAgICAgICAgICAgbGV0IHlPZmZzZXQgPSAwOwogICAgICAgICAgICBsZXQgYmFja2dyb3VuZFdpZHRoID0gc291cmNlV2lkdGg7CiAgICAgICAgICAgIGxldCBiYWNrZ3JvdW5kSGVpZ2h0ID0gc291cmNlSGVpZ2h0OwogICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kUmF0aW8gPSBiYWNrZ3JvdW5kV2lkdGggLyBiYWNrZ3JvdW5kSGVpZ2h0OwogICAgICAgICAgICBpZiAoYmFja2dyb3VuZFJhdGlvIDwgb3V0cHV0UmF0aW8pIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRIZWlnaHQgPSBiYWNrZ3JvdW5kV2lkdGggLyBvdXRwdXRSYXRpbzsKICAgICAgICAgICAgICAgIHlPZmZzZXQgPSAoc291cmNlSGVpZ2h0IC0gYmFja2dyb3VuZEhlaWdodCkgLyAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYmFja2dyb3VuZFdpZHRoID0gYmFja2dyb3VuZEhlaWdodCAqIG91dHB1dFJhdGlvOwogICAgICAgICAgICAgICAgeE9mZnNldCA9IChzb3VyY2VXaWR0aCAtIGJhY2tncm91bmRXaWR0aCkgLyAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHhTY2FsZSA9IGJhY2tncm91bmRXaWR0aCAvIHNvdXJjZVdpZHRoOwogICAgICAgICAgICBjb25zdCB5U2NhbGUgPSBiYWNrZ3JvdW5kSGVpZ2h0IC8gc291cmNlSGVpZ2h0OwogICAgICAgICAgICB4T2Zmc2V0IC89IHNvdXJjZVdpZHRoOwogICAgICAgICAgICB5T2Zmc2V0IC89IHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgZ2wudW5pZm9ybTJmKGJhY2tncm91bmRTY2FsZUxvY2F0aW9uLCB4U2NhbGUsIHlTY2FsZSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihiYWNrZ3JvdW5kT2Zmc2V0TG9jYXRpb24sIHhPZmZzZXQsIHlPZmZzZXQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB1cGRhdGVCYWNrZ3JvdW5kSW1hZ2UoYmFja2dyb3VuZEltYWdlLCByZUluaXQpIHsKICAgICAgICAgICAgaWYgKHJlSW5pdCkgewogICAgICAgICAgICAgICAgYmFja2dyb3VuZFRleHR1cmUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYmFja2dyb3VuZEltYWdlKSB7CiAgICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZFRleHR1cmUpCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZFRleHR1cmUgPSBudWxsOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kVGV4dHVyZSkgewogICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgYmFja2dyb3VuZFRleHR1cmUpOwogICAgICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBiYWNrZ3JvdW5kSW1hZ2UubmF0dXJhbFdpZHRoIHx8IGJhY2tncm91bmRJbWFnZS52aWRlb1dpZHRoIHx8IGJhY2tncm91bmRJbWFnZS53aWR0aCwgYmFja2dyb3VuZEltYWdlLm5hdHVyYWxIZWlnaHQgfHwgYmFja2dyb3VuZEltYWdlLnZpZGVvSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS5oZWlnaHQsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGJhY2tncm91bmRJbWFnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpbml0QmFja2dyb3VuZEltYWdlKGJhY2tncm91bmRJbWFnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdXBkYXRlUGFyYW1zKHBhcmFtcykgewogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBjb25zdCBjb3ZlcmFnZSA9IHBhcmFtcy5jb3ZlcmFnZSB8fCBbMCwgMV07CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihjb3ZlcmFnZUxvY2F0aW9uLCBjb3ZlcmFnZVswXSwgY292ZXJhZ2VbMV0pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICBpZiAoYmFja2dyb3VuZEltYWdlKQogICAgICAgICAgICBpbml0QmFja2dyb3VuZEltYWdlKGJhY2tncm91bmRJbWFnZSk7CiAgICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgICAgICAgICAgZ2wuZGVsZXRlVGV4dHVyZShiYWNrZ3JvdW5kVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZW5kZXIsCiAgICAgICAgICAgIHVwZGF0ZVBhcmFtcywKICAgICAgICAgICAgY2xlYW5VcCwKICAgICAgICAgICAgdXBkYXRlQmFja2dyb3VuZEltYWdlLAogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRJbXByb3ZlTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIGltcHJvdmVkTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSB2ZWMyIHVfdGV4ZWxTaXplOwogICAgICAgIGluIHZlYzIgdl90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjNCBvdXRDb2xvcjsKICAgICAgICBjb25zdCBmbG9hdCBvZmZzZXRbM10gPSBmbG9hdFtdKDAuMCwgMS4wLCAyLjApOwogICAgICAgIGNvbnN0IGZsb2F0IHdlaWdodFszXSA9IGZsb2F0W10oMC4zODc3NCwgMC4yNDQ3NywgMC4wNjEzNik7CiAgICAgICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgZmxvYXQgYmx1cnJlZEFscGhhID0gdGV4dHVyZSh1X3BlcnNvbk1hc2ssIHZfdGV4Q29vcmQpLmEgKiB3ZWlnaHRbMF07CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgICAgICB2ZWMyIG9mZnNldCA9IHZlYzIob2Zmc2V0W2ldKSAqIHVfdGV4ZWxTaXplOwogICAgICAgICAgICAgICAgdmVjMiB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgKyBvZmZzZXQ7CiAgICAgICAgICAgICAgICBibHVycmVkQWxwaGEgKz0gdGV4dHVyZSh1X3BlcnNvbk1hc2ssIHRleENvb3JkKS5hICogd2VpZ2h0W2ldOwogICAgICAgICAgICAgICAgdGV4Q29vcmQgPSB2X3RleENvb3JkIC0gb2Zmc2V0OwogICAgICAgICAgICAgICAgYmx1cnJlZEFscGhhICs9IHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSAqIHdlaWdodFtpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXRDb2xvciA9IHZlYzQoMCwwLDAsYmx1cnJlZEFscGhhKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCB0ZXhlbFdpZHRoID0gMSAvIG91dHB1dFdpZHRoOwogICAgICAgIGNvbnN0IHRleGVsSGVpZ2h0ID0gMSAvIG91dHB1dEhlaWdodDsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQaXBsZWxpbmVTdGFnZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgY29uc3QgcGVyc29uTWFza0xvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X3BlcnNvbk1hc2siKTsKICAgICAgICBjb25zdCB0ZXhlbFNpemVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV90ZXhlbFNpemUiKTsKICAgICAgICBjb25zdCB0ZXh0dXJlMSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHQkE4LCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBnbC5ORUFSRVNULCBnbC5ORUFSRVNUKTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlcjEgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIxKTsKICAgICAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUxLCAwKTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlcjIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIGltcHJvdmVkTWFza1RleHR1cmUsIDApOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKHBlcnNvbk1hc2tMb2NhdGlvbiwgMSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHBlcnNvbk1hc2tUZXh0dXJlKTsKICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHRleGVsU2l6ZUxvY2F0aW9uLCAwLCB0ZXhlbEhlaWdodCk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIxKTsKICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUxKTsKICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHRleGVsU2l6ZUxvY2F0aW9uLCB0ZXhlbFdpZHRoLCAwKTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcjIpOwogICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgICAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIxKTsKICAgICAgICAgICAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJlbmRlciwgY2xlYW5VcCB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkVEZMaXRlT3V0cHV0VG9NYXNrU3RhZ2UoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBvdXRwdXRUZXh0dXJlLCB0ZmxpdGUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIG91dHB1dE1lbW9yeU9mZnNldCkgewogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRTZWdtZW50YXRpb247CgogICAgICAgIGluIHZlYzIgdl90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjNCBvdXRDb2xvcjsKCiAgICAgICAgZmxvYXQgZ2V0TWFzayh2ZWMyIHNlZ21lbnRhdGlvbikgewogICAgICAgICAgICBmbG9hdCBzaGlmdCA9IG1heChzZWdtZW50YXRpb24uciwgc2VnbWVudGF0aW9uLmcpOwogICAgICAgICAgICBmbG9hdCBiYWNrZ3JvdW5kRXhwID0gZXhwKHNlZ21lbnRhdGlvbi5yIC0gc2hpZnQpOwogICAgICAgICAgICBmbG9hdCBwZXJzb25FeHAgPSBleHAoc2VnbWVudGF0aW9uLmcgLSBzaGlmdCk7CiAgICAgICAgICAgIHJldHVybiBwZXJzb25FeHAgLyAoYmFja2dyb3VuZEV4cCArIHBlcnNvbkV4cCk7CiAgICAgICAgfQoKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIGZsb2F0IG1hc2sgPSBnZXRNYXNrKHRleHR1cmUodV9pbnB1dFNlZ21lbnRhdGlvbiwgdl90ZXhDb29yZCkucmcpOwogICAgICAgICAgICBvdXRDb2xvciA9IHZlYzQodmVjMygwLjApLCBtYXNrKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQaXBsZWxpbmVTdGFnZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgY29uc3QgaW5wdXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9pbnB1dFNlZ21lbnRhdGlvbiIpOwogICAgICAgIGNvbnN0IGlucHV0VGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHMzJGLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBnbC5ORUFSRVNULCBnbC5ORUFSRVNUKTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBvdXRwdXRUZXh0dXJlLCAwKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dExvY2F0aW9uLCAxKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQpOwogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUxKTsKICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgaW5wdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBnbC5SRywgZ2wuRkxPQVQsIHRmbGl0ZS5IRUFQRjMyLCBvdXRwdXRNZW1vcnlPZmZzZXQpOwogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyKTsKICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyKTsKICAgICAgICAgICAgZ2wuZGVsZXRlVGV4dHVyZShpbnB1dFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyByZW5kZXIsIGNsZWFuVXAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZFRGTGl0ZUlucHV0U3RhZ2UoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBzZWdtZW50YXRpb25QaXhlbENvdW50LCBpbnB1dE1lbW9yeU9mZnNldCkgewogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2Zsb2F0bHV0OwogICAgICAgIGluIHZlYzIgdl90ZXhDb29yZDsKICAgICAgICB1bmlmb3JtIGZsb2F0IHVfcGl4ZWxTaXplOwogICAgICAgIG91dCB2ZWM0IG91dENvbG9yOwoKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIGZsb2F0IHggPSB2X3RleENvb3JkLng7CiAgICAgICAgICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfaW5wdXRGcmFtZSwgdl90ZXhDb29yZCk7CiAgICAgICAgICAgIGZsb2F0IHIgPSBtb2QoeCAqIHVfcGl4ZWxTaXplLCAzLjApOwogICAgICAgICAgICBmbG9hdCBjID0gMC4wOwogICAgICAgICAgICBpZiAociA+PSAyLjAgKSBjID0gY29sb3IuYjsKICAgICAgICAgICAgZWxzZSBpZiAociA+PSAxLjApIGMgPSBjb2xvci5nOwogICAgICAgICAgICBlbHNlIGMgPSBjb2xvci5yOwogICAgICAgICAgICBvdXRDb2xvciA9IHRleHR1cmUodV9mbG9hdGx1dCwgdmVjMihjLCAwLjUpKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQaXBsZWxpbmVTdGFnZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwaXhlbFNpemVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9waXhlbFNpemUiKTsKICAgICAgICBjb25zdCBmbG9hdGx1dExvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2Zsb2F0bHV0Iik7CiAgICAgICAgY29uc3Qgb3V0cHV0VGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHQkE4LCBpbnB1dFdpZHRoICogMywgaW5wdXRIZWlnaHQpOwogICAgICAgIGNvbnN0IGZyYW1lQnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyKTsKICAgICAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIG91dHB1dFRleHR1cmUsIDApOwogICAgICAgIGNvbnN0IG91dHB1dFBpeGVscyA9IG5ldyBVaW50OEFycmF5KHRmbGl0ZS5IRUFQRjMyLmJ1ZmZlciwgaW5wdXRNZW1vcnlPZmZzZXQgKiA0LCBzZWdtZW50YXRpb25QaXhlbENvdW50ICogNCAqIDMpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgZ2wudW5pZm9ybTFmKHBpeGVsU2l6ZUxvY2F0aW9uLCBpbnB1dFdpZHRoICogMyk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGZsb2F0bHV0TG9jYXRpb24sIDMpOwogICAgICAgIGNvbnN0IGZsb2F0THV0VGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBmbG9hdEx1dFRleHR1cmUpOwogICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgbHV0ID0gbmV3IEZsb2F0MzJBcnJheSgyNTYpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspCiAgICAgICAgICAgIGx1dFtpXSA9IGkgLyAyNTY7CiAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCAyNTYsIDEsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIG5ldyBVaW50OEFycmF5KGx1dC5idWZmZXIsIDAsIDI1NiAqIDQpKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIGlucHV0V2lkdGggKiAzLCBpbnB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTMpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBmbG9hdEx1dFRleHR1cmUpOwogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyKTsKICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgICAgIGdsLnJlYWRQaXhlbHMoMCwgMCwgaW5wdXRXaWR0aCAqIDMsIGlucHV0SGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBvdXRwdXRQaXhlbHMpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUob3V0cHV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgcmVuZGVyLCBjbGVhblVwIH07CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0Qmx1ckVuZ2luZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICBzd2l0Y2ggKHBhcmFtcy5hbW91bnQpIHsKICAgICAgICAgICAgY2FzZSAic2xpZ2h0IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzUiLCBudW1QYXNzZXM6IDEsIGJhY2tncm91bmRSZXNhbXBsZVNjYWxlOiAxIH0sIHBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAiaGVhdnkiOiB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IGtlcm5lbDogIm9nMTAiLCBudW1QYXNzZXM6IDEsIGJhY2tncm91bmRSZXNhbXBsZVNjYWxlOiAwLjUgfSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IGtlcm5lbDogIm9nNSIsIG51bVBhc3NlczogMSwgYmFja2dyb3VuZFJlc2FtcGxlU2NhbGU6IDAuNSB9LCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0RW5naW5lUGFyYW1zKHBhcmFtcykgewogICAgICAgIGNvbnN0IGJhc2VFbmdpbmVQYXJhbXMgPSB7CiAgICAgICAgICAgIGNvdmVyYWdlOiBwYXJhbXMuY292ZXJhZ2UsCiAgICAgICAgfTsKICAgICAgICBpZiAocGFyYW1zLmJhY2tncm91bmRCbHVyKSB7CiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgYmFzZUVuZ2luZVBhcmFtcyB9LCBnZXRCbHVyRW5naW5lUGFyYW1zKHBhcmFtcy5iYWNrZ3JvdW5kQmx1cikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYmFzZUVuZ2luZVBhcmFtczsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVdlYkdMRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBzZXR1cCwgZWZmZWN0Q2FudmFzLCBwYXJhbXMsIGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICBjb25zdCB7IHRmbGl0ZSwgaW5wdXRIZWlnaHQsIGlucHV0V2lkdGgsIGlucHV0TWVtb3J5T2Zmc2V0LCBvdXRwdXRNZW1vcnlPZmZzZXQsIHNlZ21lbnRhdGlvblBpeGVsQ291bnQgfSA9IHlpZWxkIGxvYWRTZWdtZW50YXRpb25Nb2RlbChzZXR1cC5zZWdtZW50YXRpb25Nb2RlbElkKTsKICAgICAgICAgICAgbGV0IGVuZ2luZVBhcmFtcyA9IGdldEVuZ2luZVBhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBpbiB2ZWMyIGFfcG9zaXRpb247CiAgICAgICAgaW4gdmVjMiBhX3RleENvb3JkOwogICAgICAgIG91dCB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbiwgMC4wLCAxLjApOwogICAgICAgICAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsKICAgICAgICB9YDsKICAgICAgICAgICAgY29uc3QgZ2wgPSBlZmZlY3RDYW52YXMuZ2V0Q29udGV4dCgid2ViZ2wyIiwgc2V0dXAud2ViZ2xDb250ZXh0U2V0dGluZ3MpOwogICAgICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpOwogICAgICAgICAgICBjb25zdCB2ZXJ0ZXhBcnJheSA9IGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7CiAgICAgICAgICAgIGdsLmJpbmRWZXJ0ZXhBcnJheSh2ZXJ0ZXhBcnJheSk7CiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwb3NpdGlvbkJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFstMSwgLTEsIDEuMCwgLTEsIC0xLCAxLjAsIDEuMCwgMS4wXSksIGdsLlNUQVRJQ19EUkFXKTsKICAgICAgICAgICAgY29uc3QgdGV4Q29vcmRCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTsKICAgICAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRleENvb3JkQnVmZmVyKTsKICAgICAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wLCAxLjAsIDEuMCwgMS4wXSksIGdsLlNUQVRJQ19EUkFXKTsKICAgICAgICAgICAgY29uc3QgaW5wdXRGcmFtZVRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0RnJhbWVUZXh0dXJlKTsKICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7CiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTsKICAgICAgICAgICAgY29uc3QgbWFza1RleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlZE1hc2tXaWR0aCA9IGlucHV0V2lkdGg7CiAgICAgICAgICAgIGNvbnN0IGltcHJvdmVkTWFza0hlaWdodCA9IGlucHV0SGVpZ2h0OwogICAgICAgICAgICBjb25zdCBpbXByb3ZlZE1hc2tUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIGltcHJvdmVkTWFza1dpZHRoLCBpbXByb3ZlZE1hc2tIZWlnaHQsIGdsLkxJTkVBUiwgZ2wuTElORUFSKTsKICAgICAgICAgICAgY29uc3QgdGZsaXRlSW5wdXRTdGFnZSA9IGJ1aWxkVEZMaXRlSW5wdXRTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHRmbGl0ZSwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQsIHNlZ21lbnRhdGlvblBpeGVsQ291bnQsIGlucHV0TWVtb3J5T2Zmc2V0KTsKICAgICAgICAgICAgY29uc3QgdGZsaXRlT3V0cHV0VG9NYXNrU3RhZ2UgPSBidWlsZFRGTGl0ZU91dHB1dFRvTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgbWFza1RleHR1cmUsIHRmbGl0ZSwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQsIG91dHB1dE1lbW9yeU9mZnNldCk7CiAgICAgICAgICAgIGNvbnN0IGltcHJvdmVNYXNrU3RhZ2UgPSBidWlsZEltcHJvdmVNYXNrU3RhZ2UoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBtYXNrVGV4dHVyZSwgaW1wcm92ZWRNYXNrVGV4dHVyZSwgaW1wcm92ZWRNYXNrV2lkdGgsIGltcHJvdmVkTWFza0hlaWdodCk7CiAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRCbHVyU3RhZ2UgPSBidWlsZEJhY2tncm91bmRCbHVyU3RhZ2UoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZEltYWdlU3RhZ2UgPSBidWlsZEJhY2tncm91bmRJbWFnZVN0YWdlKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIGltcHJvdmVkTWFza1RleHR1cmUsIGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlbmdpbmVQYXJhbXMpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgZWZmZWN0Q3R4OiBnbCwKICAgICAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZShmcmFtZSwgXywgcmVJbml0KSB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlU3RhZ2UudXBkYXRlQmFja2dyb3VuZEltYWdlKGZyYW1lLCByZUluaXQpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtcyh1cGRhdGVkUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gdXBkYXRlZFBhcmFtczsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVQYXJhbXMgPSBnZXRFbmdpbmVQYXJhbXMocGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQmx1clN0YWdlLnVwZGF0ZVBhcmFtcyhlbmdpbmVQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZVN0YWdlLnVwZGF0ZVBhcmFtcyhlbmdpbmVQYXJhbXMpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHByb2Nlc3NGcmFtZShmcmFtZSkgewogICAgICAgICAgICAgICAgICAgIGdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7CiAgICAgICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCk7CiAgICAgICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgaW5wdXRGcmFtZVRleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgZnJhbWUpOwogICAgICAgICAgICAgICAgICAgIGdsLmJpbmRWZXJ0ZXhBcnJheSh2ZXJ0ZXhBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgdGZsaXRlSW5wdXRTdGFnZS5yZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgICAgIGltcHJvdmVNYXNrU3RhZ2UucmVuZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmJhY2tncm91bmRVcmwgPyBiYWNrZ3JvdW5kSW1hZ2VTdGFnZS5yZW5kZXIoKSA6IGJhY2tncm91bmRCbHVyU3RhZ2UucmVuZGVyKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlzcG9zZSgpIHsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2VTdGFnZS5jbGVhblVwKCk7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEJsdXJTdGFnZS5jbGVhblVwKCk7CiAgICAgICAgICAgICAgICAgICAgaW1wcm92ZU1hc2tTdGFnZS5jbGVhblVwKCk7CiAgICAgICAgICAgICAgICAgICAgdGZsaXRlT3V0cHV0VG9NYXNrU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZUlucHV0U3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW1wcm92ZWRNYXNrVGV4dHVyZSk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlVGV4dHVyZShtYXNrVGV4dHVyZSk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlVGV4dHVyZShpbnB1dEZyYW1lVGV4dHVyZSk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHRleENvb3JkQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVCdWZmZXIocG9zaXRpb25CdWZmZXIpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVZlcnRleEFycmF5KHZlcnRleEFycmF5KTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVjb2RlQmFzZTY0KGJhc2U2NCwgZW5hYmxlVW5pY29kZSkgewogICAgICAgIHZhciBiaW5hcnlTdHJpbmcgPSBhdG9iKGJhc2U2NCk7CiAgICAgICAgcmV0dXJuIGJpbmFyeVN0cmluZzsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVVUkwoYmFzZTY0LCBzb3VyY2VtYXBBcmcsIGVuYWJsZVVuaWNvZGVBcmcpIHsKICAgICAgICB2YXIgc291cmNlID0gZGVjb2RlQmFzZTY0KGJhc2U2NCk7CiAgICAgICAgdmFyIHN0YXJ0ID0gc291cmNlLmluZGV4T2YoJ1xuJywgMTApICsgMTsKICAgICAgICB2YXIgYm9keSA9IHNvdXJjZS5zdWJzdHJpbmcoc3RhcnQpICsgKCcnKTsKICAgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtib2R5XSwgeyB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSk7CiAgICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlQmFzZTY0V29ya2VyRmFjdG9yeShiYXNlNjQsIHNvdXJjZW1hcEFyZywgZW5hYmxlVW5pY29kZUFyZykgewogICAgICAgIHZhciB1cmw7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFdvcmtlckZhY3Rvcnkob3B0aW9ucykgewogICAgICAgICAgICB1cmwgPSB1cmwgfHwgY3JlYXRlVVJMKGJhc2U2NCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgV29ya2VyKHVybCwgb3B0aW9ucyk7CiAgICAgICAgfTsKICAgIH0KCiAgICB2YXIgV29ya2VyRmFjdG9yeSA9IC8qI19fUFVSRV9fKi9jcmVhdGVCYXNlNjRXb3JrZXJGYWN0b3J5KCdMeW9nY205c2JIVndMWEJzZFdkcGJpMTNaV0l0ZDI5eWEyVnlMV3h2WVdSbGNpQXFMd29vWm5WdVkzUnBiMjRnS0NrZ2V3b2dJQ0FnSjNWelpTQnpkSEpwWTNRbk93b0tJQ0FnSUd4bGRDQjBhVzFsY2lBOUlHNTFiR3c3Q2lBZ0lDQnZibTFsYzNOaFoyVWdQU0JtZFc1amRHbHZiaUFvY21WeGRXVnpkQ2tnZXdvZ0lDQWdJQ0FnSUdOdmJuTjBJSFJwYldVZ1BTQnlaWEYxWlhOMExtUmhkR0U3Q2lBZ0lDQWdJQ0FnYVdZZ0tIUnBiV1VnUGowZ01Da0tJQ0FnSUNBZ0lDQWdJQ0FnZEdsdFpYSWdQU0J6WlhSVWFXMWxiM1YwS0NncElEMCtJSEJ2YzNSTlpYTnpZV2RsS0NJaUtTd2dkR2x0WlNrN0NpQWdJQ0FnSUNBZ1pXeHpaU0JwWmlBb2RHbHRaWElwQ2lBZ0lDQWdJQ0FnSUNBZ0lHTnNaV0Z5VkdsdFpXOTFkQ2gwYVcxbGNpazdDaUFnSUNCOU93b0tmU2tvS1RzS0x5OGpJSE52ZFhKalpVMWhjSEJwYm1kVlVrdzlkR2x0WlhJdWQyOXlhMlZ5TG1wekxtMWhjQW9LJyk7CiAgICAvKiBlc2xpbnQtZW5hYmxlICovCgogICAgY2xhc3MgUHJvY2Vzc29yIGV4dGVuZHMgZXZlbnRzRXhwb3J0cy5FdmVudEVtaXR0ZXIgewogICAgICAgIGNvbnN0cnVjdG9yKHsgc2V0dXAsIHBhcmFtcywgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIGVtaXQgfSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLnNldHVwID0gc2V0dXA7CiAgICAgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogICAgICAgICAgICB0aGlzLnZpZGVvV2lkdGggPSB2aWRlb1dpZHRoOwogICAgICAgICAgICB0aGlzLnZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgIHRoaXMuX2VuZ2luZUxvY2sgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICAgICAgaWYgKGVtaXQpCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQgPSBlbWl0OwogICAgICAgIH0KICAgICAgICBzZXR1cEVuZ2luZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgZWZmZWN0Q2FudmFzLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvV2lkdGggPSB2aWRlb1dpZHRoOwogICAgICAgICAgICAgICAgdGhpcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgdGhpcy52aWRlb0FzcGVjdFJhdGlvID0gdGhpcy52aWRlb1dpZHRoIC8gdGhpcy52aWRlb0hlaWdodDsKICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0Q2FudmFzID0gZWZmZWN0Q2FudmFzIHx8IGNyZWF0ZUNhbnZhcyh0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlRW5naW5lID0gdGhpcy5zZXR1cC51c2VXZWJHTCA/IGNyZWF0ZVdlYkdMRW5naW5lIDogY3JlYXRlQ2FudmFzRW5naW5lOwogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUgPSB5aWVsZCBjcmVhdGVFbmdpbmUodGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0LCB0aGlzLnNldHVwLCB0aGlzLmVmZmVjdENhbnZhcywgdGhpcy5wYXJhbXMsIGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpOwogICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RDdHggPSB0aGlzLmVuZ2luZS5lZmZlY3RDdHg7CiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWU6IGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVWaWRlb1NpemUoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qICh7IHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0IH0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VuZ2luZUxvY2sgPSB0aGlzLl9lbmdpbmVMb2NrLnRoZW4oKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZEJhY2tncm91bmRGcmFtZSA9IHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZEVuZ2luZSA9IHRoaXMuZW5naW5lOwogICAgICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc2V0dXBFbmdpbmUodmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIHRoaXMuZWZmZWN0Q2FudmFzLCBvbGRCYWNrZ3JvdW5kRnJhbWUpOwogICAgICAgICAgICAgICAgICAgIG9sZEVuZ2luZS5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLl9lbmdpbmVMb2NrOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaW5pdChfYSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHsgaW5pdGlhbEJhY2tncm91bmRGcmFtZSwgdXNlSW5zZXJ0YWJsZVN0cmVhbXMsIGVmZmVjdENhbnZhcyB9KSB7CiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnNldHVwRW5naW5lKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCwgZWZmZWN0Q2FudmFzLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKTsKICAgICAgICAgICAgICAgIGlmICh1c2VJbnNlcnRhYmxlU3RyZWFtcykgewogICAgICAgICAgICAgICAgICAgIGxldCBkcm9wRmlyc3QgPSA1OwogICAgICAgICAgICAgICAgICAgIGxldCBsb2NhbFN0YXJ0VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lU3RhcnRUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RGcmFtZVJlbmRlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oewogICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IChmcmFtZSwgY29udHJvbGxlcikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyID0gY29udHJvbGxlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lVGltZXN0YW1wID0gZnJhbWUudGltZXN0YW1wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsU3RhcnRUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkRnJhbWVUaW1lID0gZnJhbWVUaW1lc3RhbXAgLyAxMDAwIC0gZnJhbWVTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkTG9jYWxUaW1lID0gbm93IC0gbG9jYWxTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEZpcnN0ID4gMCB8fCBlbGFwc2VkTG9jYWxUaW1lIDwgZWxhcHNlZEZyYW1lVGltZSArIDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCAmJiB0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSAhPT0gImNhbnZhcyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJnZXRiYWNrZ3JvdW5kZnJhbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRmlyc3QgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcEZpcnN0LS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFZpZGVvRnJhbWUodGhpcy5lZmZlY3RDYW52YXMsIHsgdGltZXN0YW1wOiBmcmFtZVRpbWVzdGFtcCB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RnJhbWVSZW5kZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RnJhbWVSZW5kZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJmaXJzdGZyYW1lcmVuZGVyZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zZXR1cC51c2VCYWNrZ3JvdW5kV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlciA9IG5ldyBXb3JrZXJGYWN0b3J5KCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoIm91dHB1dCIsIHsgZnJhbWU6IHRoaXMuY3VycmVudE91dHB1dEZyYW1lIH0sIFt0aGlzLmN1cnJlbnRPdXRwdXRGcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJyZWFkeSIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKF9hKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgYXJndW1lbnRzLCB2b2lkIDAsIGZ1bmN0aW9uKiAoeyBwYXJhbXMsIGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUgfSkgewogICAgICAgICAgICAgICAgeWllbGQgdGhpcy5fZW5naW5lTG9jazsKICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eCA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWU6IGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUsIHJlSW5pdDogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZUJhY2tncm91bmRGcmFtZShudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWUsIHJlSW5pdCB9KSB7CiAgICAgICAgICAgIGxldCB1cGRhdGVkRGltZW5zaW9uczsKICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuaGFzVmlkZW9CYWNrZ3JvdW5kID0gdGhpcy5wYXJhbXMuYmFja2dyb3VuZFVybCAmJiB0aGlzLnBhcmFtcy5iYWNrZ3JvdW5kVHlwZSA9PT0gInZpZGVvIjsKICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zID0geyB4OiAwLCB5OiAwLCB3aWR0aDogdGhpcy52aWRlb1dpZHRoLCBoZWlnaHQ6IHRoaXMudmlkZW9IZWlnaHQgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2V0dXAudHJhbnNmZXJUeXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWJpdG1hcCI6IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgImltYWdlZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBjcmVhdGVDYW52YXModGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lQ3R4ID0gdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZyYW1lID0gbmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkoZnJhbWUpLCB0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eC5wdXRJbWFnZURhdGEoZnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSAiY2FudmFzIjogewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLndpZHRoID0gZnJhbWUudmlkZW9XaWR0aCB8fCBmcmFtZS5uYXR1cmFsV2lkdGggfHwgZnJhbWUud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodCA9IGZyYW1lLnZpZGVvSGVpZ2h0IHx8IGZyYW1lLm5hdHVyYWxIZWlnaHQgfHwgZnJhbWUuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQXNwZWN0UmF0aW8gPSB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCAvIHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRBc3BlY3RSYXRpbyA+IHRoaXMudmlkZW9Bc3BlY3RSYXRpbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0c2lkZVggPSB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCAtIHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodCAqIHRoaXMudmlkZW9Bc3BlY3RSYXRpbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLndpZHRoIC09IG91dHNpZGVYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMueCA9IE1hdGguZmxvb3Iob3V0c2lkZVggLyAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiYWNrZ3JvdW5kQXNwZWN0UmF0aW8gPCB0aGlzLnZpZGVvQXNwZWN0UmF0aW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHNpZGVZID0gdXBkYXRlZERpbWVuc2lvbnMuaGVpZ2h0IC0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLyB0aGlzLnZpZGVvQXNwZWN0UmF0aW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgLT0gb3V0c2lkZVk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy55ID0gTWF0aC5mbG9vcihvdXRzaWRlWSAvIDIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSA9IGZyYW1lOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZUJhY2tncm91bmRGcmFtZSh0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUsIHVwZGF0ZWREaW1lbnNpb25zLCByZUluaXQpOwogICAgICAgIH0KICAgICAgICB0ZXJtaW5hdGUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybUNvbnRyb2xsZXIpCiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2xsZXIudGVybWluYXRlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVyV29ya2VyKQogICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci50ZXJtaW5hdGUoKTsKICAgICAgICAgICAgaWYgKHRoaXMuZW5naW5lKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdGVybWluYXRlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuZW1pdCgidGVybWluYXRlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydCh7IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW0gfSkgewogICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0pCiAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5waXBlVGhyb3VnaCh0aGlzLnRyYW5zZm9ybWVyKS5waXBlVG8ob3V0cHV0U3RyZWFtKTsKICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIgPSAwOwogICAgICAgICAgICB0aGlzLmZyYW1lQ291bnRlclRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICB9CiAgICAgICAgaW5wdXQoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qICh7IHZpZGVvRnJhbWUsIGJhY2tncm91bmRGcmFtZSwgcmVxdWVzdFRpbWUsIGxhc3RSZW5kZXJUaW1lLCBkZWxheSB9KSB7CiAgICAgICAgICAgICAgICB2YXIgX2I7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYXRlZCkKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICBjb25zdCBydHQgPSAoRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lKSAqIDI7CiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5UaW1lID0gbGFzdFJlbmRlclRpbWUgKyBkZWxheSAtIHJ0dDsKICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kRnJhbWUpCiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrZ3JvdW5kRnJhbWUoeyBmcmFtZTogYmFja2dyb3VuZEZyYW1lIH0pOwogICAgICAgICAgICAgICAgbGV0IGZyYW1lOwogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgImltYWdlYml0bWFwIjogewogICAgICAgICAgICAgICAgICAgICAgICAoX2IgPSB0aGlzLnByZXZWaWRlb0ZyYW1lKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2VmlkZW9GcmFtZSA9IHZpZGVvRnJhbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKHZpZGVvRnJhbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHlpZWxkIGNyZWF0ZUltYWdlQml0bWFwKHRoaXMuZWZmZWN0Q2FudmFzKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhc2UgImltYWdlZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHZpZGVvRnJhbWUpLCB0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRDYW52YXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDYW52YXMgPSBjcmVhdGVDYW52YXModGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDYW52YXNDdHggPSB0aGlzLmlucHV0Q2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dENhbnZhc0N0eC5wdXRJbWFnZURhdGEodmlkZW9GcmFtZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKHRoaXMuaW5wdXRDYW52YXMpOwogICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHRoaXMuZWZmZWN0Q3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQpLmRhdGEuYnVmZmVyOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2FudmFzIjogewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh2aWRlb0ZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmVmZmVjdENhbnZhczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5EZWxheSA9IE1hdGgubWF4KDAsIHJldHVyblRpbWUgLSBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVyV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50T3V0cHV0RnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyV29ya2VyLnBvc3RNZXNzYWdlKHJldHVybkRlbGF5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoIm91dHB1dCIsIHsgZnJhbWUgfSwgW2ZyYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgfSwgcmV0dXJuRGVsYXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcHJvY2Vzc0FuZFJlbmRlckZyYW1lKGZyYW1lKSB7CiAgICAgICAgICAgIHRoaXMuZW5naW5lLnByb2Nlc3NGcmFtZShmcmFtZSk7CiAgICAgICAgICAgIGlmICh0aGlzLnNldHVwLmxvZ1RvQ29uc29sZSkgewogICAgICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIrKzsKICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgaWYgKG5vdyAtIHRoaXMuZnJhbWVDb3VudGVyVGltZSA+IDEwMDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUnVubmluZyBjYW1lcmEgZWZmZWN0cywgJHtNYXRoLnJvdW5kKCh0aGlzLmZyYW1lQ291bnRlciAqIDEwMDApIC8gKG5vdyAtIHRoaXMuZnJhbWVDb3VudGVyVGltZSkpfSBmcHNgKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXJUaW1lID0gbm93OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IHByb2Nlc3NvcnMgPSB7fTsKICAgIG9ubWVzc2FnZSA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7CiAgICAgICAgdmFyIF9hOwogICAgICAgIGNvbnN0IHByb2Nlc3NvcklkID0gcmVxdWVzdC5kYXRhLnByb2Nlc3NvcklkOwogICAgICAgIGlmIChyZXF1ZXN0LmRhdGEudHlwZSA9PT0gImNyZWF0ZSIpIHsKICAgICAgICAgICAgY29uc3QgcHJvY2Vzc29yID0gbmV3IFByb2Nlc3NvcihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3QuZGF0YSksIHsgZW1pdDogKHR5cGUsIGRhdGEsIHRyYW5zZmVyKSA9PiBwb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHsgcHJvY2Vzc29ySWQsIHR5cGUgfSwgZGF0YSksIHRyYW5zZmVyKSB9KSk7CiAgICAgICAgICAgIHByb2Nlc3NvcnNbcHJvY2Vzc29ySWRdID0gcHJvY2Vzc29yOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKF9hID0gcHJvY2Vzc29yc1twcm9jZXNzb3JJZF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVtyZXF1ZXN0LmRhdGEudHlwZV0ocmVxdWVzdC5kYXRhKTsKICAgICAgICAgICAgaWYgKHJlcXVlc3QuZGF0YS50eXBlID09PSAidGVybWluYXRlIikgewogICAgICAgICAgICAgICAgZGVsZXRlIHByb2Nlc3NvcnNbcHJvY2Vzc29ySWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBjb25zdCBjcmVhdGVURkxpdGVTSU1ETW9kdWxlID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgX3NjcmlwdERpciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCA/IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjIDogdW5kZWZpbmVkOwogICAgICAgIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjcmVhdGVURkxpdGVTSU1ETW9kdWxlKSB7CiAgICAgICAgICAgIGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUgPSBjcmVhdGVURkxpdGVTSU1ETW9kdWxlIHx8IHt9OwogICAgICAgICAgICB2YXIgTW9kdWxlID0gdHlwZW9mIGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUgIT09ICJ1bmRlZmluZWQiID8gY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSA6IHt9OwogICAgICAgICAgICB2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0OwogICAgICAgICAgICBNb2R1bGVbInJlYWR5Il0gPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTsKICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlamVjdCA9IHJlamVjdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBtb2R1bGVPdmVycmlkZXMgPSB7fTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gTW9kdWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVPdmVycmlkZXNba2V5XSA9IE1vZHVsZVtrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0aGlzUHJvZ3JhbSA9ICIuL3RoaXMucHJvZ3JhbSI7CiAgICAgICAgICAgIHZhciBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMsIHRvVGhyb3cpIHsKICAgICAgICAgICAgICAgIHRocm93IHRvVGhyb3c7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XRUIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1dPUktFUiA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERSA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSBmYWxzZTsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfV0VCID0gdHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCI7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dPUktFUiA9IHR5cGVvZiBpbXBvcnRTY3JpcHRzID09PSAiZnVuY3Rpb24iOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19OT0RFID0KICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgPT09ICJzdHJpbmciOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19TSEVMTCA9ICFFTlZJUk9OTUVOVF9JU19XRUIgJiYgIUVOVklST05NRU5UX0lTX05PREUgJiYgIUVOVklST05NRU5UX0lTX1dPUktFUjsKICAgICAgICAgICAgdmFyIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICBmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImxvY2F0ZUZpbGUiXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBNb2R1bGVbImxvY2F0ZUZpbGUiXShwYXRoLCBzY3JpcHREaXJlY3RvcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdERpcmVjdG9yeSArIHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlYWRfLCByZWFkQXN5bmMsIHJlYWRCaW5hcnk7CiAgICAgICAgICAgIHZhciBub2RlRlM7CiAgICAgICAgICAgIHZhciBub2RlUGF0aDsKICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSByZXF1aXJlKCJwYXRoIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX19kaXJuYW1lICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLCBiaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVGUykKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZTID0gcmVxdWlyZSgiZnMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVQYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBub2RlUGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGVQYXRoWyJub3JtYWxpemUiXShmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUsIGJpbmFyeSA/IG51bGwgOiAidXRmOCIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IHJlYWRfKGZpbGVuYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXJldC5idWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFVpbnQ4QXJyYXkocmV0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldC5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NbImFyZ3YiXS5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1Byb2dyYW0gPSBwcm9jZXNzWyJhcmd2Il1bMV0ucmVwbGFjZSgvXFwvZywgIi8iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb2Nlc3NbImFyZ3YiXS5zbGljZSgyKTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuY2F1Z2h0RXhjZXB0aW9uIiwgZnVuY3Rpb24gKGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBFeGl0U3RhdHVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuaGFuZGxlZFJlamVjdGlvbiIsIGFib3J0KTsKICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NbImV4aXQiXShzdGF0dXMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiaW5zcGVjdCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19TSEVMTCkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQoZik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlYWRidWZmZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVhZChmLCAiYmluYXJ5Iik7CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiBkYXRhID09PSAib2JqZWN0Iik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzY3JpcHRBcmdzICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0QXJnczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVpdCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBxdWl0KHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJpbnQgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nID0gcHJpbnQ7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuID0gY29uc29sZS5lcnJvciA9IHR5cGVvZiBwcmludEVyciAhPT0gInVuZGVmaW5lZCIgPyBwcmludEVyciA6IHByaW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzZWxmLmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfc2NyaXB0RGlyKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdERpcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IHNjcmlwdERpcmVjdG9yeS5zdWJzdHIoMCwgc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKCIvIikgKyAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgICAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMgPSBmdW5jdGlvbiAodXJsLCBvbmxvYWQsIG9uZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDAgfHwgKHhoci5zdGF0dXMgPT0gMCAmJiB4aHIucmVzcG9uc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkKHhoci5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9IG9uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSA7CiAgICAgICAgICAgIHZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTsKICAgICAgICAgICAgdmFyIGVyciA9IE1vZHVsZVsicHJpbnRFcnIiXSB8fCBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gbW9kdWxlT3ZlcnJpZGVzKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVba2V5XSA9IG1vZHVsZU92ZXJyaWRlc1trZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZHVsZU92ZXJyaWRlcyA9IG51bGw7CiAgICAgICAgICAgIGlmIChNb2R1bGVbImFyZ3VtZW50cyJdKQogICAgICAgICAgICAgICAgTW9kdWxlWyJhcmd1bWVudHMiXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsidGhpc1Byb2dyYW0iXSkKICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJxdWl0Il0pCiAgICAgICAgICAgICAgICBxdWl0XyA9IE1vZHVsZVsicXVpdCJdOwogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsid2FzbUJpbmFyeSJdKQogICAgICAgICAgICAgICAgd2FzbUJpbmFyeSA9IE1vZHVsZVsid2FzbUJpbmFyeSJdOwogICAgICAgICAgICBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSB8fCB0cnVlOwogICAgICAgICAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5ICE9PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgYWJvcnQoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbU1lbW9yeTsKICAgICAgICAgICAgdmFyIEFCT1JUID0gZmFsc2U7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIHRleHQpIHsKICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnQoIkFzc2VydGlvbiBmYWlsZWQ6ICIgKyB0ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT09ICJ1bmRlZmluZWQiID8gbmV3IFRleHREZWNvZGVyKCJ1dGY4IikgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsIGlkeCwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHZhciBlbmRJZHggPSBpZHggKyBtYXhCeXRlc1RvUmVhZDsKICAgICAgICAgICAgICAgIHZhciBlbmRQdHIgPSBpZHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoaGVhcFtlbmRQdHJdICYmICEoZW5kUHRyID49IGVuZElkeCkpCiAgICAgICAgICAgICAgICAgICAgKytlbmRQdHI7CiAgICAgICAgICAgICAgICBpZiAoZW5kUHRyIC0gaWR4ID4gMTYgJiYgaGVhcC5zdWJhcnJheSAmJiBVVEY4RGVjb2RlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcC5zdWJhcnJheShpZHgsIGVuZFB0cikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9ICIiOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUwID0gaGVhcFtpZHgrK107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHUwICYgMTI4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKHUwICYgMzEpIDw8IDYpIHwgdTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUyID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDI0MCkgPT0gMjI0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiAxNSkgPDwgMTIpIHwgKHUxIDw8IDYpIHwgdTI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiA3KSA8PCAxOCkgfCAodTEgPDwgMTIpIHwgKHUyIDw8IDYpIHwgKGhlYXBbaWR4KytdICYgNjMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MCA8IDY1NTM2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSB1MCAtIDY1NTM2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYgfCAoY2ggPj4gMTApLCA1NjMyMCB8IChjaCAmIDEwMjMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwdHIgPyBVVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgsIHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIDogIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gd3JpdGVBc2NpaVRvTWVtb3J5KHN0ciwgYnVmZmVyLCBkb250QWRkTnVsbCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBIRUFQOFtidWZmZXIrKyA+PiAwXSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyID4+IDBdID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhbGlnblVwKHgsIG11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICBpZiAoeCAlIG11bHRpcGxlID4gMCkgewogICAgICAgICAgICAgICAgICAgIHggKz0gbXVsdGlwbGUgLSAoeCAlIG11bHRpcGxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBidWZmZXIsIEhFQVA4LCBIRUFQVTgsIEhFQVAzMjsKICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3MoYnVmKSB7CiAgICAgICAgICAgICAgICBidWZmZXIgPSBidWY7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVA4Il0gPSBIRUFQOCA9IG5ldyBJbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDE2Il0gPSBuZXcgSW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQMzIiXSA9IEhFQVAzMiA9IG5ldyBJbnQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVOCJdID0gSEVBUFU4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUFUxNiJdID0gbmV3IFVpbnQxNkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMzIiXSA9IG5ldyBVaW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjMyIl0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBGNjQiXSA9IG5ldyBGbG9hdDY0QXJyYXkoYnVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbIklOSVRJQUxfTUVNT1JZIl0gfHwgMTY3NzcyMTY7CiAgICAgICAgICAgIHZhciB3YXNtVGFibGU7CiAgICAgICAgICAgIHZhciBfX0FUUFJFUlVOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRJTklUX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRNQUlOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRQT1NUUlVOX18gPSBbXTsKICAgICAgICAgICAgX19BVElOSVRfXy5wdXNoKHsKICAgICAgICAgICAgICAgIGZ1bmM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBfX193YXNtX2NhbGxfY3RvcnMoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmdW5jdGlvbiBwcmVSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVSdW4iXSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZVJ1biJdID0gW01vZHVsZVsicHJlUnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInByZVJ1biJdLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQUkVSVU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKSB7CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwcmVNYWluKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVE1BSU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcG9zdFJ1bigpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwb3N0UnVuIl0gPSBbTW9kdWxlWyJwb3N0UnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25Qb3N0UnVuKE1vZHVsZVsicG9zdFJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUFJFUlVOX18udW5zaGlmdChjYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBydW5EZXBlbmRlbmNpZXMgPSAwOwogICAgICAgICAgICB2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCkgewogICAgICAgICAgICAgICAgcnVuRGVwZW5kZW5jaWVzKys7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcy0tOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXNGdWxmaWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZGVwZW5kZW5jaWVzRnVsZmlsbGVkOwogICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEltYWdlcyJdID0ge307CiAgICAgICAgICAgIE1vZHVsZVsicHJlbG9hZGVkQXVkaW9zIl0gPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gYWJvcnQod2hhdCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsib25BYm9ydCJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJvbkFib3J0Il0od2hhdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGF0ICs9ICIiOwogICAgICAgICAgICAgICAgZXJyKHdoYXQpOwogICAgICAgICAgICAgICAgQUJPUlQgPSB0cnVlOwogICAgICAgICAgICAgICAgd2hhdCA9ICJhYm9ydCgiICsgd2hhdCArICIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7CiAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QoZSk7CiAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGhhc1ByZWZpeChzdHIsIHByZWZpeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCA/IHN0ci5zdGFydHNXaXRoKHByZWZpeCkgOiBzdHIuaW5kZXhPZihwcmVmaXgpID09PSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkYXRhVVJJUHJlZml4ID0gImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiOwogICAgICAgICAgICBmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGRhdGFVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmaWxlVVJJUHJlZml4ID0gImZpbGU6Ly8iOwogICAgICAgICAgICBmdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGZpbGVVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3YXNtQmluYXJ5RmlsZSA9ICJ0ZmxpdGUtc2ltZC53YXNtIjsKICAgICAgICAgICAgaWYgKCFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpKSB7CiAgICAgICAgICAgICAgICB3YXNtQmluYXJ5RmlsZSA9IGxvY2F0ZUZpbGUod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeShmaWxlKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlID09IHdhc21CaW5hcnlGaWxlICYmIHdhc21CaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZEJpbmFyeShmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0QmluYXJ5UHJvbWlzZSgpIHsKICAgICAgICAgICAgICAgIGlmICghd2FzbUJpbmFyeSAmJiAoRU5WSVJPTk1FTlRfSVNfV0VCIHx8IEVOVklST05NRU5UX0lTX1dPUktFUikpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZldGNoID09PSAiZnVuY3Rpb24iICYmICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSwgeyBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIiB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlWyJvayJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIgKyB3YXNtQmluYXJ5RmlsZSArICInIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZVsiYXJyYXlCdWZmZXIiXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQXN5bmMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jKHdhc21CaW5hcnlGaWxlLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgVWludDhBcnJheShyZXNwb25zZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJlamVjdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVdhc20oKSB7CiAgICAgICAgICAgICAgICB2YXIgaW5mbyA9IHsgYTogYXNtTGlicmFyeUFyZyB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLCBtb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZXhwb3J0cyA9IGluc3RhbmNlLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJhc20iXSA9IGV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeSA9IE1vZHVsZVsiYXNtIl1bInEiXTsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgd2FzbVRhYmxlID0gTW9kdWxlWyJhc20iXVsiRCJdOwogICAgICAgICAgICAgICAgICAgIHJlbW92ZVJ1bkRlcGVuZGVuY3koKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFkZFJ1bkRlcGVuZGVuY3koKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2Uob3V0cHV0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZUluc3RhbmNlKG91dHB1dFsiaW5zdGFuY2UiXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeVByb21pc2UoKQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksIGluZm8pOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlY2VpdmVyLCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycigiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIiArIHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUFzeW5jKCkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2FzbUJpbmFyeSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcgPT09ICJmdW5jdGlvbiIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGZldGNoID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSwgeyBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIiB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlLCBpbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlLCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIiArIHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0pIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhwb3J0cyA9IE1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0oaW5mbywgcmVjZWl2ZUluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycigiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIiArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5zdGFudGlhdGVBc3luYygpLmNhdGNoKHJlYWR5UHJvbWlzZVJlamVjdCk7CiAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gY2FsbFJ1bnRpbWVDYWxsYmFja3MoY2FsbGJhY2tzKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoY2FsbGJhY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3Muc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soTW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBmdW5jID0gY2FsbGJhY2suZnVuYzsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5hcmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbVRhYmxlLmdldChmdW5jKSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbVRhYmxlLmdldChmdW5jKShjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jKGNhbGxiYWNrLmFyZyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLmFyZyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9hYm9ydCgpIHsKICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3c7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gcHJvY2Vzc1siaHJ0aW1lIl0oKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFswXSAqIDFlMyArIHRbMV0gLyAxZTY7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkYXRlTm93ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGRhdGVOb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWMgPSB0cnVlOwogICAgICAgICAgICBmdW5jdGlvbiBzZXRFcnJObyh2YWx1ZSkgewogICAgICAgICAgICAgICAgSEVBUDMyW19fX2Vycm5vX2xvY2F0aW9uKCkgPj4gMl0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfY2xvY2tfZ2V0dGltZShjbGtfaWQsIHRwKSB7CiAgICAgICAgICAgICAgICB2YXIgbm93OwogICAgICAgICAgICAgICAgaWYgKGNsa19pZCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgoY2xrX2lkID09PSAxIHx8IGNsa19pZCA9PT0gNCkgJiYgX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWMpIHsKICAgICAgICAgICAgICAgICAgICBub3cgPSBfZW1zY3JpcHRlbl9nZXRfbm93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZXRFcnJObygyOCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDMyW3RwID4+IDJdID0gKG5vdyAvIDFlMykgfCAwOwogICAgICAgICAgICAgICAgSEVBUDMyWyh0cCArIDQpID4+IDJdID0gKChub3cgJSAxZTMpICogMWUzICogMWUzKSB8IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZGxvcGVuKGZpbGVuYW1lLCBmbGFnKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Rsc3ltKGhhbmRsZSwgc3ltYm9sKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LCBzcmMsIG51bSkgewogICAgICAgICAgICAgICAgSEVBUFU4LmNvcHlXaXRoaW4oZGVzdCwgc3JjLCBzcmMgKyBudW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFU4Lmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKHNpemUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeS5ncm93KChzaXplIC0gYnVmZmVyLmJ5dGVMZW5ndGggKyA2NTUzNSkgPj4+IDE2KTsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAocmVxdWVzdGVkU2l6ZSkgewogICAgICAgICAgICAgICAgdmFyIG9sZFNpemUgPSBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCk7CiAgICAgICAgICAgICAgICB2YXIgbWF4SGVhcFNpemUgPSAyMTQ3NDgzNjQ4OwogICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZFNpemUgPiBtYXhIZWFwU2l6ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGN1dERvd24gPSAxOyBjdXREb3duIDw9IDQ7IGN1dERvd24gKj0gMikgewogICAgICAgICAgICAgICAgICAgIHZhciBvdmVyR3Jvd25IZWFwU2l6ZSA9IG9sZFNpemUgKiAoMSArIDAuMiAvIGN1dERvd24pOwogICAgICAgICAgICAgICAgICAgIG92ZXJHcm93bkhlYXBTaXplID0gTWF0aC5taW4ob3Zlckdyb3duSGVhcFNpemUsIHJlcXVlc3RlZFNpemUgKyAxMDA2NjMyOTYpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdTaXplID0gTWF0aC5taW4obWF4SGVhcFNpemUsIGFsaWduVXAoTWF0aC5tYXgocmVxdWVzdGVkU2l6ZSwgb3Zlckdyb3duSGVhcFNpemUpLCA2NTUzNikpOwogICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIobmV3U2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl90aHJlYWRfc2xlZXAobXNlY3MpIHsKICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IF9lbXNjcmlwdGVuX2dldF9ub3coKTsKICAgICAgICAgICAgICAgIHdoaWxlIChfZW1zY3JpcHRlbl9nZXRfbm93KCkgLSBzdGFydCA8IG1zZWNzKSB7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgRU5WID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEV4ZWN1dGFibGVOYW1lKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNQcm9ncmFtIHx8ICIuL3RoaXMucHJvZ3JhbSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW52U3RyaW5ncygpIHsKICAgICAgICAgICAgICAgIGlmICghZ2V0RW52U3RyaW5ncy5zdHJpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmcgPSAoKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICJvYmplY3QiICYmIG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlc1swXSkgfHwgIkMiKS5yZXBsYWNlKCItIiwgIl8iKSArICIuVVRGLTgiOwogICAgICAgICAgICAgICAgICAgIHZhciBlbnYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVTRVI6ICJ3ZWJfdXNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIExPR05BTUU6ICJ3ZWJfdXNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBBVEg6ICIvIiwKICAgICAgICAgICAgICAgICAgICAgICAgUFdEOiAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIEhPTUU6ICIvaG9tZS93ZWJfdXNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIExBTkc6IGxhbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIF86IGdldEV4ZWN1dGFibGVOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4IGluIEVOVikgewogICAgICAgICAgICAgICAgICAgICAgICBlbnZbeF0gPSBFTlZbeF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBzdHJpbmdzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBlbnYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncy5wdXNoKHggKyAiPSIgKyBlbnZbeF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRFbnZTdHJpbmdzLnN0cmluZ3MgPSBzdHJpbmdzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGdldEVudlN0cmluZ3Muc3RyaW5nczsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgU1lTQ0FMTFMgPSB7CiAgICAgICAgICAgICAgICBtYXBwaW5nczoge30sCiAgICAgICAgICAgICAgICBidWZmZXJzOiBbbnVsbCwgW10sIFtdXSwKICAgICAgICAgICAgICAgIHByaW50Q2hhcjogZnVuY3Rpb24gKHN0cmVhbSwgY3VycikgewogICAgICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSBTWVNDQUxMUy5idWZmZXJzW3N0cmVhbV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnIgPT09IDAgfHwgY3VyciA9PT0gMTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbSA9PT0gMSA/IG91dCA6IGVycikoVVRGOEFycmF5VG9TdHJpbmcoYnVmZmVyLCAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5sZW5ndGggPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnB1c2goY3Vycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHZhcmFyZ3M6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIFNZU0NBTExTLnZhcmFyZ3MgKz0gNDsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gSEVBUDMyWyhTWVNDQUxMUy52YXJhcmdzIC0gNCkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnZXRTdHI6IGZ1bmN0aW9uIChwdHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gVVRGOFRvU3RyaW5nKHB0cik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnZXQ2NDogZnVuY3Rpb24gKGxvdywgaGlnaCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsb3c7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgICAgICBmdW5jdGlvbiBfZW52aXJvbl9nZXQoX19lbnZpcm9uLCBlbnZpcm9uX2J1ZikgewogICAgICAgICAgICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICAgICAgICAgICAgZ2V0RW52U3RyaW5ncygpLmZvckVhY2goZnVuY3Rpb24gKHN0cmluZywgaSkgewogICAgICAgICAgICAgICAgICAgIHZhciBwdHIgPSBlbnZpcm9uX2J1ZiArIGJ1ZlNpemU7CiAgICAgICAgICAgICAgICAgICAgSEVBUDMyWyhfX2Vudmlyb24gKyBpICogNCkgPj4gMl0gPSBwdHI7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVBc2NpaVRvTWVtb3J5KHN0cmluZywgcHRyKTsKICAgICAgICAgICAgICAgICAgICBidWZTaXplICs9IHN0cmluZy5sZW5ndGggKyAxOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW52aXJvbl9zaXplc19nZXQocGVudmlyb25fY291bnQsIHBlbnZpcm9uX2J1Zl9zaXplKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RyaW5ncyA9IGdldEVudlN0cmluZ3MoKTsKICAgICAgICAgICAgICAgIEhFQVAzMltwZW52aXJvbl9jb3VudCA+PiAyXSA9IHN0cmluZ3MubGVuZ3RoOwogICAgICAgICAgICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICAgICAgICAgICAgc3RyaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgICAgICAgICAgICAgICAgICBidWZTaXplICs9IHN0cmluZy5sZW5ndGggKyAxOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBIRUFQMzJbcGVudmlyb25fYnVmX3NpemUgPj4gMl0gPSBidWZTaXplOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2V4aXQoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICBleGl0KHN0YXR1cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX2Nsb3NlKGZkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfc2VlayhmZCwgb2Zmc2V0X2xvdywgb2Zmc2V0X2hpZ2gsIHdoZW5jZSwgbmV3T2Zmc2V0KSB7IH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX3dyaXRlKGZkLCBpb3YsIGlvdmNudCwgcG51bSkgewogICAgICAgICAgICAgICAgdmFyIG51bSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvdmNudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ciA9IEhFQVAzMlsoaW92ICsgaSAqIDgpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSBIRUFQMzJbKGlvdiArIChpICogOCArIDQpKSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NBTExTLnByaW50Q2hhcihmZCwgSEVBUFU4W3B0ciArIGpdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbnVtICs9IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVAzMltwbnVtID4+IDJdID0gbnVtOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3B0aHJlYWRfY3JlYXRlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3B0aHJlYWRfam9pbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAyODsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfc3lzY29uZihuYW1lKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NToKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heEhlYXBTaXplID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1heEhlYXBTaXplIC8gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDgyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDUxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDA4MDk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDUwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTcwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTcxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTcyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTczOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDgxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDk0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTAyNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyOwogICAgICAgICAgICAgICAgICAgIGNhc2UgODc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjE0NzQ4MzY0NzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3ODM5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDk5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwNDg7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA5NzE1MjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NTUzNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI3Njg7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY3OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMWUzOwogICAgICAgICAgICAgICAgICAgIGNhc2UgODk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjU1OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgODQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICJvYmplY3QiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvclsiaGFyZHdhcmVDb25jdXJyZW5jeSJdIHx8IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNldEVyck5vKDI4KTsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYXNtTGlicmFyeUFyZyA9IHsKICAgICAgICAgICAgICAgIGE6IF9hYm9ydCwKICAgICAgICAgICAgICAgIG46IF9jbG9ja19nZXR0aW1lLAogICAgICAgICAgICAgICAgaTogX2Rsb3BlbiwKICAgICAgICAgICAgICAgIGU6IF9kbHN5bSwKICAgICAgICAgICAgICAgIGw6IF9lbXNjcmlwdGVuX21lbWNweV9iaWcsCiAgICAgICAgICAgICAgICBtOiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCwKICAgICAgICAgICAgICAgIG86IF9lbXNjcmlwdGVuX3RocmVhZF9zbGVlcCwKICAgICAgICAgICAgICAgIHA6IF9lbnZpcm9uX2dldCwKICAgICAgICAgICAgICAgIGc6IF9lbnZpcm9uX3NpemVzX2dldCwKICAgICAgICAgICAgICAgIGo6IF9leGl0LAogICAgICAgICAgICAgICAgaDogX2ZkX2Nsb3NlLAogICAgICAgICAgICAgICAgazogX2ZkX3NlZWssCiAgICAgICAgICAgICAgICBjOiBfZmRfd3JpdGUsCiAgICAgICAgICAgICAgICBkOiBfcHRocmVhZF9jcmVhdGUsCiAgICAgICAgICAgICAgICBmOiBfcHRocmVhZF9qb2luLAogICAgICAgICAgICAgICAgYjogX3N5c2NvbmYsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNyZWF0ZVdhc20oKTsKICAgICAgICAgICAgdmFyIF9fX3dhc21fY2FsbF9jdG9ycyA9IChNb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChfX193YXNtX2NhbGxfY3RvcnMgPSBNb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdID0gTW9kdWxlWyJhc20iXVsiciJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJzIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bInQiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dEhlaWdodCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dEhlaWdodCJdID0gTW9kdWxlWyJhc20iXVsidSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0V2lkdGgiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRXaWR0aCJdID0gTW9kdWxlWyJhc20iXVsidiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0Q2hhbm5lbENvdW50Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0Q2hhbm5lbENvdW50Il0gPSBNb2R1bGVbImFzbSJdWyJ3Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dE1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsieCJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dEhlaWdodCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRIZWlnaHQiXSA9IE1vZHVsZVsiYXNtIl1bInkiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRXaWR0aCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRXaWR0aCJdID0gTW9kdWxlWyJhc20iXVsieiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dENoYW5uZWxDb3VudCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRDaGFubmVsQ291bnQiXSA9IE1vZHVsZVsiYXNtIl1bIkEiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9sb2FkTW9kZWwiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfbG9hZE1vZGVsIl0gPSBNb2R1bGVbImFzbSJdWyJCIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfcnVuSW5mZXJlbmNlIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX3J1bkluZmVyZW5jZSJdID0gTW9kdWxlWyJhc20iXVsiQyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIF9fX2Vycm5vX2xvY2F0aW9uID0gKE1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoX19fZXJybm9fbG9jYXRpb24gPSBNb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl0gPSBNb2R1bGVbImFzbSJdWyJFIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgY2FsbGVkUnVuOwogICAgICAgICAgICBmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cykgewogICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gIkV4aXRTdGF0dXMiOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gIlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIiArIHN0YXR1cyArICIpIjsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IGZ1bmN0aW9uIHJ1bkNhbGxlcigpIHsKICAgICAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgIHJ1bigpOwogICAgICAgICAgICAgICAgaWYgKCFjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gcnVuQ2FsbGVyOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmdW5jdGlvbiBydW4oYXJncykgewogICAgICAgICAgICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmVSdW4oKTsKICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9SdW4oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGNhbGxlZFJ1biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJjYWxsZWRSdW4iXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFCT1JUKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgaW5pdFJ1bnRpbWUoKTsKICAgICAgICAgICAgICAgICAgICBwcmVNYWluKCk7CiAgICAgICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0pCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSgpOwogICAgICAgICAgICAgICAgICAgIHBvc3RSdW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbInNldFN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXSgiUnVubmluZy4uLiIpOwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgZG9SdW4oKTsKICAgICAgICAgICAgICAgICAgICB9LCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJydW4iXSA9IHJ1bjsKICAgICAgICAgICAgZnVuY3Rpb24gZXhpdChzdGF0dXMsIGltcGxpY2l0KSB7CiAgICAgICAgICAgICAgICBxdWl0XyhzdGF0dXMsIG5ldyBFeGl0U3RhdHVzKHN0YXR1cykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChNb2R1bGVbInByZUluaXQiXSkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbInByZUluaXQiXSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicHJlSW5pdCJdID0gW01vZHVsZVsicHJlSW5pdCJdXTsKICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInByZUluaXQiXS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVJbml0Il0ucG9wKCkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUucmVhZHk7CiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgdmFyIHRmbGl0ZVNpbWQgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIGRlZmF1bHQ6IGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUKICAgIH0pOwoKICAgIHZhciBjcmVhdGVURkxpdGVNb2R1bGUgPSAoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB1bmRlZmluZWQ7CiAgICAgICAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgX3NjcmlwdERpciA9IF9zY3JpcHREaXIgfHwgX19maWxlbmFtZTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNyZWF0ZVRGTGl0ZU1vZHVsZSkgewogICAgICAgICAgICBjcmVhdGVURkxpdGVNb2R1bGUgPSBjcmVhdGVURkxpdGVNb2R1bGUgfHwge307CiAgICAgICAgICAgIHZhciBNb2R1bGUgPSB0eXBlb2YgY3JlYXRlVEZMaXRlTW9kdWxlICE9PSAidW5kZWZpbmVkIiA/IGNyZWF0ZVRGTGl0ZU1vZHVsZSA6IHt9OwogICAgICAgICAgICB2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0OwogICAgICAgICAgICBNb2R1bGVbInJlYWR5Il0gPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTsKICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlamVjdCA9IHJlamVjdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBtb2R1bGVPdmVycmlkZXMgPSB7fTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gTW9kdWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVPdmVycmlkZXNba2V5XSA9IE1vZHVsZVtrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0aGlzUHJvZ3JhbSA9ICIuL3RoaXMucHJvZ3JhbSI7CiAgICAgICAgICAgIHZhciBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMsIHRvVGhyb3cpIHsKICAgICAgICAgICAgICAgIHRocm93IHRvVGhyb3c7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XRUIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1dPUktFUiA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERSA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSBmYWxzZTsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfV0VCID0gdHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCI7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dPUktFUiA9IHR5cGVvZiBpbXBvcnRTY3JpcHRzID09PSAiZnVuY3Rpb24iOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19OT0RFID0KICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgPT09ICJzdHJpbmciOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19TSEVMTCA9ICFFTlZJUk9OTUVOVF9JU19XRUIgJiYgIUVOVklST05NRU5UX0lTX05PREUgJiYgIUVOVklST05NRU5UX0lTX1dPUktFUjsKICAgICAgICAgICAgdmFyIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICBmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImxvY2F0ZUZpbGUiXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBNb2R1bGVbImxvY2F0ZUZpbGUiXShwYXRoLCBzY3JpcHREaXJlY3RvcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdERpcmVjdG9yeSArIHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlYWRfLCByZWFkQXN5bmMsIHJlYWRCaW5hcnk7CiAgICAgICAgICAgIHZhciBub2RlRlM7CiAgICAgICAgICAgIHZhciBub2RlUGF0aDsKICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSByZXF1aXJlKCJwYXRoIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX19kaXJuYW1lICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLCBiaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVGUykKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZTID0gcmVxdWlyZSgiZnMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVQYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBub2RlUGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGVQYXRoWyJub3JtYWxpemUiXShmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUsIGJpbmFyeSA/IG51bGwgOiAidXRmOCIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IHJlYWRfKGZpbGVuYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXJldC5idWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFVpbnQ4QXJyYXkocmV0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldC5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NbImFyZ3YiXS5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1Byb2dyYW0gPSBwcm9jZXNzWyJhcmd2Il1bMV0ucmVwbGFjZSgvXFwvZywgIi8iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb2Nlc3NbImFyZ3YiXS5zbGljZSgyKTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuY2F1Z2h0RXhjZXB0aW9uIiwgZnVuY3Rpb24gKGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBFeGl0U3RhdHVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuaGFuZGxlZFJlamVjdGlvbiIsIGFib3J0KTsKICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NbImV4aXQiXShzdGF0dXMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiaW5zcGVjdCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19TSEVMTCkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQoZik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlYWRidWZmZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVhZChmLCAiYmluYXJ5Iik7CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiBkYXRhID09PSAib2JqZWN0Iik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzY3JpcHRBcmdzICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0QXJnczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVpdCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBxdWl0KHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJpbnQgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nID0gcHJpbnQ7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuID0gY29uc29sZS5lcnJvciA9IHR5cGVvZiBwcmludEVyciAhPT0gInVuZGVmaW5lZCIgPyBwcmludEVyciA6IHByaW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzZWxmLmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfc2NyaXB0RGlyKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdERpcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IHNjcmlwdERpcmVjdG9yeS5zdWJzdHIoMCwgc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKCIvIikgKyAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgICAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMgPSBmdW5jdGlvbiAodXJsLCBvbmxvYWQsIG9uZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDAgfHwgKHhoci5zdGF0dXMgPT0gMCAmJiB4aHIucmVzcG9uc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkKHhoci5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9IG9uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSA7CiAgICAgICAgICAgIHZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTsKICAgICAgICAgICAgdmFyIGVyciA9IE1vZHVsZVsicHJpbnRFcnIiXSB8fCBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gbW9kdWxlT3ZlcnJpZGVzKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVba2V5XSA9IG1vZHVsZU92ZXJyaWRlc1trZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZHVsZU92ZXJyaWRlcyA9IG51bGw7CiAgICAgICAgICAgIGlmIChNb2R1bGVbImFyZ3VtZW50cyJdKQogICAgICAgICAgICAgICAgTW9kdWxlWyJhcmd1bWVudHMiXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsidGhpc1Byb2dyYW0iXSkKICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJxdWl0Il0pCiAgICAgICAgICAgICAgICBxdWl0XyA9IE1vZHVsZVsicXVpdCJdOwogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsid2FzbUJpbmFyeSJdKQogICAgICAgICAgICAgICAgd2FzbUJpbmFyeSA9IE1vZHVsZVsid2FzbUJpbmFyeSJdOwogICAgICAgICAgICBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSB8fCB0cnVlOwogICAgICAgICAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5ICE9PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgYWJvcnQoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbU1lbW9yeTsKICAgICAgICAgICAgdmFyIEFCT1JUID0gZmFsc2U7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIHRleHQpIHsKICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnQoIkFzc2VydGlvbiBmYWlsZWQ6ICIgKyB0ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT09ICJ1bmRlZmluZWQiID8gbmV3IFRleHREZWNvZGVyKCJ1dGY4IikgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsIGlkeCwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHZhciBlbmRJZHggPSBpZHggKyBtYXhCeXRlc1RvUmVhZDsKICAgICAgICAgICAgICAgIHZhciBlbmRQdHIgPSBpZHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoaGVhcFtlbmRQdHJdICYmICEoZW5kUHRyID49IGVuZElkeCkpCiAgICAgICAgICAgICAgICAgICAgKytlbmRQdHI7CiAgICAgICAgICAgICAgICBpZiAoZW5kUHRyIC0gaWR4ID4gMTYgJiYgaGVhcC5zdWJhcnJheSAmJiBVVEY4RGVjb2RlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcC5zdWJhcnJheShpZHgsIGVuZFB0cikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9ICIiOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUwID0gaGVhcFtpZHgrK107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHUwICYgMTI4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKHUwICYgMzEpIDw8IDYpIHwgdTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUyID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDI0MCkgPT0gMjI0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiAxNSkgPDwgMTIpIHwgKHUxIDw8IDYpIHwgdTI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiA3KSA8PCAxOCkgfCAodTEgPDwgMTIpIHwgKHUyIDw8IDYpIHwgKGhlYXBbaWR4KytdICYgNjMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MCA8IDY1NTM2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSB1MCAtIDY1NTM2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYgfCAoY2ggPj4gMTApLCA1NjMyMCB8IChjaCAmIDEwMjMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwdHIgPyBVVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgsIHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIDogIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gd3JpdGVBc2NpaVRvTWVtb3J5KHN0ciwgYnVmZmVyLCBkb250QWRkTnVsbCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBIRUFQOFtidWZmZXIrKyA+PiAwXSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyID4+IDBdID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhbGlnblVwKHgsIG11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICBpZiAoeCAlIG11bHRpcGxlID4gMCkgewogICAgICAgICAgICAgICAgICAgIHggKz0gbXVsdGlwbGUgLSAoeCAlIG11bHRpcGxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBidWZmZXIsIEhFQVA4LCBIRUFQVTgsIEhFQVAzMjsKICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3MoYnVmKSB7CiAgICAgICAgICAgICAgICBidWZmZXIgPSBidWY7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVA4Il0gPSBIRUFQOCA9IG5ldyBJbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDE2Il0gPSBuZXcgSW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQMzIiXSA9IEhFQVAzMiA9IG5ldyBJbnQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVOCJdID0gSEVBUFU4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUFUxNiJdID0gbmV3IFVpbnQxNkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMzIiXSA9IG5ldyBVaW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjMyIl0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBGNjQiXSA9IG5ldyBGbG9hdDY0QXJyYXkoYnVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbIklOSVRJQUxfTUVNT1JZIl0gfHwgMTY3NzcyMTY7CiAgICAgICAgICAgIHZhciB3YXNtVGFibGU7CiAgICAgICAgICAgIHZhciBfX0FUUFJFUlVOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRJTklUX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRNQUlOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRQT1NUUlVOX18gPSBbXTsKICAgICAgICAgICAgX19BVElOSVRfXy5wdXNoKHsKICAgICAgICAgICAgICAgIGZ1bmM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBfX193YXNtX2NhbGxfY3RvcnMoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmdW5jdGlvbiBwcmVSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVSdW4iXSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZVJ1biJdID0gW01vZHVsZVsicHJlUnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInByZVJ1biJdLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQUkVSVU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKSB7CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwcmVNYWluKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVE1BSU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcG9zdFJ1bigpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwb3N0UnVuIl0gPSBbTW9kdWxlWyJwb3N0UnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25Qb3N0UnVuKE1vZHVsZVsicG9zdFJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUFJFUlVOX18udW5zaGlmdChjYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBydW5EZXBlbmRlbmNpZXMgPSAwOwogICAgICAgICAgICB2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCkgewogICAgICAgICAgICAgICAgcnVuRGVwZW5kZW5jaWVzKys7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcy0tOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXNGdWxmaWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZGVwZW5kZW5jaWVzRnVsZmlsbGVkOwogICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEltYWdlcyJdID0ge307CiAgICAgICAgICAgIE1vZHVsZVsicHJlbG9hZGVkQXVkaW9zIl0gPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gYWJvcnQod2hhdCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsib25BYm9ydCJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJvbkFib3J0Il0od2hhdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGF0ICs9ICIiOwogICAgICAgICAgICAgICAgZXJyKHdoYXQpOwogICAgICAgICAgICAgICAgQUJPUlQgPSB0cnVlOwogICAgICAgICAgICAgICAgd2hhdCA9ICJhYm9ydCgiICsgd2hhdCArICIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7CiAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QoZSk7CiAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGhhc1ByZWZpeChzdHIsIHByZWZpeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCA/IHN0ci5zdGFydHNXaXRoKHByZWZpeCkgOiBzdHIuaW5kZXhPZihwcmVmaXgpID09PSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkYXRhVVJJUHJlZml4ID0gImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiOwogICAgICAgICAgICBmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGRhdGFVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmaWxlVVJJUHJlZml4ID0gImZpbGU6Ly8iOwogICAgICAgICAgICBmdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGZpbGVVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3YXNtQmluYXJ5RmlsZSA9ICJ0ZmxpdGUud2FzbSI7CiAgICAgICAgICAgIGlmICghaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgd2FzbUJpbmFyeUZpbGUgPSBsb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSB3YXNtQmluYXJ5RmlsZSAmJiB3YXNtQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRCaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBhYm9ydChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIiAmJiAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZVsib2siXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciICsgd2FzbUJpbmFyeUZpbGUgKyAiJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VbImFycmF5QnVmZmVyIl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEFzeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByZWplY3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVXYXNtKCkgewogICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7IGE6IGFzbUxpYnJhcnlBcmcgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiYXNtIl0gPSBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkgPSBNb2R1bGVbImFzbSJdWyJxIl07CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZSA9IE1vZHVsZVsiYXNtIl1bIkQiXTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCkgewogICAgICAgICAgICAgICAgICAgIHJlY2VpdmVJbnN0YW5jZShvdXRwdXRbImluc3RhbmNlIl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnlQcm9taXNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbmZvKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZWNlaXZlciwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydChyZWFzb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAiZnVuY3Rpb24iICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKGluZm8sIHJlY2VpdmVJbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcykgewogICAgICAgICAgICAgICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrLmZ1bmM7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyhjYWxsYmFjay5hcmcgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfYWJvcnQoKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93OwogICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkgewogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHByb2Nlc3NbImhydGltZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF0gKiAxZTMgKyB0WzFdIC8gMWU2OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGF0ZU5vdyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBkYXRlTm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljID0gdHJ1ZTsKICAgICAgICAgICAgZnVuY3Rpb24gc2V0RXJyTm8odmFsdWUpIHsKICAgICAgICAgICAgICAgIEhFQVAzMltfX19lcnJub19sb2NhdGlvbigpID4+IDJdID0gdmFsdWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Nsb2NrX2dldHRpbWUoY2xrX2lkLCB0cCkgewogICAgICAgICAgICAgICAgdmFyIG5vdzsKICAgICAgICAgICAgICAgIGlmIChjbGtfaWQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBub3cgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNsa19pZCA9PT0gMSB8fCBjbGtfaWQgPT09IDQpICYmIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVAzMlt0cCA+PiAyXSA9IChub3cgLyAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIEhFQVAzMlsodHAgKyA0KSA+PiAyXSA9ICgobm93ICUgMWUzKSAqIDFlMyAqIDFlMykgfCAwOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Rsb3BlbihmaWxlbmFtZSwgZmxhZykgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbHN5bShoYW5kbGUsIHN5bWJvbCkgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCwgc3JjLCBudW0pIHsKICAgICAgICAgICAgICAgIEhFQVBVOC5jb3B5V2l0aGluKGRlc3QsIHNyYywgc3JjICsgbnVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihzaXplKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkuZ3Jvdygoc2l6ZSAtIGJ1ZmZlci5ieXRlTGVuZ3RoICsgNjU1MzUpID4+PiAxNik7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpIHsKICAgICAgICAgICAgICAgIHZhciBvbGRTaXplID0gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpOwogICAgICAgICAgICAgICAgdmFyIG1heEhlYXBTaXplID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBjdXREb3duID0gMTsgY3V0RG93biA8PSA0OyBjdXREb3duICo9IDIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3Zlckdyb3duSGVhcFNpemUgPSBvbGRTaXplICogKDEgKyAwLjIgLyBjdXREb3duKTsKICAgICAgICAgICAgICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnblVwKE1hdGgubWF4KHJlcXVlc3RlZFNpemUsIG92ZXJHcm93bkhlYXBTaXplKSwgNjU1MzYpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwKG1zZWNzKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBfZW1zY3JpcHRlbl9nZXRfbm93KCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoX2Vtc2NyaXB0ZW5fZ2V0X25vdygpIC0gc3RhcnQgPCBtc2VjcykgeyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIEVOViA9IHt9OwogICAgICAgICAgICBmdW5jdGlvbiBnZXRFeGVjdXRhYmxlTmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzUHJvZ3JhbSB8fCAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudlN0cmluZ3MoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gKCh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0pIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICAgICAgICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgICAgICAgICAgICAgICBVU0VSOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMT0dOQU1FOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBXRDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBIT01FOiAiL2hvbWUvd2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgICAgICAgICAgICAgICBfOiBnZXRFeGVjdXRhYmxlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW52W3hdID0gRU5WW3hdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RyaW5ncyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gZW52KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MucHVzaCh4ICsgIj0iICsgZW52W3hdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0RW52U3RyaW5ncy5zdHJpbmdzID0gc3RyaW5nczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFNZU0NBTExTID0gewogICAgICAgICAgICAgICAgbWFwcGluZ3M6IHt9LAogICAgICAgICAgICAgICAgYnVmZmVyczogW251bGwsIFtdLCBbXV0sCiAgICAgICAgICAgICAgICBwcmludENoYXI6IGZ1bmN0aW9uIChzdHJlYW0sIGN1cnIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gU1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyID09PSAwIHx8IGN1cnIgPT09IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJlYW0gPT09IDEgPyBvdXQgOiBlcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGN1cnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB2YXJhcmdzOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy52YXJhcmdzICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IEhFQVAzMlsoU1lTQ0FMTFMudmFyYXJncyAtIDQpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0U3RyOiBmdW5jdGlvbiAocHRyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IFVURjhUb1N0cmluZyhwdHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0NjQ6IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG93OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fZ2V0KF9fZW52aXJvbiwgZW52aXJvbl9idWYpIHsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHJpbmcsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gZW52aXJvbl9idWYgKyBidWZTaXplOwogICAgICAgICAgICAgICAgICAgIEhFQVAzMlsoX19lbnZpcm9uICsgaSAqIDQpID4+IDJdID0gcHRyOwogICAgICAgICAgICAgICAgICAgIHdyaXRlQXNjaWlUb01lbW9yeShzdHJpbmcsIHB0cik7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fc2l6ZXNfZ2V0KHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgewogICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBnZXRFbnZTdHJpbmdzKCk7CiAgICAgICAgICAgICAgICBIRUFQMzJbcGVudmlyb25fY291bnQgPj4gMl0gPSBzdHJpbmdzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIHN0cmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2J1Zl9zaXplID4+IDJdID0gYnVmU2l6ZTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9leGl0KHN0YXR1cykgewogICAgICAgICAgICAgICAgZXhpdChzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9jbG9zZShmZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldF9sb3csIG9mZnNldF9oaWdoLCB3aGVuY2UsIG5ld09mZnNldCkgeyB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF93cml0ZShmZCwgaW92LCBpb3ZjbnQsIHBudW0pIHsKICAgICAgICAgICAgICAgIHZhciBudW0gPSAwOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwdHIgPSBIRUFQMzJbKGlvdiArIGkgKiA4KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gSEVBUDMyWyhpb3YgKyAoaSAqIDggKyA0KSkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy5wcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG51bSArPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbcG51bSA+PiAyXSA9IG51bTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2NyZWF0ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2pvaW4oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3N5c2NvbmYobmFtZSkgewogICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgODU6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhIZWFwU2l6ZSAvIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjAwODA5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDcwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxNDc0ODM2NDc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0NzgzOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDQ4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOTcxNTI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU1MzY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2NzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFlMzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDczOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3JbImhhcmR3YXJlQ29uY3VycmVuY3kiXSB8fCAxOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRFcnJObygyOCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFzbUxpYnJhcnlBcmcgPSB7CiAgICAgICAgICAgICAgICBhOiBfYWJvcnQsCiAgICAgICAgICAgICAgICBuOiBfY2xvY2tfZ2V0dGltZSwKICAgICAgICAgICAgICAgIGk6IF9kbG9wZW4sCiAgICAgICAgICAgICAgICBlOiBfZGxzeW0sCiAgICAgICAgICAgICAgICBsOiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLAogICAgICAgICAgICAgICAgbTogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgICAgICAgICAgICBvOiBfZW1zY3JpcHRlbl90aHJlYWRfc2xlZXAsCiAgICAgICAgICAgICAgICBwOiBfZW52aXJvbl9nZXQsCiAgICAgICAgICAgICAgICBnOiBfZW52aXJvbl9zaXplc19nZXQsCiAgICAgICAgICAgICAgICBqOiBfZXhpdCwKICAgICAgICAgICAgICAgIGg6IF9mZF9jbG9zZSwKICAgICAgICAgICAgICAgIGs6IF9mZF9zZWVrLAogICAgICAgICAgICAgICAgYzogX2ZkX3dyaXRlLAogICAgICAgICAgICAgICAgZDogX3B0aHJlYWRfY3JlYXRlLAogICAgICAgICAgICAgICAgZjogX3B0aHJlYWRfam9pbiwKICAgICAgICAgICAgICAgIGI6IF9zeXNjb25mLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjcmVhdGVXYXNtKCk7CiAgICAgICAgICAgIHZhciBfX193YXNtX2NhbGxfY3RvcnMgPSAoTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoX19fd2FzbV9jYWxsX2N0b3JzID0gTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IE1vZHVsZVsiYXNtIl1bInIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsicyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ0Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IE1vZHVsZVsiYXNtIl1bInUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInYiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsidyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bIngiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ5Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInoiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBNb2R1bGVbImFzbSJdWyJBIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfbG9hZE1vZGVsIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gTW9kdWxlWyJhc20iXVsiQiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX3J1bkluZmVyZW5jZSJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IE1vZHVsZVsiYXNtIl1bIkMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBfX19lcnJub19sb2NhdGlvbiA9IChNb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX2Vycm5vX2xvY2F0aW9uID0gTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gTW9kdWxlWyJhc20iXVsiRSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGNhbGxlZFJ1bjsKICAgICAgICAgICAgZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9ICJFeGl0U3RhdHVzIjsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIgKyBzdGF0dXMgKyAiKSI7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBmdW5jdGlvbiBydW5DYWxsZXIoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bkNhbGxlcjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gcnVuKGFyZ3MpIHsKICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJlUnVuKCk7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvUnVuKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjYWxsZWRSdW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiY2FsbGVkUnVuIl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChBQk9SVCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGluaXRSdW50aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgcHJlTWFpbigpOwogICAgICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTsKICAgICAgICAgICAgICAgICAgICBwb3N0UnVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIE1vZHVsZVsicnVuIl0gPSBydW47CiAgICAgICAgICAgIGZ1bmN0aW9uIGV4aXQoc3RhdHVzLCBpbXBsaWNpdCkgewogICAgICAgICAgICAgICAgcXVpdF8oc3RhdHVzLCBuZXcgRXhpdFN0YXR1cyhzdGF0dXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVJbml0Il0pIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXSA9IFtNb2R1bGVbInByZUluaXQiXV07CiAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVURkxpdGVNb2R1bGUucmVhZHk7CiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgdmFyIHRmbGl0ZSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHsKICAgICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgICAgZGVmYXVsdDogY3JlYXRlVEZMaXRlTW9kdWxlCiAgICB9KTsKCn0pKHdhc21GZWF0dXJlRGV0ZWN0KTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvY2Vzc29yUHJveHkud29ya2VyLmpzLm1hcAoK');
|
|
1862
|
+
var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKHdhc21GZWF0dXJlRGV0ZWN0KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdCA6IG51bGw7CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uDQoNCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkNCiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSA0KICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQ0KICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUg0KICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQogICAgLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqLw0KDQoNCiAgICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQ0KICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9DQogICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHsNCiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7DQogICAgICAgIHJldHVybiBlLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlOw0KICAgIH07CgogICAgdmFyIGV2ZW50cyA9IHtleHBvcnRzOiB7fX07CgogICAgdmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbDsKICAgIHZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nCiAgICAgID8gUi5hcHBseQogICAgICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7CiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpOwogICAgICB9OwoKICAgIHZhciBSZWZsZWN0T3duS2V5czsKICAgIGlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXM7CiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KQogICAgICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpOwogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykgewogICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTsKICAgIH0KCiAgICB2YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkgewogICAgICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpOwogICAgfQogICAgZXZlbnRzLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7CiAgICBldmVudHMuZXhwb3J0cy5vbmNlID0gb25jZTsKCiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLngKICAgIEV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkOwoKICAgIC8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZQogICAgLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy4KICAgIHZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7CgogICAgZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpOwogICAgICB9CiAgICB9CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7CiAgICAgIH0KICAgIH0pOwoKICAgIEV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHwKICAgICAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHsKICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfQoKICAgICAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDsKICAgIH07CgogICAgLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzCiAgICAvLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC4KICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHsKICAgICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTsKICAgICAgfQogICAgICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7CiAgICAgIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7CiAgICB9CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7CiAgICAgIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTsKCiAgICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7CiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkKICAgICAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpOwogICAgICBlbHNlIGlmICghZG9FcnJvcikKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuCiAgICAgIGlmIChkb0Vycm9yKSB7CiAgICAgICAgdmFyIGVyOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApCiAgICAgICAgICBlciA9IGFyZ3NbMF07CiAgICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvdwogICAgICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4KICAgICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudAogICAgICAgIH0KICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyCiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7CiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjsKICAgICAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50CiAgICAgIH0KCiAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoOwogICAgICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkKICAgICAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHsKICAgICAgdmFyIG07CiAgICAgIHZhciBldmVudHM7CiAgICAgIHZhciBleGlzdGluZzsKCiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSAibmV3TGlzdGVuZXIiISBCZWZvcmUKICAgICAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCAibmV3TGlzdGVuZXIiLgogICAgICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7CgogICAgICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZQogICAgICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdAogICAgICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdOwogICAgICB9CgogICAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LgogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7CiAgICAgICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50OwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LgogICAgICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPQogICAgICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTsKICAgICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC4KICAgICAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHsKICAgICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrCiAgICAgICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTsKICAgICAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7CiAgICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlOwogICAgICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmcKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheAogICAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTsKICAgICAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnOwogICAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0OwogICAgICAgICAgdy50eXBlID0gdHlwZTsKICAgICAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7CiAgICAgICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpOwogICAgICAgIH07CgogICAgZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7CiAgICAgIGlmICghdGhpcy5maXJlZCkgewogICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pOwogICAgICAgIHRoaXMuZmlyZWQgPSB0cnVlOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7CiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikgewogICAgICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTsKICAgICAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTsKICAgICAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkOwogICAgICByZXR1cm4gd3JhcHBlZDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKCiAgICAvLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9CiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyOwoKICAgICAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTsKICAgICAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikgewogICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdOwogICAgICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcG9zaXRpb24gPSAtMTsKCiAgICAgICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyOwogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKQogICAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKQogICAgICAgICAgICAgIGxpc3Quc2hpZnQoKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKQogICAgICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07CgogICAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0KICAgICAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkgewogICAgICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdAogICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHMKICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBrZXkgPSBrZXlzW2ldOwogICAgICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CgogICAgICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTsKICAgICAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgLy8gTElGTyBvcmRlcgogICAgICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwoKICAgIGZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHsKICAgICAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzOwoKICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwogICAgICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykKICAgICAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07CgogICAgICByZXR1cm4gdW53cmFwID8KICAgICAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpOwogICAgICB9CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7CiAgICBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHsKICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKCiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdOwogICAgfTsKCiAgICBmdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikgewogICAgICB2YXIgY29weSA9IG5ldyBBcnJheShuKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpCiAgICAgICAgY29weVtpXSA9IGFycltpXTsKICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7CiAgICAgIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykKICAgICAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTsKICAgICAgbGlzdC5wb3AoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7CiAgICAgIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7CiAgICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTsKICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTsKICAgICAgICB9CiAgICAgICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHsKICAgICAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlCiAgICAgICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS4KICAgICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykgewogICAgICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZQogICAgICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS4KICAgICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpOwogICAgICAgICAgfQogICAgICAgICAgbGlzdGVuZXIoYXJnKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTsKICAgICAgfQogICAgfQoKICAgIHZhciBldmVudHNFeHBvcnRzID0gZXZlbnRzLmV4cG9ydHM7CgogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICBpZiAoc2VsZi5kb2N1bWVudCkgewogICAgICAgICAgICBjb25zdCBjYW52YXMgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2VsZi5PZmZzY3JlZW5DYW52YXMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IENETl9CQVNFX1VSTCA9ICJodHRwczovL2Nkbi5zcnYud2hlcmVieS5jb20vY2FtZXJhLWVmZmVjdHMvdjEtMC0xIjsKICAgIGNvbnN0IGdldEFzc2V0VXJsID0gKHBhdGgpID0+IHsKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBgJHtDRE5fQkFTRV9VUkx9LyR7cGF0aH1gOwogICAgICAgIH0KICAgIH07CiAgICBjb25zdCBhc3NldFVybHMgPSB7CiAgICAgICAgdGZsaXRlOiB7CiAgICAgICAgICAgIHdhc206IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL3RmbGl0ZS53YXNtIikgLAogICAgICAgICAgICB3YXNtU2ltZDogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvdGZsaXRlLXNpbWQud2FzbSIpICwKICAgICAgICB9LAogICAgICAgIG1vZGVsczogewogICAgICAgICAgICBzZWdtTGl0ZTogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvbW9kZWxzL3NlZ21fbGl0ZV92NjgxLnRmbGl0ZSIpICwKICAgICAgICAgICAgc2VnbUZ1bGw6IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL21vZGVscy9zZWdtX2Z1bGxfdjY3OS50ZmxpdGUiKSAsCiAgICAgICAgICAgIG1sa2l0OiBnZXRBc3NldFVybCgiYXNzZXRzL3RmbGl0ZS9tb2RlbHMvc2VsZmllc2VnbWVudGF0aW9uX21sa2l0LTI1NngyNTYtMjAyMV8wMV8xOS12MTIxNS5mMTYudGZsaXRlIikKICAgICAgICAgICAgICAgICwKICAgICAgICB9fTsKCiAgICBjb25zdCBsb2FkVGZsaXRlTW9kdWxlID0gKGlzU2ltZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgY3JlYXRlVGZsaXRlTW9kdWxlID0gaXNTaW1kCiAgICAgICAgICAgID8geWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGVTaW1kOyB9KS50aGVuKChtKSA9PiBtLmRlZmF1bHQpCiAgICAgICAgICAgIDogeWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGU7IH0pLnRoZW4oKG0pID0+IG0uZGVmYXVsdCk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVRmbGl0ZU1vZHVsZTsKICAgIH0pOwogICAgY29uc3QgZ2V0TW9kZWxVcmwgPSAobW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2ggKG1vZGVsSWQpIHsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRsaXRlIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtTGl0ZTsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRmdWxsIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtRnVsbDsKICAgICAgICAgICAgICAgIGNhc2UgIm1sa2l0IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5tbGtpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgY29uc3QgZ2V0V2FzbVVybCA9IChpc1NpbWQpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGlzU2ltZCA/IGFzc2V0VXJscy50ZmxpdGUud2FzbVNpbWQgOiBhc3NldFVybHMudGZsaXRlLndhc207CiAgICAgICAgfQogICAgfSk7CiAgICBjb25zdCBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OID0gMTsKICAgIGNvbnN0IFNFR01FTlRBVElPTk1PREVMX1RZUEVfUEVSU09OID0gMjsKICAgIGNvbnN0IHJlc29sdmVBc3NldFVybCA9ICh1cmwpID0+IHsKICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiYmxvYjoiKSB8fCB1cmwuc3RhcnRzV2l0aCgiZGF0YToiKSkgewogICAgICAgICAgICByZXR1cm4gdXJsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmwsIChfZG9jdW1lbnRDdXJyZW50U2NyaXB0ICYmIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnU0NSSVBUJyAmJiBfZG9jdW1lbnRDdXJyZW50U2NyaXB0LnNyYyB8fCBuZXcgVVJMKCdQcm9jZXNzb3JQcm94eS53b3JrZXIuanMnLCBkb2N1bWVudC5iYXNlVVJJKS5ocmVmKSkuaHJlZjsKICAgIH07CiAgICBjb25zdCBtb2RlbHMgPSB7CiAgICAgICAgbWVldGxpdGU6IHsKICAgICAgICAgICAgaWQ6ICJtZWV0bGl0ZSIsCiAgICAgICAgICAgIHR5cGU6IFNFR01FTlRBVElPTk1PREVMX1RZUEVfQkFDS0dST1VORF9QRVJTT04sCiAgICAgICAgfSwKICAgICAgICBtZWV0ZnVsbDogewogICAgICAgICAgICBpZDogIm1lZXRmdWxsIiwKICAgICAgICAgICAgdHlwZTogU0VHTUVOVEFUSU9OTU9ERUxfVFlQRV9CQUNLR1JPVU5EX1BFUlNPTiwKICAgICAgICB9LAogICAgICAgIG1sa2l0OiB7CiAgICAgICAgICAgIGlkOiAibWxraXQiLAogICAgICAgICAgICB0eXBlOiBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTiwKICAgICAgICB9LAogICAgfTsKICAgIGxldCBfdGZsaXRlID0gbnVsbDsKICAgIGNvbnN0IGxvYWRURkxpdGUgPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICBpZiAoX3RmbGl0ZSkKICAgICAgICAgICAgcmV0dXJuIF90ZmxpdGU7CiAgICAgICAgY29uc3Qgc2ltZElzU3VwcG9ydGVkID0geWllbGQgd2FzbUZlYXR1cmVEZXRlY3Quc2ltZCgpOwogICAgICAgIGNvbnN0IGNyZWF0ZVRmbGl0ZU1vZHVsZSA9IHlpZWxkIGxvYWRUZmxpdGVNb2R1bGUoc2ltZElzU3VwcG9ydGVkKTsKICAgICAgICBjb25zdCB3YXNtVXJsID0geWllbGQgZ2V0V2FzbVVybChzaW1kSXNTdXBwb3J0ZWQpOwogICAgICAgIF90ZmxpdGUgPSB5aWVsZCBjcmVhdGVUZmxpdGVNb2R1bGUoewogICAgICAgICAgICBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIud2FzbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVBc3NldFVybCh3YXNtVXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwYXRoOwogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgICAgIHJldHVybiBfdGZsaXRlOwogICAgfSk7CiAgICBsZXQgX2N1cnJlbnRNb2RlbEFuZEluZm87CiAgICBjb25zdCBsb2FkU2VnbWVudGF0aW9uTW9kZWwgPSAoc2VnbWVudGF0aW9uTW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgbW9kZWwgPSBtb2RlbHNbc2VnbWVudGF0aW9uTW9kZWxJZF07CiAgICAgICAgY29uc3QgbW9kZWxVcmwgPSByZXNvbHZlQXNzZXRVcmwoeWllbGQgZ2V0TW9kZWxVcmwobW9kZWwuaWQpKTsKICAgICAgICBjb25zdCB0ZmxpdGUgPSB5aWVsZCBsb2FkVEZMaXRlKCk7CiAgICAgICAgaWYgKChfY3VycmVudE1vZGVsQW5kSW5mbyA9PT0gbnVsbCB8fCBfY3VycmVudE1vZGVsQW5kSW5mbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2N1cnJlbnRNb2RlbEFuZEluZm8udXJsKSA9PT0gbW9kZWxVcmwpCiAgICAgICAgICAgIHJldHVybiBfY3VycmVudE1vZGVsQW5kSW5mbzsKICAgICAgICBjb25zdCBtb2RlbFJlc3BvbnNlID0geWllbGQgZmV0Y2gobW9kZWxVcmwpOwogICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyID0geWllbGQgbW9kZWxSZXNwb25zZS5hcnJheUJ1ZmZlcigpOwogICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyT2Zmc2V0ID0gdGZsaXRlLl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCgpOwogICAgICAgIHRmbGl0ZS5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KG1vZGVsQnVmZmVyKSwgbW9kZWxCdWZmZXJPZmZzZXQpOwogICAgICAgIHRmbGl0ZS5fbG9hZE1vZGVsKG1vZGVsQnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGZsaXRlLl9nZXRJbnB1dEhlaWdodCgpOwogICAgICAgIGNvbnN0IGlucHV0V2lkdGggPSB0ZmxpdGUuX2dldElucHV0V2lkdGgoKTsKICAgICAgICBjb25zdCBpbnB1dE1lbW9yeU9mZnNldCA9IHRmbGl0ZS5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgY29uc3Qgb3V0cHV0TWVtb3J5T2Zmc2V0ID0gdGZsaXRlLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgY29uc3Qgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCA9IGlucHV0V2lkdGggKiBpbnB1dEhlaWdodDsKICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgIF9jdXJyZW50TW9kZWxBbmRJbmZvID0gewogICAgICAgICAgICB0ZmxpdGUsCiAgICAgICAgICAgIG1vZGVsLAogICAgICAgICAgICB1cmw6IG1vZGVsVXJsLAogICAgICAgICAgICBpbnB1dEhlaWdodCwKICAgICAgICAgICAgaW5wdXRXaWR0aCwKICAgICAgICAgICAgaW5wdXRNZW1vcnlPZmZzZXQsCiAgICAgICAgICAgIG91dHB1dE1lbW9yeU9mZnNldCwKICAgICAgICAgICAgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwKICAgICAgICB9OwogICAgICAgIHJldHVybiBfY3VycmVudE1vZGVsQW5kSW5mbzsKICAgIH0pOwoKICAgIGNvbnN0IGJhc2VDYW52YXNQYXJhbXMgPSB7CiAgICAgICAgbWFza09wZXJhdGlvbjogImNvcHkiLAogICAgICAgIG1hc2tGaWx0ZXI6ICJibHVyKDRweCkiLAogICAgICAgIHBlcnNvbk9wZXJhdGlvbjogInNvdXJjZS1pbiIsCiAgICAgICAgcGVyc29uRmlsdGVyOiAibm9uZSIsCiAgICAgICAgYmFja2dyb3VuZE9wZXJhdGlvbjogImRlc3RpbmF0aW9uLW92ZXIiLAogICAgICAgIGJhY2tncm91bmRGaWx0ZXI6ICJub25lIiwKICAgIH07CiAgICBmdW5jdGlvbiBnZXRCbHVyQ2FudmFzUGFyYW1zKGFtb3VudCkgewogICAgICAgIHN3aXRjaCAoYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDYW52YXNQYXJhbXMpLCB7IGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDRweCkiLCBjcm9wOiA0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDE2cHgpIiwgY3JvcDogMTYgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDhweCkiLCBjcm9wOiA4IH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Q2FudmFzUGFyYW1zKHBhcmFtcykgewogICAgICAgIGlmIChwYXJhbXMuYmFja2dyb3VuZEJsdXIpCiAgICAgICAgICAgIHJldHVybiBnZXRCbHVyQ2FudmFzUGFyYW1zKHBhcmFtcy5iYWNrZ3JvdW5kQmx1ci5hbW91bnQpOwogICAgICAgIHJldHVybiBiYXNlQ2FudmFzUGFyYW1zOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBzZXR1cCwgZWZmZWN0Q2FudmFzLCBwYXJhbXMpIHsKICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICBjb25zdCB7IHRmbGl0ZSwgbW9kZWw6IHNlZ21lbnRhdGlvbk1vZGVsLCBpbnB1dEhlaWdodCwgaW5wdXRXaWR0aCwgaW5wdXRNZW1vcnlPZmZzZXQsIG91dHB1dE1lbW9yeU9mZnNldCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgfSA9IHlpZWxkIGxvYWRTZWdtZW50YXRpb25Nb2RlbChzZXR1cC5zZWdtZW50YXRpb25Nb2RlbElkKTsKICAgICAgICAgICAgbGV0IGNhbnZhc1BhcmFtcyA9IGdldENhbnZhc1BhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DYW52YXMgPSBjcmVhdGVDYW52YXMoaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DdHggPSBzZWdtZW50YXRpb25DYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgICAgICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25NYXNrID0gbmV3IEltYWdlRGF0YShpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCk7CiAgICAgICAgICAgIGxldCBjdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmREaW1lbnNpb25zID0geyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07CiAgICAgICAgICAgIGNvbnN0IHZpZGVvQXNwZWN0UmF0aW8gPSB2aWRlb1dpZHRoIC8gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgIGxldCBjcm9wWCA9IDA7CiAgICAgICAgICAgIGxldCBjcm9wWSA9IDA7CiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNyb3AgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBjcm9wID0gY2FudmFzUGFyYW1zLmNyb3AgfHwgMDsKICAgICAgICAgICAgICAgIGlmIChjcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSB2aWRlb0FzcGVjdFJhdGlvID4gMSA/IE1hdGgucm91bmQoY3JvcCAqIHZpZGVvQXNwZWN0UmF0aW8pIDogY3JvcDsKICAgICAgICAgICAgICAgICAgICBjcm9wWSA9IHZpZGVvQXNwZWN0UmF0aW8gPCAxID8gTWF0aC5yb3VuZChjcm9wIC8gdmlkZW9Bc3BlY3RSYXRpbykgOiBjcm9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSAwOwogICAgICAgICAgICAgICAgICAgIGNyb3BZID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdXBkYXRlQ3JvcCgpOwogICAgICAgICAgICBjb25zdCBlZmZlY3RDdHggPSBlZmZlY3RDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eCwKICAgICAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZShmcmFtZSwgZGltZW5zaW9ucykgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGltZW5zaW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZERpbWVuc2lvbnMgPSBkaW1lbnNpb25zOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtcyh1cGRhdGVkUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgY2FudmFzUGFyYW1zID0gZ2V0Q2FudmFzUGFyYW1zKHVwZGF0ZWRQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNyb3AoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHguZHJhd0ltYWdlKGZyYW1lLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IHNlZ21lbnRhdGlvbkN0eC5nZXRJbWFnZURhdGEoMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZS5IRUFQRjMyW2lucHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDNdID0gaW1hZ2VEYXRhLmRhdGFbaSAqIDRdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMV0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDFdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMl0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDJdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDIgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gTWF0aC5tYXgoYmFja2dyb3VuZCwgcGVyc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRFeHAgPSBNYXRoLmV4cChiYWNrZ3JvdW5kIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uRXhwID0gTWF0aC5leHAocGVyc29uIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudGF0aW9uTWFzay5kYXRhW2kgKiA0ICsgM10gPSAoMjU1ICogcGVyc29uRXhwKSAvIChiYWNrZ3JvdW5kRXhwICsgcGVyc29uRXhwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25NYXNrLmRhdGFbaSAqIDQgKyAzXSA9IDI1NSAqIHBlcnNvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHgucHV0SW1hZ2VEYXRhKHNlZ21lbnRhdGlvbk1hc2ssIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjYW52YXNQYXJhbXMubWFza09wZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZmlsdGVyID0gY2FudmFzUGFyYW1zLm1hc2tGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShzZWdtZW50YXRpb25DYW52YXMsIDAsIDAsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5wZXJzb25PcGVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmZpbHRlciA9IGNhbnZhc1BhcmFtcy5wZXJzb25GaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShmcmFtZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5iYWNrZ3JvdW5kT3BlcmF0aW9uOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSBjYW52YXNQYXJhbXMuYmFja2dyb3VuZEZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZHJhd0ltYWdlKGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUsIGJhY2tncm91bmREaW1lbnNpb25zLngsIGJhY2tncm91bmREaW1lbnNpb25zLnksIGJhY2tncm91bmREaW1lbnNpb25zLndpZHRoLCBiYWNrZ3JvdW5kRGltZW5zaW9ucy5oZWlnaHQsIDAsIDAsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcFggfHwgY3JvcFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2Utb3ZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZWZmZWN0Q2FudmFzLCBjcm9wWCwgY3JvcFksIHZpZGVvV2lkdGggLSBjcm9wWCAqIDIsIHZpZGVvSGVpZ2h0IC0gY3JvcFkgKiAyLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9CgogICAgY29uc3QgZ2xzbCA9IFN0cmluZy5yYXc7CiAgICBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbGluayBXZWJHTCBwcm9ncmFtOiAke2dsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvZ3JhbTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV9wb3NpdGlvbiIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwb3NpdGlvbkJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIGNvbnN0IHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV90ZXhDb29yZCIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZEF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIHJldHVybiBwcm9ncmFtOwogICAgfQogICAgZnVuY3Rpb24gY29tcGlsZVNoYWRlcihnbCwgc2hhZGVyVHlwZSwgc2hhZGVyU291cmNlKSB7CiAgICAgICAgY29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwogICAgICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNoYWRlclNvdXJjZSk7CiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpOwogICAgICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyOiAke2dsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNoYWRlcjsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZ2wsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBtaW5GaWx0ZXIgPSBnbC5ORUFSRVNULCBtYWdGaWx0ZXIgPSBnbC5ORUFSRVNUKSB7CiAgICAgICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgbWluRmlsdGVyKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgbWFnRmlsdGVyKTsKICAgICAgICBnbC50ZXhTdG9yYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMSwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgIHJldHVybiB0ZXh0dXJlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdlbmVyYXRlT3B0aW1pemVkR2F1c3NpYW5LZXJuZWwoc2lnbWEpIHsKICAgICAgICBjb25zdCBnID0gKHgpID0+IE1hdGguZXhwKC0oeCAqIHgpIC8gKDIgKiBzaWdtYSAqIHNpZ21hKSk7CiAgICAgICAgY29uc3QgbnVtYmVycyA9IFtdOwogICAgICAgIGxldCB4ID0gMDsKICAgICAgICBsZXQgY3VycmVudFN1bSA9IDA7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29uc3QgbiA9IGcoeCk7CiAgICAgICAgICAgIGNvbnN0IG5leHRTdW0gPSBjdXJyZW50U3VtICsgKGN1cnJlbnRTdW0gPyBuICogMiA6IG4pOwogICAgICAgICAgICBpZiAoY3VycmVudFN1bSAmJiBuIC8gbmV4dFN1bSA8IDAuMDEgJiYgbnVtYmVycy5sZW5ndGggJSAyKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGN1cnJlbnRTdW0gPSBuZXh0U3VtOwogICAgICAgICAgICBudW1iZXJzLnB1c2gobik7CiAgICAgICAgICAgIHgrKzsKICAgICAgICB9CiAgICAgICAgY29uc3Qgd2VpZ2h0cyA9IG51bWJlcnMubWFwKChuKSA9PiBuIC8gY3VycmVudFN1bSk7CiAgICAgICAgY29uc3Qgb3B0aW1pemVkV2VpZ2h0cyA9IFt3ZWlnaHRzWzBdXTsKICAgICAgICBjb25zdCBvcHRpbWl6ZWRQb3NpdGlvbnMgPSBbMF07CiAgICAgICAgaWYgKHdlaWdodHMubGVuZ3RoID49IDMgJiYgd2VpZ2h0cy5sZW5ndGggJSAyID09PSAxKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgd2VpZ2h0cy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgY29uc3QgdzEgPSB3ZWlnaHRzW2ldOwogICAgICAgICAgICAgICAgY29uc3QgdzIgPSB3ZWlnaHRzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB3MSArIHcyOwogICAgICAgICAgICAgICAgY29uc3QgcCA9IHcyIC8gKHcxICsgdzIpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkV2VpZ2h0cy5wdXNoKHcpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkUG9zaXRpb25zLnB1c2goaSArIHApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHdlaWdodHM6IG9wdGltaXplZFdlaWdodHMsCiAgICAgICAgICAgIHBvc2l0aW9uczogb3B0aW1pemVkUG9zaXRpb25zLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3dlaWdodFsyMF07CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X29mZnNldFsyMF07CiAgICAgICAgdW5pZm9ybSBpbnQgdV9rc2l6ZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV90ZXhlbFNpemU7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIG91dCB2ZWM0IG91dENvbG9yOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjNCBjZW50ZXJDb2xvciA9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB2X3RleENvb3JkKTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICB2ZWM0IGZyYW1lQ29sb3IgPSBjZW50ZXJDb2xvciAqIHVfd2VpZ2h0WzBdICogKDEuMCAtIHBlcnNvbk1hc2spOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHVfa3NpemU7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKHVfb2Zmc2V0W2ldKSAqIHVfdGV4ZWxTaXplOwogICAgICAgICAgICAgICAgdmVjMiB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgKyBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgICAgICB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgLSBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KGZyYW1lQ29sb3IucmdiICsgKDEuMCAtIGZyYW1lQ29sb3IuYSkgKiBjZW50ZXJDb2xvci5yZ2IsIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3Qgc2NhbGUgPSBwYXJhbXMuYmFja2dyb3VuZFJlc2FtcGxlU2NhbGUgfHwgMC4yOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGggPSBNYXRoLnJvdW5kKG91dHB1dFdpZHRoICogc2NhbGUpOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0ID0gTWF0aC5yb3VuZChvdXRwdXRIZWlnaHQgKiBzY2FsZSk7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBibHVycmVkQmFja2dyb3VuZFdpZHRoOwogICAgICAgIGNvbnN0IHRleGVsSGVpZ2h0ID0gMSAvIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0OwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKTsKICAgICAgICBjb25zdCBpbnB1dEZyYW1lTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRGcmFtZSIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3Qgd2VpZ2h0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfd2VpZ2h0Iik7CiAgICAgICAgY29uc3Qgb2Zmc2V0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfb2Zmc2V0Iik7CiAgICAgICAgY29uc3Qga2VybmVsc2l6ZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2tzaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgdGV4dHVyZTIgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMiwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVLZXJuZWwoa2VybmVsID0gIjV4NSIpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgaWYgKGtlcm5lbCA9PT0gIjl4OSIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDUpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWzAuMjI3MDI3MDI3LCAwLjE5NDU5NDU5NDYsIDAuMTIxNjIxNjIxNiwgMC4wNTQwNTQwNTQxLCAwLjAxNjIxNjIxNjJdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjAsIDQuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjl4OW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjI3MzQzNzUsIDAuMzI4MTI1LCAwLjAzNTE1NjI1XSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KG9mZnNldExvY2F0aW9uLCBbMC4wLCAxLjMzMzMzMzMzMzMzMzMzMzMsIDMuMTExMTExMTExMTExMTExXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiN3g3IikgewogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGtlcm5lbHNpemVMb2NhdGlvbiwgNCk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KHdlaWdodExvY2F0aW9uLCBbMC4zMTI1LCAwLjIzNDM3NSwgMC4wOTM3NSwgMC4wMTU2MjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICI1eDUiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjM3MTUsIDAuMjUsIDAuMDYyNV0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAuMCwgMS4wLCAyLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICIzeDMiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAyKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjUsIDAuMjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjEwMW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCA2KTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFsKICAgICAgICAgICAgICAgICAgICAwLjA4MjQ5MzAwNzc3NzUwNzcsIDAuMTU3MDg1MTAxNTM3MTA5MywgMC4xMjkwOTI5OTc0ODk2MTYwNiwgMC4wOTA2MTY1NzgxMDc5NzA3NSwKICAgICAgICAgICAgICAgICAgICAwLjA1NDI3MTI3MTgyNTEwMDQ0LCAwLjAyNzY4NzU0NzE1MTQ0OTU0NCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAsIDEuNDg1MTQ4NTE0ODUxNDg1MSwgMy40NjUzNDY1MzQ2NTM0NjUzLCA1LjQ0NTU0NDU1NDQ1NTQ0NiwgNy40MjU3NDI1NzQyNTc0MjYsIDkuNDA1OTQwNTk0MDU5NDA1XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiMTcxbyIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDcpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAuMDY0NjUyMTgwMDU4MTExODUsIDAuMTI1NTk3MzU4NjEzMjkyNywgMC4xMTE4MDYwMjQ1NDY5NzA5OSwgMC4wOTA2NzM0NTcyNjk5NjEwNywKICAgICAgICAgICAgICAgICAgICAwLjA2Njk3NzEyMTMxMjA3OTcxLCAwLjA0NTA0NjQyNjcxODk2NDI1LCAwLjAyNzU3MzUyMTUwOTY3NTI3OCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAsIDEuNDkxMjI4MDcwMTc1NDM4OCwgMy40Nzk1MzIxNjM3NDI2OTA0LCA1LjQ2NzgzNjI1NzMwOTk0MTUsIDcuNDU2MTQwMzUwODc3MTkzLCA5LjQ0NDQ0NDQ0NDQ0NDQ0NSwKICAgICAgICAgICAgICAgICAgICAxMS40MzI3NDg1MzgwMTE2OTYsCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwuc3RhcnRzV2l0aCgib2ciKSkgewogICAgICAgICAgICAgICAgY29uc3QgcyA9IHBhcnNlRmxvYXQoa2VybmVsLnN1YnN0cmluZygyKSk7CiAgICAgICAgICAgICAgICBjb25zdCB7IHdlaWdodHMsIHBvc2l0aW9ucyB9ID0gZ2VuZXJhdGVPcHRpbWl6ZWRHYXVzc2lhbktlcm5lbChzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIHdlaWdodHMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIHdlaWdodHMpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgcG9zaXRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgbnVtUGFzc2VzID0gMTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIHVwZGF0ZUtlcm5lbChwYXJhbXMua2VybmVsKTsKICAgICAgICAgICAgbnVtUGFzc2VzID0gcGFyYW1zLm51bVBhc3NlcyB8fCAxOwogICAgICAgIH0KICAgICAgICB1cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGgsIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGFzc2VzOyBpKyspIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcjEpOwogICAgICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUyKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUxKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDIpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHRleGVsU2l6ZUxvY2F0aW9uLCB0ZXhlbFdpZHRoLCAwKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZTIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUxKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmxlbmRQYXNzKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgaXMgcmVxdWlyZWQgd2hlbiByZW5kZXJpbmcgdG8gY2FudmFzCiAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChhX3Bvc2l0aW9uICogdmVjMigxLjAsIC0xLjApLCAwLjAsIDEuMCk7CiAgICAgICAgICAgIHZfdGV4Q29vcmQgPSBhX3RleENvb3JkOwogICAgICAgIH1gOwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9ibHVycmVkSW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9jb3ZlcmFnZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICB2ZWMzIGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBibHVycmVkQ29sb3IgPSB0ZXh0dXJlKHVfYmx1cnJlZElucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChtaXgoYmx1cnJlZENvbG9yLCBjb2xvciwgcGVyc29uTWFzayksIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQaXBsZWxpbmVTdGFnZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJsdXJyZWRJbnB1dEZyYW1lID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JsdXJyZWRJbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgZ2wudW5pZm9ybTFpKHBlcnNvbk1hc2tMb2NhdGlvbiwgMSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGJsdXJyZWRJbnB1dEZyYW1lLCAyKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGNvbnN0IGNvdmVyYWdlID0gcGFyYW1zLmNvdmVyYWdlIHx8IFswLCAxXTsKICAgICAgICAgICAgZ2wudW5pZm9ybTJmKGNvdmVyYWdlTG9jYXRpb24sIGNvdmVyYWdlWzBdLCBjb3ZlcmFnZVsxXSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmFja2dyb3VuZEJsdXJTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBwYXJhbXMpIHsKICAgICAgICBsZXQgYmx1clBhc3MgPSBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcyk7CiAgICAgICAgY29uc3QgYmxlbmRQYXNzID0gYnVpbGRCbGVuZFBhc3MoZ2wsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGJsdXJQYXNzLnJlbmRlcigpOwogICAgICAgICAgICBibGVuZFBhc3MucmVuZGVyKCk7CiAgICAgICAgfQogICAgICAgIGxldCBjdXJyZW50UmVzYW1wbGVTY2FsZSA9IHBhcmFtcy5iYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChjdXJyZW50UmVzYW1wbGVTY2FsZSAhPT0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlKSB7CiAgICAgICAgICAgICAgICBibHVyUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgICAgICBibHVyUGFzcyA9IGJ1aWxkQmx1clBhc3MoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBwZXJzb25NYXNrVGV4dHVyZSwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNhbXBsZVNjYWxlID0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJsdXJQYXNzLnVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBibGVuZFBhc3MudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGJsZW5kUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgIGJsdXJQYXNzLmNsZWFuVXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZEJhY2tncm91bmRJbWFnZVN0YWdlKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBiYWNrZ3JvdW5kSW1hZ2UsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHVuaWZvcm0gdmVjMiB1X2JhY2tncm91bmRTY2FsZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9iYWNrZ3JvdW5kT2Zmc2V0OwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X2JhY2tncm91bmRDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgZm9yIGNhbnZhcwogICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbiAqIHZlYzIoMS4wLCAtMS4wKSwgMC4wLCAxLjApOwogICAgICAgICAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsKICAgICAgICAgICAgdl9iYWNrZ3JvdW5kQ29vcmQgPSBhX3RleENvb3JkICogdV9iYWNrZ3JvdW5kU2NhbGUgKyB1X2JhY2tncm91bmRPZmZzZXQ7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbnB1dEZyYW1lOwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfcGVyc29uTWFzazsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2JhY2tncm91bmQ7CiAgICAgICAgdW5pZm9ybSB2ZWMyIHVfY292ZXJhZ2U7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIGluIHZlYzIgdl9iYWNrZ3JvdW5kQ29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjMyBmcmFtZUNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBiYWNrZ3JvdW5kQ29sb3IgPSB0ZXh0dXJlKHVfYmFja2dyb3VuZCwgdl9iYWNrZ3JvdW5kQ29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChmcmFtZUNvbG9yICogcGVyc29uTWFzayArIGJhY2tncm91bmRDb2xvciAqICgxLjAgLSBwZXJzb25NYXNrKSwgMS4wKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCBvdXRwdXRSYXRpbyA9IG91dHB1dFdpZHRoIC8gb3V0cHV0SGVpZ2h0OwogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRTY2FsZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JhY2tncm91bmRTY2FsZSIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRPZmZzZXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kT2Zmc2V0Iik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTJmKGJhY2tncm91bmRTY2FsZUxvY2F0aW9uLCAxLCAxKTsKICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCAwLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRGcmFtZUxvY2F0aW9uLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBsZXQgYmFja2dyb3VuZFRleHR1cmUgPSBudWxsOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMik7CiAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBiYWNrZ3JvdW5kVGV4dHVyZSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoYmFja2dyb3VuZExvY2F0aW9uLCAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpIHsKICAgICAgICAgICAgY29uc3Qgc291cmNlV2lkdGggPSBiYWNrZ3JvdW5kSW1hZ2UubmF0dXJhbFdpZHRoIHx8IGJhY2tncm91bmRJbWFnZS52aWRlb1dpZHRoIHx8IGJhY2tncm91bmRJbWFnZS53aWR0aDsKICAgICAgICAgICAgY29uc3Qgc291cmNlSGVpZ2h0ID0gYmFja2dyb3VuZEltYWdlLm5hdHVyYWxIZWlnaHQgfHwgYmFja2dyb3VuZEltYWdlLnZpZGVvSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS5oZWlnaHQ7CiAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQsIGdsLkxJTkVBUiwgZ2wuTElORUFSKTsKICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBzb3VyY2VXaWR0aCwgc291cmNlSGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICBsZXQgeE9mZnNldCA9IDA7CiAgICAgICAgICAgIGxldCB5T2Zmc2V0ID0gMDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmRXaWR0aCA9IHNvdXJjZVdpZHRoOwogICAgICAgICAgICBsZXQgYmFja2dyb3VuZEhlaWdodCA9IHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZFJhdGlvID0gYmFja2dyb3VuZFdpZHRoIC8gYmFja2dyb3VuZEhlaWdodDsKICAgICAgICAgICAgaWYgKGJhY2tncm91bmRSYXRpbyA8IG91dHB1dFJhdGlvKSB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSGVpZ2h0ID0gYmFja2dyb3VuZFdpZHRoIC8gb3V0cHV0UmF0aW87CiAgICAgICAgICAgICAgICB5T2Zmc2V0ID0gKHNvdXJjZUhlaWdodCAtIGJhY2tncm91bmRIZWlnaHQpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRXaWR0aCA9IGJhY2tncm91bmRIZWlnaHQgKiBvdXRwdXRSYXRpbzsKICAgICAgICAgICAgICAgIHhPZmZzZXQgPSAoc291cmNlV2lkdGggLSBiYWNrZ3JvdW5kV2lkdGgpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB4U2NhbGUgPSBiYWNrZ3JvdW5kV2lkdGggLyBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgY29uc3QgeVNjYWxlID0gYmFja2dyb3VuZEhlaWdodCAvIHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgeE9mZnNldCAvPSBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgeU9mZnNldCAvPSBzb3VyY2VIZWlnaHQ7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihiYWNrZ3JvdW5kU2NhbGVMb2NhdGlvbiwgeFNjYWxlLCB5U2NhbGUpOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQmFja2dyb3VuZEltYWdlKGJhY2tncm91bmRJbWFnZSwgcmVJbml0KSB7CiAgICAgICAgICAgIGlmIChyZUluaXQpIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJhY2tncm91bmRJbWFnZSkgewogICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRUZXh0dXJlKQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmFja2dyb3VuZFRleHR1cmUpIHsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGJhY2tncm91bmRUZXh0dXJlKTsKICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgYmFja2dyb3VuZEltYWdlLm5hdHVyYWxXaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2UudmlkZW9XaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2Uud2lkdGgsIGJhY2tncm91bmRJbWFnZS5uYXR1cmFsSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS52aWRlb0hlaWdodCB8fCBiYWNrZ3JvdW5kSW1hZ2UuaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgY29uc3QgY292ZXJhZ2UgPSBwYXJhbXMuY292ZXJhZ2UgfHwgWzAsIDFdOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoY292ZXJhZ2VMb2NhdGlvbiwgY292ZXJhZ2VbMF0sIGNvdmVyYWdlWzFdKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgaWYgKGJhY2tncm91bmRJbWFnZSkKICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoYmFja2dyb3VuZFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRJbWFnZSwKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkSW1wcm92ZU1hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KSB7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9wZXJzb25NYXNrOwogICAgICAgIHVuaWZvcm0gdmVjMiB1X3RleGVsU2l6ZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgY29uc3QgZmxvYXQgb2Zmc2V0WzNdID0gZmxvYXRbXSgwLjAsIDEuMCwgMi4wKTsKICAgICAgICBjb25zdCBmbG9hdCB3ZWlnaHRbM10gPSBmbG9hdFtdKDAuMzg3NzQsIDAuMjQ0NzcsIDAuMDYxMzYpOwogICAgICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIGZsb2F0IGJsdXJyZWRBbHBoYSA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hICogd2VpZ2h0WzBdOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKG9mZnNldFtpXSkgKiB1X3RleGVsU2l6ZTsKICAgICAgICAgICAgICAgIHZlYzIgdGV4Q29vcmQgPSB2X3RleENvb3JkICsgb2Zmc2V0OwogICAgICAgICAgICAgICAgYmx1cnJlZEFscGhhICs9IHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSAqIHdlaWdodFtpXTsKICAgICAgICAgICAgICAgIHRleENvb3JkID0gdl90ZXhDb29yZCAtIG9mZnNldDsKICAgICAgICAgICAgICAgIGJsdXJyZWRBbHBoYSArPSB0ZXh0dXJlKHVfcGVyc29uTWFzaywgdGV4Q29vcmQpLmEgKiB3ZWlnaHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KDAsMCwwLGJsdXJyZWRBbHBoYSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBvdXRwdXRXaWR0aDsKICAgICAgICBjb25zdCB0ZXhlbEhlaWdodCA9IDEgLyBvdXRwdXRIZWlnaHQ7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBpbXByb3ZlZE1hc2tUZXh0dXJlLCAwKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShwZXJzb25NYXNrTG9jYXRpb24sIDEpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgdGV4ZWxXaWR0aCwgMCk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTEpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyByZW5kZXIsIGNsZWFuVXAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZFRGTGl0ZU91dHB1dFRvTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0VGV4dHVyZSwgdGZsaXRlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0U2VnbWVudGF0aW9uOwoKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIGZsb2F0IGdldE1hc2sodmVjMiBzZWdtZW50YXRpb24pIHsKICAgICAgICAgICAgZmxvYXQgc2hpZnQgPSBtYXgoc2VnbWVudGF0aW9uLnIsIHNlZ21lbnRhdGlvbi5nKTsKICAgICAgICAgICAgZmxvYXQgYmFja2dyb3VuZEV4cCA9IGV4cChzZWdtZW50YXRpb24uciAtIHNoaWZ0KTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uRXhwID0gZXhwKHNlZ21lbnRhdGlvbi5nIC0gc2hpZnQpOwogICAgICAgICAgICByZXR1cm4gcGVyc29uRXhwIC8gKGJhY2tncm91bmRFeHAgKyBwZXJzb25FeHApOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCBtYXNrID0gZ2V0TWFzayh0ZXh0dXJlKHVfaW5wdXRTZWdtZW50YXRpb24sIHZfdGV4Q29vcmQpLnJnKTsKICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KHZlYzMoMC4wKSwgbWFzayk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRTZWdtZW50YXRpb24iKTsKICAgICAgICBjb25zdCBpbnB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SRzMyRiwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIpOwogICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgb3V0cHV0VGV4dHVyZSwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRMb2NhdGlvbiwgMSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuUkcsIGdsLkZMT0FULCB0ZmxpdGUuSEVBUEYzMiwgb3V0cHV0TWVtb3J5T2Zmc2V0KTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgcmVuZGVyLCBjbGVhblVwIH07CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRURkxpdGVJbnB1dFN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgdGZsaXRlLCBpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgaW5wdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0RnJhbWU7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9mbG9hdGx1dDsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3BpeGVsU2l6ZTsKICAgICAgICBvdXQgdmVjNCBvdXRDb2xvcjsKCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCB4ID0gdl90ZXhDb29yZC54OwogICAgICAgICAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpOwogICAgICAgICAgICBmbG9hdCByID0gbW9kKHggKiB1X3BpeGVsU2l6ZSwgMy4wKTsKICAgICAgICAgICAgZmxvYXQgYyA9IDAuMDsKICAgICAgICAgICAgaWYgKHIgPj0gMi4wICkgYyA9IGNvbG9yLmI7CiAgICAgICAgICAgIGVsc2UgaWYgKHIgPj0gMS4wKSBjID0gY29sb3IuZzsKICAgICAgICAgICAgZWxzZSBjID0gY29sb3IucjsKICAgICAgICAgICAgb3V0Q29sb3IgPSB0ZXh0dXJlKHVfZmxvYXRsdXQsIHZlYzIoYywgMC41KSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0RnJhbWVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9pbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgcGl4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGl4ZWxTaXplIik7CiAgICAgICAgY29uc3QgZmxvYXRsdXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9mbG9hdGx1dCIpOwogICAgICAgIGNvbnN0IG91dHB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgaW5wdXRXaWR0aCAqIDMsIGlucHV0SGVpZ2h0KTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBvdXRwdXRUZXh0dXJlLCAwKTsKICAgICAgICBjb25zdCBvdXRwdXRQaXhlbHMgPSBuZXcgVWludDhBcnJheSh0ZmxpdGUuSEVBUEYzMi5idWZmZXIsIGlucHV0TWVtb3J5T2Zmc2V0ICogNCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCAqIDQgKiAzKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDApOwogICAgICAgIGdsLnVuaWZvcm0xZihwaXhlbFNpemVMb2NhdGlvbiwgaW5wdXRXaWR0aCAqIDMpOwogICAgICAgIGdsLnVuaWZvcm0xaShmbG9hdGx1dExvY2F0aW9uLCAzKTsKICAgICAgICBjb25zdCBmbG9hdEx1dFRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgIGNvbnN0IGx1dCA9IG5ldyBGbG9hdDMyQXJyYXkoMjU2KTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKQogICAgICAgICAgICBsdXRbaV0gPSBpIC8gMjU2OwogICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgMjU2LCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBuZXcgVWludDhBcnJheShsdXQuYnVmZmVyLCAwLCAyNTYgKiA0KSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBpbnB1dFdpZHRoICogMywgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUzKTsKICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5yZWFkUGl4ZWxzKDAsIDAsIGlucHV0V2lkdGggKiAzLCBpbnB1dEhlaWdodCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgb3V0cHV0UGl4ZWxzKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgICAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKG91dHB1dFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGZsb2F0THV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJlbmRlciwgY2xlYW5VcCB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEJsdXJFbmdpbmVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgc3dpdGNoIChwYXJhbXMuYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsga2VybmVsOiAib2c1IiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMSB9LCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzEwIiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMC41IH0sIHBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzUiLCBudW1QYXNzZXM6IDEsIGJhY2tncm91bmRSZXNhbXBsZVNjYWxlOiAwLjUgfSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGdldEVuZ2luZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICBjb25zdCBiYXNlRW5naW5lUGFyYW1zID0gewogICAgICAgICAgICBjb3ZlcmFnZTogcGFyYW1zLmNvdmVyYWdlLAogICAgICAgIH07CiAgICAgICAgaWYgKHBhcmFtcy5iYWNrZ3JvdW5kQmx1cikgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IGJhc2VFbmdpbmVQYXJhbXMgfSwgZ2V0Qmx1ckVuZ2luZVBhcmFtcyhwYXJhbXMuYmFja2dyb3VuZEJsdXIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2VFbmdpbmVQYXJhbXM7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVXZWJHTEVuZ2luZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgc2V0dXAsIGVmZmVjdENhbnZhcywgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgY29uc3QgeyB0ZmxpdGUsIGlucHV0SGVpZ2h0LCBpbnB1dFdpZHRoLCBpbnB1dE1lbW9yeU9mZnNldCwgb3V0cHV0TWVtb3J5T2Zmc2V0LCBzZWdtZW50YXRpb25QaXhlbENvdW50IH0gPSB5aWVsZCBsb2FkU2VnbWVudGF0aW9uTW9kZWwoc2V0dXAuc2VnbWVudGF0aW9uTW9kZWxJZCk7CiAgICAgICAgICAgIGxldCBlbmdpbmVQYXJhbXMgPSBnZXRFbmdpbmVQYXJhbXMocGFyYW1zKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgaW4gdmVjMiBhX3Bvc2l0aW9uOwogICAgICAgIGluIHZlYzIgYV90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X3RleENvb3JkOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24sIDAuMCwgMS4wKTsKICAgICAgICAgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7CiAgICAgICAgfWA7CiAgICAgICAgICAgIGNvbnN0IGdsID0gZWZmZWN0Q2FudmFzLmdldENvbnRleHQoIndlYmdsMiIsIHNldHVwLndlYmdsQ29udGV4dFNldHRpbmdzKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4QXJyYXkgPSBnbC5jcmVhdGVWZXJ0ZXhBcnJheSgpOwogICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbkJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwogICAgICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcG9zaXRpb25CdWZmZXIpOwogICAgICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbLTEsIC0xLCAxLjAsIC0xLCAtMSwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IGlucHV0RnJhbWVUZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBpbnB1dEZyYW1lVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgICAgIGNvbnN0IG1hc2tUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0KTsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrV2lkdGggPSBpbnB1dFdpZHRoOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlZE1hc2tIZWlnaHQgPSBpbnB1dEhlaWdodDsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrVGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHQkE4LCBpbXByb3ZlZE1hc2tXaWR0aCwgaW1wcm92ZWRNYXNrSGVpZ2h0LCBnbC5MSU5FQVIsIGdsLkxJTkVBUik7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZUlucHV0U3RhZ2UgPSBidWlsZFRGTGl0ZUlucHV0U3RhZ2UoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBzZWdtZW50YXRpb25QaXhlbENvdW50LCBpbnB1dE1lbW9yeU9mZnNldCk7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlID0gYnVpbGRURkxpdGVPdXRwdXRUb01hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG1hc2tUZXh0dXJlLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlTWFza1N0YWdlID0gYnVpbGRJbXByb3ZlTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgbWFza1RleHR1cmUsIGltcHJvdmVkTWFza1RleHR1cmUsIGltcHJvdmVkTWFza1dpZHRoLCBpbXByb3ZlZE1hc2tIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQmx1clN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kQmx1clN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgaW1wcm92ZWRNYXNrVGV4dHVyZSwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIGVuZ2luZVBhcmFtcyk7CiAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRJbWFnZVN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kSW1hZ2VTdGFnZShnbCwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eDogZ2wsCiAgICAgICAgICAgICAgICB1cGRhdGVCYWNrZ3JvdW5kRnJhbWUoZnJhbWUsIF8sIHJlSW5pdCkgewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZVN0YWdlLnVwZGF0ZUJhY2tncm91bmRJbWFnZShmcmFtZSwgcmVJbml0KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbXModXBkYXRlZFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHVwZGF0ZWRQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lUGFyYW1zID0gZ2V0RW5naW5lUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEJsdXJTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2VTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpOwogICAgICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApOwogICAgICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0RnJhbWVUZXh0dXJlKTsKICAgICAgICAgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZUlucHV0U3RhZ2UucmVuZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgdGZsaXRlLl9ydW5JbmZlcmVuY2UoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVPdXRwdXRUb01hc2tTdGFnZS5yZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICBpbXByb3ZlTWFza1N0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5iYWNrZ3JvdW5kVXJsID8gYmFja2dyb3VuZEltYWdlU3RhZ2UucmVuZGVyKCkgOiBiYWNrZ3JvdW5kQmx1clN0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRCbHVyU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGltcHJvdmVNYXNrU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVJbnB1dFN0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGltcHJvdmVkTWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUobWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRGcmFtZVRleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHBvc2l0aW9uQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVWZXJ0ZXhBcnJheSh2ZXJ0ZXhBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlY29kZUJhc2U2NChiYXNlNjQsIGVuYWJsZVVuaWNvZGUpIHsKICAgICAgICB2YXIgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpOwogICAgICAgIHJldHVybiBiaW5hcnlTdHJpbmc7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlVVJMKGJhc2U2NCwgc291cmNlbWFwQXJnLCBlbmFibGVVbmljb2RlQXJnKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IGRlY29kZUJhc2U2NChiYXNlNjQpOwogICAgICAgIHZhciBzdGFydCA9IHNvdXJjZS5pbmRleE9mKCdcbicsIDEwKSArIDE7CiAgICAgICAgdmFyIGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0KSArICgnJyk7CiAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbYm9keV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pOwogICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2U2NFdvcmtlckZhY3RvcnkoYmFzZTY0LCBzb3VyY2VtYXBBcmcsIGVuYWJsZVVuaWNvZGVBcmcpIHsKICAgICAgICB2YXIgdXJsOwogICAgICAgIHJldHVybiBmdW5jdGlvbiBXb3JrZXJGYWN0b3J5KG9wdGlvbnMpIHsKICAgICAgICAgICAgdXJsID0gdXJsIHx8IGNyZWF0ZVVSTChiYXNlNjQpOwogICAgICAgICAgICByZXR1cm4gbmV3IFdvcmtlcih1cmwsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICB9CgogICAgdmFyIFdvcmtlckZhY3RvcnkgPSAvKiNfX1BVUkVfXyovY3JlYXRlQmFzZTY0V29ya2VyRmFjdG9yeSgnTHlvZ2NtOXNiSFZ3TFhCc2RXZHBiaTEzWldJdGQyOXlhMlZ5TFd4dllXUmxjaUFxTHdvb1puVnVZM1JwYjI0Z0tDa2dld29nSUNBZ0ozVnpaU0J6ZEhKcFkzUW5Pd29LSUNBZ0lHeGxkQ0IwYVcxbGNpQTlJRzUxYkd3N0NpQWdJQ0J2Ym0xbGMzTmhaMlVnUFNCbWRXNWpkR2x2YmlBb2NtVnhkV1Z6ZENrZ2V3b2dJQ0FnSUNBZ0lHTnZibk4wSUhScGJXVWdQU0J5WlhGMVpYTjBMbVJoZEdFN0NpQWdJQ0FnSUNBZ2FXWWdLSFJwYldVZ1BqMGdNQ2tLSUNBZ0lDQWdJQ0FnSUNBZ2RHbHRaWElnUFNCelpYUlVhVzFsYjNWMEtDZ3BJRDArSUhCdmMzUk5aWE56WVdkbEtDSWlLU3dnZEdsdFpTazdDaUFnSUNBZ0lDQWdaV3h6WlNCcFppQW9kR2x0WlhJcENpQWdJQ0FnSUNBZ0lDQWdJR05zWldGeVZHbHRaVzkxZENoMGFXMWxjaWs3Q2lBZ0lDQjlPd29LZlNrb0tUc0tMeThqSUhOdmRYSmpaVTFoY0hCcGJtZFZVa3c5ZEdsdFpYSXVkMjl5YTJWeUxtcHpMbTFoY0FvSycpOwogICAgLyogZXNsaW50LWVuYWJsZSAqLwoKICAgIGNsYXNzIFByb2Nlc3NvciBleHRlbmRzIGV2ZW50c0V4cG9ydHMuRXZlbnRFbWl0dGVyIHsKICAgICAgICBjb25zdHJ1Y3Rvcih7IHNldHVwLCBwYXJhbXMsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlbWl0IH0pIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwOwogICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICAgICAgdGhpcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKICAgICAgICAgICAgdGhpcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwogICAgICAgICAgICB0aGlzLl9lbmdpbmVMb2NrID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgICAgICAgIGlmIChlbWl0KQogICAgICAgICAgICAgICAgdGhpcy5lbWl0ID0gZW1pdDsKICAgICAgICB9CiAgICAgICAgc2V0dXBFbmdpbmUodmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIGVmZmVjdENhbnZhcywgaW5pdGlhbEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgdGhpcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKICAgICAgICAgICAgICAgIHRoaXMudmlkZW9IZWlnaHQgPSB2aWRlb0hlaWdodDsKICAgICAgICAgICAgICAgIHRoaXMudmlkZW9Bc3BlY3RSYXRpbyA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdENhbnZhcyA9IGVmZmVjdENhbnZhcyB8fCBjcmVhdGVDYW52YXModGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZUVuZ2luZSA9IHRoaXMuc2V0dXAudXNlV2ViR0wgPyBjcmVhdGVXZWJHTEVuZ2luZSA6IGNyZWF0ZUNhbnZhc0VuZ2luZTsKICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lID0geWllbGQgY3JlYXRlRW5naW5lKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCwgdGhpcy5zZXR1cCwgdGhpcy5lZmZlY3RDYW52YXMsIHRoaXMucGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKTsKICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0Q3R4ID0gdGhpcy5lbmdpbmUuZWZmZWN0Q3R4OwogICAgICAgICAgICAgICAgaWYgKGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJhY2tncm91bmRGcmFtZSh7IGZyYW1lOiBpbml0aWFsQmFja2dyb3VuZEZyYW1lIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlVmlkZW9TaXplKF9hKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgYXJndW1lbnRzLCB2b2lkIDAsIGZ1bmN0aW9uKiAoeyB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCB9KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmdpbmVMb2NrID0gdGhpcy5fZW5naW5lTG9jay50aGVuKCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRCYWNrZ3JvdW5kRnJhbWUgPSB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRFbmdpbmUgPSB0aGlzLmVuZ2luZTsKICAgICAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnNldHVwRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCB0aGlzLmVmZmVjdENhbnZhcywgb2xkQmFja2dyb3VuZEZyYW1lKTsKICAgICAgICAgICAgICAgICAgICBvbGRFbmdpbmUuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgeWllbGQgdGhpcy5fZW5naW5lTG9jazsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGluaXQoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qICh7IGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUsIHVzZUluc2VydGFibGVTdHJlYW1zLCBlZmZlY3RDYW52YXMgfSkgewogICAgICAgICAgICAgICAgeWllbGQgdGhpcy5zZXR1cEVuZ2luZSh0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQsIGVmZmVjdENhbnZhcywgaW5pdGlhbEJhY2tncm91bmRGcmFtZSk7CiAgICAgICAgICAgICAgICBpZiAodXNlSW5zZXJ0YWJsZVN0cmVhbXMpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZHJvcEZpcnN0ID0gNTsKICAgICAgICAgICAgICAgICAgICBsZXQgbG9jYWxTdGFydFRpbWUgPSAwOwogICAgICAgICAgICAgICAgICAgIGxldCBmcmFtZVN0YXJ0VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0RnJhbWVSZW5kZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtZXIgPSBuZXcgVHJhbnNmb3JtU3RyZWFtKHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoZnJhbWUsIGNvbnRyb2xsZXIpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcmFtZVRpbWVzdGFtcCA9IGZyYW1lLnRpbWVzdGFtcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhbFN0YXJ0VGltZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RhcnRUaW1lID0gbm93OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU3RhcnRUaW1lID0gZnJhbWVUaW1lc3RhbXAgLyAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxhcHNlZEZyYW1lVGltZSA9IGZyYW1lVGltZXN0YW1wIC8gMTAwMCAtIGZyYW1lU3RhcnRUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxhcHNlZExvY2FsVGltZSA9IG5vdyAtIGxvY2FsU3RhcnRUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BGaXJzdCA+IDAgfHwgZWxhcHNlZExvY2FsVGltZSA8IGVsYXBzZWRGcmFtZVRpbWUgKyAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZShmcmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNWaWRlb0JhY2tncm91bmQgJiYgdGhpcy5zZXR1cC50cmFuc2ZlclR5cGUgIT09ICJjYW52YXMiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgiZ2V0YmFja2dyb3VuZGZyYW1lIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEZpcnN0ID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BGaXJzdC0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RhcnRUaW1lID0gbm93OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU3RhcnRUaW1lID0gZnJhbWVUaW1lc3RhbXAgLyAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKHRoaXMuZWZmZWN0Q2FudmFzLCB7IHRpbWVzdGFtcDogZnJhbWVUaW1lc3RhbXAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdEZyYW1lUmVuZGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEZyYW1lUmVuZGVyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgiZmlyc3RmcmFtZXJlbmRlcmVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuc2V0dXAudXNlQmFja2dyb3VuZFdvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJXb3JrZXIgPSBuZXcgV29ya2VyRmFjdG9yeSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJvdXRwdXQiLCB7IGZyYW1lOiB0aGlzLmN1cnJlbnRPdXRwdXRGcmFtZSB9LCBbdGhpcy5jdXJyZW50T3V0cHV0RnJhbWVdKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgicmVhZHkiKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVBhcmFtcyhfYSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHsgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lIH0pIHsKICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuX2VuZ2luZUxvY2s7CiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSA9IG51bGw7CiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWVDdHggPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJhY2tncm91bmRGcmFtZSh7IGZyYW1lOiBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCByZUluaXQ6IHRydWUgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVCYWNrZ3JvdW5kRnJhbWUobnVsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZSh7IGZyYW1lLCByZUluaXQgfSkgewogICAgICAgICAgICBsZXQgdXBkYXRlZERpbWVuc2lvbnM7CiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICB0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCA9IHRoaXMucGFyYW1zLmJhY2tncm91bmRVcmwgJiYgdGhpcy5wYXJhbXMuYmFja2dyb3VuZFR5cGUgPT09ICJ2aWRlbyI7CiAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucyA9IHsgeDogMCwgeTogMCwgd2lkdGg6IHRoaXMudmlkZW9XaWR0aCwgaGVpZ2h0OiB0aGlzLnZpZGVvSGVpZ2h0IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAiaW1hZ2ViaXRtYXAiOiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eCA9IHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZS5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGZyYW1lKSwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWVDdHgucHV0SW1hZ2VEYXRhKGZyYW1lLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgImNhbnZhcyI6IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCA9IGZyYW1lLnZpZGVvV2lkdGggfHwgZnJhbWUubmF0dXJhbFdpZHRoIHx8IGZyYW1lLndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgPSBmcmFtZS52aWRlb0hlaWdodCB8fCBmcmFtZS5uYXR1cmFsSGVpZ2h0IHx8IGZyYW1lLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZEFzcGVjdFJhdGlvID0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLyB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kQXNwZWN0UmF0aW8gPiB0aGlzLnZpZGVvQXNwZWN0UmF0aW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHNpZGVYID0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLSB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgKiB0aGlzLnZpZGVvQXNwZWN0UmF0aW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCAtPSBvdXRzaWRlWDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLnggPSBNYXRoLmZsb29yKG91dHNpZGVYIC8gMik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmFja2dyb3VuZEFzcGVjdFJhdGlvIDwgdGhpcy52aWRlb0FzcGVjdFJhdGlvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRzaWRlWSA9IHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodCAtIHVwZGF0ZWREaW1lbnNpb25zLndpZHRoIC8gdGhpcy52aWRlb0FzcGVjdFJhdGlvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMuaGVpZ2h0IC09IG91dHNpZGVZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMueSA9IE1hdGguZmxvb3Iob3V0c2lkZVkgLyAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVCYWNrZ3JvdW5kRnJhbWUodGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lLCB1cGRhdGVkRGltZW5zaW9ucywgcmVJbml0KTsKICAgICAgICB9CiAgICAgICAgdGVybWluYXRlKCkgewogICAgICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm1Db250cm9sbGVyKQogICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyLnRlcm1pbmF0ZSgpOwogICAgICAgICAgICBpZiAodGhpcy50aW1lcldvcmtlcikKICAgICAgICAgICAgICAgIHRoaXMudGltZXJXb3JrZXIudGVybWluYXRlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmVuZ2luZSkgewogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmVtaXQoInRlcm1pbmF0ZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnQoeyBpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtIH0pIHsKICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtKQogICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0ucGlwZVRocm91Z2godGhpcy50cmFuc2Zvcm1lcikucGlwZVRvKG91dHB1dFN0cmVhbSk7CiAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyID0gMDsKICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXJUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgfQogICAgICAgIGlucHV0KF9hKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgYXJndW1lbnRzLCB2b2lkIDAsIGZ1bmN0aW9uKiAoeyB2aWRlb0ZyYW1lLCBiYWNrZ3JvdW5kRnJhbWUsIHJlcXVlc3RUaW1lLCBsYXN0UmVuZGVyVGltZSwgZGVsYXkgfSkgewogICAgICAgICAgICAgICAgdmFyIF9iOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmF0ZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgY29uc3QgcnR0ID0gKERhdGUubm93KCkgLSByZXF1ZXN0VGltZSkgKiAyOwogICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVGltZSA9IGxhc3RSZW5kZXJUaW1lICsgZGVsYXkgLSBydHQ7CiAgICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZEZyYW1lKQogICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWU6IGJhY2tncm91bmRGcmFtZSB9KTsKICAgICAgICAgICAgICAgIGxldCBmcmFtZTsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zZXR1cC50cmFuc2ZlclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWJpdG1hcCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgKF9iID0gdGhpcy5wcmV2VmlkZW9GcmFtZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldlZpZGVvRnJhbWUgPSB2aWRlb0ZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh2aWRlb0ZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB5aWVsZCBjcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmVmZmVjdENhbnZhcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUgPSBuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheSh2aWRlb0ZyYW1lKSwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlucHV0Q2FudmFzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q2FudmFzID0gY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q2FudmFzQ3R4ID0gdGhpcy5pbnB1dENhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDYW52YXNDdHgucHV0SW1hZ2VEYXRhKHZpZGVvRnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh0aGlzLmlucHV0Q2FudmFzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmVmZmVjdEN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KS5kYXRhLmJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhc2UgImNhbnZhcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQW5kUmVuZGVyRnJhbWUodmlkZW9GcmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lID0gdGhpcy5lZmZlY3RDYW52YXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuRGVsYXkgPSBNYXRoLm1heCgwLCByZXR1cm5UaW1lIC0gRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lcldvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE91dHB1dEZyYW1lID0gZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5wb3N0TWVzc2FnZShyZXR1cm5EZWxheSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJvdXRwdXQiLCB7IGZyYW1lIH0sIFtmcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0sIHJldHVybkRlbGF5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHByb2Nlc3NBbmRSZW5kZXJGcmFtZShmcmFtZSkgewogICAgICAgICAgICB0aGlzLmVuZ2luZS5wcm9jZXNzRnJhbWUoZnJhbWUpOwogICAgICAgICAgICBpZiAodGhpcy5zZXR1cC5sb2dUb0NvbnNvbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyKys7CiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICAgICAgICAgIGlmIChub3cgLSB0aGlzLmZyYW1lQ291bnRlclRpbWUgPiAxMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJ1bm5pbmcgY2FtZXJhIGVmZmVjdHMsICR7TWF0aC5yb3VuZCgodGhpcy5mcmFtZUNvdW50ZXIgKiAxMDAwKSAvIChub3cgLSB0aGlzLmZyYW1lQ291bnRlclRpbWUpKX0gZnBzYCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIgPSAwOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyVGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjb25zdCBwcm9jZXNzb3JzID0ge307CiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiAocmVxdWVzdCkgewogICAgICAgIHZhciBfYTsKICAgICAgICBjb25zdCBwcm9jZXNzb3JJZCA9IHJlcXVlc3QuZGF0YS5wcm9jZXNzb3JJZDsKICAgICAgICBpZiAocmVxdWVzdC5kYXRhLnR5cGUgPT09ICJjcmVhdGUiKSB7CiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBQcm9jZXNzb3IoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0LmRhdGEpLCB7IGVtaXQ6ICh0eXBlLCBkYXRhLCB0cmFuc2ZlcikgPT4gcG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7IHByb2Nlc3NvcklkLCB0eXBlIH0sIGRhdGEpLCB0cmFuc2ZlcikgfSkpOwogICAgICAgICAgICBwcm9jZXNzb3JzW3Byb2Nlc3NvcklkXSA9IHByb2Nlc3NvcjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIChfYSA9IHByb2Nlc3NvcnNbcHJvY2Vzc29ySWRdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbcmVxdWVzdC5kYXRhLnR5cGVdKHJlcXVlc3QuZGF0YSk7CiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmRhdGEudHlwZSA9PT0gInRlcm1pbmF0ZSIpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9jZXNzb3JzW3Byb2Nlc3NvcklkXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgY29uc3QgY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDsKICAgICAgICBpZiAodHlwZW9mIF9fZmlsZW5hbWUgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICBfc2NyaXB0RGlyID0gX3NjcmlwdERpciB8fCBfX2ZpbGVuYW1lOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSkgewogICAgICAgICAgICBjcmVhdGVURkxpdGVTSU1ETW9kdWxlID0gY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSB8fCB7fTsKICAgICAgICAgICAgdmFyIE1vZHVsZSA9IHR5cGVvZiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlICE9PSAidW5kZWZpbmVkIiA/IGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUgOiB7fTsKICAgICAgICAgICAgdmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDsKICAgICAgICAgICAgTW9kdWxlWyJyZWFkeSJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0ge307CiAgICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIE1vZHVsZSkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT3ZlcnJpZGVzW2tleV0gPSBNb2R1bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB2YXIgcXVpdF8gPSBmdW5jdGlvbiAoc3RhdHVzLCB0b1Rocm93KSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0b1Rocm93OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX05PREUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1NIRUxMID0gZmFsc2U7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gImZ1bmN0aW9uIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfTk9ERSA9CiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlID09PSAic3RyaW5nIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSAhRU5WSVJPTk1FTlRfSVNfV0VCICYmICFFTlZJUk9OTUVOVF9JU19OT0RFICYmICFFTlZJUk9OTUVOVF9JU19XT1JLRVI7CiAgICAgICAgICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHREaXJlY3RvcnkgKyBwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgICAgICAgICB2YXIgbm9kZUZTOwogICAgICAgICAgICB2YXIgbm9kZVBhdGg7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gcmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSwgYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlRlMpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGUyA9IHJlcXVpcmUoImZzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlUGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVBhdGggPSByZXF1aXJlKCJwYXRoIik7CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlUGF0aFsibm9ybWFsaXplIl0oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlRlNbInJlYWRGaWxlU3luYyJdKGZpbGVuYW1lLCBiaW5hcnkgPyBudWxsIDogInV0ZjgiKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSByZWFkXyhmaWxlbmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQuYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBVaW50OEFycmF5KHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gcHJvY2Vzc1siYXJndiJdWzFdLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmNhdWdodEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIChleCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCBhYm9ydCk7CiAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWyJleGl0Il0oc3RhdHVzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNb2R1bGVbImluc3BlY3QiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfU0hFTEwpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZCAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkKGYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpOwogICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NyaXB0QXJncyAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdEFyZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1aXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVpdChzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByaW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyA9IHByaW50OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiA9IGNvbnNvbGUuZXJyb3IgPSB0eXBlb2YgcHJpbnRFcnIgIT09ICJ1bmRlZmluZWQiID8gcHJpbnRFcnIgOiBwcmludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3NjcmlwdERpcikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoImJsb2I6IikgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZWFkXyA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jID0gZnVuY3Rpb24gKHVybCwgb25sb2FkLCBvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgOwogICAgICAgICAgICB2YXIgb3V0ID0gTW9kdWxlWyJwcmludCJdIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIG1vZHVsZU92ZXJyaWRlcykgewogICAgICAgICAgICAgICAgaWYgKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlW2tleV0gPSBtb2R1bGVPdmVycmlkZXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkKICAgICAgICAgICAgICAgIE1vZHVsZVsiYXJndW1lbnRzIl07CiAgICAgICAgICAgIGlmIChNb2R1bGVbInRoaXNQcm9ncmFtIl0pCiAgICAgICAgICAgICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsicXVpdCJdKQogICAgICAgICAgICAgICAgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTsKICAgICAgICAgICAgdmFyIHdhc21CaW5hcnk7CiAgICAgICAgICAgIGlmIChNb2R1bGVbIndhc21CaW5hcnkiXSkKICAgICAgICAgICAgICAgIHdhc21CaW5hcnkgPSBNb2R1bGVbIndhc21CaW5hcnkiXTsKICAgICAgICAgICAgTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gfHwgdHJ1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdhc21NZW1vcnk7CiAgICAgICAgICAgIHZhciBBQk9SVCA9IGZhbHNlOwogICAgICAgICAgICBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCB0ZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiICsgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAidW5kZWZpbmVkIiA/IG5ldyBUZXh0RGVjb2RlcigidXRmOCIpIDogdW5kZWZpbmVkOwogICAgICAgICAgICBmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLCBpZHgsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5kSWR4ID0gaWR4ICsgbWF4Qnl0ZXNUb1JlYWQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICAgICAgICAgICAgd2hpbGUgKGhlYXBbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKQogICAgICAgICAgICAgICAgICAgICsrZW5kUHRyOwogICAgICAgICAgICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXAuc3ViYXJyYXkgJiYgVVRGOERlY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IGhlYXBbaWR4KytdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDEyOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyMjQpID09IDE5MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyNDApID09IDIyNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgMTUpIDw8IDEyKSB8ICh1MSA8PCA2KSB8IHUyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwW2lkeCsrXSAmIDYzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGNoID4+IDEwKSwgNTYzMjAgfCAoY2ggJiAxMDIzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlQXNjaWlUb01lbW9yeShzdHIsIGJ1ZmZlciwgZG9udEFkZE51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyKysgPj4gMF0gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWxpZ25VcCh4LCBtdWx0aXBsZSkgewogICAgICAgICAgICAgICAgaWYgKHggJSBtdWx0aXBsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB4ICs9IG11bHRpcGxlIC0gKHggJSBtdWx0aXBsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYnVmZmVyLCBIRUFQOCwgSEVBUFU4LCBIRUFQMzI7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZikgewogICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVAxNiJdID0gbmV3IEludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDMyIl0gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTgiXSA9IEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMTYiXSA9IG5ldyBVaW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTMyIl0gPSBuZXcgVWludDMyQXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gbmV3IEZsb2F0MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBuZXcgRmxvYXQ2NEFycmF5KGJ1Zik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJJTklUSUFMX01FTU9SWSJdIHx8IDE2Nzc3MjE2OwogICAgICAgICAgICB2YXIgd2FzbVRhYmxlOwogICAgICAgICAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUTUFJTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICAgICAgICAgIF9fQVRJTklUX18ucHVzaCh7CiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX19fd2FzbV9jYWxsX2N0b3JzKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnVuY3Rpb24gcHJlUnVuKCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXSA9IFtNb2R1bGVbInByZVJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHJlTWFpbigpIHsKICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwb3N0UnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicG9zdFJ1biJdID0gW01vZHVsZVsicG9zdFJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXSA9IHt9OwogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uQWJvcnQiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25BYm9ydCJdKHdoYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hhdCArPSAiIjsKICAgICAgICAgICAgICAgIGVycih3aGF0KTsKICAgICAgICAgICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHdoYXQgPSAiYWJvcnQoIiArIHdoYXQgKyAiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iOwogICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBoYXNQcmVmaXgoc3RyLCBwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPyBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIDogc3RyLmluZGV4T2YocHJlZml4KSA9PT0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBkYXRhVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZmlsZVVSSVByZWZpeCA9ICJmaWxlOi8vIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBmaWxlVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeUZpbGUgPSAidGZsaXRlLXNpbWQud2FzbSI7CiAgICAgICAgICAgIGlmICghaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgd2FzbUJpbmFyeUZpbGUgPSBsb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSB3YXNtQmluYXJ5RmlsZSAmJiB3YXNtQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRCaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBhYm9ydChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIiAmJiAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZVsib2siXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciICsgd2FzbUJpbmFyeUZpbGUgKyAiJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VbImFycmF5QnVmZmVyIl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEFzeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByZWplY3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVXYXNtKCkgewogICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7IGE6IGFzbUxpYnJhcnlBcmcgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiYXNtIl0gPSBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkgPSBNb2R1bGVbImFzbSJdWyJxIl07CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZSA9IE1vZHVsZVsiYXNtIl1bIkQiXTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCkgewogICAgICAgICAgICAgICAgICAgIHJlY2VpdmVJbnN0YW5jZShvdXRwdXRbImluc3RhbmNlIl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnlQcm9taXNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbmZvKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZWNlaXZlciwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydChyZWFzb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAiZnVuY3Rpb24iICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKGluZm8sIHJlY2VpdmVJbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcykgewogICAgICAgICAgICAgICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrLmZ1bmM7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyhjYWxsYmFjay5hcmcgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfYWJvcnQoKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93OwogICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkgewogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHByb2Nlc3NbImhydGltZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF0gKiAxZTMgKyB0WzFdIC8gMWU2OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGF0ZU5vdyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBkYXRlTm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljID0gdHJ1ZTsKICAgICAgICAgICAgZnVuY3Rpb24gc2V0RXJyTm8odmFsdWUpIHsKICAgICAgICAgICAgICAgIEhFQVAzMltfX19lcnJub19sb2NhdGlvbigpID4+IDJdID0gdmFsdWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Nsb2NrX2dldHRpbWUoY2xrX2lkLCB0cCkgewogICAgICAgICAgICAgICAgdmFyIG5vdzsKICAgICAgICAgICAgICAgIGlmIChjbGtfaWQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBub3cgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNsa19pZCA9PT0gMSB8fCBjbGtfaWQgPT09IDQpICYmIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVAzMlt0cCA+PiAyXSA9IChub3cgLyAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIEhFQVAzMlsodHAgKyA0KSA+PiAyXSA9ICgobm93ICUgMWUzKSAqIDFlMyAqIDFlMykgfCAwOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Rsb3BlbihmaWxlbmFtZSwgZmxhZykgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbHN5bShoYW5kbGUsIHN5bWJvbCkgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCwgc3JjLCBudW0pIHsKICAgICAgICAgICAgICAgIEhFQVBVOC5jb3B5V2l0aGluKGRlc3QsIHNyYywgc3JjICsgbnVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihzaXplKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkuZ3Jvdygoc2l6ZSAtIGJ1ZmZlci5ieXRlTGVuZ3RoICsgNjU1MzUpID4+PiAxNik7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpIHsKICAgICAgICAgICAgICAgIHZhciBvbGRTaXplID0gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpOwogICAgICAgICAgICAgICAgdmFyIG1heEhlYXBTaXplID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBjdXREb3duID0gMTsgY3V0RG93biA8PSA0OyBjdXREb3duICo9IDIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3Zlckdyb3duSGVhcFNpemUgPSBvbGRTaXplICogKDEgKyAwLjIgLyBjdXREb3duKTsKICAgICAgICAgICAgICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnblVwKE1hdGgubWF4KHJlcXVlc3RlZFNpemUsIG92ZXJHcm93bkhlYXBTaXplKSwgNjU1MzYpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwKG1zZWNzKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBfZW1zY3JpcHRlbl9nZXRfbm93KCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoX2Vtc2NyaXB0ZW5fZ2V0X25vdygpIC0gc3RhcnQgPCBtc2VjcykgeyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIEVOViA9IHt9OwogICAgICAgICAgICBmdW5jdGlvbiBnZXRFeGVjdXRhYmxlTmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzUHJvZ3JhbSB8fCAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudlN0cmluZ3MoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gKCh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0pIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICAgICAgICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgICAgICAgICAgICAgICBVU0VSOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMT0dOQU1FOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBXRDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBIT01FOiAiL2hvbWUvd2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgICAgICAgICAgICAgICBfOiBnZXRFeGVjdXRhYmxlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW52W3hdID0gRU5WW3hdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RyaW5ncyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gZW52KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MucHVzaCh4ICsgIj0iICsgZW52W3hdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0RW52U3RyaW5ncy5zdHJpbmdzID0gc3RyaW5nczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFNZU0NBTExTID0gewogICAgICAgICAgICAgICAgbWFwcGluZ3M6IHt9LAogICAgICAgICAgICAgICAgYnVmZmVyczogW251bGwsIFtdLCBbXV0sCiAgICAgICAgICAgICAgICBwcmludENoYXI6IGZ1bmN0aW9uIChzdHJlYW0sIGN1cnIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gU1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyID09PSAwIHx8IGN1cnIgPT09IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJlYW0gPT09IDEgPyBvdXQgOiBlcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGN1cnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB2YXJhcmdzOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy52YXJhcmdzICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IEhFQVAzMlsoU1lTQ0FMTFMudmFyYXJncyAtIDQpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0U3RyOiBmdW5jdGlvbiAocHRyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IFVURjhUb1N0cmluZyhwdHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0NjQ6IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG93OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fZ2V0KF9fZW52aXJvbiwgZW52aXJvbl9idWYpIHsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHJpbmcsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gZW52aXJvbl9idWYgKyBidWZTaXplOwogICAgICAgICAgICAgICAgICAgIEhFQVAzMlsoX19lbnZpcm9uICsgaSAqIDQpID4+IDJdID0gcHRyOwogICAgICAgICAgICAgICAgICAgIHdyaXRlQXNjaWlUb01lbW9yeShzdHJpbmcsIHB0cik7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fc2l6ZXNfZ2V0KHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgewogICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBnZXRFbnZTdHJpbmdzKCk7CiAgICAgICAgICAgICAgICBIRUFQMzJbcGVudmlyb25fY291bnQgPj4gMl0gPSBzdHJpbmdzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIHN0cmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2J1Zl9zaXplID4+IDJdID0gYnVmU2l6ZTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9leGl0KHN0YXR1cykgewogICAgICAgICAgICAgICAgZXhpdChzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9jbG9zZShmZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldF9sb3csIG9mZnNldF9oaWdoLCB3aGVuY2UsIG5ld09mZnNldCkgeyB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF93cml0ZShmZCwgaW92LCBpb3ZjbnQsIHBudW0pIHsKICAgICAgICAgICAgICAgIHZhciBudW0gPSAwOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwdHIgPSBIRUFQMzJbKGlvdiArIGkgKiA4KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gSEVBUDMyWyhpb3YgKyAoaSAqIDggKyA0KSkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy5wcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG51bSArPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbcG51bSA+PiAyXSA9IG51bTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2NyZWF0ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2pvaW4oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3N5c2NvbmYobmFtZSkgewogICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgODU6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhIZWFwU2l6ZSAvIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjAwODA5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDcwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxNDc0ODM2NDc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0NzgzOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDQ4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOTcxNTI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU1MzY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2NzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFlMzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDczOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3JbImhhcmR3YXJlQ29uY3VycmVuY3kiXSB8fCAxOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRFcnJObygyOCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFzbUxpYnJhcnlBcmcgPSB7CiAgICAgICAgICAgICAgICBhOiBfYWJvcnQsCiAgICAgICAgICAgICAgICBuOiBfY2xvY2tfZ2V0dGltZSwKICAgICAgICAgICAgICAgIGk6IF9kbG9wZW4sCiAgICAgICAgICAgICAgICBlOiBfZGxzeW0sCiAgICAgICAgICAgICAgICBsOiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLAogICAgICAgICAgICAgICAgbTogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgICAgICAgICAgICBvOiBfZW1zY3JpcHRlbl90aHJlYWRfc2xlZXAsCiAgICAgICAgICAgICAgICBwOiBfZW52aXJvbl9nZXQsCiAgICAgICAgICAgICAgICBnOiBfZW52aXJvbl9zaXplc19nZXQsCiAgICAgICAgICAgICAgICBqOiBfZXhpdCwKICAgICAgICAgICAgICAgIGg6IF9mZF9jbG9zZSwKICAgICAgICAgICAgICAgIGs6IF9mZF9zZWVrLAogICAgICAgICAgICAgICAgYzogX2ZkX3dyaXRlLAogICAgICAgICAgICAgICAgZDogX3B0aHJlYWRfY3JlYXRlLAogICAgICAgICAgICAgICAgZjogX3B0aHJlYWRfam9pbiwKICAgICAgICAgICAgICAgIGI6IF9zeXNjb25mLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjcmVhdGVXYXNtKCk7CiAgICAgICAgICAgIHZhciBfX193YXNtX2NhbGxfY3RvcnMgPSAoTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoX19fd2FzbV9jYWxsX2N0b3JzID0gTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IE1vZHVsZVsiYXNtIl1bInIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsicyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ0Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IE1vZHVsZVsiYXNtIl1bInUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInYiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsidyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bIngiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ5Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInoiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBNb2R1bGVbImFzbSJdWyJBIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfbG9hZE1vZGVsIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gTW9kdWxlWyJhc20iXVsiQiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX3J1bkluZmVyZW5jZSJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IE1vZHVsZVsiYXNtIl1bIkMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBfX19lcnJub19sb2NhdGlvbiA9IChNb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX2Vycm5vX2xvY2F0aW9uID0gTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gTW9kdWxlWyJhc20iXVsiRSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGNhbGxlZFJ1bjsKICAgICAgICAgICAgZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9ICJFeGl0U3RhdHVzIjsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIgKyBzdGF0dXMgKyAiKSI7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBmdW5jdGlvbiBydW5DYWxsZXIoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bkNhbGxlcjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gcnVuKGFyZ3MpIHsKICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJlUnVuKCk7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvUnVuKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjYWxsZWRSdW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiY2FsbGVkUnVuIl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChBQk9SVCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGluaXRSdW50aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgcHJlTWFpbigpOwogICAgICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTsKICAgICAgICAgICAgICAgICAgICBwb3N0UnVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIE1vZHVsZVsicnVuIl0gPSBydW47CiAgICAgICAgICAgIGZ1bmN0aW9uIGV4aXQoc3RhdHVzLCBpbXBsaWNpdCkgewogICAgICAgICAgICAgICAgcXVpdF8oc3RhdHVzLCBuZXcgRXhpdFN0YXR1cyhzdGF0dXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVJbml0Il0pIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXSA9IFtNb2R1bGVbInByZUluaXQiXV07CiAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlLnJlYWR5OwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciB0ZmxpdGVTaW1kID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICBkZWZhdWx0OiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlCiAgICB9KTsKCiAgICB2YXIgY3JlYXRlVEZMaXRlTW9kdWxlID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3NjcmlwdERpciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCA/IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjIDogdW5kZWZpbmVkOwogICAgICAgIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjcmVhdGVURkxpdGVNb2R1bGUpIHsKICAgICAgICAgICAgY3JlYXRlVEZMaXRlTW9kdWxlID0gY3JlYXRlVEZMaXRlTW9kdWxlIHx8IHt9OwogICAgICAgICAgICB2YXIgTW9kdWxlID0gdHlwZW9mIGNyZWF0ZVRGTGl0ZU1vZHVsZSAhPT0gInVuZGVmaW5lZCIgPyBjcmVhdGVURkxpdGVNb2R1bGUgOiB7fTsKICAgICAgICAgICAgdmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDsKICAgICAgICAgICAgTW9kdWxlWyJyZWFkeSJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0ge307CiAgICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIE1vZHVsZSkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT3ZlcnJpZGVzW2tleV0gPSBNb2R1bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB2YXIgcXVpdF8gPSBmdW5jdGlvbiAoc3RhdHVzLCB0b1Rocm93KSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0b1Rocm93OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX05PREUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1NIRUxMID0gZmFsc2U7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gImZ1bmN0aW9uIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfTk9ERSA9CiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlID09PSAic3RyaW5nIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSAhRU5WSVJPTk1FTlRfSVNfV0VCICYmICFFTlZJUk9OTUVOVF9JU19OT0RFICYmICFFTlZJUk9OTUVOVF9JU19XT1JLRVI7CiAgICAgICAgICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHREaXJlY3RvcnkgKyBwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgICAgICAgICB2YXIgbm9kZUZTOwogICAgICAgICAgICB2YXIgbm9kZVBhdGg7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gcmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSwgYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlRlMpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGUyA9IHJlcXVpcmUoImZzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlUGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVBhdGggPSByZXF1aXJlKCJwYXRoIik7CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlUGF0aFsibm9ybWFsaXplIl0oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlRlNbInJlYWRGaWxlU3luYyJdKGZpbGVuYW1lLCBiaW5hcnkgPyBudWxsIDogInV0ZjgiKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSByZWFkXyhmaWxlbmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQuYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBVaW50OEFycmF5KHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gcHJvY2Vzc1siYXJndiJdWzFdLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmNhdWdodEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIChleCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCBhYm9ydCk7CiAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWyJleGl0Il0oc3RhdHVzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNb2R1bGVbImluc3BlY3QiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfU0hFTEwpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZCAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkKGYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpOwogICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NyaXB0QXJncyAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdEFyZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1aXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVpdChzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByaW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyA9IHByaW50OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiA9IGNvbnNvbGUuZXJyb3IgPSB0eXBlb2YgcHJpbnRFcnIgIT09ICJ1bmRlZmluZWQiID8gcHJpbnRFcnIgOiBwcmludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3NjcmlwdERpcikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoImJsb2I6IikgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZWFkXyA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jID0gZnVuY3Rpb24gKHVybCwgb25sb2FkLCBvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgOwogICAgICAgICAgICB2YXIgb3V0ID0gTW9kdWxlWyJwcmludCJdIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIG1vZHVsZU92ZXJyaWRlcykgewogICAgICAgICAgICAgICAgaWYgKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlW2tleV0gPSBtb2R1bGVPdmVycmlkZXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkKICAgICAgICAgICAgICAgIE1vZHVsZVsiYXJndW1lbnRzIl07CiAgICAgICAgICAgIGlmIChNb2R1bGVbInRoaXNQcm9ncmFtIl0pCiAgICAgICAgICAgICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsicXVpdCJdKQogICAgICAgICAgICAgICAgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTsKICAgICAgICAgICAgdmFyIHdhc21CaW5hcnk7CiAgICAgICAgICAgIGlmIChNb2R1bGVbIndhc21CaW5hcnkiXSkKICAgICAgICAgICAgICAgIHdhc21CaW5hcnkgPSBNb2R1bGVbIndhc21CaW5hcnkiXTsKICAgICAgICAgICAgTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gfHwgdHJ1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdhc21NZW1vcnk7CiAgICAgICAgICAgIHZhciBBQk9SVCA9IGZhbHNlOwogICAgICAgICAgICBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCB0ZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiICsgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAidW5kZWZpbmVkIiA/IG5ldyBUZXh0RGVjb2RlcigidXRmOCIpIDogdW5kZWZpbmVkOwogICAgICAgICAgICBmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLCBpZHgsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5kSWR4ID0gaWR4ICsgbWF4Qnl0ZXNUb1JlYWQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICAgICAgICAgICAgd2hpbGUgKGhlYXBbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKQogICAgICAgICAgICAgICAgICAgICsrZW5kUHRyOwogICAgICAgICAgICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXAuc3ViYXJyYXkgJiYgVVRGOERlY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IGhlYXBbaWR4KytdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDEyOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyMjQpID09IDE5MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyNDApID09IDIyNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgMTUpIDw8IDEyKSB8ICh1MSA8PCA2KSB8IHUyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwW2lkeCsrXSAmIDYzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGNoID4+IDEwKSwgNTYzMjAgfCAoY2ggJiAxMDIzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlQXNjaWlUb01lbW9yeShzdHIsIGJ1ZmZlciwgZG9udEFkZE51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyKysgPj4gMF0gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWxpZ25VcCh4LCBtdWx0aXBsZSkgewogICAgICAgICAgICAgICAgaWYgKHggJSBtdWx0aXBsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB4ICs9IG11bHRpcGxlIC0gKHggJSBtdWx0aXBsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYnVmZmVyLCBIRUFQOCwgSEVBUFU4LCBIRUFQMzI7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZikgewogICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVAxNiJdID0gbmV3IEludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDMyIl0gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTgiXSA9IEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMTYiXSA9IG5ldyBVaW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTMyIl0gPSBuZXcgVWludDMyQXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gbmV3IEZsb2F0MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBuZXcgRmxvYXQ2NEFycmF5KGJ1Zik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJJTklUSUFMX01FTU9SWSJdIHx8IDE2Nzc3MjE2OwogICAgICAgICAgICB2YXIgd2FzbVRhYmxlOwogICAgICAgICAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUTUFJTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICAgICAgICAgIF9fQVRJTklUX18ucHVzaCh7CiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX19fd2FzbV9jYWxsX2N0b3JzKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnVuY3Rpb24gcHJlUnVuKCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXSA9IFtNb2R1bGVbInByZVJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHJlTWFpbigpIHsKICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwb3N0UnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicG9zdFJ1biJdID0gW01vZHVsZVsicG9zdFJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXSA9IHt9OwogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uQWJvcnQiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25BYm9ydCJdKHdoYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hhdCArPSAiIjsKICAgICAgICAgICAgICAgIGVycih3aGF0KTsKICAgICAgICAgICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHdoYXQgPSAiYWJvcnQoIiArIHdoYXQgKyAiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iOwogICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBoYXNQcmVmaXgoc3RyLCBwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPyBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIDogc3RyLmluZGV4T2YocHJlZml4KSA9PT0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBkYXRhVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZmlsZVVSSVByZWZpeCA9ICJmaWxlOi8vIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBmaWxlVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeUZpbGUgPSAidGZsaXRlLndhc20iOwogICAgICAgICAgICBpZiAoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgICAgICAgICAgIHdhc21CaW5hcnlGaWxlID0gbG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0QmluYXJ5KGZpbGUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkQmluYXJ5KGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnQoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKCkgewogICAgICAgICAgICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmV0Y2ggPT09ICJmdW5jdGlvbiIgJiYgIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHdhc21CaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2VbIm9rIl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIiArIHdhc21CaW5hcnlGaWxlICsgIiciOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlWyJhcnJheUJ1ZmZlciJdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRBc3luYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMod2FzbUJpbmFyeUZpbGUsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlV2FzbSgpIHsKICAgICAgICAgICAgICAgIHZhciBpbmZvID0geyBhOiBhc21MaWJyYXJ5QXJnIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsIG1vZHVsZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbImFzbSJdID0gZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5ID0gTW9kdWxlWyJhc20iXVsicSJdOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUgPSBNb2R1bGVbImFzbSJdWyJEIl07CiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYWRkUnVuRGVwZW5kZW5jeSgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZShvdXRwdXQpIHsKICAgICAgICAgICAgICAgICAgICByZWNlaXZlSW5zdGFuY2Uob3V0cHV0WyJpbnN0YW5jZSJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5UHJvbWlzZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChiaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVjZWl2ZXIsIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQocmVhc29uKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXN5bmMoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PT0gImZ1bmN0aW9uIiAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZmV0Y2ggPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHdhc21CaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsIGluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UsIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXShpbmZvLCByZWNlaXZlSW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZUFzeW5jKCkuY2F0Y2gocmVhZHlQcm9taXNlUmVqZWN0KTsKICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjYWxsUnVudGltZUNhbGxiYWNrcyhjYWxsYmFja3MpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChjYWxsYmFja3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGNhbGxiYWNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjay5mdW5jOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmFyZyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUuZ2V0KGZ1bmMpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUuZ2V0KGZ1bmMpKGNhbGxiYWNrLmFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Fib3J0KCkgewogICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vdzsKICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBwcm9jZXNzWyJocnRpbWUiXSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0WzBdICogMWUzICsgdFsxXSAvIDFlNjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRhdGVOb3cgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZGF0ZU5vdzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYyA9IHRydWU7CiAgICAgICAgICAgIGZ1bmN0aW9uIHNldEVyck5vKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBIRUFQMzJbX19fZXJybm9fbG9jYXRpb24oKSA+PiAyXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9jbG9ja19nZXR0aW1lKGNsa19pZCwgdHApIHsKICAgICAgICAgICAgICAgIHZhciBub3c7CiAgICAgICAgICAgICAgICBpZiAoY2xrX2lkID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKChjbGtfaWQgPT09IDEgfHwgY2xrX2lkID09PSA0KSAmJiBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYykgewogICAgICAgICAgICAgICAgICAgIG5vdyA9IF9lbXNjcmlwdGVuX2dldF9ub3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNldEVyck5vKDI4KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbdHAgPj4gMl0gPSAobm93IC8gMWUzKSB8IDA7CiAgICAgICAgICAgICAgICBIRUFQMzJbKHRwICsgNCkgPj4gMl0gPSAoKG5vdyAlIDFlMykgKiAxZTMgKiAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbG9wZW4oZmlsZW5hbWUsIGZsYWcpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZGxzeW0oaGFuZGxlLCBzeW1ib2wpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnKGRlc3QsIHNyYywgbnVtKSB7CiAgICAgICAgICAgICAgICBIRUFQVTguY29weVdpdGhpbihkZXN0LCBzcmMsIHNyYyArIG51bSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTgubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIoc2l6ZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5Lmdyb3coKHNpemUgLSBidWZmZXIuYnl0ZUxlbmd0aCArIDY1NTM1KSA+Pj4gMTYpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcChyZXF1ZXN0ZWRTaXplKSB7CiAgICAgICAgICAgICAgICB2YXIgb2xkU2l6ZSA9IF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTsKICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdGVkU2l6ZSA+IG1heEhlYXBTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgY3V0RG93biA9IDE7IGN1dERvd24gPD0gNDsgY3V0RG93biAqPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG92ZXJHcm93bkhlYXBTaXplID0gb2xkU2l6ZSAqICgxICsgMC4yIC8gY3V0RG93bik7CiAgICAgICAgICAgICAgICAgICAgb3Zlckdyb3duSGVhcFNpemUgPSBNYXRoLm1pbihvdmVyR3Jvd25IZWFwU2l6ZSwgcmVxdWVzdGVkU2l6ZSArIDEwMDY2MzI5Nik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NpemUgPSBNYXRoLm1pbihtYXhIZWFwU2l6ZSwgYWxpZ25VcChNYXRoLm1heChyZXF1ZXN0ZWRTaXplLCBvdmVyR3Jvd25IZWFwU2l6ZSksIDY1NTM2KSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3RocmVhZF9zbGVlcChtc2VjcykgewogICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgd2hpbGUgKF9lbXNjcmlwdGVuX2dldF9ub3coKSAtIHN0YXJ0IDwgbXNlY3MpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBFTlYgPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RXhlY3V0YWJsZU5hbWUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1Byb2dyYW0gfHwgIi4vdGhpcy5wcm9ncmFtIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRFbnZTdHJpbmdzKCkgewogICAgICAgICAgICAgICAgaWYgKCFnZXRFbnZTdHJpbmdzLnN0cmluZ3MpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZyA9ICgodHlwZW9mIG5hdmlnYXRvciA9PT0gIm9iamVjdCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdKSB8fCAiQyIpLnJlcGxhY2UoIi0iLCAiXyIpICsgIi5VVEYtOCI7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVudiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgVVNFUjogIndlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgTE9HTkFNRTogIndlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgUEFUSDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBQV0Q6ICIvIiwKICAgICAgICAgICAgICAgICAgICAgICAgSE9NRTogIi9ob21lL3dlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgTEFORzogbGFuZywKICAgICAgICAgICAgICAgICAgICAgICAgXzogZ2V0RXhlY3V0YWJsZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gRU5WKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudlt4XSA9IEVOVlt4XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4IGluIGVudikgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLnB1c2goeCArICI9IiArIGVudlt4XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3Muc3RyaW5ncyA9IHN0cmluZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RW52U3RyaW5ncy5zdHJpbmdzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBTWVNDQUxMUyA9IHsKICAgICAgICAgICAgICAgIG1hcHBpbmdzOiB7fSwKICAgICAgICAgICAgICAgIGJ1ZmZlcnM6IFtudWxsLCBbXSwgW11dLAogICAgICAgICAgICAgICAgcHJpbnRDaGFyOiBmdW5jdGlvbiAoc3RyZWFtLCBjdXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IFNZU0NBTExTLmJ1ZmZlcnNbc3RyZWFtXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PT0gMCB8fCBjdXJyID09PSAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtID09PSAxID8gb3V0IDogZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIsIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIucHVzaChjdXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdmFyYXJnczogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgU1lTQ0FMTFMudmFyYXJncyArPSA0OwogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBIRUFQMzJbKFNZU0NBTExTLnZhcmFyZ3MgLSA0KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldFN0cjogZnVuY3Rpb24gKHB0cikgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBVVEY4VG9TdHJpbmcocHRyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldDY0OiBmdW5jdGlvbiAobG93LCBoaWdoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvdzsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbnZpcm9uX2dldChfX2Vudmlyb24sIGVudmlyb25fYnVmKSB7CiAgICAgICAgICAgICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICBnZXRFbnZTdHJpbmdzKCkuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ciA9IGVudmlyb25fYnVmICsgYnVmU2l6ZTsKICAgICAgICAgICAgICAgICAgICBIRUFQMzJbKF9fZW52aXJvbiArIGkgKiA0KSA+PiAyXSA9IHB0cjsKICAgICAgICAgICAgICAgICAgICB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyaW5nLCBwdHIpOwogICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbnZpcm9uX3NpemVzX2dldChwZW52aXJvbl9jb3VudCwgcGVudmlyb25fYnVmX3NpemUpIHsKICAgICAgICAgICAgICAgIHZhciBzdHJpbmdzID0gZ2V0RW52U3RyaW5ncygpOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2NvdW50ID4+IDJdID0gc3RyaW5ncy5sZW5ndGg7CiAgICAgICAgICAgICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICBzdHJpbmdzLmZvckVhY2goZnVuY3Rpb24gKHN0cmluZykgewogICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIEhFQVAzMltwZW52aXJvbl9idWZfc2l6ZSA+PiAyXSA9IGJ1ZlNpemU7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZXhpdChzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfY2xvc2UoZmQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9zZWVrKGZkLCBvZmZzZXRfbG93LCBvZmZzZXRfaGlnaCwgd2hlbmNlLCBuZXdPZmZzZXQpIHsgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfd3JpdGUoZmQsIGlvdiwgaW92Y250LCBwbnVtKSB7CiAgICAgICAgICAgICAgICB2YXIgbnVtID0gMDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gSEVBUDMyWyhpb3YgKyBpICogOCkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IEhFQVAzMlsoaW92ICsgKGkgKiA4ICsgNCkpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ0FMTFMucHJpbnRDaGFyKGZkLCBIRUFQVThbcHRyICsgal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBudW0gKz0gbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDMyW3BudW0gPj4gMl0gPSBudW07CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfcHRocmVhZF9jcmVhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfcHRocmVhZF9qb2luKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDI4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9zeXNjb25mKG5hbWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg1OgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF4SGVhcFNpemUgPSAyMTQ3NDgzNjQ4OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF4SGVhcFNpemUgLyAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwMDgwOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDgwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgODE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDI0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDcyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMTQ3NDgzNjQ3OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDc4Mzk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA0ODsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDk3MTUyOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY1NTM2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2ODsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI3Njc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxZTM7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcwMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDcxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjU2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTU7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NDogewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yWyJoYXJkd2FyZUNvbmN1cnJlbmN5Il0gfHwgMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhc21MaWJyYXJ5QXJnID0gewogICAgICAgICAgICAgICAgYTogX2Fib3J0LAogICAgICAgICAgICAgICAgbjogX2Nsb2NrX2dldHRpbWUsCiAgICAgICAgICAgICAgICBpOiBfZGxvcGVuLAogICAgICAgICAgICAgICAgZTogX2Rsc3ltLAogICAgICAgICAgICAgICAgbDogX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZywKICAgICAgICAgICAgICAgIG06IF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLAogICAgICAgICAgICAgICAgbzogX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwLAogICAgICAgICAgICAgICAgcDogX2Vudmlyb25fZ2V0LAogICAgICAgICAgICAgICAgZzogX2Vudmlyb25fc2l6ZXNfZ2V0LAogICAgICAgICAgICAgICAgajogX2V4aXQsCiAgICAgICAgICAgICAgICBoOiBfZmRfY2xvc2UsCiAgICAgICAgICAgICAgICBrOiBfZmRfc2VlaywKICAgICAgICAgICAgICAgIGM6IF9mZF93cml0ZSwKICAgICAgICAgICAgICAgIGQ6IF9wdGhyZWFkX2NyZWF0ZSwKICAgICAgICAgICAgICAgIGY6IF9wdGhyZWFkX2pvaW4sCiAgICAgICAgICAgICAgICBiOiBfc3lzY29uZiwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY3JlYXRlV2FzbSgpOwogICAgICAgICAgICB2YXIgX19fd2FzbV9jYWxsX2N0b3JzID0gKE1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX3dhc21fY2FsbF9jdG9ycyA9IE1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl0gPSBNb2R1bGVbImFzbSJdWyJyIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bInMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dE1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsidCJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0SGVpZ2h0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ1Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRXaWR0aCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBNb2R1bGVbImFzbSJdWyJ2Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRDaGFubmVsQ291bnQiXSA9IE1vZHVsZVsiYXNtIl1bInciXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ4Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dEhlaWdodCJdID0gTW9kdWxlWyJhc20iXVsieSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dFdpZHRoIl0gPSBNb2R1bGVbImFzbSJdWyJ6Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsiQSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9sb2FkTW9kZWwiXSA9IE1vZHVsZVsiYXNtIl1bIkIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfcnVuSW5mZXJlbmNlIl0gPSBNb2R1bGVbImFzbSJdWyJDIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgX19fZXJybm9fbG9jYXRpb24gPSAoTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChfX19lcnJub19sb2NhdGlvbiA9IE1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXSA9IE1vZHVsZVsiYXNtIl1bIkUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBjYWxsZWRSdW47CiAgICAgICAgICAgIGZ1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSAiRXhpdFN0YXR1cyI7CiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiICsgc3RhdHVzICsgIikiOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gZnVuY3Rpb24gcnVuQ2FsbGVyKCkgewogICAgICAgICAgICAgICAgaWYgKCFjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBydW5DYWxsZXI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIHJ1bihhcmdzKSB7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByZVJ1bigpOwogICAgICAgICAgICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkb1J1bigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY2FsbGVkUnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbImNhbGxlZFJ1biJdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoQUJPUlQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBpbml0UnVudGltZSgpOwogICAgICAgICAgICAgICAgICAgIHByZU1haW4oKTsKICAgICAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSkKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKCk7CiAgICAgICAgICAgICAgICAgICAgcG9zdFJ1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsic2V0U3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCJSdW5uaW5nLi4uIik7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXSgiIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgICAgIH0sIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZG9SdW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbInJ1biJdID0gcnVuOwogICAgICAgICAgICBmdW5jdGlvbiBleGl0KHN0YXR1cywgaW1wbGljaXQpIHsKICAgICAgICAgICAgICAgIHF1aXRfKHN0YXR1cywgbmV3IEV4aXRTdGF0dXMoc3RhdHVzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlSW5pdCJdKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlSW5pdCJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVJbml0Il0gPSBbTW9kdWxlWyJwcmVJbml0Il1dOwogICAgICAgICAgICAgICAgd2hpbGUgKE1vZHVsZVsicHJlSW5pdCJdLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXS5wb3AoKSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJ1bigpOwogICAgICAgICAgICByZXR1cm4gY3JlYXRlVEZMaXRlTW9kdWxlLnJlYWR5OwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciB0ZmxpdGUgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIGRlZmF1bHQ6IGNyZWF0ZVRGTGl0ZU1vZHVsZQogICAgfSk7Cgp9KSh3YXNtRmVhdHVyZURldGVjdCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb2Nlc3NvclByb3h5Lndvcmtlci5qcy5tYXAKCg==');
|
|
1863
1863
|
/* eslint-enable */
|
|
1864
1864
|
|
|
1865
1865
|
let sharedWorker;
|